ברוכים הבאים לאזור הבלוגים הטכנולוגיים של ITsafe

קריאה מהנה

ZeroNights Hardware CTF

בבלוג זה אציג את הפתרון שלי ושל ניקיטה קרוטין לאתגר החומרתי שהתקיים בכנס ZeroNights.

ב16 בנובמבר התקיים כנס הסייבר ZeroNights במוסקבה, כנס מאוד מומלץ ומעניין בתחום אבטחת המידע.

במהלך הכנס התקיים אתגר חומרתי מעניין שתפס את תשומת לבי, באתגר היה מחסום חשמלי וכפתור שאם לוחצים עליו נפתח מחסום של חניה, מה שנראה כך:
מודל של מחסום חניה מחובר לארדואינו
על המשתתפים היה לפענח כיצד עובד השער החשמלי ולפתוח אותו מרחוק ללא לחיצה על הכפתור.

על מנת לפתור את האתגר תחילה נבין כיצד המערכת עובדת, אנו רואים במודל שיש שני Arduino Uno.

  • הראשון מחובר לכפתור ולצג ומכיל משדר RF.
  • השני מחובר למחסום ומכיל מקלט RF.
בעת לחיצה, ה-Arduino הראשון משדר סיסמא כלשהי ל-Arduino השני ובמידה והסיסמא נכונה המחסום נפתח.

משדר ומקלט בסיסי נראים כך:
רכיבי RF זולים המשדרגים ב-433Mhz
לאחר שהבנו כיצד עובד המודל, עלינו לתכנן את דרך הפעולה שלנו ולהבין כיצד אנו יכולים לפענח את הסיסמא שיש לשלוח על מנת לפתוח את המחסום.

נחלק את האסטרטגיה שלנו ל3 חלקים:


part 1

נבנה מודל Arduino פשוט אשר יעבוד כ-sniffer אשר יציג את כל הסיסמאות שנשלחות ב-console. לשם כך נשתמש בחלקים הבאים:

  • Arduino Uno
  • Breadboard
  • Breadboard
  • RF receiver
את החלקים ספקו מארגני האתגר, ניתן היה לבחור בין HackRF לבין Arduino וחלקים (אנחנו בחרנו ב-Arduino).

לאחר שחיברנו את כל החלקים, בנינו את המודל שלנו.

תמונה משלב פיתוח המודל:
שני מחשבים מחוברים לארדואינו ולאנטנות RF
לחצנו על הכפתור של המחסום 3 פעמים ותפסנו את ההודעות שנשלחות, מה שנראה כך:
קוד המצופן שקיבלנו
אם נבחן את ההודעות מקרוב נראה שהן מחולקות לשני חלקים בצורה הבאה:
  • 4 בתים ראשונים הם מהווים מונה לחבילה.
  • o 0x7d6 = 2006
  • o 0x7d7 = 2007
  • o 0x7d8 = 2008
  • 8 בתים שהם בעצם קוד מתגלגל כדי למנוע replay attack.


part 2

לאחר שהבנו את הלוגיקה, כעת עלינו לחשוב כיצד אנו יכולים לפענח את הסיסמא. אנו יודעים שישנו מונה כלשהו ומפתח שהוא זהה בכל החבילות.

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

על סמך מידע זה ביצענו ניחוש מושכל והנחנו שהסיסמא היא חלק כלשהו מפרוטוקול גיבוב ולכן ניסנו את כולם או לפחות את (md5, sha1, sha256 ועוד כמה שהיו במודול hashlib)

ניקח את המונה שהוא בעצם זה שגורם לסיסמא ששולחים כל הזמן להשתנות, סוג של padding, ונחבר את התווים האקראיים.

לאחר מכן נבצע על התוצאה את פעולת הגיבוב md5 ונבדוק האם היא מכילה את החלק של 8 הבתים שהם כנראה 8 בתים כלשהם בתוך פעולת הגיבוב.

כך בעצם נכתב הקוד הבא:
קוד פייתון שמשתמש בhashlib ובודק md5 על הקוד
קוד זה הניב את התוצאה הבאה:

[+] The password is: 1339 in 0.640000104904s

כך שהתווים D0 87 FF 2E 43 E6 95 65 הם בעצם 8 הבתים הראשונים של פעולת הגיבוב md5.

והמידה שנשלח מהמשדר למקלט הינו:

counter(4 bytes) + (first 8 bytes of MD5(counter + secret key))


part 3

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

לאחר מכן נוסיף למונה את המספר 1339 ועליו נבצע md5.

כך בעצם כתבנו את הקוד הבא שלוכד את החבילה הראשונה:
קוד c פשוט שמקליט הודעות באוויר
ולאחר מכן את הקוד הבא אשר לוקח את הסיסמא – 1339 בתוספת המונה ושולח אותה למחסום:
קוד c שמקליט את ההודעה הראשונה ושולח הודעות באוויר
את הקוד הכנסנו ללולאה ובכך המחסום נפתח כל עוד הקוד שלנו התבצע:
תמונה המראה שהמחסום נפתח
כך בעצם פתרנו את האתגר ואף זכינו בפרס שווה 😊

Share this post