من با یک دفترچه یادداشت شروع کردم. نه یک ویرایشگر متن یا یک فایل markdown، بلکه یک دفترچه یادداشت کاغذی فنری پر از دستوراتی که درکشان نمیکردم. من ls ،grep ،find ،chmod و nmap را یادداشت میکردم. صفحه پس از صفحه را با سینتکس پر میکردم، طوری که با Linux و امنیت سایبری مثل آزمونهای لغتنامه برخورد میکردم؛ انگار که دانستن پرچمهای (flags) بیشتر نسبت به نفر بعدی، مرا توانمند میکرد. میتوانستم سینتکس را بهراحتی کپی کنم. اما اگر از من میخواستید توضیح دهم چرا یک دستور نتیجه خاصی را برگرداند، ساکت میماندم. آن سکوت، خودِ مشکل بود.
تلهی دفترچه یادداشت
دفترچه یادداشت شبیه پیشرفت به نظر میرسید. هر صفحه جوهر بیشتری اضافه میکرد: find / -name "*.conf", nmap -sV, grep همراه با پایپها (pipes) و عبارتهای منظم (regular expressions). در آموزشها، این روش خوب به نظر میرسد. ارائهدهنده دستوری را تایپ میکند، صفحه نمایش خروجی مورد انتظار را نشان میدهد و شما هم به نشانه تایید سر تکان میدهید. احساس توانمندی میکنید چون ترمینال شما دقیقاً مشابه ترمینال آنهاست. اما این توانمندی عاریهای است؛ متعلق به کسی است که مسیر آموزشی را طراحی کرده است.
محیطهای واقعی از اسکریپتها پیروی نمیکنند. یک سرور اتصال SSH شما را رد میکند، در حالی که پورت باز است. یک اسکریپت با خطای "permission denied" شکست میخورد، در حالی که قبلاً chmod +x را اجرا کردهاید. یک اسکن، پورت را به جای باز (open)، فیلتر شده (filtered) گزارش میدهد و حالا باید تصمیم بگیرید که آیا این به معنای یک قانون فایروال است، یا یک کنترل مبتنی بر میزبان، یا یک سیستم جلوگیری از نفوذ (IPS) که بیصدا پروبهای شما را حذف میکند. در آن لحظات، حفظ کردن سینتکس شکست میخورد، زیرا مشکل، دستوری نیست که فراموش کردهاید؛ بلکه سیستمی است که درک نمیکنید.
کپی کردن، یادگیری نیست
بین دنبال کردن یک آموزش و حل کردن یک مسئله تفاوت وجود دارد. وقتی کپی میکنید، از مرحله A به مرحله B روی نقشه شخص دیگری میروید. وقتی چیزی منحرف میشود، خشکتان میزند چون مدل ذهنی شما خالی است. میدانید که chmod 755 مجوزها را تغییر میدهد، اما نمیتوانید توضیح دهید چرا وقتی فایل روی یک mount با پرچم noexec قرار دارد، سیستم همچنان دسترسی را مسدود میکند. میدانید nmap میتواند پورتها را اسکن کند، اما نمیتوانید تفسیر کنید که چرا وقتی بازرسی وضعیتدار (stateful inspection) در میان است، یک SYN scan نتایج متفاوتی نسبت به یک connect scan برمیگرداند.
شما در حال یادگیری Linux یا شبکه نبودید؛ شما در حال یادگیری تقلید کردن بودید.
سوال را معکوس کنید
من یک چیز را تغییر دادم. دیگر نمیپرسیدم «کدام دستور این را درست میکند؟» و شروع کردم به پرسیدن «سیستم واقعاً دارد چه کار میکند؟». این تغییر ناخوشایند بود چون سرعت مرا کم میکرد، اما در ذهنم ماندگار شد.
مجوزهای فایل را در نظر بگیرید. chmod یک دعای جادویی با اعداد نیست. بلکه لایه سطحی از نحوه میانجیگری هسته (kernel) برای دسترسی به inodeها است. وقتی درک کنید که سیستمعامل ID کاربر موثر (effective user ID) شما را با مالک، گروه و سایرینِ فایل مقایسه میکند، آن اعداد معنا پیدا میکنند. وقتی یاد میگیرید که مجوزهای دایرکتوری کنترل میکنند که آیا میتوانید وارد یک مسیر شوید یا محتویات آن را لیست کنید، دیگر از خود نمیپرسید که چرا میتوانید یک فایل را بخوانید اما نمیتوانید به آن دسترسی پیدا کنید. متوجه میشوید که مجوز اجرا (execute permission) روی یک دایرکتوری به معنای اجرای برنامهها نیست؛ بلکه به معنای اجازه یافتن برای دسترسی به inodeهای داخل آن است. ناگهان، chmod نیازی به حفظ کردن ندارد؛ بلکه به زمینه (context) نیاز دارد.
اصول شبکه همین کار را برای nmap انجام میدهند. اسکن پورت، لیستی از درهای باز نیست؛ بلکه گفتگویی ساخته شده از بستهها (packets) است. وقتی دستدادن سهمرحلهای TCP (three-way handshake) را درک کنید، میفهمید چرا یک SYN scan به امتیازات raw socket نیاز دارد و چرا یک پورت بسته با RST پاسخ میدهد، در حالی که یک پورت فیلتر شده ممکن است اصلاً هیچ پاسخی به شما ندهد. دیگر ترکیب پرچمها را حفظ نمیکنید و شروع میکنید به استدلال درباره اینکه چه بستههایی میفرستید و سکوت یا نویز به چه معناست.
حتی ابزارهای لایه اپلیکیشن مثل Burp Suite هم وقتی HTTP را درک کنید، برایتان روشن میشوند. این فقط یک پروکسی است که بین شما و یک وبسرور قرار گرفته است. اگر متدهای HTTP، هدرها، کدهای وضعیت و نحوه نگاشت درخواستها به منطق سمت سرور را درک نکنید، Burp Suite فقط یک داشبورد گیجکننده از دکمهها خواهد بود. وقتی بدانید یک درخواست چگونه سفر میکند و یک سرور چگونه پاسخ میسازد، کار با ابزار بدیهی میشود. شما در حال یادگیری Burp Suite نیستید؛ شما در حال بازرسی HTTP با استفاده از Burp Suite هستید.
بنیان خود را بسازید
اگر تازه شروع کردهاید، در برابر وسوسه جمعآوری cheatsheetها مقاومت کنید. روی سه حوزهای تمرکز کنید که هرگز قدیمی نمیشوند.
برای مبانی Linux، یاد بگیرید که هسته چگونه فرآیندها را زمانبندی میکند، شل چگونه دستورات را تجزیه (parse) میکند و متغیرهای محیطی چگونه بر رفتار برنامه تأثیر میگذارند. stdin ،stdout و stderr را نه به عنوان اطلاعات جزئی، بلکه به عنوان لولهکشیای که باعث کارکرد پایپها میشود، درک کنید.
برای پروتکلهای شبکه، بدون عجله، پشته TCP/IP را مطالعه کنید
