DotNetNuke任意代码执行漏洞(CVE–2017–9822)分析预警
2017-08-02 20:44

enter image description here

0x00 背景介绍

0x01 漏洞概述

0x02 漏洞攻击面影响

1. 影响面
2. 影响版本
3. 修复版本

0x03 漏洞详情

1. 漏洞代码

0x04攻击利用分析

1. XmlSerializer的使用
2. 利用链的构造
3. Payload生成

0x05 漏洞利用验证

0x06 修复建议

0x07 时间线

0x08 参考文档

0x00 背景介绍

DNN uses web cookies to identify users. A malicious user can decode one of such cookies and identify who that user is, and possibly impersonate other users and even upload malicious code to the server

--DNN security-center

2017年7月5日,DNN安全板块发布了一个编号CVE-2017-9822的严重漏洞,随后漏洞报告者Alvaro Muñoz (@pwntester)和Oleksandr Mirosh在BlackHat USA 2017上披露了其中的一些细节。360CERT跟进分析了该漏洞及其在.net中使用XmlSerializer进行序列化/反序列化的攻击利用场景,确认为严重漏洞。

0x01 漏洞概述

DNNPersonalization是一个在DNN中是用于存放未登录用户的个人数据的Cookie,该Cookie可以被攻击者修改从而实现对服务器任意文件上传,远程代码执行等攻击。

0x02 漏洞攻击面影响

1. 影响面

漏洞等级: 严重

据称,全球有超过75万的用户在使用DNN来搭建他们的网站,影响范围大。

2. 影响版本

从5.0.0到9.1.0的所有版本

3. 修复版本

DNN Platform 9.1.1和EVOQ 9.1.1

0x03 漏洞详情

1. 漏洞代码

PersonalizationController.cs 66-72行:

enter image description here

从Cookie中获取到DNNPersonalization的值后再传给Globals中的DeserializeHashTableXml方法。

Globals.cs 3687-3690行:

enter image description here

再跟进XmlUtils中的DeSerializeHashtable方法。

XmlUtils.cs 184-218行:

enter image description here

该方法会使用item元素中的type属性值来设置类型,并且会在208行这里将该元素的内容进行反序列化,这里便是漏洞的触发点了。漏洞代码中从可控输入点到最终可利用处的这个过程还是比较直观的,接下来是针对像这样使用了XmlSerializer来反序列化的漏洞点进行攻击利用分析。

0x04攻击利用分析

1. XmlSerializer的使用

enter image description here

在对一个类进行序列化或者反序列化的时候都需要传入该类的类型信息。看下生成的序列化数据形式:

enter image description here

就是一个XML文档,类名和成员变量都是元素来表示。

2. 利用链的构造

修改下上面的TestClass类,对其中的成员变量test进行封装。

enter image description here

这时候再去观察代码在反序列化时的输出,可以明显知道setter被自动调用了,因此setter便可以作为利用链的第一步。接下来就是要去找一些可以被用作攻击使用的类了。

System.Windows.Data.ObjectDataProvider可以调用任意在运行时被引用的类的任意方法。一个例子:

enter image description here

相当于调用了TestClass.FuncExample(“JustATest!”),ObjectDataProvider中的成员变量都进行了封装的,并且每次调用了setter后都会检测参数是否足够,足够了的话便会自动去调用传入的方法。其中的过程借用BlackHat议题中的一张图来展示。

enter image description here

如此一来要是被序列化的是一个ObjectDataProvider类,那么在反序列的时候便可以做到任意方法调用的效果。再找一个存在能达到想要的利用效果的方法的类就行了,例如DNN中的就存在一个可以做到任意文件上传效果的类,DotNetNuke.Common.Utilities.FileSystemUtils中的PullFile方法:

enter image description here

3. Payload生成

要生成payload还有一点问题需要解决,就是ObjectDataProvider包含一个System.Object成员变量(objectInstance),执行的时候XmlSerializer不知道这个变量具体的类型,导致没法序列化。但是这个问题可以通过使用ExpandedWrapper扩展属性的类型来解决。

enter image description here

生成的内容如下:

enter image description here

DNN是通过获取item的属性type的值,然后调用Type.GetType来得到序列化数据的类型再进行反序列化。这样的话需要加上相应的程序集的名称才行,可以通过下面的代码得到type的值:

enter image description here

enter image description here

结合DNN的代码生成最终的Payload:

enter image description here

0x05 漏洞利用验证

将漏洞触发点所在DeSerializeHashtable函数放到本地来做一个漏洞利用验证。

enter image description here

再看服务器端,可以看到漏洞利用成功。

enter image description here

0x06 修复建议

360CERT建议升级到最新的版本DNN Platform 9.1.1或者EVOQ 9.1.1。

0x07 时间线

2017-7-5 官方发布安全公告并提供修复更新

2017-8-2 360CERT完成对漏洞的分析并形成报告

0x08 参考文档

https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf