
정찰 및 취약점 스캔 워크로드를 분산 처리하는 서버리스 AWS 솔루션입니다. 웹 UI를 통해 작업을 제출하면 EC2 워커가 Nmap과 같은 도구를 사용해 커스텀 Python 스크립트를 실행합니다.
CowCloud는 원래 인식(recon) 도구와 취약점 스캔을 분산 방식으로 실행하기 위해 만들어졌습니다. 예를 들어 버그 바운티 헌터들이 사용하는 것이 한 가지 사례일 수 있습니다. 이 솔루션은 AWS에서 작업 부하를 분산하는 데 필요한 기본 작업으로부터 최종 사용자를 추상화하는 것을 목적으로 합니다. CowCloud는 사용자에게 작업을 조회하고 생성할 수 있는 친숙한 웹 인터페이스를 제공하며, 이후 해당 작업은 작업자 노드(EC2 인스턴스)에서 실행되는 Python 코드가 소비합니다. Python 코드뿐만 아니라 EC2 AMI도 사용자 정의할 수 있도록 설계되었습니다.
예를 들어 Nmap 스캔을 실행하려고 한다고 가정해 보겠습니다. 이 경우 AMI 카탈로그에서 AMI를 선택하고 Terraform/ec2_module/ec2_module.tf의 image_id 필드를 업데이트하면 됩니다. 그런 다음 Nmap 스캔 인수(-Pn, -p 443 등)를 사용자 정의하려면 ec2py/template.py 파일을 업데이트해야 합니다. 마지막으로 Terraform/ec2_module/ec2_module.tf 구성 파일의 user_data 필드를 업데이트하여 Nmap과 해당 종속성을 설치해야 합니다.
또 다른 옵션은 여러 상용 도구를 설치하고 실행하는 것입니다. 이 경우 직접 EC2 인스턴스나 스냅샷을 생성하는 것이 좋습니다. 이 경우 모든 종속성을 설치하고 라이선스를 활성화하여 이 AMI를 작업자 노드의 골든 이미지로 사용할 수 있습니다.

CowCloud는 세 가지 주요 구성 요소로 나눌 수 있습니다:
다음은 주요 기능입니다:
autoscalingStrategy.py에서 확인할 수 있습니다)retention_time이 만료된 후 CloudWatch 로깅 그룹을 삭제하는 데 사용됩니다.template.py 파일의 extra_docker_params 변수를 확인하세요(아래 Administrator/maintainer 섹션에서 설명).
Terraform을 실행하면 새 파일(config.js)이 생성됩니다. 여기에는 React JS 앱이 Cognito 사용자 풀 디렉터리에 인증하는 데 필요한 구성이 포함됩니다. 인프라가 배포된 후에는 React 앱을 빌드하고 build 폴더를 업로드해야 합니다. 또한 Python 코드를 코드 저장소 역할을 하는 S3 버킷에 업로드해야 합니다. 이 프로세스는 setup.bat 및 setup.sh 두 스크립트로 자동화되어 있으므로 이에 대해 걱정할 필요가 없습니다. 이는 단지 이 단계를 요약한 것뿐입니다.
인프라는 기본적으로 us-east-1 리전에 배포되지만, Terraform 폴더 안의 locals.tf 파일에서 변경할 수 있습니다.
단계:
variables.tf를 업데이트합니다. ami 변수는 기존 EC2 AMI를 가리켜야 하며, 이는 골든 AMI 또는 EC2 카탈로그의 AMI일 수 있습니다.aws configure에서 aws-cli가 AWS 계정을 사용하도록 구성합니다. 다음 명령을 실행하여 제대로 구성되었는지 확인하세요: aws sts get-caller-identity. 올바르게 구성된 경우 오류가 반환되지 않아야 합니다.aws ec2 create-key-pair –key-name cowCloud –query “cowCloud” –output text > ec2_module/cowCloud.pemgit clone [email protected]:nccgroup/cowcloud.git
# Deploy the infra
cd cowcloud
cd Terraform
terraform init
terraform plan
terraform apply --auto-approve
이제 준비가 끝났습니다! 가입하고 로그인하여 새 작업을 만들어 보세요!
모든 것이 배포되고 프론트엔드에 접근할 수 있게 되면 다음 단계를 따르세요:
CowCloud\ec2py> python .\decypt_file.py 2e8cf87c-5389-11ec-abec-d6d1f378b18d
인프라를 배포하고 유지보수하는 담당자는 웹 앱을 통해 제공되는 최종 사용자 입력을 적절히 삭제하고 검증해야 합니다. 즉, ec2py/template.py의 코드가 OS 명령 주입에 취약하지 않도록 해야 합니다. 이 점은 시스템에서 가장 중요한 측면이므로 강조됩니다. 작업자 노드의 권한과 노출 범위를 제한하여 관련 위험을 줄이기 위해 특별한 주의를 기울였습니다. 그럼에도 불구하고 시스템 보안의 이 측면을 관리하는 것은 관리자의 책임입니다. EC2 인스턴스 프로필에 연결된 역할 정책은 Terraform 폴더 안의 readme.md 파일에 나열되어 있습니다
workers_manager.py라는 Lambda 함수가 있습니다. 이러한 작업은 누군가 EC2 프로필에 연결된 역할의 액세스 키를 손상시킬 경우의 위험을 제한하기 위해 Lambda 함수로 이동되었습니다. 그럼에도 불구하고 IMDSv2와 함께 작동합니다. Lambda 함수 workers_manager.py에 연결된 역할 정책은 Terraform 폴더 안의 readme.md 파일에 나열되어 있습니다작업이 실행되는 동안 stdout을 캡처하여 웹 인터페이스를 통해 표시하려면 ec2py/template.py로 이동하여 다음 단계를 따르세요:
extra_docker_params 변수에는 Docker 컨테이너가 stdout을 CloudWatch 로그 그룹으로 보내는 데 필요한 정보가 포함되어 있습니다. 프론트엔드를 통해 stdout을 보려면 명령줄에 이 변수를 포함해야 합니다.cmd = f"docker run {extra_docker_params} --rm -v {tmp_folder}target.txt:/root/Tools/reconftw/target.txt -v {tmp_folder}reconftw.cfg:/root/Tools/reconftw/reconftw.cfg -v {tmp_folder}Recon/:/root/Tools/reconftw/Recon/ six2dez/reconftw:main -l target.txt -w".split(' ')
간단한 명령 terraform destroy --auto-approve를 실행하여 인프라를 제거할 수 있습니다. 이 명령은 모든 기존 리소스를 제거합니다.
참고: 이 프로세스를 중단하지 마세요. 중단하면 일부 요소가 클라우드에 남아 있을 수 있으며, 이를 직접 식별하고 수동으로 제거해야 할 수 있습니다.


