نگاره‌هایی پیرامون امنیت، شبکه و رمزنگاری

18 سپتامبر 2020

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

فیشینگ چیست؟

 فیشینگ راهی است که تبهکاران، اطلاعاتی نظیر کلمه کاربری، رمز عبور، شماره 16 رقمی عابر بانک، رمز دوم و CVV2 را از طریق ابزارهای الکترونیکی ارتباطات به سرقت می برند.

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


قضیه از این توئیت شروع شد (همچنین این چند روز توئیت‌هایی دیدم که فهمیدم خیلیا به دام فیشینگ افتادن. مثلا این کاربر که ۵۰ میلیون تومان ازش سرقت شده، و یا مثلا کاربرانی که اصلا راجع به این حمله چیزی نمیدونن، نمونه آخر هم برادر یک کاربر فنی‌تر که طعمه شد) که من به فکر نوشتن این نوشتار افتادم. به نظرم بهتره پست رو از این سوال شروع کنیم که آیا استفاده از رمز پویا امن است؟ جواب به این سوال کمی دشوار هست، چون امنیت مطلق وجود نداره و باید دید نسبی به این قضیه داشته باشیم. جواب سریع و نادقیق به این سوال خیر است.

اما پس از آن سریعا سوال دیگه‌ای توی ذهن تشکیل می‌شه که چرا رمز پویا جایگزین رمز ایستا شد؟ به دلیل اینکه امنیت کاربر در پرداخت آنلاین با رمز پویا نسبت به رمز ایستا افزایش پیدا می‌کند و بدیهی است که این افزایش به معنی امنیت مطلق نیست. اگه بخواهیم عملکرد رمز پویا رو نسبت به رمز ایستا بررسی کنیم، باید وضعیت قبل و بعد رو بررسی کنیم که موضوع این نوشتار نیست. ما امروز میخوایم ببینیم که با وجود رمز پویا، انجام فیشینگ چطور قابل انجام هست. البته این نکته رو اضافه کنم که این بحث پیشتر نیز توی توئیتر مطرح شده بود.

نتیجه‌گیری و راه‌حل

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

از کجا بفهمیم سایت اصلی است؟

تمامی درگاه‌های پرداخت موظف هستند زیر نظر شاپرک کار کنند. بنابراین باید آدرس اون‌ها یک زیردامین از shaparak.ir باشه. پس تا وقتی که آدرس‌بار مرورگر رو نگاه نکردید و آدرس شاپرک رو با دقت ندیدین، پرداختی انجام ندید.

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

  • یک مهاجم با زحمت اندک با نااگاهی کاربر قادر به سرقت از کارت کاربران است
  • رمز پویا نسبت به رمز ایستا امن‌تر است، اما امنیت کامل رو به کاربر نمی‌دهد
  • طبق بررسی‌های ما، درگاه‌های پرداخت، تلاش زیادی در جلوگیری از فیشینگ انجام نداده‌اند و ما موفق شدیم روی همه درگاه‌ها، با صرف اندک وقت، فیشینگ (آزمایشی) رو انجام بدهیم، فقط و فقط سازوکار رمز پویا رو بدون در نظر گرفتن موارد امنیتی پیاده‌سازی کرده‌اند، در ادامه جدول مربوط به بررسی امنیت درگاه‌ها گذاشته می‌شود
  • اکثر حملات فیشینگ از طریق برنامه‌های موبایل که در کانال‌های تلگرامی و اپلیکیشن بازار است روی گوشی کاربران نا‌آگاه پخش می‌شوند (بدیهیه که مقصود برتری یا ضعف گوگل‌پلی و کافه‌بازار نیست، چرا که فیشِرها برنامه‌های مخرب خود رو اکثرا توی کافه‌بازار و نه گوگلی‌پلی منتشر می‌کنند، البته این بدین معنی نیست که عملکرد کافه‌بازار توی این قسمت قابل نقد نباشه، حداقل برای شخص من که کمی از جزئیات کارهاشون اطلاع دارم، ولی خب می‌دونم دارن یه‌کارایی می‌کنن)
  • افزونه‌هایی که توی اینترنت هست مثل افزونه فیشینگ ماهر اصلا کمکی نمی‌کنه (عقیده شخصی من اینه مضر هم هست، چرا که حس کاذب امنیت به کاربر میده، دقیقا مثل رمز پویا)
  • از افسانه‌ها و اطلاعات غلطی که راجع به فیشینگ به شما میدن دوری کنید.
این تصویر دارای صفت خالی alt است؛ نام پروندهٔ آن Screen-Shot-2020-09-16-at-7.59.16-PM-1024x342.png است

