Прокси-ботнет из роутеров

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

В качестве прокси-сервера я остановился на Satanic Socks Server: RDot edition, но с самодельной модификацией, которая добавляет периодические веб-запросы к админке, чтобы отслеживать актуальный IP роутера. В этой реализации нет поддержки доступа по паролю (актуально, если вам необходим некий пул прокси, чисто для себя), но в более старых версиях она есть, и любой при желании сможет её добавить. Итак, немного дефайнов:

Метод, совершающий веб-запросы:

Также необходимо добавить запуск потока в функцию main, который будет выполнять вышеописанную функцию (раз уж в SSS используются потоки).

Все, измененный код сокс-сервера готов.
Теперь очередь админки. Писать будем на PHP, админка будет очень простой и будет обладать следующими возможностями: запись содержимого REMOTE_ADDR в файл, вывод списка доступных прокси по паролю. Исходный код админки:

Чтобы файл с прокси не был доступен из веба, следует в директории с пхп-скриптом создать файл .htaccess со следующим содержанием:

На данном этапе перед нами стоит задача сборки прокси-сервера под 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. Исходный код:

Абсолютные пути в массиве @cmds обусловлены особенностью устройства модуля Net::SSH::Perl. При исполнении очередной команды он как бы не дожидается возврата управления консоли и исполняет очередную команду в отдельном "инстансе".
Комплект готов, теперь любой из Вас сможет с пользой утилизировать добытые доступы к роутерам и, может быть, организовать свой сервис по продаже прокси.

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

Прокси-ботнет из роутеров: 56 комментариев

  1. Вот это респект, шикарный материал. Помню, когда Лулзы выкладывали в своем архиве "50 Days of Lulz" список ssh-доступов к нескольким тысячам роутеров, я опрашивал народ, у кого есть готовое решение для их утилизации. Тогда никто не признался )

  2. Спасибо за статью.
    "Комплект готов, теперь любой из Вас сможет с пользой утилизировать добытые доступы к роутерам и, может быть, организовать свой сервис по продаже прокси."
    С этим можно поспорить. Клиент такого прокси сервиса может и сам попробовать получить доступы к роутерам.

  3. Меня немного печалит, что ты там сильно поддерживаешь скрипт кидди. Выкладывай скрипты, в которых из автоматизации остаётся минимум. Это отсеит кучу школоты, а остальные и сами допилят до своих нужд.

    1. Так будет менее интересно. Статья бы состояла из таких слов:
      Можно поюзать роутеры как прокси сервер, захватив SSH доступ и заюзав Satanic Socks Server. А так всё разжёвано, и всё равно мало народу воспользуется этой инфой
      (:

      1. ну я ж не говорю выпилить всё. Можно сделать скрипты по проще, например что бы принимали не список ip:port, а только 1 ip:port. Школота быстро устанет, а кому надо, тот допишет 3 строки для автоматизации.

  4. Тема довольно интересна.
    Были мысли по реализации подобного, но почему то до практики не дошло (скорее всего из за малого опыта работы с роутерами в общем).
    А сам принцып довольно интересен, и в принцыпе модернизация такого бота может делать много довольво интересных вещей, к примеру хотя бы проводить массовые заражения в нутри сети роутера.

  5. mr.The, судя по орфографическим ошибкам - ты сам-то ещё школу не окончил. как это часто бывает - латентный сам и спалился. :)

  6. Что мешает сразу использовать роутер как прокси, создав динамический туннель через ssh?
    ssh -D 1080 router_IP

    потом в настройках браузера указываете использование Socks прокси с адресом router_IP и портом прокси 1080 и все дела

    1. Что мешает? Ну, вот возможности типового ssh с роутера:

      Dropbear client v0.50
      Usage: ssh [options] [user@]host [command]
      Options are:
      -p remoteport
      -l username
      -t Allocate a pty
      -T Don't allocate a pty
      -N Don't run a remote command
      -f Run in background after auth
      -y Always accept remote host key if unknown
      -i identityfile (multiple allowed)
      -L listenport:remotehost:remoteport Local port forwarding
      -g Allow remote hosts to connect to forwarded ports
      -R listenport:remotehost:remoteport Remote port forwarding
      -W receive_window_buffer (default 24576, larger may be faster, max 1MB)
      -K keepalive (0 is never, default 0)

      Что предлагаешь писать?

      1. Можно использовать только это:

        -R listenport:remotehost:remoteport Remote port forwarding
        -L listenport:remotehost:remoteport Local port forwarding

        да, не универсально. Но если число сайтов, через которые проксироваться, конечно, то не так уж и гемморно это использовать. Даже можно скрипт написать, который для сайтов динамически это будет делать.

  7. Что-то при запуске на модеме не находит либу:
    Can`t load library 'libpthread.so.0'
    как лечить?
    как скомпилить с этой либой?
    -lpthread к компилятору тока компилит с этой либой, но ее не включает

  8. С библиотеками разобрался, а переь прокси запускается но не работает как надо, profifier пишет

    [05:58] Testing Started.
    Proxy Server
    Address: xx.xx.xx.xx:11236
    Protocol: SOCKS 5
    Authentication: NO

    [05:58] Starting: Test 1: Connection to the Proxy Server
    [05:58] IP Address: xx.xx.xx.xx
    [05:58] Connection established
    [05:58] Test passed.
    [05:58] Starting: Test 2: Connection through the Proxy Server
    [05:58] Warning : the proxy server has returned an unexpected answer (0x0).
    [05:58] Error : the proxy server uses unsupported methods or authentication is required.
    [05:58] Test failed.
    [05:58] Testing Finished.

    1. Чем помогать? Рассказать, что у меня все работало, а то что никто не мешает добавить в код отладочные сообщения и смотреть что происходит?

    1. Т.е. вопроса с запуском не возникло, а где смотреть непонятно?
      Тогда вообще имеет смысл забить, т.к. статья ориентирована на подготовленных людей

  9. Та не вопрос в чем, на линуксе, при компиляции обычным gcc работает, если компилить.
    А вот уже в MIPS компиляции вот такая ерунда и как там дебагером на модеме смотреть-то?

    1. Какая связь между дебагером и отладочными сообщениями? Не, если очень хочется, то можно на модем gdb поставить, но я имел в виду поставить printf в интересующих местах и посмотреть что происходит. Также никто не мешает вместо этого всего взять сорцы squid, настроить все как надо, добавить свой код и устанавливать.

  10. Немного выпал из темы, сейчас решил вернуться
    я понял где тормозит на мопеде, но почему тормозит хз никаких ошибок не выдает, просто при создании thread не читает из сокета

    компилирую под линукс gcc пашет, под mips болт, как можно мониторить дальше ошибки?
    буфер TempBuff пустой

    и при компиляции выдает:
    myprox.c: In function `Socks5Accept':
    myprox.c:188: warning: comparison is always true due to limited range of data type
    т.е. CMD != 0xFF всегда будет положительна
    помогите как сделать рабочий прокс

    1. А кто ж его знает в чем дело, у меня такой проблемы не возникало. Можно тип у CMD поменять на unsigned и посмотреть... В общем gdb в помощь.

  11. А с камими ключами нужно компилировать? может что-то не так при компиляции делаю? unsigned char не помогло
    компилю так: ./mips-linux-uclibc-gcc-3.4.2 -static myprox.c -o prx -lpthread

  12. пробовал отдельно компилить твою функцию do_requst без прокса, все пашет нормально, модем юзаю свой Glitel GT-5802W
    почему прокс нечитает из сокета в thread хрен пойму

  13. добрый день ! В чем может быть трабла? Can't locate object method "new" via package "Net::SSH::Perl" (perhaps you forgot to load "Net::SSH::Perl"?) at /root/Desktop/skript.pl line 39, line 1.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *