#39 Gray Hat C#. Руководство для хакера по созданию и автоматизации инструментов безопасности. Класс OpenVASManager.
Здравствуйте, дорогие друзья.
Мы будем использовать класс OpenVASManager (показанный в листинге ниже), чтобы обернуть вызовы API для запуска сканирования, мониторинга сканирования и получения результатов сканирования.
![The OpenVASManager constructor and GetVersion() method](https://timcore.ru/wp-content/uploads/2023/10/170-1024x683.png)
Конструктор класса 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](https://timcore.ru/wp-content/uploads/2023/10/171-1024x282.png)
Программисту больше не нужно запоминать XML-код, необходимый для получения информации о версии, поскольку он абстрагируется за счет удобного вызова метода. Мы можем следовать этому же шаблону и для остальных команд API, которые мы будем вызывать.
Получение конфигураций сканирования и создание целей
В листинге ниже показано, как мы добавим команды для запуска в OpenVASManager для создания новой цели и получения конфигураций сканирования.
![The OpenVAS GetScanConfigurations() and CreateSimpleTarget() methods](https://timcore.ru/wp-content/uploads/2023/10/172-1024x409.png)
Метод GetScanConfigurations() передает команду [1] OpenVAS и возвращает ответ. Метод CreateSimpleTarget() принимает аргументы для IP-адреса или диапазона CIDR (например, 192.168.1.0/24) и целевого имени, которое мы используем для создания XML-документа с помощью XDocument и XElement. Первый XElement создает корневой XML-узел create_target [2]. Остальные два содержат имя целевого объекта и его хосты. В листинге ниже показан результирующий XML-документ.
1 2 3 4 |
<create_target> <name>Home Network</name> <hosts>192.168.1.0/24</hosts> </create_target> |
В листинге ниже показано, как мы создаем цель и сканируем ее на предмет конфигурации сканирования Discovery, которая выполняет базовое сканирование портов и другие базовые сетевые тесты.
![Creating an OpenVAS target and retrieving the scan config ID](https://timcore.ru/wp-content/uploads/2023/10/173-1024x254.png)
![Creating an OpenVAS target and retrieving the scan config ID](https://timcore.ru/wp-content/uploads/2023/10/174-1024x248.png)
Сначала мы создаем цель для сканирования с помощью CreateSimpleTarget() [1], передавая IP-адрес для сканирования и новый Guid в качестве имени цели. В целях автоматизации нам не нужно удобочитаемое имя цели, поэтому мы просто генерируем Guid для этого имени.
Примечание
В будущем Вы, возможно, захотите присвоить имена целевым базам данных или рабочим станциям, чтобы разделить определенные компьютеры в Вашей сети для сканирования. Вместо этого Вы можете указать читаемые имена, подобные этим, но имена должны быть уникальными для каждой цели.
Вот как должен выглядеть ответ на успешное создание цели:
1 2 |
<create_target_response status="201" status_text="OK, resource created" id="254cd3ef-bbe1-4d58-859d-21b8d0c046c6"/> |
После создания цели мы извлекаем значение атрибута id [2] из ответа XML и сохраняем его для дальнейшего использования, когда нам понадобится получить статус сканирования. Затем мы вызываем GetScanConfigurations(), чтобы получить все доступные конфигурации сканирования, сохранить их и просмотреть их, чтобы найти конфигурацию с именем Discovery [3]. Наконец, мы выводим на экран сообщение с помощью WriteLine() [4], сообщая пользователю, какой целевой идентификатор и идентификатор конфигурации сканирования будут использоваться для сканирования.
Создание и запуск задач
В листинге ниже показано, как мы создаем и запускаем сканирование с помощью класса OpenVASManager.
![The OpenVAS methods to create and start a task](https://timcore.ru/wp-content/uploads/2023/10/175-1024x334.png)
![The OpenVAS methods to create and start a task](https://timcore.ru/wp-content/uploads/2023/10/176.png)
Метод 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](https://timcore.ru/wp-content/uploads/2023/10/177-1024x193.png)
Чтобы вызвать 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](https://timcore.ru/wp-content/uploads/2023/10/178.png)
![The OpenVASManager methods to get a list of current tasks and retrieve the results of a given task](https://timcore.ru/wp-content/uploads/2023/10/179-1024x507.png)
Метод 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](https://timcore.ru/wp-content/uploads/2023/10/180-1024x377.png)
![Watching an OpenVAS scan until finished and then retrieving the scan results and printing them](https://timcore.ru/wp-content/uploads/2023/10/181.png)
Мы вызываем 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](https://timcore.ru/wp-content/uploads/2023/10/182.png)
Резюме
В этой главе показано, как использовать встроенные сетевые классы C# для автоматизации OpenVAS. Вы узнали, как создать SSL-соединение с OpenVAS и как взаимодействовать с помощью OMP на основе XML. Вы узнали, как создать объект для сканирования, получить доступные конфигурации сканирования и запустить определенное сканирование объекта. Вы также узнали, как отслеживать ход сканирования и получать его результаты в отчете XML.
С помощью этих базовых блоков мы можем начать устранение уязвимостей в сети, а затем запустить новое сканирование, чтобы гарантировать, что об уязвимостях больше не будет сообщено. Сканер OpenVAS — очень мощный инструмент, и мы лишь поверхностно коснулись его. OpenVAS постоянно обновляет каналы уязвимостей и может использоваться в качестве эффективного решения по управлению уязвимостями.
В качестве следующего шага Вы можете рассмотреть возможность управления учетными данными для сканирования уязвимостей с проверкой подлинности через SSH или создания пользовательских конфигураций сканирования для проверки определенных конфигураций политики. Все это и даже больше возможно благодаря OpenVAS.
На этом все. Всем хорошего дня!