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

04 آگوست 2022

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

 این اولین رایت آپی هست که می نویسم. قبلش بگم یه سری توضیحات کلی در مورد اثرات این آسیب‌پذیری توی رویداد (دورهمی هکر های دوست داشتنی) دادم. که میتونید ویدیو اون رو از لینک زیر در یوتیوب ببینید: 

https://youtu.be/cqA0NG1NTn8?t=2744

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

من طی قراردادی که با یه شرکت داشتم مجوز تست نفوذ کلیه سامانه‌های بانکی و پرداختی کشور رو بهم داده بودن و قرارداد یه جورایی باگ بانتی پرایوت حساب میشد + یه مبلغ ثابت ماهانه (بدون مجوز اصلا تست نکنید!!! حتی برای کنجکاوی)  

یک درخواست و 130 میلیون کارت بانکی

روش کشف:

ماجرا از جایی شروع شد که یک روز اتفاقی به یک ساب‌دامین قدیمی یکی از بانکا برخورد کردم که مربوط به کارت هدیه بود و قسمت‌های مختلفی اعم از درخواست کارت هدیه (برای مناسبت های مختلف) و شارژ کارت هدیه رو داشت. 

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

من تست رو ادامه دادم توی قسمت‌های دیگه همون ساب دومین و توی قسمت شارژ کارت هدیه یه سری ورودی از کاربر میگرفت که شامل (شماره کارت هدیه- مبلغ شارژ- شماره کارت بانکی- CVV2 – تاریخ انقضا و رمز پویا بود و کپچا) من یه شماره کارت هدیه (تصویرش رو به دلیل اینکه مشخص میشه کدوم بانک هست نمیشه بزارم)، همینجوری وارد کردم (1111-1111-1111-1111) و اطلاعات کارت بانکی خودم رو هم وارد کردم و درخواست رمز پویا زدم و دیدم پیامک درخواست رمز پویا برام اومد با این عنوان که شماره کارت هدیه بعدش مبلغ شارژ و درنهایت رمزپویا تولید شده بود. 

اینکه ورودی که من وارد کردم یعنی شماره کارت هدیه، داشت برام پیامک میشد از سرشماره بانک یکم برام عجیب بود و شروع کردم به بررسی درخواستی که ارسال میشد با Burp Suite. 

و دیدم ابتدا یه درخواست ارسال میشه برای بررسی کپچا و بعد از اون یه درخواست دیگه ارسال میشه با 3 تا پارامتر ورودی که شامل (شماره کارت هدیه که قرار بود شارژ بشه- شماره کارت خودم و مبلغ شارژ) و دیدم اصلا cvv2 و تاریخ انقضا کارت من توی درخواست نیست! 

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

من به ذهنم رسید که بیام مقدار پارامتر شماره کارت هدیه (Gift Card) رو تغییر بدم برای اینکار اول درخواست رو فرستادم به Repeater Burp که راحت‌تر باشم. 

اولین مقداری که تست کردم این بود (a111-1111-1111-1111) برای اینکه ببینم سمت سرور چک میشه که آیا فقط ورودی باید Number باشه یا نه، و دیدم بعله همین متن برام پیامک شد.

توی تکرار دوم اومدم قالب ۴ قسمتی بودن رو رعایت کردم و این ورودی رو زدم (aaaa-aaaa-aaaa-aaaa) و نتیجه همون شد دیدم بازم برام پیامک اومد. 

اینجا دیگه تقریبا مطمن شدم هیچی سمت سرور چک نمیشه و اومدم یه متن رو فرستادم و بازم پیامک با همین متن از سرشماره بانک خودم برام اومد  

 در آخرین مرحله یه متن فارسی فرستادم که اونم بدون مشکل ارسال شد. 

به عنوان نمونه تصویر  3 مورد از پیامک های دریافت شده روی 3 بانک مختلف: 

پیامک دریافتی از بانک سر شماره بانک X 

پیامک دریافتی از بانک Y 

پیامک دریافتی از بانک Z 

دیگه اینجا گفتم خب این شد یه چیزی حالا 

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

خب پس تا اینجا چندتا چیز متوجه شده بودم:

  1. اینکه من میتونم هر ورودی که دلم میخواد رو به تحت پارامتر شماره کارت هدیه بدم
  2. اینکه اصلا cvv2 و تاریخ انقضا کارت لازم نیست برای ارسال پیامک
  3. اینکه بطور نامحدود میتونم درخواستم رو تکرار کنم
  4. تمام این پیامک تحت سر شماره بانک ارسال میشه
  5. برای اون مبلغی که من میدم رمز پویا تولید میشه 🙂

و این از نظر من فاجعه بود و هم خیلی باحال که با داشتن شماره کارت هرکسی میتونستی هر پیغامی میخوای براش بفرستی 

فقط یه چیزی رو هم بگم که محدودیت کاراکتر 20 کاراکتر برای مقدار ورودی پارامتر Gift Card داشتم و جملات طولانی رو نمیشد فرستاد. 

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

 سناریوهای اولیه:

