DoSaTTaCK

תיאור

DoSaTTaCK

פתרון

נבדוק מהו הקובץ המצורף:

root@kali:/media/sf_CTFs/bsidestlv/DoSaTTaCK# file challenge.flp
challenge.flp: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "WINIMAGE", sectors/cluster 2, root entries 112, sectors 640 (volumes <=32 MB), Media descriptor 0xfd, sectors/FAT 1, sectors/track 8, serial number 0x22550c8e, label: "           ", FAT (12 bit), followed by FAT

זהו קובץ תמונה של תקליטון דוס. מספר תוכנות יכולות לחלץ את הקבצים ממנו, למשל 7Zip. לאחר חילוץ הקבצים אנו מקבלים שתי תוכנות הרצה וקובץ בינארי:

root@kali:/media/sf_CTFs/bsidestlv/DoSaTTaCK# ls -al
drwxrwx--- 1 root vboxsf   4096 Jun 21 13:08  .
drwxrwx--- 1 root vboxsf   4096 Jun 20 19:23  ..
-rwxrwx--- 1 root vboxsf 327680 Jun 11 19:10  challenge.flp
-rwxrwx--- 1 root vboxsf  17216 Apr  6  1992  CLIENT.EXE
-rwxrwx--- 1 root vboxsf  11892 Sep 26  1987  MAIN.ENC
-rwxrwx--- 1 root vboxsf  23568 Apr  6  1992  SERVER.EXE

קבצי ההרצה הם בפורמט NE (עבור חלונות 3):

root@kali:/media/sf_CTFs/bsidestlv/DoSaTTaCK# file CLIENT.EXE
CLIENT.EXE: MS-DOS executable, NE for MS Windows 3.x
root@kali:/media/sf_CTFs/bsidestlv/DoSaTTaCK# file SERVER.EXE
SERVER.EXE: MS-DOS executable, NE for MS Windows 3.x

נעלה לחלונות 3.11 (שרץ מעל אמולטור DOSBox) ונריץ את הקבצים.

הפלט מהרצת הסרבר:

הפלט מהרצת הקליינט:

עם זאת, דבר לא קורה. נצטרך לנתח את קבצי ההרצה ולראות מה היה אמור לקרות. שימו לב שלדיסאסמבלרים מודרניים ישנה לרוב תמיכה חלקית לכל היותר בפורמט NE. למשל, IDA Free לא תומך בפורמט (IDA Pro כן, אבל הוא יקר), ו-Ghidra תומך בו אך מתקשה בהבנתו. אנחנו נשתמש ב-W32Dasm הותיק שמעניק תמיכה סבירה בפורמט.

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

* Possible StringData Ref from Data Seg 002 ->"Sending Magic Byte.."
                                  |
:0001.0112 689800                 push 0098
:0001.0115 0E                     push cs
:0001.0116 E833FF                 call 004C
:0001.0119 83C402                 add sp, 0002
:0001.011C 689100                 push 0091
:0001.011F FF7606                 push word ptr [bp+06]
:0001.0122 E8CD0E                 call 0FF2
:0001.0125 83C404                 add sp, 0004

יש פה קריאה לשתי פונקציות. הראשונה, בכתובת 0x4C, משמשת לכתיבה למסך. השנייה, בכתובת 0xFF2, משמשת לשליחת נתונים דרך COM1, הפורט הסיריאלי.

אם כך, עלינו להרים תמיכה ב-COM1 על מנת לאפשר לתוכנות לדבר בינן לבין עצמן. ניתן לעשות זאת על ידי שינוי בהגדרות ה-DOSBox כך שיחבר את COM1 המדומה לפורט סיריאלי על המחשב המארח - למשל COM1 גם כן. אם אין לנו פורט סיריאלי על המחשב המארח (ולרובנו אין), אפשר להתקין דרייבר שידמה זאת, או להרים עוד רמה של וירטואליזציה ולהריץ את DOSBox בתוך מכונה וירטואלית שרצה עם VirtualBox, שם אפשר להגדיר פורט סיריאלי מדומה:

לאחר שחזור הריצה בשנית נקבל את התעבורה שנשלחת מהקליינט אל הסרבר. התשדורת מתחילה עם התו בעל הערך 0x91 ולאחר מכן המחרוזת הבאה:

06E820075A5DE9ED1ECA0200558BEC6823018B4608E80C078B4606E806075A5DE91B20CA0400558BEC683D018B4608E800078B4606E8EC065A5DE91588CA0400558BEC6857018B4608E8E6068B4606E8D2065A5DE98485B8FFFFCA0400558BEC6874018B460CE8C9068B460AE8B5065A5DE9C683CA0800558BEC6888018B4606E8AF065A5DE9A086CA0200558BEC689C018B4606E89B065A5DE9D585CA0200558BEC68B6018B4608E887068B4606E873065A5DE90487CA0400558BEC68CA018B4606E85F065A5DE9B648CA0200558BEC68EA018B460CE84B068B46088B4E0A8D5E06E8C2065A5DE9CF48558BEC8B4E068B5E088B560A5DE83B07CA0800558BEC

התו 0x91 הוא מה שהתוכנה מכנה Magic Byte, והמחרוזת היא הייצוג של המפתח, באורך 256 בתים.

מהצד השני, הסרבר מתעורר לחיים ומדפיס:

קיבלנו קובץ EXE חדש, שהוא פענוח של הקובץ MAIN.ENC עם המפתח מהקליינט! אולם, משום מה הוא לא רץ כראוי.

לאחר חקירה התברר לנו שחלק מהמפתח שנשלח מהקליינט שגוי. ניתן היה לראות זאת באמצעות התבוננות במחרוזות שפוענחו, למשל: setvbuf._.{rcat._strlen

ברור שאמור להיות שם strcat.

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

ההרצה של הקובץ המתוקן ב-DOSBox הציגה את ההודעה הבאה:

השתמשנו ב-Boot Disk של DOS 3.3, הרצנו שוב וקיבלנו:

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

       1000:05ee b8 00 00        MOV        AX,0x0
       1000:05f1 f7 f0           DIV        AX

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

מופיע פה משהו שנראה כמו דגל, אך יש בו קטע משובש באמצע: BSidesTLV{DOSis ??????????????ttack}

באמצעות מספר יוריסטיקות וניחושים הגענו למסקנה שקיימים מספר תווים חוקיים גם באמצע, מה שהביא אותנו ל: BSidesTLV{DOSis ??????nl??an??ttack}

הוספנו רווחים וקיבלנו: BSidesTLV{DOS is ?????nl? an attack}

ומכאן כבר היה אפשר לנחש את הדגל: BSidesTLV{DOS is not only an attack}

בדיעבד פורסם שהיה באג באתגר, והוא הציג את הדגל הנכון רק ב-DOS 6.22 למרות שדרש את DOS 3.3.