CowCloud 最初是为了以分布式方式运行侦察工具和漏洞扫描而创建的;例如,一个用例可能是由漏洞赏金猎人使用。该解决方案旨在让最终用户不必了解在 AWS 中分发工作负载所需的底层工作。CowCloud 为用户提供了一个友好的 Web 界面来查看和创建新任务,这些任务随后由运行在工作节点(EC2 实例)上的 Python 代码消费。预期 Python 代码以及 EC2 AMI 都将被定制。
例如,假设您想要运行 Nmap 扫描。在这种情况下,您只需从 AMI 目录中选择一个 AMI,并更新 Terraform/ec2_module/ec2_module.tf 中的 image_id 字段。然后,需要更新文件 ec2py/template.py 以自定义 Nmap 扫描的参数(-Pn、-p 443 等)。最后,需要更新 Terraform/ec2_module/ec2_module.tf 配置文件中的 user_data 字段,以安装 Nmap 及其依赖项。
另一种选择是安装并运行多个商业工具,在这种情况下,您可能需要创建自己的 EC2 实例或快照。在这种情况下,您将安装所有依赖项并激活许可证,以便可以将此 AMI 用作工作节点的黄金镜像。

CowCloud 可以拆分为三个主要组件:
以下是关键特性:
autoscalingStrategy.py 中找到)retention_time 过期后删除 CloudWatch 日志组template.py 文件中的 extra_docker_params 变量(这在下面的“管理员/维护者”部分中进行了说明)
执行 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 可以是您的黄金 AMI,也可以是 EC2 目录中的 AMIaws 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
负责部署和维护基础设施的人员必须适当地清理和验证用户通过 Web 应用提供的输入。换句话说,确保 ec2py/template.py 中的代码不容易受到 OS 命令注入的影响。
这一点之所以被强调,是因为它是系统最关键的一个方面。已经特别小心地限制了工作节点的权限和暴露范围,以降低相关风险。尽管如此,管理员仍有责任处理系统安全的这一方面。
附加到 EC2 实例配置文件的角色策略在 Terraform 文件夹内的 readme.md 文件中列出
workers_manager.py 的 Lambda 函数,由 ec2py 工具调用以执行更特权的操作。这些操作被移到 Lambda 函数中,以防有人破坏了附加到 EC2 配置文件的角色的访问密钥,从而限制风险。不过,它仍然使用 IMDSv2 工作。
附加到 Lambda 函数 workers_manager.py 的角色策略在 Terraform 文件夹内的 readme.md 文件中列出如果您想在任务执行期间捕获 stdout 并通过 Web 界面显示,请转到 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| variable | default value | description |
|---|
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 and max_queued_tasks_per_worker | max_workers: 3, max_queued_tasks_per_worker: 10 | 这两个设置决定何时扩缩容,例如 max_workers 3、max_queued_tasks_per_worker 10。这意味着如果任务数量超过十个,将创建一个新的 EC2 实例。如果任务超过二十个,最多将有三个 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 | 设置日志的保留时间(天)以及归档表条目(已完成任务)的过期时间。 |