
Ferramenta de teste de contrabando de solicitações HTTP e dessincronização baseada em Python que detecta vulnerabilidades CL.TE e TE.CL usando payloads de mutação configuráveis e varredura automatizada.
______ _
/ _____) | |
( (____ ____ _ _ ____ ____| | _____ ____
\____ \| \| | | |/ _ |/ _ | || ___ |/ ___)
_____) ) | | | |_| ( (_| ( (_| | || ____| |
(______/|_|_|_|____/ \___ |\___ |\_)_____)_|
(_____(_____|
@defparam
Uma ferramenta de teste de HTTP Request Smuggling / Desync escrita em Python 3
Um agradecimento especial a James Kettle por sua pesquisa e métodos sobre HTTP desyncs
E um agradecimento especial a Ben Sadeghipour por testar o Smuggler em beta e por permitir que eu discutisse meu trabalho no Nahamcon 2020
Esta ferramenta não garante a ausência de falsos positivos ou falsos negativos. O fato de uma mutação reportar OK não significa que não haja um problema de desync, mas mais importante, o fato de a ferramenta indicar um possível problema de desync não significa que ele realmente exista. O script pode encontrar processadores de requisições de grandes entidades (ex: Google/AWS/Yahoo/Akamai/etc..) que podem apresentar resultados falsos positivos.
Host Único:
python3 smuggler.py -u <URL>
Lista de hosts:
cat list_of_hosts.txt | python3 smuggler.py
usage: smuggler.py [-h] [-u URL] [-v VHOST] [-x] [-m METHOD] [-l LOG] [-q]
[-t TIMEOUT] [--no-color] [-c CONFIGFILE]
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL Target URL with Endpoint
-v VHOST, --vhost VHOST
Specify a virtual host
-x, --exit_early Exit scan on first finding
-m METHOD, --method METHOD
HTTP method to use (e.g GET, POST) Default: POST
-l LOG, --log LOG Specify a log file
-q, --quiet Quiet mode will only log issues found
-t TIMEOUT, --timeout TIMEOUT
Socket timeout value Default: 5
--no-color Suppress color codes
-c CONFIGFILE, --configfile CONFIGFILE
Filepath to the configuration file of payloads
O Smuggler requer no mínimo uma URL através do argumento -u/--url ou uma lista de URLs canalizadas para o script via stdin.
Se a URL especificar https://, o Smuggler se conectará ao host:porta usando SSL/TLS. Se a URL especificar http://,
nenhum SSL/TLS será usado. Se apenas o host for especificado, o script usará https:// por padrão.
Use -v/--vhost <host> para especificar um cabeçalho Host diferente do endereço do servidor
Use -x/--exit_early para sair da varredura de um servidor específico quando um possível problema for encontrado. No modo canalizado, o smuggler continuará para o próximo host da lista.
Use -m/--method <method> para especificar um verbo HTTP diferente de POST (ex: GET/PUT/PATCH/OPTIONS/CONNECT/TRACE/DELETE/HEAD/etc...)
Use -l/--log <file> para escrever a saída em um arquivo além do stdout
Use -q/--quiet para reduzir a verbosidade e registrar apenas os problemas encontrados
Use -t/--timeout <value> para especificar o timeout do socket. O valor deve ser alto o suficiente para concluir que o socket está travado, mas baixo o suficiente para acelerar os testes (padrão: 5)
Use --no-color para suprimir os códigos de cor impressos no stdout (os logs por padrão não incluem códigos de cor)
Use -c/--configfile <configfile> para especificar seu arquivo de configuração de mutações do smuggler (padrão: default.py)
Os arquivos de configuração são arquivos Python que existem no diretório ./config do smuggler. Esses arquivos descrevem o conteúdo das requisições HTTP e as mutações de transfer-encoding a serem testadas.
Aqui está um exemplo de conteúdo do default.py:
def render_template(gadget):
RN = "\r\n"
p = Payload()
p.header = "__METHOD__ __ENDPOINT__?cb=__RANDOM__ HTTP/1.1" + RN
# p.header += "Transfer-Encoding: chunked" +RN
p.header += gadget + RN
p.header += "Host: __HOST__" + RN
p.header += "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36" + RN
p.header += "Content-type: application/x-www-form-urlencoded; charset=UTF-8" + RN
p.header += "Content-Length: __REPLACE_CL__" + RN
return p
mutations["nameprefix1"] = render_template(" Transfer-Encoding: chunked")
mutations["tabprefix1"] = render_template("Transfer-Encoding:\tchunked")
mutations["tabprefix2"] = render_template("Transfer-Encoding\t:\tchunked")
mutations["space1"] = render_template("Transfer-Encoding : chunked")
for i in [0x1,0x4,0x8,0x9,0xa,0xb,0xc,0xd,0x1F,0x20,0x7f,0xA0,0xFF]:
mutations["midspace-%02x"%i] = render_template("Transfer-Encoding:%cchunked"%(i))
mutations["postspace-%02x"%i] = render_template("Transfer-Encoding%c: chunked"%(i))
mutations["prespace-%02x"%i] = render_template("%cTransfer-Encoding: chunked"%(i))
mutations["endspace-%02x"%i] = render_template("Transfer-Encoding: chunked%c"%(i))
mutations["xprespace-%02x"%i] = render_template("X: X%cTransfer-Encoding: chunked"%(i))
mutations["endspacex-%02x"%i] = render_template("Transfer-Encoding: chunked%cX: X"%(i))
mutations["rxprespace-%02x"%i] = render_template("X: X\r%cTransfer-Encoding: chunked"%(i))
mutations["xnprespace-%02x"%i] = render_template("X: X%c\nTransfer-Encoding: chunked"%(i))
mutations["endspacerx-%02x"%i] = render_template("Transfer-Encoding: chunked\r%cX: X"%(i))
mutations["endspacexn-%02x"%i] = render_template("Transfer-Encoding: chunked%c\nX: X"%(i))
Ainda não existem argumentos de entrada para especificar seus próprios cabeçalhos e user-agents personalizados. É recomendado criar seu próprio arquivo de configuração baseado no default.py e modificá-lo conforme sua preferência.
O Smuggler vem com 3 arquivos de configuração: default.py (rápido), doubles.py (específico, lento), exhaustive.py (muito lento) default.py é o mais rápido porque contém menos mutações.
especifique os arquivos de configuração usando a opção de linha de comando -c/--configfile <configfile>
Dentro do diretório do Smuggler está o diretório payloads. Quando o Smuggler encontra um possível problema de desync CLTE ou TECL, ele automaticamente despeja um arquivo txt binário do payload problemático no diretório payloads. Todos os nomes de payloads são anotados com o hostname, tipo de desync e tipo de mutação. Use esses payloads para netcat diretamente no servidor ou para importar em outras ferramentas de análise.
Após encontrar um problema de desync, sinta-se à vontade para usar meus scripts de desync do Turbo Intruder encontrados aqui: https://github.com/defparam/tiscripts
DesyncAttack_CLTE.py e DesyncAttack_TECL.py são ótimos scripts para ajudar a montar um ataque de desync
Estes scripts são distribuídos sob a licença MIT. Veja LICENSE.