ورود به دنیای برنامه نویسی شبکه (آموزش مقدماتی)

آموزش ورود به برنامه نویسی شبکه با پایتون

ورود به دنیای برنامه نویسی شبکه

اول از همه بگم ببینید دوستان برنامه نویسی شبکه هدف نیست… یعنی مثل برنامه نویسی وب یا اندروید Django( و )Kivy هدف بالا اوردن سایت یا اپ اندرویدی نیست… بلکه برنامه نویسی شبکه یک روش است. مثلا شما شبکه کار در جایی هستید و حتی با سیستم های سیسکو درحال کار هستید و شما نیاز دارید یک سری کار ها بصورت اتوماتیک انجام شوند یعنی بصورت کد بنویسید و یه موقعی ران کنید و یه سری کارها انجام شوند. یا مثلا شما نیاز دارید یک سرویس ایمیل داخلی راه اندازی کنید و هدرها دست خودتون باشه لذا از این روش استفاده میکنید. البته برنامه نویسی شبکه با پایتون برای دوستان امنیت کار هم بسیار کاربرد داره. خیلی از امنیت کارها نیاز دارند تا بسته هایی که تو شبکه در حال جابهجایی هست رو شنود یا حتی دستکاری کنند و بسته دلخواه خودشون رو ارسال کنند.

و یا حتی اینکه اسکنری طبق میل خودشون راه اندازی کنند. خب ماژول هایی هست که برای پایتون هم کاردبرد داره از جمله .scapy حالا ما میخوایم بصورت کلی تو این مقاله شمارو با این کارها و اساسا پیش نیاز هایی که داره برای پیاده سازی این کارها رو بیان کنیم و یه مقدار فضا رو برای شما روشن تر کنیم.

پیش نیاز ها:

خب شما بسته به کاری که میخواید انجام بدید پیش نیاز های متفاوتی داره. ولی اساسا یک سری پیش نیاز ها برای همه کارها مشترک است. از جمله این پیش نیاز ها دانش اولیه شبکه است. مباحثی که در NETWORK+ بحث میشود. برای مثال سرویس های FTP، SMTP و یا مباحث اولیه از جمله TCP/IP، OSI، DNS و… .

از جمله مبحث دیگه همون برنامه نویسی پایتون هست که در حد مقدماتی کافی به نظر میرسه. از اینجا به بعد، بستگی به کار شما داره. برای مثال شما میخواید یه سری کارهای تجهیزات سوییچ یا روتر سیسکو رو برنامه بنویسید خب مسلما شما نیاز به دانش سیسکو مثل CCNA، CCNP و یا حتی CCIE دارید. یا ممکن است شما امنیت کار باشید و در سطح شبکه بخواید برای جایی

امنیت شبکه رو فراهم کنید خب مسلما شما علاوه بر مباحث قبلی نیاز به دانستن مباحث امنیتی از جمله Kali Linux،Lpic1،Lpic2، CEH و یا حتی مباحث پیشرفته تر دارید. پس پیش نیاز های شما بستگی به کار شما داره. حالا تو این مقاله بریم جلوتر و کارایی ماژول ها و.. رو ببینیم بیشتر متوجه خواهید شد.

ماژول های پایتون برای برنامه نویسی شبکه:

ماژول های بسیاری برای برنامه نویسی شبکه برای پایتون هستند از قبیل Socket، Scapy، asyncoro و یا بسیاری از ماژول های دیگر که میتونید سرچ کنید. اما دو ماژول که بسیار پرکاربرد تر هستند Socket و Scapy هستند. البته باز هم بستگی به کار شما داره که برای هر ماژول به راحتی میتونید سرچ کنید. ما در اینجا قصد داریم Scapy و Socket رو معرفی کنیم.

وب اسکرپینگ:

بسیاری از دوستان بحث وب اسکرپینگ رو هم جز دسته برنامه نویسی شبکه با پایتون در نظر میگیرند. البته اینجا قصد نداریم روی این دسته بندی بحث کنیم. فقط میخوایم یه معرفی کلی روی این بحث انجام بدیم. شما در بحث scraping web میاید و یک صفحه وب رو crawl میکنید. در واقع مثل گوگل میرید و یک صفحه رو میخونید و اگر خواستید پردازشی روش انجام میدید.

حالا این بحث پیچیدگی های خودشو داره. برای مثال کد های جاوا اسکریپتی که توی یک صفحه وب هست رو باید پردازش کنید و دردسر های خودشو داره. اگه بخوایم یک مثال برای این کار بزنیم اینه که شما مثلا یک اپلیکیشن بسازید که داده های آنی رو بره از صفحه های بورس بگیره و برای شما بیاره و شما بخواید روی این داده ها مثلا بحث ماشین لرنینگ رو پیاده سازی کنید. خب اگه بخوایم ماژول های مهمی از این بحث معرفی کنیم میتونیم به ماژول های Selenium، request، urllib2 که برای دادن انواع

درخواست ها به صفحه است و برای پردازش کد های html و.. میتوان از ماژول beautifulsoup نام برد. برای دنبال کردن این بحث میتونید به این لینک مراجعه کنید.

معرفی پکیج : Socket

خب در این مبحث میخوایم با ماژول socket آشنا بشیم. کتاب ها و مراجع بسیاری هستند برای آموزش این پکیج و مثال های زیادی از این ماژول وجود داره. اما میخوایم تو این قسمت صرفا یه آشنایی کلی داشته باشیم.

برای نصب این پکیج از دستور socket install pip استفاده میکنیم.

اصلا کجا ها این پکیج استفاده داره؟

ببینید شما زمانی که بخواید یه لینکی ایجاد کنید بین دوتا سیستم و یا اپ، نیاز دارید یه سوکت بسازید و حالا مثلا بصورت سرور- کلاینت ازش استفاده کنید. فرض کنید شما بخواید تو یک شبکه به یک IP متصل شید و یه سری کار هارو انجام بدید. خب شما

نیاز دارید اول یه سوکت بسازید و بعدش با اون IP ارتباط برقرار کنید. به این سطح از اتصال network to access level Low services میگن. سطح level High هم به پیاده سازی یک سری پروتکل های FTP، HTTP و.. میگن.

اینجا ما یک مثال را مطرح خواهیم کرد تا یه مقدار بیشتر آشنا بشین با این ماژول.

ورود به دنیای برنامه نویسی شبکه
ورود به دنیای برنامه نویسی شبکه

خب کدی که در این اینجا میبیند، میخواد یک سرور رو راه اندازی کنه برای اتصال یک کاربر بهش.

خب اینجا اول یه سری از این توابع رو با هم جداگونه بررسی میکنیم که در برنامه نویسی شبکه با پایتون کاربرد زیادی دارند (دوستان برای هر زبون برنامه نویسی خیلی خوبه که اون تابع و یا چیزای دیگرو مراجعه کنید تو داکیومنت های مخصوص به خودش.)

  • s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

این تابع درواقع میاد و یک object از سوکت میسازه. البته ورودی هم داره:

ورودی اول) این ورودی مشخص میکنه که IP از نوع ipv4 است.

ورودی دوم) این ورودی نیز مشخص میکنه که از نوع TCP باشه یا .UDP که الان SOCK_STREAM برای TCP استفاده میشه.

SOCK_DGRAM که برای UDP بکارمیره.

  • host = socket.gethostname()

این تابع مقدار host سیستمی که کد پایتون روش اجرا میشه رو برمیگردونه. مثلا .localhost این تابع خروجی string رو برمیگردونه. همچنین اگه شما خواستید مقدار هاست رو ip یک سایت ست کنید میتونید از تابع socket.gethostbyname() استفاده کنید و اسم اون سایت رو بهش بدید. مثلا .socket.gethostbyname(‘google.com’)

