Gray Hat C#, Nexpose, Программирование

#36 Gray Hat C#. Руководство для хакера по созданию и автоматизации инструментов безопасности. Автоматизация Nexpose. Автоматизация сканирования уязвимостей.

Здравствуйте, дорогие друзья.

В этом разделе мы наконец рассмотрим, как автоматизировать сканирование уязвимостей с помощью Nexpose. Мы создаем сайт Nexpose, сканируем его, а затем загружаем отчет о результатах. Мы лишь поверхностно коснемся мощных функций сканирования Nexpose.


Создание сайта с активами


Прежде чем запускать сканирование с помощью Nexpose, нам необходимо создать сайт для сканирования. В листинге ниже показано, как мы можем создать запрос XML API для создания сайта в методе CreateOrUpdateSite().

The CreateOrUpdateSite() method in the NexposeManager class

Метод CreateOrUpdateSite() [1] принимает до четырех аргументов: удобочитаемое имя сайта, любые имена хостов и диапазоны IP-адресов, а также идентификатор сайта. Передача -1 [2] в качестве идентификатора сайта, как показано здесь, создает новый сайт. В [3] мы создаем XML-элемент под названием Hosts, и если существует аргумент имени хоста, который не равен нулю [4], мы добавляем его в Hosts. Мы делаем то же самое для любого диапазона IP-адресов [5], передаваемого в качестве аргументов.
Затем мы создаем XDocument [6] с корневым узлом XML SiteSaveRequest и атрибутом session-id, чтобы сообщить серверу Nexpose, что мы прошли аутентификацию и можем выполнить этот вызов API. Внутри корневого узла мы создаем XElement под названием Site для хранения конкретной информации о новом сайте и деталей конфигурации сканирования, таких как хосты для сканирования [7] и идентификатор шаблона сканирования [8]. Мы [9] передаем SiteSaveRequest в ExecuteCommand() и приводим объект, который ExecuteCommand() возвращает, к XDocument.


Запуск сканирования


В листинге ниже показано, как начать сканирование сайта и получить его статус с помощью методов ScanSite() и GetScanStatus(). Надеемся, Вы начинаете понимать, насколько легко можно реализовать новые функциональные возможности API в классе Manager, когда класс NexposeSession осуществляет всю связь, и все, что Вам нужно сделать, это настроить XML-запрос API.

 The ScanSite() and GetScanStatus() methods in the NexposeManager class

Метод ScanSite() [1] принимает siteID [2] в качестве аргумента для сканирования. Мы создаем XDocument [3] с корневым узлом SiteScanRequest [4], а затем добавляем к нему атрибуты session-id и site-id. Затем мы отправляем XML-файл SiteScanRequest на сервер Nexpose и возвращаем ответ.
Метод GetScanStatus() [5] принимает один аргумент — идентификатор сканирования для проверки, который возвращается методом ScanSite(). После создания нового XDocument [6] с корневым узлом ScanStatusRequest и добавления атрибутов session-id и scan-id мы отправляем полученный XDocument на сервер Nexpose и возвращаем ответ вызывающей стороне.


Создание отчета о сайте в формате PDF и удаление сайта

В листинге ниже показано, как мы создаем отчет о сканировании и удаляем сайт с помощью API в методах GetPdfSiteReport() и DeleteSite().

The GetPdfSiteReport() and DeleteSite() methods in the NexposeManager class

Оба метода принимают только один аргумент — идентификатор сайта. Чтобы создать отчет в формате PDF, мы используем ReportAdHocGenerateRequest [1] и указываем pdf [2] и siteID [3]. Мы приводим объект, возвращаемый функцией ExecuteCommand(), к байтовому массиву [4] вместо XDocument, поскольку Nexpose вернет составной/смешанный HTTP-ответ для ReportAdHocGenerateRequest. Мы возвращаем необработанные байты PDF-отчета для записи вызывающему методу.
Мы используем DeleteSite() [5], чтобы удалить сайт и создать SiteDeleteRequest XDocument [6], а затем выполнить вызов API и вернуть результаты [7].


Собираем все это вместе

