Taking over a password-protected & FDE enabled OVF for fun and profit

 ۰- مقدمه

در دنیای مدیریت سیستم‌های لینوکسی، ریست کردن پسورد در شرایطی که دسترسی به سیستم به دلایلی محدود شده، چالشی متداول است. این مشکل به‌ویژه زمانی بحرانی می‌شود که روش‌های معمول برای بازیابی پسورد مثل Rescue Mode یا ویرایش پارامترهای بوت به دلیل نیاز به پسورد غیرقابل دسترسی باشند. چنین محدودیت‌هایی می‌توانند سیستم را برای مدیران و کاربران قفل کرده و دسترسی به آن را سخت‌تر از همیشه کنند.

در این پست به سراغ این چالش میرویم و کلمه عبور یک سیستم لینوکسی را بازیابی میکنیم.

 ۱- تعریف مسئله

تصور کنید شما مسئول بخش فناوری اطلاعات یک شرکت هستید و وظیفه مدیریت و پشتیبانی از چندین سرور مجازی را دارید. یکی از این سرورها که روی یک سیستم لینوکسی اجرا می‌شود، به دلیل فراموش شدن رمز عبور قابل دسترسی نیست. این سرور وظایف مهمی مانند مدیریت دیتابیس‌های شرکت یا سرویس‌دهی به مشتریان را بر عهده دارد، و دسترسی سریع به آن برای جلوگیری از هرگونه اختلال در کار شرکت ضروری است.

اما مشکل اینجاست که روش‌های متداول برای ریست کردن پسورد سیستم لینوکسی، مانند استفاده از حالت rescue mode یا ویرایش پارامترهای بوت، به دلایلی مسدود شده‌اند و نیاز به پسورد دارند.
این سناریو می‌تواند برای بسیاری از متخصصین IT اتفاق بیفتد: 
  • مسئول قبلی سیستم ممکن است بدون به‌روز کردن مستندات امنیتی شرکت را ترک کرده باشد.
  • بعد از یک به‌روزرسانی سیستم یا تغییرات پیکربندی، اطلاعات دسترسی به سیستم حذف یا خراب شده باشد.
در بخش بعدی به بررسی روشهای متداول بازیابی رمز عبور یک سیستم لینوکسی میپردازیم.

 ۲- روشهای متداول بازیابی رمز عبور یک سیستم لینوکسی

 یکی از روشهای متداول بازیابی پسورد یک سیستم عامل لینوکسی استفاده از حالت Recovery سیستم عامل است. در این روش با استفاده از حالت Recovery، به عنوان کاربر root وارد سیستم هدف میشویم و پسورد کاربری مورد نظر خود را تغییر میدهیم. برای نمایش این روش، از حالت Recovery Mode سیستم عامل Ubuntu استفاده کرده و شروع به بازیابی رمزعبور کاربری خود می‌کنیم.
در برخی مواقع، ممکن است سیستم عامل بوت شده گزینه ای همانند Recovery/Rescue نداشته باشد. به عنوان مثال در Cisco Unified Communications Manager که از این پس آن را CUCM میخوانیم، یک Appliance از شرکت سیسکو است و امکان دسترسی Shell به سیستم به صورت پیش‌فرض وجود ندارد. در این حالت ما نیاز به یک ISO از یک سیستم عامل لینوکسی داریم که بتوانیم مشکل خود را برطرف کنیم. توجه داشته باشید که در مورد CUCM، هدف روشن کردن SSH و فعال کردن کاربر root برای گرفتن دسترسی به سیستم است.
 در ادامه به توضیح دو روش ذکر شده می‌پردازیم.

۱-۲- بازیابی رمزعبور سیستم عامل Ubuntu با روش Recovery Mode

اگر سیستم شما به هر دلیلی بوت نشد، ممکن است مفید باشد که آن را در حالت بازیابی راه اندازی کنید. این حالت فقط برخی از خدمات اولیه را بارگیری می کند و شما را به حالت خط فرمان می برد. سپس به عنوان root
وارد سیستم می‌شوید و می‌توانید سیستم خود را با استفاده از ابزارهای خط فرمان تعمیر کنید [1].
 
تصویر ۱: منوی GRUB
 
