
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
Tabella delle tecniche
Di seguito alcuni screenshot per farti capire cosa aspettarti da PyJFuzz
PyJFuzz è fornito con uno strumento integrato chiamato PyJFuzz Web Fuzzer, questo strumento fornirà una console di fuzzing automatica tramite server HTTP e HTTPS. Può essere utilizzato per fuzzare facilmente quasi tutti i browser web, anche quando non puoi controllare lo stato del processo!
Ci sono due opzioni utilizzate per avviare questo strumento (--browser-auto e --fuzz-web): la prima esegue il riavvio automatico del browser quando si verifica un crash, l'altra tenta di rilevare quando un browser non effettua più richieste. Entrambe salvano sempre i testcase. Di seguito alcuni screenshot.
ProblemiPer favore, segnala qualsiasi problema qui su GitHub. Fornirò una correzione il prima possibile.
Di seguito una lista di problemi noti trovati da PyJFuzz. La lista verrà aggiornata settimanalmente
Grazie per aver usato PyJFuzz!
Happy Fuzzing da mseclab
| 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 |
| Indice | Descrizione |
|---|---|
| 0 | Iniezione XSS (Polyglot) |
| 1 | Iniezione SQL (Polyglot) |
| 2 | Attacco LFI |
| 3 | Polyglot SQL injection (2) |
| 4 | Iniezione XSS (Polyglot) (2) |
| 5 | Iniezione RCE (Polyglot) |
| 6 | Attacco LFI (2) |
| 7 | Attacco Data URI |
| 8 | Attacco LFI e HREF |
| 9 | Iniezione header |
| 10 | Iniezione RCE (Polyglot) (2) |
| 11 | Iniezione generica di template |
| 12 | Iniezione di template Flask |
| 13 | Attacco a caratteri casuali |