יום שבת, 19 בפברואר 2011

ARP Poisoning and Spoofing With C

אחת ההתקפות הנפוצות ברשתות היא שימוש ב ARP Poisoning , שבעצם הופכת את התוקף לתחנת בניים של התקשורת העוברת בין מחשבים ברשת, ומאפשרת לתוקף איסוף מידע רגיש כמו סיסמאות, חשבונות ובכלל לתפוס את התעבורה ולשנות אותה בכל שלב בדרך, כמו כן לעשות התקפה של Denial Of Service למחשבים ברשת ולכן על מנת להבין איך זה בדיוק עובד צריך להכיר את מודל OSI ואת פרוטוקל ה Arp.

מה זה מודל OSI?
Open Systems Interconnection - נכון שזאת לא הפעם הראשונה שאני נוגע ברשתות אבל מודל ה OSI קיים בכול הקשור ברשתות והוא הבסיס לכל תקשורת שמתבצעת לכן כדאי שנכיר אותו, הוא הומצא ע"י ארגון התקינה הבין לאומי (ISO) בתחילת שנות השמונים, שבתקופה זו לא היו סטנדרטים אחידים בכל הקשור לתקשורת וכל יצרן בנה מנגונני תקשורת משלו, נגרמו המון בעיות תאימות שחייבו הקמת סטנדרט אחיד לתקשורת בין מחשבים.

הרעיון שעומד מאוחרי התקן הוא מבנה רב שכבתי שנקרא גם "מודל שבע שכבות" שעליו מבוססת התקשורת שלנו משלב יזימת התקשורת ע"י המשתמש עד שליחת החבילות שלנו מהחומרה, בעצם החבילה שלנו מכילה מספר רכיבים, שמתחיל משכבת האפליקציה שאיתה המשתמש עובד, אח"כ את סוג הקידוד, הצפנה, סוג התעבורה, הקן, והאותות ע"פ שניתן לראות בתרשים הבא:


 כאשר החבילה מגיעה למחשב הוא מפרק אותה בסדר הפוך עד לאפליקצה המקבלת.

מה זה Arp?
Address Resolution Protocol - פרוטוקול רשתות שנכנס לשימוש בשנת 1982, מטרת הפרוטוקל הוא לשייך כתובת פיזית לכתובת IP, וניתן לממש אותו במגוון של סוגי רשתות: Internet Protocol ו IEEE 802.11


נניח שיש שני מחשבים שרוצים לתקשר בניהם, לפני שיוצאת החבילה המחשב השולח צריך לודא שהיא נשלחת ליעד המקורי שלה, ולכן מתבצעת שאילתה Arp לרשת על מנת שיקבל את הכתובת הפיזית של המחשב שאליו הוא שולח החבילה, כל מחשב ברשת מחזיק טבלה (Arp Cache) שמשייכת כתובת פיזית לכתובת Ip לזמן מסויים (תלוי במערכת הפעלה) ואח"כ מתבצעת השאילתה פעם נוספת והטבלה מתמלאת מחדש, ע"פ מודל ה OSI שכבת השימוש ב Arp היא בין שכבת 2 (Data Link) לשכבה ה 3 (Network).

מבנה חבילת Arp דחוס  וקטן מאוד סה"כ 4 בתים, ולכן הוא קצת מבולגן בגלל שהכתובות הפיזיות הן 6 בתים, לכן פיצלו אותן לחלקים כפי שניתן לראות בתרשים הבא:



Hardware Type
סוג ה Ethernet מיוצג ע"י מספר.
  • 1 - Ethernet
  • 2 - Experimental Ethernet
  • 3 - X.25
  • 4 - Token Ring
  • 5 - Chaos
  • 6 - IEEE 802.x
  • 7 - ARC network
Protocol Type
 היצוג הפרוטוקול במקרה שלנו הוא (IP (0x0800
Hardware Length
 אורך כתובת הפיזית - 6
Protocol Length
 אורך כתובת הפרוטוקול - 4
Opertation
 סוג פעולת החבילה.
  • 1 - ARP Request
  • 2 - ARP Reply
  • 3 - RARP Requset
  • 4 - RARP Reply
Source Hardware Address
 כתובת מקור פיזית
Source Protocol Address
 כתובת מקור IP
Target Protocol Address
כתובת יעד IP


אחרי שהבנו מזה Arp ולמה הוא נועד נעבור לשלב ההתקפה, אז בעצם לכל IP יש כתובת פיזית ולפני כל תקשורת המחשב השולח מוודא את הכתובת הפיזית ,אבל מה אם ההינו יכולים לחקות את הכתובת הפיזית לכתובת IP ובכך ההינו גורמים למחשב השואל לחשוב שאנחנו המחשב שהוא מחפש, אנחנו נתקוף את Host A בכך שנגרום לו לחשוב שאנחנו בעצם ה Default Gateway שלו ממקום ה Router של הרשת.

בעצם נשלח למחשב המותקף באופן קבוע חבילת Arp שאומרת שהכתובת ה IP של ה Router מצביעה לכתובת הפיזית שלנו וכאשר המחשב יעדכן את הטבלת Arp שלו הוא יבקש לדעת מהו ה Router והחבילה שלנו תגיע אליו לפני שה Router של הרשת יספיק לענות.


את רוב ההתקפה כבר עשינו כלומר כל התקשורת שתצא מ Host A תעבור דרך ה Attacker והוא אבחר אם להעביר אותה הלאה ליעד או להפיל אותה ולגרום ל Denial Of Service.
לפני שניכנס לקוד חשוב לדעת איך מפעילים או מפסיקים את ה IP Forward בעזרת ה Terminal ב Linux:
הסטאטוס של ה Ip Forward של המערכת:
#: sysctl net.ipv4.ip_forward
אם נרצה Ip Forward נסמן 1 אם לא נסמן 0
#: sysctl -w net.ipv4.ip_forward = 1
רכיבים נחוצים:
Linux - במקרה שלי החלטתי להשתמש ב OpenSuse

ניצור פרויקט חדש של C ANSI ב Eclipse , נשתמש במספר פנוקציות מהמאמר הקודם בנושא
CreateRawSocket(int protocol_to_sniff)
BindRawSocketToInterface(char *device, int rawsock, int protocol)
SendRawPacket(int rawsock, unsigned char *pkt, int pkt_len)
CreateEthernetHeader(char *src_mac, char *dst_mac, int protocol)

הפונקציות והמבנים שנוספו לנו על הפונקציות הקיימות

typedef struct ArpHeader{
  unsigned short hardware_type;
  unsigned short protocol_type;
  unsigned char hard_addr_len;
  unsigned char prot_addr_len;
  unsigned short opcode;
  unsigned char source_hardware[6];
  unsigned char source_ip[4];
  unsigned char dest_hardware[6];
  unsigned char dest_ip[4];
}ArpHeader;
מבנה ה Arp Header.
 
ArpHeader * CreateArpHeader(void)
יצירת Header עבור ה Arp.


סרטון הדגמה:

קוד להורדה:

אין תגובות:

הוסף רשומת תגובה