Un proyecto de código abierto en Golang para evaluar diferentes herramientas de seguridad de API y WAF para la lógica de detección y evasiones
GoTestWAF es una herramienta para la simulación de ataques a API y OWASP que soporta una amplia variedad de protocolos de API, incluyendo REST, GraphQL, gRPC, SOAP, XMLRPC, y otros.
Fue diseñada para evaluar soluciones de seguridad de aplicaciones web, como proxies de seguridad de API, Web Application Firewalls, IPS, gateways de API, y otros.
GoTestWAF genera solicitudes maliciosas utilizando payloads codificados colocados en diferentes partes de las solicitudes HTTP: su cuerpo, cabeceras, parámetros de URL, etc. Las solicitudes generadas se envían a la URL de la solución de seguridad de aplicaciones especificada durante el lanzamiento de GoTestWAF. Los resultados de la evaluación de la solución de seguridad se registran en el archivo de informe creado en tu máquina.
Las condiciones predeterminadas para la generación de solicitudes se definen en la carpeta testcases en los archivos YAML con el siguiente formato:```yaml
payload:
* `payload` es una muestra de ataque maliciosa (por ejemplo, un payload XSS como ```<script>alert(111)</script>``` o algo más sofisticado).
Dado que el formato de la cadena YAML es requerido para los payloads, estos deben ser [codificados como datos binarios](https://yaml.org/type/binary.html).
* `encoder` es un codificador que se aplicará al payload antes de colocarlo en la solicitud HTTP. Los codificadores posibles son:
* Base64
* Base64Flat
* JSUnicode
* URL
* Plain (para mantener la cadena del payload tal cual)
* XML Entity
* `placeholder` es un lugar dentro de la solicitud HTTP donde debe ir el payload codificado. Los placeholders posibles son:
* gRPC
* Header
* UserAgent
* RequestBody
* JSONRequest
* JSONBody
* HTMLForm
* HTMLMultipartForm
* SOAPBody
* XMLBody
* URLParam
* URLPath
* RawRequest
El placeholder `RawRequest` te permitirá realizar una solicitud HTTP arbitraria. El payload se sustituye reemplazando la cadena `{{payload}}` en la ruta de la URL, los encabezados o el cuerpo. Campos del placeholder `RawRequest`:
* `method`
* `path`
* `headers`
* `body`
Campos requeridos para el placeholder `RawRequest`:
* campo `method`
Ejemplo:
```yaml
payload:
- test
encoder:
- Plain
placeholder:
- RawRequest:
method: "POST"
path: "/"
headers:
Content-Type: "multipart/form-data; boundary=boundary"
body: |
--boundary
Content-disposition: form-data; name="field1"
Test
--boundary
Content-disposition: form-data; name="field2"
Content-Type: text/plain; charset=utf-7
Knock knock.
{{payload}}
--boundary--
type: RawRequest test
```
* `type` es un nombre de todo el grupo de payloads en el archivo. Puede ser arbitrario, pero debe reflejar el tipo de ataques en el archivo.
La generación de solicitudes es un proceso de tres pasos que implica la multiplicación de la cantidad de payloads por las cantidades de encoders y placeholders.
Supongamos que definiste 2 **payloads**, 3 **encoders** (Base64, JSUnicode y URL) y 1 **placeholder** (URLParameter - parámetro HTTP GET).
En este caso, GoTestWAF enviará 2x3x1 = 6 solicitudes en un caso de prueba.
Durante el lanzamiento de GoTestWAF, también puedes elegir casos de prueba entre dos integrados: OWASP Top-10, OWASP-API,
o los tuyos propios (usando la [opción de configuración](#configuration-options) `testCasePath`).
## Requisitos
* GoTestwaf soporta todos los sistemas operativos populares (Linux, Windows, macOS), y puede compilarse de forma nativa
si [Go](https://golang.org/doc/install) está instalado en el sistema. Si quieres ejecutar GoTestWaf de forma nativa,
asegúrate de tener el navegador web Chrome para poder generar informes PDF. En caso de que no tengas Chrome,
puedes crear un informe en formato HTML.
* Si ejecutas GoTestWAF como contenedor Docker, por favor asegúrate de tener [Docker instalado y configurado](https://docs.docker.com/get-docker/),
y que GoTestWAF y la solución de seguridad de aplicaciones evaluada estén conectados a la misma [red Docker](https://docs.docker.com/network/).
* Para que GoTestWAF se inicie correctamente, por favor asegúrate de que la dirección IP de la máquina que ejecuta GoTestWAF esté en la lista blanca
en la máquina que ejecuta la solución de seguridad de aplicaciones.
## Inicio rápido con Docker
Los pasos a continuación describen cómo descargar e iniciar GoTestWAF con una configuración mínima en Docker.
1. Descarga la [imagen de GoTestWAF](https://hub.docker.com/r/wallarm/gotestwaf) desde Docker Hub:
```
docker pull wallarm/gotestwaf
```
2. Inicia la imagen de GoTestWAF:
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL>
```
Si es necesario, puedes reemplazar `${PWD}/reports` con la ruta a otra carpeta utilizada para colocar el informe de evaluación.
Si no quieres enviar opcionalmente el informe por correo electrónico, simplemente presiona Enter después de que aparezca el mensaje de solicitud de correo electrónico, o puedes usar --noEmailReport para omitir el mensaje:
```sh
docker run --rm --network="host" -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL> --noEmailReport
```
Si la herramienta de seguridad evaluada está disponible externamente, puedes omitir la opción `--network="host"`. Esta opción habilita la interacción de contenedores Docker que se ejecutan en 127.0.0.1.
Para realizar las pruebas de gRPC debes tener un endpoint en funcionamiento y usar la opción cli --grpcPort <port>.
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --grpcPort 9000 --url=http://my.grpc.endpoint
```
3. Revisa tu correo electrónico para ver el informe.
Has evaluado con éxito tu solución de seguridad de aplicaciones usando GoTestWAF con una configuración mínima.
Para conocer opciones de configuración avanzadas, por favor usa este [enlace](#configuration-options).
## Comprobación de los resultados de la evaluación