1日ひとつだけ強くなる

おべんきょうのーと

セキュリティ・キャンプ全国大会2017に参加した

はじめに

8/14〜8/18の5日間、セキュリティ・キャンプ全国大会2017に参加して来ました。

会場は府中刑務所の近くにあるクロスウェーブ府中というところです。

ご飯とか生活環境等の話は他の参加者がブログに書いてある通り、とてもいいです。大して特筆する点はないので割愛します。

公式のアカウントもご飯の写真とか呟いてるし、そういうの気になる人はそっちを見たらいいんじゃないでしょうか。

twitter.com

セキュリティ・キャンプってなに

www.ipa.go.jp

簡単にいうと、全国の22歳以下の学生が集まって情報セキュリティについて4泊5日学びます。

参加するには応募用紙を書いて合格すればいいです。いろんな人が応募用紙を公開しているので、調べれば出て来ます。僕のはこれです。

hal0taso.hateblo.jp

選んだ講義

とりあえず先にどの講義をとったか書いておきます。

  • D1 Linuxカーネルを理解して学ぶ 脆弱性入門
  • D2 カーネルエクスプロイトによるシステム権限奪取
  • D3 カーネルエクスプロイトによるシステム権限奪取
  • B4 Embedded System Reverse Engineering 101
  • B5 信じて送り出した家庭用ルータがNetBSDにドハマリしてloginプロンプトを返してくるようになるわけがない
  • D6 LSMから見た Linux カーネルのセキュリティ
  • B7 組込みリアルタイムOSとIoTシステム演習

目次

事前課題

講義にはそれぞれ事前課題が課されます。講義が決定するのが遅かったことと、直前に大学院の院試や期末試験が重なりなかなか時間を割けずに辛い思いをしました。 基本的に各講義の事前課題の想定所要時間は10時間と決まっているそうです。ただ、これは各自のレベル感にもよるのでピンキリというか、10時間で済むものもあればその約数倍の時間がかかるものもあります。

早い段階で事前課題が出ている講義が多かったため、比較的前半に余裕を持って課題に取り組めたと思います。 ツイッターサイボウズなので他の受講者がどんどん進んで行くので焦りもありますが、自分のペースでやれば最低限必要なレベルまではたどり着けると思います。また、講師の皆さんも優しいので、連絡すれば自分の進度に合わせてサポートしてくれます。

これは解析トラックの事前課題のシェル取れた時。僕は一講義あたり2~3日くらいを目安に事前課題に取り組みました。

Day 1

当日、早朝から新幹線で東京まで向かいました。会場に到着するとすでに参加者同士で名刺交換会が始まっていました。事前にTwitterなどで交流があったので、実際オフ会みたいな雰囲気がありました。

Twitterをしている人々は名刺にアイコンとスクリーンネームくらいはあると名刺交換の時にとりあえず把握してもらえると思います。

去年のCODE BLUEで知り合った学生たちとも再会できました。

初日は開会式とセキュリティ基礎論、特別講義がありました。

セキュリティ基礎論はセキュリティ業界で今後どんな仕事がAIにとって変わられるのか、どんな仕事が残るのかというテーマでグループディスカッションをしました。残念ながら僕はAIに明るくないので、単なるプログラムを用いた自動化とAIの違いがわからず、そもそもAIって何なのかよく知らなかったのですが、グループのみんなふんわりと質問しながら議論を回す役割をやっていました。

特別講義は、JPCERT/CC小宮山さんの「グローバルなサイバーセキュリティのおしごと」、サイバーディフェンス大徳さんの「フォレンジックでサイバー脅威に立ち向かう」というテーマでした。

小宮山さんの話は「凝ったうんこの話」でした。また、実際にサイバーセキュリティの最前線で情報を集める仕事をしている中で経験したことのお話が聞けました。好奇心とにかく手を動かす表層だけではなく詳細な理解をすることが大切だというのが趣旨だったように思います。

大徳さんはリアルでもとても迫力がありました。フォレンジックとは?という話と、実際の仕事でのお話、フォレンジックを仕事にして行くためのTipsみたいな話が聞けました。

セキュキャンには5日間を通してグループで取り組むグループワークがあるので、それをやってから24時くらい23時に寝ました。

Day2

6:30に起きて朝ごはんを食べました。この日は1日中解析トラック(D)にいました。

D1 Linuxカーネルを理解して学ぶ 脆弱性入門

午前中は某ガチャピン先生の講義でした。3パートくらいあって、パート1はLinuxカーネルのメモリ管理の話や、ソースコードを読み解くTipsだったり、カーネルパニック時のトラブルシューティングに役立つデバッグの基礎について学びました。演習では、悪意あるユーザーによってクラッシュしたカーネルのダンプを解析して、何が原因だったのかを調べました。解けなかったので再挑戦します。

パート2ではCopy-on-Writeと、そのバグを用いたCVE-2016-5195 (Dirty Cow)の解説でした。演習では実際にDirty CowのPoCを動かしてファイルが書き変わるのを確認した後、Dirty Cowでの権限昇格を行いました。DIrty Cowではファイル書き換え後、データの不整合によってシステムがクラッシュしてしまうため、1度実行することで権限昇格を行えるバックドア(っぽいもの)を作成するという演習でした。以前cowrootを使って権限昇格を試した際に、ページキャッシュの自動writebackを無効にするとPoCが安定した(クラッシュしなかった)ので、それについて質問してみたんですが、どうもクラッシュは避けられないはずなのにクラッシュしない(????)ということになってしまいました。見てみると書き換え前と書き換え後で偶然ファイルサイズは同じだったのですが、それ以上の情報は得られず、原因不明のまま沼にハマりました。

パート3では id:RKX1209 氏の応募課題で出題された、CVE-2016-0728の解説でした。また、KASLRが有効になった際の対策とその発展として演習がありました。解けてないので再挑戦します。

D2-3 カーネルエクスプロイトによるシステム権限奪取

(2017年8月31日追記) 事前課題のリンクもこちらに記載しておきます。

rkx1209.hatenablog.com

rkx1209.hatenablog.com

id:RKX1209氏によるカーネルエクスプロイトの講義です。これも3パートあります。

パート1は、Intelx64のセグメントの話と、それがLinuxではどう使われているのかの話から、Linuxカーネルによるiret命令の脆弱性を使ったCVE-2014-9322 (Bad IRET)の解説がありました。実際にBadIRETを使ったDoSを試しました。

パート2はCVE-2014-1303を使ったブラウザエクスプロイトの講義がありました。ここでは、WebKitのヒープBOF脆弱性の話を聞きました。OOB Read/Writeによってバッファサイズを書き換え、それによってオーバーフローが発生するというものでした。演習では実際にExploitを動かしてPIDを確認したあと、既存のExploitを修正してファイルシステムダンプ機能を実装するというものでした。事前に講師の方が作成したヘルパー関数を使えたおかげで、実質ROPするだけだった気がします。(正直Exploitの内容をちゃんと理解するのは半日というのは少なすぎで、1週間くらい欲しいです)とは言ったものの、適切なROPガジェットを選べてなかったり使うべきライブラリを間違えてたりしたので、講義終了ギリギリまで解けませんでした。

パート3はBadIRETを使った権限昇格についてです。正直、今講義資料見直して見たんだけど何もわからん。とりあえずちゃんと周辺の資料含め読んでみます。そういえば当日は数時間くらい自由な時間があり、2つめの演習の詰まってるところに取り組んでいた。

最後にちらっとまとめがあり、カーネルエクスプロイトに対するmitigationについてグループでディスカッションしました。id:ywkw1717とかid:ta1se1とかid:klklpshinの仲良しグループで既存の攻撃に対するmitigationに関して色々調べました。

正直講義資料を見てもらう方が僕の記事を読むより5000兆倍わかると思います。

speakerdeck.com

本当に鬼だと思います。

あとはグループワークの話し合いをして25時くらい23時に寝ました。

Day3

7:00に起きて朝ごはんを食べました。この日は1日Bトラックにいました。

B4 Embedded System Reverse Engineering 101

組み込み機器の通信方式であるI2Cについての講義と、実際にBusPirateを使ってICチップ(microchip 24LC64)に書き込みをしたり、その内容を読み出したりした。事前学習ではデータシートの読み取りをしたものの、講義中にもその読み方について解説がありとても勉強になった。また、データシートを読み解くうえで電気回路系の知識や、通信方式についても知識が必要なことを思い知った。後半は家庭用NWルーターからフラッシュROMを取り外して、そのデータをダンプしました。実際にROMからデータを吸い出すのはなかなかない経験で、ファームウェアの解析にも興味が湧きました。

B5 信じて送り出した家庭用ルータがNetBSDにドハマリしてloginプロンプトを返してくるようになるわけがない

Raspberry piNetBSDのイメージを書き込んで起動させました。その後、VMNetBSD環境でラズパイ用にカーネルコンパイルして、既存のイメージファイルと置き換えました。mikutter初めてさわりました。というかNetBSDも初めてさわりました。

この日は講義の後に企業プレゼンがありました。NTTデータの話をききました。ペンテストもやってるの初めて知りました。(診断してるならそれはそう) その後、グループワークして、Day4の事前課題を2時くらいまでやって23時に寝ました。

Day4

この日は7:30に起きました。だんだん起きる時間が遅くなっている….

D6 LSMから見た Linux カーネルのセキュリティ

LSM(Linux Security Module)を使ったAKARIを使ってファイルオープンをフックして、アンチウイルスプロジェクトのClam Antivirus(clamav)に渡すことでオンアクセススキャンを実装しました。講義時間中には最後まで理解することができなかったんですが、なんとかテキストを読みながらついて行きました。ただ、事前学習で取り組んだ内容は基礎的ながら必要なもので、基礎があやふやな自分にはとても助かりました。

(2017年8月31日追記) 講義資料が公開されました。以下のリンクから閲覧できます。

LSMから見た Linux カーネルのセキュリティ

B7 組込みリアルタイムOSとIoTシステム演習

GR-PEACHを使ったロボットカーでロボコンみたいなことをしました(ロボコンあまりよく知らないけど)。ただ、GR-PEACHはそれぞれwifiでネットワークに繋がっていて、ブラウザを使って操作するのですが見てみるとHttpリクエストの中に制御するためのパラメータがあるため、そのパラメータとIPアドレスさえ判明すれば標準だと誰でも制御可能でした。僕たちのチームは、動かしているサーバーのポートを変えたり、制御のためのブラウザに渡すパス等を書き換え、またid:ta1se1氏がコンソールで操作するスクリプトをいい感じに作ってくれました。僕はいい感じに見学してたら相手チームに制御用のリクエストを送ったり、相手チームがかけたパスワードをクラックしようとしてたらいつのまにか優勝してました。(正直通信は誰でもできたので、そのリクエストを送るのをいい感じのスクリプトにしてたらもっと楽しかった感がある)

この日はサイボウズの話をききました。サイボウズラボユース気になるしインターンも気になる。 グループワークを2時くらいまでして3時に寝ましたして、23時に寝ました。

Day5

起きたら8時40分だった…..モーニングコールで起きました。ごめんなさい。これをみたオタクは早く寝ることを心がけましょう。

その後すぐにグループワークの最終発表があり、その後閉会式をして解散しました。 書籍はわかものたちが優遇されていて老人たちは最後でした。(ちゃんとみんなもらえます)

最後に

感想です。

キャンプ中はわからないことがたくさんありました。正直、キャンプの終わった今でも資料を見返してみて、いろんなサポートがあったからなんとかなったものの、これをその期間中自分一人で理解しろと言われても無理だったと思います。

ただ、キャンプの最後にも話がありましたが、ここで感じたつらい気持ちは、これから学習していくための糧になるものだと思っています。ここで学んだことはただのきっかけに過ぎず、ただ確かにキャンプに応募するより前よりは多くのことを知り、体験したと思います。この感覚を忘れずに、どんどん新しいことを吸収していくことで強くなりたいです。

おまけ

解散後に参加者有志で飲みに行きました。

その途中で電車がておくれたり

はぐれオタクが発生したり

道に迷うオタクが発生して本当に大変でした。これだからオタクは…