
Herramienta de fuzzing de expresiones regulares en caja negra que genera payloads para eludir validaciones de entrada, descubrir normalizaciones y evadir WAFs en aplicaciones web.
REcollapse es una herramienta auxiliar para el fuzzing de expresiones regulares en caja negra con el fin de evitar validaciones y descubrir normalizaciones en aplicaciones web.
También puede ser útil para evadir WAF y mitigaciones débiles de vulnerabilidades. Para más información, echa un vistazo al artículo del blog sobre REcollapse.
El objetivo de esta herramienta es generar cargas útiles para pruebas. El fuzzing real debe realizarse con otras herramientas como Burp (intruder), Caido (automate), ffuf o similares.
Requisitos: Python 3
pip3 install recollapse o python3 setup.py install o pip3 install .
Docker
docker build -t recollapse . o docker pull 0xacb/recollapse
$ recollapse -h
usage: recollapse [-h] [-m MODES] [-e {1,2,3,4}] [-r RANGE] [-s SIZE] [-f FILE] [-an] [-mn MAXNORM] [-mt MAXTRUNC] [-nt] [-tt] [-ct]
[--html] [--version]
[input]
REcollapse es una herramienta auxiliar para el fuzzing de expresiones regulares en caja negra con el fin de evitar validaciones y descubrir normalizaciones en aplicaciones web
argumentos posicionales:
input entrada original
opciones:
-h, --help muestra este mensaje de ayuda y sale
-m, --modes, -p, --positions MODES
modos de variación. Ejemplo: 1,2,3,4,5,6,7 (por defecto). 1: inicio, 2: separador, 3: normalización, 4:
terminación, 5: metacaracteres de regex, 6: cambio de mayúsculas/minúsculas, 7: truncamiento de bytes
-e, --encoding {1,2,3,4}
1: formato codificado en URL (por defecto), 2: formato Unicode, 3: formato bruto, 4: formato doblemente codificado en URL
-r, --range RANGE rango de bytes para el fuzzing. Ejemplo: 0,0xff (por defecto)
-s, --size SIZE número de bytes de fuzzing (por defecto: 1)
-f, --file FILE leer entrada desde un archivo
-an, --alphanum incluir bytes alfanuméricos en el rango de fuzzing
-mn, --maxnorm MAXNORM
número máximo de normalizaciones (por defecto: 3)
-mt, --maxtrunc MAXTRUNC
número máximo de truncamientos (por defecto: 3)
-nt, --normtable mostrar la tabla de normalización
-tt, --trunctable mostrar la tabla de truncamiento
-ct, --casetable mostrar la tabla de mayúsculas/minúsculas
--html mostrar las tablas en formato HTML
--version muestra la versión de recollapse
Consideremos this_is.an_example como entrada.
Modos
$this_is.an_examplethis$_$is$.$an$_$examplethis_is.an_example$.^$*+-?()[]{}\|Codificación
application/x-www-form-urlencoded o parámetros de consulta/cuerpo: %22this_is.an_exampleapplication/json: \u0022this_is.an_examplemultipart/form-data: "this_is.an_exampleRango
Especificar un rango de bytes para el fuzzing: -r 1-127. Esto excluirá los caracteres alfanuméricos a menos que se proporcione la opción -an.
Tamaño
Especificar el tamaño del fuzzing para los modos 1, 2 y 4. La aproximación por defecto es fuzzear todos los valores posibles para un byte. Aumentar el tamaño consumirá más recursos y generará muchas más entradas, pero puede llevar a encontrar nuevos bypass.
Archivo
La entrada se puede proporcionar como argumento posicional, stdin o un archivo mediante la opción -f.
Alfanumérico
Por defecto, los caracteres alfanuméricos se excluirán de la generación de salida, lo que generalmente no es interesante en términos de respuestas. Puedes permitirlo con la opción -an.
Número máximo de normalizaciones
No todas las librerías de normalización tienen el mismo comportamiento. Por defecto, se generan tres posibilidades de normalización para cada índice de entrada, que suele ser suficiente. Usa la opción -mn para ir más allá.
Tablas
Usa la opción -nt para mostrar la tabla de normalización, la opción -ct para mostrar la tabla de mayúsculas/minúsculas y la opción -tt para mostrar la tabla de truncamiento. También puedes usar la opción --html para mostrar las tablas en formato HTML.
$ recollapse -nt --html > normalization_table.html
$ recollapse -tt --html > truncation_table.html
$ recollapse -ct --html > case_table.html
Usando REcollapse como herramienta de línea de comandos:
$ recollapse -e 1 -m 1,2,4 -r 10-11 https://legit.example.com
%0ahttps://legit.example.com
%0bhttps://legit.example.com
https%0a://legit.example.com
https%0b://legit.example.com
...
$ echo "[email protected]" | recollapse
%[email protected]
%[email protected]
...
$ echo "<svg/onload=alert(1)>" | recollapse | ffuf -w - -u "https://example.com/?param=FUZZ" -mc 200,403,500
Usando REcollapse como biblioteca:
from recollapse import Recollapse
recollapse = Recollapse(modes=Recollapse.DEFAULT_MODES,
encoding=Recollapse.ENCODING_RAW)
variants = recollapse.generate("<script")
for variant in variants:
print(variant)
Esta técnica fue presentada originalmente en BSidesLisbon 2022
Artículo del blog: https://0xacb.com/2022/11/21/recollapse/
Diapositivas:
Videos:
Tablas:
Agradecimientos
y
Este proyecto se crea únicamente con fines educativos y de pruebas éticas. El uso de esta herramienta para atacar objetivos sin consentimiento mutuo previo es ilegal. Los desarrolladores no asumen ninguna responsabilidad y no son responsables de ningún uso indebido o daño causado por esta herramienta.