
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 인증을 위한 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을 통해 하나의 호스트 배치로 하나의 함수를 실행합니다.
$ 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에서 생성된 높음(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 모듈 내에 있습니다. 중요한 내용이 포함되어 있으므로 관련 README를 읽어볼 것을 강력히 권장합니다.