
Тестирование USB стало простым

AutoGadgetFS — это фреймворк с открытым исходным кодом, который позволяет пользователям оценивать USB-устройства и связанные с ними хосты/драйверы/программное обеспечение без глубоких знаний протокола USB. Инструмент написан на Python3 и использует RabbitMQ и Wi-Fi доступ, чтобы исследователи могли проводить удаленные оценки безопасности USB из любой точки мира. Используя ConfigFS, AutoGadgetFS позволяет пользователям быстро клонировать и эмулировать устройства, устраняя необходимость углубляться в детали каждой реализации. Фреймворк также позволяет пользователям создавать собственные фуззеры на его основе.
<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"/>
### Поддержка классов USB-устройств:
[✔️] USB HID-устройства полностью поддерживаются (человек посередине)
[⚠️] Тестирование только устройства.. Все USB-устройства (без человека посередине)
[⏳] Будущие релизы... Все USB-устройства (человек посередине)
---
<a name="Caps"/>
### Возможности:
1. Легко находить, выбирать и подключаться к USB-устройству.
1. Эмулировать любое USB HID-устройство.
1. Выполнять AGFS с перехватом трафика для HID-устройств (сохранять обмен данными на диск).
1. Отслеживание устройств (любых устройств).
1. Несколько фаззеров позволяют фаззить устройство или хост.
1. Случайные фаззеры (с пакетами фиксированной или случайной длины).
1. Умные фаззеры, обучающиеся на предыдущих USB-коммуникациях.
1. Описательный фаззер, указывающий, какие байты фаззить, оставляя остальную часть пакета без изменений.
1. Фаззер гаджетов.
1. Последовательный фаззер.
1. Перечислитель управляющих передач.
1. Воспроизведение пакетов из файла.
1. Воспроизведение пакетов из сохранённого захвата USBLyzer.
1. Визуальное представление пакетов для упрощения обратного проектирования обмена данными.
1. Оповещения о режиме DFU устройства или утечке информации с устройства.
1. USB-устройство и хост могут находиться где угодно в интернете.
1. Мониторинг внезапных изменений интерфейсов.
---
<a name="Road"/>
### Дорожная карта:
1. Перехватывать запросы управляющих передач к устройству и отвечать на них.
1. MITM и эмуляция всех типов устройств.
1. Интерфейс на основе консоли/QT.
1. Поддержка большего количества интерфейсов/конечных точек на RPI zero W.
1. Поддержка большего количества плат, таких как greatfet.
1. Переход на собственную плату.
1. Доведение Raspberry Pi до полной поддержки эмуляции USB-устройств со всеми интерфейсами.
1. Связывание отправленных и полученных пакетов по порядковым номерам.
---
<a name="Installation"/>
### Установка:
<a name="Linux"/>
### На Linux-машине:
* Примечание: WSL/WSL2 не поддерживается из-за проблем с пробросом USB.
* Установите Python3, ipython3, git, pip и сервер rabbitMQ
```bash
sudo apt install python3 ipython3 git python3-pip rabbitmq-server dfu-util
sudo service rabbitmq-server start
```
* Клонируйте репозиторий
```bash
git clone https://github.com/ehabhussein/AutoGadgetFS
cd AutoGadgetFS
```
* Установите зависимости
```bash
sudo -H pip3 install -r requirements.txt
```
* Понизьте версию prompt toolkit для лучшего опыта работы с ipython:
```bash
sudo python3 -m pip install prompt-toolkit~=2.0
```
* Включите веб-интерфейс для rabbitMQ
```bash
sudo rabbitmq-plugins enable rabbitmq_management
http://localhost:15672/ для доступа к веб-интерфейсу
```
* Войдите в веб-интерфейс с учётными данными *guest:guest*
* ПРИМЕЧАНИЕ: если вы устанавливаете rabbitMQ не на `localhost`, добавьте следующего пользователя и входите с ним:
```bash
sudo rabbitmqctl add_user autogfs usb4ever
sudo rabbitmqctl set_user_tags autogfs administrator
```
* Загрузите файл конфигурации rabbitMQ
* На вкладке overview прокрутите вниз до "import definitions"
* Загрузите файл, расположенный в: *rabbitMQbrokerconfig/rabbitmq-Config.json*
```bash
sudo service rabbitmq-server restart
```
* Проверьте установку
```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.8067
...: 274-device.bin")
[+]Общая статистика
Полный набор символов : !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Отброшенный набор символов : !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ghijklmnopqrstuvwxyz{|}~
Итоговый набор символов : 0123456789abcdef
Длина слова : 128
Использование строчных индексов: 92%
Расположение строчных индексов: [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]
Использование прописных индексов: 0%
Расположение прописных индексов: []
Использование цифровых индексов: 96%
Расположение цифровых индексов: [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]
Использование небуквенно-цифровых индексов: 0%
Расположение небуквенно-цифровых индексов: []
Статистика счётчиков : Прописные: 0 , Строчные: 133071, Цифры:212017 , Небуквенно-цифровые:0
Частоты всех символов :
символ:5 найдено:5012 раз
символ:2 найдено:22563 раз
символ:3 найдено:12197 раз
символ:8 найдено:15008 раз
символ:4 найдено:13275 раз
символ:0 найдено:98056 раз
символ:1 найдено:17861 раз
символ:f найдено:87823 раз
символ:d найдено:7221 раз
символ:7 найдено:9614 раз
символ:a найдено:11148 раз
символ:6 найдено:10472 раз
символ:b найдено:8189 раз
символ:9 найдено:7959 раз
символ:c найдено:9172 раз
символ:e найдено:9518 раз
***********************
сгенерировано:5 Пакетов
***********************
Out[44]:
['5608305852bf2ffd61770e2c827542f20be0b0fcba09db916bd07e1734b04cb0352b1d278068064d19f033bfad6fa90e53d865693fd4fee0214f00000eb0aa2c',
'3b083595f276e2f1353a535c32f0f59516fc9328f7673bb80262c4da11c93683afe6dcff8a7a83018d78f41498a0da4d141ebd39c361b1724f2b00000eb0aa2c',
'0120961963495c4dab9470738b497eddde07b0d70b357795ad9554d7964761969a6d997205e17eada6fa84eb33dcfb11412f75e04c195001283900000eb0aa2c',
'091065d52127bbc6e840e02f8e1316f1c4d9c92a23931c00cdbb8c158368852ef8fabd461b98812b51ec84e1ccc5c04aaa366fbafabec623bd3500000eb0aa2c',
'7300cc61151b7af27a578e766f49bebb2de68c48b37a00df1030ae464f456928eedd035303e697208bf58217af728a2a346fda5c8aef0335b82e00000eb0aa2c'
In [46]: https://raw.githubusercontent.com/ehabhussein/autogadgetfs/HEAD/x.edap.packets
Out[46]:
['5608305852bf2ffd61770e2c827542f20be0b0fcba09db916bd07e1734b04cb0352b1d278068064d19f033bfad6fa90e53d865693fd4fee0214f00000eb0aa2c',
'3b083595f276e2f1353a535c32f0f59516fc9328f7673bb80262c4da11c93683afe6dcff8a7a83018d78f41498a0da4d141ebd39c361b1724f2b00000eb0aa2c',
'0120961963495c4dab9470738b497eddde07b0d70b357795ad9554d7964761969a6d997205e17eada6fa84eb33dcfb11412f75e04c195001283900000eb0aa2c',
'091065d52127bbc6e840e02f8e1316f1c4d9c92a23931c00cdbb8c158368852ef8fabd461b98812b51ec84e1ccc5c04aaa366fbafabec623bd3500000eb0aa2c',
'7300cc61151b7af27a578e766f49bebb2de68c48b37a00df1030ae464f456928eedd035303e697208bf58217af728a2a346fda5c8aef0335b82e00000eb0aa2c']```
#### Help method:
```python3
In [15]: x.help("")
Currently supported methods:
__________________________________________________________________________________________________________________________________________________________________
Method ||-->Description
----------------------------------------------------------------------------------------------------------------------------
MITMproxy ||-->Этот метод создаёт соединение с RabbitMQ и прослушивает полученные сообщения в очереди todev
____________________________________________________________________________________________________________________________
MITMproxyRQueues ||-->Этот метод читает из очереди todev и отправляет запрос непосредственно самому устройству.
____________________________________________________________________________________________________________________________
SmartFuzz ||-->Этот метод генерирует пакеты на основе того, что он узнал из перехвата данных от хоста или устройства
____________________________________________________________________________________________________________________________
chgIntrfs ||-->Этот метод позволяет изменить и выбрать другой интерфейс
____________________________________________________________________________________________________________________________
clearqueues ||-->этот метод очищает все очереди RabbitMQ, которые были настроены
____________________________________________________________________________________________________________________________
clonedev ||-->Этот метод не требует параметров, он только сохраняет резервную копию устройства на случай, если потребуется поделиться ей или использовать позже.
____________________________________________________________________________________________________________________________
createctrltrsnfDB ||-->создаёт базу данных SQLite, содержащую значения, полученные при переборе управляющих передач
____________________________________________________________________________________________________________________________
createdb ||-->создаёт таблицу и столбцы SQLite на основе захватов USBlyzer
____________________________________________________________________________________________________________________________
decodePacketAscii ||-->Этот метод декодирует байты пакета обратно в ASCII
____________________________________________________________________________________________________________________________
describeFuzz ||-->Этот метод позволяет описать пакет и выбрать, какие байты будут фаззиться
____________________________________________________________________________________________________________________________
devEnumCtrltrnsf ||-->Этот метод перечисляет все возможные комбинации запроса управляющей передачи
____________________________________________________________________________________________________________________________
devReset ||-->Этот метод сбрасывает устройство
____________________________________________________________________________________________________________________________
devWrite ||-->Чтобы использовать это совместно с методом записи на устройство, убедитесь, что запустили startSniffReadThread(self,endpoint=None, pts=None, queue=None,channel=None)
____________________________________________________________________________________________________________________________
devctrltrnsf ||-->Этот метод позволяет отправлять запросы управляющей передачи на целевое устройство
____________________________________________________________________________________________________________________________
deviceInfo ||-->получает полную информацию для любого USB-устройства, подключённого к хосту
____________________________________________________________________________________________________________________________
deviceInterfaces ||-->получает все интерфейсы и конечные точки на устройстве
____________________________________________________________________________________________________________________________
devrandfuzz ||-->этот метод позволяет создавать пакеты фиксированного или случайного размера, созданные с помощью urandom
____________________________________________________________________________________________________________________________
devseqfuzz ||-->Этот метод позволяет создавать последовательно увеличивающиеся пакеты и отправлять их на устройство
____________________________________________________________________________________________________________________________
findSelect ||-->Этот метод перечисляет все подключённые USB-устройства и позволяет выбрать его в качестве целевого устройства, а также его конечные точки
____________________________________________________________________________________________________________________________
help ||-->Метод справки AutogadgetFS
____________________________________________________________________________________________________________________________
hostwrite ||-->Этот метод записывает пакеты на хост, направленные на программное обеспечение или драйвер, управляющий устройством
____________________________________________________________________________________________________________________________
hstrandfuzz ||-->этот метод позволяет создавать пакеты фиксированного или случайного размера, созданные с помощью urandom, и отправлять их в очередь хоста
____________________________________________________________________________________________________________________________
monInterfaceChng ||-->Метод, отвечающий за мониторинг изменений интерфейсов; вызывается из def startMonInterfaceChng(self)
____________________________________________________________________________________________________________________________
newProject ||-->создаёт новое имя проекта, если вы тестировали что-то другое
____________________________________________________________________________________________________________________________
releasedev ||-->освобождает устройство и повторно подключает драйвер ядра
____________________________________________________________________________________________________________________________
removeGadget ||-->Этот метод удаляет гаджет из Raspberry Pi
____________________________________________________________________________________________________________________________
replaymsgs ||-->Этот метод ищет в разобранной базе данных USBLyzer и даёт возможность воспроизвести сообщение или все сообщения от хоста к устройству
____________________________________________________________________________________________________________________________
searchmsgs ||-->Этот метод позволяет искать и выбирать все сообщения по шаблону, которые были сохранены при создании базы данных USBlyzer
____________________________________________________________________________________________________________________________
setupGadgetFS ||-->настройка переменных для gadgetFS: только Linux, на Raspberry Pi Zero — лучший вариант
____________________________________________________________________________________________________________________________
showMessage ||-->показывает сообщения, если ошибка, предупреждение или информация
____________________________________________________________________________________________________________________________
sniffdevice ||-->читать обмен данными между устройством и хостами
____________________________________________________________________________________________________________________________
startMITMusbWifi ||-->Запускает поток для мониторинга целевого USB-устройства
____________________________________________________________________________________________________________________________
startMonInterfaceChng||-->Этот метод позволяет отслеживать устройство каждые 10 секунд на случай внезапного изменения его конфигурации интерфейсов.
____________________________________________________________________________________________________________________________
startQueuewrite ||-->устанавливает соединение с очередью для взаимодействия с хостом
____________________________________________________________________________________________________________________________
startSniffReadThread ||-->Это поток для непрерывного чтения ответов от устройства; зависит от того, что вы передаёте методу: pts или queue
____________________________________________________________________________________________________________________________
stopMITMusbWifi ||-->Останавливает поток «человек посередине» между хостом и устройством
____________________________________________________________________________________________________________________________
stopMonInterfaceChang||-->Останавливает поток мониторинга интерфейсов
____________________________________________________________________________________________________________________________
stopQueuewrite ||-->останавливает поток, отвечающий за связь с хост-машиной
____________________________________________________________________________________________________________________________
stopSniffing ||-->Завершает поток перехвата, запущенный startSniffReadThread()
____________________________________________________________________________________________________________________________
usblyzerparse ||-->Этот метод разбирает ваш XML-файл, экспортированный из USBlyzer, и импортирует данные в базу данных
____________________________________________________________________________________________________________________________
In [16]: x.help("findSelect")
****
[+]Справка для метода findSelect:
[-]Signature: findSelect(self, chgint=None)
[+]findSelect: Справка
Этот метод перечисляет все подключённые USB-устройства и позволяет выбрать его в качестве целевого устройства, а также его конечные точки
****```
---
#### 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.