HackTheBox Mobile Challenges (قسمت سوم. APKey)

چالش APKey یک چالش دسته موبایل از HackTheBox است که به اهمیت انجام مبهم نگاری یا obfuscation در اپلیکیشن ها و تاثیر hook کردن توابع در انجام عملیات تست نفوذ اپلیکیشن اشاره می کند که در این قسمت به آن می پردازیم.

پس از دانلود و extract کردن فایل چالش، می بینیم که چالش حاوی یک فایل apk می باشد:

ابتدا بیایید در محیط شبیه ساز، نگاهی به اپلیکیشن بیندازیم:

اپلیکیشن ما یک صفحه login است که یک ورودی user و یک ورودی password از کاربر می خواهد و نتیجه login را با استفاده از Toast Message به ما نشان می دهد.

اکنون به بررسی سورس کد های اپلیکیشن می پردازیم:

کد در یک بلوک try محصور شده است، که نشان می دهد هر استثنایی در این بلوک گرفته می شود و پردازش می شود.

بررسی می کند که آیا متن ورودی از یک نمای به نام f928c در MainActivity که همان ورودی Username ما در برنامه است، برابر با رشته "admin" است یا خیر.

اگر ورودی برابر با "admin" باشد، کد با استفاده از الگوریتم MD5، محتوای نمای دیگری به نام d که همان ورودی Password در برنامه ماست را هش می کند. سپس هش حاصل با مقدار هش مورد انتظار "a2a3d412e92d896134d9c9126d756f" مقایسه می شود.

اگر هش با مقدار مورد انتظار مطابقت داشته باشد، یک Toast Message با محتوای بازگردانده شده توسط ورودی ها، نمایش داده می شود.

اگر ورودی برابر با "admin" نباشد یا اگر هش با مقدار مورد انتظار مطابقت نداشته باشد، یک پیام نان تست نشان می دهد که "!Wrong Credentials" را نشان می دهد.

توجه داشته باشید که استفاده از MD5 برای هش کردن رمزهای عبور به دلیل آسیب پذیری آن در برابر Collision Attacks، ناامن تلقی می شود. به طور کلی توصیه می شود از الگوریتم های هش ایمن تر مانند bcrypt یا Argon2 برای ذخیره اطلاعات حساس مانند رمز عبور استفاده کنید.

اما ما متن هش نشده یا clear text را نمیدانیم :(

بنابرین باید برای دور زدن صفحه لاگین، باید شرط تابع را در Runtime تغییر دهیم به طوری که شرط ما از برابری به نابرابری تغییر پیدا کند.

همانطور که میدانید کد های runtime در فایل smali به شکل dvm opcode ترجمه و ذخیره می شوند.

بیایید نگاهی به کد های smali برنامه بیندازیم:

در قسمت اول کد dvm opcode ها می بینیم که مقدار هش ما به همراه یک کد با عنوان زیر قرار دارد:

if-eqz p1, :cond_1

کد های cond_1 نیز در بخش دوم کد مشاهده می کنیم.

در نگاه اول شاید این طور برداشت کنید که if-eqz p1, :cond_1 به این معناست که اگر ورودی هش شده برابر با هش ما برابر بود cond_1 اجرا شود و cond_1 هم کدی است که پیام Wrong Credentials را نشان می دهد.

چه شد؟!!?

مگر قرار نبود که اگر ورودی هش شده با هش برابر باشد به ما پیام موفقیت آمیز بودن را نشان بدهد؟!!!! ?

چرا! قرار بود و هست. DVM Opcode ها مفهوم متفاوتی دارند.

در DVM Opcode ها، if-eqz به این معناست که آیا مقدار در ثبات p1 برابر با صفر است یا خیر. (صفر به معنا false طلقی می شود) اگر برابر با صفر بود، تابعی که به ما پیام wrong credentials را نشان می دهد اجرا کن.

رجیسترها در زبان اسمالی با p و سپس یک عدد نمایش داده می شوند. p1 به مقدار ذخیره شده در ثبات 1 اشاره دارد

پس باید عکس این شرط را برقرار کنیم.

چگونه؟

این گونه ??

برای تحلیل کد های smali و Dalvik Opcode ها می توانید از راهنما زیر کمک بگیرید:

http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

پس برای عکس کردن این شرط، if-eqz را با if-nez جا به جا میکنیم:

فایل را save می کنیم. اکنون نوبت آن رسیده که اپلیکیشن را build کرده و آن را در شبیه ساز اندروید خود قرار بدهیم:

اما یک مشکلی هست. مشکل این است که برنامه sign نشده. پس باید آن را sign کنیم. برای انجام این مار می توانیم از اپلیکیشن apksigner استفاده کنیم که می توانید از طریق لینک زیر آن را دانلود کنید:

https://m.apkpure.com/apk-signer/com.haibison.apksigner/download

در برنامه فایل apk خود را باز می کنیم و مراحل زیر را طی می کنیم:

سپس اپلیکیشن sign شده را نصب می کنیم:

پس از نصب برنامه آن را باز می کنیم و تست می کنیم:

و تمام ?

حال اگر هر ورودی دیگری (به جز متن clear text شده هش تایین شده) در برنامه وارد کنیم، برنامه به ما flag را نشان می دهد?

امیدوارم که از مطالعه این writeup لذت برده باشید

منتظر نظرات و انتقادات شما هستم

در قسمت های بعدی، به بررسی سایر چالش های موبایل در HackTheBox خواهیم پرداخت ??