سناریو اول من این بود که رمز پویا تولید شده رو بروت فورس کنم و به یاشار پیام دادم که چجوری میشه زیر 120 ثانیه OTP 5 تا 7 رقمی رو بدون وجود محدودیت کپچا یا Rate Limit دور زد؟ نتیجه اش اگر انجام میشد، اینجوری میشد که شما کارت هدیه‌ای که میخوای رو (که به اسم هیچکس هم نیست) با هر مبلغی که دوست داری با استفاده از کارت بانکی بقیه شارژ کنی یعنی برداشت از هرکارتی فقط با داشتن شماره کارت طرف 🙂 (دیگه بدتر از این ممکن نیست چون الگوریتم تولید شماره کارت ها و API برای بررسی صحت شون وجود داره). این سناریو امکان‌پذیر نبود بخاطر اینکه اون صفحه مشکل داشت و اصلا دکمه پرداخت کار نمیکرد و وقتی هم دستی درخواست رو Submit میکردم، پیغام خطای سمت سرور میگرفتم پس بیخیالش شدم و رفتم سراغ سناریو های دیگه. 

سناریو دوم این بود که از رمز پویا تولید شده برای یه درگاه دیگه استفاده کنم که این هم امکان پذیر نبود (شماره ترمینال پذیرنده و مبلغ چک میشن) و اینکه ما هر درگاهی رو میخواستیم تست کنیم باز محدودیت کپچا و Rate limit رو قاعدتا داشتیم و حتی اگر جایی بود که محدودیت نداشتیم شماره ترمینالی که رمز پویا ما براش تولید شده بود با درگاهی که میخواستیم اون رمز پویا رو استفاده کنیم یکی نبود و در نتیجه رمز پویا رو حتی اگر به دست میاوردیم کار نمیکرد. 

من دیگه بیشتر از این تستی رو انجام ندادم که سناریو های دیگ یا حالت دیگه ای رو تست کنم و گزارش رو تکمیل کردم و فرستادم. 

نکته جالب ماجرا اینجاست که باگ در کمتر از چند ساعت به گفته خودشون فیکس شد (کلا وب سرور رو جمع کردن) به همین دلیل من تصاویر برای  رایت‌آپ داشتم مجبور شدم از POC های گزارش اصلی استفاده کنم. 

به حملاتی که میشد با این آسیب‌پذیری پیاده‌سازی کرد اشاره میکنم: 

  1. ارسال لینک فیشینگ به‌عنوان متن: 

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

  1. ارسال متن پیامک واریز مبلغ دلخواه به کارت قربانی: 

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

  1. ارسال پیامک تبلیغاتی از سرشماره بانک: 

ازآنجایی‌که شماره کارت‌های بانکی از الگوریتم مشخصی پیروی می‌کنند و نیز تعداد بسیار زیاد شماره کارت‌ها در بستر اینترنت وجود دارد. هرگونه متن تبلیغاتی رایگان با سرشماره بانک با محدودیت ۲۰ کاراکتر می‌توان ارسال نمود. توجه: محدودیت تعداد ارسال وجود نداد!! 

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

1 پست نوشته شده
علاقمند به حوزه امنیت سایبری ،تست نفوذ و بررسی آسیب پذیری در حوزه وب - محقق امنیت در بخش شکار و کشف باگ
  • به اشتراک بگذارید:
  1. faxmodem گفت:

    خوب بود ..🌹

  2. حسین گلزاری گفت:

    سلام عالی بود سید مجتبی عزیز

  3. حامد گفت:

    سلام همه چی عالی بود فقط در عکس ها به شماره کات بانک اشاره کردید ۶۰۳۷ …

  4. Hossein گفت:

    جالب بود و البته هیجانی 🙂

  5. reza گفت:

    بسیار عالی

  6. Ali jadidi گفت:

    بسیار جالب بود .
    ممنون

  7. سهراب گفت:

    عالی بود مجتبی جان ..مرسی از توضیح کاملت

  8. پویا گفت:

    این گزارش از نظر فنی هیچی نداشت؛ تنها چیزی هم که شما بو ه شانس برای تست این اند پوینت ها بوده وگرنه هر پنتستر مید لولی با اندکی سواد هم میتونه اینجور آسیب پذیری را پیدا کنه

  9. Charlie گفت:

    خیلی جالب بود
    حتما بازم رایت آپ بنویس

  10. سهراب گفت:

    عالی بود موفق باشی

  11. رضا گفت:

    اینم از زیر ساخت ‌کشورمون…

  12. nima_t گفت:

    سلام
    خیلی جالب بود و ممنون برای این رایتاپ عالی
    حتما در مورد آسیب پذیری های رایج درگاه های پرداخت سایت ها رایتاپ های فنی مثل همین رایتاپ بنویس
    race condition
    double spending
    و …

  13. احسان گفت:

    خيلي عالي بود لطفا ادامه بديد

  14. sybertech گفت:

    علی بود حرف نداشت پرقدرت ادامه بده

  15. مهدی مولایی گفت:

    بسیار عالی بود مجتبی جان.

  16. you گفت:

    خدایی لذت بردم

  17. me گفت:

    سلام و سپاس فراوان
    احیانا این امکان وجود داره که بعد از ثبت کد SQLi به جای شماره کارت هدیه، مثلا کل دیتابیس را پاک کرد یا blind زد؟ چون به احتمال زیاد بعد از پرداخت بابت شارژ شدن کارت هدیه، این شماره در دیتابیس ثبت خواهد شد!
    ممنون

  18. مجید گفت:

    سلام مجتبی جان ، عالی ، همینطور ادامه بده…