سلام به همگی
امیدوارم حالتون خوب باشه
من محمدرضا عمرانی هستم. در این نوشته، در مورد چگونگی کشف آسیبپذیری که اخیراً پیدا کردم صحبت خواهم کرد.
نام دامنه رو redacted.com میزاریم. از اونجایی که تارگت من Wildcard بود، تا حد امکان سابدامینهای تارگت رو جمع آوری کردم. من طبق معمول شروع به Google Dorking کردم.
site:"*.redacted.com"
من سابدامینهای جدیدی که از نتایج گوگل پیدا میکردم رو به یک فایل متنی اضافه کردم. از اونجایی که این فرآیند دستی و زمانبر بود، من به این صورت سعی کردم کارم سریعتر پیش ببرم:
site:"*.redacted.com" -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 "origin" AND (Response.Headers CONTAINS "Access-Control-Allow-Credentials" OR Response.Headers CONTAINS "Access-Control-Allow-Origin")
ضمن اینکه شما میتونید ++Logger رو با اکستنشن AutoRepetear ترکیب کنید.
در AutoRepetear یک replacement اضافه کنید که هدر origin رو با مقدار مد نظرتون به هدرها اضافه کنه و یا مقدار این هدر رو جایگزین کنه.
یا
و در انتها میتونید یک فیلتر در ++Logger اعمال کنید که در کنار AutoRepetear اندپوینتهای آسیب پذیر رو پیدا کنه.
Request.Headers CONTAINS "origin: evil.com" AND (Response.Headers CONTAINS "Access-Control-Allow-Credentials" OR Response.Headers CONTAINS "Access-Control-Allow-Origin: evil.com")
اما خب من خیلی راحتتر به اندپوینت آسیب پذیر رسیدم.
همون اوایل که از ++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("GET","https://api.redacted.com/api/v2/user",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