Проблема

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

Комментарии (16)


  1. inkvizitor68sl
    00.00.0000 00:00

    А по крону оно умеет сетки сканить? Или как из cli таск добавить?


    1. lmsecurity Автор
      00.00.0000 00:00

      В дальнейшем будет добавлена фичи: сканирование по сценарию и запланированное сканирование.

      CLI интерфейс не реализован, при необходимости сделаем. Есть REST API, можно через него осуществлять добавление тасков.


      1. inkvizitor68sl
        00.00.0000 00:00

        А, через API нормально)
        В статью бы добавить пример только)


  1. inkvizitor68sl
    00.00.0000 00:00

    Кстати, в docker --network host не работает - ругается, что не может определить IP у eth0


  1. 13werwolf13
    00.00.0000 00:00
    +1

    стадии прочтения статьи:
    1) уу, новаястильномодномолодёжная альтернатива nmap, а это интересно
    2) js, docker.. нафиг, обойдёмся..


  1. net_racoon
    00.00.0000 00:00
    +1

    Это все прекрасно конечно. Но это не работает. Т.к. большинство сетей - это зоопарк вендоров и технологий. Плюс схема ИПшник+какие-то линии обычно ничего не дает. Нужна L2 и L3 схема и если ее генерировать автоматически, то получается запутанный клубок.


    1. lmsecurity Автор
      00.00.0000 00:00

      Благодарим за важное замечание!

      Действительно, корректное построение карты на L2 и L3 уровнях ограничивается настройками межсетевого экрана, свитчей и маршрутизаторов. Если рабочая станция атакующего изолирована в отдельный широковещательный домен и запрещены межвлан роуты, то ничего тут не поделать и карту не построить.

      Одной из выполняемых задач нашего инструмента является энумерация сети как в активном, так и пассивном режиме. С новыми релизами будет добавляться поддержка других бродкаст и мультикаст протоколов, парсинг служебных диагностических пакетов и так далее.

      Будем работать в этом направлении.


  1. DikSoft
    00.00.0000 00:00

    Invalid date time в таблице заданий. Есть вариант исправить? Локализация ОС - En/US

    Example


    1. lmsecurity Автор
      00.00.0000 00:00

      Здравствуйте. Большое спасибо за внимательность и обраную связь. Проблема на веб-морде при преобразовнии timestamp в другой формат. По всей видимости занчения в базе равны NULL. В ближайшем коммите пофиксим.


      1. DikSoft
        00.00.0000 00:00

        Спасибо, и обратите внимание, в одной колонке время UTC в других (?) местное


  1. DikSoft
    00.00.0000 00:00

    Как пример по работе с базой и графами может и ничего. Но в целом бесполезный в текущем виде инструмент.


    1. lmsecurity Автор
      00.00.0000 00:00


  1. nuanse
    00.00.0000 00:00

    Zenmap — это, конечно, хорошо, но с момента последнего релиза прошло уже около 8 лет.

    а что там принципиально поменялось? Когда нужно проверить какую-нибудь очередную zero-day уязвимость, берёшь nse-скрипт подсовываешь и всех дел


  1. nuanse
    00.00.0000 00:00

    scapy и пассивное сканирование норм тема, оценил


  1. 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 минут, что я с ним поигрался, в голове сформировался вооот такущий список предложений


    1. lmsecurity Автор
      00.00.0000 00:00

      Добрый день.

      Большое спасибо за Ваш развернутый отзыв о приложении, его недостатках и бага.

      Да, действительно в приложении присутствуют нестыковки, веб-интерфейс не логичный и местами неудобный (фронтендер у нас так себе).

      Ваши замечания зафиксированы и в скором времени будут исправлены. Если в процессе использования возникнут еще какие-то идеи по улучшению приложения, мы всега рады увидеть их в issue репозитория.

      Еще раз большое спасибо за Ваш отзыв.