
Expose USB activity on the fly

[!NOTE] USBvalve Versione 1.0.0
È stata fatta una riscrittura completa dell'applicazione:
- è stato abbandonato l'ambiente Arduino IDE, ora il codice è scritto per il Pi Pico SDK
- le dipendenze da librerie esterne sono state notevolmente ridotte
- il supporto host USB per dispositivi Low Speed è ora più robusto (ATTiny85, EvilCrow, ecc.)
- hardware e funzionalità sono quasi invariati, vedi le note qui sotto per i dettagli
Sono sicuro che, come me, ti è stato chiesto di inserire la tua chiavetta USB in un dispositivo sconosciuto... e poi il dubbio:
cosa è successo alla mia povera chiavetta, dietro le quinte? Mi sta rubando i file? Li sta criptando? O solo installando un malware? Con USBvalve puoi scoprirlo in pochi secondi: costruito su hardware economico e facilmente reperibile, puoi testare rapidamente qualsiasi attività del filesystem USB e capire cosa sta succedendo prima che sia troppo tardi!
Con USBvalve puoi avere un feedback immediato su cosa succede alla chiavetta; lo schermo ti mostrerà se al fittizio filesystem creato sul dispositivo si accede, se viene letto o scritto:
e dalla versione 0.8.0 puoi anche usarlo come host USB per rilevare dispositivi BADUSB:
Questo è un esempio del debugger BADUSB disponibile sulla porta seriale:
Se preferisci i video, puoi anche dare un'occhiata alla mia presentazione all'Insomni'hack
A partire dalla versione 0.15.0 è supportata una nuova versione Pi Pico Watch. Per compilare la nuova versione devi decommentare la riga #define PIWATCH all'inizio del codice. L'hardware è una scheda orologio con display TFT da 1,28 pollici basata su RP2040. Puoi trovare ulteriori informazioni qui.
È inoltre completamente compatibile con il Waveshare RP2040-LCD-1.28.
docs: documentazione sul progetto, con una presentazione dove puoi vedere tutte le funzionalità
firmware: firmware precompilati per Raspberry Pi Pico. Puoi semplicemente usarli e flasharli sulla scheda. Abbiamo diverse versioni, per OLED a 32 o 64 linee, per Pico 1 o Pico2, Pi Pico Watch, ecc.
PCB: file Gerber se vuoi stampare il PCB personalizzato. Non è obbligatorio: puoi usare il tuo o costruirlo su una breadboard
src e data: sorgenti, se vuoi modificare e compilare tu stesso il firmware
utils: alcune utility che puoi usare per creare un filesystem personalizzato
pictures: immagini e risorse usate in questo documento
STL: file STL per il contenitore. Nelle cartelle 1.1 e 1.2 ci sono contenitori completi (grazie a WhistleMaster). Nelle cartelle 1.2_64 e 1.2_64_simple ci sono contenitori per lo schermo 128x64 (grazie a rtmq0227). Se vuoi qualcosa di più leggero per proteggere il display LCD, puoi usare USBvalve_sliding_cover.stl.
Se vuoi costruirne uno tuo, hai bisogno di:
Nelle versioni 0.x.x, BOOTSEL veniva usato per resettare il dispositivo o stampare il numero di eventi HID (pressione > 2s).
Il polling di BOOTSEL creava alcuni problemi al rilevamento BADUSB, quindi è stato rimosso dalla versione 1.0.0 e sostituito con le seguenti due opzioni:
GP0 e GND (pad 1 e 3, vedi l'immagine sotto per un esempio) per avere le stesse funzionir (reset) e h (eventi HID) dal monitor seriale
In PCB troverai anche una versione 1.3 della scheda, con alcuni fori sui pad 1 e 3 per facilitare il montaggio del pulsante. Ma come puoi vedere, puoi usare anche la tua vecchia versione.
Se non usi le funzioni BADUSB o se preferisci avere meno copertura sul rilevamento ma mantenere l'uso di BOOTSEL, fornisco anche un firmware creato con bootsel abilitato (vedi cartella e release).
Grazie a Tz1rf abbiamo anche due ottimi video: uno spiega il processo di costruzione passo dopo passo, e un altro mostra come caricare il firmware e usare lo strumento.
Quasi tutto il lavoro è svolto direttamente sulla scheda dal software, quindi devi solo predisporre la connessione con l'OLED per l'output.
A partire dalla versione 0.8.0 del firmware, USBvalve può rilevare dispositivi HID (usati per rilevare BADUSB). Questo richiede una porta USB aggiuntiva che funga da host. Se non sei interessato, puoi usare le vecchie istruzioni nella cartella docs e usare la versione 1.1 del PCB. Altrimenti procedi con la versione 1.2 del PCB (abbiamo versioni per USB-A o USB-B, vedi cartella).
USBH. Questa è per la versione A, ma c'è anche una versione per USB Micro-B se preferisciAlcuni OLED hanno i pin GND e VCC invertiti, quindi ho costruito il PCB per essere compatibile con entrambe le versioni:
Ad esempio, se il tuo OLED ha GND sul PIN1 e VCC sul PIN2, come questo:
Devi mettere una goccia di stagno su questi due pad sul retro del PCB:
Altrimenti devi fare l'opposto e mettere lo stagno sugli altri pad:
Se stai usando una breadboard o semplicemente dei cavi, tutto quello che devi fare è assicurarti di collegare i pin corretti allo schermo OLED e alla porta host USB.
La mappatura è la seguente:
Se vuoi usare le funzioni DEBUG, puoi anche posizionare un connettore sui 3 pin SWD in basso sulla scheda.
[!CAUTION] Questo PCB è per esperti di elettronica NON USARLO SE NON SEI SICURO DI POTERLO GESTIRE!
[!NOTE] R7 e R8 in realtà non sono collegati a nulla. Sono stati aggiunti per scopi di debug del circuito. Quindi non compaiono nella BOM
USBpipe è un PCB dedicato a questo progetto.
Puoi trovare tutto ciò che ti serve nella cartella ./PCB/USBpipe/.
Per flashare il firmware, segui questi passaggi:
RPI-RP2 (negli ambienti Linux potresti doverla montare manualmente)uf2) nella cartella, a seconda dell'OLED che hai usatoFatto!
Non so se ti capiterà mai, ma potresti voler personalizzare il firmware per evitare il rilevamento da parte di malware a conoscenza di USBvalve :-)
Ho raggruppato la maggior parte delle variabili che potresti voler modificare in questa sezione di usb_config.h (vedi Dockerfile qui sotto per la ricompilazione)
// USB anti-detection settings
//
// Set USB IDs strings and numbers, to avoid possible detections.
// Remember that you can cusotmize FAKE_DISK_BLOCK_NUM as well
// for the same reason. Also DISK_LABEL in ramdisk.h can be changed.
//
// You can see here for inspiration: https://the-sz.com/products/usbid/
//
// Example:
// 0x0951 0x16D5 VENDORID_STR: Kingston PRODUCTID_STR: DataTraveler
//
#define USB_VENDORID 0x0951
#define USB_PRODUCTID 0x16D5
#define USB_DESCRIPTOR "DataTraveler"
#define USB_MANUF "Kingston"
#define USB_SERIAL "123456789A"
#define USB_VENDORID_STR "Kingston" // Up to 8 chars
#define USB_PRODUCTID_STR "DataTraveler" // Up to 16 chars
#define USB_VERSION_STR "1.0" // Up to 4 chars
Ovviamente puoi anche compilare il tuo firmware. Per compilare ti servono il Raspberry Pi Pico SDK e questo repository.
Istruzioni di base per la ricompilazione:
export PICO_SDK_PATH=</path/to/pico-sdk>
git clone --recursive https://github.com/cecio/USBvalve.git
cd USBvalve
mkdir build && cd build
cmake -DPICO_BOARD=pico .. # or pico2 for standard build
make -j$(nproc)
# Output: build/src/USBvalve.uf2
Se vuoi ricreare un nuovo filesystem fittizio, potresti dare un'occhiata alla cartella utils, dove ho inserito alcune utility per crearne uno nuovo.
Se vuoi compilare il tuo firmware, dopo averlo personalizzato, fornisco un Dockerfile che crea un ambiente di compilazione completo e compila il firmware.
Inserisci i seguenti comandi nella cartella principale USBvalve per compilare:
# To Build:
# docker build -t usbvalve-sdk -f Dockerfile.sdk .
#
# To Run (default: pico, SSD1306 OLED 128x32):
# docker run --rm -v $PWD:/mnt usbvalve-sdk
#
# Options (via environment variables):
# BOARD=pico|pico2 Board target (default: pico)
# OLED_HEIGHT=32|64 OLED display height (default: 32)
# PIWATCH=1 Use GC9A01 round TFT instead of SSD1306
# USE_BOOTSEL=1 Enable BOOTSEL button (disrupts Low Speed USB)
#
# Examples:
# docker run --rm -e BOARD=pico2 -v $PWD:/mnt usbvalve-sdk
# docker run --rm -e PIWATCH=1 -v $PWD:/mnt usbvalve-sdk
# docker run --rm -e BOARD=pico2 -e OLED_HEIGHT=64 -v $PWD:/mnt usbvalve-sdk
Il firmware verrà salvato con estensione uf2 nella cartella USBvalve_out.
Se hai idee o miglioramenti in mente, ti incoraggio ad aprire una issue così possiamo migliorare il progetto insieme! Grazie!
Se hai domande o hai bisogno di supporto, puoi aprire una Issue qui o contattarmi su Twitter/X @red5heep
La community ha creato alcuni fork che implementano il supporto per altre schede o altre modifiche. Grazie a tutti coloro che hanno contribuito allo sviluppo di USBvalve. Ecco qui di seguito un elenco non ufficiale/incompleto/non supportato:
[!WARNING] Ho ricevuto molte domande su USBvalve e i dispositivi USB killer. USBvalve non è progettato per testare questi dispositivi, non ha alcun tipo di isolamento o protezione, quindi se sospetti di avere a che fare con uno di questi dispositivi, testalo con qualcos'altro, NON con USBvalve, o potresti danneggiare il dispositivo, te stesso o gli oggetti vicini a te.