マルウェア解析奮闘記 Powershell多用マルウェアの解析
先月、複数の情報ソースから同様のフィッシングメールの報告を受けました。メール本文は日本語、おとりのファイルも受信組織の業種に関連するものでした。そして、添付ファイルはPowerShellスクリプトを含むショートカットでした。
以下に、概要および解析結果を記します。
■概要
フィッシングメールにショートカットがZIP圧縮されて添付されており、数個のPowerShellおよび実行ファイルが多段で利用されている一連の攻撃となっています。
最終的なマルウェアは入手できおらず、攻撃者の意図は残念ながら把握できておりませんが、メール本文およびおとりのファイルから察するに標的型攻撃の可能性がございます。また、ショートカット攻撃およびPowerShellスクリプトが絡む攻撃は年々増加しているため、ユーザ教育(ショートカットは実行してはいけない)や実行制限をご検討ください。
図、攻撃の全体像
■解析結果および手順
添付ファイルはzipファイルで、中身が以下のショートカットでした。
図、添付ファイルのzipに含まれていたショートカット
リンク先からpowershell.exeを実行していることがわかります。さらに「実行時の大きさ」を確認すると「最小化」と設定されています。これはPowerShellを実行した際に、コマンドプロンプトを見せないようにするための工夫と思われます。
以下はショートカットから抽出した「リンク先」の中身です。
powershellスクリプトが含まれていることがわかります。
「-enc」がついているため、スクリプト本体はBase64でエンコードされています。
ただし、ショートカットの「リンク先」は260文字しか表示されておらず、実はその続きがあります。そのため、ショートカットのバイナリから全体を抽出しなければなりません。
図、バイナリエディタ(FileInsight)でショートカットを開いた画面
0x307(選択箇所)から「リンク先」が続きます。0x3C7(赤い矢印)からはBase64でエンコードされたPowerShellスクリプトが始まります。まずはそれをデコードします。
図、FileInsightでBase64をデコードした結果
※FileInsightは選択箇所に対して様々なエンコード/デコードができます。
下部に「New-Object」という文字列が見えるようになりました。
テキストエディタで抽出した文字列を開いてみます。
■PowerShellスクリプト①
テキストエディタで開いた結果(※改行を追加しています)
まず1行目はテキストファイル(d.txt)をダウンロードし、テンポラリーフォルダにProcess.txtとして保存しています。
2行目はダウンロードしたものをメモ帳(notepad)で開いています。
3行目はファイル(t.ps1)をダウンロードし、さらにPowerShellとして実行しています。
4行目は「detxt」という関数を実行しています。
1行目、2行目はおとりファイルのテキストファイルをダウンロードして、開く処理をします。つまり、ユーザがショートカットをダブルクリックするとテキストファイルが表示され、ユーザはマルウェアが裏で動作しているということがわかりません。
その間に3行目、4行目で新しいPowerShellスクリプト②をダウンロードし、実行します。
■PowerShellスクリプト②
1行目で「detxt」という関数を定義しています。
4~8行目で受け取ったパラメータを$URL変数に格納しています。
10~28行目でファイルをダウンロードしています。
12行でUser-Agentを「Mozilla/4.0+」設定しています。特徴的なので、Proxyログから見つけられる可能性があります。
29行目でダウンロードされたテキストをスペース(「' '」)区切りでByteの配列に代入し、次の行で各バイトをスタートアップフォルダの実行ファイル(exe)で保存し、最後の31行目で実行しています。
実際にダウンロードされるテキストファイルはPowerShellスクリプト①の4行目で指定されております。
以下がそのテキストファイルの中身の抜粋となります。
図、EXEの元データとなるテキストファイル
ご覧のとおり、数字の羅列です。1つの数字が生成されるファイルの1バイトに相当します。最初に注目すると、「77 90」から始まっていますが、これは実行ファイル(EXE)のPEヘッダーに含まれる「MZ」のアスキーコードとなります。
上記のテキストファイルからEXEを生成するPythonスクリプト
txtfilepath = 't.txt' #input file binfilepath = 'svcmondr.bin' #output file with open(txtfilepath, 'r') as content_file: content = content_file.read() with open(binfilepath,'wb') as output: output.write(bytearray(int(i,10) for i in txt.split())) |
■実行ファイル
出来上がったEXEをIDA Proで解析します。
図、EXEに含まれている関数の相関図
mainからは呼び出されている関数は攻撃者が用意したfunc_xor以外はWindowsAPI関連のものしかありません。プロセスを実行するものであるということがわかります。
図、XOR復号ルーチン
復号鍵はハードコーディングされており、「0x0C」で、XORで復号するバイト数は0x4E4も書かれていました。
図、鍵情報がふくまれている箇所
復号する箇所、サイズ、鍵情報がわかったので、実際に復号します。
図、EXEに含まれるXORされたデータ(抜粋)
XORされている箇所が603C(赤い矢印)から始まります。
図、XOR復号したデータ(抜粋)
ここで再びPowerShellスクリプトが出てきます。PowerShellスクリプト①同様にBase64でエンコードされているので、デコードします。
図、EXEに含まれているPowerShellスクリプト
■PowerShellスクリプト③
抽出したPowerShellスクリプトがこちらです。
8行目でindex.aspのコンテンツをダウンロードし、6行目の鍵でXORしています。そこで得られた文字列を9行目のIEX関数でPowerShellスクリプトとして実行しています。
残念ながら、上記のダウンロード先は調査時にはコンテンツが変わっており、無意味な文字列が含まれていたため、調査はここで打ち切りとなりました。
■結論
ダウンローダとして、PowerShell、実行ファイルが多段で利用された攻撃でしたが、攻撃者の意図としては、やはり検知・解析されにくくすることだと思います。
PowerShellは従来悪用されてきたJScript、VBScript同様、難読化が行え、メモリ上での実行が可能であることから、検知が難しく、今後サイバー攻撃で悪用されるケースはますます増えると考えられます。
フォローしませんか?