The English version: https://glitch0ne.com/2021/01/09/en-the-wifi-dodecautenticator/
Disclaimer: Atacul și tehnicile despre care vă povestesc aici trebuie încercate doar pe dispozitive personale sau dispozitivele unor persoane care și-au dat acordul explicit pentru asta. Nu sunt responsabil pentru modul în care alte persoane folosesc informațiile prezentate mai jos. Mulțumesc!
Acum câțiva ani am avut privilegiul de a vedea în persoană cum arată și care erau capabilitățile unui proiect numit WiFi Cactus, realizat de Mike Spicer [@d4rkm4tter] . Ulterior, prin cercetările mele (a se citi: uitându-mă aiurea la chestii pe internet) am descoperit că există persoane care folosesc cipuri WiFi pentru a construi dispozitive care deautentifică clienți de pe rețelele wireless la care sunt conectate. Așa că, inspirat fiind de mantra „fă chestia aia dar pe toate canalele de WiFi”, una din ideile principale ale WiFi Cactus, m-am gândit cum ar fi dacă aș avea un număr de cipuri care să stea pe câte un canal WiFi în loc să tot treacă de la unul la altul. Desigur, tot ar mai exista trafic pierdut în momentul în care unul din cipuri „atacă” un dispozitiv, așa că aș avea nevoie de câte două cipuri per canal, unul care să analizeze trafic, și unul care să atace. Astfel, s-a născut ideea proiectului meu.
1. Hardware-ul cumpărat
Elementul principal al unui astfel de proiect este de obicei o placă de circuit ce conține un cip ESP. Am ales să folosesc un ESP8266 (mai exact versiunea ESP-07), deoarece era destul de ieftin cât să merite cumpărat în cantități mai mari, și din cauza faptului că avea în componența sa un conector IPEX care-mi permitea să conectez o antenă mai puternică decât cea ceramică prezentă deja în circuit. Pentru prototip am folosit două convertoare IPEX la RP-SMA și două antene de 2dbi pe care le-aveam pe-aproape, pentru a avea performanțe mai bune în materie de recepție și transmitere de pachete. Pe lângă asta am avut nevoie de un convertor USB la TTL pentru a programa plăcile, câțiva rezistori de 1k pentru a porni cu succes cipul și headere de pini pentru a interfața cu ușurință cu pinii GPIO prezenți pe placă. De asemenea, din cauza faptului că la final trebuia să am destulă putere cât să țin 22 de astfel de plăci împreună cu câteva elemente auxiliare, aveam nevoie de o sursă de curent capabilă să-mi ofere destul curent la un voltaj de 3.3v. Am folosit un alimentator de 5V capabil să ofere 4A, conectat la un regulator step-down Pololu D36V28F3, care putea să-mi ofere un maxim de 4.5A la 3.3v. Chiar dacă plăcile probabil că n-ar fi avut nevoie permanent de cantitatea maximă de curent pentru care erau proiectate, am considerat că 22 de plăci consumând un maxim de 200mA per placă m-ar fi adus aproape de 4.4A la încărcare maximă. În realitate, plăcile consumă în medie undeva la 80mA, așa că pot spune că partea de alimentare nu va fi suprasolicitată prea curând.
2. Hardware-ul construit
Pentru a scana și ataca unsprezece canale în același timp, aveam nevoie să proiectez și să construiesc un set de circuite care ar putea să țină câte două plăci ESP8266, și să găsesc o modalitate de a monta și alimenta unsprezece circuite de acest fel. În mod normal aș fi folosit niște circuite imprimate normale, puse una peste alta și conectate împreună dar dintr-un motiv sau altul m-am gândit că le pot monta în forma unui dodecahedron, un poliedru regulat cu 12 fețe pentagonale. Da, a trebuit să caut pe Wikipedia cum se numește pentru că eu și geometria teoretică în spațiu nu ne-am mai văzut din liceu. În fine, din cauza faptului că aveam nevoie să scanez doar unsprezece canale, puteam folosi unsprezece fețe pentru circuitele imprimate, lăsând loc pentru o bază imprimată 3D. Așa că am început să lucrez la un design de PCB pentagonal care conținea circuitele ESP8266 împreună cu rezistorii de care aveau nevoie, LED-uri pentru diagnoză și headere de pini pe care le puteam folosi pentru a selecta canalele fără a modifica codul de pe fiecare cip. În final am echipat fiecare PCB cu găuri de 2.2mm în fiecare colț în care puteam pune șuruburi M2 pentru a monta tot.
Pentru a putea porni și folosi un ESP8266, aveam nevoie să adaug niște rezistori care conectau patru pini ai cipului fie la GND (pull-down) sau la 3.3v (pull-up). Mai exact:
- Un rezistor pull-down de 1k la GPIO_15.
- Un rezistor pull-up de 1k la CH_PD.
- Un rezistor pull-up de 1k la RESET.
- Un rezistor pull-up de 1k la GPIO_0.