در این قسمت سعی کردیم این حمله رو برای شما شبیه‌سازی کنیم. کافیه روی این لینک کلیک کنید تا با یک درگاه پرداخت جعلی روبرو بشید (دیگه کار نمی‌کنه، درگاه فیلتر شد، منم برش داشتم). البته جای نگرانی نیست، این درگاه فقط برای اثبات و درک بهتر حملات فیشینگ طراحی شده و در صورت پرداخت موفق، مبلغ ۱۰۰۰ تومان از حساب شما کم شده و به یک خیریه (محک) کمک می‌شود. همچنین هیچ اطلاعاتی از شما ذخیره نمی‌شود (این قسمت رو باید به ما اعتماد کنید که اگه خودم بودم اعتماد نمی‌کردم). همان‌طور که مشاهده می‌کنید، اطلاعات پرداخت اعم از نام پذیرنده، مبلغ قابل پرداخت و موارد دیگه به راحتی قابل تغییر است. پس می‌تونید در جمع خانواده یک بار این کار را انجام دهید که هم بقیه اعضا خطر را با چشم خود ببیند و هم کمکی هرچند کوچک به یک خیریه کرده باشید. اگه نمی‌خواین از درگاه استفاده کنید، کافیه فیلم زیر رو ببینید من با توضیحات یک پرداخت رو انجام می‌دم:

تحلیل فنی فیشینگ رمز پویا

خب توی این قسمت شمای کلی از جریانِ کاری پرداخت ترسیم شده. البته قابل ذکر هست که این جریانِ کاری بسیار خلاصه شده، نسخه کامل‌تر اون رو می‌تونید در این پست (شارژ نامحدود حساب mytehran.ir) مطالعه کنید.

به ترتیب خطوط رو توضیح میدم:

  1. کاربر بعد از نهایی شدن سبد خرید، دکمه پرداخت رو فشار میده
  2. در یک کانال ارتباطی بین فروشگاه و سامانه پرداخت، فاکتور جدید صادر میشه
  3. اطلاعات فاکتور برای پرداخت توسط فروشگاه در اختیار کاربر قرار می‌گیره، در این قسمت کاربر به سمت درگاه پرداخت هدایت خودکار میشه
  4. کاربر اطلاعات کارت رو وارد می‌کنه و پرداخت رو انجام میده (رمز یک‌بار مصرف رو می‌تونه از طریق اپلیکیشن و یا پیامک دریافت کنه)، در صورت درست بودن اطلاعات، پرداخت انجام میشه و کاربر به‌صورت خودکار به فروشگاه منتقل میشه. در ای نقسمت کاربر اطلاعات پرداخت رو با خودش به فروشگاه منتقل می‌کنه
  5. فروشگاه با توجه به اطلاعات بدست آمده صحت پرداخت رو بررسی می‌کنه

پراکسی و شنود اطلاعات

برای شنود اطلاعات و تغییر در ترافیک کاربر به منظور انجام فیشینگ، مهاجمان دو راه را پیش روی دارند:

  • نوشتن کد جعلی برای هر درگاه – این روش دارای چندین مشکل است، اولین مشکل اینه که برای هر درگاه باید کد جداگانه‌ای نوشته شود. همچنین برای جلوگیری از مشکل حل کَپچا، فیشر باید کَپچای درگاه بانکی رو به کاربر بده برا حل، در نهایت با تغییر ساختار درگاه پرداخت، صفحه فیشینگ از کار می‌افته و زحمت فیشرها خیلی زیاد میشه توی این قسمت. مشکل بعدی اینه که اگه درگاه هر تغییری کنه ممکنه صفحه فیشینگ از کار بیفته، یا مثلا وَف می‌تونه جلوی این حمله رو با اعمال برخی تنظیمات بگیره (البته هر دفاعی قابل دور خوردن هست). پس از لحاظ تئوری قابل انجام هست ولی دردسرهای خاص خودش رو داره،‌ همینطور که بعضی کاربران فنی به این نکته اشاره کردن.
  • پیاده‌سازی یک پراکسی بین کاربر و سامانه پرداخت – توی این روش تمام مشکلات بالا حل می‌شود. در واقع درگاه هر تغییری هم بکنه، هیچ فرقی برای صفحه فشینگ نمی‌کنه، چون که اطلاعات از درگاه گرفته می‌شه و به کاربر نشون می‌ده. توی این روش، فیشِر می‌تونه اطلاعات رو دستکاری و ذخیره کنه. جریانِ کاری به شکل زیر است:

