در این بخش از دوره آموزشی SEC542 از موسسه SANS به آشنایی با زبان پایتون به صورت ابتدایی پرداخته و نحوه کد نویسی با آن را شرح می دهیم.
Python for Pen Testers
بسیاری از مهاجمان اسکریپتهای سفارشی خود را ایجاد میکنند و ما هم به عنوان تست نفوذگر باید قادر به انجام چنین کاری باشیم. برخی از این اسکریپت ها در هر تارگتی متفاوت بوده و برای شرایط ویژه طراحی میشوند ولی برخی دیگر برای مصارف عمومیتر استفاده شده و موجب صرفه جویی در فرآیند تست نفوذ میشوند.
از آن جا که اکثر زبان ها از درخواستهای HTTP و پاسخهای ارسالی از آن پشتیبانی مینمایند، استفاده از هر زبانی که با آن آشناتر هستید، بسیار مفید خواهد بود ولی در این جا ما از زبان پایتون استفاده میکنیم زیرا این ابزار در حال حاضر برای نوشتن ابزارهای جدید در تست نفوذ برنامههای وب کاربرد دارد. بنابراین دانستن این زبان نه تنها به ما کمک میکند که تستهای خود را بهتر انجام دهیم، بلکه به ما در عیب یابی، رفع و گسترش ابزارها نیز کمک میکند.
یادگیری زبان پایتون راحت بوده و همچنین دارای کتابخانههای فراوانی برای مدیریت درخواستهای HTTP میباشد، به همین دلیل شما برای ایجاد اغلب اسکریپت ها نیازی به نصب موارد دیگری به غیر از پایتون نخواهید داشت. به همین دلیل استفاده از این زبان برنامه نویسی در فرآیند تست نفوذ وب پیشنهاد میگردد.
این ابزار در برخی از سیستم عامل ها مانند لینوکس یا MacOS به صورت پیش فرض نصب بوده و همچنین میتوانید نسخه ویندوزی آن را نیز بر روی سیستم عامل ویندوز نصب کنید. در حال حاضر پایتون از نسخههای 2.x و 3.x استفاده میکند و در این کتاب تمرکز ما بر روی پایتون 2.x میباشد.
Python Variables
تعریف متغیر در پایتون به راحتی انجام میگیرد و نیازی به تعریف نوع آن نمیباشد مثالهای زیر تعریف متغیر و نسبت دادن مقدار به آن را نشان میدهد:
name = “Python for Pentest”
year = 1980
movie = True
در انتها با استفاده از دستور print میتوان مقادیر بالا را مشاهده نمود:
print(name,year,movie)
نوع دیگری از تعریف متغیر، استفاده از لیست ها میباشد. شما میتوانید از لیست ها برای ذخیره سازی آرایههایی از متغیر ها استفاده نمایید:
نوع دیگری از تعریف متغیرها، استفاده از دیکشنری ها میباشد. دیکشنری میتواند جفت پارامتر name/value را در خود نگهداری نماید:
Comments and Code Blocks
یکی از مواردی که در زبانهای برنامه نویسی وجود دارد، ایجاد توضیحات یا کامنت گذاری است. برای این منظور در پایتون جهت کامنت یک خط از # و برای کامنت نمودن چندین خط از ‘’’ یا “”” استفاده میشود:
علاوه بر کامنت گذاری، در پایتون باید به تورفتگی ها و فاصله ها نیز دقت نمود. در هنگام استفاده از دستوراتی که بلاکی از کدها را شامل میشوند، استفاده صحیح از تورفتگی ها بسیار حائز اهمیت میباشد:
Python If Statement
پایتون در این بخش با زبانهای دیگر متفاوت است زیرا دستور switch را پشتیبانی نمیکند و شما تنها باید از if استفاده نمایید. در زبان پایتون برای ساختار شرطی از if/else استفاده میشود و زمانی که بیش از دو شرط داشته باشیم از else if استفاده میکنیم:
Python Looping Structures
همانند زبانهای دیگر، زبان پایتون نیز دارای دستورات مربوط به حلقه While و For میباشد. از حلقه While برای زمانی که نیاز به اجرای چندین باره یک متغیر میباشد، استفاده میگردد. به عنوان مثال، اگر ما قصد تست Session Time-Out را داشته باشیم، ممکن است از یک حلقه While استفاده کنیم تا مشاهده کنیم که آیا پاسخ HTML ما را به صفحه لاگین هدایت میکند یا خیر.
از حلقه For نیز برای اجرای یک کد به تعداد خاص استفاده میشود.
همچنین از دستورات Continue و Break برای کنترل ساختار حلقه استفاده میشود:
Python Functions
توابع یکی از قابلیتهایی است که در هر زبانهای برنامه نویسی وجود دارد. از توابع برای ایجاد قطعات کدی که قابلیت استفاده مجدد دارد استفاده میشود. این توابع میتوانند در هر جایی فراخوانی شوند ولی در پایتون شما نیاز دارید که این توابع را قبل از استفاده، تعریف نمایید.
برای تعریف توابع از عبارت def استفاده شده و در ادامه نام تابع قرار میگیرد. در ادامه ما میتوانیم هر متغیری که میخواهیم را درون تابع بین () قرار دهیم. همچنین تابع دارای بخش Return نیز میباشد که داده ها را از تابع به بخش کدی که آن را فراخوانی نموده ایم، بازگردانده میشود.
اگر کدهای بالا را در یک فایل با نام function.py ذخیره نموده و آن را اجرا کنید، خروجی آن به صورت زیر میباشد:
Python Standard Library
یکی از دلایل اصلی محبوبیت زیاد پایتون، کتابخانههای استاندارد آن است. بر خلاف بسیاری از زبان ها که در آن مجبور هستیم تا بسته ها و ماژول ها را نصب نماییم، پایتون اغلب توابع رایج را در اختیار دارد. یکی از مواردی که برای ما بسیار مهم است، ابزارهای فشرده سازی(gzip)، رمزنگاری(sha1)، HTTP Processing و Regular Expression Handling است که این موارد در پایتون قابل دسترس بوده و حتی برخی از توابع برای تجزیه و تحلیل HTML (HTML Parsing) نیز در آن موجود میباشد.
Making HTTP Requests within Python
برای انجام کارهای مختلف با پروتکل HTTP، سه کتابخانه httplib، urllib و urllib2 در پایتون قابل استفاده میباشد. ما در اینجا از کتابخانه httplib استفاده میکنیم:
خروجی کد بالا به صورت زیر میباشد:
در مثال بالا هنگامیکه ارتباط ما با سایت مورد نظر برقرار شد و درخواست را ارسال نمودیم، پاسخ آن در یک متغیر با نام resp قرار میگیرد. در ادامه ما میتوانیم از Statementهای مختلفی برای استخراج اطلاعات ذخیره شده در متغیر resp استفاده کنیم. به عنوان مثال resp.getheader() هدرهای مختلف را باز میگرداند و ما میتوانیم با استفاده از قرار دادن مقدار مورد نظر در بین پرانتز، خروجی آن را پرینت نماییم:
print resp.getheader(“Set-Cookie”)
Accessing Files in Python
یکی از مواردی که در زبانهای برنامه نویسی مختلف وجود دارد، خواندن و نوشتن در فایل ها است. این موضوع بسیار رایج است که در فرآیند تست نفوذ ما بخواهیم فایلهایی را بخوانیم که نامهای کاربری و کلمات عبور دو نمونه رایح هستند که به ذهن میآیند.
ما همچنین میخواهیم نتایج را به یک فایل ارسال کنیم. زبان پایتون نیز این قابلیت را برای ما میسر میسازد. برای خواندن فایل در پایتون میتوان از سه روش زیر استفاده کرد:
Read: این روش محتویات فایل داخل یک string بارگذاری میکند.
همچنین برای مشاهده تعداد کاراکتر دلخواه از فایل مورد نظر میتوانید عدد آن را در پرانتز جلوی عبارت read قرار دهید. به عنوان مثال برای چاپ 5 کاراکتر اول فایل بالا میتوانید از عبارت print(f.read(5)) استفاده نمایید.
Readline: این روش یک خط از فایل را بازیابی میکند.
خروجی کد بالا به صورت زیر میباشد:
Readlines: این روش فایل را به عنوان مجموعه خطوط در یک لیست باز میگرداند.
همچنین شما با استفاده از یک حلقه for نیز میتوانید فایل را به صورت خط به خط بخوانید:
برای نوشتن در فایل نیز میتوان از متد write استفاده نمود:
با اجرای فایل بالا یک فایل متنی با نام SEC542.txt ساخته شده و هر یک از عبارت مشخص شده در یک خط مجزا نوشته میشوند.