
Nuclear Pondは、Nucleiを活用して、コーヒー1杯分のコストでインターネット全体を対象としたスキャンを実行できるユーティリティです。
私たちはこのプロジェクトをフォークし、この素晴らしいアイデアを継続できるようにしました。一緒にコードを改善し、誰もが利用できるようにできればと思います - @OFJAAAH
Nuclear Pondをインストールするには、バックエンドのterraform moduleを設定する必要があります。これはterraform applyを実行するか、terragruntを利用して行えます。
AWS Lambdaをバックエンドとして利用してNucleiスキャンを並列に実行し、JSONの検出結果をS3に保存してAWS Athenaでクエリすることを選択できます。これは、クラウドでスキャンを実行する方法としては、間違いなく最も低コストな方法の1つです。
Nuclear Pondは、クラウドでNucleiを実行するための手段だと考えてください。ローカルマシンで使用するのと同じように使用できますが、並列実行ができ、指定したい数のホストで実行できます。考える必要があるのは、渡したいNucleiのコマンドラインフラグだけです。
Nuclear Pondをインストールするには、バックエンドのterraform moduleを設定する必要があります。これは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 moduleはデフォルトで実行時にテンプレートをダウンロードし、テンプレートをレイヤーとして追加します。テンプレートをダウンロードするための変数は、terraform githubプロバイダーを使用してリリースのzipをダウンロードします。zip内のフォルダ名は/opt内に配置されます。Nucleiは実行時にテンプレートをダウンロードするためその必要はありませんが、パフォーマンスを向上させるには-t /opt/nuclei-templates-9.3.4/dnsを指定して、ダウンロードしたzipからテンプレートを実行できます。独自のテンプレートを指定するには、リリースを参照する必要があります。独自のリポジトリで行う場合、terraform moduleに以下の変数を指定する必要があります。リポジトリが公開されている場合、github_tokenは不要です。
出力としてs3を指定した場合、検出結果はS3に保存されます。最速でアクセスする方法はAthenaを使用することです。terraform-moduleをバックエンドとして設定している場合は、Athenaから直接クエリするだけで済みます。まだ設定していない場合は、クエリ結果の設定が必要になることがあります。
select
*
from
nuclei_db.findings_db
limit 10;
クエリをもう少し深く掘り下げるために、簡単な例を示します。SELECT文ではinfo列をドリルダウンします。"matched-at"列は-文字が含まれるため二重引用符で囲む必要があります。また、Nucleiによって生成されたhighおよびcriticalの検出結果のみを検索しています。
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 module内にあります。関連するREADMEには重要な注意事項が記載されているため、読むことを強くお勧めします。