
Solución serverless de AWS para distribuir cargas de trabajo de reconocimiento y escaneo de vulnerabilidades. Envía tareas a través de la interfaz web; los workers de EC2 ejecutan scripts de Python personalizados con herramientas como Nmap.
CowCloud se creó originalmente para ejecutar herramientas de reconocimiento y escaneos de vulnerabilidades de forma distribuida; por ejemplo, un caso de uso podría ser el de los cazadores de recompensas por vulnerabilidades (bug bounty). Esta solución pretende abstraer a los usuarios finales del trabajo subyacente necesario para distribuir cargas de trabajo en AWS. CowCloud proporciona a los usuarios una interfaz web amigable para ver y crear nuevas tareas que posteriormente son consumidas por código Python que se ejecuta en los nodos trabajadores (instancias EC2). Se pretende que tanto el código Python como las AMIs de EC2 sean personalizados.
Como ejemplo, supongamos que quieres ejecutar escaneos con Nmap. En ese caso, puedes simplemente elegir una AMI del Catálogo de AMIs y actualizar el campo image_id en Terraform/ec2_module/ec2_module.tf. Después, habría que actualizar el archivo ec2py/template.py para personalizar los argumentos del escaneo con Nmap (-Pn, -p 443, etc.). Por último, habría que actualizar el campo user_data en el archivo de configuración Terraform/ec2_module/ec2_module.tf para instalar Nmap y sus dependencias.
Otra opción es instalar y ejecutar varias herramientas comerciales; en ese caso, es posible que quieras crear tu propia instancia EC2 o snapshot. En este caso, instalarías todas las dependencias y activarías las licencias para poder usar esa AMI como imagen dorada (gold image) para tus trabajadores

CowCloud se puede dividir en tres componentes principales:
Estas son las características clave:
autoscalingStrategy.py)retention_time
Como resultado de ejecutar Terraform, se crea un nuevo archivo (config.js); este contiene la configuración necesaria para que la aplicación React JS se autentique contra el directorio del grupo de usuarios de Cognito. Después de haber desplegado la infraestructura, tienes que compilar la aplicación React y subir la carpeta build. Además, tienes que subir el código Python a un bucket de S3 que actúe como repositorio de código. Este proceso se ha automatizado en dos scripts setup.bat y setup.sh, por lo que no tienes que preocuparte por ello; esto es solo para resumir esta etapa.
La infraestructura se despliega en la región us-east-1 por defecto, aunque esto se puede cambiar en el archivo locals.tf dentro de la carpeta Terraform.
Pasos:
variables.tf; la variable ami debe apuntar a una AMI EC2 existente, que podría ser tu AMI dorada o una del Catálogo EC2aws configure. Comprueba que lo has configurado correctamente ejecutando este comando: aws sts get-caller-identity; cuando esté bien configurado, no debería devolver un erroraws 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
¡Ya estás listo! ¡Regístrate, inicia sesión y crea una nueva tarea!
Una vez que todo está desplegado y el front-end es accesible, debes seguir estos pasos:
CowCloud\ec2py> python .\decypt_file.py 2e8cf87c-5389-11ec-abec-d6d1f378b18d
La persona encargada de desplegar la infraestructura y mantenerla debe sanear y validar adecuadamente las entradas de los usuarios finales proporcionadas a través de la webapp. En otras palabras, asegurarse de que el código en ec2py/template.py no sea vulnerable a la inyección de comandos del sistema operativo.
Este punto se destaca porque es el aspecto más crítico del sistema. Se ha puesto especial cuidado en limitar el alcance de los permisos y la exposición del trabajador para reducir los riesgos asociados. No obstante, es responsabilidad del administrador cuidar este aspecto de la seguridad del sistema.
Las políticas de rol adjuntas al perfil de las instancias EC2 se enumeran en el archivo readme.md dentro de la carpeta Terraform
workers_manager.py a la que llama la herramienta ec2py para realizar acciones más privilegiadas. Estas acciones se trasladaron a una función Lambda para limitar el riesgo en caso de que alguien comprometiera la clave de acceso del rol adjunto al perfil EC2. No obstante, funciona con IMDSv2.
Las políticas de rol adjuntas a la función Lambda workers_manager.py se enumeran en el archivo readme.md dentro de la carpeta TerraformSi quieres capturar el stdout y mostrarlo a través de la interfaz web mientras la tarea se está ejecutando, ve a ec2py/template.py y sigue estos pasos:
extra_docker_params incluye la información necesaria para que tus contenedores Docker envíen el stdout a los grupos de registros de CloudWatch. Tendrás que incluir esta variable en la línea de comandos cuando quieras ver el stdout a través del front-end.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(' ')
Puedes destruir la infraestructura ejecutando este sencillo comando: terraform destroy --auto-approve; esto eliminará todos los recursos existentes.
Nota: no interrumpas este proceso, ya que podría dejar algunos elementos residuales en la nube que luego tendrías que identificar y eliminar manualmente.


terraform destroy --auto-approve -target module.gateway_module.aws_api_gateway_deployment.lambdaterraform apply --auto-approve -target module.gateway_moduleextra_docker_params en el archivo template.py (esto se explica en la sección Administrador/mantenedor más abajo)| variable | valor por defecto | descripción |
|---|
eipenable | false | Si es true, la solución asigna un pool de direcciones IP elásticas asociadas a los nodos trabajadores a medida que se crean. El número de EIP a reservar se calcula con esta fórmulasum([var.max_workers, var.maximum_number_of_terminating_machines]) |
cidr_whitelist | [] | La lista blanca CIDR para permitir solo ciertos rangos de IP en el firewall. P. ej. ["195.95.131.0/24"] |
max_workers y max_queued_tasks_per_worker | max_workers: 3, max_queued_tasks_per_worker: 10 | Estos dos ajustes determinan cuándo escalar hacia dentro o hacia fuera, p. ej., max_workers 3, max_queued_tasks_per_worker 10. Esto significa que si el número de tareas supera las diez, se creará una nueva instancia EC2. Si hay más de veinte tareas, habrá un máximo de tres instancias EC2 disponibles para distribuir las cargas de trabajo (consulta el algoritmo presente en este script Terraform/dynamodb_module/autoscalingTool/autoscalingStrategy.py). |
maximum_number_of_terminating_machines | 2 | Define el número de instancias que están configuradas para terminarse pero que quedan en espera hasta que el proceso/escaneo complete la tarea. |
heartbeat_timeout | 900 | Define el tiempo que esos trabajadores permanecen en espera. Cuando este tiempo expira, el trabajador se termina de forma forzosa. |
instance_type | t2.micro | https://aws.amazon.com/ec2/instance-types/ |
ami | null | https://aws.amazon.com/es/amazon-linux-ami/ |
retention_time | 7 | Establece el tiempo de retención (en días) para los registros y la expiración de los elementos de la tabla de archivo (tareas completadas). |