ماشین DevHub بر پایه سرورهای MCP (پروتکلی که عاملهای AI برای دسترسی به ابزارها استفاده میکنند) طراحی شده است. در این سناریو، یک سرویس MCPJam Inspector روی تمامی اینترفیسها در حال اجراست که دارای یک اندپوینت بدون احراز هویت (Unauthenticated Endpoint) است. این نقطه ضعف اجازه میدهد تا با ارسال دستورات دلخواه، یک پروسه اجرا شده و منجر به اجرای کد از راه دور (RCE) و دریافت Shell شود.
مراحل شناسایی و بررسی اولیه
اسکن اولیه با ابزار nmap سه پورت TCP باز را نشان میدهد: SSH (22) و دو پورت HTTP (80 و 6274). بر اساس نسخههای OpenSSH و Nginx، سیستمعامل احتمالاً Ubuntu 22.04 Jammy است. مقدار TTL برابر با 63 نیز این فرضیه را که هدف یک سیستم لینوکسی در فاصله یک Hop است، تأیید میکند.
در پورت 80، یک Redirect به دامنه devhub.htb مشاهده میشود. پس از بهروزرسانی فایل hosts و بررسی مجدد، پورت 6274 به سرویس MCPJam اشاره دارد. صفحه وب این سرویس، پورتال داخلی تیم DevHub است که به سه سرویس مختلف اشاره میکند: MCP Inspector (روی پورت 6274)، یک سرویس مبتنی بر Jupyter (روی پورت 8888) و احتمالاً یک سرور Git.
بهرهبرداری از آسیبپذیری RCE
با بررسی نسخه MCPJam (نسخه 1.4.2)، آسیبپذیری CVE-2026-23744 شناسایی شد. این آسیبپذیری از نوع Remote Code Execution (RCE) است و به دلیل اینکه MCPJam Inspector بهصورت پیشفرض روی 0.0.0.0 گوش میدهد (به جای 127.0.0.1)، مهاجم میتواند از راه دور یک درخواست HTTP دستکاری شده به اندپوینت /api/mcp/connect ارسال کند تا یک سرور MCP را نصب کرده و دستورات دلخواه را اجرا کند.
با ارسال یک Payload مناسب به این اندپوینت، ابتدا با دستور ping اتصال تأیید شد و سپس با استفاده از یک Bash Reverse Shell، دسترسی اولیه به سیستم با کاربر mcpjam به دست آمد.
جابهجایی (Pivot) و ارتقای سطح دسترسی
پس از بررسی سیستم، مشخص شد که یک نمونه Jupyter Lab روی localhost:8888 در حال اجراست. با بررسی فایل سرویس در مسیر /etc/systemd/system/jupyter.service و لیست پروسهها، توکن دسترسی (Access Token) استخراج شد. با ایجاد یک SSH Tunnel روی پورت 8888، دسترسی به محیط Jupyter Lab فراهم شد. از طریق بخش Terminal در Jupyter، دسترسی به کاربر analyst به دست آمد.
در دایرکتوری خانگی کاربر analyst، فایلی به نام .opsmcp_key یافت شد. همچنین بررسی فایل /opt/opsmcp/server.py نشان داد که یک اپلیکیشن Flask برای شبیهسازی سرور MCP در حال اجراست که توسط کاربر root مدیریت میشود.
استخراج کلید Root و نفوذ نهایی
بررسی سورس کد سرور MCP نشان داد که این سرویس دارای ابزارهای مستند نشدهای است. تابع call_tool درخواستها را بررسی کرده و ابزاری به نام ops._admin_dump وجود دارد که میتواند فایل id_rsa کاربر root را بخواند و بازگرداند.
با ارسال یک درخواست POST به این ابزار و تنظیم پارامتر target روی ssh_keys، کلید خصوصی SSH کاربر root استخراج شد. در نهایت با استفاده از این کلید، دسترسی کامل به سیستم (Root Access) برقرار گردید.