
Erweitern Sie die Netzwerksichtbarkeit aus mehreren Blickwinkeln anderer Hosts.
Im Krieg ist CornerShot eine Waffe, die es einem Soldaten ermöglicht, um eine Ecke zu schauen (und möglicherweise einen Schuss abzugeben), ohne sich selbst zu exponieren. Ähnlich ermöglicht das CornerShot-Paket, den Netzwerkzugriff eines entfernten Hosts zu überprüfen, ohne dass man besondere Berechtigungen auf diesem Host benötigt.
Mit CornerShot kann eine Quelle mit Netzwerkzugriff auf einen Träger feststellen, ob zwischen Träger und Ziel Netzwerkzugriff für einen bestimmten Port p besteht.
Angenommen, ein Red Team versucht, von einem „kompromittierten" Quell-Host A zu einem Ziel-Host X zu gelangen, zu dem Host A keinen Zugriff hat. Wenn sie über Host B propagieren, werden sie erst dann feststellen, dass es keinen Netzwerkzugriff zwischen Host B und X gibt.
Durch die Verwendung von CornerShot kann das Team entdecken, dass Host C tatsächlich Zugriff auf Ziel X hat, sodass die Propagation auf Ziel X zunächst über Host C erfolgen sollte.
+-----+ +-----+ +-----+
| | | | gefiltert| |
| A +--------> B +----X--->(p) X |
| | | | | |
+-----+ +-----+ +-(p)-+
Quelle Träger Ziel
+ ^
| |
| +-----+ |
| | | offen |
+---------->+ C +-------------+
| |
+-----+
Ähnlich wie nmap unterscheidet CornerShot zwischen den folgenden Portzuständen: open, closed, filtered und unknown (falls nicht bestimmbar).
Die folgende Demo zeigt die Ausführung von CornerShot gegen zwei Träger-Hosts 172.0.1.12 & 172.0.1.13, um festzustellen, ob sie Netzwerkzugriff auf 192.168.200.1 haben:

