
Cake Fuzzer es un proyecto diseñado para ayudar a descubrir vulnerabilidades de forma automática y continua en aplicaciones web creadas basadas en marcos específicos, con un número muy limitado de falsos positivos.
Última versión: 1.0
Licencia: GNU GPL v3.0
Cake Fuzzer es un proyecto diseñado para ayudar a descubrir vulnerabilidades de forma automática y continua en aplicaciones web creadas sobre frameworks específicos, con una tasa muy limitada de falsos positivos. Actualmente está implementado para dar soporte al framework Cake PHP.
Si deseas conocer más sobre el proceso de investigación, consulta esta serie de artículos: Investigación en Ciberseguridad de Aplicaciones CakePHP
A continuación se muestra una lista de algunos de los errores descubiertos por Cake Fuzzer:
| Título | Severidad | Enlace |
|---|---|---|
| Inyección SQL ciega en Cerebrate | 9.8 Crítico | https://zigrin.com/advisories/cerebrate-blind-sql-injection/ |
| Inyección SQL en el componente CRUD | 8.8 Alto | https://zigrin.com/advisories/misp-sql-injection-in-crud-component/ |
| XSS basado en DOM | 6.1 Medio | https://zigrin.com/advisories/misp-dom-based-xss/ |
| Inyección SQL ciega en el parámetro order | 8.8 Alto | https://zigrin.com/advisories/misp-blind-sql-injection-in-order-parameter/ |
| Inyección SQL ciega en parámetros de entrada tipo array | 8.8 Alto | https://zigrin.com/advisories/misp-blind-sql-injection-in-array-input-parameters/ |
| Inyección SQL basada en tiempo en /Logs/index | 7.2 Alto | https://zigrin.com/advisories/misp-time-based-sql-injection-in-logs-index/ |
Los enfoques típicos para descubrir vulnerabilidades mediante herramientas automatizadas en aplicaciones web son:
Ambos métodos tienen desventajas. SAST produce un alto porcentaje de falsos positivos: hallazgos que no son vulnerabilidades o no son explotables. DAST produce menos falsos positivos, pero descubre menos vulnerabilidades debido a la información limitada. También requiere cierto conocimiento de la aplicación y experiencia en seguridad por parte de la persona que ejecuta el escaneo, lo que a menudo implica una configuración de escaneo personalizada por aplicación para que funcione correctamente.
El proyecto Cake Fuzzer pretende combinar las ventajas de ambos enfoques y eliminar las desventajas mencionadas. Este enfoque se denomina Interactive Application Security Testing (IAST).
Los objetivos del proyecto son:
Nota: Algunas clases de vulnerabilidades no son el objetivo de Cake Fuzzer, por lo que no podrán ser detectadas. Ejemplos de estas clases son las vulnerabilidades de lógica de negocio y los problemas de control de acceso.