خب حالا بریم سراغ طراحی اصلی حمله، جریانِ کاری به‌صورت زیر است:

  1. بدافزار، کاربر را ترغیب به پرداخت می‌کنه. اما بجای صفحه پرداخت واقعی، صفحه فیشینگ رو به کاربر نشون میده
  2. در این قسمت، درخواست خرید از سمت سرور فیشِر برای فروشگاهی که فیشر قصد خرید ازش با اطلاعات قربانی داره فرستاده میشه، این خرید می‌تونه «کارت شارژ» و یا «خرید بیت‌کوین» و موارد این‌چنینی باشه
  3. فروشگاه و درگاه پرداخت، به‌صورت عادی کار خود را انجام می‌دهند، البته این فرایند از دید کاربر کامل پنهان است
  4. فروشگاه شماره ResNum و سایر اطلاعات را به سرور فیشِر ارسال می‌کند
  5. فیشِر در این قسمت اطلاعات را تغییر می‌دهد. برای مثال، شماره پذیرنده، لوگوی پذیرنده، مبلغ و موارد دیگه تغییر کرده و به کاربر نشان داده می‌شود
  6. کاربر اطلاعات کارت به همراه کد OTP را در درگاه جعلی وارد می‌کند. البته تنها راه تشخیص این قسمت، نوار بالای مرورگر (آدرس‌بار) است. چرا که کدی که کاربر می‌بیند، تماما کد درگاه است و همیشه درست کار می‌کند
  7. اطلاعات با تغییر مبلغ به درگاه اصلی ارسال شده و پرداخت انجام می‌شد – در این قسمت در صورت غلط بودن اطلاعات، پرداخت انجام نمی‌شود و کاربر خطا می‌گیرد. پس غلط یا درست وارد کردن اطلاعات نمی‌تواند کاربر را از جعلی بودن درگاه آگاه کند
  8. پرداخت کامل می‌شود، در این قسمت کاربر به صفحه‌ای که فیشِر دوست دارد هدایت می‌شود

نوشتن پراکسی واقعا کار دشواری نیست و بار زبان‌های مختلفی قابل پیاده‌سازی است. من دامنه‌های فیشینگ زیادی رو بررسی کردم، خیلی از دامنه‌ها یک پورتال بودن که از سازوکار پراکسی استفاده می‌کردن. برای مثال کد زیر یک کد ۱۵ خطی می‌تونه چنین نتیجه‌ای رو بده (به آدرس‌بار دقت کنید):

خب امیدوارم از این پست لذت برده باشید، ممنون.