برای انجام این کار قبل از بوت شدن سیستم عامل (قبل از به نمایش درآمدن لوگوی Ubuntu) دست خود را روی کلید SHIFT نگه می‌داریم. با این کار ما وارد منوی GRUB می‌شویم.
پس از نمایان شدن منوی GRUB، مراحل زیر را دنبال می‌کنیم:
  • بر روی Advanced options کلیک می‌کنیم.
  •  در منوی نمایان شده، بر روی گزینه دارای متن recovery mode کلید Enter را می‌فشاریم.
تصویر ۲: منوی Advanced options
  • با انجام عمل بالا، سیستم شما Restart شده و وارد منوی Recovery می‌شویم. تصویر Recovery Menu را در زیر مشاهده می‌کنیم:
تصویر ۳: منوی Recovery
  • در منوی Recovery، با استفاده از کلیدهای جهت بر روی کیبورد، به سوی گزینه Drop to root shell prompt می‌رویم و کلید Enter را می‌فشاریم. در نتیجه این کار همان‌طور که در تصویر زیر مشاهده می‌کنیم، با موفقیت به عنوان کاربر root وارد سیستم عامل می‌شویم.
تصویر ۴: وارد شده به سیستم به عنوان کاربر root
  • طبق داکیومنت Ubuntu، پارتیشن root در این حالت به صورت Read Only قابل دسترسی است و باید با اجرای دستور زیر، آن را دوباره و با دسترسی Read/Write نصب کنیم (mount).
mount -o remount,rw /
  • اما در تجربه من، پارتیشن root بدون نیاز به اجرای دستور بالا و به صورت پیش فرض به حالت Read/Write نصب شده بود (mount):
تصویر ۵: root partition
  • در این محیط می‌توانیم مشکل خود را برطرف کرده و با دستور passwd کلمه عبور کاربر root (و یا هر کاربر دیگری) را تغییر دهیم.
تصویر ۶: تغییر کلمه عبور کاربر root

۲-۲- گرفتن دسترسی root در CUCM

 هنگامی که این Appliance را نصب می‌کنیم، به صورت پیش‌فرض دسترسی به محیط سیستم عامل نداریم و تنها به یک رابط کاربری Custom شرکت Cisco دسترسی داریم.
 
تصویر ۷: رابط کاربری پیش فرض CUCM

قبل از شروع باید به ۲ نکته توجه کنیم:
  • برای شروع به فایل ISO یک سیستم عامل لینوکسی نیاز داریم. در این جا من از ISO سیستم عامل Arch استفاده می‌کنم که از این لینک قابل دانلود است.
  • شما باید دسترسی به CD/DVD سیستم CUCM داشته باشید. در این آموزش CUCM مورد نظر توسط VMware نصب شده است و ما می‌توانیم از CD/DVD مجازی آن استفاده کنیم.
 حال برای گرفتن دسترسی به سیستم CUCM، همانند زیر عمل می‌کنیم:
  • فایل ISO دانلود شده را در CD/DVD ماشین مجازی CUCM قرار می‌دهیم. برای این منظور بر روی ماشین مجازی CUCM راست کلیک کرده و بر روی Settings کلیک می‌کنیم. بر روی منوی CD/DVD رفته و مسیر فایل ISO را از سیستم خود انتخاب می‌کنیم.
    • توجه داشته باشید که تیک گزینه Connect at power on زده شده باشد.
تصویر ۸: اضافه کردن ISO به ماشین CUCM
  • حال دوباره بر روی ماشین مجازی CUCM راست کلیک کرده و از منوی Power، گزینه آخر یعنی Power On to Firmware را انتخاب می‌کنیم. با انتخاب این گزینه وارد منوی BIOS سیستم می‌شویم.
  • حال با استفاده از جهت چپ و راست بر روی کیبورد، به سمت منوی Boot رفته و بر روی ورودی CD-ROM Drive کلید + را فشار می‌دهیم تا جایی که ورودی CD-ROM به گزینه اول Boot تبدیل شود.
تصویر ۹: منوی BIOS در VMware
  • حال با زدن کلید F10 تغییرات را ذخیره و از BIOS خارج می‌شویم. با انجام این کار، سیستم Restart شده و سیستم عامل Arch بوت میشود.
تصویر ۱۰: منوی بوت Arch Linux
  • پس از وارد شدن به محیط ترمینال سیستن عامل Arch، از دستور fdisk یا lsblk برای پیدا کردن root پارتیشن CUCM که فایل های سیستم در آن قرار دارند استفاده می‌کنیم. این پارتیشن معمولاً در مسیر های زیر وجود دارد:
  • /dev/sda
  • /dev/sdb
تصویر ۱۱: نمایش پارتیشنهای سیستم
  • پس از پیدا کردن پارتیشن root، یک Directory برای mount کردن پارتیشن ایجاد می‌کنیم و سپس پارتیشن root را در این مسیر mount می‌کنیم.
تصویر ۱۲: متصل کردن پارتیشن CUCM
  • حال با دستور arch-chroot /mnt/cucm می‌توانیم وارد پارتیشن root سیستم عامل شویم.
تصویر ۱۳: انجام عملیات chroot به فایل سیستم CUCM

chroot عملیاتی است که مسیر جدیدی را به عنوان مسیر root برای فرایند فعلی و فرایندهای فرزند آن تنظیم می
‌کند. برنامه‌ای که در این محیط اجرا می‌شود نمی‌تواند به فایل‌ها و مسیرهای خارج از مسیر معرفی شده به عنوان root دسترسی پیدا کند. به این فضای جدید chroot jail گفته می‌شود. [8] [9]
محیط chroot برای عملکرد صحیح به یک سیستم فایل کامل نیاز دارد. مسیرهای اساسی مانند/lib، /bin، /usr، و همچنین کتابخانه و باینری‌های مورد نیاز دستورات نیز باید موجود باشند. 
تابع chroot برای اهداف امنیتی، ایزوله کردن کامل یک فرآیند و یا برای محدود کردن فراخوانی‌های سیستم فایل نباید مورد استفاده قرارگیرد.
برای داشتن یک محیط chroot در لینوکس، فایل سیستم های فایل مجازی هسته و فایل های پیکربندی نیز باید از میزبان به chroot سوار (mount) یا کپی شوند. [10]
# Mount Kernel Virtual File Systems
TARGETDIR="/mnt/chroot"
mount -t proc proc $TARGETDIR/proc
mount -t sysfs sysfs $TARGETDIR/sys
mount -t devtmpfs devtmpfs $TARGETDIR/dev
mount -t tmpfs tmpfs $TARGETDIR/dev/shm
mount -t devpts devpts $TARGETDIR/dev/pts

# Copy /etc/hosts
/bin/cp -f /etc/hosts $TARGETDIR/etc/

# Copy /etc/resolv.conf 
/bin/cp -f /etc/resolv.conf $TARGETDIR/etc/resolv.conf

# Link /etc/mtab
chroot $TARGETDIR rm /etc/mtab 2> /dev/null 
chroot $TARGETDIR ln -s /proc/mounts /etc/mtab
برای اطلاعات بیشتر درباره chroot به لینکهای [8]، [9]، [10] و [11] (پیشنهادی) مراجعه کنید.
  • حالا که به پارتیشن root دسترسی پیدا کرده‌ایم، می‌توانیم کلمه عبور کاربر root را تغییر دهیم و یک Shell برای کاربر root تنظیم کنیم چرا که به صورت پیش‌فرض هیچ نوع Shellای برای کاربر root تنظیم نشده است.
  • برای تعویض کلمه عبور کافیست دستور passwd root را وارد کرده و کلمه عبور مورد نظر خود رابرای کاربر root تنظیم کنیم.
تصویر ۱۴: تغییر پسورد کاربر root
  • برای تنظیم یک Shell برای کاربر root، فایل passwd را به شکل زیر تغییر میدهیم:
vim /etc/passwd
  • در این فایل، عبارت زیر را در اولین خط پیدا می‌کنیم و عبارت sbin/nologin را به bin/bash تغییر میدهیم و تغییرات را ذخیره می‌کنیم.
تصویر ۱۵: متن پیش‌فرض

تصویر ۱۶: متن تغییر داده شده
  • حال باید اجازه وارد شدن کاربر root از طریق ارتباط SSH را صادر کنیم. برای این منظور دستور زیر را وارد می‌کنیم:
vim /etc/ssh/sshd_config
  • سپس خط PermitRootLogin را پیدا می‌کنیم و عبارت مقابل آن را از no به yes تغییر می‌دهیم و سپس تغییرات را ذخیره می‌کنیم.
تصویر ۱۷: متن پیش‌فرض
تصویر ۱۸: متن تغییر داده شده


  • در ادامه باید مقدار Selinux را از حالت enforcing به permissive تغییر دهیم. برای این کار با استفاده از ابزار ویرایش متن vim فایل موجود در مسیر etc/selinux/config را باز می‌کنیم و مقدار عبارت مقابل Selinux را از enforcing به permissive تغییر می‌دهیم.
تصویر ۱۹: قبل از اعمال تغییرات
تصویر ۲۰: بعد از اعمال تغییرات

حال با در دست داشتن کلمه عبور کاربر root می‌توانیم از طریق ارتباط SSH به سیستم CUCM دسترسی پیدا کنیم:

تصویر ۲۱: ورود موفق به سیستم به عنوان کاربر root

۳-۲- بازیابی کلمه عبور با استفاده از GRUB Parameters

در این روش، ما با ویرایش پارامترهای GRUB می‌توانیم بدون داشتن پسورد به سیستم وارد شویم.در این قسمت برای نمایش این روش، از سیستم عامل Ubuntu استفاده می‌کنیم. توجه داشته باشید که این روش بر روی تمام سیستم های لینوکسی قابل انجام است.

برای بازیابی کلمه عبور به وسیله تغییر پارامترهای GRUB، همانند زیر عمل میکنیم:

  • هنگام بوت شدن سیستم، قبل از لود شدن OS دست خود را بر روی کلید SHIFT نگه می‌داریم تا وارد صفحه GRUB شویم.
تصویر ۲۲: Guess what? It's GRUB Menu Again
  • بر روی گزینه Ubuntu رفته و کلید e را می‌فشاریم. با استفاده از این کلید می‌توانیم دستورات و پارامترهای قبل از بوت شدن سیستم عامل را تغییر دهیم.
GRUB Command Line Editor تصویر ۲۳: منوی

  • در صفحه باز شده، با استفاده از کلیدهای جهت بر روی کیبورد به دنبال خطی می‌گردیم که با عبارت linux شروع می‌شود:
تصویر ۲۴: خط مورد نظر
  • این خط مسئول بارگیری کرنل لینوکس و ارسال پارامترهای مختلف به آن است که به توضیح مقادیر هر یک از آنها می‌پردازیم:
    • linux: این دستور به GRUB می گوید که کرنل لینوکس را از مسیر boot/vmlinuz...-generic بارگذاری کند.
    • root=UUID: این پارامتر سیستم فایل root را مشخص می‌کند، جایی که فایل‌های سیستم عامل در آن ذخیره می‌شوند. پارامتر root مسیر پارتیشن روت را به کرنل معرفی می‌کند.
    • quiet: این گزینه میزان نمایش خروجی کرنل در هنگام بوت را کاهش می‌دهد.
    • ro: این پارامتر به این معنی است که پارتیشن root به صورت فقط خواندنی بارگذاری شود.
    • splash: این گزینه نمایش یک صفحه نمایش splash را در حین بوت به جای پیام‌های بوت متنی فعال می‌کند. Splash Screen یک تصویر گرافیکی یا انیمیشنی است که هنگام بوت شدن سیستم نشان داده می‌شود و خروجی متن را مخفی می‌کند تا فرآیند بوت ساده‌تر و کاربرپسندتر به نظر برسد. 
    • برای اطلاعات بیشتر درباره این پارامترها می‌توانید به لینک [2] مراجعه کنید.
با بررسی پارامترهای دیگر کرنل، به پارامتر init می‌رسیم [2]:
init= [KNL]
      Format: <full_path>
      Run specified binary instead of /sbin/init as init process.
 با استفاده از پارامتر init می‌توانیم مسیر یک فایل باینری دیگری را برای اجرا به جای فرایند init به کرنل ارسال کنیم. فرایند init اولین فرایندی است که در سیستم و توسط کرنل اجرا می‌شود و مسئول بارگذاری و شروع دیگر فرایندها در سیستم است.
  • با توجه به توضیحات داده شده، ما می‌توانیم با اضافه کردن عبارت زیر به انتهای خط linux، بدون نیاز به پسورد و به عنوان کاربر root وارد سیستم شویم:

quiet rw init=/bin/bash

  • پس از ویرایش پارامترهای کرنل، با استفاده از کلید CTRL + X سیستم را بوت می‌کنیم.
تصویر ۲۵: پارامترهای ویرایش شده کرنل
  • همان‌طور که در تصویر زیر مشاهده می‌کنید، بدون نیاز به داشتن کلمه عبور، به دسترسی root سیستم دست یافتیم و توانستیم کلمه عبور کاربر root را تغییر دهیم.‌
