HAM

HAM

سه نفر که عاشق تکنولوژی و کامپیوترا هستن این وبلاگو شروع کردن
HAM

HAM

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

سلام سلام سلام

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

رمزنگاری فایل ها در پایتون

درود به همه !

 

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

خب برای نصب این کتابخونه از طریق  pip اقدام میکنیم .

 

برای نصب کتابخونه روی لینوکس از دستور زیر استفاده میکنیم :‌

realHAM@debian:~$ pip3 install pyAesCrypt

 

برای نصب کتابخونه روی ویندوز از دستور زیر استفاده میکنیم :

C:\> pip install pyAesCrypt

 

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

 

سورس رمزنگاری :‌

 برای مشاهده سورس به گیت هاب سر بزنید.


در ابتدا کتابخانه را ایمپورت کردیم . بعد یه متغییر تعریف کردیم به اسم bufferSize که میزان بافر برای رمزنگاری کردن را مشخص میکنیم . ما گفتیم ۶۴ ضرب در ۱۰۲۴ یعنی ۶۴ کیلوبایت .

بعد اومدیم اسم فایلی که میخوایم رمز نگاری کنیم رو پرسیدیم . بعد پسوورد برای فایل پرسیدیم .

سپس در متود pyAesCrypt.encryptFile اومدیم ابتدا فایلی که میخوایم رمز نگاری کنیم رو بهش دادیم و بعد اسم فایل رمزنگاری شده رو بهش دادیم که میخواد خروجی بده و بعد پسوورد و نهایتا bufferSize

و تمام

 

اما سورس رمزگشایی :

 برای مشاهده سورس به گیت هاب سر بزنید.

 

خب اینم زیاد فرقی با قبلی نداره . بازم اسم فایل رو اول پرسیدیم (فایلی که میخوایم رمزگشایی کنیم) . بعد پسوورد فایل رو پرسیدیم (باید پسووردی که در سورس قبل یعنی موقع رمزنگاری بهش دادیم رو اینجا بدیم) . حالا اومدیم با عبارت try و متود pyAesCrypt.decryptFile فایل رو رمزگشایی کردیم . همینطور که میبینید در متود pyAesCrypt.decryptFile ابتدا نام فایلی که میخوایم رمزگشایی کنیم رو بهش  دادیم . بعد نام فایل رمزگشایی شده یعنی خروجی کار . و سپس پسوورد و نهایتا باز bufferSize .

اگه پسوورد رو اشتبا بزنیم یا به هرحال یه مشکلی پیش بیاد فایل رمزگشایی نمیشه یعنی کد های داخل try اجرا نمیشن و کد های داخل except اجرا میشن . این باعث میشه متن ارور نمایش داده بشه و بعدشم از اسکریپت خارج بشه .

 

یا حق !


در اینده این دو اسکریپ را یکی کرده و قابلیت خواندن ارگومان را اضافه میکنم تا بتوانید مثل یک ابزار استفاده کنید

کنترل کردن کامپیوتر با استفاده از ربات تلگرام

درود به همه !

 

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

خب همونطور که میدونید برای تلگرام یه کتابخونه ای وجود داره به اسم python-telegram-bot که در واقع یک API برای بات های تلگرام در پایتون هستش و ما میتونیم از طریق این کتابخونه توی پایتون ربات تلگرام بنویسیم .

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

نصب کتابخونه در لینوکس :

realHAM@debian:~$ sudo pip3 install python-telegram-bot

نصب کتابخونه در ویندوز :

C:\> pip install python-telegram-bot

 

برای دیدن و دانلود سورس کد به گیت هاب سر بزنید.


توضیح کد : طبق معمول در خط اول و دوم کتابخونه های مورد نیاز رو وارد کردیم . از کتابخونه ی telegram دو کلاس Updater و CommandHandler رو ایمپورت کردیم که بعدا کاربردشو میبینیم . و همچنین کتابخونه ی subprocess رو نیز برای اجرای دستورات در خط فرمان و دیدن نتیجه ی آن ها ایمپورت کردیم .

سپس اومدیم یه شیء از کلاس Updater ساختیم که درواقع همون شیء مربوط به ربات تلگراممونه . نکته ای که هست اینه که کلاس Updater اولین ورودی که میگیره آدرس توکن ربات تلگرام هستش که باید آدرس توکن ربات خودتونو بدین . در ادامه توضیح بیشتری راجع بهش میدیم .

پس از اون یه تابع به اسم start تعریف کردیم که وقتی کاربر توی ربات دستور start/ رو برای شروع کردن ربات میزنه کد های داخلش اجرا میشه . همینطور که میبینید ما داخلش با استفاده از تابع sendMessage گفتیم یه پیام به اسم Connected به کاربر ارسال کنه . از این طریق کاربر میفهمه ربات فعاله یا نه .

بعد از این تابع ، تابع اصلی برنامه یعنی تابع run_command رو نوشتیم . طرز استفاده از ربات به این صورته که برای مثال وقتی من میخوام دستور ifconfig درون خط فرمانم اجرا بشه باید اینطوری برای ربات بنویسم :

/run ifconfig

دقیق تر بگم سینتکس استفاده از رباتمون رو اینجوری تعیین کردیم :‌

/run <command>

که به جای command دستوری که میخوایم اجرا بشه قرار میگیره .

خب وقتی کاربر از سینتکس بالا برای اجرای یک دستور استفاده میکنه ، ربات ما تابع run_command رو فراخونی میکنه و این دستور رو به عنوان یک ورودی میفرسته به تابع run_command حالا همونطور که میبینید داخل این تابع ما ابتدا اومدیم آرگومان ورودی کاربر که همون دستوره رو داخل یه متغییر به اسم command ذخیره کردیم (استفاده از for به خاطر دستور هایی بوده که بیش از یک کلمه هستند و بینشون فاصلس) .

سپس یه متنی چاپ کردیم که هر دستوری که کاربر وارد میکنه رو لاگ میندازه . برای مثال من اگه دستور ifconfig رو بزنم میگه که شخصی با فلان چت آی دی در تلگرام دستور ifconfig رو اجرا کرد .

 

پس از اون اومدیم با استفاده از کتابخونه ی subprocess  دستور کاربر  رو داخل خط فرمان اجرا کردیم و در خط بعد جواب دستور اجرا شده در خط فرمان که حالا میتونه ارور باشه (stderr) یا جواب کارکرد صحیح برنامه باشه (stdout) رو داخل متغییری به اسم

command_result ذخیره کردیم و به کاربر ارسال کردیم .

پس تعریف توابع مورد نیاز اومدیم هندلر های مورد نیازمون رو اجرا کردیم . همینطور که میبینید یه هندلر برای دستور start/ داخل ربات تعریف کردیم و یه هندلر هم برای دستور run/ در ربات و گفتیم برا هرکدومشون چه تابعی فراخونی بشه .

و خط آخر هم که پروسه رو استارت زدیم .

 

پس از سورس میریم سراغ ساخت ربات . برای ساخت ربات های تلگرام از بات فادر (Bot Father) در تلگرام استفاده میکنیم . آموزش ساخت ربات با بات فادر خیلی سادس اگه نمیدونین با یه سرچ ساده و پنج دقیقه خوندن توی گوگل حل میشه . نهایتا بعد از اینکه ربات رو ساختین خود بات فادر توکن رباتتون رو میده به شما و باید قرارش بدین به جای کلمه ی TOKEN در سورسمون .

 

حالا وقت اجرا کردن سورس میرسه

به دلیل فیلترینگ تلگرام ، برای اجرا کردن سورس ما نیاز به تغییر آی پی داریم که میتونیم از VPN استفاده کنیم . بسته به سیستم عاملی که دارین میتونید هر VPN که میخواین و کار میده رو نصب کنید . برای مثال روی لینوکس میتونید از تور استفاده کنید یا در ویندوز از هات اسپات و ... (با بعضی VPN ها مثل سایفون کار نمیده .)

بعد از اینکه VPN رو فعال کردیم سورس رو اجرا میکنیم . پس از اجرای سورس ما میتونیم از ربات استفاده کنیم. برای تست ارتباط ابتدا یکبار دستور start/  رو در ربات میزنیم اگر کلمه ی Connect به ما برگشت داده شد یعنی سورس ما فعاله و کار میکنه . بعد از اون میتونیم با سینتکسی که در بالا معرفی کردیم هر کدی رو که خواستیم اجرا کنیم.


در اینده اگر وقت کنم یک سیستم لاگین اضافه میکنم تا هرکسی نتونه از رباتتون استفاده کنه!

