悪意のあるペイロードのWAVファイルへの隠ぺい

By Anuj Soni

本ブログ記事は、2019年10月16日に米国で公開された抄訳版です。原文はこちらからご覧頂けます。

はじめに

ブラックベリーサイランスの脅威解析チームは最近、WAVオーディオファイルに埋め込まれ難読化された悪意のあるコードを発見しました。それぞれのWAVファイルは、そのファイルのオーディオデータ全体にわたって密かに織り込まれた悪意あるコンテンツを復号して実行する、ローダーコンポーネントと連結されていました。実行すると、一部のWAVファイルでは認識できる音質の問題やエラーのない音楽が再生されました。それ以外のファイルでは、雑音(ホワイトノイズ)のみが生じました。

弊社の解析では、一部のWAVファイルはXMRig MoneroのCPUマイナーに関連付けられたコードを有することが確認されています。別のファイルでは、リバースシェルの確立に使用されるMetasploitコードが含まれていました。どちらのペイロードも同一の環境で発見されており、金銭的な利益のためにマルウェアをデプロイし、被害者のネットワーク内でのリモートアクセスを確立する、両面キャンペーンを持ちかけています。

WAVファイルのローダーは、以下に述べる3つのカテゴリに分類できます。

  1. 1. PEファイルの復号および実行にLSB(Least Significant Bit)ステガノグラフィを用いるローダー
  2. 2. PEファイルの復号および実行にrand()ベースの復号アルゴリズムを用いるローダー
  3. 3. シェルコードの復号および実行にrand()ベースの復号アルゴリズムを用いるローダー

 

どのアプローチでも、攻撃者は、ほかの点では無害のファイル形式からコードを実行できるようになります。これらの手法は、攻撃者がコンテナフォーマットの構造や処理を損なわない限り、理論上、実行可能コンテンツをどのファイルタイプにも隠ぺいできることを示しています。潜在的なコードはメモリ上にしか現れないため、この方法を取り入れることで、難読化に新たな層が加わり、検知が一層困難になります。

弊社が発見したステガノグラフィのローダーが、Waterbug/Turla脅威アクターのアクティビティに関する Symantecの2019年6月の解析[1] でも識別されていたことは注目に値します。さらに、SymantecではエンコードされたMetasploitコードを有するWAVファイルも識別されました。別々の脅威アクターが同等のツールを使用することがあるため、決定的な特定は困難ですが、こうした類似性は、攻撃の関連性を示すと考えられます。また、弊社の解析は主としてローダーに重点を置いていますが、このローダーは追加コードの起動のために実行の初期段階で使用されます。別々の脅威アクターが、関連のない第2段階のマルウェアを実行するために、公開されている同じローダーを使用することもあります。

ローダー

ステガノグラフィのPEローダー

概要

ローダーの第1のカテゴリでは、ステガノグラフィを使用してWAVファイルから実行可能コンテンツを抽出します。ステガノグラフィは、ターゲットファイルに関する疑いを抱かせることなく、理想的に、ファイルやメッセージを別のファイルの中に隠ぺいする手法です。攻撃者は、これまでステガノグラフィ技術を使用して、データを隠ぺいしてきました。現に、ブラックベリーサイランスの脅威解析チームは、4月にOceanLotus Threat Groupがステガノグラフィを活用し、悪意のあるバックドアペイロードをイメージファイルに隠ぺいした手法を記載した レポート[2] を公開しました。この事例では、最下位ビット(LSB)手法によってオーディオファイル内にコードが隠ぺいされています。この手法では、個々のバイトで右端のビットに対象となるデータを入れます。弊社が発見した 公開されている[3]  WAVファイルローダーの1つには、以下の特徴があります。

SHA-256

595A54F0BBF297041CE259461AE8A12F37FB29E5180705EAFB3668B4A491CECC

ファイルタイプ

PE32+ 実行可能ファイル (GUI) x86-64、MS Windows用

サイズ

107,008 バイト

コンパイルタイムスタンプ

2018-05-29(火)、13:07:05 UTC

PDB パス

f:\w\xmrig\iskander\x64\release\iskander.pdb

バージョン情報

