מבוא לספריית scapy - כשאתם בונים חבילת רשת בעצמכם, בייט אחרי בייט¶
רוב הזמן, כשאתם עובדים עם רשת, אתם משתמשים בכלים מוכנים - דפדפן, לקוח SSH, כלי ping - שכל אחד מהם בונה עבורכם חבילות רשת מוכנות מראש בלי שתראו את זה בכלל. Scapy הופכת את זה על הראש - היא נותנת לכם לבנות חבילת רשת מאפס, שדה אחרי שדה, ולשלוח אותה בדיוק כמו שאתם רוצים. וזה בדיוק מה שהופך אותה לכלי כל כך שימושי ללימוד רשתות לעומק.
אז מה זה בעצם scapy¶
Scapy היא ספריית פייתון ליצירה, שליחה, קליטה, וניתוח של חבילות רשת. במקום שהמערכת תבנה עבורכם חבילת TCP או ICMP רגילה, אתם מגדירים בעצמכם כל שדה - כתובת מקור, כתובת יעד, דגלים, פורטים - ורואים בדיוק מה נשלח ברשת. זה כלי שמשמש גם חוקרי אבטחה שבודקים איך מערכות מגיבות לתעבורה חריגה, וגם כל מי שרוצה להבין רשתות ברמה שמעבר לתיאוריה.
דוגמה ראשונה - שליחת פינג פשוט¶
from scapy.all import IP, ICMP, sr1
packet = IP(dst="8.8.8.8") / ICMP()
response = sr1(packet, timeout=2)
response.show()
השורה IP(dst="8.8.8.8") / ICMP() היא הלב של scapy - אופרטור החלוקה בונה חבילה משכבות שונות, ממש כמו במודל ה-OSI, שכבה מעל שכבה. כאן בנינו חבילת IP עם יעד ספציפי, ועטפנו בתוכה חבילת ICMP - בדיוק מה שכלי ping רגיל עושה מאחורי הקלעים, רק שכאן אתם רואים ובונים את זה בעצמכם.
סריקת פורטים בסיסית¶
from scapy.all import IP, TCP, sr1
for port in [22, 80, 443]:
packet = IP(dst="192.168.1.1") / TCP(dport=port, flags="S")
response = sr1(packet, timeout=1, verbose=0)
if response and response.haslayer(TCP) and response[TCP].flags == "SA":
print(f"פורט {port} פתוח")
הקוד הזה שולח חבילת TCP עם דגל SYN לכל פורט ברשימה, ובודק אם התשובה כוללת דגלים SYN-ACK, שמעידים שהפורט פתוח ומאזין. זה בדיוק העיקרון שעליו מבוססים כלי סריקה כמו Nmap, רק שכאן אתם רואים כל שלב בעצמכם, ולא מקבלים תוצאה מוכנה מכלי חיצוני.
האזנה לתעבורה חיה¶
מעבר לשליחה, scapy יודעת גם ללכוד תעבורה בזמן אמת, בדומה למה ש-Wireshark עושה, אבל בצורה שאפשר לתכנת ולעבד אוטומטית:
from scapy.all import sniff
def handle_packet(packet):
print(packet.summary())
sniff(filter="tcp", prn=handle_packet, count=10)
זה מאזין לעשר חבילות TCP הבאות שעוברות בכרטיס הרשת, ומדפיס סיכום קצר על כל אחת. אפשר להרחיב את זה לבניית כלי ניטור מותאם אישית, שמזהה בדיוק את הדפוסים שמעניינים אתכם.
למה זה שונה מהשתמשות בכלי מוכן¶
ההבדל המרכזי בין scapy לכלים מוכנים כמו Nmap או Wireshark הוא שהם נותנים לכם תשובה מוכנה, בעוד scapy נותנת לכם את חומרי הגלם לבנות את התשובה בעצמכם. זה איטי יותר בהתחלה, אבל התוצאה היא הבנה הרבה יותר עמוקה - במקום להאמין שכלי מסוים אומר "הפורט פתוח", אתם רואים בעצמכם את דגלי ה-TCP שהגיעו בחזרה ומבינים בדיוק למה המסקנה הזאת נכונה.
למה זה כלי חשוב לחוקרי אבטחה¶
בבדיקת חדירות ומחקר חולשות, לפעמים כלים מוכנים פשוט לא מספיקים - צריך לבנות חבילה מותאמת במיוחד כדי לבדוק איך שירות מסוים מגיב לקלט חריג, או לדמות תרחיש תקיפה ספציפי שאין לו כלי מוכן. scapy נותנת בדיוק את הגמישות הזאת, ישירות מתוך פייתון, בלי צורך ללמוד שפה או כלי חדש לגמרי.
איך מתחילים ללמוד את זה נכון¶
הדרך הכי טובה להתחיל עם scapy היא לא לקפוץ ישר לסקריפטים מורכבים, אלא להבין קודם איך חבילות רשת בנויות בכלל - שכבות, כותרות, שדות - כי בלי הבסיס הזה, קוד ה-scapy נשאר סדרה של פרמטרים בלי הקשר אמיתי.
קורס הרשתות המלא נמצא כאן, חינם ובעברית, כולל הבנה מעמיקה של מבנה חבילות רשת ותרגול מעשי.
יש לכם שאלה על בניית חבילה מותאמת אישית? שאלו בדיסקורד.
לסיכום¶
Scapy הופכת אתכם מצרכנים של תוצאות רשת מוכנות לבונים פעילים של חבילות רשת בעצמכם. זו הדרך הכי טובה להפוך את מודל ה-OSI מרשימה תיאורטית לכלי עבודה שאתם מפעילים בעצמכם, שורה אחר שורה של פייתון.