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

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

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

Мы будем использовать класс OpenVASManager (показанный в листинге ниже), чтобы обернуть вызовы API для запуска сканирования, мониторинга сканирования и получения результатов сканирования.

The OpenVASManager constructor and GetVersion() method

Конструктор класса OpenVASManager принимает один аргумент — OpenVASSession [1]. Если сеанс прошел, поскольку аргумент имеет значение null, мы выбрасываем исключение, поскольку мы не можем общаться с OpenVAS без действующего сеанса. В противном случае мы присваиваем сеанс локальной переменной класса, которую можем использовать из методов класса, например GetVersion(). Затем мы реализуем GetVersion() [2], чтобы получить версию OpenVAS (как в листинге выше), и метод Dispose().
Теперь мы можем заменить код, вызывающий ExecuteCommand() в нашем методе Main(), на OpenVASManager для получения версии OpenVAS, как показано в листинге ниже.

The Main() method retrieving the OpenVAS version with the OpenVASManager class

Программисту больше не нужно запоминать XML-код, необходимый для получения информации о версии, поскольку он абстрагируется за счет удобного вызова метода. Мы можем следовать этому же шаблону и для остальных команд API, которые мы будем вызывать.


Получение конфигураций сканирования и создание целей

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

The OpenVAS GetScanConfigurations() and CreateSimpleTarget() methods

Метод GetScanConfigurations() передает команду [1] OpenVAS и возвращает ответ. Метод CreateSimpleTarget() принимает аргументы для IP-адреса или диапазона CIDR (например, 192.168.1.0/24) и целевого имени, которое мы используем для создания XML-документа с помощью XDocument и XElement. Первый XElement создает корневой XML-узел create_target [2]. Остальные два содержат имя целевого объекта и его хосты. В листинге ниже показан результирующий XML-документ.

В листинге ниже показано, как мы создаем цель и сканируем ее на предмет конфигурации сканирования Discovery, которая выполняет базовое сканирование портов и другие базовые сетевые тесты.

Creating an OpenVAS target and retrieving the scan config ID
Creating an OpenVAS target and retrieving the scan config ID

Сначала мы создаем цель для сканирования с помощью CreateSimpleTarget() [1], передавая IP-адрес для сканирования и новый Guid в качестве имени цели. В целях автоматизации нам не нужно удобочитаемое имя цели, поэтому мы просто генерируем Guid для этого имени.


Примечание

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

После создания цели мы извлекаем значение атрибута id [2] из ответа XML и сохраняем его для дальнейшего использования, когда нам понадобится получить статус сканирования. Затем мы вызываем GetScanConfigurations(), чтобы получить все доступные конфигурации сканирования, сохранить их и просмотреть их, чтобы найти конфигурацию с именем Discovery [3]. Наконец, мы выводим на экран сообщение с помощью WriteLine() [4], сообщая пользователю, какой целевой идентификатор и идентификатор конфигурации сканирования будут использоваться для сканирования.


Создание и запуск задач

В листинге ниже показано, как мы создаем и запускаем сканирование с помощью класса OpenVASManager.

The OpenVAS methods to create and start a task
The OpenVAS methods to create and start a task

Метод CreateSimpleTask() [1] создает новую задачу с несколькими базовыми фрагментами информации. Можно создавать очень сложные конфигурации задач. В целях базового сканирования уязвимостей мы создаем простой XML-документ с корневым элементом create_task [2] и некоторыми дочерними элементами для хранения информации о конфигурации. Первые два дочерних элемента — это имя и комментарий (или описание) задачи. Далее идут конфигурация сканирования и целевые элементы, значения которых хранятся в виде атрибутов id [3]. После настройки нашего XML мы отправляем команду create_task в OpenVAS и возвращаем ответ.
Метод StartTask() [4] принимает один аргумент: идентификатор задачи, которую необходимо запустить. Сначала мы создаем элемент XML с именем start_task [5] с атрибутом Task_id.
В листинге ниже показано, как мы добавляем эти два метода в Main().

Creating and starting an OpenVAS task

Чтобы вызвать CreateSimpleTask(), мы передаем новый Guid в качестве имени задачи, пустую строку для комментария, а также идентификатор конфигурации сканирования и целевой идентификатор в качестве аргумента. Мы извлекаем атрибут id [1] из корневого узла возвращаемого XML-документа, который является идентификатором задачи; затем мы передаем его в StartTask() [2], чтобы запустить сканирование OpenVAS.
Просмотр сканирования и получение результатов сканирования
Для просмотра сканирования мы реализуем GetTasks() и GetTaskResults(), как показано в листинге ниже. Метод GetTasks() (который реализуется первым) возвращает список задач и их статус, чтобы мы могли отслеживать сканирование до завершения. Метод GetTaskResults() возвращает результаты сканирования данной задачи, чтобы мы могли увидеть любые уязвимости, которые находит OpenVAS.

