В помощь пентестеру: простые и полезные трюки для анализа бинарных файлов. Часть первая

В помощь пентестеру: простые и полезные трюки для анализа бинарных файлов. Часть первая

Это первая статья трилогии, где Йори Квичко рассказывает о простых и серых, но в то же время очень полезных методах, которые могут пригодиться пентестеру при анализе отдельных файлов (будь то бинарные файлы, Flash-файлы и т. д.), попадающихся во время пентестов.

Автор: Йори Квичко (Yori Kvitchko) (Counter Hack)

Примечание редактора: это первая статья трилогии, где Йори Квичко рассказывает о простых и серых, но в то же время очень полезных методах, которые могут пригодиться пентестеру при анализе отдельных файлов (будь то бинарные файлы, Flash-файлы и т. д.), попадающихся во время пентестов. Во многих файлах, которые вам встретятся, содержится огромный объем ценнейшей информации, обладание которой существенно повысит качество пентестов. Просто удивительно насколько полезны и в то же время просты используемые техники. В первой статье Йори уделяет внимание методам поиска коммуникационных потоков.
У разработчиков программного обеспечения существуют определенные привычки, которые нам, пентестерам, следует постоянно держать в голове. Суть заключается в следующем: если определенный функционал, который я хочу использовать, упакован в отдельном исполняемом файле, то это безопасно, надежно и вообще прикольно. Так как я сам разработчик, то часто ловлю себя на том, что в своих разработках следую подобной концепции. Да, исследовать бинарные файлы непросто, но не невозможно, и мы, пентестеры, не должны пугаться «перелезать через стены» и получать все самое вкусное внутри исполняемого файла или автономного приложения.

Хотя для некоторых пентестеров реверс-инжиниринг – темное искусство, выходящее за рамки их компетенции и доступное только признанным мастерам своего дела. Да, я согласен, не так просто перейти от анализа веб-приложений к использованию IDA Pro. Однако, даже не будучи мастером в области реверс-инжиниринга, вы сможете использовать некоторые практические методы для получения важной информации и, возможно, даже сможете находить уязвимости в отдельных бинарных файлах или автономных приложениях.

В этой серии статей рассказывается о некоторых методах из области реверс-инжиниринга, которые были для меня особенно полезными в последние несколько лет. Более того, это такие техники, которые любой может изучить в сжатые сроки и тут же начать применять в своей деятельности.

Один из самых интересных видов приложений, с которым вы столкнетесь во время пентеста – утилиты для внутреннего использования. Обычно разработчики подобных инструментов придерживаются концепции «главное, чтобы работало» и не сильно заботятся о безопасности, поскольку не предполагают, что кто-то со стороны может получить доступ к таким утилитам. Однако мы, пентестеры, конечно же, знаем, что получить доступ к таким утилитам не так сложно, как кажется на первый взгляд. Вот некоторые ситуации, когда вы можете использовать техники по анализу бинарных файлов:
  • Когда вы получили доступ к скомпрометированной (часто клиентской) машине, где установлено приложение для внутреннего пользования. Обращайте особое внимание на все, что маркируется именем компании.
  • Когда во время пентестов владельцы исследуемой системы заодно попросили вас протестировать конкретное приложение.
  • После получения доступа к внутреннему веб-серверу, на котором установлено Flash/Java или любое другое клиентское приложение, встроенное в размещаемый веб-сайт.
  • Когда вы находите любой бинарный файл или приложение, которое на ваш взгляд может относиться к утилитам для внутреннего пользования. Не забудьте проверить общедоступные диски и ftp-сервера на предмет наличия на них папок с именем «tools» или нечто похожее.
Что касается самих автономных приложений, они часто используют коммуникационный канал, являющийся наиболее уязвимым для атаки. Так как же нам выяснить каким образом бинарный файл, flash-файл или любое другое приложение осуществляет коммуникацию? Многие разработчики идут по самому простому пути и используют протокол HTTP для пересылки данных между приложениями. Зная об этом, первым делом проверим файл на предмет присутствия в нем URL’ов для протоколов HTTP и HTTPS.
В Linux это можно сделать так:

$ strings app.exe | grep -E -i 'https?://'
А в Windows так (используется утилита Strings от компании Sysinternals):
C:\> strings app.exe | findstr /i /r "htt[ps]*://"

В настоящее время множество автономных приложений являются ни чем иным как фронтендами к старым веб-приложениям. Если это ваш случай (приложение – фронтенд к веб-серверу), ваша задача заметно упрощается. В дополнение к этому вы можете снять дамп памяти у работающего приложения (при помощи утилиты mdd или одной из утилит, которые перечислены в этом списке), а затем использовать утилиту strings. Вы можете найти GET- или POST-запросы с паролями или другой интересной информацией.
Даже если приложение не использует протокол HTTP, существует множество легко анализируемых форматов данных, которые могут использоваться приложением для «общения» по сети. Перед анализом сетевых протоколов нам необходимо собрать весь входящий и исходящий трафик приложения. Основное внимание будет уделено клиентским приложениям в ОС Windows.

Запустите приложение и найдите его PID. Это можно сделать при помощи Task Manager, Process Explorer или старой доброй командной строки, например, так:

C:\> tasklist /FI "IMAGENAME eq app.exe"

Как только мы получили PID (предположим, он равен 6140), мы можем узнать IP-адреса, с которыми взаимодействует приложение. Откройте командную строку и запустите netstat с параметром, отображающим PID, и перезапуском каждую секунду.
C:\> netstat -na -o 1 | findstr "6140"

Если ничего не происходит, попробуйте заставить приложение создать исходящее соединение или открыть порт на прослушивание. Как только вы получили IP-адрес, простой фильтр в Wireshark доделает за нас всю остальную работу, локализовав интересующий на IP-адрес.
ip.host == 10.10.10.1

Вы также можете поискать DNS-запросы, которые были использованы для получения IP-адреса, при помощи следующего фильтра:
dns.resp.addr == 10.10.10.1

DNS-имена часто могут помочь в определении типа бекэнда. Также не забывайте использовать сканер Nmap.
Как только обнаружен изолированный коммуникационный канал, в Wireshark вы можете использовать команду "Follow TCP Stream" для поиска данных, которые затем можно легко проанализировать. Вот некоторые протоколы, на которые следует обратить внимание: HTTP, Base64, XML, CSV или любой другой протокол, где не используется шифрование. Все остальное уже зависит от того, насколько хорошо вы сможете воспользоваться найденным коммуникационным каналом. Помните, что если используется протокол HTTP, вы можете использовать прокси-сервера (например, OWASP ZAP Proxy или Burp's proxy) или сымитировать свой коммуникационный канал при помощи Netcat. Все зависит от вашей фантазии.

В следующей статье я продолжу рассказывать о методах анализа бинарных файлов.

Домашний Wi-Fi – ваша крепость или картонный домик?

Узнайте, как построить неприступную стену