言語:アメリカ英語
会社名:マイクロソフト
ファイル記述:Microsoft Media Player
ファイルバージョン:12.6.7600.16385
著作権:マイクロソフトAll rights reserved.
元のファイル名:MSTCSS.EXE
製品名:Microsoft Windows オペレーティング システム
製品のバージョン:15.3.7600.16385


ここでは詳細を説明しませんが、このローダーの32ビットバージョンも 公開されている[4]ことに留意してください。

本稿記載の他のローダーと異なり、このローダーはハードコーディングされた文字列を有し、ロードするファイル名(Song.wav)と、復号後に実行するエクスポート関数(Start)が指定されています。Song.wavファイルは以下のZIPファイル内で 公開されています。[5] 

SHA-256

DB043392816146BBE6E9F3FE669459FEA52A82A77A033C86FD5BC2F4569839C9

ファイル名

Song.wav

ファイルタイプ

RIFF (リトルエンディアン)データ、WAVE audio, Microsoft PCM, 16 ビット、ステレオ 44100 Hz

サイズ

15,179,596


起動すると、ローダーはSong.wavを読み取り(同一ディレクトリにあることが前提)、メモリ内でDLLを抽出して、「Start」のエクスポートを実行します。エクスポートされた以下のファイルはXMRig MoneroのCPUマイナーに関連付けられます。

SHA-256

A2923D838F2D301A7C4B46AC598A3F9C08358B763B1973B4B4C9A7C6ED8B6395

ファイルタイプ

PE32+ 実行可能ファイル (DLL) (コンソール) x86-64、MS Windows用

サイズ

733,696 バイト

コンパイルタイム

2018-05-28(月)、19:45:53 GMT

PDB パス

n/a

エクスポート

Start

バージョン情報

言語:依存しない
会社名:www[.]xmrig[.]com
ファイル記述:XMRig CPUマイナー
ファイルバージョン:2.6.2
著作権:Copyright (C) 2016-2018 xmrig[.]com
製品名:XMRig
製品のバージョン:2.6.2


攻撃者は、CPUマイナーをデプロイして処理リソースを奪い、暗号通貨のマイニングから収益を得ます。暗号通貨マイナーは、金銭的な利益をもたらし、ユーザーが知らない間にバックグラウンドで動作することを意図しているため、幅広く使用されるマルウェアペイロードです。暗号通貨マイニングボットネットは、攻撃者に、1ヶ月あたり数千ドルをもたらすこともあります。

技術的な詳細

WAV(RIFF)ファイルのヘッダーは44バイト長で、最後の4バイトはデータセクションのサイズを示します。Song.wavのデータサイズは、以下に示す通り、0xE79F20(リトルエンディアン)、つまり15,179,552バイトです。

図1:WAVファイルのヘッダーのデータサイズ

下記のコードスニペットでは、ローダーがその4バイトを読み込み、その値を使用してメモリに領域を割り当てています。その後、データを読み込み、WAVファイルを閉じます。最後に、DO-WHILEループが、最初の64バイトの範囲で他のすべてのバイトに対し繰り返され(つまり、1バイトのスキップ)、LSBが抽出されて復号されたデータのサイズを確定します。


図2:復号ファイルのサイズ

上記のコードをさらに適切に理解するためには、counterが32未満の間ループが実行され、繰り返されるたびにcounterが1インクリメントすることを認識する必要があります。また、data_offsetはエンコードされたデータ内のオフセット値を表し、その値はゼロから始まり、繰り返されるたびに2ずつインクリメントします。このループは、以下に示す通り、データのうちの最初の、合計64バイト(32*2)を対象にします。

図3:WAVファイルのデータの64バイト

各バイトが処理される間、ローダーはLSBを抽出し、それを31(左端のビット)から開始して繰り返しごとに1ずつデクリメントしながら、decoded_sizeの該当するビット位置に割り当てます。データの最初の64バイトにこのアルゴリズムを適用することで、以下の値が得られます(スキップされたバイトは含まれない)。

16進数

バイナリ(下線部がLSB)

ビット位置

ビット位置に割り当てられたLSB

FC

11111100

31

00000000 00000000 00000000 00000000

E6

11100110

30

00000000 00000000 00000000 00000000

06

00000110

29

00000000 00000000 00000000 00000000

06

00000110

28

00000000 00000000 00000000 00000000

00

00000000

27

00000000 00000000 00000000 00000000

00

00000000

26

00000000 00000000 00000000 00000000

00

00000000

25

00000000 00000000 00000000 00000000

00

00000000

24

00000000 00000000 00000000 00000000

02

00000010

23

00000000 00000000 00000000 00000000

02

00000010

22

00000000 00000000 00000000 00000000

00

00000000

21

00000000 00000000 00000000 00000000

00

00000000

20

00000000 00000000 00000000 00000000

FF

11111111

19

00000000 00001000 00000000 00000000

FE

11111110

18

00000000 00001000 00000000 00000000

FF

11111111

17

00000000 00001010 00000000 00000000

FF

11111111

16

00000000 00001011 00000000 00000000

FE

11111110

15

00000000 00001011 00000000 00000000

FE

11111110

14

00000000 00001011 00000000 00000000

FF

11111111

13

00000000 00001011 00100000 00000000

FF

11111111

12

00000000 00001011 00110000 00000000

FE

11111110

11

00000000 00001011 00110000 00000000

FE

11111110

10

00000000 00001011 00110000 00000000

FF

11111111

9

00000000 00001011 00110010 00000000

FE

11111110

8

00000000 00001011 00110010 00000000

FC

11111100

7

00000000 00001011 00110010 00000000

FC

11111100

6

00000000 00001011 00110010 00000000

FC

11111100

5

00000000 00001011 00110010 00000000

FC

11111100

4

00000000 00001011 00110010 00000000

FE

11111110

3

00000000 00001011 00110010 00000000

FE

11111110

2

00000000 00001011 00110010 00000000

00

00000000

1

00000000 00001011 00110010 00000000

00

00000000

0

00000000 00001011 00110010 00000000


最後の32ビットバイナリ値00000000 00001011 00110010 00000000は、16進数表記では0xB3200、10進数値では733,696です。この値がdecoded_sizeに配置されます。

次に、decoded_sizeの容量のメモリが割り当てられ、さまざまな計算が行われます。すべての計算の結果を指し示すように既定のラベル名が変更されます。これらの数値は、以下の通り、次の復号ループの中で、エンコードされたデータへのオフセットとして使用されます。


図4:メモリの割り当てとオフセットの計算

上記のコードに続き、以下の通り、DO-WHILEループによって、エンコードされたデータの残りの復号が開始されます。

図5:復号ファイルのコンテンツ

前の復元ループと同様に、このループは他のすべてのバイトのLSBを抽出します。ただし、最下位(右端)のビット位置にビットを割り当てることから開始する点が異なっています。各繰り返しで、8バイトからLSBが抽出され、8ビット(1バイト)の復号されたデータを形成します。このアルゴリズムを使用し、2バイトの復号されたデータを生成してみましょう。8ビットは1回復号されたバイトから成り、1つのLSBはエンコードされた2バイトごとに抽出されるため、復号された2バイトを生成するには、エンコードされた32バイトが必要になります(復号された2バイト*復号されたバイトあたり8LSB*2=32)。

図6:32バイトのエンコードされた データ

復号されたデータの最初のバイトは、以下のように生成されます(エンコードされたバイトのうちスキップされたバイトは含まれない)。

16進数

バイナリ(下線部がLSB)

ビット位置

ビット位置に割り当てられたLSB

01

00000001

0

00000001

00

00000000

1

00000001

FF

11111111

2

00000101

FF

11111111

3

00001101

FC

11111100

4

00001101

FC

11111100

5

00001101

FD

11111101

6

01001101

FC

11111100

7

01001101


復号されたデータの第2バイトは、以下のように生成されます(ここでも、エンコードされたバイトのうちスキップされたバイトは含まれない)。

16進数

バイナリ(下線部がLSB)

ビット位置

ビット位置に割り当てられたLSB

FE

11111110

0

00000000

FF

11111111

1

00000010

00

00000000

2

00000010

01

00000001

3

00001010

FF

11111111

4

00011010

FE

11111110

5

00011010

FB

11111011

6

01011010

FA

11111010

7

01011010


その結果、最初の2バイトは、それぞれ、バイナリ値01001101と01011010になります。両バイトの16進数表記は0x4D5Aで、通常Windows Portable Executable(PE)ファイルの先頭に見られる既知の「MZ」バイトを意味します。