تصویر ۲۶: ورود موفق به سیستم

در بخش‌های قبلی، روش‌های متداول بازیابی کلمه عبور سیستم‌های لینوکسی و همچنین روشی برای دسترسی به Shell در CUCM را بررسی کردیم. اکنون به سراغ سناریویی می‌رویم که در آن، ویرایش پارامترهای کرنل یا ورود به حالت Rescue Mode نیازمند کلمه عبور است.

۳- یک سناریو خاص

در یکی از پروژه‌ها، یک فایل OVF برای بررسی به من تحویل داده شد. پس از ارزیابی روش‌های معمول، مشخص شد که به دلیل وجود کلمه عبور، امکان ویرایش پارامترهای کرنل و ورود به حالت Rescue Mode فراهم نیست.
 
تصویر ۲۷: وجود پسورد برای تغییر پارامترهای کرنل

تصویر ۲۸: وجود پسورد برای رفتن به حالت Rescue Mode

۱-۳- درباره فایل Open Virtualization Format (OVF)

 Open Virtualization Format (OVF) یک استاندارد باز برای بسته‌بندی و توزیع ابزارهای مجازی یا به طور کلی‌تر، نرم‌افزارهایی است که در ماشین‌های مجازی اجرا می‌شوند [5]. به زبان ساده‌تر، خروجی OVF یک ماشین مجازی شامل تمام اجزای آن سیستم به همراه انواع پارتیشن‌های آن سیستم است.

می‌توانیم فایل‌های OVF را با استفاده از نرم‌افزارهای مدیریت فایل‌های فشرده مانند 7-Zip مشاهده کنیم. پس از باز کردن فایل OVF ماشین مجازی موردنظر در 7-Zip، به فایل‌های زیر دسترسی خواهیم داشت:

تصویر ۲۹: فایل‌های موجود در فایل OVF

همچنین می‌توانیم فایل OVF را در یک نرم افزار مجازی‌سازی همچون VMware اجرا کنیم. پس از انجام این کار، به فایل‌های زیر می‌رسیم:

تصویر ۳۰: فایلهای موجود در فایل OVF

در بین فایل‌هایی که مشاهده می‌کنیم، مهم ترین فایل، فایل با پسوند VMDK است که در قسمت بعدی درباره آن صحبت می‌کنیم.

۲-۳- درباره فایل Virtual Machine Disk (VMDK)

VMDK (مخفف Virtual Machine Disk) یک فرمت فایل است که به توصیف کانتینرهایی برای دیسک‌های مجازی جهت استفاده در ماشین‌های مجازی مانند VMware Workstation یا VirtualBox می‌پردازد. [6]
به زبان ساده، این فایل شامل تمامی پارتیشن‌های سیستمی ماشین مجازی است. اگر دیسک مجازی ماشین با استفاده از FDE رمزگذاری نشده باشد، می‌توانیم به‌سادگی با mount کردن فایل VMDK در سیستم خود، فایل‌های ماشین مجازی را مشاهده و ویرایش کنیم. در ادامه، نحوه‌ی mount کردن یک فایل VMDK در سیستم لینوکسی را بررسی خواهیم کرد.

۱-۲-۳-نحوه Mount کردن فایل VMDK

برای mount کردن یک فایل VMDK، دستورات زیر را وارد می‌کنیم:

  • sudo modprobe nbd
    • این دستور ماژول کرنل Linux به نام nbd را بارگذاری می‌کند. NBD یا Network Block Device یک ماژول کرنل است که اجازه می‌دهد تا دیسک‌های بلوکی (Block Devices) از راه دور به سیستم محلی متصل شوند. با بارگذاری این ماژول، سیستم شما قادر به استفاده از دستگاه‌های شبکه‌ای بلوک، مانند دیسک‌های مجازی یا دیسک‌های موجود روی سرورهای دیگر، خواهد بود.
    • به طور کلی، modprobe یک ابزار مدیریتی است که برای بارگذاری یا حذف ماژول‌های کرنل استفاده می‌شود.
  • sudo qemu-nbd -c /dev/nbd1 /path/to/REDACTED-OS-disk1.vmdk
    • این دستور از ابزار qemu-nbd استفاده می‌کند که بخشی از ابزارهای QEMU (ابزارهای مجازی‌سازی) است. این ابزار برای اتصال دیسک‌های مجازی (از انواع مختلف مانند VMDK، QCOW2 و غیره) به سیستم استفاده می‌شود.
    • پارامتر c مشخص می‌کند که شما می‌خواهید یک فایل دیسک مجازی را به یک دستگاه NBD مشخص مانند /dev/nbd1 متصل کنید. 
    • در اینجا، فایل VMDK که در مسیر نوشته شده قرار دارد، به دستگاه NBD1 متصل می‌شود و سیستم آن را به عنوان یک دیسک بلوکی می‌شناسد.
  • sudo fdisk -l /dev/nbd1
    • این دستور برای نمایش اطلاعات پارتیشن‌های دستگاه /dev/nbd1 استفاده می‌شود. fdisk یک ابزار مدیریت دیسک در لینوکس است که می‌تواند برای مشاهده و مدیریت پارتیشن‌ها استفاده شود.
    • پارامتر -l لیستی از تمامی پارتیشن‌های موجود روی دیسک مشخص شده را نمایش می‌دهد. با اجرای این دستور، شما می‌توانید ببینید که دیسک مجازی VMDK که به NBD1 متصل شده، چه نوع پارتیشن‌هایی دارد و اندازه آن‌ها چقدر است.
همانطور که در تصویر زیر مشاهده می‌کنید، با موفقیت فایل VMDK را به مسیر dev/nbd1 متصل کردیم:
 
تصویر ۳۱: پارتیشن های موجود در فایل VMDK

تا اینجا توانستیم تا به پارتیشن های موجود در فایل VMDK دست پیدا کنیم. در ادامه به بررسی پسورد در GRUB می‌پردازیم و سعی می‌کنیم تا پسورد خود را بجای پسورد GRUB موجود در ماشین مجازی جایگزین کنیم.

۳-۳- درباره‌ی GRUB Password

Grub2 از قابلیت ایجاد پسورد برای Menu و یا Terminal پشتیبانی می‌کند. کاربر با توجه به نیاز خود می‌تواند برای تمام Menu و یا قسمت‌هایی از Menu پسورد تنظیم کند. این پسورد می‌تواند به شکل رمزگذاری شده و یا Clear-Text ذخیره شود. [3]

ما میتوانیم Grub2 را به دو روش زیر با استفاده از پسورد محافظت کنیم [4]:
  • پسورد برای تغییر ورودی های منو مورد نیاز است اما برای بوت کردن ورودی های منوی نیاز نیست.
  • پسورد هم برای تغییر ورودی های منو و هم برای بوت کردن ورودی های منو نیاز است. 

۴-۳- پیدا کردن GRUB Password

 با بررسی ابتدایی فایل VMDK، وارد شدن و دسترسی به این سیستم غیرممکن بنظر می‌رسید. با بررسی بیشتر و کمک آقای حمید کشفی، متوجه شدم که تا زمانی که سیستم عامل بوت می‌شود، یعنی به صفحه Login سیستم عامل می‌رسیم، دور زدن پسورد Grub ممکن است!
برای پیدا کردن محل ذخیره پسورد Grub، ابتدا پارتیشن nbd1p2 که 1 گیگابایت فضای حافظه دارد (تصویر ۳۱ را مشاهده کنید) را بر روی سیستم خود mount می‌کنیم:
sudo mount /dev/nbd1p2 /mnt/virtualdisk/nbd1p2

 با بررسی فایل‌های این پارتیشن، متوجه مسیر grub2 می‌شویم:
ls /mnt/virtualdisk/nbd1p2

تصویر ۳۲: مسیرهای موجود در پارتیشن

با بررسی فایل‌های موجود در grub2 به اطلاعات زیر می‌رسیم:
ls /mnt/virtualdisk/nbd1p2/grub2/
 
تصویر ۳۳: فایلهای موجود در مسیر گراب
 
با بررسی فایل‌های موجود در مسیر grub2، متوجه فایل user.cfg می‌شویم. هنگامی که ما پسوردی برای محافظت از ویرایش ورودی های Grub2 می‌سازیم، فایل user.cfg ساخته می‌شود که حاوی هش پسورد Grub است. [7]
این فایل حاوی اطلاعات زیر است:
cat /mnt/virtualdisk/nbd1p2/grub2/user.cfg
 
تصویر ۳۴: هش پسورد گراب

 با بررسی اطلاعات بدست آمده به این نتیجه می‌رسیم که با جایگزینی هش پسورد خود به جای این هش، می‌توانیم به منوی ویرایش دستورات Grub وارد شویم.

۵-۳- ساخت پسورد Grub و جایگزین کردن آن

برای ساخت پسورد Grub، از دستور grub-mkpasswd-pbkdf2 استفاده می‌کنیم. [7]
 پس از اجرای دستور بالا، پسورد مورد نظر از کاربر دریافت می‌شود و پس از آن، هش پسورد بر روی ترمینال نمایان می‌شود.

تصویر ۳۵: ساخت پسورد گراب
حال هش پسورد خود را جایگزین هش پسورد موجود در فایل user.cfg می‌کنیم:
 
تصویر ۳۶: جایگزین کردن هش پسورد گراب

در ادامه به بررسی صحت کار انجام شده می‌پردازیم و سعی می‌کنیم با استفاده از تغییر پارامترهای کرنل، به سیستم مورد نظر نفوذ کرده و پسورد کاربر root را تغییر دهیم.

۶-۳- ROOT

برای صحت سنجی از تغییر انجام شده، هنگام بوت ماشین مجازی مورد نظر، کلید SHIFT نگه‌میداریم تا صفحه Grub ظاهر شود.
 
تصویر ۳۷: منوی Grub
 
سپس با فشردن کلید e بر روی ورودی مورد نظر، از کاربر درخواست نام کاربری و کلمه عبور می‌شود. در این قسمت با نام کاربری root و کلمه عبوری که پیش‌تر تنظیم کردیم، وارد صفحه دستورات Grub می‌شویم.
همانند کاری که بر روی Ubuntu انجام دادیم، عبارت زیر را به انتهای خطی که مسئول بارگیری کرنل لینوکس است وارد می‌کنیم:
rw init=/bin/bash

تصویر ۳۸: تغییر پارامتر کرنل

سپس با استفاده از کلید CTRL + X، بوت سیستم را شروع می‌کنیم.
همانطور که در تصویر زیر مشاهده می‌کنیم، با موفقیت توانستیم به این سیستم نفوذ کرده و پسورد کاربر root را تغییر دهیم.
تصویر ۳۹: ROOT

 ۴- نتیجه گیری

همانطور که در این پست مطالعه کردیم، راه های زیادی برای بدست آوردن کلمه عبور یک سیستم لینوکسی که به آن دسترسی فیزیکی داریم وجود دارد؛ برخی از این راه ها ساده و برخی کمی پیچیده‌تر هستند. ما به عنوان یک متخصص تست نفوذ وظیفه داریم تا این روشها را فرا گیریم و آن ها را در مسیر کاری خود استفاده کنیم.

۵-نیاز به تست نفوذ دارید؟

اگر به دنبال انجام پروژه‌های تست نفوذ وب، اندروید، شبکه یا Security Code Audit با بالاترین دقت و استانداردهای امنیتی هستید، خوشحال می‌شوم که در این مسیر همراه شما باشم. برای دریافت اطلاعات بیشتر و شروع همکاری، با من تماس بگیرید.

 ۶- منابع

  1. https://wiki.ubuntu.com/RecoveryMode
  2. https://docs.kernel.org/admin-guide/kernel-parameters.html
  3. https://help.ubuntu.com/community/Grub2/Passwords
  4. https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/assembly_protecting-grub-with-a-password_managing-monitoring-and-updating-the-kernel#proc_setting-password-protection-only-for-modifying-menu-entries_assembly_protecting-grub-with-a-password
  5. https://en.wikipedia.org/wiki/Open_Virtualization_Format
  6. https://en.wikipedia.org/wiki/VMDK
  7. https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/assembly_protecting-grub-with-a-password_managing-monitoring-and-updating-the-kernel#proc_setting-password-protection-only-for-modifying-menu-entries_assembly_protecting-grub-with-a-password
  8. https://man7.org/linux/man-pages/man2/chroot.2.html
  9. https://wiki.archlinux.org/title/Chroot
  10. https://en.wikipedia.org/wiki/Chroot#Linux_host_kernel_virtual_file_systems_and_configuration_files 
  11. https://www.youtube.com/watch?v=8fi7uSYlOdc

نظرات

ارسال یک نظر

Popular Posts

نوشتن Bcheck با مثال واقعی

سفر من در رمزگشایی درخواست های رمزگذاری شده