ツイートから振り返るsecdojo2018夏休み場所

secdojo

こんにちは!鳥貴士です!

昨日は、セキュリティマイスター道場(secdojo)夏休み場所

に行ってまいりました!

ツイートがぞろぞろ流れて行っておりましたが、これを振り返りの糧にしてみていきましょう!

まず初めに倫理の説明。
端的にまとめると、守るためにはどう攻めるかを知る必要がありますが、その知識を使って他人のサーバーに侵入するのは違法です。
というかそもそも違法云々以前に、自分の良心でなんとかなるよね、できるよね、できるはずだよね、という話でした。

How to escalate privileges to administrator in latest Windows

まず最初のプレゼンはこちらでした!
登壇者は青山荘也氏(@SoyaAoyama)です!
タイトルを直訳すると、いかにして最新のwindowsで管理者に権限を昇格するか、ですね。

Micro Softが脆弱性でないという認定を出したということで、公開に踏み切ったとのことでした。
しかし今回上げるうちの片方についてはCreators Updateが修正されているという話もありました。

バグハントの報奨金を払いたくないMicro $oftの陰謀というのはいささか考えすぎか…?

とまぁ背景はここまでにしておきましょう。

当日に使ったスライドはslideshareで公開されています。

さて、ここからツイートに沿って振り返っていきましょう

Bsides Tokyoという情報セキュリティのアツいイベントが今年の11月10日にあるようです!

青山氏はBsides TokyoのOrganizerを務めるようで、Bsidesのイベントが日本、いや東アジアで開かれるのは今回が初めてのようです。
参加登録フォームは近日公開とのことでした~。

AVTOKYOという、こちらも情報セキュリティの大きいイベントが今まで何回も開催されているという話を聞きました。
私は初耳でした…きっと知ってて忘れてたのかもしれない…?

今回のメインテーマであり脆弱性を一言で言い表すとこういうことになります。
ここからはその具体的な手法についての説明、実演です。
実演とは言えトラブルが起きるのは世の常…
まぁ最終的には実演成功になります、と前もって釘を刺しておきます。

今回ターゲットとなるOneDriveのDLLはユーザーの個人アカウントのディレクトリにありますが、このディレクトリはバージョンによって詳細に分かれているようです。
確かに手動でやる分には厄介ですが、こちらは実演がうまくいかない原因ではありませんでした。

これがうまくいかない原因でした、既にロードされているDLLは再起動されない限り再度読み込まれることはないですね。
ということで再起動するとadmin権限でcmdが起動しました。

実演成功です。

スライドを見てもらえればわかりますが、今回見つかったのはどちらも単体で見れば”軽微な不具合”でした。
しかしこの2つを組み合わせることでユーザー権限で動くアプリが任意の命令をシステム権限で実行できるという深刻な脆弱性になりましたね。

木より森が大事な今回の脆弱性でした。

続いて質問コーナー。
どうやって脆弱性を見つけたのかという質問が来ました。

答えはなんとたまたま見つかったとのこと。
しかしただあてずっぽうにDLLを差し替えていたわけではなく、大まかなアタリを付けながらやっているとのこと

こんな名言も飛び出しました。
情報セキュリティに習熟すると脆弱性が光るそうです。
当然物理的に光るわけではなく、なんとなくここに脆弱性がありそうだなという目が養われるということです。

この後にはどう対策すればよいか、という質問が。

しかし対策のしようはないとのこと。
普遍的な”不審なアプリは起動しない”というのが現状一番有効な対策のようです。

これを踏まえてMSにとってほしい改善策として

めっちゃ誤字ってますが、証明書のついた信頼できるDLLしか読み込まないようにすることを挙げておりました。

早い修正を祈るばかりですね。

小休憩を入れ次のハンズオンへ。

熱血メソッドによるアセンブラ・リーディング入門

続いてのハンズオンはこちらでした!
登壇者は坂井弘亮氏(@kozossakai)です!

「大熱血 アセンブラ入門」を著した坂井氏がハンズオン形式で熱血メソッドを伝授されました!

ターミナルとしてktermを使っていました。KDEライクなUIでしたが、あれももしかして自作OSなのでしょうか…?

ドキュメントを読んで理解することも必要ではあるが、それは効率的な学習法ではない。

そして1100ページにもわたる大熱血アセンブラ入門も、1ページ目から読むものではない。
著者の言葉だと説得力ありますね。

とのこと。
ただし1ページ目から読むものではない(再掲)

ハンズオン開始。
まずはそれぞれのファイルと基本的なことがらの説明。

実際なんとかなると思いましたまる

プログラムはなぜ動くのか、の知識だけでも学習を進めるうえでは十分だと思います。

サンプルで使ったCent OS 6.5はデフォルトではCUIですが、Xサーバがインストールされておりstartxコマンドで起動できます。

坂井氏はscreenを活用していました。

自分はWSLのsshを複数立ち上げて進めました。

各アーキテクチャの説明。
セガサターンを知っている一般学生はあまりいなそう。
そしてsparkではなくsparcです。

Makeはクロスコンパイルをすることもできます。
なお自分はMakefileは読んでいません。

ちょっと語弊がありますね。
アーキテクチャ名.cを編集し、ちょこっと変え、コンパイル、アセンブル、リンクし、逆アセンブルしたものを比較対照しています。

cファイルの中身はしょぼい関数、ワンライナーの単純なサブルーチン群です。nullを返すだけ、1を返すだけ、など。

正しく用語を使うとこうなります。

ld.scrはリンカスクリプトというもので、アセンブリをリンクする際に呼ばれます。

変更があったもののみ再コンパイルリンクしてくれます。優秀!

arm-elf.dを見ることで得られたニーモニックの使われ方です。
armプロセッサの実行ファイルのmov命令はこのように使われます。

用語の補足です。

用語がもりもりです。

広義のコンパイルを正確に表現するとこのような言い方になります。

ニーモニックの述語として頻繁に出てくるこれらの表示はレジスタを示す。
pcはプログラムカウンタのこと。

ニーモニックはCPUの仕様依存、つまり環境依存ということができます。

ここまで使ってきたサンプルファイルは実際には動きません。
アドレス調整やスタートアップの設定が必要ですが、この中にあるリンカスクリプトにはわかりやすさのために省いているからです。

../execディレクトリの中身であれば理論上は動く(未検証)とのこと。

スタートアップの処理はmain関数が実行される前に実行されます。

まとめると上のように言うことができます。

このような知見をサンプルファイルから得ることができました。

return sizeof(int)などを見ることで確認できます。
intやlongのビットサイズが定数なのは当然と言えば当然なのですが、実際にこうして見ると感心しますね。

新しい命令の知見を得ました。
ldr = load registerです。
対義ニーモニックとしてstr = store registerがあります。

以下は本質情報です。

ARM系プロセッサのオブジェクトファイルを見ます。

するとEが縦にきれいに並んでいることがわかります。
ARMのバイナリは固定長なので、きれいにEがならぶのですね。

なお80386系のintel CPUは可変長なので、ランダムに並んでいるように見えます。
return命令を示すC3がたくさん出現していることが見て取れます。

ここで質問コーナー。
1つ目はどうやってこの手法にたどり着いたのかというもの。

2年間アセンブリ言語に触れてきて手さぐりで学んでようやく得たとのこと。
本も順番に読み進めて確実に理解できるように工夫されている…
2年間を1冊に凝縮しわかりやすく伝授する熱血メソッド、アツいですね!

あと冠する、ですね。

2つ目はバイナリに命令以外の情報が埋め込まれていると聞いたことがあるか本当か?というもの
坂井氏も初耳だったらしく検証がスタート。

さながらプチCTFの様相でした。

リロードしているのはnanoでhexeditではありません。
Vimにもあったような…?

タイムスタンプを含んでるんじゃね?という洞察をもとに検証。
その際にtouchコマンドがタイムスタンプの更新に利用されることを初めて知る(雑魚並感)

今回のハンズオンはセキュリティキャンプで行った講演をベースにしたものとのこと。
こちらに資料が置いてあるそうです、ありがたい。

この質問は3つ目で、最後の質問がこんなもので申し訳なくなった…

しかしアセンブリ言語を勉強したくなるアツいハンズオンでした!

LTコーナー

続いてLTコーナー、飛び入り1つで計4つのLTが行われました。

まず1つ目は@MC_SEC_KB氏の古典で読み解くエクスプロイトです、

落語の時そばを題材に、脆弱性を持つ店員とハッカー武士の戦いをLTしています。

そのころ自分はtwitterにつぶやきすぎとしてアカウントを凍結されていた模様。
バスと道路標識と自動車を選択しながらLTを聞いておりました(すいません)

総括すると時そばから見えてくる脆弱性は。任意の型の入力を許してしまった店員にある。
そしてその対応策として、通貨型以外を受け付けず、時刻を聞かれたら時刻型で返り値を与える女将を用意することである。

ということでした!

この後にgdbの使い方、ライブパッチなどのgdbの応用的なLTがありました。
原因を正しく理解することの納得感と原因究明の方法がテーマ!
他にもgdbのあんな使い方やこんな使い方も。

スライドの公開は特にされておりませんでした。

最後にはPythonのミュータブル・イミュータブルの飛び入りLTが。
こちらはホワイトボードに書かれていたためスライドはありません。

Pythonはすべてがオブジェクト、を打ち出した言語です。
そしてPythonが独特な点として、ミュータブル、イミュータブルの概念があります。

ミュータブルは書き換え可能、イミュータブルは書き換え不可能ということですね。

図で表すと(LT聞いてたときにしてあったメモ)

こんな感じ。

a=1のときは1という数値オブジェクトが作成され、そのラベルとしてaが割り当てられます。`
1オブジェクトのidを仮にxとし、aにはオブジェクトidとしてxが格納されます。

b=1のときは1というすでに存在するオブジェクトに、ラベルとしてbが設定されます。
するとbが持つidはxとなります。

このあとa = 2と再定義します。
このとき2オブジェクトがあたらしく生成され、この2オブジェクトのidをyとすると、aにはidとしてyが格納されます。

また、a += 1とインクリメントします。
このときも新しくidが(仮に)zの3オブジェクトが生成され、aにはidとしてzが格納されます。

このようにそれぞれのオブジェクトを破壊して再定義するのではなく、新しくオブジェクトが生成されるのです。

これがイミュータブルなのです。

その対義語、ミュータブルとは何ぞやという話です。

もう説明がめんどくさくなってしまったのでここを読んでください

おしまい

これでおしまいです!1時から5時の長丁場でしたが、楽しく有意義でむしろ短いと感じさせるような、そんな時間でした!

この企画を主宰し場所を提供してくださった富士通さんに感謝!

というわけでそれではまた!