secdojo
こんにちは!鳥貴士です!
昨日は、セキュリティマイスター道場(secdojo)夏休み場所
に行ってまいりました!
ツイートがぞろぞろ流れて行っておりましたが、これを振り返りの糧にしてみていきましょう!
https://twitter.com/tori_toutoshi/status/1035399675585515522
まず初めに倫理の説明。
端的にまとめると、守るためにはどう攻めるかを知る必要がありますが、その知識を使って他人のサーバーに侵入するのは違法です。
というかそもそも違法云々以前に、自分の良心でなんとかなるよね、できるよね、できるはずだよね、という話でした。
How to escalate privileges to administrator in latest Windows
まず最初のプレゼンはこちらでした!
登壇者は青山荘也氏(@SoyaAoyama)です!
タイトルを直訳すると、いかにして最新のwindowsで管理者に権限を昇格するか、ですね。
Micro Softが脆弱性でないという認定を出したということで、公開に踏み切ったとのことでした。
しかし今回上げるうちの片方についてはCreators Updateが修正されているという話もありました。
https://twitter.com/tori_toutoshi/status/1035390076149063680
バグハントの報奨金を払いたくないMicro $oftの陰謀というのはいささか考えすぎか…?
とまぁ背景はここまでにしておきましょう。
当日に使ったスライドはslideshareで公開されています。
さて、ここからツイートに沿って振り返っていきましょう
https://twitter.com/tori_toutoshi/status/1035388901764915205
Bsides Tokyoという情報セキュリティのアツいイベントが今年の11月10日にあるようです!
青山氏はBsides TokyoのOrganizerを務めるようで、Bsidesのイベントが日本、いや東アジアで開かれるのは今回が初めてのようです。
参加登録フォームは近日公開とのことでした~。
https://twitter.com/tori_toutoshi/status/1035389141968543744
AVTOKYOという、こちらも情報セキュリティの大きいイベントが今まで何回も開催されているという話を聞きました。
私は初耳でした…きっと知ってて忘れてたのかもしれない…?
https://twitter.com/tori_toutoshi/status/1035392446178328576
今回のメインテーマであり脆弱性を一言で言い表すとこういうことになります。
ここからはその具体的な手法についての説明、実演です。
実演とは言えトラブルが起きるのは世の常…
まぁ最終的には実演成功になります、と前もって釘を刺しておきます。
https://twitter.com/tori_toutoshi/status/1035393791295770624
今回ターゲットとなるOneDriveのDLLはユーザーの個人アカウントのディレクトリにありますが、このディレクトリはバージョンによって詳細に分かれているようです。
確かに手動でやる分には厄介ですが、こちらは実演がうまくいかない原因ではありませんでした。
https://twitter.com/tori_toutoshi/status/1035394343199170561
これがうまくいかない原因でした、既にロードされているDLLは再起動されない限り再度読み込まれることはないですね。
ということで再起動するとadmin権限でcmdが起動しました。
実演成功です。
https://twitter.com/tori_toutoshi/status/1035394976627056640
スライドを見てもらえればわかりますが、今回見つかったのはどちらも単体で見れば”軽微な不具合”でした。
しかしこの2つを組み合わせることでユーザー権限で動くアプリが任意の命令をシステム権限で実行できるという深刻な脆弱性になりましたね。
木より森が大事な今回の脆弱性でした。
続いて質問コーナー。
どうやって脆弱性を見つけたのかという質問が来ました。
https://twitter.com/tori_toutoshi/status/1035395628455485440
答えはなんとたまたま見つかったとのこと。
しかしただあてずっぽうにDLLを差し替えていたわけではなく、大まかなアタリを付けながらやっているとのこと
https://twitter.com/tori_toutoshi/status/1035395796819095552
こんな名言も飛び出しました。
情報セキュリティに習熟すると脆弱性が光るそうです。
当然物理的に光るわけではなく、なんとなくここに脆弱性がありそうだなという目が養われるということです。
この後にはどう対策すればよいか、という質問が。
しかし対策のしようはないとのこと。
普遍的な”不審なアプリは起動しない”というのが現状一番有効な対策のようです。
これを踏まえてMSにとってほしい改善策として
https://twitter.com/tori_toutoshi/status/1035397545898401792
めっちゃ誤字ってますが、証明書のついた信頼できるDLLしか読み込まないようにすることを挙げておりました。
早い修正を祈るばかりですね。
小休憩を入れ次のハンズオンへ。
熱血メソッドによるアセンブラ・リーディング入門
続いてのハンズオンはこちらでした!
登壇者は坂井弘亮氏(@kozossakai)です!
「大熱血 アセンブラ入門」を著した坂井氏がハンズオン形式で熱血メソッドを伝授されました!
https://twitter.com/tori_toutoshi/status/1035400246900092928
ターミナルとしてktermを使っていました。KDEライクなUIでしたが、あれももしかして自作OSなのでしょうか…?
https://twitter.com/tori_toutoshi/status/1035401161640009728
https://twitter.com/tori_toutoshi/status/1035403859676430336
https://twitter.com/tori_toutoshi/status/1035401965721665536
ドキュメントを読んで理解することも必要ではあるが、それは効率的な学習法ではない。
https://twitter.com/tori_toutoshi/status/1035401299485814784
そして1100ページにもわたる大熱血アセンブラ入門も、1ページ目から読むものではない。
著者の言葉だと説得力ありますね。
https://twitter.com/tori_toutoshi/status/1035401409515024384
とのこと。
ただし1ページ目から読むものではない(再掲)
ハンズオン開始。
まずはそれぞれのファイルと基本的なことがらの説明。
https://twitter.com/tori_toutoshi/status/1035402536830754817
実際なんとかなると思いましたまる
プログラムはなぜ動くのか、の知識だけでも学習を進めるうえでは十分だと思います。
https://twitter.com/tori_toutoshi/status/1035404581025378304
サンプルで使ったCent OS 6.5はデフォルトではCUIですが、Xサーバがインストールされておりstartxコマンドで起動できます。
https://twitter.com/tori_toutoshi/status/1035405759549399040
坂井氏はscreenを活用していました。
https://twitter.com/tori_toutoshi/status/1035406031369564161
自分はWSLのsshを複数立ち上げて進めました。
https://twitter.com/tori_toutoshi/status/1035408207034777600
各アーキテクチャの説明。
セガサターンを知っている一般学生はあまりいなそう。
そしてsparkではなくsparcです。
https://twitter.com/tori_toutoshi/status/1035408316455780352
Makeはクロスコンパイルをすることもできます。
なお自分はMakefileは読んでいません。
https://twitter.com/tori_toutoshi/status/1035408485070954497
ちょっと語弊がありますね。
アーキテクチャ名.cを編集し、ちょこっと変え、コンパイル、アセンブル、リンクし、逆アセンブルしたものを比較対照しています。
https://twitter.com/tori_toutoshi/status/1035409956285997056
cファイルの中身はしょぼい関数、ワンライナーの単純なサブルーチン群です。nullを返すだけ、1を返すだけ、など。
https://twitter.com/tori_toutoshi/status/1035410518071078912
正しく用語を使うとこうなります。
https://twitter.com/tori_toutoshi/status/1035411069143900162
ld.scrはリンカスクリプトというもので、アセンブリをリンクする際に呼ばれます。
https://twitter.com/tori_toutoshi/status/1035411994571038720
変更があったもののみ再コンパイルリンクしてくれます。優秀!
https://twitter.com/tori_toutoshi/status/1035413250681135106
arm-elf.dを見ることで得られたニーモニックの使われ方です。
armプロセッサの実行ファイルのmov命令はこのように使われます。
https://twitter.com/tori_toutoshi/status/1035413493892009987
用語の補足です。
https://twitter.com/tori_toutoshi/status/1035413757717962752
用語がもりもりです。
https://twitter.com/tori_toutoshi/status/1035414017097924608
広義のコンパイルを正確に表現するとこのような言い方になります。
https://twitter.com/tori_toutoshi/status/1035415528699883521
ニーモニックの述語として頻繁に出てくるこれらの表示はレジスタを示す。
pcはプログラムカウンタのこと。
ニーモニックはCPUの仕様依存、つまり環境依存ということができます。
https://twitter.com/tori_toutoshi/status/1035418184545759232
ここまで使ってきたサンプルファイルは実際には動きません。
アドレス調整やスタートアップの設定が必要ですが、この中にあるリンカスクリプトにはわかりやすさのために省いているからです。
../execディレクトリの中身であれば理論上は動く(未検証)とのこと。
https://twitter.com/tori_toutoshi/status/1035418679079366657
スタートアップの処理はmain関数が実行される前に実行されます。
https://twitter.com/tori_toutoshi/status/1035421415996981248
https://twitter.com/tori_toutoshi/status/1035420515798675456
まとめると上のように言うことができます。
https://twitter.com/tori_toutoshi/status/1035421002593853442
このような知見をサンプルファイルから得ることができました。
https://twitter.com/tori_toutoshi/status/1035421854494683136
return sizeof(int)などを見ることで確認できます。
intやlongのビットサイズが定数なのは当然と言えば当然なのですが、実際にこうして見ると感心しますね。
https://twitter.com/tori_toutoshi/status/1035422821894086656
新しい命令の知見を得ました。
ldr = load registerです。
対義ニーモニックとしてstr = store registerがあります。
以下は本質情報です。
https://twitter.com/tori_toutoshi/status/1035425400107614208
ARM系プロセッサのオブジェクトファイルを見ます。
https://twitter.com/tori_toutoshi/status/1035426692859277312
するとEが縦にきれいに並んでいることがわかります。
ARMのバイナリは固定長なので、きれいにEがならぶのですね。
なお80386系のintel CPUは可変長なので、ランダムに並んでいるように見えます。
return命令を示すC3がたくさん出現していることが見て取れます。
ここで質問コーナー。
1つ目はどうやってこの手法にたどり着いたのかというもの。
https://twitter.com/tori_toutoshi/status/1035431309412188160
2年間アセンブリ言語に触れてきて手さぐりで学んでようやく得たとのこと。
本も順番に読み進めて確実に理解できるように工夫されている…
2年間を1冊に凝縮しわかりやすく伝授する熱血メソッド、アツいですね!
あと冠する、ですね。
2つ目はバイナリに命令以外の情報が埋め込まれていると聞いたことがあるか本当か?というもの
坂井氏も初耳だったらしく検証がスタート。
https://twitter.com/tori_toutoshi/status/1035429355051085824
さながらプチCTFの様相でした。
https://twitter.com/tori_toutoshi/status/1035428345419259905
リロードしているのはnanoでhexeditではありません。
Vimにもあったような…?
https://twitter.com/tori_toutoshi/status/1035431790381416448
タイムスタンプを含んでるんじゃね?という洞察をもとに検証。
その際にtouchコマンドがタイムスタンプの更新に利用されることを初めて知る(雑魚並感)
今回のハンズオンはセキュリティキャンプで行った講演をベースにしたものとのこと。
こちらに資料が置いてあるそうです、ありがたい。
この質問は3つ目で、最後の質問がこんなもので申し訳なくなった…
しかしアセンブリ言語を勉強したくなるアツいハンズオンでした!
LTコーナー
続いてLTコーナー、飛び入り1つで計4つのLTが行われました。
まず1つ目は@MC_SEC_KB氏の古典で読み解くエクスプロイトです、
落語の時そばを題材に、脆弱性を持つ店員とハッカー武士の戦いをLTしています。
https://twitter.com/tori_toutoshi/status/1035440038765449217
そのころ自分はtwitterにつぶやきすぎとしてアカウントを凍結されていた模様。
バスと道路標識と自動車を選択しながらLTを聞いておりました(すいません)
https://twitter.com/tori_toutoshi/status/1035442466449547264
総括すると時そばから見えてくる脆弱性は。任意の型の入力を許してしまった店員にある。
そしてその対応策として、通貨型以外を受け付けず、時刻を聞かれたら時刻型で返り値を与える女将を用意することである。
ということでした!
この後にgdbの使い方、ライブパッチなどのgdbの応用的なLTがありました。
原因を正しく理解することの納得感と原因究明の方法がテーマ!
他にもgdbのあんな使い方やこんな使い方も。
https://twitter.com/tori_toutoshi/status/1035442558158102528
スライドの公開は特にされておりませんでした。
最後には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時の長丁場でしたが、楽しく有意義でむしろ短いと感じさせるような、そんな時間でした!
この企画を主宰し場所を提供してくださった富士通さんに感謝!
というわけでそれではまた!