Pentru a programa cipul, trebuia să-i activez modul de programare prin conectarea unui rezistor pull-down de valoare mică la GPIO_0. Cu toate astea, eu am conectat direct GPIO_0 la GND prin intermediul unui jumper, și din fericire fumul magic din cip n-a ieșit afară. Cu toate astea, nu faceți ca mine, și luați-vă după diagrama de mai sus.
După ce-am pus cap la cap piesele de care aveam nevoie, trebuia să găsesc o modalitate de a comunica cu circuitul fără a modifica codul. Am îndeplinit asta folosind headere de pini de 0.1″ pentru input, și câteva LED-uri pentru output. La final, acestea erau piesele care trebuiau să intre pe fiecare circuit imprimat.
- Două cipuri ESP8266.
- Opt rezistori (patru per ESP), pentru a porni ESP-urile.
- Două headere de 6 pini (unul per ESP), pentru a programa și testa ESP-urile.
- Un header de 2×2 pini pentru a permite comunicarea serial între cele două plăci, conectând pinul RX ai unui cip cu pinul TX al celuilalt, și viceversa.
- Un header de 2×2 pini pentru a alimenta jumătate de placă separat de cealaltă, în caz că trebuia să testez un cip fără a-l porni pe celălalt.
- Două headere de 2×5 pini pentru a selecta canalul pe care va fi efectuat atacul și a seta dacă un cip e primar sau secundar.
- Zece rezistori (cinci per ESP), pentru a citi cum trebuie valorile din headerele menționate mai sus.
- Patru LED-uri (două per ESP) pentru că luminițe. Și pentru că testare.
- Doi conectori JST-XH pentru alimentare către și de la PCB.
- Două butoane de reset (unul per ESP).
După ce am pus totul cap la cap în Fritzing, programul meu preferat de proiectare de circuite imprimate, a trebui să proiectez niște piese ce pot fi imprimate 3D pentru a monta totul la final. Mai exact, aveam nevoie de colțuri și de o bază. Fiecare colț trebuia să aibă găuri de 2.2mm pentru șuruburile M2 și să permită destul spațiu între plăci, iar baza trebuia să aibă aceeași formă pentagonală ca PCB-urile și să permită montarea unui conector de alimentare cilindric. După puțină muncă și multă matematică, am pregătit niște chestii care arătau decent.
3. Software-ul
Odată ce am proiectat partea hardware a proiectului a trebuit să fac metalele alea să gândească. Unul din motivele pentru care am ales să folosesc un ESP8266 era faptul că era singurul pe care știam să-l programez cu IDE-ul celor de la Arduino, pe care îl mai folosisem în trecut. De asemenea, atacul pe care voiam să-l simulez nu era unul nou, ceea ce însemna că existau deja destule bucăți de cod pe internet pe care le puteam folosi și adapta pentru proiectul meu. Un astfel de proiect este cel al lui RandDruid, despre care am citit un articol acum vreo doi ani. Puteți citi articolul aici: A weekend on the dark side
Codul pe care l-am luat inițial de pe GitHub nu avea toate funcționalitățile de care aveam eu nevoie. Mai exact, voiam să separ partea de analizare de trafic și partea de atac propriu-zisă, împreună cu setarea canalului prin pinii GPIO. Astfel, a trebuit să modific funcția callback apelată de fiecare dată când cip-ul ESP detecta un pachet transmis prin WiFi. Modificările au constat în adăugarea unei funcții send_data() care prelua datele despre pachetele detectate și le transmitea mai departe prin comunicare Serial către celălalt cip. După ce am încercat un număr de soluții care ar fi fost mai ușor de scris, am ales în final să transmit fiecare bucată de informație pe rând către cipul care se ocupa cu partea de atac, urmând să asamblez structurile la destinație pentru a avea toate datele în formatul corect.
După ce am primit datele și le-am salvat într-un array, a venit timpul să ne distrăm și să dăm lumea afară de pe WiFi. Din păcate, acum câțiva ani, omuleții de la Espressif care proiectează cipurile ESP8266 și care construiesc și SDK-ul pe care-l folosim pentru a le programa, au decis că cipurile trebuie să nu mai permită transmiterea de pachete de management începând cu versiunea de software 1.4. Desigur, asta a frânt inimile programatorilor de pretutindeni, care au asediat zidurile orașului, cerându-și drepturile care erau ale lor și pe care le aveau! Asta sau au decis să folosească SDK-ul vechi și aia e, nu-mi amintesc exact. În fine, problema era că persoanele care lucrau la IDE-ul Arduino au făcut update la SDK (așa cum și trebuia, de fapt), așa că atacurile mele n-aveau sub nici o formă cum să meargă, pentru că funcțiile apelate refuzau să trimită pachetele.
Din fericire pentru mine, aveam niște proiecte pe-aproape care erau capabile de a detecta astfel de atacuri, deci puteam să văd ce se-ntâmplă în rețea. De asemenea, am pus în cod o căruță de print-uri prin Serial pentru a testa modificările, și puteam să văd că funcțiile erau apelate și încercau cel puțin să trimită datele mai departe. În ultimul rând, știam sigur că există pe piață dispozitive care fac fix atacul pe care-l încercam, deci era clar că cineva a reușit să facă treaba asta să meargă. Norocul meu a fost că cei de la DStike, care construiesc astfel de dispozitive, aveau un repository pentru IDE-ul Arduino care folosea un SDK modificat, capabil să transmită datele de care aveam eu nevoie. Puteți găsi repository-ul aici: https://github.com/SpacehuhnTech/esp8266_deauther/wiki/Installation#compiling-using-arduino-ide
4. Asamblarea tuturor pieselor
Pentru a programa cipurile, a trebuit să încarc fișierul .ino în IDE-ul Arduino, să selectez placa „Generic ESP8266” din lista „Deauther ESP8266 boards”, și să mă asigur că am setat următoarele… setări:
- Builtin Led: 2
- Upload Speed: 115200
- CPU Frequency: 80 MHz
- Crystal Frequency: 26 MHz
- Flash Size: 1MB (FS:64KB OTA:~470KB)
- Flash Mode: DOUT (compatible)
- Debug port: Disabled
- Debug level: None
- IwIP Variant: v2 Lower Memory
- VTables: Flash
- Exceptions: Legacy (new can return nullptr)
- Erase Flash: “Only Sketch”
- SSL Support: All SSL ciphers (most compatible)
Acu’, nu știu sigur dacă aveam nevoie de toate setările astea, sau chiar dacă-s toate bune. Ce știu e că au venit ca default în IDE și au mers pentru placa mea ESP8266, deci poate merg și pentru voi.
Pentru a programa placa am folosit un convertor CP2102 USB 2.0 to TTL Module Serial Converter conectat la pinii RX, TX, GND și VCC pe care i-am expus la un header de pini de pe circuitul imprimat, pentru a-mi fi mai ușor să le testez. E de menționat faptul că pin-ul RX de pe convertor trebuie conectat la pinul TX de pe placă, și viceversa, TX de pe convertor trebuie conectat la RX-ul de pe placă. De asemenea, uitați-vă cu atenție și conectați pinul VCC la pinul de 3v de pe convertor, deoarece un voltaj de 5v ar prăji cipul.
După ce am conectat tot și am încărcat prima bucată a codului a apărut prima problemă datorată lipsei mele de experiență cu ESP8266. Plănuisem inițial să folosesc GPIO_2 pentru a transmite cipului dacă e cel primar sau cel secundar, prin conectarea acestuia la GND. Din păcate, cipul ESP8266 are nevoie ca acest pin să fie întotdeauna conectat la VCC printr-un rezistor pull-up atunci când pornește, ceea ce a eliminat posibilitatea de a-l folosi ca input pentru orice. Pentru a rezolva problema a trebuit să schimb unul din LED-urile de test cu un header de 2 pini care intra în aceleași găuri de pe circuitul imprimat. Sigur, pierdusem o modalitate de a primi informații vizuale, dar câștigasem posibilitatea de a face codul să meargă cum trebuie.
O a doua problema a cărei cauză nici acum n-o știu a apărut când am început să testez primele versiuni ale codului. Din când în când apăreau niște comportamente ciudate în comunicarea Serial dintre cele două jumătăți ale circuitului. Era ca și cum datele transmise de placa primară erau modificate cumva pe drum spre cea secundară, un comportament care părea complet aleatoriu. Erau momente când mergea totul bine și dintr-o dată, crăpa. După câteva teste am învățat că acest comportament apărea atunci când pinul TX al convertorului USB to Serial era conectat la pinul RX al plăcii secundare, ceea ce cumva modifica datele primite în final de aceasta. Nu pot să-mi explic de ce se comporta așa deoarece nu trimiteam date prin convertor atunci când testam, folosindu-l doar pentru a primi date. Oricum ar fi, după ce am deconectat acest pin, totul a mers ok, și dacă aveți idee de ce se comporta așa, aruncați cu un mesaj după mine că tare mi-s curios.
Cu toate piesele puse cap la cap și codul încărcat pe cipuri a venit vremea să-mi testez codul și să dau lumea afară de pe WiFi. Problema cu asta e că e aproape ilegal să mă joc așa cu rețelele altora, dar e și enervant tare, așa că trebuia să fac în așa fel încât să-mi afectez doar dispozitivele mele. Astfel, am adăugat adresele MAC ale propriilor dispozitive într-un array, și am modificat codul în așa fel încât să dea afară doar dispozitive pe care le detectează și care-s în acea listă. Așa cum menționasem mai sus, atacul nu avea cum să meargă inițial, ceea ce am detectat cu ajutorul unui program numit Kismet, care printre altele poate detecta fix acest tip de atac, împreună cu Wireshark, un program capabil de a analiza pachete detectate cu o placă de rețea. După ce am folosit SDK-ul oferit de cei de la DStike, am pornit placa, et voila, Kismet a-nceput să arunce cu alerte în stânga și-n dreapta. În sfârșit, mergea.
Desigur, ăsta a fost doar primul prototip. A trebuit să construiesc încă 11 circuite, și să asamblez totul folosind colțurile imprimate 3D, o grămadă de șuruburi și distanțiere M2, îmăreună cu niște plăci semi-decorative din plexiglas pe care am lipit 22 antene de 3dbi conectate la mufa IPEX de pe fiecare ESP pentru a obține performanțe mult mai bune de transmisie și recepție.
Problema finală a acestui „mic” proiect a apărut atunci când am început să montez împreună toate circuitele imprimate și să le conectez unele la celelalte. Am observat că voltajul scădea drastic cu cât adăugam mai multe plăci la circuit. Deși circuitele imprimate au fost proiectate cu trasee de alimentare pe ele care le-ar fi pus efectiv în paralel și care îmi permiteau să le conectez între ele cu niște cabluri de alimentare făcute personal, aceste trasee și cabluri nu erau potrivite pentru acest tip de circuit și cauzau o scădere a voltajului de la 3.3v la aproximativ 2.9v când aveam doar șapte din unsprezece pentagoane conectate. Asta însemna că nu aveam nici o șansă să fac să meargă cipurile ESP8266, acestea fiind proiectate pentru un voltaj minimal de 3.0v. Din fericire pentru mine, aveam printr-un sertar o placă veche de prototipizare cu trasee deja făcute, din care am făcut rapid o placă de alimentare cu 12 porturi, ceea ce însemna că nu mai aveam nevoie să folosesc traseele de pe circuitele mele imprimate. Astfel, am reușit să ofer aproximativ 3.24v fiecărui circuit, și am învățat că traseele și cablurile lungi și subțiri taie voltajul rău de tot.
Odată ce am montat tot și am rezolvat probleme de alimentare, am conectat alimentatorul la conectorul de pe baza imprimată 3D, și toate cele unsprezece plăci s-au aprins mai ceva ca o instalație de Crăciun, având LED-uri verzi de comunicare care luminau prin antenele fiecărei plăci pentagonale. Arăta înfricoșător de frumos, mai ceva ca un dispozitiv nuclear din filme.
5. Concluzii
În final, tot proiectul a durat mult mai mult decât mi-ar plăcea să recunosc. Și deși poate nici acum nu-i chiar terminat, măcar funcționează. Și dacă urc pe el codul de atac, o să dea tot afară de pe WiFi până mi s-o lua curentul. Doar că acum e inofensiv, și va sta așa până va trebui să fac un demo pentru orișice motiv. Ceea ce aș vrea să țineți minte de aici este faptul că problema pe care o exploatez prin acest atac există de când lumea și a fost rezolvată acum vreo doi ani cu apariția standardului WPA3. Cu toate astea, nu există prea multe dispozitive pentru consumatorul de rând care să suporte WPA3, și există chiar mai puține care să suporte standardul 802.11w care de asemenea rezolvă problema exploatată. Și chiar dacă atacul ăsta nu e distructiv cât e enervant, deschide ușa unor alte atacuri mai importante care pot permite compromiterea unei rețele WiFi. În esență, puteți privi dispozitivul ăsta ca pe o mică lucrare de artă care demonstrează că hacking-ul poate să și arate fain, nu doar să fie de speriat. Și că ar fi fain să vă faceți upgrade la device-uri.

