برنامه نویسی

همیشه برنده در Juwenalia: هک کردن پاداش از مینی بازی های برنامه جشنواره

آه ، جوونالیا. اگر دانشجوی لهستان هستید ، به خصوص در اینجا در کراکوف ، دقیقاً می دانید این به چه معنی است. آن زمان از سال است که شهر به زمین بازی دانشجویی تبدیل می شود. کلاس های UNI به حالت تعلیق در می آیند و روزهای پر از کنسرت ، رویدادها و مقدار قابل توجهی آبجو را جایگزین می کنند.

پشت پرده

سال گذشته ، در کنار جشن های معمول ، برگزارکنندگان “Jueappka” را معرفی کردند. این برنامه که توسط یک پیمانکار شخص ثالث تهیه شده است ، وعده قطره ای از کالاهای Juwenalia-کیف های Tote ، تی شرت ها ، آبجو در خانه Juwe و سایر جوایز جالب را داده است. مکانیک ساده بود – هر دستگاه می تواند در هر قطره یک “بلیط قرعه کشی” را مطالبه کند. در یک زمان خاص از روز ، به یک دکمه در برنامه ضربه می زنید ، و اگر شانس در کنار شما بود ، می توانید یک جایزه گره خورده به شناسه دستگاه خود کسب کنید.

این یک فرصت جالب ارائه داد. از آنجا که جوایز فقط به یک شناسه دستگاه پیوند داده می شد و نصب مجدد برنامه باعث ایجاد شناسه جدید می شود ، فهمیدم که می توانم این روند را خودکار کنم. یک نگاه سریع با mitmproxy، سادگی پس زمینه را فاش کرد. نقاط پایانی کاملاً محافظت نشده بود – آنها شناسه دستگاه را مصرف کردند و در صورت برنده شدن ، جزئیات جایزه را برگردانند ، یا اگر این کار را نکردید ، یک آرایه خالی است. هیچ تأیید اعتبار یا اعتبار واقعی پیچیده وجود ندارد.

من به سرعت یک اسکریپت کوچک Node.js را که می تواند شناسه دستگاه تصادفی ایجاد کند ، در زمان تعیین شده به نقطه انتهایی قرعه کشی ارسال کردم و دیدم که آیا برنده شده است. با اجرای این اسکریپت بارها با شناسه های مختلف ، می توانم جوایز بی شماری و واقعی را در این دستگاه های مجازی جمع کنم.

اما چگونه می توان همه این جوایز را در تلفن واقعی خود جمع کرد؟ اینجاست mitmproxy دوباره به بازی برگشت ، این بار برای توانایی خود در اصلاح ترافیک در پرواز. من می توانم درخواست برنامه واقعی را برای واکشی لیست جوایز برنده برای من رهگیری کنم واقعی شناسه دستگاه سپس ، من می توانم پاسخ سرور را تغییر دهم و تمام داده های جایزه ای را که از بسیاری از دستگاه های مجازی خود جمع آوری کرده ام تزریق کنم. برنامه ، هیچکدام از عاقل تر ، این لیست ترکیبی از جوایز را به نمایش می گذارد و به من این امکان را می دهد که همه آنها را یکباره ادعا کنم. این احساس کمتر شبیه به تقلب و بیشتر شبیه … جمع آوری جایزه کارآمد ، استفاده از طراحی سیستم است. پس از همه ، هر کسی می توانست برنامه را به طور مکرر دوباره نصب کرده اند. من فقط روند کار را خودکار کردم.

سریع به جلو امسال. Juweappka برگشته است ، اما این بار یک تولید داخلی است که با React بومی ساخته شده و توسط Firebase پشتیبانی می شود. قرعه کشی ساده از بین رفته است ، جایگزین مینی بازی های جذاب تر-فکر کنید مکانیک کلیک کوکی یا چالش های میوه در حال سقوط ، کامل با تابلوهای. بازیکنان برتر در پایان روز جوایز آرزو را به دست می آورند.

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2a58aej0e8roeqi4gcr

تصویری که یکی از مینی بازی ها را نشان می دهد.

از نظر مهم ، آنها یک سیستم حساب را پیاده سازی کرده اند. این یک تغییر قابل توجه است. در حالی که از کلاهبرداری شناسه ساده در سال گذشته جلوگیری می کند ، اما مجموعه جایزه را نیز ساده می کند. اکنون می توانم به طور بالقوه نمره خود را در یک شبیه ساز دستکاری کنم و سپس به راحتی در تلفن فیزیکی خود وارد حساب خود شوم تا هرگونه جوایز برنده را جمع آوری کنم ، بدون اینکه نیاز به جعل درخواست لیست جایزه نهایی داشته باشم.

فرایند فکر اولیه من ساده بود: برنامه باید از طریق درخواست پست برای به روزرسانی صفحه رهبری ، نمره من را به سرور ارسال کند. اگر می توانم با استفاده از این درخواست را رهگیری کنم mitmproxy، من می توانم قبل از رسیدن به سرور ، ارزش نمره را ویرایش کنم ، و به طور مصنوعی رتبه خود را در تابلوی رهبری افزایش می دهد. آسان ، درست است؟

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

راه اندازی

خوب ، پس بیایید وارد این موضوع شویم. در اینجا لیست ترکیباتی که باید دنبال کنید آورده شده است:

  1. شبیه ساز اندرویدی: شما به ریشه دار Android Emulator ، ترجیحاً یک تصویر انتشار را با خدمات Google Play نصب کرده است. من نسخه های قدیمی را هدف قرار می دهم ، اما هنوز هم از نسخه های اندرویدی پشتیبانی می کردم. نصب Magisk روی شبیه ساز بسیار توصیه می شود. برای انجام این کار می توانید از MagiskOnemulator استفاده کنید.
  2. mitmproxy وت frida ابزارها: اطمینان حاصل کنید که هر دو در دستگاه میزبان خود نصب کرده اید. برای MITMProxy همچنین باید گواهی CA خود را در فروشگاه گواهی سیستم Android در شبیه ساز خود نصب کنید. Magisk این کار را با یک ماژول به طور قابل توجهی آسانتر می کند. همچنین باید شبیه ساز خود را پیکربندی کنید تا تمام ترافیک را از طریق پروکسی که روی دستگاه خود اجرا می شود ، مسیریابی کنید. در حالی که روش های مختلفی برای نزدیک شدن به حملات MITM وجود دارد ، من به طور کلی CA را به فروشگاه سیستم اضافه می کنم و از FRIDA برای دور زدن گواهینامه SSL به هر حال استفاده می کنم زیرا اغلب به طرز شگفت آور بی دردسر است. Magisk همچنین در اینجا بسیار ارزشمند است ، از ماژول Magisk-Frida استفاده کنید.

توجه داشته باشید که موارد زیر را می توان در دستگاه Android غیر ریشه ای با استفاده از Gadget Frida که مستقیماً در APK قرار می گیرد ، انجام داد.

اعدام

هدف ساده بود: یک بازی را انجام دهید ، هنگام ارسال نمره ، ترافیک شبکه را ضبط کنید و درخواست مربوطه را شناسایی کنید.

من یکی از مینی بازی ها را شلیک کردم ، کمی بازی کردم تا نمره غیر صفر کسب کنم و دور را تمام کردم. همانطور که انتظار می رفت ، mitmproxy بلافاصله فعالیت شبکه را نشان داد. با استفاده از درخواست ها ، من به سرعت مشاهده کردم POST درخواست یک نقطه پایانی Firebase ارسال کرد ، که احتمالاً حاوی به روزرسانی نمره من است.

POST https://REDACTED_URL/result HTTP/2.0
authorization: Bearer REDACTED_JWT
authtoken: f9c32a74560ef09523a21f7798c836dcc17448a7f0bc7b03d121015779922bf4
game: lap_co_leci
content-type: application/json
content-length: 12
accept-encoding: gzip
user-agent: okhttp/4.9.2

{"score":91}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

فکر اولیه من تأیید شد: وجود دارد score زمینه در بار JSON. اصلاح آن با پروکسی بسیار آسان است. اما بعد متوجه آن شدم – authtoken هدر در حال حاضر مجوز JWT وجود دارد و این به نظر می رسد … متفاوت است. رشته ای طولانی از شخصیت های هگز.

بعد از بازی چند بار دیگر با نمرات مختلف ، الگویی را مشاهده کردم: authtoken ارزش هر زمان که نمره تغییر کند تغییر می کند ، اما دو بازی با دقیقاً همان نمره منجر به دقیقاً همان Authtokenبشر این به شدت پیشنهاد می کند authtoken یک نشانه جلسه تصادفی نبود ، بلکه مقداری است که مستقیماً از خود نمره گرفته می شود ، احتمالاً نوعی هش است. با توجه به طول و ظاهر آن ، یک هش SHA-256 به نظر می رسید که نامزد اصلی است.

این یک الگوی امنیتی متداول ، البته غالباً کافی نیست. سرور احتمالاً با استفاده از نمره دریافت شده و یک کلید مخفی (نمک یا پیشوند) هش را در پایان خود محاسبه می کند و آن را با آن مقایسه می کند authtoken ارائه شده توسط مشتری. اگر مطابقت داشته باشند ، نمره معتبر تلقی می شود.

