
הטקסט המלא של הדקות הראשונות בהרצאה «התקפת Buffer Overflow - סיכום כל הפקודות» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בהרצאה הזו אני רוצה לסכם את כל ההתקפה באפר אוברפלואו ולעשות פתרון מהיר של האתגר השני. ממה אנחנו מתחילים? קודם כל אנחנו נכנסים לאתר www.tryhackme.com ומפעילים את הקורבן שלנו, deploy.vm שהקורבן שלנו יופעל עד שהוא פועל.
אנחנו מתחברים ב-VPN לתוך האתר, לא דרך ווב. אנחנו לא צריכים קאלי בענן, אנחנו מתחברים דרך VPN. יש פה הוראות כבר דיברנו על זה ועוד 47 שניות הקורבן יהיה מוכן בינתיים נחבר את הקאלי המקומי שלי תוך הרשת הפנימית שלהם כאשר יש פה קובץ הגדרות מוכן שהורדנו מאתר שלהם התחברנו ל-VPN שלהם ויש לנו עוד שתי שניות ואנחנו
מקבלים כתובת IP הנה זה הקורבן החדש בוא נתחבר אליו ובטאב השני שלי אני מתחבר לקורבן 10.10.65.1 עם סודו, פעם ראשונה זה לא מצליח, גם פעם שנייה זה לא מצליח, בוא נוסיף עוד שעה שתהיה לנו שעה ספייר, 10.10.65.1, כנראה שהקורבן לא באמת היה מוכן כשהם כתבו שהוא מוכן,
לא חשוב, יש לנו פה ליסנר שיחכה לחיבור אחרי שנסיים את התקיפה, ו-CMD רגיל שכותבים בו את הפקודות שלנו. טוב, אנחנו רצינו לעשות את זה זריז, אז איך אנחנו עושים את הכל זריז?
כסיכום, דבר ראשון מפעילים את הדבאגר שלנו, ראה אני איזה אדמיניסטרטור, בתוך הדבאגר מגדירים את הסקריפט של מונה לעבוד בתיקייה cmona, שזה כאן למטה, הנה הוא נותן לי פה לוג שהוא הצליח, אני חוזר מחלון של לוג דאטה, אתם רואים למה לוג דאטה איזה חלון?
לחלון של CPU, מפעיל את הקורבן שלנו בתוך דבאגר, הוא נמצא אקזה של הקורבן שלי, נמצא בשולחן עבודה, וורנבל אפס, oacp, oacp.exe, אני פותח אותו ועושה לו פליי.
בואו נבדוק שהוא באמת עובד, נתחבר ל-IP שלו, הפעם זה 65.1, בפורט 1337, ככה אני מדבר עם השרת. הנה, הוא אומר לי Hello, אני כותב לו Help, הוא אומר לי Help, אני יכול לכתוב לו Overflow 2 Test.
ככה אני מדבר עם השרת, שזה נהדר. יופי, מה אנחנו מתחילים? איך מתחילים את כל התקיפה הזאת? אנחנו מתחילים מזה שאנחנו צריכים לגלות באופן כללי האם יש חולשה.
זה נקרא פאזינג, ויש לנו סקריפט מוכן לפאזינג. פה בשולחן העבודה יש לנו פה פאזר py שזה הסקריפט המוכן, בואו נראה.
קודם כל צריך להגיד לו מה הIP לתקיפה, היום זה 65.1, פורט 1337, פה אני שם prefix overflow 2, אני מתחיל לתקוף אותו A כפול 100, וכך הרבה פעמים אני שולח לראות אם יש קריסה ואם ה-A נכנס ל-EIP.
זה שלב של פאזינג לגלות האם יש בכלל חולשה כלשהי. פותח פה טרמינל בשולחן העבודה, אני בדסקטופ, וכותב פייתון 3, רק לא אקספלויט, אנחנו צריכים פאזינג.
פאזר py, הנה הוא מתחיל לרוץ, ופה אני מחכה לקריסה פה בראנינג. רגע, יותר מדי זמן אין לי קריסה, בואו נעצור את זה.
נחזור חזרה לסקריפט, כנראה שהיה צריך פה לא למחוק את הרווח שמחקתי. בואו ננסה עוד פעם. הנה, עכשיו יש קריסה.
אתם רואים, צריך לשלוח בדיוק את המידע כמו שצריך לשרת. אנחנו רואים קריסה סביב 700 בתים. אנחנו יודעים איפשהו שם יש קריסה. השאלה היא אם אני יכול להשתלט או לא, ואני רואה שבתוך EAP נכנס 41, שזה באסקי אות A, שזה אומר שיש לנו פה אפשרות להשתלטות.
אתם רואים באסקי כתוב 41, זאת אות A. שלב ראשון עברנו, גילינו שיש גם קריסה וגם השתלטות על EIP. איך מגלים את ה-EIP עצמו? אנחנו הולכים לייצר קובץ עם סדרה ייחודית של תווים.
כמה אנחנו צריכים? 700 ועוד נוסיף איזה 400, 1100, נכון? הפעם אנחנו צריכים 1100, 700 ועוד 400. אנחנו מייצרים פאטרן, העיקר לקבל את הדבר הייחודי הזה, את כל ה-a, a גדול, a קטן 0, a גדול, a קטן 1, אני רוצה כאלו, ואני מכניס אותם לתוך הסקריפט השני שלי,
שזה exploit py. מה אני עושה ב-exploit py? פה ב-payload אני מכניס את הרצף הייחודי שלי, ואני רוצה לראות מה ייכנס לנו לתוך ה-eip, לתוך האוגר eip, שזה אמור להיות פה.
כרגע אני לא יודע מה הולך להיות eip, זה ה-eip שלי, זה פדינג, כרגע נשאיר את הפדינג הזה ריק. יש לי הכל ריק, אופסט ריק, כתובת חזרה ריקה, פדינג ריק, הכל נכנס לתוך הפיילואוד.
למעשה הפיילואוד הזה הולך להיות הבאפר שיישלח, כי כל השאר ריק לחלוטין. אז בגלל שכל המשתנים ריקים ובאפר שווה לכל המשתנים האלו, ובסוף הבאפר הוא זה שנשלח, למעשה אני שולח על הכבל רק את זה, עם פרפיקס overflow 2. אוקיי, יש פה פרפקס שאני חייב לשלוח ואחריו את כל הפעילות.
המטרה שלי לגלות באיזה תו בדיוק ייכנס לתוך EIP ואז אני אדע כמה אופסט צריך לזוז בשביל להגיע ל-Return.
זאת אומרת, כמה סימנים מההתחלה עד לאיזה סימן כאן, זה הכל נכנס לאופסט של אוברפלואו, סתם דריסה מפגרת ואחריה יש ארבע תווים שהם בדיוק נכנסים לכתובת חזרה שזה EIP.
אני צריך לגלות מהם ארבעת התווים שנכנסו לכאן לכתובת לחזרה וככה אני משתלט על EIP שאני אדע בדיוק איפה מתחיל ה-EIP שלי בוא נריץ עכשיו את הסקריפט הזה זריז רק לפני כן בגלל שהייתה קריסה אני עושה חזרה ופליי והפעם אני מריץ פייתון 3
אקספלויט py אין לי פה שום קריסה כי בטח שכחתי להחליף כתובת IP הכתובת IP שלנו זה 65.1 זה הסקריפט החדש 65.1 פורט הזה כל המשתנים האלו נאספים לתוך משתנה אחד באפר לתוך סטרינג אחד והסטרינג הזה הטקסט הזה נשלח לנו על הכבל בוא נריץ את זה שוב ונראה
האם תהיה לנו הפעם קריסה הופה יש קריסה וזה מה שנכנס פנימה ל-eip עכשיו צריך לדעת בדיוק איפה זה נמצא במקום לעשות את זה ידנית נגיד למונה לחפש איזה תו נמצא ב-eip אנחנו רואים כאן ש-EIP נמצא במרחק 634 תווים.
זה אומר שאנחנו צריכים להכניס 634 פעם אות A לכאן בשביל שאחרי זה נגיע ל-BBB. וה-payload הזה כבר לא מעניין אותי. בואו נבדוק שזה אכן ככה. ה-payload שלי הולך להיות CCC.
אני רוצה לראות שנכנס לי BBB לתוך EIP, שקודם כל דורסים עם 634 פעם אות A, אחרי זה מגיע BBB שנכנס לאוגר EIP, פקודה הבאה לביצוע ואחרי זה הולך להיות ה-payload שלי C. זה מה שאני שולח, את הרצף הזה.
בואו נראה שזה אכן יעבוד לנו. באים, מתחילים את הכל, עושים ריסטארט, רפרש, שולחים עוד פעם ורואים שבאמת BBB נכנס לכאן, 42, ושימו לב פה היה AA, אחרי זה בי בי בי ואחרי זה סי סי סי והבי בי בי בדיוק נפל על כתובת של פקודה בעלי ביצוע או גר EIP. נהדר אנחנו יודעים כמה אוברפלואו
הוא צריך וזו דרך אגב התשובה לדבר הראשון שהם שואלים פה הם בתוך האתגר בודקים אותנו הם שואלים אותנו כמה אופסט והאופסט כרגע גילינו שהוא 634 פעם בואו נבדוק את זה יש your answer is correct התשובה נכונה, עכשיו אנחנו בלגלות מהם התווים האסורים.
איך נגלה מהם התווים האסורים? אני מזכיר לכם, תווים אסורים זה מה שאסור לשלוח פה בתוך ה-payload, בתוך הפצצה שלנו. אז אנחנו נייצר byte array, זה אומר כל האפשרויות ללא 0,0.
נעשה את זה במונה, מייצר לי בארדיסק את כל האפשרויות. בואו נראה אם הוא עשה, הנה מונה, OCP, לא עשה. יש פה רווח מיותר כנראה, כן.
הנה הוא מייצר לי את כל התווים, במקום להעתיק אותם מהמסך אני מעתיק אותם מקובץ טקסט שהוא עשה לנו, הוא עשה לנו גם קובץ בינארי וגם קובץ טקסט.
אוקיי, לוקחים את כל הדבר הזה, שזה סתם כל הקומבינציות האפשרויות, 0, 1, 0, 2, ככה, ואני עושה פה payload+ =, אוקיי, זהו, זה payload+ =, ואני מכניס לכאן,
לכאן, לכאן ולכאן payload+ =, ואני שולח את זה לראות האם יש איזשהו תו שלא ייכנס לתוך הראם, לתוך הזיכרון. איזה תווים אסור לי לשלוח.
מה אנחנו עושים? עוד פעם, מתחילים את הכל, עושים ריסטארט פה, זה כמו לעשות דיבאג, ריסטארט, ואז דיבאג ראן. הנה הוא רץ, מפעילים שוב את הסקריפט, והסקריפט שלנו עובד לנו.
נהדר. אנחנו רואים פה קריסה, אנחנו רואים bbb נכנס, אבל מה שמעניין אותי זה מה הם התווים שלא נכנסו.
אתם רואים 010234567 כבר נכנס 8 נכנס אני יכול ללחוץ על ESP הוא זה שמצביע על כתובת של סטאק בזיכרון ולהגיד לו להציג את זה בצורה יותר יפה Follow in Dump ואז הוא פה מציג את אותה הכתובת תסתכלו רק בצורה יותר נוחה אבל במקום לחפש ידנית מה חסר איזה מספר חסר אני יכול לנצל את המונה שיעשה את זה במקומי
אז אני עושה פה מונה קמפר כל הפקודות האלו יהיו לכם בשרת הקבצים הנה הוא עשה לי מונה קמפר ואני מעתיק את הכתובת של ESP copy selection to clipboard נהדר מריץ את זה ומגלה פה את התווים שפסולים bad characters 23 24 אז אנחנו יודעים שאם זה 23 24 לוקחים רק את הראשון אוקיי, 23, 24, אחרי זה 3C, אחרי זה 3D, לא מעניין כי הם צמודים, ואחרי
זה 83, 84, ואחרי זה BA. זה כל התווים האסורים. מה אנחנו עושים? אנחנו רוצים לבדוק שגילינו נכון. אז אנחנו מייצרים עוד פעם מונו בייטר A, רק הפעם בלי כל התווים האלו.
עושים עוד פעם אותה בדיקה בדיוק. אני סוגר את החלון הזה, חוזר ל-CPU, מכניס מונו קריאייט בייטר A, בלי רווח בהתחלה הנה הוא מייצר לי בית הרי חדש הנה זה hold וזה החדש פותח את החדש ואת החדש הזה אני מכניס לסקריפט שלי עוד פעם לכאן אני מכניס אותו עוד פעם עושה את כל הסיפור הזה עם פלוס שווה אני עושה פלוס שווה ורווח בוא נבדוק לדוגמה ש-N23
איפה 23 הנה אתם רואים 22-24 נכון N23 מריצים עוד פעם את השרת מריצים עוד פעם את הסקריפט שלנו, רואים נפילה, רואים ש-BBB נכנס למקום הנכון, רואים פה שזה 01020304, ואני אלך ישר להגיד מונה קומפר, עוד פעם אני עושה מונה קומפר, אני כותב לכם פה את כל האגודות, מונה קומפר, וכתובת של ESP,
זה שמצביע על סטאק, סטאק קופי סלקשן טו קליפ בורד ואן מודיפייד. זה אומר שגילינו נכון את התווים האסורים. בואו נעשה ככה, ניקח את התווים האסורים האלו ונעשה להם סבמיט כתשובה.
הרי זה מה ששאלו אותנו, נכון? פה, באתגר. פה שאלו אותנו מהם התווים האסורים. ו-your answer is correct.