
Viele Pfade für viele Hosts abrufen – ohne die Hosts zu überlasten
meg ist ein Werkzeug zum Abrufen vieler URLs, das dabei aber 'nett' zu Servern bleibt.
Es kann verwendet werden, um viele Pfade für viele Hosts abzurufen; dabei wird ein Pfad für alle Hosts abgerufen, bevor zum nächsten Pfad übergegangen wird, und wiederholt. Sie erhalten viele Ergebnisse schnell, aber keiner der einzelnen Hosts wird mit Traffic überflutet.
meg ist in Go geschrieben und hat keine Laufzeitabhängigkeiten. Wenn Sie Go 1.9 oder höher installiert und konfiguriert haben, können Sie meg mit go install installieren:
▶ go install github.com/tomnomnom/meg@latest
Oder laden Sie eine Binärdatei herunter und legen Sie sie irgendwo in Ihrem $PATH ab (z.B. in /usr/bin/).
Wenn Sie einen Fehler wie diesen sehen, bedeutet dies, dass Ihre Go-Version zu alt ist:
# 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
Sie sollten entweder Ihre Go-Version aktualisieren oder eine Binärversion für Ihre Plattform verwenden.
Angenommen, eine Datei voller Pfade:
/robots.txt
/.well-known/security.txt
/package.json
Und eine Datei voller Hosts (mit einem Protokoll):
http://example.com
https://example.com
http://example.net
meg wird jeden Pfad für jeden Host anfragen:
▶ 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)
...
Und speichert die Ausgabe in einem Verzeichnis namens ./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>
Ohne Argumente liest meg Pfade aus einer Datei namens ./paths und Hosts aus einer Datei namens ./hosts. Es wird auch keine Ausgabe geben:
▶ meg
▶
Aber es wird eine Index-Datei unter ./out/index speichern:
▶ 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)
Sie können die Index-Datei verwenden, um zu finden, wo die Antwort gespeichert ist, aber es ist oft einfacher, mit grep zu finden, wonach Sie suchen:
▶ grep -Hnri '< Server:' out/
out/example.com/61ac5fbb9d3dd054006ae82630b045ba730d8618:14:< Server: ECS (lga/13A2)
out/example.com/bd8d9f4c470ffa0e6ec8cfa8ba1c51d62289b6dd:16:< Server: ECS (lga/13A3)
Wenn Sie nur einen Pfad anfragen möchten, können Sie ihn direkt als Argument angeben:
▶ meg /admin.php
Die Hilfeausgabe von meg versucht tatsächlich hilfreich zu sein:
▶ meg --help
Request many paths for many hosts
Usage:
meg [options] [path|pathsFile] [hostsFile] [outputDir]
Options:
-c, --concurrency <val> Set the concurrency level (defaut: 20)
-d, --delay <val> Milliseconds between requests to the same host (default: 5000)
-H, --header <header> Send a custom HTTP header
-r, --rawhttp Use the rawhttp library for requests (experimental)
-s, --savestatus <status> Save only responses with specific status code
-v, --verbose Verbose mode
-X, --method <method> HTTP method (default: GET)
Defaults:
pathsFile: ./paths
hostsFile: ./hosts
outputDir: ./out
Paths file format:
/robots.txt
/package.json
/security.txt
Hosts file format:
http://example.com
https://example.edu
https://example.net
Examples:
meg /robots.txt
meg -s 200 -X HEAD
meg -c 30 /
meg hosts.txt paths.txt output
Standardmäßig versucht meg, 20 gleichzeitige Anfragen zu stellen. Sie können das mit der Option -c oder --concurrency ändern:
▶ meg --concurrency 5
Es ist nicht sehr freundlich, die Nebenläufigkeit höher zu halten als die Anzahl der Hosts - Sie könnten viele Anfragen auf einmal an einen Host senden.
Standardmäßig wartet meg 5000 Millisekunden zwischen Anfragen an denselben Host. Sie können das mit der Option -d oder --delay überschreiben:
▶ meg --delay 10000
Warnung: Stellen Sie vor der Verringerung der Verzögerung sicher, dass Sie die Erlaubnis haben, große Mengen von Anfragen an die von Ihnen anvisierten Hosts zu stellen.
Sie können zusätzliche Header in den Anfragen mit der Option -H oder --header setzen:
▶ 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
...
Wenn Sie Anfragen senden möchten, die nicht gültig sind - zum Beispiel mit ungültiger URL-Kodierung - wird der Go-HTTP-Client fehlschlagen:
▶ meg /%%0a0afoo:bar
request failed: parse https://example.org/%%0a0afoo:bar: invalid URL escape "%%0"
Sie können das Flag -r oder --rawhttp verwenden, um die Verwendung der rawhttp-Bibliothek zu aktivieren, die wenig bis gar keine Validierung der Anfrage durchführt:
▶ meg --verbose --rawhttp /%%0a0afoo:bar
out/example.com/eac3a4978bfb95992e270c311582e6da4568d83d https://example.com/%%0a0afoo:bar (HTTP/1.1 404 Not Found)
Die rawhttp-Bibliothek und ihre Verwendung ist experimentell. Unter anderem unterstützt sie noch keine chunked transfer encoding, daher können bei der Verwendung Chunk-Längen in Ihrer Ausgabe auftauchen.
Wenn Sie nur Ergebnisse speichern möchten, die einen bestimmten Statuscode zurückgegeben haben, können Sie die Option -s oder --savestatus verwenden:
▶ meg --savestatus 200 /robots.txt
Sie können angeben, welche HTTP-Methode verwendet werden soll, mit der Option -X oder --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
...