Weitere Informationen hier.
Die scheinbar einfache Aufgabe, festzustellen, ob ein Host B im Netzwerk Zugriff auf Host C hat, kann eine umfangreiche Bereitstellung von Netzwerksensoren, Geräteagenten oder die Sammlung einer Vielzahl von Firewall-Regeln, Router-Konfigurationen und Host-Richtlinien erfordern.
CornerShot kann diesen Prozess vereinfachen, indem ein (oder sehr wenige) Agenten verwendet werden, die andere Hosts im Netzwerk abfragen können, um deren Zugriff auf entfernte Hosts zu bestimmen.
Sicherheitsteams, die BloodHound nutzen, um Berechtigungserweiterungspfade in ihrem Netzwerk zu finden und zu entschärfen, kämpfen oft mit Millionen von logischen Pfaden, die von BloodHound entdeckt werden.
ShotHound ist ein Tool, das CornerShot mit BloodHound integriert, um praktische Pfade zu entdecken, die durch Netzwerkzugriff unterstützt werden.
CornerShot kann als Paket oder als eigenständiges Modul verwendet werden. Die einzigen Anforderungen sind Python 3 und das impacket-Paket.
pip install cornershot
Die grundlegende Verwendung erfordert Anmeldedaten eines gültigen Domänenbenutzers, einen FQDN-Domänennamen, eine Träger-IP und eine Ziel-IP.
python -m cornershot <user> <password> <domain> <carrier> <target>
Um einen Bereich von Trägern gegen einen Bereich von Zielen zu scannen, können Subnetze oder IP-Bereiche in einer kommagetrennten Liste verwendet werden:
python -m cornershot <user> <password> <domain> 192.168.1.10-192.168.1.20 192.168.5.0/24,192.168.6.0/24
Standardmäßig versucht CornerShot, die folgenden Ports zu scannen: 135, 445, 3389, 5985, 5986. Der Benutzer kann eine kommagetrennte Liste von Ports und Portbereichen angeben:
python -m cornershot -tp 22,8080,45000-45005 <user> <password> <domain> <carrier> <target>
Im Code muss man ein CornerShot-Objekt mit dem Benutzernamen, dem Passwort und dem Domänennamen eines gültigen Domänenbenutzers instanziieren. Das Hinzufügen von Trägern, Zielen und Ports erfolgt über die Methode add_shots. Sobald dies erledigt ist, kann die Methode open_fire aufgerufen werden, die nur die relevanten RPC-Aufrufe basierend auf den erforderlichen Ports durchführt.
from cornershot import CornerShot
cs = CornerShot("username", "password", "fqdn")
cs.add_shots(carriers=["192.168.1.1"],targets=["192.168.1.2","192.168.1.3"])
results = cs.open_fire()
Das Ergebnis von open_fire ist ein Wörterbuch mit Schlüsseln für Träger; jeder Träger hat einen weiteren Satz von Schlüsseln für Ziele, und schließlich enthält jedes Ziel ein Wörterbuch von Ports und deren jeweiligen Zuständen. Dies ist ein Beispielformat eines Ergebnisses:
{'carrier_1':
{'target_1':
{135: 'unknown', 445: 'filtered', 3389: 'filtered', 5986: 'filtered', 5985: 'filtered'},
'target_2':
{135: 'unknown', 445: 'open', 5985: 'unknown', 5986: 'filtered', 3389: 'open'}
},
'carrier_2':
{'target_1':
{3389: 'filtered', 135: 'filtered', 5985: 'filtered', 445: 'filtered', 5986: 'unknown'},
'target_2':
{5985: 'filtered', 5986: 'filtered', 445: 'filtered', 135: 'filtered', 3389: 'open'}
}
}
CornerShot basiert auf verschiedenen, gut dokumentierten, standardmäßigen Remote Procedure Call (RPC)-Methoden, die von verschiedenen Microsoft-Diensten verwendet werden. Durch die Verwendung von Methoden, die nur ein authentifiziertes Konto in der Domäne erfordern, kann CornerShot Netzwerkverkehr von einem Träger-Host zu einem Ziel auslösen.
CornerShot kann den Zustand des entfernten Ports bestimmen, indem es die Zeit misst, die ein RPC-Aufruf benötigt hat, und verschiedene Fehlercodes für jede RPC-Methode verwendet.
Der Leser mag mit dem „Printer Bug” vertraut sein, der von Lee Christensen entdeckt wurde. Obwohl es als Bug bezeichnet wird, handelt es sich um ein gut dokumentiertes Verhalten des Druckdienstes, das es jedem authentifizierten Benutzer ermöglicht, einen entfernten Server zu zwingen, sich bei einem beliebigen Rechner zu authentifizieren, unter Verwendung der Methode RpcRemoteFindFirstPrinterChangeNotificationEx.
CornerShot nutzt die folgenden RPC-Methoden aus mehreren Microsoft-Protokollen (es gibt viele weitere Methoden, die in zukünftigen Versionen implementiert werden):
Die Implementierung der Protokolle selbst erfolgt über das hervorragende impacket-Paket.
Diese Methode erhält einen printerName als Parameter. Der printerName kann ein Pfad zu einer lokalen Datei, einer entfernten Datei oder sogar zu einem Webdrucker sein. Durch die Angabe eines Namens, der dem WEB_PRINT_SERVER-Format entspricht, kann jeder entfernte Port abgefragt werden. Ein Beispiel für einen Web-Drucker-Servernamen, der HTTP-Verkehr zu einem entfernten Host und Port auslöst, ist: "http://<target_ip>:<target_port>/printers/ppp/.printer".
Um diese Methode zu nutzen, benötigen wir ein zweistufiges Vorgehen: Zuerst öffnen wir einen Registrierungsschlüssel auf dem entfernten Host – was zu einem gültigen Handle führt – und zweitens versuchen wir, eine Sicherung dieses Handles in einer entfernten Datei zu speichern. Die BaseRegSaveKey-Methode erhält einen Dateipfad, in den sie eine Sicherung einer Registrierung speichern kann, was SMB-Verkehr über Port 445 (und 135 als Backup) zu einem Ziel auslöst. Der Registrierungsschlüssel, den CornerShot öffnet, ist HKEY_CURRENT_USER, der standardmäßig auf den meisten Client-Hosts zum Lesen geöffnet ist.
Diese Funktion versucht, Windows-Ereignisse in einen Dateipfad zu sichern, der entfernt sein kann – in einem solchen Fall versucht der Dienst, auf den entfernten Host und Pfad zuzugreifen.
Ähnlich wie die EVEN-Methode, nur dass diese Methode eine andere Version des Windows-Ereignisprotokolls verwendet, die direkt über TCP erfolgt – es ist kein offener SMB-Port erforderlich.
CornerShot schätzt den Zustand der entfernten Ports basierend auf Zeitfaktoren und Fehlermeldungen, die von der RPC-Methode oder dem zugrunde liegenden Transport empfangen werden. Durch Experimente mit verschiedenen Windows-Hosts und verschiedenen RPC-Protokollen haben wir drei verschiedene Zeitschwellenwerte ermittelt, die sich in den meisten Netzwerkumgebungen als funktionierend erwiesen haben. Diese Schwellenwerte werden am besten mit der folgenden Abbildung veranschaulicht:
+ + +
| | |
unknown | open / closed | filtered | open
/ | | |
open | | |
| | |
+-------------+------------------+-----------------+--------------+
0 0.5 20 40 Sekunden
MIN FILTERED UPPER
Der MIN-Schwellenwert liegt bei 0,5 Sekunden. Antworten unterhalb dieses Schwellenwerts bedeuten entweder einen Fehler in der zugrunde liegenden RPC-Methode oder im zugrunde liegenden Transport, oder es könnte eine Antwort vom Zielhost empfangen worden sein.
Antworten unterhalb des FILTERED-Schwellenwerts von 20 Sekunden könnten entweder einen offenen oder einen geschlossenen Port anzeigen, abhängig von der Art der Fehlermeldung, die für die Methode empfangen wurde.
Antworten zwischen dem FILTERED- und dem UPPER-Schwellenwert von 40 Sekunden weisen bei allen getesteten Methoden (bisher...) auf einen gefilterten Port hin. Und Anfragen, die länger als das UPPER-Limit dauern, deuten auf eine verlängerte offene TCP-Verbindung hin.
Die Ausführung von CornerShot gegen verschiedene Betriebssystemversionen und -konfigurationen wird unterschiedliche Ergebnisse liefern. Nicht alle Windows-Versionen haben die gleichen Named Pipes oder verhalten sich gleich, wenn sie mit derselben RPC-Methode abgefragt werden. Die meisten Windows-Installationen setzen SMB und andere RPC-Dienste nicht standardmäßig über das Netzwerk frei, jedoch hat die Erfahrung gezeigt, dass in großen Umgebungen diese Ports oft offen und für die meisten Assets zugänglich sind.
Die folgende Tabelle zeigt die Standardunterstützung für verschiedene RPC-Protokolle, vorausgesetzt, die entsprechenden Ports sind für den Träger-Host erreichbar und es wurden keine Konfigurationsänderungen am Host vorgenommen:
* Wenn der Webclient-Dienst auf einem Client-Rechner läuft, können zusätzliche Ports gescannt werden. Derzeit unterstützt CornerShot diese Option nicht.
** Das RPRN-Protokoll wird auf Server-Hosts unterstützt, jedoch funktioniert das Öffnen eines entfernten Webdruckers nicht (weshalb wir keinen BELIEBIGEN Ziel-Port scannen können) – bis wir einen Workaround finden 😉
Weitere RPC-Shots oder jeder andere Beitrag ist willkommen!
Alle RPC-Methoden sind unter /shots implementiert und erben von einer abstrakten Klasse namens BaseRPCShot. Der Ordner /example zeigt, wie man einen benutzerdefinierten RPC-Shot erstellt und im Code verwendet.
CornerShot wird unter der Apache 2.0-Lizenz veröffentlicht. Weitere Details finden Sie in der LICENSE.
Wir freuen uns, von Ihnen zu hören! Bei Fehlern, Patches, Vorschlägen zu diesem Paket kontaktieren Sie uns bitte unter [email protected].
| OS | Unterstützte RPC-Protokolle | Erforderliche offene Träger-Ports | Mögliche zu scannende Ziel-Ports |
|---|
| Windows 7 | EVEN,EVEN6 | 445 / 135 & even6 TCP-Port | 445* |
| Windows 8 | EVEN,EVEN6 | 445 / 135 & even6 TCP-Port | 445* |
| Windows 10 | EVEN,EVEN6,RPRN | 445 / 135 & even6 TCP-Port | JEDER |
| Server 2008 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & even6 TCP-Port | 445 |
| Server 2012 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & even6 TCP-Port | 445 |
| Server 2016 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & even6 TCP-Port | 445 |
| Server 2019 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & even6 TCP-Port | 445 |