
Ferramenta de fuzzing de regex de caixa-preta que gera payloads para contornar validações de entrada, descobrir normalizações e evadir WAFs em aplicações web.
REcollapse é uma ferramenta auxiliar para fuzzing de regex em caixa-preta, usada para contornar validações e descobrir normalizações em aplicações web.
Também pode ser útil para contornar WAFs e mitigações fracas de vulnerabilidades. Para mais informações, consulte o artigo do blog sobre REcollapse.
O objetivo desta ferramenta é gerar payloads para testes. O fuzzing propriamente dito deve ser feito com outras ferramentas como Burp (intruder), Caido (automate), ffuf ou similares.
Requisitos: Python 3
pip3 install recollapse ou python3 setup.py install ou pip3 install .
Docker
docker build -t recollapse . ou 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 is a helper tool for black-box regex fuzzing to bypass validations and discover normalizations in web applications
positional arguments:
input original input
options:
-h, --help show this help message and exit
-m, --modes, -p, --positions MODES
variation modes. Example: 1,2,3,4,5,6,7 (default). 1: starting, 2: separator, 3: normalization, 4:
termination, 5: regex metacharacters, 6: case folding/upper/lower, 7: byte truncation
-e, --encoding {1,2,3,4}
1: URL-encoded format (default), 2: Unicode format, 3: Raw format, 4: Double URL-encoded format
-r, --range RANGE range of bytes for fuzzing. Example: 0,0xff (default)
-s, --size SIZE number of fuzzing bytes (default: 1)
-f, --file FILE read input from file
-an, --alphanum include alphanumeric bytes in fuzzing range
-mn, --maxnorm MAXNORM
maximum number of normalizations (default: 3)
-mt, --maxtrunc MAXTRUNC
maximum number of truncations (default: 3)
-nt, --normtable print normalization table
-tt, --trunctable print truncation table
-ct, --casetable print case table
--html output tables in HTML format
--version show recollapse version
Considere this_is.an_example como entrada.
Modos
$this_is.an_examplethis$_$is$.$an$_$examplethis_is.an_example$.^$*+-?()[]{}\|Codificação
application/x-www-form-urlencoded ou parâmetros de query/body: %22this_is.an_exampleapplication/json: \u0022this_is.an_examplemultipart/form-data: "this_is.an_exampleIntervalo
Especifica um intervalo de bytes para fuzzing: -r 1-127. Isso excluirá caracteres alfanuméricos, a menos que a opção -an seja fornecida.
Tamanho
Especifica o tamanho do fuzzing para os modos 1, 2 e 4. A abordagem padrão é fuzzar todos os valores possíveis para um byte. Aumentar o tamanho consumirá mais recursos e gerará muito mais entradas, mas pode levar à descoberta de novos bypasses.
Arquivo
A entrada pode ser fornecida como argumento posicional, stdin ou um arquivo através da opção -f.
Alfanumérico
Por padrão, caracteres alfanuméricos serão excluídos da geração de saída, o que geralmente não é interessante em termos de respostas. Você pode permitir isso com a opção -an.
Número máximo de normalizações
Nem todas as bibliotecas de normalização têm o mesmo comportamento. Por padrão, três possibilidades de normalização são geradas para cada índice de entrada, o que geralmente é suficiente. Use a opção -mn para ir além.
Tabelas
Use a opção -nt para mostrar a tabela de normalização, a opção -ct para mostrar a tabela de case e a opção -tt para mostrar a tabela de truncamento. Você também pode usar a opção --html para gerar tabelas em formato HTML.
$ recollapse -nt --html > normalization_table.html
$ recollapse -tt --html > truncation_table.html
$ recollapse -ct --html > case_table.html
Usando REcollapse como ferramenta de linha de comando:
$ 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 foi originalmente apresentada no BSidesLisbon 2022
Artigo no blog: https://0xacb.com/2022/11/21/recollapse/
Slides:
Vídeos:
Tabelas:
Agradecimentos
e
Este projeto é destinado apenas a fins educacionais e de testes éticos. O uso desta ferramenta para atacar alvos sem consentimento mútuo prévio é ilegal. Os desenvolvedores não assumem qualquer responsabilidade e não se responsabilizam por qualquer uso indevido ou danos causados por esta ferramenta.