علاقه‌مند به امنیت، بازی و تفریح. ۳۰ سال زندگی کردم، دوست دارم ۳۰ سال دیگه هم زندگی کنم. دو پارادوکس بزگ زندگیم اینه که رشته تحصیلیم لیزر و اپتیک هست،‌ ربطی به کارم نداره، اسمم هم یاشار هست اما ترک نیستم.
زندگی من به سه قسمت تقسیم میشه، قسمت اول کار روزانه من هست که مثل بقیه مردم میرم سر کار. قسمت دوم سعی در براورده کردن علایق کاری خودم، مثل همین وبلاگ. قسمت سوم هم خانواده، مسافرت و تفریح. تلاش می‌کنم توی قسمت دوم، باگ‌بانتی کار کنم،‌ هم درآمد خوبی داره هم هیجان خاص خودش رو. اون قسمت‌هایی از تکنیک‌ها و کشفیات در فرایند باگ‌بانتی رو سعی می‌کنم توی این وبلاگ قرار بدم.
  • به اشتراک بگذارید:
  1. Avatar مرتضی گفت:

    من با همه ی تاکیدتون روی ساده بودن مطلب متوجه نشدم 🙂
    ببینید این نتیجه گیری من درسته؟با وجود رمز پویا عملا کسی مثل سابق درگاه جعلی نمیتونه راه اندازی کنه که فقط اطلاعات کارت بدزده و حتما باید به یک درگاه پرداخت واقعی متصل شه و از اون طریق هم به تخلیه کارت نمیتونن برسن و فقط مبلغ همون پرداخت گیر فیشر میاد؟
    اگر این نتیجه گیری درسته این ۵۰ میلیونی که توییت شده بود چطور انجام شده بنظرتون؟

    • یاشار شاهین‌زاده یاشار شاهین‌زاده گفت:

      دقیقا باید به یه درگاه متصل کنه چون رمز پویا منقضی میشه، در رابطه با اون ۵۰ میلیونی، احتمال زیاد بدافزار روی گوشیش بوده، ولی این سناریو نبوده چون طبق حرف خودش پرپداخت مشکوکی نکرده. در اون مورد منابع برای نتیجه‌گیری نداریم.

  2. Avatar علیرضا معظمی گفت:

    من این نوع فیشینگ با رمز پویا (که سروری واسط قرار بگیره) رو همون اول به ذهنم اومده بود اما یه سوال ساده از همون اول برام پیش اومده بود که جوابشو نیافتم و اون هم اینکه چرا بانک در پیامک حاوی رمز پویا، به مبلغ اشاره نمی‌کنه؟
    مثلا بگه این رمز پویا برای یک پرداخت ۵هزار تومنی درخواست شده. اینطوری به بهانه خرید شارژ، کارت طرف رو خالی نمی‌کنن!

    • یاشار شاهین‌زاده یاشار شاهین‌زاده گفت:

      این یکی از راه‌کارها هست که در آینده امیدواریم پیاده‌سازی بشه،‌ البته فیشینگ با مبالغ یکسان باقی می‌مونه

  3. Avatar رضا ایران منش گفت:

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

  4. Avatar ali گفت:

    با سلام
    عالی بود، ممنون

  5. Avatar وحید گفت:

    به نظر من اینکه بگیم درگاه معتبر باید به صورت sep.shaparak.ir باشه، کافی نیست. بهتره بگیم آدرس درگاه فقط و فقط باید به صورت
    https://X.shaparak.ir/
    باشه که در اون، X اسم شرکت ارائه‌دهنده درگاه مثل bpm یا sep هستش. به ممیز بعد از ir هم دقت کنین. هر پرداختی تو هر سایت یا اپی که خواستین انجام بدین، فرمتش باید و باید به این صورت‌ باشه.

    • یاشار شاهین‌زاده یاشار شاهین‌زاده گفت:

      بله اینطور هست جایی نگفتم فقط باید SEP باشه، ما تقریبا ۱۱ تا درگاه پرداخت داریم که همگی باید زیر نظر دامین شاپرک باشن

  6. Avatar علی گفت:

    عرض ادب
    منم چیزی که قبلا بهش فکر می کردم رو می گم خوشحال می شم نظرتون رو بگید .
    چرا OTP رو بانک مرکزی برای هر پرداختی یونیک نمی کنه ؟
    یعنی : هر صفحه پرداختی یه آی دی داره و اون رمز پویا برای اون صفحه پرداخت (آی دی) فقط کار می کنه . موقع پرداخت هم اون رمز پویا اس ام اس شده با اون آی دی صفحه پرداخت چک میشه … یکی بود پرداخت درسته یکی نبود پرداخت فیک است .
    حالا اگر فیشر هم این وسط پروکسی بزنه چون این یونیک بودن هر صفحه پرداخت پیاده سازی شده دیگه اطلاعات براش غیر قابل استفاده می شه و عملا هیچ خریدی نمی تونه بزنه .
    در واقع اینجوری صفحه پرداخت فیشر با صفحه پرداخت کاربر اصلی دو تا آی دی مختلف دارن و رمز پویا برای یکیش فقط کار می کنه .

    • یاشار شاهین‌زاده یاشار شاهین‌زاده گفت:

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

  7. Avatar arash گفت:

    بنطرم اگر بشه یه سازوکاری ارائه کرد که وقتی کد از طرف بانک ارسال میشه فقط برای اون مبلغ مشخص باشه و یکبار مصرف
    مثلا من یک کارت شارژ ۵ هزار تومنی میخرم درخواست کد میکنم اون کد فقط برای خرید ۵ هزار تومان و یکبار تولید شده یعنی با اون کد شما نمیتونی خرید ۱۰ تومنی کنی یا دوبار خرید ۵ تومنی کنی فقط یکبار اونم به همون قیمت که به بانک ارسال شده و براش کد ساخته شد
    و حتی بشه مثلا هر کد مخصوص همون تراکنش ساخته شده باشه یعنی هکر که با استفاده از پروکسی می خواد مثلا از کد ۵ تومنی استفاده کنه که پول با درگاه جعلی به حساب خودش یا برای تراکنش دیگه ای استفاده کنه نتونه و اون کد فقط برای تراکنشی که از قبل مشخص شده و کد براش ساخته شده باشه
    باحال میشه بشه نه ! فکر کننم به ۰ میریسه فیشینگ البته کل زیرساخت مملکت باید از نو نوشته بشه :))))))))))))))))

  8. Avatar حداد گفت:

    سلام ممنون بابت مقاله فنی تون

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

    چاره اینجا چیه؟