<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمد حسین آقایی</title>
        <link>https://virgool.io/feed/@MGAghaee</link>
        <description>Application Security Samurai</description>
        <language>fa</language>
        <pubDate>2026-06-16 16:49:05</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2732859/avatar/04N5K6.jpg?height=120&amp;width=120</url>
            <title>محمد حسین آقایی</title>
            <link>https://virgool.io/@MGAghaee</link>
        </image>

                    <item>
                <title>HackTheBox Mobile Challenges (قسمت پنجم. SeeTheSharpFlag)</title>
                <link>https://virgool.io/TMAPT-Presents/hackthebox-mobile-challenges-%D9%82%D8%B3%D9%85%D8%AA-%D9%BE%D9%86%D8%AC%D9%85-seethesharpflag-lm7mbofooezi</link>
                <description>I have made a password verification app. If I can remember the password, the app will tell me it is correct. See if you can guess my password.پس از دانلود و extract کردن فایل های چالش می بینیم که چالش تنها حاوی یک فایل APK می باشد:بهتره که در مرحله اول، اپلیکیشن رو در محیط شبیه ساز بررسی کنیم:خب. می بینیم که برنامه یک ورودی می گیرد و آن را بررسی می کند.نوبت به مهندسی معکوس رسیده:آهااااا! این یه اپلیکیشن زامارینه. به این راحتیا نمیشه عملیات مهندسی معکوس روش انجام داد. بیاید ببینیم که کلا یه اپلیکیشن زامارین چجوری Pack و آماده سازی میشه:https://cihansol.com/blog/index.php/2021/08/09/unpacking-xamarin-android-mobile-applications/پس کد های اپلیکیشن های XAMARIN ابتدا کامپایل و به فایل dll تبدیل می شوند. پس طبیعیه که با یه ابزار ساده مثل JAD-X نشه این اپلیکیشن هارو مهندسی معکوس کرد. چون ساختارشون به کلی با JAVA فرق می کنه. حالا چجوری میتونیم مهندسی معکوسشون کنیم؟در مرحله اول با apktool اپلیکیشن رو دیکامپایل می کنیم. فایل های dll در لوکیشن unknown/assemblies قرار دارند:برای مشاهده محتویات فایل های dll می توانیم از ابزار dnSpy استفاده کنیم که یکی از قدرتمند ترین ابزار ها برای دیباگ کردن اپلیکیشن های بر پایه #C هست:عه!!! اینا که خالی ان!!! بیاید Header های فایل هارو بررسی کنیم ببینیم قضیه از چه قراره:این دیگه چیه؟َ!طبق این نوشته در github، توسعه درهندگان زامارین برای کاهش دادن حجم فایل های apk شروع به استفاده از lz4 compression کردند که به صورت پیشفرض برای دولپر ها، این compression بر روی اپلیکیشن های آن ها اعمال می شود.حالا باید چیکار کنیم؟! کاری نداره! از این اسکریپت پایتون برای decompress کردن فایل SeeTheSharpFlag.dll استفاده می کنیم:https://github.com/x41sec/tools/blob/master/Mobile/Xamarin/Xamarin_XALZ_decompress.pyحالا فایل رو با dnSpy باز می کنیم:این کد یک پیام رمزگذاری شده را با استفاده از رمزگذاری AES رمزگشایی می کند و سپس بررسی می کند که آیا پیام رمزگشایی شده با ورودی ارائه شده توسط کاربر مطابقت دارد یا خیر. بسته به مطابقت یا عدم تطابق، پیام های مختلفی را در یک فیلد خروجی نمایش می دهد که نشان می دهد که آیا کاربر عبارت عبور رمزگشایی صحیح را وارد کرده یا خیر.حالا با استفاده از کد زیر داده ها را رمزگشایی می کنیم:این هم از فلگ ?منتظر نظرات و انتقادات شما هستمدر قسمت های بعدی، به بررسی سایر چالش های موبایل در HackTheBox خواهیم پرداخت ??</description>
                <category>محمد حسین آقایی</category>
                <author>محمد حسین آقایی</author>
                <pubDate>Fri, 01 Sep 2023 21:35:02 +0330</pubDate>
            </item>
                    <item>
                <title>HackTheBox Mobile Challenges (قسمت چهارم. Cryptohorrific)</title>
                <link>https://virgool.io/TMAPT-Presents/hackthebox-mobile-challenges-%D9%82%D8%B3%D9%85%D8%AA-%DA%86%D9%87%D8%A7%D8%B1%D9%85-cryptohorrific-ecue406mxvcu</link>
                <description>چالش Cryptohorrific یک چالش دسته mobile از hackthebox است که در سطح چالش هایی با سطح سختی Medim قرار دارد که به اهمیت ذخیره سازی امن اطلاعات در برنامه اشاره دارد که در ادامه باهمدیگر آن را بررسی می کنیم.پس از دانلود و extract فایل چالش می بینیم که چالش حاوی یک پوشه است:حالا پوشه چی داره؟عجب!! اینا دیگه چین؟اینا فایل های یک اپلیکیشن iOS هستن ?فایل hackthebox که همون فایل اصلی برنامس حاوی باینری های اپلیکیشنه.فایل های plist یک لیست هستند که حاوی جزئیاتی از اپلیکیشن و نویسنده اپلیکیشن است. این داده ها برای گردآوری جزئیات هنگامی که برنامه را در AppStore جستجو می کنید به کار می آید.برای باز کردن و خواندن این فایل ها از ابزار propertree استفاده می کنیم که از طریق لینک زیر می توانید به آن دسترسی پیدا کنید:https://github.com/corpnewt/ProperTreeنگاهی به فایل info.plist می اندازیم:فایل info.plistاما اطلاعات به در بخوری در آن وجود ندارد!!به فایل challenge.plist نگاهی بیندازیم:جالب شد! ظاهر این string مشابه base64 است. اونو دیکد کنیم شاید به فلگ رسیدیم?ای بابا! در واقع این string با الگوریتم AES رمزنگاری شده! پس هنوز چالش تموم نشده.باید کلید رمزنگاری رو هم پیدا کنیم. می تونیم برای این کار از کد های اپلیکیشن استفاده کنیم.به منظور دیکامپایل کردن فایل اپلیکیشن میتونیم از ابزار IDA استفاده کنیم:دوتا String دیگه پیدا کردیم. شاید این کلید رمزنگاری باشه!با استفاده از ابزار آنلاین زیر برای عملیات رمزگشایی اقدام می کنیم:https://www.devglan.com/online-tools/aes-encryption-decryptionاین هم از فلگ?منتظر نظرات و انتقادات شما هستمدر قسمت هایی بعدی به بررسی سایر چالش های موبایل در HackTheBox خواهیم پرداخت ??</description>
                <category>محمد حسین آقایی</category>
                <author>محمد حسین آقایی</author>
                <pubDate>Fri, 25 Aug 2023 23:37:21 +0330</pubDate>
            </item>
                    <item>
                <title>HackTheBox Mobile Challenges (قسمت سوم. APKey)</title>
                <link>https://virgool.io/TMAPT-Presents/hackthebox-mobile-challenges-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-apkey-axx5dkbyxsa6</link>
                <description>چالش APKey یک چالش دسته موبایل از HackTheBox است که به اهمیت انجام مبهم نگاری یا obfuscation در اپلیکیشن ها و تاثیر hook کردن توابع در انجام عملیات تست نفوذ اپلیکیشن اشاره می کند که در این قسمت به آن می پردازیم.پس از دانلود و extract کردن فایل چالش، می بینیم که چالش حاوی یک فایل apk می باشد:ابتدا بیایید در محیط شبیه ساز، نگاهی به اپلیکیشن بیندازیم:اپلیکیشن ما یک صفحه login است که یک ورودی user و یک ورودی password از کاربر می خواهد و نتیجه login را با استفاده از Toast Message به ما نشان می دهد.اکنون به بررسی سورس کد های اپلیکیشن می پردازیم:کد در یک بلوک try محصور شده است، که نشان می دهد هر استثنایی در این بلوک گرفته می شود و پردازش می شود. بررسی می کند که آیا متن ورودی از یک نمای به نام f928c در MainActivity که همان ورودی Username ما در برنامه است، برابر با رشته &quot;admin&quot; است یا خیر. اگر ورودی برابر با &quot;admin&quot; باشد، کد با استفاده از الگوریتم MD5، محتوای نمای دیگری به نام d که همان ورودی Password در برنامه ماست را هش می کند. سپس هش حاصل با مقدار هش مورد انتظار &quot;a2a3d412e92d896134d9c9126d756f&quot; مقایسه می شود.اگر هش با مقدار مورد انتظار مطابقت داشته باشد، یک Toast Message با محتوای بازگردانده شده توسط ورودی ها، نمایش داده می شود.اگر ورودی برابر با &quot;admin&quot; نباشد یا اگر هش با مقدار مورد انتظار مطابقت نداشته باشد، یک پیام نان تست نشان می دهد که &quot;!Wrong Credentials&quot; را نشان می دهد.توجه داشته باشید که استفاده از 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 خواهیم پرداخت ??</description>
                <category>محمد حسین آقایی</category>
                <author>محمد حسین آقایی</author>
                <pubDate>Fri, 25 Aug 2023 00:54:39 +0330</pubDate>
            </item>
                    <item>
                <title>HackTheBox Mobile Challenges (قسمت دوم. Cat)</title>
                <link>https://virgool.io/TMAPT-Presents/hackthebox-mobile-challenges-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-cat-rban9koe8rl9</link>
                <description>در این قسمت از سری چالش های موبایل HackTheBox می خواهیم چالش Cat را مورد بررسی قرار بدهیم:ابتدا پس از دانلود و extract کردن فایل Zip می بینیم که یک فایل با فرمت ab. در آن وجود دارد:یک فایل AB یک نسخه پشتیبان از برخی یا همه داده های ذخیره شده در دستگاه اندرویدی کاربر است. کاربران با استفاده از Android Debug Bridge (ADB)، فایل‌های AB را ایجاد می‌کنند. فایل های AB اغلب با استفاده از رمز عبور ایجاد شده توسط کاربر رمزگذاری می شوند.ابزار های زیادی برای استخراج داده های فایل های ab. وجود دارد که در اینجا از ابزار abe یا android backup extractor استفاده می کنیم.ابزار abe را می توانید از طریق لینک زیر دانلود نمایید:https://github.com/nelenkov/android-backup-extractor/releasesاکنون داده های فایل cat.ab در فایل catextract.zip استخراج شده اند.داده های کاربران در فایل های ab. در فولدر shared قرار دارند:تمام فولدر ها خالی هستند به جز Pictures!!!شاید چیزی که به دنبال آن هستیم در عکس ها پنهان شده است!عکس IMAG0004.jpg متفاوت است!این هم از فلگ?می بینیم که فلگ داخل یک عکس جا سازی شدهاین چالش به ما اهمیت حفاظت از فایل های بک آپ و استفاده از رمزنگاری برای حفاظت از آنها را نشان داد.منتظر نظرات و انتقادات شما هستمدر قسمت هایی بعدی به بررسی سایر چالش های موبایل در HackTheBox خواهیم پرداخت ??</description>
                <category>محمد حسین آقایی</category>
                <author>محمد حسین آقایی</author>
                <pubDate>Fri, 04 Aug 2023 13:06:37 +0330</pubDate>
            </item>
                    <item>
                <title>HackTheBox Mobile Challenges (قسمت اول. Don&#039;t Overreact)</title>
                <link>https://virgool.io/TMAPT-Presents/hackthebox-mobile-challenges-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-dont-overreact-snz2xkj3e9zf</link>
                <description>چالش Don&#x27;t Overreact یک چالش دسته موبایل از HackTheBox است که به اهمیت تجزیه و تحلیل استاتیک اپلیکیشن ها اشاره می کند. اگر آسیب‌پذیری موجود در این چالش را با OWASP Mobile Top 10 مقایسه کنیم، در دسته Insecure Data Storage قرار می‌گیرد.روش های زیادی برای انجام دادن این چالش وجود دارد که در ادامه، یکی از این روش ها را بررسی خواهیم کرد.قدم اول:در قدم اول، پس از دانلود فایل ها از HackTheBox فایل زیپ را extract می کنیم و می بینیم که این چالش تنها یک فایل apk دارد:قدم دوم:مهم ترین بخش عملیات Static Analysis اپلیکیشن ها، انجام عملیات مهندسی معکوس است. مهندسی معکوس به ما اجازه می دهد تا به Source Code های اپلیکیشن دست پیدا کنیم و به درک مناسبی از فرآیند برنامه برسیم. برای انجام مهندسی معکوس در اپلیکیشن های اندروید ابزار های زیادی موجود است که در اینجا از ابزار jadx-gui به دلیل سهولت کار با این ابزار استفاده می کنیم. با استفاده از open file فایل apk مورد نظر را انتخاب می کنیم:اکنون به تجزیه و تحلیل کد های java می پردازیم:در کد buildconfig چیزی که ما را به فلگ برساند وجود ندارد.بیایید به کد MainActivity نگاهی بیندازیم:این کد یک کلاس جاوا اندروید است که ReactActivity را که بخشی از چارچوب React Native است گسترش می دهد. React Native به توسعه دهندگان اجازه می دهد تا برنامه های تلفن همراه را با استفاده از جاوا اسکریپت و React بسازند، در حالی که بخش های اصلی برنامه به زبان جاوا (برای اندروید) یا Objective-C/Swift (برای iOS) نوشته شده است.1- کد در پکیج com.wesomeproject قرار داده شده است. کلاس ReactActivity را از پکیج com.facebook.react وارد می کند. ReactActivity یک کلاس از پیش ساخته شده توسط چارچوب React Native است که به عنوان Base Activity برای برنامه React Native عمل می کند:package com.awesomeproject;
import com.facebook.react.ReactActivity;2- ین خط کلاس MainActivity را تعریف می کند که کلاس ReactActivity را گسترش می دهد. با گسترش ReactActivity، این کلاس عملکردی را به ارث می برد که آن را قادر می سازد یک برنامه React Native را اجرا کند:public class MainActivity extends ReactActivity {3- متدهای override شده:@Override
protected String getMainComponentName() {
return &amp;quotAwesomeProject&amp;quot
}این کد متد ()getMainComponentName را از کلاس ReactActivity لغو یا override می کند. هدف از این متد تعیین نام جزء اصلی برنامه React Native است. در این مورد، جزء اصلی &quot;AwesomeProject&quot; است.مولفه Main component  ریشه کل برنامه React Native است. این نقطه شروعی است که کد جاوا اسکریپت در آن اجرا می شود و معمولا نمای سطح بالای برنامه یا صفحه نمایش را نشان می دهد.با برگرداندن «AwesomeProject»، این کلاس MainActivity نشان می‌دهد که مؤلفه اصلی این برنامه در فایل جاوا اسکریپت با همین نام، یعنی AwesomeProject.js تعریف شده است.به طور خلاصه، این کد یک کلاس جاوا اندروید است که به عنوان entry point برای یک برنامه React Native به نام &quot;AwesomeProject&quot; عمل می کند. جزء اصلی برنامه در فایل جاوا اسکریپت با نام &quot;AwesomeProject.js&quot; تعریف شده است.اکنون بیایید نگاهی به کد MainApplication بیندازیم:این کد تعریف کلاس MainApplication در پروژه جاوا اندروید برای یک برنامه React Native است. بیایید گام به گام کد را مرور کنیم:1- این کد در پکیج com.wesomeproject قرار می گیرد و شامل دستورات import کتابخانه های ضروری برای کلاس های مختلف اندروید و React Native است:package com.awesomeproject;
import android.app.Application;
import android.content.Context;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;
import java.util.List;2- این خط، کلاس MainApplication را تعریف می کند که کلاس Android Application را گسترش می دهد و رابط ReactApplication را پیاده سازی می کند. با پیاده سازی رابط ReactApplication، این کلاس نشان می دهد که به عنوان کلاس برنامه اصلی برای برنامه React Native عمل می کند:public class MainApplication extends Application implements ReactApplication {3- این بلوک کد نمونه ای از ReactNativeHost را ایجاد می کند که کلاسی است که توسط React Native برای کنترل مقدار دهی اولیه و پیکربندی React Native Runtime ارائه می شود. این پل ارتباطی بین کد اصلی اندروید و کد جاوا اسکریپت در برنامه React Native است:private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
// ...
};در اینجا 3 متد override می شود:getJSMainModuleName():این متد، نام فایل اصلی جاوا اسکریپت را در پروژه React Native مشخص می کند. در این مورد، &quot;index&quot; است، به این معنی که نام entry point اصلی index.js است.protected String getJSMainModuleName() {
return &amp;quotindex&amp;quot
}getUseDeveloperSupport():این متد نشان می دهد که آیا developer mode برای برنامه React Native فعال شود یا خیر. مقدار false را برمی‌گرداند، بنابراین developer support (مانند گزینه های debugging) غیرفعال است.public boolean getUseDeveloperSupport() {
return false;
}getPackages():این متد لیست پکیج های React Native را که باید در برنامه load شوند، بازیابی می کند. کلاس PackageList برای به دست آوردن این بسته ها استفاده می شود و آنها را بر اساس پیکربندی که در فایل android/app/build.gradle موجود است را fetch می کند.protected List&lt;ReactPackage&gt; getPackages() {
return new PackageList(this).getPackages();
}4- کد زیر یک متد خالی است و در برنامه هیچ استفاده ای از آن نشده:private static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
// Empty method body
}5- این دو متد متدهای مربوطه تعریف شده در کلاس های ReactApplication و Application را override می کنند:@Override
public ReactNativeHost getReactNativeHost() {
return this.mReactNativeHost;
}
@Override
public void onCreate() {
super.onCreate();
SoLoader.init((Context) this, false);
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
}getReactNativeHost():این متد نمونه ReactNativeHost را که قبلا ایجاد شده بود برمی گرداند. این به سایر اجزای برنامه اجازه می دهد تا به نمونه ReactNativeHost دسترسی داشته باشند.onCreate():این متد بخشی از lifecycle برنامه اندروید است و به طور خودکار هنگام شروع برنامه فراخوانی می شود. در این روش SoLoader مقداردهی اولیه می شود که یک بارگذار کتابخانه بومی است که توسط React Native استفاده می شود. این مسئول بارگیری کتابخانه های بومی مورد نیاز در React Native runtime است. علاوه بر این، متد ()initializeFlipper (که همانطور که قبلاً ذکر شد در این مورد خالی است) فراخوانی می شود، اگرچه هیچ تأثیر عملکردی در کد ارائه شده ندارد.به طور خلاصه، این کد کلاس MainApplication را برای یک برنامه اندروید React Native تعریف می کند. ReactNativeHost را راه‌اندازی می‌کند، پیکربندی‌های لازم را فراهم می‌کند و SoLoader را برای React Native runtime مقداردهی اولیه می‌کند. کلاس MainApplication به عنوان entry point اصلی برای بخش React Native از برنامه عمل می کند و امکان ادغام یکپارچه React Native با کد اصلی اندروید را فراهم می کند.اما نکته ای که در همان ابتدای تحلیل کد MainActivity می توانست ما را به flag نزدیک کند این است برنامه های React Native در اندروید از کد های JavaScript پیروی می کنند و در نتیجه متوجه می شویم که کد های اصلی اپلیکیشن، کد های جاوا نیستند?در واقع کد های JavaScript اصلی در Bundle و در زیر مجموعه Resources/assets که در فایل index.android.bundle ذخیره شده اند قرار دارد.با بررسی این فایل می بینیم که این کد یک API را call می کند که احتمال می دهیم این ما را به flag برساند:با decode کردن این کد base 64 به نتیجه جالبی می رسیم:این هم از فلگ ?منتظر نظرات و انتقادات شما هستمدر قسمت های بعدی، به بررسی سایر چالش های موبایل در HackTheBox  خواهیم پرداخت ??</description>
                <category>محمد حسین آقایی</category>
                <author>محمد حسین آقایی</author>
                <pubDate>Fri, 28 Jul 2023 22:46:16 +0330</pubDate>
            </item>
            </channel>
</rss>