PracticU

התקפת Buffer Overflow
שלב 4 - כתובת קפיצה + יצירת Payload

בלי כתוביותעם כתוביות
PracticU › קורס סייבר למתחילים - Hacking - בדיקות חוסן תשתיתי ופריצה ל-Windows 10/11 - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP › התקפת Buffer Overflow שלב 4 - כתובת קפיצה + יצירת Payload
מילון מושגים:
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
סקריפט - קובץ המכיל רצף פקודות שמבוצעות על ידי מפרש, לרוב כדי להפוך משימות לאוטומטיות.
מעבד - יחידת העיבוד המרכזית של המחשב, שמבצעת את הפקודות של התוכניות ומנהלת את החישובים.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.
לוג - רישום מתועד של אירועים ופעולות שמתרחשים במערכת או בתוכנה, המשמש למעקב ולאיתור תקלות.
VPN - רשת פרטית וירטואלית שיוצרת חיבור מוצפן דרך האינטרנט, כאילו המכשיר מחובר ישירות לרשת מרוחקת.
אופרטור - סימן בקוד שמבצע פעולה על ערכים, כמו חיבור, השוואה או פעולה לוגית.
שורת פקודה - ממשק טקסטואלי שבו מקלידים פקודות למערכת ההפעלה ומקבלים תגובה בטקסט, במקום להשתמש בעכבר.

