حل چالش Tokyo Ghoul از وبسایت TryHackMe

در این آموزش می‌خواهیم یکی از چالش‌های سری boot2root به نام «Tokyo Ghoul» را حل کنیم. این چالش جزو تمرینات تست نفوذ وبسایت TryHackMe است. برای کسانی که دانش پایه‌ی مناسب برای حل تمرینات عملی TryHackMe را داشته باشند، سطح این تمرین متوسط است؛ البته به شرطی که اطلاعات به دست آمده در فاز شناسایی (Reconnaissance) به دقت بررسی شوند. بیایید بدون مقدمه شروع کنیم و حل این چالش را بیاموزیم.

« سطح متوسط »

مسیر کلی تست نفوذ

  • اسکن شبکه
  • استخراج اطلاعات (Enumeration)
    • بازکردن سرویس HTTP در مرورگر
    • استخراج اطلاعات سورس‌کد
    • استخراج اطلاعات سرویس FTP
    • استخراج اطلاعات فایل اجرایی با استفاده از Strings
    • خارج‌کردن فایل تصویر از حالت فشرده با استفاده از Steghide
    • دیکودکردن کد مورس
    • دیکودکردن هگزادسیمال
    • دیکودکردن Base64
    • بروت‌فورس‌کردن دایرکتوری با استفاده از Dirb
  • اکسپلویت
    • اکسپلویت LFI یا فراخوانی فایل محلی (Local File Inclusion)
    • استخراج هش کاربر
    • کرک‌کردن هش کاربر با استفاده از John the Ripper
    • لاگین‌کردن از طریق SSH
    • خواندن پرچم (Flag) کاربر
  • بالابردن سطح دسترسی (Privilege Escalation)
    • استخراج مجوز Sudo
    • فرار از زندان پایتون (Python Jail) با استفاده از ماژول‌های پیش‌ساخته (built-in)
    • اکسپلویت مجوز Sudo با اسکریپت پایتون
    • گرفتن دسترسی root shell
    • خواندن پرچم root

برای مطالعه هر کدام از بخش‌های اصلی بالا، روی تیتر کلیک کنید

حل گام به گام چالش

برای فهمیدن این که ماشین چالش از چه نوعی است و چطور کار می‌کند، از خواندن توضیحات چالش در سایت TryHackMe شروع می‌کنیم:

«به kaneki کمک کن از اتاق jason فرار کنه»

« این اتاق  با الهام از بازی Psychobreak و بر اساس انیمه‌ی Tokyo Ghoul ساخته شده.»

پس از بوت‌کردن ماشین از صفحه‌ی TryHackMe:Tokyo Ghoul یه آدرس IP هدف به ما داده می‌شود.

آدرس IP: 10.10.43.18

این اتاق 2 پرچم – یا فلگ (flag)- دارد که باید برای کامل‌کردن چالش این ماشین، آن‌ها را بیابیم. ولی تعداد سوالاتی و تسک‌هایی که باید پاسخ آن‌ها را به دست آوریم بسیار بیشتر است. ما در این جا با انجام هر تسک پاسخ آن را نیز می‌آوریم.

تسک 1: خواندن اطلاعات اتاق

1.1. خواندن اطلاعات بالا

پاسخ: به جواب نیاز ندارد، اطلاعات بالا خوانده شوند.

1.2. راه‌اندازی ماشین

پاسخ: به جواب نیاز ندارد، ماشین بوت شود.

اسکن شبکه

کار را با گرفتن یک اسکن nmap با فلگ –sC (اسکریپت‌های پیشفرض) و فلگ –sV (اسکن نسخه‌ی میزبان‌ها) شروع می‌کنیم:
nmap –sC –sV 10.10.43.18

همان‌طور که در تصویر می‌بینید، Nmap توانسته 3 سرویس را در حال اجرا روی ماشین هدف بیابد. این سرویس‌ها شامل یک سرویس FTP (روی پورت 21)، یک سرویس SSH (روی پورت 22) و یک سرویس HTTP (روی پورت 80) هستند.Nmap  زحمت ما را کمتر کرده و امکان لاگین‌کردن به صورت ناشناس با یوزرنیم Anonymous روی سرویس FTP را هم بررسی کرده و به ما گفته که یک دایرکتوری با نام need_Help? روی سرور FTP میزبانی می‌شود که با لاگین ناشناس در دسترس است. ما بعدا سراغ این دایرکتوری خواهیم آمد. امکان دسترسی به سرویس SSH به خاطر نداشتن اطلاعات ورود وجود ندارد. در نهایت، یک سرویس HTTP داریم که یک صفحه‌ی وب را میزبانی می‌کند.

