
Fuzzer modular de bypass de WAF com multi-threading, manipulação de requisições e codificação de payload para testes de aplicações web em red team.
pFuzz é uma ferramenta avançada de fuzzing para red team que desenvolvemos para nossa pesquisa. Ela nos ajuda a contornar firewalls de aplicações web usando diferentes métodos simultaneamente.
pFuzz é uma ferramenta avançada de fuzzing que desenvolvemos para pesquisas em aplicações web. Foi desenvolvida para acelerar o processo de testar vários métodos de ataque em diferentes aplicações de segurança.
pFuzz é uma ferramenta desenvolvida em Python para ter capacidade avançada de fuzzing em pesquisas de aplicações web. Como a aplicação possui uma estrutura modular, ela tem a capacidade de adicionar rapidamente novos métodos de bypass de WAF encontrados/ a serem encontrados ao pFuzz e testá-los em todos os outros WAFs. Além de uma estrutura modular, foram utilizados multi-threading, multi-processing e estruturas de fila para tornar a ferramenta mais flexível, e a infraestrutura foi criada para desenvolvimentos futuros.
A ferramenta é programada para que uma requisição fornecida possa ser analisada (parseada) e facilmente alterada através de um objeto. Graças a essa estrutura, aqueles que desenvolverão a aplicação poderão contribuir facilmente e desenvolver a ferramenta de acordo com suas próprias necessidades, sem alterar a estrutura principal da aplicação e sem precisar aprendê-la.
Nota: Se você quiser contribuir para o desenvolvimento, pode fazê-lo não apenas desenvolvendo o pFuzz, mas também adicionando novos módulos. Sinta-se à vontade para abrir novos PRs :)
pFuzz é uma ferramenta desenvolvida em Python para ter capacidade avançada de fuzzing em pesquisas de aplicações web. Como a aplicação possui uma estrutura modular, ela tem a capacidade de adicionar rapidamente novos métodos de bypass de WAF encontrados/ a serem encontrados ao pFuzz e testá-los em todos os outros WAFs. Além de uma estrutura modular, foram utilizados multi-threading, multi-processing e estruturas de fila para tornar a ferramenta mais flexível, e a infraestrutura foi criada para desenvolvimentos futuros.
A ferramenta é programada para que uma requisição fornecida possa ser analisada (parseada) e facilmente alterada através de um objeto. Graças a essa estrutura, aqueles que desenvolverão a aplicação poderão contribuir facilmente e desenvolver a ferramenta de acordo com suas próprias necessidades, sem alterar a estrutura principal da aplicação e sem precisar aprendê-la.
Nota: Se você deseja contribuir com o desenvolvimento, pode fazê-lo não apenas como desenvolvimento 'core', mas também adicionando novos módulos. Aguardamos seus novos PRs :)
_____
_ __ | ___|_ _ ____ ____
| '_ \ | |_ | | | ||_ /|_ /
| |_) || _| | |_| | / / / /
| .__/ |_| \__,_|/___|/___|
|_|

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
...
Se você quiser obter seus payloads do Excel, pode usar os métodos getpayloads vindos de modules.exparse.
from modules.exparse import getpayloads
getpayloads(fuzzsheetName, genericcolmnName, fuzzingpayloads)
# Fuzzing Module in static/statics.py
fuzzsheetName = 'Fuzzing'
genericcolmnName = 'Payload'
fuzzingpayloads = []
Agora, você pode alterar/adicionar/excluir atributos conforme desejar.
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 |
| Objetivo | Módulo/Classe | Função | Parâmetro(s) |
|---|
| Enviar uma requisição | reqsender.py | sendit() | object |
| Usar um objeto de requisição | reqparser.py/HTTPReq | getobj() | - |
| Adicionar um cabeçalho personalizado | reqparser.py/HTTPReq | OBJECT.addheader() | newHeadername,value |
| Excluir um cabeçalho | reqparser.py/HTTPReq | OBJECT.delheader() | headerName |
| Alterar um cabeçalho | reqparser.py/HTTPReq | OBJECT.changeheader() | headerName,newHeaderName |
| Obter um payload do arquivo | exparse.py | getpayloads() | sheetName,columnName |
| Escrever um log de info/debug/warning | waflogger.py | loginfo/logdebug/logwarn() | logMessage |