מילון מושגים:
האש - פונקציה שממירה מידע לערך קצר באורך קבוע. שינוי קטן בקלט משנה את התוצאה, והיא חד-כיוונית.
Active Directory - שירות מדריך של מיקרוסופט לניהול מרכזי של משתמשים, מחשבים והרשאות ברשת ארגונית מבוססת דומיין.
TGT - כרטיס שמנפיק שרת האימות ב-Kerberos, שבעזרתו המשתמש מבקש גישה לשירותים בלי להזדהות שוב בכל פעם.
אימות - תהליך שמוודא שהמשתמש או המערכת הם מי שהם טוענים שהם, בדרך כלל באמצעות סיסמה, קוד או תעודה.
שיתוף - תיקייה או משאב שהועמדו לרשת כדי שמשתמשים אחרים יוכלו לגשת אליהם לפי הרשאות.
שם משתמש - מזהה ייחודי שמשתמש מזין כדי להזדהות במערכת, לרוב יחד עם סיסמה.
שורת פקודה - ממשק טקסטואלי שבו מקלידים פקודות למערכת ההפעלה ומקבלים תגובה בטקסט, במקום להשתמש בעכבר.
NTLM - פרוטוקול אימות ותיק של מיקרוסופט המבוסס על ערכי האש של סיסמאות, שקדם ל-Kerberos.
ביצוע התקפת Golden Ticket על AD
בשיעור זה אנו מייצרים כרטיס הזדהות מזויף שמאפשר להתחזות לכל משתמש ברשת, לבצע מעבר צידי לכל שרת ולהישאר בתוקף עשר שנים. אנו חולצים את הגיבוב של משתמש המערכת שמצפין את כל הכרטיסים בשתי שיטות, יוצרים את הכרטיס המזויף בעזרת הכלי המיוחד, מזריקים אותו לזיכרון ומדגימים גישה למשאבי הרשת בשמו.
נושאי הסיכום המוצגים בשיעור:
1. מהו הכרטיס המזויף: אנחנו ניצור כרטיס הזדהות שנותן להתחזות לכל משתמש ברשת, לזוז לרוחב הרשת אל כל שרת שנרצה, והוא יהיה בתוקף לעשר שנים. זה אומר שגם אם יחליפו סיסמאות בכל הרשת לכל המנהלים ויחשבו שהם בטוחים, זה לא יעזור, כי יש לי כרטיס הזדהות של קרברוס שמערכת האבטחה של Active Directory עובדת איתו במקביל לשם וסיסמה.
2. איך זה עובד: אפשר להזדהות מול שירותים ברשת או עם שם וסיסמה, או עם כרטיסים של קרברוס. אני הולך לזייף לעצמי את הכרטיס הזה עם תוקף לעשר שנים קדימה, בשמו של כל משתמש שארצה, נניח בשם מנהל, ואוכל להיכנס לאן שארצה, לזוז לרוחב הרשת ולהיכנס לכל שרת שארצה. החלפת סיסמאות פשוט לא תעזור, כי יהיה לי כרטיס כניסה שלא תלוי בשם והסיסמה.
3. התנאי לביצוע ההתקפה: כדי שההתקפה הזאת תצליח צריך להיות כבר בשלב שבו יש לנו שם וסיסמה של מנהל דומיין. למשל, חיכינו למנהל הדומיין באיזושהי תחנה, הוא נכנס עם שם והסיסמה שלו וגנבנו זאת מתוך הזיכרון של התחנה. עכשיו צריך להתחיל לייצר לעצמנו את הכרטיס המזויף כדי שלא נהיה תלויים בשם ובסיסמה הזה, כי אולי מחר הוא יחליף את סיסמתו ולא נוכל להיכנס שוב לרשת.
4. איפה אנחנו נמצאים: אני במחשב של הקורבן, למעשה בתוך בקר הדומיין, ומריץ את הכלי המיוחד. בתוך הכלי צריך לחלץ את הסיסמה של משתמש שנקרא קרברוס TGT, המשתמש שאיתו פועלת מערכת האבטחה עצמה, וצריך את הגיבוב של הסיסמה של המשתמש הזה כדי לזייף כרטיסים בשמו. מתחילים מזה שמוחקים את כל הכרטיסים מהזיכרון, כדי שלא יהיו לנו אף כרטיס: הרשימה שלנו ריקה, ביצענו ניקוי ומחקנו הכל.
5. השיטה הטובה - סנכרון זדוני: השיטה הטובה היא DC-Sync, שהיא למעשה התחזות לשרת בקר דומיין, שרת שמחזיק את כל הסיסמאות ורוצה לעבור סנכרון ולהתעדכן מול בקר הדומיין הראשי. אני מתחזה לשרת כזה ומבקש לעבור סנכרון, אבל סנכרון רק של משתמש אחד, של קרברוס TGT.
6. מדוע השיטה הזאת עדיפה: שיטת הסנכרון הזדוני טובה יותר משיטת ה-LSA שראינו לפני כן, כי היא לא דורשת כניסה פיזית, התחברות פיזית, אל בקר הדומיין ואל השרת הראשי. כך יש פחות סיכוי להיתפס, כי אני נשאר בתחנה של משתמש ומבקש סנכרון רגיל של Active Directory. מקווים שצוות האבטחה לא יקבל התראה על כך, כי זה ייחשב כפעולה לגיטימית, סנכרון בין שרתי בקרי דומיין.
7. חילוץ הגיבוב: ברגע שמריצים את הפקודה מתקבלים כל הגיבובים, מעתיקים את הגיבוב הצידה ופותחים עורך טקסט ושומרים אותו שם. זה למעשה סיסמה מעורבלת, ומבחינתנו זה כמו סיסמה רגילה של משתמש קרברוס TGT. השירות הזה שמחלק את כרטיסי האבטחה וכרטיסי האימות הוא זה שחותם עם הסיסמה הזאת, עם הגיבוב שלה, על כל כרטיס שהוא מנפיק. למעשה אנחנו מתחזים לשירות הזה ולכרטיס הזה, וכך אנו מזייפים את הכרטיס ועושים דברים בשמו, כי יש לנו את הסיסמה שלו.
8. השיטה השנייה: כרגע אנחנו נמצאים על שרת בקר הדומיין עצמו, עשינו לו התחברות, ולכן אנחנו יכולים לחלט סיסמאות מתוך זיכרון הראם שלו, מתוך רשות האבטחה המקומית ומתוך השירות שבזיכרון, כי אנחנו פיזית נמצאים על אותו שרת. מכיוון שמייקרוסופט ניסו להגן על הדבר הזה, נצטרך לבצע הזרקה, להוסיף עוד קצת קוד לתהליך בזיכרון, והקוד הנוסף שלנו ישלוף את הסיסמאות. הפקודה הזאת היא למעשה שיטה שנייה לחלץ את אותו גיבוב שראינו לפני כן, והיא גם מביאה את המשתמש קרברוס TGT וגם נותנת את אותה סיסמה, את אותו גיבוב של הסיסמה. מבחינתנו זה הגיבוב של הסיסמה, וזה כמו לקבל את הסיסמה עצמה, כי המשתמש הזה בחיים לא יקיש פיזית את הסיסמה, הוא המשתמש שפועל אוטומטית מאחורי הקלעים ולמערכת יש רק את הערבול שלו.
9. מה עוד נצטרך - מזהה הדומיין: נצטרך גם את מזהה האבטחה של הדומיין עצמו. מזהה האבטחה הוא המספר שיש לנו על כל משתמש. כשיוצאים מהכלי ומריצים את פקודת הזיהוי, היא נותנת את שם המשתמש, את הדומיין ואת מזהי האבטחה. כל ההרשאות על כל הקבצים ועל כל המשאבים ברשת מחולקות לפי מזהה האבטחה הזה, כדי שאפשר יהיה לשנות שם של משתמש בלי להחליף הרשאות בכל הקבצים. החלק הראשון של המזהה הוא מזהה של כל הדומיין והוא יהיה זהה לחלוטין לכל המשתמשים בדומיין, אבל לכל משתמש תהיה סיומת ייחודית: 500 תמיד הוא מנהל, אחר כך 1000, 1001, 1002, ויכולות להיות גם קפיצות באמצע. השילוב של מתחם האבטחה והמספר של המשתמש הספציפי יוצרים את המזהה הייחודי של אותו משתמש בכל המערכת.
10. ההוראות של האתר: האתר מבקש להריץ את הפקודה שמחלצת מתוך הזיכרון של בקר הדומיין את מזהה הדומיין ואת הערבול של קרברוס. לקחנו את שני הנתונים האלה, ועכשיו אנחנו יכולים להריץ את מודול הקרברוס, להפעיל את הפונקציה שמייצרת לנו את הכרטיס המזויף ולהעביר לה את הפרטים: את שם המשתמש שאליו רוצים להתחזות, נניח מנהל, שם הדומיין, שם מתחם האבטחה, את מזהה האבטחה של מתחם האבטחה, את הגיבוב של סיסמת קרברוס TGT שאיתו מצפינים את כל הכרטיסים, כלומר בפועל מתחזים למשתמש הזה, ואת המזהה של המשתמש שאליו מתחזים.
11. הרכבת הפקודה: נתנו את שם המשתמש שאליו מתחזים ואת מזהה האבטחה שלו, את המספר 500, איזה מזהה נרצה שיהיה כתוב בתוך הכרטיס, ולפי המזהה הזה נקבל הרשאות גישה בכל מיני שרתים ובכל מיני תיקיות משותפות. אני כותב את הפקודה של ייצור הכרטיס המזויף: את המזהה של מי שרוצים להתחזות אליו, נניח מנהל תמיד יהיה 500, אבל אפשר להתחזות לכל משתמש ולתת כל שם, את שם הדומיין שלנו, של מתחם האבטחה, את מזהה האבטחה שלו, ואת הגיבוב, הסיסמה של המשתמש בשם קרברוס TGT, שהוא זה שמצפין את כל הכרטיסים האלו.
12. חשיבות המזהה ולא השם: בפועל השם שמופיע על הכרטיס הוא לתצוגה, מה שבאמת חשוב זה המספר. כשמגיעים לגשת לאיזשהו משאב ברשת, כמו תיקייה משותפת, בודקים רק את המספר הסידורי של המשתמש ולא איזה שם שמו לו, כי השם יכול להשתנות, למשל אם נעשתה טעות כתיב ואפשר לשנות שם משתמש. השם חסר משמעות, רק המזהה של המשתמש והמספר הסידורי שלו חשובים. הדומיין שלנו הוא controller.local, שם מתחם האבטחה שלנו, מזהה האבטחה של הדומיין לקחנו מפקודת החילוץ או מפקודת הזיהוי, ואת הערבול של קרברוס TGT, הסיסמה של המשתמש הזה, והוא מייצר לי את הכרטיס המזויף. אפשר לראות שהוא יצר את הכרטיס עם השם הזה, עם הדומיין הזה, עם המזהה שנתנו לו, והכניס קבוצות כאלה וכאלה. באמת אפשר לציין לאילו קבוצות לשייך אותנו, כי יש הרשאות שמחולקות לפי מזהה אבטחה של קבוצה ולא מזהה של משתמש, ויש גם זמן תוקף: מ-2022 עד 2032, לעשר שנים. הוא שמר את כל הכרטיס הזה בקובץ בפורמט הכרטיסים של קרברוס.
13. הקובץ שנוצר: עושים יציאה מהכלי, מציגים את תיקיית העבודה הנוכחית ורואים את קובץ הכרטיס. זה הקובץ שאיתו אפשר לבוא ולהזדהות בלי לדעת את הסיסמה בכלל.
14. הזרקת הכרטיס לזיכרון: לפני שמתחילים בפקודת הרשימה המובנית רואים שאין אף כרטיס בזיכרון. נכנסים לכלי, בודקים בפקודת הרשימה של מודול הקרברוס שבאמת אין שום כרטיס בזיכרון, ומריצים את פקודת העברת הכרטיס ואומרים לה את שם הקובץ, היו יכולים גם לתת לה נתיב מלא לקובץ. עכשיו פקודת הרשימה מראה שיש כרטיס בזיכרון תחת שם מזויף שבכוונה שמנו, כדי שתראו שזה באמת כרטיס חדש שיצרנו לבד בעצמנו, ומי שהנפיק לי אותו הוא אותו משתמש קרברוס TGT, כי עשינו דברים בשמו בלי שהוא יודע בכלל, כי יש לנו את הסיסמה שלו. והנה יצרנו לעצמנו כרטיס ב-Active Directory. אפשר לצאת ולהריץ את הפקודה המובנית בשורת פקודה רגילה ולראות שבאמת יש שם שם לקוח וזה כרטיס רגיל לגמרי כביכול, רק שהתוקף שלו במקום עשר שעות הוא לעשר שנים. העשר שעות הזה מוגדר במדיניות הקבוצתית של Active Directory, אבל מכיוון שאני מייצר לעצמי כרטיס אני יכול גם לעשות אותו לעשר שנים קדימה, והצלחנו להתחזות למשתמש שרצינו.
15. הזרקה ישירה בשלב אחד: היינו יכולים לעשות הכל בשלב אחד ולדלג על שלב שמירת הקובץ, ולהזריק ישר את הכרטיס לתוך הזיכרון. נכנסים לכלי, מריצים את פקודת הרשימה, מריצים את פקודת הניקוי שמוחקת את הכל, בודקים שהכל נמחק, וחוזרים עם החץ למעלה אל אותה פקודה שעשינו, רק שבסוף כותבים את אפשרות ההעברה הישירה, שמטעינה ישר את הכרטיס שנוצר לתוך הזיכרון בלי לשים אותו בכונן, ואז מטעינים הכל בשלב אחד. אחרי הפקודה הזאת רואים ישר בפקודת הרשימה שיש לי את הכרטיס המזויף שלי בזיכרון. שוב: הרשימה הייתה ריקה, הרצנו את הפקודה שמייצרת לי את הכרטיס המזויף, ואמרנו לו להשתמש ישר בכרטיס הזה. במקום לשמור אותו בכונן הוא ישר הזריק אותו לזיכרון ופקודת הרשימה ישר מראה לי אותו. אז יש אפשרות להזריק אותו ישר לזיכרון ולהשתמש בו, או לשמור אותו בצד כקובץ לשימוש עתידי.
16. חשוב לשמור את הקובץ: חושבים שחשוב מאוד לשמור את קובץ הכרטיס, כי זה הקובץ שייתן גישה אם יום אחד יחליפו סיסמאות לכל המשתמשים ברשת, כי יחשדו שהייתה פריצה וחייבים להחליף את כל הסיסמאות.
17. איך מתגוננים מההתקפה: דרך אגב, אם היו מחליפים את הסיסמה של קרברוס TGT, אז הכרטיס שלי היה כבר לא תקף ולא היה נתפס. אם מישהו רוצה להגן ברשת שלו מההתקפה הזאת, צריך להחליף את הסיסמה של קרברוס TGT פעמיים, כי ווינדוס עוד זוכר סיסמה קודמת. כדי שהגיבוב שגנבנו והכרטיס שחתום על ידו לא יהיו תקפים, צריך להחליף את הסיסמה של המשתמש הזה פעמיים. אבל בחיים לא ראינו מנהל רשת שבכלל יודע איך עושים זאת או מבין מהו המשתמש הזה: 99 אחוז ממנהלי הרשת אומרים שזה משהו של המערכת שהם לא נוגעים בו. אז גם אם יחליף סיסמאות לכל המשתמשים ברשת זה לא יעזור לו, כי יש לי כרטיס שנותן לי גישה לכל מקום, ולזרוק אותי החוצה אפשר יהיה רק אם מחליפים את הסיסמה של המשתמש האוטומטי המובנה של המערכת שאף אחד לא נוגע בו, ורק אם יחליפו לו את הסיסמה פעמיים. אז הכרטיס שלי לא יהיה תקף, לא יהיה חוקי, כי הוא חתום עם ערבול ישן שכבר אינו בתוקף.
18. שימוש בכרטיס מול משאבים: חוזרים לאתר ורואים שזה בדיוק מה שהם רצו. הם מסבירים שאחרי פתיחת שורת פקודה עם הכרטיס החדש אפשר להריץ פקודת תיקייה ישירות על הכונן המשותף של איזושהי תחנה או שרת חדש, כי מזדהים עם הכרטיס הזה. שימו לב, חשוב מאוד לכתוב שם של תחנה ולא כתובת IP של תחנה, כי קרברוס ו-Active Directory עובדים לפי שמות ולא לפי כתובות IP. אפשר גם להריץ תוכנה מרוחקת על התחנה הזאת, ושוב קריטי לרשום את השם ולא כתובת IP. אם כותבים כתובת IP במקום שם, הוא יעבוד ב-NTLM הישן, בהזדהות הראשונה של שם וסיסמה, ולא בהזדהות עם קרברוס. כדי שהמערכת תעבוד מאחורי הקלעים עם הזדהות של קרברוס, זה רק שמות של מחשבים ולא כתובות IP. מה שהאתר שואל אותנו: באמת הם לא שואלים כלום, אפשר להשלים. סיימנו את המשימה: כבר סיימנו חמש משימות, כל הכבוד, וניפגש בהרצאה הבאה.
בסוף השיעור חילצנו את הגיבוב של משתמש המערכת בשתי שיטות, ייצרנו כרטיס הזדהות מזויף בתוקף עשר שנים בשם מנהל הדומיין, הזרקנו אותו לזיכרון, שמרנו אותו כקובץ לשימוש עתידי והדגמנו גישה למשאבי הרשת בשמו.
SR12887HE