את הכלי nmap אתם ודאי מכירים. למעשה, מדובר באחד הכלים החשובים והמרכזיים ביותר, אם לא החשוב מכולם, בעת ביצוע מבדק חדירה. בעזרת nmap ניתן לבצע סריקה מקיפה של הרשת אותה אנו רוצים לתקוף ובכך לקבל עליה מידע מקדים, כגון מארחים ופורטים פתוחים, זיהוי גרסאות וטכנולוגיות ועוד ועוד. לצד זאת, לNmap גם מסד נתונים עם עשרות סקריפטים שיכולים לסייע לנו גם בביצוע התקיפה בפועל כלפי היעד.
גם מפתחי מערכות האיתור וההגנה שמו דגש על עובדת היותו של Nmap כלי חשוב מאד בדרך לתקיפת הרשת שלהם ועל-כן פותחו עם השנים עוד ועוד טכנולוגיות שמטרתן להטעות את סורקי הרשת השונים, בראשן nmap, תוך התמקדות בצורת הפעולה של הכלים, שברובה, זהה.
בשורות הבאות אציג לפניכם את החלק הראשון של המדריך המקיף ביותר שתוכלו לקרוא בכל שפה אפשרית לשימוש בNmap (מלבד התיעוד הרשמי כמובן), כך שגם אם בצד הנתקף משתמשים בחומות אש שמטרתן להטעות את הסורק שלכם, תוכלו לעקוף אותן בסבירות גבוהה. נעבור על מרבית האופציות והאפשרויות שיש לNmap להציע, תוך התמקדות בשיטות עבודה נכונות והיכרות מעמיקה עם פרוטוקולי התקשורת בהם Nmap משתמשת.
כבכל מדריך, גם הפעם אציין ואדגיש שמדריך זה נועד אך ורק עבור האקרים אתיים ומנהלי אבטחה, עבור הכרת שיטות הסריקה הרלוונטיות ושימוש בהם במבדקי חדירה בהסכמה/מניעתן בארגון. כל שימוש בלתי חוקי שייעשה בעזרת מדריך זה הינו על אחריותו הבלעדית של המבצע.
בשלב ראשוני, ע"מ שנוכל להבין את צורת הפעולה של Nmap, נציג מספר נקודות בסיסיות ברשתות תקשורת, תוך התמקדות בנקודות החשובות ביותר עבור הבנת צורת הפעולה של Nmap. אם אתם לא מכירים היטב את מודל OSI, ההמלצה שלי עבורכם היא לעצור כאן, ללמוד אותו לעומק ולחזור למדריך רק לאחר שאתם שולטים בו. אני בשורות הבאות אתמקד רק בשכבה הרביעית של המודל, שכבת התעבורה, שכן היא השכבה שהבנתה חיונית עבור הבנת צורת הפעולה של nmap והדגלים השונים שהוא מציע.
שכבת התעבורה (Transport Layer)
שכבת התעבורה של מודל OSI ומודל TCP/IP אחראית על ניהול התקשורת, אמינות החיבור ואמינות הנתונים בין שני צמתים ברשת. שכבת התעבורה מפקחת על זרימת הנתונים (data stream) בין שני הצמתים ע"י ניהול מהירות ההעברה של הנתונים בהתאם לרוחב הפס ומעבירה את המידע בהתאם בעזרת אחד מהפרוטוקולים הבאים: TCP, UDP, SCTP, DCCP. בשורות הבאות אסקור כל אחד מהפרוטוקולים, מלבד פרוטוקול DCCP שעדיין בפיתוח. החשיבות בלהכיר כל אחד מהפרוטוקולים לעומק גדולה, שכן במרבית הסריקות, Nmap ישתמש בתכונות השונות של כל אחד מהם ע"מ לבצע את הסריקה.
פרוטוקול TCP
פרוטוקול TCP (ר"ת של Transmission Control Protocol) הוא הפרוטוקול הנפוץ והאמין להעברת נתונים בין שני צמתים. במסגרת פרוטוקול זה מתבצע דגש על אמינות החיבור, וידוא קבלה ושלמות המידע. TCP מבצע את התהליכים הבאים בעת שליחת חבילת מידע: 1. פרוטוקול לחיצת היד המשולשת ( three-way handshake) שמיד נדבר עליו. 2. וידוא קבלה של כל חבילות המידע שנשלחו לאחר כמות נתונים מוגדרת מראש. 3. מספור סגמנטים (סגמנטים – חבילות מידע כפי שהם מכונים בשכבה הרביעית): לכל חבילת מידע שנשלחת קיים מספר מזהה ובכך גם אם החבילה שנשלחה ראשונה תגיע אחרי החבילה שנשלחה שנייה, יוכל מחשב היעד להרכיב את החבילות בסדר הנכון ע"פ המספור שלהם.
לחיצת יד משולשת (way handshake-three)
כשאנו פונים למכשיר תקשורת ברשת הLAN (ברשת המקומית, Local Area Network) או ברשת הWAN (רשת מרחבית בדומה לרשת האינטרנט, ר"ת של Wide Area Network) מתבצע תהליך היכרות ואימות בין המקור ליעד אשר נקרא בשם 'לחיצת יד משולשת'. במסגרת תהליך זה, מעביר מחשב המקור למחשב היעד את הדגל syn המסמל בקשה להקמת שיחה. מכשיר היעד משיב לו בשני הדגלים: syn וack, האחד עבור אישור הקמת השיחה והשני בקשה לקבלת מספר סידורי לחבילת המידע ממנו יתחילו למספר את החבילות. לאחר שמכשיר המקור מקבל את הדגל ממכשיר היעד, הוא מסיים את שלב הקמת השיחה בעזרת הדגל ack המכיל את המספר הסידורי הראשון ממנו יתחילו לספור את המידע וחוקים נוספים בנוגע למידע.
תיעוד תהליך לחיצת היד המשולשת בwireshark:
דגלים חשובים של פרוטוקול TCP שיש להכיר:
SYN | דגל המסמל בקשה להקמת שיחה |
ACK | הדגל שנשלח ממכשיר היעד בשלב השלישי ומציין את המספר הסידורי הראשון |
FIN | דגל המציין סיום של השיחה |
RST | דגל המבקש את אתחול הקשר בין המכשירים |
URG | דגל המציין מידע דחוף |
PSH | דגל המפעיל את פונקציית הדחיפה של הפרוטוקול |
פרוטוקול UDP
פרוטוקול UDP (ר"ת של user datagram protocol) מממש שיטה נוספת להעברת נתונים, שונה לחלוטין מהדרך של TCP. הוא אינו מבצע לחיצת יד משולשת, הוא אינו מבצע וידוא קבלה והוא אינו ממספר את הסגמנטים, כך שייתכן שמחשב היעד כלל לא יכול לקבל מידע / לא קיבל את אחת מחבילות המידע / קיבל את חבילות המידע בסדר הלא נכון, אך בגלל חולשותיו של UDP אי אפשר לדעת זאת. אם UDP עם כל-כך הרבה חורים למה בכלל משתמשים בו? דווקא בגלל יתרונותיו הגדולים של TCP הוא דורש הוספה של ביטים רבים למידע שיישמו את היתרונות אותן הוא מציג. בעקבות כך, העברת מידע בTCP איטית יותר מאשר העברת מידע בUDP ובמקרים בהם האיטיות עלולה להיות בעוכרינו, אנו מעדיפים את השימוש בUDP. מתי האיטיות עלולה להיות בעוכרינו? בשיחות וידוא לדוגמא. אם היינו משתמשים בTCP גם בעת שיחות וידאו השיחה הייתה מתבצעת באיטיות בלתי נסבלת וגם בצורה בלתי נסבלת (תחשבו על כך שרק לאחר 5 דקות של שיחה, הייתה מגיעה חבילת מידע שנשלחה בכלל בתחילת השיחה ונאבדה בדרך). במקרים כאלו, השיחה הייתה מבולבלת וחסרת תוחלת ועל כן אנו מעדיפים את השימוש בפרוטוקול UDP.
פרוטוקול SCTP
פרוטוקול SCTP (ר"ת של Stream Control Transmission Protocol) הוא פרוטוקול תעבורת תקשורת (בדומה לTCP וUDP המוכרים). ברמת המימוש שלו הוא זהה יותר לTCP, אך גם שונה ממנו במספר נקודות, אני אציין את שני ההבדלים הבולטים: א'. SCTP עובד בשיטה של massege, בשונה מTCP שעובד כstream. מה ההבדל? אם ניקח לדוגמא את הדרך שלנו לדעת במקרה של חבילות TCP את הסדר הנכון של המידע, הדרך היחידה שלנו לדעת זאת היא ע"פ סדר השליחה של מכשיר המקור, אך אין לנו איזושהי אינדיקציה כיצד הסדר של ההודעה אלא אך ורק כיצד הסדר של השליחה. בSCTP המקרה שונה, SCTP שולח את המידע כmassege אחד מחולק לחתיכת ולא כstream ע"פ סדר מספרי, כך שאת החבילה אני מרכיב לא ע"פ סדר השליחה, אלא ע"פ סדר ההודעה כפי שמכשיר המקור הגדיר. למה זה כל-כך משנה? בשונה מTCP, לSCTP יש הרבה יותר גמישות בנוגע לחבילות שנאבדו בדרך. בעוד בTCP במקרה של חבילות שנאבדו, מכשיר היעד יבקש לשלוח אותן שוב שכן אין לו יכולת להבדיל בין חלק חשוב בהודעה לחלק פחות חשוב בשל העובדה שהוא יודע להרכיב את ההודעה רק ע"פ סדר השליחה, בSCTP מכשיר היעד יבקש לשלוח שוב חבילת מידע שנאבדה רק אם הוא יזהה מבחינת סדר ההודעה שזו חבילה הכרחית (הזיהוי יתבצע ע"פ מספר פרמטרים, לא ניכנס אליהם כרגע). ב'. בשונה מTCP, פרוטוקול SCTP תומך בMultiHoming, כלומר, מאפשר לשלוח את חבילת המידע משני כתובות מקור/לשני יעדים וגמישות רבה יותר בנוגע לנתיבי המידע דרכם תעבור החבילה. כשאני אומר 'לשני יעדים' או 'משני מקורות' אני לא מתכוון שהחבילה תעבור לשני יעדים או תישלח משני מקורות, אלא שיעד אחד יהיה גיבוי למקרה שהיעד הראשון לא יהיה זמין/מקור אחד יהיה גיבוי במקרה שהמקור הראשון לא זמין ולא יכול לקבל את חבילת המידע/לשלוח את החבילה.
דגלים חשובים של הפרוטוקול שיש להכיר:
INIT | דגל המסמל תחילת תהליך שליחת הודעה |
INIT ACK | הדגל שיחזיר מכשיר היעד ומסמל אישור קבלת השליחה |
SACK | דגל המסמל אישור חלקי לקבלת שליחה |
ABORT | דגל המסמל בקשה לביטול הפעולות |
SHUTDOWN | דגל המסמל בקשה לסיום התקשורת |
SHUTDOWN ACK | הדגל שיישלח מכשיר היעד כאישור לקבלת בקשת סיום התקשורת |
מונחים חשובים נוספים שחשוב להכיר הם stateless וstateful. פרוטוקולים שעובדים תחת stateless אלו פרוטוקולים שכל חבילת מידע שהם שולחים יכולה לעמוד בפני עצמה והיעד לא צריך לשמור את החבילות האחרות בשביל להבין את תוכן החבילה, UDP לצורך הדוגמא משתמש בפרוטוקול הזה. כפי שלמדנו, בUDP אין מספור של הסגמנטים ועל כן אין שום קשר בין חבילה לחבילה. לעומת-זאת, פרוטוקולים שעובדים בשיטת הsataeful אלו פרוטוקולים שלחבילות המגיעות יכול להיות קשר לחבילות האחרות ועל כן מכשיר היעד צריך לשמור את כל חבילות המידע, כפי שאתם כבר מבינים, TCP משתמש בשיטה זו.
סריקת מארחים עם Nmap
הסריקה הראשונה שנעשה בעת גישה לרשת כלשהי, היא סריקה מבוססת ICMP וsyn וack בTCP (את המושגים הללו נלמד בהרחבה בהמשך) כלפי כל טווח הכתובות ברשת. בואו נניח שמסכת הרשת שלנו היא 192.168.150.0 והsubnet mask שלנו הוא 255.255.255.0, במקרה כזה, נבצע את הסריקה באופן הבא:
sudo nmap -sn 192.168.150.0/24
בסריקה זו nmap יבצע ping לכל טווח המכשירים ברשת שלנו (במקרה הזה 256 כתובות בלבד, שכן ציינו מסכת רשת מבוססת 24 ביטים (class c), הקיצור המקביל ל255.255.255.0) ולאותן מכשירים שיענו לו לבקשת הping, בעזרת שאילתות נוספות יוציא לנו מידע נוסף על המכשירים, כגון סוג מערכת ההפעלה וכו' וכו'. עם-זאת, בשאילתה זו לא תתבצע סריקה של יציאות ברשת. גם בסריקות אחרות שנבצע בהמשך לגילוי מארחים ברשת וכברירת מחדל Nmap יבצע בהם גם סריקת פורטים, בעזרת ציון sn- לצד הדגלים המשמשים לאותן סריקות (עליהן כמובן נלמד בהמשך), נוכל לדלג על סריקת הפורטים ולהתמקד בסריקת המארחים.
לפעמים החברה ששכרה אותנו לבצע את בדיקת החדירה, תבקש מאיתנו לא לסרוק כתובות ip ספציפיות ברשת. במקרה כזה, בעזרת הפרמטר exclude– נוכל להגדיר לnmap אלו כתובות ip לא לסרוק.
לדוגמא:
sudo nmap -sn 192.168.150.0/24 --exclude 192.168.150.2
נוכל גם לכתוב קובץ עם כתובות הip אותן אנו לא רוצים לסרוק, והפעם להשתמש בפרמטר excludefile–:
sudo nmap -sn 192.168.150.0/24 --excludefile list_ip.txt
נוכל גם לבצע סריקה על טווח מוגדר מראש של כתובות ip, לדוגמא, רק ל50 כתובות הראשונים:
sudo nmap -sn 192.168.150.0-50
על אותו משקל, נוכל לבצע סריקה על כתובות ספציפיות בעזרת כתיבתן ביחד, מופרדות בפסיק, לדוגמא – אם ארצה לבצע סריקה על 5 כתובות ip בלבד, אוכל לכתוב את כולן, אחת אחרי השנייה:
sudo nmap -sn ip, ip, ip, ip, ip
לחילופין, דרך יעילה יותר תהיה פשוט להכניס קובץ עם רשימת כתובות הip אותן אנו רוצים לסרוק בעזרת שימוש בiL- (ר"ת של input list):
sudo nmap -sn -iL list_ip.txt
בדרך כלל, סריקות בעזרת פרוטוקול icpm (בדגש על בקשות ping) ייחסמו על חומת-האש של הארגון, שהוגדרה לנטר סריקות כאלו ולחסום אותן. במקרה כזה, נוכל לבצע סריקה בעזרת הדגל (Pn (no ping-, בסריקה כזו Nmap יבצע סריקה רחבה כלפי כל המכשירים ברשת, גם אם לא ענו לו לבקשת הPing. כלומר, גם אם הייתה הגנה ברשת כלפי בקשות הPing והעמדות בה לא החזירו תשובה לבקשה, עדיין Nmap ינסה לשלוח את שאר השאילתות, שעוסקות יותר במידע על המכשיר הספציפי ובמידה ויקבל תשובה מהן, יידע שכתובת הip של המכשיר שהשיב לו קיימת וישנה עמדה כזו ברשת.
לדוגמא:
sudo namp -Pn 192.168.150.0/24
אם נרצה לבצע רק סריקה של המארחים ברשת, ללא סריקת פורטים ובכל זאת להשתמש ביכולות של Pn-, כלומר לא לייחס חשיבות להאם המארח מחזיר לנו תשובה לבקשת הping או לא, נוסיף את הדגל sn- לפקודה שלנו:
sudo nmap -Pn -sn 192.168.150.0/24
אם בכל זאת נרצה לבצע סריקה בעזרת icmp, נוכל להשתמש בדגלים PE, PM, PP. נסביר באופן נפרד כל אחד ואחד מהדגלים הללו, אך ע"מ שנוכל להבין אותם כמו שצריך, נצטרך קודם-לכן לדבר על שלושה מתוך 254 ההודעות האפשריות בפרוטוקול ICMP. הפעולה האפשרית הראשונה שמבצע icmp היא Echo replay (תגובת הד, בשמה המוכר: pong). זוהי למעשה הודעת התגובה של מכשיר היעד כאשר נשלחת אליו בקשת ping, שנקראת Echo request (ובשמה המוכר: ping) אשר מופיעה כאפשרות השמינית מתוך האפשרויות של הפרוטוקול.
פעולה נוספת שמבצע הפרוטוקול נקראת timestamp request והיא מופיעה כאפשרות ה14 מבין האפשרויות שמציע icmp. בפעולה זו שולח מכשיר הקצה למכשירים אחרים ברשת את התאריך והשעה המעודכנים אצלו, במטרה לקבל מהם timestamp response (האפשרות ה15) עם התאריך והשעה שלהם ובכך לנסות ולסנכרן את התאריך והשעה בין המכשירים ברשת.
והפעולה השלישית שמבצע icmp אותה חשוב שנבין עבור הבנת דגלי סריקת הicmp היא address mask request (האפשרות ה17) שמבקשת מכל המארחים ברשת לשלוח את מסיכת הרשת שלהם בעזרת הודעת addres mask response (האפשרות ה18) במטרה שמכשיר היעד יוכל לקבוע את מסיכת הרשת שלו.
הדגל PE- משתמש באפשרות הEcho שמציע פרוטוקול הicmp במטרה לברר את זמינות המארחים ברשת, כלומר – בping סטנדרטי. אומנם קודם לכן למדנו שגם דגל ה-sn מבצע זאת, אך למרות שסריקה בעזרת הדגל sn- מבצעת גם כן שליחת בקשת icmp ליעדים ברחבי הרשת, הדגש והמטרה המקורית שלה הוא ביצוע סריקה ללא סריקת פורטים. לעומת-זאת, סריקה בעזרת הדגל PE- שמה דגש על שליחת בקשות ping.
אלא שכאמור, סריקה זו פעמים רבות לא תהיה לנו יעילה בשל חסימתה ע"י חומת האש של הרשת אותה נסרוק, עבור כך מציע nmap שימוש גם ב2 האפשרויות האחרות של פרוטוקול הICMP אותם למדנו. סריקה בעזרת הדגל PP- תשלח הודעת timestamp request למכשירים ברשת ואם היא תקבל מהן תגובה, היא תסמן אותן כפעילים. סריקה בעזרת הדגל PM- תשתמש בהודעת הICMP לבירור מסיכת הרשת (addres mask request) ואם היא תקבל מהן תגובה, היא תסמן אותן כפעילים. היתרון של שתי הסריקות האחרונות, היא שבעוד מנהלי אבטחה פעמים רבות יגדירו חסימה של בקשות ping במסגרת ICMP, הן לא יגדירו את שאר האפשרויות שמציע הפרוטוקול כמו הבקשות timetamp וaddres mask request כבקשות שיש לחסום ועל-כן נוכל בעזרתן לקבל מידע על העמדות הפעילות ברשת).
סריקה בעזרת הדגל PM- כפי שתועדה בwireshark (שימו לב לחלק המודגש):
סריקה מעולה נוספת שכמעט אף פעם לא חסומה ע"י חומת האש, היא שימוש בשליחת בקשות ARP לכל טווח הכתובות ברשת. את פרוטוקול ARP אני מקווה מאד שאתם כבר מכירים ואם טרם, אתם לגמרי קופצים למדרגה התשיעית לפני שעליתם על הראשונה כשאתם קוראים את המדריך הזה. מטרתו של הפרוטוקול היא לברר את כתובת הip וכתובת הmac של המכשירים ברשת ובשל נחיצותו לפעילות התקינה של הרשת, בקשות עם פרוטוקול זה בדרך כלל לא ייחסמו ע"י הfireall (אלא אם כן חומת האש מוגדרת להתיר ARP רק מכתובות ספציפיים) ועל כן סריקה באמצעותו נחשבת ליעילה במיוחד (בסריקה כזו משתמש netdiscover המוכר) מלבד העובדה שהיא חוסכת במשאבים ומהירה יותר. בNmap, נוכל לבצע סריקת ARP בעזרת הדגל PR-:
sudo nmap -PR 192.168.150.0/24
דרך נוספת לנסות ולהתגבר על חומת האש, היא שליחת בקשות syn או ack וניסיון לבצע את תהליך לחיצת היד המשולשת (three-way handshake) מול המכשירים ברשת, לפחות בחלקו. נעשה תזכורת קצרה על פעולת הפרוטוקול כפי שלמדנו בתחילת המדריך: בעת כל יצירת תקשורת בין 2 מכשירים ברשת, שולח מכשיר המקור למכשיר היעד הודעה syn, המסמלת בקשה לפתיחת הקשר. אם מכשיר היעד מעוניין באותו קשר, הוא מחזיר למכשיר המקור הודעת syn-ack (הsyn מבטא אישור לפתיחת הקשר והack מבטא בקשה לקבלת מספר סידורי לחבילת המידע ממנה יתחילו לספור את החבילות), בתגובה, לסיום שלב פתיחת הקשר, שולח מכשיר המקור הודעת ack – המספר הסידורי ממנו יתחילו לספור את חבילות המידע והשיחה מוקמת.
בעזרת הדגל PS (ר"ת של ping syn tcp) שולח nmap בקשת syn לפורט 80 (כברירת מחדל) בכל המכשירים ברשת וממתין לתשובה. אם הוא מקבל בחזרה את הדגלים syn/ack או את הדגל rst (כזכור, דגל המציין Reset, כלומר – בקשה לאתחול הקשר בין המחשבים), הרי שקיים מכשיר זמין בכתובת היעד הנסרקת (אם מתקבלים הדגלים syn/ack הרי שיצירת הקשר הצליחה, אם מתקבלת הודעת rst הרי שהמכשיר למעלה, אך יש לנסות ולבצע את תהליך לחיצת היד מחדש). גם אם Nmap מקבל את הדגלים syn/ack כתגובה, במקום לסיים את שלב הקמת השיחה ולשלוח דגל ack כפי שנהוג בתהליך לחיצת היד הסטנדרטי, שולח Nmap דגל rst.
לעומת זאת, אם לא מתקבלת תגובה ממכשיר היעד עד לסיום הtimeout (הזמן שNmap מקציב לתגובה), הרי שאו שמכשיר היעד לא קיים או שגם הבקשה הזו סוננה ע"י חומת האש.
דוגמא לשימוש בדגל PS-:
sudo nmap -PS 192.168.150.0/24
נוכל גם לשנות את פורט ברירת המחדל (80), הפורט אליו נשלח דגל הsyn לכל טווח הכתובות ברשת במטרה לראות האם המכונה בכלל למעלה או להוסיף עליו פורטים נוספים בעזרת הצמדת מספרי הפורטים לPS (ללא רווח):
sudo nmap -PS22-24,80 192.168.150.0/24
בואו נראה את התהליך בwireshark, שימו לב לעומס בקשות הsyn עבור פורט 80:
הסיבה שבסריקת הNmap נקבל גם את הפורטים הפעילים ברשת במכונות הפעילות ולא רק את כתובות הIP של המכונות, היא שnmap, לאחר סיום סריקת הsyn על פורט 80 בכל טווח הרשת, יבצע סריקה לכל הפורטים האפשריים במכונות הפעילות, במטרה לזהות האם הן פתוחים (כאשר גם כאן יפעל אותו עיקרון. אם יחזרו הדגלים syn/ack או הדגל rst הרי שהפורט פתוח, אחרת, הרי שהפורט סגור). את התהליך הזה שההדגמה שלו כפי שתועדה בwireshark מופיעה לפניכם יבצע nmap כברירת מחדל הן בסריקה עם הדגל PS- שלמדנו עכשיו והן בסריקה הם הדגל PA- שנלמד מיד ונוכל לבטלו בעזרת הוספת הדגל pn- למהלך הסריקה:
דרך נוספת להתגבר על החסימה בחומת האש של פרוטוקול הicmp, היא להשתמש בדגל PA- (ר"ת של ping ack). דגל זה דומה מאד לדגל PS- שהצגנו בפסקה הקודמת, אלא שבשונה מדגל PS ששולח בקשת syn לכל המכשירים ברשת ופועל ע"פ התגובה שלהם (אם מתקבלים syn/ack או rst בחזרה הרי שמכשיר היעד פעיל, אם אין הצלחה ביציאת התקשורת עד לסיום הtimeout הרי שמכשיר היעד לא קיים או שמוגן בחומת אש), הרי שדגל הPA שולח במקום דגל הsyn, את דגל הack (שאמור להישלח רק בשלב השלישי של פרוטוקול לחיצת היד המשולשת), כביכול הוא מחזיר תגובה לפנייה שהגיעה ממכשיר היעד. במקרה כזה – אם מתקבל דגל rst הרי שמכשיר היעד קיים (מכיוון שמכשיר היעד לא שלח את דגלי syn/ack עליהם הוא היה צריך לקבל מענה של דגל ack, מכשיר היעד לא יראה את הדגל הזה כאישור לפתיחת שיחה, אלא יבקש לאפס את החיבור ולבצע את תהליך לחיצת היד מחדש בעזרת rst). לעומת זאת, אם לא יתקבל מענה ממכשיר היעד עד לסיום הtimeout, הרי שהמכשיר לא קיים או שכאמור, חומת האש חסמה את הבקשה שלנו.
דגל הPA- כפי שהוא עובר בwireshark:
גם במקרה של דגל הPA-, פורט ברירת המחדל דרכו אנו מוודאים בכלל את זמינות המכשירים ברשת הוא פורט 80 וגם אותו נוכל לשנות בצורה זהה לדרך בה שיננו את פורט ברירת המחדל בדגל הPS-:
sudo nmap -PA22-24,80 192.168.150.0/24
מדוע תמיד כדאי לנסות גם את דגל הPS- וגם את דגל הPA-?
מנהלי אבטחה רבים לא מנסים לחשוב מחוץ לקופסא ומגדירים בהגדרות חומת האש שלהם רק חסימה של בקשות syn נכנסות, למעט משרתים ספציפיים. הם עושים זאת שכן הם מסתכלים על פרוטוקול לחיצת היד המושלשת עליו כבר למדנו ואומרים לעצמם: "התהליך מתחיל מדגל הsyn, אם נחסום אותו, נצליח לחסום כניסה לרשת שלנו". כאן נכנס לתמונה PA- שמנסה להטעות את המכשירים בארגון בעזרת שליחת דגל ack, כביכול הוא כבר בסיומו של תהליך הקמת השיחה איתם.
לעומת זאת, ישנם מנהלי אבטחה אחרים שלא חוששים מתהליך הקמת השיחה בצורתו הסטנדרטית, אלא מחבילות בלתי צפויות. במקרה כזה, חומת האש תחסום את חבילות הack שיישלחו בעקבות ציון PA- בפקודת הnmap, אך לא תפריע לחבילות שנשלחים בעקבות הדגל PS-, שכן הם נשלחות בצורה הסטנדרטית.
בעקבות-זאת, כאמור, אם בקשת הping הפשוטה בעזרת הדגל sn- לא צלחה, כדאי תמיד להשתמש גם בדגל הPS- וגם בדגל הPA-, לדוגמא (הsn- נועד לסמן אי סריקת פורטים):
sudo nmap -PA -PS -sn 192.168.150.0/24
סריקה נוספת שכדאי להכיר בהתמודדות מול חומת האש בתקווה שמנהל האבטחה לא מכיר מספיק את פרוטוקול SCTP ולא יגדיר כנגדו חסימה היא סריקה באמצעות הדגל PY-. בסריקה זו nmap ישתמש בפרוטוקול SCTP עליו למדנו בתחילת המדריך (כזכור, זהו פרוטוקול נוסף לתקשורת, לצד TCP וUDP) ויישלח כברירת מחדל לפורט 80 בכל טווח הרשת את הדגל INIT המסמל תחילת תקשורת (נוכל לשנות את פורט ברירת המחדל בדומה לדרך בה עשינו זאת בסריקות הsyn והack עליהם למדנו קודם לכן). nmap ינתח האם המארח פעיל או לא בהתאם לתגובה שיקבל: אם יתקבל מפורט היעד הדגל INIT-ACK (השלב השני בתהליך יצירת התקשורת של SCTP) או דגל ABORT (דגל המסמל ביטול הפעולות), הרי שמארח היעד פעיל. אם לא תתקבל תגובה הרי שאין מארח פעיל בכתובת הנסרקת / חומת האש הוגדרה גם כנגד סריקה זו ומונעת את המענה. דוגמא לשימוש בסריקה זו:
sudo nmap -PY 192.168.150.2
גם דגל הPO- נחשב לדגל שכדאי לבדוק בהתמודדות מול חומות האש (אם כי כיום מרבית חומות האש חוסמים אותו). בעת שימוש בדגל זה, nmap לא ינסה לסרוק פורטים בטווח הכתובות, אלא לשלוח למכשיר היעד הודעות מטעם הפרוטוקולים הבולטים שתחת IP (כל פרוטוקול ששולח את המידע בעזרת מימוש פרוטוקול הIP, ששולח את המידע בעזרת כתובת IP) כגון IGMP (הפרוטוקול המנהל את הודעות הmulticast ברשת), ICMP, TCP, UDP, SCTP ואחרים. במקרה של אי תגובה nmap יסיק שמדובר במארח שאינו זמין, אך כל סוג של תשובה ממכשיר היעד (מכשיר היעד אמור לשלוח תגובה האם הוא תומך בפרוטוקול המדובר או לא) יסמל עבור nmap שמדובר במארח פעיל. גם אם טרם הבנתם את מהות הפעולה של הדגל PO-, בהמשך נדבר על הדגל sO- ואסביר זאת יותר בהרחבה.
דוגמא לשימוש בדגל PO- תוך ציון הוראה שלא לסרוק פורטים בעזרת הדגל sn-:
sudo nmap -PO -sn 192.168.150.0/24
חבילות ICMP שנשלחו בעקבות ציון הדגל PO- כפי שהם תועדו בwireshark:
אפשרות נוספת לביצוע סריקה לאיתור המכשירים ברשת, היא שימוש בסריקת udp, אשר תשלח חבילות udp לכל המכשירים ברשת במטרה לזהות את המכשירים הפעילים. סריקה זו תשלח במרבית המקרים חבילות מידע ריקות, אך בעזרת דגל נוסף עליו נלמד מיד נוכל לשלוח בכל חבילה תוכן באורך אקראי. סריקת מארחים בudp נחשבת לפחות טובה ולכזו שתחזיר פחות תוצאות מהסריקות האחרות, אך אם אנו מגיעים למצב ששאר הסריקות לא מחזירות לנו את המידע שחיפשנו בשל הגנה קשיחה שקיימת ברשת, מומלץ גם להשתמש בה.
את הסריקה נבצע בעזרת הדגל PU- (ר"ת של ping udp), לו כדאי להוסיף גם את הדגל pn- ע"מ למנוע סריקת יציאות בעזרת syn:
sudo nmap -sn -PU 192.168.150.0/24
נוכל גם לגרום לכך שחבילת הUDP שיישלחו לא יישלחו ריקות, אלא עם תוכן באורך קבוע (תוכן חסר משמעות) בעזרת הדגל –data-length, לצורך הדוגמא:
sudo nmap -sn -PU --data-length 192.168.150.0/24
פעולת סריקת הUDP כפי שהיא מתועדת בwireshark:
נסגור את "החלק הראשון של החלק הראשון של המדריך" עם דגל נוסף שכדאי להכיר בכל הנוגע לסריקת מארחים, הלא הוא דגל ה-PL. בדגל זה לא מתבצעת שליחה של חבילת מידע ליעדים ברשת, אלא מודפסות כתובות הip של המארחים שאנו ציינו, תוך ביצוע סריקת dns הפוכה כלפיהם. לצורך הדוגמא, אם יש לנו 3 כתובות של מחשבים שאנו רוצים לבדוק מה שמן של אותן מחשבים, נשתמש בסריקה בצורה הבאה:
sudo nmap -PL 192.168.150.1, 192.168.150.2, 192.168.150.4, 192.168.150.8, 192.168.150.32
ובפלט, נקבל את שמות המחשבים הפעילים:
סריקה זו לרוב לא תיחסם ע"י חומת האש, שכן כאמור היא לא שולחת חבילות מידע והדבר היחיד שהיא מבצעת זו סריקת dns הפוכה (reverse dns). פעולה שנוכל לבצע גם בעזרת הפקודה nslookup.
דגל הסריקה | פעולה |
---|---|
PL- | הצגת כתובות הip שצויינו ללא שליחת חבילת מידע, אך עם ביצוע reverse dns |
sn- | סריקה המשתמשת בicmp ובלחיצת יד, אך הדגש שבה היא אי סריקת היציאות |
PE- | סריקת ping סטנדרטית, משתמשת באפשרות הEcho של פרוטקול הicmp |
PP- | סריקה המשתמשת באפשרות הtimestamp של פרוטוקול הicmp |
PM- | סריקה המשתמשת באפשרות הaddres mask request של פרוטוקול הicmp |
PR- | סריקה המשתמשת בפרוטוקול ARP |
Pn- | ביצוע סריקות כלפי כל המארחים ברשת, גם אם אין מענה לבקשת הping |
PS- | שליחת דגל syn למכשיר היעד |
PA- | שליחת דגל ack למכשיר היעד |
PY- | שליחת חבילת SCTP עם הדגל INIT למכשיר היעד |
PU- | שליחת חבילת udp למכשיר היעד |
PO- | שליחת חבילות מידע מטעם שמעל פרוטוקול הIP |
סריקת פורטים עם nmap
הסריקה החשובה ביותר שלנו בשלב איסוף המידע, לקראת ניסיון החדירה לרשת, היא סריקת הפורטים הפתוחים בעמדה שחשפנו את היותה קיימת בעזרת סריקת המארחים, הפורטים בעזרתם, אם הרשת אכן פגיעה, נוכל לחדור לרשת. לNmap מגוון רחב מאד של טכניקות לסריקת הפורטים ובשורות הבאות אציג את הבולטות שבהן.
הסריקה הראשונה עליה נדבר היא שליחת הודעות syn למכונות ברשת, הסריקה הפופולרית ביותר וזו שמתבצעת כברירת מחדל במרבית טכניקות סריקת המארחים שלמדנו, אם לא ציינו במפורש את אי סריקת הפורטים בעזרת sn-. סריקה זו פופולרית כל-כך בשל היעילות שלה והעובדה שפעמים רבות חומת האש לא תגלה אותה, שכן היא אינה משלימה את לחיצת היד המשולשת ובדומה לדגל הPS- בסריקת המארחים, רק שולחת את הדגל syn. אם היא קיבלה כמענה את הדגלים SYN/ACK מפורט היעד במכונה הנסרקת, הרי שהפורט פתוח. אם היא קיבלה את הדגל rst, הרי שהפורט סגור. אך בכל מצב, היא אינה משלימה את התהליך עם דגל ack.
סריקה זו מתבצעת בעזרת הדגל sS-, לדוגמא:
sudo nmap -sS 192.168.150.2
נוכל גם להגדיר לnmap לבצע סריקה רק של מספר ספציפי של יציאות ולא של כל כמעט 40,000 הפורטים אותם הוא סורק כברירת המחדל, בעזרת הדגל p-. כך נוכל לדוגמא לסרוק את הפורטים מ3 עד 150:
sudo nmap -sS -p 3-150
נוכל גם לא לכתוב ערך התחלתי וnmap יתחיל מערך הפורט הראשון (1), כלומר: sudo nmap -sS -p -100 יבצע סריקה של הפורטים 1 עד 100 (אין באמת צורך לציין sS- שכן זוהי סריקת ברירת המחדל, אך אם נרצה לבצע סריקות אחרות נצטרך כן להכניס את הדגל הרלוונטי). על אותו משקל, נוכל גם לא לכתוב ערך סיום וnmap ישתמש בערך הפורט האחרון האפשרי (הפורט האחרון – 65,535), לדוגמא: –sudo nmap p 100- (שימו לב למיקום ה(-) בכל אחד מהסריקות, לפני המספר או לאחריו). נוכל גם לבצע סריקה של כל הפורטים האפשריים (65,535) בעזרת אי ציון אף ערך והכנסת התו (-) משני צדדי הארגומנט p, כך: sudo nmap -p- 192.168.150.2 או סריקה רק של פורט אחד או כמה בודדים בעזרת ציונם לאחר הדגל p-, לדוגמא: sudo nmap -p 25 יסרוק רק את פורט 25. אגב, סריקת כל הפורטים עם -p- זו הפעולה המומלצת כשיש לכם את הזמן, אף פעם אתם לא יכולים לדעת אלו פורטים כן פתוחים אצל היעד ופעמים רבות אלו יהיו פורטים "נידחים" שNmap לא סורק (Nmap סורק כברירת מחדל 'רק' קרוב ל40,000 פורטים ובהמשך נדבר על כך).
נוכל גם לצמצם את תוצאות הסריקה לפרוטוקולים שמעניינים אותנו בלבד, לדוגמא, אם נרצה לראות רק שרתי אינטרנט פתוחים, נוכל להוסיף לדגל הסריקה שלנו הוראה שמבקשת להציג בפנינו רק פורטים שמפעילים את פרוטוקול HTTP. נבצע זאת כך (שימו לב: 1. אני משתמש בדגל sS- רק בשביל הדוגמא, אבל זה יכול להיות כל דגל אחר. 2. ה* בסוף הHTTP נועד להציג את HTTP בכל הגרסאות. 3. אם נרצה להוסיף פרוטוקלים אחרים, פשוט נוסיף אותם לאחר פסיק וללא רווח):
sudo nmap -sS -p http* 192.168.150.2
לחילופין, שימוש בפרמטרים top-ports– או port-ratio— יגרום לnmap לבצע סריקה רק כלפי הפורטים הנפוצים והפגיעים ביותר, בהתאם למידע השמור במסד הנתונים של nmap (במסד הנתונים nmap-services נשמר לצד כל פורט ערך מספרי שקובע את רמת החשיבות שלו, הפגיעות שלו והפופולריות שלו). שימוש בtop-ports– יתבצע בצורה הבאה: אם נרצה ש50 הפורטים הנפוצים ביותר ייסרקו, נציין 50 לאחר הפרמטר. לדוגמא: sudo nmap -sS –top-ports 50 192.168.150.2. אם נרצה מספר אחר, נציין אותו. לעומתו, שימוש בפרמטר port-ratio— ייעשה בצורה הבאה: אם נרצה סריקה רק של פורטים בעלי ערך של מ0.5-1.0 במסד הנתונים, נציין את הטווח לאחר הפרמטר והוספת המילה השמורה ratio, לדוגמא: sudo nmap -sS –port-ratio ratio 0.5-1.0 192.168.150.2.
דרך נוספת להקטין את כמות הפורטים הנסרקים (צריכה להיות לכם סיבה ממש טובה למה לעשות זאת) היא שימוש בדגל F- שמאפשר להקטין את כמות הפורטים שנסרקת ע"י nmap כברירת מחדל. ע"מ שתבינו בצורה טובה את פעילות הדגל, אתייחס לדרך סריקת הפורטים של nmap באפשרות ברירת המחדל: כברירת מחדל, Nmap סורק את מארח היעד בהתאם לקובץ nmap-service (נמצא בנתיב הבא בלינוקס: usr/share/nmap/). בקובץ זה ישנם מאות פרוטוקולים וקרוב ל40,000 יציאות, כאשר הרעיון הוא לפנות ל1,000 הפורטים הנפוצים ביותר של כל אחד מהפרוטוקולים שנסרקים (nmap מחפש אחר מאות פרוטוקולים ידועים ושלא ידועים, פורטים בהם נוהגים להתארח סוסים טרויאנים ונוזקות ועוד ועוד). בעזרת הדגל F- אנו יכולים לצמצם את הפנייה רק ל100 הפורטים הנפוצים ביותר של כל אחד מהפרוטוקולים.
דוגמא לשימוש בדגל זה:
sudo nmap -sS -F 192.168.150.2
אגב, כברירת מחדל, nmap יסרוק את כל טווח הפורטים בצורה אקראית. צורה זו של סריקה נחשבת ליעילה וטובה יותר, אך אם נרצה שהסריקה תתבצע באופן רציף וע"פ סדר הפורטים, נוכל לבצע זאת בעזרת הוספת r- לסריקה. לדוגמא:
sudo nmap -p- -r 192.168.150.2
אפשרות מעניינת ושימושית נוספת היא לבקש מnmap להציג בפנינו אך ורק פורטים פתוחים, בעזרת הוספת הפרמטר open– לסריקה. לדוגמא: sudo nmap -sS –open 192.168.150.2. יש לציין כי בעת שימוש בפרמטר זה nmap תציג גם פורטים שספק פתוחים ספק מסוננים.
כאשר המכונה הנסרקת שלנו משתמשת בפרוטוקול IPv6 וממילא סריקת הsS- לא רלוונטית עבורה, נוכל לבצע סריקת פורטים בעזרת הדגל sT-. בסריקה זו nmap לא פונה לפורטים במכשיר היעד, אלא מבקש ממערכת ההפעלה (system call) ליצור socket מול הפורט הרלוונטי במכשיר היעד. סריקה זו נחשבת ליעילה הרבה פחות מסריקת הsyn שלמדנו קודם-לכן, שכן בסריקה זו (סריקת הsT-) מערכת ההפעלה משלימה את תהליך לחיצת היד מול היעד (בשונה מסריקת הsS- שלא משיבה לדגל שמחזיר לה מכשיר היעד) וממילא היא לוקחת זמן ארוך יותר והיא חשופה יותר למערכות הגנה. דוגמא לסריקה זו:
sudo nmap -sT 192.168.150.2
סריקה חשובה מאד שיש הנוטים להתעלם ממנה ושלא בצדק, היא סריקת UDP כלפי הפורטים במערכת הנסרקת. למה סריקה זו כל-כך חשובה? ישנם פורטים מסוימים שעובדים בUDP ופעמים רבות נוכל להשתמש בפגיעויות הקיימות בהם כשער הכניסה למארחת. לצורך הדוגמא, שירות הdns (פורט 53), שירות הsmb (לגביו קיימים לא מעט פגיעויות, פורטים 162 ו163) ושירות הdhcp (הפורטים 67,68) משתמשים בUDP. הבעיות בסריקה זו ואלו גם הסיבות שיש הנוטים להתעלם ממנה, היא האיטיות הגדולה שלה ביחס לסריקת TCP, זאת בשל הזמן הארוך שnmap מחכה עד לקבלת התגובה מהפורטים השונים (שכן אם הפורט פתוח לרוב הוא לא ישיב לחבילת הUDP ואם הפורט סגור הוא ישיב בשגיאת ICMP שמערכות רבות, בראשן לינוקס, מגבילות את שליחתן לפרקי זמן קצובים, משא"כ בסריקת syn שמזהה שהפורט סגור במקרה של קבלת דגל rst). כמו-כן, חשוב עוד לציין שבשל מגבלה בלינוקס שמונעת שליחת חבילת UDP ליותר מפורט אחד בו זמנית, סריקה של כלל הפורטים הקיימים (65,535) תיקח בלינוקס כשמונה-עשרה שעות ועל כן כדאי לבצעה בwindows.
ניתוח התגובה ממכשיר היעד על ידי nmap תתבצע בצורה הבאה: אם מכשיר היעד מחזיר שגיאת ICMP port unreachable (עם type 3, האפשרות השלישית מתוך האפשרויות של פרוטוקול הicmp) לבקשת הUDP שלנו, nmap יתייחס ליציאה כסגורה. לעומת זאת, אם תת הtype של התשובה תהיה שונה (האפשרויות 1,2,9,10,13 בתוך type 3), ההתייחסות של nmap ליציאה תהיה כמסוננת (כלומר, נחסמה ע"י חומת האש ואין אפשרות לדעת מה המצב שלה). אם פורט היעד יחזיר חבילת UDP, ההתייחסות אליו תהיה כפתוח. ואם לא תחזור תשובה מפורט היעד (מה שיקרה במרבית הפורטים הפתוחים בUDP, שכן, כזכור, UDP פועל בשיטת הstateless שלא מצריכה ניהול תקשורת רציף על סדר ההגעה של החבילות ואמינותן) לNmap לא תהיה מסקנה האם הפורט פתוח או מסונן ועל כן כדאי להוסיף לסריקה זו גם את הדגל sV- עליו נלמד בהמשך שיציג לנו את גרסאות הפורטים הפתוחים (וממילא נוכל לדעת איזה פורט פתוח ואיזה פורט מסונן). יש לציין כי למרבית הפורטים, nmap תישלח חבילות UDP ריקות, בדיוק כמו בסריקת המארחים המבוססת UDP (הדגל PU-), אם נרצה בכל זאת לשלוח תוכן כלשהו בחבילות, נוכל להוסיף לבקשת הnmap את הארגומנט data-lenght–.
דוגמא לסריקת UDP סטנדרטית:
sudo nmap -sU 192.168.150.2
דוגמא לסריקת UDP עם דגל המסמל בקשה למידע על הפורטים הפתוחים, כך שנוכל להבדיל בין פורטים פתוחים למסוננים:
sudo nmap -sU -sV 192.168.150.2
דוגמא לסריקת UDP, תוך הגדרה של שליחת חבילות בגודל כלשהו, בשונה מברירת המחדל:
sudo nmap -sU --data-lenght 192.168.150.2
דוגמא לשילוב של סריקת syn וסריקת udp:
sudo nmap -sS -sU 192.168.150.2
סריקת פורטים מצוינת נוספת שרלוונטית בעיקר כלפי יעדים מבוססי UNIX ומאד יעילה כנגד חומות אש, היא שימוש בדגלים sX, -sF- וsN-, בסריקה זו nmap משתמשת בחוק מסוים שהוגדר בRFC 793 שעוסק בפרוטוקול TCP (ר"ת של Request for Comments, מזכרים טכנולוגיים העוסקים בפרוטוקולי תקשורת) וקובע כי במקרה שיפנו לפורטים חבילות ללא הדגלים SYN, ACK, או RST, אם פורט היעד פתוח, עליו להתעלם מפניות אלה ולזרוק אותן שכן אינן סבירות. לעומת-זאת, אם הפורט סגור עליו להחזיר דגל rst. בסריקה בעזרת אחת משלושת הדגלים הללו nmap ישלח לפורטים במכשיר היעד חבילות ריקות עם דגלים שונים שמיד נדבר עליהן ויגבש מסקנה לפי המענה שלהם: אם פורט היעד לא מחזיר תגובה, כנראה הוא פתוח. אם הוא מחזיר דגל RST, ככל הנראה הוא סגור. סריקה זו רלוונטית בעיקר כלפי יעדים מבוססי UNIX, שכן Windows, מכשירים רבים של Cisco, IBM ואחרים לא תומכים בתקן RFC 793 שעל החוק הספציפי שלו מבוססת הסריקה. נקודה נוספת שחשוב לציין בהקשר לסריקה זו היא העובדה שייתכן ואנו לא נקבל מענה מפורטים מסוימים לא בגלל שהם פתוחים, אלא בגלל שהם נחסמו ע"י חומת האש (כזכור, פורטים שסוננו יזוהו ע"י nmap או בשל חוסר מענה או בשל מענה ספציפי של שגיאת icmp, במקרה הזה, במקרה של אי-מענה nmap לא יוכל להסיק בוודאות האם הפורט פתוח או אולי מסונן ורק במקרה של שגיאת הicmp הספציפית הוא יציין לנו בוודאות שהפורט מסונן). לכן, תמיד פעלו בתבונה ונסו לנתח את הפלט שיחזיר לנו nmap ולהתרשם על-פיו האם הפורט פתוח או שמא מסונן, אם נראה שכל הפורטים המשמעותיים פתוחים, זה אמור להדליק לנו נורה אדומה שאי התגובה של הפורטים נבע מסינון של חומת האש. אם רק חלק מהם לא הגיבו לחבילה של nmap, אך פורטים חשובים אחרים הגיבו בrst, יש יסוד להניח שהמכונה פגיעה לחוק הRFC עליו דיברנו.
בעת שימוש בsN- לא יישלח שום דגל ע"י nmap, בעת שימוש בsF- יישלח ע"י nmap דגל FIN בלבד (כזכור, דגל המבטא סיום תהליך תקשורת) ובעת שימוש בsX- יישלחו ע"י nmap הדגלים FIN, PSH ו- URG (הדגל PSH מבטא הפעלת פרוטוקול הדחיפה של TCP, הדגל FIN מבטא סיום הקשר והדגל URG מבטא מידע דחוף).
סריקת הsX- כפי שהיא מתועדת בwireshark:
עוד דרך להתמודד עם חומת האש היא שימוש בדגלים sA- או sW-, בדגלים אלו nmap לא יחזיר לנו מידע האם הפורטים פתוחים או סגורים, אלא רק באלו פורטים הוא מזהה התערבות של חומת האש. בסריקה עם הדגל sA- ישלח nmap חבילות ACK לפורטים השונים במכונת הנסרקת, את הפורטים שיחזירו דגל rst (החבילה שצריכה להישלח בתגובה לחבילת ACK שמגיעה ללא תהליך מסודר של לחיצת יד משולשת) nmap יזהה כפורט פתוח או סגור, אך כזה שלא מסונן ע"י חומת האש. לעומת זאת, פורטים שלא יחזירו תשובה או שיחזירו שגיאת icmp מהסוג הספציפי עליו דיברנו קודם לכן, nmap יזהה כפורטים שסוננו ע"י חומת האש. הדגל sW- מבצע פעולה זהה לחלוטין, אלא שבמקרה של ציון דגל כזה nmap ינסה גם להסיק האם הפורט הספציפי פתוח או סגור, בעזרת ניתוח של חבילת הrst. עם-זאת, שיטה זו נחשבת לפחות אמינה וההמלצה היא לבחון את הפלט שמגיע ממנה ועל פיו להסיק את אמינותה (כלומר – אם הפלט שחוזר הוא שכל היציאות סגורות או שכל היציאות פתוחות, בסבירות גבוהה הסריקה לא רלוונטית. אם הפלט שחוזר הוא שפורטים ספציפיים פתוחים וכל השאר סגורים, יש יסוד סביר להניח שהסריקה אמינה).
דוגמא לשימוש בדגל sA-:
sudo nmap -sA 192.168.150.2
דוגמא לשימוש בדגל sW-:
sudo nmap -sW 192.168.150.2
סריקה נוספת שכדאי להכיר היא סריקה באמצעות הדגל sY- הדומה לדגל PY- בסריקת המארחים. גם בסריקה זו nmap ישתמש בפרוטוקול SCTP עליו למדנו בתחילת המדריך (כזכור, זהו פרוטוקול נוסף לתקשורת, לצד TCP וUDP) ויישלח לפורטים השונים במכשיר היעד את הדגל INIT המסמל תחילת תקשורת. כמו בסריקת Syn, גם בסריקת INIT לא יתבצע סיום של תהליך לחיצת היד וnmap ינתח האם הפורט פתוח או סגור בהתאם לתגובה שיקבל: אם יתקבל מפורט היעד הדגל INIT-ACK (השלב השני בתהליך לחיצת היד של SCTP), הרי שפורט היעד פתוח. אם יתקבל הדגל ABORT (דגל המסמל ביטול הפעולות), הרי שפורט היעד סגור. אם לא תתקבל תגובה או שתתקבל שגיאת ICMP (מהסוגים עליהם דיברנו קודם לכן) הפורט יסומן כמסונן ע"י חומת האש. סריקה זו תהיה פעמים רבות יעילה כנגד חומת האש שכן ייתכן ומנהל הרשת יגדיר חסימה רק לפניות בTCP או UDP המוכרים, אך ישכח מSCTP.
דוגמא לסריקה זו:
sudo nmap -sY 192.168.150.2
סריקת הsY- כפי שתועדה בwireshark:
גם אם חומת האש חסמה את חבילת הINIT במסגרת פרוטוקול SCTP, בעזרת הדגל sZ- ניתן לנצל תכונה ספציפית בפרוטוקול שבמקרה שיישלח אל יציאה פתוחה הדגל COOKIE ECHO (דגל המסמל עוגייה הנשלחת לאבטחת החיבור בשלב השלישי של תהליך התקשורת בין שני מכשירים בפרוטוקול) על מכשיר היעד שלא להגיב שכן קבלת דגל כזה ללא שיחה מקדימה אינו סביר. לעומת זאת, במקרה שהיציאה סגורה, על מכשיר היעד להגיב בדגל ABORT. במקרה של שימוש בsZ- ישלח nmap חבילות עם הדגל COOKIE ECHO לפורטים השונים במכשיר היעד. אם הוא יקבל בתגובה את הדגל ABORT – הוא יבין שפורט היעד סגור, אם הוא לא יקבל תגובה, הוא יוכל להניח שמכשיר היעד פתוח. החיסרון של סריקה זו היא שגם אם מכשיר היעד מפעיל חומת אש שהוגדרה לחסום גם פניות COOKIE ECHO לא תחזור תגובה מהפורטים השונים וnmap לא יוכל לדעת האם הפורט פתוח ועל כן אינו מחזיר תגובה או שהוא מסונן ועל כן אינו מחזיר תגובה. כפי שכבר כתבתי לכם, במקרים כאלו זהו התפקיד שלכם לנתח את כמות הפורטים שלא מחזירים תגובה וכמות הפורטים שמחזירים ולנסות להגיע להנחה סבירה, האם הפורטים הללו פתוחים או מסוננים. דוגמא לסריקה:
sudo nmap -sZ 192.168.150.2
nmap גם מאפשר לנו לשלוט לחלוטין בדגלים איתם אנו רוצים לסרוק בעזרת ציון הארגומנט scanflags– ואחריו הדגלים בהם אנו רוצים לעשות שימוש. לדוגמא: sudo nmap –scanflags FINSYNACK יבצע סריקה בעזרת הדגלים FIN, SYN וACK. שימו לב שאת הדגלים יש לכתוב אחד ליד השני, ללא רווח וללא פסיקים. אגב, נוכל גם לציין לNMAP את הצורה בה הוא צריך לפרש את התגובות הפגיעות ממכשיר היעד. לדוגמא, אם נרצה שפורטים שלא יגיבו יסומנו כמסוננים, נוכל להוסיף לסריקה את הדגל sA- או sP- (הדגל המתווסף כברירת מחדל) המסמלים סריקות בהם פורטים שאינם מגיבים מסומנים כמסוננים. אם נרצה שהפורטים יסומנו כפתוחים, נוכל להוסיף לה את הדגל sF- המסמלת סריקת FIN בה פורטים שאינם מגיבים מסומנים כפתוחים. יש לציין שסריקה זו רלוונטית עבורכם רק אם אתם עם ידע מספיק טוב בפרוטוקולי תקשורת ובדגלי TCP והיא מאפשרת לכם להוציא מהכוח אל הפועל רעיונות לסריקה שnmap טרם משתמש בהם.
כעת נדבר על תכונה חשובה נוספת שמציע nmap והיא קבלת מידע על פרוטוקולים המשתמשים בפרוטוקול הIP להעברת מידע בהם תומך היעד. בשיטה זו (שפועלת באותו רעיון שפועל דגל הPO- עליו למדנו קודם לכן) לא נוכל לחשוף מידע על הפורטים הפתוחים ועל כן אני מציין אותה רק בסוף החלק העוסק בגילוי פורטים, אך נוכל לקבל מידע חשוב על פרוטוקולי התקשורת מעל IP בהם תומך היעד, כגון ICMP, TCP, UDP ,IGMP ועוד (כזכור, כל פרוטוקול ששולח את המידע בעזרת מימוש פרוטוקול הIP, שמבצע את שליחת המידע בעזרת כתובת IP). סריקה זו ניתן לבצע בnmap בעזרת הדגל sO- וניתוח התגובה ע"י nmap מתבצע בצורה הבאה: פרוטוקול לגביו מכשיר היעד יחזיר שגיאת ICMP (האפשרות השלישית בפרוטוקול) יסומן כפרוטוקול שלא נתמך במכשיר, פרוטוקול לגביו מכשיר היעד יחזיר שגיאת ICMP מהסוגים האחרים יסומן כמסונן. פרוטוקול לגביו מכשיר היעד לא יחזיר אף תגובה יסומן כפתוח או מסונן. כל תגובה אחרת שתתקבל ממכשיר היעד תגרום לNmap להבין שהפרוטוקול פתוח (עם-זאת יש לציין שחומות אש רבות יחזירו תגובת פתוח בכל 256 הפרוטוקולים, כך שבמקרה שקיבלנו פלט כזה עלינו להבין שהבקשה שלנו סוננה ע"י חומת האש של היעד).
נוכל גם לציין לnmap אלו פרוטוקולים אנו רוצים לסרוק מתוך 256 הפרוטוקולים שמעל IP, לדוגמא, אם נרצה לסרוק רק את הפרוטוקולים 10-100, נוכל להשתמש בדגל p- באותה צורה בה השתמשנו עבור סריקת פורטים (הדגל הוסבר בהרחבה בפסקה שעסקה בדגל הsS-), אלא שהפעם הוא ישמש עבור סריקת הפרוטוקולים. כך זה ייראה: sudo nmap -p 10-100 -sO 192.168.150.2.
זהו לדוגמא הפלט שקיבלתי בסריקת sO- שביצעתי על אחד המכשירים ברשת שלי:
דגל הסריקה | פעולה |
---|---|
sS- | שליחת חבילות מידע עם הדגל syn לכל טווח הפורטים האפשרי במכשיר היעד |
sT- | בבקשה ממערכת ההפעלה לבצע את כל תהליך לחיצת היד מול הפורטים במכשיר היעד |
sU- | סריקת UDP כלפי הפורטים במכשיר היעד |
sN, -sX, -sF- | בהתאמה: סריקה השולחת חבילה ריקה, דגל FIN ואת הדגלים PSH, FIN, URG |
sA, -sW- | שליחת חבילות ack במטרה לזהות האם יש התערבות של חומת האש |
sY- | סריקה המשתמשת בשליחת חבילות INIT (במסגרת פרוטוקול SCTP) |
sZ- | סריקה השולחת את הדגל COOKIE ECHO, גם היא עושה שימוש בSCTP |
scanflags– | סריקה מותאמת אישית |
sO- | סריקה המציגה את הפרוטוקולים מעל IP שבשימוש מכשיר היעד |
זיהוי מערכת ההפעלה, גרסאות ושירותים
לאחר שלמדנו על דגלי סריקות המארחים ודגלי סריקות הפורטים, נתמקד כעת בדרכים לזהות את הגרסאות של אותן פורטים, מידע חשוב מאד שיסייע לנו לקראת שלב התקיפה בפועל. ככל שנקבל מידע יותר ספציפי ורחב, נוכל לחפש בצורה ממוקדת יותר האם ישנן פגיעויות שנמצאו באותן גרסאות.
למעשה, כברירת מחדל nmap לא מבצע סריקה מעמיקה לקבלת מידע על הפורטים אותם הוא סורק. לדוגמא, אם nmap מסיק שהפורט 25 פתוח, הוא מציג אותו כפורט SMTP שכן בדרך כלל הפורט 25 משמש עבור שרתי דואר המשתמשים בSMTP, אך הוא אינו מוודא זאת בשאילתות מול הפורט. כלומר: אם מארח היעד משתמש בפורט 25 לצרכים אחרים, ללא שימוש בדגלי זיהוי גרסה, nmap יציג לנו מידע לא נכון בנוגע לפעולה שמבצע הפורט.
הדגל הראשון שנכיר הוא גם הדגל השימושי ביותר לגילוי גרסאות, הלא הוא הדגל sV-. בעת ציון דגל זה, nmap משתמשת במסד הנתונים שלה nmap-service-probes המכיל מגוון של שאילתות מתואמות כלפי הפורטים השונים עבור גילוי הגרסה שלהם וקבלת מידע עליהם. בעת ציון דגל זה nmap ינסה להסיק מה סוג הפרוטוקול, מה שם היישום, מהו מספר הגרסה, מהו שם המארח, איזה סוג התקן זהו המארח (האם מחשב, או אולי מדפסת או נתב), מהי מערכת ההפעלה ועוד. הנה דוגמא לסריקה כזו על מכונת metasploitable2:
אגב, דגל זה מבצע גם את הפעולה של הדגל sR- (ועל כן לא התייחסתי לדגל זה בנפרד בפרק הפורטים). הדגל sR- מנסה לאתר יציאות RPC פתוחות (RPC, ר"ת של Remote Procedure Call, הפעלת פרוצדוריות מרוחקת. פרוטוקול אשר מאפשר ביצוע פעולות ספציפיות במחשב אחר ללא צורך ביישום פרטני של פרוטוקול תקשורת) בעזרת שאילתות NULL (שאילתות של SunRPC, הפרוטוקול שמאפשר לתקשר עם יציאות rpc ואיתו משתמשים גם בכלי rpclient המוכר).
כאמור, בסריקה סטנדרטית עם sV- נעשה שימוש ע"י nmap במסד נתונים המכיל שורה של שאילתות שנועדו עבור זיהוי גרסאות וקבלת מידע. לכל שאילתה כזו מוקצה ערך מספרי מ1 עד 9, שמסמל את רמת החדירה של nmap בניסיון לזהות את הגרסה. כברירת מחדל כל שאילתה נשלחת עם הערך 7, אם נרצה להקטין את רמת החדירה או להגביר עד לרמה המקסימלית (9), נוכל לבצע זאת בעזרת הפרמטר version-intensity–. לדוגמא, אם נרצה להשתמש בעוצמה המקסימלית של הסריקה (הערך המספרי 9), הערך שיכול להביא לנו את התוצאות הטובות ביותר, אך גם יצריך מאתנו הקדשה של יותר זמן, נשתמש בפקודה הבאה:
sudo nmap -sS -sV --version-intensity 9 192.168.150.2
אגב, במקרה שאנו רוצים את הערך 9, אפשר גם להשתמש בפרמטר ספציפי שנועד עבור שאילתה כזו, הפרמטר version-all–, לדוגמא: sudo nmap -sS -sV –version-all 192.168.150.9. על אותו משקל, אם אנו רוצים את הערך 2 (שיניב תוצאות בצורה מאד מהירה, אך הוא פחות יעיל), נוכל להשתמש בפרמטר version-light–.
בעזרת הדגל O- נוכל לבצע סריקה לאיתור מידע על מערכת ההפעלה של מכשיר היעד. בסריקה זו מנסה להוציא Nmap מזהים ספציפיים בתגובות שמגיעות להודעות TCP וUDP שהוא שולח ולהשוות אותן מול מסד נתונים ענק שקיים אצלו עם מעל 2,600 מזהים ספציפיים של מערכות הפעלה (מסד הנתונים הזה נקרא nmap-os-db). דוגמא לסריקה זו:
sudo nmap -O 192.168.150.2
על-אף שמבחינת ניתוח הנתונים של Nmap, תהיה יעילות לסריקת מערכת ההפעלה רק אם במכשיר היעד ישנו פורט אחד פתוח ופורט אחד סגור לפתוח, Nmap ינסה בכל מצב (גם אם במכשיר היעד אין פורט אחד פתוח ופורט אחד סגור שזוהו) לקבל פרטים על מערכת ההפעלה. ע"מ להגדיר לNmap לוותר על הסריקה במקרים בהם הוא לא מזהה פורט פתוח או סגור ובכך לייעל את הסריקה, ניתן להשתמש בפרמטר osscan-limit–. לדוגמא, sudo nmap -O –osscan-limit 192.168.1.10.
כאשר nmap מנסה לאתר את פרטי מערכת ההפעלה ולא מצליח, הוא יציג לנו פעמים רבות שם של מערכת הפעלה שבסבירות גבוהה עומדת מאחורי המכונה מרוחקת בהתאם לתוצאות ניתוח חבילות המידע שבוצע על ידו, אך לא בוודאות (תוך ציון כמות האחוזים בנוגע לזהות מערכת ההפעלה). עם-זאת, nmap כברירת מחדל יבצע זאת רק כאשר ההתאמה נראית לו קרוב למושלמת, כדי להרוויח את טווח הסבירות ולגרום לכך שnmap יציג לנו מידע על מערכת ההפעלה, גם כשהוא בטוח באמינות המידע הזה באחוזים נמוכים, נשתמש בדגל osscan-guess– או בדגל fuzzy–.
דוגמא לסריקה זו:
sudo nmap -O --osscan-guess 192.168.150.5
דגל נוסף שכדאי להכיר בכל הנוגע לזיהוי מערכת ההפעלה, הוא הדגל max-os-tries–. כברירת מחדל, כאשר Nmap מבצעת סריקה לאיתור מערכת הפעלה כנגד מטרה ולא מצליחה למצוא התאמה מושלמת בעזרת המזהים שהיא הצליחה להוציא ממערכת ההפעלה, היא חוזרת על הניסיון כ-5 פעמים (ובמקרים בהם nmap סקפטי לגבי היכולת להוציא מהמזהים מידע, כ-2 פעמים). אם נרצה להגדיל את כמות הניסיונות או להפחיתה, נוכל להשתמש בפרמטר max-os-tries– ולאחריו מספר הניסיונות שאנו רוצים שNmap יבצע. ככל שניתן מספר קטן יותר, נגדיל את מהירות הסריקה. ככל שניתן מספר גדול יותר, נגדיל את הסיכויים לקבלת מידע (כמובן שההמלצה היא לא לבצע יותר מ7-8 ניסיונות, שכן הסיכויים שסריקות נוספות יניבו מידע קלושים).
לדוגמא, אם ארצה לבצע כ7 ניסיונות, אשתמש בפקודה בצורה הבאה:
sudo nmap -O --max-os-tries 192.168.150.2
סריקה שימושית מאד שכדאי להכיר היא סריקה באמצעות הדגל A-. סריקה זו מאגדת בתוכה כמה מהדגלים השימושיים ביותר ונועדה ע"מ לחסוך את הצורך לכתוב בכל פעם את כל הדגלים. בעת שימוש בדגל זה מבצע Nmap כלפי היעד זיהוי מערכת ההפעלה (הדגל O-), סריקת גרסאות הפורטים (sV-) לאחר סריקת פורטים בעזרת שאילתת syn (הדגל sS-), סריקת סקריפט (נדבר על נושא הסקריפטים בחלק השני של המדריך, מדובר בדגל sC-), סקירת המסלול ליעד (הדגל traceroute– שמיד נדבר עליו) ועוד. דוגמא לסריקה זו:
sudo nmap -A 192.168.150.2
בפסקה הקודמת הזכרתי את הדגל traceroute–. דגל זה הוא דרך פנטסטית לאבחן בעיות רשת ולייעול הסריקה. בעת שימוש בדגל זה nmap יציג לפניכם את המתגים והנתבים דרכם עבר בדרכו ליעד (רלוונטי בעיקר ברשתות לא קטנות עם מספר מתגים ונתבים ובסריקת אתרי אינטרנט, מבצע פעולה מאד דומה לפעולה שמבצעת פקודת הnslookup בcmd). דגל זה עובד בכל הסריקות למעט סריקת sT- (פניית הsystem call) וסריקת sl- (עליה נדבר במדריך הבא), דוגמא לשימוש בו: sudo nmap -PS –traceroute 192.168.150.2.
דגל הסריקה | פעולה |
---|---|
sV- | דגל בעזרתו נוכל לקבל מידע רב על הפורטים הנסרקים |
version-intensity– | דגל בעזרתו ניתן להגביר או להקטין את רמת החדירה בעת חיפוש המידע על הפורטים, ניתן גם להשתמש בversion-all למקסימום ובversion-light לרמה 2 |
O- | דגל בעזרתו נוכל לקבל מידע על מערכת ההפעלה של מארח היעד |
osscan-limit– | ויתור על סריקת הO- במקרים בהם אין במערכת היעד פורט אחד פתוח ואחד סגור |
osscan-guess/–fuzzy– | הצגת הערכות של nmap לגבי זהות מערכת ההפעלה, גם ללא ביטחון בם |
max-os-tries– | הקטנת או הגדלת מספר הניסיונות של nmap להוצאת מידע על מערכת הפעלה |
A- | דגל המאגד בתוכו שורה של סריקות חשובות להוצאת מידע על היעד, שימושי מאד |
tracerout– | סקירת המסלולים שעברו החבילות בדרך למארח היעד |
תזמון וביצועים בnmap
אחד מהדברים החשובים ששם לעצמו מפתח nmap גורדון לוין בעת פיתוח הכלי הוא שימת דגש על המהירות והיעילות של הכלי, כך לפחות ע"פ הצהרותיו. בעת ביצוע בדיקת חדירה, אלמנט המהירות בסריקה הוא אלמנט שחשוב מאד עבורנו. פעמים רבות נצטרך לבצע את ניסיון החדירה לרשת בזמן קצוב והמון פעמים נצטרך לנסות כמה סוגי סריקות של nmap ע"מ להגיע לתוצאות הרצויות. אם לא נוכל לבצע את הסריקות במהירות, לא יישאר לנו זמן גם לביצוע התקיפה בפועל ועל כן נושא המהירות הוא חשוב מאד.
nmap ככלל נחשב לכלי מהיר מאד, אבל נוכל להפוך אותו לעוד יותר מהיר בעזרת הפעולות הבאות:
בעזרת הדגלים min-hostgroup– וmax-hostgroup– נוכל לבקש מnmap לסרוק מספר יציאות במספר מארחים במקביל, "בקבוצות". לnmap יכולת לסרוק פורטים או גרסאות למספר מארחים במקביל, זאת בעזרת חלוקת כתובות הip לקבוצות ושליחת החבילות לקבוצה אחת בכל פעם. החיסרון בשיטה זו הוא שנוכל לקבל מידע על תוצאות הסריקה הראשונות רק לאחר שכל הקבוצה הראשונה תסרק (לדוגמא, אם נבצע סריקה של 50 מארחים בכל קבוצה, נקבל מידע על הפורטים הזמינים באותם 50 מארחים רק לאחר סיום הסריקה של כל 50), מה-שאין-כן במקרה הסטנדרטי, בו אנו מקבלים את תוצאות הסריקה כלפי מארח זמין כלשהו, מיד לאחר הסריקה כלפיו. בשל בעיה זו, nmap לרוב יאגד את הכתובות הראשונות בטווח הרשת (ממילא – הכתובות שסביר שיהיו בשימוש) בקבוצות קטנות של 5 מארחים ורק לאחר מכן יגדיל את מספר המארחים בכל קבוצה.
הדגל min-hostgroup– מאפשר לנו לציין את מספר המארחים המינימליים שnmap יכניס לכל קבוצה (לדוגמא: sudo nmap -sS –min-hostgroup 20 192.168.150.0/24) יכניס כ20 מארחים לכל קבוצה. לעומתו, הדגל max-hostgroup– מאפשר לציין את מספר המארחים המקסימלי שnmap יכניס לכל סריקה, (לדוגמא: sudo nmap -sS –max-hostgroup 50 192.168.150.2) יכניס עד כ50 מארחים לכל קבוצה. יש לציין ש1024 זהו המספר המקסימלי של מארחים שיכולים להיות בקבוצה אחת.
חשוב להבהיר: שימוש בדגלי תזמון אלו רלוונטי בעיקר במקרה שאנו רוצים לסרוק רשת שלמה ולהציג גם את המארחים הזמינים וגם את הפורטים הפתוחים באותם מארחים. אפשרות זו לא רלוונטית ביחס לסריקת מארחים ללא סריקת פורטים (כגון סריקת sn-) שכן בסריקת מארחים בכל מקרה nmap מבצע את הסריקה כלפי מספר מארחים במקביל, ע"מ לשפר את אמינות ודיוק הסריקה.
בעוד host-group מאפשר לנו לשלוט בכמות המארחים שייכנסו לקבוצה אחת, קיים דגל נוסף שמאפשר לנו לשלוט בכמות החבילות שnmap יישלח בו זמנית למארחים ברשת (כחבילה אחת). בעזרת הדגלים min-parallelism– וmax-parallelism– נוכל לשלוט בכמות החבילות שnmap תישלח בו זמנית למארחים ביעד. לרוב כדאי שלא לגעת בערכים אלו, שכן nmap מחשבת אותו באופן דינמי בהתאם לאמינות הרשת, אך בכל זאת, במקרה שהזמן שלנו קצר או שנרצה לשפר את אמינות הסריקה, נוכל להשתמש בדגלים אלו. אם נרצה לצורך הדוגמא להגדיר סריקה מקסימלית של חבילה אחת בכל פעם (ובכך לשפר את אמינות הסריקה, אך גם לגרום לה להתארך בצורה משמעותית), נוכל להשתמש בערך הmax בצורה הבאה: max-parallelism 1–. על אותו משקל, נוכל לשפר את מהירות הסריקה (אך פעמים רבות לפגוע באמינותה) בעזרת ציון ערך מינימלי גבוה, כגון: max-parallelism 10–.
דגלים נוספים שחשוב להכיר, בעיקר במצבים בהם הזמן שלנו הוא קצר או שהרשת הנסרקת מאד לא אמינה (אחרת, ההמלצה היא להשאיר את ערכי ברירת המחדל של nmap ולא להשתמש בפרמטרים אלו, במיוחד בכל הנוגע לזמן המינימלי לסריקה) הם הדגלים min-rtt-timeout— וmax-rtt-timeout–. דגלים אלו נועדו עבור שינוי פרק הזמן שnmap ימתין לקבלת תשובה ממכשירי היעד/מהפורטים השונים במכשירי היעד. כברירת מחדל, Nmap מחשב את הזמן באופן דינמי בהתאם למהירות התגובה שהוא קיבל מהפורטים האחרים וממילא בהתאם למהירות הרשת, כפי שהוא מבין אותה.
כפי שאתם בוודאי כבר מבינים, תחת max וmin נציין את פרק הזמן המקסימלי והמינימלי להמתנה (בהתאמה). לדוגמא, אם נרצה שnmap ימתין כ1000 מאיות-השנייה לכל חבילה (לא מומלץ יותר גבוה מכך), נעשה זאת בצורה הבאה: sudo nmap -sS –max-rtt-timeout 1000ms 192.168.150.2, לחילופין, נוכל לציין זמן המתנה מינימלי של 100 מאיות-השנייה בצורה הבאה: sudo nmap -sS –min-rtt-timeout 100ms 192.168.150.2 (כאמור, הגדרת זמן מינימלי זו פעולה שבדרך כלל אין צורך לבצע, שכן nmap נותן את הזמן הנדרש בצורה דינמית כפי שהוא מתרשם מתעבורת הרשת). נוכל כמובן גם לשלב את 2 הפרמטרים ביחד ולציין גם זמן המתנה מקסימלי וגם זמן המתנה מינימלי או להשתמש בדגל initial-rtt-timeout— שמאפשר לנו לציין את הערך הראשוני שnmap ימתין (לדוגמא, אם נציין initial-rtt-timeout 400–, הסריקה תתחיל עם המתנה של 400 מאיות-שנייה ואח"כ nmap ינסה להתאים את עצמו לרשת או יפעל בהתאם לפקודת הmax והmin אם קיימים).
כברירת מחדל, כאשר nmap לא מקבל תגובה מפורט כלשהו, הוא מניח שהפורט או מסונן, פתוח (בחלק מן המקרים) או שהחבילה אבדה ברשת וע"מ לוודא זאת הוא שולח אליו שוב את חבילת המידע (עד עשרה פעמים ברשת לא אמינה, עד פעמיים ברשת אמינה). בעזרת הארגומנט max-retries– נוכל להגביל את מספר הפעמים שnmap יוכל לחזור על תהליך שליחת חבילות המידע לפורטים שאינם מגיבים ובכך לקצר את משך הסריקה (פעולה שרלוונטית כאשר אנו סורקים רשת לא אמינה וזמננו קצר). את מספר הפעמים המקסימלי שנרצה להגביל את nmap לחזור על התהליך נציין לאחר הארגומנט. לדוגמא:
sudo nmap -sS --max-retries 6 192.168.150.2
עוד דגל חשוב מאד שכדאי להכיר ורלוונטי בעיקר ברשתות עם תשתית ישנה/הגנה מאד מוקפדת של חומת האש (שמאיטה את קצב קבלת המידע מהרשת הנסרקת) מחד וזמן קצר מאד שלנו מאידך הוא הדגל host-timeout–. בעזרת דגל זה נוכל להורות לnmap לדלג על מארחים שמתעכבים בהחזרת התשובה בעת סריקת הרשת ולעבור לבנתיים למארחים אחרים. לדוגמא, כך נוכל להורות לnmap לא להתעכב על אף מארח יותר מ10 דקות: sudo nmap -sn –host-timeout 10m 192.168.150.0/24.
גם הדגל scan-delay– הוא דגל חשוב בהתמודדות שלנו עם רשתות להן חומת אש שמסננת בקפידה מענה למספר גדול של חבילות תקשורת מאותו סוג בו זמנית. בעזרת דגל זה נוכל להגדיר לnmap את הזמן אשר עליה להמתין בין חבילה לחבילה ע"מ "שלא לעורר את חומת האש". כברירת מחדל, nmap מחשב את הזמן באופן עצמאי, בהתאם למערכת הנסרקת ולניתוח התעבורה שלו מולה (זו גם הסיבה שסריקת UDP לוקחת המון זמן), אך אם יש לכם ידיעה על צורת הפעולה של המערכת הנתקפת או חומת האש שלה, לא יזיק אם תציינו ערך זה בעצמכם. שימו לב שפרמטר זה יכול להאריך את משך הסריקה בצורה משמעותית ועל כן פעלו בתבונה. כמו-כן, לnmap ערך זמן מקסימלי שהוא מאפשר להמתין בין סריקה לסריקה ונוכל להשתמש בו בעזרת הפרמטר max-scan-delay– (פרמטר שצריכה להיות לנו סיבה מאד טובה למה לציין אותו).
דוגמא לסריקה זו:
sudo nmap -sU --scan-delay 1s 192.168.150.2
אחד מהחבילות הבולטות שחומות האש מגבילות את שליחתן בו-זמנית היא שגיאת icmp (האפשרות השלישית בicmp). בשנים האחרונות, נפוץ למצוא גם הגבלה של חבילות rst, חבילות שמאד חשובות עבור הסריקה של nmap. בעקבות כך, nmap מאפשרת שימוש בדגל defeat-rst-ratelimit– שיגביל את זמן ההמתנה של nmap לתגובות rst ובכך יקצר את משך הסריקה (שעלולה להיות ארוכה מאד אם אכן יש הגבלה במכשיר היעד לשליחת תגובות rst בו זמנית). שימוש בדגל זה רלוונטי אך ורק אם אנו מחפשים יציאות פתוחות בלבד והמידע על יציאות מסוננות לא רלוונטי לנו, למה? ניקח לדוגמא את סריקות syn. כברירת מחדל, nmap ינתח את התגובות לסריקה בצורה הבאה: יציאה שמגיבה בדגל syn/ack תסומן כפתוחה, יציאה שמגיבה בדגל rst תסומן כסגורה ויציאה שלא מגיבה תסומן כמסוננת. במקרה הזה – ישנן יציאות רבות שייתכן ועם המתנה נכונה בין חבילה לחבילה היו מחזירות את הדגל rst, אך בשל המגבלה שהטלנו על nmap הן כעת יסומנו כלא מגיבות וממילא מסוננות.
עוד דגלים מצוינים לשליטה על זמן הסריקה שלנו (אולי החשובים ביותר) וגם להתמודדות מול חומת האש הם הדגלים min-rate– וmax-rate– שמאפשרים לנו לשלוט על כמות החבילות שnmap יישלח לרשת בו זמנית. כפי שכבר הזכרתי בעבר, כברירת מחדל, nmap ייקבע את מהירות העבודה מול הרשת בהתאם למהירות התעבורה שתהיה לו מול הרשת בסריקות הראשונות, אך במקרים בהן הזמן שלנו מאד קצר הדגלים הללו שימושיים מאד להאצת זמן הסריקה. אומנם, במקרה של סריקה מהירה מדיי ייתכן מאד שחבילות מידע רבות ייפלו בדרך ונקבל מידע לא נכון לגבם או אפי' נגרום לשליחתן מחדש ובכך נגרום הפוך על הפוך להגדלת זמן הסריקה, אבל שוב – לפעמים הזמן הוא מרכיב קריטי ועל כן חשוב להכיר גם את הדגלים הללו.
בעזרת הדגל min-rate– נוכל לציין קצב מינימלי לסריקה (כמובן שאם nmap יצליח לסרוק מהר יותר הוא לא יתייחס לציון הזה שנועד למנוע קצב ארוך יותר ולא נמוך יותר), לדוגמא: sudo nmap -sS –min-rate 50 192.168.150.2 יגרום לnmap לא לשלוח פחות מ50 חבילות מידע בשנייה. לעומתו, שימוש בדגל max-rate– יגביל את כמות החבילות שnmap תישלח בכל שנייה לרשת הנסרקת/מכשיר היעד הנסרק, לדוגמא: sudo nmap -sS –max-rate 100 יגביל את כמות החבילות שתישלח בכל שנייה לעד 100 (לא מומלץ ליותר מכך ובכלל לא מומלץ להשתמש בפרמטר המקסימום, למעט ברשתות מאד מהירות).
שימו לב: גם אם זה נראה מבלבל, הדגלים max/min-rate– שונים מהדגלים max/min-parallelism–. בעוד הדגלים הראשונים אחראים על מהירות הסריקה, הדגלים האחרים (parallelism) אחראים על כמות החבילות שיכולות להישלח ביחד, כקבוצה. כמובן שככל שנציין ערך parallelism קטן, גם נפחית את המהירות שכן nmap יכול לשלוח פחות חבילות בכל שליחה, אך אלו שני ערכים שונים.
הסתבכם מרוב דגלים? אני מקווה שלא, אבל גם אם כן, nmap חשבה גם עליכם: בעזרת הדגל T- נוכל להגדיר את זמני הסריקה בצורה פשוטה יותר. לדגל זה שישה פרמטרים שונים (המספרים 0-5) כשכל אחד מהם מסמל סריקה חזקה יותר, בעוצמה עולה. T 0- זו האפשרות האיטית ביותר וצריכה להיות לכם סיבה טובה מאד למה לבצע אותה שכן היא תשלח חבילת מידע אחת בכל 5 דקות. אחריה, 1 T- ששולחת חבילת מידע אחת בכל 15 שניות (זה אולי נראה קצת ביחס ל0 T-, אך המון זמן. אל תשכחו שאנו שולחים עשרות אלפי חבילות). כאמור, 2 הסריקות האחרונות שציינו כמעט ולא שימושיות בסריקות סטנדרטיות והן נועדו רק למקרים שאתם מתמודדים מול חומת אש קשיחה במיוחד ויש פורט מאד ספציפי שמעניין אתכם. סריקה קצת יותר שימושית להערמה על חומת האש, אך גם היא איטית יחסית היא T2- ששולחת חבילת מידע אחת בכל 0.4 שניות. לאחריה T3- שהיא הסריקה המומלצת ביותר וגם זו שמוגדרת כברירת מחדל. אפשרות נוספת היא גם T4- שהיא סריקה אגרסיבית יחסית וזהה לפקודה אחת של 1250 max-rtt-timeout– וinitial-rtt-timeout 500ms— וmax-retries 6— (כלומר, מהיר אך סביל). האפשרות החמישית והמהירה ביותר היא T5- שממש לא מומלץ להשתמש בה, אלא כן מישהו רודף אחריכם ונשאר לכם דקה וחצי להגיש את הOSCP. סריקה זו לא מומלצת שכן בשל המהירות הגדולה שלה (זהה לפקודה אחת של: 300 max-rtt-timeout– וmin-rtt-timeout 50ms— וinitial-rtt-timeout 250ms— וmax-retries 2— וhost-timeout 15m–) והעובדה שחומת האש תזהה אותה בקלות וחבילות מידע רבות יאבדו בדרך בגינה.
לסיכום: אם אתם ברשת מספיק אמינה וטובה בלי חומת אש בעייתית T4- יהיה מעולה עבורכם. אם הרשת שלכם קצת פחות מהירה או שאתם מעדיפים לשמור על פרופיל נמוך יותר מול חומת האש השתמשו בT3- (זהו ברירת המחדל, כך שאין צורך לציין אותו). אם מדובר בחברה מכובדת עם חומת אש ברמה ואתם חוששים מT3, אז T2 זוהי האופציה הריאלית ביותר עבורכם מבחינת זמן ואת T0- וT1- תשאירו רק למקרים בהם אתם צריכים לסרוק פורט מאד ספציפי (כאמור, אלו סריקות מאד יעילות כנגד חומות אש, אך לא ריאליות מבחינת זמן). על אותו משקל, את T5- תשאירו רק למקרים בהם אתם צריכים לסרוק המון המון סריקות, חומת האש שאתם מתמודדים מולה היא דרדלה ואין לכם בכלל זמן.
אגב, שיפור זמני העבודה שלנו עם nmap יכול להגיע לא-מעט גם בעבודה נכונה עם הכלי ולא בהכרח מהוספת דגלי תזמון: אם ביצענו סריקת פורטים וקיבלנו מספיק מידע, אין צורך שנבצע גם בסריקות האחרות שנועדו עבור קבלת מידע אחר (לדוגמא – קבלת מידע על פרוטוקולי התקשורת מעל IP או קבלת מידע על מערכת ההפעלה) סריקת פורטים. כמו-כן, חשוב מאד שנעדכן תמיד את גרסת הnmap שלנו, שכן הכלי הנפלא הזה משתפר כל העת ושם דגש על שיפור זמני הסריקה בכל עדכון ועדכון.
דגל הסריקה | פעולה |
---|---|
min/max-hostgroup– | דגל המציין סריקת פורטים במספר מארחים בו זמנית, כ"קבוצה" |
min/max-parallelism– | דגל המטפל בכמות החבילות שnmap ישלח בו זמנית למארח |
min/max/initial-rtt-timeout– | דגל המציין את הזמן בו nmap ימתין לקבלת תשובה מהפורטים השונים לפני שליחה חוזרת |
max-retries– | דגל המאפשר להגביל את מספר הפעמים שתתבצע פנייה חוזרת לפורטים |
host-timeout– | דגל המאפשר דילוג על מארחים שלא מחזירים תשובה בפרק זמן ספציפי |
scan/max-scan-delay– | דגל בעזרתו ניתן להגדיר את זמן ההמתנה בין שליחת כל חבילה וחבילה |
max/min-rate– | דגל המאפשר הגדרת קצב מינימלי ומקסימלי של מהירות הסריקה |
defeat-rst-ratelimit– | דגל המאפשר להגדיר הגבלה לזמן ההמתנה לתגובות rst |
T5- | המהירות הגבוהה ביותר, כמעט ולא יעיל |
T4- | מהירות גבוהה, יעיל ברשתות טובות ואמינות |
T3- | קצב ברירת המחדל |
T2- | שליחת חבילה בכל 0.4 שניות, עדיין סביל |
T1- | שליחת חבילה בכל 15 שניות, איטי מאד ויעיל נגד חומות אש |
T0- | שליחת חבילה בכל 5 דקות, יעיל מאד נגד חומות אש, אך לא ריאלי |
טכניקות נוספות בעבודה עם Nmap
את האפשרויות הנוספות שNmap מציע לנו ברמת הסריקה, כגון טכניקות להערמה על חומת האש, שימוש בסקריפטים של Nmap, עבודה עם nmap מול IPv6 ועוד ועוד אשאיר לחלק השני של המדריך. בסיומו של חלק א' ארצה לדבר קצת על האפשרויות השונות שיש לנו בכל הנוגע לשמירת תוצאות הסריקה, קבלת יותר מידע על תהליך הסריקה בעת שהוא מתבצע ועוד אפשרויות אחרות שבסופו של דבר יהפכו לנו את העבודה עם Nmap ליותר קלה ונוחה.
אם נרצה לשמור את תוצאות הסריקה בקובץ בפורמט רגיל, נוכל להשתמש בדגל oN-. אם נרצה לעשות זאת בפורמט XML (רלוונטי מאד אם אנו רוצים לבצע ניתוח של הפלט בשפות תכנות שונות או בכלי Ndiff עליו נדבר לקראת סיומו של המדריך), נוכל לבצע זאת בעזרת הדגל oX-.
דוגמא לשמירה בפורמט רגיל, כקובץ טקסט:
sudo nmap -sS 192.168.150.2 -oN scan-file
כברירת מחדל, לא יישמר בתוך הקובץ שנוצר עם oN- גם הפלט שעוסק בשגיאות שצצו תוך כדי ההרצה (פלט שיופיע כחלק מהפלט של סריקה שלא נשמרת בקובץ כלשהו). ע"מ להוסיף אותן נצטרך להוסיף לפקודה את הארגומנט log-errors–. לדוגמא:
sudo nmap -sS 192.168.150.2 -oN scan-file --log-errors
דוגמא לשמירה של תוצאות הסריקה בפורמט XML:
sudo nmap -sS 192.168.150.2 -oX scan-file.xml
אחד מהדגלים החשובים ביותר בכל הנוגע לעבודה נוחה עם nmap הוא הדגל v-. בעזרת ציון דגל זה נוכל לבקש מnmap להציג לנו מידע רב יותר על התהליך הסריקה עצמו תוך-כדי שהוא מתבצע ולא רק את תוצאות הסריקה. דגל זה לא תמיד שימושי, שכן במרבית המקרים מה שיעניין אותנו אלו רק תוצאות הסריקה, אך פעמים רבות גם נרצה לראות את תהליך התקדמות הסריקה ועל כן כדאי להכיר גם את דגל זה. אגב, נוכל להשתמש בvv- אם נרצה פירוט גדול עוד יותר ובv3/4/5 וכו' אם נרצה לציין ישירות את רמת הפירוט בעזרת ערך מספרי. דוגמא לאחת מסריקות הverbosity האפשריות:
sudo nmap -sS 192.168.150.2 -vv
עוד דגל חשוב מאד שכדאי להכיר הוא דגל הd-. חלק אינטגרלי מחייו של האקר הוא לסבול את כלי הסריקה והתקיפה שלפתע לא עושים את עבודתם כראוי. לא מעט פעמים יכול לקרות שסריקה עם nmap לא תניב לנו תוצאות מסיבות כאלה ואחרות, עבור מקרים כאלו הדגל (d (debugging– חשוב מאד והוא יספק לנו שגיאות והתרחשויות מוזרות שnmap חווה במהלך ביצוע הסריקה. יש לציין שפעמים רבות, בפרט אם אם אתם לא מתמצאים בפרוטוקולי תקשורת ובNmap לא ממש תבינו את השגיאות שיוצגו לכם, אך לפעמים nmap מספק הסבר ראוי לשגיאה ועל כן, כמוצא אחרון, כדאי להשתמש בדגל זה). כמו בדגל v-, גם בדגל זה נוכל להגדיל את היקף התוצאות בעזרת הדגל dd- או d7/8/9-.
פרמטר נוסף שיכול לעזור עבור ביצוע debugging הוא הפרמטר packet-trace שידפיס לאחר כל קבלה או שליחה של חבילת מידע, סיכום שלה. בעת ביצוע של סריקת ברירת המחדל בה Nmap סורקת אלפי פורטים, הפלט שיודפס לנו יוכל להגיע גם לאלפי שורות ועל כן כדאי להשתמש בפרמטר זה רק אם אנו סורקים כמות ספציפית של פורטים בעזרת הדגל p. דוגמא לסריקה זו: sudo nmap -sT -p -30 192.168.150.2 –packet-trace (כזכור, סריקה זו תסרוק 30 פורטים בלבד).
במקרה ששני הדגלים האחרונים לא עזרו לכם, מומלץ לנסות גם את הדגל iflist– שיציג לנו מידע על הממשקים והנתיבים ברשת שעברה החבילה תוך כדי הסריקה ובכך אולי נצליח להבין מדוע החבילות שלנו נופלות בין הכיסאות.
דגל נחמד נוסף הוא הדגל -T שיציג לכם את הסיבה בגינה Nmap החשיב את הפורט לפתוח או סגור. כפי שכבר הספקתם להבין, Nmap מסיק מה מצב הפורט (פתוח, סגור או מסונן) בעזרת ניתוח התגובה שמגיעה ממכשיר היעד, אך לצורך הדוגמא, לפעמים פורט יכול להיות מוצג כמסונן בגלל שלא התקבלה תגובה ממכשיר היעד, לפעמים בגלל שהתקבלה תגובה מסוג מסוים (כגון שגיאת icmp מהסוגים הספציפיים) ולפעמים מסיבות אחרות. הדגל T- יוכל לסייע לנו להבין בדיוק מהי הסיבה בגינה הסיק Nmap לגבי הפורט הספציפי את מה שהסיק.
אם נרצה לקבל קצת מידע על זמני הריצה של nmap תוך כדי הסריקה, נוכל להשתמש בפרמטר stats-every– בעת ציון פרמטר זה Nmap ידפיס בכל זמן נתון (אותו נציין לאחר הפרמטר) מעט מידע סטטיסטי בנוגע למהירות הסריקה באותו שלב. לדוגמא, כך נדפיס את המידע בכל כ15 שניות: sudo nmap -sS 192.168.150.2 –stats-every 15.
כברירת מחדל, אם נורה לnmap לשלוח את פלט הסריקה לתוך קובץ (או בעזרת oN- או בעזרת oX-), הכלי ישתמש בפקודה שמוחקת את התוכן הנוכחי של הקובץ ומחליפה אותו בפלט החדש (< ולא <<). אם נרצה שלא למחוק את התוכן הקיים בקובץ אלא להוסיף עליו נצטרך להוסיף לפקודת הoN- או הoX- את הפרמטר append-output–.
אגב, שמירת תוכן הסריקה עם oN- או oX- יכולה להיות מאד יעילה וחשובה עבורנו, בפרט בסריקות ארוכות, שכן Nmap מאפשר לנו להמשיך סריקה ששמרנו מהמקום בו היא נעצרה (סריקה יכולה להיעצר ממגוון סיבות. החל מעצירה שלנו בעזרת ctrl + c ועד להתרופפות קליטת האינטרנט). ע"מ להמשיך את הסריקה מהמקום בו היא נעצרה אנו צריכים סה"כ להשתמש בפרמטר resume– עם שם הקובץ, לדוגמא:
sudo nmap --resume file 192.168.150.2
דגל הסריקה | פעולה |
---|---|
oN- | קבלת תוצאות הסריקה כפלט טקסט פשוט לקובץ טקסט |
oX- | קבלת תוצאות הסריקה כפלט אינטראקטיבי לקובץ xml |
v / -vv- | הצגת תהליך הסריקה תוך כדי ביצועה |
d / -dd- | הצגת שגיאות ובאגים שהפריעו לnmap במהלך הסריקה |
packet-trace– | הצגת סיכום של כל חבילה שנשלחה או התקבלה |
iflist– | הצגת מידע על הממשקים והנתיבים ברשת שעוברות החבילות |
stats-every– | קבלת מידע סטטיסטי על זמני הריצה של nmap תוך כדי הסריקה |
T- | הצגת התגובות שהתקבלו ממכשיר היעד בגינן הוחלט על סטטוס הפורטים |
resume– | המשך סריקתה של סריקה שנעצרה והפלט שלה נשמר בקובץ |
הכלי ndiff
Ndiff (ר"ת של Nmap difference) הוא כלי המסייע בהשוואה של סריקות Nmap. ע"מ להשתמש בו, נדרשים שני קבצי פלט XML של Nmap (שכזכור ניתן להוציא בעזרת הדל oX-) וNdiff ידפיס את ההבדלים ביניהם: מארחים שעולים ויורדים, יציאות פתוחות וסגורות, גרסאות פורטים שהשתנו, מערכות הפעלה שהשתנו וכו'. Ndiff יכולה לייצר פלט בפורמט טקסט קריא (בעזרת הפרמטר text–) או בפורמט XML (בעזרת הפרמטר xml–). אנשים רבים אוהבים לסרוק את הרשתות שלהם באופן קבוע וזו יכולה להיות דרך מעולה עבורם (וגם עבור מנהלי אבטחה בארגונים או בודקי חדירה שרוצים להשוות בין שני פלטים) לזהות שינויים ברשת.
ראשית, נתקין את הכלי בעזרת apt-get:
sudo apt-get install ndiff
כעת נשתמש בכלי בצורה הבאה (שם הכלי ולאחריו את שמם של 2 קבצי הxml שיושוו), לדוגמא:
ndiff file1 file2
ובפלט שנקבל, nmap יציג לנו מה השתנה בין הסריקה הראשונה לשנייה:
כפי ששמתם לב, nmap מציג לנו רק את המארחים/פורטים שהשתנו בין שני הסריקות. אם נרצה לקבל את שיופיע לנו גם כל הפלט של שאר תוצאות הסריקה, שלא השתנו, נוכל להשתמש בדגל v-. לדוגמא:
ndiff -v file1 file2
המדריך הכי מפורט שראיתי על nmap. חייב לומר שאני עובד הרבה עם הכלי הזה, ויש הרבה דברים שלא הכרתי. תודה רבה