فرایند ارتباط :server-client

خب این سناریو رو با تصویر زیر روشن میکنیم.

آموزش برنامه نویسی شبکه با پایتون
آموزش برنامه نویسی شبکه با پایتون

خب این تصویر یه اطلاعات جامعی از نحوه ارتباط server با client ارائه میده. خب اول باید از سرور شروع کنیم. سرور اول باید یک سوکت ایجاد کنه و بعدش باید به اصطلاح bind کنه. یعنی آماده برای متصل شدن کاربران بهش بشه. بعد از bind کردن شروع میکنه گوش دادن به اون پورت خاصی که ما مشخص میکنیم. به اصطلاح پورت رو listen میکنه. همچنین تو این بخش مشخص میشه که تعداد client هایی که تو صف وایستادن (تصور یک صف از client هارو بکنید)، چقدر باشه. حالا اینجاست که client شروع به راه اندازی میشه.

پس میریم تو بخش client فعلا. خب کلاینت هم باید اول یه سوکت بسازه تا بتونه یه لینک ارتباطی درست کنه. بعدش میاد با متد connect از طریق پورتی که تو بخش سرور مشخص شد و همچنین از طریق هاستش به سرور درخواست اتصال رو میده. حالا دوباره باید بریم تو سرور و به این درخواست هایی که از طرف client میاد رو پاسخ بدیم. با متد accept این درخواست هارو قبول میکنیم.

اکنون client و server به هم متصل هستند و میتونن به هم دیگه اطلاعات ارسال و دریافت کنن. حالا فرض میکنیم این اطلاعات ارسال و دریافت شده و client کارش تموم شده. حالا client میاد با متد close به سرور اطلاع میده که میخواد به اصطلاح session رو ببنده. سرور این رو دریافت میکنه و session رو خاتمه میده. این نحوه ایجاد یک session بین client و server بود. حالا میریم ادامه کد.

ادامه کد برنامه نویسی شبکه با پایتون در کالی لینوکس:

خب به اینجا رسیدیم که پورت رو مشخص کردیم حالا میایم روی هاست و پورتی که مشخص کردیم bind میکنیم.

  • socket.bind(host,port)

این متد دو ورودی میگیره که یکی هاستمون هست و یکی پورتی که میخوایم روش لینک برقرار کنیم.

حالا میایم داخل یک حلقه بینهایت ارتباط با client رو برقرار میکنیم. اول باید برای هر client که درخواست ارتباط میکنه، درخواست رو قبول کنیم.

  • socket.accept()

این متد برای قبول درخواست ارتباط از طرف client بکارمیره. این متد دوتا خروجی داره. یکی به نام conn و یکی به نام .address که خروجی conn یک شی جدید از سوکت هست که روی این شی میتونیم بین سرور و کاربر چیزی رو دریافت و یا ارسال کنیم و همچنین خروجی address آدرس انتهای سوکت است که متصل شده. و برای هر سیستم متصل شده یک آدرس متفاوته.

حالا میخوایم به client چیزی رو ارسال کنیم.

  • socket.send()

این متد یک ورودی از جنس string رو داره و این مقدار رو ارسال میکنه به اون سوکتی که توسط ارتباطی که بین یه سرور و یه کاربر صورت گرفته، ارسال میکنه. یعنی همین سوکتی که خروجی متد accept بوده که بالاتر گفتیم .conn

حالا که کارمون با client تموم شد میایم ارتباط رو میبندیم.

  • socket.close()

این متد ابتدا همه منابعی که دراختیار گرفته بود رو آزاد میکنه بعدش اتصال رو میبنده و دیگ همه متد های ارتباطی از کارمیوفتن. دقت کنید که در اون لحظه اتصال رو قطع نمیکنه و اگه بخواید اتصال رو در لحظه قطع کنید از متد shutdown() باید استفاده کنید.

خب این یک نمونه از سرور بود. حالا بریم یک نمونه از کاربر رو ببینیم. به این کاربر client هم میگویند.

آموزش برنامه نویسی شبکه

خب همونطور که در بخش فرایند ارتباط توضیح دادیم در سمت client هم باید شی سوکت رو ایجاد کنیم. بعدش میایم هاستی که کد داره اجرا میشه رو با متد socket.gethostname() صدا میزنیم. بعدش با مشخص کردن پورتی که تو سمت سرور ایجاد

کردیم درخواست اتصال میکنیم با متد .connect() بعدش اومدیم با متد recv(1024) تعداد 1024 کارکتری که از طرف سرور دریافت کردیم رو چاپ کردیم.

البته برای بعضی از دوستان ممکنه ارور بده اینجا که بگه این کاراکتر هایی که از طرف سرور داره ارسال میشه باید بصورت باینری باشه و نه .string این دسته از دوستان باید تو تابع send() که سمت سرور بود باید بیان اینکارو کنن:

نکات امنیت و شبکه

حالا اگر بخوایم این کد هارو ران کنیم ابتدا دو کد رو ذخیره کرده و حالا اگه ویندوز باشید از طریق cmd و تو لینوکس هم در شل میتونید این هارو ران کنید.

آموزش امنیت و شبکه
آموزش امنیت و شبکه

در اینجا ما ابتدا سرور رو راه اندازی کردیم و الان در حال گوش دادن به ارتباط جدید هست از طرف .client و حالا client را در صفحه دیگه ای از cmd وارد میکنیم.

امنیت و شبکه با پایتون
امنیت و شبکه با پایتون

الان که client درخواست ارتباط کرد به سمت سرور، سرور هم همون عبارتی که خواسته بودیم رو ارسال کرد. و سمت کلاینت ارتباط تموم شد. ولی هنوز سرورمون در حال گوش دادن به ارتباط جدیده.

خب این یه مثال از ارتباط های سوکت بود. حالا تو بحث بعدی میخوایم راجب بسته های شبکه و ماژول Scapy صحبت کنیم.

ماژول :scapy

خب این ماژول برای کارکردن با بسته هایی که در شبکه در ارتباطن به کار میره. یعنی درواقع شما میتونید بسته ای با هدر های دلخواه بسازید و در شبکه تزریق کنید و یا بسته هایی که در شبکه هستند رو دریافت کنید و پردازش کنید. دوستانی که با wireshark کار کردن درک میکنند. برای مثال میتونید با جعل کردن خودتون با یک ip یا یک mac جعلی شبکه رو sniff کنید و بسته هایی که مال شما نیستند رو به سمت خودتون هدایت کنید.

این ابزار برای دوستان امنیت کار خیلی مفید هست. این ابزار برای سیستم عامل لینوکس (توزیع کالی) نصب است. همچنین شما میتونید این کتابخونه رو در کد خودتون import کنید و ازش استفاده کنید. آموزش های کاملی از این کتابخونه در اینترنت شاید خیلی کم باشه و نسبت به socket نیست و کتابهای کمی هست که این ماژول رو آموزش داده باشه. ما اینجا میخوایم مثل socket یک آشنایی کلی با این کتابخونه شما پیدا کنید. لذا مثالی خواهیم زد راجب این کتابخونه و یکی از کاربرد های کوچیک از این ابزار را شرح خواهیم داد.

برای نصب این پکیج از دستور scapy install pip استفاده میکنیم.

در اینجا ما مثال IP-Spoofing را بررسی میکنیم.

:IP-Spoofing

در حمله IP-Spoofing بطور کلی ما میایم و تو درخواست خودمون به مقصد که حالا یا سایت هست یا یک سیستمی در شبکه، ما ip خودمون رو با یه ip دیگ ای عوض میکنیم. و زمانی که پاسخ درخواست ما میخواد ارسال بشه برای یکی دیگ ارسال میشه (همون ip ای که وارد کردیم.) برای توضیح بیشتر به این تصویر دقت کنید:

