
Amplifier la visibilité réseau depuis plusieurs POV d'autres hôtes.
En temps de guerre, CornerShot est une arme qui permet à un soldat de regarder au-delà d'un coin (et éventuellement de tirer) sans risquer de s'exposer. De la même manière, le package CornerShot permet d'examiner l'accès réseau d'un hôte distant sans avoir besoin de privilèges spéciaux sur cet hôte.
En utilisant CornerShot, une source, ayant un accès réseau à un porteur (carrier), peut déterminer s'il existe un accès réseau entre le porteur et la cible pour un port spécifique p.
Par exemple, supposons qu'une équipe rouge tente de se propager d'un hôte source A "compromis" vers un hôte cible X, pour lequel l'hôte A n'a pas d'accès. S'ils se propagent via l'hôte B, ils découvriront alors seulement qu'il n'y a pas d'accès réseau entre B et X.
En utilisant CornerShot, l'équipe peut découvrir que l'hôte C a en fait accès à la cible X, donc la propagation vers la cible X devrait d'abord passer par l'hôte C.
+-----+ +-----+ +-----+
| | | | filtré | |
| A +--------> B +----X--->(p) X |
| | | | | |
+-----+ +-----+ +-(p)-+
source porteur cible
+ ^
| |
| +-----+ |
| | | ouvert |
+---------->+ C +-------------+
| |
+-----+
Comme nmap, CornerShot différencie les états de ports suivants : ouvert, fermé, filtré et inconnu (s'il ne peut pas être déterminé).
La démonstration suivante montre l'exécution de CornerShot contre deux hôtes porteurs 172.0.1.12 & 172.0.1.13, afin de déterminer s'ils ont un accès réseau à 192.168.200.1 :

En savoir plus ici.
La tâche apparemment simple d'identifier si un hôte B dans le réseau a accès à l'hôte C peut nécessiter un large déploiement de capteurs réseau, d'agents sur les appareils ou la collecte d'une multitude de règles de pare-feu, de configurations de routeurs et de politiques hôtes.
CornerShot peut simplifier ce processus en utilisant un (ou très peu) agent qui peut interroger d'autres hôtes du réseau pour déterminer leur accès à des hôtes distants.
Les équipes de sécurité qui utilisent BloodHound pour trouver et atténuer les chemins d'élévation de privilèges dans leur réseau luttent souvent contre des millions de chemins logiques découverts par BloodHound.
ShotHound est un outil qui intègre CornerShot à BloodHound afin de découvrir des chemins pratiques soutenus par un accès réseau.
CornerShot peut être utilisé comme un package ou comme un module autonome. Les seules exigences sont Python 3 et le paquet impacket.
pip install cornershot
L'utilisation de base nécessite les identifiants d'un utilisateur de domaine valide, un nom de domaine FQDN, une IP de porteur et une IP cible.
python -m cornershot <utilisateur> <mot_de_passe> <domaine> <porteur> <cible>
Pour analyser une gamme de porteurs contre une gamme de cibles, des sous-réseaux ou des plages d'IP peuvent être utilisés dans une liste séparée par des virgules :
python -m cornershot <utilisateur> <mot_de_passe> <domaine> 192.168.1.10-192.168.1.20 192.168.5.0/24,192.168.6.0/24
Par défaut, CornerShot essaiera d'analyser les ports suivants : 135, 445, 3389, 5985, 5986. L'utilisateur peut fournir une liste séparée par des virgules de ports et plages de ports :
python -m cornershot -tp 22,8080,45000-45005 <utilisateur> <mot_de_passe> <domaine> <porteur> <cible>
Dans le code, il faut instancier un objet CornerShot avec le nom d'utilisateur, le mot de passe et le nom de domaine d'un utilisateur de domaine valide. L'ajout de porteurs, cibles et ports se fait via la méthode add_shots. Une fois prêt, la méthode open_fire peut être appelée, qui effectue uniquement les appels RPC pertinents en fonction des ports requis.
from cornershot import CornerShot
cs = CornerShot("nom_utilisateur", "mot_de_passe", "fqdn")
cs.add_shots(porteurs=["192.168.1.1"], cibles=["192.168.1.2","192.168.1.3"])
résultats = cs.open_fire()
Le résultat de open_fire est un dictionnaire avec des clés de porteurs, chaque porteur a un autre ensemble de clés pour les cibles, et enfin, chaque cible contient un dictionnaire de ports et leurs états respectifs. Voici un exemple de format du résultat :
{'porteur_1':
{'cible_1':
{135: 'inconnu', 445: 'filtré', 3389: 'filtré', 5986: 'filtré', 5985: 'filtré'},
'cible_2':
{135: 'inconnu', 445: 'ouvert', 5985: 'inconnu', 5986: 'filtré', 3389: 'ouvert'}
},
'porteur_2':
{'cible_1':
{3389: 'filtré', 135: 'filtré', 5985: 'filtré', 445: 'filtré', 5986: 'inconnu'},
'cible_2':
{5985: 'filtré', 5986: 'filtré', 445: 'filtré', 135: 'filtré', 3389: 'ouvert'}
}
}
CornerShot s'appuie sur diverses méthodes standard d'appel de procédure distante (RPC) bien documentées, utilisées par divers services Microsoft. En utilisant des méthodes qui ne nécessitent qu'un compte authentifié dans le domaine, CornerShot est capable de déclencher du trafic réseau depuis un hôte porteur vers une cible.
CornerShot peut déterminer l'état du port distant en mesurant le temps pris par un appel RPC et en utilisant différents codes d'erreur pour chaque méthode RPC.
Le lecteur connaît peut-être le "printer bug", découvert par Lee Christensen. Bien qu'il soit appelé un bug, il s'agit d'un comportement bien documenté du service d'impression, qui permet à tout utilisateur authentifié de contraindre un serveur distant à s'authentifier sur n'importe quelle machine, en utilisant la méthode RpcRemoteFindFirstPrinterChangeNotificationEx.
CornerShot utilise les méthodes RPC suivantes de plusieurs protocoles Microsoft (il existe de nombreuses méthodes supplémentaires, qui seront implémentées dans les versions futures) :
L'implémentation des protocoles eux-mêmes est réalisée via l'excellent paquet impacket.
Cette méthode reçoit un paramètre printerName. Le nom d'imprimante peut être un chemin vers un fichier local, un fichier distant ou même une imprimante web. En fournissant un nom conforme au format WEB_PRINT_SERVER, il est possible d'interroger n'importe quel port distant. Un exemple de nom de serveur d'impression web qui déclenchera du trafic HTTP vers un hôte et un port distant est : "http://<ip_cible>:<port_cible>/printers/ppp/.printer".
Pour utiliser cette méthode, nous avons besoin d'une approche en deux étapes : d'abord, ouvrir une clé de registre sur l'hôte distant - ce qui donne un handle valide, et ensuite, essayer de sauvegarder une copie de ce handle vers un fichier distant. La méthode BaseRegSaveKey reçoit un chemin de fichier vers lequel elle peut sauvegarder une copie d'un registre, ce qui déclenche du trafic SMB sur le port 445 (et 135 en secours) vers une cible. La clé de registre que CornerShot ouvre est HKEY_CURRENT_USER, qui est ouverte en lecture par défaut sur la plupart des clients Windows.
Cette fonction tente de sauvegarder des événements Windows dans un chemin de fichier, qui peut être distant - dans ce cas, le service essaiera d'accéder à l'hôte et au chemin distants.
Similaire à la méthode EVEN, à la différence que cette méthode utilise une version différente du protocole Windows Events, qui est effectuée directement via TCP - pas besoin que le port SMB soit ouvert.
CornerShot estime l'état des ports distants en se basant sur des facteurs temporels et les messages d'erreur reçus par la méthode RPC ou le transport sous-jacent. En expérimentant avec différents hôtes Windows et divers protocoles RPC, nous avons établi 3 seuils de temporisation différents qui se sont avérés efficaces dans la plupart des environnements réseau. Ces seuils sont mieux illustrés par la figure suivante :
+ + +
| | |
inconnu | ouvert / fermé | filtré | ouvert
/ | | |
ouvert | | |
| | |
+-------------+------------------+-----------------+--------------+
0 0.5 20 40 Secondes
MIN FILTRÉ SUPÉRIEUR
Le seuil MIN est de 0,5 seconde ; les réponses en dessous de ce seuil indiquent soit une erreur dans la méthode RPC sous-jacente ou le transport sous-jacent, soit une réponse a pu être reçue de l'hôte cible.
Les réponses en dessous du seuil FILTRÉ de 20 secondes peuvent indiquer un port ouvert ou fermé, selon le type de message d'erreur reçu pour la méthode.
Les réponses entre les seuils FILTRÉ et SUPÉRIEUR de 40 secondes indiquent un port filtré pour toutes les méthodes testées (jusqu'à présent...). Et les requêtes prenant plus que la limite SUPÉRIEUR indiquent une connexion TCP ouverte prolongée.
L'exécution de CornerShot contre différentes versions et configurations de systèmes d'exploitation donnera des résultats différents. Toutes les versions de Windows n'ont pas les mêmes tubes nommés ou ne se comportent pas de la même manière lorsqu'elles sont interrogées avec la même méthode RPC. La plupart des Windows en configuration OOTB n'exposent pas SMB et d'autres services RPC sur le réseau, mais l'expérience montre que dans les grands environnements, ces ports ont tendance à être ouverts et accessibles pour la plupart des actifs.
Le tableau suivant montre le support par défaut pour divers protocoles RPC, à condition que les ports appropriés soient accessibles à l'hôte porteur et qu'aucun changement de configuration n'ait été effectué sur l'hôte :
* Si le service Webclient est en cours d'exécution sur une machine cliente, des ports supplémentaires peuvent être analysés. Actuellement, CornerShot ne supporte pas cette option.
** Le protocole RPRN est supporté sur les serveurs, mais l'ouverture d'une imprimante web distante ne fonctionne pas (c'est pourquoi nous ne pouvons pas analyser n'importe quel port cible) - jusqu'à ce que nous trouvions une solution de contournement 😉
Les contributions de nouveaux tirs RPC, ou toute autre contribution, sont les bienvenues !
Toutes les méthodes RPC sont implémentées sous /shots et héritent d'une classe abstraite nommée BaseRPCShot. Le dossier /example montre comment créer un tir RPC personnalisé et l'utiliser dans le code.
CornerShot est distribué sous la licence Apache 2.0. Pour plus de détails, voir LICENSE.
Nous sommes ravis de vous entendre ! Pour les bugs, correctifs, suggestions sur ce package, veuillez nous contacter à [email protected]
| OS | Protocoles RPC supportés | Ports porteur ouverts requis | Ports cibles possibles à analyser |
|---|
| Windows 7 | EVEN,EVEN6 | 445 / 135 & port tcp even6 | 445* |
| Windows 8 | EVEN,EVEN6 | 445 / 135 & port tcp even6 | 445* |
| Windows 10 | EVEN,EVEN6,RPRN | 445 / 135 & port tcp even6 | N'IMPORTE |
| Server 2008 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & port tcp even6 | 445 |
| Server 2012 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & port tcp even6 | 445 |
| Server 2016 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & port tcp even6 | 445 |
| Server 2019 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & port tcp even6 | 445 |