63
Автоматизация в исследовании безопасности — это не роскошь, а необходимость. Когда у тебя под рукой сотни тысяч IoT-устройств — от камер наблюдения до «умных» чайников, глазами всё не проверить. Поэтому правильный ход — создать свой сканер, который будет находить уязвимые устройства в локальной сети или даже в глобале. Ниже разберём, как подойти к этой задаче на практике.
Зачем нужен кастомный сканер для IoT
IoT — это кладезь дыр, потому что:
• Производители экономят на безопасности (дефолтные пароли, старые прошивки).
• Пользователи редко обновляют устройства.
• Многие девайсы имеют спрятанные (а иногда и открытые) веб-интерфейсы.
Готовые инструменты вроде Shodan, Censys или nmap — это круто, но они слишком общие.
Кастомный сканер даст:
• Поддержку твоих уникальных сигнатур уязвимостей.
• Возможность массового анализа именно нужных тебе протоколов (RTSP, Telnet, HTTP, MQTT).
• Интеграцию с чекерами паролей и эксплойтерами.
Архитектура кастомного сканера
Сканнер строится по принципу «detect → check → exploit-ready data».
1. Модуль поиска хостов
• Сканим подсети через ARP/ICMP пинг или SYN-скан.
• Определяем активные устройства.
2. Модуль fingerprinting-а
• Открытые порты (80, 554, 23, 8291 и т.д.).
• Баннеры сервисов (Server: Boa, GoAhead и т.п.).
• Обновление базы сигнатур (списки популярных IoT-вендоров).
3. Модуль тестов уязвимостей
• Проверка дефолтных логинов (через Telnet/HTTP).
• Поиск публичных CVE (например, RCE в Dahua/Hikvision).
• Скан RTSP и доступ к потокам.
4. Логирование и вывод
• JSON/CSV аудит-лог.
• Возможность сразу интегрировать с эксплойт-модулем.
Базовый код сканера (Python POC)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import socket import ipaddress import requests # список дефолтных паролей для теста default_creds = [ ("admin", "admin"), ("root", "root"), ("user", "1234") ] def scan_host(ip, ports=[23, 80, 554]): open_ports = [] for port in ports: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(0.5) try: sock.connect((str(ip), port)) open_ports.append(port) except: pass finally: sock.close() return open_ports def check_http_auth(ip): url = f"http://{ip}" for user, pwd in default_creds: try: r = requests.get(url, auth=(user, pwd), timeout=1) if r.status_code == 200: return (user, pwd) except: continue return None def main(): subnet = "192.168.1.0/24" for ip in ipaddress.IPv4Network(subnet): ports = scan_host(ip) if ports: print(f"[+] {ip} - open ports: {ports}") if 80 in ports: creds = check_http_auth(ip) if creds: print(f" [!] Default creds found: {creds}") if __name__ == "__main__": main() |
Этот примитивный код умеет:
• Сканить подсеть и находить открытые порты.
• Проверять дефолтные HTTP-авторизации.
• Дальше легко расширить под Telnet, RTSP или MQTT.
Лайфхаки для прокачки сканера
• Асинхронщина: Используй asyncio
+ aiohttp
для сканирования тысяч хостов одновременно.
• Сигнатуры баннеров: Храни в JSON список характерных заголовков камер, маршрутизаторов и т.п.
• Пароли в словарях: Подключи словари дефолтов паролей от RouterSploit/Metasploit.
• REST API: Добавь сервисную часть, чтобы управлять сканами через веб-интерфейс.
• Игра с Shodan API: Можно брать устройства из глобального поиска и сразу чекать своими модулями.
Итог
Автоматизация исследования IoT — это шаг к тому, чтобы быстро находить уязвимые камеры, роутеры и «умные» девайсы. Кастомный сканер — это оружие гибридного типа: он умеет и как разведчик, и как охотник на слабые места. Дальше можно прикрутить эксплойты или интеграцию с ботнет-юзкейсами для пентеста.