いろんな技術にふれたい

いろんな技術に触れたい

日頃色々触れた技術を自分なりにまとめておきたいと思ってます。難しいものほどブログ書く時間がかかるのが問題・・・

セキュリティ・キャンプ全国大会@2016の専門講義を振り返る

f:id:Tokina:20160817222043j:plain

 

こんばんわ。

tokinaです。連日投稿するのは私のモチベがキープ出来ている証拠でしょうか。

 残念、連日投稿はできませんでした、、、(そもそも入力速度が遅い、、、

 

始めたTwitterですが、多くの人フォローしていただけてありがたいです。

今後ともよろしくお願いします。

 

はじめに

 

今回は全国大会での専門講義を振り返りたいと思います。

長くなるので、一度受講した講義を以下にまとめておきます。(詳細な時間割はこちら

 

Day2

Day3

  • 3-C 脆弱性検出実践(ファジング技術と脆弱性報告)
  • 4-C オンラインゲームアタック&ディフェンスチャレンジ
  • 5-D みんなでクールなROPガジェットを探そうぜ

Day4

 

上記を見ればわかりますが、レイヤーがばらばらですねえ、、、

 

各講義を振り返る前に、トラックについて触れておきます。

今回のトラックは以下の5つに分かれていました。(集中講義もあります)

 

・アプリケーション  →Aトラック

・IoT          →Bトラック

・検知                       →Cトラック

・解析                       →Dトラック

 

実は去年の時間割は外部に公開されていないようで、見つけられませんでしたが、今年のは事前に公開されていました。

上記のトラックをレイヤーの高い順に並べると多分こんな感じ↓

A>C>D>B

そう、私はレイヤを行ったり来たりしていたのです。

でも楽しかったですよ。大体の人はレイヤーが集中していたように感じました。

 

さて、それでは気を持ち直して各講義について振り返りたいと思います!

 

  

問題がない範囲で振り返っていきたいと思います

 

1-B BareMetalで遊ぶ Raspberry Pi 入門編

講師: 西永 俊文さん

 

西永さんには去年の沖縄キャンプでともにチュータとしてお世話になりました。

そこで、その御縁もあり、講義を選択させて頂きました。

 

まずBareMetalってなんだろう、というところから始まりました。

BareMetalとは

e-words.jp

 

私が思っていたのは、mbedのような環境です。

組み込みマシンのような一度writeしたらきまった動作しかできないというイメージです。

その上に存在するのがOSが走るマシンだと思っています。

実際にBareMetalには定義のようなものがないみたいであやふやですけど。。

 

今回の講義では実際にBareMetalな環境のRaspPiでLEDチカチカ(LED Blink)を行いました。

 

BareMetalな環境ということは、つまりOSというイメージなしでLチカさせました。

 

OSが走っていれば、コマンドライン上からechoで叩くだけでLチカできるのですが、今回はそうは行きませんでした。

main文を実行するための初期化などの_start命令を実行する必要があるそうです。

それをアセンブリmakefileと合わせて作りました。そうしてbinファイルを生成してSDカードに突っ込んで、電源の隣にある緑色のLEDをチカチカさせました。

私を含め、数人が成功していたようです。

 

でも、これだけで4時間経過してしまいました、、、

BareMetalって奥が深い、というか、OSってえらいな、、と思いました

おそらく数日間でこれが一番低レイヤーでした

 

ミニブレッドボードありがとうございました!

 

2-A スマートフォン向けゲームのセキュリティ

講師: 杉山 俊春 さん

 

講師はDeNAからお越しいただいた杉山さんでした。

まずは座学として、スマホゲームのセキュリティの今についてお聞きしました。

なるほど、とおもったのは費用対効果です。どういうことかというと、完全にチート対策をするか、費用などの面から脆弱性をある程度許容するか、です。

 

私もスマホゲームとして◯ルフレやA◯phalt、PokemonG◯等をしていますが、チートの手段については、(あまり)考えたことはありませんでした。

メモリ書き換えや送信データなりすまし、自動化マクロ等はごにょごにょですが。最近だとPockemonGo自動化、位置偽装等、、、

それらについて個別に対策は可能なのですが、チーターのレベルがあがってしまうため、底にかける”コスト”との相談なのだそうです。なるほど。

 

今回の実習では、cocos-2dx(たしかAndroid, iOS向けのクロスプラットフォーム)で作られたデモアプリケーションに対してどのような攻撃ができるか、でした。

 

BurpSuiteなるツールがあるらしく(知りませんでした、、)、それでパケットを捕まえて、書き換えて送る、暗号かされたデータを復号化し、それを書き換えて再び暗号化して送る、等を行いました。暗号化のための鍵を見つけるのは、実際は難しいため、誰にでもできるのは前者のほうでしょう。

メモリ書き換えは講義で、実際に自分の手で行いませんでした。

 

実習を通して、想定する対策とその面倒臭さを学ぶことが出来たと思います。

web上のゲームでのチートの方法を今後これらを参考に自分なりに考えてみようと思います。

 

3-C 脆弱性検出実践(ファジング技術と脆弱性報告)

講師: 山下勇太 さん、篠原祟宏さん

 

IPAの山下さんにお会いしたのはおそらくこれで4度目になるのではないでしょうか

インターロップにも来られていました。

今回もお世話になりました!

 

さて、”ファジング”もそろそろ普及してきたのではないでしょうか。

日本語での情報も増えてきた頃だと思います。

さっきBugハント日記の冒頭を読んだらファジングのお話が出てきていました。

この本は2012年に発刊されていますが、原作はもう少し前だと思うので、それほど普及していたのだとわかります。

 

ファジング - Wikipedia

 

今回はファズデータが外に出てしまうのを防ぐために(ネットワークに負荷をかける、ブリッジを殺す等につながりかねないため)閉じられたLAN内で実際にツールを自分たちの手で触ってみよう!という講義でした。

 

一部口外禁止のお達しを頂戴しましたので、そこは容赦ください。

 

今回の講義で実際に触らせていただいたファジングツールは以下の3つでした

・Achilles

・beSTORM

・FFR Raven

(Codenomiconは大人の事情で使わせてくれなかったようです)

 

これらを利用して外部から悪意のあるパケットを対象に送ってみよう!という内容でした。

参加者はそれぞれ検証対象の機器を選択できたため、私は馴染みのある某社の古いタブレットを選びました。

どうやら、このタブレットには既知の脆弱性があったらしいのですが(篠原さんいわく)、(残念ながら)見つかりませんでした。

 

私が使いやすいと感じたのはやはりFFR Ravenでした。

日本語のインタフェースを持つファジングツールはまだめずらしいのではないでしょうか

設定も簡単で、初心者でも気軽にファジング出来ますね

 

また、「今後使ってみたい!」と思ったのはbeSTORMでした。

だって、対象”その他”に”OBD-Ⅱ”がありましたので。

車載LANを普段からごにょごにょしている私はぜひ検証してみたいと思います。

 

ちなみに車で大学に通学していますが、OBDポートがあるのかさえまだ確認したことありません(ブルーバードシルフィに乗ってます)

夏休み中にできたらパケットを一通りとって解析したいと思っています

書いてすぐに気晴らしにパケット一通りキャプチャしてきました(解析はしていません)

 

4-C オンラインゲームアタック&ディフェンスチャレンジ

講師: 中矢誠さん

 

講義の中でアタック&ディフェンスをさせてくれたのはこちらの講義だけだったのではないでしょうか。

今回用意していただいたのはCapture the Flog(Flagじゃないよ!)というweb上で動作するnodejsとwebsocket.ioを用いて作られたゲームです。これを攻撃者(プレイヤー)と防御者(運営)に分かれて、どれだけ決められたスコアを稼げるか、というアタック&ディフェンスらしい講義でした。

 

時間に余裕があったため、当初の予定と異なり攻撃者と防御者を両方やらせていただくことが出来ました。

 

一応冒頭のお話でデバッガツールや逆アセンブリのツールなどについてもお話を伺いました。

よくまとめられて分類されており、講義資料を頂いているので、 後日しっかり読み込んでおきたいと思っています。

 

メインのチャレンジですが点を得れらるのは以下の基準でした

 

・プレイヤー

レベルを上げて、育てたキャラクターを売る(RMT

レベルに従ったポイントが追加される

終了時間に近づく&ユーザたちのレベルのよって換金率が変動する

 

・運営

RMTしたユーザをBANすることによりプレイヤー側のポイントを減らすことができる

正常な運営を続けることで恒常ポイントが加算されていく

(人の手による正常かどうかの判断もありました)

 

こんな感じでした。

プレイヤー側はどれだけチートをしてレベルを上げまくるか、がポイントでしたね。

最終的に(チート対策がなされたあとに)、一番有効であったのはうさぎさんが成功させた完全BOTだったと思います。

(この時のソースコードもらっておきましたv)

運営側は、最初正常なサーバの稼働をしなくても、最低限の機能を保ち、その間にチート対策(バグを除去)することで差をつけることが出来たと思います。

 

私はwebsocket.ioについては触れたことがなかったのですが、静的なはずのブラウザが、リアルタイムに 動作しているのを見て感動しました。

ごっふぃーや猫戦車とかもこれでできてるのかなと思いました。

今度手元の環境に構築して見たいと思います。

 

本当は事前にUbuntuに入れたかったのですが、入りませんでした、、

 

5-D みんなでクールなROPガジェットを探そうぜ

講師: 岩村誠さん

 

 実は3日目のこの講義は、企業の方のプレゼンの関係もあり、1時間25分という短い時間の中で行われました。

 

ただ、アセンブリがほぼ初心者な私にとって、この短い時間は厳しいものでした

 

まず、ROPという言葉を私は耳にしたことがありませんでした。

ROPとはReturn-oriented Programmingの略です。詳しくは以下

 

Return-oriented programming - Wikipedia, the free encyclopedia

 

そもそも、調べても情報がほとんど出てこないし、事前課題でひ〜!と泣いいていた私は、キャンプ5日前くらいに「バイナリの歩き方」という本を本屋さんで急遽購入しました。

https://www.amazon.co.jp/たのしいバイナリの歩き方-愛甲健二-ebook/dp/B00EODUZFO/ref=sr_1_5?ie=UTF8&qid=1471598695&sr=8-5&keywords=バイナリのwww.amazon.co.jp

 

バイナリ畑でつかまえて」という本も気になりますねえ

 

さて、このバイナリの歩き方の中でもROPに触れていてくれました。

 

しかし、それでも不安だったので岩村さんにチャットでアドバイスをお伺いした所、バイナリの歩き方や熱血アセンブラ(先輩に借りました)の読んだほうがいいページを教えていただくことが出来ました。

 

どうにかアセンブラを数日で雰囲気読めるようになって、今回の講義に挑んだわけです。

 

結果は、まぁお察しだったのですが、、、

(隣の席の人にかなり助けてもらいました)

 

最初の一時間は何をしているんだ、な状態でしたが、最後に近づくにだんだんと理解してきました

 

どうやら、あるプログラム(実行ファイル)の動作から、必要な命令があるメモリアドレスから必要なところをぱくってつなぎ合わせよう!というものだったようです。

例えばある実行ファイルを対象に、bashを起動する場合だと、以下の様な関数を定義しました

 

def gen_arch00():

    p = ""

 

    p += pack("I", BASEADDR + 0x0007a0c6)   # pop ebx ; ret

    p += pack("I", BASEADDR + 0x0012b494)   # "/bin/sh"

 

    p += pack("I", BASEADDR + 0x000da1e0)   # pop edx ; pop ecx ; pop eax ; ret

    p += pack("I", 0)                       # edx

    p += pack("I", 0)                       # ecx

    p += pack("I", 11)                      # eax

 

    p += pack("I", BASEADDR + 0x0002a65f)   # int 0x80

 

    return p

 

文字列連結しているのがわかると思います。

 

これは、ほしい命令がある場合、その命令が存在する(命令を利用している?)メモリアドレスを探してきてつなげます。例えば最後の0x80というのはbash起動命令らしいです?

また、このメモリアドレスの振れ幅が小さいほど必要な容量が小さくなるので嬉しいみたいです。

 

と、それくらいぎりぎり理解できたところで終わってしまいました。

 

今度バイナリの歩き方に目を通した後にexploitチャレンジしたいと思います。

 

 

6-D リバースエンジニアリングを自動化せよ

講師: 岩村誠さん 

 

Day3の最終日のROPの講義に引き続き、Day4の最初も岩村さんの講義を選択させていただきました。

 

5-Dのときと違い、時間に余裕があったため、ゆっくりすすめていただいて助かりました。

 

リバースエンジニアリング(リバエン)的な調査は割りとCANパケットの解析の際にやったのですが、バイナリリバエンは初めてでした。まぁアセンブラ自体ほぼ初めてなので、、

 

今回はangrという解析を支援してくれる、めちゃくちゃ”なうい”バイナリ解析支援フレームワークを利用しました

ただ、”なう”すぎて来年は今回書いたコードは動かないでしょう、ということです

 

angr, a binary analysis framework

 

angrというのはpythonで動作するらしく、 まずpythonが苦手な私は、うっとなりましたが大丈夫でした。

ipythonって便利ですね!

 

さて、この講義での目標は上手にexploitで解析を自動化できないか、ということです。

 

 

解析の流れは、

1.動作を手動で確認する

2.逆センブリコードとかを読む

3.流れを把握する

4.exploitを書いて自動化する

 

こんな感じだったと思います。

bashが取れたら正解ですね

 

解析のポイントはシンボリック実行やif文など、脆弱性を一つ一つなぞって探していくことです。

BUGハンター日記で勉強します笑

 

7-A ID連携基礎

講師:林 達也さん、真武 信和

 

最後はレイヤーの高いAトラックでした(D→Aでしたからきもちが楽でした)。

掲示板があまり更新されていないので少し不安だったのですが、かなり最先端で、面白いお話を伺うことが出来ました。

あと、TwitterのIDがお二方とも3桁なのは凄いと思いました

 

講義では、現在のID連携の近況と、実際にハンズオンを通して、認証の際にどのような脆弱性が存在するかについてを学びました。

 

また、現在のSIMやマイナンバーが実際にどう”認証”しているかについてディベートも行いました。

 

Twitterの連携のOAuth2.0とかこのまえmecab関連でちょっと使おうとしましたが、諦めてしまいました

ここは今後もお金が絡むところではないでしょうか

 

多くの人は現在パスワードを使いまわしていると思いますし、適当なものだと覚えることが出来ないので、推測が可能な形をとっている人も多いでしょう。

 

どうすればいいか?

 

 

キーワードは、「認証をなくせ」です 。

認証がなくなれば、パスワードがいらないですもんね

 

 

最後、お時間が足りなくなって終わってしまったのが少々物足りなかったです。

攻撃の例のハンズオンが中途半端で終わってしまったので近いうちにもう一度最初からやってみます!

 

 

最後に

私は正直面白そうだな!と思った講義を選択したので、あとから、〜は難しい、選択してしまったか、、等言われてしまいましたが、そのために事前に勉強して講義に臨んだりして自分的には逆に新鮮でよかったと感じています(講義中はつらかったですが、、

 

もちろんキャンプでは講義だけではなく、間に特別講演やCTF、企業の方のお話が聞けたりしたので、そちらについてもまたここに書きたいと思います。

 

それでは。

 

余談

mochaというmac向けはてなブログ用のエディタが使いたかったのですが、起動しませんでした、、、

今後に期待します!

 

 

 

mocha

mocha

  • Reo Hokazono
  • ライフスタイル
  • ¥120