Skip to main content

Fetch the Flag CTF 2022 解説:Potty Training

feature ctf potty training

2022年11月12日

0 分で読めます

Fetchに参加してくれてありがとう! 参加してくれた何千人ものプレイヤーの皆さん、 Fetch the Flag CTFへのご参加ありがとうございました。また、チャレンジの作成、テスト、解説記事の執筆を担当してくれたSnykのメンバーにも心から感謝します!

この記事はSnyk AmbassadorのMohammad-Ali A’râbi (@MohammadAliEN)が執筆しました。 Snyk Ambassadorに登録 して、今すぐSnykについて詳しく知りましょう。開催前のCTFにも参加できます。

チャレンジ(歴史的背景も少し)

Snykの2022年のFetch the Flag CTFに参加した方なら、「Potty Training」チャレンジをご存じでしょう。手早く解けるシンプルな問題でしたが、とても興味深いと感じました。セキュリティコンテストで初めてフラグを取得した、思い出深い問題でもあります!

このチャレンジに含まれていたのは、potty.pngという名前のPNGファイル1つだけでした。画像ファイルの場合、何かが隠されている可能性が高いということです。画像などの中にメッセージを隠す手法は古くからあり、ギリシャ語に由来するステガノグラフィーという名前が付いています。これは「メッセージを隠す」という意味です。暗号技術が発明されるずっと前から存在する、秘密のメッセージを伝える最古の方法の一つです。

紀元前480年、故郷を追われたギリシャ人デマラトスは、ペルシャの都市スーサ(現在のシューシュ)に住んでいました。彼はペルシャ王クセルクセスがギリシャへの奇襲を仕掛けるために軍を集めているのを目撃しました。そこでメッセージを書き、それを木片の中に隠して、使者にスパルタまで届けさせました。スパルタ人たちは隠されたメッセージを取り出すための適切なPythonライブラリを見つけるのに少し時間がかかりましたが、最終的には成功しました。……というのは冗談です。スパルタ人はPythonを使っていません。いろいろ試し、皆のアイデアを取り入れてメッセージを見つけたのです。

さて、歴史の話はここまで。つまり、今日のキーワードは「ステガノグラフィー」です。

解決方法

チャレンジに取り組み始めたとき、最初はステガノグラフィーを思いつかず、Vimなどのテキストエディターでファイルを開いてみましたが、予想どおり文字化けしていました。もう一つの難関は、隠されたメッセージを取り出す適切なライブラリを見つけることでした。どうせPythonを使うつもりだったので、Googleで「steganography Python」と検索したところ、steganoという便利なPythonパッケージが見つかりました。

パッケージの説明を確認すると、インストール後はCLIからも使えると書かれています。まずはインストールしてみましょう。

pip3 install stegano

次に、CLIを使って実行します。

stegano-lsb reveal -i potty.png

実行結果は次のとおりです。

       import requests
        r = requests.get('https://potty-training.c.ctf-snyk.io/')
        print(r.text)

PNGファイルの中に、ちょっとずる賢い(というよりSnykyな)Pythonコードが隠されていました。コードを取り出せたので、Pythonファイルに保存しましょう。

stegano-lsb reveal -i potty.png > potty.py

インデントを少し整えて実行します。

python3 potty.py

コードは実行されますが、SSL証明書エラーが発生し、HTTPSプロトコルが使えません。HTTPが実際に使われていた頃を覚えていない方もいるかもしれませんが、30代前半の私はHTTPのウェブサイトが見られた時代を覚えています。懐かしさに浸りながら、コードを編集してhttpsのURLをhttpに変えてみましょう。

import requests
r = requests.get('http://potty-training.c.ctf-snyk.io/')
print(r.text)

実行すると、こんな素晴らしいメッセージが表示されます。

<html>
  <head>
    <title>Good puppy!</title>
  </head>
  <body>
    <h1>Good puppy! 🐕</h1>
    <p>Here's your flag 🦴</p>
    <p>SNYK{dd67edb70a28335068dd5ea9304007b69543357ff471b3144e3355bca34cb35d}</p>
    <a href="https://snyk.io/blog/snyk-international-dog-day-recap/">Snyk + Dogs = 💜</a>
  </body>
</html>

じゃーん!? かわいい子犬と、取得するフラグが見つかりました。

最後に

CTFイベントでこのチャレンジを解くのは本当に楽しかったです。最後に参加したキャプチャー・ザ・フラッグ大会は、地元のゲームセンターで友人たちとCall of Duty 2をプレイしたときでした。第二次世界大戦の勢力の旗を取るより、Snykのフラグを取るほうが楽しかったですね(CoD 2のCTFマップはバランスが悪すぎます!)。来年のCTFが今から楽しみです!

今回の主な学びは次のとおりです。

  • HTTPというプロトコルがあります。古いものですが、廃れたわけではありません。

  • ステガノグラフィーは非常に古い技術ですが、廃れてはいません。

  • この種のチャレンジの歴史について詳しく知りたい方は、Simon Singh著『The Code Book: The Science of Secrecy from Ancient Egypt to Quantum Cryptography』を読んでみてください。

  • 迷ったらPythonを使いましょう。

ほかのフラグをどう見つけたのか気になりますか?Fetch the Flagの解答ページで、その方法をご覧ください。