
PyJFuzz - Fuzzer JSON em Python

PyJFuzz é um framework pequeno, extensível e pronto para uso utilizado para fuzzar entradas JSON, como endpoints REST API de dispositivos móveis, implementações JSON, navegadores, executáveis de linha de comando e muito mais.
| Versão | 1.1.0 |
|---|---|
| Homepage | http://www.mseclab.com/ |
| Github | https://github.com/mseclab/PyJFuzz |
| Autor | Daniele Linguaglossa (@dzonerzy) |
| Licença | MIT - (veja o arquivo LICENSE) |
Dependências
Para funcionar, o PyJFuzz precisa de algumas dependências: bottle, netifaces, GitPython e gramfuzz. Você pode instalá-las através da instalação automática do setup.py.
Instalação
Você pode instalar o PyJFuzz com o seguinte comando:
git clone https://github.com/mseclab/PyJFuzz.git && cd PyJFuzz && sudo python setup.py install
Ferramenta CLI
Após a instalação, o PyJFuzz criará tanto uma biblioteca Python quanto um utilitário de linha de comando chamado pjf (captura de tela abaixo)
Biblioteca
PyJFuzz também pode funcionar como uma biblioteca. Você pode importá-la em seu projeto da seguinte forma:
from pyjfuzz.lib import *
Classes
Os objetos/classes disponíveis são os seguintes:
Exemplos
Abaixo alguns exemplos triviais de como implementar um programa alimentado pelo PyJFuzz:
simple_fuzzer.py
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6))
fuzzer = PJFFactory(config)
while True:
print fuzzer.fuzzed
custom_techniques.py
from argparse import Namespace
from pyjfuzz.lib import *
# Techniques may be defined by group , or by technique number
# groups are CHTPRSX , to understand what they are , please run pyjfuzz with -h switch or look at the command line screenshot
# This below will initalizate a config object which use only the P group attacks where P stay for Path Traversal
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, techniques="P"))
# once a config object is defined you can access to config.techniques to view the selected techniques for your group
print("Techniques IDs: {0}".format(str(config.techniques)))
# you can eventually modify them!
config.techniques = [2]
# This way only attack number 2 (LFI Attack) will be performed!
fuzzer = PJFFactory(config)
while True:
print fuzzer.fuzzed
simple_server.py
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, debug=True, indent=True))
PJFServer(config).run()
Às vezes você pode precisar modificar configurações padrão não personalizáveis, como a porta do servidor HTTPS ou HTTP. Isso pode ser feito da seguinte maneira:
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, indent=True))
print config.ports["servers"]["HTTP_PORT"] # 8080
print config.ports["servers"]["HTTPS_PORT"] # 8443
print config.ports["servers"]["TCASE_PORT"] # 8888
config.ports["servers"]["HTTPS_PORT"] = 443 # Change HTTPS port to 443
Lembre-se: Ao alterar as portas padrão, você deve sempre tratar exceções devido aos privilégios necessários!
Abaixo uma lista abrangente de todas as configurações/personalizações disponíveis do objeto PJFConfiguration:
Tabela de configuração
Tabela de técnicas
Abaixo algumas capturas de tela para que você saiba o que esperar do PyJFuzz:
O PyJFuzz é fornecido com uma ferramenta embutida chamada PyJFuzz Web Fuzzer. Esta ferramenta fornecerá um console de fuzzing automático via servidor HTTP e HTTPS, podendo ser usada para fuzzar facilmente quase qualquer navegador web, mesmo quando você não pode controlar o estado do processo!
Existem duas opções usadas para iniciar esta ferramenta (--browser-auto e --fuzz-web). A primeira realiza o reinício automático do navegador quando ocorre uma falha; a outra tenta capturar quando um navegador não faz mais requisições. Ambas sempre salvam os testcases. Abaixo algumas capturas de tela.
Por favor, envie qualquer problema aqui via GitHub. Fornecerei uma correção o mais rápido possível.
Abaixo uma lista de problemas conhecidos encontrados pelo PyJFuzz. A lista será atualizada semanalmente.
Obrigado por usar PyJFuzz!
Feliz Fuzzing do mseclab
| Nome | Tipo | Descrição |
|---|---|---|
| json | dict | Objeto JSON para fuzzar |
| json_file | str | Caminho para um arquivo JSON |
| parameters | list<str> | Lista de parâmetros para fuzzar (extraídos do objeto JSON) |
| techniques | str<int> | String de ataques habilitados, usada para gerar JSON fuzzado, como XSS, LFI etc. Ex.: "CHPTRSX" (Veja a tabela de técnicas) |
| level | int | Nível de fuzzing no intervalo 0-6 |
| utf8 | bool | Se verdadeiro, alterna de codificação unicode para representação pura de bytes |
| indent | bool | Define se deve indentar o objeto resultante |
| url_encode | bool | Define se deve aplicar URLEncode ao objeto resultante |
| strong_fuzz | bool | Define se deve usar strong fuzzing (strong fuzzing não manterá a estrutura JSON, útil para fuzzing de parsers) |
| debug | bool | Define se deve habilitar impressões de depuração |
| exclude | bool | Excluir do fuzzing os parâmetros selecionados pela opção de parâmetros |
| notify | bool | Define se deve notificar o monitor de processo quando ocorrer uma falha, usado apenas com PJFServer |
| html | str | Caminho para um diretório HTML a ser servido dentro do PJFServer |
| ext_fuzz | bool | Define se deve usar o binário de "command" como um fuzzer externo |
| cmd_fuzz | bool | Define se deve usar o binário de "command" como alvo do fuzzer |
| content_type | str | Define o tipo de conteúdo do resultado do PJFServer (padrão application/json) |
| command | list<str> | Comando a executar; cada parâmetro é um elemento da lista. Você pode usar shlex.split do Python |
| Índice | Descrição |
|---|---|
| 0 | Injeção XSS (Polyglot) |
| 1 | Injeção SQL (Polyglot) |
| 2 | Ataque LFI |
| 3 | Injeção SQL polyglot (2) |
| 4 | Injeção XSS (Polyglot) (2) |
| 5 | Injeção RCE (Polyglot) |
| 6 | Ataque LFI (2) |
| 7 | Ataque Data URI |
| 8 | Ataque LFI e HREF |
| 9 | Injeção de cabeçalho |
| 10 | Injeção RCE (Polyglot) (2) |
| 11 | Injeção genérica de template |
| 12 | Injeção de template Flask |
| 13 | Ataque de caracteres aleatórios |