
Fuzzer modular de bypass de WAF con múltiples hilos, manipulación de solicitudes y codificación de payloads para pruebas de aplicaciones web de red team.
## ¿Qué es pFuzz? :question:
pFuzz es una herramienta avanzada de fuzzing para el equipo rojo que desarrollamos para nuestra investigación. Nos ayuda a evadir firewalls de aplicaciones web utilizando diferentes métodos al mismo tiempo.
pFuzz es una herramienta avanzada de fuzzing que desarrollamos para investigaciones de aplicaciones web. Se ha desarrollado para acelerar el proceso de probar varios métodos de ataque en diferentes aplicaciones de seguridad.
## Descripción [EN]
pFuzz es una herramienta desarrollada en el lenguaje Python para tener capacidad avanzada de fuzzing en la investigación de aplicaciones web. Dado que la aplicación tiene una estructura modular, tiene la capacidad de añadir rápidamente métodos de evasión de WAF recién encontrados/por encontrar a pFuzz y probarlos en todos los demás WAF. Además de una estructura modular, se han utilizado estructuras como multi-hilo, multiprocesamiento y colas para hacer la herramienta más flexible, y se ha creado la infraestructura para futuros desarrollos.
La herramienta está programada para que una solicitud dada pueda ser analizada y modificada fácilmente a través de un objeto. Gracias a esta estructura, quienes desarrollen la aplicación podrán contribuir fácilmente y desarrollar la herramienta según sus propias necesidades sin cambiar la estructura central de la aplicación y sin tener que aprenderla.
---
**Nota**: Si deseas contribuir al desarrollo, no solo puedes hacerlo desarrollando pFuzz, sino también añadiendo nuevos módulos.
¡No dudes en abrir nuevos PR! :)
---
## Descripción [TR]
pFuzz es una herramienta desarrollada en Python para tener capacidad avanzada de fuzzing en investigaciones de aplicaciones web. Dado que la aplicación tiene una estructura modular, tiene la capacidad de añadir rápidamente métodos de evasión de WAF recién encontrados/por encontrar a pFuzz y probarlos en todos los demás WAF. Además de una estructura modular, se han utilizado estructuras como multi-hilo, multiprocesamiento y colas para hacer la herramienta más flexible, y se ha creado la infraestructura para futuros desarrollos.
La herramienta está programada para que una solicitud dada pueda ser analizada y modificada fácilmente a través de un objeto. Gracias a esta estructura, quienes desarrollen la aplicación podrán contribuir fácilmente y desarrollar la herramienta según sus propias necesidades sin cambiar la estructura central de la aplicación y sin tener que aprenderla.
---
**Nota**: Si deseas contribuir al desarrollo, no solo puedes hacerlo como desarrollo del núcleo 'core', sino también añadiendo nuevos módulos.
¡Esperamos tus nuevos PR! :)
---
```
_____
_ __ | ___|_ _ ____ ____
| '_ \ | |_ | | | ||_ /|_ /
| |_) || _| | |_| | / / / /
| .__/ |_| \__,_|/___|/___|
|_|
```
## Desarrolladores :information_desk_person:
<table>
<tr>
<td align="center"><a href="https://emreovunc.com/"><img src="https://assets.kitploit.com/production/public/readmes/4741/025cb41e33a4ea900dab514465ecc2679bbdcbcc2ecd94afbb9b2b10c0bfc2b0.jpg" width="100px;" alt=""/><br /><sub><b>Emre Övünç</b></sub></a><br/>
<td align="center"><a href="https://mert.ninja/"><img src="https://assets.kitploit.com/production/public/readmes/4741/67f19af0e4b570cfc645d4cadea381ea7a74439060a29f3c64f666b77a7e52a4.png" width="100px;" alt=""/><br /><sub><b>Mert Taşçı</b></sub></a><br/>
<td align="center"><a href="https://evren.ninja/"><img src="https://assets.kitploit.com/production/public/readmes/4741/49503c16497a6382ecc3d656a029b044fa49b0c9829469cdaa67c5c0c8252ae5.png" width="100px;" alt=""/><br /><sub><b>Evren Yalçın</b></sub></a><br/>
</tr>
</table>
## Flujo :clipboard:

