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

21 ژوئن 2023

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

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

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

داستان از یه گوگل دورک شروع شد که به صورت زیر بود:

inurl:responsible disclosure

با این دورک، گوگل کلی برنامه‌ی پرایوت براتون میاره و من اونی رو انتخاب کردم که با کانسپت استارتاپی که داشت بیشتر حال می‌کردم.

Wide Recon من اینطوریه که اول با Subfinder شروع می‌کنم به پیدا کردن ساب‌دامین، بعدش میرم سراغ ابزارهایی مثل Github Scan، Certificate Scan و آخر از همه با Wordlist خودم شروع می‌کنم به صورت Static و Dynamic بروت‌فورس می‌کنم روی تارگتم و نتیجه‌ی کار ۴۲ تا ساب‌دامین شد.

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

سناریوی اول، بریم سایتو بیاریم پایین

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

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

سناریوی دوم، نابودی همیشه یه راه حله

داخل فرم ثبت‌نام یه فیلدی وجود داشت به نام picture که می‌تونستی عکس پروفایل برای خودت آپلود کنی. اولین چیزی که به ذهنت میاد چیه؟ زدی تو خال… SHELL Upload.

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

<?php
   echo 1;
?>

فایلمو آپلود کردم، ترمینالمو باز کردم و از url فایلم که آپلود شده بود curl گرفتم که ببینم کد پی‌اچ‌پی اجرا شده یا نه، که دیدم اجرا نشده و دقیقا همین کد بالا رو برام برگردوند. یه مقدار با content-type درخواست HTTP بازی کردم ولی به جز image/png چیز دیگه‌ای رو قبول نمی‌کرد. بعد از امتحان کردن فرمت‌های مختلفی مثل php5 و phar و … این سناریو هم به دیار باقی شتافت.

سناریوی سوم، کنترل کردن یه توهمه

معماری استارتاپ اینطوری بود که هر یوزر می‌تونست چند تا کمپانی برای خودش بسازه و طبق نیازهایی که داره روی اون کمپانی‌ها اوپریشنی که می‌خواد رو انجام بده بنابراین به احتمال ۹۹ درصد، حداقل ۲ تا تیبل توی دیتابیسش داره که اینارو با Foreign Key بهم وصل کرده.

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

بنابراین برای تست IDOR دو تا اکانت ساختم روی سایت و با این دو تا اکانت چند تا کمپانی ساختم و سعی کردم توی مراحل ثبت کمپانی برای یه اکانت، کمپانی‌ای که توی اون یکی اکانت ساخته بودم رو بهش بدم که ببینم دیتاش رو بهم بر می‌گردونه یا نه.

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

همین مورد هم وقتی می‌خواستی داخل سایت ثبت‌نام کنی و ایمیل تکراری وارد می‌کردی اتفاق می‌افتاد.

اولین چیزی که بعد از دیدن عکس مشتاق شدم امتحانش کنم SQL Injection بود ولی با یکم دقت بیشتر، متوجه شدم که داره از Prepared Statementها استفاده می‌کنه بنابراین این سناریو هم فیل شد.

آخرین سناریو، نوری در تاریکی

هر یوزر یه آی‌دی داشت که به شکل u_wdobhREkbf بود یعنی یه پیشوند u_ و ۱۰ تا کاراکتر رندوم. این دفعه سعی کردم با دسترسی یکی از یوزرا، ببینم می‌تونم اطلاعات یوزر دیگه رو بگیرم یا نه.

اندپوینتی که بهش زدم ‍/main/api/v1/users/<userId> این بود، کاری که باید می‌کردی این بود که آی‌دی یوزرتو بذاری تو اندپوینت و یه GET بهش بزنی، خب آی‌دی یوزر خودمو گذاشتم داخلش و طبق معمول اطلاعاتمو برگردوند، حالا به جای آی‌دی یوزر خودم، آی‌دی اون یکی یوزرمو گذاشتم تو اندپوینت و بووووم.

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

آی‌دی یوزرها همونطور که گفتم ۱۰ تا کاراکتر رندوم داشت، اگه حساب کنیم ۲۶ تا حرف کوچک انگلیسی، ۲۶ تا حرف بزرگ انگلیسی و ۱۰ تا عدد داریم، برای هر جایگاه میشه ۶۲ تا انتخاب و بنابراین تعداد کل حالاتمون درمیاد 839,299,365,868,340,224 که به طرز وحشتناکی بزرگه و حتی سوپر کامپیوترها هم به سختی میتونن این تعداد حالت رو امتحان کنن برای اینکه بتونن به آی‌دی یوزرا برسن.

پس رفتم دنبال یه جایی که آی‌دی یوزرا رو ازش بشه کشید بیرون، بعد نیم ساعت به یه چنین اندپوینتی رسیدم /main/companies/search/findByNameIgnoreCaseContaining?q=<searchParam>&limit=20 که با گرفتن یه کوئری پارامتر توی دیتابیس ILIKE میزد و کمپانی‌هایی اسمشون حاوی اون کوئری پارامتر هست رو برمی‌گردوند.

شما هم می‌بینیدش؟ آخرین خط سمت راست داره یوزر آی‌دی رو بر می‌گردونه. خب خیلی عالی شد. شروع کردم به اکسپلویت نوشتن…

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

الگوریتمی که برای اکسپلویت مد نظرم بود به اینطوری بود

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

از اونجایی که تعداد API Callها خیلی زیاده و زمان زیادی برای اجرا شدن کامل اکسپلویت ازم می‌گیره الگوریتم بالا رو multi-threaded پیاده‌سازی کردم و اکسپلویت رو اجرا کردم. بعد از حدود ۱۰ دقیقه، ۴۰k دیتا لیک شد و سریعا به کمپانی گزارش دادم و نتیجه ۱۵۰۰ دلار بانتی شد.

امیدوارم لذت برده باشید.

https://twitter.com/ferferof_

1 پست نوشته شده
یه دیوانه‌ی علوم کامپیوتری که عاشق هک کردنه
  • به اشتراک بگذارید:
  1. ZeroXUF گفت:

    Neat 👌

  2. 3mr3 گفت:

    خیلی خوب بود موفق باشی و ممنون بابت اشتراک گذاری 👏🌹

  3. bountyman گفت:

    مبارکه فرفروف جان! عالی بود رایتاپ

  4. soltanali گفت:

    اقا عالی بود خیلی حال کردم دمت گرم

  5. میعاد گفت:

    متود خوبی داری برای جستجو!!! عالی👍🏻

  6. Amirmlkm گفت:

    ممنون بابت اشتراک گذاری
    عالی بود