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

hamayanhamayan's blog

B'omarr Style [NahamCon CTF 2020]

最後まで解けてないです

The classic! A grilled-to-perfection patty topped with all the fixin's-- a slice of Gonzo yellow cheese, Revwien lettuce, topato slices, grilled Ojomian onions and...
Note, it is recommended to clear your cookies for this challenge as some may have the same names used in other challenges.
Connect here:
http://one.jh2i.com:50030
http://two.jh2i.com:50030
http://three.jh2i.com:50030
http://four.jh2i.com:50030
http://five.jh2i.com:50030

スターウォーズのファンサイト。

/
/?category=Anthology%20films
カテゴリごとに見られる

/post/EPISODE%20I%20-%20THE%20PHANTOM%20MENACE
エピソード1のサイトはこんな感じ。

/?search=search
検索システムがある

/signin
/signup
/logout
会員システムもある。

まあ、そんなに怪しい所はない。
検索とかpostの後ろとか色々やってみるけど、全然ダメ。

解説を見た

kid path traversal
初めて見たな。
kidというのがよくわかっていなかったけど、そういう用途で使うのか、実装依存っぽいな。

kid path traversal

JWTにkidという開発者が自由に書けるプロパティがあるが、kidを元にトークンの検証を行う場合に実装依存脆弱性が入り込むことがある。
ざっくり言うと、kidを元に検証用の秘密鍵を取ってきている場合、悪意のあるkidを指定すると任意の秘密鍵での検証をサーバ側に強制させられる。
Cookieのtokenを見てみると、以下のようになっている。

{
  "typ": "JWT",
  "alg": "HS256",
  "kid": "secret.txt"
}

kidにファイル名が入っている。
鍵情報がsecret.txtに入っていて、読み込んでいるに違いない。
secret.txtを任意のパスに変えて、共通鍵を任意のものにしよう。

雑に変えてみると、エラーコードが帰ってくる。

f:id:hamayanhamayan:20200616215328p:plain

解説にあるようにkidを/dev/nullにしよう。
これでheaderを作って、とりあえずpayloadには何も入れないようにして、""を鍵にして署名しよう。

payloadを{}のままにしてJWTを作るとエラー出てくる。
invalid load key, '{'.
これでググると、pickleが使われていることが分かる。pickleに任意のデータが渡せると言えば…

安全でないデシリアライゼーション (by Pickle)

payload部分に悪意あるシリアライゼーションデータを埋め込もう。
と思って試行錯誤するけど、なんか分からないけどうまくいかないー