В этом посте мы добавим монитор процессов (procmon) к простому FTP Fuzzer моего предыдущего поста.

Использование procmon позволяет Boofuzz ​​запускать, отслеживать и перезапускать целевые программы. Он использует pydbg для получения информации о сбойных программах.

Установка

Актуальные инструкции по установке доступны на сайте boofuzz ​​INSTALL.rst. Один важный трюк — убедиться, что у вас установлен 32-битный Python. В моей системе параллельно установлены 64-битный и 32-битный Python.

Получить цель FTP

Очевидно, вы можете протестировать любой FTP-сервер, но вот скрипт pyftpdlib, который я использую для тестирования:

https://gist.github.com/6a588190f3a81fe03e94bf4dd1d06db7

Добавьте прокмон-код

Давайте рассмотрим наш текущий скрипт:

https://gist.github.com/3c65e7c95d6eb394518b2fa63fc4b3b1

Чтобы настроить клиент procmon, нам нужно добавить параметры procmon и procmon_options в конструктор класса Target:

https://gist.github.com/6de6ad435a69df5795fd1f449d90cd56

pedrpc.Client принимает IP-адрес и номер порта, на котором прослушивается procmon. 26002 — номер порта по умолчанию для procmon. procmon_options — словарь настроек монитора процессов. Параметр start_commands представляет собой список команд, которые будут выполнены для запуска процесса(ов). Каждая команда запуска сама по себе является списком аргументов командной строки.

Бегать

Запустив procmon, вы должны увидеть такой вывод:

> python process_monitor.py
[11:05.16] Process Monitor PED-RPC server initialized:
[11:05.16] crash file: C:\Users\rapto\code\boofuzz\crash-bin [11:05.16] # records: 0
[11:05.16] proc name: None
[11:05.16] log level: 1
[11:05.16] awaiting requests...

Затем в отдельном терминале запустите скрипт фаззера FTP. Окно procmon покажет дополнительный вывод:

[11:09.15] Process Monitor PED-RPC server initialized:
[11:09.15] crash file: C:\Users\rapto\code\boofuzz\crash-bin
[11:09.15] # records: 0
[11:09.15] proc name: None
[11:09.15] log level: 1
[11:09.15] awaiting requests...
[11:09.16] updating start commands to: [['python-32bit', 'C:\\ftpd\\ftpd.py']]
[11:09.16] starting target process
[11:09.16] done. target up and running, giving it 5 seconds to settle in.
[I 2017-04-29 23:09:16] >>> starting FTP server on 127.0.0.1:21, pid=6920 <<<
[I 2017-04-29 23:09:16] concurrency model: async
[I 2017-04-29 23:09:16] masquerade (NAT) address: None
[I 2017-04-29 23:09:16] passive ports: None
[11:09.21] debugger thread-1493532561 attaching to pid: 6920
[I 2017-04-29 23:09:23] 127.0.0.1:65409-[] FTP session opened (connect)
[I 2017-04-29 23:09:23] 127.0.0.1:65409-[] FTP session closed (disconnect).
[I 2017-04-29 23:09:23] 127.0.0.1:65412-[] FTP session opened (connect)
[W 2017-04-29 23:09:23] 127.0.0.1:65412-[] Command too long.
[I 2017-04-29 23:09:23] 127.0.0.1:65412-[] FTP session closed (disconnect).

В выводе procmon вы можете увидеть:

  1. procmon получает запрограммированную нами команду запуска
  2. Целевой процесс запускается, а boofuzz/procmon ждет 5 секунд.
  3. Вывод с самого FTP-сервера
  4. Сообщение о том, что отладчик присоединился к процессу FTP-сервера.
  5. Выходные данные подключения и отключения FTP-сервера при запуске фаззера.

64-битные приложения

Я не заставил pydbg работать с 64-битными приложениями. Если целевое приложение, которое вы запускаете, является 64-разрядным, вывод ошибки выглядит следующим образом:

[11:19.20] debugger thread-1493533160 attaching to pid: 8148 Exception in thread 1493533160: Traceback (most recent call last): File "C:\Python27-32\lib\threading.py", line 801, in __bootstrap_inner self.run() File "process_monitor.py", line 100, in run self.dbg.attach(self.pid) File "C:\Python27-32\lib\site-packages\pydbg\pydbg.py", line 226, in attach self.debug_active_process(pid) File "C:\Python27-32\lib\site-packages\pydbg\pydbg.py", line 839, in debug_active_process raise pdx("DebugActiveProcess(%d)" % pid, True) pdx: [50] DebugActiveProcess(8148): The request is not supported.

На сегодняшний день boofuzz ​​продолжит работу без pydbg и по-прежнему сможет запускать и останавливать процесс.

И вот как вы пишете простой фаззер с помощью procmon! Вот полный код:

https://gist.github.com/b14df2d967fd91a2d949e406f485b4c0

Удачного фаззинга!

Чтобы узнать о будущих постах, а также обо всем остальном, о чем я говорю в Интернете, подписывайтесь на меня в Твиттере.

Первоначально опубликовано на gist.github.com.