BadUSB
Sadržaj |
BadAndroid
Andro Krezić, Zoran Antolović, Roko Labrović
DNS / Ethernet Spoofing
DNS je omogućio ljudima bezbrižno surfanje bez potrebe za pamćenjem IP adresa koje se često mogu i promijeniti. Umjesto da pamtimo adresu 31.13.93.3 jednostavnije koristimo samo facebook.com. Ali kako onda znamo da facebook.com pokazuje upravo na ispravan IP? Vjerujemo da će naš zahtjev za "resolve"-anjem DNS-a u IP adresu proći bez problema te da ćemo dobiti ispravne podatke. Sigurnosna prijetnja koju ovdje primjećujemo jest mogućnost namjerne promjene DNS odgovora na dva načina:
- Promjena DNS poruke odgovora u nepostojeći IP - Denial of Service attack
- Promjena DNS poruke odgovora u postojeći IP i preusmjeravanje na tzv. "Phishing" stranicu
Dok je prvi od dva napada na prvi pogled bezazlen, drugi postaje prava prijetnja ukoliko se ne otkrije na vrijeme. Napad je moguće izvesti na nekoliko načina:
- Usmjeravanjem korisničkih postavki na vlastiti DNS server
- Podešavanje DNS zapisa na routeru (npr. u open WiFi mrežama)
- Izmjenom hosts datoteka
Primjer: Phishing free email servisa
Uzmimo za primjer servis freemail.net.hr koji ne koristi sigurni protokol https te ne osigurava potvrdu identiteta stranice koja je posjećena. Žrtva napada može u preglednik upisati http://freemail.net.hr i u nadi da će joj se prikazati originalna stranica email servisa. Napadač je pripremio lažnu stranicu koja se izgledom ne razlikuje od originalne te je podesio preusmjeravanje/izmjenu DNS poruka. Stranica koju žrtva otvori na spomenutom URL-u nije originalna već identična kopija koju je gotovo nemoguće primjetiti. Ukoliko žrtva u pokušaju prijave unese svoje korisničke podatke, vrlo je vjerojatno da su podaci dostupni napadaču a da žrtva toga nije ni svjesna.
BadAndroid Ethernet Spoofing
Upute
Projekt dostupan na BadAndroid omogućuje napad s Android uređaja koji će emulirati Ethernet karticu na priključenom računalu te na taj način napraviti napad na DNS zapise. Za napad je potrebno:
- Root-ati uređaj - kako bismo imali potpuni pristup uređaju, osigurajte povezanost na Internet
- Instalirajte "busybox" (npr. korištenjem stericson busybox installer)
- Keirajte hosts datoteku s parovima IP-adresa i domena koje želite preusmjeriti na vlastite servere npr:
1.2.3.4 paypal.com www.paypal.com - Kopirajte skripte i hosts datoteku na svoj uređaj:
adb push bad.sh /data/local/tmp/
adb push cleanup.sh /data/local/tmp/
adb push hosts /data/local/tmp/ - Instalirajte i pokrenite aplikaciju za korištenje terminala (npr. jackpal/Android-Terminal-Emulator) u osigurajte si administratorski pristup: /system/xbin/su
- Pokrenite skriptu bad.sh: sh /data/local/tmp/bad.sh
- Povežite uređaj s Windows ili Linux računalom koje želite napasti. Web promet sada bi trebao ići kroz vaš uređaj s parcijalnom redirekcijom domena koje ste naveli u hosts datoteci.
- Kada ste završili s napadom, ponovno pokrenite uređaj ili pokrenite skriptu za čišćenje: cleanup.sh
Objašnjenje
Sva logika za napad nalazi se u skripti bad.sh. Analizom iste lako je utvrditi temelje za ovaj napad:
- Aplikacija ima nekoliko dependancy-a koji se provjeravaju na vrhu skripte:
- busybox
- dnsmasq - Mrežna infrastruktura za manje mreže (DNS, dhcp ...)
- RNDIS - Remote Network Driver Interface Specification Microsoftov protokol za emulaciju Ethernet uređaja (interfacea)
- iptables
- Zatim skripta blokira zadano prepoznavanje uređaja povezanog USB-om kako bi se mogla emulirati Ethernet kartica
- Omogućuju se potrebni protokoli i radi se njihovo testiranje te se čeka na učitavanje interfacea
- Podešava se interface firewall i proslijeđivanje paketa
- Pokreće se dnsmasq servis s podacima iz hosts datoteke
Phishing primjer: Facebook
U nastavku je prikazana jednostavna phishing stranica koja simulira početnu stranicu Facebook društvene mreže. Izgled stranice vidljiv je na slici.
Napredni korisnik odmah može primjetiti kako se radi o nesigurnoj vezi (http umjesto https) i to mu može biti sumnjivo. Nažalost mnogo je više korisnika koji ne primjećuju i ne razumiju sigurnost na internetu. Aplikacija će prihvatiti korisnički unos i pohraniti ga u datoteku te napadaču omogućiti pristup korisničkom imenu (emailu) i lozinku koju žrtva koristi za Facebook. Nakon toga napadač jednostavno može žrtvi onemogućiti korištenje Facebook servisa, ali uz činjenicu da korisnici često koriste iste podatke, opasnost ovog napada eksponencijalno raste.
Kloniranje stranice
Izrada identične stranice vrlo je jednostavna budući da današnji preglednici prilikom pohrane stranice na disk pohranjuju i sve vezane dokumente (slike, css i js file-ove itd.). Dovoljno je odabrati izbornik File -> Save i pohraniti stranicu na disk. Pohranjuje se jedna html datoteka i jedan folder unutar kojeg se nalazi vezani materijal. Stranicu je moguće doraditi po izboru (dodati i ukloniti elemente, podesiti ponašanje formi i sl.).
Postavljanje servera
Server je potrebno postaviti s uputom o domeni koju će posluživati. U ovom slučaju to je domena facebook.com stoga apache virtual host config file izgleda ovako:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName facebook.com
ServerAlias www.facebook.com
DocumentRoot /var/www/facebook
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
BadAndroid Keyboard Emulator
BadAndroid Keyboard Emulator nam omogućava emulaciju standardne USB tipkovnice pomoću Android uređaja. Računalo će prepoznati Android kao tipkovnicu i primati inpute koji su definirani u skriptama koje odaberemo na uređaju. Kako bi natjerali Android da se predstavlja kao tipkovnica, potrebno je instalirati custom kernel. Preuzimanje potrebnog kernela (Upozorenje: ovaj kernel je namijenjen samo za Asus Google Nexus 7 (2012) sa 5.0.x verzijom Android-a, za instalaciju na ostale uređaje provjerite GitHub repozitorij).
Flash-anje kernela
Za flash-anje custom kernela, potrebno je imati root pristup uređaju i instalirati ADB i Fastboot. Upute za root, ADB i Fastboot instalacija
Nakon root-anja uređaja:
- Upaliti uređaj u bootloader mode kombinacijom tipki volume up + power
- Spojiti uređaj sa računalom pomoću USB kabela
- Otvoriti direktorij u kojem se nalaze ADB i Fastboot datoteke za root
- Kopirati boot.img (kernel) u prethodno navedeni direktorij
- Otvoriti isti folder unutar Command Prompt-a (kratica: shift + desni klik na folder i kliknuti na „Open command prompt here“
- Da bismo provjerili dali je uređaj prepoznat, upišemo:
-
fastboot devices
- Ako je uređaj prepoznat, flash-amo kernel:
-
fastboot flash boot boot.img
- Nakon flash-anja ponovno pokrenemo uređaj:
-
fastboot reboot
Emuliranje tipkovnice
Da bismo mogli započeti koristiti Android uređaj kao tipkovnicu, potrebno je prebaciti hid-gadget-test na uređaj:
- Otvoriti direktorij u kojem se nalaze ADB i Fastboot datoteke za root
- Kopirati datoteku hid-gadget-test u prethodno navedeni folder
- Otvoriti isti folder unutar Command Prompt-a (kratica: shift + desni klik na folder i kliknuti na „Open command prompt here“
- Upisati:
-
adb push hid-gadget-test /data/local/tmp
- Sada se hid-gadget-test nalazi na uređaju unutar /data/local/tmp foldera
Nakon toga je potrebno preuzeti i instalirati Android Terminal Emulator sa Play Store, otvoriti ga i upisati:
- Da bismo dobili root pristup:
-
su
- Izmijeniti prava pristupa gidg0 i hidg1 u 666, kako bi svi imali pravo čitanja i pisanja:
-
chmod 666 /dev/hidg0 /dev/hidg1
- Nakon toga odemo u direktorij u kojem se nalazi hid-gadget-test:
-
cd /data/local/tmp
- I sada možemo simulirati pritisak tipki na tipkovnici pomoću naredbe (za slovo "a"):
-
echo a | ./hid-gadget-test /dev/hidg0 keyboard
- Kombinacije tipki, npr. ctrl + shift + esc dobijamo na način:
-
left-ctrl left-shift esc | ./hid-gadget-test /dev/hidg0 keyboard
Potpuna lista podržanih tipki se nalazi na GitHub-u.
Android aplikacija za slanje tipki
U svrhu ovog projekta napravljena je Android aplikacija koja olakšava slanje tipki na računalo. Unutar aplikacije se nalazi klasa koja čita skripte koje mi zadamo i prevodi ih u jezik potreban za simulaciju pritiska tipke, kako nebi svaki put trebali upisivati echo a | ./hid-gadget-test /dev/hidg0 keyboard
za svako slovo.
Unutar aplikacije je implementiran file explorer kojim možemo odabrati skriptu koju postavimo na uređaj, a primjer skripte koja otvara notepad i ispiše "hello world" u njemu izgleda ovako:
#CMD echo left-meta r
#BASH sleep 1;
notepad
#BASH sleep 1;
#CMD echo enter
#BASH sleep 1;
hello world
#BASH sleep 1;
Kako bismo lakše pisali i razumjeli skripte, napravili smo klasu koja sadrži metode koje provjeravaju početak svake linije. Ako linija počinje sa:
- #BASH - naredba za Bash shell, u ovom primjeru se koristi sleep 1 jer trebamo čekati 1 sekundu da se otvori program
- #CMD - naredba kojom šaljemo samo jednu tipku
- sami tekst znači da se šalje cijeli tekst, slovo po slovo
Ova skripta prvo otvara "Run" prozor u Windowsu pomoću Windows tipke + R, zatim unutra upiše "notepad" i klikne enter. Nakon toga se čeka 1 sekunda da bi se otvorio notepad i unutra se upiše "hello world".
Aplikacija pokreće skriptu pritiskom na tipku "Run", ali također je omogućeno da se zadnja skripta sama pokrene prilikom spajanja uređaja na računalo. To je postignuto pomoću Broadcast Receivera na Androidu koji je podešen tako da čeka promjenu stanja iz "not charging" u "charging".
Dobivanje root pristupa uređaju
Za ovaj projekt su korištena dva Android uređaja koje je bilo potrebno root-at, odnosno, dobiti potpuni pristup uređaju. Uređaji su Samsung Google Nexus S (Android 4.1.2) i Asus Google Nexus 7 (Android 5.0.2).
Samsung Google Nexus S
Otključavanje bootloader-a
Prije samog root-anja, potrebno je otključati bootloader. Bootloader služi za pokretanje kernela i operacijskog sustava, a obično je zaključan na uređajima od strane proizvođača uređaja. Zaključani bootloader osigurava da će korisnik koristiti proizvođačev ROM (firmware uređaja).
Potrebne potrebne datoteke za root-anje
Prije nego što se krene sa otključavanjem, potrebno je instalirati Samsung drivere ako već nemamo, kako bi uopće mogli komunicirati sa uređajem pomoću računala i zatim uključiti USB debugging na uređaju (Settings -> Developer Settings -> USB Debugging). Sljedeće korake treba poduzeti kako bi se otključao bootloader na Nexus S uređaju (NAPOMENA: otključavanje bootloader-a briše sve podatke sa mobitela – napraviti backup):
- Upaliti uređaj u bootloader mode kombinacijom tipki volume up + power
- Spojiti uređaj sa računalom pomoću USB kabela
- Otvoriti folder „NSFiles“ pomoću Command Prompt-a (kratica: shift + desni klik na folder i kliknuti na „Open command prompt here“
- Upisati u CMD:
-
fastboot oem unlock
- Koristeći tipki volume up i volume down označiti „Yes“ i potvrditi
- Nakon otključavanja označiti „Reboot“ i potvrditi
Instaliranje Custom Recovery
"Custom Recovery" je potrebno instalirati kako bi se na sustav uređaja mogao instalirati neslužbeni (custom) software, a on nam je potreban za instalaciju root programa. Postoje dva popularna Custom Recovery-ja za Android: ClockworkMod (CWM) i TeamWin Recovery Project (TWRPPodebljani tekst). Za ovaj projekt je korišten CWM ali i sa TWRP nebi trebalo biti razlike.
- Upaliti uređaj u bootloader mode kombinacijom tipki volume up + power
- Spojiti uređaj sa računalom pomoću USB kabela
- Otvoriti folder „NSFiles“ pomoću Command Prompt-a (kratica: shift + desni klik na folder i kliknuti na „Open command prompt here“
- Upisati u CMD:
-
fastboot flash recovery CWM-T.img
- Nakon instalacije treba mode označiti „Recovery“ i potvrditi
Root-anje uređaja
- Preuzeti najnoviji SuperSU paket
- Unutar Recovery Mode kliknuti „Mount and storage“ -> „Mount USB storage“
- Sada imamo pristup memoriji uređaja na računalu i prebacimo SuperSU paket na uređaj
- Kliknuti na tipku „Unmount“
- Instalirati preuzeti SuperSU paket na uređaj („install zip from sdcard“ -> „choose zip from sdcard“ -> find your SuperSU zip file -> „flash“)
- Nakon flash-anja (instalacije) kliknuti na „reboot system now“
Asus Google Nexus 7
Preuzimanje skripte i potrebnih datoteka. Za ovaj projekt je korišten Asus Google Nexus 7 naziva nakasi, a ime uređaja je grouper i Android verzija 5.0.2. Dobivanje root pristupa na Nexus 7 uređaju je nešto jednostavnije jer postoji skripta koja napravi sve za nas, potrebno ju je samo pokrenuti. Jedini preduvjet je da su driveri uređaja instalirani na računalu (download driver-a). Važno je napomenuti da ova skripta također vrši otključavanje bootloader-a i da će sve datoteke na uređaju biti izbrisane, tako da je pametno napraviti backup prije pokretanja ukoliko uređaj sadrži neke važne podatke.
Nakon što imamo sve potrebne uvjete:
- Upaliti uređaj u bootloader mode kombinacijom tipki volume down + power
- Pokrenuti skriptu ovisno o operacijskom sustavu računala
- Nakon root-anja označiti „Reboot“ i potvrditi
BadArduino Keyboard Emulator
Arduino Leonardo
Arduino Leonardo je mikrokontrolerska ploča sa ATmega32u4 čipom koja ima 20 digitalnih ulazno/izlaznih pinova (7 PWM izlaza i 12 analohnih ulaza), kristalni oscilator od 16MHz, mikro USB konektor, priključak za napajanje, ICSP konektor i reset taster. Sadrži sve što je potrebno za podršku mikrokontroleru. Ono što Arduina Leonarda razlikuje od ostalih ploča jest ugračen ATmega32u4 čip koji ima ugrađenu USB komunikaciju. Uprabo to mu omogućava da se ploča Leonardo računalu predstavi kao miš, tipkovnica ili dodatni serijski port ili nešto drugo. Upravo mogućnost predstavljanja ove ploče kao tipkovnica na računalu koristit će se za prikaz BadUSB ranjivosti.
Instalacija HID keyboard funkcija
Kako bi omogućili korištenje Leonarda potrebno je napraviti određene izmjene.
1. Potrebno je skinuti sljedeće biblioteke
2. Učitati biblioteke unutar Arduino IDE-a (Import library: In Arduino IDE -> Sketch -> Import Library -> Add library -> Path to HID-master)
3. Zamjeniti sve datoteke s ekstenzijom .h i .cpp u direktoriju C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino sa datotekama uz github repozitorija kojeg smo skinuli u koraku 1. (HID-master)
Keyboard Library
Sad kad smo omogućili Arduino korištenje keyboard library-a ukratko će biti opisane najvažnije funkcije. Bitno je napomenuti upozorenje s radom ove biblioteke. Ukoliko ona stalno radi može doći do poteškoća u programiranju ploče. Funkcije poput Keyboard.print() poslat će tipke na računalo i bilo bi ih poželjno pozvati samo u trenutku kada vi to hoćete. Zbog toga preporuča se sustav kontrole za uključivanje na tu funkciju poput fizičkog prekidača.
- Keyboard.begin() - započinje emuliranje spojene tipkovnice na računalo.
- Keyboard.end() - završava emuliranje spojene tipkovnice na računalo.
- Keyboard.press() - simulira pritisak tipke na tipkovnici.
- Keyboard.print() - simulira keystroke na tipkovnici.
- Keyboard.println() - simulira keystroke na tipkovnici, ali u novom redu
- Keyboard.release() - Otpušta simuliranje pritiska tipke na tipkovnici.
- Keyboard.releaseAll() - Otipšta simuliranje pritiska svih tipki.
- Keyboard.write() - Simulira pritisak i otpuštanje tipke na tipkovnici.
Primjer manipulacije hosts datotekom u Windows 7 operacijskom sustabvu
Kako bi se pokazalo kako to sve funkcijonira za primjer će se uzeti manipulacija hosts datotekom unutar Windows7 opracijskog sustava putem cmd komande linije. Kako bi izbjegli poteškoće tjekom programiranja tipkovnice na Arduino ćemo postaviti prekidač i pritiskom na prekidač pokrenuti funkcijonalnost koju smo isprogramirali.