Часто при проведении пентестов большой корпоративной инфрастуктуры нам не хватало визуального отображения карты сети. 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: Установите необходимое ПО: Разверните виртуальное окружение для python: Установите зависимые python-пакеты: Выдайте права на работу с сокетами без использование прав root: Запустите приложение: Установите docker согласно инструкции, если он не установлен. Скачайте docker-образ приложения Запустите docker-контейнер: Или можно создать docker-compose файл: с содержимым: И запустить его: Заметим, что вся информация о карте сети будет храниться внурти самого контейнера. Чтобы не потерять агрегированные данные в случае потери контейнера, необходимо связать папку на машине с папкой /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 и событиях из мира безопасности! UPD: Проект LMS.NetMap развивается, отклик от ИТ сообщества показал (обзор в предыдущем посте), что есть неравнодушные люди, готовые вместе участвовать в развитии нашего open-source проекта. Поэтому мы решили организовать чатик для всех неравнодушных. Здесь можно будет задать вопросы, внести предложения по развитию, пообщаться с разработчиками, предложить свои идеи и многое другое, а самое главное - координироваться в развитии. Welcome! https://t.me/netmap_chat Информационная безопасность