אחרי שהבנו איך לכתוב "חבילות מלוכלכות" נסיים את נושא ה Raw Packet באיך להאזין לחבילות שלנו, הרעיון של המאמר הזה הוא להשלים את נושא ה Raw Socket ושלבו הסופי הוא כתיבת Sniffer שיקרא את החבילות שלנו מה Raw Socket ויציג לנו אותם בדומה ל TcpDump, אז כבר הבנו ממאמרים קודמים מה זאת חבילה וכיצד היא בנויה , נעבור על זה בקצרה - יש לנו חבילה מרכזית שמחולקת לחבילות קטנות המכילות מידע עבור התנועה שלה ברחבי הרשת ע"פ מודל OSI.
ה Sniffer שלנו הולך לתפוס רק את ה Protocol שאנחנו רוצים ולא את כל התנועה על מנת שנוכל להתמקד על הפרוטוקולים בצורה ובנייה שלהם למקרים שנרצה לכתוב חבילה דומה עם הכלים שלמדנו במאמרים הקודמים, אנחנו נמקד את ההאזנה שלנו ל 3 פרוטוקולים נפוצים - ICMP,TCP,UDP.
מבנה של חבילה מסוג ICMP הוא פשוט מאוד, וקצר מאוד מכיל בתוכו 2 שורות ברוחב 32 ביט, השורה הראשונה מכילה לנו 8 ביטים של Type , ו 8 ביטים ל Code, ו 16 ביטים ל CheckSum, אם הוא נשלח בגרסת IPv4 אז נחשב רק את גודל החבילה של ה ICMP אבל אם הוא גרסה IPv6 יש חישוב של גודל החבילה עם Pseudo Header.
ה Sniffer שלנו הולך לתפוס רק את ה Protocol שאנחנו רוצים ולא את כל התנועה על מנת שנוכל להתמקד על הפרוטוקולים בצורה ובנייה שלהם למקרים שנרצה לכתוב חבילה דומה עם הכלים שלמדנו במאמרים הקודמים, אנחנו נמקד את ההאזנה שלנו ל 3 פרוטוקולים נפוצים - ICMP,TCP,UDP.
ICMP - Internet Control Message Protocol
מטרת הפרוטוקול הזה הוא לבדוק טעויות ותקלות ברשת הוא חלק מחבילת פרוטוקולים Internet Protocol Suite שבתקן RFC 792 ואחד השימושים הנפוצים בו בדיקת זמני תגובה בעזרת חבילת Ping , ניתן גם למצוא חריגות, נניח ש Router מעביר את החיבלות שלו ברשת לנתבים או למחשבים אחרים הוא חייב להוריד את ה TTL - Time To Live באחד וכך גם המחשב אחריו עד שהחבילה מגיעה ליעד, אם ה TTL מגיע לאפס אבל החבילה עדיין לא היגיעה ליעד שלה חוזרת לנו הודעת שגיאה של הפרוטוקול - Time-to-live exceeded in transit.
מבנה של חבילה מסוג ICMP הוא פשוט מאוד, וקצר מאוד מכיל בתוכו 2 שורות ברוחב 32 ביט, השורה הראשונה מכילה לנו 8 ביטים של Type , ו 8 ביטים ל Code, ו 16 ביטים ל CheckSum, אם הוא נשלח בגרסת IPv4 אז נחשב רק את גודל החבילה של ה ICMP אבל אם הוא גרסה IPv6 יש חישוב של גודל החבילה עם Pseudo Header.
סוגים וקודים חוזרים:
Type
3 Destination Unreachable
Codes:
0 - Destination network unreachable
1 - Destination host unreachable
2 - Destination protocol unreachable
3 - Destination port unreachable
4 - Fragmentation required
5 - Source route failed
6 - Destination network unknown
7 - Destination host unknown
8 - Source host isolated
9 - Network administratively prohibited
10 - Host administratively prohibited
11 - Network unreachable for TOS
12 - Host unreachable for TOS
13 - Communication administratively prohibited
Codes:
0 - Destination network unreachable
1 - Destination host unreachable
2 - Destination protocol unreachable
3 - Destination port unreachable
4 - Fragmentation required
5 - Source route failed
6 - Destination network unknown
7 - Destination host unknown
8 - Source host isolated
9 - Network administratively prohibited
10 - Host administratively prohibited
11 - Network unreachable for TOS
12 - Host unreachable for TOS
13 - Communication administratively prohibited
5 Redirect Message
Codes:
0 - Redirect Datagram for the Network
1 - Redirect Datagram for the Host
2 - Redirect Datagram for the TOS & network
3 - Redirect Datagram for the TOS & host
8 Echo Request
Codes:
0 - Echo request
9 Router Advertisement
Codes:
0 - Router Advertisement
10 Router Solicitation
Codes:
0 - Router discovery/selection/solicitation
11 Time Exceeded
Codes:
0 - TTL expired in transit
1 - Fragment reassembly time exceeded
12 Bad IP header
Codes:
0 - Pointer indicates the error
1 - Missing a required option
2 - Bad length
13 Timestamp
Codes:
0 - Timestamp
14 Timestamp Reply
Codes:
0 - Timestamp reply
15 Information Request
Codes:
0 - Information Request
16 Information Reply
Codes:
0 - Information Reply
17 Address Mask Request
Codes:
0 - Address Mask Request
18 Address Mask Reply
Codes:
0 - Address Mask Reply
30 Traceroute
Codes:
0 - Information Request
Codes:
0 - Redirect Datagram for the Network
1 - Redirect Datagram for the Host
2 - Redirect Datagram for the TOS & network
3 - Redirect Datagram for the TOS & host
8 Echo Request
Codes:
0 - Echo request
9 Router Advertisement
Codes:
0 - Router Advertisement
10 Router Solicitation
Codes:
0 - Router discovery/selection/solicitation
11 Time Exceeded
Codes:
0 - TTL expired in transit
1 - Fragment reassembly time exceeded
12 Bad IP header
Codes:
0 - Pointer indicates the error
1 - Missing a required option
2 - Bad length
13 Timestamp
Codes:
0 - Timestamp
14 Timestamp Reply
Codes:
0 - Timestamp reply
15 Information Request
Codes:
0 - Information Request
16 Information Reply
Codes:
0 - Information Reply
17 Address Mask Request
Codes:
0 - Address Mask Request
18 Address Mask Reply
Codes:
0 - Address Mask Reply
30 Traceroute
Codes:
0 - Information Request
TCP -Transmission Control Protocol
את החבילה הזאת אנחנו מכירים טוב כבר מאמרים קודמים אבל נעשה עליה חזרה קטנה, זה הפרוטוקול הנפוץ בעולם להעברת נתונים בין בין מחשבים ברשת, העברת המידע לשכבת האפליקציה ע"פ מודל ה OSI, יש לו שימושים רבים בהמון פרוטוקלים אפליקטיבים כמו HTTP,FTP,SSH ועוד.
הפרוטוקול מאוד אמין ומתבצעת בו "לחיצת יד" עם המחשבים שרוצים לפתוח תקשורת בניהם, משמעות לחיצת היד היא בעצם לאמת שהחבילה באמת תגיע ליעד - מחשב המקור שולח למחשב היעד חבילה עם Syn לביצוע Synchronize, מחשב היעד מחזיר הודעת Syn-Ack שמאשרת לנו את ביצוע ה Synchronize , והמחשב המקור שולח הודעה נוספת ליעד Ack , שבעצם פותח את העברת המידע בין המחשבים, כל חבילה משלב זה שתגיע ליעד תהיה עם דגל Ack.
קיימת בקרה על הפרוטוקול כאשר יש לחיצת יד כל חבילה מקבלת מספר בסדר עולה, כך שמחשב היעד יכול לעקוב אחרי החבילות במקרה שחבילה חסרה הוא יבקש אותה מחדש.
UDP - User Datagram Protocol
פרוטוקל מהיר עבור אפליקציות שלא דורשות אמינות ובקרה או שהן מבצעות אותן בעצמם, כלומר לאפליקציה לא איכפת לאבד חבילות מאשר תהליך האימות שמעקב את קבלת החבילה למשל מערכות Voip וטלפוניה משתמשות ב UDP.
כפי שניתן לראות מבנה החבילה מאוד פשוט בניגוד לחבילת TCP, סה"כ מעבירים פורט יעד ומקור, גודל החבילה עם המידע,ה CheckSum עם ה Ip Header והחבילה נשלחת אין לא בדיקה ולא בקרה.
אחרי שהבנו את הפרוטוקלים אפשר להתחיל לכתוב את הקוד, התוכנית שלנו מאוד פשוטה, היא יוצרת Raw Socket עבור הפרוטוקל שעליו נאזין ע"י המשתמש, התוכנה מפרקת את החבילה ומראה לנו את המידע שעובר בחבילה.
רכיבים נחוצים:
מערכת Linux במקרה שלי OpenSuse
Eclipse
קוד להורדה:
אחרי שהבנו את הפרוטוקלים אפשר להתחיל לכתוב את הקוד, התוכנית שלנו מאוד פשוטה, היא יוצרת Raw Socket עבור הפרוטוקל שעליו נאזין ע"י המשתמש, התוכנה מפרקת את החבילה ומראה לנו את המידע שעובר בחבילה.
רכיבים נחוצים:
מערכת Linux במקרה שלי OpenSuse
Eclipse
קוד להורדה:
אין תגובות:
הוסף רשומת תגובה