
Herramienta basada en Python para pruebas de contrabando de solicitudes HTTP y desincronización, que detecta vulnerabilidades CL.TE y TE.CL utilizando payloads de mutación configurables y escaneo automatizado.
______ _
/ _____) | |
( (____ ____ _ _ ____ ____| | _____ ____
\____ \| \| | | |/ _ |/ _ | || ___ |/ ___)
_____) ) | | | |_| ( (_| ( (_| | || ____| |
(______/|_|_|_|____/ \___ |\___ |\_)_____)_|
(_____(_____|
@defparam
Una herramienta de prueba de HTTP Request Smuggling / Desync escrita en Python 3
Un agradecimiento especial a James Kettle por su investigación y métodos sobre desincronizaciones HTTP
Y un agradecimiento especial a Ben Sadeghipour por las pruebas beta de Smuggler y por permitirme discutir mi trabajo en Nahamcon 2020
Esta herramienta no garantiza la ausencia de falsos positivos o falsos negativos. Que una mutación informe OK no significa que no haya un problema de desincronización, pero más importante aún, que la herramienta indique un posible problema de desincronización no significa que definitivamente exista uno. El script puede encontrarse con procesadores de solicitudes de grandes entidades (por ejemplo, Google/AWS/Yahoo/Akamai/etc.) que pueden mostrar 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
Smuggler requiere como mínimo una URL a través del argumento -u/--url o una lista de URLs canalizada al script a través de stdin.
Si la URL especifica https://, Smuggler se conectará al host:puerto usando SSL/TLS. Si la URL especifica http://
no se usará SSL/TLS en absoluto. Si solo se especifica el host, el script usará https:// por defecto.
Use -v/--vhost <host> para especificar un encabezado Host diferente de la dirección del servidor.
Use -x/--exit_early para salir del escaneo de un servidor determinado cuando se encuentre un problema potencial. En modo canalizado, Smuggler simplemente continuará con el siguiente host de la lista.
Use -m/--method <method> para especificar un verbo HTTP diferente de POST (por ejemplo, GET/PUT/PATCH/OPTIONS/CONNECT/TRACE/DELETE/HEAD/etc.)
Use -l/--log <file> para escribir la salida en un archivo además de stdout.
Use -q/--quiet para reducir la verbosidad y solo registrar los problemas encontrados.
Use -t/--timeout <value> para especificar el tiempo de espera del socket. El valor debe ser lo suficientemente alto para concluir que el socket está colgado, pero lo suficientemente bajo para acelerar las pruebas (por defecto: 5).
Use --no-color para suprimir los códigos de color de la salida impresa en stdout (los registros por defecto no incluyen códigos de color).
Use -c/--configfile <configfile> para especificar su archivo de configuración de mutaciones de Smuggler (por defecto: default.py).
Los archivos de configuración son archivos Python que existen en el directorio ./config de Smuggler. Estos archivos describen el contenido de las solicitudes HTTP y las mutaciones de transfer-encoding a probar.
Aquí está el contenido de ejemplo de 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))
Todavía no hay argumentos de entrada para especificar sus propios encabezados personalizados y user-agents. Se recomienda crear su propio archivo de configuración basado en default.py y modificarlo a su gusto.
Smuggler viene con 3 archivos de configuración: default.py (rápido), doubles.py (específico, lento), exhaustive.py (muy lento) default.py es el más rápido porque contiene menos mutaciones.
Especifique los archivos de configuración usando la opción de línea de comandos -c/--configfile <configfile>
Dentro del directorio de Smuggler se encuentra el directorio payloads. Cuando Smuggler encuentra un posible problema de desincronización CLTE o TECL, automáticamente guarda un archivo txt binario del payload problemático en el directorio payloads. Todos los nombres de archivos de payload están anotados con el nombre del host, el tipo de desincronización y el tipo de mutación. Use estos payloads para netcat directamente al servidor o para importarlos en otras herramientas de análisis.
Después de encontrar un problema de desincronización, no dude en usar mis scripts de desincronización de Turbo Intruder que se encuentran aquí: https://github.com/defparam/tiscripts
DesyncAttack_CLTE.py y DesyncAttack_TECL.py son excelentes scripts para ayudar a preparar un ataque de desincronización.
Estos scripts se publican bajo la licencia MIT. Consulte LICENSE.