Проблема
Часто при проведении пентестов большой корпоративной инфрастуктуры нам не хватало визуального отображения карты сети. Zenmap — это, конечно, хорошо, но с момента последнего релиза прошло уже около 8 лет. Другие свободные решения зачастую не отличаются функционалом, а платные решения дорого стоят. Плюсом, множество готовых решений нацелены на мониторинг и администрирование, что является избыточным для решения наших задач.
Также по статистике проведенных пентестов около 70% ИТ и ИБ отделов клиентов не имели карту сети. То есть админы даже представления не имели как устроена топология сети и что там происходит, а ведь корпоративные информационные системы давно стали неотъемлемой частью любого бизнеса, являются основой множества бизнес‑процессов.
В один прекрасный день при проведении очередного пентеста мы начали замечать, что ориентироваться в проекте становится все сложнее и сложнее. Стараясь проверить какую‑либо гипотезу, приходилось поднимать ворох лог‑файлов работы инструментов. После этого пришла идея структурировать данные в xlsx
файле и дать доступ на совместную работу всем участникам.
Стало чуть легче, но преобразование данных к необходимой структуре xlsx
файла занимало чертовски много времени. В какой‑то момент стало возникать подозрение, что наша работа заключалась именно в преобразовании данных и занесении в файл, а не в самом проведении тестирования на проникновение.
Тут то и родилось желание написать приложение, которое будет агрегировать в себе всю полученную информацию о сетевой инфраструктуре, позволять дополнять ее, представлять ее в наглядном виде, проводить аналитику и делать выгрузку в предварительно заданный формат, например в отчет.
Решение
Короче говоря, мы написали свое приложения для автоматического построения карты сети. Основными требованиями стали:
активное сканирование с использованием
nmap
(open-source гиганта индустрии сетевого сканирования);пассивное сканирование с использованием "швейцарского ножа"
scapy
;анализ логов сторонних инструментов: xml-логи
nmap
-а, pcap-логиwhireshark
-а и много, много другого;легковесность;
кросплатформенность;
высокая скорость работы.
Стек технологий:
-
backend
python3.8
aiohttp
aiohttp_session
aio-jobs
SQLAlchemy 1.4
SQLite
Alembic
Scapy
-
frontend
Bootstrap 5
jQuery
Tabulator
Vis.js
Кому это будет полезно?
Данный инструмент будет полезен специалистам по защите информации, системным администраторам, сетевым инженерам, сотрудникам отдела ИБ и пользователям, которые задаются вопросом «как выглядит моя локальная сеть?» или «сколько устройств преодолел пакет по пути до сервера Google?».
Для чего его использовать?
Основное назначение LMS.NetMap — автоматическое построение карты сети на основании интерактивного сканирования или загружаемых логов. В результате его работы будет видны доступные хосты, открытые порты на хостах и используемое ПО.
Установка
Пользователям приложения доступно 2 способа установки приложения.
Из github репозитория
Склонируйте репозиторий из github:
git clone https://github.com/lmsecure/LMS.NetMap.git
cd LMS.NetMap
Установите необходимое ПО:
sudo apt install nmap python3.8
Разверните виртуальное окружение для python:
sudo apt install -y python3-venv
python3 -m venv venv
source venv/bin/activate
Установите зависимые python-пакеты:
pip3 install -r requirements.txt
Выдайте права на работу с сокетами без использование прав
root
:
sudo setcap cap_net_raw=eip /usr/bin/python3.8
sudo setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip `which nmap`
Запустите приложение:
python3 app.py
Docker контейнер
Установите
docker
согласно инструкции, если он не установлен.Скачайте
docker
-образ приложения
docker pull lmsecure/lms.netmap
Запустите
docker
-контейнер:
docker run -p 8008:8008 -d lmsecure/lms.netmap:latest
Или можно создать docker-compose
файл:
touch docker-compose.yml
с содержимым:
version: "2"
services:
lms.netmap:
image: lmsecure/lms.netmap:latest
ports:
- "8008:8008"
command: python3 app.py
networks:
- lms.netmap_network
networks:
lms.netmap_network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.50.0/28
И запустить его:
docker-compose up -d
Заметим, что вся информация о карте сети будет храниться внурти самого контейнера. Чтобы не потерять агрегированные данные в случае потери контейнера, необходимо связать папку на машине с папкой /lms.netmap/projects
внутри контейнера.
Проекты
В приложении реализовано разделение на проектную деятельность. Таким образом, пользователь сможет иметь несколько топологий, несвязанных между собой. Например, системный администратор хочет иметь карту сети для каждого из филиалов компании, плюс карту взаимодействия филиалов.
При создании необходимо ввести название проекта и выбрать сетевой интерфейс, по которому будет происходить взаимодействие с сетью:
После создания проекта произойдет перенаправление на страницу работы с картой сети. В проекте реализованы очереди задач для управления как нагрузкой на приложение, так и сетевой активностью. Данный параметр является неизменяемым и имеет следующие значения:
-
активное сканирование
nmap
:одновременно выполняемых задач - 1
размер очереди для хранения задач - 100
-
пассивное сканирование
scapy
:одновременно выполняемых задач - 1
размер очереди для хранения задач - 0
-
обработка лог-файлов форматов
xml
иpcap
:одновременно выполняемых задач - 10
размер очереди для хранения задач - 500 Например, при создании двух задач на активное сканирование
nmap
-ом: одна будет выполнятся, вторая - ждать в очереди пока не выполнится первая.
Сканирование
На странице /network
доступны два вида сканирования: активное и пассивное.
Активное сканирование
Активное сканирование основано на работе сетевого анализатора nmap
. Нашей командой был реализован класс-обертка, который позволяет управлять консольной командой и производить преобразование данных из формата xml
в сущности и записывать их в базу данных.
Веб-интерфейс просит пользователя ввести IP адрес или домен цели (1) и выбрать параметры сканирования (2):
УДля незнакомых с синтаксисом nmap
пользователей расшифруем параметры:
-sn
- произвести сканирование без скана портов. По-умолчанию без этой опции производится сканирование top-1000 портов.-sS
(Stealth Scan) - способ сканирования портов, при котором трехуровневое рукопожатие TCP соединения принудительно обрывается.--traceroute
- сканирование с трассировкой хостов. Очень полезно, когда необходимо узнать, через какие промежуточные сетевые устройства строится соединение до цели.-sV
- опция для исследования открытых портов и определения информации о службе.-Pn
- пропустить этап обнаружения хостов.
С более подробным описанием опций nmap
можно ознакомиться тут.
В поле ниже, исходя из выбранных опций и целей, формируется команда для сканирования. Опытные пользователи nmap
могут написать команду для сканирования руками и указать произвольный набор опций.
Обязательным параметром является -oX -,
поскольку эта опция отвечает за преобразование результата сканирования в xml
формат и вывод в консоль.
При нажатии на кнопку "Start scan" обработчик приложения прочитает команду и отправит на выполнение, а пользователю всплывет соответствующее уведомление.
После завершения задачи также всплывет уведомление и произойдет автоматическое перестроение карты сети.
Также доступна возможность "скармливать" приложению xml
-логи nmap
-а.
При нажатии на кнопку "Parse xml-log" всплывет форма загрузки xml
файлов (поддерживается множественная загрузка файлов) будут сформированы задачи и отправлены на сервер для обработки данных. После завершения задач автоматического обновления карты сети не произойдет. Это нужно сделать самостоятельно при помощи кнопки "Update network".
Данный функционал реализован для уменьшения нагрузки на сервер при обработке большого количества файлов.
Пассивное сканирование
Пассивное сканирование реализовано на основе библиотеки scapy
и может быть запущено одно на проект. При таком сканировании приложение будет перехватывать пакеты, налету извлекать информацию и заносить в базу. Перестроение карты сети нужно будет производить вручную при помощи кнопки "Update network".
На данный момент информация извлекается из пакетов следующих протоколов:
ARP
TCP
LLMNR
Для запуска пассивного сканирования необходимо перейти во вкладку "Scapy" (1) и нажать кнопку "Start" (2).
После этого всплывет уведомление о том что задача запущена, приложение начнет перехватывать пакеты и извлекать информацию. Чтобы остановить процесс пассивного сканирования необходимо нажать кнопку "Stop".
Дополнительно реализован функционал анализа сетевой информации из дампа пассивного сканирования в формате pcap
. Для этого необходимо нажать на кнопку "Parse pcap log". После всплывет форма загрузки pcap
файлов (поддерживается множественная загрузка файлов) будут сформированы задачи и отправлены на сервер для обработки данных. После завершения задач автоматического обновления карты сети не произойдет (!). Это нужно сделать самостоятельно при помощи кнопки "Update network".
Карта сети
Автоматическое построение карты сети производится на основании данных, полученных в результате выполнения задач. Стоит заметить, что карта строится не на основании последней выполненной задачи, а на основании всех полученных данных. То есть, если Вы засканировали что-то не то, удалять это придется руками. Функция отката к какому-либо состоянию не реализована (но в планах есть).
Кластеризация
При большом количестве узлов сети карта сети начинает превращаться во что-то монструозное и ориентироваться в ней становится сложно. Для этого была реализована функция объединения улов в кластер по 24 маске подсети.
После нажатии на кнопку "Cluster" карта сети вида
превратится в такую.
При двойном нажатии кластер раскроется.
Информация о выбранно узле сети
При клике по узлу сети в табличке слева отобразится информация по портам данного узла.
Это так же работает при клике по кластеру.
Выбор типа устройства
При клике правой кнопкой по узлу сети появится контекстное меню для выбора иконки.
С помощью иконок можно задать роль каждому узлу сети, что позволит наглядно показать какой узел чем является.
Импорт / Экспорт данных
Приложение поддерживает функцию экспорта карты сети в svg
для печати или размещения в документации и json
структуры фреймворка vis.js
для сохранения текущего состояния карты сети.
Импорт карты сети осуществляется посредством json
-файла со структурой данных vis.js
. При этом никакая информация не заносятся в базу данных, импорт производится только на стороне клиента. Так можно сохранять промежуточное состояние сетевой инфраструктуры.
Информация о записях в БД
На странице "Information" находится связанная с базой данных СУБД. Это необходимо для редактирования карты сети вручную. СУБД поддерживает CRUD (Create, Read, Update, Delete) операции.
Чтение записей
Чтение данных поддерживает следующие функции:
постраничное чтение с указанием размера страницы (pagination);
сортировка данных;
изменение размера колонки;
изменение видимости колонок.
Удаление
Удаление записей производится с помощью кнопки "Delete" на против соответствующей записи. Будьте осторожны, так как удаление носит каскадный характер, т.е. при удалении IP адреса будут удалены все записи о портах и связях с другими узлами сети, о чем информирует модальное окно.
Более подробную информацию о взаимосвязях между таблицами можно узнать на схеме базы данных.
Создание
Для создания новой записи необходимо кликнуть по кнопке "Create new row". После этого вверху таблицы появится новая строка с возможность редактирования. Обязательно нужно заполнить поля, помеченные красным цветом.
При этом поле "IP" является подстановочным, т.е. нельзя создать порт с IP адресом, который еще не создан. Пользователь должен выбрать из уже имеющихся или сначала создать IP-шник, а потом создать связанный с ним порт. Кникнув по кнопке "Save" созданная строка улетит на сервер и добавиться в таблицу.
Редактирование
С редактированием дела обстоят также: при клике на кнопку "Edit" строка станет редактируемой, а в поле "IP" будут доступны уже созданные IP адреса.
После редактирования значения в таблице обновятся, а измененная информация улетит на сервер.
Заключение
В результате у нас получился хороший рабочий инструмент для исследования информационной сети, который способен работать как в online, так и в offline режимах и автоматический строить карту сети.
Исходный код приложения доступен в нашем гитхаб-репозитории. Будем рады услышить Ваше мнение и комментарии относительно приложения, его недостатках и желаемых фичах. Пишите в комментарии под статьей или в Github Issues.
Также подписывайтесь на наш telegram-канал, чтобы быть в курсе последних новостей о релизах LMS.NetMap и событиях из мира безопасности!
Комментарии (16)
inkvizitor68sl
00.00.0000 00:00Кстати, в docker --network host не работает - ругается, что не может определить IP у eth0
13werwolf13
00.00.0000 00:00+1стадии прочтения статьи:
1) уу, новаястильномодномолодёжная альтернатива nmap, а это интересно
2) js, docker.. нафиг, обойдёмся..
net_racoon
00.00.0000 00:00+1Это все прекрасно конечно. Но это не работает. Т.к. большинство сетей - это зоопарк вендоров и технологий. Плюс схема ИПшник+какие-то линии обычно ничего не дает. Нужна L2 и L3 схема и если ее генерировать автоматически, то получается запутанный клубок.
lmsecurity Автор
00.00.0000 00:00Благодарим за важное замечание!
Действительно, корректное построение карты на L2 и L3 уровнях ограничивается настройками межсетевого экрана, свитчей и маршрутизаторов. Если рабочая станция атакующего изолирована в отдельный широковещательный домен и запрещены межвлан роуты, то ничего тут не поделать и карту не построить.
Одной из выполняемых задач нашего инструмента является энумерация сети как в активном, так и пассивном режиме. С новыми релизами будет добавляться поддержка других бродкаст и мультикаст протоколов, парсинг служебных диагностических пакетов и так далее.
Будем работать в этом направлении.
DikSoft
00.00.0000 00:00Invalid date time в таблице заданий. Есть вариант исправить? Локализация ОС - En/US
Example
lmsecurity Автор
00.00.0000 00:00Здравствуйте. Большое спасибо за внимательность и обраную связь. Проблема на веб-морде при преобразовнии timestamp в другой формат. По всей видимости занчения в базе равны NULL. В ближайшем коммите пофиксим.
DikSoft
00.00.0000 00:00Как пример по работе с базой и графами может и ничего. Но в целом бесполезный в текущем виде инструмент.
nuanse
00.00.0000 00:00Zenmap — это, конечно, хорошо, но с момента последнего релиза прошло уже около 8 лет.
а что там принципиально поменялось? Когда нужно проверить какую-нибудь очередную zero-day уязвимость, берёшь nse-скрипт подсовываешь и всех дел
pred8or
00.00.0000 00:00Инструмент интересный, но... Если сеть только с коммутаторами (другого пока не пробовал), то в результате получается одуванчик, у которого в центре хост, с которого осуществляется сканирование.
Кстати, о хосте. Развернул это дело на ноуте. После команды
python3 app.py
сидел и смотрел, ожидая чего-то. Через некоторое время догадался, что надо самому открыть в браузереlocalhost:8008
. Упоминание этого в статье сэкономило бы пару минут.Состояние процесса сканирования сети, запущенного в разделе Network, можно увидеть в разделе Information / Tasks. Далеко и нелогично.
Повторное сканирование той же сети, запущенное с разными параметрами nmap, в моём случае - traceroute и без, привело к тому что у одуванчика оказалось 2 центра, и к каждому хосту вело уже по 2 линка.
Информация об обнаруженных хостах очень как-то размазана.
Ткнув в кружочек (или иконку) на карте можно только поменять тип хоста. Кстати, а можно ли добавить своих типов и иконок? Для некоторых хостов в таблице Node information что-то показывается, для некоторых - нет. Подозреваю, что она строится по обнаруженным портам. А если открытых портов не обнаружено, то значит, и показывать нечего? А тот же MAC?
Информацию об объекте логично было бы редактировать в одной карточке, а не размазывать по 5 табличкам с 2-3 редактируемыми колонками в каждой. При этом, сопоставить это хоть как-то - ну сильно непросто. Если бы можно было объекту дать какой-то свой идентификатор (типа имени хоста), но нет, нету такого.
Не хочется заканчивать в формате "бутерброда с г-ном" (немного похвалить - обкритиковать - сказать ещё чего-нибудь позитивного), но по-другому не получается. Инструмент в целом привлекательный, но уж очень многого не хватает. За 10 минут, что я с ним поигрался, в голове сформировался вооот такущий список предложений
lmsecurity Автор
00.00.0000 00:00Добрый день.
Большое спасибо за Ваш развернутый отзыв о приложении, его недостатках и бага.
Да, действительно в приложении присутствуют нестыковки, веб-интерфейс не логичный и местами неудобный (фронтендер у нас так себе).
Ваши замечания зафиксированы и в скором времени будут исправлены. Если в процессе использования возникнут еще какие-то идеи по улучшению приложения, мы всега рады увидеть их в issue репозитория.
Еще раз большое спасибо за Ваш отзыв.
inkvizitor68sl
А по крону оно умеет сетки сканить? Или как из cli таск добавить?
lmsecurity Автор
В дальнейшем будет добавлена фичи: сканирование по сценарию и запланированное сканирование.
CLI интерфейс не реализован, при необходимости сделаем. Есть REST API, можно через него осуществлять добавление тасков.
inkvizitor68sl
А, через API нормально)
В статью бы добавить пример только)