יום שני, 28 במרץ 2011

SSH Starting Guide

SSH - בשמו המלא Secure Shell בעצם מאפשר תקשורת מאובטחת בין מחשבים ובא להחליף את ה Telnet, לפי מודל OSI הוא נמצא בשכבה השבעית ומשתמש ברכיבי SSL בשכבה ה 5, משתמש בפרוטוקול TCP ויוצא בדרך כלל בפורט 22.

קצת היסטוריה:

קיימות 2 גרסאות לתוכנית, הראשונה SSH-1 שנכתבה בשנת 1995 ע"י טאטו ילונן הוגה הרעיון וכשהבינו את הפוטינציאל יצאה גרסת SSH-2 עם שיפורי תקשורת ואבטחה, נוספו עוד אלמנטים רבים כמו העברת קבצים,ניתוב פורטים של TCP, ועבודה עם ממשקי X11.

מסתבר שהרעיון טוב אבל הביצוע לא כלכך טוב, במהלך השנים התגלו פריצות אבטחה שונות באפליקציה, הפריצה הראשונה נמצאה בשנת 1998 על גרסה 1.5, ונתנה להכניס לתוך ה Packet מידע לא מאושר, יצא מהר תיקון שנקרא SSH Compensation Attack Detector , הפירצה הבאה בשנת 2001 מאפשרת מציאה של הבלוק האחרון של IDEA-encrypted session שמכיל בתוכו את הצופן איתו אנו מצפינים את התקשורת, באותו חודש נמצאה פריצה נוספת שמאפשרת להעביר אימותים של משתמשים לשרתים אחרים.

בשנת 2006 יצא SSH-2 שמכיל בתוכו עדכוני אבטחה רבים אבל בשנת 2008 נמצאה פריצת אבטחה נוספת שמאפשרת לקודד חלקים מהמידע המוצפן בגלל הגדרות ברירת מחדל ושימוש בצפנים חלשים.

בואו נשחק:

צד שרת:
נפעיל את שירות ה SSH ע"ג השרת, קודם נבדוק אם ה Service עובד:
#: service sshd status

הפעלת השירות:
#: service sshd start

יצירת מפתח הצפנה
#: ssh-keygen -t dsa


בעצם נוצר לנו Private Key ו Public Key , בעזרת ה Public Key המשתמשים שמתחברים ל Server מצפינים את המידע וכשהוא מגיע לשרת ה Private Key שעומד מאחורי סיסמא שמגדירים בעת יצירת המפתחות מפענח את המידע.

המפתחות שלנו נמצאים בספריה המוסתרת ssh.


צד לקוח:
התחברות לשרת עם SSH:
#: ssh xxx.xxx.xxx.xxx




SSH Brute Force

השיטה הנפוצה לפריצה דרך SSH היא בשימוש Brute Force - הרצה של רשימת סיסמאות אקראיות מול ה Login עד לפגיעה בסיסמא הנכונה וכניסה למחשב המרוחק ,ב BackTrack קיים כלי למימוש ההתקפה שנקרא BruteSSH.
#: ./brutessh.py -h 192.168.1.104 -u root -d /wordlist/mylist.lst


שלחנו כתובת , שם משתמש במקרה שלנו root וקישור לרשימת מילים אקראית.

כיצד להגן על ה SSH שלי?
  • סיסמא מעל ל 8 תווים ממספרים ואותיות
  • הפניות ב Firewall לכתובות בטוחות בלבד.
  • שימוש בפורט אחר ממקום 22 - שינוי בקובץ sshd_config פרמטר Port.
  • לא לאפשר להתחבר כ Root - שינוי בקובץ sshd_config פרמטר PermitRootLogin.

לסיכום:

השימוש ב SSH רחב מאוד בכל מערכות ה Linux והפך לסוג של סטנדרט להתחברות מרחוק למרות פריצות ההאבטחה שבו, אם שומרים עליו כמו שצריך הוא מספק את הסחורה.

בהצלחה...

יום שבת, 26 במרץ 2011

Reverse Engineering With IDA

נושא ה Reverse Engineering או בעברית "הנדסה לאחור" הוא נושא מרתק ,מורכב ומאתגר , ראינו בעבר כבר דוגמה אחת ל Reverse Engineering בעזרת התוכנה Reflector שמראה לנו את הספריות של .Net וחושפת לנו את הפונקציות והמשתנים שבתוכנה שאנחנו רוצים לנתח, קיימים המון כלים בנושא והרשימה אינה נפסקת, זה תחום ענק שכל חברה רוצה שתהיה לה את האפשרות לנתח את המוצרים של המתחרים שלה על מנת שתוכל לבדוק ולגנוב ממנה רעיונות ופטנטים אבל לא רק חברות מעוניינות באפשרות הזאת, ראו את עולם משחקי המחשב הפיראטים שכל משחק חדש שיוצא מיד יוצאת לו גרסה פרוצה שמאפשרת לשחק את המשחק בחינם והכל בעזרת Reverse Engineering שנעשה על מערכות האבטחה של המשחק.


אז איך בדיוק עושים את זה?

Disassembler - זאת תוכנה שמאפשרת לנו להמיר שפת מכונה לשפת Assembler , ובעצם בצורה זאת נחשף לנו תרשים הזרימה של התוכנית , ניתן לראות את הפונקציות והמשתנים שהתוכנית מריצה וכך ניתן לראות את נקודות הבדיקה עבור סיסמאות או מספרים סיראלים ולהזריק לתוכה את המשתנים שלנו שיגרמו לתוכנית להתבלבל.

אז מה זה IDA?

Interactive Disassmbler - תוכנה שמאפשרת לנו לעשות Reverse Engineering , היא תומכת בהמון פלטפורמות וניתן לעשות איתה Debug לתוכנית ולעבור צעד צעד ולראות מה היא עושה וכיצד היא רצה.

נעבור על התוכנית שאותה נפרוץ , היא מדמה מערכת Login פשוטה שרשום בתוכה את הסיסמא שנדרש להכניס המשתמש.
#include stdio.h
#include conio.h
#include strings.h

int main()
{
   char line[100];
   printf("Welcome To CrackMe - Example For Authentication Application \n");
   printf("Enter Password for Login: \n");
   fgets(line,sizeof(line),stdin);

   int f;
   f = strcmp("crackmeifyoucan\n",line);

   if(f != -1 )
  {
     printf("Authentication Complete \n");
  }
  else
  {
     printf("Authentication Faild \n");
   }
     return 0;
}

כפי שניתן להבין מהתוכנית הסיסמא לכניסה היא crackmeifyoucan , ובעזרת פונקציית strcmp אנחנו בודקים את הקלט שהמשתמש מכניס,לאחר שהבנו את התוכנית שלנו נתחיל עם פיצוח ,תחילה יש להוריד את IDA מהאתר http://www.hex-rays.com/idapro/ אח"כ יש לפתוח את קובץ ה Exe של התוכנית שלנו.



לאחר טעינת הקובץ היפתח לנו טופס שאמור להראות כך:

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

החלון Strings מכיל את כל המחרוזות בתוכנית.


זה הוא ה Bar של התוכנית מרגע טעינת התוכנית בתוכנה  - כולל בתוכו גם את הקוד של הספריות הנלוות עבור הרצת התוכנית וגם את הקוד שלנו, הוא יראה לנו את כל הקוד שחלקו לא רלונטי כי הוא שייך לספריות החיצוניות שנטענות לפני פונקציית ה Main שלנו, נסייר בעזרת החץ עד שנמצא את הפונקציה.


sub_4013C0 הפונקציה Main של התוכנית כפי שניתן לראות בתמונה.



כפי שניתן לראות בתרשים התוכנה את סדר הפעולות שלה, הודעת פתיחה, הכנסת הסיסמא ובעצם ה IF שאומר לאן התוכנה אמורה להמשיך, כבר בשלב הזה ניתן לראות מה הסיסמא שהתוכנית מצפה לה.



כפתור ימני על שורת Strcmp יאפשר לנו הוספת BreakPoint ששם נעצור את התוכנית ונבצע Debug.


לאחר שקבענו BreakPoint ניתן להריץ את התוכנית.


נריץ את התוכנית , נכניס כל ערך לשדה הסיסמא ונחכה עד שהתוכנית תעצור ב BreakPoint שלנו.
נתקדם בתוכנית שלנו בעזרת הכפתורים הבאים (בדומה לשאר ה Debuggers , אפשרות להיכנס לפונקציה או לעבור לשורה הבאה).

נקפוץ עד השורה הבאה:

ונראה אם ה Zero Flag השתנה ב General Registers

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


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


בהצלחה...

יום שישי, 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
קוד להורדה: