NFLabs. エンジニアブログ

セキュリティやソフトウェア開発に関する情報を発信する技術者向けのブログです。

DEF CON CTF 2022 予選参加レポート

はじめに

株式会社エヌ・エフ・ラボラトリーズ入社1年目の市岡です。

この度、DEF CON CTF 2022の予選に「Team Enu(※)」として参加してきました。
※NTTグループ有志によるCTFチーム

参加メンバーと事務局の総勢33名でチームを結成し、48時間に及ぶ戦いに挑みました。
私は事務局として参加者をサポートする傍ら、問題にもチャレンジしておりました。

結果は、決勝進出には至らなかったものの世界の強豪477チームがひしめくなか28位の成績をおさめる事ができました。

問題の難易度が非常に高く、私はポイントを取ることができませんでしたが、先輩社員の方々の技術力の高さを感じ、自己研鑽活動を頑張りたいと強く思いました。

本記事は、「Team Enu」のDEF CON CTF 2022予選参加を主に事務局の視点からまとめた参加レポートです。


DEF CON CTFの予選とは

DEF CON CTFは毎年夏に開催されるセキュリティコンテストです。DEF CON CTFに参加するためには、DEF CON CTFの予選で上位になる必要があります。DEF CON CTFは世界最難関のCTFと言われており、予選通過だけでもかなりハードルが高いです。

CTFはセキュリティ技術を競うゲーム形式の競技会であり、世界中で行われています。今年のDEF CON CTF予選はJeopardy形式で出題されました。

競技時間は48時間あります。
競技開始時はほとんどの問題がロックされています。どこかのチームが指定された問題を解くと、新しい問題がアンロックされ、解けるようになります。
競技では、解いた問題ごとの得点の合計値を競います。問題ごとの得点は解いたチーム数に応じて低くなってしまいます。

高い得点を取るには他のチームが解けない問題を解く必要があります。高い得点ほしさに難しい問題に取り組むか、多くのチームが解けている問題に取り組むかの判断の難しさがあります。

下の画像は競技開始時の問題一覧の画面です。燃え盛っている問題をどこかのチームが解くと、新しい問題がアンロックされます。


準備

「Team Enu」では、チームとしてCTFで戦う会場と環境を用意しています。
感染症の関係で会場を用意するのは3年ぶりだったそうです。
今年はNFLabs.の本社(シーバンス)に会場と環境を用意しました!

競技に参加する方々にとって最高の環境を用意したい、という気持ちを持って、会場と環境の準備を進めました。

参加される方に希望を伺ったり、会場のレイアウトを話し合ったりしていました。

また、しおりも作成し、会場への道順や準備物などを記載しました。
学生時代の合宿を思い出しました!


準備での主な工夫

「集中できるけど、みんなでイベントに参加している雰囲気をオンライン・現地の双方に味わってもらえる」ことを目標に主に以下の3つの工夫を行いました。

1. oViceでライブ配信
oViceというバーチャル空間を提供するサービスで、会場の様子を流すことで、オンラインの人とつなぎました。
オンライン参加の方から会場の様子を見ながら、問題に取り組んだとの声もありました。

2. 机の配置を集中できるけど、みんながいる感じにする
机の向きを交互にしました。これにより、他の方は見えるけど、目は合わないという絶妙な感じになり、集中できるけど、みんながいる感じになっていました。

3. イベント感(スコアボード)
当日は問題一覧の画面をスクリーンに投影していました。これによって、(上位に食い込めば)順位が分かったり、解けている問題と解けていない問題が見えたりします。現地開催でイベントやるときは、スクリーンに点数や順位が出ている場合が多いと思うので、イベントの臨場感を出すのに大きく貢献していたと考えています。

また、安心して競技に集中できるように、入室時の検温、換気、共用部のアルコール除菌等の感染症対策も実施しました。

コンテスト本番

問題の紹介

ここでは、簡単な問題(mic check1)とTeam Enuで議論が白熱していた問題(router_ni)を紹介します。

mic check1

まずは簡単な問題の紹介です。(相対的に簡単だっただけで、私は簡単ではないと思っています。)
私が他の方のWriteUpを読みながら、唯一解けた問題がこれです。

mic check 1
Prompt
nc simple-service-c45xrrmhuc5su.shellweplayaga.me 31337


Ticket
This challenge requires a ticket to connect. Your team’s ticket is:

ticket{Cormora****wcXk}
This ticket and the flag are traceable to your team. Do not share it with other teams, and do not try to submit a flag from another team.

この問題では、サーバに接続すると足し算の問題が表示されます。

 % nc simple-service-c45xrrmhuc5su.shellweplayaga.me 31337
Ticket please: ticket{Cormor...

560595781 + 1853574705 = 

これに約2秒以内に答えないとTime's upって表示されます。計算が速い人は手で行けるかもしれませんが、私には無理だったので、プログラムを書きました。

import socket
import pprint

host = "simple-service-c45xrrmhuc5su.shellweplayaga.me"
port = 31337
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #オブジェクトの作成をします

client.connect((host, port)) #これでサーバーに接続します

message = "ticket{Cormora****Xk}\n"

data = client.recv(300) #ここで「Ticket please: 」が受信される
client.sendall(message.encode()) # チケットを送る
data = client.recv(300) # 計算式「560595781 + 1853574705 = 」が送られてくる
client.sendall((str(eval(data.decode()[:-2]))+"\n").encode()) # 最後の2文字「= 」を取り除いてからeval関数(文字列をプログラムと認識して計算してくれる関数)に入れて、計算結果を送信する
data = client.recv(300) # フラグが返される
pprint.pprint(data.decode()) # フラグを表示する:この表示をコピペしてフラグゲット!
router_ni

router_ni
The flag is in the RAM. You are lucky that a router does not have that much RAM!


Leak it.


Updating the router's firmware will possibly brick the router and will not get you this flag.
Don't do it.

この問題のURLにアクセスすると、ルータの管理用のWeb UIが表示されます。

ありがちなパスワードであるadmin/adminでログインすると、以下の画面があります。

  • ルータのステータス
  • パスワード変更
  • pingの死活確認
  • ファームウェアの更新

このうち、pingの死活確認のページにはURLにid=数値が含まれていました。idは /ping を実行した結果が保存されているidになっていました。このpingの結果を表示する際にIDがping結果を格納する領域の境界を越えていないかチェックされていませんでした。idを大きな値にすると本来読めてはいけないメモリ領域が見えてしまいました。

そこで、IDを変えながらアクセスする総当たり攻撃をすると、idが18446744073709551507と18446744073709551508にフラグがありました。

下のテキストは、/ping?id=18446744073709551507のレスポンスで得られたバイナリをstringsコマンドで可読部分だけ表示させた結果です。

AWAVAUATUH
D$8H
D$(H
T$(H
T$8H
T$0I
]A\A]A^A_
AWAVAUATUSH
t$`H
D$0H
t$xH
l$@H
|$@L
|$PL9
|$@L9
[]A\A]A^A_
ATUH
(]A\
AVAUATUSH
FLAG{r0uH
ter_p0rtH
als_are_H
ultimateH
ly_impenH
etrable_H
because_H
they_areH
_real_weH

その他にも暗号、ルータ、Flutter、迷路等の多数の問題が出題されました。
詳細は公式WriteUp(https://github.com/Nautilus-Institute/quals-2022 ) をご覧ください。

差し入れいただきました!

各社の経営陣やマネージャから様々な差入れが届きました!

差入れを囲んで解法の話や近況報告などの会話が弾んでいました。


振り返って

DEF CON CTF 2022の予選に参加することで、CTFに会社で参加するときの雰囲気や流れを見ることができました。事務局では、イベントを企画運営する際の心構えやポイントを実際に経験でき、勉強になりました。

今年は、私にとっては歯が立たない問題ばかりで、議論内容にもついていけなかったのですが、来年こそは一分野だけでも会話内容を理解できるくらいの実力をこれから身に着けたいと思いました。

予選には人数制限がないので、興味のある方は来年度にぜひ参加するのはいかがでしょうか?