在工作组环境中,Net-NTLM Hash通常用于NTLM认证,用于建立共享资料的smb共享。早期的smb传输使用明文口令,后来改为LM,现在使用NTLM。NTLM主要用于Windows NT和Windows 2000 Server(或更高版本)的工作组环境中,而在AD域环境中,如果需要认证Windows NT系统,也需要使用NTLM。与Kerberos相比,NTLM的认证过程更简单,采用质询/应答的消息交换模式。NTLM必须嵌入在上层协议中进行消息传输,比如嵌入在SMB协议中。简而言之,NTLM是一种在网络环境下进行认证的机制。
为了模拟流量请求,可以使用net use命令,因为net use是基于smb的,所以会产生smb的流量。其中,13-22个请求包是net use的包,其中13-16是smb的包,17-20是NTLM认证的包。我们可以逐个分析这些包的内容。
客户端向服务器发送smb协商1请求包,其中包含客户端支持的smb协议版本。服务器返回smb Response 1,其中包含服务器支持的smb版本。然后客户端根据服务器返回的smb版本选择一个双方都支持的版本,并发送协商smb Request 2。
服务器回应smb Response 2。这里我对于为什么要发送四个包有些疑惑,因为前两个包已经获取了客户端和服务器支持的smb版本,第三个包直接进行认证就可以了,为什么还要进行smb Request 2呢?这似乎有些多余。我注意到两个Response中的Dialect字段有些不同。
仔细观察Request 2,发现只发送了两个smb版本。我大胆猜测,smb req 1发送了所有支持的协议版本,smb resp 1返回期望的smb版本,即上图中的Dialect字段SMB2 wildcard。smb req 2表示客户端发现本地有两个smb V2的版本,需要重新协商使用哪个版本,因此将本地所有的smb V2版本都发送过去。smb resp 2则是选择了较高的版本,即SMB 2.1。
NTLMSSPNEGOTIATE Request包向服务器发送一些版本信息,以便协商协议版本。NTLMSSPNEGOTIATE Response包返回NTLMSSP_Challenge,其中包含一个16位的随机数Challenge。客户端接收到Challenge后,使用用户的NTLM Hash与Challenge进行加密运算,得到Response,并将Response、用户名和Challenge发送给服务器。在这个过程中,Response是最关键的部分,因为它向服务器证明客户端用户已经知道账户密码。在网络协议中,经过NTLM Hash加密Challenge的结果被称为Net NTLM Hash。接下来是第三个请求包。
客户端将刚刚计算的Response、用户名和Challenge发送给服务器。这里的Challenge是客户端重新生成的一个随机的nonce,与前一个响应包中的Challenge不同。MIC是校验和,设计MIC的目的主要是为了防止该包在传输过程中被修改。session_key在需要进行签名时使用,用于协商加密密钥。
username::hostname:LM Response:NTLM Response:Challenge
第四个请求包表示验证通过。当使用错误的用户名密码进行net use时,验证将失败。如图所示,Net-NTLM Hash在第19个请求包的Response中根据系统版本被分为六种响应类型:LM响应、NTLMv1响应、NTLMv2响应、LMv2响应、NTLM2会话响应和匿名响应。这六种响应类型使用的加密流程相同,都是基于Challenge/Response验证机制,只是Challenge和加密算法有所不同。根据LmCompatibilityLevel的安全设置,决定发送哪种响应,默认设置如下:Windows 2000和Windows XP发送LM和NTLM响应,Windows Server 2003仅发送NTLM响应,Windows Vista、Windows Server 2008、Windows 7以及Windows Server 2008 R2及以上仅发送NTLMv2响应。
username::domain:Challenge:HMAC-MD5:blob
Net-NTLM Hash v1的格式如下:
administrator::test:bb7e0cce5b7a719c:40426e2eaa7d7b467855be0881b5d069:01010000000000001111f0f6ae9ed60161e75abd99c8fd2b0000000002000800540045005300540001000400440043000400140074006500730074002e006c006f00630061006c0003001a00440043002e0074006500730074002e006c006f00630061006c000500140074006500730074002e006c006f00630061006c00070008001111f0f6ae9ed601060004000200000008003000300000000000000000000000003000007276a9639bd6e10c91bbc264a284d542e7acb37803ef6a3bf7e3eb9cbf82a2d20a001000000000000000000000000000000000000900200063006900660073002f003100370032002e00310036002e00330033002e003300000000000000000000000000
hashcat -m 5600 administrator::test:bb7e0cce5b7a719c:40426e2eaa7d7b467855be0881b5d069:01010000000000001111f0f6ae9ed60161e75abd99c8fd2b0000000002000800540045005300540001000400440043000400140074006500730074002e006c006f00630061006c0003001a00440043002e0074006500730074002e006c006f00630061006c000500140074006500730074002e006c006f00630061006c00070008001111f0f6ae9ed601060004000200000008003000300000000000000000000000003000007276a9639bd6e10c91bbc264a284d542e7acb37803ef6a3bf7e3eb9cbf82a2d20a001000000000000000000000000000000000000900200063006900660073002f003100370032002e00310036002e00330033002e003300000000000000000000000000 /tmp/password.list --force
Net-NTLM Hash v2的格式如下:Challenge为NTLM Server Challenge,domain由数据包内容获得(IP或机器名),HMAC-MD5对应数据包中的NTProofStr。