Этой весной в Москве прошло весьма необычное для отечественного itsec-сообщества мероприятие под названием
Positive Hack Days. Делать его детальный обзор я смысла не вижу, поскольку всё уже было
неоднократно высказано другими людьми, положительные отзывы которых я вполне разделаю.
На Positive Hack Days я выступил с мастер-классом
"Автоматический поиск уязвимостей в программах без исходных текстов", материалы к которому я выкладываю в данной записи.
Слайды к выступлению:
Использовавшиеся на мастер-классе утилиты (многие из них я не успел показать)
доступны для загрузки в виде архива. Ниже идёт описание наиболее интересного содержимого этого архива.
****
./AnalyzeDumps - Программа для анализа аварийных дампов памяти с использованием отладчика KD.EXE и расширения !exploitable.
Использование:
> python ./AnalyzeDumps/analyze_dumps.py <dumps_dir> [--noisy]
... где
<dumps_dir> - директория, в которой содержатся файлы аварийных дампов. При указании ключа --noisy в консоль будут выведены все сообщения отладчика.
По завершению работы программы в текущей директории будет создан файл
Analyze.log c общей информацией по всем проанализированным дампам, а в
<dumps_dir> - отдельный лог для каждого аварийного дампа с полным выводом отладчика.
Примеры сгенерированных файлов для различных тестовых приложений:
./Analyze_Norman.log,
./Analyze_RPCExample.log и
./Analyze_Visio.log
Программа analyze_dumps.py требует для своей работы следующие сторонние инструменты (так же включены в архив):
****
./Code Coverage Tools и
./pin-2.8-37300-msvc9-ia32_intel64-windows - Основанный на PIN Toolkit набор средств для построения и анализа карты покрытия кода исследуемого приложения.
Подробная информация по использованию:
Так же в директории
./Kcachegrind находится Win32-версия одноимённого приложения, которое позволяет визуализировать карты деревьев вызовов, которые были получены с помощью Code Coverage Tools.
****
./FileFuzz - Инструменты для примитивного мутационного фаззинга на примере файлов архивов форматов 7z, ACE, ARJ, CAB, GZ, LZH, RAR, TGZ, и ZIP.
Генерация некорректных файлов производится с помощью программы
./FileFuzz/MutateGen.exe (исходные тексты доступны в
./FileFuzz/MutateGen/) на основе "хороших" файлов архивов указанных выше форматов, которые находятся в директории
./FileFuzz/TEST/.
Пример запуска
MutateGen.exe для генерации файлов:
> MutateGen.exe C:\TEST.zip C:\output_dir -BLOCK_SIZE 1 -BLOCK_RANGE_START 0xa0 -BLOCK_RANGE_END 0xff -BLOCK_RANGE_N 1
Назначения параметров командной строки программы:
- -FILE_RANGE_START - Файловое смещение для прочитанных из указанного файла начальных данных, начиная с которого MutateGen.exe осуществляет их модификацию (по умолчанию FILE_RANGE_START равен нулю).
- -FILE_RANGE_END - Файловое смещение, определяющее конец зоны начальных данных, которую модифицирует MutateGen.exe (по умолчанию FILE_RANGE_END равен размеру начального файла).
- -BLOCK_SIZE - Размер блока данных, которые MutateGen.exe модифицирует за один проход (допустимые значения: 1, 2 и 4).
- -BLOCK_RANGE_START - Стартовое значение счётчика, которое используется как значение для генерируемого блока данных.
- -BLOCK_RANGE_END - Конечное значение счётчика, которое используется как значение для генерируемого блока данных.
- -BLOCK_RANGE_N - Величина инкремента счётчика за одну итерацию.
Таким образом, количество циклов генерации данных (количество модифицируемых байт) для одного начального файла рассчитывается по формуле:
N = (FILE_RANGE_END &~ (BLOCK_SIZE - 1)) - FILE_RANGE_START
Количество блоков данных:
BLOCKS = N / BLOCK_SIZE
Количество итераций для одного цикла генерации данных:
I_MAX = ((BLOCK_RANGE_END &~ (BLOCK_RANGE_N - 1)) - BLOCK_RANGE_START) / BLOCK_RANGE_N
Количество cгенерированных файлов с некорректными данными:
FILES = BLOCKS * I_MAX
Для генерации данных используются сценарии
generate_bs_1.bat,
generate_bs_2.bat,
generate_bs_4.bat и
generate_bs_4_hi.bat, которые запускают
MutateGen.exe с различными настройками.
Фаззинг архивов на примере актуальной версии антивируса
Norman Security Suite продемонстрирован на видео.
Norman Security Suite Fuzzing from
eSage Lab on
Vimeo.
Аварийные дампы для Norman Security Suite а так же файл вызывающий падение антивирусного сканера находятся в директории
./XcptMon/_Norman_dumps_7z, а лог анализа этих аварийных дампов с помощью
analyze_dumps.py - в
./Analyze_Norman.log
****
./InMemoryFuzzer и
./RPCExample - Инструменты и тестовые приложения для демонстрации in-memory фаззинга RPC сервера.
В качестве фаззера используется программа на Python под названием InMemoryFuzzer by sinn3r, которая подробно описана в статье
"In Memory Fuzzing".
Для удобства использования в архив включена её версия в виде исполняемого файла, созданного с помощью
py2exe (см. директорию
./InMemoryFuzzer/dist).
В качестве уязвимого сервера используется написанная на C++ программа, исходные тексты и исполняемые файлы которой находятся в
./RPCExample/ (там же есть и клиент для этого сервера). Проведение фаззинга осуществляется в несколько шагов:
- Запускается сервер с помощью сценария ./RPCExample/run_server.bat
- Запускается фаззер с помощью сценария ./RPCExample/fuzz_server.bat
- Запускается клиент для RPC сервера (./RPCExample/DebugExe/ContextExampleClient.exe)
- В момент обработки запроса от клиента в контексте серверного процесса фаззер модифицирует переданную функции _HelloProc() ASCII-строку, в результате чего будет спровоцировано переполнение буфера в этой функции.
- После аварийного завершения работы серверного процесса фаззер создаст отчёт о его падении в директории ./RPCExample/crashbin
****
./MSOffice - Инструменты для более продвинутого мутационного фаззинга на примере приложения Visio из состава Microsoft Office.
Генерация данных для фаззинга осуществляется приложением
./MSOffice/fuzzgen/, которое использует принцип мутационных преобразований имеющихся .VSD-документов с частичным парсингом формата файла-контейнера Microsoft Office. Для парсинга структуры документов используются функция
StgOpenStorageEx() и интерфейс
IStorage.
В
./MSOffice/_faults/ находятся примеры сгенерированных фаззером .VSD-документов, обработка которых вызывает падение Visio. Лог анализа этих аварийных дампов с помощью
analyze_dumps.py находится в
./Analyze_Visio.log
Для запуска процесса фаззинга используется приложение
./MSOffice/fuzzrun/, работа с ним продемонстрирована на видео.
Microsoft Office Visio Fuzzing from
eSage Lab on
Vimeo.
****
./XcptMon - Приложение для мониторинга исключений и создания аварийных дампов. Именно оно используется для генерации дампов в описанных выше тестах.
XcptMon работает по принципу внедрения DLL библиотеки (
./XcptMon/XcptMonDll.dll) в контекст анализируемого процесса при его запуске. DLL, в свою очередь, перехватывает функцию
KiUserExceptionDispatcher(). Для внедрения DLL используется параметр реестра
"Debugger" в ключе HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
<image_name>, где
<image_name> - имя исполняемого файла анализируемого процесса.
Использование XcptMon:
> XcptMon.exe <image_name> [options]
... где в качестве опций возможно указать следующие ключи:
- --dumpsdir <path> - Путь к директории для сохранения аварийных дампов.
- --logpath <path> - Путь к файлу, в который будет записана информация об исключениях.
- --remove - Отключить XcptMon для указанного имени процесса.
- --noexit - Не завершать целевой процесс при возникновении первого #AV исключения.
Пример лога с информацией об исключениях:
[+] Target command line: "TestApp.exe"
[+] DLL injected into the target process 7404
[+] Exit on first #AV: "No"
ModuleInit(): From process 'E:\_tmp\PHD\XcptMon\TestApp.exe' (PID: 7404)
[!] EXCEPTION OCCURS:
STATUS_ACCESS_VIOLATION at 0x0119101c
Access type: Write
Address: 0x00000000
EAX=0x00000000 EBX=0x00000000 ECX=0x6f6e215c EDX=0x773270b4
ESI=0x6f6e20c1 EDI=0x01193380 EBP=0x0012fe54
[+] 22398742 bytes of minidump has been written to the "0xC0000005_0x0119101C_17.05_19.28.54.DMP"
[!] EXCEPTION OCCURS:
STATUS_ACCESS_VIOLATION at 0x011910af
Access type: Write
Address: 0x00000000
EAX=0x00000000 EBX=0x00000000 ECX=0x6f6e215c EDX=0x773270b4
ESI=0x6f6e20c1 EDI=0x00000000 EBP=0x0012fe54
[+] 22402854 bytes of minidump has been written to the "0xC0000005_0x011910AF_17.05_19.28.54.DMP"
[+] Process exit code: 0xc0000005
Так же библиотека
XcptMonDll.dll экспортирует глобальные переменные
m_szLastFilePath,
m_szLastExceptionCode,
m_szLastExceptionAddr,
m_szMainModuleVersion и
m_szFaultModuleVersion, в которые на момент создания аварийного дампа записывается информация о возникшем исключении и целевом приложении. Эту информацию, для включения в свой лог-файл, получает упоминавшийся выше
analyze_dumps.py
****
./ioctl_fuzzer-1.2 - Исходные тексты и исполняемые файлы программы IOCTL Fuzzer, которая предназначена для автоматического выявления узявимостей в драйверах режима ядра, связанных с некорректной обработкой IOCTL-запросов.
В директории
./ioctl_fuzzer-1.2/_exploits/ находятся примеры эксплойтов к найденным спомощью IOCTL Fuzzer уязвимостям.
scsiprot_smart - "Теоретически эксплуатируемая" Local Admin to Ring0 уязвимость в стандартном драйвере Windows atapi.sys при обработке IOCTL запроса
IOCTL_SCSI_MINIPORT. Приведенный демонстрационный эксплойт, к сожалению, DoS only.
TM_TmComm_9000402b_exploit - Полнофункциональный Local Admin to Ring0 эксплойт к уязвимости в драйвере актуальной версии (3.0.0.1303 на момент написания текста) антивирусного продукта под названием
Trend Micro Titanium Maximum Security.