
Nuclear Pond — это утилита, использующая Nuclei для выполнения сканирований по всему интернету по цене чашки кофе.
Nuclear Pond используется для запуска Nuclei в облаке с невероятной скоростью, гибкостью и выполнения сканирования всего интернета за цену, меньшую, чем чашка кофе.
Он использует AWS Lambda в качестве бэкенда для параллельного выполнения сканирования Nuclei, с возможностью хранения результатов в формате JSON в S3 для последующего запроса через AWS Athena, и является одним из самых дешёвых способов выполнения сканирования в облаке.
Воспринимайте Nuclear Pond просто как способ запускать Nuclei в облаке. Вы можете использовать его так же, как на локальной машине, но выполнять сканирование параллельно и с любым количеством хостов. Вам нужно лишь продумать флаги командной строки Nuclei, которые вы хотите передать.
Для установки Nuclear Pond необходимо настроить бэкенд с помощью terraform модуля. Вы можете сделать это, выполнив terraform apply или используя terragrunt.
$ go install github.com/DevSecOpsDocs/nuclearpond@latest
Вы можете передавать параметры бэкенда как с помощью флагов, так и через переменные окружения. Используйте -f или --function-name для указания Lambda-функции и -r или --region для указания региона. Ниже приведены доступные переменные окружения.
AWS_LAMBDA_FUNCTION_NAME — имя вашей Lambda-функции для выполнения сканированийAWS_REGION — регион, в котором развёрнуты ваши ресурсыNUCLEARPOND_API_KEY — API-ключ для аутентификации в APIAWS_DYNAMODB_TABLE — таблица DynamoDB для хранения состояний сканирования через APIНиже приведены некоторые флаги, которые можно указать при запуске nuclearpond. Основные флаги, которые вам понадобятся: -t или -l для цели(ей), -a для аргументов Nuclei и -o для указания вывода. При указании аргументов Nuclei их необходимо передавать в виде строки в кодировке base64, выполнив -a $(echo -ne "-t dns" | base64).
Ниже приведены подкоманды, которые можно выполнять в nuclearpond.
Для выполнения подкоманды nuclearpond: nuclearpond run -t devsecopsdocs.com -r us-east-1 -f jwalker-nuclei-runner-function -a $(echo -ne "-t dns" | base64) -o cmd -b 1, где цель — devsecopsdocs.com, регион — us-east-1, имя Lambda-функции — jwalker-nuclei-runner-function, аргументы Nuclei — -t dns, вывод — cmd, и выполняется одна функция с пакетом из одного хоста через -b 1.
$ nuclearpond run -h
Выполняет задачи Nuclei параллельно, асинхронно вызывая Lambda
Использование:
nuclearpond run [флаги]
Флаги:
-a, --args string аргументы nuclei в виде строки base64
-b, --batch-size int размер пакета для количества целей на одно выполнение (по умолчанию 1)
-f, --function-name string имя AWS Lambda функции
-h, --help справка по run
-o, --output string тип вывода для сохранения результатов nuclei (s3, cmd или json) (по умолчанию "cmd")
-r, --region string регион AWS для выполнения nuclei
-s, --silent тихий вывод командной строки
-t, --target string отдельная цель для указания
-l, --targets string список целей в файле
-c, --threads int количество потоков для запуска Lambda-функций, по умолчанию 1 — медленно (по умолчанию 1)
Модуль Terraform по умолчанию загружает шаблоны при выполнении, а также добавляет их в виде слоя. Переменные для загрузки шаблонов используют terraform github provider для загрузки zip-архива релиза. Имя папки внутри архива будет находиться в /opt. Поскольку Nuclei загружает их при запуске, делать этого необязательно, но для повышения производительности можно указать -t /opt/nuclei-templates-9.3.4/dns, чтобы выполнить шаблоны из загруженного zip. Для указания собственных шаблонов необходимо ссылаться на релиз. Если вы используете собственный репозиторий, укажите эти переменные в terraform модуле; github_token не требуется, если репозиторий публичный.
Если вы указали s3 в качестве вывода, ваши результаты будут находиться в S3. Самый быстрый способ получить к ним доступ — через Athena. Предполагая, что вы настроили terraform-модуль в качестве бэкенда, вам нужно просто выполнить запросы напрямую через Athena. Возможно, вам придётся настроить результаты запросов, если вы ещё этого не сделали.
select
*
from
nuclei_db.findings_db
limit 10;
Чтобы немного углубиться в запросы, я приведу краткий пример. В операторе SELECT мы «спускаемся» в столбец info, столбец "matched-at" должен быть в двойных кавычках из-за символа -, и мы ищем только результаты высокого и критического уровня, сгенерированные Nuclei.
SELECT
info.name,
host,
type,
info.severity,
"matched-at",
info.description,
template,
dt
FROM
"nuclei_db"."findings_db"
where
host like '%devsecopsdocs.com'
and info.severity in ('high','critical')
Бэкенд-инфраструктура полностью находится в terraform модуле. Я настоятельно рекомендую прочитать его README, так как там содержатся важные замечания.