6. Planuri de viitor
În viitor, dacă pierd destui neuroni cât să vreau să mai fac unu d-ăsta, aș face următoarele modificări:
- Să-l fac mai ușor de testat prin adăugarea de puncte de test peste tot pe PCB.
- Să folosesc I2C pentru comunicarea între plăcile ESP8266.
- Să folosesc pinii GPIO care trebuie de pe plăcile ESP8266.
- Să fac un ground plane pentru PCB-uri (dacă știți cum îi zice în Română, dați-mi de știre).
- Să folosesc dip switches sau encoding switches în loc de jumpere pentru selectarea unui canal.
- Să folosesc un buton sau un întrerupător pentru programare, în loc de jumper.
- Să folosesc rezistori și LED-uri SMD.
- Să fac plăcile cu mască neagră în loc de verde.
- Să am trasee și fire mai groase pentru alimentare.
- Să folosesc câte un convertor step-down per placă, și să trimit 12v între toate plăcile ca să nu mai am probleme așa mari pe partea de alimentare.
- Să folosesc antene cu gain mai mare de 3dbi, ca să arate mai „țepos”.
Trivia
- Un dodecahedron regulat are 20 de colțuri.
- Unghiul dintre fiecare față pentagonală a unui dodecahedron se numește unghi diedru și are o valoare de 116.57 grade.
- Fiecare unghi interior al unui pentagon are o valoare de 108 grade.
- Numere:
- 22 de plăci ESP8266.
- 242 rezistori
- 352 de contacte lipite
- 484 de pini lipiți individual
- 110 șuruburi M2
- 55 distanțiere M2
- cel puțin șaptișpe ore de muncă petrecute lipind, asamblând și programând tărășenia asta. Asta după ce am scris codul în versiunea sa „beta” care-i pe fiecare placă la momentul actual.
- Dacă nu mai lipesc vreo piesă electronică vreodată, tot ar fi prea mult. Dar am apreciat fiecare minut petrecut în fum de rășină.
Referințe
- Pagina Wikipedia despre atacul de deautentificare: https://en.wikipedia.org/wiki/Wi-Fi_deauthentication_attack
- Cod, proiect pentru circuite imprimate, modele 3D pentru piese și 2D pentru părțile tăiate cu laser găsiți aici: https://github.com/GlitchOne/Dodecauthenticator
- Pagină Github Spacehuhn DStike : https://github.com/SpacehuhnTech/esp8266_deauther
- Articolul lui RandDruid de pe Hackaday : https://hackaday.io/project/9333-weekend-on-the-dark-side/details
- Pagina de Github a lui RandDruid : https://github.com/RandDruid/esp8266-deauth
- manual ESP-07 : https://www.tinyosshop.com/datasheet/ESP-07S_User_Manual.pdf
- Beginner’s guide to ESP8266: https://tttapa.github.io/ESP8266/Chap02%20-%20Hardware.html
- Fritzing, programul folosit pentru proiectarea circuitelor imprimate: https://fritzing.org/
- DesignSpark Mechanical, programul folosit pentru modelele pieselor 3D: https://www.rs-online.com/designspark/mechanical-software
- Regulator step-down Pololu: https://www.pololu.com/category/261/d36v28fx-step-down-voltage-regulators