Fälschung von Serveranforderungen, blinder SSRF-Betrieb

Es gibt so etwas wie SSRF. Es ist viel über sie geschrieben worden, aber ich werde es Ihnen trotzdem kurz erzählen.
Angenommen, Sie gehen zur Website, füllen das Profil aus und rufen den Eintrag „Avatar hochladen“ auf. Und Sie haben die Wahl: Laden Sie eine Datei hoch oder geben Sie einen Link an.

In diesem Fall interessiert uns der zweite Punkt. Wenn wir einen Link zu einer Ressource bereitstellen, die ein Bild enthält, führt die Webanwendung Folgendes aus:

  1. Lädt es herunter
  2. Überprüfen Sie, ob das Bild das Bild ist
  3. Überprüfen Sie die Größen, da sie möglicherweise nicht passen
  4. Dem Benutzer anzeigen (zum Schneiden)


Also. Wenn die Site nicht überprüft, von wo sie versucht, das Bild herunterzuladen, handelt es sich (in der Regel) um eine Sicherheitsanfälligkeit. Darüber hinaus sind die Angriffe auf ein so kleines Feature wie das Herunterladen von Bildern so umfangreich, dass in der Leiste nicht genügend Daten vorhanden sind, um alle Optionen zu prüfen.



Ich wurde einmal gefragt: „Was kann ich tun, wenn ich nur einen http-Link setzen kann? Es gibt nichts! "
Ich sage es dir.

Am einfachsten ist es, die darin enthaltenen Dienste zu identifizieren. Wenn es sich um ein Bild handelt, können Sie versuchen, sich die Standardpfade wie favicon.ico, logos oder das Verzeichnis icons anzusehen, was darauf hindeutet, dass Apache verwendet wird. Durch das Senden von Anfragen können wir beliebte lokale Adressen sowie Subdomänen der Site durchlaufen, die in der internen Infrastruktur funktionieren. Dies sind alle Arten von Bambus, Jira, Gitlab und andere Dinge, die von allen Unternehmen geliebt werden.

Was ist dafür nötig? Aber weil Wissen Macht ist. Schließlich können Sie auch blind verschiedene Schwachstellen und Exploits ausnutzen. Wenn Sie den Hersteller oder die Version des verwendeten Webservers oder Dienstes kennen, können Sie die Anzahl der möglichen Angriffe einschränken. Vielleicht noch nicht einmal jetzt, aber in Zukunft hilft es Ihnen, die technischen Informationen über die interne Infrastruktur zu kennen, um andere Schwachstellen auszunutzen.

Nun, wir durften keine IP-Adressen eingeben. Angenommen, wir haben eine wichtige Ressource in der Infrastruktur und ihre IP-Adresse lautet 192.168.1.1

Zunächst starten wir mental eine Domain, der wir diese IP zuweisen. Lassen Sie es my-test-site.com sein. Im wirklichen Leben sollten Sie Subdomains erstellen, deren Adresse an die IP weitergeleitet wird, die wir benötigen, aber dazu später mehr.

Passwort Brute Force



Lassen Sie uns träumen, dass wir einen Router im Inneren haben. Das Verzeichnis / admin / befindet sich unter Basisauthentifizierung. Durch Ändern des Links können wir Anmeldungen und Kennwörter für den Router auswählen. Aber hier ist es ganz einfach, wir bilden nur einen Link des Formulars

http://login:password@my-test-site.com/admin/

Daher ist der Wert vor dem Doppelpunkt das Login, danach das Passwort. Über das @ -Zeichen wird eine Domain eingerichtet, in die diese Daten gesendet werden. Bitte beachten Sie, dass es nicht mit allen Arten von Kontaktpersonen funktioniert, bei denen Sie ein Formular ausfüllen müssen. Daher ist eine Standardauthentifizierung erforderlich - ein Popup-Fenster mit einer 401-Antwort vom Server.

