شاید تصور کنید منظورم قرصهای توهمزا و روانگردان است اما نه، LSD در دنیای کامپیوتر به معنای local security database است. در هر کامپیوتر (هر سیستم عاملی) بخشی بنام LSD یا Local Security Database وجود دارد که وظیفه نگهداری اطلاعات userها و کاربران را برعهده دارد.
شما ممکن هست بخواهید در یک شبکه Work Group از یک کامپیوتر استفاده نمایید. برایای کار باید user name و passwd کامپیوتر را داشته باشیم. خب کامپیوتر بعد از وارد کردن username و پسورد سیستم عامل اطلاعات وارد شده توسط ما را با LSD خود چک میکند.
اما اهمیت LSD بیشتر از مواردی هست که تا اینجای کار گفته شد. LSD مجموعهای از User Accountها، گروهها، شناسههای امنیتی و… میباشد. از طرفی میتوان گفت هرگونه فرایند Authentication و Authorization که توسط سیستم عامل در شبکههای WorkGroup انجام میگردد به نوعی وابسته LSD میباشد.
اگر شما به تازگی با مفهوم LSD آشنایی پیدا کرده باشید ممکن هست این مطلب برای شما جذاب باشد. ممکنه خیلیها علاقهمند به این باشند که از پسورد کامپیوترها باخبر شوند، و فکر کنند با استفاده از این فایل LSD میتوان به آن دستیابی پیدا کرد.
فقط تا این حد بدانید که قبل از من و شما سازندگان سیستم عامل به اهمیت فایل LSD پی بردهاند و علاوه بر محافظتهایی که خود سیستم عامل از LSD انجام میدهد، حتی اگر به محتوای این فایلها نیز دسترسی پیدا کنی قادر به فهمیدن پسورد نخواهید بود.
البته برای این کار روشهایی وجود دارد که شما بتوانید به آسانی پسورد داخل LSD را تغییر دهید ولی فهمیدن پسورد قبلی کار زمانگیر و در مواردی نشدنی هست. (نشدنی به این معنا که این کار ارزش اینقدر زمان گذاشتن را ندارد.)
محل ذخیره سازی LSD
خب سوال بزرگ اینه که LSD کو؟! کجاست این LSD که میگی؟! بده ببینیم…
LSD یک مفهوم هست و در سیستم عاملهای مختلف مانند ویندوز، مک، اندروید و یا سیستم عاملهای لینوکسی؛ نام و محل ذخیرهسازی آن متفاوت است.
چون همه ما با سیستم عاملهای مایکروفتی مثل ویندوز ۱۰ کار کردیم من اول از همه از مایکروسافت شروع میکنم.
LSD در سیستم عامل های مایکروسافتی
در سیستمهای مایکروسافتی شما با مراجعه به آدرس «C:\Windows\System32\config» قادر خواهید بود که فایلی به نام SAM را مشاهده کنید. این فایل همان LSD در سیستم عاملهای مایکروسافتی میباشد. البته در آینده ممکن هست حرف خودم رو نقض کنم ولی برای الان شما این فایل رو LSD در نظر بگیرید.
اگر بخواهید این فایل را با یک نرمافزار اجرا کنید تا از محتویات آن باخبر شوید، با چنین پیغامی مواجه خواهید شد:
ممکن هست فکر کنید چون شما دسترسی به این فایل را ندارید قادر به بازکردن آن نیستید، یا تصور کنید که تنها مشکل پرمیشن هست.
یا اینکه فکر کنید این فایل چون در حال اجرا هست شما توانایی اجرا و ادیت آن را ندارید. نمیگم که این موارد نیست، ولی موضوع مهمتر این هست که سیستم عامل از این فایلها بدلیل اهمیت بالای آن محافظت میکند.
یا بهتر بگم سیستم عامل داره با زبون بی زبونی بهمون میگه : "زورم زیاده ... نمیخوام این فایل رو بازش کنم ..."
حالا چجوری میشه این فایل SAM که LSD ویندوز هست رو باز کرد؟
شما تا زمانی که ویندوز در حال اجرا هست، بصورت مستقیم قادر به باز کردن فایل SAM نیستید و به اصلاح باید از آن نسخه offline تهیه کنید تا بتوانید اطلاعات این فایل را در یک بازه زمانی مشاهده کنید.
از طیق سیستم عاملهای لینوکسی شما به راحتی میتوانید به سراغ SAM ویندوز بروید و آن را مشاهده کنید. یا ز طریق دستور زیر هم در command prompt با دسترسی Administrator میتوانید محتویات فایل SAM را داخل یک پوشه بنام sam در درایو C کپی کنید:
reg save hklm\sam c:\sam
حالا من اگه این کار را انجام بدم و فایل نهایی را باز کنم با تصاویر زیر مواجه میشوم:
ما تونستیم فایل SAM رو باز کنیم ولی هنوز نمیتونیم محتویاتشو بخونیم. چون از encryption خاصی برای فایلهای SAM بهره گرفته شده ولی نگران نباشید. روشهایی وجود دارد که میتوان محتویات دقیق فایل SAM را مشاهده کرد.
من در مقالهای جداگانه قصد دارم در مورد استخراج SAM ویندوز صحبت کنم، چون ابزارها برای استخراج این فایل بسیار زیاد و گسترده هست.
حالا اگر شما موفق به مشاهده اطلاعات درون SAM فایل ویندوز شوید یه چیزی تو مایههای زیر میبینید:
ali:500:aad3b435b51404eeaad3b435b51404ee:3e24dc ead23468ce597d6883c576f657:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe 0d16ae931b73c59d7e0c089c0:::
userd:1000:aad3b435b51404eeaad3b435b51404ee:64f1 2cddaa88057e06a81b54e73b949b:::
ساختار به این صورت است که یوزرزهای لوکالی یک کامپیوتر در سمت چپ و در سمت دیگر هش پسورد (Passwd hash) قرار میگیرد. سوالی که اینجا برای هر فرد مبتدی ممکنه بوجود بیاد اینه که hash پسورد چیه؟
رمزنگاری دنیای خیلی بزرگی دارد و hash تنها بخش کوچکی از آن است و من نمیتوانم در این مقاله بصورت کامل راجب هشینگ توضیح بدم. اگه خیلی ساده بخوام به قضیه نگاه کنم، hash یک الگوریتمی هست که یک رشته از اعداد، کاراکتر و یا هر چیز دیگه رو، به یک رشته از کاراکترها تبدیل میکنه که از تعداد کاراکتر مشخصی متشکل هستند.
دقیقا همانند چیزی که در بالا جلوی اسم هر یوزر مشاهده میکنید. این الگوریتمها، از ریاضی گرفته شدن و نکته مهمتر اینکه غیر قابل بازگشت هستند. یعنی شما ممکنه یه فایل رو بدی به یک تابع هش و یه هش ۱۲۸ بیتی دریافت کنی ولی نمیتونی این هش ۱۲۸ بیتی رو بدی به یک الگوریتم و همون فایل رو بگیری.
الگوریتمهای هش به گونهای طراحی شدهاند که تقریبا میتوان گفت نسبت به دو رشته متفاوت شما نمیتوانید خروجی یکسانی از آن دریافت کنید.
یافتن پسورد یک کامپیوتر از روی LSD
استفاده از الگوریتمهای هش باعث شده امنیت سیستمها افزایش پیدا کند و شما در صورد داشتن hash پسور هم قادر به فهم آن و ورود به سیستم نیستید.
برای همینم من بالاتر بهتون گفتم تعویض پسورد و کرک کردن اون کار سادهای هست در صورتی که شما فیزیک دستگاه رو داشته باشی یا بهتر بگم Access داشته باشی به یه سیستمی ولی اینکه بفهمی طرف پسورشو چی گذاشته کار سادهای نیست.
حتی اگه پسورد کاربر خیلی طولانی باشد ممکن است پیدا کردن پسورد، تا حدودی غیر ممکن باشد. برای اینکه شما بخواهید پسورد یک یوزر مایکروسافتی رو تغییر بدید کافیه از یک ابزار استفاده کنید که به صورت بوتیبک قبل از ویندوز اجرا شه و تغییراتی توی فایل SAM ایجاد کنه.
تعداد این نرم افزارها و ابزارها برای این کار زیاد هست و شما حتی در سیستم عاملهای لینوکسی هم مثالهایی برای اینکار دارید. در واقع در این نرم افزارها شما برای یک یوزر، یک پسورد انتخاب میکنید و نرمافزار رمز انتخابی شما را بصورت hash شده در SAM ذخیرهسازی میکند.
نمونهای از این نرم افزارها، نرمافزار pcunlocker هست که برای ریست کردن پسورد فراموش شده شما یا دور زدن پروسه اعتبارسنجی ویندوز کاربرد دارد.
ولی از جا بفهمیم که یک کاربر قبلا چه پسوردی روی کامپیوتر خود گذاشته؟
برای این کار دو مرحله اول باید پسورد Hash شده یوزر مورد نظر را داشته باشید. اگر کاربر شما دانش کاملی از انواع فایلها و کامپیوتر دارد و شما هم دسترسی فیزیکی به کامپیوتر هدف ندارید، کار شما برای بدست آوردن هش پسور بسیار دشوار خواهد بود.
همان طور که گفتم الگوریتمهای هشینگ غیر قابل بازگشت هستند و به هیچ عنوان هیچ الگوریتم یا نرم افزاری قادر به بازگردانی آنها نیست.
بر فرض که ما هش پسورد رو بدست آوردیم ....
در مرحله دوم شما باید یه لیست از پسوردهایی که کاربر ممکن هست از آنها استفاده کند داشته باشید. ممکن هست کاربر ترکیبی از اسم، حروف ابجد اسم، کد ملی، شماره موبایل، نام همسر، سال تولد، اسم حیوان خانگی، وسیله مورد علاقه، عدد شانس، روز تولد و… برای پسورد استفاده کرده باشد.
منظورم از لیست پسورد یه همیچین چیزی هست:
- 1qaz@WSX
- P@ssw0rd
- 1234
- Ali0912
- …
حالا شما در مرحله بعدی باید همه این پسوردها رو هش کنید و با هشینگ پسورد کاربر هدفتون تطابق بدید، با این کار متوجه پسورد کاربر خواهید شد. ولی اگر تعداد کاراکترهای پسورد کاربر خیلی طولانی و غیر قابل هدس باشد، ممکن است یافتن پسورد تا حدود زیادی غیر قابل یافتن و غیر ممکن باشد.
چون عملا کاربر با افزایش هر کاراکتر تعداد یک توان به پسوردهایی که شما باید داشته باشید تا بتوانید بسورد کاربر را حدس بزنید اضافه میکند. در این میان سایتهایی هم استند که از شما هزینهای دریافت میکنند یا بصورت رایگان این کار را برای شما انجام میدهند.
این سایتها از قبل پسورد هش پسوردهای زیادی را بدست آوردهاند و با تطبیق هش پسور ورودی با دیتابیس خود، پسورد نهایی را بدست میآورند. نکته مهم اینجاست که هیچ یک از این سایتها اینقدر کامل نیست که بتواند هر پسوردی را داشته باشد. اینکه شما بگویید هش تمامی پسوردها را تا ۱۰ کاراکتر دارید ادعای بزگی هست.
برای همینم خیلی از این سایتها برای یافتن پسورد شما هزینه دریافت میکنند. اگه شما با مفهوم جایگشت آشنایی دارید متوجه میشوید من میخوام چه چیزی بگویم.
نکته دیگر این هست که این سایتها معمولا میتوانند پسوردهایی را پیدا کنند که از ترکیب کاراکترهای انگلیسی و اعداد و symbolها بدست آمده و من بشخصه خیلی بعید میدانم بتوانند پسوردی که شامل کاراکترهای فارسی هست رو در این سایتها پیدا نمود.
پسورد مهندسی چیست؟
ما در امنیت شبکه و دورههای مایکروسافتی با مفهومی بنام پسورد مهندسی آشنا میشویم. در دورههای مایکروسافتی معمولا دانشجویان به «P@ssw0rd» میگن پسورد مایکروسافتی، یعنی از نظر مایکروسافت پسوردی که داخل آن حروف بزرگ و کوچک، symbolها و اعداد وجود داشته باشد؛ پسورد استانداردی خواهد بود.
دانشجویان کلاسهای امنیت معمولا ین دو پسورد را به نام پسوردهای مهندسی میشناسند:
- P@ssw0rd
- Pa$$w0Rd
البته که استفاده از این دو پسورد خیلی باعث کاهش امنیت میشود چود بسیاد قابل پیش بینی هستند و منظور از این مفاهیم استفاده از پسوردی شبیه به این دو پسورد بالا است. خیلی مهم است که یک پسورد قابل پیش بینی و حدس نباشد.
LSD در سیستم عامل های لینوکسی
من در مورد سیستم عاملهای لینوکسی دانش خیلی زیادی ندارم و به قول معروف لینوکس کار نمیکنم. ولی یه آشنایی خیلی جزئی با این مباحث در کلاس CEH داشتم که دوست دارم آن را هم با شما به اشتراک بگذارم.
همین طور که یوزرنیم و پسوردها در سیستم عاملهای ویندوزی به فایل «SAM» انتقال داده میشود، در سیستم عاملهای لینوکسی هم محلی لوکالی برای ذخیرهسازی پسوردها وجود دارد. در گذشته همه یوزرنیمها و پسوردها در فایلی به نام passwd قابل مشاهده بود.
یعنی شما در یک سیستم عامل لینوکسی به راحتی میتوانستید با استفاده از دستور زیر محتوای فایل passwd را مشاهده و به راحتی hash پسوردها را بدست بیاورید:
root@mixseda:~# cat /etc/passwd
بدلیل بروز یکسری مشکلات امنیتی پس از مدتی پسوردها را از این فایل حذف کردند و به فایل دیگری به نام shadow انتقال دادند. در فایل passwd شما میتواید یوزرها را مشاهده کنید ولی پسورد جلوی هر یوزر با حرف X نمایش داده میشود. شما با استفاده از دستور زیر و مشاهده فایل shadow قادر خواهید بود hash پسوردهای فعال در یک سیستم را مشاهده کنید:
root@mixseda:~# cat /etc/shadow
ساختار پسوردها در فایل shadow بصورت زیر طراحی شده است:
“Username”:“Password Hash”:“Password History”:“Minimum password life”:“Maximum password life”:“warndays”:“inactive”:“Disable time”:“Reserve”
اگه یکم دقیقتر به ساختار فایل shadow نگاه کنید، دقیقا همانند یک جدول طراحی شده تا اطلاعات کاربران را نگهداری کند. و هر ستون با استفاده از کاراکتر «:» از ستون بعدی جدا شده است. در ادامه قصد دارم در مورد هر کدام از مفاهیم بصورت خلاصه صحبت کنم.
Username
سادهترین مفهومی که شما میتوانید با دیدن محتویات فایل shadow متوجه آن شوید همین نام کاربری است. Username نشان دهنده این است که چه یوزرهایی بصورت لوکالی بر روی این سیستم وجود دارند.
به این نکته توجه کنید که لزوما هر یوزری که توی این بخش قرار دارد امکان login به سیستم کامپیوتری شما را نخواهد داشت.
Password Hash
پسوردی که شما برای یک سیستم عامل لینوکسی تایین میکنید یصورت clear text ذخیرهسازی نمیشود. پسوردهای وارد شده در سیستم عاملهای مختلف توسط الگوریتمهای غیر قابل بازگشت رمزنگاری و hash میشوند.
بدیهی هست که در صورتی که یک پسورد بصورت hash ذخیره شده باشد، تابعی وجود نخواهد داشت که بتواند این hash را به پسورد اولیه بازگرداند. البته که روشهایی برای بدست آوردن پسورد اولیه وجود دارد.
در بخش «Password Hash» پسورد شما بصورت hash شده در سیستم عامل لینوکسی شما قرار میگیرد. پس از هر بار login و احراز هویت شما؛ سیستم عامل یکبار پسورد وارد شده شما را توسط الگوریتمها به hash تبدیل نموده و با این مقدار تطبیق میدهد.
خود «Password Hash» شامل سه بخش زیر میشود و از ساختار زیر الگو میگیرد:
$type$salt$hashed
Type
Type نشان دهنده نوع الگوریتمی هست که برای هشینگ از آن استفاده شده است. برای مثال برای الگوریتمهای زیر در اول مقدار «Password Hash» مقادیر جدول پایین قرار میگیرند.
Hashing algorithm |
Type |
MD5 |
$1$ |
Blowfish |
$2a$ |
Eksblowfish |
$2y$ |
SHA-256 |
$5$ |
SHA-512 |
$6$ |
ممکن هست در یک سیستم عامل سخصیسازی شده شما ترکیبی از این الگوریتمها را با تغییراتی مشاهده کنید. و یا ممکن است از الگوریتمهای دیگری هم برای هش پسورد استفاده شود.
Salt
تصور کنید که دو user پسوردهای یکسانی داشته باشند، با این توصیف hash پسورد آنها نیز یکسان خواهد بود. Salt مقداری است که در hash دخال میکند و باعث متمایز شدن hash پسورد میشود. دقیقا مانند چاشنی که شما به غذای خود اضافه میکنید.
وجود این مقدار فواید بسیاری دارد و خود آن توسط یک الگوریتم محاسبه میگردد.
Hashed
این مقدار هم هش پسورد شماست یعنی طبق توضیحات گفته شده در بالا، پسورد شما بعلاوه تابع هش با مقدار salt مشخص برابر این مقدار است.
Password History
Password History نشان دهنده آخرین باری است که پسورد هر username دچار تغییر شده است. در واقع این مقدار به ما تاریخچه یک پسورد را در لینوکس نشان میدهد. این مقدار با نام «last_change» هم شناخته میشود.
Minimum password life
همان طور که از نام این قسمت پیداست این قدار نشان دهنده این است که حداقل عمر پسورد چقدر میباشد.
Maximum password life
همانند بخش «Minimum password life»؛ بخش Maximum password life تایین کننده حداکثر عمر پسورد تایین شده برای user میباشد. این مقدار با نام «max_age» هم شناخته میشود.
warndays
خیلی بدیهی است که اگر قرار هست یک پسورد طی یک زمان مشخص منقضی شود، بایئد قبل از آن به کاربر اطلاع داده شود. ممکن است اگر اطلاعرسانی صورت نگیرد، کاربر هیچ وقت برای تغییر پسورد خود اقدام نکند یا متوجه محدود بودن دسترسی خود نباشد.
«warndays» نشان دهنده آن است که چه مدت قبل از منقضی شدن پسورد، به کاربر هشدار داده شود.
inactive
این قسمتعدم فعالیت هر user را پس از منقضی شدن پسورد نشان میدهد.
Disable time
این مقدار نشان دهنده میزان روزهایی است که یک کاربر غیرفعال میباشد. این مقدار با نام «expiry» هم شناخته میشود.
Reserve
در خیلی از دیتابیسها برنامه نویسان تدابیری اندیشیدهاند تا اگر شما نیاز به اضافه نمودن یک مقدار به پایگاه داده خود داشتید بتوانید براحتی آن را اضافه نمایید.
این موضوع در قطعات سخت افزاری نیز قابل رویت است و بیشتر تجهیزات، مخصوصا در حوزه شبکه دارای کانکتورهای رزرو میباشند. در خیلی از پایگاههای داده نیز این موضوع قابل مشاهده میباشد.
مقدار «Reserve» نی ز در اینجا چنین کاربردی دارد و هنوز استفادهای برای آن تایین نشده است.
ممکن است شما اگر فایل shadow روی سیستم عامل خود را مشاهده کنید ممکن است خیلی از مقادیری که در بالا آن را توضیح دادیم، فاقد مقداری باشد. در برخی از سیستم عاملهای لینوکسی که شخصیسازی شده اند، مانند برخی از سیستم عاملهای گوشی موبایل جای برخی از مقادیر تغییراتی داشته است.
و یا اینکه شما ممکن است ببینید در یک سیستم عامل از الگوریتمهای متفاوتی برای hash پسورد استفاده شده است. نمونهای از فایل shadow که من از اینترنت پیدا کردم بصورت زیر است:
root:$6$dSx6v.3w$NXENWxEl.eIlbCLSkbInpKpCHapHqwnyBzOxfu5R7p9zcdP4K3ucUkXZXPNbyr.rz6J9IaFQArxCa9fzXXwiW.:16835:0:99999:7:::
daemon:*:16471:0:99999:7:::
bin:*:16471:0:99999:7:::
sys:*:16471:0:99999:7:::
sync:*:16471:0:99999:7:::
games:*:16471:0:99999:7:::
man:*:16471:0:99999:7:::
lp:*:16471:0:99999:7:::
mail:*:16471:0:99999:7:::
news:*:16471:0:99999:7:::
uucp:*:16471:0:99999:7:::
proxy:*:16471:0:99999:7:::
www-data:*:16471:0:99999:7:::
backup:*:16471:0:99999:7:::
list:*:16471:0:99999:7:::
irc:*:16471:0:99999:7:::
gnats:*:16471:0:99999:7:::
nobody:*:16471:0:99999:7:::
libuuid:!:16471:0:99999:7:::
mysql:!:16471:0:99999:7:::
colord:*:16471:0:99999:7:::
usbmux:*:16471:0:99999:7:::
miredo:*:16471:0:99999:7:::
ntp:*:16471:0:99999:7:::
Debian-exim:!:16471:0:99999:7:::
arpwatch:!:16471:0:99999:7:::
avahi:*:16471:0:99999:7:::
beef-xss:*:16471:0:99999:7:::
dradis:*:16471:0:99999:7:::
pulse:*:16471:0:99999:7:::
speech-dispatcher:!:16471:0:99999:7:::
haldaemon:*:16471:0:99999:7:::
sshd:*:16471:0:99999:7:::
snmp:*:16471:0:99999:7:::
iodine:*:16471:0:99999:7:::
postgres:*:16471:0:99999:7:::
redsocks:!:16471:0:99999:7:::
stunnel4:!:16471:0:99999:7:::
statd:*:16471:0:99999:7:::
sslh:!:16471:0:99999:7:::
Debian-gdm:*:16471:0:99999:7:::
rtkit:*:16471:0:99999:7:::
saned:*:16471:0:99999:7:::
در مورد گروهها در سیستم عاملهای لینوکسی هم یک دنیا حرف برای گفتن است ولی شما فعلا در این دوره در این د بدانید که محل ذخیرهسازی گروهها در سیستم عاملهای لینوکسی در فایلی به نام group قرار دارد و شما با دستور زیر قادر خواهید بود آنرا مشاهده نمایید:
root@mixseda:~# cat /etc/group
گروهها در سیستم عاملهای لینوکسی ساختار سادهتری دارند و بطور معمول از ساختار زیر استفاده میکنند:
“groupname”:“x”:“group_ID”:“[username[,username]...]”
هر کدام از این مقادیر را من در جدول زیر بصورت خلاصه توضیح میدم:
مقدار |
توضیح |
groupname |
اسم گروه |
x |
پسورد گروه (در برخی سیستمعاملها پشتیبانی نمیشود) |
group_ID |
شناسه منحصر فرد گروه |
username |
یوزرنیم های متعلق به این گروه |