
Expose USB activity on the fly

[!NOTE] USBvalve Versión 1.0.0
Se ha realizado una reescritura completa de la aplicación:
- se ha dejado atrás el entorno Arduino IDE, ahora el código está escrito para el Pi Pico SDK
- las dependencias de bibliotecas externas se han reducido mucho
- el soporte de USB host para dispositivos Low Speed ahora es más robusto (ATTiny85, EvilCrow, etc.)
- el hardware y las funcionalidades están casi sin cambios, consulta las notas a continuación para más detalles
Estoy seguro de que, como a mí, te han pedido que pongas tu memoria USB en un dispositivo desconocido... y entonces la duda:
¿Qué le ha pasado a mi pobre dispositivo, entre bastidores? ¿Robando mis archivos? ¿Cifrándolos? ¿O solo instalando un malware? Con USBvalve puedes descubrirlo en segundos: construido con hardware comercial súper barato, puedes probar rápidamente cualquier actividad del sistema de archivos USB y entender lo que ocurre antes de que sea demasiado tarde.
Con USBvalve obtienes una retroalimentación inmediata sobre lo que le sucede a la unidad; la pantalla te mostrará si se accede al sistema de archivos falso integrado en el dispositivo, si se lee o si se escribe en él:
y desde la versión 0.8.0 también puedes usarlo como USB Host para detectar dispositivos BADUSB:
Este es un ejemplo del depurador de BADUSB disponible en el puerto serie:
Si prefieres los vídeos, también puedes echar un vistazo a mi presentación en Insomni'hack
A partir de la versión 0.15.0 se admite una nueva versión Pi Pico Watch. Para compilar la nueva versión tienes que descomentar la línea #define PIWATCH al principio del código. El hardware es una placa de reloj con pantalla TFT de 1,28 pulgadas basada en RP2040. Puedes encontrar más información aquí.
También es totalmente compatible con la Waveshare RP2040-LCD-1.28.
docs: documentación sobre el proyecto, con una presentación donde puedes ver todas las funcionalidades
firmware: firmwares precompilados para la Raspberry Pi Pico. Puedes usarlos directamente y flashearlos en la placa. Tenemos varias versiones diferentes, para OLED de 32 o 64 líneas, para Pico 1 o Pico2, Pi Pico Watch, etc.
PCB: archivo Gerber si quieres imprimir la PCB personalizada. No es obligatorio, puedes usar la tuya propia o montarla en una placa de prototipos
src y data: el código fuente, si quieres modificar y compilar el firmware tú mismo
utils: algunas utilidades que puedes usar para crear un FS personalizado
pictures: imágenes y recursos utilizados en este documento
STL: archivos STL para la carcasa. En las carpetas 1.1 y 1.2 hay carcasas completas (gracias a WhistleMaster). En las carpetas 1.2_64 y 1.2_64_simple hay carcasas para la pantalla de 128x64 (gracias a rtmq0227). Si quieres algo más ligero para proteger la pantalla LCD, puedes usar USBvalve_sliding_cover.stl.
Si quieres construir el tuyo propio, necesitas:
En las versiones 0.x.x, BOOTSEL se usaba para reiniciar el dispositivo o imprimir el número de eventos HID (pulsación > 2 s).
El sondeo de BOOTSEL estaba causando algunos problemas a la detección de BADUSB, por lo que se eliminó en la versión 1.0.0 y se sustituyó por las dos opciones siguientes:
GP0 y GND (pads 1 y 3, consulta la imagen a continuación para ver un ejemplo) para tener las mismas funcionesr (reset) y h (eventos HID) desde el monitor serie
En PCB también encontrarás una versión 1.3 de la placa, con algunos agujeros en los pads 1 y 3 para facilitar el montaje del botón. Pero como puedes ver, también puedes usar tu versión antigua.
Si no estás usando las funciones de BADUSB o si prefieres tener menos cobertura en la detección pero conservar el uso de BOOTSEL, también proporciono un firmware creado con bootsel habilitado (consulta la carpeta y las versiones publicadas).
Gracias a Tz1rf también tenemos dos vídeos geniales: uno que explica el proceso de construcción paso a paso, y otro que muestra cómo cargar el firmware y usar la herramienta.
Casi todo el trabajo lo realiza el software directamente en la placa, así que solo necesitas preparar la conexión con el OLED para la salida.
A partir de la versión 0.8.0 del firmware, USBvalve puede detectar dispositivos HID (utilizados para detectar BADUSB). Esto requiere un puerto USB adicional que actúe como Host. Si no te interesa, puedes usar las instrucciones antiguas en la carpeta docs y usar la versión de PCB 1.1. De lo contrario, continúa con la versión de PCB 1.2 (tenemos versión para USB-A o USB-B, consulta la carpeta).
USBH. Esto es para la versión A, pero también hay una versión para USB Micro-B si lo prefieresAlgunos OLED tienen los pines GND y VCC intercambiados, así que construí la PCB para que sea compatible con ambas versiones:
Por ejemplo, si tu OLED tiene GND en el PIN1 y VCC en el PIN2, así:
Tienes que colocar una gota de soldadura en estos dos pads en la parte posterior de la PCB:
De lo contrario, debes hacer lo contrario y colocar la soldadura en los otros PADs:
Si estás usando una placa de prototipos o solo cableado, todo lo que tienes que hacer es asegurarte de conectar los PIN adecuados a la pantalla OLED y al puerto USB Host.
El mapeo es el siguiente:
Si quieres usar las funciones DEBUG, también puedes colocar un conector de pines en los 3 PIN SWD en la parte inferior de la placa.
[!CAUTION] Esta PCB está pensada para makers de electrónica con experiencia ¡NO LA USES SI NO ESTÁS SEGURO DE QUE PUEDES MANEJARLA!
[!NOTE] R7 y R8 en realidad no están conectados a nada. Se añaden con fines de depuración del circuito. Por eso no aparecen en la BOM
USBpipe es una PCB dedicada para este proyecto.
Puedes encontrar todo lo que necesitas en la carpeta ./PCB/USBpipe/.
Para flashear el firmware, sigue estos pasos:
RPI-RP2 (en entornos Linux puede que tengas que montarla manualmente)uf2) en la carpeta, dependiendo del OLED que hayas usado¡Ya está!
No sé si alguna vez sucederá, pero puede que quieras personalizar el firmware para evitar la detección por parte de malware que conozca USBvalve :-)
He agrupado la mayoría de las variables que puedes querer modificar en esta sección de usb_config.h (consulta el Dockerfile a continuación para recompilar)
// 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
Obviamente también puedes compilar tu propio firmware. Para compilar necesitas el Raspberry Pi Pico SDK y este repositorio.
Instrucciones básicas de recompilación:
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
Si quieres volver a crear un nuevo sistema de archivos falso, puede que quieras echar un vistazo a la carpeta utils, donde he colocado algunas utilidades para construir uno nuevo.
Si quieres compilar tu propio firmware, después de personalizarlo, proporciono un Dockerfile que construye un entorno de compilación completo y compila el firmware.
Introduce los siguientes comandos en la carpeta principal USBvalve para compilar:
# 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
El firmware se colocará con extensión uf2 en la carpeta USBvalve_out.
Si tienes ideas o mejoras en mente, te animo a abrir un issue para que podamos mejorar el proyecto juntos. ¡Gracias!
Si tienes preguntas o necesitas soporte, puedes abrir un Issue aquí o contactarme en Twitter/X @red5heep
La comunidad ha creado algunos forks que implementan soporte para otras placas u otras modificaciones. Gracias a todos los que han contribuido al desarrollo de USBvalve. A continuación se muestra una lista no oficial/incompleta/sin soporte:
[!WARNING] He recibido muchas preguntas sobre USBvalve y los dispositivos USB killer. USBvalve no está diseñado para probar estos dispositivos, no tiene ningún tipo de aislamiento ni protección, así que si sospechas que estás lidiando con uno de estos dispositivos, pruébalo con otra cosa, NO con USBvalve, o podrías dañar el dispositivo, a ti mismo o los objetos cercanos.