CVE-2018-1273(Spring Data Commons)
远程命令执行漏洞
漏洞描述:
Spring Data Commons(1.13至1.13.10之前的版本,2.0至2.0.5的版本以及较旧的不受支持的版本)包含由于特殊元素的不正确中和而导致的属性绑定器漏洞。未经身份验证的远程恶意用户(或攻击者)可以针对Spring Data REST支持的HTTP资源提供特制的请求参数,或者使用Spring Data的基于投影的请求有效负载绑定可能导致远程执行代码攻击。总结来说这是一个spel表达式注入漏洞。
影响范围
漏洞级别
高危
漏洞原理:
造成漏洞的代码, 代码位于org,springframework.data.web.MapDataBinder类中:
propertyName是攻击者可以控制的变量,但是代码中将它直接用来生成Expression。在使用之前我们发现有一段代码进行propertyName的有效性校验,它用来判断实体类的propertyName属性是否可写。这个isWritableProperty函数的分析,我们发现这里存在一个逻辑问题,这个函数会造成propertyName如果是name和name[huangjacky]返回一个东西。而且通过StandardEvaluationContext权限过大,可以执行任意代码,会被恶意用户利用。
补丁分析:
补丁大致就是将StandardEvaluationContext替代为SimpleEvaluationContext,由于StandardEvaluationContext权限过大,可以执行任意代码,会被恶意用户利用。
SimpleEvaluationContext的权限则小的多,只支持一些map结构,通用的jang.lang.Runtime,java.lang.ProcessBuilder都已经不再支持,
,
Payload:
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("calc.exe")]=chybeta&password=chybeta&repeatedPassword=chybeta
或
username[#this.getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("js").eval("java.lang.Runtime.getRuntime().exec('xterm')")]=asdf
漏洞复现日志:
虚拟机换源:(更换为清华源)
https://blog.csdn.net/u012308586/article/details/102953882
Docker环境安装
https://blog.csdn.net/wang_624/article/details/100576896
安装docker:
curl -s https://get.docker.com/ | sh
安装docker-compose:
将当前用户加入docker用户组:
sudo gpasswd -a ${USER} docker
切为root再切换回来
启动docker服务:
docker默认镜像拉取地址为国外仓库下载速度较慢,则会报错“net/http: TLS handshake timeout",建议设置registry mirrors为国内的服务器地址:
vi /etc/docker/daemon.json
{
"registry-mirrors": [ "https://pee6w651.mirror.aliyuncs.com"]
}
最后 重启即可
systemctl daemon-reload
systemctl restart docker
复现spring-cve-2018-1273
拉取镜像:
查看已创建的镜像:
说明创建成功。
镜像拉取成功后访问:http://127.0.0.1:8080/users
会看到一个用户注册界面
安装burpsuite:
官网下载地址:https://portswigger.net/burp/releases/professional-community-2020-7?requestededition=community
教程:https://zhuanlan.zhihu.com/p/115648535
安装wireshark:
sudo apt-get install wireshark
使用bp内置的浏览器打开访问127.0.0.1/user并抓包
改包如下:
服务端回复:
执行`docker-compose exec spring bash`进入容器中,可见成功创建`/tmp/success`文件,说明命令执行成功:
使用wireshark抓的包内容如下:
编写IDS规则并验证
安装suricata: https://linux.cn/article-6985-1.html
IDS规则:
alert http any any -> any any
(msg:"SpringDataCommons Remotecode execution vulnerability Vulnerabilities-CVE-2018-1273"; flow:established,to_server;
content:"POST"; http_method;
content:"this.getClass().forName";http_client_body;
content:"java.lang.Runtime";distance:0;http_client_body;
pcre:"/getRuntime\(\)\.exec\(".*"\)/Pi";
reference:url, https://mp.weixin.qq.com/s?__biz=MzU0NzYzMzU0Mw==&mid=2247483666&idx=1&sn=91e3b2aab354c55e0677895c02fb068c; reference:cve,2018-1273;
classtype:remote code execution;
metadata:created_at 2020_07_21, updated_at 2020_07_21;
rev:1;
sid:00001;)
规则验证:
运行suricata: sudo suricata -k none -r '/home/mariner/pcap/07.09-1.pcapng' -c '/home/mariner/suricata-5.0.3/suricata.yaml' -v -v -v
有2条报警说明规则编写成功
处置方式
解决此问题的版本包括:-Spring Data REST 2.6.11(Ingalls SR11)-Spring Data REST 3.0.6(Kay SR6)-Spring Boot 1.5.11 -Spring Boot 2.0.1