8/8 ~ 8/13までIPA、経産省が主催する セキュリティ・キャンプ2016 全国大会 に参加してきた。
かなり勢いに任せて短時間で書いてしまったところがあり推敲とかしてないですが、某 顔を模した本の会社の偉い人がDone is better than perfect.
なることを言っていた気がしたりしなかったりするので上げます。
DAY 0 - 8/8
前泊のため1日前から長野を出て特急あずさで新宿に向かった。寝てて気づかなかったけど到着が1時間ぐらい遅れたらしい。
ホテルのインターネット環境が基本有線なのと 講義でも使うということだったので、海浜幕張駅に着いてからバスで幕張イオンモールに移動して Thunderbolt to Ethernet アダプタを購入した。
この近辺バスが充実していて無料で駅からモールまで移動できた。
Ethernetアダプタ買い
— すらいむ (@taiyoslime) 2016年8月8日
ノジマ改装中でガラガラで危なかった…… pic.twitter.com/X71hrZ3g3T
21:30過ぎくらいに会場に到着した。
完全勝利 pic.twitter.com/oxzB9JhIkK
— すらいむ (@taiyoslime) 2016年8月8日
ホテルはここに5日間泊めさせてもらってもいいのか…?というぐらい居心地がよく快適に過ごせた。ポットや空気清浄機もあり初日はそれらと戯れてた。お茶美味しかった。
有線LANですがいまのとこ下り85Mb/sぐらいでてるので、自宅よりも3倍くらいはやいです pic.twitter.com/rcfuTFfPBB
— すらいむ (@taiyoslime) 2016年8月8日
これ正しくは Mbit/s です(目がついていなかった)
DAY 1 - 8/9
7:30ぐらいに起きて、前泊組の方たちと朝食をとったあとは部屋でゴロゴロしていた。
朝飯食ったら眠くなったし寝よ
— すらいむ (@taiyoslime) 2016年8月8日
そろそろ参加者がちらほら到着しただろうという頃合いを計ってのそのそ部屋から出て下に降りると、既に多くの方が名刺交換を始めており一気に眼が覚めた。
受付開始、参加者同士で名刺交換会! #spcamp #seccamp pic.twitter.com/1HrRkJtdXd
— セキュリティ・キャンプ (@security_camp) 2016年8月9日
昼食をとり、開講式があったところで初めての講義が始まった。
まず、共通講義としてセキュリティの基礎を学び、そのあと特別講義として最前線で活躍されている2名の方のお話を伺った
Cyber Defense Instituteの福森さんから「ZENIGATAになりたくて」
特別講演は、福森 大喜さんより「ZENIGATAになりたくて」
— セキュリティ・キャンプ (@security_camp) 2016年8月9日
福森さんは、いつもは、シンガポールで仕事をされています。 #spcamp #seccamp pic.twitter.com/262HY1ume0
福森さん「Binaryできる人間はWebもだいたいできるけど、Web専門の人でBinaryできる人はなかなかいない」
精進せねば…..。
JC3の間仁田さんから「サイバー犯罪の実態とこれに対処するための取組」
特別講演は、間仁田 裕美さんより
— セキュリティ・キャンプ (@security_camp) 2016年8月9日
「サイバー犯罪の実態とこれに対処するための取組」 #spcamp #seccamp pic.twitter.com/iDlD5LKz88
セキュリティに対する具体的な警察の取り組みはあまり認知されていない気がして非常に面白かった。
コンビニツアー
キャンパーの外出は一日の終わりにコンビニにいくこと以外は許可されていなかった。
コンビニツアーの戦利品です pic.twitter.com/6L2PG47gC7
— すらいむ (@taiyoslime) 2016年8月9日
しんさくさんが「コンビニのレジにDDoSやめろ」と言っていたのが一番面白かった。
この日を最後にキャンプ終了まで外気に触れることはなかった。
DAY 2 - 8/10
この日から専門講義が始まった。
1-A HTTPプロキシ発展
Burp Suiteはブラウザやスマホ、サーバーからの通信を中継し解析・改変するLocalProxyツールの一つで、今回は主にこれを講義で使った。
まずは基本的なProxy
,Repeater
,Extender
等のタブの使い方を学び事前課題のをおさらいをした後、Burp Extender
と呼ばれるBurpの拡張機能をJavaで書いた。
選択肢としてはJythonやJRubyでもできるのだが、今回はおとなしくJavaを書くことにしたが案の定とても辛かった。
Proxy画面でタブを一個増やし、base64で暗号化された通信を自動でデコードし、改変したリクエストを自動でエンコードして送るというプラグインを作った。
そして、これを用いてスマホアプリの通信をキャプチャしリクエストを自由に書き換えて脆弱性を突くという演習をする形になった。
今回はキャプチャする上で手元マシンのDNSとHostの設定をする方法をとったのだが、Mac機が私だけだったためfakeDNS.exe
を動かすためにmfc42.dll
入れてwineで動かしたり、なんかうまくいかないと思ったらMacのFirewallがオンになってたりで満身創痍だった。
Burpについての知見も深まり非常に楽しめた。
2-B 謎マシンでNetBSDのクロス開発体験
NetBSDは、ひとつのソースツリーで少なくとも58以上のアーキテクチャをサポートしているUNIX互換OS。
Windows 10上のVMでNetBSDを起動させ、そこでRasberryPI用のカーネルをクロスビルドした。
$ cd /usr/src $ ./build.sh -j 6 -u -U -m evbarm -a earmv6hf tools $ ./build.sh -j 6 -u -U -m evbarm -a earmv6hf kernel=RPI
結構時間かかるので気長に待ったあと、できたnetbsd.bin
をRPI用のメモリカードのの/boot/kernel.img
に書き込んでカーネルをアップデートする。(後に調べたところ、このあたりに詳しく乗っている:https://wiki.netbsd.org/ports/evbarm/raspberry_pi/)
HDMIとUSBキーボード・マウス、LANケーブルをさしてRPIを起動して
勝手にメモリカードがのルートパーティションを自動調整するので待った(結構時間がかかった)ところ、NetBSDが無事起動した。
startx
でicewm
を起動してそのあとmikutter
を起動した。Rubyの通信のためにNetBSDのセキュリティ機構を切る必要があった。
Tweet from mikutter running on NetBSD #seccamp
— すらいむ (@taiyoslime) 2016年8月10日
初代RasPi上のNetBSDでMikutterを動かしています #seccamp
— すらいむ (@taiyoslime) 2016年8月10日
mikutterや柚子胡椒ステッカーだったりを頂きました。
NetBSDの講義でえびはら先生にmikutterのステッカーと柚子胡椒ステッカーを頂きました#seccamp pic.twitter.com/hJZROa5LZH
— すらいむ (@taiyoslime) 2016年8月21日
CTF
形式はJeopardyでもなくAttack & Defenseでもなく、一台のRPIへ接続して問題を解いていくという形式だった。
最初チームはひたすらブラウザ(80)のみを見ていたがnmapしたらあと4つぐらいポートが開いてて言葉にできない感情が沸いてきた。
それに時間かけた割にWebが1問も溶けなかったは痛かった。
確かチームは5位だったのだが経験不足が露呈する感じになってしまった。
DAY 3 - 8/11
3-A Webアプリケーションの脆弱性の評価と発見
前半では、脆弱性の発見のメソッドやTipsを学び 実際のサイボウズで使われていた製品の脆弱性を検証したりした(詳細は公開できませんが)
また、脆弱性評価システムのCVSS v3という手法を実際に手を動かしながら学んだ。(https://www.ipa.go.jp/security/vuln/CVSS.html)
これは幾つかの評価基準に基づき脆弱性の脅威を算出するという方法で
今回は基本評価基準 (Base Metrics)、現状評価基準 (Temporal Metrics)、環境評価基準 (Environmental Metrics)のうち、脆弱性を公表する組織がその脆弱性の深刻度を表すために評価する基準である基本評価基準を計算した(計算はめんどくさいので便利Webツールを使う)。
基本評価基準では幾つかの評価基準となる項目と、それぞれの項目に対応する選択肢が用意されている。
評価基準となる項目は
- 攻撃元区分 ( ローカル / 隣接 / ネットワーク )
- 攻撃の複雑さ ( 高 / 中 / 低 )
- 攻撃前の認証可否 ( 複数 / 単一 / 不要 )
- 機密性への影響 ( なし / 部分的 / 全体的 )
- 完全性への影響 ( なし / 部分的 / 全体的 )
- 可用性への影響 ( なし / 部分的 / 全体的 )
となり、これらの評価値を計算して指標とする。
複雑さ等、主観的な要素が入ってしまうのではないかと最初考えたが、組織内で明確な分類基準を作っておけば問題ないようだ。
実際にあった脆弱性に対して具体的に評価を行い、内容はここでは伝えることはできないが脆弱性評価において実践的な体験をすることができた。
4-C オンラインゲームアタック&ディフェンスチャレンジ
Capture the Frog!(カエルを捕まえろ!)という用意されたNode+Websocketで実装されたWebオンラインゲームの運営とプレイヤーに分かれてAttack & Defense形式の競技をした。
プレイヤー側は操作を自動化したり脆弱性を突いてアカウントを効率よく育て、運営側は脆弱性の修正や不正アカウントのBAN(但し時間での回数制限あり)を行う必要がある。
私は2回戦ともプレイヤー側として参加した。
あった脆弱性・バグとしては
実際の「盤上を1マスずつ動いて前後左右のカエルを捕まえレベルを上げていく」というルールに対して
- levelupイベントをサーバーに直接emitすると無条件でレベルがあがる。
- キャラクターの移動は前後1マスずつであるが、任意の位置に移動することができる
- 捕まえるカエルの位置情報さえ判れば無条件に捕まえられる。
あと個人的に思ったことは
- マップやキャラクターの情報を持つオブジェクト、その他関数全部がグローバルに展開されている。
ということがあった。
これらは1回戦で大方修正されたため
2回戦ではヘッドレスブラウザを使ってプレイヤーの動きをシュミレートし自動化するプログラムを書いていた。
が、運営側がこれを止めるため、一つの処理のたびに1秒程度間隔を取るような仕様になったため
自動化したスクリプトを動かしていたがあまり手作業と時間がかわらずじまいになった。
自分が運営だったらおんなじことをしそうなので何も言えない。
5-B USBメモリからブートしてみよう
配られたUSBの初期状態がMBR方式だったため、第1パーティションのPBRに自作プログラムを置き、MBRのパーティションのフラグを改変(0x80だった気がする)したものを上書きした。
Macは諦めて、Windows10のセキュアブートを無効化しLegacy Boot Orderをオンにして先ほどのUSBをぶっ刺し無事OS抜きのHello Worldができた。
DAY 4 - 8/12
6-A 次世代プラットフォームのセキュリティモデル考察
前半はElectronアプリの脆弱性について。
Electronはメインプロセス=>node.js、レンダラプロセス=>Chromium + node.jsのため通常のWebアプリのセキュリティ対策に加えローカルアプリにおける注意も必要になってくる。
演習用のElectronアプリで脆弱性を探した。
通常のWebアプリにおけるDOM-based XSSと異なる部分は、Electronの場合Nodeの機能が使えてしまい(例えBrowserWindow
生成時にwebPreferences: { nodeIntegration : false }
としても、XSSで<webview nodeintegration .... >
を流しこんだり、window.open
してnodeIntegration=1
を付与すれば終わり *1 )アプリを使っているユーザーの権限で任意のコードが実行できてしまう。
実際にinnerHTML
に
<img src=# onerror="require('child_process').exec('xcalc', ()=>{})">
みたいな感じのものを流し込んでで電卓を起動させることができた。
またWebviewに関するXSSだと広告等で任意コード実行される危険性もある。
その他に実習で使ったアプリではshell.openExternal
を使った脆弱性もあった。
後半はWebとネイティブのつなぐ技術のお話
Webとネイティブアプリの欠点を補う手段として、JavaScriptとネイティブプログラムを相互につなぐ機構を導入して、Webに足りない機能はNative言語で実装してJSから呼び出す、という形のアプリが増えてきた。
例えば、Password Manegerのように、Webviewでフォームが登場したときにJSを注入しパスワード等を自動入力するような活用事例がある。
実際にパスワードマネージャーを模した攻撃対象のアプリが配られ脆弱性を探す作業をした。
アプリではiOS(Natibe)=>JSにevaluteJavaScript
、JS=>iOS(Native)にWKScriptMessageHandler
、を使用していた。
このようなアプリケーションに存在し得る主な脆弱性としてOrigin Validation Error、Frame Confusion、JavaScript Injectionがあるので、これらをうまく使った偽のサイトを構築しパスワードを入力させ奪取した。
7-B 組込みリアルタイムOSとIoTシステム演習
GR-PEACH上のTOPPERS/ASPカーネルでリアルタイムOSのプログラミングをした。
内容あるのとかなり知見が得られたので後日Qiitaに別記事で投稿でもしようかなと思っています。
ひたすら仕様書やカーネルのコードを読んで挙動を予想・把握する経験をしたのは初めてだった。 かなり新鮮だった。
DAY 5 - 8/13
グループワーク(後述)の発表があった。
実機がLibreOfficeしか入っていなかったようでメンバーが作ってくれたPowerPointのプレゼンがうまく動かなかったのが心残りではある。
クロージングも終わり、最後にプレゼントとして3つ本を頂いた。
本当に5日間あっという間に終わってしまった。
グループワーク
- 【未来】10年後のIT社会のセキュリティのあるべき姿
- 【倫理】子どもたちに正しくIT技術を身に着けさせるために
- 【対策】小規模企業におけるセキュリティ対策
- 【回避】攻撃者に狙われないために何をすればいいか
のテーマでキャンプの期間でグループで議論を深めたり、チューターや講師の方にお話を伺ったりした成果を最終日に発表するという形だった。
私達は2つ目の【倫理】子どもたちに正しくIT技術を身に着けさせるために
を選択した。
少ない睡眠時間を削って資料を作ったり、講義の合間を縫ってヒアリングをしたりでかなり逼迫したスケジュールだった。
生活とか
- 朝弱いくせに夜更かししてしまい一回寝坊をした。
- 恐らく少数派であるご飯が足りない人間だったので、野菜をおかずにして白飯だけおかわりしていたところ色々な人に写真を撮られた。
食事です pic.twitter.com/Pb0WMqXqeG
— すらいむ (@taiyoslime) 2016年8月12日
頂いたもの
このような感じです。
頂いたものです#seccamp pic.twitter.com/oPBqvSBhJq
— すらいむ (@taiyoslime) 2016年8月21日
感想
小学生の作文の感想みたいだが
「楽しかった」
本当にこれに尽きる。これ以上の言葉が見当たらない。
今後もどんどん忙しくなるとは思うが、CTF/セキュリティの勉強も少しずつ進めていきたいと強く思った。同年代で、同じ志をもつ方とつながりをもつことができたも非常に大きい。チューターの方という技術面だけでない憧れの存在もできた。
なんにせよ自分の行動体系が基本締め切り駆動なので、今後小さな目標を見つけどんどんこなして行ければと感じる所存。
このような機会を提供してくださったIPA、総務省及び協賛企業の方々には本当に感謝してもし尽くせない思いです。本当にありがとうございました。
*1:最近は改善されたので、レンダラプロセスでnodeが再活性化されることはほぼないみたい