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