DO-WHILEループは、XMRig DLLがメモリに生成されるまで繰り返されます。最後に、復号されたDLLがメモリにマッピングされ、「Start」がエクスポートされて暗号通貨マイニングのアクティビティが起動します。

rand()ベースのPEローダー

概要

ローダーの第2のカテゴリでは、rand()ベースの復号アルゴリズムを使用し、PEファイルを隠ぺいします。このローダーの一例は 公開されていて[6] 以下の特徴を有しています。

SHA-256

843CD23B0D32CB3A36B545B07787AC9DA516D20DB6504F9CDFFA806D725D57F0

ファイルタイプ

PE32+ 実行可能ファイル (GUI) x86-64、MS Windows用

サイズ

156,672 バイト

コンパイルタイムスタンプ

2018-06-06(火)、11:09:52 UTC

PDB パス

d:\source\mining\wavdllplayer\x64\release\wavdllplayer.pdb

バージョン情報

言語:アメリカ英語
会社名:マイクロソフト
ファイル記述:Windowsタスクのホストプロセス
ファイルバージョン:10.0.16299.15
著作権:マイクロソフトAll rights reserved.
元のファイル名:taskhostw.exe
製品名:Microsoft® Windows® オペレーティング システム
製品のバージョン:10.0.16299.15


このローダーでWAVファイルをロードするには、以下のコマンドラインを使用する必要があります。

<ローダー実行ファイル> <WAVファイル> <復号されたPEファイルのエントリポイント>

互換性がある(そして、 公開されている[7])WAVファイルの例は、以下の特徴を有しています。

SHA-256

7DC620E734465E2F5AAF49B5760DF634F8EC8EEAB29B5154CC6AF2FC2C4E1F7C

ファイル名

click.wav

ファイルタイプ

RIFF(リトルエンディアン)データ、Wave Audio、Microsoft PCM、8ビット、モノラル44100Hz

サイズ

733,740 バイト


詳述したWAVファイルとは異なり、このオーディオファイルには正当なヘッダーがありますが、再生すると、音楽はなく、ホワイトノイズのような音がします。

上記WAVファイルでローダーを実行すると、ローダーはそのファイルを読み込み、メモリ内でDLLを抽出して、指定のエントリポイントを実行しようとします。第1のカテゴリのケースと同様、抽出される以下のファイルはXMRig MoneroのCPUマイナーに関連付けられます。

SHA-256

ED58FDB450D463B0FE3BBC6B9591203F6D51BF7A8DC00F9A03978CECD57822E1

ファイルタイプ

PE32+ 実行可能ファイル(DLL)(コンソール)x86-64、MS Windows用

サイズ

733,696 バイト

コンパイルタイムスタンプ

2018-05-28(月)、19:45:53 GMT

PDB パス

n/a

エクスポート

Start

バージョン情報

言語:依存しない
会社名:www[.]xmrig[.]com
ファイル記述:XMRig CPUマイナー
ファイルバージョン:2.6.2
著作権:Copyright (C) 2016-2018 xmrig[.]com
元のファイル名:xmrig.exe
製品名:XMRig
製品のバージョン:2.6.2


現に、このファイルの最後の4バイト以外は、Song.wavから復号されたDLLとほぼ同一です(詳細は次のセクションを参照のこと)。

技術的な詳細

このローダーを実行すると、WAVファイルのヘッダーを読み込み、データサイズの抽出とそれに基づくメモリの割り当てを行い、WAVデータを新たに割り当てたメモリに格納します。次に、ローダーはWAVファイルのデータコンテンツを復号するコードにアプローチします。

図7:rand()ベースのPEローダーの復号ループ

size_of_dataはWAVファイルのヘッダーから抽出されたデータサイズを表し、wave_dataにはエンコードされたWAVデータのアドレスが入っていることに留意してください。 ローダーは、strand()に対する初期コールおよびrand()に対する繰り返しコールを使用し、WAVデータからPEファイルを抽出します。 マイクロソフトのWebサイト[8]に記載されているとおり、srand() APIは「現在のスレッドに一連の疑似乱数の整数を生成するための初期値を設定」し、rand APIは「生成された疑似乱数を取得」します。srand()に与えられたシードがあると、rand()に対するコールは、そのたびに同じ疑似乱数を返します。

DO-WHILEループでは、エンコードされたバイトからrand()の出力を差し引いた結果に差し替えながら、エンコードされたデータの各バイトを横断します。例として、以下に示されたデータの最初の2バイトを復号してみましょう。

このセクションで既に指定したローダーとWAVファイルを使用して、0x309のsrand() シード値での最初の2回の繰り返しにおける値を以下の表に示します。

実行されたループ

WAVデータ(バイト)

Rand()の出力 (下位バイト)      

差分

1

0x5C

0x0F

0x5C - 0x0F = 0x4D

2

0x99

0x3F

0x99 - 0x3F = 0x5A


この最初の2バイトは、通常Windowsの実行ファイルの先頭に存在する「MZ」の特徴を示しています。ループでデータバイトのすべてが処理されると、XMRig MoneroのCPUマイナーに関連付けられた64ビットのDLLが生成されます。生成されたDLLは、Song.wavから復号されたDLLとは4バイトしか異なりません。    


図8:復号されたclick.wav とSong.wavの比較

その4バイトがなぜ異なるのかは不明ですが、DLLの機能には影響しないことから、XMRig DLLファイルは、事実上、同一のものと言えます。

次に、ローダーは、コマンドラインで指定されたエクスポートのアドレスを取得します。アドレスがある場合、ローダーはそれを実行するスレッドを起動します。

図9:エクスポートのアドレスの特定とそれを実行するスレッドの起動

rand()ベースのシェルコードローダー

概要

ローダーの第3カテゴリは、rand()ベースの復号アルゴリズムを使用し、PEファイルを隠ぺいします。このローダーの一例は 公開されていて[9] 、以下の特徴を有しています。

SHA-256

DA581A5507923F5B990FE5935A00931D8CD80215BF588ABEC425114025377BB1

ファイルタイプ

PE32+ 実行可能ファイル(GUI)x86-64、MS Windows用

サイズ

90,112 バイト

コンパイルタイムスタンプ

2018l-06-18(月)、18:54:48 UTC

PDB パス

D:\source\mining\wavPayloadPlayer\x64\Release\wavPayloadPlayer.pdb

バージョン情報

言語:アメリカ英語
会社名:マイクロソフト
ファイル記述: Windowsタスクのホストプロセス
ファイルバージョン:10.0.16299.15(WinBuild.160101.0800)
著作権:マイクロソフトAll rights reserved.
元のファイル名:taskhostw.exe
製品名:Microsoft Windows オペレーティング システム
製品のバージョン:10.0.16299.15


このローダーでWAVファイルをロードするには、以下のコマンドラインを使用する必要があります(エントリポイントは不要)。

<ローダー実行ファイル> <WAVファイル>

前のローダーと同様、このローダーと対になるどのオーディオファイルもホワイトノイズだけで、音楽的なコンテンツは一切ありません。起動すると、このローダーは、互換性のあるWAVファイルを開き、そのデータの読み込み、コンテンツを復号した後、シェルコードを実行しようとします。

公開された互換性のあるWAVファイルの例はありませんが、発見されたいずれのファイルにも、指定されたIPアドレス対し、リバースシェルを起動するMetasploitコードが含まれていました。

技術的な詳細

前のローダーと同様、このローダーはWAVファイルのヘッダーを読み込み、データサイズの特定とメモリの割り当てを実行してデータを読み込みます。復元コードは事実上同一で、同じsrand()のシードを使用します。

図10:rand()ベースのシェルコードローダーの復号ループ

注目すべき唯一の違いは、復号ループ終了直後のCreateThreadに対するコールです。このローダーはシェルコードしか扱わないため、ファイル構造を解析するサポート用コードを必要としません。

2つのWAVファイルから復号されたシェルコードの解析によって、Metasploitの リバースTCP[10] および リバースHTTPS[11]のコードと著しく類似していることが明らかになりました。いずれの場合も、シェルコードによるIPアドレス94.249.192.103への接続の試みがありました。リバースTCP接続はポート3527を介して行なわれ、リバースHTTPS接続はポート443を介して行なわれます。

まとめ

攻撃者は、さまざまなファイル形式から成る複数のファイルの扱いなど、コードの実行に対するアプローチにおいて巧妙さを発揮しています。弊社は、インターネット上で、WAVオーディオファイルから悪意のあるコードを抽出して実行するいくつかのローダーを発見しました。解析によって、マルウェアの作成者がステガノグラフィや他のエンコード技術を組み合わせて使用し、難読化の解除やコードの実行を行なったことが明らかになりました。こうした方法は、攻撃者による実行可能コンテンツの隠ぺいを可能にし、検知作業を困難にします。今回のケースでは、攻撃者は難読化を使用して、暗号通貨マイニングアクティビティの実行、およびコマンドと制御に対するリバース接続の確立の両方を行いました。これらの方法と既知の脅威アクターTTPの類似性は、おそらく直接的な帰属を避けるために、敵対的なアクティビティをエミュレートする関連性や意思を示していると考えられます。

付録

情報漏えいの痕跡(IOC)

痕跡

タイプ

説明

595A54F0BBF297041CE259461AE8A12F37FB29E5180705EAFB3668B4A491CECC

SHA-256

ステガノグラフィローダー

843CD23B0D32CB3A36B545B07787AC9DA516D20DB6504F9CDFFA806D725D57F0

SHA-256

PEローダー

DA581A5507923F5B990FE5935A00931D8CD80215BF588ABEC425114025377BB1

SHA-256

シェルコードローダー

DB043392816146BBE6E9F3FE669459FEA52A82A77A033C86FD5BC2F4569839C9

SHA-256

WAVファイル

7DC620E734465E2F5AAF49B5760DF634F8EC8EEAB29B5154CC6AF2FC2C4E1F7C

SHA-256

WAVファイル

94.249.192.103

IP アドレス

シェルコードのIPアドレス


Rand()がエンコードされたWAVファイルに対するYARAルール

   
rule rand_encoded_wav
{
  strings:
  $RIFF = "RIFF"
  $WAVE = "WAVE"

  $SHELLCODE = {0B 87 06 53 DF 3A}
  $MZ = {5C 99 13 6F F2 52}

  condition:
  $RIFF at 0 and $WAVE at 8 and ($MZ at 44 or $SHELLCODE at 44)
}


MITRE ATT&CKの技術

戦術

ID

名前

説明

防御回避

T1027

難読化されたファイルまたは情報

ステガノグラフィを使用して、WAVオーディオファイル内にPEファイルを隠ぺいします。

実行

T1059

コマンドラインインターフェイス

エンコードされたシェルコードがMetasploitコードを実行して、リバースシェルが開始されます。

コマンドアンドコントロール

T1043

一般的に使用されるポート

ポート443を介してリバースHTTPS接続が行われます。

コマンドアンドコントロール

T1065

まれに使用されるポート

ポート527を介して、リバースTCP接続が行われます。


引用

[1] https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments

[2] https://www.cylance.com/ja_jp/blog/jp-report-oceanlotus-apt-group-leveraging-steganography.html

[3] https://www.virustotal.com/gui/file
/595a54f0bbf297041ce259461ae8a12f37fb29e5180705eafb3668b4a491cecc/detection

[4] https://www.virustotal.com/gui/file
/d0b99353cb6500bb18f6e83fe9eed9ce16e5a8d5b940181e5eafd8d82f328a59/detection

[5] https://www.virustotal.com/gui/file
/4fd1d0671395b1b0815b0704d31af816779a6a0a516ea6f82a9196f18bf513cc/detection

[6] https://www.virustotal.com/gui/file
/843cd23b0d32cb3a36b545b07787ac9da516d20db6504f9cdffa806d725d57f0/detection

[7] https://www.virustotal.com/gui/file
/7dc620e734465e2f5aaf49b5760df634f8ec8eeab29b5154cc6af2fc2c4e1f7c/detection

[8] https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/srand?view=vs-2019

[9] https://www.virustotal.com/gui/file
/da581a5507923f5b990fe5935a00931d8cd80215bf588abec425114025377bb1/detection

[10] https://github.com/rapid7/metasploit-framework/blob/master/external/source/shellcode/windows/x64/src/block/block_reverse_tcp.asm

[11] https://github.com/rapid7/metasploit-framework/blob/master/external/source/shellcode/windows/x64/src/block/block_reverse_https.asm

Tags: