VWX.MEDIA
a close up of a printed circuit board

Foto: Vishnu Mohanan / Unsplash (Unsplash License)

Budowa własnego HID-emulatora z Raspberry Pi Pico

Rubber Ducky za 20 PLN - CircuitPython 9, OPSEC i fizyczne testy.

Admin· 1 maja 2026· 2 min czytania

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.stl jest 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.mpy
  • adafruit_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-sdk w C) bez Python REPL
  • używać safemode.py do 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 KB5034441 blokuje niektóre sekwencje w Win+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

Budowa własnego HID-emulatora z Raspberry Pi Pico - VWX.MEDIA