יום שישי, 4 במרץ 2011

Packet Sniffing With C

אחרי שהבנו איך לכתוב "חבילות מלוכלכות"  נסיים את נושא ה Raw Packet באיך להאזין לחבילות שלנו, הרעיון של המאמר הזה הוא להשלים את נושא ה Raw Socket ושלבו הסופי הוא כתיבת Sniffer שיקרא את החבילות שלנו מה Raw Socket ויציג לנו אותם בדומה ל TcpDump, אז כבר הבנו ממאמרים קודמים מה זאת חבילה וכיצד היא בנויה , נעבור על זה בקצרה - יש לנו חבילה מרכזית שמחולקת לחבילות קטנות המכילות מידע עבור התנועה שלה ברחבי הרשת ע"פ מודל OSI.

ה 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
       0  Echo Reply
           Codes:
                      0 - Echo reply
       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
       4  Source Quench
           Codes:
                     0 - Source quench (congestion control)
                        
       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

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
קוד להורדה:

אין תגובות:

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