Drawio: Arquitectura de Cake Fuzzer
Cake Fuzzer consta de 3 servidores principales (bastante independientes) que en conjunto permiten realizar pruebas dinámicas de vulnerabilidades en aplicaciones CakePHP.
Otros componentes incluyen:
Cake Fuzzer se basa en el concepto de Interactive Application Security Testing (IAST). Contiene un conjunto predefinido de ataques que se modifican aleatoriamente antes de su ejecución. Cake Fuzzer tiene conocimiento de los aspectos internos de la aplicación gracias al framework Cake PHP, por lo que los ataques se lanzarán sobre todos los puntos de entrada posibles de la aplicación.
Durante el ataque, Cake Fuzzer monitorea varios aspectos de la aplicación y del sistema subyacente, como:
Estas fuentes de información permiten a Cake Fuzzer identificar más vulnerabilidades y reportarlas con mayor certeza.
La siguiente sección describe los pasos para configurar un entorno de desarrollo de Cake Fuzzer donde el objetivo es una versión antigua de MISP v2.4.146, vulnerable a CVE-2021-41326.
Ejecuta los siguientes comandos en tu sistema operativo anfitrión para descargar una MV de MISP desactualizada:
cd ~/Downloads # O donde quieras almacenar la MV de MISP
wget https://vm.misp-project.org/MISP_v2.4.146@0c25b72/[email protected] -O MISP.zip
unzip MISP.zip
rm MISP.zip
mv VMware/ MISP-2.4.146
Realiza las siguientes acciones en la interfaz gráfica de VMWare para preparar el uso compartido de los archivos de Cake Fuzzer entre tu SO anfitrión y MISP:
cake_fuzzer en la MV.Ejecuta los siguientes comandos en tu SO anfitrión (reemplaza MISP_IP_ADDRESS con la dirección IP anotada anteriormente):
ssh-copy-id misp@MISP_IP_ADDRESS
ssh misp@MISP_IP_ADDRESS
Una vez que te hayas conectado por SSH a MISP, ejecuta los siguientes comandos (en la terminal de MISP) para finalizar la configuración del uso compartido de archivos de Cake Fuzzer entre el SO anfitrión y MISP:
sudo apt update
sudo apt-get -y install open-vm-tools open-vm-tools-desktop
sudo apt-get -y install build-essential module-assistant linux-headers-virtual linux-image-virtual && sudo dpkg-reconfigure open-vm-tools
sudo mkdir /cake_fuzzer # Nota: Esta ruta es fija ya que está codificada en la instrumentación (uno de los parches)
sudo vmhgfs-fuse .host:/cake_fuzzer /cake_fuzzer -o allow_other -o uid=1000 -o max_write=61440
# max_write corrige un error extraño de copia de archivos: https://github.com/vmware/open-vm-tools/issues/437#issuecomment-669663891
ls -l /cake_fuzzer # Si todo salió bien, deberías ver el contenido del directorio de Cake Fuzzer desde tu SO anfitrión. Cualquier cambio en tu SO anfitrión se reflejará dentro de la MV y viceversa.
Prepara MISP para pruebas sencillas (en la terminal de MISP):
CAKE=/var/www/MISP/app/Console/cake
SUDO='sudo -H -u www-data'
$CAKE userInit -q
$SUDO $CAKE Admin setSetting "Security.password_policy_length" 1
$SUDO $CAKE Admin setSetting "Security.password_policy_complexity" '/.*/'
$SUDO $CAKE Password [email protected] admin --override_password_change
Finalmente, instala las dependencias de Cake Fuzzer y prepara el entorno virtual (en la terminal de MISP):
source /cake_fuzzer/precheck.sh
Cake Fuzzer escanea en busca de vulnerabilidades que se encuentran dentro de la carpeta /cake_fuzzer/strategies.
Para agregar un nuevo ataque, debemos añadir un nuevo archivo new-attack.json a la carpeta strategies.
Cada vulnerabilidad contiene 2 campos principales: Scenarios y Scanners. En Scenarios se almacenan las formas base de las cargas de ataque (payloads). Por otro lado, los Scanners detectan expresiones regulares o frases para la respuesta, salida estándar, salida de error, registros y resultados.
ScenariosPara crear un payload, primero debes comprender la vulnerabilidad y cómo detectarla con la menor cantidad posible de payloads.
Al construir el escenario, debes pensar en un payload lo más genérico posible. Sin embargo, cuanto más genérico sea el payload, mayores serán las posibilidades de que produzca falsos positivos.
Es preferible usar un valor "canary" como __cakefuzzer__new-attack_§CAKEFUZZER_PAYLOAD_GUID§__ en tus escenarios.
El valor canary contiene una cadena fija (por ejemplo, __cakefuzzer__new-attack_) y un identificador dinámico que será cambiado dinámicamente por el fuzzer (la parte GUID §CAKEFUZZER_PAYLOAD_GUID§). La primera parte del canary se utiliza para asegurar que el payload sea detectado por los Scanners. La segunda parte, el GUID, se traduce a un valor pseudoaleatorio en cada ejecución de tu payload. Así, cuando tu payload se inyecte en un parámetro usado por la aplicación, el canary cambiará a algo como: __cakefuzzer__new-attack_8383938__, donde 8383938 es único entre todos los demás ataques.
ScannersPara crear un scanner, primero debes entender cómo podría comportarse la aplicación cuando se activa la vulnerabilidad. Existen varios tipos de scanners que puedes usar, como response, stderr, logs, files y processes. Cada scanner sirve para un propósito diferente.
Por ejemplo, cuando construyes un scanner para un XSS, buscarás indicios de la vulnerabilidad en la respuesta HTML de la aplicación. Puedes usar el scanner ResultOutputScanner para buscar el valor canary y el payload. Por otro lado, las vulnerabilidades de inyección SQL podrían detectarse a través de los registros de errores. Para ello, puedes usar LogFilesContentsScanner y ResultErrorsScanner.
Scanner es generar una regex eficiente. Evita usar regex que coincidan con todos los casos como .* o .+. Son muy lentas y aumentan drásticamente el tiempo necesario para completar todo el escaneo.Como se mencionó, la eficiencia es una parte importante de las vulnerabilidades. Tanto Scenarios como Scanners deben incluir la menor cantidad posible de elementos. Esto se debe a que Cake Fuzzer ejecuta cada escenario en todas las rutas detectadas posibles múltiples veces. Por otro lado, todas las respuestas, nuevas entradas de registro, etc., son constantemente revisadas por los Scanners. Se detectarán muchos parámetros, rutas y endpoints, por lo que usar más payloads o Scanner afecta considerablemente la eficiencia.
Si no deseas escanear una clase de vulnerabilidad específica, elimina el archivo json correspondiente de la carpeta strategies, limpia la base de datos y vuelve a ejecutar el fuzzer.
Por ejemplo, si no deseas escanear tu aplicación en busca de vulnerabilidades de inyección SQL, sigue los siguientes pasos:
Primero, elimina los escenarios de ataque ya preparados. Para ello, borra todos los archivos dentro de la carpeta /cake_fuzzer/databases:
rm /cake_fuzzer/databases/*
Después, elimina el archivo sqlinj.json de la carpeta /cake_fuzzer/strategies:
rm /cake_fuzzer/strategies/sqlinj.json
Finalmente, vuelve a ejecutar el fuzzer y todos los procesos de cake_fuzzer en ejecución sin que se ejecute ningún ataque de inyección SQL.
git clone https://github.com/Zigrin-Security/CakeFuzzer /cake_fuzzer
Advertencia Cake Fuzzer no funcionará correctamente si se encuentra en una ruta diferente a
/cake_fuzzer. Ten en cuenta que debe colocarse en el directorio raíz del sistema de archivos, junto a/root,/tmp, etc.
cd /cake_fuzzer
Ingresa al entorno virtual si aún no lo has hecho:
source /cake_fuzzer/precheck.sh
O
source venv/bin/activate
cp config/config.example.ini config/config.ini
Configura config/config.ini:
WEBROOT_DIR="/var/www/html" # Ruta al directorio `webroot` de la aplicación bajo prueba
CONCURRENT_QUEUES=5 # [Opcional] Número de ataques ejecutados concurrentemente
ONLY_PATHS_WITH_PREFIX="/" # [Opcional] El fuzzer generará solo ataques para rutas que comiencen con este prefijo
EXCLUDE_PATHS="" # [Opcional] El fuzzer excluirá del escaneo todas las rutas que coincidan con esta expresión regular. Si está vacío, se procesarán todas las rutas
PAYLOAD_GUID_PHRASE="§CAKEFUZZER_PAYLOAD_GUID§" # [Opcional] Palabra clave interna que se sustituye justo antes del ataque con un ID de payload único
INSTRUMENTATION_INI="config/instrumentation_cake4.ini" # [Opcional] Ruta a instrumentaciones personalizadas de la aplicación.
Advertencia Durante el escaneo de Cake Fuzzer, se invocarán múltiples funcionalidades de tu aplicación de forma no controlada en varias ocasiones. Esto puede provocar conexiones a servicios externos a los que tu aplicación esté conectada, y la obtención o envío de datos hacia/desde ellos. Se recomienda encarecidamente ejecutar Cake Fuzzer en un entorno aislado y controlado, sin acceso a servicios externos sensibles.
Nota Cake Fuzzer evita el blackholing, las protecciones CSRF y la autorización. Envía todos los ataques con los privilegios del primer usuario en la base de datos. Se recomienda que este usuario tenga los permisos más altos.
La aplicación consta de varios componentes.
Advertencia Todos los comandos de cake_fuzzer deben ejecutarse como root.
Antes de iniciar el fuzzer, asegúrate de que tu aplicación objetivo esté completamente instrumentada:
python cake_fuzzer.py instrument check
Si hay algunos cambios sin aplicar, aplícalos con:
python cake_fuzzer.py instrument apply
Para ejecutar cake fuzzer, haz lo siguiente (se recomienda usar al menos 3 terminales separadas):
# Primera terminal
python cake_fuzzer.py run fuzzer # Genera ataques, los agrega a la COLA y registra nuevos SCANNERS (luego sale)
python cake_fuzzer.py run periodic_monitors # Responsable del monitoreo (usa CTRL+C para detener y salir al final del escaneo)
# Segunda terminal
python cake_fuzzer.py run iteration_monitors # Responsable del monitoreo (usa CTRL+C para detener y salir al final del escaneo)
# Tercera terminal
python cake_fuzzer.py run attack_queue # Inicia la COLA DE ATAQUES (usa CTRL+C para detener y salir al final del escaneo)
# Una vez que todos los ataques se hayan ejecutado
python cake_fuzzer.py run registry # Genera `results.json` basado en las vulnerabilidades encontradas
Nota: Actualmente existe un error que puede cambiar el propietario de los registros (o de cualquier otro archivo modificado dinámicamente de la aplicación web objetivo). Esto puede causar errores al usar la aplicación web normalmente o incluso falsos negativos en futuras ejecuciones de Cake Fuzzer. Para MISP, recomendamos ejecutar lo siguiente después de cada ejecución del fuzzer:
sudo chown -R www-data:www-data /var/www/MISP/app/tmp/logs/
Una vez que el escaneo termine, revierte la instrumentación:
python cake_fuzzer.py instrument revert
Para volver a ejecutar cake fuzzer, haz lo siguiente:
Elimina los registros de la aplicación (como ejemplo, los registros de MISP se almacenan en /var/www/MISP/app/tmp/logs)
rm /var/www/MISP/app/tmp/logs/*
Elimina todos los archivos dentro de la carpeta /cake_fuzzer/databases
rm /cake_fuzzer/databases/*
Elimina el archivo cake_fuzzer/results.json (primero no olvides guardar o examinar los resultados del escaneo anterior)
rm /cake_fuzzer/results.json
Finalmente, sigue el proceso de ejecución anterior nuevamente con 3 terminales
La cola de ataques marca los ataques ejecutados en la base de datos como 'ejecutados', por lo que para ejecutar todo el conjunto nuevamente debes eliminar la base de datos y agregar los ataques de nuevo.
Asegúrate de detener los monitores y las colas de ataques antes de eliminar la base de datos.
rm database.db*
python cake_fuzzer.py run fuzzer
python cake_fuzzer.py run attack_queue
Esto probablemente se deba a que los archivos de registro anteriores fueron sobrescritos por root. Cake Fuzzer opera como root, por lo que los nuevos archivos de registro se crearán con root como propietario. Elimínalos:
chmod -R a+w /var/www/MISP/app/tmp/logs/*
Si usas una MV con el directorio compartido de cake fuzzer con tu máquina anfitriona, asegúrate de que el directorio anfitrión esté correctamente montado en la MV invitada:
sudo vmhgfs-fuse .host:/cake_fuzzer /cake_fuzzer -o allow_other -o uid=1000
Cake Fuzzer debe ubicarse en el directorio raíz de la máquina y el nombre del directorio base debe ser específicamente cake_fuzzer.
mv CakeFuzzer/ /cake_fuzzer
instrument applyEl proceso de instrumentación es parte del flujo de ejecución de Cake Fuzzer. Cuando ejecutas instrument apply seguido de instrument check, ambos comandos deberían dar como resultado el mismo número de cambios.
Si recibes algún error de "patch", puedes aplicar los parches manualmente y eliminar el archivo de parche problemático. Los parches se encuentran en el directorio /cake_fuzzer/cakefuzzer/instrumentation/patches.
Si durante la instalación o ejecución tienes un error de dependencia de Python, instala las dependencias manualmente después de cambiar al entorno virtual.
Primero cambia al entorno virtual
source venv/bin/activate
Después puedes instalar las dependencias con pip3.
pip3 install -r requirements.txt
Este proyecto se inspiró en:
Este proyecto fue encargado por: