
Fuzzer modulaire de contournement de WAF avec multithreading, manipulation de requêtes et encodage de payload pour les tests d'applications web en équipe rouge.
pFuzz est un outil de fuzzing avancé pour les opérations de red team que nous avons développé pour nos recherches. Il nous aide à contourner les pare-feux d'applications web en utilisant différentes méthodes simultanément.
pFuzz est un outil de fuzzing avancé que nous avons développé pour la recherche sur les applications web. Il a été conçu pour accélérer le processus de test de différentes méthodes d'attaque sur diverses applications de sécurité.
pFuzz est un outil développé en langage Python pour offrir une capacité de fuzzing avancée dans la recherche sur les applications web. Grâce à sa structure modulaire, il permet d'ajouter rapidement les méthodes de contournement WAF nouvellement découvertes ou à découvrir à pFuzz et de les tester sur tous les autres WAF. Outre la structure modulaire, des mécanismes comme le multi-threading, le multi-processing et les files d'attente ont été utilisés pour rendre l'outil plus flexible, et l'infrastructure a été créée pour les développements futurs.
L'outil est programmé de manière à ce qu'une requête donnée puisse être analysée et facilement modifiée via un objet. Grâce à cette structure, les personnes qui développeront l'application pourront contribuer facilement et faire évoluer l'outil selon leurs besoins sans avoir à modifier la structure de base de l'application ni à l'apprendre.
Note : Si vous souhaitez contribuer au développement, vous pouvez le faire non seulement en développant pFuzz, mais aussi en ajoutant de nouveaux modules. N'hésitez pas à ouvrir de nouvelles PR :)
pFuzz est un outil développé en langage Python pour offrir une capacité de fuzzing avancée dans la recherche sur les applications web. Comme l'application a une structure modulaire, elle peut rapidement ajouter les méthodes de contournement WAF nouvellement découvertes ou à découvrir à pFuzz et les tester sur tous les autres WAF. En plus d'une structure modulaire, des mécanismes comme le multi-threading, le multi-processing et les files d'attente ont été utilisés pour rendre l'outil plus flexible, et l'infrastructure a été créée pour les développements futurs.
L'application est programmée pour qu'une requête donnée puisse être analysée et facilement modifiée via un objet. Grâce à cette structure, les personnes qui développeront l'application pourront contribuer facilement et faire évoluer l'outil selon leurs besoins sans avoir à modifier la structure de base de l'application ni à l'apprendre.
Not : Si vous souhaitez contribuer au développement, vous pouvez le faire non seulement en développant le cœur (core) de pFuzz, mais aussi en ajoutant de nouveaux modules. Nous attendons vos nouvelles PR :)
_____
_ __ | ___|_ _ ____ ____
| '_ \ | |_ | | | ||_ /|_ /
| |_) || _| | |_| | / / / /
| .__/ |_| \__,_|/___|/___|
|_|

sudo pip3 install virtualenv
python3 -m venv myvenv
source myvenv/bin/activate
pip3 install -r requirements.txt
python3 pfuzz.py --help
cffi==1.14.3
cryptography==3.1.1
numpy==1.19.2
pandas==1.1.3
pycparser==2.20
pyOpenSSL==19.1.0
python-dateutil==2.8.1
pytz==2020.1
six==1.15.0
xlrd==1.2.0
python3 pfuzz.py --help
python3 pfuzz.py -r request.txt -m
python3 pfuzz.py -r request.txt -cf
python3 pfuzz.py -r request.txt -f
python3 pfuzz.py -r request.txt -f --proxy 127.0.0.1:8080
python3 pfuzz.py -r request.txt -f -d 3
python3 pfuzz.py -r request.txt -f -s
python3 pfuzz.py -r request.txt -f -l
python3 pfuzz.py -r request.txt -f -e
python3 pfuzz.py -r request.txt -f -fe
python3 pfuzz.py -r request.txt -f -t 5
python3 pfuzz.py -r request.txt -f -o terminal
python3 pfuzz.py -r request.txt -f -od terminal
python3 pfuzz.py -r request.txt -f -o ~/Desktop/
python3 pfuzz.py -r request.txt -f -od ~/tmp/
_____
_ __ | ___|_ _ ____ ____
| '_ \ | |_ | | | ||_ /|_ /
| |_) || _| | |_| | / / / /
| .__/ |_| \__,_|/___|/___|
|_|
------------------------------------
@EmreOvunc | @merttasci | @xsuperbug
------------------------------------
v0.2.4
------------------------------------
usage: pfuzz.py [-h] [--request REQUEST] [--proxy PROXY] [--log] [--ssl]
[--threads THREADS] [--output OUTPUT] [--delay TIME]
[--output-details OUTPUT] [--full-encode] [--encode]
[--fuzz] [--charfuzz] [--manipulate] [--version]
optional arguments:
--help/-h show this help message and exit
--proxy/-p PROXY proxy [IP:PORT]
--log/-l enable logging
--ssl/-s enable ssl
--threads/-t NUMBER thread(s) number [default=1]
--version/-v show program's version number and exit
[Request Options]:
--request/-r REQUEST request file
--delay/-d TIME set a delay between requests [default=0.05]
--encode/-e encode space chars in uri/body
--full-encode/-fe encode all chars in uri/body
[Output Options]:
--output/-o OUTPUT output important info [terminal/folder name]
--output-details/-od OUTPUT
output all details [terminal/folder name]
[Modules]:
--fuzz/-f run fuzzing module
--charfuzz/-cf run char fuzzing module
--manipulate/-m run manipulating headers module
Usage: python3 pfuzz.py -r req.txt --log -s --fuzz -d 1 --encode -o terminal --threads 2
Usage: python3 pfuzz.py -r req.txt -f -l --proxy 127.0.0.1:8080 --output-details ~/output
- modules
- charfuzzer.py
- exparse.py
- fuzzer.py
- headeroperations.py
- manupilatingheaders.py
from reqparser import HTTPReq
myreq = HTTPReq.getobj()
...
myreq.uri
myreq.body
myreq.http
myreq.referer
myreq.origin
myreq.host
myreq.cookie
...
Si vous souhaitez récupérer vos charges utiles depuis le fichier Excel, vous pouvez utiliser les méthodes getpayloads provenant de modules.exparse.
from modules.exparse import getpayloads
getpayloads(fuzzsheetName, genericcolmnName, fuzzingpayloads)
# Fuzzing Module in static/statics.py
fuzzsheetName = 'Fuzzing'
genericcolmnName = 'Payload'
fuzzingpayloads = []
Maintenant, vous pouvez modifier/ajouter/supprimer les attributs comme vous le souhaitez.
myreq.uri = tmpuri + payload
myreq.addheader(header, "127.0.0.1")
myreq.content_type = "text/html"
from modules.exparse import getpayloads
for payload in fuzzingpayloads:
if payload == '#exitme#':
statics.exitCall = True
else:
[OPERATIONS]
from reqsender import sendit
sendit(myreq)
![]() Emre Övünç | ![]() Mert Taşçı | ![]() Evren Yalçın |
| Objectif | Module/Classe | Fonction | Paramètre(s) |
|---|
| Envoyer une requête | reqsender.py | sendit() | objet |
| Utiliser un objet de requête | reqparser.py/HTTPReq | getobj() | - |
| Ajouter un en-tête personnalisé | reqparser.py/HTTPReq | OBJECT.addheader() | nouveauNomEnTête,valeur |
| Supprimer un en-tête | reqparser.py/HTTPReq | OBJECT.delheader() | nomEnTête |
| Modifier un en-tête | reqparser.py/HTTPReq | OBJECT.changeheader() | nomEnTête,nouveauNomEnTête |
| Obtenir une charge utile depuis le fichier | exparse.py | getpayloads() | nomFeuille,nomColonne |
| Écrire un journal info/debug/warning | waflogger.py | loginfo/logdebug/logwarn() | messageJournal |