Write-up

[CSAW 2020] PwnVoltex

ch4rli3kop 2020. 10. 14. 18:00
반응형

[CSAW 2020] PwnVoltex

[SUMMARY] Blind SQLi

Overview

리듬 게임 문제이며 서버가 제공되었음.

Target

https://github.com/Drewol/unnamed-sdvx-clone

Readme

Hello!

We are going to have some fun and play my fav game: https://github.com/Drewol/unnamed-sdvx-clone

You can grab it prebuilt from here:

Windows: https://drewol.me/Downloads/Game.zip
Linux (needs github login): https://github.com/Drewol/unnamed-sdvx-clone/suites/1128119397/artifacts/16053517

You can then put the `flagsong` directory into the `songs` directory of USC to play it

Now for the actual challenge:
You have to retrieve the real flag from `./flagsong/flag.ksh` on my computer
(Your copy doesn't have the real flag in it).


My bot (who has the real flag song) will play multiplayer with you if you like.
It will be using https://github.com/itszn/usc-multiplayer-server
on 34.234.204.29 port 39079 (this can be set in the USC settings under online)

The multiplayer sever will restart every 15 min

NOTE: Some functionality of the bot has been simplified for this challenge
but the intended bug left intact. If you think you have a bug that won't
reproduce on the real bot, message me (itszn) and I can test the full, unaltered,
client for you. The client the bot is using should be feature equivalent to
git commit 649b444485db4b1f6dfa0e6adab90dd242764394

Also in case you need it, my computer is running Windows 10
(but you probably don't need to know this...)

ALSO if you are actually good at SDVX, let me know and we can play
some real matches :)

간단하게 요약하면, 해당 게임의 취약점을 찾고 출제자의 서버에 접속하여 봇의 노래 이름을 읽어오면 된다.

Analysis

각 노래는 songs 아래에 디렉토리 별로 존재하며, jpg, ksh, ogg 파일로 이루어져 게임에 사용된다.

Attack Surface

게임 진행에 위 세가지의 파일이 사용되는 만큼, 각 파일들이 공격벡터로 사용될 것이라 추측했고, 그 중 가장 유력한 공격벡터는 다음의 ksh 파일이라고 생각했다. ksh 파일은 다음과 같으며, 플레이할 노래의 title, artist, jacket 사진, song 파일, 최대 점수, 막대 도트들에 대한 정보가 저장된다.

게임 코드가 많았기도 하고, 제한된 시간 내에 다 분석할 자신이 없었기 때문에 일단 될만한 공격들을 다 때려보았다.

최초로 시도해보았던 것은 Overflow 였고, ksh 파일 내에 존재하는 모든 항목들에 대해서 값을 많이 넣어보았으나, 별 소득이 없었고 format string bug도 마찬가지였다.

가만 생각해보다가 내 사고회로가 다음 두 가지를 생각해냈다.

  1. 오픈소스 게임이기 때문에, 깃 로그에 취약점 패치 로그가 있지 않을까?

  2. 코드 상의 취약점이 아니라 로직 버그나 프로토콜 취약점이 아닐까?

문제의 커밋 로그 이후로, 딱히 이 문제에서 사용할만한 취약점이나 버그와 관련된 커밋은 없는거 같아서 바로 2번으로 넘어갔다.

출제자의 서버에 접속하면 기본적으로 로비에 접속하게 되고, 그 상태에서 Room을 생성하면 봇과 함께 게임을 진행할 수 있다. 약간의 시간 후에 봇이 ready 상태가 되는데, 우선 이 과정의 패킷을 살펴보았다.

먼저 유저 정보를 서버로 전송하여 서버로부터 id를 발급받고, Room을 생성할 수 있다. Room을 생성하면 봇이 접속하게 되고, 봇은 호스트가 선택한 노래정보를 찾는다. 위의 패킷에서는 호스트가 노래를 선택해서 해당 노래의 정보를 봇에게 보내면, 봇은 호스트의 노래 정보를 찾아 Ready를 결정하는 것을 확인할 수 있다.

게임에서 사용하는 프로토콜 정보는 게임 사이트가면 정리되어 있는게 있으니, 참고하면 좋을 듯하다.

Protocol

봇이 노래를 찾았을 때와 찾지 못했을 때의 차이는 다음과 같다.

봇이 노래를 찾았을 때