شنود با پایتون در یک خط (Scapy)
با استفاده از Scapy میتوانید پکت های شبکه را شنود کنید، پکت ارسال کنید، پکتی را کالبد شکافی کنید و حتی یک پکت جعلی ارسال کنید. از Scapy با اهداف گوناگونی استفاده میشود. برای مثال میتوان از آن برای اسکن شبکه یا برای حملات تحت شبکه استفاده کرد.
نصب Scapy
ابتدا باید اقدام به نصب Scapy کنیم. اگر از سیستم عاملی بجز سیستم عامل لینوکس استفاده میکنید ابتدا libpcap و libdnet را باید نصب کنید. سپس از طریق pip میتوانید اقدام به نصب scapy کنید. برای مثال در ترمینال خود دستور زیر را وارد کنید :
pip install scapy
برای اطلاعات بیشتر میتوانید مقاله آشنایی با pip، مدیریت بسته ها در پایتون را مطالعه کنید.
اکنون scapy را نصب کرده اید، برای اینکه از کارکرد صحیح scapy اطمینان پیدا کنید، اگر از سیستم عامل لینوکس استفاده میکنید میتوانید در ترمینال خود بنویسید :
sudo scapy
سپس باید نتیجه ای مشابه زیر برای شما نمایش داده شود.
Welcome to Scapy (2.0.1-dev)
اگر از سیستم عامل ویندوز استفاده میکنید، در CMD خود بنویسید :
scapy
سپس معمولا نتیجه ای مشابه زیر دریافت میکنید.
INFO: No IPv6 support in kernel WARNING: No route found for IPv6 destination :: (no default route?) Welcome to Scapy (2.0.1-dev)
همچنین اگر تعدادی از پکیج هایی که scapy به آن نیاز دارد را نداشته باشید، در هنگام نوشتن دستورات بالا پیام هایی مطابق پیام های زیر دریافت میکنید.
INFO: Can’t import python gnuplot wrapper . Won’t be able to plot. INFO: Can’t import PyX. Won’t be able to use psdump() or pdfdump().
یک Packet بسازیم !
در این مثال میخواهیم یک پکت توسط scapy بسازیم، برای این منظور ابتدا یک شی به نام packet میسازیم و سپس مقصد پکت را مشخص میکنیم که در اینجا یکی از DNS سرورهای گوگل می باشد، پروتکل ارتباط را ICMP قرار میدهیم و در قسمتی که x نوشته شده است میتوانیم پیام خود را بنویسیم.
برای مثال به قطعه کد زیر توجه کنید.
from scapy.all import send, IP, ICMP packet=sr1(IP(dst="8.8.8.8")/ICMP()/"XXXXXXXXXXX")
پس از اجرای کد بالا باید نتیجه ای مشابه زیر دریافت کنیم.
Begin emission: ...Finished to send 1 packets. .* Received 5 packets, got 1 answers, remaining 0 packets
همچنین میتوانیم با نوشتن packet و اجرای کد محتوای پکت را ببینیم. برای مثال :
from scapy.all import send, IP, ICMP packet=sr1(IP(dst="8.8.8.8")/ICMP()/"XXXXXXXXXXX") packet
که نتیجه ی آن محتویات پکت می باشد.
<IP version=4L ihl=5L tos=0x0 len=39 id=15489 flags= frag=0L ttl=42 proto=ICMP chksum=0x51dd src=66.35.250.151 dst=192.168.5.21 options='' |<ICMP type=echo-reply code=0 chksum=0xee45 id=0x0 seq=0x0 |<Raw load='XXXXXXXXXXX' |<Padding load='\x00\x00\x00\x00' |>>>>
همچنین برای نمایش بهتر پکت میتوانیم از متد show استفاده کنیم و محتویات پکت را به راحتی بخوانیم.
packet.show()
نتیجه :
---[ IP ]--- version = 4L ihl = 5L tos = 0x0 len = 39 id = 15489 flags = frag = 0L ttl = 42 proto = ICMP chksum = 0x51dd src = 66.35.250.151 dst = 192.168.5.21 options = '' ---[ ICMP ]--- type = echo-reply code = 0 chksum = 0xee45 id = 0x0 seq = 0x0 ---[ Raw ]--- load = 'XXXXXXXXXXX' ---[ Padding ]--- load = '\x00\x00\x00\x00'
شنود در یک خط !
زبان پایتون به اعجاب های یک خطی خود معروف است، در گذشته برنامه نویسان شبکه با استفاده از سوکت پروگرمینگ میتوانستند در شبکه شنود کنند و طبیعتا این کار مشکلات فروانی داشت از جمله پارس کردن پکت ها، اما scapy با استفاده از متد sniff به راحتی و تنها در یک خط امکان شنود در شبکه را برای ما فراهم میکند. فوق العاده نیست ؟
from scapy import * sniff(iface="wifi0", prn=lambda x: x.summary())
در این مثال به عنوان پارامتر iface نام اینترفیسی که میخواهیم شنود بر روی آن صورت گیرد را مینویسیم که در اینجا wifi0 میباشد ( اگر نام interface وارد نشود تمامی interface ها شنود خواهند شد) همچنین لازم به ذکر است تابع prn به ازای هرپکتی که شنود میشود فراخوانی میشود که در اینجا تابع prn هربار خلاصه ی پکت های شنودی را به ما نشان میدهد.
۸۰۲.۱۱ Management 8 ff:ff:ff:ff:ff:ff / 802.11 Beacon / Info SSID / Info Rates / Info DSset / Info TIM / Info 133 802.11 Management 4 ff:ff:ff:ff:ff:ff / 802.11 Probe Request / Info SSID / Info Rates 802.11 Management 5 00:0a:41:ee:a5:50 / 802.11 Probe Response / Info SSID / Info Rates / Info DSset / Info 133 802.11 Management 4 ff:ff:ff:ff:ff:ff / 802.11 Probe Request / Info SSID / Info Rates 802.11 Management 4 ff:ff:ff:ff:ff:ff / 802.11 Probe Request / Info SSID / Info Rates 802.11 Management 8 ff:ff:ff:ff:ff:ff / 802.11 Beacon / Info SSID / Info Rates / Info DSset / Info TIM / Info 133 802.11 Management 11 00:07:50:d6:44:3f / 802.11 Authentication 802.11 Management 11 00:0a:41:ee:a5:50 / 802.11 Authentication 802.11 Management 0 00:07:50:d6:44:3f / 802.11 Association Request / Info SSID / Info Rates / Info 133 / Info 149 802.11 Management 1 00:0a:41:ee:a5:50 / 802.11 Association Response / Info Rates / Info 133 / Info 149 802.11 Management 8 ff:ff:ff:ff:ff:ff / 802.11 Beacon / Info SSID / Info Rates / Info DSset / Info TIM / Info 133 802.11 Management 8 ff:ff:ff:ff:ff:ff / 802.11 Beacon / Info SSID / Info Rates / Info DSset / Info TIM / Info 133 802.11 / LLC / SNAP / ARP who has 172.20.70.172 says 172.20.70.171 / Padding 802.11 / LLC / SNAP / ARP is at 00:0a:b7:4b:9c:dd says 172.20.70.172 / Padding 802.11 / LLC / SNAP / IP / ICMP echo-request 0 / Raw 802.11 / LLC / SNAP / IP / ICMP echo-reply 0 / Raw
همچنین میتوانیم با استفاده از متد show محتویات پکت های شنودی را با جزییات بیشتری مشاهده کنیم.
برای مثال :
from scapy import * sniff(iface="eth1", prn=lambda x: x.show())
که نتیجه ی زیر را به ما نشان میدهد.
---[ Ethernet ]--- dst = 00:ae:f3:52:aa:d1 src = 00:02:15:37:a2:44 type = 0x800 ---[ IP ]--- version = 4L ihl = 5L tos = 0x0 len = 84 id = 0 flags = DF frag = 0L ttl = 64 proto = ICMP chksum = 0x3831 src = 192.168.5.21 dst = 66.35.250.151 options = '' ---[ ICMP ]--- type = echo-request code = 0 chksum = 0x89d9 id = 0xc245 seq = 0x0 ---[ Raw ]--- load = 'B\xf7i\xa9\x00\x04\x149\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\x22#$%&\'()*+,-./01234567' ---[ Ethernet ]--- dst = 00:02:15:37:a2:44 src = 00:ae:f3:52:aa:d1 type = 0x800 ---[ IP ]--- version = 4L ihl = 5L tos = 0x0 len = 84 id = 2070 flags = frag = 0L ttl = 42 proto = ICMP chksum = 0x861b src = 66.35.250.151 dst = 192.168.5.21 options = '' ---[ ICMP ]--- type = echo-reply code = 0 chksum = 0x91d9 id = 0xc245 seq = 0x0 ---[ Raw ]--- load = 'B\xf7i\xa9\x00\x04\x149\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\x22#$%&\'()*+,-./01234567' ---[ Padding ]--- load = '\n_\x00\x0b'
اگر تا اینجا با ما همراه بوده اید تبریک میگوییم، اکنون میتوانید با استفاده از scapy و تنها با یک خط عملیات شنود روی اینترفیس ها را انجام دهید. با Zero To Hero همراه باشید.
مطالب زیر را حتما مطالعه کنید
آشنایی با توابع در پایتون
راه اندازی Django به همراه Postgresql، Nginx و Gunicorn
آشنایی با حلقه ها در پایتون
آشنایی با رشته در پایتون
برنامه نویسی چند نخی در پایتون
تولید اعداد Random با Python
1 Comment
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
واقعا عالی خسته نباشید