# 例一:
近期做到一道 NTLM 协议的流量题,第一次进行解密,记录一下
解密该协议的流量,其实就是得到用户名的密码,需要寻找一些字段信息并用 hashcat 进行爆破
1 | username::domain:ServerChallenge:NTproofstring:modifiedntlmv2response |
先进行过滤:ntlmssp
找到 NTLMSSP_AUTH 包,得到 domain name 和 user name
追踪 NTLM response,可以得到 NTproofstring 和 modifiedntlmv2response
这里 modifiedntlmv2response 开头部分包括了 NTproofstring 的值,组成的时候需要删除重复部分
接着寻找 ServerChallenge,过滤 ntlmssp.ntlmserverchallenge
找到符合条件的包
将得到的手动组成
1 | administrator:::1166026a7745c2d0:971356880954f778c48937ad52ccae51:01010000000000005a308cd161f7d8016092111fede1fd960000000002001e004400450053004b0054004f0050002d004a0052005500510045003900360001001e004400450053004b0054004f0050002d004a0052005500510045003900360004001e004400450053004b0054004f0050002d004a0052005500510045003900360003001e004400450053004b0054004f0050002d004a00520055005100450039003600070008005a308cd161f7d80106000400020000000800300030000000000000000100000000200000a2fc8de06e3dff62c01429115953f2f8ea32e069bc69837a7b03ee0112ca689a0a0010000000000000000000000000000000000009001c0063006900660073002f003100320037002e0030002e0030002e0031000000000000000000 |
使用 hashcat 进行爆破
1 | ./hashcat.exe -m 5600 hash.txt passwords.txt -o out.txt --force |
得到最终的密码 @Aa123456789
https://github.com/gh-balthazarbratt/nocashvalue
该脚本也可以自动提取
1 | ./main.py --tshark_path /usr/bin/tshark --pcap_file NTLM.pcapng |
但是脚本提取也有些问题,最后一个字段值开头会少一位,需要自己手动加一个 0,并且 NULL 处不需要填写,手动删除
# 例二:
拿最近的 geek challenge 的一道不太一样的题目再次来进行详细说明
拿到流量包追踪一下 tcp 流,结合题目可以知道
这是内网通信的流量,并且使用了 NTLM 验证身份的方式,上网搜索了一下该验证方式的工作流程,大致为
1 | 1.首先客户端在本地加密当前用户的密码成hash |
接下来回看这道题目,既然是截获了通讯流量那么也就是说客户端和服务端所进行的一些通信数据都直接被截获了,根据题目要求,要找到用户的密码。根据工作流程可以知道,hashcat 爆破用户密码所需要的一些字段信息都能被流量所捕获到
并且通过最后一个返回包中的对话信息可以知道密码字典为 rockyou,接下来寻找到需要的字段就可以开始进行爆破了,以下为需要寻找的字段:
1 | username::domain:ServerChallenge:NTproofstring:modifiedntlmv2response |
过滤 ntlmssp.ntlmserverchallenge 能找到 challenge 字段信息
1 | jack::WIDGETLLC:2af71b5ca7246268:2d1d24572b15fe544043431c59965d30:0101000000000000040d962b02edd901e6994147d6a34af200000000020012005700490044004700450054004c004c004300010008004400430030003100040024005700690064006700650074004c004c0043002e0049006e007400650072006e0061006c0003002e0044004300300031002e005700690064006700650074004c004c0043002e0049006e007400650072006e0061006c00050024005700690064006700650074004c004c0043002e0049006e007400650072006e0061006c0007000800040d962b02edd90106000400020000000800300030000000000000000000000000300000078cdc520910762267e40488b60032835c6a37604d1e9be3ecee58802fb5f9150a001000000000000000000000000000000000000900200048005400540050002f003100390032002e003100360038002e0030002e0031000000000000000000 |
将得到的字段值拼接利用 hashcat 进行爆破
1 | ./hashcat.exe -m 5600 1.txt rockyou.txt -o out.txt --force |
在 out.txt 中得到爆破出的密码
SYC{iamjackspassword}
# 例三:
接下来用另一道题更深入地剖析一下 NTLM 协议传输字段值的组成,同样来自 geek
challenge
该题抓取了用户进行邮箱登录的 SMTP 协议流量,并选择了 NTLM 的认证方式,所以本质上的考点还是通过 NTLM 协议的流量寻找字段进行组合爆破 hash
浅浅了解一下 SMTP 通讯协议吧
该协议是一个简单的邮件传送协议,用下图来进行说明
1 | 1.用户在用户代理中编辑邮件信息,包括发件人邮箱标题等等 |
看回本题,本题并没有进行邮件收发的操作,截取的是登录邮件服务器认证过程的流量
首先是客户端对邮件服务器的 25 端口进行的三次握手
握手成功后服务端会主动向客户端发送准备就绪的信息
网易邮箱一般都形如 "220 163.com Anti-spam GT for Coremail System
(163com [20111010])";QQ 邮箱形如"220 smtp.qq.com Esmtp QQ Mail
Server";Google 邮箱形如"220 mx.google.com ESMTP
nw8sm917193igc.7"。其中 220 代表服务就绪,每一条服务就绪信息以"rn" 为结尾标示符。
接着客户端向 SMTP 服务器交代自己的身份,也就是机器名(DESKTOP-xxxxxxx)
身份认证通过后,服务器会进入等待认证状态,会主动推送所有支持的 SMTP 认证方式
接下来就是客户端进行选择认证方式进行认证
直到 235 2.7.0 Authentication successful,认证成功
数据包分析结束,看看题目,本题中该数据包清晰的显示了一整个身份校验以及认证的流程,这里可以看到客户端选择的认证方式是 NTLM,NTLM 的认证方式和 login 差不多,根据上面题目可以知道,既然是 NTLM 协议进行认证,那么密码给出的是 hash 值来进行加密和传输,因此需要构造字段值进行 hash 爆破
但是本题的 wireshark 当中并没有直接显示出各个字段的值方便确认,只显示出了原始的 base64 编码,猜测原因是之前是直接通过 NTLM 协议认证进行内网通信,而这里是登录邮件服务器选择了支持 SMTP 的 NTLM 协议认证方式,所以 wireshark 并没有解析出字段值
无妨,自己对照着数据包去解码寻找对应的数据块吧
把大小为 420 和 789 的两个数据包解码后转为 16 进制
发现在大小为 420 的数据包中,24 字节头部数据之后的 8 字节数据便是 ServerChallenge 字段
接下来解析大小为 789 的数据包获得剩余字段值
88 字节数据之后跟着的是 domainname 和 username(根据之前题目的数据包来看,domain
name 和 username 字段数据也是挨着的)
根据题目所述,username 为 jack,因此为下图的 8 字节数据
接下来间隔 client01 字段,这里有 40 字节数据
从该字段结束部分到末尾的 16 字节数据之前为 NTLMv2 Response 数据
可以知道的是 NTLMv2 Response 数据头部的 16 字节数据便是 NTProofStr 数据
到这为止已经剖析到我们爆破所需的所有数据了,整合一下
1 | jack::WidgetLLC.Internal:3e3966c8cacd29f7:ddd46fd8f78c262eae16918f66185497:010100000000000050fd26d235edd9011219408ccb8a364800000000020012005700490044004700450054004c004c0043000100100043004c00490045004e00540030003300040024005700690064006700650074004c004c0043002e0049006e007400650072006e0061006c000300360043004c00490045004e005400300033002e005700690064006700650074004c004c0043002e0049006e007400650072006e0061006c00050024005700690064006700650074004c004c0043002e0049006e007400650072006e0061006c000700080050fd26d235edd90106000400020000000800300030000000000000000000000000300000c78e803920758ec5672c36696ee163f6a4e61c8b5463c247daef8571677995a40a001000000000000000000000000000000000000900200053004d00540050002f0075006e007300700065006300690066006900650064000000000000000000 |
这里的 domain
name 不止可以通过在 NTLM 认证过程中获得,其实就是之前所说的 SMTP 通讯过程中客户端向邮件服务器发送的机器名称
这里有一个需要注意的点,domain
name 的大小写必须按照给出的大小写来填入,不能改动
接下来就是熟悉的 hash 爆破了,利用 rockyou 字典进行爆破
1 | ./hashcat.exe -m 5600 10.txt rockyou.txt -o out1.txt --force |
得到密码 jack100589barney,便是 flag
SYC{jack100589barney}