התקפת Buffer Overflow שלב 4 - כתובת קפיצה + יצירת Payload
בשיעור זה אנו משלימים את מתקפת גלישת החוצץ: מאתרים בזיכרון כתובת קבועה שמכילה פקודת קפיצה אל מצביע המחסנית, מכניסים אותה אל האוגר המבוקש בסדר הנדרש, ומייצרים פיילואד זדוני שמתעלם מהתווים האסורים. אנו מוסיפים ריפוד של פקודות סרק שמגן על הקוד מפני דריסה ביציאה מהפונקציה, ולבסוף מקבלים שליטה מלאה בשרת הקורבן.
נושאי הסיכום המוצגים בשיעור:
1. המטרה של השלב: לייצר את הפיילואד, את הפצצה שלנו, את הקוד הזדוני והסוס הטרויאני שלנו, בעזרת הכלי המוכר. אבל לפני זה צריך למצוא מה להכניס בתוך האוגר של מצביע הפקודה הבאה לביצוע.
2. מה ייכנס לאוגר: האוגר מחזיק כרגע את הכתובת של האותיות B, שהן הפקודה הבאה לביצוע. מה שנשים שם הוא בעצם הכתובת של האותיות C, שהן הפיילואד שלנו, והפיילואד נמצא במקום שאליו מצביע אוגר מצביע המחסנית, כי רק לשם אנחנו מכניסים נתונים.
3. הבעיה עם אוגר המחסנית: איננו יכולים לדעת מה יהיה ערך אוגר המחסנית בהפעלה הבאה, ולכן צריך למצוא משהו שכבר קיים בזיכרון ושאומר קפוץ אל אוגר המחסנית. לוקחים את הסקריפט שלנו ואומרים לו לקפוץ אל מקום קבוע בזיכרון: במקום האותיות B נרשום כתובת קבועה שאינה משתנה, הוא יקפוץ לשם לבצע את הפקודה הבאה לביצוע, ושם יהיה כתוב לקפוץ חזרה אל אוגר המחסנית.
4. למה כתובת ולא פקודה: אפשר להכניס לאוגר רק כתובות בזיכרון שבהן נמצאות פקודות, ולא פקודות עצמן. אם היינו יכולים להכניס פקודה היינו כותבים בו ישירות קפיצה אל אוגר המחסנית, אבל זה אינו אפשרי.
5. חיפוש פקודת הקפיצה בעזרת המונה: צריך למצוא כתובת בזיכרון שבה כתובה פקודת קפיצה אל אוגר המחסנית, כתובת של משהו קבוע בזיכרון. המונה יודע לחפש אותה, וצריך גם לציין לו מה אסור להעביר על הקו: לא נמצא כתובת שיש בה אפס אפס, כי אז לא נוכל לשלוח אותה, ובכלל אסור שבכתובת יהיו תווים אסורים. מחפשים כתובת שהמעבד יבצע, שבתוכה כתובה פקודת קפיצה אל אוגר המחסנית, וכשהוא יקפוץ אליו תמתין לו הפיילואד הזדוני שלנו.
6. הרצת החיפוש: בשולחן העבודה המרוחק יש לנו רשימה של כל התווים האסורים שגילינו, משאירים אותה ומדביקים אותה לפקודה. אחרי תיקון קטן של תקלה בהזנת הפרמטרים מריצים, והפלט מופיע בחלון היומן של הדיבאגר: התוצאות מראות כמה מקומות בזיכרון יש בהם פקודת קפיצה אל אוגר המחסנית, וכל אחת מהכתובות שנמצאו מתאימה לנו, כי כולן מכילות את אותה פקודה.
7. ASLR: שימו לב שאצל כולן אין ASLR. משמעות הדבר שהן תמיד נטענות לאותו מקום בזיכרון. אם היה ASLR, כל הפעלה הייתה נטענת למקום אחר בזיכרון והכתובת הקבועה הייתה מאבדת תוקף.
8. הכנסת הכתובת בסדר הפוך: מעתיקים את הכתובת שנבחרה בעזרת פקודת ההעתקה של הדיבאגר ומכניסים אותה במקום האותיות B. אבל זה לא כל כך פשוט, כי הכתובת צריכה להיכנס בסדר הפוך: קודם כל האחרון. אם היא מופיעה בדיבאגר כשלושה חלקים, צריך לכתוב אותה מאחרון לראשון. למה, כי כך בנוי הזיכרון, וזה נקרא סדר הסוף הקטן, וזה עניין של ארכיטקטורה. לוקחים את האחרון ושמים אותו ראשון, לוקחים את שלפניו והוא שני, ואז את שלפניו והוא שלישי, והראשון הולך להיות אחרון. כך נוצרת הכתובת של הפקודה הבאה לביצוע, שהפקודה שבה היא קפיצה אל אוגר המחסנית, ואז הוא יקפוץ אל המחסנית ושם ימתין לו הפיילואד שלנו.
9. ייצור הפיילואד: עכשיו מארגנים את הפיילואד ובודקים שהכל עובד. הכלי לייצור פיילואדים מייצר לנו קוד זדוני, ואנו אומרים לו שאנחנו רוצים חיבור הפוך, שהקורבן יתחבר חזרה אלינו, ומציינים לו את ה-IP שלנו, את הפורט ואת התווים האסורים שגילינו.
10. הכתובת הנכונה לחיבור: צריך להכניס את הכתובת של ה-VPN שלנו, ולא את כתובת המחזור המקומי ולא את כתובת הרשת הרגילה, אלא רק את הכתובת של ממשק המנהרה. למה, כי אנחנו רוצים את הרגל שנמצאת ברשת שלהם, שממנה הוא יתחבר חזרה אלינו. מזינים את הפורט ואת רשימת התווים האסורים שלנו.
11. המאזין בצד התוקף: חייבים מאזין, שמישהו יאזין לנו. פותחים טאב חדש, עוברים להרשאות מוגברות, מכניסים מאזין בפורט המבוקש וקוראים לו מאזין. זה המאזין שלנו, שמוכן לקבל תקשורת, וקוראים לו גם הנדלר. ואז מייצרים את הקוד הזדוני, לוקחים קצת זמן, מסמנים את כולו, מעתיקים ומכניסים אותו בתוך משתנה הפיילואד. שוב לא בטוחים אם זה בסדר, אז עושים אופרטור הוספה, כי אופרטור הוספה בטוח, הוא כאילו פקודות נפרדות.
12. הרכבת החוצץ המלא: אומרים לסקריפט שיגרוס את הכל באותיות A עד שיגיע למקום המדויק, ושם יכניס את המספרים האלה. המספרים האלה ייכנסו אל האוגר כפקודה הבאה לביצוע, הוא יקפוץ אל התא הזה בזיכרון, כי זו הכתובת של הפקודה הבאה לביצוע, ושם יהיה כתוב קפיצה אל אוגר המחסנית, שדאגנו שבכתובת הזאת קיימת. הוא יקפוץ חזרה אל המחסנית ושם יקבל את הפיילואד שלנו.
13. ריפוד NOP: יש דבר אחד שנקרא ריפוד. לפעמים יש תווים שנדרסים. מדוע הם נדרסים, כי בזמן החזרה מפונקציה, כשהאוגר שולף את הכתובת הבאה לביצוע מתוך הזיכרון, הוא עושה זאת רק ביציאה מהפונקציה. כשפונקציה מסתיימת היא צריכה לחזור לתוכנה הראשית, ואיך היא יודעת איפה היא נמצאת, לוקחת את זה מהזיכרון, ואנחנו שם החלפנו את הכתובת. כך בסוף הפונקציה, כשנשלפת הכתובת של התוכנה הראשית, במקום לחזור אליה הוא הולך לבצע את הקוד שלנו. אבל כשהוא חוזר לתוכנה הראשית הוא גם מפנה מהזיכרון, מהמחסנית, את הארגומנטים והפרמטרים שאיתם הפעילו את הפונקציה, כי זה סוף הפונקציה. אנחנו לא יודעים כמה פרמטרים יש, לפעמים אין ולפעמים יש, ולכן מכניסים לפני הפיילואד פקודות סרק, שפירושן אל תעשה כלום, שלא יכולות לגרום נזק. מכניסים שש עשרה פקודות סרק לפני הקוד הזדוני, במקרה שמישהו קרא לפונקציה עם ארגומנט, וכשהיא יוצאת היא תמחק את הארבעה, שמונה או שישה עשר הבתים הראשונים. זה מעניק ודאות שהקוד של הפיילואד לא יינזק: עושים קצת גלישה ומזיזים את הקוד הזדוני שישה עשר בתים למטה, למקרה שיש דריסה קטנה. ההוראות קוראות לזה ריפוד של שש עשרה פקודות סרק.
14. חידוש המכונה: כשנגמר לנו הזמן באתר מגיעים אליו, עושים רענון, וחשוב מאוד לרענן את כל הדף בצירוף המקשים המתאים כשהאתר לא מגיב. המכונה מופעלת מחדש, התוקף עדיין בתוקף והכתובת שלה זהה.
15. ההרצה המלאה: הולכים לקורבן, מפעילים הכל מההתחלה: סוגרים את הדיבאגר, עוברים לחלון המעבד הראשי, מגדילים אותו על כל המסך, פותחים את קובץ ההפעלה של השירות ומפעילים אותו. חוזרים לשורת הפקודה שלנו ומריצים שם את הניצול. ואחרי ההפעלה מצפים לקבל שורת פקודה. ורואים: קודם כל אין קריסה, התוכנה המשיכה לעבוד ורק ביצעה את הקוד שלנו, ואנחנו פה בפנים: אנחנו על השרת, מתוך קאלי. אפשר להריץ שם פקודת תיקייה, לראות את הקבצים שלו ולעשות מה שרוצים. הצלחנו להשתלט על השרת, וזו הייתה המטרה.
16. השלמת המשימה באתר: אפשר לתרגל, ובהמשך יש תשובות נכונות. השאלה הראשונה היא מהו ההיסט של האוגר, כמה הזזות עשינו, והתשובה שלנו מתקבלת כנכונה. השאלה השנייה היא מהם התווים האסורים, וגם אותה שולחים וכל התשובות שלנו נכונות והצלחנו לסיים את התרגיל הראשון. עכשיו יש לכם את השני, כל אותו דבר רק עם הגלישה השנייה ולא עם הראשונה.
בשיעור הבא נעסוק בנושא התקפת Buffer Overflow - סיכום כל הפקודות.
בסוף השיעור מצאנו כתובת קבועה בזיכרון שמכילה פקודת קפיצה אל אוגר המחסנית, הכנסנו אותה בסדר הפוך אל האוגר המבוקש, ייצרנו פיילואד מוגן מהתווים האסורים עם ריפוד של פקודות סרק, וקיבלנו שליטה מלאה בשרת הקורבן.
SR12615HE

