
Nuclear Pond é um utilitário que utiliza o Nuclei para realizar varreduras em toda a internet pelo custo de uma xícara de café.
Nuclear Pond é usado para aproveitar o Nuclei na nuvem com velocidade notável, flexibilidade e realizar varreduras em toda a internet por muito menos que uma xícara de café.
Ele usa AWS Lambda como backend para invocar varreduras Nuclei em paralelo, com a opção de armazenar resultados json no S3 para consultar com AWS Athena, e é facilmente uma das maneiras mais baratas de executar varreduras na nuvem.
Pense no Nuclear Pond apenas como uma maneira de executar o Nuclei na nuvem. Você pode usá-lo da mesma forma que faria em sua máquina local, mas executando em paralelo e com quantos hosts quiser especificar. Tudo o que você precisa pensar são as flags da linha de comando do nuclei que deseja passar para ele.
Para instalar o Nuclear Pond, você precisa configurar o módulo terraform do backend. Você pode fazer isso executando terraform apply ou usando terragrunt.
$ go install github.com/DevSecOpsDocs/nuclearpond@latest
Você pode passar seu backend através de flags ou variáveis de ambiente. Você pode usar -f ou --function-name para especificar sua função Lambda e -r ou --region para a região especificada. Abaixo estão as variáveis de ambiente que você pode usar.
AWS_LAMBDA_FUNCTION_NAME é o nome da sua função lambda para executar as varredurasAWS_REGION é a região onde seus recursos estão implantadosNUCLEARPOND_API_KEY é a chave API para autenticação na APIAWS_DYNAMODB_TABLE é a tabela dynamodb para armazenar estados de varreduras da APIAbaixo estão algumas das flags que você pode especificar ao executar nuclearpond. As flags principais que você precisa são -t ou -l para seus alvos, -a para os args do nuclei, e -o para especificar sua saída. Ao especificar os args do Nuclei, você deve passá-los como strings codificadas em base64 executando -a $(echo -ne "-t dns" | base64).
Abaixo estão os subcomandos que você pode executar dentro do nuclearpond.
Para executar o subcomando 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 em que o alvo é devsecopsdocs.com, a região é us-east-1, o nome da função lambda é jwalker-nuclei-runner-function, os argumentos nuclei são -t dns, a saída é cmd, e executa uma função através de um lote de um host com -b 1.
$ nuclearpond run -h
Executes nuclei tasks in parallel by invoking lambda asynchronously
Usage:
nuclearpond run [flags]
Flags:
-a, --args string nuclei arguments as base64 encoded string
-b, --batch-size int batch size for number of targets per execution (default 1)
-f, --function-name string AWS Lambda function name
-h, --help help for run
-o, --output string output type to save nuclei results(s3, cmd, or json) (default "cmd")
-r, --region string AWS region to run nuclei
-s, --silent silent command line output
-t, --target string individual target to specify
-l, --targets string list of targets in a file
-c, --threads int number of threads to run lambda functions, default is 1 which will be slow (default 1)
Por padrão, o módulo terraform baixa os templates na execução e também os adiciona como uma camada. As variáveis para baixar templates usam o provedor github do terraform para baixar o zip da release. O nome da pasta dentro do zip estará localizado em /opt. Como o Nuclei os baixa na execução, não precisamos, mas para melhorar o desempenho você pode especificar -t /opt/nuclei-templates-9.3.4/dns para executar templates do zip baixado. Para especificar seus próprios templates, você deve referenciar uma release. Ao fazer isso em seu próprio repositório, você deve especificar estas variáveis no módulo terraform, github_token não é necessário se seu repositório for público.
Se você especificou s3 como saída, suas descobertas estarão localizadas no S3. A maneira mais rápida de acessá-las é através do Athena. Assumindo que você configurou o módulo terraform como seu backend, tudo o que você precisa fazer é consultá-las diretamente através do Athena. Talvez seja necessário configurar os resultados da consulta se ainda não o fez.
select
*
from
nuclei_db.findings_db
limit 10;
Para aprofundar um pouco mais nas consultas, pensei em dar um exemplo rápido. Na instrução select, detalhamos a coluna info, a coluna "matched-at" deve estar entre aspas duplas devido ao caractere -, e você está pesquisando apenas por descobertas altas e críticas geradas pelo 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')
A infraestrutura do backend, tudo dentro do módulo terraform. Eu recomendo fortemente a leitura do readme associado a ele, pois contém algumas notas importantes.