terraform destroy --auto-approve -target module.gateway_module.aws_api_gateway_deployment.lambdaterraform apply --auto-approve -target module.gateway_module| 변수 | 기본값 | 설명 |
|---|
eipenable | false | true인 경우 솔루션은 작업자 노드가 시작될 때 연결되는 탄력적 IP 주소 풀을 할당합니다. 예약할 EIP 수는 다음 공식을 사용하여 계산됩니다.sum([var.max_workers, var.maximum_number_of_terminating_machines]) |
cidr_whitelist | [] | 방화벽에서 특정 IP 범위만 허용하는 CIDR 화이트리스트. 예: ["195.95.131.0/24"] |
max_workers 및 max_queued_tasks_per_worker | max_workers: 3, max_queued_tasks_per_worker: 10 | 이 두 설정은 스케일 인(scale in) 또는 스케일 아웃(scale out) 시점을 결정합니다. 예: max_workers 3, max_queued_tasks_per_worker 10. 이는 작업 수가 10을 초과하면 새 EC2 인스턴스가 생성된다는 의미입니다. 작업이 20개를 초과하면 최대 3개의 EC2 인스턴스가 작업 부하를 분산하는 데 사용될 수 있습니다(이 스크립트 Terraform/dynamodb_module/autoscalingTool/autoscalingStrategy.py에 있는 알고리즘을 확인하세요). |
maximum_number_of_terminating_machines | 2 | 종료하도록 설정되었지만 프로세스/스캔이 작업을 완료할 때까지 보류되는 인스턴스의 수를 정의합니다. |
heartbeat_timeout | 900 | 작업자 노드가 보류되는 시간을 정의합니다. 이 시간이 만료되면 작업자 노드는 강제로 종료됩니다. |
instance_type | t2.micro | https://aws.amazon.com/ec2/instance-types/ |
ami | null | https://aws.amazon.com/es/amazon-linux-ami/ |
retention_time | 7 | 로그에 대한 보존 기간(일) 및 아카이브 테이블 항목(완료된 작업)의 만료를 설정합니다. |