Xiao7 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 上一篇文章《渗透技巧——通过HTTP协议获得Net-NTLM hash》介绍了通过HTTP协议获取客户端当前登录用户的Net-NTLM hash的方法,重点介绍了原理和思路。本文将给出一个具体的实现方法,用PHP脚本模拟Net-NTLM认证过程,提取客户端的Net-NTLM哈希。 0x01 简介 本文将介绍以下内容: Net-NTLM认证过程 用PHP脚本模拟认证过程 脚本详细信息 实物试验 0x02 Net-NTLM认证过程 参考资料: https://www.innovation.ch/personal/ronald/ntlm.html 还是用这张图,如下图。 注: 照片取自https://www.innovation.ch/personal/ronald/ntlm.html. 0x03 利用PHP脚本模拟认证过程 如果想通过PHP脚本模拟Net-NTLM认证过程,主要考虑的是服务器的实现。 1、发送WWW-Authenticate: NTLM 收到客户端的GET请求后,回复401 unauthorized www-authenticate:NTLM,提示客户端需要NTLM认证。 2、发送WWW-Authenticate: NTLM 客户端收到类型1消息,回复类型2消息 类型2消息具有以下结构: Offset Description Content 0 NTLMSSP Signature Null-terminated ASCII “NTLMSSP” (0x4e544c4d53535000) 8 NTLM Message Type long (0x02000000) 12 Target Name security buffer 20 Flags long 24 Challenge 8 bytes (32) Context (optional) 8 bytes (two consecutive longs) (40) Target Information (optional) security buffer (48) OS Version Structure (Optional) 8 bytes 请参考: http://davenport.sourceforge.net/ntlm.html#theType2Message 值得注意的参数是标志和挑战。 挑战是用hashcat破解Net-NTLM散列的必要参数。 标志包含许多类型。下图显示了一个简单的标志示例。 相应的数据格式如下 3、解析Type-3-message Type-3消息包含客户端加密的Net-NTLM哈希消息,可以提取相应格式的数据进行破解。 类型3消息的示例如下 这里要注意每个参数的存储格式。 长度短; 短Maxlen 短偏移; 偏移地址对应于偏移参数的具体内容 4、发送网页内容 向服务器提供最终的请求内容。 0x04 脚本编写细节 为了测试方便,不会对用户提交的凭证进行验证,直接在HTTP的回复内容中返回用户的验证凭证。 完整的POC代码是开源的,地址如下: https://raw . githubusercontent . com/3g student/Writeup/master/catchayournetlm . PHP POC代码基于https://loune.net/2007/10/simple-lightweight-ntlm-in-php/ 进行了以下优化: 1、不再局限于apache module 原始脚本只能在apache下使用 2、提取Net-NTLM hash 原始脚本输出客户机的三个属性:$user $domain $workstation 新脚本增加了文件格式分析功能,并提取HMAC-MD5和blob。 脚本细节: 原始POC中的函数get _ msg _ str($ msg,$ start,$ unicode=true) At $user=get_msg_str($msg,36);因为前面的标志指定了unicode,所以默认情况下会执行以下代码: 如果($unicode) return str_replace('\0 ','',substr($msg,$off,$ len)); 字符串中的0x00被自动删除。 在提取HMAC-MD5和blob时,我们需要保留0x00,所以我们必须在不过滤字符0x00的情况下传入参数false。 具体代码是: $Response=get_msg_str($msg,20,false); 至于挑战,在脚本中指定为0x00000000000000000,所以在最终拼接hashcat的格式时可以直接设置为0x000000000000。 0x05 实际测试 1、本地测试 Server: 安装apache环境 简单的配置方法:安装phpstudy 上传脚本catchyournetntlm.php Client: 修改IE配置文件,将登录模式改为使用当前用户名和密码自动登录。 相应的命令如下: REG ADD ' HKEY _当前用户\软件\ Microsoft \ Windows \当前版本\Internet设置\区域\ 3 '/v 1a 00/t REG _ DWORD/d 00000000/f 注: 在域环境中不需要此设置。 客户端访问服务器上的catchyournetntlm.php,服务器获取用户的Net-NTLM哈希,提取固定格式并返回给客户端。 客户端显示如下图 数据可以直接用来破解hashcat。 2、在线测试 https://evi1cg.me/test.php 服务器nginx,不是apache。 注: nginx下的脚本优化由evilcg完成。 使用客户端的默认登录方式,访问该URL,会弹出一个对话框提示输入密码,如下图所示 任意输入以获得输入内容的网络NTLM哈希,如下图所示 将客户端的登录模式修改为使用当前用户名和密码自动登录,访问URL自动获取客户端当前用户的Net-NTLM哈希,如下图所示 0x06 小结 摘要:介绍了利用PHP脚本从浏览器获取Net-NTLM哈希的方法,分享了脚本编写的细节,并测试了该方法的效果。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子