先週開催された SECCON 2018 でのCTFで、プログラミング/システム管理に関するクイズを出題しました。一見すると「え?そんなの不可能では?」と思われる内容の詰め合わせです。その際に使用した環境を再構築するための tar ball が公開されていますので、興味のある方はお試しください。ヒントは server5-hints.txt に、想定解法は steps.txt に書いてあります。
SECCON 2015 オンライン CTF のときはガチガチに制限された環境でしたが、今回は King Of the Hill 形式の攻防戦ということで、できるだけ制限の緩い環境で遊んでもらうことにしました。以下が、使用した CaitSith のポリシーです。 strace 等を使うと一瞬で正解できてしまうので、 CaitSith の他に、 ptrace を制限するモジュールも併用しました。
POLICY_VERSION=20120401 quota memory audit 16777216 quota memory query 1048576 quota audit[0] allowed=0 denied=1024 unmatched=0 10 acl execute task.uid=10000-100000 audit 0 10 deny path.perm=setuid 10 deny path.perm=setgid path.gid!=1000-1007 20 allow 10 acl read path.fsmagic=0x9FA0 task.uid=10000-100000 path.uid=10000-100000 task.uid!=path.uid audit 1 10 deny 10 acl environ task.uid=1000-65535 audit 0 10 allow name="_" 10 allow name="COLLECT_GCC" 10 allow name="COLLECT_GCC_OPTIONS" 10 allow name="COLLECT_LTO_WRAPPER" 10 allow name="COMPILER_PATH" 10 allow name="HOME" 10 allow name="LANG" 10 allow name="LESSOPEN" 10 allow name="LIBRARY_PATH" 10 allow name="LOGNAME" 10 allow name="LS_COLORS" 10 allow name="MAIL" 10 allow name="OLDPWD" 10 allow name="PATH" 10 allow name="PWD" 10 allow name="PYTHONINSPECT" 10 allow name="SHELL" 10 allow name="SHLVL" 10 allow name="SSH_CLIENT" 10 allow name="SSH_CONNECTION" 10 allow name="SSH_ORIGINAL_COMMAND" 10 allow name="SSH_TTY" 10 allow name="TERM" 10 allow name="USER" 10 allow name="XDG_RUNTIME_DIR" 10 allow name="XDG_SESSION_ID" 10 allow name="LC_CTYPE" 10 allow name="LC_ALL" 10 allow name="LC_NUMERIC" 10 allow name="LC_TIME" 10 allow name="LC_COLLATE" 10 allow name="LC_MONETARY" 10 allow name="LC_MESSAGES" 10 allow name="LC_PAPER" 10 allow name="LC_NAME" 10 allow name="LC_ADDRESS" 10 allow name="LC_TELEPHONE" 10 allow name="LC_MEASUREMENT" 10 allow name="LC_IDENTIFICATION" 10 allow name="LANGUAGE" 10 allow name="XMODIFIERS" 10 allow name="HOSTNAME" 10 allow name="LINES" 10 allow name="MAN_NO_LOCALE_WARNING" 10 allow name="MAN_ORIG_LESS" 10 allow name="LESSCHARSET" 10 allow name="COLUMNS" 10 allow name="MAN_PN" 10 allow name="GROFF_BIN_PATH" 10 allow name="HISTSIZE" 10 allow name="LESS" 20 deny |
さて、1日目の競技が終了した時点で、チームDCUAから「問題サーバにバグがある」という指摘がありました。 /bin/seccon_login を root:seccon で 4710 にしていたのですが、 seccon ユーザのパスワードが既知なので、 su - seccon で再び seccon ユーザになってから環境変数 SSH_CONNECTION を書き換えて /bin/seccon_login を実行することにより、任意のチームとしてログインできてしまうという指摘でした。
なりすましログインにより他チームが解いたクイズの答えを盗み見たり、自チーム以外はじゃんけんに参加しないようにしたりすることができてしまうため、事実上サーバ5を占拠し続けることができてしまうバグです。
普通はセキュアOSをガチガチに固めるために使用するものですが、今回はできるだけユルユルに使うことを目標としていたため、sshログイン以外の方法で seccon ユーザになれるということを見落としていたのです。そのため、2日目の競技開始前に、クイズに不要な setuid / setgid プログラムの実行許可を与えないようにするというポリシー修正(上記の 10 acl execute task.uid=10000-100000 エントリ部分の追加)を行いました。
まぁ、攻防戦としては「気づいたもの勝ち」という点で、なりすましができるままにしておいたほうが面白かったかもしれませんが。