
Un kit de herramientas C# MS SQL diseñado para reconocimiento ofensivo y post-explotación.
SQLRecon es un conjunto de herramientas para Microsoft SQL Server diseñado para reconocimiento ofensivo y post-explotación. Para obtener información detallada sobre cómo usar cada técnica, consulta la wiki.
Puedes descargar una copia de SQLRecon desde la página de releases. Alternativamente, siéntete libre de compilar la solución tú mismo. Esto debería ser tan sencillo como clonar el repositorio, hacer doble clic en el archivo de la solución y compilar.
También se ha proporcionado orientación sobre prevención, detección y mitigación para todos los defensores que estáis ahí fuera.
Echa un vistazo a mi publicación en el sitio web de IBM Security Intelligence. Si prefieres los vídeos, entonces echa un vistazo a mi presentación en Black Hat.
Los módulos de enumeración no requieren que se proporcione un proveedor de autenticación. Estos módulos deben pasarse mediante el indicador de módulo de enumeración (/e:, /enum:). La wiki tiene detalles sobre el uso de módulos de enumeración.```
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.
# Authentication Providers
SQLRecon admite un conjunto diverso de proveedores de autenticación (`/a:, /auth:`) para permitir la interacción con un 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:) es obligatorio y permite uno o más servidores SQL. Si desea ejecutar un módulo contra varios servidores SQL, separe los hosts con una coma, por ejemplo /h:SQL01,10.10.10.2,SQL03.master de forma predeterminada; sin embargo, esto se puede cambiar opcionalmente proporcionando un nombre de base de datos personalizado mediante el indicador database (/database:)./debug es opcional y muestra todas las consultas SQL que ejecuta un módulo, sin ejecutarlas realmente en los hosts remotos. Puede encontrar un ejemplo de esto en la wiki.1433 de forma predeterminada; sin embargo, esto se puede cambiar opcionalmente usando el indicador /port:.3 segundos; sin embargo, este valor se puede cambiar opcionalmente proporcionando un valor de tiempo de espera (/t:, /timeout:) que corresponde al número de segundos antes de terminar el intento de conexión.Tenga en cuenta que el proveedor de autenticación EntraID requiere que la Biblioteca de autenticación de Azure Active Directory (ADAL) o la Biblioteca de autenticación de Microsoft (MSAL) exista en el sistema desde el que se ejecuta SQLRecon. Esto es para la funcionalidad de autenticación y autorización de Azure EntraID.
Los módulos SQL se ejecutan contra una o más instancias de Microsoft SQL Server. Estos módulos deben pasarse al indicador de módulo (/m:, /module:).
El indicador de host (/h:, host:) es obligatorio y permite uno o más servidores SQL. Si desea ejecutar un módulo contra varios servidores SQL, separe los hosts con una coma, por ejemplo /h:SQL01,10.10.10.2,SQL03.
La wiki tiene detalles sobre el uso de cada módulo que admite la ejecución en una o más instancias de SQL Server.
Los módulos de suplantación se ejecutan contra una o más instancias de Microsoft SQL Server, bajo el contexto de un usuario SQL suplantado. Todos los módulos de suplantación tienen los siguientes requisitos mínimos:
/i:, /iuser:)./m:, /module:).La wiki tiene detalles sobre el uso de cada módulo que admite la ejecución mediante suplantación.
Los módulos vinculados se ejecutan en una o más instancias de un Microsoft SQL Server vinculado. Todos los módulos vinculados tienen los siguientes requisitos mínimos:
/l:, /link:). El indicador de vínculo permite uno o más servidores SQL vinculados. Por ejemplo, si SQL01 tiene un vínculo con SQL02, y SQL01 tiene un vínculo con DB04, puede separar los hosts vinculados con una coma, y se ejecutará un módulo en cada servidor SQL vinculado, por ejemplo /l:SQL02,DB04./m:, /module:).La wiki tiene detalles sobre el uso de cada módulo que admite la ejecución en una o más instancias de un servidor SQL vinculado.
Los módulos de cadena vinculada se ejecutan en el Microsoft SQL Server final de una cadena de servidores vinculados. Todos los módulos de cadena vinculada tienen los siguientes requisitos mínimos:
/l:, /link:. Si SQL01 tiene un vínculo con SQL02, y SQL02 tiene un vínculo con PAYMENTS01, y desea ejecutar un módulo en PAYMENTS01, entonces el argumento sería /l:SQL02,PAYMENTS01./chain debe incluirse para ejecutar el módulo contra el servidor SQL final de la cadena vinculada proporcionada./m:, /module:).La wiki tiene detalles sobre el uso de cada módulo que admite la ejecución en el servidor SQL final proporcionado en una cadena de servidores SQL vinculados.
SQLRecon tiene varios módulos que pueden ayudar a enumerar y atacar Microsoft System Center Configuration Manager (SCCM) y Microsoft Endpoint Configuration Manager (ECM). El servidor SCCM o ECM deberá tener una base de datos Microsoft SQL expuesta local o remotamente.
Los módulos SCCM deben pasarse al indicador de módulo SCCM (/s:, /sccm:).
La mayoría de los módulos SCCM se pueden ejecutar bajo el contexto de un usuario SQL suplantado (/i:, /iuser:).
La wiki tiene detalles sobre el uso de cada módulo contra una base de datos SCCM/ECM.
Users lista todos los usuarios de la tabla RBAC_Admins. Estos son todos los usuarios configurados con algún nivel de acceso a SCCM.Sites lista todos los demás sitios con datos almacenados en la tabla DPInfo de las bases de datos de SCCM. Esto puede proporcionar vías de ataque adicionales, ya que diferentes sitios pueden configurarse de diferentes maneras (inseguras).Logons consulta la tabla Computer_System_DATA para recuperar todos los clientes SCCM asociados junto con el usuario que inició sesión en ellos por última vez. NOTA: Esto solo se actualiza una vez por semana de forma predeterminada y no estará 100 % actualizado. Use /option: como argumento opcional (no requerido) para filtrar los clientes SCCM.TaskList proporciona una lista de todas las secuencias de tareas almacenadas en la base de datos SCCM, pero no accede al contenido real de los datos de las tareas.TaskData recupera todas las secuencias de tareas almacenadas en la base de datos SCCM y las descifra a texto plano. Las secuencias de tareas pueden contener credenciales para unir sistemas a dominios, asignar recursos compartidos, ejecutar comandos, etc.Si está interesado en ampliar SQLRecon, consulte la sección de contribución y ampliación en la wiki.
Le animo a abrir un issue si tiene sugerencias o ideas.
El objetivo es mejorar SQLRecon de forma continua. A continuación se enumeran algunas áreas de investigación planificadas:
Las siguientes personas han contribuido directa o indirectamente a diversos aspectos de SQLRecon.
whoami (JBalanza).adsi donde el servidor LDAP no necesita agregarse a la base de datos msdb; además, la función creada ahora se elimina correctamente.SQL01 tiene un vínculo con SQL02, y SQL02 tiene un vínculo con SQL03, y SQL03 tiene un vínculo con PAYMENTS01. Ahora es posible ejecutar comandos desde SQL01 en PAYMENTS01 usando la cadena de servidores vinculados (/link:SQL02,SQL03,PAYMENTS01 /chain). Crédito a Azaël Martin (n3rada).l' y 'i', y se introdujo lógica de contexto para que los nombres de los módulos puedan ser los mismos en la ejecución estándar, de suplantación, vinculada y en cadena./debug), que mostrará diversa información de depuración y todas las consultas SQL que ejecutará un módulo, sin ejecutarlas./host o /h usando valores separados por comas./link o /l usando valores separados por comas./lhost a /link.s' y se creó la opción /s, /sccm para los módulos SCCM.DecryptCredentials./enum) llamado info, que puede usar un contexto no autenticado para obtener información del servidor SQL, incluidos el nombre de la instancia y el puerto TCP mediante el protocolo UDP.adsi no eliminaba el servidor LDAP.adsi vinculado, en favor de openquery/rpc./lhost a /adsi en el módulo adsi./rhost a /unc en el módulo smb.CaptureHash.cs y se simplificó la lógica.SetEnumerationType.cs y se simplificó la lógica.Impersonation.cs a Impersonate.cs.OleCmdExec.cs a .smb.info.info.rows, iRows y lRows.sLogons para incluir un filtro opcional.xp_cmdshell no imprimían la salida de los comandos en la consola.SetEnumerationType.cs.domain a SqlSpns.ExecuteImpersonationQuery y ExecuteImpersonationCustomQuery.Impersonate.cs.checkRpc.iCheckRpc.lCheckRpc.EnableDisable.cs a ConfigureOptions.cs.ExecuteLinkedCustomQueryRpcExec. PrintUtils.cs, que implementa una clase de impresión para la salida estandarizada.TablePrinter de Help.cs a PrintUtils.cs.PrintUtils.querysearchtableslColumnslQuerylSearchlTablesiColumnsAzure a AzureAD.AzureLocal.disableRpc.enableRpc.iEnableRpc.iDisableRpc.lEnableRpc.lDisbleRpc.lAgentCmd.clr, iClr y lClr usando SqlCommand.ExecuteNonQuery al crear el procedimiento almacenado.lClr que no eliminaba los ensamblados o procedimientos almacenados creados.columns.iColumns.iDatabases.iSearch.iTables.lColumns.lSearch.ExecuteLinkedCustomQueryRpcExec.x.Random.cs al directorio utilities.Windows a WinToken.WinDomain, que usa el nombre de usuario y la contraseña del dominio AD para autenticarse mediante suplantación. Consulta Impersonation.cs.ArgumentLogic.cs, SQLAuthentication.cs y ModuleHandler.cs.ModuleHandler.cs ya no usa una enorme sentencia if/else if/else para ejecutar módulos. En su lugar, ahora se usa la reflexión para llamar a métodos que coinciden con los nombres de los módulos de comandos.commands, que contiene variables globales que se usan en todo el programa.SQLAuthentication.cs.Program.cs a ArgumentLogic.cs.sccm.roles, iRoles y lRoles.users, iUsers y lUsers.sp_drop_trusted_assembly en los módulos clr e iClr.lAgentCmd.lClr.info.Local y Azure.-e domain).-r a los modos de autenticación Windows y Local para poder indicar puertos TCP no estándar.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 es opcional y muestra todas las consultas SQL que ejecuta un módulo antes de ejecutarlas en los hosts remotos. Puede encontrar un ejemplo de esto en la wiki.| Nombre del módulo | Descripción | Suplantación | Ejecución vinculada | Ejecución de cadena vinculada | Requiere contexto privilegiado |
|---|
CheckRpc | Obtener una lista de servidores vinculados y su estado de RPC. | ✅ | ✅ | ✅ | ❎ |
Databases | Mostrar todas las bases de datos. | ✅ | ✅ | ✅ | ❎ |
Impersonate | Enumerar las cuentas de usuario que se pueden suplantar. | ✅ | ✅ | ✅ | ❎ |
Info | Mostrar información sobre el servidor SQL. | ✅ | ✅ | ✅ | ❎ |
Links | Enumerar servidores SQL vinculados. | ✅ | ✅ | ✅ | ❎ |
Users | Mostrar qué cuentas de usuario y grupos pueden autenticarse contra la base de datos. | ✅ | ✅ | ✅ | ❎ |
Whoami | Mostrar sus privilegios. | ✅ | ✅ | ✅ | ❎ |
Query /c:QUERY | Ejecutar una consulta SQL. | ✅ | ✅ | ✅ | ❎ |
Smb /unc:UNC_PATH | Capturar hash NetNTLMv2. | ✅ | ✅ | ✅ | ❎ |
Columns /db:DATABASE /table:TABLE | Mostrar todas las columnas de la base de datos y la tabla proporcionadas. | ✅ | ✅ | ✅ | ❎ |
Rows /db:DATABASE /table:TABLE | Mostrar el número de filas en la tabla de la base de datos proporcionada. | ✅ | ✅ | ✅ | ❎ |
Search /keyword:KEYWORD | Buscar nombres de columnas en la tabla proporcionada de la base de datos a la que está conectado. | ✅ | ✅ | ✅ | ❎ |
Tables /db:DATABASE | Mostrar todas las tablas de la base de datos proporcionada. | ✅ | ✅ | ✅ | ❎ |
EnableRpc /rhost:LINKED_HOST | Habilitar RPC y RPC out en un servidor vinculado. | ✅ | ❌ | ❌ | ✔️ |
EnableClr | Habilitar la integración de CLR. | ✅ | ✅ | ✅ | ✔️ |
EnableOle | Habilitar los procedimientos de automatización OLE. | ✅ | ✅ | ✅ | ✔️ |
EnableXp | Habilitar xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
DisableRpc /rhost:LINKED_HOST | Deshabilitar RPC y RPC out en un servidor vinculado. | ✅ | ❌ | ❌ | ✔️ |
DisableClr | Deshabilitar la integración de CLR. | ✅ | ✅ | ✅ | ✔️ |
DisableOle | Deshabilitar los procedimientos de automatización OLE. | ✅ | ✅ | ✅ | ✔️ |
DisableXp | Deshabilitar xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
AgentStatus | Mostrar si el agente SQL se está ejecutando y obtener trabajos del agente. | ✅ | ✅ | ✅ | ✔️ |
AgentCmd /c:COMMAND | Ejecutar un comando del sistema usando trabajos del agente. | ✅ | ✅ | ✅ | ✔️ |
Adsi /adsi:SERVER_NAME /lport:LOCAL_PORT | Obtener credenciales ADSI en texto claro de un servidor ADSI vinculado. | ✅ | ✅ | ✅ | ✔️ |
Clr /dll:DLL /function:FUNCTION | Cargar y ejecutar un ensamblado .NET en un procedimiento almacenado personalizado. | ✅ | ✅ | ✅ | ✔️ |
OleCmd /c:COMMAND /subsystem:(OPTIONAL) | Ejecutar un comando del sistema usando procedimientos de automatización OLE. | ✅ | ✅ | ✅ | ✔️ |
XpCmd /c:COMMAND | Ejecutar un comando del sistema usando xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
| Nombre del módulo | Descripción | Suplantación | Requiere contexto privilegiado |
|---|
Users | Mostrar todos los usuarios de SCCM. | ✅ | ❎ |
Sites | Mostrar todos los demás sitios con datos almacenados. | ✅ | ❎ |
Logons | Mostrar todos los clientes SCCM asociados y el último usuario que inició sesión. | ✅ | ❎ |
Credentials | Mostrar las credenciales cifradas almacenadas por SCCM. | ✅ | ❎ |
TaskList | Mostrar todas las secuencias de tareas, pero no acceder al contenido de los datos de las tareas. | ✅ | ❎ |
TaskData | Descifrar todas las secuencias de tareas a texto plano. | ✅ | ❎ |
DecryptCredentials | Descifrar un blob de credenciales de SCCM. Debe ejecutarse en un proceso de alta integridad o SYSTEM en el servidor SCCM. | ❌ | ✔️ |
AddAdmin /user:DOMAIN\USERNAME /sid:SID | Elevar una cuenta proporcionada a 'Administrador completo' en SCCM. | ✅ | ✔️ |
RemoveAdmin /user:ADMIN_ID /remove:STRING | Elimina los privilegios de un usuario, o elimina un usuario por completo de la base de datos SCCM. | ✅ | ✔️ |
CredentialsDecryptCredentials intenta descifrar los blobs de credenciales SCCM recuperados. Este módulo debe ejecutarse en un proceso de alta integridad o SYSTEM en un servidor SCCM.AddAdmin eleva la cuenta especificada a 'Administrador completo' dentro de SCCM. Si el usuario objetivo ya es un usuario de SCCM, este módulo agregará los privilegios necesarios para elevarlo. Proporcione dos argumentos: /user:current /sid:current si busca agregar al usuario que actualmente ejecuta el proceso de SQLRecon como un 'Administrador completo' en SCCM. Si busca agregar a otro usuario como un 'Administrador completo' en SCCM, especifique su nombre de usuario de dominio y SID completo /user:DOMAIN\USERNAME /sid:S-1-5-.... Este módulo requiere sysadmin o privilegios similares, ya que se requiere escribir en las tablas de la base de datos SCCM.RemoveAdmin elimina los privilegios de un usuario al eliminar por completo a un usuario recién agregado de la base de datos SCCM. Si el usuario ya existía de alguna forma, este módulo solo elimina los tres roles que se agregaron a la cuenta mediante escrituras en la tabla de permisos. Use los argumentos proporcionados por la salida del comando sAddAdmin para ejecutar este comando. Este módulo requiere sysadmin o privilegios similares, ya que se requiere escribir en las tablas de la base de datos SCCM./verbose, /v), que mostrará todas las consultas SQL que se ejecutarán durante la ejecución del módulo./timeout, /t), que toma un valor entero para el tiempo de espera de conexión a la base de datos del servidor SQL.links para incluir información detallada. Crédito a Azaël Martin (n3rada).whoami para incluir entidades de seguridad de Windows y usuarios de bases de datos. Crédito a Azaël Martin (n3rada).impersonation para incluir entidades de seguridad de Windows y usuarios de bases de datos. Crédito a Azaël Martin (n3rada).sqlspns. Crédito a Azaël Martin (n3rada)./enum:info./subsystem al módulo olecmdexec, que acepta la ejecución mediante los subsistemas de automatización OLE CmdExec o PowerShell.AzureAD a EntraID.ModuleHandler.cs para promover la simplificación y la extensibilidad.Queries.cs.EnumerationModules.cs.FormatQuery.cs.SccmModules.cs.ModuleHandler.cs a SqlModules.cs.OleAutomation.csPrintUtils.cs a Print.cs.SQLServerInfo.cs a Info.cs.iQueryiSearchauthentication.Help.cs de un método a un constructor.CaptureHash.cs de un método a un constructor.Impersonate.cs de un método a un constructor.lEnableClr.lDisableClr.lXpCmd.lXpOle.Random.cs.EnableDisable.cs.clr.ole.mapped y roles en whoami.lMapped y lRoles en lWhoami.iMapped y iRoles en iWhoami.