تو مقاله قبلی ماژول System Hacking از CEH رو شروع کردیم و فهمیدیم که این ماژول از چندین تکنیک ایجاد شده. تکنیک اول Gaining Access یا ایجاد دسترسی به اون سیستمه که تو این مقاله بیشتر بررسی میکنیمش.
Gaining Access (ایجاد دسترسی) : این مرحله به دسترسی اولیه به سیستم هدف اشاره داره و هکرها تمام تلاش خودشون رو میکنن تا وارد سیستم بشن. این دسترسی ممکنه به عنوان یک کاربر مجاز اما با دسترسی محدود باشه. تکنیکهای این دسته شامل موارد زیر هست :
Cracking Passwords (شکستن پسوردها)
Vulnerability Exploitation (بهرهبرداری از آسیبپذیریها)
ابتدا با Cracking Passwords آشنا بشیم...
ویندوز قابلیتی به اسم Microsoft Authentication داره که مسئول مدیریت رمزهای عبوره. احراز هویت مایکروسافت شامل استفاده از نام کاربری و رمز عبور برای ورود به سیستم ویندوزه. ویندوز از رمزهای عبور برای حفاظت از حسابهای کاربری استفاده میکنه و این رمزها به گونهای ذخیره میشوند که دسترسی مستقیم به آنها دشوار باشد. مراحل ذخیرهسازی رمز عبور در ویندوز :
کاربران برای ورود به ویندوز نیاز به وارد کردن یک نام کاربری و رمز عبور دارند. این اطلاعات ابتدا توسط سیستم برای شروع فرآیند احراز هویت دریافت میشود.
پس از وارد کردن رمز عبور، ویندوز از یک الگوریتم هشینگ (Hashing) برای تبدیل رمز عبور به یک مقدار ثابت استفاده میکنه. این فرآیند یک راه یکطرفه است، به این معنی که هش برگشتناپذیره و نمیتوان به راحتی از هش به رمز عبور اصلی رسید و به همین دلیل، حتی اگه مهاجم به این هش دسترسی پیدا کنه، نمیتواند به راحتی رمز اصلی رو بازیابی کنه. مایکروسافت برای امنیت بیشتر یک اقدام دیگه ایی تحت عنوان Salt رو انجام میده ! Salt چیه و چطور کار میکنه؟
Salt یک رشته تصادفی از دادهها است که به رمز عبور اضافه میشود قبل از اینکه هش شود. این فرآیند به امنیت رمز عبور کمک میکند زیرا تضمین میکنه که حتی اگه دو کاربر رمز عبور یکسانی داشته باشند، خروجی هش متفاوت خواهد بود. این موضوع به ویژه در جلوگیری از حملات Rainbow Table مفید است. Salt چطور کار میکنه؟
وقتی شما رمز عبور (مثلاً A) رو وارد میکنید، ویندوز ابتدا یک رشته تصادفی (Salt) تولید میکند. این Salt به رمز عبور (A) اضافه میشود، مثلاً به شکل A+B. سپس، مقدار ترکیبی جدید (A+B) هش میشود و نتیجه هش به همراه Salt ذخیره میشود. این بدان معناست که ویندوز هم Salt و هم هش را نگه میدارد (ذخیره Salt یکم پیچیدست، فکر کنم تو همون Hash ایجاد شده ذخیره کردتش ! نمیدانم، اطلاعی ندارم) وقتی شما سیستم را روشن کرده و رمز عبور خود A را وارد میکنید، ویندوز به دنبال Salt مربوط به حساب کاربری شما میگردد. ویندوز همان Salt را به رمز عبور وارد شده شما اضافه میکند (A+B مجدد)، و سپس این ترکیب را هش میکند. خروجی هش جدید با هش ذخیره شده قبلی مقایسه میشود. اگر این دو مقدار مطابقت داشته باشند، یعنی رمز عبور درست است و احراز هویت انجام میشود.
حالا یه سوال ! این رمزها کجا ذخیره میشن ؟
فایل SAM یک پایگاه داده محلی در سیستم عامل ویندوزه که حاوی اطلاعات حسابهای کاربری، از جمله نامهای کاربری، هشهای رمز عبور و سایر اطلاعات مرتبط با امنیته. این فایل در مسیر C:\Windows\System32\Config\SAM
قرار داره و فقط توسط سیستمعامل قابل دسترسی است. داخل فایل SAM بدین شکل اطلاعات ذخیره شده :Amirhosein:1001:0C730289EE93BEF567C4E018474523CF:A61D7214DB76A1B01ECF08562EE33FC6:::
بخش اول Username کاربر رو نمایش میده (Amirhosein)
بخش دوم : هر کاربر در سیستم ویندوز یک شناسه منحصربهفرد داره (User ID) که او را از دیگر کاربران متمایز میکنه. در اینجا 1001 شناسهی کاربر Amirhosein است.
بخش سوم هش رمزعبور با الگوریتم LM هست ! ویندوز از تکنیکهای مختلفی برای هش کردن رمز عبور استفاده میکنه. هش LM از روشهای قدیمیتره که امنیت کمتری داره. دلیل وجود هش LM در فایل SAM اینه که همچنان برخی از نسخههای قدیمیتر ویندوز از آن استفاده میکنند، و برای پشتیبانی از این نسخهها، هش LM ذخیره میشود.
بخش چهارم هش رمزعبور با الگوریتم NTLM هست ! این هش از الگوریتمهای امنیتی پیشرفتهتری نسبت به LM استفاده میکنه و از آنجا که امنیت بیشتری ارائه میده، در نسخههای مدرن ویندوز اولویت دارد. هش NTLM برای تأمین امنیت بالاتر استفاده میشود و دلیل وجود آن در فایل SAM اینه که پروتکلهای احراز هویت جدیدتر مانند NTLM و Kerberos از آن استفاده میکنند.
بخش آخر ! این مقادیر خالی معمولاً برای ذخیره مقادیر آینده رزرو شدهاند. ممکن است شامل اطلاعات اضافی امنیتی یا دادههای مرتبط با سیاستها باشند، اما در این مثال خالی هستند.
داخل توضیحات بالا صحبت از LM و NTLM شد. یکم بیشتر این موارد رو بررسی کنیم...
LM چیست ؟ LM یا LAN Manager یک پروتکل قدیمی است که برای احراز هویت در سیستمهای ویندوزی پیش از نسخه NT استفاده میشد. زمانی که ویندوز برای اولین بار ارائه شد، LM هشینگ استانداردی برای ذخیره رمزعبور بود. هرچند که با افزایش قدرت پردازش و پیشرفتهای امنیتی، امنیت آن کمتر شد.
NTLM چیست ؟ NTLM نسخه پیشرفتهتر LM عه که برای ارائه امنیت بیشتر توسعه یافت. پروتکل NTLM در ویندوز NT و نسخههای بعدی به کار گرفته میشود و تا زمانی که پروتکل Kerberos معرفی شد، استاندارد بود. NTLM از الگوریتم هشینگ MD4 استفاده میکنه که نسبت به LM امنیت بیشتری داره. NTLM علاوه بر هش کردن رمزهای عبور، به عنوان یک پروتکل احراز هویت در سطح شبکه نیز عمل میکنه. وقتی که یک کاربر به یک شبکه ویندوزی متصل میشود، NTLM فرآیند احراز هویت رو از طریق سه مرحله اصلی انجام میده که فعلا لازم نیست بررسی بکنیمش.
Kerberos چیست ؟ Kerberos یک پروتکل احراز هویت امنیتی است که برای شبکههای کامپیوتری طراحی شده و هدف آن تأمین امنیت ارتباطات در شبکههای غیر امن است.
(NTLM هنوز در بعضی شرایط خاص کاربرد دارد اما به دلیل آسیبپذیریهایش نسبت به Kerberos به تدریج در حال کنار رفتنه)
چطوری به فایل SAM دسترسی پیدا کنیم ؟
این پایگاه داده تو حالت عادی قابل دسترس نیست و قفل شده، یعنی حتی نمیشه این فایل رو کپی کرد به یه مسیر دیگه. روش های مختلفی هست برای دسترسی به این فایل و یکی از این روش ها استفاده از ابزار pwdump هست. این ابزار رو دانلود میکنم، cmd رو تو همون مسیر اجرا میکنم و این دستور رو اجرا میکنم تا ابزار خروجی رو داخل فایل smr.txt ذخیره کنه : PwDump7.exe > smr.txt
(این ابزار میاد کل سیستم رو از کار میندازه و دوباره خیلی سریع همه چیز رو به حالت اول تبدیل میکنه ! حالا نمیدونم اینکارو شبیه سازی میکنه یا واقعاً انجام میده)
داخل فایل، همون خروجی قرار داره که بالاتر بررسی کردیمش یعنی :Amirhosein:1001:0C730289EE93BEF567C4E018474523CF:A61D7214DB76A1B01ECF08562EE33FC6:::
یکم بالاتر گفتیم Salt به رمزعبور کاربر اضافه میشه تا از حملاتی مثل Rainbow Table جلوگیری کنه ! Rainbow Table چیه ؟ اگه شما یک عبارت مانند Hello رو با استفاده از یک الگوریتم مشخص هش کنید و سپس مجدداً آن را هش کنید، خروجی هش در هر دو بار یکسان خواهد بود. تو حالت عادی کرک، مثلاً من یک لیست از کلمات رو دارم ! سیستم من میاد دونه دونه کلمات رو هش میکنه، و هش شده کلمه من رو با هش رمزعبور مقایسه میکنه، اگه هش ها یکی بودن یعنی کلمه عبور من همون رمزعبور ویندوز هست که از فایل SAM برداشتیم. این روش خیلی طول میکشه و منابع زیادی رو مصرف میکنه ! یک مکانیسم دیگه ایی وجود داره به اسم rainbow table که بهتر از حالت عادی عمل میکنه. تو rainbow table یک عالمه کلمه از قبل هششون ساخته شده و موقع کرک فقط این هش هارو مقایسه میکنه.
چطوری کرک کنیم ؟
ابزاری وجود داره به اسم opcrack که اگه وارد سایتش بشم، قسمتی به اسم tables داره. تو این صفحه جداولی رو قرار داده ! مثلاً داخل یکی از جدول ها از عدد 0 تا 9 هست، از a کوچیک تا z کوچیک هست، از A بزرگ تا Z بزرگ (دقت کن هش اونها قرار داره نه خود کاراکتر ها)
CEH اومده حملات مربوط به پسورد رو دسته بندی کرده :
Non-Electronic Attacks (حملات غیرالکترونیکی) : این نوع حملات نیازمند دانش فنی نیستند و به عنوان حملات غیر فنی شناخته میشوند. مثال ها :
Shoulder Surfing : مشاهده مستقیم کاربر در حال وارد کردن رمز عبور.
Social Engineering : فریب کاربران به افشای اطلاعات محرمانه.
Dumpster Diving : جستجو در زبالهها برای یافتن اطلاعات حساس.
Active Online Attacks (حملات آنلاین فعال): این حملات با ارتباط مستقیم با دستگاه قربانی جهت کرک کردن پسورد انجام میشوند. حالتها :
Dictionary, Brute Forcing, Rule-based Attack : استفاده از لیستهای کلمات، تمام ترکیبات ممکن یا قواعد خاص برای حدس رمز عبور.
Hash Injection Attack : تزریق هشهای تقلبی برای دور زدن احراز هویت.
LLMNR/NBT-NS Poisoning : سوء استفاده از پروتکلهای شبکه برای گرفتن اعتبارنامهها.
Trojan/Spyware/Keyloggers : نصب نرمافزارهای مخرب برای سرقت اطلاعات ورود.
Password Guessing : حدس زدن دستی رمز عبور.
Internal Monologue Attack : بهرهگیری از مکالمات درونی سیستم.
Cracking Kerberos Passwords : کرک کردن سیستم احراز هویت Kerberos.
Passive Online Attacks (حملات آنلاین غیرفعال) : این حملات بدون ارتباط مستقیم با طرف احراز هویت کننده انجام میشن. مثال ها :
Wire Sniffing : شنود ترافیک شبکه.
Man-in-the-Middle Attack : رهگیری و دستکاری اطلاعات تبادل شده.
Replay Attack : ضبط و ارسال مجدد دادههای احراز هویت.
Offline Attacks (حملات آفلاین) : حملات آفلاین شامل سرقت فایلهای رمز عبور و تلاش برای کرک کردن آنها به دور از سیستم هدف است. حالتها :
Rainbow Table Attack : استفاده از جدولهای از پیش محاسبه شده شامل هشها.
Distributed Network Attack : استفاده از شبکههای توزیع شده برای افزایش سرعت کرک.
داخل حملات Active Online Attacks یک حالتی وجود داره به اسم Dictionary, Brute Forcing, Rule-based Attack که بیشتر بررسی کنیمش :
تو Dictionary Attacks هکر میاد یک لیستی از پسورد های احتمالی رو آماده میکنه و به واسطش روی سیستم قربانی تست میکنه.
تو Brute-Force Attacks هر ترکیب ممکن (حروف و اعداد) با هر قانون و شرایط مختلف (مثلاً طول پسورد 5 کاراکتر باشه یا…) برای رمز عبور تست میشود تا زمانی که رمز عبور صحیح پیدا شود. این روش تضمینکننده موفقیت است البته به شرطی که زمان و منابع کافی در اختیار باشد.
تو Rule-based Attacks من میام یک لیستی از کلمات احتمالی رو آماده میکنم، و از حالت Brute-Force هم کمک میگیرم ! یعنی میگم این کلمات آماده رو مثلاً با هم ترکیب کن یا...
تکنیک Cracking Passwords تموم شد ! کار رو با ادامه بدیم...
تعریف Vulnerability Exploitation : این تکنیک به استفاده از آسیبپذیریهای موجود در نرمافزارها و سیستمها اشاره دارد. هکرها میتوانند با شناسایی ضعفها در نرمافزارها، دسترسی به سیستمها را به دست آورند. این کار ممکن است شامل استفاده از کدهای مخرب و آسیبپذیریهای معروف (مانند Buffer Overflow) باشه (این تکنیک به نسبت Cracking Passwords رایج تره)
هکرها وقتی یک آسیب پذیری کشف میکنن و Exploit مربوط به اون رو ایجاد میکنن، اون Exploit رو داخل سایتهایی که پایین تر چندتاش رو مینویسم قرار میدن. ما میتونیم اسم نرم افزار یا سرویسی که مد نظر داریم رو داخل این سایت ها جستوجو کنیم تا ببینیم Exploit یی مربوط به آسیب پذیریش اومده یا نه !
Exploit-db
Vuldb
CVE
سوال اصلی ! Buffer Overflow چی هست ؟
فرض کن یه لیوان داریم. این لیوان ظرفیت مشخصی داره، مثلاً ۲۰۰ میلیلیتر. اگه بیشتر از این مقدار آب بریزیم، آب از لیوان سرریز میکنه و همه جا رو خیس میکنه. در دنیای کامپیوتر Buffer مثل همون لیوانه. Buffer یه فضای محدود در حافظهست که برای ذخیره اطلاعات استفاده میشه. اگه بیشتر از ظرفیتش بهش اطلاعات بدیم، اطلاعات اضافی به قسمتهای دیگه حافظه سرریز میکنن. این اتفاق رو Buffer Overflow میگن.
برنامهنویسان معمولاً برای ذخیره اطلاعات، یه فضای محدود در حافظه در نظر میگیرن. مثلاً یه برنامه ممکنه یه Buffer با ظرفیت 10 کاراکتر برای ذخیره اسم کاربر در نظر بگیره. حالا اگه کاربر یه اسم خیلی طولانی وارد کنه (مثلاً 20 کاراکتر) اطلاعات اضافی به قسمتهای دیگه حافظه سرریز میکنن. این قسمتهای دیگه ممکنه شامل دستورات مهم برنامه باشن. اگه هکر بتونه این سرریز رو کنترل کنه، میتونه دستورات خودش رو به برنامه تزریق کنه و سیستم رو هک کنه.
جمع بندی :
معمولا سرریز بافر به خاطر اشتباه برنامه نویس ها اتفاق میفته. مثلا بعضی وقتها برنامه نویس ها چک نمیکنن که آیا اطلاعات ورودی، از ظرفیت بافر بیشتر هست یا نه. اگه این بررسی انجام نشه، سرریز بافر خیلی راحت اتفاق میفته.
Buffer Overflow یه تکنیک قدیمی ولی همچنان خطرناک تو دنیای هکه. با این حال، با رعایت نکات امنیتی و استفاده از روش های مناسب، میشه ازش جلوگیری کرد.
برای درک خیلی بهتر موضوع Buffer Overflow یه مثال واقعی بزنم !
فرض کن یه برنامه داریم که از کاربر میخواد یه اسم وارد کنه. برنامه یه Buffer با ظرفیت ۱۰ کاراکتر برای ذخیره اسم در نظر گرفته.
char name[10]; printf("Enter your name: ");\ gets(name);
اگر کاربر اسم AmirHossein رو وارد کنه (11 کاراکتر) کاراکتر آخر (n) به قسمتهای دیگه حافظه سرریز میکنه. اگه هکر اسمی مثل AAAAAAAAAABBBBCCCC رو وارد کنه، این اطلاعات اضافی میتونن دستورات برنامه رو تغییر بدن و سیستم رو هک کنن.
برای جلوگیری از این روش، برنامهنویسان باید مراقب باشن و از توابع امن استفاده کنن. مثلاً به جای gets از fgets استفاده کنن که محدودیت طول ورودی رو رعایت میکنه.
char name[10]; printf("Enter your name: "); fgets(name, sizeof(name), stdin);
تو این حالت حتی اگه کاربر اسم طولانی وارد کنه، برنامه فقط 10 کاراکتر اول رو میگیره و سرریز اتفاق نمیافته.
بیشتر از این وقت برای Buffer Overflow نمیزارم و بعدا که با زبان C آشنا شدم و یکمم اطلاعاتم بیشتر شد (مثلا راجب RAM و...) حتما میرم سر وقت Buffer Overflow.