WFuzz es una herramienta y biblioteca de fuzzer de seguridad de aplicaciones web para Python.
Wfuzz se basa en un concepto simple: reemplaza cualquier referencia a la palabra clave FUZZ por el valor de una carga útil determinada.
Una carga útil en Wfuzz es una fuente de datos.
Este concepto simple permite inyectar cualquier entrada en cualquier campo de una solicitud HTTP, lo que permite realizar complejos ataques de seguridad web en diferentes componentes de la aplicación web, como: parámetros, autenticación, formularios, directorios/archivos, encabezados, etc.
En caso de utilizar Kali Linux o ParroOS suelen tener incluidos el repositorio wordlists
el cual incluye una variedad de diccionarios o listas de
palabras de distintos tamaños. Este repositorio se encuentra en el directorio /usr/share/wordlists
.
Para descargar el repositorio con todos los diccionarios simplemente ejecutamos lo siguiente:
sudo apt install wordlists
Wfuzz se basa en un concepto simple: reemplaza cualquier referencia a la palabra clave FUZZ por el valor de una carga útil determinada. Una carga útil
más conocida como payload
en Wfuzz es una fuente de datos de entrada y se especifica mediante -z
:
Las cargas útiles disponibles se pueden listar ejecutando la opción -e payloads
:
wfuzz -e payloads
Se puede obtener información detallada sobre las cargas útiles ejecutando:
wfuzz -z help
Este último se puede filtrar usando el parámetro --slice
:
wfuzz -z help --slice "dirwalk"
Use el interruptor –h
y –help
para obtener el uso de ayuda básica y avanzada respectivamente.
Wfuzz es un marco completamente modular, puede verificar los módulos disponibles usando el interruptor -e iterators
:
Las categorías válidas son: cargas útiles
, codificadores
, iteradores
, impresoras
o scripts
.
Filtrar resultados en Wfuzz es primordial:
Los diccionarios grandes pueden generar una gran cantidad de resultados y pueden ahogar fácilmente los resultados válidos legítimos. La clasificación de las respuestas HTTP es clave para realizar algunos ataques, por ejemplo, para verificar la presencia de una vulnerabilidad de inyección SQL, debemos distinguir una respuesta legítima de la que genera un error o datos diferentes. Wfuzz permite filtrar según el código de respuesta HTTP y la longitud de la información recibida (en forma de palabras, caracteres o líneas). También se pueden utilizar expresiones regulares. Se pueden tomar dos enfoques: mostrar u ocultar los resultados que coinciden con un filtro determinado.
Los siguientes parámetros de la línea de comandos se pueden usar para ocultar ciertas respuestas HTTP –hc
, –hl
, –hw
, –hh
.
El comando --hc
filtra los recursos web desconocidos por el servidor web ( http://en.wikipedia.org/wiki/HTTP_404 ), básicamente suprime las páginas
que reportar error 404
:
wfuzz -w wordlist/general/common.txt --hc 404 http://testphp.vulnweb.com/FUZZ
Se pueden especificar múltiples valores, por ejemplo, la siguiente ejecución de wfuzz agrega los recursos prohibidos al filtro:
wfuzz -w wordlist/general/common.txt --hc 404,403 http://testphp.vulnweb.com/FUZZ
Las líneas, palabras o caracteres son útiles cuando buscamos recursos con el mismo código de estado HTTP.
Por ejemplo, es un comportamiento común (a veces debido a una configuración incorrecta) que los servidores web devuelvan una página de error personalizada con un código de respuesta 200, esto se conoce como soft 404
.
Una ejecución de línea de comando típica de Wfuzz, que especifica una carga de diccionario y una URL, se ve así:
wfuzz -w [Ruta del Diccionario] [Url Víctima]/FUZZ
wfuzz -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ
-w
: Especifica un diccionario (Lista de palabras).
Podemos ver los siguientes parámetros en la respuesta:
La salida de Wfuzz permite analizar las respuestas del servidor web y filtrar los resultados deseados en función del mensaje de respuesta HTTP obtenido, por ejemplo, códigos de respuesta, longitud de respuesta, etc.
Cada línea proporciona la siguiente información:
ID
: El número de solicitud en el orden en que se realizó.
Respuesta:
muestra el código de respuesta HTTP.
Líneas:
Muestra el número de líneas en la respuesta HTTP.
Palabra:
Muestra el número de palabras en la respuesta HTTP.
Chars:
Muestra el número de caracteres en la respuesta HTTP.
Carga útil:
Muestra la carga útil utilizada.
Cada palabra clave FUZZ debe tener su carga útil (payload) correspondiente. Hay varias formas equivalentes de especificar una payload
:
wfuzz -w [Ruta del Diccionario] [URL Víctima]/FUZZ
-w
: Especifica un diccionario (Lista de palabras).
wfuzz -z [Ruta del Diccionario] [URL Víctima]/FUZZ
-z
: Especifica el valor del parámetro predeterminado del payload.
Esto nos permite la opción de repetir varios encabezados. Para ello se emplea la etiqueta -H
de header seguida de la especificación entre comillas dobles.
wfuzz -w [Ruta del Diccionario] -H "Host: FUZZ.ejemplo.com" http://ejemplo.com
Ejemplo:
wfuzz -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H “Host: FUZZ.nunchuks.htb” http://nunchuks.htb
wfuzz -w [Ruta del Diccionario] --hc 404,403 [URL Víctima]
-w
: Especifica un diccionario (Lista de palabras).
--hc
: Omite los resultados HTTP especificados, en este caso las páginas con servicios 404 (servidor no encontrado) y 403 (sin permisos de acceso).
Se puede encontr mucha más información sobre esta herramienta en su página: https://wfuzz.readthedocs.io/en/latest/user/getting.html
En algunas ocasiones al ejecutar Wfuzz veremos como empieza a reportar resultados inconcluyentes con el mismo número de caracteres. Al igual que los servicios web estos resultados pueden ser filtrados para que sean omitidos y que solo nos devuelva los resultados que nos interesan.
Para omitir los caracteres o chars específicos se usa la instrucción --hh=[Nº Chars]
. Veamos como sería su sintaxis:
wfuzz --hh=[Nº Chars] -w [Ruta del Diccionario] [URL Víctima]
Vamos a ver un ejemplo para que quede más claro, para ello primero vamos a realizar un escaneo simple sin filtrar ningún resultado para que veáis como se repiten las peticiones con el mismo número de caracteres.
Para este ejemplo usaremos la máquina Nunchucks
de HTB con la Ip 10.10.11.122 y como diccionario utilizaremos uno de la librería Seclists
.
wfuzz -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H "Host: FUZZ.nunchucks.htb" http://nunchucks.htb
Como podéis ver nos reporta un montón de resultados con el mismo número de chars
:
Vamos a intentar aplicar el filtro --hh=30587
para ocultar todos los resultados con ese número de caracteres:
wfuzz --hh=30587 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H "Host: FUZZ.nunchucks.htb" http://nunchucks.htb
Una vez especificado, solo nos muestra los resultados con un número de caracteres diferente a 30587.