仙台CTF 2020 Writeup その2
仙台CTF Writeupのその2になります。その1はこちら。
問題は後ほど一般公開されるようです。これから問題に挑戦する方はネタバレになりますので注意してください。
もし内容に不備や不適切な部分がありましたら、コメントやTwitterのDMにてご意見いただければと思います。
また競技時間5時間という短時間の戦いだったので、正答まで端折ったり、さらに当てずっぽうみたいな部分もありますが、そのあたりは大目に見ていただけると幸いです。🙇♂️
WEB1 カテゴリ
図書管理アプリケーションにて、さまざまな脆弱性を見つけるカテゴリでした。
以下、カテゴリの全体背景です。
株式会社仙台シーテーエフのWebアプリケーションを開発したことがない社内開発チームが「社内図書管理システム」を構築しました。
セキュリティ担当のあなたが、このシステムの簡易セキュリティ診断を実施することになりました。有償のセキュリティ診断ツールはありません。ツールを使わずに脆弱性を検出してください。なお、実際に脆弱性を検出できなくても、知っている脆弱性の名称を入力すれば正解にたどり着くと思いますが、自己のプライドと相談してください。
最後の1文が、、良心とのせめぎ合いですかね😅
1. 「図書検索」ページ
・「図書検索」ページの脆弱性を見つけてください。
WEBページへアクセスすると、以下の画像のようにいくつか機能(ページ)があるようで、今回は図書検索のページから脆弱性を見つける問題です。
検索ページにアクセスすると、書名、著者を入力して書物を検索できるシステムのようです。
何も入力しないと全件のデータが表示されます。
検索した文字も表示されるので、この時点ではXSSかSQLインジェクションかなぁとぼんやり想像します。
まずはXSSを疑い、scriptタグを送信してみます。
ただこちらは何も動作せず。。どうやら対策がされているようです。
次にSQLインジェクションを試します。 「"(ダブルクォーテーション)」、「'(シングルクォーテーション)」を送信してみます。
するとシングルクォーテーションを送信した際は、表示が異なる(「検索条件が不適切です。条件を見直してください。」というエラーが表示される)ようで、こちらの可能性が出てきました。
もう少し試すため、SQLインジェクションでは定番の「' AND 1 = 1 ; -- 」を送信してみます。
検索ワードとは関係なく全件のデータが表示された(正常にSQL文として実行された)ので、SQLインジェクションで確定しました。
FLAG:SQLインジェクション
2. 「図書 登録」ページ
・図書登録ページの脆弱性を見つけてください。
2つ目の問題は図書登録ページです。
このページでは、図書検索システムに書物を新規登録することができるようです。
問題1と同様に、XSSかSQLインジェクションを疑います。
XSSを試すため、問題1と同じscriptタグを送信します。
すると以下の画像のようにアラートが表示されました。
FLAG:XSS
3. 「問い合わせ」ページ
・問い合わせページの脆弱性を見つけてください。
競技中は解けなかった問題です。
メールアドレス、お問い合わせを入力し、問い合わせ送信するページです。
一通りの攻撃を試してみたのですがどれも通らなかったので後回しにし、結果そのまま解くことができませんでした。。
終了後に改めて挑戦してみました。
WEBアプリケーションでメール送信する際は、OSコマンド(system関数などでmailコマンドを呼び出す)を利用するのがままあります。
ふとこれを思い出し、「; ls」を送信してみます。(なぜ競技中思いつかなかったのか・・😭)
結果は上記画像の通りとなり、lsコマンドの結果が表示されています。
ということで、このページの脆弱性はOSコマンドインジェクションでした。
FLAG:OSコマンドインジェクション
ちなみにこの問い合わせページのソースコード(contact.php)を「; cat contact.php」で表示させてみました。
PHPコード部分のみ以下に記載します。
(snip) <?php $contact_mailaddr = $_POST['mailaddr']; $contact_inquire = $_POST['inquire']; $mail=filter_input(INPUT_POST, 'mailaddr'); // system("/usr/sbin/sendmail -i <template.txt $mail">; system("/usr/sbin/cd $mail"); $mail = htmlspecialchars($mail); $contact_inquire = htmlspecialchars($contact_inquire); echo 'メールアドレス : '.$mail.'<br>'; // echo 'メールアドレス2: '.$contact_mailaddr.'<br>'; echo 'お問い合わせ内容: '.$contact_inquire.'<br><br>'; ?> (snip)
真ん中ほどのところにsystem関数でsendmailコマンドを実行しており、この部分でメール送信させようとしているようですね。
4. 秘密の本
・このサイトの脆弱性を悪用して、“秘密の本”の「書名」を探してください。 今までの脆弱性を応用し、秘密の本を探す問題です。
通常表示されない(図書検索ページでワイルドカード指定しても表示されない)本を探す、ということは、問題1で見つかった脆弱性であるSQLインジェクションを使って、別のテーブルにある情報を表示させるのかな?と想定しました。
まずはunion句が正常に使えるか試しました。
※SELECT句で数字などを指定すると、それがそのまま結果として出力されます。また1を2つ書いているのは、図書検索システムの表示部が2列(書名と著者)ありそれに合わせるためです。
111' union select 1,1 ; --
結果は以下の通りです。
正常に動作し、検索結果に結合されてきました。
続いて情報流出させるにあたり、どのようなテーブルがあるか確認します。SQLサービス毎(mysql、PostgreSQLなど)でテーブル一覧を管理するテーブル名が異なりますので、まずはmysqlのそれで試します。
111' union select 1,table_name from INFORMATION_SCHEMA.TABLES ; --
結果は以下の通りです。
正常にテーブル一覧が返ってきました。(バックで動いているSQLサービスはmysqlのようです。)
最後のほうに、この問題用に使われていると思われるテーブルがあり、本問題では名前からsecretbookテーブルが対象になると想定します。
続いて対象のテーブルでSELECT句を実行させるため、列名を確認します。(図書検索システムの結果表示は書名と著者の2列で、secretbookテーブルが1列、または3列以上で構成されているとSELECT *で指定しても列数が合わずエラーが発生してしまうため。)
テーブル一覧確認と同様に、DBシステムで列名を管理しているテーブルがあるので、secretbookテーブルを条件にどのような列があるか確認します。
111' union select 1, column_name FROM information_schema.columns WHERE table_name = 'secretbook' ; --
結果は以下の通りです。
「author」と「title」という列が存在するようです。
テーブル名、列名がわかったので、最後にこのテーブルの内容を表示させます。
111' union select author,title FROM secretbook ; --
結果は以下の通りです。
問題なくsecretbookテーブルの中身が表示できました。(このテーブルは2列構成のため、結果的には列名の指定は不要(select * FROM secretbookでも表示可能)でした。)
FLAG:めんどうくさいWebセキュリティ
WEB2 カテゴリ
脆弱性診断の教育用に作成されたWEBページで、実際に脆弱性を見つけるカテゴリです。
1. Easy Injection
・練習用ウェブサイトでは、管理者のパスワードが脆弱な状態で保存されているようです。管理者ユーザーのパスワードを窃取できる脆弱性を探してください。
解けなかった問題です。
サイトにアクセスすると、ユーザ登録・ログイン、その後メッセージを投稿できるシステムのようです。
投稿画面と投稿検索画面の2つがあり、おそらく別のテーブルのデータ(ユーザ管理用?)を漏洩させるため、SQLインジェクションかなぁ・・と思ってましたが、時間切れで解くことができませんでした。
後から挑戦していたのですが、WEBページが落とされてしまったようで、最後まで行きつけませんでした。。
制御システム カテゴリ
仙台CTFでは恒例(?)の、制御システム問題です。
昨年も制御システムを操作する問題があり、今回はオンラインということでどうなるかなと思っていましたが、VPNを使って実現されていました。
CTFで制御システムを実際に操作できるのは(私が知る限りでは)ここだけなので、これを体験できるのはやはりすばらしいです。(物理的な装置を操作できるのはやっぱり楽しいです😊)
今回のシチュエーションは、ビルの空調システムがダウン、温度が高くなりその影響でWEBサーバが停止している、というもので、空調を制御している装置に命令を送りシステムを起動、温度を適正なものにしWEBサーバを起動させる、というのが目標です。
空調の起動状況はTwitterとTwitch(競技時間中のみ)、Zoomで実況されていました。
ビルの外観はこのように作られており、すごく凝られていました!
制御システムセキュリティ問題の今年のテーマは「ビル」です!どうなる?株式会社仙台シーテーエフ!? #sendaictf pic.twitter.com/mjv1FlkCN4
— sendaictf_icsworld (@sdctf_icswld) 2020年11月20日
ちなみに余談ですが、VPN接続すると通常のインターネットに出ることができなくなり、フラグ投入・制御システム操作をやるたびにVPN接続・切断をしないといけなく多少煩わしかったので、私は以下のような仮想マシン経由でVPN接続し常時インターネットが使える環境を作って作業していました。
1. 制御システム基礎
・照明や空調などのフィールドデバイスを制御するためのコントローラである「プログラマブルロジックコントローラ(Programmable Logic Controller)」の略称はなんですか?
制御システムに関する基礎知識を問う問題です。
各単語の頭文字をとったものです。
FLAG:FLAG{PLC}
2. 制御システム基礎2
・プログラマブルロジックコントローラに入力を与えるために人が操作するインタフェース「ヒューマンマシンインタフェース(Human Machine Interface)」の略称はなんですか?
制御システムに関する基礎知識を問う問題です。
各単語の頭文字をとったものです。
FLAG:FLAG{HMI}
3. 制御システム基礎3
・多くのビル制御システムで用いられるネットワークプロトコルは何ですか?
制御システムに関する基礎知識を問う問題です。
「ビル制御システム ネットワークプロトコル」でググりました。
FLAG:FLAG{BACNET}
4. VPN接続
・とある夜、ビル制御システム担当部門から「照明の制御システムが何者かに攻撃を受けているようだ」と連絡を受けました。
・遠隔でインシデントレスポンスするにあたり、まずはVPN経由で制御ネットワークに接続する必要があります。添付のVPN接続手順書を参考に、VPNを接続してください。
制御システム操作のためVPN接続する必要があるのですが、その接続マニュアルにフラグが記載されていました。
※とても分かりやすいマニュアルで、特に迷うことなく操作できました。
FLAG:FLAG{VPN_CONNECT_OK}
5. BEMS
・ビル制御システム担当者の話しでは、現地のHMIは攻撃者の手によりプログラムが書き換えられてしまっており、正常に監視制御ができない状況にあるということです。
・幸いにもBEMS(Building Energy Management System)向けに開発を進めていたPLCの新しいWeb UIに照明の制御を行う機能が実装されていました。
・PLCのWeb UIにアクセスし、照明の制御を奪還してください。
VPNで接続した状態で、問題文に記載されているWEBページにアクセスするとFLAGが記載されていました。
FLAG:FLAG{I_HAVE_LIGHT_CTRL}
6. FTP
・ビル制御システム担当部門から緊急の連絡が入り、サーバ室内の空調設備(PAC:Packaged Air Conditioner)も攻撃を受け、室内の温度が急激に上昇しているようです。
・サーバが熱暴走しかけているため、PACを動作させて室温を急ぎ下げなければなりません。しかし、現地のHMIは使えず、BEMSのWeb UIもPACの制御は開発中のため未対応です。
・唯一の手がかりはPACを制御した際のパケットを保存したpcapファイルがFTPサーバにアップされているということだけです。
・FTPサーバにアクセスし、pcapファイルを確認してください。
VPNで接続した状態で、問題文に記載されているFTPサーバにアクセスし、フラグをダウンロードする、というものです。
併せてPCAPもダウンロードしておきました。
FLAG:FLAG{HELP_WEB_SERVER}
7. PAC
・FTPサーバからダウンロードしたpcapを使ってPLCに命令を送り、PACを起動してサーバ室の室温を下げてください。
・サーバ室内の温度がある程度下がるとWebサーバのhttpサービスが復旧します。
念願の制御システム操作問題です!
問題6で入手したPCAPを参考に、制御システムに命令を送信し、空調を起動、温度が下がったタイミングでWEBサーバにアクセスしフラグを入手する、という問題です。
どのような命令を送ればいいかわからずにいたところ、競技時間中ごろに以下のヒントが提供されました。どうやらPCAPの通信をそのまま再送すればよいみたいです。
ICS07のヒント3:ソケット通信で送る情報はこの部分です#sendaictf pic.twitter.com/ArTz3VIiZA
— sendaictf_icsworld (@sdctf_icswld) 2020年11月21日
このヒントをもとに、以下のPythonコードを作成し、送信してみました。
import socket import struct s = struct.Struct("!BBBBBBBBBBBBBBBBBBBBBBB") data = [0x81,0x0a,0x00,0x17,0x01,0x04,0x00,0x05,0x0a,0x0f,0x0c,0x01,0x00,0x00,0x00,0x19,0x55,0x3e,0x91,0x01,0x3f,0x49,0x01] packed_data = s.pack(*data) address = ("192.168.2.5" , 47808) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(packed_data,address)
この後くらいで、空調が復帰した!と実況がありました。
(ただこの時間近辺でフラグが投入され始めたので、きなこさんもおっしゃる通り、別の方が送信したものの可能性もあります。😅)
kinako-mochimochi.hatenablog.com
空調起動に成功するとこちらのツイートのようにファンが動き始めた様子が映し出されました。
PAC起動しました!室内が冷やされていく。。#sendaictf pic.twitter.com/hTiDPQlrcQ
— sendaictf_icsworld (@sdctf_icswld) 2020年11月21日
さらに空調システムにより温度が30度以下になると、ビルが点灯しWEBサーバが起動しました。
(実況でも話題に出ていましたが、電気チカチカして働きづらそうですよね。😂)データセンター復旧しました!
— sendaictf_icsworld (@sdctf_icswld) 2020年11月21日
#sendaictf pic.twitter.com/rpAXHRNKUP
WEBサーバ起動後は以下の画像のようなWEBページにアクセスできるようになり、ソースコードにフラグがありました。
FLAG:FLAG{cctv_camP@ssw0rd}
8. CCTV
・インシデントレスポンスを進めると、攻撃者はビルの廊下に面しているEPS(Electric Pipe Space)に侵入し、不正な端末を接続、そこを起点に攻撃を行なっていることがわかりました。
・攻撃者を特定するために監視カメラの映像を確認して下さい。
監視カメラにアクセス(問題文中にアクセス先が記載)し、EPSに潜んでいる攻撃者を確認する、という問題です。
URLにアクセスするとBasic認証が問われ、一向に突破できなかったのですが、実況で問題7のフラグがヒントだ、ということで、これがそのまま認証ID・パスワードだったようです。
監視カメラにアクセスできると、画像のように攻撃者(フラグ)を確認できました。
(目が光っててちょっと怖いw)
FLAG:FLAG{THANK_YOU_FOR_PLAYING_ICS_WORLD_2020}
雑学 カテゴリ
セキュリティに関する様々な知識を問われるカテゴリでした。
1. 新しいフレームワーク
フラグフォーマットが「□□□□□_〇〇〇&〇〇」ということで、特に検索することもなく正答できました。
FLAG:MITRE_ATT&CK
2. サイバー犯罪者の実像
・2020年7月に発生した、オバマ前米大統領やビル・ゲイツ等の著名人や、Appleなど有名企業のTwitterのアカウントハッキングで逮捕された犯人の年齢の合計は?
こちらのサイトを参考にしました。
17+19+22で58です。
FLAG:58
3. DDoS攻撃を画像で見てみる
・世界で発生しているDDoS攻撃の状況(現状及び履歴)を可視化したサイトのURLは?
「DDoS 可視化 サイト」などでググり、Googleが運営する以下のサイトが答えでした。
FLAG:http://www.digitalattackmap.com/
4. 放置された脆弱性
「VPNパスワード流出 CVE」でググり、一番上に出てきた結果のCVE番号を答えたところパスしました。
FLAG:CVE-2019-11510
5. 新しい不正ログイン手法
・不正ログインを目的とするアカウント突破手法のうち、特定のパスワードに対しユーザーIDを変更して総当り的にログインを試みる手法は
「ゆうちょ パスワード 固定 攻撃」でググり、キーワードを突き止めました。
FLAG:リバースブルートフォース攻撃
最後に
昨年と同じで、今回も全問正答できずちょっと悔しい結果となりました。
問題はクオリティが高く、また個人的に好きなカテゴリであるフォレンジック問題が多めで、今年もとても楽しんで参加できました。
競技中はZoomで実況、ヒント出し、解説などが行われていたのですが、正直あまり余裕がなくよく聞けなかったのがちょっと残念でした。😣
今回もあと1歩のところで全問正答できなかった(特にWEB問が弱い😥)ので、次回大会に向け精進したいと思います!
■ 更新履歴
- 2020/11/25 新規作成