При проведении тестов на проникновение бывает, что мы используем несколько инструментов одновременно. Чтобы написание большего количества эксплойтов для известных уязвимостей было согласованным, необходимо использовать единый формат. Одним из фреймворков, у которого есть такая задача, являются ядра.
Что такое ядра?
Проще говоря, это инфраструктура сетевых уязвимостей, которая выполняет соответствующие операции на основе определенных шаблонов в формате yaml. Именно об этих шаблонах мы сегодня и поговорим. С их помощью мы можем сканировать различные сетевые протоколы, такие как TCP, DNS, HTTP, SSL, File и многие другие.
Давайте напишем наш первый шаблон
Для начала выберем тип шаблона. Чтобы не вдаваться в более подробные примеры, предположим, что мы создадим шаблон типа osint (белый интеллект), в котором будем проверять, существует ли пользователь с заданным именем (или страницей). Это важно, потому что теперь на вашей странице Facebook можно определить собственное имя. Для частных аккаунтов такой возможности нет.
Начнем с определения основной информации шаблона.
id: facebook-page info: name: Facebook.com page Name Information - Detect author: gpiechnik2 description: Facebook.com page name information check was conducted. severity: info classification: cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:N cvss-score: 0.0 cwe-id: CWE-200 tags: osint,osint-business,osint-social metadata: max-request: 1
Следующим шагом является определение соответствующего запроса и двух утверждений — на основе статуса и ответа. Ответ интересен тем, что мы выполняем его на самом заголовке и статусе. Facebook относительно хорошо обрабатывает статусы, поэтому мы использовали это. То же самое относится и к заголовку «Ссылка». Он специфичен и достаточно стабилен.
self-contained: true http: - raw: - | GET https://facebook.com/{{user}} HTTP/2 Host: www.facebook.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.127 Safari/537.36 Sec-Fetch-Mode: navigate Accept-Language: en-US,en;q=0.9 matchers-condition: and matchers: - type: status status: - 200 - type: word part: header words: - "Link: <https://www.facebook.com/{{user}}>"
Нам пришлось добавить соответствующие заголовки, потому что без них мы были бы заблокированы или получили ответ на другом языке, чем должны.
Полный сценарий выглядит следующим образом:
id: facebook-page info: name: Facebook.com page Name Information - Detect author: gpiechnik2 description: Facebook.com page name information check was conducted. severity: info classification: cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:N cvss-score: 0.0 cwe-id: CWE-200 tags: osint,osint-business,osint-social metadata: max-request: 1 self-contained: true http: - raw: - | GET https://facebook.com/{{user}} HTTP/2 Host: www.facebook.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.127 Safari/537.36 Sec-Fetch-Mode: navigate Accept-Language: en-US,en;q=0.9 matchers-condition: and matchers: - type: status status: - 200 - type: word part: header words: - "Link: <https://www.facebook.com/{{user}}>"
Начиная
Первым шагом является проверка скрипта, чтобы убедиться, что все правильно определено внутри него.
figaro@pop-os ~/> nuclei -validate facebook-page.yaml __ _ ____ __ _______/ /__ (_) / __ \/ / / / ___/ / _ \/ / / / / / /_/ / /__/ / __/ / /_/ /_/\__,_/\___/_/\___/_/ v2.9.1 projectdiscovery.io [INF] All templates validated successfully
Когда мы получим сообщение на экране о том, что все в порядке, мы можем перейти к запуску целевого скрипта. Во-первых, давайте проверим работу существующего профиля пользователя.
figaro@pop-os ~/> nuclei -t facebook-page.yaml -var user=grzesiek.piechnik.9 __ _ ____ __ _______/ /__ (_) / __ \/ / / / ___/ / _ \/ / / / / / /_/ / /__/ / __/ / /_/ /_/\__,_/\___/_/\___/_/ v2.9.1 projectdiscovery.io [INF] Using Nuclei Engine 2.9.1 (latest) [INF] Using Nuclei Templates 9.4.2 (latest) [INF] Templates added in last update: 78 [INF] Templates loaded for scan: 1 [facebook-page] [http] [info] https://facebook.com/grzesiek.piechnik.9
Как вы можете видеть выше, он был найден. Итак, давайте попробуем проверить веб-сайт какой-нибудь компании. Давайте сделаем это страницей в Твиттере (TwitterInc).
figaro@pop-os ~/> nuclei -t facebook-page.yaml -var user=TwitterInc __ _ ____ __ _______/ /__ (_) / __ \/ / / / ___/ / _ \/ / / / / / /_/ / /__/ / __/ / /_/ /_/\__,_/\___/_/\___/_/ v2.9.1 projectdiscovery.io [INF] Using Nuclei Engine 2.9.1 (latest) [INF] Using Nuclei Templates 9.4.2 (latest) [INF] Templates added in last update: 78 [INF] Templates loaded for scan: 1 [facebook-page] [http] [info] https://facebook.com/TwitterInc
Мы снова получили положительный ответ ядер в консоли. Что происходит, когда мы вводим несуществующее имя страницы?
figaro@pop-os ~/> nuclei -t facebook-page.yaml -var user=TwitterIncDoesNotExist __ _ ____ __ _______/ /__ (_) / __ \/ / / / ___/ / _ \/ / / / / / /_/ / /__/ / __/ / /_/ /_/\__,_/\___/_/\___/_/ v2.9.1 projectdiscovery.io [INF] Using Nuclei Engine 2.9.1 (latest) [INF] Using Nuclei Templates 9.4.2 (latest) [INF] Templates added in last update: 78 [INF] Templates loaded for scan: 1 [INF] No results found. Better luck next time!
Как видите, все работает корректно. Помните, что вы можете добавить созданный шаблон в удаленный [репозиторий](https://github.com/projectdiscovery/nuclei-templates).