
Nuclear Pond는 Nuclei를 활용하여 커피 한 잔 값으로 인터넷 전체를 스캔하는 유틸리티입니다.
우리는 이 훌륭한 아이디어를 이어가기 위해 이 프로젝트를 포크했습니다. 함께 코드를 개선하고 모든 사람이 사용할 수 있게 되기를 바랍니다 - @OFJAAAH
Nuclear Pond를 설치하려면 백엔드 terraform module을 구성해야 합니다. terraform apply를 실행하거나 terragrunt를 활용하여 구성할 수 있습니다.
AWS Lambda를 백엔드로 활용하여 Nuclei 스캔을 병렬로 실행하며, json 결과를 s3에 저장하여 AWS Athena로 쿼리할 수 있는 옵션을 제공합니다. 클라우드에서 스캔을 실행할 수 있는 가장 저렴한 방법 중 하나입니다.
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 run -t devsecopsdocs.com -r us-east-1 -f jwalker-nuclei-runner-function -a $(echo -ne "-t dns" | base64) -o cmd -b 1을 실행하여 nuclearpond 하위 명령을 실행합니다. 여기서 대상은 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를 지정한 경우 findings는 S3에 저장됩니다. 가장 빠르게 접근하는 방법은 Athena를 사용하는 것입니다. terraform-module을 백엔드로 설정했다면 Athena를 통해 직접 쿼리하기만 하면 됩니다. 아직 쿼리 결과를 구성하지 않았다면 구성해야 할 수 있습니다.
select
*
from
nuclei_db.findings_db
limit 10;
쿼리를 좀 더 깊이 다루기 위해 간단한 예시를 들어보겠습니다. select 문에서 info 열을 드릴다운하고, "matched-at" 열은 - 문자 때문에 큰따옴표로 묶어야 하며, Nuclei가 생성한 high 및 critical findings만 검색합니다.
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에는 중요한 내용이 있으므로 반드시 읽어보시길 강력히 권장합니다.