
Une boîte à outils C# MS SQL conçue 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 le wiki.
Vous pouvez télécharger une copie de SQLRecon depuis la page releases. Vous pouvez également 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.
Un guide de prévention, de détection et d'atténuation a également été fourni 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 à l'option de module d'énumération (/e:, /enum:). Le wiki contient des détails sur 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.
/h:, host:) est obligatoire et permet d'indiquer 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 ; toutefois, cela peut être modifié en fournissant un nom de base personnalisé via le flag base de données (/database:)./debug est facultatif et affiche toutes les requêtes SQL exécutées par un module, sans les exécuter réellement sur le ou les hôtes distants. Un exemple est disponible dans le wiki.1433 par défaut, mais cela peut être modifié à l'aide du flag /port:.3 secondes ; toutefois, cette valeur peut être modifiée en fournissant un délai (/t:, /timeout:) qui correspond au nombre de secondes avant l'abandon de 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é. Cela est nécessaire pour les fonctionnalités d'authentification et d'autorisation Azure EntraID.
Les modules SQL sont exécutés contre une ou plusieurs instances de Microsoft SQL Server. Ces modules doivent être passés dans le flag module (/m:, /module:).
Le flag host (/h:, host:) est obligatoire et permet d'indiquer 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 contient des détails sur l'utilisation de chaque module prenant en charge l'exécution sur une ou plusieurs instances de SQL Server.
Les modules d'impersonation sont exécutés contre une ou plusieurs instances de Microsoft SQL Server, dans le contexte d'un utilisateur SQL usurpé. Tous les modules d'impersonation ont les exigences minimales suivantes :
/i:, /iuser:)./m:, /module:).Le wiki contient des détails sur l'utilisation de chaque module prenant en charge l'exécution via Impersonation.
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 flag link permet d'indiquer un ou plusieurs serveurs SQL liés. Par exemple, si SQL01 a un lien vers SQL02, et que 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 contient des détails sur l'utilisation de chaque module prenant 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 serveur Microsoft SQL final d'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, que SQL02 a un lien vers PAYMENTS01, et que vous souhaitez exécuter un module sur PAYMENTS01, l'argument serait /l:SQL02,PAYMENTS01./chain doit être inclus pour exécuter le module contre le serveur SQL final de la chaîne liée fournie./m:, /module:).Le wiki contient des détails sur l'utilisation de chaque module prenant en charge l'exécution sur le serveur SQL final fourni dans une Chaîne de serveurs SQL liés.
SQLRecon possè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 flag de 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 contient des détails sur l'utilisation de chaque module contre une base de données SCCM/ECM.
Users répertorie tous les utilisateurs de la table RBAC_Admins. Il s'agit de tous les utilisateurs configurés avec un certain niveau d'accès à SCCM.Sites répertorie tous les autres sites avec des données stockées dans la table DPInfo des bases de données SCCM. Cela peut offrir des pistes 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'y est connecté en dernier. NOTE : Ceci ne se met à jour qu'une fois par semaine par défaut et ne sera pas à jour à 100 %. Utilisez /option: comme argument facultatif (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âches.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 identifiants pour joindre des systèmes à des domaines, mapper des partages, exécuter des commandes, etc.Si vous souhaitez étendre SQLRecon, veuillez vous référer à la section contribution et extension dans le wiki.
Je vous encourage à ouvrir une 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.
whoami (JBalanza).adsi où le serveur LDAP n'a pas besoin d'être ajouté à la base de données msdb ; la fonction créée est désormais également supprimée correctement.SQL01 a un lien vers SQL02, que SQL02 a un lien vers SQL03, et que SQL03 a un lien vers PAYMENTS01. Il est désormais possible d'exécuter des commandes depuis SQL01 sur PAYMENTS01 en utilisant la chaîne de serveurs liés (/link:SQL02,SQL03,PAYMENTS01 /chain). Crédit à Azaël Martin (n3rada).l' et 'i', et introduction d'une logique de contexte afin que les noms de modules puissent être identiques entre l'exécution standard, par impersonation, liée et en chaîne./debug), qui affiche diverses informations de débogage et toutes les requêtes SQL qui seront exécutées par un module, sans les exécuter./host ou /h est désormais prise en charge à l'aide de valeurs séparées par des virgules./link ou /l est désormais prise en charge à l'aide de valeurs séparées par des virgules./lhost par /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, notamment le nom de l'instance et le port TCP via le protocole UDP.adsi ne supprimait pas le serveur LDAP.adsi liée, au profit d'openquery/rpc./lhost par /adsi dans le module adsi./rhost par /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 facultatif.xp_cmdshell n'affichaient pas la sortie des commandes dans la console.SetEnumerationType.cs.domain par SqlSpns.ExecuteImpersonationQuery et ExecuteImpersonationCustomQuery.Impersonate.cscheckRpc.iCheckRpc.lCheckRpc.EnableDisable.cs en ConfigureOptions.csExecuteLinkedCustomQueryRpcExec 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 le nom d'utilisateur et le mot de passe du domaine AD pour l'authentification via impersonation. Consultez Impersonation.cs.ArgumentLogic.cs, SQLAuthentication.cs et ModuleHandler.cs.ModuleHandler.cs n'utilise plus une énorme instruction if/else if/else pour exécuter les modules. À la place, la réflexion est désormais utilisée pour appeler les méthodes correspondant aux noms des modules de commandes.commands, qui contient 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 de pouvoir fournir des ports TCP non standard.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.lDisableOle.lSmb.lWhoami.lRoles.oldCmd.iOleCmd.lDatabases.lTables./v, /verbose est facultatif et affiche toutes les requêtes SQL exécutées par un module avant de les exécuter sur le ou les hôtes distants. Un exemple est disponible dans le wiki.| Nom du module | Description | Impersonation | Exécution liée | Exécution en chaîne liée | Nécessite un contexte privilégié |
|---|
CheckRpc | Obtenir une liste des serveurs liés et leur statut RPC. | ✅ | ✅ | ✅ | ❎ |
Databases | Afficher toutes les bases de données. | ✅ | ✅ | ✅ | ❎ |
Impersonate | Énumérer les comptes d'utilisateur pouvant être usurpés. | ✅ | ✅ | ✅ | ❎ |
Info | Afficher des informations sur le serveur SQL. | ✅ | ✅ | ✅ | ❎ |
Links | Énumérer les serveurs SQL liés. | ✅ | ✅ | ✅ | ❎ |
Users | Afficher quels comptes d'utilisateur et groupes peuvent s'authentifier auprès de la base de données. | ✅ | ✅ | ✅ | ❎ |
Whoami | Afficher vos privilèges. | ✅ | ✅ | ✅ | ❎ |
Query /c:QUERY | Exécuter une requête SQL. | ✅ | ✅ | ✅ | ❎ |
Smb /unc:UNC_PATH | Capturer le hash NetNTLMv2. | ✅ | ✅ | ✅ | ❎ |
Columns /db:DATABASE /table:TABLE | Afficher toutes les colonnes de la base de données et de 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 de la base de données fournie. | ✅ | ✅ | ✅ | ❎ |
EnableRpc /rhost:LINKED_HOST | Activer RPC et RPC out 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 out 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 | Exécuter une commande système à l'aide de travaux d'agent. | ✅ | ✅ | ✅ | ✔️ |
Adsi /adsi:SERVER_NAME /lport:LOCAL_PORT | Obtenir les identifiants 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. | ✅ | ✅ | ✅ | ✔️ |
OleCmd /c:COMMAND /subsystem:(OPTIONAL) | Exécuter une commande système à l'aide des procédures d'automatisation OLE. | ✅ | ✅ | ✅ | ✔️ |
XpCmd /c:COMMAND | Exécuter une commande système à l'aide de xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
| Nom du module | Description | Impersonation | 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 identifiants chiffrés stockés par SCCM. | ✅ | ❎ |
TaskList | Afficher toutes les séquences de tâches, sans accéder au contenu des données de tâches. | ✅ | ❎ |
TaskData | Déchiffrer toutes les séquences de tâches en texte clair. | ✅ | ❎ |
DecryptCredentials | Déchiffrer un blob d'identifiants SCCM. Doit être exécuté dans un processus à intégrité élevée ou SYSTEM sur le serveur SCCM. | ❌ | ✔️ |
AddAdmin /user:DOMAIN\USERNAME /sid:SID | Élever un compte fourni au rang d'« Administrateur complet » dans SCCM. | ✅ | ✔️ |
RemoveAdmin /user:ADMIN_ID /remove:STRING | Supprime les privilèges d'un utilisateur, ou supprime entièrement un utilisateur de la base de données SCCM. | ✅ | ✔️ |
Credentials répertorie les identifiants stockés par SCCM pour une utilisation dans diverses fonctions. Ces identifiants ne peuvent pas être déchiffrés à distance car la clé est stockée sur le serveur SCCM. Toutefois, ce module fournit des informations sur l'intérêt de tenter d'obtenir la clé.DecryptCredentials tente de déchiffrer les blobs d'identifiants SCCM récupérés. Ce module doit être exécuté dans un processus à intégrité élevée ou SYSTEM sur un serveur SCCM.AddAdmin élève le compte spécifié au rang d'« 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 : /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 requiert des privilèges sysadmin ou équivalents, car l'écriture dans les tables de la base de données SCCM est nécessaire.RemoveAdmin supprime les privilèges d'un utilisateur en retirant entièrement un utilisateur nouvellement ajouté de la base de données SCCM. Si l'utilisateur existait déjà d'une certaine manière, ce module supprime simplement les trois rôles qui ont été ajoutés au compte via des écritures dans la table des autorisations. Utilisez les arguments fournis par la sortie de la commande sAddAdmin pour exécuter cette commande. Ce module requiert des privilèges sysadmin ou équivalents, car l'écriture dans les tables de la base de données SCCM est nécessaire./verbose, /v), qui affiche toutes les requêtes SQL qui seront exécutées pendant l'exécution du module./timeout, /t), qui prend une valeur entière pour le délai d'attente de connexion à la base de données SQL Server.links pour inclure des informations détaillées. Crédit à Azaël Martin (n3rada).whoami pour inclure les principaux Windows et les utilisateurs de la base de données. Crédit à Azaël Martin (n3rada).impersonation pour inclure les principaux Windows et les utilisateurs de la base de données. Crédit à Azaël Martin (n3rada).sqlspns. Crédit à Azaël Martin (n3rada)./enum:info./subsystem au module olecmdexec, qui accepte l'exécution via les sous-systèmes d'automatisation OLE CmdExec ou PowerShell.AzureAD par EntraID.ModuleHandler.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.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.