## Instalación y Uso :books:
```
sudo pip3 install virtualenv
python3 -m venv myvenv
source myvenv/bin/activate
pip3 install -r requirements.txt
python3 pfuzz.py --help
```
#### Dependencias:
```
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
```
#### Uso
- **Ayuda**
```
python3 pfuzz.py --help
```
- **Módulo de Manipulación de Cabeceras**
```
python3 pfuzz.py -r request.txt -m
```
- **Módulo de Fuzzing de Caracteres**
```
python3 pfuzz.py -r request.txt -cf
```
- **Módulo de Fuzzing**
```
python3 pfuzz.py -r request.txt -f
```
- **Añadir proxy**
```
python3 pfuzz.py -r request.txt -f --proxy 127.0.0.1:8080
```
- **Añadir un retardo entre peticiones**
```
python3 pfuzz.py -r request.txt -f -d 3
```
- **Habilitar conexión TLS/SSL**
```
python3 pfuzz.py -r request.txt -f -s
```
- **Habilitar registro (logging)**
```
python3 pfuzz.py -r request.txt -f -l
```
- **Habilitar función de codificación/codificación completa de payloads**
```
python3 pfuzz.py -r request.txt -f -e
```
```
python3 pfuzz.py -r request.txt -f -fe
```
- **Establecer multi-hilos**
```
python3 pfuzz.py -r request.txt -f -t 5
```
- **Salida a la terminal**
```
python3 pfuzz.py -r request.txt -f -o terminal
```
```
python3 pfuzz.py -r request.txt -f -od terminal
```
- **Salida a un archivo**
```
python3 pfuzz.py -r request.txt -f -o ~/Desktop/
```
```
python3 pfuzz.py -r request.txt -f -od ~/tmp/
```
## Ayuda :computer:
```
_____
_ __ | ___|_ _ ____ ____
| '_ \ | |_ | | | ||_ /|_ /
| |_) || _| | |_| | / / / /
| .__/ |_| \__,_|/___|/___|
|_|
------------------------------------
@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
```
## Extras :loudspeaker:
#### Cómo Desarrollar un Nuevo Módulo
- Debe crearse un archivo Python que especifique el nombre del módulo dentro de la carpeta **modules/**.
```
- modules
- charfuzzer.py
- exparse.py
- fuzzer.py
- headeroperations.py
- manupilatingheaders.py
```
- Puedes usar el objeto analizado como **myreq = HTTPReq.getobj()**
```
from reqparser import HTTPReq
myreq = HTTPReq.getobj()
```
- Tiene muchos atributos derivados de la clase **HTTPReq**. Puedes verlos en **reqparser.py.**
```
...
myreq.uri
myreq.body
myreq.http
myreq.referer
myreq.origin
myreq.host
myreq.cookie
...
```
- Si deseas obtener tus payloads desde el archivo Excel, puedes usar los métodos **getpayloads** de modules.exparse.
- getpayloads(fuzzsheetName, genericcolmnName, fuzzingpayloads)
```
from modules.exparse import getpayloads
getpayloads(fuzzsheetName, genericcolmnName, fuzzingpayloads)
```
- Configuramos objetos estáticos como fuzzsheetName en statics.py que está dentro de la carpeta **static/**.
```
# Módulo de Fuzzing en static/statics.py
fuzzsheetName = 'Fuzzing'
genericcolmnName = 'Payload'
fuzzingpayloads = []
```
- Ahora, puedes cambiar/añadir/eliminar los atributos como desees.
```
myreq.uri = tmpuri + payload
myreq.addheader(header, "127.0.0.1")
myreq.content_type = "text/html"
```
- Para detener el multi-hilo, debes agregar el payload **#exitme#** al final de tus payloads y establecer **statics.exitCall = True** para verificar si la cola está vacía o no.
```
from modules.exparse import getpayloads
for payload in fuzzingpayloads:
if payload == '#exitme#':
statics.exitCall = True
else:
[OPERACIONES]
```
- Cuando tu objeto (solicitud) esté listo para ser enviado, puedes usar la función **sendit()** para ponerlo en la cola.
```
from reqsender import sendit
sendit(myreq)
```
- Si necesitas cambiar funciones centrales en pFuzz, puedes iniciar un pull request o abrir un issue.
---
#### Algunas Funciones Importantes para Desarrollar Nuevos Módulos
| Propósito | Módulo/Clase | Función | Parámetro(s) |
| ------------- |------------- | ------------- | ------------- |
| Enviar una solicitud |reqsender.py | sendit() | object |
| Usar un objeto de solicitud |reqparser.py/HTTPReq | getobj() | - |
| Añadir una cabecera personalizada |reqparser.py/HTTPReq | OBJECT.addheader() | newHeadername,value |
| Eliminar una cabecera |reqparser.py/HTTPReq | OBJECT.delheader() | headerName |
| Cambiar una cabecera |reqparser.py/HTTPReq | OBJECT.changeheader() | headerName,newHeaderName |
| Obtener un payload del archivo |exparse.py | getpayloads() | sheetName,columnName |
| Escribir un registro info/debug/warning |waflogger.py | loginfo/logdebug/logwarn() | logMessage |
---
### ¿Qué WAFs hemos evadido?
- FortiWeb
- Cloudflare
- Sucuri
- Akamai
- Imperva
- F5 WAF