
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
| 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 |
Tabela de técnicas