
PyJFuzz - Fuzzer JSON in Python

PyJFuzz è un piccolo framework estensibile e pronto all'uso utilizzato per fuzzare input JSON, come API REST di endpoint mobili, implementazioni JSON, browser, eseguibili da riga di comando e molto altro.
| Versione | 1.1.0 |
|---|---|
| Homepage | http://www.mseclab.com/ |
| GitHub | https://github.com/mseclab/PyJFuzz |
| Autore | Daniele Linguaglossa (@dzonerzy) |
| Licenza | MIT - (vedi file LICENSE) |
Dipendenze
Per funzionare, PyJFuzz necessita di alcune dipendenze: bottle, netifaces, GitPython e gramfuzz. Puoi installarle automaticamente tramite setup.py.
Installazione
Puoi installare PyJFuzz con il seguente comando
git clone https://github.com/mseclab/PyJFuzz.git && cd PyJFuzz && sudo python setup.py install
Strumento CLI
Una volta installato, PyJFuzz creerà sia una libreria Python che un'utilità da riga di comando chiamata pjf (screenshot qui sotto)
Libreria
PyJFuzz può anche funzionare come libreria. Puoi importarla nel tuo progetto come segue
from pyjfuzz.lib import *
Classi
Gli oggetti/classi disponibili sono i seguenti:
Esempi
Di seguito alcuni esempi banali su come implementare un programma basato su 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 *
# Le tecniche possono essere definite per gruppo o per numero di tecnica
# I gruppi sono CHTPRSX; per capire cosa sono, esegui pyjfuzz con l'opzione -h o guarda lo screenshot della riga di comando
# Questo qui sotto inizializza un oggetto config che utilizza solo gli attacchi del gruppo P, dove P sta per Path Traversal
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, techniques="P"))
# Una volta definito un oggetto config, puoi accedere a config.techniques per visualizzare le tecniche selezionate per il tuo gruppo
print("Techniques IDs: {0}".format(str(config.techniques)))
# Puoi eventualmente modificarle!
config.techniques = [2]
# In questo modo verrà eseguito solo l'attacco numero 2 (LFI Attack)!
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()
A volte potresti aver bisogno di modificare impostazioni standard non personalizzabili come la porta del server HTTP o HTTPS; questo può essere fatto nel seguente modo
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 # Cambia la porta HTTPS a 443
Ricorda: Quando cambi le porte predefinite, dovresti sempre gestire le eccezioni dovute ai privilegi necessari!
Di seguito una lista completa di tutte le impostazioni / personalizzazioni disponibili dell'oggetto PJFConfiguration:
Tabella di configurazione
| Nome | Tipo | Descrizione |
|---|---|---|
| json | dict | Oggetto JSON da fuzzare |
| json_file | str | Percorso di un file JSON |
| parameters | list<str> | Lista di parametri da fuzzare (presi dall'oggetto JSON) |
| techniques | str<int> | Stringa di attacchi abilitati, utilizzata per generare JSON fuzzato, come XSS, LFI ecc. es. "CHPTRSX" (Guarda la tabella delle tecniche) |
| level | int | Livello di fuzzing nell'intervallo 0-6 |
| utf8 | bool | Se true, passa dalla codifica unicode alla rappresentazione pura di byte |
| indent | bool | Imposta se indentare l'oggetto risultato |
| url_encode | bool | Imposta se codificare URL l'oggetto risultato |
| strong_fuzz | bool | Imposta se utilizzare il strong fuzzing (il strong fuzzing non mantiene la struttura JSON, utile per il fuzzing di parser) |
| debug | bool | Imposta se abilitare le stampe di debug |
| exclude | bool | Esclude dal fuzzing i parametri selezionati dall'opzione parameters |
| notify | bool | Imposta se notificare al monitor dei processi quando si verifica un crash, utilizzato solo con PJFServer |
| html | str | Percorso di una directory HTML da servire all'interno di PJFServer |
| ext_fuzz | bool | Imposta se utilizzare il binario da "command" come fuzzer esterno |
| cmd_fuzz | bool | Imposta se utilizzare il binario da "command" come target del fuzzer |
| content_type | str | Imposta il tipo di contenuto risultato di PJFServer (default application/json) |
| command | list<str> | Comando da eseguire; ogni parametro è un elemento della lista, puoi usare shlex.split di Python |