-
چهارشنبه, ۲۲ مرداد ۱۳۹۹، ۰۹:۱۲ ق.ظ
-
۱۱۸۶
آموزش ساخت ابزار اسکن AP (مودم وایرلس) های مخفی در محیط با پایتون
درود به همه !
تست نفوذ وایرلس ، همیشه هدفی بسیار جالب برای هکر ها بوده احتمالا به خاطر اینکه هم استفاده ی زیادی در تمام مکان ها دارن و هم به طور ذاتی نا امن هستند :) . این مودم های وایرلس در محیط امواج وایرلس انتشار میدهند و دستگاه های دیگر میتوانن آن ها را کشف کنند و به آن ها وصل بشن . اما امروزه میبینیم که بعضی از مودم های وایرلس مخفی هستند و پیدا کردن آن ها در محیط با یه اسکن ساده امکان پذیر نیست بلکه باید خودمون به طور دستی نام اکسس پوینت (SSID) و پسووردشو وارد کنیم . قبلا برای پیدا کردن این وایرلس ها از ابزار هایی مثل airodump-ng استفاده میکردیم یا حتی wireshark . امروز به طور مفهومی روش پیدا کردن این اکسس پوینت ها رو یاد میگیریم و همچنین یه اسکریپت پایتونی می نویسیم که خودش خودکار اینکارو برامون انجام بده .
قبل از اینکه وارد بحث کدنویسی بشیم بهتر هستش که به طور مفهومی الگوریتم کار رو توضیح بدیم . برای اینکه بتونیم اکسس پوینت های مخفی رو پیدا کنیم ابتدا باید با پروتکل کاری اکسس پوینت ها آشنا باشیم .
اطلاعاتی که اکسس پوینت ها از طریق امواج در محیط منتشر میکنند بسته های کوچک اطلاعاتی به اسم فریم ها هستند . (فریم های وایرلس)
به طور کلی ما سه نوع فریم وایرلس داریم :
- فریم های مدیریتی Management Frames
- فریم های کنترل Control Frames
- فریم های اطلاعات Data Frames
فریم های مدیریتی (Management Frames) : این فریم ها ارتباط کلاینت ها با اکسس پوینت رو مدیریت میکنند . برای مثال فریم هایی که برای اتصال یا قطع شدن کلاینت ها از اکسس پوینت رد و بدل میشن از این نوع فریم ها هستند .
فریم های کنترل (Control Frames) : این فریم ها صحت ارتباط و سلامت اطلاعات ارسالی را مدیریت میکنند . برای مثال این فریم ها وظیفه دارند تا چک کنند که آیا اطلاعات کامل و درست به مقصد رسیده یا نه .
فریم های اطلاعات (Data Frames) : این فریم ها حاوی اطلاعات اصلی هستند که باید انتقال پیدا کنند .
تا اینجا ، سه نوع اصلی فریم ها رو میدونیم اما خود فریم های مدیریتی یه سری زیر مجموعه هایی دارند . یکی زیر مجموعه های فریم های مدیریتی ، فریم های Beacon هستند . مودم های وایرلس از این فریم ها برای ابراز وجود خود در محیط استفاده میکنند . یعنی هر مودم وایرلس به طور پیشفرض همیشه در حال ارسال فریم های Beacon در محیط است . مثل این میمونه که هی داره داد میزنه "آهااااای من اینجاممممم" . حالا ما وقتی وای فای گوشیمون رو روشن میکنیم و اسکن میکنیم در واقع گوشی ما میاد فریم های Beacon رو توی محیط بهش گوش میده و از این طریق میفهمه چه وای فای هایی توی محیط هست و به ما نشون میده . فریم های beacon به صورت پیشفرض حاوی اسم یعنی ssid مودم وایرلس هستند . حالا برخی کاربران تنظیمات مودم رو طوری پیکربندی میکنند که دیگه نام اکسس پوینت (SSID) در بسته های Beacon نمایش داده نشود و بنابراین دیگه گوشی شما نمیتونه اونو پیدا کنه چون اطلاعات مورد نیازشو از بسته های Beacon بدست نمیاره . ولی وقتی گوشی ما بتونه وای فای مورد نظر رو پیدا کنه دیگه میتونه بهش وصل بشه . اما پروسه وصل شدن به اکسس پوینت به چه صورته ؟ زیاد عمیق نمیشیم چون باید پروتکل های رمزنگاری وایرلس رو هم توضیح بدیم ولی اولین اقدامی که یک کلاینت برای وصل شدن به یه اکسس پوینت میکنه اینه که ازش درخواست میکنه تا اطلاعاتشو بهش بده (برای مثال سرعت انتقال داده ، پروتکل رمزنگاری ، و ...) . این درخواست توسط یک فریمی به نام Probe Request انجام میشه . این فریم نیز زیرمجموعه ی فریم های مدیریتی است چون برای ارتباط با اکسس پوینت مورد استفاده قرار میگیره . سپس اکسس پوینت یک فریم Probe Response برمیگردونه به کلاینت که حاوی اطلاعاتی در مورد خود اکسس پوینته . حالا جالبه بدونید خود اسم اکسس پوینت یعنیSSID هم داخل این فریم نوشته شده . حالا کافیه ما منتظر بمونیم تا یکی از کلاینت ها تلاش کنه به مودم وصل بشه و سپس فریم های Probe response رو در محیط شنود کنیم و درنتیجه میتونیم SSID وای فای های مخفی رو به راحتی پیدا کنیم .
اجازه بدید در ابتدا این کارو با ابزار Wireshark انجام بدیم سپس اسکریپتشو بنویسیم . ابزار وایرشارک برای ضبط و تحلیل پکت ها به کار میره .
برای انجام اینکار من ابتدا کارت شبکه ی خودمو میزارم روی حالت Monitor تا بتونه تمام پکت های محیط رو شنود کنه . امکان داره بعضی کارت شبکه ها این قابلیت رو ساپورت نکنه . من برای قرار دادن روی حالت Monitor از ابزار airmon-ng در لینوکس استفاده میکنم . نام کارت شبکه ی وایرلس من برابر wlp3s0 هستش پس :
MrPython@debian:~$ sudo airmon-ng start wlp3s0
بعد از اینکه کارت شبکه رو روی مود monitor گذاشتیم وایرشارک رو اجرا میکنیم و کارت شبکه ی مانیتور شده (برای من wlp3s0mon) رو انتخاب میکنیم :
پس از اینکه کارت شبکه ی مناسب و کانال مناسب رو انتخاب کردم میبینیم که فریم های Beacon که توسط اکسس پوینت ارسال میشه نمایان میشن ولی SSID اکسس پوینت نمایش داده نمیشه چون من SSID Broadcast رو در تنظیمات مودم غیر فعال کردم(دیگه SSID با بسته های Beacon ارسال نمیشه پس کلاینت های ناشناس نمیتونن پیداش کنن) .
حالا من وای فای گوشیمو روشن میکنم . از اونجایی که گوشی من قبلا به این وای فای وصل میشده و در نتیجه اطلاعاتشو ذخیره کرده پس SSID وای فای رو میدونه . به محض اینکه وای فای گوشیمو روشن میکنم گوشی من شروع میکنه Probe Request ارسال کنه به وای فای مخفی تا ببینه آیا توی محیط هست یا نه . حالا اکسس پوینت هم شروع میکنه Probe Response ارسال کنه به گوشی من و ما از طریق شنود فریم Probe Response میتونیم SSID رو مشخص کنیم . من با فیلتری که در وایرشارک انجام دادم بسته های Probe Response رو فقط شنود کردم و در تصویر زیر میبینید که این بسته ها به راحتی SSID وای فای مخفی رو مشخص کردن :
حالا که طرز کار رو فهمیدیم میریم اسکریپت بنویسیم . کافیه اسکریپت ما فقط بسته های Probe Response رو در محیط شنود کنه و از طریق اونا SSID وای فای های مخفی رو تشخیص بده .
برای شنود و تحلیل بسته های وایرلس از کتابخونه ی Scapy استفاده میکنیم . پس این ابزار رو با pip نصب میکنیم
نصب Scapy در لینوکس :
MrPython@debian:~$ sudo pip3 install scapy
نصب Scapy در ویندوز :
C:\> pip install scapy
پس از نصب کتابخونه میریم سراغ سورس کد .
سورس کد :
from scapy.all import *
iface = input("Monitor InterFace : ")
macs = []
def handler(pkt): if pkt.haslayer(Dot11ProbeResp) and pkt.info: ssid = pkt.info.decode() mac = pkt.addr2 if mac not in macs: macs.append(mac) print("{} -> {}".format(mac,ssid)) return
print("Scanning Probe Requests ...") print("---------------------------") while True: sniff (count = 1 , iface = iface , prn = handler) # Capture Wireless Frames and send to handler() function
توضیح سورس :
در ابتدا کتابخونه ی اسکپی ایمپورت شده . سپس یه اینپوت به نام iface گرفتیم که باید کارت شبکه ی monitor که قراره باهاش شنود کنه رو بهش بدیم .
یه لیست به اسم macs تعریف کردیم . هر مک آدرس جدیدی که کشف میکنیم میریزیم داخل این لیست و سپس چاپش میکنیم . حالا اگه مک آدرس اکسس پوینتی رو پیدا کردیم که داخل لیست بود دیگه چاپش نمیکنیم چون قبلا این رو چاپ کردیم . یه تابع به نام handler تعریف کردیم که هر موقع یه پکت شنود میشه این تابع فراخونی میشه و خود پکت به عنوان اولین آرگومان بهش داده میشه . سپس چک میکنه اگه پکت دارای لایه ی Dot11ProbeResp (Probe Response) بود یعنی این یه پکت Probe Response هستش . وهمچنین اگر دارای مقداری به نام info بود (داخل info همون ssid ذخیره میشه) ، بیاد اول متغییر ssid رو تعریف کنه و ssid اکسس پوینت رو بریزه داخلش . سپس متغییر mac رو تعریف کنه و مک آدرس اکسس پوینت رو بریزه داخلش . بعد چک کردیم اگه مک آدرس داخل لیست مک های شناسایی شده نبود : بیا اولا mac رو به لیست مک های شناسایی شده اضافه کن و سپس ssid و mac اکسس پوینت رو چاپ کن .
در ابتدای برنامه یه حلقه ی while بی نهایت تعریف کردیم که داخلش با استفاده از متود sniff اومدیم فریم های وایرلس رو با استفاده از کارت شبکه ی iface شنود کردیم و گفتیم به محض شنود پکت اونو بفرسته به تابع handler.
برای اجرای سورس همینطور که میدونید ابتدا باید کارت شبکه ی وایرلسمون رو بزاریم روی حالت monitor که در بالا اینکارو کردیم . فقط یه نکته ای هست .
حالا من سورس رو اجرا میکنم و ورودی مورد نیازش رو بهش میدم . میبینید که یه اکسس پوینت مخفی برام پیدا کرد که همون اکسس پوینتی هستش که داخل wireshark هم پیداش کردیم.
امکان داره گاهی اوقات نتونه شنود کنه و نتیجه ای پیدا نکنه . احتمالا به خاطر اینه که اکسس پوینت روی کانالی که شما دارید شنود میکنید فعالیت نمیکنه . برای مثال اکسس پوینت روی کانال ۱ در حال کار کردنه ولی شما کارت شبکه ی خودتون رو روی کانال ۵ تنظیم کردید . این اتفاق کم میافته ولی اگه این اتفاق افتاد و نتونستید شنود کنید هنگام تنظیم کارت شبکه روی مود مانیتور ، روی همون کانالی تنظیم کنید که اکسس پوینت فعالیت میکنه کافیه به آخر دستور airmon-ng شماره کانال رو هم اضافه کنید برای مثال در دستور زیر من کارت شبکه خودم رو روی کانال ۲ تنظیم کردم :
MrPython@debian:~$ sudo airmon-ng start wlp3s0 2
یا حق !
Telegram Channel : @mrpythonblog