Как стать автором
Обновить

LMS.NetMap швейцарский нож для анализа сетевой инфраструктуры

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров8.5K

Проблема

Часто при проведении пентестов большой корпоративной инфрастуктуры нам не хватало визуального отображения карты сети. 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 репозитория

  1. Склонируйте репозиторий из github:

git clone https://github.com/lmsecure/LMS.NetMap.git
cd LMS.NetMap
  1. Установите необходимое ПО:

sudo apt install nmap python3.8
  1. Разверните виртуальное окружение для python:

sudo apt install -y python3-venv
python3 -m venv venv
source venv/bin/activate
  1. Установите зависимые python-пакеты:

pip3 install -r requirements.txt
  1. Выдайте права на работу с сокетами без использование прав 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`
  1. Запустите приложение:

python3 app.py

Docker контейнер

  1. Установите docker согласно инструкции, если он не установлен.

  2. Скачайте docker-образ приложения

docker pull lmsecure/lms.netmap
  1. Запустите 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-а.

Кнопочка для загрузка nmap xml файлов
Кнопочка для загрузка nmap xml файлов

При нажатии на кнопку "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

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
А в Вашей организации имеется карта сети?
72.73% Да, имеется24
15.15% Нет, не имеется5
12.12% А что это такое?4
Проголосовали 33 пользователя. Воздержались 3 пользователя.
Теги:
Хабы:
Всего голосов 6: ↑6 и ↓0+6
Комментарии17

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн