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

发布于 2024-11-21 19:41:21 字数 5834 浏览 4 评论 0

0x00 前言

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

0x01 简介

本文将要介绍以下内容:

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

0x02 Net-NTLM 认证过程

参考资料:https://www.innovation.ch/personal/ronald/ntlm.html

依然使用这幅图,如下图

Alt text

注:图片截取自 https://www.innovation.ch/personal/ronald/ntlm.html

0x03 利用 PHP 脚本模拟认证过程

想要通过 PHP 脚本模拟 Net-NTLM 认证过程,主要考虑的是 Server 端的实现

1、发送 WWW-Authenticate: NTLM

接收 Client 的 GET 请求,回复 401 Unauthorized WWW-Authenticate: NTLM ,提示 Client 需要 NTLM 认证

2、发送 WWW-Authenticate: NTLM <base64-encoded type-2-message>

接收 Client 的 Type-1-Message ,回复 Type-2-message

The Type 2 Message 的结构如下:

OffsetDescriptionContent
0NTLMSSP SignatureNull-terminated ASCII "NTLMSSP" (0x4e544c4d53535000)
8NTLM Message Typelong (0x02000000)
12Target Namesecurity buffer
20Flagslong
24Challenge8 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

值得注意的参数为 FlagsChallenge

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

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

Alt text

对应的数据格式如下图

Alt text

3、解析 Type-3-message

Type-3-message 包含 Client 加密后的 Net-NTLM hash 消息,提取出对应格式的数据可用于破解

Type-3-message 示例如下图

Alt text

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

short   Length;
short   Maxlen;
short   Offset;

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

4、发送网页内容

Server 向 Client 提供最终的请求内容

0x04 脚本编写细节

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

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

..//Writeup/master/catchyournetntlm.php

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

做了以下优化:

1、不再局限于 apache module

原脚本只能在 apache 下使用

2、提取 Net-NTLM hash

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

新脚本添加了文件格式解析的功能,提取出 HMAC-MD5blob

脚本细节:

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

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

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

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

而在提取 HMAC-MD5blob 时,需要保留 0x00 ,所以我们要传入参数 false,不对字符 0x00 进行过滤

具体的代码为:

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

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

0x05 实际测试

1、本地测试

Server:

安装 apache 环境

简单的配置方法: 安装 phpstudy

上传脚本 catchyournetntlm.php

Client:

修改 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

注:域环境下不需要这个设置

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

Client 显示如下图

Alt text

数据可直接用于 hashcat 的破解

2、在线测试

https://evi1cg.me/test.php

服务器使用 nginx,未使用 apache

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

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

Alt text

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

Alt text

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

Alt text

0x06 小结

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

如歌彻婉言

暂无简介

文章
评论
26 人气
更多

推荐作者

迎风吟唱

文章 0 评论 0

qq_hXErI

文章 0 评论 0

茶底世界

文章 0 评论 0

捎一片雪花

文章 0 评论 0

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文