
PyJFuzz - Fuzzer JSON Python

PyJFuzz est un petit framework extensible et prêt à l'emploi utilisé pour fuzzer des entrées JSON, comme les API REST d'endpoints mobiles, les implémentations JSON, les navigateurs, les exécutables en ligne de commande et bien plus encore.
Dépendances
Pour fonctionner, PyJFuzz a besoin de certaines dépendances : bottle, netifaces, GitPython et gramfuzz. Vous pouvez les installer via l'installation automatique de setup.py.
Installation
Vous pouvez installer PyJFuzz avec la commande suivante
git clone https://github.com/mseclab/PyJFuzz.git && cd PyJFuzz && sudo python setup.py install
Outil en ligne de commande
Une fois installé, PyJFuzz crée à la fois une bibliothèque Python et un utilitaire en ligne de commande appelé pjf (capture d'écran ci-dessous)
Bibliothèque
PyJFuzz peut également fonctionner comme une bibliothèque, vous pouvez l'importer dans votre projet comme suit
from pyjfuzz.lib import *
Classes
Les objets/classes disponibles sont les suivants :
Exemples
Voici quelques exemples simples de mise en œuvre d'un programme utilisant 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 *
# Les techniques peuvent être définies par groupe ou par numéro de technique.
# Les groupes sont CHTPRSX. Pour comprendre ce qu'ils sont, veuillez exécuter pyjfuzz avec l'option -h ou regarder la capture d'écran de la ligne de commande.
# Ce qui suit initialise un objet de configuration qui utilise uniquement les attaques du groupe P, où P correspond à Path Traversal.
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, techniques="P"))
# Une fois un objet config défini, vous pouvez accéder à config.techniques pour voir les techniques sélectionnées pour votre groupe.
print("Techniques IDs: {0}".format(str(config.techniques)))
# Vous pouvez éventuellement les modifier !
config.techniques = [2]
# De cette façon, seule l'attaque numéro 2 (LFI Attack) sera effectuée !
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()
Parfois, vous pouvez avoir besoin de modifier des paramètres standard non personnalisables, comme le port du serveur HTTPS ou HTTP. Cela peut être fait de la manière suivante
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
Rappel : Lorsque vous modifiez les ports par défaut, vous devez toujours gérer les exceptions en raison des privilèges nécessaires !
Voici une liste complète de tous les paramètres/personnalisations disponibles de l'objet PJFConfiguration :
Tableau de configuration
Tableau des techniques
Voici quelques captures d'écran pour vous donner une idée de ce que vous pouvez attendre de PyJFuzz
PyJFuzz est livré avec un outil intégré appelé PyJFuzz Web Fuzzer. Cet outil fournit une console de fuzzing automatique via un serveur HTTP et HTTPS. Il peut être utilisé pour fuzzer facilement presque n'importe quel navigateur web, même lorsque vous ne pouvez pas contrôler l'état du processus ! Deux options permettent de lancer cet outil (--browser-auto et --fuzz-web). La première effectue un redémarrage automatique du navigateur en cas de plantage, la seconde tente de détecter quand un navigateur n'effectue plus de requêtes. Les deux sauvegardent toujours les cas de test. Voici quelques captures d'écran.
ProblèmesVeuillez signaler tout problème ici via GitHub, je fournirai un correctif dès que possible.
Voici une liste des problèmes connus découverts par PyJFuzz, la liste sera mise à jour chaque semaine
Merci d'utiliser PyJFuzz !
Bon Fuzzing de la part de mseclab
| Version | 1.1.0 |
|---|---|
| Page d'accueil | http://www.mseclab.com/ |
| Github | https://github.com/mseclab/PyJFuzz |
| Auteur | Daniele Linguaglossa (@dzonerzy) |
| Licence | MIT - (voir le fichier LICENSE) |
| Nom | Type | Description |
|---|---|---|
| json | dict | Objet JSON à fuzzer |
| json_file | str | Chemin vers un fichier JSON |
| parameters | list<str> | Liste des paramètres à fuzzer (extraits de l'objet JSON) |
| techniques | str<int> | Chaîne d'attaques activées, utilisée pour générer du JSON fuzzé, comme XSS, LFI, etc. ex. "CHPTRSX" (voir tableau des techniques) |
| level | int | Niveau de fuzzing compris entre 0 et 6 |
| utf8 | bool | Si vrai, passe d'un encodage Unicode à une représentation pure en octets |
| indent | bool | Définit s'il faut indenter l'objet résultat |
| url_encode | bool | Définit s'il faut encoder l'URL de l'objet résultat |
| strong_fuzz | bool | Définit s'il faut utiliser le strong fuzzing (le strong fuzzing ne préserve pas la structure JSON, utile pour le fuzzing d'analyseurs) |
| debug | bool | Définit s'il faut activer les impressions de débogage |
| exclude | bool | Exclut du fuzzing les paramètres sélectionnés par l'option parameters |
| notify | bool | Définit s'il faut notifier le moniteur de processus lors d'un plantage (uniquement utilisé avec PJFServer) |
| html | str | Chemin vers un répertoire HTML à servir au sein de PJFServer |
| ext_fuzz | bool | Définit s'il faut utiliser le binaire de "command" comme fuzzer externe |
| cmd_fuzz | bool | Définit s'il faut utiliser le binaire de "command" comme cible du fuzzer |
| content_type | str | Définit le type de contenu du résultat de PJFServer (par défaut application/json) |
| command | list<str> | Commande à exécuter ; chaque paramètre est un élément de liste, vous pouvez utiliser shlex.split de Python |
| Index | Description |
|---|---|
| 0 | Injection XSS (Polyglotte) |
| 1 | Injection SQL (Polyglotte) |
| 2 | Attaque LFI |
| 3 | Injection SQL polyglotte (2) |
| 4 | Injection XSS (Polyglotte) (2) |
| 5 | Injection RCE (Polyglotte) |
| 6 | Attaque LFI (2) |
| 7 | Attaque par URI de données |
| 8 | Attaque LFI et HREF |
| 9 | Injection d'en-tête |
| 10 | Injection RCE (Polyglotte) (2) |
| 11 | Injection de template générique |
| 12 | Injection de template Flask |
| 13 | Attaque par caractères aléatoires |