سگِ درگاهِ هیدس !!

خب سلام . تو این پست قراره راجع‌به یکی از پروتکل های احراز هویت توی اکتیو دایرکتوری صحبت کنم که بهش میگیم کربروس !
شاید قبل از هرچیزی مهم باشه که بدونیم این اسم از کجا میاد . اصلا کربروس چیه؟ ولی قبل تر از اون نوعی خودآگاهی و هوش نیاز هست که بگی به من چه که کربروس اسم سگِ کدوم سگی بوده؟ البته باید حواستون باشه که طرف یونانی نباشه .
مثلا فکر کنید به کسی که هیدس رو میپرسته بگید سگ ! خب شاید سگ بشه بیفته به جونتون . فبها .
سگ خورد. ولش کن. کربروس یه سگ بوده ولی سوال مهمتر از اینکه سگِ درگاه کی بوده اینه که چطور کار میکنه ؟
کربروستینگ چیه؟ گلدن تیکت از کجا درومده؟ اینا چی میگن ؟ و ادامه...

قبل از هرچیز ...

سینک بودن ادبیات خیلی مهمه ! قبل از هرچیزی باید اطمینان حاصل کنیم که نوب سگ نیستیم و تمایز بین کلمات رو متوجه میشیم .
اول از همه یه سوالی که توی تمام مصاحبه‌های امنیتی ازتون میپرسن . ( احتمالا چون همشون خیلی عجله ای میان و حال پرسیدن سوال جدید ندارن ) اینه :
مهندس فرق بین Authentication , Authorization چیه؟‌
توی Authentication یا احراز هویت ما میدونیم هدف اینه که اطمینان حاصل کنیم یک شخص همونیه که داره ادعا میکنه ! یعنی دغدغه‌ی ما اینجا هویت طرفه ! اینکه بدونه تو کدوم سگ.. عا ببخشید کدوم انسانی هستی که به یک هدفی برسی !
ولی تو Authorization هدف ما اینه که اطمینان حاصل کنیم شخص احراز هویت شده ی شما , اجازه ی انجام چه کارایی داره ! دسترسی به منابعش به چه شکله ؟ مثلا فایل hello.txt رو میتونی بخونی؟ ببینی؟ ببری ؟

شاید اینجا بگید خب Access Control چه سگیه پس ؟ خب Access Control میشه مکانیزمی که شما Authorization رو باهاش اعمال میکنین ! یعنی در فاز اجرا میاد وسط !

سوال بعدی ! اصلا پروتکل یعنی چی ؟ من یکی از دوستام پروتکل رو معنی کرده پوروابند . نمیدونم چرا اینجا گفتم ولی خب بنظرم جالبه . پروتکل یعنی یک قرارداد بین دو/چند موجودیت ! مثلا فرض کنید یه قرارداد باهم بچینیم که اگه من گفتم هاپ , شما دوبار بگید هاپ هاپ !
در اینصورت ما یک پروتکل داریم . اسمشم میذاریم سگ دو سر مثلا . یا هرچی .
پس پروتکل همون الگوریتم نیست ! تو الگوریتم ما یک مسیر یا مراحلی داریم که دقیقا مشخص میکنه یک فرایند چطور انجام بشه. ولی تو پروتکل میگیم کی با کی حرف بزنه. چطور حرف بزنه ! یا حتی اینکه هر بخشش چه الگوریتم هایی استفاده بشه !
مثلا کربروس یک پروتکله ولی AES یک الگوریتم رمزنگاریه و اینا باهم متفاوتن .

پ.ن : تو ارشد امنیت یه درسی تحت عنوان "امنیت کامپیوتر" دارید که این مهملات رو دقیق میخونید. اولش فکر میکنید غیر از نمره به هیچ دردی در زندگیتون نخورن ولی یکم که میگذره میفهمید که .. درست فکر کرده بودید.

حالا بی شوخی کربروس چیه؟

بازیگر‌های پروتکل کربروس ( غیر از ۳ سگ موجود)

پروتکل کربروس مهم‌ترین ایده‌ش تجربه ی SSO هست . اینکه برای هر چیزی نیاز نباشه یوزرنیم پسوردتون رو وارد کنید . پس اومد دوتا مفهوم معرفی کرد . TGT , TGS . میرسیم به اینکه اینا چی هستن .
توی پروتکل کربروس شما با KDC سروکار دارید که بخشی از DC هست و وظیفه ی احراز هویت و دادن TGT به شمارو داره .
حالا TGT چیه؟ مخفف Ticket Granting Ticket ! انگاری یه بلیطه که اگه داشته باشیدش نشون میده که KDC شمارو احراز هویت کرده ! وقتی که شما TGT داشته باشین نشونگر اینه که ایشون احراز هویت شده ان ولی اینکه به چی دسترسی دارن جای بحثه .
ولی خب ... ما اینجا ولش نمیکنیم ! چون ساده سازی غایت نیست بلکه وسیله‌ست ! اگه کسی ساده‌سازی رو غایت بدونه شیاده !

بریم تو TGT ...

حالا بی شوخی کربروس چیه؟

این داخل یه پکت TGT هست که شما از KDC دریافتش میکنید . ( دقیق تر بگیم اون قسمت انکریپت شده فقط TGT هست بخشی که بهش میگیم enc-part)
مولفه های توش چیا هستن ؟‌
یه pvno داره که مفت نمیارزه . همون ورژن کربروس هست.
یدونه msg-type داره که نوع پیام رو مشخص میکنه که جلوتر بهش میرسیم.
یه padata داریم که اتفاقا تو امنیت خیلی مهمه. Pre-Authentication data هست که میگه فعاله.
یه crealm داریم که اسم دامین ماست و cname رو داریم که نشون میده برای چه کلاینتی هست.
و حالا بخش خوشگل ما ! ticket !

اون اولش ر دیدید ؟ میگه این تیکت برای یوزر krbtgt روی دامین DENYDC.COM صادر شده !
حالا بخش مهم enc-part چیه؟
تو enc-part یه سری از اطلاعات مثل cname, crealm و ... تکرار شدند و علاوه بر اون یک مقدار key که همون سشن کاربر هم هست به کاربر داده میشه تا بتونه با ارائه کردن این مقدار به KDC اثبات کنه که شخص احراز هویت کنه !

دوباره تبدیل به موجودی سطحی میشیم برای ادامه دادن

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

حالا بی شوخی کربروس چیه؟
  • AS-REQ

تو این مرحله شما تحت عنوان یوزر ممد ادعا میکنید که من ممد هستم ! چیزایی مثل cname و اسم دامین رو میفرستید. یک سوال ! شما برای اینکه ادعا کنید ممد هستید باید پسورد ممد رو بدونید. آیا پسوردش رو هم میفرستین؟ هر یولی میدونه که جواب نه هست !
درسته که شما پسوردتون رو میزنید ولی چیزی که فرستاده میشه Time Stamp انکریپت شده ی شماست . یعنی مثلا الان ساعت ۱۹:۰۳:۲۳ ثانیه ست اینو میگیرید با کلید خودتون طبق الگوریتمی که در پروتکل مشخص شده رمز میکنید و میفرستینش .

  • AS_REP

اینجا سرور اگه چک کرد و دروغ نگفته بودید بهتون جواب میده و جوابش همون TGT هست که تو بالاتر بهتون نشون دادم.

حالا چی میخوای ؟

خب با سگ‌دو فراوان بلاخره تونستیم ثابت بکنیم که ما فلانی هستیم و این مرحله انجام شد.
در ادامه قراره این TGT خودمون رو بدیم به آقای KDC و بگیم که من میخوام فلان چیزو ببینم یا بهش دسترسی داشته باشم . میشه ؟!‌
ما یک مفهومی داریم به نام Service Principal Name یا SPN .
این SPN یک نام هویتی هست برای سرویس ها در کربروس . ساده تر بگیم مثلا اگه با آقای sql کار داشته باشین میشه :
MSSQLSvc/SQL01.thm.local:1433
با هر سرویسی که کار داشته باشین در TGS-REQ قرار میگیره پس :

  • TGS-REQ
حالا بی شوخی کربروس چیه؟

تو این ریکوئست طبیعتا دارید میگید که به چه سرویسی میخواید دسترسی داشته باشین .
اونی که بهش نیاز داشتین در بخش req-body مشخص شده.
تو این درخواست مشخصا شما خواستید برای LDAP مربوط به این ماشین
vpc-w2k3ent.denyDC.com
بهم دسترسی بده .
تو بخش TILL هم میگه که تا چه زمانی میخوام این دسترسی معتبر باشه. که یک تاریخ مشخصه توش.
یک nonce هم داره که هدفش اینه که طرف بتونه جواب سرور به نگاشت بده به این درخواسته !

پس TGT که قرار بود بدم دستش کجا رفت؟ اینجایه !

این مقدار ticket که میبینید همون TGT هست که در مرحله ی قبل از KDC دریافت کردیم و دوباره درگیر یوزرنیم و پسورد نشدیم.
این مقدار ticket که میبینید همون TGT هست که در مرحله ی قبل از KDC دریافت کردیم و دوباره درگیر یوزرنیم و پسورد نشدیم.
  • TGS-REP

سرور میره و با استفاده از TGT که بهش دادیم بررسی میکنه و اگه دسترسی لازم رو به سرویس داشتیم دوتا چیز برمیگردونه . Service Ticket و Session Key .
و اینجا همون جاییه که کار جذاب میشه !
پکت مربوط به TGS-REP رو ببینید :

حالا بی شوخی کربروس چیه؟

اول از همه شما تو عکسه دارید ۲ تا enc part میبینید .
یکیشون توی ticket هست که با آبی مشخصش کردم پس این قسمت همون TGS هست ! یعنی اون قسمت اگه دیکریپت بشه اطلاعاتی مثل اینکه شما کی هستین ؟ رو چی دسترسی دارین ؟
تا چه زمانی روی سرویس دسترسی دارین؟ و از اون مهم تر تا چه سطحی از دسترسی رو روش دارید ؟

به این ترتیب بعد از گرفتن tgs_rep از سرور کار ما برای گرفتن منابع به پایان میرسه و این بود نحوه ی کارکردن کربروس و پکت های درونش !
در ادامه پست ها سعی میکنم حمله های روش رو بیشتر توضیح بدم و به شکل عملی روی یک LAB اینکارو بکنم تا ببینیم اینا چطور کار میکنن .
تشکر از همراهی شما عزیزان جان ! اگه یه روزی حال و حوصله دولوپ دکمه لایک رو داشتم و الان شما دارید میبینیدش مطلب رو لایک کنید یا کامنت مثلا. استوری هم بکشید بالا و برای ۲ امین نفر لیست شیرتون ارسالش کنید. تشکر.

منابع مختلفی که استفاده شده ر اینجا میذارم شمام ببینید .

J-sag
https://wiki.wireshark.org/Kerberos
https://hide01.ir/redsiege-kerberos-workshop/
chatgpt
https://iran-music.com/%D8%A2%D9%87%D9%86%DA%AF-%D9%85%D8%A7%D8%AF%D8%B1-%D8%B3%DA%AF-%DA%A9%D8%A7%D8%B1-%D8%AA%D9%88%D8%B9%D9%87-%D8%B1%DB%8C%D9%85%DB%8C%DA%A9%D8%B3/