NTLM协议学习记录
前置知识
本机用户密码 hash 放在 本地的SAM文件,域内用户密码 hash 放在 域控的NTDS.DIT文件。
NTLM 验证的工作流程:
- 登录
- 协商,包含客户端支持和服务器请求的功能列表。
- 质询,包含服务器支持和同意的功能列表和 challenge
- 身份验证,使用用户 hash 和 chanllenge 进行加密得到 response(证明身份)
- 服务端和域控建立连接,把前三个消息转发给域控
- 域控有用户的 hash,可以加密验证
另外 NTLM 不是单独的协议,而是嵌套在其他协议中的(http,smb等)Pass the hash(哈希传递攻击)
身份验证的 response 是之间用 hash 而不是明文密码攻击的,所有模拟用户登录的时候不需要明文密码。对应补丁 kb2871997(但只能缓解不能拿杜绝),kb2871997 对Administrator(rid500)和本地管理员组的域用户没有影响。
这里发生作用的是远程访问上下文中的用户帐户控制(UAC)令牌筛选。
在使用本地用户尽心远程登录时不会使用完全管理员权限(因为没过 UAC),但是在域用户被加入到本地管理员组之后,域用户可以使用完全管理员的 AccessToken 运行,且 UAC 不会生效。
但是,如果 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy项存在(默认不存在)且配置为1,将授予来自管理员所有本地成员的远程连接完整的高完整性令牌。这意味着未过滤非RID 500帐户连接,并且可以成功传递哈希值!(可留作后门)。
KB2871997的更改
- 支持“ProtectedUsers”组
“ProtectedUsers”组是WindowsServer 2012 R2域中的安全组,“ProtectedUsers”组成员会强制使用 Kerberos 身份验证,并且对 Kerberos 强制执行 AES 加密。 - RestrictedAdmin RDP模式的远程桌面客户端支持
避免将 Client 端的凭据暴露给远程系统,同时衍生出新的攻击方式(Passingthe Hash with Remote Desktop)。 - 注销后删除凭证
- 添加两个 SID
1、本地帐户,LOCAL_ACCOUNT(S-1-5-113),所有本地帐户继承自此SID; 2、本地帐户和管理组成员(所有本地Administrators组中的本地帐户),LOCAL_ACCOUNT_AND_MEMBER_OF_ADMINISTRATORS_GROUP(S-1-5-114),所有管理员组的本地用户继承此SID。
- LSASS中删除了明文凭证
注册表地址:HKEY_LOCAL_MACHINE\ System \ CurrentControlSet \ Control \ SecurityProviders \ WDigest
如果UseLogonCredential值设置为0,则WDigest不会将凭据存储在内存中;
如果UseLogonCredential值设置为1,WDigest将在内存中存储凭据。
- 支持“ProtectedUsers”组
信息收集
在质询阶段返回 Challenge 的过程中同时返回了操作系统类型,主机名,netbios名等等,可以通过给服务器发请求得到服务器信息。ntlm relay
客户端计算完 response 之后,被中间人转发到服务端,最后服务端授予中间人访问权限。
Net-NTLM v1 的破解
Responder.conf 中 的Challenge,设为 1122334455667788,在这种情况下先用使用ntlmv1-multi里面的 ntlmv1.py 转换 ,再用 https://crack.sh/get-cracking/ 就能破解了。
其实有两种加密方式,由 NTLMSSPNEGOTIATEEXTENDED_SESSIONSECURITY 决定(0/1),其中的 NTLMSSPNEGOTIATEEXTENDED_SESSIONSECURITY 来自质询阶段。
第一种加密(0的时候,Responder默认获取)
- 将 16字节的NTLM hash空填充为21个字节,然后分成三组,每组7字节
- 将三组(每组7字节)经过运算后作为DES加密算法的密钥(7字节凑一个奇偶叫用位补全)
- 加密Server Challenge
- 将这三个密文值连接起来得到response。
第二种加密 (1的时候,Responder加--lm时获取)
加密的内容不是 Server Challenge,而是 md5(server challeng+client challent) 的前8位。Net-NTLM v2 的破解 & Relay
hashcat 进行字典破解,大概率跑不出来,于是就要用 Relay 来搞了。
1.Relay2SMB,直接 relay 到 smb 服务器,可以控制该服务器,分为两种情况
- 工作组,不同机器没有信任关系,没什么用,攻击手段就是 reflect 回机器本身,ms08-068中有限制,在CVE-2019-1384(Ghost Potato)被绕过。
- 域环境,如果没有限制某域用户登录到某台机器的时候,可以 relay,当然拿到了域控也可以 relay 到普通机器。
2.Relay2EWS, relay 到 Exchange 上,从而能收发邮件,进行代理等,如果 Exchange开放在外网的话,可以直接从外网发起 relay。
工具:https://github.com/Arno0x/NtlmRelayToEWS
3.Relay2LDAP,三种情况:
- 高权限用户发起 NTLM 请求,包括
Enterprise admins Domain admins Built-in Administrators Backup operators Account operators
那么就可以将任意用户拉进组,把它变成高权限用户。 - 有 write-acl 权限,可以添加两台 acl,之后细说。
- 普通用户权限,server2012 R2 之后,可以设置基于资源的约束委派。
参考文献