
Foto: Vishnu Mohanan / Unsplash (Unsplash License)
Wstęp
HID-emulator to mały sprzęt, który podpięty przez USB udaje klawiaturę i wpisuje przygotowany skrypt. Komercyjny Hak5 Rubber Ducky kosztuje 200 PLN, ale Raspberry Pi Pico (za 20 PLN) z firmwarem CircuitPython robi to samo, a do tego ma 2 MB flash, BOOTSEL i jest open source.
W tym artykule krok po kroku pokażę, jak złożyć własny HID-emulator, oprogramować go w CircuitPython 9 i jak wygląda realistyczny test fizyczny w środowisku korporacyjnym (oczywiście - tylko za pisemną zgodą).
Co potrzebujesz
- Raspberry Pi Pico (RP2040, nie Pico W - przy Pico W antena trochę przeszkadza w obudowie)
- Kabel USB-A do micro-USB (krótki, 30 cm - żeby nie zwisał)
- Komputer do flashowania
- Opcjonalnie: czarna obudowa 3D-printed (model
pico-stealth.stljest na Printables)
Krok 1: Flash CircuitPython
CircuitPython 9.2 dla RP2040 pobierz z circuitpython.org. Wkładasz Pico do USB z wciśniętym BOOTSEL, kopiujesz plik .uf2 na partycję RPI-RP2. Po sekundzie reboot, montuje się dysk CIRCUITPY.
Krok 2: Biblioteki
Z adafruit-circuitpython-bundle skopiuj do /lib:
adafruit_hid/adafruit_hid/keyboard.mpyadafruit_hid/keyboard_layout_us.mpy
Dla polskiego układu programisty podmień layout na własny (jest community fork: circuitpython-keyboard-layouts-pl).
Krok 3: Pierwszy payload
code.py na partycji CIRCUITPY:
import time
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
time.sleep(2) # czas na enumerację USB
kbd = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(kbd)
# Win+R -> uruchom okno
kbd.send(Keycode.WINDOWS, Keycode.R)
time.sleep(0.5)
layout.write("powershell -NoP -W Hidden -Enc ")
# tu base64-encoded payload...
layout.write("JABwAD0AJwBoAGUAbABsAG8AJwA=")
kbd.send(Keycode.ENTER)
Uwaga: nie wstawiaj prawdziwego payloadu do publicznego repo. Powyższy przykład tylko wypisuje string - chodzi o pokazanie mechaniki.
Krok 4: Bezpieczeństwo OPSEC
Pico ma BOOTSEL - jeśli ktoś znajdzie urządzenie, łatwo zmapuje payload. Możesz:
- nadpisać firmware swoim własnym (
pico-sdkw C) bez Python REPL - używać
safemode.pydo wyczyszczenia partycji przy każdym boocie - fizycznie zalać RP2040 epoksydem (jednorazowy gadget)
W praktyce na profesjonalnych testach najczęściej używam dwóch wersji: > jednej "demo" do pokazania klientowi i drugiej, twardszej, do faktycznego > bypass-u.
Krok 5: Dlaczego to nadal działa w 2026
Pewnie myślicie: "AV przecież wykryje". Otóż nie:
- HID nie jest blokowany przez żaden mainstream EDR - bo jak zablokujesz klawiaturę?
- Microsoft Defender od
KB5034441blokuje niektóre sekwencje wWin+R, ale nie wszystkie - BitLocker pre-boot? Nie pomaga - emulator strzela po zalogowaniu
Skuteczna obrona to:
- Group Policy: zablokowanie
Win+R(RestrictRun) - USB whitelisting (Device Control w Defender for Endpoint)
- fizyczna kontrola dostępu do nieobsługiwanych stacji roboczych
Lockpicking jako pomocnik
Małe odejście od tematu, ale realistycznie - żeby podpiąć Pico, musisz mieć dostęp do portu USB. W open space z 3 kandydatami na recepcji to trywialne. W serwerowni mniej. Standard EN 1303 klasy 6 w drzwiach serwerowni to minimum, i tak otwierany w ~5 minut przez kogoś z dobrym setem do SPP. Wnioski wyciągnijcie sami.
Podsumowanie
Pico jako HID-emulator to przykład tego, że demokratyzacja narzędzi ofensywnych już dawno się stała. Hardware za 20 PLN robi to, co dawniej kosztowało 200. Po stronie obrony - bez fizycznej kontroli dostępu, USB whitelistingu i regularnych testów red team, ten wektor zostaje otwarty.
Następnym razem pokażę, jak ten sam Pico przerobić na BadUSB ethernet, czyli emulator karty sieciowej z DHCP-poisoningiem.
// udostępnij
