Description

Category: Web

Source: DEFCON CTF 2018 Quals.

Points: 110

Author: Jisoon Park(js00n.park)

Description:

We offer extensive website protection that stops attackers even when the admin's credentials are leaked!

Try our demo page http://ssat-ps.iptime.org:5102/login.html with username:password admin@oooverflow.io:admin to see for yourself.

Write-up

(*. 문제 환경을 재구성하여 풀이하였습니다.)

사이트 주소와 로그인 계정이 주어져 있다. 일단 사이트에 가서 로그인을 해보자.

호환되지 않는 브라우저라고 한다. (물론 잘못된 로그인 정보를 넣으면 그에 대한 오류가 발생한다.)

브라우저에 대한 오류 메세지는 처음 보는 것 같다. 일단 사이트를 더 살펴보자.

페이지 소스는 확인해보아도 별다른 정보를 얻을 수 없어서 burp suite를 이용해서 통신 내용을 살펴보았다.

처음에 접속한 login.html에서 login.php로 로그인 정보를 보내면 login.php에서 wrongbrowser.php로 redirection 요청을 보내는데, (redirection 되니까) 실제로는 렌더링 되지 않는 의미없는 html 코드가 붙어있는 것을 볼 수 있다.

wrongbrowser.php는 이름으로 보아, 특별한 기능 보다는 오류 메세지를 보여주는 정도의 역할을 할 것 같다. 이 페이지는 호환되지 않는 브라우저라는 오류 메세지를 응답하는데, 서버로 전송되는 브라우저 관련 정보는 http 헤더에 있는 User Agents 정보 밖에 없으니 그걸 잘 고쳐야 하나 보다.

brute-force가 가능할까 싶어 User Agent 데이터베이스를 찾아보았더니 100만 종류 이상의 User Agents가 있다고 해서 포기했다. (몇가지 정보들을 발췌해서 시도해 보았으나 모두 실패했다.)

뭔가 놓친게 더 있을까 싶어 고민하다가 login.php의 response에 있던 html이 떠올라서 다시 한번 확인해 보았다.

<html>
    <style scoped>
        h1 {color:red;}
        p {color:blue;}
    </style>
    <video id="v" autoplay> </video>
    <script>
        if (navigator.battery.charging) {
            console.log("Device is charging.")
        }
    </script>
</html>

html css는 잘 몰라서 모르는 태그들을 하나씩 확인해 보았다.

먼저, <style scoped> 태그를 찾아 보았더니 Firefox에서만 지원하는 태그였다.

정확한 정보를 찾고 싶어서 검색해보니, caniuse.com이라는 사이트가 있어서 다시 style scoped를 검색해 보았다.

Firefox 21-54 버전에서만 동작한다고 한다.

다른 태그들도 찾아보자.

video autoplay는 지원하는 브라우저가 많았다.

navigator battery는 애매하게 칠해진 곳이 있어서 확인해 보았더니, 10-42 버전은 navigator.battery를 지원하고, 43-51 버전은 navigator.getBattery()를 지원한다고 한다. 여기서는 navigator.battey를 사용하니 10-42 버전이 맞을거다.

결국, 위의 html이 제대로 동작하기 위해서는 21-42 버전의 firefox가 필요하다고 생각되었다. 그에 해당하는 User agent를 찾아보자.

WhatIsMyBrowser.com이라는 사이트에서 firefox의 User Agent 문자열을 찾아봤더니 OS 부분을 제외하고는 모양이 정해져 있었다.

우리가 찾는 범위 안에 있는 것들 중에 심플하게 생긴 36버전의 User Agent 문자열을 받아서 21-42 버전까지 전송하는 코드를 작성해서 실행했더니 flag를 얻을 수 있었다.

import requests

# %d means version
ua = "Mozilla/5.0 (Windows NT 5.1; rv:%d.0) Gecko/20100101 Firefox/%d.0"

url = "http://ssat-ps.iptime.org:5102/login.php"
err_msg = "Incompatible browser detected."

email = "admin@oooverflow.io"
pwd = "admin"
data = {"email": email, "pwd": pwd}

for i in range(21, 43):
    headers={'User-Agent': ua%(i, i)}

    r = requests.post(url, data=data, headers=headers)
    if not err_msg in r.text:
        print r.text

Flag : OOO{0ld@dm1nbr0wser1sth30nlyw@y}

'writeups > Web' 카테고리의 다른 글

My admin panel  (0) 2019.11.26
You Already Know  (0) 2019.11.26
Cookie Monster  (0) 2019.11.25
Stop and Listen  (0) 2019.11.25
ReadingRainbow  (0) 2019.11.25

+ Recent posts