The OpenVASManager methods to get a list of current tasks and retrieve the results of a given task
The OpenVASManager methods to get a list of current tasks and retrieve the results of a given task

Метод GetTasks() имеет один необязательный аргумент, который по умолчанию имеет значение null [1]. Метод GetTasks() вернет либо все текущие задачи, либо только одну задачу, в зависимости от того, имеет ли переданный аргумент TaskID значение NULL. Если переданный идентификатор задачи не равен нулю, мы создаем новый XML-элемент с именем get_tasks с атрибутом Task_id [2] переданного идентификатора задачи; затем мы отправляем команду get_tasks в OpenVAS и возвращаем ответ. Если идентификатор равен нулю, мы используем метод XDocument.Parse() [3], чтобы создать новый элемент get_tasks без определенного идентификатора для получения; затем мы выполняем команду и возвращаем результат.
Метод GetTaskResults() работает аналогично GetTasks(), за исключением того, что его единственный аргумент не является необязательным. Используя идентификатор, переданный в качестве аргумента, мы создаем XML-узел [4] get_results с атрибутом Task_id. После передачи этого узла XML в ExecuteCommand() мы возвращаем ответ.
Завершение автоматизации
В листинге ниже показано, как мы можем отслеживать сканирование и получать его результаты с помощью только что реализованных методов. В нашем методе Main(), управляющем классами Session/Manager, мы можем добавить следующий код, чтобы завершить нашу автоматизацию.

Watching an OpenVAS scan until finished and then retrieving the scan results and printing them
Watching an OpenVAS scan until finished and then retrieving the scan results and printing them

Мы вызываем GetTasks() [1], передавая сохраненный ранее идентификатор задачи, а затем сохраняем результаты в переменной состояния. Затем мы используем метод Descendants() [2] LINQ to XML, чтобы проверить, равен ли узел состояния в XML-документе Done, что означает, что сканирование завершено. Если сканирование не завершено, мы отключаем функцию Sleep() на пять секунд, а затем очищаем экран консоли. Затем мы получаем процент завершения сканирования, используя Descendants() [3] для получения узла прогресса, распечатываем процент, снова запрашиваем у OpenVAS текущий статус с помощью GetTasks() [4] и так далее, пока сканирование не сообщит, что оно завершено.
После завершения сканирования мы вызываем GetTaskResults() [5], передавая идентификатор задачи; затем мы сохраняем и распечатываем XML-документ, содержащий результаты сканирования, на экран консоли. Этот документ включает ряд полезной информации, включая обнаруженные хосты и открытые порты, известные активные службы на сканируемых хостах и известные уязвимости, такие как старые версии программного обеспечения.


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


Сканирование может занять некоторое время, в зависимости от машины, на которой работает OpenVAS, и скорости Вашей сети. Во время работы наша система автоматизации отображает дружественное сообщение, сообщающее пользователю статус текущего сканирования. Успешный результат должен выглядеть примерно так же, как сильно урезанный образец отчета, показанный в листинге ниже.

Sample output of the OpenVAS automation

Резюме


В этой главе показано, как использовать встроенные сетевые классы C# для автоматизации OpenVAS. Вы узнали, как создать SSL-соединение с OpenVAS и как взаимодействовать с помощью OMP на основе XML. Вы узнали, как создать объект для сканирования, получить доступные конфигурации сканирования и запустить определенное сканирование объекта. Вы также узнали, как отслеживать ход сканирования и получать его результаты в отчете XML.
С помощью этих базовых блоков мы можем начать устранение уязвимостей в сети, а затем запустить новое сканирование, чтобы гарантировать, что об уязвимостях больше не будет сообщено. Сканер OpenVAS — очень мощный инструмент, и мы лишь поверхностно коснулись его. OpenVAS постоянно обновляет каналы уязвимостей и может использоваться в качестве эффективного решения по управлению уязвимостями.
В качестве следующего шага Вы можете рассмотреть возможность управления учетными данными для сканирования уязвимостей с проверкой подлинности через SSH или создания пользовательских конфигураций сканирования для проверки определенных конфигураций политики. Все это и даже больше возможно благодаря OpenVAS.

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

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