
Распределённый, управляемый покрытием кода, основанный на снимках фаззер для целей в пользовательском режиме и режиме ядра на Windows и Linux, с эмуляторными и гипервизорными бэкендами.
what the fuzzРаспределённый, управляемый покрытием кода, кроссплатформенный фаззер на основе снимков, предназначенный для атаки на цели в пользовательском и/или режиме ядра, работающие под управлением Microsoft Windows и Linux (экспериментально!).
what the fuzz или wtf — это распределённый, управляемый покрытием кода, настраиваемый, кроссплатформенный фаззер на основе снимков, предназначенный для атаки на цели в пользовательском и/или режиме ядра, работающие под управлением Microsoft Windows или Linux (экспериментально, см. linux_mode). Выполнение цели может осуществляться внутри эмулятора с помощью bochscpu (самый медленный, наиболее точный), внутри виртуальной машины Windows с использованием Windows Hypervisor Platform APIs или внутри виртуальной машины Linux с использованием KVM APIs (самый быстрый).
Он выявил уязвимости повреждения памяти в широком спектре программного обеспечения: IDA Pro, популярная AAA-игра, ядро Windows, клиент Microsoft RDP, драйвер дисплея NVIDIA GPU и др.
Скомпилированные бинарные файлы доступны либо из артефактов CI, либо из раздела Releases как для Windows, так и для Linux.
Если вы хотите узнать больше об истории проекта или о том, как использовать его на реальной цели, рекомендую ознакомиться с этими статьями, чтобы начать 🔥
Лучший способ опробовать возможности — поработать с модулями fuzzer_hevd / fuzzer_tlv_server. Вы можете скачать архивы target-hevd.7z / target-tlv_server.7z и извлечь их в каталог targets/. Архивы содержат структуру каталогов, ожидаемую для каждой цели:
inputs — папка, куда помещаются ваши входные тестовые примеры,outputs — папка, куда сохраняются текущие файлы minset,coverage — папка, в которой ожидаются файлы .cov,crashes — папка, куда сохраняются аварийные завершения,state — папка, где хранятся дамп памяти (mem.dmp), состояние ЦП (regs.json) и хранилище символов (symbol-store.json). Хранилище символов — это простой файл JSON, используемый в системах Linux для указания мест установки точек останова, поскольку на этих платформах нет поддержки символов / dbgeng. wtf генерирует этот файл во время выполнения каждый раз, когда вы запускаете цель на Windows.Далее предполагается, что вы скачали файл target-hevd.7z, прикреплённый к последнему релизу, и извлекли его в каталог targets вашего клона wtf. У вас должен появиться путь wtf/targets/hevd, в котором находятся каталоги inputs, outputs и т.д.
Сервер, по сути, является мозгом и отслеживает всё состояние: агрегированное покрытие кода, корпус, генерирует и распространяет тестовые примеры среди клиентов.
Вот как вы можете запустить локальный серверный узел:```text wtf.exe master --name hevd --max_len=1028 --runs=10000000
Опция `max_len` используется для ограничения размера генерируемого тестового примера, `runs` — количество генерируемых тестовых примеров, `address` указывает, где **wtf** должен прослушивать, `target` — это директория с деревом каталогов, которое мы описали выше (пользователь также может переопределить эти директории с помощью `--input` / `--output` / `--crashes`), а `name` задает имя вашего модуля фаззинга, чтобы мастер мог вызвать вашу функцию-генератор, если вы ее определили.
<p align='center'>
<img src="https://assets.kitploit.com/production/public/readmes/4699/4a03fc75eed3ed5a92f7f10def697dbf220ae36b0701f05b37759eb432fc0fd9.webp">
</p>
### Узлы фаззинга
Клиентские узлы запускают тестовый пример, сгенерированный и распределенный сервером, и передают результат обратно серверу (покрытие кода, результат и т.д.).
Вот как вы запустите клиентский узел, использующий бэкенд *bochscpu*:```text
wtf.exe fuzz --name hevd --limit 10000000
Подкоманда fuzz используется с опцией name, чтобы указать, какой модуль фаззера нужно использовать; backend задаёт бэкенд выполнения, а limit — максимальное количество инструкций для выполнения на один тестовый пример (в зависимости от бэкенда значение этой опции различается).
Если вы хотите запустить тестовый пример (или папку, заполненную тестовыми примерами), вы можете использовать подкоманду run.
Вот как вы могли бы бы запустить тестовый пример crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0:
$HOME/FUZZAN/fuzzer.py $HOME/FUZZAN/seeds/example $HOME/FUZZAN/workdir/ -b frida -t 60000 -m 10000 -p 1000 -c -v $HOME/FUZZAN/workdir/crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0```
wtf.exe run --name hevd --limit 10000000 --input crashes\crash-0xfffff764b91c0000-0x0-0xffffbf84fb10e780-0x2-0x0
<p align='center'>
<img src="https://assets.kitploit.com/production/public/readmes/4699/49b3ca8582d6314724e5615c687472499d5f8f41d04c9543c0a6a070c51f56f8.webp">
</p>
### Minseting корпуса
Для minset корпуса необходимо использовать серверный узел и столько клиентских узлов, сколько нужно, как при фаззинге. Вы можете просто установить `runs` optins в 0.
Вот как вы можете minset корпус из `outputs` в директорию `minset` (также показано, как переопределять директории `inputs` и `outputs`):```
wtf.exe master --name hevd --max_len=1028 --runs=0 --inputs=outputs --outputs=minset