
Un kit d'outils MS SQL en C# conçu pour la reconnaissance offensive et la post-exploitation.
SQLRecon est un toolkit Microsoft SQL Server conçu pour la reconnaissance offensive et la post-exploitation. Pour des informations détaillées sur l'utilisation de chaque technique, consultez la wiki.
Vous pouvez télécharger une copie de SQLRecon depuis la page des releases. Sinon, n'hésitez pas à compiler la solution vous-même. Cela devrait être aussi simple que de cloner le dépôt, double-cliquer sur le fichier solution et compiler.
Des conseils en matière de prévention, détection et atténuation ont également été fournis pour tous les défenseurs.
Consultez mon article de blog sur le site IBM Security Intelligence. Si vous préférez les vidéos, regardez ma présentation à Black Hat.
Les modules d'énumération ne nécessitent pas de fournisseur d'authentification. Ces modules doivent être passés dans le drapeau du module d'énumération (/e:, /enum:). Le wiki détaille l'utilisation des modules d'énumération.```
Info - Show information about the SQL server.
/h:, /host -> SQL server hostname or IP. Multiple hosts supported.
/port: -> (OPTIONAL) Defaults to 1434 (UDP).
/t:, timeout: -> (OPTIONAL) Defaults to 3s.
SqlSpns - Use the current user token to enumerate the AD domain for MSSQL SPNs. /d:, /domain: -> (OPTIONAL) NETBIOS name or FQDN of domain.
# Fournisseurs d'authentification
SQLRecon prend en charge un ensemble diversifié de fournisseurs d'authentification (`/a:, /auth:`) pour permettre l'interaction avec un serveur Microsoft SQL Server.```
WinToken - Use the current users token to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP
WinDomain - Use AD credentials to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> NETBIOS name or FQDN of domain.
/u:, /username: -> Username for domain user.
/p:, /password: -> Password for domain user.
Local - Use local SQL credentials to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/u:, /username: -> Username for local SQL user.
/p:, /password: -> Password for local SQL user.
EntraID - Use Azure EntraID credentials to authenticate against the Azure SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> FQDN of domain (DOMAIN.COM).
/u:, /username: -> Username for domain user.
/p:, /password: -> Password for domain user.
AzureLocal - Use local SQL credentials to authenticate against the Azure SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/u:, /username: -> Username for local SQL user.
/p:, /password: -> Password for local SQL user.
Pth - Authenticate using an NT hash (pass-the-hash) over raw TDS/NTLM. Elevated privileges or SeImpersonate is not required.
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> NETBIOS domain name.
/u:, /username: -> Domain username.
/hash: -> NT hash (32 hex chars, 8846f7eaee8fb117ad06bdd830b7586c) or LM:NT format.
/h:, host:) est requis et permet un ou plusieurs serveurs SQL. Si vous souhaitez exécuter un module contre plusieurs serveurs SQL, séparez les hôtes par une virgule, par exemple /h:SQL01,10.10.10.2,SQL03.master par défaut, mais cela peut être modifié optionnellement en fournissant un nom de base de données personnalisé via le drapeau base de données (/database:)./debug est optionnel et affiche toutes les requêtes SQL exécutées par un module, sans les exécuter réellement sur le(s) hôte(s) distant(s). Un exemple de cela peut être trouvé dans le wiki.1433 par défaut, mais cela peut être modifié optionnellement en utilisant le drapeau /port:.3 secondes, mais cette valeur peut être modifiée optionnellement en fournissant une valeur de délai d'attente (/t:, /timeout:) qui correspond au nombre de secondes avant de terminer la tentative de connexion.Veuillez noter que le fournisseur d'authentification EntraID nécessite que la bibliothèque d'authentification Azure Active Directory (ADAL) ou la bibliothèque d'authentification Microsoft (MSAL) existe sur le système à partir duquel SQLRecon est exécuté. Ceci est destiné aux fonctionnalités d'authentification et d'autorisation Azure EntraID.
Les modules SQL sont exécutés contre une ou plusieurs instances de serveur Microsoft SQL. Ces modules doivent être passés dans le drapeau module (/m:, /module:).
Le drapeau hôte (/h:, host:) est requis et permet un ou plusieurs serveurs SQL. Si vous souhaitez exécuter un module contre plusieurs serveurs SQL, séparez les hôtes par une virgule, par exemple /h:SQL01,10.10.10.2,SQL03.
Le wiki fournit des détails sur l'utilisation de chaque module qui prend en charge l'exécution sur une ou plusieurs instances de SQL Server.
Les modules d'usurpation sont exécutés contre une ou plusieurs instances de serveur Microsoft SQL, dans le contexte d'un utilisateur SQL usurpé. Tous les modules d'usurpation ont les exigences minimales suivantes :
/i:, /iuser:)./m:, /module:).Le wiki fournit des détails sur l'utilisation de chaque module qui prend en charge l'exécution en utilisant l'Usurpation.
Les modules liés sont exécutés sur une ou plusieurs instances d'un serveur Microsoft SQL lié. Tous les modules liés ont les exigences minimales suivantes :
/l:, /link:). Le drapeau link permet un ou plusieurs serveurs SQL liés. Par exemple, si SQL01 a un lien vers SQL02, et SQL01 a un lien vers DB04, vous pouvez séparer les hôtes liés par une virgule, et un module sera exécuté sur chaque serveur SQL lié, par exemple /l:SQL02,DB04./m:, /module:).Le wiki fournit des détails sur l'utilisation de chaque module qui prend en charge l'exécution sur une ou plusieurs instances d'un Serveur SQL Lié.
Les modules de chaîne liée sont exécutés sur le dernier serveur Microsoft SQL dans une chaîne de serveurs liés. Tous les modules de chaîne liée ont les exigences minimales suivantes :
/l:, /link:. Si SQL01 a un lien vers SQL02, et SQL02 a un lien vers PAYMENTS01, et vous souhaitez exécuter un module sur PAYMENTS01, alors l'argument serait /l:SQL02,PAYMENTS01./chain doit être inclus pour exécuter le module contre le dernier serveur SQL dans la chaîne liée fournie./m:, /module:).Le wiki fournit des détails sur l'utilisation de chaque module qui prend en charge l'exécution sur le dernier serveur SQL fourni dans une Chaîne de Serveurs SQL Liés.
SQLRecon dispose de plusieurs modules qui peuvent aider à énumérer et attaquer Microsoft System Center Configuration Manager (SCCM) et Microsoft Endpoint Configuration Manager (ECM). Le serveur SCCM ou ECM devra avoir une base de données Microsoft SQL exposée localement ou à distance.
Les modules SCCM doivent être passés dans le drapeau module SCCM (/s:, /sccm:).
La plupart des modules SCCM peuvent être exécutés dans le contexte d'un utilisateur SQL usurpé (/i:, /iuser:).
Le wiki fournit des détails sur l'utilisation de chaque module contre une base de données SCCM/ECM.
Users liste tous les utilisateurs de la table RBAC_Admins. Ce sont tous les utilisateurs configurés pour un certain niveau d'accès à SCCM.Sites liste tous les autres sites avec des données stockées dans la table DPInfo des bases de données SCCM. Cela peut fournir des voies d'attaque supplémentaires car différents sites peuvent être configurés de différentes manières (non sécurisées).Logons interroge la table Computer_System_DATA pour récupérer tous les clients SCCM associés ainsi que l'utilisateur qui s'est connecté en dernier. NOTE : Cela ne se met à jour qu'une fois par semaine par défaut et ne sera pas à 100% à jour. Utilisez /option: comme argument optionnel (non requis) pour filtrer les clients SCCM.TaskList fournit une liste de toutes les séquences de tâches stockées dans la base de données SCCM, mais n'accède pas au contenu réel des données de tâche.TaskData récupère toutes les séquences de tâches stockées dans la base de données SCCM et les déchiffre en texte clair. Les séquences de tâches peuvent contenir des informations d'identification pour joindre des systèmes à des domaines, mapper des partages, exécuter des commandes, etc.Si vous êtes intéressé par l'extension de SQLRecon, veuillez vous référer à la section contribuer et étendre dans le wiki.
Je vous encourage à ouvrir un issue si vous avez des suggestions ou des idées.
L'objectif est d'améliorer continuellement SQLRecon. Vous trouverez ci-dessous quelques domaines de recherche planifiés :
Les personnes suivantes ont contribué directement ou indirectement à divers aspects de SQLRecon.
/auth:pth). Implémente l'authentification TDS/NTLM brute via PTHTdsConnection, NtlmHelper et PthState afin que tous les modules fonctionnent sans informations d'identification en clair ni privilèges élevés. Les correctifs clés incluent les options de session ANSI après connexion, le découpage TDS multi-paquets, la gestion des blocages de flux TCP pour les connexions CLR simultanées, et la compatibilité avec la notation par crochets OPENQUERY._linkedChainRpcQuerySystem.Byte[] n'était jamais correctement converti et affiché dans la console.credentialobjectss et proxies (jakxx).agentcmd (jakxx).role qui ne fonctionnait pas correctement sur la chaîne liée (passthehashbrowns).impersonate qui ne fonctionnait pas correctement sur la chaîne liée (passthehashbrowns).EnableRpc/DisableRpc qui n'étaient pas disponibles sur les chaînes liées (passthehashbrowns).XpCmd qui ne fonctionnait pas sur les chaînes liées, prend également en charge la sortie maintenant (passthehashbrowns).EXEC AT à moins d'être entourés de crochets, cela pose problème si le nom du serveur lié est une adresse IP ou un FQDN (passthehashbrowns)..First renvoyant un "0". Je l'ai mise à jour pour que la fonction LinkedChainQuery crée un nouveau tableau avec un "0" au début, puis appelle la logique existante dans une fonction séparée, maintenant appelée (passthehashbrowns).impersonate pour gérer correctement les cas sysadmin (n3rada).scriptdata et cidata (G0ldenGunSec).auditstatus pour vérifier si l'audit SQL est en place (chryzsh).whoami (JBalanza).adsi où le serveur LDAP n'a pas besoin d'être ajouté à la base de données msdb, et la fonction créée est maintenant correctement supprimée./host ou /h est désormais supportée en utilisant des valeurs séparées par des virgules./link ou /l est désormais supportée en utilisant des valeurs séparées par des virgules./lhost en /link.s' et création du commutateur /s, /sccm pour les modules SCCM.DecryptCredentials./enum) appelé info qui peut utiliser un contexte non authentifié pour obtenir des informations sur le serveur SQL, y compris le nom de l'instance et le port TCP en utilisant le protocole UDP.adsi ne supprimait pas le serveur LDAP.adsi lié, en faveur de openquery/rpc./lhost en /adsi dans le module adsi./rhost en /unc dans le module smb.CaptureHash.cs et simplification de la logique.SetEnumerationType.cs et simplification de la logique.Impersonation.cs en Impersonate.cs.OleCmdExec.cs en .smb.info.info.rows, iRows et lRows.sLogons pour inclure un filtre optionnel.xp_cmdshell n'affichaient pas la sortie des commandes dans la console.SetEnumerationType.cs.domain en SqlSpns.SetAuthenticationType.cs en une nouvelle méthode appelée EvaluateAuthenticationType.CreateSqlConnectionObject dans SetAuthenticationType.cs qui étend SQLRecon pour supporter plusieurs objets de connexion SQL simultanés.ADSI.cs, qui intègre les attaques par identifiants ADSI comme décrit ici.adsi, iAdsi et lAdsi.lLinks et iLinks.ExecuteImpersonationQuery et ExecuteImpersonationCustomQuery.Impersonate.cs.checkRpc.iCheckRpc.lCheckRpc.EnableDisable.cs en ConfigureOptions.cs.ExecuteLinkedCustomQueryRpcExec est appelé.PrintUtils.cs, qui implémente une classe d'impression pour une sortie standardisée.TablePrinter de Help.cs vers PrintUtils.cs.PrintUtils.querysearchtableslColumnslQuerylSearchlTablesiColumnsAzure en AzureAD.AzureLocal.disableRpc.enableRpc.iEnableRpc.iDisableRpc.lEnableRpc.lDisbleRpc.lAgentCmd.clr, iClr et lClr en utilisant SqlCommand.ExecuteNonQuery lors de la création de la procédure stockée.lClr où il ne supprimait pas les assemblys ou procédures stockées créés.columns.iColumns.iDatabases.iSearch.iTables.lColumns.lSearch.ExecuteLinkedCustomQueryRpcExec.x.Random.cs dans le répertoire utilities.Windows en WinToken.WinDomain, qui utilise un nom d'utilisateur et un mot de passe de domaine AD pour l'authentification via emprunt d'identité. Consultez Impersonation.cs.ArgumentLogic.cs, SQLAuthentication.cs et ModuleHandler.cs.ModuleHandler.cs n'utilise plus une immense instruction if/else if/else pour exécuter les modules. Désormais, la réflexion est utilisée pour appeler des méthodes correspondant aux noms des modules de commandes.commands, contenant des variables globales utilisées dans tout le programme.SQLAuthentication.cs.Program.cs vers .sccm.roles, iRoles et lRoles.users, iUsers et lUsers.sp_drop_trusted_assembly dans les modules clr et iClr.lAgentCmd.lClr.info.Local et Azure.-e domain).-r dans les modes d'authentification Windows et Local afin que des ports TCP non standards puissent être fournis.Environment.Exit de TestAuthentication.cs.AgentJobs.cs.agentStatus.iAgentStatus.lAgentStatus.agentCmd.iAgentCmd.clr.iEnableClr.iDisbleClr.iClr.iWhoami.iMapped.iRoles.lEnableRpc.lDisableRpc.lWhoai.lEnableXp.lDisableXp.lEnableOle.lSmb.lWhoami.lRoles.oldCmd.iOleCmd.lDatabases.lTables./v, /verbose est optionnel et affiche toutes les requêtes SQL exécutées par un module avant de les exécuter sur le(s) hôte(s) distant(s). Un exemple de cela peut être trouvé dans le wiki.| Nom du module | Description | Usurpation | Exécution liée | Exécution en chaîne liée | Nécessite un contexte privilégié |
|---|
AuditStatus | Vérifier si l'audit SQL est en place. | ✅ | ✅ | ✅ | ❎ |
CheckRpc | Obtenir une liste des serveurs liés et de leur statut RPC. | ✅ | ✅ | ✅ | ❎ |
Databases | Afficher toutes les bases de données. | ✅ | ✅ | ✅ | ❎ |
Impersonate | Énumérer les comptes utilisateurs qui peuvent être usurpés. | ✅ | ✅ | ✅ | ❎ |
Info | Afficher des informations sur le serveur SQL. | ✅ | ✅ | ✅ | ❎ |
Links | Énumérer les serveurs SQL liés. | ✅ | ✅ | ✅ | ❎ |
Users | Afficher les comptes utilisateurs et les groupes qui peuvent s'authentifier contre la base de données. | ✅ | ✅ | ✅ | ❎ |
Whoami | Afficher vos privilèges. | ✅ | ✅ | ✅ | ❎ |
Query /c:QUERY | Exécuter une requête SQL. | ✅ | ✅ | ✅ | ❎ |
Smb /unc:UNC_PATH | Capturer un hachage NetNTLMv2. | ✅ | ✅ | ✅ | ❎ |
Columns /db:DATABASE /table:TABLE | Afficher toutes les colonnes dans la base de données et la table fournies. | ✅ | ✅ | ✅ | ❎ |
Rows /db:DATABASE /table:TABLE | Afficher le nombre de lignes dans la table de base de données fournie. | ✅ | ✅ | ✅ | ❎ |
Search /keyword:KEYWORD | Rechercher des noms de colonnes dans la table fournie de la base de données à laquelle vous êtes connecté. | ✅ | ✅ | ✅ | ❎ |
Tables /db:DATABASE | Afficher toutes les tables dans la base de données fournie. | ✅ | ✅ | ✅ | ❎ |
EnableRpc /rhost:LINKED_HOST | Activer RPC et RPC sortant sur un serveur lié. | ✅ | ❌ | ❌ | ✔️ |
EnableClr | Activer l'intégration CLR. | ✅ | ✅ | ✅ | ✔️ |
EnableOle | Activer les procédures d'automatisation OLE. | ✅ | ✅ | ✅ | ✔️ |
EnableXp | Activer xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
DisableRpc /rhost:LINKED_HOST | Désactiver RPC et RPC sortant sur un serveur lié. | ✅ | ❌ | ❌ | ✔️ |
DisableClr | Désactiver l'intégration CLR. | ✅ | ✅ | ✅ | ✔️ |
DisableOle | Désactiver les procédures d'automatisation OLE. | ✅ | ✅ | ✅ | ✔️ |
DisableXp | Désactiver xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
AgentStatus | Afficher si l'agent SQL est en cours d'exécution et obtenir les travaux de l'agent. | ✅ | ✅ | ✅ | ✔️ |
AgentCmd /c:COMMAND /subsystem:(OPTIONAL) /proxy:(OPTIONAL) | Exécuter une commande système en utilisant des travaux d'agent. Optionnellement spécifier un sous-système avec /subsystem:, par défaut 'PowerShell'. Optionnellement spécifier un compte proxy SQL Agent avec /proxy:. | ✅ | ✅ | ✅ | ✔️ |
Adsi /adsi:SERVER_NAME /lport:LOCAL_PORT | Obtenir des informations d'identification ADSI en clair depuis un serveur ADSI lié. | ✅ | ✅ | ✅ | ✔️ |
Clr /dll:DLL /function:FUNCTION | Charger et exécuter un assembly .NET dans une procédure stockée personnalisée. | ✅ | ✅ | ✅ | ✔️ |
CredentialObjects | Obtenir les objets d'identification depuis sys.credentials. | ✅ | ✅ | ✅ | ✔️ |
OleCmd /c:COMMAND /subsystem:(OPTIONAL) | Exécuter une commande système en utilisant des procédures d'automatisation OLE. | ✅ | ✅ | ✅ | ✔️ |
Proxies | Obtenir les informations de proxy de l'agent SQL. | ✅ | ✅ | ✅ | ✔️ |
XpCmd /c:COMMAND | Exécuter une commande système en utilisant xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
| Nom du module | Description | Usurpation | Nécessite un contexte privilégié |
|---|
Users | Afficher tous les utilisateurs SCCM. | ✅ | ❎ |
Sites | Afficher tous les autres sites avec des données stockées. | ✅ | ❎ |
Logons | Afficher tous les clients SCCM associés et le dernier utilisateur connecté. | ✅ | ❎ |
Credentials | Afficher les informations d'identification chiffrées stockées par SCCM. | ✅ | ❎ |
TaskList | Afficher toutes les séquences de tâches, mais sans accéder au contenu des données de tâche. | ✅ | ❎ |
TaskData | Déchiffrer toutes les séquences de tâches en texte clair. | ✅ | ❎ |
DecryptCredentials | Tenter de déchiffrer un blob d'identification SCCM. Doit être exécuté dans un processus à haute intégrité ou SYSTEM sur le serveur SCCM. | ❌ | ✔️ |
AddAdmin /user:DOMAIN\USERNAME /sid:SID | Élever un compte fourni à 'Administrateur complet' dans SCCM. | ✅ | ✔️ |
RemoveAdmin /user:ADMIN_ID /remove:STRING | Supprimer les privilèges d'un utilisateur, ou supprimer complètement un utilisateur de la base de données SCCM. | ✅ | ✔️ |
ScriptData | Renvoie tous les scripts configurés pour s'exécuter dans SCCM. | ✅ | ✔️ |
CIData | Renvoie toutes les CI configurées pour exécuter des scripts dans SCCM. | ✅ | ✔️ |
Credentials liste les informations d'identification stockées par SCCM pour être utilisées dans diverses fonctions. Ces informations d'identification ne peuvent pas être déchiffrées à distance car la clé est stockée sur le serveur SCCM. Cependant, ce module fournit un renseignement sur la pertinence de tenter d'obtenir la clé.DecryptCredentials tente de déchiffrer les blobs d'identification SCCM récupérés. Ce module doit être exécuté dans un processus à haute intégrité ou SYSTEM sur un serveur SCCM.AddAdmin élève le compte spécifié à 'Administrateur complet' dans SCCM. Si l'utilisateur cible est déjà un utilisateur SCCM, ce module ajoutera plutôt les privilèges nécessaires pour l'élever. Fournissez deux arguments, soit /user:current /sid:current si vous cherchez à ajouter l'utilisateur qui exécute actuellement le processus SQLRecon en tant qu''Administrateur complet' dans SCCM. Si vous cherchez à ajouter un autre utilisateur en tant qu''Administrateur complet' dans SCCM, spécifiez son nom d'utilisateur de domaine et son SID complet /user:DOMAIN\USERNAME /sid:S-1-5-.... Ce module nécessite des privilèges sysadmin ou similaires car l'écriture dans les tables de la base de données SCCM est requise.RemoveAdmin supprime les privilèges d'un utilisateur en supprimant complètement un utilisateur nouvellement ajouté de la base de données SCCM. Si l'utilisateur existait déjà en quelque capacité, ce module supprime simplement les trois rôles qui ont été ajoutés au compte via des écritures dans la table des permissions. Utilisez les arguments fournis par la sortie de la commande sAddAdmin pour exécuter cette commande. Ce module nécessite des privilèges sysadmin ou similaires car l'écriture dans les tables de la base de données SCCM est requise.LinkedChainQueryRecurseModuleHandler.cs pour favoriser la simplification et l'extensibilité.Queries.cs.EnumerationModules.cs.FormatQuery.cs.SccmModules.cs.ModuleHandler.cs en SqlModules.cs.OleAutomation.csPrintUtils.cs en Print.cs.SQLServerInfo.cs en Info.cs.iQueryiSearchArgumentLogic.csauthentication.Help.cs d'une méthode en un constructeur.CaptureHash.cs d'une méthode en un constructeur.Impersonate.cs d'une méthode en un constructeur.lDisableOle.lEnableClr.lDisableClr.lXpCmd.lXpOle.Random.cs.EnableDisable.cs.clr.ole.mapped et roles dans whoami.lMapped et lRoles dans lWhoami.iMapped et iRoles dans iWhoami.