اسکریپ لاگین با پایتون

امروز میبینیم چطور میشه یه cracker برای صفحات لاگین که از روش POST برای انتقال اطلاعات استفاده میکنند ساخت .در این آموزش برای ارسال درخواست های POST به سمت سرور از کتابخونه ی requests در پایتون استفاده میکنیم . کتابخونه ی requests  دارای تابعی به نام post است که از این تابع برای انجام کارمون استفاده میکنیم .

قبل از اینکه شروع کنیم بزارید یکم در مورد درخواست های HTTP توضیح بدم . وقتی یک کاربر میخواد از طریق صفحه لاگین یک وبسایت وارد اون بشه باید ابتدا از طریق مرورگرش به آدرس صفحه لاگین بره و یوزرنیم و پسووردشو  بزنه و مثلا دکمه ی ورود رو بزنه . این کار باعث میشه یه درخواست HTTP از طریق متود POST برای سرور اون سایت ارسال بشه که حاوی یوزرنیم و پسووردی هست که کاربر زده . پس از اینکه سرور این درخواست رو دریافت کرد میبینه آیا یوزرنیم و پسووردی که کاربر زده معتبره یا نه . اگه معتبر باشه بهش اجازه ورود میده و اگه معتبر نباشه بهش اجازه ی ورود نمیده .

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

اما اگه بخوایم یکم دقیق تر درخواست HTTP رو برسی کنیم باید پروتکل HTTP رو بدونیم چیه . پروتکل HTTP مخفف Hyper Text Transfer Protocol هستش . کار این پروتکل انتقال اطلاعات بین سرور و کلاینته . روش کار طوریه که هر کلاینت یک درخواست HTTP به یک آدرس وب میفرسته و اون سرور یک جواب HTTP به کلاینت ارسال میکنه. مثل تصویر زیر:

هر درخواست HTTP شامل سه بخش اصلی هستش .

۱ - بخش خط درخواست یا  Request Line : این بخش دارای سه قسمت است . قسمت اول متود یا شیوه ی ارتباط را مشخص میکند که میتواند یکی از متود های HTTP مثل GET یا post باشد . قسمت دوم از این بخش آدرس url مقصد ، روی سرور هدف را مشخص میکند برای مثال :

/apps/login.php

قسمت سوم هم مشخص کننده ی ورژن پروتکل HTTP است . برای مثال میتواند متنی شبیه به متن زیر باشد :

HTTP 1/1

بیشتر صفحات لاگین وبسایت هایی که اصولی طراحی شده اند از متود POST برای انتقال استفاده میکنند پس ما هم باید از همین متود برای تست یوزرنیم و پسوودامون استفاده کنیم .

 

۲ - بخش هدر ها (Headers) : هدر ها درواقع یک سری مقادیر اطلاعاتی در مورد کلاینت هستند که سرور از طریق این هدر ها میتواند با کلاینت ارتباط برقرار کند . برای مثال اطلاعاتی مثل زبان یا نوع مرورگری که کلاینت استفاده میکند را مشخص میکند .

 

۳ - بخش بدنه اطلاعات یا Message Body : تمام قسمت های قبلی در واقع برای این موضوع بودن که بتونن بخش سوم یعنی اطلاعات رو انتقال بدن . اطلاعات یا message body همون اطلاعاتی هستند که ما میخوایم از طریق این درخواست انتقال بدیم که در مورد پروژه ما در واقع یوزرنیم و پسوورد هستش .

 

خب اینا یه سری چیزای پایه بودن که باید در مورد این پروژه میدونستیم .

آماده سازی : قبل از اینکه بریم سراغ مرحله ی بعد پیشنهادم اینه یکم در مورد بحثای بالا توی گوگل هم بخونید .

 

میریم سراغ اسکریپت نویسی . قبلش بگم که من از اپلیکیشن آسیب پذیر dvwa برای تست اسکریت استفاده میکنم . به شما هم پیشنهاد میکنم برای تست اسکریپت یه صفحه لاگین خودتون بنویسید یا از اپلیکیشن های آسیب پذیر مثل dvwa استفاده کنید .

 

صفحه لاگین اپلیکیشن آسیب پذیر من به آدرس http://192.168.1.105/dvwa/login.php به شکل زیره .