ورود به دنیای برنامه نویسی شبکه با پایتون
ورود به دنیای برنامه نویسی شبکه با پایتون

در تصویر همه چی مشخصه . ولی یه توضیح کاملتر بگیم راجبش. ببینید در واقع شخص Bot (که همون کد ماست) اومده و به سرور یه پکتی ارسال کرده که از طرف victim هست (یعنی همون شخصی که IP جعلیشو جای خودمون میزنیم.) سرور هم میبینه که باید بسته هایی رو به یه نفر ارسال کنه. اون یه نفر همونیه که ما تو پکت IP شو میزنیم.

IP Spoofing DDoS Attack
IP Spoofing DDoS Attack

همونطوری هم که تو بسته معلومه Adress Destination میشه، آدرس یا IP سرور. و Adress Source میشه همون IP جعلی که درج میکنیم. (ولی تو یه بسته سالم IP سیستم خودمون هست).

خب حالا بریم سراغ کد:

آموزش پایتون در شبکه و امنیت
آموزش پایتون در امنیت و شبکه

خب تو این کد ما اومدیم اول از طریق ماژول sys از طریق محیط command، IP مبدا و مقصد رو دریافت میکنیم و سپس از طریق متد IP این مقادیر رو وارد وارد میکنیم. و با / به هدر ICMP درج میکنیم. الان ما یه بسته با هدر ICMP یا همون PING داریم که با متد send() ارسال میکنیم. و اگه پاسخی اومد اون رو با متد show() نمایش میدیم. دقت کنیم که بسته در جواب اینجا برای ما نمیاد و برای کسی میاد که ما IP رو وارد کنیم در محیط cmd (که جعلی است.) و تنها زمانی این پاسخ ping برای ما میاد که ما بتونیم خودمون رو MIM کنیم. که حالا بحث جداگانه خودشو داره و ما اینجا MIM رو انجام ندادیم لذا انتظار مشاهده پاسخ رو نداریم.

حالا برای راحتی دوستان این توابع و متد هارو جداگونه بررسی میکنیم.

  • Import sys

این ماژول را اینجا برای اینکه بتونیم ورودی های کد رو بصورت command بدیم. یعنی مثلا تو صفحه CMD در ویندوز و یا شل در لینوکس، ورودی هارو بهش ارسال کنیم.

  • Sys.argv

argv درواقع لیست آرگومان هاییه که بصورت ورودی به کد میدیم و مثلا sys.argv[0] آرگومان اول این لیسته.

  • Sys.exit(1)

این متد برای خروج از برنامه است. ورودی این متد میتونه string هم باشه که مثلا خطارو نشون بده. ولی بصورت معمول مقدار 1 برای خروج با error syntax و مقدار 0 برای خروج موفقیت آمیز است. لذا ما اینجا مقدار رو 1 گذاشتیم. ولی شما حتی میتونید

. sys.exit(“dadash eshteb zadi”) مثلا بنویسید

  • IP()

خب برای درک بهتر این متد بریم یه نگاهی به لایه 3 مدل TCP/IP بندازیم.

Image result for tcp/ip layer 3

خب چیزای مهمی که تو این لایه هست مثلا version، TTL، Source و destination هست. ما با این متد میتونیم خیلی از اینارو دستی بدیم و یا خودش بصورت دیفالت ست کنه خیلی هاشو. برای مثال ببینید به این کدها:

آموزش ترمینال کالی لینوکس
آموزش ترمینال کالی لینوکس

خب مثلا تو این کد اومدیم ما اول یه بسته لایه 3 ای با IP ورژن 6 ساختیم و یا حتی میتونیم ورژن 4 درست کنیم. ویا حتی میتونیم ttl رو تغییر بدیم. همونطور که میبینیم خودش بصورت دیفالت IP مبدا و مقصد رو مشخص کرده که مبدا سیستم خودمون و مقصد رو localhost قرارداده.

