Kerberos Detection
1. 设定基线
- 将来自主机的日志(包括 PowerShell 的日志记录)汇聚到一个集中管理点
- 利用基线并针对独特事件调整搜索过滤器,是检测域安全遭受破坏的有效方法
可以从检查中过滤掉的第一个简单标记是任何来自以 $ 结尾的账户请求。这些账户是计算机账户、托管服务账户或其他信任关系,由 Windows 管理该账户并生成强密码
一般来说,可以信任任何来自以 $ 结尾的账户的任何请求。这些请求来自计算机、GMSA 或受信关系,在这些情况下,Windows 会自动生成一个长密码。
2. Windows日志
| 常用事件代码 | 描述 |
|---|---|
| 4624 | 成功登录 |
| 4634 | 成功注销 |
| 4672 | 分配给新登录会话的特殊权限(通常指管理员权限) |
| 4768 | 请求了 Kerberos 身份验证票据 (TGT) |
| 4769 | 请求了 Kerberos 服务票据 (ST/TGS) |
| 4770 | 续订了 Kerberos 服务票据 |
2.1. 事件:4624 、4634 账户成功登录或注销
这些事件记录了用户每次成功登录或登出主机的时间,不论账户类型
在短时间内对单个或多个账户进行的大量不同身份验证尝试。特别是那些来自 4624 且登录类型代码为 2-Interactive 、 3-Network 或 10-Remoteinteractive 的尝试,以及/或者登录到域控制器的行为。
另外,在查看请求时,可以检查事件中的数据结构,正常的标准格式是这样的:
- Security ID: DOMAIN\AccountID
- Account Name: AccountID
- Account Domain: DOMAIN
在进行 Kerberoasting(特别是黄金票据和白银票据)攻击时,攻击者需要手动构造并伪造登录数据。由于这些数据不是由系统自动生成的,往往会留下一些不符合规范的“马脚”
如:
- Account Name : AccountID 与账户的安全标识符不匹配。
- Account Domain : testdomain.kerberoasted.org 或留空
使用银票时,我们只能在被访问的主机上看到这些日志,而黄金票据会直接记录在域控制器上
2.2. 事件:4672 新登录会话被授予特殊权限
这是跟踪管理员账户活动的好方法。它会记录分配给该账户的权限
任何访问了它们不应访问或通常不去访问的主机或基础设施的账户。被赋予了它们通常没有或不需要的权限的账户。该事件与事件 4624 相关联,通常可以发现它与一个特权账户的新登录一起出现。
2.3. 事件:4768、4769 与 4770 请求或续期了TGT TGS
通过监控这些事件,我们可以追踪任何 Kerberos 身份验证尝试或票据的续期。
- 查找事件过多的用户。
- 域控制器可以通过在账户登录下配置
Audit Kerberos Service Ticket Operations来记录成功的TGS服务票据请求。
Kerberoasting 事件的示例查询大致如下:
- 事件 ID 4769
- 服务名称不等于 krbtgt
- 服务名称不以
$结尾 - 账户名称与
'<MachineName>$@<Domain>’不匹配 - 票据加密类型为
‘0x17’(RC4-hmacw) - 票据选项:
'0x40810000'
一些其他需要监控的事件清单: https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/plan/appendix-l--events-to-monitor
2.4. 加密
在进行 Kerberoasting 时,攻击者通常会请求一种 RC4-HMAC ( $23$ )加密类型,这是现代 Active Directory 所允许的最弱的密码算法形式。虽然可以完全禁用 RC4,但并不推荐这样做,因为这会导致软件失效,而当 Kerberos 加固导致软件失效时,很难找到根本原因。与其直接禁用,不如将首选方法设为 AES,使 RC4 事件在环境中极为罕见。每当有 RC4 加密类型的请求时,都应将该事件进行分级处理。
防御者应了解哪些账户易受攻击,添加一个蜜罐账户是检测攻击者的绝佳方式。如果实施得当,放置一个强密码保护的蜜罐账户并监控其使用情况,同时关注与这些易受影响账户一起出现的弱 RC4 加密,可以在攻击者进入环境时向我们发出警报。如果 RC4 被禁用,攻击者会使用 AES 进行 Kerberoasting,从而降低密码被破解的可能性,也减少了防御者识别攻击者的机会。通过适当的监控,安全缺陷有时反而是件好事。
2.5. Powershell 日志记录
可以通过组策略为 PowerShell 模块启用日志记录
- 监控以下 PowerShell 日志事件 ID: 400 与 800
- 监控以下 PowerShell 操作日志事件 ID: 4100 、 4103 、 4104
2.5.1. 如何启用 Powershell 日志记录
在“组策略管理器”(gpmc.msc)或“本地组策略编辑器”(gpedit.msc)中,你可以按以下两个层级找到设置:
- 计算机配置 (Computer Configuration):应用于这台电脑的所有用户。
- 管理模板 (Administrative Templates)
- Windows 组件 (Windows Components)
- Windows PowerShell
- 用户配置 (User Configuration):仅应用于当前登录的特定用户。
- 管理模板 (Administrative Templates)
- Windows 组件 (Windows Components)
- Windows PowerShell
开启设置后,你可以具体定义想要记录的模块和 cmdlet。有关如何启用和配置 PowerShell 日志的更多信息,请参阅 HERE
以下是可记录的 PowerShell 功能和命令的快速列表:
| 待记录的命令集 (Cmdlets) | 描述 |
|---|---|
| ActiveDirectory | 记录通过 PowerShell 导入和使用 ActiveDirectory 模块的情况(常用于探测域用户、组等)。 |
| CimCmdlets | 记录所有 CIM(通用信息模型)交互的实例(类似于 WMI,常用于获取系统敏感信息)。 |
| GroupPolicy | 记录通过 PowerShell 对组策略进行的任何修改。 |
| Microsoft.WSMan.Management | 记录任何涉及 Web 服务或 Windows 远程管理 (WinRM) 的内容。 |
| NetAdapter/NetConnection | 记录所有与网络适配器或网络连接相关的命令(常用于内网横向移动前的网络探测)。 |
| PSScheduledJob/ScheduledTasks | 记录通过 PowerShell 对计划任务的使用情况(包括添加、更改或删除,常用于实现权限维持)。 |
| ServerManager | 从 PowerShell 中记录服务器管理器的使用情况。 |
| SmbShare | 记录任何 SMB 共享活动(例如文件传输或远程资源访问)。 |
| Microsoft.PowerShell.* | 此选项会记录所有 PowerShell 模块与命令。如果攻击者导入并使用了自定义的 PowerShell 模块,该选项会非常有用。 |
3. 值得关注的可疑活动
除了上述日志外,以下活动也可能是主机上发生可疑活动的 PowerShell 重要指标。
| 活动类型 | 描述与安全风险 |
|---|---|
| 远程 PowerShell 尝试 | 远程 PowerShell 应当仅由管理员使用。普通用户在另一台主机上远程调用 PowerShell 是极其可疑的横向移动迹象。 |
| .Net Framework 下载 | 使用 .Net 方法(如 (New-Object Net.WebClient).DownloadString)是攻击者从外部服务器拉取恶意工具的常用手段。 |
| 使用 Invoke-Expression (iex) | iex 会将字符串或变量直接解释为代码运行。黑客常将其与下载命令结合,实现“内存加载”而不落地文件。 |
| Encoded Commands (编码命令) | 如 -enc、-E。这些参数允许在命令行中使用 Base64 编码的指令,从而绕过简单的关键字检测。 |
| Invoke-Mimikatz | 著名的 Mimikatz 工具的调用字符串。出现该字符串几乎可以百分之百确定存在恶意行为。 |
| Invoke-TokenManipulation | 调用来自 PowerSploit 的脚本,用于枚举主机上的登录令牌并伪造新进程,是权限提升的信号。 |
| Invoke-CredentialInjection | 使用明文凭据创建登录且不会触发 Event 4648 警报。常与令牌操纵(TokenManipulation)配合使用。 |
| FromBase64String & Base64 | 将命令进行编码以躲避肉眼观察。PowerShell 可以使用 FromBase64String 对这些代码进行反混淆还原。 |
| Hidden Windows (隐藏窗口) | 如 -W、Hidden。这会隐藏所有弹出的 PowerShell 窗口,使攻击过程在用户毫无察觉的情况下进行。 |
| 执行策略更改 | 每当执行策略被更改为 Bypass 时,即表示有人正在尝试运行未经官方签名或不受信任的脚本。 |
| System.Reflection | 该字符串在 Mimikatz 运行后经常出现在日志中,是一个非常重要的“失陷指标 (IOC)”。 |
4. 用AMSI 进行恶意代码检测
Windows 10 和 11 中的反恶意软件扫描接口(AMSI)可在 PowerShell 及其他 Windows 脚本引擎执行之前对全部脚本代码进行扫描。系统上的防病毒/反恶意软件解决方案必须支持 AMSI 才能检查代码。
其巨大优势在于,所有传递给 PowerShell 引擎的代码都会被扫描,即使是那些从互联网下载并注入内存的代码也不例外
