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

Что такое ядра?

Проще говоря, это инфраструктура сетевых уязвимостей, которая выполняет соответствующие операции на основе определенных шаблонов в формате 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).