دستورات کالی در شبکه
دستورات کالی در شبکه

با متد show() هم میتونیم محتویاتش رو ببینیم.

ما در اکثر اوقات همون IP مبدا و مقصد رو ست میکنیم و بقیه رو بصورت دیفالت میگذاریم بمونه.

  • /

خب این علامت به این سادگی کار بزرگی رو برامون انجام میده و اون کار چسبوندن لایه ها به همه. مثلا تو همین کد ما اومدیم لایه IP یا همون لایه 3 رو به ICMP چسبوندیم که مقادیری که ما دستی گذاشتیم ست میشه جای مقادیر دیفالت.

  • Send()

این تابع برای ارسال بسته در لایه 3 بکار میره. این یعتی هم لایه 2 رو پشتیبانی میکنه هم اینکه مسیریابی )routing( میکنه.ما تو این تابع میتونیم کارت شبکه ای که ازش میخوایم بسته ارسال بشه رو هم مشخص کنیم. البته تابع های دیگ ای هم برای ارسال هست که تنظیمات بیشتری داره.

حالا ما اینجا برای تست دوتا سیستم رو پیاده کردیم. یکی Linux Kali (که نقش مهاجم رو داره) و یکی Windows که نقش victim رو داره (کسی که بهش حمله میشه.)

خب برای شروع ابتدا کد رو در کالی سیو میکنیم. و بعد با دستور:

Python IPSpoofing 192.168.50.134 192.168.50.128

رو اجرا میکنیم. دقت کنید که در اینجا IP مبدا ما 192.168.50.134 و مقصد ما 192.168.50.128 است. که IP مبدا همون IP جعلی ماست که پاسخ بسته ICMP یا همون پینگ بهش ارسال میشه. حالا بریم برای اجرا:

آموزش کالی لینوکس
آموزش کالی لینوکس

خب بسته ما ارسال شد. حالا بریم تو victim ببینیم که بسته پینگ رسیده یا نه.

ما اینجا با wireshark بسته ها رو مشاهده میکنیم. همچنین 192.168.50.134 رو فیلتر میکنیم.

بستهی سوم که همون ICMP هست نشون دهنده اینه که کد ما داره به درستی کار میکنه. اما دقت کنید نوشته response no found! که همون نشون دهنده اینه که ما این IP مبدا که وارد کردیم اصلا تو شبکه نبود و سیستم مورد نظر پیدا نشد که پاسخ بسته پینگ رو براش بفرسته.

خب اینم از معرفی .scapy دیدیم که چجوری به راحتی میتونیم بسته های دلخواهمون رو وارد شبکه کنیم و یا دریافت کنیم.

حمله های تحت وب در برنامه نویسی شبکه:

در انتها بحثی هست که با تمام این مباحث یه مقدار متفاوت است. در این بحث ما با استفاده از همون ماژول هایی که برای Web Scraping استفاده میکردیم، استفاده میکنیم و حمله هایی تحت وب رو انجام میدیم. حمله هایی مثل injection SQL ویا بسیاری از حمله ها پردازش های دیگر.

خب در این مقاله سعی شد مروری بصورت کلی روی ماژول ها و کاربرد های پایتون در شبکه بکنیم. امیدواریم این مقاله دید خوبی رو بهتون داده باشه و استفاده خوبی ازش برده باشید. بدونید استفاده از این ماژول ها و کاربرد ها به اینجا ها اصلا ختم نمیشه و داستانی پشت اینهاست. تا مقاله ای دیگر بدرود.

 

0 0 رای ها
Article Rating
اشتراک در
اطلاع از
guest
0 Comments
قدیمی‌ترین
تازه‌ترین بیشترین رأی
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
0
افکار شما را دوست داریم، لطفا نظر دهید.x

سبد خرید شما خالی است