Теперь, когда Вы знаете, как программно управлять Nexpose, давайте создадим новый сайт Nexpose, отсканируем его, создадим PDF-отчет о его уязвимостях и удалим сайт. В листинге ниже этот процесс начинается с создания нового сайта и получения его идентификатора с помощью двух новых классов.

Creating the temporary site and retrieving the site ID
Creating the temporary site and retrieving the site ID

После создания объектов NexposeSession [1] и NexposeManager [2] мы передаем список IP-адресов для сканирования в виде строки [3] с начальным и конечным адресом. Чтобы сканировать один IP-адрес, используйте пустую строку в качестве второго элемента, как показано в [4]. Мы передаем список целевых IP-адресов в CreateOrUpdateSite() [5] вместе с Guid [6] с именем временного сайта. (Нам просто нужна уникальная строка для имени сайта.) Когда мы получаем HTTP-ответ от Nexpose для создания временного сайта, мы извлекаем идентификатор сайта из XML и сохраняем его.


Запуск сканирования

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

Starting and monitoring the Nexpose scan

Мы начинаем сканирование с передачи идентификатора сайта в ScanSite() [1], а затем извлекаем идентификатор сканирования из ответа и передаем его в GetScanStatus() [2]. Затем в цикле while мы приостанавливаемся на несколько секунд, пока сканирование статус не завершен [3]. Затем мы снова проверяем статус сканирования и отображаем сообщение о состоянии пользователю с помощью WriteLine() [4].


Создание отчета и удаление сайта

После завершения сканирования мы можем создать отчет и удалить сайт, как показано в листинге ниже.

Retrieving the Nexpose site report, writing it to the filesystem, and then deleting the site

Чтобы создать отчет, мы передаем идентификатор сайта в функцию GetPdfSiteReport() [1], которая возвращает массив байтов. Затем мы используем WriteAllBytes() [3], чтобы сохранить отчет в формате PDF в каталоге рабочего стола пользователя с идентификатором сайта в качестве имени файла [2] и расширением .pdf. Затем мы удаляем сайт с помощью DeleteSite() [4].


Запуск автоматизации

В листинге ниже показано, как запустить сканирование и просмотреть его отчет.

Running the scan and writing the report to the user’s Desktop

Обратите внимание, что в выводе листинга выше Nexpose возвращает как минимум три статуса сканирования, которые представляют собой отдельные фазы сканирования: Running [1], Integrating [2] и Finished [3]. После завершения сканирования наш отчет в формате PDF записывается на Desktop [4] пользователя, как и ожидалось. Вы можете открыть этот новый отчет в своей любимой программе чтения PDF-файлов и посмотреть, какие уязвимости мог обнаружить Nexpose.


Резюме


В этом разделе Вы узнали, как заставить сканер уязвимостей Nexpose сообщать об уязвимостях для данного хоста в сети. Вы также узнали, как Nexpose хранит информацию о компьютерах в сети, например о сайтах и ресурсах. Вы создали несколько классов для программного управления Nexpose с использованием базовых библиотек C# и узнали, как использовать NexposeSession для аутентификации с помощью Nexpose, а также отправки и получения XML в Nexpose API. Вы также увидели, как класс NexposeManager реализует функциональность API, включая возможность создавать и удалять сайты. Наконец, Вы смогли заставить Nexpose сканировать сетевой ресурс, а затем создать красивый отчет в формате PDF, отображающий результаты.
Возможности Nexpose выходят далеко за рамки простого управления уязвимостями. Расширение Вашей библиотеки для охвата этой расширенной функциональности должно быть относительно простым и является отличным способом ознакомиться с другими мощными функциями, предоставляемыми Nexpose, такими как пользовательские политики сканирования, сканирование уязвимостей с проверкой подлинности и более настраиваемые отчеты. Передовая, современная, зрелая корпоративная сеть требует детального контроля системы, который позволит организации интегрировать безопасность в рабочие процессы бизнеса. Nexpose предлагает все это и является мощным инструментом, который должен быть в вашем арсенале ИТ-менеджера или системного администратора.

На этом все. Всем хорошего дня!

Цикл статей по Gray Hat C#. Руководство для хакера по созданию и автоматизации инструментов безопасности.