# 例一:

近期做到一道 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
2
3
4
./hashcat.exe -m 5600 hash.txt passwords.txt -o out.txt --force
#hash.txt中是组成的内容,password.txt是字典(在该附件中进行分段传输,利用原始数据提取出来就好),-o参数表示将结果存储到out.txt文本当中
./hashcat.exe -m 5600 hash.txt passwords.txt --show
#如果已经爆破就使用--show展示出来

得到最终的密码 @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
2
3
4
5
6
7
1.首先客户端在本地加密当前用户的密码成hash
2.客户端向服务端发送账号,这里进行了明文传输
3.服务端确认了NTLM认证方式,并随机生成了16位的字符串作为challenge发送给了客户端
4.客户端再用生成的hash加密该challenge发送回服务端作为response
5.服务端再把用户名,challenge和response发送给域控制器
6.域控制器用这个用户名在SAM密码管理库中找到这个用户的密码散列,并同样加密challenge
7.比较两个加密后的challenge,如果相同则认证成功

接下来回看这道题目,既然是截获了通讯流量那么也就是说客户端和服务端所进行的一些通信数据都直接被截获了,根据题目要求,要找到用户的密码。根据工作流程可以知道,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
2
3
4
5
6
1.用户在用户代理中编辑邮件信息,包括发件人邮箱标题等等
2.用户代理提取用户编辑的信息,生成一封符合邮件格式标准(RFC822)的邮件
3.用户代理利用SMTP协议将邮件发送给发送端的邮件服务器
4.发送端的邮件服务器同样通过SMTP协议将邮件发送给接收端的邮件服务器
5.接收端的用户代理利用POP3协议从接收端服务器取回邮件
6.用户代理端接收邮件并解析读取

看回本题,本题并没有进行邮件收发的操作,截取的是登录邮件服务器认证过程的流量
首先是客户端对邮件服务器的 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}