
Cake Fuzzer é um projeto que visa ajudar a descobrir automaticamente e continuamente vulnerabilidades em aplicações web criadas com base em frameworks específicos, com falsos positivos muito limitados.
Último lançamento: 1.0
Licença: GNU GPL v3.0
Cake Fuzzer é um projeto que tem como objetivo ajudar a descobrir vulnerabilidades de forma automática e contínua em aplicações web criadas com base em frameworks específicos, com um número muito limitado de falsos positivos. Atualmente, está implementado para suportar o framework Cake PHP.
Se quiser saber mais sobre o processo de pesquisa, veja esta série de artigos: Pesquisa em Cibersegurança de Aplicações CakePHP
Abaixo está uma lista de alguns dos bugs descobertos pelo Cake Fuzzer:
| Título | Gravidade | Link |
|---|---|---|
| Injeção SQL cega no Cerebrate | 9.8 Crítico | https://zigrin.com/advisories/cerebrate-blind-sql-injection/ |
| Injeção SQL no componente CRUD | 8.8 Alto | https://zigrin.com/advisories/misp-sql-injection-in-crud-component/ |
| XSS baseado em DOM | 6.1 Médio | https://zigrin.com/advisories/misp-dom-based-xss/ |
| Injeção SQL cega no parâmetro order | 8.8 Alto | https://zigrin.com/advisories/misp-blind-sql-injection-in-order-parameter/ |
| Injeção SQL cega em parâmetros de entrada de array | 8.8 Alto | https://zigrin.com/advisories/misp-blind-sql-injection-in-array-input-parameters/ |
| Injeção SQL baseada em tempo em /Logs/index | 7.2 Alto | https://zigrin.com/advisories/misp-time-based-sql-injection-in-logs-index/ |
As abordagens típicas para descobrir vulnerabilidades usando ferramentas automatizadas em aplicações web são:
Ambos os métodos têm desvantagens. O SAST resulta numa elevada percentagem de falsos positivos – achados que ou não são vulnerabilidades ou não são vulnerabilidades exploráveis. O DAST resulta em menos falsos positivos, mas descobre menos vulnerabilidades devido à informação limitada. Também requer algum conhecimento sobre a aplicação e uma base de segurança da pessoa que executa a análise. Isto muitas vezes vem com uma configuração de análise personalizada por aplicação para funcionar corretamente.
O projeto Cake Fuzzer pretende combinar as vantagens de ambas as abordagens e eliminar as desvantagens mencionadas. Esta abordagem é chamada de Teste de Segurança Interativo de Aplicações (IAST).
Os objetivos do projeto são:
Nota: Algumas classes de vulnerabilidades não são alvo do Cake Fuzzer, portanto o Cake Fuzzer não será capaz de as detetar. Exemplos dessas classes são vulnerabilidades de lógica de negócio e problemas de controlo de acesso.

