MWSCup 2020 課題1
nao_sec / NTTセキュリティ・ジャパン株式会社
小池 倫太郎Copyright©2020 nao_sec All Rights Reserved.

問題担当
• 主担当
• NTTセキュリティ・ジャパン株式会社 小池倫太郎• 問題作成支援員• 株式会社エヌ・エフ・ラボラトリーズ 保要隆明

• レビュアー• デロイトトーマツサイバー合同会社 高田雄太
• nao_sec メンバー一同2

Copyright©2020 nao_sec All Rights Reserved.

事前連絡• WiresharkやFiddlerは必要ない• 例年のようにPCAPやSAZ形式での出題ではない• Windows環境の準備を推奨• Windowsに依存するような何か？
• 課題1と言えばDrive-by Download攻撃解析…

3

Copyright©2020 nao_sec All Rights Reserved.

概要• 難読化・解析妨害を含むJavaScriptコード解析• スクリプトを用いた攻撃は依然として人気• JavaScript / JScript• VBScript / VBA• PowerShell-> スクリプトを解析する技能は重要• Augma Datasetから解析の練習になりそうなデータを抽出し模倣• 手動解析
• 自動解析
-> 実務では解析作業を手動で行うのは現実的ではない

4

Copyright©2020 nao_sec All Rights Reserved.

概要• Exploit Kitのコードを模倣したJavaScriptの解析• RIG Exploit Kit• Capesand Exploit Kit• PurpleFox Exploit Kit• Bottle Exploit Kit-> 様々な難読化・解析妨害を含んでおり、それを適切に対処しつつ、スクリプトの本質的な部分を解析していく• アドバイス• 難読化・解析妨害は環境に依存させることが多い• Exploit Kitが動作する環境とは…？

5

Copyright©2020 nao_sec All Rights Reserved.

競技中の解説はここまで

6

Copyright©2020 nao_sec All Rights Reserved.

MWSCup 2020 課題1 解説
nao_sec / NTTセキュリティ・ジャパン株式会社
小池 倫太郎Copyright©2020 nao_sec All Rights Reserved.

解答について
12

108642018234567

Copyright©2020 nao_sec All Rights Reserved.

Q1: BASE64• atob()• Base64エンコーディングでエンコードされたデータの文字列をデコード• eval()• 文字列として表現されたJavaScriptコードを評価• 多くの難読化・解析妨害では最終的に式・コードの評価を行い、動的に実行する• 最終的に実行される部分のみを抜き出せば解析を楽できる

Flag is MWS{Hello, World!}

9Copyright©2020 nao_sec All Rights Reserved.

Q2: SIMPLE• evalの中で色々な処理をしている• 最終的に実行されるコードのみを抽出すれば良いので、evalを書き換えるだけ• 単純にevalという文字列を削除するだけでいい

Flag is MWS{SIMPLE_Obfuscation?}

10

Copyright©2020 nao_sec All Rights Reserved.

Q2: SIMPLE• evalの中身• Base64文字列をデコードすると "0('1' === '2') { 3 4_5_6 = '7{8_9?}'; }"• 数字部分に第4引数の文字列配列を入れ込んでいく• 0 -> if, 1 -> A, 2 -> B, 3 -> var, 4 -> mwscup…

11

Copyright©2020 nao_sec All Rights Reserved.

Q3: RIG Exploit Kit• 典型的な文字列操作 -> evalによる動的実行• evalによる実行は基本的に最後に行われる• "eval"という文字列をいかに生成するか？
• 今回は単純なエスケープと分割

Flag is MWS{rig_Rig_RIG!!!}12

Copyright©2020 nao_sec All Rights Reserved.

Q3: RIG Exploit Kit• evalに至るまで• 2段階の文字列操作
1. 2つの文字列データを順番に連結

13

Copyright©2020 nao_sec All Rights Reserved.

Q3: RIG Exploit Kit• evalに至るまで• 2段階の文字列操作
2. 合成された文字列データに含まれる文字を置換

14

Copyright©2020 nao_sec All Rights Reserved.

Q4: Capesand Exploit Kit• evalを見つけるだけ• evalに至るまで• 単純な文字列操作

Flag is MWS{Cape_sanD_CAPE_SAND}

15

Copyright©2020 nao_sec All Rights Reserved.

Q5: PurpleFox Exploit Kit• JavaScriptではないナニカ？
• 先頭が#@~^、末尾が^#~@という特徴

16Copyright©2020 nao_sec All Rights Reserved.

Q5: PurpleFox Exploit Kit• 素直に検索してみる

17

Copyright©2020 nao_sec All Rights Reserved.

Q5: PurpleFox Exploit Kit• Microsoft Script Encoder• <script language=“JScript.Encode“>• 古のテクノロジーで、Internet Explorerなどで動作• 単純なエンコードで、昔からデコーダがいくつも存在• scrdec18-VC8.exe• https://gist.github.com/bcse/1834878• CyberChef• https://gchq.github.io/CyberChef/18

Copyright©2020 nao_sec All Rights Reserved.

Q5: PurpleFox Exploit Kit• デコード後のデータ• 先頭に大きなライブラリみたいなコード• 暗号系のライブラリ？

• とりあえず無視して先を見る

19Copyright©2020 nao_sec All Rights Reserved.

Q5: PurpleFox Exploit Kit• デコード後のデータ• evalを発見 -> 実行されるコードを取得• もしInternet Explorer以外のブラウザを使用していた場合• デコードに失敗• なぜ失敗したのか？

20

Copyright©2020 nao_sec All Rights Reserved.

Q5: PurpleFox Exploit Kit• 細かくコードを見ていく• evalの直前で実行されていた関数• CryptoJSを使ったAES-256 CBCによるデコード• つまり先頭にあった大きなライブラリはCryptoJS• 必要なもの• 暗号化されたデータ
• 暗号鍵
• IV

21

Copyright©2020 nao_sec All Rights Reserved.

Q5: PurpleFox Exploit Kit• 細かくコードを見ていく• 暗号鍵とIVはすぐに見つかる• 暗号化されたデータ• Base64デコードしているだけかと思いきや、何か処理をしている

22

Copyright©2020 nao_sec All Rights Reserved.

Q5: PurpleFox Exploit Kit• 細かくコードを見ていく• 暗号化されたデータに対する処理• typeofの結果をもとに、XORで更にデータを加工• typeof([].find)とは？

ChromeInternet Explorer• 古いJavaScriptエンジンにはArray.findは実装されていない• （思い出しポイント）最初のJScript.EncodeはInternet Explorerなどで実行可能• Chromeでデコードに失敗 -> Internet Explorerで実行するのが正しい

Flag is MWS{Purp1e_F0X_4K}

23

Copyright©2020 nao_sec All Rights Reserved.

Q5: PurpleFox Exploit Kit• ブラウザや環境に依存する値を使った解析妨害• 標的を絞り込んだ攻撃ではよく見られる• いわゆる標的型攻撃以外にも、Region-Specificなバラマキ攻撃でも• よくあるテクニック• 実装差異• Internet Explorerと他のブラウザの差• 環境値• ブラウザやOSの言語設定• IPアドレスのGeolocation• エラーメッセージ• コマンドプロンプトなどで意図的にエラーを起こし、返ってくるエラーメッセージを使って暗号鍵を生成するなど

24

Copyright©2020 nao_sec All Rights Reserved.

Q6: Bottle Exploit Kit• evalっぽい処理を探してみるが、それっぽいものは見つからない• もしここで見つけられたとしても、解析妨害が邪魔をする可能性が高い• 適切な環境で、適切にeval処理を対処できればflagはすぐに手に入る• 先頭から雑に実行していく• 適切な環境以外で実行すると、無限ループに突入しクラッシュ• 適切な環境とは？

• 解析妨害処理が複数含まれていると思われる• 当たりをつけて、必要な箇所だけ実行していく必要がある

25

Copyright©2020 nao_sec All Rights Reserved.

Q6: Bottle Exploit Kit• ざっとコードを眺めて、重要そうな部分のみを読み解いていく• 先頭に重要そうなデータが定義されている• document.cookieと_0x069034に着目して処理を追っていく• document.cookie• 直後の即時関数内でcookieという文字列がいくつか存在 -> これは罠

• _0x069034• switch文の中でデータ処理らしき操作をしている

26

Copyright©2020 nao_sec All Rights Reserved.

Q6: Bottle Exploit Kit

Control Flow Flattening
27

Copyright©2020 nao_sec All Rights Reserved.

Q6: Bottle Exploit Kit• ざっとコードを眺めて、重要そうな部分のみを読み解いていく• _0x069034に対する操作• switch文の中でデータ処理らしき操作をしている• なんとなくは理解できるが、一部の情報はエンコードされてしまっている-> _0x2b13という関数の中で処理• _0x2b13()• _0x5e6f4bと_0x52b995の2つの引数を受け付ける• 序盤で定義されている大きな文字列配列_0x1833をデコード• その前に即時関数でなんらかの操作が行われている-> 即時関数と_0x2b13の処理を正確に追いかける必要がある

28

Copyright©2020 nao_sec All Rights Reserved.

Q6: Bottle Exploit Kit• ざっとコードを眺めて、重要そうな部分のみを読み解いていく• 即時関数• 大量のノイズコードが存在するが、やっていることは極めてシンプル• 文字列配列_0x1833をshiftしてpushする-> つまり順番を入れ替えているだけ• 0x2b13• 即時関数と同様に大量のノイズコードを削除• 第1引数で渡される_0x5e6f4bをindexとして文字列配列_0x1833のデータを取得• エンコード処理• Base64 Decode• URL Decode• RC4 Calc
• 第2引数の_0x52b995が鍵データとなる
29Copyright©2020 nao_sec All Rights Reserved.

Q6: Bottle Exploit Kit• ざっとコードを眺めて、重要そうな部分のみを読み解いていく• 改めて_0x069034に対する操作を見る• Control Flow Flattening• 制御フローを平坦化して、読みにくくする難読化手法• https://github.com/obfuscator-llvm/obfuscator/wiki/Control-Flow-Flattening• 単純化すると

30

Copyright©2020 nao_sec All Rights Reserved.

Q6: Bottle Exploit Kit• ざっとコードを眺めて、重要そうな部分のみを読み解いていく• 改めて_0x069034に対する操作を見る• _0x069034をBase64デコードし、それに対してXOR• 鍵となっているデータは_0x064183• _0x064183に対する操作を見る• switch文の直前でdocument.cookieの値を代入• switch文の中ではnavigator.vendorの値を使っている• navigator.vendorのlengthが0以上の場合、それを_0x064183に連結• navigator.vendorとは？
• ブラウザベンダー情報• ブラウザ依存のデータで、Internet Explorerの場合は空文字列

31

Copyright©2020 nao_sec All Rights Reserved.

Q6: Bottle Exploit Kit• ざっとコードを眺めて、重要そうな部分のみを読み解いていく• document.cookieに対する操作を見る• cookieという文字列で見ると解析妨害に巻き込まれる（前述）• documentという文字列で探していく32

Copyright©2020 nao_sec All Rights Reserved.

Q6: Bottle Exploit Kit• ざっとコードを眺めて、重要そうな部分のみを読み解いていく• document.cookieに対する操作を見る• 処理順としては今回のswitch文のほうが先• 単純化すると• navigator.systemLanguageとは？
• その名のとおり、システム言語を返す• Internet Explorerには実装されているが、Chromeなどには存在しない• Internet Explorerの場合 -> "ja-JP"
33

Copyright©2020 nao_sec All Rights Reserved.

Q6: Bottle Exploit Kit• ざっとコードを眺めて、重要そうな部分のみを読み解いていく• 最終的な鍵データ• 最初にdocument.cookieに代入された文字列 + "ja-JP"• 日本語のInternet Explorer以外で実行すると、異なる文字列となってしまう• 得られた鍵データを使って、データをデコードすることでflagが得られる• これら以外にも大量の解析妨害が含まれている• 詳細はこちら• https://nao-sec.org/2019/12/say-hello-to-bottle-exploit-kit.html

Flag is MWS{Bottle_Plane_JP}34

Copyright©2020 nao_sec All Rights Reserved.

Q7: 解析の自動化• Q1 ~ 6までの解析作業を自動化して欲しい• 実務では毎回手動で解析することは現実的ではない• 5分間で全てをデコードすればいいので、半自動 / 手動でもOK• アプローチ• ブラウザやエミュレータを使ったJavaScript解析• Headless ChromeやSelenium / WebDriver• JS-Walkerのようなツールの活用• https://www.nttsecurity.com/docs/librariesprovider3/resources/jswalker• 気合いで文字列操作
Flag is MWS{Enj0y_EK_0bfuscat0r}

35

Copyright©2020 nao_sec All Rights Reserved.

まとめ• 難読化・解析妨害を含むJavaScriptコード解析• 単純な難読化の他に、様々な環境依存値や解析妨害• 要点を見極め、必要な部分だけを効率的に解析• 解析の自動化• 実務では全てを手動で解析することは現実的ではない• 自動化できることは、なるべく自動化する• JavaScriptに限らず、他の言語でも解析経験は活用できる• 悪性ドキュメントファイルや標的型攻撃で使用されるPowerShellなど

36

Copyright©2020 nao_sec All Rights Reserved.

Any Questions?
@nao_sec
info@nao-sec.org

37

Copyright©2020 nao_sec All Rights Reserved.