无需开启宏即可渗透:在Office文档中利用DDE执行命令
概述
最近,国外的安全研究员发现了一种在文档中使用DynamicData Exchange (DDE)协议发起渗透的方法。使用该方法可以绕过MSWord和MSExcel宏限制,不需要使用MSWord和MSExcel的漏洞就可以执行命令。腾讯反病毒实验室哈勃系统第一时间复现了该渗透方法,本文将详细介绍该渗透方法的构造过程。
背景
Windows提供了应用程序间数据传输的若干种方法。其中一种就是使用动态数据交换(DDE)协议。DDE协议是一套消息和指示的集合。通过发送消息以及共享内存实现应用程序的数据共享和交换。应用程序可以使用DDE协议实现一次性数据传输以及持续的数据交换(当新数据可用时,应用程序发送更新通知给另一个应用程序)[1]。
在MSWord和MSExcel里,可以使用DDE来执行命令。下面我们以MSWord为例进行说明。
方法
新建一个Word文档,通过Ctrl+F9添加一个域,然后修改域代码为:
{ DDEAUTOc:\windows\system32\cmd.exe "/k notepad.exe" }
“DDEAUTO”关键字指示Word这是一个DDE域,并且在打开文档时自动执行域代码。在域代码中,紧跟“DDEAUTO”关键字后面的是要执行的可执行程序的路径,后面跟随的是可执行程序的参数。
此外,也可以修改关键字“DDEAUTO”为“DDE”,即修改域代码为:
{ DDEc:\windows\system32\cmd.exe "/k notepad.exe" }
,并保存文档。
而此时,如果希望嵌入的DDE能够在打开文档时自动执行,需要在word/settings.xml嵌入以下代码:
<w:updateFieldsw:val="true"/>
此时,当我们打开包含DDE域代码的文档时,会有显示两次提示信息:
当均点击“是”,会执行DDE域代码,弹出记事本:
上述两个对话框风险提示属性较弱,不像是一个安全风险的提示,用户很容易忽视该类提示进而允许执行恶意的域代码。当然,也可以在正文中加入一些诱导性和迷惑性很强的文字,诱导用户点击以上两个对话框,从而使用户暴露在风险之中。
扩展
除了弹出记事本外,配合PowerShell或者各类脚本程序的强大能力,可以下载或者释放恶意payload,此类渗透方法的危害将显现无疑。
(执行PowerShell)
(执行bat脚本)
- 3892: [Usaco2014 Dec]Marathon
- BZOJ 2793: [Poi2012]Vouchers(调和级数)
- 3891: [Usaco2014 Dec]Piggy Back
- Java8-如何构建一个Stream
- 2016: [Usaco2010]Chocolate Eating
- javascript 闭包详解
- 3016: [Usaco2012 Nov]Clumsy Cows
- POJ 3207 Ikki's Story IV - Panda's Trick(2-SAT)
- 3359: [Usaco2004 Jan]矩形
- 漫谈Java IO之 Netty与NIO服务器
- Java线程的几种状态
- POJ3683 Priest John's Busiest Day(2-SAT)
- javascript 面向对象(实现继承的几种方式)
- Base64 的 JavaScript 实现 js-base64
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何更改Dialog的标题与按钮颜色详解
- Android编程之数据库的创建方法详解
- android studio集成ijkplayer的示例代码
- Android开发实现浏览器全屏显示功能
- Android动态人脸检测的示例代码(脸数可调)
- Android抽奖轮盘的制作方法
- Android 获取屏幕的多种宽高信息的示例代码
- Android编程实现禁止StatusBar下拉的方法
- Android自定义view圆并随手指移动
- Android仿微信发送语音消息的功能及示例代码
- 详解Android studio ndk配置cmake开发native C
- Android编程实现禁止状态栏下拉的方法详解
- Android进度条ProgressBar的实现代码
- Android画画板的制作方法
- Android实现bitmap指定区域滑动截取功能