
Pruebas USB simplificadas

a. Solo pruebas de dispositivo
b. Configuración mínima de agfs en el medio
c. Configuración completa de agfs en el medio con soporte de depuración
a. Linux
AutoGadgetFS es un marco de trabajo de código abierto que permite a los usuarios evaluar dispositivos USB y sus hosts/controladores/software asociados sin necesidad de un conocimiento profundo del protocolo USB. La herramienta está escrita en Python3 y utiliza RabbitMQ y acceso WiFi para permitir a los investigadores realizar evaluaciones de seguridad USB remotas desde cualquier lugar del mundo. Al aprovechar ConfigFS, AutoGadgetFS permite a los usuarios clonar y emular dispositivos rápidamente, eliminando la necesidad de profundizar en los detalles de cada implementación. El marco también permite a los usuarios crear sus propios fuzzers sobre él.
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/devtest.jpeg" width="450" height="187" /></div>
<a name="MMITM"/>```bash
Minimal agfs in the middle setup:

```bash Complete agfs in the middle setup with debugging support:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/scenario2.jpeg"/></div>
---
<a name="Usbdev"/>
### Soporte de clase de dispositivo USB:
[✔️] Dispositivos USB HID completamente soportados (Hombre en el medio)
[⚠️] Solo pruebas de dispositivo .. Todos los dispositivos USB (Sin Hombre en el medio)
[⏳] Próximas versiones... Todos los dispositivos USB (Hombre en el medio)
---
<a name="Caps"/>
### Capacidades:
1. Encontrar, seleccionar y adjuntar a un dispositivo USB con facilidad.
1. Emular cualquier dispositivo USB HID.
1. Realizar AGFS en modo de intercepción (sniffing) para dispositivos HID (guardar comunicación en disco).
1. Sniffing de dispositivos (cualquier dispositivo).
1. Múltiples fuzzers que permiten fuzzear un dispositivo o un host.
1. Fuzzers aleatorios (con paquetes de longitud fija o aleatoria).
1. Fuzzers inteligentes que aprenden de comunicaciones USB anteriores.
1. Fuzzer de descripción: indicar al fuzzer qué bytes fuzzear, dejando el resto del paquete igual.
1. Gadget Fuzzer.
1. Fuzzer secuencial.
1. Enumerador de transferencias de control.
1. Reproducción de paquetes desde un archivo.
1. Reproducción de paquetes desde una captura USBLyzer guardada.
1. Forma visual de presentar paquetes para facilitar la ingeniería inversa de la comunicación.
1. Alertas para dispositivo en modo DFU, o si el dispositivo filtra información.
1. El dispositivo USB y el host pueden estar en cualquier lugar de internet.
1. Monitorizar cambios repentinos de interfaz.
---
<a name="Road"/>
### Hoja de ruta:
1. Sniffear solicitudes de transferencia de control a un dispositivo y responderlas.
1. MITM y emular todo tipo de dispositivos.
1. Interfaz basada en consola/QT.
1. Soporte de más interfaces/endpoints en la RPI zero W.
1. Soporte de más placas como la greatfet.
1. Migrar a una placa personalizada.
1. Trabajar para que la Raspberry Pi tenga soporte completo para emulación de dispositivos USB con todas las interfaces.
1. Correlacionar paquetes enviados y recibidos mediante números de secuencia.
---
<a name="Installation"/>
### Instalación:
<a name="Linux"/>
### Máquina Linux:
* Nota: WSL/WSL2 no es compatible debido a problemas con el paso de USB.
* Instalar Python3, ipython3, git, pip y el servidor rabbitMQ
```bash
sudo apt install python3 ipython3 git python3-pip rabbitmq-server dfu-util
sudo service rabbitmq-server start
```
* Clonar el repositorio
```bash
git clone https://github.com/ehabhussein/AutoGadgetFS
cd AutoGadgetFS
```
* Instalar los requisitos
```bash
sudo -H pip3 install -r requirements.txt
```
* Degradar prompt toolkit para una mejor experiencia con ipython:
```bash
sudo python3 -m pip install prompt-toolkit~=2.0
```
* Habilitar la interfaz web para rabbitMQ
```bash
sudo rabbitmq-plugins enable rabbitmq_management
http://localhost:15672/ para acceder a la interfaz web
```
* Iniciar sesión en la interfaz web con las credenciales *guest:guest*
* NOTA: si no está instalando rabbitMQ en `localhost`, agregue el siguiente usuario e inicie sesión con él:
```bash
sudo rabbitmqctl add_user autogfs usb4ever
sudo rabbitmqctl set_user_tags autogfs administrator
```
* Subir el archivo de configuración de rabbitMQ
* En la pestaña de resumen, desplácese hasta el final para importar definiciones
* Suba el archivo ubicado en: *rabbitMQbrokerconfig/rabbitmq-Config.json*
```bash
sudo service rabbitmq-server restart
```
* Probar la instalación
```python
sudo ipython3
Python 3.7.7 (default, Apr 1 2020, 13:48:52)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import libagfs
In [2]: x = libagfs.agfs()
***************************************
AutoGadgetFS: USB testing made easy
***************************************
Enter IP address of the rabbitmq server: 127.0.0.1
In [3]: exit
sudo `python3` agfsconsole.py
***************************************
AutoGadgetFS: USB testing made easy
***************************************
Enter IP address of the rabbitmq server: 127.0.0.1
Give your project a name?!:
``` ```
* Patch Pyusb langID ( Not needed unless you get pyusb errors for langID ):
* Edit the file `/usr/local/lib/python3/dist-packages/usb/util.py`
* make changes to the `def get_string` method to look like below:
```python
if 0 == len(langids):
return "Error Reading langID"
#raise ValueError("The device has no langid")
if langid is None:
langid = langids[0]
elif langid not in langids:
return "Error Reading langID"
#raise ValueError("The device does not support the specified langid")
```
* If you prefer to use `patch` apply the following patch to the file: `AutoGadgetFS/pyusb_patches/pyusb_langid.patch`
---
<a name="Rasp"/>
### Raspberry Pi Zero W:
* Obtain a copy of [Raspian Lite Edition](https://downloads.raspberrypi.org/raspios_lite_armhf_latest)
* Burn the Image to the SD card using [BalenaEtcher](https://www.balena.io/etcher/)
* Mount the SD card on your machine and make the following changes:
* In the `/path/to/sdcard/boot/config.txt` file add to the very end of the file:
```bash
enable_uart=1
dtoverlay=dwc2
```
* In the `/path/to/sdcard/boot/cmdline.txt` add right after `rootwait`
```bash
modules-load=dwc2
```
* it should look like this make sure its on the same line:
```bash
console=serial0,115200 console=tty1 root=PARTUUID=6c586e13-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2
```
* Enable ssh:
* in the `/path/to/sdcard/boot` directory create an empty file name ssh:
```bash
sudo touch /path/to/sdcard/boot/ssh
```
* Enable Wifi:
* in the `/path/to/sdcard/boot` directory create an file named `wpa_supplicant.conf`:
```bash
sudo vim /path/to/sdcard/boot/wpa_supplicant.conf
```
* Add the following contents:
```bash
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US
network={
ssid="<your wifi SSID>"
psk="<your wifi password>"
key_mgmt=WPA-PSK
}
```
* Unmount the SD card and place it back into the Raspberry Pi Zero and power it on.
* Copy the content of `AutogadgetFS/Pizero/` to the Pi zero: `username: pi` & `password: raspberry`
```bash
cd AutogadgetFS/Pizero/
scp gadgetfuzzer.py removegadget.sh requirements.txt router.py pi@<pi-ipaddress>:/home/pi
```
* SSH into the PI Zero and setup requirements for AutoGadgetFS:
```bash
ssh pi@<pi-ip-address>
chmod +x removegadget.sh
sudo apt update
sudo apt install python3 python3-pip
sudo -H pip3 install -r requirements.txt
```
* Upgrading the latest kernel and adding modules (* This step is optional for the current release):
( This will take a very long time compiling on the Pi Zero, unless you choose to cross compile the kernel see [Compiling options](https://www.raspberrypi.org/documentation/linux/kernel/building.md))
```bash
sudo bash
apt install git bc bison flex libssl-dev make libncurses5-dev screen
screen
mkdir Downloads
cd Downloads/
git clone --depth=1 https://github.com/raspberrypi/linux
cd linux/
make bcmrpi_defconfig
make menuconfig
```
* Enable the Modules and save the config:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/allgadgets.png"/></div>
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/allgadgets2.png"/></div>
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/allgadgets3.png"/></div>
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/allgadgets4.png"/></div>
* Build and use the kernel:
```bash
make zImage modules dtbs
make modules_install
cp arch/arm/boot/dts/*.dtb /boot/
cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
cp arch/arm/boot/dts/overlays/README /boot/overlays/
cp arch/arm/boot/zImage /boot/kernel.img
reboot
```
#### And you're done!
---
<a name="Tutorial"/>
### AutoGadgetFS tutorial:
[Click to visit the tutorial](https://docs.agfs.io/)
---
<a name="Screens"/>
### Screenshots:
##### Man in the Middle:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/mitm.png" /></div>
#### USB device fuzzing:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/devfuzzer.png" /></div>
#### Host side fuzzing with code covereage:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/codecov.png" /></div>
#### Fuzzer based on a selection of bytes:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/selectivefuzz.png" /></div>
#### Smart fuzzer based on learning traffic:
```python
In [44]: x.devSmartFuzz(engine="smart",samples=5,filename="/home/raindrop/PycharmProjects/AutoGadgetFs/binariesdb/Nud-Nuvoton-1046-20764-1590421333.5169587-Nuvoton-1046-20764-1590421600.8067274-device.bin")
[+]Estadísticas Generales
Juego de caracteres completo : !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Juego de caracteres descartado : !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ghijklmnopqrstuvwxyz{|}~
Juego de caracteres final : 0123456789abcdef
Longitud de palabra : 128
Uso de índice de minúsculas : 92%
Ubicaciones del índice de minúsculas : [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 121, 122, 124, 125, 127]
Uso de índice de mayúsculas : 0%
Ubicaciones del índice de mayúsculas : []
Uso de índice de dígitos : 96%
Ubicaciones del índice de dígitos : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 123, 126]
Uso de índice no alfanumérico : 0%
Ubicaciones del índice no alfanumérico : []
Estadísticas del contador : Mayúsculas: 0 , Minúsculas: 133071, Dígitos:212017 , No alfanumérico:0
Todas las frecuencias de caracteres :
caracter:5 encontrado:5012 veces
caracter:2 encontrado:22563 veces
caracter:3 encontrado:12197 veces
caracter:8 encontrado:15008 veces
caracter:4 encontrado:13275 veces
caracter:0 encontrado:98056 veces
caracter:1 encontrado:17861 veces
caracter:f encontrado:87823 veces
caracter:d encontrado:7221 veces
caracter:7 encontrado:9614 veces
caracter:a encontrado:11148 veces
caracter:6 encontrado:10472 veces
caracter:b encontrado:8189 veces
caracter:9 encontrado:7959 veces
caracter:c encontrado:9172 veces
caracter:e encontrado:9518 veces
***********************
generados:5 Paquetes
***********************
Out[44]:
['5608305852bf2ffd61770e2c827542f20be0b0fcba09db916bd07e1734b04cb0352b1d278068064d19f033bfad6fa90e53d865693fd4fee0214f00000eb0aa2c',
'3b083595f276e2f1353a535c32f0f59516fc9328f7673bb80262c4da11c93683afe6dcff8a7a83018d78f41498a0da4d141ebd39c361b1724f2b00000eb0aa2c',
'0120961963495c4dab9470738b497eddde07b0d70b357795ad9554d7964761969a6d997205e17eada6fa84eb33dcfb11412f75e04c195001283900000eb0aa2c',
'091065d52127bbc6e840e02f8e1316f1c4d9c92a23931c00cdbb8c158368852ef8fabd461b98812b51ec84e1ccc5c04aaa366fbafabec623bd3500000eb0aa2c',
'7300cc61151b7af27a578e766f49bebb2de68c48b37a00df1030ae464f456928eedd035303e697208bf58217af728a2a346fda5c8aef0335b82e00000eb0aa2c'
In [46]: https://raw.githubusercontent.com/ehabhussein/autogadgetfs/master/x.edap.packets
Out[46]:
['5608305852bf2ffd61770e2c827542f20be0b0fcba09db916bd07e1734b04cb0352b1d278068064d19f033bfad6fa90e53d865693fd4fee0214f00000eb0aa2c',
'3b083595f276e2f1353a535c32f0f59516fc9328f7673bb80262c4da11c93683afe6dcff8a7a83018d78f41498a0da4d141ebd39c361b1724f2b00000eb0aa2c',
'0120961963495c4dab9470738b497eddde07b0d70b357795ad9554d7964761969a6d997205e17eada6fa84eb33dcfb11412f75e04c195001283900000eb0aa2c',
'091065d52127bbc6e840e02f8e1316f1c4d9c92a23931c00cdbb8c158368852ef8fabd461b98812b51ec84e1ccc5c04aaa366fbafabec623bd3500000eb0aa2c',
'7300cc61151b7af27a578e766f49bebb2de68c48b37a00df1030ae464f456928eedd035303e697208bf58217af728a2a346fda5c8aef0335b82e00000eb0aa2c']```
#### Help method:
```python3
In [15]: x.help("")
Métodos actualmente soportados:
__________________________________________________________________________________________________________________________________________________________________
Método ||-->Descripción
----------------------------------------------------------------------------------------------------------------------------
MITMproxy ||-->Este método crea una conexión a RabbitMQ y escucha los mensajes recibidos en la cola todev
____________________________________________________________________________________________________________________________
MITMproxyRQueues ||-->Este método lee de la cola todev y envía la solicitud al propio dispositivo.
____________________________________________________________________________________________________________________________
SmartFuzz ||-->Este método genera paquetes basándose en lo que ha aprendido de una captura ya sea del host o del dispositivo
____________________________________________________________________________________________________________________________
chgIntrfs ||-->Este método te permite cambiar y seleccionar otra interfaz
____________________________________________________________________________________________________________________________
clearqueues ||-->Este método limpia todas las colas de RabbitMQ que están configuradas
____________________________________________________________________________________________________________________________
clonedev ||-->Este método no necesita parámetros, solo guarda una copia de seguridad del dispositivo en caso de que necesites compartirlo o usarlo más tarde.
____________________________________________________________________________________________________________________________
createctrltrsnfDB ||-->Crea una base de datos SQLite que contiene valores enumerados a partir de la enumeración de transferencias de control
____________________________________________________________________________________________________________________________
createdb ||-->Crea la tabla y columnas de sqlite a partir de capturas de usblyzer
____________________________________________________________________________________________________________________________
decodePacketAscii ||-->Este método decodifica los bytes del paquete de vuelta a ASCII
____________________________________________________________________________________________________________________________
describeFuzz ||-->Este método te permite describir un paquete y seleccionar qué bytes serán fuzzeados
____________________________________________________________________________________________________________________________
devEnumCtrltrnsf ||-->Este método enumera todas las combinaciones posibles de una solicitud de transferencia de control
____________________________________________________________________________________________________________________________
devReset ||-->Este método restablece el dispositivo
____________________________________________________________________________________________________________________________
devWrite ||-->Para usar esto con un método que escribe en un dispositivo, asegúrate de ejecutar startSniffReadThread(self,endpoint=None, pts=None, queue=None,channel=None)
____________________________________________________________________________________________________________________________
devctrltrnsf ||-->Este método te permite enviar solicitudes de transferencia de control al dispositivo de destino
____________________________________________________________________________________________________________________________
deviceInfo ||-->Obtiene la información completa solo para cualquier USB conectado al host
____________________________________________________________________________________________________________________________
deviceInterfaces ||-->Obtiene todas las interfaces y endpoints del dispositivo
____________________________________________________________________________________________________________________________
devrandfuzz ||-->Este método te permite crear paquetes de tamaño fijo o aleatorio creados con urandom
____________________________________________________________________________________________________________________________
devseqfuzz ||-->Este método te permite crear paquetes secuenciales incrementados y enviarlos al dispositivo
____________________________________________________________________________________________________________________________
findSelect ||-->Este método enumera todos los dispositivos USB conectados y te permite seleccionarlo como dispositivo de destino, así como sus endpoints
____________________________________________________________________________________________________________________________
help ||-->Método de ayuda de AutogadgetFS
____________________________________________________________________________________________________________________________
hostwrite ||-->Este método escribe paquetes al host, ya sea apuntando a un software o a un controlador que controla el dispositivo
____________________________________________________________________________________________________________________________
hstrandfuzz ||-->Este método te permite crear paquetes de tamaño fijo o aleatorio con urandom y enviarlos a la cola del host
____________________________________________________________________________________________________________________________
monInterfaceChng ||-->Método encargado de monitorear interfaces en busca de cambios, se llama desde def startMonInterfaceChng(self)
____________________________________________________________________________________________________________________________
newProject ||-->Crea un nuevo nombre de proyecto si estabas probando otra cosa
____________________________________________________________________________________________________________________________
releasedev ||-->Libera el dispositivo y vuelve a adjuntar el controlador del kernel
____________________________________________________________________________________________________________________________
removeGadget ||-->Este método elimina el gadget de la raspberryPI
____________________________________________________________________________________________________________________________
replaymsgs ||-->Este método busca en la base de datos analizada de USBLyzer y te da la opción de reproducir un mensaje o todos los mensajes del host al dispositivo
____________________________________________________________________________________________________________________________
searchmsgs ||-->Este método te permite buscar y seleccionar todos los mensajes que coincidan con un patrón guardados de una creación de base de datos de USBlyzer
____________________________________________________________________________________________________________________________
setupGadgetFS ||-->Configura variables para gadgetFS: solo Linux, en Raspberry Pi Zero la mejor opción
____________________________________________________________________________________________________________________________
showMessage ||-->Muestra mensajes si es error, advertencia o información
____________________________________________________________________________________________________________________________
sniffdevice ||-->Lee la comunicación entre el dispositivo y los hosts
____________________________________________________________________________________________________________________________
startMITMusbWifi ||-->Inicia un hilo para monitorear el dispositivo USB objetivo
____________________________________________________________________________________________________________________________
startMonInterfaceChng||-->Este método te permite monitorear un dispositivo cada 10 segundos en caso de que cambie repentinamente su configuración de interfaz.
____________________________________________________________________________________________________________________________
startQueuewrite ||-->Inicia una conexión a la cola para comunicarse con el host
____________________________________________________________________________________________________________________________
startSniffReadThread ||-->Este es un hilo que lee continuamente las respuestas del dispositivo y depende de lo que le pases al método: pts o cola
____________________________________________________________________________________________________________________________
stopMITMusbWifi ||-->Detiene el hilo de intermediario entre el host y el dispositivo
____________________________________________________________________________________________________________________________
stopMonInterfaceChang||-->Detiene el hilo de monitoreo de interfaces
____________________________________________________________________________________________________________________________
stopQueuewrite ||-->Detiene el hilo encargado de comunicarse con la máquina host
____________________________________________________________________________________________________________________________
stopSniffing ||-->Mata el hilo de captura iniciado por startSniffReadThread()
____________________________________________________________________________________________________________________________
usblyzerparse ||-->Este método analizará tu XML exportado de usblyzer y luego lo importará a una base de datos
____________________________________________________________________________________________________________________________
In [16]: x.help("findSelect")
****
[+]Ayuda para el método findSelect:
[-]Signature: findSelect(self, chgint=None)
[+]Ayuda de findSelect:
Este método enumera todos los dispositivos USB conectados y te permite seleccionarlo como dispositivo de destino, así como sus endpoints
****```
---
#### AutoGadgetFS console. A much simpler way to use AGFS:
<div style="text-align:left"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/agfsconsole.png"/></div>
---
<a name="Youtube"/>
### Youtube Playlist:
[Youtube Playlist](https://www.youtube.com/playlist?list=PLKozlVgM6RQjNHmpWR2RBiFCtufV03o6Z)
---
<a name="Slack"/>
### Join Slack:
Visit [AutogadgetFS Slack Channel](https://join.slack.com/t/autogadgetfs/shared_invite/zt-emgcv3ol-unG_axHmSQlk~5GcBddhlQ)
---
<a name="Support"/>
### Supported by:
<img src="https://assets.kitploit.com/production/public/readmes/3835/31aa30e1b311728af097fe24cefc4db7272ad971ffe64bac8d4d4e36a542fc9e.jpg" width="166" height="166"> <img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/JetBrains.png" width="166" height="166"> <img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/pyusb.png" width="166" height="166">
---
<a name="Donate"/>
### Buy me a coffee to support the development of this project
## Ethereum Donations : 0xA919e40ddB0563918dDc174320D91992e0048477
---
<a name="Contact"/>
### Contact me:
### 📧: <[email protected]>
### 🐦 : <https://twitter.com/0xRaindrop>
---
<a name="Cont"/>
### Contribute:
We're looking for developers to make this tool great! send me an 📧: <[email protected]> if you feel you'd like to be a part of this.