Circumvent WPA2 (PSK) Warker

Circumvent WPA2 (PSK) Warker 13.10.2015 Inhalt ● ● Vorstellung WPA(2) – TKIP – CCMP – 4 Way-Handshake / EAPOL Password Recovery – Bruteforc...
Author: Daniel Keller
1 downloads 3 Views 361KB Size
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