حالا ما نیاز به یه سری اطلاعات داریم  .۱ - نیاز به یک متن کلیدی برای شناسایی اینکه لاگین موفقیت آمیز بوده یا نه . برای مثال در این وبسایتی  که من تست میکنم اگه پسوورد رو درست بزنم وارد یه صفحه ای میشم که اولش نوشته Welcome . پس بعدا تو اسکریپت میگیم اگه کلمه ی Welcome در متن بازگشتی وجود داشت یعنی اینکه پسوورد و یوزرنیم درست بودن .

مورد بعدی که نیاز داریم همون قسمت سوم درخواست HTTP یعنی MessageBody است . ما نیاز داریم تا متغییر های این قسمت را بدونیم . برای اینکار من ابتدا با مرورگر خودم (فایرفاکس) وارد صفحه لاگین میشم

بعد کلیک راست میکنم وگزینه ی Inspect Element رو انتخاب میکنم .



بعد میرم توی سربرگ Network


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

همینطور که میبینید پس از وارد کردن یه پسوورد اشتباه سربرگ network تغییراتی پیدا میکند :



حالا میتونیم اون درخواست اصلی که برای ورود به وبسایت است و با متود post است رو انتخاب کنیم :



و نهایتا در سربرگ request من میتونم متغییر ها رو ببینم . همینطور که میبینید اینجا سه تا متغیر دارم . password , username و Login .



این مقادیر را بعدا در سورس کد مقدار دهی میکنیم . کافی است یوزرنیم مورد نظر رو به جای متغییر username  و پسوورد موردنظر رو به جای متغییر password بزاریم و Login هم که همیشه ثابته .

برای نوشتن اسکریپت نیاز به دوتا کتابخونه داریم . یکی requests که به صورت پیشفرض نصبه و کتابخونه ی colorama برای نوشتن متن های رنگی که برای نصبش میتونیم از ابزار pip استفاده کنیم.

 

نصب کتابخونه روی لینوکس :

realHAM@debian:~$ sudo pip3 install colorama

نصب کتابخونه روی ویندوز :

C:\> pip install colorama


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

 

برای دانلود کردن و دیدن سورس کد به گیت هاب برید.

توضیح  کد :

در ابتدا کتابخونه های مورد نیاز رو ایمپورت کردیم . سپس با استفاده از colorama.init اومدیم ماژول colorama رو کانفیگ کردیم تا بتونه متنای رنگی برامون تولید کنه (آماده سازی colorama) . پس از اون دوتا ورودی از کاربر گرفتیم یکی usernamelist و دیگری passwordlist که درواقع آدرس فایل های یوزرنیم لیست و پسووردلیست هستند . سپس یه متغییر به نام find تعریف کردیم که فقط در صورتی برابر True میشه که یوزرنیم و پسوورد صحیح رو پیدا کنیم . بعد یه حلقه ی for برای فایل usernamelist نوشتیم که به وسیله ی اون بتونیم به تک تک یوزرنیم های داخل فایل دسترسی داشته باشیم . در اولین خط از کد این حلقه اومدیم عبارت n\ آخر هر یوزرنیم رو حذف کردیم . سپس یک حلقه for دیگر برای فایل پسوورد ها ایجاد کردیم و در اولین کد این حلقه نیز مانند حلقه قبل اومدیم n\ آخر هر پسوورد رو حذف کردیم .بعد از اون اومدیم چاپ کردیم که چه پسوورد و یوزرنیمی رو داریم تست میکنیم . سپس اومدیم با استفاده از متود post  یه درخواست http فرستادیم سمت اون آدرس به همراه پارامتر های مورد نیازش که اون بالا گفتیم یکی username بود و دیگری password . همچنین یه Login هم داشتیم که همیشه ثابت بود .

بعد جواب درخواستمون که از سمت سرور میاد رو  ریختیم داخل متغییر res . حالا با استفاده از res.content اومدیم محتویات اون صفحه برگشتی رو دیدیم . اگه یادتون باشه وقتی من لاگین صحیح انجام میدادم یکی از کلمه هایی که روی صفحه به ما نشون میداد کلمه ی Welcome بود . پس اینجا گفتم اگه کلمه ی Welcome داخل متن بازگشتی بود یعنی ورود موفقیت آمیز بوده و یوزرنیم و پسوورد درست رو به کاربر نشون بده و نهایتا متغییر find رو برابر True کن و از حلقه ها خارج شو و تمام .