渗透技巧 – 利用PHP脚本从浏览器中获得Net-NTLM哈希

0x00前言

在上篇文章“渗透技巧 – 通过HTTP协议获得Net-NTLM哈希”介绍了通过HTTP协议获得客户端当前登录用户Net-NTLM hash的方法,侧重于介绍原理和思路,本文将要给出一个具体的实现方法,利用PHP脚本模拟Net-NTLM认证过程,提取出客户端的Net-NTLM hash

0x01简介

本文将要介绍以下内容:

  • 净NTLM认证过程
  • 利用PHP脚本模拟认证过程
  • 脚本编写细节
  • 实际测试

0x02 Net-NTLM认证过程

参考资料:

https://www.innovation.ch/personal/ronald/ntlm.html

依然使用这幅图,如下图

渗透技巧 - 利用PHP脚本从浏览器中获得Net-NTLM哈希

注:图片截取自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 <base64-encoded type-2-message>

接收客户端的Type-1-Message,回复Type-2-message

类型2消息的结构如下:

抵消 描述 内容
0 NTLMSSP签名 空终止的ASCII“NTLMSSP”(0x4e544c4d53535000)
8 NTLM消息类型 长(0x02000000)
12 目标名称 安全缓冲区
20
24 挑战 8个字节
(32) 上下文(可选) 8个字节(连续两个长)
(40) 目标信息(可选) 安全缓冲区
(48) 操作系统版本结构(可选) 8个字节

详细参数说明可参考:

http://davenport.sourceforge.net/ntlm.html#theType2Message

的值得注意参数为Flags状语从句:Challenge

挑战是使用hashcat破解Net-NTLM hash的必须参数

标志包含多种类型,一个简单的标记示例,如下图

渗透技巧 - 利用PHP脚本从浏览器中获得Net-NTLM哈希

对应的数据格式如下图

渗透技巧 - 利用PHP脚本从浏览器中获得Net-NTLM哈希

3,解析类型-3-消息

类型3消息包含客户端加密后的Net-NTLM哈希消息,提取出对应格式的数据可用于破解

类型3的消息示例如下图

渗透技巧 - 利用PHP脚本从浏览器中获得Net-NTLM哈希

这里需要注意每个参数的存储格式

short   Length;
short   Maxlen;
short   Offset;

胶印对应参数具体内容的偏移地址

如图4所示,发送网页内容

服务器向客户端提供最终的请求内容

0x04脚本编写细节

为了便于测试,不会对用户提交的凭据做验证,直接在HTTP的回复内容中返回用户的验证凭据

完整POC代码已开源,地址如下:

https://raw.githubusercontent.com/3gstudent/Writeup/master/catchyournetntlm.php

POC代码基于https://loune.net/2007/10/simple-lightweight-ntlm-in-php/

做了以下优化:

1,不再局限于apache模块

原脚本只能在阿帕奇下使用

2,提取Net-NTLM哈希

原脚本输出端的三个属性: $user $domain $workstation

新脚本添加了文件格式解析的功能,出提取HMAC-MD5状语从句:blob

脚本细节:

原POC中的function get_msg_str($msg, $start, $unicode = true)

调用在$user = get_msg_str($msg, 36);时,由于之前的标志指定了unicode,所以默认执行以下代码:

if ($unicode)
        return str_replace("\0", '', substr($msg, $off, $len));

会自动去除字符串中的0x00

在而提取HMAC-MD5状语从句:blob时,需要保留0x00,所以我们要传入参数错误,字符不对0x00进行过滤

具体的代码为:

$Response = get_msg_str($msg, 20,false);

至于challenge,在脚本中指定为0x0000000000000000,所以最后拼接hashcat格式的直接时设置为0x0000000000000000即可

0x05实际测试

1,本地测试

服务器:

安装的Apache环境

简单的配置方法:安装phpstudy

上传脚本catchyournetntlm.php

客户:

修改IE配置文件,将登录方式修改为Automatic logon with current user name and password

对应命令如下:

REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3" /v 1A00 /t REG_DWORD /d 00000000 /f

注:

域环境下不需要这个设置

客户端访问服务器上的catchyournetntlm.php,服务器获得用户的Net-NTLM哈希,提取出固定格式返回至Client

客户端显示如下图

渗透技巧 - 利用PHP脚本从浏览器中获得Net-NTLM哈希

数据可直接用于hashcat的破解

2,在线测试

https://evi1cg.me/test.php

服务器使用nginx的,未使用的Apache

注:

nginx的下脚本的优化由evilcg完成

客户端使用默认登录方法,访问该网址弹出对话框提示输入密码,如下图

渗透技巧 - 利用PHP脚本从浏览器中获得Net-NTLM哈希

任意输入,获得输入内容的Net-NTLM哈希,如下图

渗透技巧 - 利用PHP脚本从浏览器中获得Net-NTLM哈希

将客户端的登录方式修改为Automatic logon with current user name and password,访问该网址自动获得客户端当前用户的Net-NTLM哈希,如下图

渗透技巧 - 利用PHP脚本从浏览器中获得Net-NTLM哈希

0x06小结

本文介绍了利用PHP脚本从浏览器中获得Net-NTLM hash的方法,分享脚本编写细节,实际测试该方法的效果。

原创文章,作者:3gstudent,如若转载,请注明出处:http://www.mottoin.com/tech/110014.html

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code