ACCE55_DE21ED

競プロとCTF

Paken CTF 2020 運営記

1. 概要

10/30 〜 11/1 に筑駒文化祭2020「彩雲」に合わせて Paken CTF 2020を開催しました。

158人110チームからの参加、うち96チームが得点、合計2118件の提出という事で予想以上に参加して頂いてとても嬉しいです。

コンセプトはCTFをやった事がない競プロerなどに楽しんでもらう事でしたが、楽しんでもらえたでしょうか?

運営は中3の私 defineと高1の kenkenken2004 氏、Writerは他にThistle, capra314cabra, autumn_eel, aspiです。サーバーの管理は私が担当しました。

作問は私がpwn & kyoproをメインに、kenkenken2004氏が Crypto, Forensics, OSINTメインという感じです。

私自身CTF初心者でAWSサーバーを建てた事もなく、色々な文献を漁りながら手探りでやっていました。知識不足で色々と重大な事故を起こしかねないようなインシデントも起こしてしまったので、自戒の念も込めて運営記を書こうと思います。

2. CTF開催の経緯

昨年までパ研は競プロ傾倒だったので、今年からはアルゴリズム班・セキュリティ班・CG班などに分かれて活動しています。その1つであるセキュリティ班で今回CTF開催をするに至りました。そこまでの経緯を簡単に紹介します。

2.1. 9/29

文化祭でPaken CTF開催してみない?という流れになりました。この時点では、pwn はサーバーに侵入されたら怖いからやめよーみたいな感じでやる予定はありませんでした(伏線)。

2.2. 10/7

開催するCTFをPaken CTFと名付けて、具体的にスケジュールなどを作成しました(なお、全く守れなかった)。技術的には、AWSで開催しようくらいまでは決まっていました。

ここら辺からちょっとずつ作問を始めて行きました。

2.3. 10/11

AWSのEC2を建てるにはクレジットカードが必要な事に気づきました。そこで、顧問の先生にクレジットカードでサーバー費の立て替えを依頼しました。

2.4. 10/21

本来ならとっくにサーバーを建て終わってる予定だったんですが、クレジットカードの話が難航してサーバーを全く建てられておらず、サイトに問題と解説を載せるだけになる可能性も示唆されました。

2.5. 10/24

なんとか先生にカードを入れて頂き、ここからサーバー作業スタート。

AWSでCTFの大会を開催するまでの道のり - アオカケスの鳥かご に沿ってどうにかサーバーを建てました。極度感謝!

というか、ここからよく本番に間に合ったなって感じですね。

2.6. 10/27

xinetd と chroot を使えばサーバープログラムを安全に、簡単に動かせる(伏線その2)事を知りpwnなどのインタラクティブ系の作問を開始しました。遅すぎ...

chrootとxinetdで脆弱なプログラムを動かす - mrtc0.log

2.7. 10/30

当日、文化祭で出かける直前になってclarをFLAGと同じフォームで提出はヤバイと気づきDiscordサーバーを建てました(英断)。

3. pwnの運用

pwnの運用について軽く自分のやった方法を紹介します。良いか悪いかは置いといて。

プログラムと同じ場所にflag.txt , /lib, /lib64と必要な /binを置いてchrootするのをxinetdでやって運用しました。これ、libのコピーで1問ごとに1GB弱食うのでもうちょっといい方法無いですかね?Docker何も分からん

4. 事案集

今回私は色々やらかしてるんですが、その中でもトップ3を紹介します。

4.1. スタート時間を間違える ヤバイ度 ☆☆☆☆★

文化祭のスタートは9:00だと思ってCTFもそれに合わせたんですが、実際は9:30でした。

これは大して問題ではありませんでした。

4.2. サーバーを落とす ヤバイ度 ☆☆★★★

10/31 15:45〜16:10 くらいまでサーバーを落としてしまいました。

落ちる前からだんだんSSHでの操作が重くなっていたのは分かっていたんですが、pwnの接続テストをしたら全く動かなくなりました。

後述の4.3の対応中で、SSHも繋がらない状態になったのでかなり焦りました。結局、EC2のインスタンスを再起動したら直りました。めでたしめでたし。

4.3. サーバーのrootを取られる ヤバイ度 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

はい、サーバー乗っ取られました(伏線回収)。これ乗っ取った人がいい人だったので取ったどー(意訳)って親切に教えてくれたんですが、ヤバイ人だったら完全にサーバー壊されてましたね。

Discordの参加者サーバーで「スコアサーバーの管理者に連絡がある」という事で何かを察し、恐る恐るDMを見ると「root取ったどー(意訳)」だったのでマジで心臓止まるかと思いました。

pwnの"libc"という問題でシェル取った後悪さができないようにbinの中身を疑似シェルだけにしてたんですが、なぜかchrootできたっぽいんですよね。なんでだろ?しかも脆弱性のあるプログラムを動かすのに使ったchrootはプログラムもrootで動くので、chrootもう1回するとchroot抜けられるという... 結局、プログラムを実行前にsu ctf(一般ユーザー)して解決しました。

root取られた事でFLAGも全て見れる状態になったようで、スコアサーバーと問題サーバーは変えた方が良いとアドバイスを頂きました。ちなみに、root取っても普通に問題は解かれていたそうです。

執行部内で話したら爆笑してましたが、これで事故起こしてたら笑い事じゃ済まないんですよね。 皆さん、権限不備には気をつけましょう!!

5. 良かった所

AWSなどサーバーに関する知識を色々と学べた事、何よりもCTFを実際に開催する事ができたのは非常に良かったと思っています。

あと、直前ではあったんですがpwnなどのインタラクティブ系の問題を出せたのも大きかったです。元々なしの予定だったので...。pwnのないCTFは面白くないですしね!

6. 反省点

これはアンケートで多く意見を頂いた事なんですが、guess問が多すぎるという事です。これは主にCryptoの話なんですが、実は私kenkenken2004氏作問の問題をほとんど解いていませんでした。解いてないというか解けないという感じなんですが。全完されて焦ってレビューなしでバンバン問題を上げてしまった事で、かえってクオリティを下げる結果となってしまったかなという感じです。逆に、pwn問やkyopro問は私以外ほとんど解いてない状況だったのでこっちも然りです。

あと、サーバーのセキュリティがガバガバ過ぎた事は猛省です。セキュリティの知識が欠如している状態でパブリックなサーバー、しかもpwnサーバーを運用するのはかなり危険。

「疑似シェルしか立ち上げられないし、rootで動かしてもヨシ!」は本当にダメ。

今回、身を持ってセキュリティの重要性を実感する結果となりました。今度また開催する時があれば、今回の反省を活かしたいと思います。

7. 感想

なんやかんやありましたが、全体的には大きな事故なく上手く行って良かったと思います。これを機に、CTFに興味を持って頂けたらこれ以上嬉しいことはありません。

文化祭も終わったのでもうJOI精進期間ですね。春合宿が終わったらまたCTF再開しようと思います。