zenet_logo

-株式会社ゼネット技術ブログ-

SECCON Beginners ctf 2019 writeup

初めましてシステム事業部の石黒です。

SECCON Beginners2019に参加しました。
解くことができた問題について、どのように解いたかを備忘録がてら残したいと思います。 今回が初参加であり、筆者の業界歴も浅いため、ビギナー目線の記事になることをご承知おきください。

f:id:zenet-tech:20210316171808j:plain

SECCON Beginnersとは

SECCON Beginnersというのはその名の通り、初心者向けのSECCONになります。
(そもそもSECCON is 何?という人はこちら)

今回のSECCON Beginnersは、CTF(Capture The Flag) 形式で行われました。
CTFでは、参加者が様々な攻撃を仕掛け、問題のどこかにあるflagを探し出すことが目的となります。
flagは ctf4b{XXXX}の形式で、暗号化されたりして隠されています。

問題

問題は[Crypto, Pwn, Reversing, Web, Misc]の5種類に分けられており、それぞれ4問ずつあります。
私が解くことができたのは、この内Web系の問題2問になります。

なお、残念ながら全問題についてはすでにサイトが閉じてしまっているため見ることができません。

[warmup] Ramen

warmupということで、一番簡単なものになります。
しかし、初参加の私にはハードでした。

まず、戸惑ったのは問題文です。
問題文は以下のようなものでした。

ラーメン
(url省略)

 

お わ か り い た だ け た だ ろ う か

 

他の問題もそうですが、問題文なんてものはありません。SECCONの洗礼を受けました。
なにがなにやらわからないので、とりあえずリンクを踏んでみました。

すると、リンク先はどうやら簡易的なWebサイトのようでした。
サイト内に検索フォームがあるので、sqlインジェクションにあたりをつけてflagを探すことに。

sqlインジェクションについてgoogle先生に聞きながら試すうちに、
どうにか以下のUNION句でテーブル一覧を取得できるところまでたどり着くことができました。

 'UNION SELECT table_name, GROUP_CONCAT(column_name) FROM information_schema.columns GROUP BY table_name -- 

テーブル一覧を取得してみると、flagテーブルがあったので、
今度は以下のUNION句でflagテーブルのデータを取得し、無事flagを見つけました。

 'UNION SELECT flag, flag FROM flag --  
 => ctf4b{a_simple_sql_injection_with_union_select}

ここまで一時間半程度掛かりました。。

katsudon

問題文を見てみると、何やら怪しい文が

Rails 5.2.1で作られたサイトです。  
(url省略)
クーポンコードを復号するコードは以下の通りですが、まだ実装されてないようです。
フラグは以下にあります。 
(url省略)

Rails 5.2.1とわざわざバージョンが書いてあるため、 脆弱性のバグをつくものかと思いましたが、結局わからなかったので、断念。

別の方法を探すため、サイト上に示されている、以下の暗号化されたflagの文字列の複合を試みる方針に。

BAhJIiVjdGY0YntLMzNQX1kwVVJfNTNDUjM3X0szWV9CNDUzfQY6BkVU--0def7fcd357f759fe8da819edd081a3a73b6052a

サイトのRailsコードが公開されていたので、MessageVerifierによって文字が作成されていることはわかりました。 しかし、secret_key_baseがわからないため、複合できそうにない。。。

どうしようかとコードを追っていくうちに、文字列が以下のようにして生成されていることがわかりました。

 "#{data}--#{generate_digest(data)}"

後ろはただのハッシュなので、--以前に対して複合してあげれば行けそう?と思い、 rails consoleで以下を叩くと、

Marshal.load(::Base64.strict_decode64("BAhJIiVjdGY0YntLMzNQX1kwVVJfNTNDUjM3X0szWV9CNDUzfQY6BkVU"))
=> "ctf4b{K33P_Y0UR_53CR37_K3Y_B453}"

flagを取得できました。

この問題も一時間半程度掛かりました。

気づいた方もいるかもしれませんが、上でやっているのはbase64で複合しているということなので、 rails consoleでこんなコードを叩く必要もなく、もっと簡単に解けます。。。 base64の文字列に慣れている方は一瞬だったかと思います。

(補足) 実はこれらの解き方は運営側としては意図していないものだったらしく、
改めてkatudon-okawariとして修正版の問題が出題されました。

そしてこのkatudon-okawariの解き方は、
Rails脆弱性のバグを利用し、secret_key_baseを盗るというもののようです。。。
当初このアプローチをしていただけに、非常に悔しい。。。

まとめ

というわけで、初めてSECCON Beginnersに参加したわけですが、
自身の知識・技術不足を痛感でき、非常に良い刺激になりました!

次はweb以外の問題も解けるように力を付けたいです。