Wireless Risk Potential Scenario: WEP: Difference between revisions
No edit summary |
No edit summary |
||
(19 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
Im Rahmen des [[W2006-ITS|IT Security Workshop 2006]] haben wir uns mit der Sicherheit der WEP-Verschlüsselung befasst. Wir haben bestehende Schwachstellen analysiert und einen eigenen Angriff nach Vorlage von [http://tapir.cs.ucl.ac.uk/bittau-wep.pdf A.Bittau] entwickelt. |
|||
[[Media:Wep-security.pdf|Folien zur Presentation]] |
|||
Autoren: Moritz Grauel und Matthias Naber |
|||
Bei Fragen stehen wir gerne per eMail zur Verfügung. Die Adressen sind jeweils unsere Nachnamen gefolgt von @informatik.hu-berlin.de |
|||
= Ziele = |
|||
Ziel ist es verschiedene Angriffsszenarien auf WEP zu prüfen. Besonderer Schwerpunkt liegt dabei auf den "modernen" Angriffen, die auch bei Netzen ohne viel Traffic Erfolg versprechen. |
Ziel ist es verschiedene Angriffsszenarien auf WEP zu prüfen. Besonderer Schwerpunkt liegt dabei auf den "modernen" Angriffen, die auch bei Netzen ohne viel Traffic Erfolg versprechen. |
||
Line 6: | Line 16: | ||
Der Angreifer ist in unserem Szenario ebenfalls ein Netgear WGT634U, auf dem Linux ([[Hacking the Netgear wgt634u]]) läuft. |
Der Angreifer ist in unserem Szenario ebenfalls ein Netgear WGT634U, auf dem Linux ([[Hacking the Netgear wgt634u]]) läuft. |
||
= Funktionsweise von WEP = |
|||
=== Eigenschaften von WEP === |
|||
WEP (Wired Equivalent Privacy) ist ein Verschlüsselungsstandard, der von der IEEE herausgegeben wurde. Es findet ausschließlich eine Verschlüsselung auf dem drahtlosen Medium statt. WEP soll lediglich Sicher stellen, dass nur bestimmte Teilnehmer an der Kommunikation teilnehmen können. Das heißt, jeder, der den preshared key kennt, kann die Daten entschlüsseln - eine Verschlüsselung, der Teilnehmer gegeneinander findet nicht statt. |
|||
* Verschlüsselung auf OSI Layer 3 |
|||
* symmetrischer Stromchiffre |
|||
* basiert auf RC4-Pseudozufallszahlengenerator |
|||
* offizielle Schlüssellängen 40 (64) Bit und 104 (128) Bit |
|||
=== Funktionsweise von Stromchiffre === |
|||
* Verschlüsselung einer Nachricht der Länge <math>l</math>: |
|||
<math>E(x,k) = y\;\;\;\ y_i = x_i \oplus k_i\;\;\;\ i = 1\dots l</math> |
|||
* Entschlüsselung einer Nachricht der Länge <math>l</math>: |
|||
<math>D(y,k) = x\;\;\;\ x_i = y_i \oplus k_i\;\;\;\ i = 1\dots l</math> |
|||
[[Image:RC4_grob.png]] |
|||
Bildquelle [http://de.wikipedia.org Wikipedia] |
|||
=== Verschlüsselung bei WEP === |
|||
Mit dem Zufallszahlengenerator RC4 wird eine Zufallszahlenfolge gebildet, die so lang ist, wie der zu verschlüsselnde Text (plus 4 Byte). Der RC4-Algorithmus wird dabei mit dem Schlüssel (40 oder 104 Bit) und einem sogenannten Initialisierungsvektor (IV) initiiert. Der IV hat eine Länge von 24 Bit. Zusammen mit dem Schlüssel ergeben sich so die 64 bzw 128 Bit, für die WEP bekannt ist. Der Schlüssel muss a priori allen Teilnehmern bekannt sein, der IV wird jedesmal im Klartext mitverschickt. |
|||
Über den Klartext wird vor der Verschlüsselung eine CRC32-Prüfsumme (Integrity Check Value - ICV) berechnet und hinten an den Klartext angehängt. Anschließend wird der Klartext (und die Prüfsumme) mit der RC4-Zufallszahl verschlüsselt. Vor den somit entstandenen Ciphertext wird der IV und ein Schlüsselindex (WEP unterstützt 4 verschiedene Schlüssel) geschrieben. |
|||
[[Image:WEP_Kodierung.png]] |
|||
Bildquelle [http://de.wikipedia.org Wikipedia] |
|||
=== Entschlüsselung bei WEP === |
|||
Mit dem, im Klartext versendeten IV und dem preshared key wird der RC4-Schlüsselstrom erzeugt. Der erzeugte Strom ist der selbe, wie bei der Verschlüsselung. Aus dem Schlüsselstrom und dem Kryptotext wird der Klartext und dessen Prüfsumme errechnet. Anschliessend wird die errechnete Prüfsumme mit der übertragenen Prüfsumme verglichen - stimmen die beiden überein gilt das Paket als fehlerfrei entschlüsselt. Andernfalls wird die Entschlüsselung als gescheitert betrachtet und das Paket verworfen. |
|||
[[Image:WEP_Dekodierung.png]] |
|||
Bildquelle [http://de.wikipedia.org Wikipedia] |
|||
=== Aufbau eines WEP-Pakets === |
|||
+---------------+-----------+---------------+----------------+----------+ |
|||
| 24 Byte | 4 Byte | 1 - 2308 Byte | 4 Byte | 4 Byte | |
|||
| 802.11 Header | IV Header | Frame Body | ICV | FCS | |
|||
| Klartext | Klartext | verschlüsselt | verschluesselt | Klartext | |
|||
+---------------+-----------+---------------+----------------+----------+ |
|||
Der FCS ist eine erneute CRC32-Prüfsumme, die vom Treiber vor dem Senden über die gesammte Nachricht generiert wird. |
|||
= Theoretische Schwachstellen von WEP = |
|||
=== Kleiner Schlüsselraum (40 bzw 108 Bit) === |
|||
=== ''Keystreamreuse'' === |
|||
Eine, der größten Schwachstellen bei Stromchiffren ist es, den gleichen Schlüssel mehrfach zu verwenden. Wenn ein Angreifer zwei Nachrichten, die mit dem gleichen Schlüssel verschlüsselt wurden abfängt, besitzt er automatisch das XOR der beiden Klartexte. Sehr oft lassen sich daraus schon wichtige Informationen gewinnen. |
|||
Bei WEP gibt es nur <math>2^{24}</math> verschiedene IVs. Nach spätestens 16777216 versendeten Paketen wiederholen sich die IVs und somit die erzeugten Schlüsselströme. |
|||
Viele Accesspoints beginnen zudem mit einem IV von 0 und inkrementieren diesen einfach. |
|||
Zudem gibt es bestimmte IVs, die als Schwach gelten ([[Wireless Risk Potential Scenario: WEP#Schwache IVs|Schwache IVs]]). Einige APs lassen diese einfach aus, was die Wahrscheinlichkeit des ''Keystreamreuse'' noch erhöht. |
|||
<math> |
|||
C_1 = P_1 \oplus RC4(iv \| key) |
|||
</math> |
|||
<math> |
|||
C_2 = P_2 \oplus RC4(iv \| key) |
|||
</math> |
|||
<math> |
|||
C_1 \oplus C_2 = (P_1 \oplus RC4(iv \| key)) \oplus (P_2 \oplus RC4(iv \| key)) = P_1 \oplus P_2 |
|||
</math> |
|||
=== Schwache IVs === |
|||
Aufgrund einer Schwachstelle im RC4-Algorithmus lassen sich aus bestimmten IVs Rückschlüsse auf Bits im Schlüssel ziehen. Es ist daher möglich, mit relativ wenigen abgefangenen Paketen den presharedkey zu errechnen. Ein Programm, dass dieses Verfahren einsetzt, ist das bekannte [http://www.aircrack-ng.org aircrack]. Mit nur ca 150.000 bis 300.000 Paketen kann man innerhalb von Sekunden (oft sogar schneller) den presharedkey errechnen. |
|||
Durch die Verlängerung des Schlüssels wächst die Anzahl der schwachen IVs derart, dass die benötigte Menge abgefangener Pakete nur linear steigt. (Doppelte Schlüssellänge -> Doppelter Aufwand) |
|||
=== Fragmentierung === |
|||
Der WEP-Standard lässt Fragmentierung auf der MAC-Ebene zu. Ein Paket kann in maximal 16 Fragmente zerlegt werden, die alle mit dem selben IV verschüsselt sein dürfen. Dies ist eine der größten Schwachstellen, da somit relativ einfach Pakete beliebigen Inhalts verschicken lassen. |
|||
=== Wörterbuchangriff === |
|||
Da es eine überschaubare Menge IVs gibt, ist es möglich ein Wörterbuch zu erstellen, dass Paare von IV und dazugehörigem Schlüsselstrom enthält. Damit kann man bei Bedarf verschlüsselte Pakete entschlüsseln. Durch das generieren von Paketen mit bekantem Inhalt (z.b ARP-Request) kann man ein solches Wörterbuch gezielt aufbauen. Ein solches Wörterbuch hätte dann eine Größe von <math> 2^24 * 2312 Byte = 36GByte</math>. Ein solches Wörterbuch macht die Kenntnis des Presharedkey überflüssig, man kann sämtliche Pakte ver- und entschlüsseln. |
|||
=== Prüfsummenfunktion === |
|||
Die im Standard vorgesehene Prüfsummenfunktion CRC32 ist keine kryptografische Hashfunktion. Es handelt sich um eine lineare Funktion, die im gewissen Maße vorhersagbar ist (Zip-Recovery nutzt dies zur Fehlerbehebung). Es ist daher eine geziehlte Manipulation möglich. Ein Tool, was dies ausnutzt ist [http://www.netstumbler.org/showthread.php?t=12489 chop-chop] |
|||
=== schwache Passwörter === |
|||
Häufig werden lediglich ASCII-Passwörter der Länge 5 oder 13 Zeichen verwendet. Der daraus resultierende Schlüsselraum für den Presharedkey ist so klein, dass damit bruteforce Angriffe realistisch werden. |
|||
= Status = |
|||
Wir haben uns für einen Angriff auf Basis der Fragmentierung entschieden. |
|||
=== Grundlage des Angriffs === |
|||
Die ersten 8 Byte eines WEP-Pakets sind fast immer bekannt. Sie beinhalten den sogenannten '''LLC/SNAP''', der den unter anderem den Typ des Protokolls definiert. Normalerweise handelt es sich dabei entweder um ARP oder IP. Ein ARP-Paket ist an seiner konstanten Länge von 36 Byte (+4 Byte ICV) zu erkennen. Ist das Paket länger kann man davon ausgehen, dass es sich um ein IP-Paket handelt. |
|||
+-------------------------+------------+--------+------+ |
|||
| LLC / SNAP | ARP Header | Quelle | Ziel | |
|||
| AA AA 03 00 00 00 08 06 | | | | |
|||
+-------------------------+------------+--------+------+ |
|||
Framebody eines ARP-Requests |
|||
Da wir die ersten 8 Byte des Klartextes bekannt sind, können wir ohne weiteres auch die ersten 8 Byte des Schlüsselstroms errechnen, indem wir Klartext und Kryptotext ''verXORn''. |
|||
=== Ablauf des Angriffs === |
|||
Wir ''sniffen'' solange Pakete mit, bis wir ein WEP-verschlüsseltes Paket unseres Zielnetzes empfangen. Aus diesem Paket errechnen wir uns die ersten 8 Byte des Schlüsselstroms. |
|||
Im Speicher bauen wir uns daraufhin ein ARP-Request-Paket zusammen (feste Länge von 36 Byte). Diese Paket zerteilen wir daraufhin in 9 Fragmente zu je 4 Byte. Über diese Fragmente bilden wir eine CRC32-Prüfsumme und hängen diese an. Die Resultierenden 8 Byte werden dann mit dem uns bekannten Schlüsselstrom verschlüsselt und in einen 802.11-Frame eingebettet, der an die Broadcastadresse addressiert ist. Diesen übergeben wir dann dem Madwifitreiber, der es versendet. |
|||
Sobald der AP alle gültigen Fragmente empfangen hat, setzt er das Paket wieder zusammen, verschlüsselt es erneut (mit einem neuen IV) und ''forwarded'' es als Braodcast. Diesen Broadcast empfangen wir und können nun einfach (da wir den Klartext kennen) den Schlüsselstrom errechnen. Wir kennen nun 40 Byte (36 Byte ARP + Prüfsumme) eines Schlüsselstroms. |
|||
Dieses Vorgehen können wir nun mit größeren Paketen wiederholen und beliebig lange Schlüsselströme erhalten (maximal 16 Fragmente). Wir haben herausgefunden, dass der Netgear Router Pakete mit beliebigem (potentiell sinnlosem) Inhalt zusammensetzt und forwarded. Wir können nun also 16 Fragmente voller Nullen erstellen und an die Broadcast-Adresse schicken - daraus erhalten wir 580 Byte eines Schlüsselstroms. |
|||
Wir sind nun in der Lage beliebige Pakete, maximaler Länge, zu verschlüsseln und zu versenden. Damit können wir nun entweder zu weiteren IVs den Schlüsselstrom sammeln und ein IV-Wörterbuch aufbauen oder mittels ICMP-Echo-Requests beliebig viel Traffic verursachen um den Presharedkey zu knacken. |
|||
= Probleme = |
|||
=== Speicherplatz === |
|||
Da der AP nur über 16 MB Speicher verfügt, haben wir uns entschieden, zusätzlichen Platz per NFS ''einzumounten''. Das hat sich als etwas schwieriger erwiesen, als wir dachten. Die NFS-Module, die wir im Internet fanden, sind regelmäßig eingefroren und ließen sich dann auch nicht mehr (ohne Neustart) entfernen. |
|||
Das BRN-Projekt hat uns daraufhin die Module zur Verfügung gestellt, die sie benutzen -> Problem gelöst |
|||
=== Fake-Authentifizierung === |
|||
Ohne Authentifizierung am AP waren wir keine berechtigten Teilnehmer und der Router hat unsere Pakete lediglich mit Deauthentifizierungsframes beantwortet. Die Aircrack-Suite bietet aber ein Tool, das sich beim AP anmeldet -> Problem gelöst |
|||
=== madwifi-Treiber === |
|||
Um Pakete beliebigen Inhalts (sowie ungültige Pakete) verschicken zu können, benötigt man gepatchte Treiber, die das ath0raw-Device zur Verfügung stellen. Die Treiber, die wir vom BRN-Projekt erhalten haben waren bereits gepatcht -> Problem gelöst |
|||
=== Sequenznummer === |
|||
Fragmentierte Pakete müssen alle die selbe Sequenznummer im 802.11-Header haben, damit sie wieder zusammengesetzt werden können. Der madwifi-Treiber hat aber auch beim Raw-Device die Sequenzummer selbst verwaltet und in der Regel inkrementiert. |
|||
Dieser Mechanismus lässt sich nur umgehen, wenn man bei dem Paket das ''retransmit-Bit'' setzt -> Problem gelöst |
|||
=== Checksummen === |
|||
Um gültige IP-Pakete (z.B. Pings) generieren zu können benötigt man einen Checksummenalgorithmus - wir haben uns leider zu doof angestellt, diesen korrekt zu implementieren (vermutlich aufgrund von ''Endian''-Problemen). Daher können wir bisher keine beliebigen IP-Pakete erstellen, sondern nur bekannte Replizieren -> Problem bisher ungelöst, aber eigentlich leicht zu lösen |
|||
=== Antwort/Forward === |
|||
Der AP hat auf unsere verschlüsselten Fragmentierten Pakete (Echo-Requests) nie geantwortet, sondern sie immer nur geforwarded. Für unsere Zwecke ist dies zwar ausreichend, aber es ist nicht befriedigend. Vermutlich liegt es daran, dass die Checksummen der IP-Pakete nicht stimmen (siehe oben) -> Problem ungelöst |
|||
=== Unbekannter SNAP === |
|||
Aus uns völlig unbekannten Gründen hat der AP ständig WEP-verschlüsselte Pakete mit einem SNAP-Header von AA AA 03 00 00 00 '''00 27''' verschickt (auch ohne angemeldete Teilnehmer). Dies hat unsere Annahme mit dem bekannten SNAP-Header zunächst durcheinander gebracht, später dann aber deutlich vereinfacht. Wir konnten praktisch immer davon ausgehen, dass es sich um ein solches Paket handelt. Vermutlich handelt es sich um Managementframes. Es handelt sich jedenfalls nicht um eines, der bekannten Protokolle -> kein Problem |
|||
=== viel ''noise'' === |
|||
An unserem Standpunkt gab es eine Vielzahl verschiedener drahtloser Netze (Uninetz, BRN, VPNs, etc..). Dadurch flogen ständig irgendwelche Pakete durch die Luft, die wir immer erst ausfiltern mussten. Ein Arbteisplatz ohne weitere Netze wäre wünschenswert gewesen -> geringes Problem |
|||
= Code = |
|||
=== Listings === |
|||
Unsere Implementation des Fragmentierungsangriffs: [[attack.c]] |
|||
Abgespeckte Version zu Demonstrationszwecken: [[arp_and_pingforwarding.c]] |
|||
Dazu notwendig: |
|||
* Als Verifikation unseres "erratenen" Schlüssels: [[rc4.h]] [[rc4.c]] (Quelle: Google-Groups) |
|||
* Implementation des crc32-Prüfsummenalgorithmus: [[crc32.c]] (Quelle: SAR) |
|||
=== Kompilierung und Vorbereitung === |
|||
*[[Programming_the_Linksys_WRT54GS_Wireless_Broadband_Router#What_is_a_toolchain.3F|Installieren und Einrichten der ''Toolchain'' für die ''Crosscompile''-Umgebung]] |
|||
* Erstellen der Objekt-Files |
|||
mipsel-linux-gcc -c crc32.c |
|||
mipsel-linux-gcc -c rc4.c |
|||
* Erstellen des Programms |
|||
mipsel-linux-gcc -o attack attack.c crc32.o rc4.o |
|||
* Kopieren des Programms auf den AP (z.B. via NFS) |
|||
* Auf dem AP sollte das ''madwifi-RAW-Device'' (ath0raw) aktiviert sein. |
|||
* Auf dem AP sollte aircrack-ng installiert sein |
|||
ipkg install aircrack-ng |
|||
=== Ausführung === |
|||
* Fakeanmeldung mittels aircrack-ng beim AP |
|||
aireplay-ng -1 60 -e <opfer-ssid> -a <opfer-mac> -h <unsere-mac> ath0 > /dev/null & |
|||
Die MAC des Opfers kann man ganz einfach aus einem beliebigen Paket auslesen - Sie wird unverschlüsselt im 802.11 Frame übertragen. Unsere MAC darf auch eine gefälschte sein. |
|||
* Ausführen des Programms |
|||
./attack ath0raw |
|||
Neben sehr vielen Debug-Informationen laufen nun unter anderem gültige Schlüsselströme und entschlüsselte Pakete über den Bildschirm. |
Latest revision as of 10:59, 31 October 2006
Im Rahmen des IT Security Workshop 2006 haben wir uns mit der Sicherheit der WEP-Verschlüsselung befasst. Wir haben bestehende Schwachstellen analysiert und einen eigenen Angriff nach Vorlage von A.Bittau entwickelt.
Autoren: Moritz Grauel und Matthias Naber
Bei Fragen stehen wir gerne per eMail zur Verfügung. Die Adressen sind jeweils unsere Nachnamen gefolgt von @informatik.hu-berlin.de
Ziele
Ziel ist es verschiedene Angriffsszenarien auf WEP zu prüfen. Besonderer Schwerpunkt liegt dabei auf den "modernen" Angriffen, die auch bei Netzen ohne viel Traffic Erfolg versprechen.
Ansatzpunkt ist die Arbeit von A.Bittau
Als Ziel der Angriffe dient ein Netgear WGT634U Accesspoint in Standardkonfiguration.
Der Angreifer ist in unserem Szenario ebenfalls ein Netgear WGT634U, auf dem Linux (Hacking the Netgear wgt634u) läuft.
Funktionsweise von WEP
Eigenschaften von WEP
WEP (Wired Equivalent Privacy) ist ein Verschlüsselungsstandard, der von der IEEE herausgegeben wurde. Es findet ausschließlich eine Verschlüsselung auf dem drahtlosen Medium statt. WEP soll lediglich Sicher stellen, dass nur bestimmte Teilnehmer an der Kommunikation teilnehmen können. Das heißt, jeder, der den preshared key kennt, kann die Daten entschlüsseln - eine Verschlüsselung, der Teilnehmer gegeneinander findet nicht statt.
- Verschlüsselung auf OSI Layer 3
- symmetrischer Stromchiffre
- basiert auf RC4-Pseudozufallszahlengenerator
- offizielle Schlüssellängen 40 (64) Bit und 104 (128) Bit
Funktionsweise von Stromchiffre
- Verschlüsselung einer Nachricht der Länge :
- Entschlüsselung einer Nachricht der Länge :
Bildquelle Wikipedia
Verschlüsselung bei WEP
Mit dem Zufallszahlengenerator RC4 wird eine Zufallszahlenfolge gebildet, die so lang ist, wie der zu verschlüsselnde Text (plus 4 Byte). Der RC4-Algorithmus wird dabei mit dem Schlüssel (40 oder 104 Bit) und einem sogenannten Initialisierungsvektor (IV) initiiert. Der IV hat eine Länge von 24 Bit. Zusammen mit dem Schlüssel ergeben sich so die 64 bzw 128 Bit, für die WEP bekannt ist. Der Schlüssel muss a priori allen Teilnehmern bekannt sein, der IV wird jedesmal im Klartext mitverschickt. Über den Klartext wird vor der Verschlüsselung eine CRC32-Prüfsumme (Integrity Check Value - ICV) berechnet und hinten an den Klartext angehängt. Anschließend wird der Klartext (und die Prüfsumme) mit der RC4-Zufallszahl verschlüsselt. Vor den somit entstandenen Ciphertext wird der IV und ein Schlüsselindex (WEP unterstützt 4 verschiedene Schlüssel) geschrieben.
Bildquelle Wikipedia
Entschlüsselung bei WEP
Mit dem, im Klartext versendeten IV und dem preshared key wird der RC4-Schlüsselstrom erzeugt. Der erzeugte Strom ist der selbe, wie bei der Verschlüsselung. Aus dem Schlüsselstrom und dem Kryptotext wird der Klartext und dessen Prüfsumme errechnet. Anschliessend wird die errechnete Prüfsumme mit der übertragenen Prüfsumme verglichen - stimmen die beiden überein gilt das Paket als fehlerfrei entschlüsselt. Andernfalls wird die Entschlüsselung als gescheitert betrachtet und das Paket verworfen.
Bildquelle Wikipedia
Aufbau eines WEP-Pakets
+---------------+-----------+---------------+----------------+----------+ | 24 Byte | 4 Byte | 1 - 2308 Byte | 4 Byte | 4 Byte | | 802.11 Header | IV Header | Frame Body | ICV | FCS | | Klartext | Klartext | verschlüsselt | verschluesselt | Klartext | +---------------+-----------+---------------+----------------+----------+
Der FCS ist eine erneute CRC32-Prüfsumme, die vom Treiber vor dem Senden über die gesammte Nachricht generiert wird.
Theoretische Schwachstellen von WEP
Kleiner Schlüsselraum (40 bzw 108 Bit)
Keystreamreuse
Eine, der größten Schwachstellen bei Stromchiffren ist es, den gleichen Schlüssel mehrfach zu verwenden. Wenn ein Angreifer zwei Nachrichten, die mit dem gleichen Schlüssel verschlüsselt wurden abfängt, besitzt er automatisch das XOR der beiden Klartexte. Sehr oft lassen sich daraus schon wichtige Informationen gewinnen. Bei WEP gibt es nur verschiedene IVs. Nach spätestens 16777216 versendeten Paketen wiederholen sich die IVs und somit die erzeugten Schlüsselströme. Viele Accesspoints beginnen zudem mit einem IV von 0 und inkrementieren diesen einfach. Zudem gibt es bestimmte IVs, die als Schwach gelten (Schwache IVs). Einige APs lassen diese einfach aus, was die Wahrscheinlichkeit des Keystreamreuse noch erhöht.
Schwache IVs
Aufgrund einer Schwachstelle im RC4-Algorithmus lassen sich aus bestimmten IVs Rückschlüsse auf Bits im Schlüssel ziehen. Es ist daher möglich, mit relativ wenigen abgefangenen Paketen den presharedkey zu errechnen. Ein Programm, dass dieses Verfahren einsetzt, ist das bekannte aircrack. Mit nur ca 150.000 bis 300.000 Paketen kann man innerhalb von Sekunden (oft sogar schneller) den presharedkey errechnen. Durch die Verlängerung des Schlüssels wächst die Anzahl der schwachen IVs derart, dass die benötigte Menge abgefangener Pakete nur linear steigt. (Doppelte Schlüssellänge -> Doppelter Aufwand)
Fragmentierung
Der WEP-Standard lässt Fragmentierung auf der MAC-Ebene zu. Ein Paket kann in maximal 16 Fragmente zerlegt werden, die alle mit dem selben IV verschüsselt sein dürfen. Dies ist eine der größten Schwachstellen, da somit relativ einfach Pakete beliebigen Inhalts verschicken lassen.
Wörterbuchangriff
Da es eine überschaubare Menge IVs gibt, ist es möglich ein Wörterbuch zu erstellen, dass Paare von IV und dazugehörigem Schlüsselstrom enthält. Damit kann man bei Bedarf verschlüsselte Pakete entschlüsseln. Durch das generieren von Paketen mit bekantem Inhalt (z.b ARP-Request) kann man ein solches Wörterbuch gezielt aufbauen. Ein solches Wörterbuch hätte dann eine Größe von . Ein solches Wörterbuch macht die Kenntnis des Presharedkey überflüssig, man kann sämtliche Pakte ver- und entschlüsseln.
Prüfsummenfunktion
Die im Standard vorgesehene Prüfsummenfunktion CRC32 ist keine kryptografische Hashfunktion. Es handelt sich um eine lineare Funktion, die im gewissen Maße vorhersagbar ist (Zip-Recovery nutzt dies zur Fehlerbehebung). Es ist daher eine geziehlte Manipulation möglich. Ein Tool, was dies ausnutzt ist chop-chop
schwache Passwörter
Häufig werden lediglich ASCII-Passwörter der Länge 5 oder 13 Zeichen verwendet. Der daraus resultierende Schlüsselraum für den Presharedkey ist so klein, dass damit bruteforce Angriffe realistisch werden.
Status
Wir haben uns für einen Angriff auf Basis der Fragmentierung entschieden.
Grundlage des Angriffs
Die ersten 8 Byte eines WEP-Pakets sind fast immer bekannt. Sie beinhalten den sogenannten LLC/SNAP, der den unter anderem den Typ des Protokolls definiert. Normalerweise handelt es sich dabei entweder um ARP oder IP. Ein ARP-Paket ist an seiner konstanten Länge von 36 Byte (+4 Byte ICV) zu erkennen. Ist das Paket länger kann man davon ausgehen, dass es sich um ein IP-Paket handelt.
+-------------------------+------------+--------+------+ | LLC / SNAP | ARP Header | Quelle | Ziel | | AA AA 03 00 00 00 08 06 | | | | +-------------------------+------------+--------+------+
Framebody eines ARP-Requests
Da wir die ersten 8 Byte des Klartextes bekannt sind, können wir ohne weiteres auch die ersten 8 Byte des Schlüsselstroms errechnen, indem wir Klartext und Kryptotext verXORn.
Ablauf des Angriffs
Wir sniffen solange Pakete mit, bis wir ein WEP-verschlüsseltes Paket unseres Zielnetzes empfangen. Aus diesem Paket errechnen wir uns die ersten 8 Byte des Schlüsselstroms.
Im Speicher bauen wir uns daraufhin ein ARP-Request-Paket zusammen (feste Länge von 36 Byte). Diese Paket zerteilen wir daraufhin in 9 Fragmente zu je 4 Byte. Über diese Fragmente bilden wir eine CRC32-Prüfsumme und hängen diese an. Die Resultierenden 8 Byte werden dann mit dem uns bekannten Schlüsselstrom verschlüsselt und in einen 802.11-Frame eingebettet, der an die Broadcastadresse addressiert ist. Diesen übergeben wir dann dem Madwifitreiber, der es versendet.
Sobald der AP alle gültigen Fragmente empfangen hat, setzt er das Paket wieder zusammen, verschlüsselt es erneut (mit einem neuen IV) und forwarded es als Braodcast. Diesen Broadcast empfangen wir und können nun einfach (da wir den Klartext kennen) den Schlüsselstrom errechnen. Wir kennen nun 40 Byte (36 Byte ARP + Prüfsumme) eines Schlüsselstroms.
Dieses Vorgehen können wir nun mit größeren Paketen wiederholen und beliebig lange Schlüsselströme erhalten (maximal 16 Fragmente). Wir haben herausgefunden, dass der Netgear Router Pakete mit beliebigem (potentiell sinnlosem) Inhalt zusammensetzt und forwarded. Wir können nun also 16 Fragmente voller Nullen erstellen und an die Broadcast-Adresse schicken - daraus erhalten wir 580 Byte eines Schlüsselstroms.
Wir sind nun in der Lage beliebige Pakete, maximaler Länge, zu verschlüsseln und zu versenden. Damit können wir nun entweder zu weiteren IVs den Schlüsselstrom sammeln und ein IV-Wörterbuch aufbauen oder mittels ICMP-Echo-Requests beliebig viel Traffic verursachen um den Presharedkey zu knacken.
Probleme
Speicherplatz
Da der AP nur über 16 MB Speicher verfügt, haben wir uns entschieden, zusätzlichen Platz per NFS einzumounten. Das hat sich als etwas schwieriger erwiesen, als wir dachten. Die NFS-Module, die wir im Internet fanden, sind regelmäßig eingefroren und ließen sich dann auch nicht mehr (ohne Neustart) entfernen.
Das BRN-Projekt hat uns daraufhin die Module zur Verfügung gestellt, die sie benutzen -> Problem gelöst
Fake-Authentifizierung
Ohne Authentifizierung am AP waren wir keine berechtigten Teilnehmer und der Router hat unsere Pakete lediglich mit Deauthentifizierungsframes beantwortet. Die Aircrack-Suite bietet aber ein Tool, das sich beim AP anmeldet -> Problem gelöst
madwifi-Treiber
Um Pakete beliebigen Inhalts (sowie ungültige Pakete) verschicken zu können, benötigt man gepatchte Treiber, die das ath0raw-Device zur Verfügung stellen. Die Treiber, die wir vom BRN-Projekt erhalten haben waren bereits gepatcht -> Problem gelöst
Sequenznummer
Fragmentierte Pakete müssen alle die selbe Sequenznummer im 802.11-Header haben, damit sie wieder zusammengesetzt werden können. Der madwifi-Treiber hat aber auch beim Raw-Device die Sequenzummer selbst verwaltet und in der Regel inkrementiert. Dieser Mechanismus lässt sich nur umgehen, wenn man bei dem Paket das retransmit-Bit setzt -> Problem gelöst
Checksummen
Um gültige IP-Pakete (z.B. Pings) generieren zu können benötigt man einen Checksummenalgorithmus - wir haben uns leider zu doof angestellt, diesen korrekt zu implementieren (vermutlich aufgrund von Endian-Problemen). Daher können wir bisher keine beliebigen IP-Pakete erstellen, sondern nur bekannte Replizieren -> Problem bisher ungelöst, aber eigentlich leicht zu lösen
Antwort/Forward
Der AP hat auf unsere verschlüsselten Fragmentierten Pakete (Echo-Requests) nie geantwortet, sondern sie immer nur geforwarded. Für unsere Zwecke ist dies zwar ausreichend, aber es ist nicht befriedigend. Vermutlich liegt es daran, dass die Checksummen der IP-Pakete nicht stimmen (siehe oben) -> Problem ungelöst
Unbekannter SNAP
Aus uns völlig unbekannten Gründen hat der AP ständig WEP-verschlüsselte Pakete mit einem SNAP-Header von AA AA 03 00 00 00 00 27 verschickt (auch ohne angemeldete Teilnehmer). Dies hat unsere Annahme mit dem bekannten SNAP-Header zunächst durcheinander gebracht, später dann aber deutlich vereinfacht. Wir konnten praktisch immer davon ausgehen, dass es sich um ein solches Paket handelt. Vermutlich handelt es sich um Managementframes. Es handelt sich jedenfalls nicht um eines, der bekannten Protokolle -> kein Problem
viel noise
An unserem Standpunkt gab es eine Vielzahl verschiedener drahtloser Netze (Uninetz, BRN, VPNs, etc..). Dadurch flogen ständig irgendwelche Pakete durch die Luft, die wir immer erst ausfiltern mussten. Ein Arbteisplatz ohne weitere Netze wäre wünschenswert gewesen -> geringes Problem
Code
Listings
Unsere Implementation des Fragmentierungsangriffs: attack.c
Abgespeckte Version zu Demonstrationszwecken: arp_and_pingforwarding.c
Dazu notwendig:
- Als Verifikation unseres "erratenen" Schlüssels: rc4.h rc4.c (Quelle: Google-Groups)
- Implementation des crc32-Prüfsummenalgorithmus: crc32.c (Quelle: SAR)
Kompilierung und Vorbereitung
- Installieren und Einrichten der Toolchain für die Crosscompile-Umgebung
- Erstellen der Objekt-Files
mipsel-linux-gcc -c crc32.c mipsel-linux-gcc -c rc4.c
- Erstellen des Programms
mipsel-linux-gcc -o attack attack.c crc32.o rc4.o
- Kopieren des Programms auf den AP (z.B. via NFS)
- Auf dem AP sollte das madwifi-RAW-Device (ath0raw) aktiviert sein.
- Auf dem AP sollte aircrack-ng installiert sein
ipkg install aircrack-ng
Ausführung
- Fakeanmeldung mittels aircrack-ng beim AP
aireplay-ng -1 60 -e <opfer-ssid> -a <opfer-mac> -h <unsere-mac> ath0 > /dev/null &
Die MAC des Opfers kann man ganz einfach aus einem beliebigen Paket auslesen - Sie wird unverschlüsselt im 802.11 Frame übertragen. Unsere MAC darf auch eine gefälschte sein.
- Ausführen des Programms
./attack ath0raw
Neben sehr vielen Debug-Informationen laufen nun unter anderem gültige Schlüsselströme und entschlüsselte Pakete über den Bildschirm.