فروردین امسال (1402) کوئرا یک مسابقه مسابقه فتح پرچم (یا همون CTF) برگزار کرد با نام هکاتون. ثبتنام مسابقه تا 23ام اسفندماه 1401 ادامه داشت و شما میتونستید پس از پرداخت هزینه نسبتا سنگین (480)، برای مسابقه و 18 ساعت آموزش (نه چندان با کیفیت) اقدام کنید. در بخش معرفی رویداد این مطالب نوشته شده بود:
رویداد هکاتون امنیت، چهارمین هکاتون برنامهنویسی کوئرا است که با موضوع امنیت و در چارچوب طرح شهید بابایی بنیاد ملی نخبگان برگزار میشود.
این رویداد شامل یک بخش آموزشی و یک بخش رقابتی است. در ابتدا، موضوعات جذاب و کاربردی حوزه امنیت در ۳ روز و با همراهی اساتید برتر این حوزه برگزار میشود و شما مجموعا ۱۸ ساعت آموزش میبینید. بعد از آموزش به تیمهای ۲ الی ۴ نفره تقسیم میشوید و در یک مسابقه چالشی به رقابت میپردازید. بعد از مسابقه راهحل تیمها داوری میشود و نفرات برتر مشمول دریافت امتیاز نخبگی بنیاد و همینطور برنده جایزه نقدی مسابقه میشوند. علاوه بر این نفرات برتر برای استخدام به شرکتهای مطرح معرفی خواهند شد. برای مشاهده مراحل و زمانبندی رویداد روی این لینک کلیک کنید.
? به تمام شرکتکنندگان، گواهی شرکت در رویداد اهدا خواهد شد اما فقط نفرات برتر مسابقه و بعد از داوری راهحلها، مشمول دریافت امتیاز نخبگی بنیاد میشوند.
⚠️ شرکت در رویداد به صورت فردی است اما پیش از مسابقه، شرکتکنندگان به تیمهای ۲ الی ۴ نفره تقسیم میشوند تا به صورت تیمی به رقابت بپردازند. اگر از ابتدا تیم شما مشخص است و دوست دارید با تیم خود در این رویداد شرکت کنید لطفا به صورت جدا جدا ثبتنام خود را تکمیل کنید و بعد از ثبتنام به ما اطلاع دهید که میخواهید در یک تیم باشید.
برای برگزاری رویداد از پلتفرم CTFd استفاده شده بود و تیم کوئرا چند روز قبل از مسابقه، با هدف آشنایی بچهها با پلتفرم یک کوییز آزمایشی (و بدون تاثیر در نتایج مسابقه) قرار داد. سوالات این کوییز از رویدادهایی مثل picoctf و uutctf انتخاب شده بودند و به عنوان دست گرمی کمک بزرگی محسوب میشد. در پرانتز این هم بگم که سوالات مسابقه با اختلاف....باااا اختلااااف، سختتر و جذابتر بودند.
امتیاز: 100
متن سوال:
Can you login?
فایل: لینک
در این سوال یک فایل apk به ما داده شده که اگر روی شبیهساز (مثل AVD یا Genymotion) نصبش کنیم میبینیم که یک برنامه ساده است که در صفحه اولش نوشته Welcome و یک دکمه Login داریم. وقتی روی دکمه Login میزنیم به صفجه جدیدی میریم که دو تا فیلد برای وارد کردن username و password داره و یک دکمه Login برای تایید. ما باید نام کاربری و کلمه عبور درست را از apk استخراج کنیم.
برای بررسی فایلهای apk معمولا از ابزار Jadx استفاده میشه. این ابزار فایل apk را به عنوان ورودی دریافت میکنه و سعی میکنه کدهای کامپایلشده موجود در این فایل را به جاوا برگردونه (دیکامپایل کنه). دقت کنید که میگم سعی میکنه. در مواردی ممکنه Jadx نتونه کد را دیکامپایل کنه که در این صورت کد با فرمت smali در بدنهی کد دیکامپایل شده دیده میشه و فایلی با نام com/<apk name>/BadLogic تولید میشه.
نکته دیگهای که فکر میکنم دونستنش لازمه اینه که با Jadx نمیشه فایل را apk را اصلاح کرد و فقط برای خوندن کد استفاده میشه. اگر قصد تغییر در فایل apk را دارید باید با apktool اون را دیکامپایل کنید (که در نتیجهاش تعدادی فایل smali دریافت میکنید) و بعد با یک ادیتور بخشهایی را که نیازه عوض کنید. بعد هم با apktool دوباره برنامه را کامپایل کنید و با ابزار Sign امضا کنید. اگر دوست دارید این موارد را یاد بگیرید این آموزش را پیشنهاد میکنم (میتونید از کانال تلگرامی t.me/zer0daylab دریافت کنید).
برای حل سوال کافیه که فایل apk را با Jadx دیکامپایل کنیم (فقط کافیه فایل را بندازید داخل UI یا دکمه Open را بزنید). بعد از دیکامپایل شدن برنامه، وارد مسیر com/example.myapplication میشیم و فایلهای MainActivity و MainActivity2 را بررسی میکنیم. در فایل MainActivty2 میشه منطق بررسی نام کاربری و کلمه عبور را دید:
شرطی که نام کاربری و کلمه عبور را چک میکنه را در زیر مینوسیم. در این کد بررسی میشه که آیا نام کاربری با رشتهی حاصل از اتصال s2 و s3 برابر هست یا نه (user=s2+s3) و اینکه کلمه عبور با رشتهی حاصل از اتصال s5 و s4 برابر باشه (pass=s5+s4).
if (Intrinsics.areEqual($user.getText().toString(), this$0.getString(R.string.s2) + this$0.getString(R.string.s3)) && Intrinsics.areEqual($pass.getText().toString(), this$0.getString(R.string.s5) + this$0.getString(R.string.s4)) {
// do something;
}
کافیه در Jadx دنبال رشتههای مورد نظر بگردیم. به این منظور روی علامت ذرهبین نوار ابزار کلیک میکنیم (Text Search) و در پنچرهای که باز میشه تیک Resource (منبع) را میزنیم و عبارت زیر را جستجو میکنیم (فرمت ذخیره رشته در منابع برنامه اندروید).
<string name="s2
دقت کنید که اگر تیک Resource را نزنید و دنبال s2 بگردید، جسجو در کد انجام میشه و با عبارت زیر روبرو میشید:
public static final int s2 = 0x7f0f0095;
جستجو را برای s3، s4 و s5 هم انجام میدیم که نتیجه میشه مثل زیر:
<string name="s2">ereh</string>
<string name="s3">asghjk</string>
<string name="s4">asgsshjk</string>
<string name="s5">asghuuhjk</string>
با توجه به این رشتهها، میشه گفت که نام کاربری میشه erehasghjk و کلمه عبور هم میشه asghuuhjkasgsshjk. با وارد کردن این مقادیر در برنامه (که روی گوشی یا شبیهساز نصب کردیم)، عبارت cXVlcmFDVEZ7ZWFzeV9wZWFzeV9BTkRSMDFEX0NoNExMRU5nZX0 روی صفحه نمایش داده میشه.
اگر حوصله تایپ ندارید (که من اصلا ندارم) از صفحه موبایل اسکرینشات بگیرید و بدید CyberChef تا براتون کاراکترهاش را تشخیص بده. فقط دوتا نکته:
1- بهتره قسمتهای اضافی عکس را ببرید
2- حتما یکبار خودتون خروجی را بخونید چون بعضی کاراکترها را اشتباه تشخیص میده. یا اینکه از OCR داخل Foxit PhantomPDF استفاده کنید که خیلی بهتره ولی فقط روی ویندوز اجرا میشه.
در آخرین مرحله با CyberChef رشته مورد نظرتون را که با base64 رمزگذاری شده، رمزگشایی کنید.
جواب: queraCTF{easy_peasy_ANDR01D_Ch4LLENge}