פרקי ההרצאה: התקפת Buffer Overflow שלב 4 - כתובת קפיצה + יצירת Payload

  1. 00:00

    הצורך בכתובת קפיצה

  2. 00:44

    הרעיון של קפיצה ל-ESP

  3. 02:04

    חיפוש JMP ESP עם Mona

  4. 03:16

    בדיקת תווים אסורים בכתובת

  5. 04:48

    סידור הכתובת בסדר הפוך

  6. 05:44

    יצירת ה-Payload עם Msfvenom

  7. 06:21

    בחירת כתובת ה-VPN הנכונה

תמלול ההרצאה: התקפת Buffer Overflow שלב 4 - כתובת קפיצה + יצירת Payload

הטקסט המלא של הדקות הראשונות בהרצאה «התקפת Buffer Overflow שלב 4 - כתובת קפיצה + יצירת Payload» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום לכולם בהרצאה הזו אנחנו רוצים לייצר את הפיילוד, את הפצצה שלנו, את הקוד הזדוני שלנו, את הסוס הטרויאני שלנו על ידי msfvenom אבל לפני שאנחנו נעשה את זה אנחנו צריכים למצוא מה להכניס בתוך eip eip אני מזכיר לכם זאת הכתובת של bbb הפקודה הבאה לביצוע מה אנחנו בדיוק נשים פה אנחנו צריכים לשים את הכתובת של ccc שזה יהיה הפיילוד שזה יהיה

  2. 00:30

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

  3. 01:01

    אנחנו צריכים למצוא משהו שכבר קיים בזיכרון ואומר תקפוץ ל-ESP. זאת אומרת אנחנו לוקחים את הסקריפט שלנו ואומרים לו תקפוץ למקום אחר קבוע בזיכרון. שימו לב אנחנו נגיד לסקריפט שלנו לקפוץ כאן במקום ביביבין ירשום לו איזושהי כתובת שהיא קבועה בזיכרון היא אף פעם לא משתנה הוא יקפוץ לשם לבצע את הפקודה הבאה לביצוע איפה שנרשום לו

  4. 01:28

    ושם יהיה כתוב לקפוץ חזרה ל-ESP. היתרון של הסיפור הזה שלקפוץ ל-ESP זאת פקודה, אבל אנחנו לא יכולים להכניס פקודה, אנחנו יכולים להכניס רק כתובת לפקודה.

  5. 01:43

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

  6. 01:57

    אז אני צריך לחפש כתובת בזיכרון ששם נמצאת פקודת JMP SP. אני צריך את האדרס של משהו בזיכרון שיהיה קבוע ושם יהיה כתוב JMP SP. איך אני אמצא את הכתובת ששם כתובה פקודת JMP SP?

  7. 02:13

    או יש לנו פה מונה שהודעת לחפש פקודת JMP ל-ESP בתוך זיכרון. פשוט למצוא כתובת בזיכרון ששם יש פקודת JMP SP. עכשיו שימו לב אנחנו צריכים גם לציין לו מה אסור לנו להעביר על הקו.

  8. 02:28

    אני לא אמצא לי כתובת שיש בה 0 0 כי אז אני לא אוכל לשלוח את ה-0 0 הזה פה בתוך הכתובת הזאת אסור שבכתובת יהיה תווים אסורים אז אני מחפש כתובת בזיכרון שהמעבד יבצע אותה ובתוך הכתובת יהיה כתוב פקודת ג'אמפ ESP וכשהוא יפוץ ל-ESP יחכה לו הפיילורד הזדוני שלי זה הרעיון אז אנחנו עושים דבר כזה

  9. 02:52

    מונה ג'אמפ מונה תחפשי לי פקודת ג'אמפ ESP בלילות תווים אסורים בואו נחפש את זה אנחנו באים לרימור דסקטופ, איפה התווים האסורים שלנו?

  10. 03:04

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

  11. 03:31

    לי איפה החלון של הפלט? ווינדו לוג. או, הנה התוצאות של Jump ESP, תראו כמה זה מצא.

  12. 03:40

    כמה מקומות יש בהם פקודת Jump ESP, והנה אחת הכתובות. זאת לדוגמה כתובת שמתאימה לי. זה לא משנה איזה כתובת אני אקח, כי כולם הם Jump ESP. שימו לב, אצל כולם אין ASLR. מה זה אומר ASLR?

  13. 03:55

    הן תמיד נטענות לאותו מקום בזיכרון. אם היה פה ASLR זה היה אומר שכל הפעלה זה היה נטען למקום אחר בזיכרון. אז בסדר, אז הנה יש פה Jump ASP בכתובת כזאת וכזאת.

  14. 04:08

    אז מה אנחנו עושים? מכניסים את הכתובת הזאת לתוך BBB, זה ה-BBB שלנו, זה הפקודה הבאה לביצוע. הוא יקפוץ לכתובת הזאת, יראה שם Jump ASP ויקפוץ לעשות את הקוד הזדוני שלי.

  15. 04:21

    אוקיי, אני יכול להעתיק את זה איכשהו? copy to clipboard address, בוא נראה שהוא באמת העתיק לי את האדרס, סתם מעניין אותי. 62511af, יופי, זאת הכתובת שאני צריך.

  16. 04:36

    עוד פעם right click copy to clipboard address זאת הכתובת יפה ואני מכניס את הכתובת הזאת פה בתוך ה-BBB הזה אוקיי רק שזה לא כזה פשוט למה זה לא כזה פשוט כי הכתובת צריכה להיכנס בסדר הפוך קודם כל האחרון הנה יש לנו את זה כתוב פה אתם רואים אנחנו צריכים לכתוב את זה בצורה כזאת כאשר אם היא מופיעה 1,2,3 ב-immunity אנחנו צריכים לכתוב אותה בסדר הפוך

  17. 05:06

    מאחרון לראשון. למה? כי ככה בנוי הזיכרון, זה נקרא Little Indian, האינדיאני הקטן. זה מבחינת הארכיטקטורה, ככה זה עובד.

  18. 05:18

    אוקיי, אז מה אנחנו עושים? אנחנו לוקחים את האחרון, אתם רואים? זה האחרון, ושמים אותו להיות ראשון. לוקחים אחד לפני האחרון, ושמים אותו להיות שני.

  19. 05:29

    לוקחים את זה שלפניו, והוא שלישי. וזה, הראשון הולך להיות אחרון. זהו. זאת הכתובת של פקודה הבאה לביצוע שהפקודה הזאת זה jump.asp ואז הוא יקפוץ ל-asp ומה יחכה לו ב-asp?

  20. 05:44

    ה-payload שלנו טוב בוא נארגן את ה-payload ונבדוק שזה עובד לנו איך אנחנו מארגנים את ה-payload רגע מה למה לא נשאר יותר משם אוקיי איך אנחנו מארגנים msfn הוא מייצר לנו payload אנחנו אומרים לו שאנחנו רוצים reverse tcp שיתחבר אלינו חזרה הקורבן יתחבר חזרה אלינו אנחנו צריכים לציין לו מה ה-ip שלנו מה הפורט שלנו ומה התווים האסורים.

  21. 06:11

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

  22. 06:19

    אנחנו צריכים פה להכניס את ה-IP, Your IP. מה הכתובת IP שלי? שימו לב, אני צריך להכניס את הכתובת של VPN, ifconfig, בואו נגדיל על כל המסך, ifconfig עוד פעם, כתובת של tunnel 0, לא של לופבק ולא של eth0, רק של tunnel 0.

  23. 06:40

    למה? אנחנו רוצים על הרגל שנמצאת ברשת שלהם שהוא יתחבר חזרה אוקיי אז אני מכניס כאן ב-localhost את הזה 444 ותווים אסורים מהם התווים האסורים

לקורס המלא: קורס סייבר למתחילים אונליין

ההרצאה הקודמת: התקפת Buffer Overflow - שלב 3 - זיהוי תווים פסולים

ההרצאה הבאה: התקפת Buffer Overflow - סיכום כל הפקודות

הרצאות קשורות מקורסים אחרים

  • בניית שלב - חלק 1
  • שרת קפיצה - Azure Bastion
  • התקפת MiTM6 & NtlmRelayX - חלק 2 - יצירת משתמש
  • התקפת CSRF

קורסים נוספים במסלול

  • קורס SOC - מיישם הגנת סייבר
  • קורס פריצה ומבדקי חדירה לתשתית ארגונית - בדיקות חוסן מתקדמות ל-Active Directory - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס פריצה ומבדקי חדירה לאתרי אינטרנט - בדיקות חוסן לאתרים - Web Pentesting - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס סייבר והאקינג ל-Android - פריצה לטלפונים ואפליקציות אנדרואיד - בודק חוסן - Mobile App Pentesting