استخراج اطلاعات

صفحه‌ی وب داستان Ken Kaneki، یک نوجوان دبیرستانی را تعریف می‌کند که با دختری به نام Rize Kamishiro سر قرار رفته است. پس از قرار معلوم می‌شود که دختر یک غول بوده و به Kaneki حمله می‌کند، ولی چیزی روی سر غول می‌افتد و بی‌هوش می‌شود. Kaneki به یک بیمارستان فرار می‌کند و در آن‌جا فردی به نام Jason او را به دام می‌اندازد. Jason قصد دارد اعضای بدن Kaneki را خارج کرده و برای قاچاق اعضای بدن استفاده کند. اگر نظر ما را بخواهید، خط داستانی فیلم خیلی تاریک است! بگذریم، با خواندن این متن کلماتی را می‌بینیم که می‌توانند کاربران یا دایرکتوری‌های مختلف روی ماشین باشند. ما در این‌جا Ken، Kaneki، Rize، Kashimiro و Jason را داشتیم. در صفحه‌ی وب لینکی قرار دارد که با کلیک روی آن می‌توان Kaneki را از دست Jason نجات داد. کلیک روی آن ما را به یک صفحه‌ی وب دیگر می‌‌برد.

تسک 2: من کجا هستم؟

2.1.  از nmap برای اسکن تمام پورت‌ها استفاده کنید

پاسخ: به جواب نیاز نیست، قبلا انجام شده است.

2.2. چند پورت باز است؟

پاسخ: 3 پورت

2.3. سیستم‌عامل مورد استفاده چیست؟

پاسخ: اوبونتو

http://10.10.43.18

نام این صفحه jasonroom.html است. این صفحه حاوی یک فایل gif است که نشان می‌دهد Jason در حال تزریق مایعی به Kaneki است. ما سعی کردیم یک لینک یا هر چیزی جز این gif روی این صفحه پیدا کنیم ولی موفقیتی نداشتیم. بررسی خود gif هم نتیجه‌ای نداشت. در این جا این ایده به ذهن ما رسید که سورس‌کد صفحه را بررسی کنیم.

تسک 3: کشیدن نقشه‌ی فرار

3.1. یادداشتی را که باقی غول‌ها به تو داده بودند پیدا کردی؟ کجا آن را پیدا کردی؟

جواب: jasonroom.html

http://10.10.43.18/jasonroom.html

روی سورس‌کد صفحه یک کامنت هست. این کامنت به ما می‌گوید که یک راه برای فرار از دست Jason وجود دارد. به علاوه، این یادداشت به ما می‌گوید که ماسکی وجود دارد که باعث می‌شود ناشناس (Anonymous) به نظر برسیم و به ما می‌گوید که به اتاق FTP برویم. البته به نظر ما این راهنمایی خیلی کار را واضح می‌کند و هیجان بازی را از بین می‌برد! بگذریم، ما از قبل می‌دانستیم که لاگین ناشناس روی سرور FTP فعال است. حالا وقت آن است که که اطلاعات FTP را استخراج کنیم.

view-source:http://10.10.43.18/jasonroom.html

با لاگین‌کردن به صورت ناشناس روی سرویس FTP، به دایرکتوری need_Help? دسترسی پیدا می‌کنیم. این دایرکتوری حاوی یک فایل متنی (Aogiri_tree.txt) و یک دایرکتوری دیگر (به نام Talk_with_me) است. ما فایل متنی را روی سیستم خود دانلود کردیم تا آن را دقیق‌تر بررسی کنیم و سپس وارد دایرکتوری Talk_to_me شدیم. این دایرکتوری حاوی یک باینری قابل اجرا به نام need_to_talk و یک تصویر به نام rize_and_kaneki.jpg بود. ما هردوی آن‌ها را روی سیستم خودمان دانلود کردیم تا بتوانیم دقیق‌تر آن‌ها را بررسی کنیم.

ftp 10.10.43.18
anonymous
ls
cd need_Help?
ls
get Aogiri_tree.txt
cd Talk_with_me
ls
get need_to_talk
get rize_and_kaneki.jpg

حال بیایید فایل Aogiri_tree.txt را بخوانیم. به نظر می‌رسد این فایل پیامی از سوی Kaneki باشد که در آن توضیح داده Rize حالا دیگر بخشی از Kaneki شده و Kaneki حالا Kagune او را دارد (Kagune همان سلاح یا چنگال یک غول است که با آن شکار می‌کند). این Kanuge از Kaneki درخواست می‌کند که کنترل بدن او را به دست گیرد و هم‌چنین به Kaneki می‌گوید که او بخشی از درخت Aogiri است. اکنون ما دو کلمه‌ی دیگر علاوه بر کلماتی که در متن اول یاد گرفتیم داریم: Kagune و Aogiri.

cat Aogiri_tree.txt

یک فایل دیگر که از سرور FTP دانلود کردیم تصویری از Rize و Kaneki است. ما این تصویر را با نرم‌افزار Image Viewer باز کردیم و جزییات آن را نیز با استفاده از ابزار Exif بررسی کردیم؛ ولی نتواسنتیم هیچ اطلاعات مهمی از آن استخراج کنیم. این باعث شد به ذهنمان برسد که ممکن است این تصویر یک فایل فشرده باشد. این یعنی برای خارج‌کردن آن از حالت فشرده به steghide نیاز داریم. وقتی از این ابزار استفاده کردیم، متوجه شدیم که باید برای خارج‌کردن فایل‌های داخل تصویر rize_and_kaneki.jpg لازم است یک پسورد را وارد کنیم.

حالا باید پسورد را استخراج کنیم. برای این کار مجوزهای فایل اجرایی need_to_talk را ارتقا دادیم تا بتوانیم آن را روی سیستم خود اجرا کنیم. این برنامه به ما گفت که Kagune را به ما خواهد داد که فقط می‌توان فرض کرد همان پسوردی است که برای استخراج فایل‌ها از تصویر لازم داریم. ولی برای تحویل دادن پسورد، به یک کلمه‌ی کلیدی نیاز دارد. یک پازل داخل یک پازل دیگر. عالی شد! ما کلمه‌ی password را وارد کردیم که البته کلمه‌ی کلیدی درست نبود، ولی یک راهنمایی به ما داد. برنامه از ما خواست که نگاهی به داخل فایل اجرایی بیندازیم. ابزارهای فراوانی برای بررسی کد یک فایل اجرایی وجود دارند؛ یکی از این ابزارها rabin2 است که خود برنامه هم ما را راهنمایی کرده که از آن استفاده کنیم. ولی ساده‌ترین ابزار بین این ابزارها، ابزار Strings است. بیایید اول Strings را امتحان کنیم.

chmod 777 need_to_talk

need_to_talk/.

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

strings need_to_talk

3.2. کلید فایل اجرایی Rize چیست؟

پاسخ: kashimoro

3.3. از یک ابزار برای به دست آوردن یادداشت‌های دیگر از Rize استفاده کنید.

پاسخ: به جواب نیازی نیست، ما قبلا از ابزار Strings استفاده کرده‌ایم.

دوباره فایل اجرایی را اجرا می‌کنیم. این بار وقتی کلمه‌ی کلیدی را درخواست کرد، کلمه‌ی kashimoro را تایپ می‌کنیم. این برنامه به ما می‌گوید که چیزی که به دنبال آن هستیم «You_found_1t» است. این ممکن است همان پسوردی باشد که برای خارج‌کردن داده‌های داخل تصویر از حالت فشرده لازم است.

need_to_talk/.

پس از واردکردن عبارت You_found_1t به عنوان پسورد برای خارج‌کردن تصویر rize_and_kaneki.jpg از حالت فشرده توسط steghide، یک فایل متنی به نام «yougotme.txt» به دست آمد. به نظر می‌رسد طراح چالش چندان مایل نبوده برای نام‌گذاری‌ها وقت بگذارد! بگذریم، بیایید فایل yougotme.txt را بخوانیم. پیام داخل این فایل ابتدا به هوش ما کنایه می‌زند و می‌پرسد که می‌توانیم کد آن را بشکنیم یا نه، ولی در ادامه از زبانی برای انکودینگ استفاده کرده که تشخیص آن از تمام زبان‌های انکودینگ دیگر در دنیا ساده‌‌تر است: کد مورس! این فایل در انتها گفته که اگر بتوانیم این پیام را دیکود کنیم، می‌توانیم یک دایرکتوری مخفی را بیابیم.

steghide extract –sf rize_and_kenaki.jpg

cat yougotme.txt

از آن‌جایی که حوصله نداشتیم تک‌تک خط‌ها و نقطه‌ها را دستی تبدیل کنیم، در اینترنت به دنبال یک دیکودر کد مورس گشتیم. با دیکودکردن این کد یک رشته‌حروف عجیب‌وغریب به دست می‌آید، ولی این رشته‌حروف آشنا به نظر می رسد؛ در واقع به نظر می‌رسد این یک رشته‌ی هگزادسیمال باشد (اعداد و حروفی که از حرف E بالاتر نرفته‌اند. می‌دانیم که رشته‌های هگزادسیمال هم از اعداد و حروف تا F تشکیل شده‌اند.)

به وبسایت asciitohex رفتیم و رشته را در بخش Hexadecimal وارد کردیم. با تبدیل استرینگ به کد اسکی، یک رشته‌حروف دیگر به دست می‌آید. از روی == می‌توان فهمید که انکودینگ Base64 دارد.

با کپی‌کردن رشته‌حروف به‌دست‌آمده در بخش دیکودینگ Base64 نام دایرکتوری مخفی را به دست می‌آوریم: d1r3c70ry_center.

تسک 4: Rize سعی دارد چه بگوید؟

4.1. معنی پیام را فهمیدید؟ پیام چه می‌گوید؟

پاسخ: d1r3c70ry_center

4.2. ضعف درون تاریکی را می‌بینید؟ نه؟ کافی‌ست بگردید

پاسخ: به جواب نیازی نیست.

4.3. چیزی پیدا کردید؟ آن را کرک کنید

پاسخ: به جواب نیازی نیست.

ما سعی کردیم با قراردادن عبارت دقیق d1r3c70ry_center پس از آدرس IP ماشین هدف، این دایرکتوری را بیابیم.

http://10.10.43.18/d1r3c70ry_center/

ما تصمیم گرفتیم کار را با انجام یک بروت‌فورس دایرکتوری با ابزار اسکن dirb شروع کنیم. برای این کار از فایل common.txt به عنوان وردلیست اسکن استفاده می‌کنیم. این اسکن یک دایرکتوری به نام claim را به ما می‌دهد.

dirb http://10.10.43.18/d1r3c70ry_center/

با باز کردن دایرکتوری claim در مرورگر، Kaneki Ken به ما خوش‌آمد می‌گوید. سپس از ما می‌پرسد که «واقعا قدرت را می‌خواهیم؟» که یک سوال ساده است که دکمه‌های «بله» و «نه» هم برای پاسخ‌دادن دارد. روی هر دو کلیک می‌کنیم تا ببینیم چه اتفاقی می‌افتد.

http://10.10.43.18/d1r3c70ry_center/claim/

به یک صفحه‌ی حاوی یک gif منتقل می‌شویم. البته این gif با استفاده از پارامتر view در مرورگر باز شده است. این مساله ما را نسبت به استفاده از اکسپلویت LFI یا فراخوانی فایل محلی (Local File Inclusion) تحریک می‌کند.

http://10.10.43.18/d1r3c70ry_center/claim/index.php?view=flower.gif

اکسپلویت

ما فکر می‌کنیم که سازنده‌ی ماشین این را نیز پیش‌بینی کرده و بسیار مودبانه(!) از ما خواسته این کار را انجام ندهیم.

http://10.10.43.18/d1r3c70ry_center/claim/index.php?view=../../../../etc/passwd

ولی ما به این راحتی عقب نمی‌کشیم! کاری که ما امتحان کردیم این بود که نقطه و پس از آن بک‌اسلش به آدرس اضافه کنیم، ولی متوجه شدیم که استفاده از کاراکتر بک‌اسلش (\) محدود شده است. به همین خاطر نقطه‌ها و بک‌اسلش‌ها را انکود کردیم و سعی کردیم دوباره فایل etc/passwd باز کنیم و اینجا بود که موفق شدیم هش یوزرنیم و پسورد را به دست آوریم. یوزری که از آن استفاده می‌کنیم Kamishiro خواهد بود.

4.4. یوزرنیم Rize چیست؟

پاسخ: kamishiro

http://10.10.43.18/d1r3c70ry_center/claim/index.php?view=%2F%2E%2E%2F%2E%2E%2F%2E%2E%2Fetc%2Fpasswd

پس از آن هش را کپی کردیم و آن را در یک فایل به نام hash ریختیم (ما هم به پیروی از طراح چالش خلاقیت زیادی در نام‌گذاری فایل به خرج ندادیم!). پس از آن سعی کردیم هش را با ابزار John the Ripper کرک کنیم. وردلیستی که برای این کار انتخاب کردیم rockyou.txt بود. پسورد ظرف چند ثانیه کرک شد. پسورد مربوط به هش، password123 بود (این پسورد بیشتر از هر نام‌گذاری دیگری در این چالش، این حس را به ما داد که طراح ماشین ما را دست انداخته است!).

4.5. پسورد Rize چیست؟

پاسخ: password123

nano hash

John –wordlist=/usr/share/wordlist/rockyou.txt hash

زمان آن رسیده که با یوزرنیم Kamishiro به ماشین هدف وصل شویم. خوشبختانه معمای دیگری در کار نبود و اولین فلگ ماشین، یعنی فلگ کاربر (User Flag) را به دست آوردیم.

تسک 5: جنگیدن با Jason

5.1. user.txt

پاسخ: بر عهده‌ی شما!

ssh kamishiro@10.10.43.18

ls

cat user.txt

بالابردن سطح دسترسی (Privilege Scalation)

باید اطلاعات ماشین را استخراج کنیم تا بتوانیم این دسترسی shell را به دسترسی root shell ارتقا دهیم. این کار را با بررسی وجود مجوز sudo برای کاربر Kamishiro شروع کردیم. می‌بینیم که ما یک اسکریپت پایتون به اسم jail.py داریم که می‌توانیم به صورت root آن را اجرا کنیم.

sudo –l

زمانی که داشتیم به دنبال فلگ کاربر می‌گشتیم، دیدیم که فایل jail.py در دایرکتوری جاری موجود است. بیایید نگاهی دقیق‌تر به این اسکریپت بیندازیم و ببینیم چطور کار می‌کند. اسکریپت با چند استرینگ شروع می‌شود. سپس از کاربر ورودی می‌خواهد؛ سپس وجود کلمات کلیدی «eval»، «import»، «open»، «os»، «read»، «system» و «write» در این ورودی بررسی می‌شود. این یعنی مجاز به استفاده از هرگونه اسکریپت شل معکوس (reverse shell) یا اسکریپت بش (bash) برای گرفتن دسترسی root نیستیم. اینجا باید کمی خلاقیت به خرج دهیم.

cat jail.py

در این جا نیاز به راهی داریم که این محدودیت را دور بزنیم و دستورات مورد نظر خود را اجرا کنیم. پایتون به ما اجازه می‌دهد آبجکت‌های پیش‌ساخته‌ی پایتون (built-in) را به صورت __builtins__modules تعریف کنیم؛ پس به جای استفاده از import یا os، از __IMPORT__ و OS استفاده می‌کنیم. ما می‌توانستیم تلاش کنیم که گام‌به‌گام و تکه‌تکه یک اسکریپت مناسب بسازیم و بارها و بارها آن را روی این اسکریپت امتحان کنیم تا بالاخره جواب دهد، ولی تصمیم گرفتیم به جای این که چرخ را دوباره اختراع کنیم، اسکریپت مناسب را با جستجوی گوگل پیدا کنیم. برای همین عبارت Python Jails را جستجو کردیم و یک مقاله‌ی مرتبط پیدا کردیم؛ در این مقاله دستوری ایجاد شده بود که کار آن خواندن یک فایل است. سپس در آن تغییراتی انجام دادیم تا یک دستور شل اجرا کند. از آن‌جایی که می‌توان این اسکریپت را با استفاده از sudo به صورت root اجرا کرد، shell ایجادشده توسط آن هم به صورت root اجرا خواهد شد. پس از اجرای اسکریپت و واردکردن دستور در قالب builtins، دسترسی root shell را به دست آوردیم. با جستجو در دایرکتوری root آخرین فلگ، یعنی فلگ روت (Root Flag) را به دست آوردیم.

5.2. root.txt

پاسخ: بر عهده‌ی شما!

تسک 6: تشکر ویژه

6.1. تبریک! شما اتاق شماره 1 چالش Tokyo Ghoul را کامل کردید!

پاسخ: به جواب نیازی نیست.

sudo /usr/bin/python3 /home/kamishiro/jail.py

__builtins__.__dict__[‘__IMPORT__’.lower()](‘OS’.lower()).__dict__[‘SYSTEM’.lower()](‘/bin/bash’)

id

cd /root

ls

cat root.txt

به تست نفوذ وب‌سایت علاقه داری؟ روی لینک زیر کلیک کن

علاقمند به حوزه امنیت اطلاعات و آشنا به حوزه تست نفوذ
  • facebook
  • twitter
  • googleplus
  • linkedIn
  • flickr

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *