跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

渗透技巧——使用PHP脚本从浏览器获取网络NTLM散列


Xiao7

推荐的帖子

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

还是用这张图,如下图。

2-1.png

注:

照片取自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散列的必要参数。

标志包含许多类型。下图显示了一个简单的标志示例。

2-2.png

相应的数据格式如下

2-4.png

3、解析Type-3-message

Type-3消息包含客户端加密的Net-NTLM哈希消息,可以提取相应格式的数据进行破解。

类型3消息的示例如下

2-3.png

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

长度短;

短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哈希,提取固定格式并返回给客户端。

客户端显示如下图

3-1.png

数据可以直接用来破解hashcat。

2、在线测试

https://evi1cg.me/test.php

服务器nginx,不是apache。

注:

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

使用客户端的默认登录方式,访问该URL,会弹出一个对话框提示输入密码,如下图所示

4-1.png

任意输入以获得输入内容的网络NTLM哈希,如下图所示

4-2.png

将客户端的登录模式修改为使用当前用户名和密码自动登录,访问URL自动获取客户端当前用户的Net-NTLM哈希,如下图所示

4-3.png

0x06 小结

摘要:介绍了利用PHP脚本从浏览器获取Net-NTLM哈希的方法,分享了脚本编写的细节,并测试了该方法的效果。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...