• トップ
  • ブログ一覧
  • ChatGPTを使ってCTF解いてみた
  • ChatGPTを使ってCTF解いてみた

    かじー(エンジニア)かじー(エンジニア)
    2023.02.01

    IT技術

    はじめに

    今ChatGPTが界隈を賑わせていますが、実際どれぐらいのことができるのか興味があったので、検証を兼ねてChatGPTを用いてCTFを解いてみることにしました。

    CTFとは

    CTFは"Capture The Flag"を略したものであり、サイバーセキュリティ分野の知識を駆使してサーバの侵入や暗号の解読等を試みFlag(問の答え)を取得することで点数を競うハッキングコンテストのことです。

    実践

    一口にCTFといっても種類があり、期間限定で開催されているものや常設のものと様々。今回は常設かつ難易度が比較的低いとされているCpawCTFに挑戦してみることにしました。

    ※本記事内でCTFの回答が記載されているので、まだ回答を知りたくないという方はCpawCTFのLevel1を解いてから記事を読んでいただければと思います。
    ※また、本記事はChatGPTの挙動にフォーカスを当てるためCTFの解法については深く解説しません。「cpawctf writeup」で調べれば情報はすぐに得られますのでそちらを参照ください。

    上記のリンクをたどると以下のページが表示されるかと思います。(2023年1月時点)

    ナビゲーションバーにある「SignUp(画像右上赤枠)」からユーザー登録できるので興味のある方はやってみてください。

    ユーザー登録あるいはログインが完了すると以下の画面が表示されます。CpawCTFは問題の難易度ごとにレベル分けされており、今回は最もかんたんなLevel1の問題を解いてみます。

    "Title"の[]で囲まれている部分は問題の分野を示しており、まずはCrypto(暗号解析)に挑戦しようと思います。問題文↓

    シーザー暗号は問題文にもある通り、古くから存在する古典暗号であり指定文字数分アルファベットをずらすという簡易的なつくりになっています。例えば「abc」という文字列があったとして指定文字数を3として暗号化した場合、aはd、bはe、cはfとアルファベット順の3つ後方にずれた文字に対応するようになり最終的に「def」という文字列が生成されます。

    まずはこの問題文の切り抜きをそのままChatGPTに与えてみました。

    シフト数が指定されていないと言われてしまいました。さすがに問題文の「3文字分アルファベットをずらす」という部分は読み取ってもらえなかったようです。なので問題文をいじってみました。

    !?
    それっぽい文字列が生成されました。これをSubmitすると、、、

    不正解のようですね。この後色々とリクエストしてみましたが正解にはたどり着けず、、、
    最終的に自力で解いてみたところ正解は「cpaw{Caesar_cipher_is_classical_cipher}」でした。

    ほとんど正解なのですが、文頭の文字列だけなぜか違った形で生成されていたようですね。リクエストの仕方に問題があるということでしょうか、、、

    気を取り直して2問目に挑戦してみます。2問目もCryptoの問題ですね。

    今回はハッシュ化される前のテキストを特定する問題のようです。ハッシュ値は基本的に不可逆と言われておりハッシュ化したテキストから元のテキストを特定することはできないとされていますが、レインボーテーブルというプレーンテキストとハッシュ値の対応表によって特定することが可能になる場合があります。今回の問題はそれを用いてハッシュ化前のテキストを取得する問題のようです。

    ではさっそくChatGPTにリクエストしてみましょう。

    却下されてしまいました。
    不可能と言いきっていますが、上記の通りハッシュ化前のテキストを入手する方法はあるといえばあるのでここはもう一声かけてみます。

    さすがに用意はないですよね、、、
    ならば

    あまりにもリクエストの規模が大きいと断られてしまうようです。
    今回の問題はChatGPTでは解決できないようなので自力で解いてみた結果、答えは「cpaw{Shal}」でした。

    最後はPPC(Professional Programming and Coding)というプログラムを組んでその実行結果をSubmitする問題になります。
    ChatGPTの特性上得意分野かと思われるので期待したいところですね。

    早速問題文をそのままリクエストしてみます。

    解説付きで具体的なコードが提示されました。(今度はいけるかも、、、)
    これを自身の環境で実行してもよいのですが、どうせなら実行結果ごと欲しいですよね。

    すごい!
    それっぽい回答が得られました。早速Submitしてみます。

    不正解のようです。
    一見正確にソート(降順)されているように見えますが問題文をよく見ると、配列の最大値は211であるにも関わらずソート後の配列の先頭が211になっていません。(210が先頭)

    問題文

    ソート後

    生成したプログラムに問題があるということでしょうか。
    先程のPythonコードをコピペして実行してみました。

    今度は配列の先頭が211になりました。(生成したプログラムの問題ではなさそう)
    生成されたテキストをSubmitしてみると、、、

    正解しました!
    やはり生成されたコード自体に問題はなさそうですね。(だとするとなぜCharGPTが出力した結果は誤りだったのか、、、)

    というところで3問解いてみましたが、ChatGPTの性能は自分の予想をかなり超えてきました。
    確かに前評判はかなり良かったので、ある程度はやってくれると思っていたのですがここまでとは思いませんでした。

    まず驚いたのが会話が普通に成立しているところです。ChatGPTが現れる前に存在した類似サービスとしてはAppleのSiriあたりが思い浮かびますが、使用できる用途はかなり限定されていたかと思います。多少会話ができるということで一時期遊ばれていた印象ですが日常的に使用されるほどのものではなかった印象があります。

    それに対しChatGPTは抽象的なリクエストでもユーザー側の意図した結果に比較的近い情報を自然な言語で提供している印象があり、話題に上がるのも頷ける精度だなと思いました。

    また、今回の検証では3問中2問が回答に非常に近い情報を提供してくれており、今後改良が進んでいけば正解を一発で弾き出すようなことも可能になるのではと思います。(2問目はChatGPTの守備範囲外かと思われるので今後も変わらないと思いますが、、、)

    即興で小説や歌詞、プログラミング、論文の作成等ができると言われているChatGPTですが現状では業務で使用できるレベルではなく、精度の高いおもちゃぐらいの認識ですが今後改良が進んでいき、人間に依頼するよりも正確なレスポンスをくれるようになれば本当になくなっていく職業がでてきたりするかもしれません。私もプログラマーの端くれとしてうかうかしてはいられないですね^^;

    かじー(エンジニア)

    かじー(エンジニア)

    おすすめ記事