

AutoGadgetFSは、USBプロトコルに関する深い知識がなくても、USBデバイスとそれに関連するホスト/ドライバ/ソフトウェアを評価できるオープンソースフレームワークです。このツールはPython3で書かれており、RabbitMQとWiFiアクセスを利用して、研究者が世界中のどこからでもリモートで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. 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
```
* ipythonの体験向上のためにprompt-toolkitをダウングレード:
```bash
sudo python3 -m pip install prompt-toolkit~=2.0
```
* rabbitMQのWebインターフェースを有効化
```bash
sudo rabbitmq-plugins enable rabbitmq_management
http://localhost:15672/ to reach the web interface
```
* 認証情報 *guest:guest* でWebインターフェースにログイン
* 注記: rabbitMQを `localhost` にインストールしていない場合は、以下のユーザーを追加してログインしてください:
```bash
sudo rabbitmqctl add_user autogfs usb4ever
sudo rabbitmqctl set_user_tags autogfs administrator
```
* rabbitMQ設定ファイルをアップロード
* 概要タブで一番下までスクロールして定義をインポート
* *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("")
現在サポートされているメソッド:
__________________________________________________________________________________________________________________________________________________________________
メソッド ||-->説明
----------------------------------------------------------------------------------------------------------------------------
MITMproxy ||-->このメソッドはRabbitMQへの接続を作成し、todevキューで受信したメッセージをリッスンします
____________________________________________________________________________________________________________________________
MITMproxyRQueues ||-->このメソッドはtodevキューから読み取り、リクエストをデバイス自体に送信します
____________________________________________________________________________________________________________________________
SmartFuzz ||-->このメソッドは、ホストまたはデバイスからのスニフから学習した内容に基づいてパケットを生成します
____________________________________________________________________________________________________________________________
chgIntrfs ||-->このメソッドを使用すると、別のインターフェースに変更して選択できます
____________________________________________________________________________________________________________________________
clearqueues ||-->このメソッドは、設定されたrabbitMQキュー上のすべてのキューをクリアします
____________________________________________________________________________________________________________________________
clonedev ||-->このメソッドはパラメータを必要とせず、後で共有または使用する必要がある場合に備えてデバイスのバックアップを保存します
____________________________________________________________________________________________________________________________
createctrltrsnfDB ||-->コントロール転送の列挙から列挙された値を含むSQLiteデータベースを作成します
____________________________________________________________________________________________________________________________
createdb ||-->usblyzerキャプチャからsqliteテーブルとカラムを作成します
____________________________________________________________________________________________________________________________
decodePacketAscii ||-->このメソッドはパケットバイトをAsciiにデコードします
____________________________________________________________________________________________________________________________
describeFuzz ||-->このメソッドを使用すると、パケットを記述し、どのバイトをファジングするかを選択できます
____________________________________________________________________________________________________________________________
devEnumCtrltrnsf ||-->このメソッドは、コントロール転送リクエストのすべての可能な組み合わせを列挙します
____________________________________________________________________________________________________________________________
devReset ||-->このメソッドはデバイスをリセットします
____________________________________________________________________________________________________________________________
devWrite ||-->メソッドでこれを使用してデバイスに書き込むには、必ずstartSniffReadThread(self,endpoint=None, pts=None, queue=None,channel=None)を実行してください
____________________________________________________________________________________________________________________________
devctrltrnsf ||-->このメソッドを使用すると、ターゲットデバイスにctrl転送リクエストを送信できます
____________________________________________________________________________________________________________________________
deviceInfo ||-->ホストに接続されているUSBの完全な情報のみを取得します
____________________________________________________________________________________________________________________________
deviceInterfaces ||-->デバイス上のすべてのインターフェースとエンドポイントを取得します
____________________________________________________________________________________________________________________________
devrandfuzz ||-->このメソッドを使用すると、urandomを使用して作成された固定サイズまたはランダムサイズのパケットを作成できます
____________________________________________________________________________________________________________________________
devseqfuzz ||-->このメソッドを使用すると、連続的に増加するパケットを作成し、デバイスに送信できます
____________________________________________________________________________________________________________________________
findSelect ||-->このメソッドは、接続されているすべてのUSBデバイスを列挙し、ターゲットデバイスとそのエンドポイントとして選択できます
____________________________________________________________________________________________________________________________
help ||-->AutogadgetFSヘルプメソッド
____________________________________________________________________________________________________________________________
hostwrite ||-->このメソッドは、デバイスを制御するソフトウェアまたはドライバを対象として、ホストにパケットを書き込みます
____________________________________________________________________________________________________________________________
hstrandfuzz ||-->このメソッドを使用すると、urandomを使用して作成された固定サイズまたはランダムサイズのパケットを作成し、ホストキューに送信できます
____________________________________________________________________________________________________________________________
monInterfaceChng ||-->インターフェースの変更を監視するメソッド。これはdef startMonInterfaceChng(self)から呼び出されます
____________________________________________________________________________________________________________________________
newProject ||-->別のものをテストしていた場合に、新しいプロジェクト名を作成します
____________________________________________________________________________________________________________________________
releasedev ||-->デバイスを解放し、カーネルドライバを再アタッチします
____________________________________________________________________________________________________________________________
removeGadget ||-->このメソッドはRaspberryPIからガジェットを削除します
____________________________________________________________________________________________________________________________
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 ||-->このメソッドは、usblyzerからエクスポートしたxmlを解析し、データベースにインポートします
____________________________________________________________________________________________________________________________
In [16]: x.help("findSelect")
****
[+]findSelectメソッドのヘルプ:
[-]シグネチャ: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.