セキュリティ・キャンプ全国大会2016に参加してきました
- 2016/08/18
- seccamp
8/9~13の5日間, クロスウェーブ幕張で行われたセキュリティ・キャンプ全国大会2016に参加してきました.
講師, チューターの皆さん, 4班 “このキャンプには問題がある!” をはじめとする50名の参加者の皆さん, そして事務局や協賛企業, クロスウェーブ幕張の方など多くの関係者の皆さん, 本当にありがとうございました.
以下, 選択した講義や参加したイベントについて, 簡単な紹介と感想を書いていきたいと思います.
講義
共通講義
セキュリティで重要なのは問題を解くよりも、問題を発見する力ということで, 今年のセキュキャンの応募フォームについて, セキュリティ上問題のありそうな部分について議論しました.
具体的に上がった内容については載せませんが, 今キャンプ生の中で話題の**事後アンケート(意味深)**はまたこのWebサービスを使っているようなので, この議論の後だとちょっと不安になりますね…
後半は, 丁度講師の方が参加して帰ってきたばかりというBlack Hat USA 2016やDEF CON 24の報告がありました. CGC(Cyber Grand Challenge)は, 学校の講演会でも扱われて聞き覚えのあったクルマの自動運転のGrand Challenge等と同じDARPAが主催ということでとても気になった話題で, サイバー攻撃と防御をプログラムに行わせるというのには驚き. 今後どうなっていくのだろうという感じです.
特別講義1 ZENIGATAになりたくて
サイバーディフェンス研究所の福森 大喜さんによる講演でした. 福森さんは普段シンガポールにあるインターポールに勤めているそうで, 今回の講義のためだけに日本に戻ってきたとのこと. ヤバイ.
講演の内容は, インターポールの役割に始まり, そもそもなぜインターポールで働くことになったかという経緯の紹介, また国際サイバー犯罪の捜査に関わっているということで, 世界中の機関と協力してボットネットを潰すという映画のようなお話や, 改ざんされた政府関連機関のWebページが長い間放置されているといった笑えないようなお話まで, どれも興味深い話題ばかりでした.
でも何よりも印象的だったのは, 課題で提出したプログラムに脆弱性があると言われたのをきっかけに3ヶ月勉強したら任意のコマンドを実行できるようになった だとか, ボットネット攻撃の際に 24時間でマルウェア100体を解析したら報告スライドで世界企業とロゴを並べて紹介された といったことをいとも簡単そうにお話されていたことです. もちろんこれは今に至るまでにものすごく多くの努力をしたというお話なわけですが, もうなんかすごすぎて終始空いた口がふさがりませんでした.
特別講義2 サイバー犯罪の実態とこれに対処するための取組
レイヤー8, 人が一番危ないということで, 倫理観や正義感についてのお話でした.
既に他の受講者が書いていますが, 警視庁と警察庁の違いについての解説がなるほどなーという感じでした.
1-B BareMetalで遊ぶRaspberry Pi 入門編
Raspbianがインストールされた小型コンピュータと説明されてしまうこともあるRaspberry Piを, そういったLinux等のOSに頼らない, BareMetalと呼ばれる状態で動かしてみようという講義で, 選択した中では一番気になっていました.
低レイヤーの学び方を学ぶところから始めようということで, まず事前課題であったコンピュータの基礎知識やRaspberry Piに乗っているSoCやCPUコアの資料の探し方についての解説がありました.
ヒープメモリとスタックメモリについては今まで知らなかった内容だったので, 4-Dの事前課題とも合わせてとても勉強になりました. またここで他の受講生から “プログラムが複数動いている環境でのメモリの使い方はどうなるのか” という質問があり, 他の講師の方も交じりながらMMU(Memory Management Unit)についての解説が始まったりと, 確かに基礎ではあるけれどもそれなりに高度な内容に触れたりもしました. そういえばAPの問題集に仮想のメモリアドレスを実際のメモリアドレスに変換するみたいな内容があったなーと思い出しながら聞いていました.
後半は, リンカスクリプトやMakefileの書き方などにも触れながら, 実際にスタートアップコード, 及びGPIOを操作するプログラムを記述してLチカを行いました.
リンカスクリプトは普段見ない独特の文法で(個人の感想です), スライドを写経したつもりでもなかなかエラーが消えず苦労しました. また, GPIOを操作するためにはいくつかのレジスタの値を変更する必要があるわけですが, 今回扱うARMのレジスタは32bitも幅があり, この32桁の中から目的のビットは何番目なのか数えるのは, 慣れていないこともあって意外に時間を取られました.
それでもなんとか講義時間内にLチカすることができました. 今まで扱ったことのある8ビットマイコンより遥かに大きなマシンを動かしただけあって, この瞬間はもう感動モノでした. (写真撮っておけばよかった…)
今後はまず, 手持ちのRaspberry Pi 1 Model Bを使って同じようにBareMetalで遊んでみようと思います. また, この講義では単にRaspberry PiをBareMetalで扱う方法だけでなく, 低レイヤーの学び方を学んだわけなので, いずれは何か未知のデバイスを講師の西永さんがされたように自分で調べながら動かしてみたいなぁと思いました.
2-B 謎マシンでNetBSDのクロス開発体験
一言で言えば, mikutter on NetBSD on Raspberry Piする講義でした.
クロス開発環境の構築はそれなりに手間がかかるというイメージがありますが, NetBSDのクロス開発はftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-current/tar_files/src.tar.gzからソースコードをダウンロード&展開すれば, 後は全部build.sh
がやってくれるから簡単だよということでした.
実際にRaspberry Pi用のカーネルのコンパイル等を行いましたが, 確かにコマンド数行で済んでしまうのですごいなーという感じでした.
とはいえ, 1-Bで講師の方が言っていた 今簡単にLチカできるのは誰かがLinuxを移植したから と同様に, 今簡単にクロス開発が行えるのは誰かがその環境にNetBSDを移植したからであると思うので, 実際に謎マシンにNetBSDを移植する過程についてが少し気になりました.
3-C 脆弱性検出実践(ファジング技術と脆弱性報告)
ファジングと呼ばれる手法を用いた脆弱性検出の体験と, IPAの方による脆弱性報告についての講義でした. せっかくセキュキャンに参加したのだから, 正しい脆弱性報告の方法くらいは学んで帰りたいなということで選択しました.
ファジングは, 検査対象に問題を起こしそうなデータ(ファズ)を大量に送り込んだときの挙動を監視して脆弱性の検出を行う手法とのこと. 今回は3種類の商用ファジングツールを用いて, 講師の方が持ち込んだネットワーク機器(僕はPLCアダプタを選択しました. 懐かしい!!)に対して細工されたTCPパケット等を送りつけたりしました.
どのソフトウェアも大抵は初期設定を済まして開始ボタンを押せばあとは放置すればいいわけですが, 仮に検査対象の応答が無くなった時に問題のパケットを絞り込むのは, かなり大変な作業だなぁという感じでした. それでも, こうした検査はネットワーク機器に限らず, 実際にMicrosoft等の企業がやっているように多くのソフトウェアでも有用なのではないかなと思いました.
IPAへの脆弱性関連情報の提出は, このページを参考にメールをすればいいとのこと. 注意することは, 届け出の種類に応じて決められた様式(リンク先参照)を利用しなければいけないこと.
キャンプ前のSNS上や, 実際に講義中でも話題になったけれど, やはりテンプレートをコピーして本文を編集していくというのはあまりスムーズに行える操作ではないので, 長い間現在停止中になっているWeb届出フォームが復活すればもう少し報告しやすくもなるんじゃないかなぁと思いました.
4-D 実行ファイルの防御機構を突破せよ
Linuxに実装されているRELRO, Stack Canary, NXbit, PIE, ASLRといった各種防御機構とその突破方法について学ぶ, いわゆるCTFのpwnと呼ばれるジャンルについての講義でした.
選択した講義の中では一番難しかったなという感じです.
講義中に行われたproblem1_1
の実習, 具体的にはNX enabledかつASLR onな環境で実行されているプログラムに攻撃を行いShellを奪ってみるというものでは, 一応Shellを奪うことができたものの, 想定解であるGOTをreadで書き換えるというアイデアは思いつきもしませんでした.
とはいえ, 一番難しかっただけあって学んだことも一番多かったと感じていて, 特にLinuxの実行ファイルがスタックをどのように使っているかや, 動的リンクしたライブラリやその関数がどのように配置されるのかといったことはこの講義を受けなかったら絶対に学ぶことなんて無かっただろうと思うし, gdb
やreadelf
のようなツールの使い方をちゃんと学ぶ機会にもなったし, バッファオーバーフローが何が可能になるので危険なのかを体験することができたのはとてもいい経験になりました.
講義中Python書けないつらいつらいしてたので, 今後は自分がそれなりに触ってきた言語でpwntools相当のライブラリを実装しながらこの分野への知識をつけていこうと思っています.
5-B USBメモリからブートしてみよう
自分で書いたアセンブリ言語のプログラムをUSBメモリのMBRに書き込んでブートしてみようという講義でした.
講義の時間は85分と短く, 深いところまで入ることができなかったのが少し残念でしたが, それでも自分で書いたプログラムがブートした瞬間は思わずおぉぉ…と声が出てしまいました.
自作OSと呼べるものまではいかなくとも, いつかはキーボードの入力くらいは扱えるようにしてみたいなーと. また, これからの時代はUEFIだと思うので, その辺に関してもいつか学んでみたいなという感じです.
6-B AVRマイコンで作るBadUSB自作
PCに接続するとキーボードとして認識され, 悪意のあるキーコードを送りつけるデバイス, BadUSBを作成する講義でした.
文字列のような長い入力がなかなかうまくいかなかったり, PCの操作が必ずしも一定時間で完了するわけでは無いということで, 目的の操作を達成するのに思っていた以上に苦戦. 結局自分はWin-D -> Ctrl-Shift-N -> Enter -> Ctrl-Shift-N -> Enter… という感じにWindowsのデスクトップを表示して無限に新しいフォルダを作成する嫌がらせデバイスしか作ることができませんでした.
そうした制限の中でも, 他の参加者やチューターさんには本当にヤバそうなモノを作り上げた人もいて, 特に外部のスクリプトを引っ張ってきて実行させるというアイデアにはなるほどなーという感じでした.
7-A ID連携基礎
OAuthのようなID連携技術についての講義でした. 選択した講義の中では一つ目立ってレイヤーの高い内容ですが, 僕がプログラミングを始めて最初に書いたソフトウェアであるtwitppでOAuthを触った経験から気になっていた講義でした.
講義はまずIdentityとは何かという話題から始まります. Identityとは, Entityの集まりで, 例えば個人の名前や性別, 外見の特徴, 住所などの情報一つ一つがEntityに当たり, その集まりがIdentityという感じだそうです. なるほど. (なんとなくはわかっているのだけれど, いざ文章にしてみようとなると結構難しい概念)
そして, 携帯電話の契約を例に, なぜ携帯会社はSIMカードで個人を認証できるのかという議論に移ります. 携帯電話の契約時, 免許証のような個人を証明できる書類, すなわち公安委員会のような他の機関が発行した個人を特定できる情報(Identity)を使って個人を認証し, それをSIMカード固有の鍵を結びつけているのだと.
あーなるほど, ここでID連携技術とつながりました. 最初は受ける講義間違えたのかとも一瞬思ったのですが, 普段からID連携と同じようなことをしていたのだと. この あっなるほど となった瞬間, とても気持ちが良かったです.
後半はOAuth2, そしてそれを拡張したOpenID Connectの2つについて, それぞれのプロトコルの解説やセキュリティ上の特徴について学び, 実際にCSRFのような攻撃を体験しました.
特に, 素のOAuthに問題が見つかる -> それを解決するために拡張プロトコルや独自のAPIが増える -> OAuthを拡張したOpenID Connectができる という話は非常に興味深かったです.
脆弱性の攻撃は普段扱わない分野ということもあって少し難しかったですが, 以前から考えていたtwitppの汎用OAuth/OAuth 2.0ライブラリ化を行い, よりプロトコルに対する理解を深めた上でもう一度復習しようと思っています.
その他
チューター成果報告
キャンプ生の先輩となるチューターさんの発表.
2日目も含めて発表された方はたくさんいたけれども, 特に印象に残っているのが僕も関わっているロボカップについての発表をされた出村さん. RoboCup@Homeはルールも厳しく, Small Size Robot Leagueと比べものにならないくらい大変そうなのだけれども, 上は性別認識や音声/自然言語処理, 下はROSのドライバまで, 本当に広い分野に関わっていて本当にすごいなぁと. 僕も頑張らなくては.
少し話はそれるけれども, 今年のキャンプの参加者でロボカップに関わっている人が結構いて, 空き時間にそうした話題で盛り上がれたのは結構良かった.
2日目の晩にTwitterでも書いたこれ,
チューターさんの発表, CTF時間外にちゃんと聞きたかったなーって感じある
— とさいぬ (@myon\_\_\_) August 10, 2016
時間などいろいろ厳しかったのだろうけれど, やっぱり先輩であるチューターさんの発表はちゃんと聞きたいし, 何より発表する側からしても誰も聞いていないのがわかりきったうえでの発表は絶対気分悪いと思う. これが毎年恒例のCTF妨害コンテンツと言われているのもすごく残念だと思うので, 来年こそは改善してほしいなぁという感じです.
CTF
CTF(Capture the flag)です. 今までakictfの問題をいくつかのんびり時間を掛けて解いたことはありましたが, 制限時間内で得点を競うというのは初めてなので不安でした.
今回の競技は, 各班に与えられるネットワーク越しにのみアクセスできるRaspberry Piに対して攻撃を行うというもの.
開始前のチームミーティングでみんなWeb問題が無理というのがわかっていたので, スタートの合図とともにとりあえずnmap
. 22番が空いていたので, 開始15秒でとりあえずsshログインするぞと方針を立てました.
まさかpi/raspberry
が開いてるわけないよねーHAHAHA なんて話していたら, 入れましたよ とチームメンバー. まじかよ().
おまけに, ホーム直下にあったflagの投稿をお願いしたら, これがまさかの最速得点者で表彰されることになったりで, 正直言えばやられたって感じでした.
その後いろいろ粘りましたが, 僕はEarthの1問目のシーザ暗号で+100pt, チーム全体では300ptで7位でした.
ただ問題を解けなかったことよりは, ~/problems/
下にあったequations
, hidden
のようなx86(-64)のELFバイナリの問題を, 応募課題や事前課題である程度触っていたにもかかわらず解にたどり着けなかったのが一番悔しかったという感じです.
また, チームにCTF初めてという方がいたにもかかわらず放置状態にしてしまったのが本当に申し訳なかったです.
グループワーク
未来, 倫理, 対策, 回避の4テーマから1つを選び, 発表を行うというものでした.
4班 “このキャンプには問題がある!” は倫理を選択. これからのIT教育と倫理観 †ダークサイド†に堕ちないために というタイトルで,
- (最終目標) ホワイトハッカーのイメージを良くしよう
- IT教育云々の前に, まずは正しいIT知識が重要であるという雰囲気作りが大切
- 家族などの身近な人に協力してもらおう
- 子供が最も影響を受けるのはやはり親では?
- 小さい頃からIT機器に触れさせたり, 技術書を本棚に置いておくだけでもきっかけ作りになりそう
- インパクトのあるメディアを作ろう
- パスワード-もっと強くキミを守りたい- が話題になった
- 幅広い世代を対象に増やしていこう
- ヒーロー/ヒロインアニメ
- 劇場場 セキュリティ・キャンプ
- まんがタ○ムき○ら
という感じの発表をしました.
初日でメディアミックス戦略というアイデアは出ていましたが, なぜそれを行うのかといった方針が思うようにまとまらず時間がかかりました. また個人的な反省点として, あまりヒアリングを行うことができなくて申し訳ない感じです.
ちなみに, 4日目の晩は22:00からスライドを作成する夢を見て, 04:00頃に用を足しに起きた後, 1時間半は寝れました.
キャンプ中の生活
居室はこんな感じでした.
冷房がちょっと効き過ぎな感じあった以外はとても快適でした. 特にネット環境は自宅が悲惨故に感動するレベルで快適でした.
会場内にはいろはすが大量に転がっていて, 飲み物には困りませんでした.
また, 食堂にはジュースやコーヒー, お茶数種もありました.
おまけ
帰りに秋葉原に寄り道してました. 来るのは3.5年ぶりですね.
きました pic.twitter.com/vpGeWhGD10
— とさいぬ (@myon\_\_\_) August 13, 2016
秋月電子
夏季休業でした (◞‸◟).
千石電商
ブレッドボードは諸々の事情でいっぱいあるのだけれど, ジャンパ線を全く持っていなかったので購入. また, Raspberry Piとブレッドボードを繋ぐためにオス-メスのジャンパ線も購入.
手持ちのRaspberry Pi 1 Model BでもBareMetalで遊ぶぞ!!!
イーグルジャンプ アニメイト秋葉原支店
最高すぎて最高だった.
最後に
絶対に💪圧倒的成長💪するぞ!!!!!!