本仓库包含两个异步 Beacon 对象文件 (BOF)。第一个 tgt-monitor 监控系统的 Kerberos 登录事件,并在捕获到新 Kerberos TGT 时唤醒代理。类似于 Rubeus 的 monitor 命令,该 BOF 会持续运行并定期检查 LSA 票据缓存。一旦检测到新的 TGT,它将打印票据元数据并输出 base64 编码的 kirbi 数据块,可用于通过传递票据攻击进行横向移动。第二个 tgt-renew 自动续期系统中剩余生命周期低于指定阈值(例如 15 分钟)的 TGT。
[!Important] 本仓库中的 BOF 需要异步对象文件加载能力。此类功能由 Conquest 框架提供。
这两个 BOF 都需要在 NT AUTHORITY\SYSTEM 上下文中运行。权限检查遵循相同的逻辑。
SeImpersonatePrivilege)的低完整性代理进程中使用。如果这样仍无法获得 SYSTEM 级别访问权限,则 BOF 终止。以下步骤在循环中重复执行,直到通过停止事件取消 BOF。用户定义的间隔设置轮询之间的延迟。
--user 参数,则仅考虑与该用户名匹配的会话。BeaconWakeup() 强制代理回连并返回输出。
--user 参数,则仅考虑与该用户名匹配的会话。RenewUntil 时间,则标记为已过期,需要重新认证。BeaconWakeup()。
票据续期过程包括以下步骤:
ExtractTicket() 使用 PTICKET_ENTRY 结构体中的 LUID 和 SPN 提取 ASN.1 编码的 Kerberos TGT。PTICKET_ENTRY 结构体中的 startTime、endTime、renewUntil、ticketFlags 和 encryptionType,打印票据信息及 base64。本仓库包含一个 Conquest 模块,实现了以下两个命令。
tgt-monitor BOF 在捕获到新 TGT 时发出警报,并返回 Base64 编码的数据块。需要向对象文件传递以下参数:
| 名称 | 类型 | 描述 |
|---|---|---|
interval | int | 检查间隔(秒)。 |
targetUsers | string | 不区分大小写的逗号分隔的目标用户名列表。设置此字段时,仅检索指定用户的 TGT。否则,检索所有用户的 TGT。注意,计算机账户必须以 $ 结尾。 |
用法: tgt-monitor [--interval interval] [--user user]
示例: tgt-monitor --interval 5 --user DC01$
可选参数:
--interval interval INT 轮询间隔(秒),默认值:60。
--user user STRING 逗号分隔的目标用户名列表,默认值:所有用户。

编码后的票据可直接与 Rubeus.exe ptt /ticket:<base64> 或 impacket-ticketConverter 配合使用,以进行进一步的横向移动,如下方截图所示。在 Conquest 中,可以使用 ptt 命令将票据直接注入当前登录会话以模拟目标用户。

tgt-renew BOF 自动续期即将过期的票据,直至无法再续期。需要向对象文件传递以下参数:
用法: tgt-renew [--interval seconds] [--threshold minutes] [--user user] [--luid luid]
示例: tgt-renew --luid 0x3e4 --interval 300 --threshold 30
可选参数:
--interval seconds INT 轮询间隔(秒),默认值:60。
--threshold minutes INT 票据续期阈值(分钟),默认值:15。
--user user STRING 逗号分隔的目标用户名列表,默认值:所有用户。
--luid luid STRING 逗号分隔的目标 LUID 列表,默认值:所有 LUID。
--user 和 --luid 标志互斥。

git clone https://github.com/jakobfriedl/tgt-monitor-bof
cd tgt-monitor-bof
make
然后,使用 Conquest 的脚本管理器加载 dist/tgt-monitor.py 模块。
本 Beacon 对象文件的实现基于以下项目:
| 名称 | 类型 | 描述 |
|---|
interval | int | 检查间隔(秒)。 |
threshold | int | 续期阈值(分钟)。当票据距离 EndTime 的时间低于此阈值时,进行续期。 |
targetUsers | string | 不区分大小写的逗号分隔的目标用户名列表。设置此字段时,仅续期指定用户的 TGT。否则,续期所有用户的 TGT。注意,计算机账户必须以 $ 结尾。 |
targetLuids | string | 不区分大小写的逗号分隔的目标 LUID 列表。设置此字段时,仅续期指定 LUID 的 TGT。 |