LinuxとWindowsを狙うマルウエアWellMess(2018-06-28)

マルウエアの中にはマルチプラットフォームで動作することを意図して作成されたものが存在し、その際に使用されるプログラミング言語として代表的なものがJavaです。たとえば、以前分析センターだよりで紹介したAdwindはJavaで作成されたマルウエアで、Windows以外のOSでも動作します。ご存知の通り、Java以外にもマルチプラットフォームで動作することを想定したプログラミング言語は存在し、Golangもその1つです。Javaで作成されたマルウエアに比べると少ないですが、Golangで作成されたものも確認されています。たとえば、Linuxに感染するマルウエアとして有名なMiraiもコントローラーにはGolangが使用されています。
今回は、JPCERT/CC で確認したマルウエアWellMessについて紹介します。WellMessは、Golangで作成され、クロスコンパイルによってLinuxとWindowsに対応したマルウエアです。なお、機能などの詳細に関しては株式会社ラックが公開しているレポートに詳しく解説されていますのでそちらをご覧ください。[1]

 

WellMessの挙動
一般的にGolangをコンパイルした実行ファイルは、動作するために必要なライブラリを多数抱えています。そのため、サイズが非常に大きくなる傾向にあり、WellMessも3Mバイト以上にあります。またもう1つの特徴として、実行ファイルの関数名がそのままファイル内に残っています。(ストリップされている場合でも、GoUtils2.0[2]などのツールを使用することで関数名を特定することができます。)WellMessでは、以下のような関数名が使われています。

_/home/ubuntu/GoProject/src/bot/botlib.EncryptText
_/home/ubuntu/GoProject/src/bot/botlib.encrypt
_/home/ubuntu/GoProject/src/bot/botlib.Command
_/home/ubuntu/GoProject/src/bot/botlib.reply
_/home/ubuntu/GoProject/src/bot/botlib.Service
_/home/ubuntu/GoProject/src/bot/botlib.saveFile
_/home/ubuntu/GoProject/src/bot/botlib.UDFile
_/home/ubuntu/GoProject/src/bot/botlib.Download
_/home/ubuntu/GoProject/src/bot/botlib.Send
_/home/ubuntu/GoProject/src/bot/botlib.Work
_/home/ubuntu/GoProject/src/bot/botlib.chunksM
_/home/ubuntu/GoProject/src/bot/botlib.Join
_/home/ubuntu/GoProject/src/bot/botlib.wellMess
_/home/ubuntu/GoProject/src/bot/botlib.RandStringBytes
_/home/ubuntu/GoProject/src/bot/botlib.GetRandomBytes
_/home/ubuntu/GoProject/src/bot/botlib.Key
_/home/ubuntu/GoProject/src/bot/botlib.GenerateSymmKey
_/home/ubuntu/GoProject/src/bot/botlib.CalculateMD5Hash
_/home/ubuntu/GoProject/src/bot/botlib.Parse
_/home/ubuntu/GoProject/src/bot/botlib.Pack
_/home/ubuntu/GoProject/src/bot/botlib.Unpack
_/home/ubuntu/GoProject/src/bot/botlib.UnpackB
_/home/ubuntu/GoProject/src/bot/botlib.FromNormalToBase64
_/home/ubuntu/GoProject/src/bot/botlib.RandInt
_/home/ubuntu/GoProject/src/bot/botlib.Base64ToNormal
_/home/ubuntu/GoProject/src/bot/botlib.KeySizeError.Error
_/home/ubuntu/GoProject/src/bot/botlib.New
_/home/ubuntu/GoProject/src/bot/botlib.(*rc6cipher).BlockSize
_/home/ubuntu/GoProject/src/bot/botlib.convertFromString
_/home/ubuntu/GoProject/src/bot/botlib.(*rc6cipher).Encrypt
_/home/ubuntu/GoProject/src/bot/botlib.(*rc6cipher).Decrypt
_/home/ubuntu/GoProject/src/bot/botlib.Split
_/home/ubuntu/GoProject/src/bot/botlib.Cipher
_/home/ubuntu/GoProject/src/bot/botlib.Decipher
_/home/ubuntu/GoProject/src/bot/botlib.Pad
_/home/ubuntu/GoProject/src/bot/botlib.AES_Encrypt
_/home/ubuntu/GoProject/src/bot/botlib.AES_Decrypt
_/home/ubuntu/GoProject/src/bot/botlib.generateRandomString
_/home/ubuntu/GoProject/src/bot/botlib.deleteFile
_/home/ubuntu/GoProject/src/bot/botlib.Post
_/home/ubuntu/GoProject/src/bot/botlib.SendMessage
_/home/ubuntu/GoProject/src/bot/botlib.ReceiveMessage
_/home/ubuntu/GoProject/src/bot/botlib.Send.func1
_/home/ubuntu/GoProject/src/bot/botlib.init
_/home/ubuntu/GoProject/src/bot/botlib.(*KeySizeError).Error

前述した通りWellMessには、Windowsで動作するもの(PEファイル形式)とLinuxで動作するもの(ELFファイル形式)が存在します。細かな違いはありますが、どちらも同じ機能を持っています。 このマルウエアは、HTTPを使用してサーバから命令を受信して動作します。以下は、通信の例です。
(User-Agentの値は検体毎に異なります。)

POST / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0
Content-Type: application/x-www-form-urlencoded
Accept: text/html, */*
Accept-Language: en-US,en;q=0.8
Cookie: c22UekXD=J41lrM+S01+KX29R+As21Sur+%3asRnW+3Eo+nIHjv+o6A7qGw+XQr%3aq+PJ9jaI+KQ7G.+FT2wr+wzQ3vd+3IJXC+lays+k27xd.+di%3abd+mHMAi+mYNZv+Mrp+S%2cV21.+ESollsY+6suRD+%2cx8O1m+%3azc+GYdrw.+FbWQWr+5pO8;1rf4EnE9=+WMyn8+8ogDA+WxR5R.+sFMwDnV+DFninOi+XaP+p4iY+82U.+hZb+QB6+kMBvT9R
Host: 45.123.190.168
Content-Length: 426
Expect: 100-continue
Accept-Encoding: deflate
Connection: Keep-Alive

pgY4C8 8JHqk RjrCa R9MS 3vc4Uk KKaRxH R8vg Tfj B3P,C 0RG9lFw DqF405. i3RU1 0lW 2BqdSn K3L Y7hEc. tzto yKU8 p1,E L2kKg pQcE1. b8V6S0Y 6akx, ggMcrXk 0csao Uwxn. fYVtWD rwt:BJ 5IBn rCMxZoo OsC. :ZXg pKT Re0 cJST1 L0GsC. 9dJZON9 qs29pPB pCTR:8 0hO0FK sK13UUw. jMA hDICL hGK1 qjRj1AY YMjAIeI. g7GEZPh gW:C eNX6 ptq kevfIyP. u,96r7c D:6ZiR fCC IIi cBvq,p. Vt96aEu JFLeu 0XtFJm ee4S 7M2. Uc68sF MArC5v 96ngG 9UvQGt 5:ut. qiE0xQ

命令の実行結果などはHTTP POSTリクエストのデータに含めて送信されます。送信するデータはRSAで暗号化されています。
Cookieヘッダーのデータは、RC6で暗号化されています。以下が復号した例です。データ内には、感染したホストを識別するための識別子(<;head;>に囲まれた値)などが含まれます。

<;head;>6F3C9B16C16074079AFCFF09C6717B0F07864FFE09C1E1DB003B3627D174913B/p<;head;><;title;>a:1_0<;title;><;service;>p<;service;>

以下はCookieヘッダーのデータを復号するコードの一部です。(なお、GitHub上で公開していますので、ご活用ください。)

def decode(data, key):
    sep = ';'

    field = data.split(sep)

    i = 1
    encdata = ""
    while i < len(field):
        value = field[i].split("=")
        encdata += value[1]
        i += 1

    encdata = urllib.unquote(encdata)
    encdata = encdata.replace("+", " ").replace("   ", "=").replace(". ", "").replace(" ", "").replace(",", "+").replace(":", "/")

    maindata = base64.b64decode(encdata)
    s = generateKey(base64.b64decode(key))

    i = 0
    decode = ""
    while i < len(maindata):
        orgi = rc6(maindata[i:i+16],s)
        decode += orgi
        i += 16

    print("Decrypted String: %s" % decode)

マルウエアはサーバから命令を受信した場合、以下の挙動を行う可能性があります。

  • 任意のシェルコマンド実行
  • ファイルのアップロード・ダウンロード

上記機能に加えてPEファイル形式の場合は、PowerShellスクリプトを実行する機能もあります。

.Net Frameworkで作成されたWellMess
さらに、このマルウエアにはGolangではなく.Net Frameworkで作成されたバージョンが存在することを確認しています。図1は、.Net Frameworkで作成された検体の通信時にCookieヘッダーに含まれるデータを作成するコードです。前述したGolang バージョンの検体のCookieデータをデコードした際と同じ文字列が使用されていることが確認できます。

図 1:Cookieに含まれるデータを作成するコード

なぜ攻撃者が2通りの実装を準備しているのか不明ですが、攻撃対象によってGolangと.Net Frameworkを使い分けているようです。

おわりに
WellMessはこれまでに、日本の組織で感染している事例が確認されており、今後もこのマルウエアを使った攻撃が行われる可能性があるため注意が必要です。
今回解説した検体のハッシュ値は、Appendix Aに記載しています。また、これまでJPCERT/CCで確認しているWellMessの通信先の一部はAppendix Bに記載していますので、アクセスしている端末がないかご確認ください。

分析センター 朝長 秀誠

参考情報
[1]株式会社ラック:サイバー救急センターレポート 第3号
https://www.lac.co.jp/lacwatch/pdf/20180614_cecreport_vol3.pdf
[2]GoUtils2.0
https://gitlab.com/zaytsevgu/GoUtils2.0/

Appendix A 検体のSHA-256ハッシュ値

  • 0b8e6a11adaa3df120ec15846bb966d674724b6b92eae34d63b665e0698e0193(Golang&ELF)
  • bec1981e422c1e01c14511d384a33c9bcc66456c1274bbbac073da825a3f537d(Golang&PE)
  • 2285a264ffab59ab5a1eb4e2b9bcab9baf26750b6c551ee3094af56a4442ac41(.Net&PE)

Appendix B 通信先一覧

  • 45.123.190.168
  • 103.13.240.46
  • 101.201.53.27
  • 185.217.92.171
  • 93.113.45.101
  • 191.101.180.78
≪ 前へ
トップに戻る
次へ ≫