
Prueba cientos de técnicas de omisión de URL contra páginas protegidas por 40X usando solicitudes curl sin procesar, con escaneo multimodo, suplantación de encabezados y exportación de resultados en JSON/HTML para la evaluación del control de acceso.
Herramienta que prueba MUCHAS derivaciones (bypasses) de URL para alcanzar una página protegida 40X.
Si te preguntas por qué este código es nada más que un envoltorio sucio de curl, aquí está el motivo:
Esto es sorprendentemente difícil de lograr en Python sin perder todas las bondades de la librería como el análisis, encapsulamiento ssl/tls, etc.
Así que, sé como yo, usa curl como backend, todo irá bien.
Además, esta herramienta se puede usar como biblioteca, consulta lib_sample_usage.py
Recomendamos usar pipx para instalar esta herramienta:```bash
pipx install bypass-url-parser
pipx install git+https://github.com/laluka/bypass-url-parser
Alternativamente, puedes usar `pip`:```bash
pip install bypass-url-parser
Bypass Url Parser, made with love by @TheLaluka A tool that tests MANY url bypasses to reach a 40X protected page.
Usage: bypass-url-parser (-u | -R ) [-m ] [-o ] [-S ] [ (-H
)...] [-r ] [-s ] [--spoofip-replace] [-p ] [--spoofport-replace] [-t ] [-T ] [--request-tls] [--jsonl] [--dump-payloads] [-x <proxy_url>] [-v | -d | -dd]Program options: -u, --url URL (path is optional) to run bypasses against -R, --request Load HTTP raw request from a file -H, --header
Header(s) to use, format: "Cookie: can_i_haz=fire" -m, --mode Bypass modes. See 'Bypasser.BYPASS_MODES' in code [Default: all] -o, --outdir Output directory for results -x, --proxy <proxy_url> Set a proxy in the format http://proxy_ip:port. -S, --save-level Save results level. From 0 (DISABLE) to 3 (FULL) [Default: 2] -s, --spoofip IP(s) to inject in ip-specific headers -p, --spoofport Port(s) to inject in port-specific headers -r, --retry Retry attempts of failed requests. Set 0 to disable all retry tentatives [Default: 1] -t, --threads Scan with N parallel threads [Default: 1] -T, --timeout Request times out after N seconds [Default: 5]General options: -h, --help Show help, you are here :) -v, --verbose Verbose output -d, --debug Show more details like curl commands generated by this tool -dd, --debug Print Debug level 2 (with all classes debug_class output) -V, --version Show version info
Misc options: --spoofip-replace Disable list of default internal IPs in 'http_headers_ip' bypass mode --spoofport-replace Disable list of default internal ports in 'http_headers_port' bypass mode --request-tls Force usage of TLS/HTTPS for the request load with the '-R, --request' option --dump-payloads Print all payloads (curls) generated by this tool. --jsonl Print results in JSON lines format (pipe command output)
Examples: bypass-url-parser -u "http://127.0.0.1/juicy_403_endpoint/" -s 8.8.8.8 -d bypass-url-parser -u /path/urls -t 30 -T 5 -H "Cookie: me_iz=admin" -H "User-agent: test" bypass-url-parser -R /path/request_file --request-tls -m "mid_paths, end_paths"
## Resultado esperado```bash
bypass-url-parser -u http://127.0.0.1:8000/foo/bar
2022-08-09 14:52:40 lalu-perso bup[361559] WARNING Trying to bypass 'http://127.0.0.1:8000/foo/bar' url (3213 payloads)...
2022-08-09 14:52:40 lalu-perso bup[361559] INFO Doing: 50 / 3213
[...]
2022-08-09 14:52:54 lalu-perso bup[361559] INFO Doing: 3200 / 3213
2022-08-09 14:52:54 lalu-perso bup[361559] INFO Retry (1/3) the '16' failed curl commands with 10 threads and 10s timeout
2022-08-09 14:52:54 lalu-perso bup[361559] INFO Retry (2/3) the '16' failed curl commands with 5 threads and 20s timeout
2022-08-09 14:52:54 lalu-perso bup[361559] INFO Retry (3/3) the '16' failed curl commands with 1 threads and 30s timeout
2022-08-09 14:52:55 lalu-perso bup[361559] INFO
[#####] [bypass_method] [payload] => [status_code] [content_type] [content_length] [lines_count] [word_counts] [title] [server] [redirect_url]
[GROUP (1587)] [original_request] [http://127.0.0.1:8000/foo/bar] => [404] [text/html] [469] [14] [95] [Error response] [SimpleHTTP/0.6 Python/3.8.10] []
[GROUP (10)] [http_methods] [-X CONNECT http://127.0.0.1:8000/foo/bar] => [501] [text/html] [500] [14] [96] [Error response] [SimpleHTTP/0.6 Python/3.8.10] []
[SINGLE] [mid_paths] [http://127.0.0.1:8000/???foo/bar] => [200] [text/html] [913] [26] [27] [Directory listing for /???foo/bar] [SimpleHTTP/0.6 Python/3.8.10] []
[SINGLE] [mid_paths] [http://127.0.0.1:8000//???foo/bar] => [301] [] [] [0] [0] [] [SimpleHTTP/0.6 Python/3.8.10] [/???foo/bar]
[SINGLE] [mid_paths] [http://127.0.0.1:8000/??foo/bar] => [200] [text/html] [911] [26] [27] [Directory listing for /??foo/bar] [SimpleHTTP/0.6 Python/3.8.10] []
[SINGLE] [mid_paths] [http://127.0.0.1:8000//??foo/bar] => [301] [] [] [0] [0] [] [SimpleHTTP/0.6 Python/3.8.10] [/??foo/bar]
[SINGLE] [mid_paths] [http://127.0.0.1:8000/?foo/bar] => [200] [text/html] [909] [26] [27] [Directory listing for /?foo/bar] [SimpleHTTP/0.6 Python/3.8.10] []
[SINGLE] [mid_paths] [http://127.0.0.1:8000//?foo/bar] => [301] [] [] [0] [0] [] [SimpleHTTP/0.6 Python/3.8.10] [/?foo/bar]
[SINGLE] [mid_paths] [http://127.0.0.1:8000///?anythingfoo/bar] => [200] [text/html] [929] [26] [27] [Directory listing for ///?anythingfoo/bar] [SimpleHTTP/0.6 Python/3.8.10] []
[SINGLE] [mid_paths] [http://127.0.0.1:8000////?anythingfoo/bar] => [200] [text/html] [931] [26] [27] [Directory listing for ////?anythingfoo/bar] [SimpleHTTP/0.6 Python/3.8.10] []
[GROUP (2)] [mid_paths] [http://127.0.0.1:8000/#?foo/bar] => [200] [text/html] [893] [26] [27] [Directory listing for /] [SimpleHTTP/0.6 Python/3.8.10] []
[GROUP (2)] [mid_paths] [http://127.0.0.1:8000//#?foo/bar] => [301] [] [] [0] [0] [] [SimpleHTTP/0.6 Python/3.8.10] [/]
sudo apt install -y bat curl virtualenv python3
virtualenv -p python3 .py3 source .py3/bin/activate PDM_BUILD_SCM_VERSION="$(git describe --abbrev=0)-dev" pip install .
python src/bypass_url_parser/init.py -u https://thinkloveshare.com/juicy_403_endpoint/
bypass-url-parser -u https://thinkloveshare.com/juicy_403_endpoint/ cat /tmp/tmpRANDOM-bypass-url-parser/triaged-bypass.json | jq -r '.results[].request_curl_cmd' cat /tmp/tmpRANDOM-bypass-url-parser/triaged-bypass.json | jq -r '.results[].response_data'
### DOCKER```bash
docker run --rm -it -v "$PWD:/host" -w /host ghcr.io/laluka/bypass-url-parser:latest bash -il
# Then bup -h, keep the docker open as the output is saved by default in /tmp
# Or specify the output to the current directory, and consult them later! :)
Bypass_url_parser permite definir algunos argumentos de varias maneras:
-m, --mode, -s, --spoofip y -p, --spoofport pueden ser un nombre de archivo, una cadena, una lista de cadenas separadas por comas o una lista (cuando se usa Bypasser como biblioteca);-u, --url puede ser un nombre de archivo, una cadena o una lista (cuando se usa Bypasser como biblioteca);stdin (con -) es compatible con todos estos argumentos.Por ejemplo, si desea definir varias URL objetivo (-u, --url), todos los siguientes comandos producen el mismo resultado:```bash
bypass-url-parser -u http://thinkloveshare.com/test
bypass-url-parser -u /path/urls
cat /path/urls | bypass-url-parser -u -
echo 'http://thinkloveshare.com/test' | bypass-url-parser -u -
### Definición del objetivo
Se debe definir un objetivo para que la herramienta funcione. 2 opciones:
- `-u, --url`: URL(s), en GET
- `-R, --request`: Archivo de solicitud. El protocolo no se puede adivinar desde el archivo, por lo que `http` por defecto o `https` si la opción `--request-tls` está presente.
### Modo de evasión
Si se especifica `-m, --mode`, puede seleccionar el modo de evasión deseado para ejecutar una prueba específica (o pruebas) y reducir la cantidad de solicitudes enviadas por la herramienta.
Por ahora, se admiten los siguientes modos de evasión:```
all, mid_paths, end_paths, case_substitution, char_encode, http_methods, http_versions, http_headers_method, http_headers_scheme, http_headers_ip, http_headers_port, http_headers_url, user_agent
Ejemplo:```bash bypass-url-parser -u /path/urls -m "case_substitution, char_encode, http_headers_scheme"
### Spoofip / Spoofport
Para personalizar las direcciones IP y los puertos utilizados en los intentos de bypass, la herramienta admite las siguientes opciones:
- Con `-s, --spoofip` puedes configurar algunas IP(s) para inyectar en cabeceras `ip-specific` (`X-Forwarded-For`, `X-Real-Ip`, etc.)
- Con `-p, --spoofport` puedes configurar algunos puertos para inyectar en cabeceras `port-specific` (`X-Forwarded-Port`)
Por defecto, estas entradas personalizadas se añaden a las listas internas de IP/puertos. Si quieres usar solo tus IP(s)/puerto(s), puedes usar los argumentos `--spoofip-replace` y/o `--spoofport-replace`.
Ejemplo:```bash
bypass-url-parser -u /path/urls -s /path/custom_ip --spoofip-replace
bypass-url-parser -u /path/urls -p "3000, 9443, 10443"
Con la opción --jsonl, es posible imprimir los resultados en stdout en formato JSON-Lines. La salida y los resultados estándar de la herramienta se muestran con un registrador en stderr, por lo que es posible canalizar el formato de salida JSON-Line con otras herramientas:```bash
bypass-url-parser -u "https://thinkloveshare.com/juicy_403_endpoint/" -t 20 -S 0 -m case_substitution,char_encode --jsonl | jq
***Notas:** Con `-S 2` o `-S 3`, la salida JSON-Lines también incluye la ruta y el nombre de los archivos html guardados.*
### Guardado de resultados
Por defecto, si la URL objetivo es única, la herramienta guarda una copia de los resultados en el directorio `/tmp/tmpXXX-bypass-url-parser/`.
***Notas:** Si se pasan múltiples URLs objetivo a `-u`, los resultados se prefijan con la URL como directorio (`/tmp/tmpXXX-bypass-url-parser/http-target-com-8080-api-users/`).*
Hay dos argumentos para personalizar este comportamiento:
- `-o, --outdir` para establecer un directorio de salida personalizado
- `-S, --save-level` para elegir un nivel de guardado
Los niveles de guardado son:
- `0` (NINGUNO): Deshabilita el guardado de salida y la creación del directorio de salida;
- `1` (MÍNIMO): Solo guarda el archivo de registro del programa que contiene los resultados: `triaged-bypass.log`;
- `2` (PERTINENTE): Guarda el archivo de registro `triaged-bypass.log` y las respuestas curl **pertinentes (resultados)** en el archivo `triaged-bypass.json` y archivos html separados (Predeterminado);
- `3` (COMPLETO): Guarda el archivo de registro `triaged-bypass.log` y **todas** las respuestas curl en el archivo `triaged-bypass.json` y archivos html separados.
#### Ejemplo```bash
bypass-url-parser -S 0
bypass-url-parser -S 1 -o /tmp/bypass-res
bypass-url-parser -S 2 -o /tmp/bypass-res2 -H "User-Agent: curl 7.74.0" -u http://thinkloveshare.com/juicy_403_endpoint/
tree /tmp/bypass-res2/
├── bypass-2469eecf6c38b5817d2248e911ad4382.html
├── bypass-6f7cce7caf0a0a4b440859fa189d496d.html
├── bypass-80f4ab5d32b4e74c20630c7e67f2e42f.html
├── bypass-93079abffe63d34f79ac4a511cd6b5e6.html
├── bypass-945822230d58d1ad4680d5dfbc470ecb.html
├── bypass-e6118c315eea0e5b2ebc4fcafe0559c0.html
├── triaged-bypass.json
└── triaged-bypass.log
0 directories, 8 files
A partir del nivel MINIMAL, los resultados mostrados por el programa se guardan en el archivo triaged-bypass.log.
Con los niveles de guardado PERTINENT y FULL, el programa exporta adicionalmente todos los resultados en el archivo triaged-bypass.json:```json
{
"url": "http://thinkloveshare.com/juicy_403_endpoint/",
"bypass_modes": "all",
"results": [
{
"request_curl_cmd": "/usr/bin/curl -sS -kgi -H 'User-Agent: curl 7.74.0' --path-as-is -H 'X-BlueCoat-Via: localhos[...SNIP...]",
"request_curl_payload": "-H X-BlueCoat-Via: localhost http://thinkloveshare.com/juicy_403_endpoint/",
"response_headers": "HTTP/1.1 301 Moved Permanently\nConnection: keep-alive\nContent-Length: 162\nServer: GitHub.c[...SNIP...]",
"response_data": "\n301 Moved Permanently\n\n
Haciéndolos más fáciles de manejar con `jq`:```bash
$ jq -r '.results[] | [.request_curl_payload, .response_status_code, .response_content_type, .response_content_length] | join("|")' /tmp/bypass-res2/triaged-bypass.json
-H X-BlueCoat-Via: localhost http://thinkloveshare.com/juicy_403_endpoint/|301|text/html|162
-X PROPFIND http://thinkloveshare.com/juicy_403_endpoint/|405||131
http://thinkloveshare.com/%3b%2f%2e%2e%2f%2e%2e%2f%2fjuicy_403_endpoint/|400|text/html|9121
-H Host: 8.8.8.8 http://thinkloveshare.com/juicy_403_endpoint/|404|text/html|9115
-X CONNECT http://thinkloveshare.com/juicy_403_endpoint/|400|text/plain|15
http://thinkloveshare.com/juicy_403_endpoint/°//|400|text/html|90
Con los niveles de guardado PERTINENT y FULL, los comandos curl y las respuestas HTTP completas también se almacenan en archivos pseudo .html:```bash
$ echo /tmp/bypass-res2/*.html | xargs batcat
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: /tmp/bypass-res2/bypass-2469eecf6c38b5817d2248e911ad4382.html
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ /usr/bin/curl -sS -kgi -H 'User-Agent: curl 7.74.0' --path-as-is 'http://thinkloveshare.com/juicy_403_endpoint/°//'
2 │
3 │ HTTP/1.1 400 Bad request
4 │ Connection: keep-alive
5 │ Content-Length: 90
6 │ Cache-Control: no-cache
7 │ Content-Type: text/html
8 │ Accept-Ranges: bytes
9 │ Date: Tue, 25 Apr 2023 23:51:38 GMT
10 │ Via: 1.1 varnish
11 │ X-Served-By: cache-par-lfpg1960025-PAR
12 │ X-Cache: MISS
13 │ X-Cache-Hits: 0
14 │ X-Timer: S1682466698.230664,VS0,VE10
15 │ Vary: Accept-Encoding
16 │ X-Fastly-Request-ID: b6bbb82302420db4f101a316dca39cc283a4fd44
17 │
18 │
## Colaboradores
- Lanzamiento inicial por [@TheLaluka](https://twitter.com/TheLaluka)
- Gran refactorización y modo biblioteca gracias a [@jtop_fap](https://twitter.com/jtop_fap)
- Soporte para compilaciones `Docker` y `Pypi` gracias al amable trabajo de [@DugnyG](https://twitter.com/DugnyG)
## Licencia
Copyright (C) 2022 Laluka
Este programa es software libre: puedes redistribuirlo y/o modificarlo bajo los términos de la GNU Affero General Public License tal como la publica la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a tu elección) cualquier versión posterior.
Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulta la GNU Affero General Public License para más detalles.
Deberías haber recibido una copia de la GNU Affero General Public License junto con este programa. Si no es así, visita <https://www.gnu.org/licenses/>.