בלוג | מתקפת Kerberoasting

מתקפת Kerberoasting

Omri Zachay 17 ינואר 2019

בפוסט זה נתאר איך לאתר בסביבת ה- domain של Active Directory  חשבון מסוג service.
נבחן כיצד תוקף יכול לנצל את אותו חשבון ולהשתמש בנתוני ההזדהות שלו כדי לעבור אימות בסביבת הדומיין ובחלק מהמקרים אפילו להשיג הרשאת Domain admin.

סקירה כללית

Kerberoasting מנצל את האופן שבו חשבונות מסוג Service משתמשים באימות של ה- Kerberos עם Service Principal Names (SPNs). בהמשך הפוסט נראה כיצד ניתן לגלות ברשת חשבונות Service באמצעות סריקה של ערכי SPN של אובייקטי משתמש. 

ובסופו של דבר ננסה לפצח את הסיסמאות של אותם חשבונות עד לקבלת הסיסמא ב- Clear text.

כאשר אנחנו מבצעים Login עם משתמש בדומיין (גם משתמש רגיל), אנחנו יכולים לבקש Service Tickets עבור חשבונות מסוג Service וזאת על-ידי ציון ערך ה-SPN שלהם (אל תדאגו בהמשך הכל יהיה ברור יותר).

ה- AD מהצד שלו יחזיר לנו Ticket שמוצפן באמצעות ה- NTLM Hash של אותו חשבון Service שאליו הוא משוייך.

לאחר מכן נוכל לחלץ את אותו Ticket מהזיכרון , לשמור אותו כקובץ ואז לנסות לפצח אותו באמצעות Brute force. ניסיונות הפיצוח נעשים Offline ולכן לא צריך לדאוג מזיהוי של מערכות הגנה או מנעילת החשבון.

במידה והצלחנו בהתקפת ה Brute force – נקבל את הסיסמא של חשבון ה- Service ב- Clear text.

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

אז ככה, כיום כמעט בכל ארגון אתם תמצאו Service accounts שחברים בקבוצת Domain admins ☹

לרוב הסיסמא של החשבונות האלה מאוד חלשות ומסומן בהם שהסיסמא לא משתנה אף פעם. מה שאומר שיש מצב גדול שניתקל בחשבונות משנת 2000 שמאז לא החליפו להם את הסיסמא יהי יהי ! 

מדובר בהתקפה סופר פופולארית שכמט כל תוקף ינסה לבצע ברשת שלכם. 

הסיבות ברורות: אפשר לבצע את המתקפה עם Domain user רגיל ולהגיע די בקלות ל- Domain admin. בלי PE ובלי פעולות מסובכות. מה שנקרא Game Over !  

אפשר לחלק את ההתקפה ל5 צעדים פשוטים (החמישי כייפי במיוחד):

  1. השגת רשימה של ערכי SPN עבור חשבונות משתמשים באמצעות סריקת ה- Active Directory

  2. בקשת Service Ticket עבור שירות SPN של חשבון שירות

  3. חילוץ ה- Service Ticket מהזיכרון ושמירה שלו בקובץ באמצעות Mimikatz

  4. פיצוח ה – Ticket

  5. השגנו את הסיסמא ב- Clear text – נבדוק איזו הרשאה יש לחשבון ונפעל בהתאם ?

    חשוב לציין שהשימוש ב- Mimikatz בצעד מס' 2 דורש הרשאת Local admin על המכונה.
    אבל לשמחתנו ניתן ליישם את ההתקפה היום גם ללא שימוש ב- Mimikatz
    https://github.com/PowerShellMafia/PowerSploit/pull/180 



לפני שרצים להתקפה: קצת רקע

אחרי שמשתמש בדומיין עובר אימות מול ה-KDC שזה בעצם שרת ה- Domain Controller , הוא מקבל ticket-granting-ticket או בקיצור TGT שחתום עם החשבון הדומייני krbtgt שמוכיח שאכן המשתמש הוא מי שהוא טוען שהוא.
לאחר מכן ה-TGT משמש את חשבון המשתמש לבקש service tickets (TGS) עבור משאבים או שירותים  ספציפיים בדומיין.  חלק מאותו service ticket מוצפן עם ה- NTLM hash של חשבון שירות היעד שאליו המשתמש מנסה לקבל גישה.  

אז איך ה-KDC קובע עם איזה מפתח להשתמש כשהוא מצפין את ה- service ticket?
הקרברוס משתמש ב- service principal names (SPNs) כדי לקבוע באיזה hash של service account להשתמש כדי להצפין את ה- service ticket.

ישנם שני סוגים של SPNs ב- Active Directory:
1. host-based SPNs - מקושרים לחשבון המחשב בדומיין.
2. arbitrary SPNs – בדרך כלל מקושרים לחשבון משתמש (user account)  בדומיין.

כשאנחנו משתמשים במתקפת Kerberoasting, בדרך-כלל לא אכפת לנו מ- host-based SPNs. 

חשבון מחשב בדומיין מחליף את הסיסמא כל 30 יום בצורה דיפולטיבית לסיסמא אקראית. 

בכל אופן, אותנו מעניין ה- arbitrary SPNs של חשבונות המשתמשים.

דוגמא נפוצה היא service account שמנהל מס' מופעי MSSQL, חשבון כזה יציג עבור כל מופע  את ה-SPN שלו:

<MSSQLSvc/HOST:PORT>

וזה נראה ככה:


 

ואם יש לו SPN שרשום עבור חשבון משתמש בדומיין אז זה אומר שנעשה שימוש ב-NTLM hash של סיסמאת החשבון עבור יצירת ה- service ticket.  זה בעצם המפתח שלנו בהתקפת Kerberoasting. 
ואם אותו חשבון גם משוייך לקבוצת Domain Admins אז בכלל אנחנו בעננים ?

מכל הרקע הזה אנחנו יכולים להבין שבצורה שקרברוס עובד, כל משתמש יכול לבקש TGS עבור כל שירות בעל SPN רשום בחשבונות של משתמש או מחשב בסביבת הדומיין.
ומכיוון שחלק מה-TGS מוצפן עם ה- NTLM hash של סיסמאת ה- service account, כל משתמש יכול לבקש TGS ticket ואז לנסות לפצח את סיסמאת החשבון Offline ללא כל סכנה.

ישנם כל מיני Service accounts שיכולים לעניין אותנו:

הנה רשימה שלהם כולל הסבר לגבי כל אחד: https://adsecurity.org/?page_id=183

והנה דוגמא למימוש של מוצר שמבקש רישום של SPN מסוג CIFS:

https://community.alfresco.com/docs/DOC-4953-configuring-the-cifs-and-web-servers-for-kerberosad-integration

 


לאלה ממכם שמתעניינים איך מתבצע רישום SPN בדומיין, האפשרויות:

1. רישום אוטומטי של ה-SPN – מתבצע בחלק מה-Services. 

לדוגמא, הרמתם Instance של SQL. ברקע מתבצע רישום אוטומטי של ה-SPN של אותו Instance. 

2.רישום SPN בצורה ידנית:

 

לדוגמא רישום של 2 SPN שונים:

setspn -a cifs/<cifs-server-name>.<domain> user_name

 setspn -s MSSQLSvc/myhost.redmond.microsoft.com:instancename DOMAIN\SQLServiceAccount


למתקפה עצמה

תחילה ננקה את כל הTickets שיש לנו על מערכת ההפעלה


נריץ סריקת SPN לאיתור accounts Service בארגון  (יש להיות מחוברים עם משתמש בדומיין)


התשובה שהתקבלה
ker5

הרשימה נתנה לנו את ה-SPNs ובחלקם את החשבון המשוייך, עם הפקודה הבאה אני גם אוכל לראות מי חבר בקבוצת ה-Domain admins וככה אדע איזה SPN מעניין אותי.

שימו לב שמשתמש בשם sysadmin חבר בקבוצה Domain Admins


ה- Service שמולו אנסה את התקיפה הוא שירות ה-HTTP שרץ עם המשתמש sysadmin שלו כאמור הרשאות Domain admin


 

כעת אנחנו צריכים להריץ פקודות PowerShell כדי לבקש את ה-  Service ticket (TGS) 

ה-Service ticket יוצג בפלט וישמר בזיכרון של המערכת.

שימו לב שאני משתמש עבור ArgumentList בערך שאותו לקחתי מסריקת ה-SPN והוא: "HTTP/teamcitycpa.local"
ker8

נשתמש ב-Mimikatz כדי לייצא את ה- Kerberos tickets מהזיכרון לדיסק המקומי


נעתיק מהתיקייה של Mimikatz את ה-Ticket הרלוונטי ונעביר אותו למכונת ה-Kali שלנו
ker10

שימוש בכלי Kerberoast

הורידו את ה-Git הבא למכונת ה-Kali linux שלכם:  

 https://github.com/nidem/kerberoast.git

 

ייצוא ה- Kerberos ticket שמעניין אותנו למכונת ה- Kali linux ושימוש ב-Cracker כדי לנסות לפצח את הסיסמא
ker11

Game Over -  יש לנו סיסמא של משתמש בעל הרשאת Domain admin בארגון.

השאר תגובה

למעלה