Realizando un CTF, exactamente krioptix2 del cual publicaremos los resultados en cualquier momento, descubrimos esta herramienta de forma que nos pusimos a investigar y apreder algo más de esta herramienta (al fin y al cabo lo bueno de resolver CTFs es aprender nuevos caminos y herramientas) y hemos podido ver que es mucho más que un escáner WEB pues las posibilidades de esta herramienta de no se quedan solo en enumerar los directorios o archivos de una WEB sino que podemos realizar ataques SQL-Injection, XSS, busquedas de claves por fuerza bruta, incluso busqueda de vulnerabilidades.
Pues llegado a este momento lo primero es dar una descripción de esta versatil herramienta:
- Multiples puntos de inyección y diversos diccionarios para diferentes objetivo (SQL, Apache, CMS y los que nos creemos).
- Permite POST, GET, encabezados, cookies y autentificacion(NTLM, Basic),
- Proxy
- Diferentes salidas: HTML, JSON,etc y colores.
- ocultar o mostrar resultados por código de retorno, números de palabras o lineas uso de expresiones regulares.
- Temporización entre solicitudes Los retrasos entre las solicitudes.
- Diferentes codificadores (MD5, base64, sh1, etc) para cargas
- Iteradores para combinar cargas.
Conceptos antes de empezar
Payload
Es la forma de generar las palabras que serán sustituidas en «FUZZ» …..»FUZnZ» y así dependiendo de los parámetros. Y podrá ser de varios tipos, pudiendo ver todos los Payload con la ejecución de «wfuzz -e payloads» y para detalles «wfuzz -z help» . A continuación algunos de los que creemos son más interesantes
- file,<fichero> // Lee de un fichero (-w <fichero> es similar)
- stdin // Lee de la entrada estándar, muy útil usarlo con un PIPE y recoja las cargas de un programa.
- range,<min-max>
- hexrange es como range pero con números hexadecimales.
- list,<lista separada por guiones>
- permutation,<caracteres>-<longitud> Realiza la permutación de los caracteres indicados tomados con la longitud indicada.
wfuzz -z permutation,ab-3 http://192.168.56.1:8000/FUZZ
Solicitudes HTTP
Definirá la URL y esta podrá modificarse con valores del Payload con las palabras clave FUZZ–FUZnZ, ya sea los directorios o ficheros como parámetros GET.
También se podrá configurar estas llamadas como POST, con el parámetro «-d» (ejemplo -d param1=val1¶m2=val2) y también poner cokies con el parámetro «-b» (Ejemplo -b nom=valor) pudiendo tener las cookies que deseemos.
-H Para los encabezados (-H cab:valor_cab)
-X Nos permite definir el método a ejecutar. Ejemplo GET, HEAD, STATUS…)
-b Para definir cookies (-b <nombrecookie>=<valor>)
-d Llamada POST (-d <npar>=<valpar>&…..)
-p Si salimos por proxy (-p ip:puerto:tipo) Los tipos SOCKS4, SOCKS5 o HTTP
-L Permite que cuando la solicitud es redireccionada, código 301, vaya a esta y se genere el código de la página redireccionada.
Iterators
Los iteradores nos permiten combinar los payloads (cargas utiles) con el parametro -m. Podremos conocer los iteradores disponibles con «wfuzz -e iterators«
La forma de uso es muy sencilla «wfuzz <payload1> <payload2> -m <iterador> <URL con FUZZ>
Lo mejor es una prueba para ver los tres tipos de iteradores (disponibles en mi versión y listados con wfuzz -e iterators) y para eso ejecutaremos un servidor web con python por ejemplo «python -m SimpleHTTPServer» y lanzaremos wfuzz con iguales cargas pero distintos iteradores para ver como se comporta cada uno.
Con las palabras: Pingüino, Linux, Taza, Java, Tecnologia en el fichero «prueba.txt»
chain
wfuzz -z file,prueba.txt -z list,1-a-palabra-z -m chain http://192.168.56.1:8000/FUZZ
Muy sencilla y dificil 🙂 de explicar, coge la lista de la primera carga útil y luego el de la segunda, este iterador es ideal cuando tenemos varios ficheros por ejemplo de carga util para un fin y deseamos que se ejecuten todos, es como fusionarlos.
product
wfuzz -z file,prueba.txt -z list,1-a-palabra-z -m product http://192.168.56.1:8000/FUZZPRODUCTOFUZ2Z
Realiza un producto cartesiano, para obtener resultados usaremos FUZZ y FUZ2Z. y la mejor forma de verlo es con las solicitudes en el servidor
zip
Une una carga útil con la otra, el número de cargas útiles que se formaran son el de la lista más corta.
wfuzz -z file,prueba.txt -z list,1-2-3-4-5-6-7-8 -m zip http://192.168.56.1:8000/FUZZ-ZIP-FUZ2Z
wfuzz -z file,prueba.txt -z list,1-2-3 -m zip http://192.168.56.1:8000/FUZZ-ZIP-FUZ2Z
Encoder
Las cargas utiles (Payload) podemos codificarlas de forma que tengamos un fichero con texto legible pero se envíe codificado. Para indicar que se codifique ese payload lo que haremos es añadirle un nuevo parámetro «,<codificador>» . Para conocer todos los encoder disponibles ejecutaremos «wfuzz -e encoders» y podremos ver que tenemos más de 20.
Un ejemplo de nuestro fichero «prueba.txt» y codificado con «md5» la primera carga util y «base64» la segunda con iguales palabras.
wfuzz -z file,prueba.txt -z file,prueba.txt,md5 -z file,prueba.txt,base64 -m zip http://192.168.56.1:8000/FUZZ--FUZ2Z--FUZ3Z
También podemos hacer que se realicen solicitudes con múltiples codificaciones, separando estos por guiones.
wfuzz -z file,prueba.txt,base64-md5 http://192.168.56.1:8000/FUZZ
Hasta aquí la primera parte, todavía nos quedan cosas bastantes interesantes como el filtrado de respuestas, el uso de script y también ejemplos específicos para ayudarnos en nuestros análisis de SQL-Injections, XSS, tipos de CMS y también accesos por fuerza bruta entre otros.