سلام دوستان، امیدوارم حالتون عالی باشه. در این پست قصد دارم چگونگی کشف آسیب پذیری Account Takeover در یکی از برنامههای بانتی را که مدتی قبل در یکی از برنامه های خصوصی کشف کردم را مورد بررسی قرار بدهم.
بدلیل اینکه از تیم امنیت اجازه انتشار نگرفتم اسم برنامه را target.com درنظر میگیرم. یکی از بخشهای جذاب و مورد علاقهی من برای بررسی، بخش بازیابی رمزعبور هست. در سامانهی آسیبپذیر، بخشی برای بازیابی رمز عبور به وسیله ایمیل وجود داشت که لینکی حاوی یک توکن برای تغییر رمز عبور به ایمیل ارسال میشد. با بررسی توکن ها مشخص شد که توکن هایی که ارسال میشود md5 هستند. تست های مختلفی را برای کشف آسیبپذیری در این بخش انجام دادم اما نتیجه ای حاصل نشد. مدتی بعد مجددا شروع به بررسی همون قسمت کردم. برای بررسی واکنش اپلیکیشن، درخواست مربوط به بازیابی رمزعبور را 10 بار با استفاده از Turbo Inturder در Burp به سرعت ارسال کردم و از 10 توکن ارسال شده به ایمیل، 2 توکن دقیقا یکسان بودند و مابقی توکن ها هر کدام با یکدیگر متفاوت بودند.
چیزی که حدس زدم این بود که به دلیل ارسال 2 مورد از درخواستها در تایم یکسان، ما بین لینکهای ارسالی دو مورد یکسان هستند و بنابراین توکنها بر مبنای تایم ساخته میشوند پس فلوی زیر به ذهنم رسید:
سامانه با PHP نوشته شده بود. پس به نظرم رسید که پیادهسازی باید به این شکل باشد:
حالا با توجه به حدسی که زدم به مرحله ی تست کردن رسیدم؛ در ابتدا حدسیات خودم را با ایمیلم در کد پیادهسازی کردم:
با توجه به کد بالا هر بار که برنامه اجرا شود، ایمیل من و زمان کنونی بر مبنای تایم در PHP بعد از چسبیدن به هم، MD5 میشوند. در مرحله ی بعد با استفاده از Inturder در Burp شروع به اجرای برنامه خودم به صورت پیوسته کردم و همزمان که برنامه من در حال ساخت توکن بر مبنای ایمیلم و زمان بود، درخواست بازنشانی رمزعبور را در سامانه ارسال کردم و Inturder را متوقف کردم. بعد از اون مشتاقانه توکن ارسال شده به ایمیلم را به وسیلهی افزونه ++Logger در Burp جست و جو کردم:
متاسفانه کاملا بیفایده بود و به هیچ نتیجه ای نرسیدم!
ولی به هیچ عنوان ناامید نشدم و کل فلو را مجددا در ذهنم مورد بررسی قرار دادم. مورد قطعی این بود که اگر تا اینجای کار پیادهسازی را درست حدس زده باشم پس الگوی ساخت توکن می بایست شامل مورد یا موارد دیگری هم باشد. اما معمای اصلی همان موارد اضافه تر بود!
در این شرایط تنها چیزی که می تواند به ما کمک بکند FUZZ کردن هست. موردی که در پیادهسازی موارد مختلف توسط برنامهنویس استفاده میشه، استفاده از کارکترهای مختلف به عنوان جداکننده(Separator) هست؛ پس حالت زیر به فکرم رسید:
بنابراین مجددا با کارکتر های مختلف، پیاده سازی را در کد انجام دادم و در واقع کارکترهای مختلف را با روش بالا FUZZ کردم. بعد از تست چند کارکتر به (|) رسیدم.
مجددا برنامه را با Inturder در Burp اجرا کردم و همزمان درخواست ارسال لینک بازیابی رمزعبور را ارسال کردم.
حالا نوبت به جست و جو کردن توکن ارسالی در Burp رسید:
اینبار موفقیت آمیز بود!! خوشبختانه بعد از زمان زیادی که روی این بخش صرف کردم به نتیجه رسیدم و به دلیل پیادهسازی ناامن و کشف الگوی این پیاده سازی، آسیب پذیری مهمی کشف شد.
و اما سناریو اکسپلویت:
برای بهرهبرداری از این مشکل فقط کافیست فرآیند بالا را با ایمیل Victim تکرار بکنیم و توکنهای ایجاد شده توسط برنامه خودمان را استخراج و به جای توکن در لینک بازیابی قرار بدهیم و در واقع لینک بازیابی را توسط توکنهای ایجاد شده، FUZZ بکنیم و رمز عبور حساب کاربری Victim را تغییر و حساب او را تصاحب بکنیم.
داخل پرانتز:
پیادهسازیها به حالتهای مختلفی انجام میشود ومن قبل از حدس حالت اشاره شده در این نوشته و کشف این آسیبپذیری، تستهای متفاوتی را در حالتهای مختلف برای کشف الگوی ساخت توکن به کار بردم؛ از جمله حالت MD5 شدن Time به تنهایی و جابهجایی Time و Email در MD5 شدن.
خیلی ممنونم بابت اینکه من را تا پایان همراهی کردید. امیدوارم این نوشته مفید واقع شده باشد.
همچنین اگر دوست داشتید، خوشحال میشم من را در سوشالهای دیگر دنبال بکنید.
عالی بود
متشکرم
خیلی خوب بود
چقدر زمان برد روش ساخت توکن رو پیدا کنی؟
ممنونم. اگر مفید در نظر بگیریم فکر می کنم ۳ ساعت.
بسیار هوشمندانه و عالی
سپاس از نظر لطفتون.
خیلی حال کردم عالی بود.
خسته نباشی
متشکرم از نظرت. موفق باشی
خیلی عالی بود خوبم توضیح دادی من که تازه کارم خیلی خوب درک کردم 🙂 ب امید موفقیتای بیشترتون.
ممنونم از نظرت. موفق باشی.
خیلی قشنگ بود
برای این آسیب پذیری چند دلار بانتی دادن؟ high حساب میشه یا critical؟
اگه برای جداسازی ایمیل و زمان، مثلا به جای | از |*|-|+| استفاده می شد، باز هم در فازهایی که می کردی وجود داشت ؟
یعنی چند حالت رو معمولا فاز می کنی؟ خودکار یا دستی؟
معمولا اینکه High باشه یا critical بستگی به دو عنصر داره: ۱- برنامه ای که روش کار می کنید ۲- تصاحب حساب باکلیک انجام بشه یا بی کلیک
این گزارش من critical بسته شد.
بله حالت های متعددی تست شد تا به نتیجه رسید. برای تست، لیستی از کارکتر ها را دارم و ازشون استفاده می کنم. و در کل ممکنه مثلا در ابتدا و انتهاش هم کارکتر باشه. کشف این حالت ها به این بستگی داره که به چه مقدار بخواهید روی یک قسمت وقت بگذارید و تست بکنید.
رایتاپ خوبی بود
آفرین به این همه استعداد و تلاش
چقدر بانتی دادن ؟
در ابتدای گزارش اشاره شد که ۱۰ درخواست همزمان فرستاده شد و ۲ مورد از توکن ها یکسان تولید شد.
یعنی سامانه بدون محدودیت ۱۰ بار پشت سر هم ایمیل جدید ارسال کرد و عملا هر بار توکن های قبلی باطل شد. درسته ؟
ولی اگر مثلا دو سه تا از لینک بازیابی که همزمان دریافت شدن، معتبر باشن و همگی بتونن رمز رو ریست کنن، این آسیب پذیری حساب میشه ؟
شدتش low میشه یا ارزش بیشتری داره ؟
مساله بعدی اینکه در مواردی که سامانه محدودیت قرار داده و مثلا بعد از سه چهار تا ارسال درخواست بازیابی رمز عبور، ip رو مسدود میکنه و یا دیگه ایمیل بازیابی رمز رو ارسال نمی کنه باید چی کار کرد ؟
سلام. ممنونم نظر لطف شماست. شدتش critical بسته شد.
– بله توکن ها باطل میشد
– بله معمولا low هست که اونم بستگی داره توکن های قبلی تا چه مدت زمانی باطل نشند
– برای بحث محدودیت باید تلاش بکنیم که Bypass بکنیم. مثلا برای ip می تونید از هدر های مربوط به ip با ip های رندوم استفاده بکنید شاید دور بخوره. در کل روش های مختلفی برای Bypass هست که تو هر قسمت محدودیت باشه میشه ازشون استفاده کرد و گاهی نتیجه گرفت.
عالی و پربار بود و فقط اینکه یک سوال چطور متوجه شدی که باید تک کلمه فازتو انجام بدی کلا اینجا فلوی خواصی هست ?
ممنونم. نه کلا چیزی به نام فلوی خاص وجود نداره. مثلا اخیرا یک مورد دیگه کشف شد که تک کلمه نبود و خیلی پیچیده تر بود و طبیعتا خیلی وقتا ضمن آسیب پذیر بودن کشف صورت نمی گیره.
عالی بود لذت بردم.