
Obtén muchas rutas para muchos hosts - sin matar los hosts
meg es una herramienta para obtener muchas URLs pero siendo 'amable' con los servidores.
Se puede usar para obtener muchas rutas de muchos hosts; obteniendo una ruta para todos los hosts antes de pasar a la siguiente ruta y repetir.
Obtienes muchos resultados rápidamente, pero ninguno de los hosts individuales se ve inundado de tráfico.
meg está escrito en Go y no tiene dependencias en tiempo de ejecución. Si tienes Go 1.9
o superior instalado y configurado puedes instalar meg con go install:
▶ go install github.com/tomnomnom/meg@latest
O descarga un binario y
colócalo en algún lugar de tu $PATH (por ejemplo, en /usr/bin/).
Si ves un error como este significa que tu versión de Go es demasiado antigua:
# github.com/tomnomnom/rawhttp
/root/go/src/github.com/tomnomnom/rawhttp/request.go:102: u.Hostname undefined (
type *url.URL has no field or method Hostname)
/root/go/src/github.com/tomnomnom/rawhttp/request.go:103: u.Port undefined (type
*url.URL has no field or method Port)
/root/go/src/github.com/tomnomnom/rawhttp/request.go:259: undefined: x509.System
CertPool
Debes actualizar tu versión de Go, o usar un lanzamiento binario para tu plataforma.
Dado un archivo lleno de rutas:
/robots.txt
/.well-known/security.txt
/package.json
Y un archivo lleno de hosts (con un protocolo):
http://example.com
https://example.com
http://example.net
meg solicitará cada ruta para cada host:
▶ meg --verbose paths hosts
out/example.com/45ed6f717d44385c5e9c539b0ad8dc71771780e0 http://example.com/robots.txt (404 Not Found)
out/example.com/61ac5fbb9d3dd054006ae82630b045ba730d8618 https://example.com/robots.txt (404 Not Found)
out/example.net/1432c16b671043271eab84111242b1fe2a28eb98 http://example.net/robots.txt (404 Not Found)
out/example.net/61deaa4fa10a6f601adb74519a900f1f0eca38b7 http://example.net/.well-known/security.txt (404 Not Found)
out/example.com/20bc94a296f17ce7a4e2daa2946d0dc12128b3f1 http://example.com/.well-known/security.txt (404 Not Found)
...
Y guardará la salida en un directorio llamado ./out:
▶ head -n 20 ./out/example.com/45ed6f717d44385c5e9c539b0ad8dc71771780e0
http://example.com/robots.txt
> GET /robots.txt HTTP/1.1
> Host: example.com
< HTTP/1.1 404 Not Found
< Expires: Sat, 06 Jan 2018 01:05:38 GMT
< Server: ECS (lga/13A2)
< Accept-Ranges: bytes
< Cache-Control: max-age=604800
< Content-Type: text/*
< Content-Length: 1270
< Date: Sat, 30 Dec 2017 01:05:38 GMT
< Last-Modified: Sun, 24 Dec 2017 06:53:36 GMT
< X-Cache: 404-HIT
<!doctype html>
<html>
<head>
Sin argumentos, meg leerá rutas de un archivo llamado ./paths,
y hosts de un archivo llamado ./hosts. Tampoco habrá salida:
▶ meg
▶
Pero guardará un archivo índice en ./out/index:
▶ head -n 2 ./out/index
out/example.com/538565d7ab544bc3bec5b2f0296783aaec25e756 http://example.com/package.json (404 Not Found)
out/example.com/20bc94a296f17ce7a4e2daa2946d0dc12128b3f1 http://example.com/.well-known/security.txt (404 Not Found)
Puedes usar el archivo índice para encontrar dónde está almacenada la respuesta, pero a menudo
es más fácil encontrar lo que buscas con grep:
▶ grep -Hnri '< Server:' out/
out/example.com/61ac5fbb9d3dd054006ae82630b045ba730d8618:14:< Server: ECS (lga/13A2)
out/example.com/bd8d9f4c470ffa0e6ec8cfa8ba1c51d62289b6dd:16:< Server: ECS (lga/13A3)
Si quieres solicitar solo una ruta, puedes especificarla directamente como argumento:
▶ meg /admin.php
La salida de ayuda de meg intenta ser realmente útil:
▶ meg --help
Solicitar muchas rutas para muchos hosts
Uso:
meg [opciones] [ruta|archivoRutas] [archivoHosts] [directorioSalida]
Opciones:
-c, --concurrency <val> Establecer el nivel de concurrencia (por defecto: 20)
-d, --delay <val> Milisegundos entre solicitudes al mismo host (por defecto: 5000)
-H, --header <cabecera> Enviar una cabecera HTTP personalizada
-r, --rawhttp Usar la librería rawhttp para las solicitudes (experimental)
-s, --savestatus <estado> Guardar solo respuestas con código de estado específico
-v, --verbose Modo verboso
-X, --method <método> Método HTTP (por defecto: GET)
Valores por defecto:
archivoRutas: ./paths
archivoHosts: ./hosts
directorioSalida: ./out
Formato del archivo de rutas:
/robots.txt
/package.json
/security.txt
Formato del archivo de hosts:
http://example.com
https://example.edu
https://example.net
Ejemplos:
meg /robots.txt
meg -s 200 -X HEAD
meg -c 30 /
meg hosts.txt paths.txt output
Por defecto, meg intentará realizar 20 solicitudes concurrentes. Puedes cambiar eso
con la opción -c o --concurrency:
▶ meg --concurrency 5
No es muy amigable mantener el nivel de concurrencia más alto que el número de hosts - podrías terminar enviando muchas solicitudes a un solo host a la vez.
Por defecto, meg espera 5000 milisegundos entre solicitudes al mismo host.
Puedes sobrescribir eso con la opción -d o --delay:
▶ meg --delay 10000
Advertencia: antes de reducir el retardo, asegúrate de tener permiso para hacer grandes volúmenes de solicitudes a los hosts que estás atacando.
Puedes establecer cabeceras adicionales en las solicitudes con la opción -H o --header:
▶ meg --header "Origin: https://evil.com"
▶ grep -h '^>' out/example.com/*
> GET /.well-known/security.txt HTTP/1.1
> Origin: https://evil.com
> Host: example.com
...
Si quieres enviar solicitudes que no son válidas - por ejemplo con codificación URL no válida - el cliente HTTP de Go fallará:
▶ meg /%%0a0afoo:bar
request failed: parse https://example.org/%%0a0afoo:bar: invalid URL escape "%%0"
Puedes usar la bandera -r o --rawhttp para habilitar el uso de la librería rawhttp,
que realiza poca o ninguna validación en la solicitud:
▶ meg --verbose --rawhttp /%%0a0afoo:bar
out/example.com/eac3a4978bfb95992e270c311582e6da4568d83d https://example.com/%%0a0afoo:bar (HTTP/1.1 404 Not Found)
La librería rawhttp y su uso son experimentales. Entre otras cosas, aún no
soporta codificación de transferencia fragmentada, por lo que puedes notar longitudes de fragmentos
intercaladas con tu salida si la usas.
Si solo quieres guardar resultados que devolvieron un código de estado específico, puedes
usar la opción -s o --savestatus:
▶ meg --savestatus 200 /robots.txt
Puedes especificar qué método HTTP usar con la opción -X o --method:
▶ meg --method TRACE
▶ grep -nri 'TRACE' out/
out/example.com/61ac5fbb9d3dd054006ae82630b045ba730d8618:3:> TRACE /robots.txt HTTP/1.1
out/example.com/bd8d9f4c470ffa0e6ec8cfa8ba1c51d62289b6dd:3:> TRACE /.well-known/security.txt HTTP/1.1
...