
Nuclear Pondは、一杯のコーヒーのコストでインターネット全体のスキャンを実行するためにNucleiを活用するユーティリティです。
Nuclear Pond は、Nuclei をクラウドで活用するために使用され、卓越した速度、柔軟性を持ち、コーヒー1杯よりもはるかに低コストでインターネット全体のスキャンを実行 します。
これは、AWS Lambda をバックエンドとして活用し、Nuclei スキャンを並列に実行し、JSON 形式の結果を S3 に保存して AWS Athena でクエリする選択肢を提供します。これは、クラウドでスキャンを実行する最も安価な方法の1つです。
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 への認証に使用する API キーですAWS_DYNAMODB_TABLE は、API スキャンの状態を保存する DynamoDB テーブルです以下は、nuclearpond を実行する際に指定できるフラグの一部です。主なフラグは、ターゲット用の -t または -l、Nuclei 引数用の -a、出力を指定する -o です。Nuclei 引数を指定する場合、-a $(echo -ne "-t dns" | base64) のように 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 によって1ホストのバッチで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)
Terraform モジュールはデフォルトで、実行時にテンプレートをダウンロードし、テンプレートをレイヤーとして追加します。テンプレートをダウンロードするための変数 は、Terraform GitHub プロバイダーを使用してリリース ZIP をダウンロードします。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 を読むことを強くお勧めします。