【漏洞分析】DotNetNuke 任意代码执行漏洞(CVE-2017-9822)分析预警

https://p4.ssl.qhimg.com/t0126c6f1a38e3663ec.png

作者:k1n9 & RickyHao@360CERT

 

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 行:

http://p3.qhimg.com/t012bfd014f3f18a15f.png

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

Globals.cs 3687-3690 行:

http://p9.qhimg.com/t01d21f0307ab08b918.png

再跟进 XmlUtils 中的 DeSerializeHashtable 方法。

XmlUtils.cs 184-218 行:

http://p3.qhimg.com/t017b4dd36b2b64ffce.png

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

 

0x04 攻击利用分析

 

1. XmlSerializer 的使用

http://p2.qhimg.com/t012deef6e6860207f5.png

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

http://p0.qhimg.com/t018cd8b85665ea0448.png

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

2. 利用链的构造

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

http://p4.qhimg.com/t01799832604d0614ea.png

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

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

http://p1.qhimg.com/t019c7d162358488ab6.png

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

http://p1.qhimg.com/t01de490cb1d3d6edd8.png

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

DotNetNuke.Common.Utilities.FileSystemUtils 中的 PullFile 方法:

http://p0.qhimg.com/t01dfeae7671727a590.png

3. Payload 生成

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

http://p3.qhimg.com/t01064f8c676d962636.png

生成的内容如下:

http://p3.qhimg.com/t016e9d00a2d3c647de.png

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

http://p9.qhimg.com/t017aadf32d8ed5c13c.png

http://p9.qhimg.com/t019114b1de955f31b0.png

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

http://p3.qhimg.com/t016deccbed7bbc8518.png

0x05 漏洞利用验证

 

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

http://p1.qhimg.com/t011e3109545e360cc6.png

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

https://p0.ssl.qhimg.com/t01e0b95a91ff871c78.png

 

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-Frida y-The-13th-Json-Attacks.pdf

(完)