Wenn wir Glück hätten und die Site mindestens den Antwortcode (200, 401, 503) zurückgeben würde, wäre es viel einfacher. Dann können wir den Prozess klar beobachten und unseren Sieg sehen:

http://admin:password@my-test-site.com/admin/ - 401
http://admin:admin@my-test-site.com/admin/ - 401
http://admin:123456@my-test-site.com/admin/ - 200


Wenn Sie ein oder zwei Dutzend solcher Anfragen senden, können Sie versuchen, das Kennwort für diesen Router zu ermitteln. Wenden Sie sich dann an das Skript, um Ihr eigenes DNS oder sogar /reboot.cgi zu speichern

Und wenn es keine Antwort gibt und es immer das gleiche ist?

Hier helfen uns die Timings.

Timings



Alles braucht Zeit. Da ich mir Zeit nehme, um einen Artikel zu lesen, nehmen sich die Dienste Zeit, um zu antworten.
Die Besonderheit ist, dass wir versuchen können, auf interne Ressourcen zuzugreifen und den Zeitplan zu messen, um die Frage zu beantworten - gibt es dort einen Dienst oder nicht?
Nachdem Sie viele Anfragen gesendet haben, können Sie interne Dienste, Ports und sogar Verzeichnisse und Dateien blind sortieren und dabei auf eine Anomalie von Antworten zurückgreifen.

1302 ms - http://test.company.com
1307 ms - http://db.company.com
5483 ms - http://jira.company.com
1410 ms - http://docs.company.com
1366 ms - http://kafka.company.com


Die Jira-Subdomain hat am längsten geantwortet, am wahrscheinlichsten im Inneren. Der Unterschied ist auf die Tatsache zurückzuführen, dass der Webserver versucht hat, die Seite zu laden, und dann festgestellt hat, dass es sich nicht um ein Bild handelt. Und was uns wichtig ist, ist nicht die Tatsache, "Wer hat am längsten geantwortet?", Sondern genau "Wer hat nicht geantwortet wie alle anderen?" Weil das Timing wie eine Verzögerung sein kann - zum Beispiel, wenn Sie eine große Datei oder ein Skript finden, deren Ausführung lange dauert. Oder umgekehrt, eine schnelle Antwort.

1302 ms - http://test.company.com
1307 ms - http://db.company.com
423 ms - http://jira.company.com
1410 ms - http://docs.company.com
1366 ms - http://kafka.company.com


In diesem Fall besagt die Antwort, dass entweder 401 oder eine Umleitung den Bildparser nicht verarbeitet. Oder vielleicht ist die Site zugänglich, aber nachdem wir die ersten Bytes oder den Inhaltstyp überprüft haben, hat unsere Webanwendung sie abgelehnt, bevor sie die Seite vollständig heruntergeladen hat. Andere Sites in diesem Beispiel haben nicht auf eine Verbindung gewartet (oder der Hostname wurde nicht nüchtern)

IP-Überprüfungsmechanismen



Viele Sites haben überprüft, dass die IP-Adresse nicht intern ist. Die Logik ist jedoch möglicherweise falsch, und manchmal kann die Verbindung der Anwendung mit der internen IP-Adresse hergestellt werden. Ein Standort überprüft beispielsweise zwei logische Blöcke. Zunächst wird überprüft, ob der Host, der auf die externe IP verweist, mir korrekt zugewiesen wurde. Wenn die Site nach erfolgreichem Bestehen der ersten Prüfung eine Verbindung herstellt und die IP-Adresse aus dem vorherigen Absatz nicht zwischengespeichert wird, können Sie einen lustigen Trick ausprobieren.

Geben Sie bei der ersten Anfrage der Domain my-test-site.com eine externe IP an, zum Beispiel 123.123.123.123
Sobald die Validierung erfolgreich abgeschlossen wurde, senden Sie die interne IP-Adresse an dieselbe Domain.

In diesem Fall hat Emil Lerner einen coolen Service geleistet - 1u.ms!

Die 1u.ms-Domain antwortet mit den von Ihnen angegebenen IP-Adressen.

Das Format der Domain sollte wie folgt sein:

make-%IP%-rebind-%IP-rr.1u.ms

Zum Beispiel

make-123.123.123.123-rebind-127.0.0.1-rr.1u.ms

Die erste Anfrage wird mit der Adresse 123.123.123.123 beantwortet, und die zweite Anfrage wird bereits um 127.0.0.1 beantwortet (wenn sie nacheinander sind, innerhalb von 5 Sekunden).

Die IP-Adresse kann übrigens auch ohne Punkte geschrieben werden, falls Sie eine Subdomain benötigen:

make-123-123-123-123-rebind-127-0-0-1-rr.1u.ms

Übrigens können Sie vor make und nach rr beliebige Wörter schreiben, um die Verwendung von zwischengespeicherten Daten zu verhindern:

bo0om-make-123-123-123-123-rebind-127-0-0.1-rr-test.1u.ms

Und um das Protokoll anzuzeigen - das Analogon von tail -f:
curl http://1u.ms:8080/log
(oder der gleiche Link im Browser)

Port-Scanning über DNS



Bei der Verwaltung von DNS-Einträgen können Sie sogar versuchen, Ports zu scannen. Ein kleiner Trick hilft uns dabei.

Angenommen, wir haben eine Domain my-test-site.com.

Normalerweise enthält es mindestens einen A-Datensatz, den die Ressource öffnen kann.
Angenommen, die IP-Adresse unserer Website lautet 172.217.20.46 (von google.com übernommen). Wir können aber mehrere solche Einträge angeben! Stellen Sie sich vor, wir haben sie erstellt und unsere DNS-Einträge sehen folgendermaßen aus:

my-test-site.com 172.217.20.46
my-test-site.com 192.168.1.1


Wird unsere Ressource geöffnet? Ja, das wird es. Und das alles, weil die erste Platte an erster Stelle steht.

Ändern Sie nun die DNS-Einträge wie folgt:

my-test-site.com 192.168.1.1
my-test-site.com 172.217.20.46


Wird unsere Ressource geöffnet? Werde wiederkommen :)

Und das alles, weil die Ressource zuerst versucht, von der ersten angegebenen IP zu booten, und wenn es Probleme damit gibt, geht sie zur zweiten.

curl "my-test-site.com" -v
* Trying 192.168.1.1...
* TCP_NODELAY set
* Immediate connect fail for 192.168.1.1: Host is down
* Trying 172.217.20.46...
* TCP_NODELAY set
* Connected to my-test-site.com (172.217.20.46) port 80 (#0)
> GET / HTTP/1.1
> Host: my-test-site.com
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Content-Type: text/html; charset=UTF-8
< Referrer-Policy: no-referrer
< Content-Length: 1561
< Date: Tue, 21 Jan 2020 16:35:08 GMT


Mit dieser Funktion können Sie herausfinden, welche Ports offen sind und welche nicht. In der Tat werden viele (aber nicht alle) Bibliotheken versuchen, zuerst zu der ersten Ressource zu gelangen, die zuerst in den DNS-Einträgen und dann in der zweiten aufgeführt ist.
Hier haben wir den Link zu unserer Ressource beim Laden des Avatars angegeben.

Indem wir unsere Domäne angeben und den Port ändern, versuchen wir, mithilfe der Ausnahmemethode festzustellen, welcher Port verfügbar ist.

http://my-test-site.com:22 - 172.217.20.46:22
http://my-test-site.com:80 - 172.217.20.46:80
http://my-test-site.com:8080 -
http://my-test-site.com:9200 - 172.217.20.46:9200
http://my-test-site.com:3306 -


Da wir 192.168.1.1 als ersten Eintrag angegeben haben, schließen wir, dass diese Adresse die Bibliothek unter 192.168.1.1 (Ports 8080 und 3306) beantwortet hat, auch wenn sie falsch war, aber beantwortet wurde. Diese Ports sind also offen und es gibt Dienste auf ihnen. In diesem Fall wird nicht auf die zweite Adresse umgeschaltet.

Der 1u.ms-Dienst hier kann auch helfen, in diesem Fall haben wir die folgende Konfiguration:

make-%IP%-and-%IP%rr.1u.ms

vom Typ

make-192.168.1.1-and-172.217.20.46rr.1u.ms

Es werden zwei Einträge zurückgegeben, alle anderen Funktionen wie im vorherigen Absatz.

Übrigens kann dieser Ansatz für ein schnelleres DNS-Rebinding verwendet werden, wodurch der Browser gezwungen wird, von einem "hängen gebliebenen" Server auf einen funktionierenden zu wechseln. Ich denke, es wird schneller als eine Minute warten, um den DNS-Cache zu aktualisieren. Bei Chrome funktioniert dieser Trick jedoch nicht, da eine zufällige IP-Adresse verwendet wird.

Ein weiterer Haken ist, dass der DNS-Server, mit dem die Webanwendung die Domänenadressen ermittelt, über ein integriertes Round-Robin-Verfahren verfügen kann: Ändern Sie die Reihenfolge der Datensätze, um die Last gleichmäßig auf alle Server zu verteilen. In 8.8.8.8 wurde diese Funktion beispielsweise abgelehnt, in 1.1.1.1 ist sie jedoch vorhanden.

Weiterleitungen



Versuche es mit Weiterleitungen! Erstens können Weiterleitungen die Anzahl der Anforderungen für eine Webanwendung verringern, beispielsweise beim Scannen von Ports mithilfe von DNS. Wenn Sie die Antwort erhalten, leiten Sie sie an einen anderen Port oder eine andere Domäne weiter. Wenn nicht, ist er vielleicht auf einen offenen Hafen gestolpert.

Aber das Beste ist natürlich, das Protokoll mithilfe der Umleitung zu ändern. In meiner Praxis gab es Fälle, in denen eine Weiterleitung in die Datei: /// etc / passwd funktionierte und den Inhalt der Datei anzeigte. In der Version mit blindem ssrf können Sie versuchen, das Protokoll in gopher zu ändern (solange es noch vorhanden ist), und Sie können bereits Briefe mithilfe von Befehlen an SMTP und andere Funktionen senden.

Denial of Service


Stoppt der Bootloader, wenn ich ihm eine Eingabedatei mit einer Größe von 10 GB gebe? Oder ein Bild mit 225.000 mal 225.000 Pixeln, das 141,4 GB RAM belegt. Dies kann die Leistung der Site beeinträchtigen. Ein abgestürzter Server bringt uns zwar keinen Spaß, aber denken Sie daran.

Und eine ganze Menge von allem



Das ist wahrscheinlich alles, was ich jetzt nennen kann. Dies berücksichtigt nicht die Sicherheitslücken, die mit dem Download (wo er geladen wird, wie er gespeichert wird, der gleichzeitig überprüft wird) und Stücken von Drittanbietern (denken Sie an imagetragick und gifoeb ) verbunden sind. Wenn Sie andere Ideen haben, hinterlassen Sie einen Kommentar.

Ich kann nicht anders, als der SSRF eine Bibel zu geben , die die meisten Fälle dieses Angriffs beschreibt. Und außerdem eine Seite mit SSRF im Lieblings-Repository von PayloadsAllTheThings , das von der Community aktiv unterstützt wird.
Übrigens sind viele Angriffe sowohl auf der Serverseite (auf dem Server) als auch auf der Clientseite (im Browser) möglich. Angreifer - angreifen, kreativ sein. Verteidigen - Verteidigen Sie sich, seien Sie schlauer als angreifen.

https://bo0om.ru/blind-ssrf
Zen

Source: https://habr.com/ru/post/de485888/


All Articles