13 KiB
Problème de double saut Kerberos
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT!
- Découvrez The PEASS Family, notre collection exclusive de NFTs
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.
Introduction
Le problème de "double saut" Kerberos apparaît lorsqu'un attaquant tente d'utiliser l'authentification Kerberos sur deux sauts, par exemple en utilisant PowerShell/WinRM.
Lorsqu'une authentification se produit via Kerberos, les informations d'identification ne sont pas mises en cache en mémoire. Par conséquent, si vous exécutez mimikatz, vous ne trouverez pas les informations d'identification de l'utilisateur sur la machine, même s'il exécute des processus.
Cela est dû au fait que lors de la connexion avec Kerberos, les étapes suivantes sont suivies :
- L'utilisateur 1 fournit des informations d'identification et le contrôleur de domaine renvoie un TGT Kerberos à l'utilisateur 1.
- L'utilisateur 1 utilise le TGT pour demander un ticket de service pour se connecter au serveur 1.
- L'utilisateur 1 se connecte au serveur 1 et fournit le ticket de service.
- Le serveur 1 n'a pas les informations d'identification de l'utilisateur 1 mises en cache ou le TGT de l'utilisateur 1. Par conséquent, lorsque l'utilisateur 1 du serveur 1 essaie de se connecter à un deuxième serveur, il n'est pas en mesure de s'authentifier.
Délégation non contrainte
Si la délégation non contrainte est activée sur le PC, cela ne se produira pas car le serveur recevra un TGT de chaque utilisateur y accédant. De plus, si la délégation non contrainte est utilisée, vous pouvez probablement compromettre le contrôleur de domaine à partir de celle-ci.
Plus d'informations sur la page de délégation non contrainte.
CredSSP
Une autre option suggérée aux administrateurs système pour éviter ce problème, qui est notoirement peu sûre, est le Credential Security Support Provider. Activer CredSSP a été une solution mentionnée sur divers forums au fil des ans. Selon Microsoft :
"L'authentification CredSSP délègue les informations d'identification de l'utilisateur de l'ordinateur local à un ordinateur distant. Cette pratique augmente le risque de sécurité de l'opération à distance. Si l'ordinateur distant est compromis, lorsque les informations d'identification lui sont transmises, les informations d'identification peuvent être utilisées pour contrôler la session réseau."
Si vous trouvez que CredSSP est activé sur des systèmes de production, des réseaux sensibles, etc., il est recommandé de les désactiver. Un moyen rapide de vérifier l'état de CredSSP est d'exécuter Get-WSManCredSSP
. Ce qui peut être exécuté à distance si WinRM est activé.
Invoke-Command -ComputerName bizintel -Credential ta\redsuit -ScriptBlock {
Get-WSManCredSSP
}
Solutions de contournement
Commande Invoke
Cette méthode consiste à travailler avec le problème de double saut, sans nécessairement le résoudre. Elle ne dépend d'aucune configuration et vous pouvez simplement l'exécuter depuis votre machine d'attaque. C'est essentiellement une commande Invoke-Command
imbriquée.
Cela exécutera hostname
sur le deuxième serveur :
$cred = Get-Credential ta\redsuit
Invoke-Command -ComputerName bizintel -Credential $cred -ScriptBlock {
Invoke-Command -ComputerName secdev -Credential $cred -ScriptBlock {hostname}
}
Vous pouvez également établir une session PowerShell avec le premier serveur et simplement exécuter la commande Invoke-Command
avec $cred
à partir de là au lieu de la mettre en cascade. Cependant, l'exécuter depuis votre boîte d'attaque centralise les tâches :
# From the WinRM connection
$pwd = ConvertTo-SecureString 'uiefgyvef$/E3' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd)
# Use "-Credential $cred" option in Powerview commands
Enregistrer la configuration de la session PSSession
Si au lieu d'utiliser evil-winrm
, vous pouvez utiliser la commande Enter-PSSession
, vous pouvez ensuite utiliser Register-PSSessionConfiguration
et vous reconnecter pour contourner le problème de double saut :
# Register a new PS Session configuration
Register-PSSessionConfiguration -Name doublehopsess -RunAsCredential domain_name\username
# Restar WinRM
Restart-Service WinRM
# Get a PSSession
Enter-PSSession -ConfigurationName doublehopsess -ComputerName <pc_name> -Credential domain_name\username
# Check that in this case the TGT was sent and is in memory of the PSSession
klist
# In this session you won't have the double hop problem anymore
PortForwarding
Étant donné que nous avons un accès administrateur local sur la cible intermédiaire bizintel: 10.35.8.17, vous pouvez ajouter une règle de redirection de port pour envoyer vos demandes au serveur final/troisième secdev: 10.35.8.23.
Vous pouvez rapidement utiliser netsh pour extraire une commande en une ligne et ajouter la règle.
netsh interface portproxy add v4tov4 listenport=5446 listenaddress=10.35.8.17 connectport=5985 connectaddress=10.35.8.23
Le premier serveur écoute sur le port 5446 et transfère les demandes arrivant sur le port 5446 vers le deuxième serveur sur le port 5985 (alias WinRM).
Ensuite, ouvrez un trou dans le pare-feu Windows, ce qui peut également être fait avec une commande netsh rapide.
netsh advfirewall firewall add rule name=fwd dir=in action=allow protocol=TCP localport=5446
Maintenant, établissons la session, qui nous transférera vers le premier serveur.
winrs.exe
Il semble également que la redirection de port WinRM fonctionne lorsque l'on utilise winrs.exe
. Cela peut être une meilleure option si vous savez que PowerShell est surveillé. La commande ci-dessous renvoie "secdev" en tant que résultat de hostname
.
winrs -r:http://bizintel:5446 -u:ta\redsuit -p:2600leet hostname
Comme Invoke-Command
, cela peut être facilement scripté pour que l'attaquant puisse simplement émettre des commandes système en tant qu'argument. Un exemple de script batch générique winrm.bat :
OpenSSH
Cette méthode nécessite l'installation d'OpenSSH sur la première boîte serveur. L'installation d'OpenSSH pour Windows peut être effectuée complètement via CLI et ne prend pas beaucoup de temps - en plus, cela ne signale pas de logiciel malveillant !
Bien sûr, dans certaines circonstances, cela peut ne pas être faisable, trop encombrant ou peut être un risque général pour l'OpSec.
Cette méthode peut être particulièrement utile dans une configuration de boîte de saut - avec accès à un réseau autrement inaccessible. Une fois que la connexion SSH est établie, l'utilisateur/attaquant peut lancer autant de New-PSSession
qu'il le souhaite contre le réseau segmenté sans exploser dans le problème de double saut.
Lorsqu'il est configuré pour utiliser l'authentification par mot de passe dans OpenSSH (pas de clés ou de Kerberos), le type de connexion est 8 alias connexion en clair réseau. Cela ne signifie pas que votre mot de passe est envoyé en clair - il est en fait chiffré par SSH. À l'arrivée, il est déchiffré en texte clair via son paquet d'authentification pour que votre session puisse demander des TGT juteux !
Cela permet au serveur intermédiaire de demander et d'obtenir un TGT en votre nom pour le stocker localement sur le serveur intermédiaire. Votre session peut ensuite utiliser ce TGT pour s'authentifier (PS remote) auprès de serveurs supplémentaires.
Scénario d'installation OpenSSH
Téléchargez la dernière version de OpenSSH Release zip depuis github sur votre machine d'attaque et déplacez-la (ou téléchargez-la directement sur la boîte de saut).
Décompressez le zip où vous le souhaitez. Ensuite, exécutez le script d'installation - Install-sshd.ps1
Enfin, ajoutez simplement une règle de pare-feu pour ouvrir le port 22. Vérifiez que les services SSH sont installés et démarrez-les. Ces deux services devront être en cours d'exécution pour que SSH fonctionne.
Si vous recevez une erreur Connection reset
, mettez à jour les autorisations pour permettre à Everyone: Lire et exécuter sur le répertoire racine OpenSSH.
icacls.exe "C:\Users\redsuit\Documents\ssh\OpenSSH-Win64" /grant Everyone:RX /T
Références
- https://techcommunity.microsoft.com/t5/ask-the-directory-services-team/understanding-kerberos-double-hop/ba-p/395463?lightbox-message-images-395463=102145i720503211E78AC20
- https://posts.slayerlabs.com/double-hop/
- https://learn.microsoft.com/en-gb/archive/blogs/sergey_babkins_blog/another-solution-to-multi-hop-powershell-remoting
- https://4sysops.com/archives/solve-the-powershell-multi-hop-problem-without-using-credssp/
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez The PEASS Family, notre collection exclusive de NFTs
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.