در این آموزش میخواهیم یکی از چالشهای سری boot2root به نام «Tokyo Ghoul» را حل کنیم. این چالش جزو تمرینات تست نفوذ وبسایت TryHackMe است. برای کسانی که دانش پایهی مناسب برای حل تمرینات عملی TryHackMe را داشته باشند، سطح این تمرین متوسط است؛ البته به شرطی که اطلاعات به دست آمده در فاز شناسایی (Reconnaissance) به دقت بررسی شوند. بیایید بدون مقدمه شروع کنیم و حل این چالش را بیاموزیم.
« سطح متوسط »
برای مطالعه هر کدام از بخشهای اصلی بالا، روی تیتر کلیک کنید
برای فهمیدن این که ماشین چالش از چه نوعی است و چطور کار میکند، از خواندن توضیحات چالش در سایت TryHackMe شروع میکنیم:
«به kaneki کمک کن از اتاق jason فرار کنه»
« این اتاق با الهام از بازی Psychobreak و بر اساس انیمهی Tokyo Ghoul ساخته شده.»
پس از بوتکردن ماشین از صفحهی TryHackMe:Tokyo Ghoul یه آدرس IP هدف به ما داده میشود.
آدرس IP: 10.10.43.18
این اتاق 2 پرچم – یا فلگ (flag)- دارد که باید برای کاملکردن چالش این ماشین، آنها را بیابیم. ولی تعداد سوالاتی و تسکهایی که باید پاسخ آنها را به دست آوریم بسیار بیشتر است. ما در این جا با انجام هر تسک پاسخ آن را نیز میآوریم.
1.1. خواندن اطلاعات بالا
پاسخ: به جواب نیاز ندارد، اطلاعات بالا خوانده شوند.
1.2. راهاندازی ماشین
پاسخ: به جواب نیاز ندارد، ماشین بوت شود.
nmap –sC –sV 10.10.43.18
همانطور که در تصویر میبینید، Nmap توانسته 3 سرویس را در حال اجرا روی ماشین هدف بیابد. این سرویسها شامل یک سرویس FTP (روی پورت 21)، یک سرویس SSH (روی پورت 22) و یک سرویس HTTP (روی پورت 80) هستند.Nmap زحمت ما را کمتر کرده و امکان لاگینکردن به صورت ناشناس با یوزرنیم Anonymous روی سرویس FTP را هم بررسی کرده و به ما گفته که یک دایرکتوری با نام need_Help? روی سرور FTP میزبانی میشود که با لاگین ناشناس در دسترس است. ما بعدا سراغ این دایرکتوری خواهیم آمد. امکان دسترسی به سرویس SSH به خاطر نداشتن اطلاعات ورود وجود ندارد. در نهایت، یک سرویس HTTP داریم که یک صفحهی وب را میزبانی میکند.
2.1. از nmap برای اسکن تمام پورتها استفاده کنید
پاسخ: به جواب نیاز نیست، قبلا انجام شده است.
2.2. چند پورت باز است؟
پاسخ: 3 پورت
2.3. سیستمعامل مورد استفاده چیست؟
پاسخ: اوبونتو
http://10.10.43.18
نام این صفحه jasonroom.html است. این صفحه حاوی یک فایل gif است که نشان میدهد Jason در حال تزریق مایعی به Kaneki است. ما سعی کردیم یک لینک یا هر چیزی جز این gif روی این صفحه پیدا کنیم ولی موفقیتی نداشتیم. بررسی خود gif هم نتیجهای نداشت. در این جا این ایده به ذهن ما رسید که سورسکد صفحه را بررسی کنیم.
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.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.1. user.txt
پاسخ: بر عهدهی شما!
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.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
به تست نفوذ وبسایت علاقه داری؟ روی لینک زیر کلیک کن