برنامه ساده من برای تغییر نمره در بدنه درخواست ، به یک سد جاده برخورد کرد. اگر من فقط نمره را تغییر دادم ، authtoken با محاسبه سرور مطابقت نخواهد داشت و درخواست رد می شود. من نیاز به تولید معتبر authtoken برای نمره مورد نظر و مصنوعی بالا.

این دقیقاً در جایی است که فریدا می درخشد – این امکان را به ما می دهد تا در فرآیند درخواست در حال اجرا قرار بگیریم. از آنجا که این برنامه قبل از ارسال درخواست ، این عملیات هشدار را به صورت محلی انجام می دهد ، می توانم از فریدا استفاده کنم تا به توابع رمزنگاری بومی که توسط برنامه بومی React خوانده می شود ، استفاده کنم. این رویکرد از این رو کاملاً ظریف است ما لازم نیست که Bytecode Compled Messy Compiled Hermes را اصلاح یا حتی بخوانیم – به جای آن ، پلتفرم را اصلاح می کنیم!

با رهگیری فراخوان به عملکرد هشدار (مانند اجرای SHA-256) ، می توانم داده های ورودی را که در آن تغذیه می شود وارد کنم-این ورودی احتمالاً نمره همراه با نمک/پیشوند مخفی خواهد بود. هنگامی که من آن قالب ورودی را داشتم ، می توانم خودم فرآیند هش را تکرار کنم و معتبر تولید کنم authtoken برای هر نمره ای که می خواستم.

نوشتن یک اسکریپت فریدا برای قلاب توابع رمزنگاری بومی هنگامی که می دانید به دنبال چه چیزی هستید ، به طرز حیرت انگیزی ساده است. فریدا یک موتور JavaScript کامل را به فرآیند هدف تزریق می کند و به شما قدرت باورنکردنی برای بازرسی ، اصلاح و ردیابی تماس های عملکرد در زمان اجرا می دهد.

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

function bytesToString(buffer) {
  var str = '';
  for (var i = 0; i < buffer.length; i++) {
    str += String.fromCharCode(buffer[i]);
  }
  return str;
}

Java.perform(function () {
  // Find the class that we want to hook
  var MessageDigest = Java.use('java.security.MessageDigest');

  // Replace native implementation with our JS hook
  MessageDigest.update.overload('[B').implementation = function (inputBytes) {
    var algorithm = this.getAlgorithm();
    if (algorithm.toUpperCase() === "SHA-256") {
      console.log("[*] MessageDigest.update called with SHA-256 algorithm.");

      var stringInput = bytesToString(inputBytes);
      console.log("[*] SHA-256 input (string): " + stringInput);
    }

    // Call the original method
    this.update(inputBytes);
  };

  console.log("[*] MessageDigest hooks installed for SHA-256.");
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

بلافاصله پس از تزریق فیلمنامه و بازی ، خروجی کنسول از فریدا راز را فاش کرد:

$ frida -U -f com.kuvus.juwenalia_krakowskie -l unpin.js -l sha_hook.js
Spawning `com.kuvus.juwenalia_krakowskie`...
Spawned `com.kuvus.juwenalia_krakowskie`. Resuming main thread!
[Android Emulator 5554::com.kuvus.juwenalia_krakowskie ]-> [*] MessageDigest hooks installed for SHA-256.
(...)

[*] MessageDigest.update called with SHA-256 algorithm. 
[*] SHA-256 input (string): jsjkek-91
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

آنجا بود! رشته ورودی به هش SHA-256 رشته تحت اللفظی “jsjkek-” بود که با نمره همراه بود.

sha256("jsjkek-91") ->
"f9c32a74560ef09523a21f7798c836dcc17448a7f0bc7b03d121015779922bf4"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این کلید بود. با mitmproxy برای رهگیری و اصلاح بدنه درخواست (تعیین نمره بالا مورد نظر) و امکان تولید صحیح authtoken با استفاده از پیشوند کشف شده ، اکنون می توانم هر نمره ای را که می خواستم به تابلوی رهبری ارسال کنم. این به طور موثری مکانیسم اعتبار سنجی نمره را دور می کند و امکان ارسال نمره دلخواه را فراهم می کند.

در مورد اینکه آیا من واقعاً از این روش برای صعود به تابلوی رهبری و ادعای جوایز استفاده کردم … خوب ، به من توصیه شده است که در مورد آن اظهار نظر نکنم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا