در قسمت اول و دوم از مبحث شل اسکریپت با "Bash" و برخی دستورات آن آشنا شدیم. همچنین یاد گرفتیم که چگونه با کمک آن چندین دستور را بصورت همزمان در ترمینال لینوکس اجرا کنیم. از آنجایی که اکثر هکر ها از پایتون (Python) برای نوشتن کد اکسپلویت خود استفاده می کنند، در ادامه مطلب به نوشتن یک اسکریپت ساده به زبان پایتون می پردازیم تا هم با برخی دستورات این زبان آشنا شویم و هم تفاوت های آن را با مترجم قبلی (Bash) ببینیم.
مترجم های (Interpreter) زبان های اسکریپتی مانند پرل و پایتون بصورت پیش در توزیع های مختلف لینوکس موجود می باشند. کالی هم از این قاعده مستثنا نیست. مترجم مربوط به زبان پایتون در کالی در دایرکتوری /usr/bin/python
قرار دارد.
- کارایی
خوب اسکریپتی که می خواهیم بنویسیم مانند دستور netcat که در اینجا توضیح دادیم عمل می کند. یعنی می خواهیم با کمک آن به یک پورت خاص مثلا پورت 80 روی یک سیستم فعال در شبکه مثلا 192.168.1.50 متصل شویم تا از باز یا بسته بودن آن مطلع شویم.
- نوشتن اسکریپت
مراحل زیر را دنبال کنید:
- ابتدا یک فایل جدید با نام
pythonscript.py
در دایرکتوری Home و با استفاده از ویرایشگر nano* می سازیم:
*قبلا هم گفتم که این فایل رو می تونید توی هر ویرایشگری که دوست دارید بنویسید.
- در خط اول محل مترجم پایتون را وارد می کنیم:
- با دستورات زیر دو متغییر به نام های ip و port برای گرفتن آدرس سیستم و پورتی که می خواهیم امتحان کنیم ایجاد می کنیم و از کاربر می خواهیم که آنها را وارد کند. فایل را بصورت زیر ویرایش کنید:
ip = raw_input("Enter the ip: ")
port = input("Enter the port: ")
همانطور که مشاهده می کنید از دو دستور raw_input
و input
استفاده کرده ایم. دستور raw_input در پایتون برای گرفتن مقادیر بصورت String و input برای گرفتن مقادیر بصورت عددی (INT) است. در خط سوم هم چون می خواهیم مقدار پورت را بصورت عددی ذخیره کنیم از input استفاده می کنیم.
- حالا فایل را بصورت زیر ویرایش می کنیم تا اسکریپت ما بتواند با متغییر های ذخیره شده به سیستم مورد نظر متصل شده و باز یا بسته بودن پورت را چک کند:
import socket
ip = raw_input("Enter the ip: ")
port = input("Enter the port: ")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if s.connect_ex((ip, port)):
print "Port", port, "is closed"
else:
print "Port", port, "is open"
در خط دوم از دستورت import برای وارد کردن کتابخانه socket استفاده کرده ایم. کتابخانه socket در پایتون برای انجام کارهای مربوط به شبکه مثل باز کردن یک سوکت بکار گرفته می شود.
در خط پنجم با استفاده از کتابخانه socket یک سوکت TCP برای ارتباط با شبکه روی کامپیوتر خود باز کرده و در متغییر s ذخیره می کنیم*.
*دستور socket.socket(socket.AF_INET, socket.SOCK_STREAM) برای باز کردن یک سوکت TCP در پایتون استفاده می شود.
در خط ششم از یک دستور شرطی (if...else
) استفاده کرده ایم که به یک پورت روی ip داده شده متصل می شود و باز یا بسته بودن آن را چک می کند. همانطور که می بینید برای این کار از دستور connect_ex
استفاده کرده ایم.
برای بهتر متوجه شدن دستور شرطی بالا این نکته را در نظر بگیرید که سوکت باز شده و ذخیره شده در s، می تواند جهت اتصال به پورت روی ip تعیین شده از دو دستور connect
و connect_ex
در پایتون استفاده کند. این دو دستور یک کار را انجام می دهند و تنها تفاوت آنها این است که:
-
دستور
connect
در صورت اتصال هیچ و در صورت عدم اتصال یک نوشته یا string را به کاربر بر می گرداند. - ولی دستور
connect_ex
در صورت عدم اتصال یک کد خطا و در صورت اتصال عدد 0 را برای ما می فرستد.
چون ما می خواهیم در صورت اتصال هم از وضعیت سوکت مطلع شویم از دستور connect_ex
استفاده می کنیم. حالا اگر خروجی ما در خط ششم 0 بود با "Port <شماره پورت> is open
" و اگر چیز دیگری بود با "Port <شماره پورت> is closed
" روبرو می شویم.
خط هفتم و نهم هم همانطور که مشاهده می کنید وضعیت پورت را با دستور print
* در ترمینال نمایش می دهند.
*دستور print مشابه دستور echo در BASH است.
- فایل خود را با CTRL+X ذخیره کنید.
- قبل از اجرا و امتحان فایل باید دسترسی فایل را هم به اجرایی برای مالک تغییر دهیم (اطلاعات بیشتر) پس دستور زیر را در ترمینال وارد می کنیم:
- حالا فایل را اجرا کنید. من می خواهم پورت 80 روی آدرس 192.168.1.53 را امتحان کنم:
Enter the ip: 192.168.1.53
Enter the port: 80
پورت 80 روی این سیستم باز است پس خروجی باید به شکل زیر باشد:
- اگر یک پورت بسته مثل 81 را وارد کنید خروجی به شکل زیر است:
در این مطلب با مباحث ابتدایی اسکریپت نویسی توسط پایتون آشنا شدیم. در مقالات بعدی مبحث امنیت شبکه روش استفاده از متا اسپلویت در کالی را یاد میگیریم. مقالات مبحث شل اسکریپت پیش زمینه ای برای امنیت شبکه می باشند.