Drawio: Arquitetura do Cake Fuzzer
O Cake Fuzzer consiste em 3 servidores principais (razoavelmente independentes) que, no total, permitem testes dinâmicos de vulnerabilidades em aplicações CakePHP.
Outros componentes incluem:
O Cake Fuzzer baseia-se no conceito de Teste de Segurança Interativo de Aplicações (IAST). Contém um conjunto predefinido de ataques que são modificados aleatoriamente antes da execução. O Cake Fuzzer tem conhecimento dos internos da aplicação graças ao framework Cake PHP, portanto os ataques serão lançados em todos os pontos de entrada possíveis da aplicação.
Durante o ataque, o Cake Fuzzer monitoriza vários aspetos da aplicação e do sistema subjacente, tais como:
Estas fontes de informação permitem que o Cake Fuzzer identifique mais vulnerabilidades e as reporte com maior certeza.
A secção seguinte descreve os passos para configurar um ambiente de desenvolvimento do Cake Fuzzer onde o alvo é o MISP desatualizado v2.4.146, vulnerável ao CVE-2021-41326.
Execute os seguintes comandos no seu sistema operativo anfitrião para descarregar uma VM MISP desatualizada:
cd ~/Downloads # Ou onde quiser armazenar a VM 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
Execute as seguintes ações na GUI do VMWare para preparar a partilha de ficheiros do Cake Fuzzer entre o seu SO anfitrião e o MISP:
Execute os seguintes comandos no seu SO anfitrião (substitua MISP_IP_ADDRESS pelo endereço IP anotado anteriormente):
ssh-copy-id misp@MISP_IP_ADDRESS
ssh misp@MISP_IP_ADDRESS
Assim que fizer SSH para o MISP, execute os seguintes comandos (no terminal MISP) para finalizar a configuração da partilha de ficheiros do Cake Fuzzer entre o SO anfitrião e o 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: Este caminho é fixo pois está hardcoded na instrumentação (um dos patches)
sudo vmhgfs-fuse .host:/cake_fuzzer /cake_fuzzer -o allow_other -o uid=1000 -o max_write=61440
# max_write corrige um bug estranho de cópia de ficheiros: https://github.com/vmware/open-vm-tools/issues/437#issuecomment-669663891
ls -l /cake_fuzzer # Se tudo correu bem, deve ver o conteúdo do diretório Cake Fuzzer do seu SO anfitrião. Quaisquer alterações no SO anfitrião serão refletidas dentro da VM e vice-versa.
Prepare o MISP para testes simples (no terminal 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, instale as dependências do Cake Fuzzer e prepare o venv (no terminal MISP):
source /cake_fuzzer/precheck.sh
O Cake Fuzzer procura vulnerabilidades que estão dentro da pasta /cake_fuzzer/strategies.
Para adicionar um novo ataque, precisamos de adicionar um novo ficheiro new-attack.json à pasta strategies.
Cada vulnerabilidade contém 2 campos principais: Scenarios e Scanners. Os cenários onde as formas base das cargas de ataque são armazenadas. Os scanners, por outro lado, detetam expressões regulares ou frases para resposta, stdout, stderr, logs e resultados.
ScenariosPara criar uma carga, primeiro precisa de compreender a vulnerabilidade e como detetá-la com o menor número possível de cargas.
Ao construir o cenário, deve pensar na carga mais genérica possível. No entanto, quanto mais genérica for a carga, maiores são as hipóteses de produzir falsos positivos.
É preferível usar um valor canário como __cakefuzzer__new-attack_§CAKEFUZZER_PAYLOAD_GUID§__ nos seus cenários.
O valor canário contém uma string fixa (por exemplo: __cakefuzzer__new-attack_) e um identificador dinâmico que será alterado dinamicamente pelo fuzzer (parte GUID §CAKEFUZZER_PAYLOAD_GUID§). A primeira parte do canário é usada para garantir que a carga é detetada pelos Scanners. A segunda parte do canário, o GUID, é traduzida para um valor pseudoaleatório em cada execução da sua carga. Portanto, sempre que a sua carga for injetada num parâmetro usado pela aplicação, o canário será alterado para algo como: __cakefuzzer__new-attack_8383938__, onde o 8383938 é único entre todos os outros ataques.
ScannersPara criar um scanner, primeiro precisa de entender como a aplicação pode comportar-se quando a vulnerabilidade é acionada. Existem alguns tipos de scanner que pode usar, como response, stderr, logs, files e processes. Cada scanner serve um propósito diferente.
Por exemplo, ao construir um scanner para um XSS, irá procurar indícios da vulnerabilidade na resposta HTML da aplicação. Pode usar o scanner ResultOutputScanner para procurar o valor canário e a carga. Por outro lado, vulnerabilidades de Injeção SQL podem ser detetadas através de logs de erro. Para esse propósito, pode usar o LogFilesContentsScanner e o ResultErrorsScanner.
Scanner é gerar uma regex eficiente. Evite usar regex que correspondam a todos os casos .* ou .+. São muito demoradas e aumentam drasticamente o tempo necessário para concluir toda a análise.Como mencionado, a eficiência é uma parte importante das vulnerabilidades. Tanto os Scenarios como os Scanners devem incluir o menor número possível de elementos. Isto porque o Cake Fuzzer executa cada cenário individual em todos os caminhos detetados possíveis várias vezes. Por outro lado, todas as respostas, novas entradas de log, etc., são constantemente verificadas pelos Scanners. Haverá muitos parâmetros, caminhos e endpoints detetados, portanto usar mais cargas ou Scanner afeta bastante a eficiência.
Se não quiser analisar uma classe específica de vulnerabilidade, remova o ficheiro json especificado da pasta strategies, limpe a base de dados e execute o fuzzer novamente.
Por exemplo, se não quiser analisar a sua aplicação quanto a vulnerabilidades de Injeção SQL, siga os seguintes passos:
Primeiro, remova os cenários de ataque já preparados. Para isso, apague todos os ficheiros dentro da pasta /cake_fuzzer/databases:
rm /cake_fuzzer/databases/*
Depois disso, remova o ficheiro sqlinj.json da pasta /cake_fuzzer/strategies:
rm /cake_fuzzer/strategies/sqlinj.json
Finalmente, reexecute o fuzzer e todos os processos do cake_fuzzer em execução sem qualquer ataque de Injeção SQL executado.
git clone https://github.com/Zigrin-Security/CakeFuzzer /cake_fuzzer
Aviso O Cake Fuzzer não funcionará corretamente se estiver num caminho diferente de
/cake_fuzzer. Tenha em mente que deve ser colocado sob o diretório raiz do sistema de ficheiros, ao lado de/root,/tmp, etc.
cd /cake_fuzzer
Entre no ambiente virtual se ainda não estiver:
source /cake_fuzzer/precheck.sh
OU
source venv/bin/activate
cp config/config.example.ini config/config.ini
Configure config/config.ini:
WEBROOT_DIR="/var/www/html" # Caminho para o diretório `webroot` da aplicação testada
CONCURRENT_QUEUES=5 # [Opcional] Número de ataques executados simultaneamente de cada vez
ONLY_PATHS_WITH_PREFIX="/" # [Opcional] O Fuzzer gerará apenas ataques para caminhos que começam com este prefixo
EXCLUDE_PATHS="" # [Opcional] O Fuzzer excluirá da análise todos os caminhos que correspondam a esta expressão regular. Se estiver vazio, todos os caminhos serão processados
PAYLOAD_GUID_PHRASE="§CAKEFUZZER_PAYLOAD_GUID§" # [Opcional] Palavra-chave interna que é substituída imediatamente antes do ataque pelo ID único da carga
INSTRUMENTATION_INI="config/instrumentation_cake4.ini" # [Opcional] Caminho para instrumentações personalizadas da aplicação.
Aviso Durante a análise do Cake Fuzzer, múltiplas funcionalidades da sua aplicação serão invocadas de forma não controlada várias vezes. Isto pode resultar em conexões a serviços externos aos quais a sua aplicação está ligada, e na obtenção ou envio de dados de/para esses serviços. É altamente recomendável executar o Cake Fuzzer num ambiente isolado e controlado, sem acesso a serviços externos sensíveis.
Nota O Cake Fuzzer contorna blackholing, proteções CSRF e autorização. Envia todos os ataques com os privilégios do primeiro utilizador na base de dados. É recomendado que este utilizador tenha as permissões mais altas.
A aplicação consiste em vários componentes.
Aviso Todos os comandos cake_fuzzer devem ser executados como root.
Antes de iniciar o fuzzer, certifique-se de que a sua aplicação alvo está totalmente instrumentada:
python cake_fuzzer.py instrument check
Se houver algumas alterações não aplicadas, aplique-as com:
python cake_fuzzer.py instrument apply
Para executar o cake fuzzer, faça o seguinte (recomenda-se usar pelo menos 3 terminais separados):
# Primeiro Terminal
python cake_fuzzer.py run fuzzer # Gera ataques, adiciona-os à FILA e regista novos SCANNERS (depois sai)
python cake_fuzzer.py run periodic_monitors # Responsável pela monitorização (use CTRL+C para parar e sair no final da análise)
# Segundo terminal
python cake_fuzzer.py run iteration_monitors # Responsável pela monitorização (use CTRL+C para parar e sair no final da análise)
# Terceiro terminal
python cake_fuzzer.py run attack_queue # Inicia a FILA DE ATAQUES (use CTRL+C para parar e sair no final da análise)
# Após todos os ataques serem executados
python cake_fuzzer.py run registry # Gera `results.json` com base nas vulnerabilidades encontradas
Nota: Atualmente existe um bug que pode alterar o proprietário dos logs (ou de quaisquer outros ficheiros alterados dinamicamente da aplicação web alvo). Isto pode causar erros ao usar a aplicação web normalmente ou até falsos negativos em execuções futuras do Cake Fuzzer. Para o MISP, recomendamos executar o seguinte após cada execução do fuzzer:
sudo chown -R www-data:www-data /var/www/MISP/app/tmp/logs/
Assim que a sua análise terminar, reverta a instrumentação:
python cake_fuzzer.py instrument revert
Para executar o cake fuzzer novamente, faça o seguinte:
Apague os Logs da Aplicação (como exemplo, para o MISP os logs estão armazenados em /var/www/MISP/app/tmp/logs)
rm /var/www/MISP/app/tmp/logs/*
Apague Todos os Ficheiros Dentro da Pasta /cake_fuzzer/databases
rm /cake_fuzzer/databases/*
Apague o ficheiro cake_fuzzer/results.json (Primeiro não se esqueça de guardar ou examinar os resultados da análise anterior)
rm /cake_fuzzer/results.json
Finalmente, siga novamente o processo de execução anterior com 3 terminais
A fila de ataques marca os ataques executados na base de dados como 'executados', portanto, para executar todo o conjunto novamente, precisa de remover a base de dados e adicionar os ataques novamente.
Certifique-se de parar os monitores e as filas de ataques antes de remover a base de dados.
rm database.db*
python cake_fuzzer.py run fuzzer
python cake_fuzzer.py run attack_queue
Isto é provavelmente devido ao facto de os ficheiros de log anteriores terem sido sobrescritos pelo root. O Cake Fuzzer opera como root, portanto novos ficheiros de log serão criados com o root como proprietário. Remova-os:
chmod -R a+w /var/www/MISP/app/tmp/logs/*
Se usar uma VM com partilha do cake fuzzer com a sua máquina anfitriã, certifique-se de que o diretório anfitrião está devidamente ligado à VM convidada:
sudo vmhgfs-fuse .host:/cake_fuzzer /cake_fuzzer -o allow_other -o uid=1000
O Cake Fuzzer deve estar localizado sob o diretório raiz da máquina e o nome do diretório base deve ser especificamente cake_fuzzer.
mv CakeFuzzer/ /cake_fuzzer
instrument applyO processo de instrumentação é uma parte do fluxo de execução do Cake Fuzzer. Quando executa instrument apply seguido de instrument check, ambos os comandos devem resultar no mesmo número de alterações.
Se obtiver algum erro de "patch", pode aplicar os patches manualmente e eliminar o ficheiro de patch problemático. Os patches estão localizados sob o diretório /cake_fuzzer/cakefuzzer/instrumentation/patches.
Ao instalar ou executar, se tiver um erro de dependência do Python, instale manualmente as dependências após mudar para o ambiente virtual.
Primeiro, mude para o ambiente virtual
source venv/bin/activate
Depois, pode instalar as dependências com pip3.
pip3 install -r requirements.txt
Este projeto foi inspirado por:
Este projeto foi encomendado por: