دومین دوره مسابقه فتحپرچم UUTCTF در ساعت ۱۱ روز ۳۱ خرداد ۱۳۹۹ به مدت ۴۸ ساعت آغاز شد. این مسابقه توسط دانشگاه صنعتی ارومیه، اعضای تیم POSCON و با همکاری انجمن علمی کامپیوتر و مرکز آپای ارومیه برگزار شد. ابر آروان نیز از حامیان مسابقه بود. آدرس مسابقه: http://ctf.uut.ac.ir
مسابقه در سایت CTFTime اطلاعرسانی شده و به صورت بینالمللی برگزار میشد.
در این نوشته تلاش شده مشکلاتی که در برگزاری مسابقه دیده شد آورده بشه تا در دورههای بعدی شاهد مسابقات باکیفیتتری باشیم. در انتها نیز راهحل بعضی از چالشها آورده شدهاند.
قبل از شروع مسابقه مشاهده اشتباهات نگارشی در پوستر منتشر شده و عدم اصلاحش توسط تیم برگزاری، انتظار برگزاری یک مسابقه خیلی خوب رو کمی پایین آورد.
تا ۲۴ ساعت قبل از برگزاری مسابقه، سامانه اصلی بالا نبود و ثبتنامی هم انجام نشد. انتظار میره حداقل یک هفته قبل از برگزاری تیمها بتونند ثبتنام کنند.
بعد از بالا اومدن سامانه اصلی اشکالاتی دیده شد: قوانین و اطلاعاتی در مورد مسابقه وجود نداشت. همینطور راه ارتباطی با مدیران مسابقه وجود نداشت. با پیگیری این موضوع از برگزارکنندگان، اکانت تلگرام انجمن علمی کامپیوتر دانشگاه را معرفی کردند. در یک مسابقه بینالمللی این موضوع باید در سامانه اصلی اطلاعرسانی بشه که همه شرکتکنندگان در جریان قرار بگیرند که متأسفانه چنین چیزی مشاهده نشد.
تقریباً همه مسابقات در مورد فرمت فلگها، جوایز و … اطلاعرسانی میکنند. همینطور به منظور ارتباط با ادمینهای مسابقه یک کانال IRC یا Discord راهاندازی میشه.
با شروع مسابقه سامانه از دسترس خارج شد و این مشکل تا چند ساعت پابرجا بود. تیم برگزاری سرور بکاپ رو بالا آوردند. در نهایت حدود ۴ ساعت بعد از شروع مسابقه آدرس http://uutctf.mstajbakhsh.ir رو اعلام کردند. تو این سرور از Cloudflare استفاده کردند.
در زمان شروع خیلی از مسابقات حمله DDOS انجام میشه و این یه مساله عادیه. ولی نکتهای که هست نحوه مدیریت کردن مسابقه هست. توی خیلی از مسابقات با down شدن سرور، چالشها رو یه جای دیگه آپلود میکنند تا خللی تو حل سؤالات ایجاد نشه.
توی صفحه CTFTime این مسابقه هم (به علت عدم معرفی راه ارتباط با مدیران) به تیم برگزارکننده پیشنهاد دادند که این کار رو انجام بدن و سؤالات رو توی گیتهاب قرار بدن ولی این کار انجام نشد و گفتند امکانپذیر نیست. دلیلش رو نمیدونیم!؟
مساله بعدی دستهبندی سؤالات و تعداد اونها بود. سؤالات مسابقه به صورت زیر بودند:
همونجوری که مشخصه تعداد سؤالات متوازن نیستند. نکته دیگه اینکه مسابقه اصلاً سؤال اکسپلویت نداشت.
یک اتفاق عجیب هم افتاد: ۱۰ دقیقه قبل از پایان مسابقه یهو مسابقه به مدت ۴ ساعت تمدید شد! همونجوری که گفتیم منبع مشخصی برای ارتباط و اطلاعرسانی مشخص نکرده بودند. اطلاعرسانیها در توییتر، کانال تلگرام و بخش Notifications خود سامانه بود. جالب اینه که هر سه تای این موارد با هم متفاوتند. تمدید زمان مسابقه توی بخش Notifications سامانه هم قرار نگرفت. ضمن اینکه ۱۰ دقیقه به انتهای مسابقه اصلاً زمان مناسبی برای این کار نیست. خیلی از تیمها ممکنه با فرض اینکه تو زمان باقیمونده دیگه نمیتونند چالشی حل کنند ساعت آخر مسابقه رو رها کنند.
از تیم برگزارکننده مسابقه تشکر میکنیم و امیدواریم دورههای بعدی با کیفیت بهتری برگزار بشن. در ادامه تعدادی از چالشها رو بررسی میکنیم.
چالش Flaggy Bird (مهندسی معکوس – ۱۵۰ امتیازی)
توضیح:
Help the Flaggy Bird, so it will show you the flag! Beat its score if you can!!!
Hint: Split the shown text. Flag is the 3rd part.
حل:
با دیکامپایل کردن اپ اندرویدی دادهشده با برنامه jadx، رشتههایی شبیه به پرچم رو در سورس کد میتونیم ببینیم:
که با قرار دادنشون کنار هم به عبارت زیر میرسیم.
$_$:UUT-CTF:Kn3ll_4_M4sT3r_XD–
با توضیحات داده شده در سؤال، پرچم بدست میاد:
UUTCTF{Kn3ll_4_M4sT3r_XD–}
چالش RunMe (مهندسی معکوس – ۵۰۰ امتیازی)
توضیح:
There is a wired app which does not want to be run! Run it and access the flag!
حل:
با دیکامپایل کردن اپ داده شده سورس کد زیر در MainActivity برنامه مشاهده میشه:
همونجوری که مشخصه یک تابع با ورودیهای مختلف صدا زده میشه. با مراجعه به تابع مذکور میبینیم که شبیه یک دیکشنری بوده و اعداد مختلف رو به کاراکترهای مختلف تبدیل میکنه:
با وارد کردن اعداد موجود در MainActivity برنامه در تابع فوق، عبارت زیر بدست میاد:
Pa$$w0rD iS : $*#uutCTF*$*3lli0t**Ald3rson*##$
در شاخه assets اپ فایلی به نام assets.zip وجود داره. این فایل به عنوان یه فایل فشرده تشخیص داده نمیشه:
درواقع این فایل با استفاده از الگوریتم AES مد ECB رمز شده و کلید رمزنگاری هم عبارت بدست اومده در بالا هست.
با اسکریپت پایتون زیر فایل رو رمزگشایی میکنیم:
from Crypto.Cipher import AES
key = "$*#uutCTF*$*3lli0t**Ald3rson*##$"
cipher = open('assets.zip', 'rb').read()
aes = AES.new(key, AES.MODE_ECB)
decrypted = aes.decrypt(cipher)
with open('decrypted.zip', 'wb') as output:
output.write(decrypted)
فایل فشرده خروجی شامل یک فایل به نام classes.dex هست. بعد از دیکامپایل کردن classes.dex میبینیم که مجدداً تابعی صدا زده میشه و یک دیکشنری شبیه اپ اصلی داریم:
با ورود اعداد به تابع nToC به عبارت iL0v3-A3S-DeX_X میرسیم و پرچم برابر است با:
UUTCTF{iL0v3-A3S-DeX_X}
چالش Noisy Wind (متفرقه – ۱۰۰ امتیازی)
توضیح:
حل:
فایل NoisyWind.wav را با برنامه Audacity باز میکنیم و Spectogramش رو میبینیم:
پرچم:
UUTCTF{StEg0_1s_sUch_4_fUn}
چالش Collect the Onions (متفرقه – ۴۰۰ امتیازی)
توضیح:
Collect the onions from this hidden service!
Address: http://lyrtt5cc2mfixd5f.onion
حل:
آدرس داده شده از سرویسهای onion بوده و از طریق شبکه Tor در دسترس است. با باز کردن آدرس با صفحه زیر روبرو میشیم:
از ما خواسته شده که چهار قسمت پرچم رو پیدا کنیم. با چک کردن هدرهای respone مقدار server1 رو میبینیم که به Server اختصاص داده شده.
وقتی آدرس رو با circuit جدیدی باز کنیم تغییراتی در محتوا ایجاد میشه. هدرهای response هم کمی تغییر میکنند:
ایده سؤال استفاده از Load Balancer توی شبکه Tor هست. به این صورت که میتونیم چند تا سرور رو برای سرویس onion مورد نظرمون مشخص کنیم و با درخواستهای مختلف، دیتا از سرورهای مختلف برگردونده میشه.
آقای تاجبخش اینجا در این زمینه توضیحات کاملی دادند.
با تغییر circuit و بررسی response به قسمتهای مختلف پرچم میرسیم:
قسمت اول تو خود صفحه قابلنمایشه.
قسمت دوم توی سورس صفحه کامنت شده.
قسمت سوم توی هدر response هست:
قسمت چهارم توی فایل robots.txt قرار داره:
پرچم:
UUTCTF{0N10N_H1DD3N_S3RV3RS_R0CK}
چالش White Noise (جرمشناسی – ۱۰۰ امتیازی)
توضیح:
The flag is inside the attached file. Extract it:
Hint: “uUt_CtF_2020” leads you to the flag.
حل:
با بررسی چند خط ابتدای فایل با عبارت AESCREATED_BYaescrypt 3.11 مواجه میشیم:
با دانلود برنامه aescrypt و اجرای اون به همراه عبارت داده شده به عنوان رمز، فایل رو رمزگشایی و نوع فایل خروجی رو چک میکنیم:
با باز کردن فایل صوتی خروجی عبارات نامفهومی شنیده میشه. با بررسی بیشتر مشخص میشه که فایل reverse شده که با reverse مجدد اون (با ابزاری مثل Audacity) به فایل اصلی میرسیم که تو اون پرچم گفته شده.
پرچم:
UUTCTF{We_Are_Anonymous}
چالش WTF (What The Flag!) (جرمشناسی – ۲۵۰ امتیازی)
توضیح:
Search for the flag inside the PCAP!
حل:
فایل pcap داده شده شامل ترافیک DLNA هست. توی ترافیک کپچر شده یک فایل ویدیویی هم موجوده که طی دو استریم منتقل شده:
همونجوری که مشخصه توی response دو استریم بالا هدر Content-Range دو قسمت مختلف از فایل رو نشون میده. با ترکیب این دو استریم فایل ویدیویی اصلی تشکیل میشه و پرچم تو اون قرار داره:
UUTCTF{m1n1DLNA_4_v1d30_shar1ng}
چالش Intruder (جرمشناسی – ۳۵۰ امتیازی)
توضیح:
Someone added a malicious app to the Android Image. Help me find the intruder!
The image is here: http://185.206.93.66:1001/Intruder.zip
حل:
ایمیج اندروید داده شده در فرمت sparse هست. با برنامهای مثل sdat2img به ایمیج ext4 تبدیلش میکنیم که بتونیم mountش کنیم:
بعد از mount ایمیج در شاخه app/WhoAmI فایل WhoAmI.apk قرار داره که با نصب این اپ و باز کردنش به قسمت اول پرچم میرسیم:
قسمت دوم پرچم توی فایل res/values/strings.xml قرار داره:
پرچم:
UUTCTF{4nDR01D_Fr0m_scr4tch}
چالش Mess Up – Warm Up (رمز – ۲۵ امتیازی)
توضیح:
حل:
متن داده شده اندکینگ base64 هست. با دیکد کردن اون داریم:
UUTCTF{.—- -. – …– .-. . ….. – …– -.. -….- .. -. -….- — —– .-. ….. . -….- -.-. —– -.. …–}
عبارت به دست اومده کد Morse هست که با دیکد کردن اون به متن زیر میرسیم:
1NT3RE5T3D-IN-M0R5E-C0D3
در نهایت پرچم:
UUTCTF{1NT3RE5T3d_IN_M0r5E_C0d3}
نکته: دقیقاً یادم نیست که پرچم به صورت حروف کوچک یا بزرگ بود. تو اینجور سؤالات باید توضیحی در مورد فرمت پرچم داده بشه. (مثلاً: پرچم با حروف کوچک است)
چالش Let Me In (وب – ۵۰ امتیازی)
توضیح:
Go inside the website and it will show you the flag.
URL: http://185.206.93.66:800/
حل:
با باز کردن آدرس میبینیم که گفته شده چالش اصلی در آدرس http://185.206.93.66:800/auth قرار داره. این آدرس هم با کلمه عبور محافظت میشه.
اگه هدر response صفحه اصلی رو ببینیم یوزرنیم و پسورد اونجا قرار داره:
پرچم:
UUTCTF{I_J45T_H4T3_C0R0NA}
ممنون از توجهتون
اکثر مشکلات برمیگشت به کم تجربگی sysadmin تیم ( یعنی من).
اصلا انتظار این حجم از استقبال و همین طور DDoS رو نداشتیم! چون سال قبل همچین چیزی نبود.
سعی میکنیم سال آینده بهتر ظاهر بشیم.