YouTubeを利用しクリプトマイニング(暗号通貨採掘)を行うStantinkoボットネットを発見
Stantinkoボットネットを操るサイバー犯罪者が、乗っ取ったコンピューターに難読化されたクリプトマイニングモジュールを拡散していることを、ESETの研究者が突き止めました。
Stantinkoボットネットを操るサイバー犯罪者が、乗っ取ったコンピューターに難読化されたクリプトマイニングモジュールを拡散していることを、ESETの研究者が突き止めました。
Stantinkoボットネットを操る攻撃者は、乗っ取ったコンピューターから利益を得るための新しい手段としてツールセットを拡張しています。少なくとも2012年以降からこのボットネットは活動を開始していることが知られており、主にロシア、ウクライナ、ベラルーシ、カザフスタンのユーザーを標的に、約50万以上のボットネットがクリプトマイニングモジュールを拡散しています。仮想通貨モネロ(Monero)は、2019年には為替レートが50〜110米ドルで変動していますが、少なくとも2018年8月からこのボットネットが利益を生み出すために利用されています。Stantinkoボットネットは、それ以前にはクリック詐欺、広告の挿入、ソーシャルネットワーク詐欺、パスワードの盗み出しの攻撃を行っていました。
この記事では、Stantinkoのクリプトマイニングモジュールについて説明し、その機能について分析します。
このクリプトマイニングモジュールの最も注目すべき機能は、分析を妨害して検出を回避する難読化です。ソースレベルで無作為に難読化し、Stantinkoのオペレーターが新しい標的毎にこのモジュールをコンパイルしていることから、モジュールの各検体は一意になっています。
今回、このモジュールの難読化技術について説明し、マルウェアアナリスト向けの別の記事でこれらの手法のいくつかに対処するアプローチについて提案します。
Stantinkoは絶えず新しい機能を開発し、独自の難読化ツールとモジュールをさらに巧妙にしています。これらツールやモジュールは高度に難読化されていることから、追加された軽微な機能改善や変更を追跡するのは困難です。そのため、過去の検体と比較して重要な変更についてのみ説明しています。この記事では、現在のクリプトマイニングモジュールについてのみ説明します。
Stantinkoのクリプトマイニングモジュールは、仮想通貨を採掘するため、乗っ取ったマシンのリソースのほとんどを使い果たします。このモジュールは、オープンソースのクリプトマイナーであるxmr-stakを大きく改変したものです。検出を回避する目的で、すべての不要な文字列や特定の機能全体が削除されています。残った文字列や機能は高度に難読化されています。ESETのセキュリティ製品は、このマルウェアをWin{32,64}/CoinMiner.Stantinkoとして検出します。
CoinMiner.Stantinkoはマイニングプールと直接通信するわけではありません。YouTubeの動画の説明文から取得されるIPアドレスのプロキシを介して通信します。YouTubeの動画の説明文にデータを隠す同様の手法は、銀行を標的とするマルウェアであるCasbaneiroでも使用されています。
Casbaneiroが使用するYouTubeは正当なチャネルのように偽装するテクニックにはるかに優れていますが、C&Cを暗号化して保存するという目的は同じです。
これらの動画の説明文は、16進形式のマイニングプロキシのIPアドレスで構成される文字列になっています。たとえば、図1に示すYouTube動画には、「03101f1712dec626」という説明がありますが、これは、16進形式の2つのIPアドレスです。03101f17は、ドットで区切られた4つの10進数である3.16.31[.]23に対応し、12dec626は18.222.198[.]38に対応します。このブログを執筆した時点では、この形式はわずかに調整されています。現在、IPアドレスは「!!!!」で囲まれており、構文解析処理が非常に簡単になっています。これにより、YouTube動画のHTML構造が変更されてパーサーが機能しなくなる変更も防止しています。
以前のバージョンでは、YouTubeのURLはCoinMiner.Stantinkoバイナリにハードコーディングされていました。現在は、このモジュールはコマンドラインのパラメータとして動画の識別子を受け取ります。このパラメータは、https://www.youtube.com/watch?v=%PARAM%の形式でYouTubeのURLを作成するために使用されます。クリプトマイニングモジュールは、バッチファイル(ESETではこのバッチファイルをまだ入手していません)を介して、%TEMP%\%RANDOM%\%RANDOM_GUID%.dllのフォームのローカルファイルシステムの場所からロードされたモジュールを使用して、StantinkoのBEDSコンポーネントまたはrundll32.exe のいずれかによって実行されます。
ESETは、YouTubeに対してこの不正行為を通知しており、これらの動画を含むすべてのチャンネルは削除されています。
今回の分析では、クリプトマイニングモジュールを、異なる機能がある4つの論理部分に分割しました。メイン部分は実際のクリプトマイニングを実行します。モジュールの他の3つの部分は次の追加機能を実行します。
クリプトマイニング機能の中核となるのは、ハッシュ化のプロセスとプロキシとの通信です。マイニングプロキシのリストを取得する方法は上記で説明しています。CoinMiner.Stantinkoは、稼動していることが確認できた最初のマイニングプロキシとの通信を開始します。
プロキシとの通信はTCPで行われます。通信は、円周率の最初の26文字(小数点を含む3,141592653589793238462643)で構成されるキーを使用してRC4で暗号化され、base64でエンコードされます。ESETが確認したすべての検体で同じキーが使用されています。
ハッシュアルゴリズムのコードは、通信を開始する時にマイニングプロキシからダウンロードされ、メモリにロードされます。メモリには直接ロードされる場合もありますが、過去のバージョンでは、最初にディスクにドロップされるライブラリlibcr64.dllからロードされる場合もありました。
実行ごとにハッシュコードをダウンロードする仕組みによって、Stantinkoを悪用するグループはこのコードをオンザフライで変更することが可能です。たとえば、既存の仮想通貨のアルゴリズムの調整に対応したり、実行時に最も収益性の高い仮想通貨を採掘するように、他の仮想通貨を採掘するように切り替えたりすることができます。モジュールの中核部分をリモートサーバーからダウンロードし、メモリに直接ロードする仕組みの主な利点は、コードの中核部分がディスクに保存されないことです。これらのアルゴリズムのパターンは、セキュリティ製品によって簡単に検出されることから、過去のバージョンにはなかった今回の調整は、検出を困難にすることを狙ったものでしょう。
ESETが分析したStantinkoのクリプトマイニングモジュールのすべてのインスタンスは、モネロを採掘していました。これは、マイニングプロキシとハッシュアルゴリズムによって提供されるジョブから推測しました。たとえば、図2は、プロキシの1つによって送信されたジョブを示しています。
{"error":null,"result":{"status":"OK"}} {"method":"job","params":{"blob":"0b0bbfdee1e50567042dcfdfe96018227f25672544521f8ee2564cf8b4c3139a6a88c5f0b32664000000a1c8ee5c185ed2661daab9d0c454fd40e9f53f0267fe391bdb4eb4690395deb36018","job_id":"281980000000000a10","target":"67d81500","height":1815711}}
使用されたハッシュアルゴリズムを分析したところ、CryptoNight Rが使用されていることがわかりました。このアルゴリズムを使用する仮想通貨は複数あるため、これだけでは、ある程度絞り込むことができるだけであり、仮想通貨を特定することはできません。提供されたジョブから、ブロックチェーンのブロックの高さが当時1815711であったことが判明したので、専用ブロックエクスプローラーでこの高さとCryptoNight Rを使用して仮想通貨を調べたところ、モネロであることが分かりました。文字列0b0bbfdee1e50567042dcfdfe96018227f25672544521f8ee2564cf8b4c3139a6a88c5f0b32664000000a1c8ee5c185ed2661daab9d0c454fd40e9f53f0267fe391bdb4eb4690395deb36018を解剖したところ、前のブロック(67042dcfdfe96018227f25672544521f8ee2564cf8b4c3139a6a88c5f0b32664)のハッシュとタイムスタンプ(1555590859)は、実際に1815711の高さでモネロのブロックチェーンと一致することがわかりました。モネロのソースコードにあるジェネレーター機能を調査すると、ブロブの構造を把握できます。このジェネレーター機能によって、前のブロックのハッシュとタイムスタンプの両方を含むブロックヘッダーと呼ばれる別の構造が明らかになります。
CoinMiner.Stantinkoの他の部分とは異なり、このハッシュアルゴリズムは難読化されていません。難読化するとハッシュ計算の速度が大幅に低下し、全体的なパフォーマンスと収益性が低下するためです。しかし、このマルウェアの作成者は検出につながる文字列やアーティファクトは残さないようにしています。
このマルウェアは、他のクリプトマイナーを検索し、実行中のプロセスを列挙します。競合するクリプトマイナーが見つかると、Stantinkoはすべてのスレッドを一時停止します。
CoinMiner.Stantinkoは、特定の文字列または文字列の組み合わせが含まれる場合、そのプロセスをクリプトマイナーと見なしますが、その対象は検体によって異なります。たとえば以下の文字列があると、クリプトマイナーと判断します。
これらの文字列は、https://github.com/pooler/cpuminer、https://minergate.com/、https://github.com/xmrigの正規のクリプトマイナーを示しています。さらに、興味深いことに、Stantinkoモジュールがベースとしているhttps://github.com/fireice-uk/xmr-stakも対象になっています。これらの文字列は、暗号化機能が含まれる各種のマルウェア検体にも関連します。
興味深いのは、Stantinkoのオペレーターは、過去に競合するコードを削除しようとしたことがわかっていることです。彼らは、競合するコードを除外するために組み込みのスクリプト言語で記述されたスクリプトを組み込んだ正規のAVZ Antiviral Toolkitを利用していました。
CoinMiner.Stantinkoは、マシンに電源が接続されてないことを検出すると、採掘を一時的に停止します。これは、ノートブックコンピューターを対象とした機能であり、バッテリーが急速に消耗することを防ぎ、ユーザーにクリプトマイニングを気づかれることがないようにするためです。
また、タスクマネージャーアプリケーション(procexp64.exe、procexp.exe、またはtaskmgr.exeという名前のプロセス)の実行が検出された場合にも、採掘を一時的に中断します。
また、マルウェアは実行中のプロセスをスキャンして、セキュリティソフトウェアとタスクマネージャーを検出します。プロセス名のCRC-32を計算し、CRC-32チェックサムのハードコーディングされたリストと照合します。このチェックサムは付録に記載しています。一般に、これらのセキュリティ製品のプロセス名はバイナリに含まれていないため、この手法は検出を回避するのに役立ち、プロセス名を直接追加しないことで、ステルス性が強化されています。また、アナリストがこれらのハッシュを解読する必要があるため、マルウェアの作成者が何を求めているかを見つけることも難しくなります。これは技術的にはパスワードのクラックと同じ問題です。ただし、既知のプロセス名のリストを使用すれば、通常は、正確な名前を十分に判別できます。
CRC-32との一致が見つかると、CRCはログファイル(api-ms-win-crt-io-l1-1-0.dll)に書き込まれます。このモジュールにはログファイルに関連する他の機能がないため、ESETがこれまで確認したことのないStantinkoの別のコンポーネントによってこのログファイルは後で抽出されると考えられます。
クリプトマイニングの機能に加えて、検出を回避して分析を防止するCoinMiner.Stantinkoの難読化技術も注目に値します。これらの手法のいくつかは独自のものであり、フォローアップ記事で今後詳細に説明します。
ESETの今回の調査結果は、Stantinkoを操る犯罪者が、管理下にあるボットネットをさらに活用するべく、拡大していることを示唆しています。このサイバー犯罪者集団は、過去にも、他の犯罪者に販売することを目的に、サーバーの認証情報を大量の収集するためJoomlaやWordPressのWebサイトに対して独自の分散型のディクショナリベースの攻撃を仕掛けています。
このクリプトマイニングモジュールはリモートから管理されており、少なくとも2018年8月以降から拡散され、このブログの執筆時点ではまだ攻撃は継続しています。これは、このサイバー犯罪者集団が利益を上げるために新機能を追加して拡張を続けていることを示しています。このモジュールは、標準の暗号化機能に加えて、いくつかの興味深い難読化技術を採用しています。今後の記事で、この難読化の手法といくつかの対策について紹介する予定です。
Win32/CoinMiner.Stantinko
Win64/CoinMiner.Stantinko
1,500ハッシュ以上の完全なリストをESETのGitHubリポジトリから入手できます。
00F0AED42011C9DB7807383868AF82EF5454FDD8
01504C2CE8180D3F136DC3C8D6DDDDBD2662A4BF
0177DDD5C60E9A808DB4626AB3161794E08DEF74
01A53BAC150E5727F12E96BE5AAB782CDEF36713
01BFAD430CFA034B039AC9ACC98098EB53A1A703
01FE45376349628ED402D8D74868E463F9047C30
api-ms-win-crt-io-l1-1-0.dll
libcr64.dll
C:\Windows\TEMP\%RANDOM%\%RANDOM_GUID%.dll
“3,141592653589793238462643”
手法 | ID | 名称 | 説明 |
---|---|---|---|
実行 | T1085 | Rundll32 | このモジュールはrundll32.exeによって実行される場合があります。 |
T1035 | サービスの実行 | このマルウェアはサービスとして実行される場合があります。 | |
防御システムの回避 | T1140 | ファイルまたは情報の難読化の解除/デコード | このモジュールは、実行処理中にコード内の文字列の難読化を解除します。 |
T1027 | 難読化されたファイルまたは情報 | このモジュールは、コードと文字列を難読化して、分析と検出を困難にします。 | |
T1102 | Webサービス | このマルウェアは、YouTube動画の説明文から構成データを取得します。 | |
検出 | T1063 | セキュリティソフトウェアの検出 | このマルウェアは、実行されているセキュリティ製品のリストを取得します。 |
C&C | T1090 | 接続プロキシ | このモジュールは、マイニングプールとの通信でプロキシを使用します。 |
T1008 | フォールバックチャネル | 最初のプロキシにアクセスできない場合、モジュールは別に利用可能なマイニングプロキシに接続します。 | |
T1095 | 標準の非アプリケーションレイヤープロトコル | このマルウェアは、通信にTCPを使用します。 | |
T1043 | 一般的に使用されるポート | マルウェアはポート443で通信します。 | |
T1132 | データのエンコード | モジュールは暗号化してから、base64でネットワークトラフィックをエンコードします。 | |
T1032 | 標準暗号化プロトコル | モジュールは、RC4でトラフィックを暗号化します。 | |
T1071 | 標準アプリケーションレイヤープロトコル | HTTPSを介してYouTube動画の説明文から構成データを取得します。 | |
影響 | T1496 | リソースのハイジャック | このモジュールは、仮想通貨をマイニングします。 |
CoinMiner.StantinkoによってチェックされるCRC-32チェックサムと、対応するファイル名を以下に示します。
0xB18362C7 | afwserv.exe |
0x05838A63 | ashdisp.exe |
0x36C5019C | ashwebsv.exe |
0xB3C17664 | aswidsagent.exe |
0x648E8307 | avastsvc.exe |
0x281AC78F | avastui.exe |
0xAA0D8BF4 | avgcsrva.exe |
0x71B621D6 | avgcsrvx.exe |
0x7D6D668A | avgfws.exe |
0x1EF12475 | avgidsagent.exe |
0x010B6C80 | avgmfapx.exe |
0x6E691216 | avgnsa.exe |
0xB5D2B834 | avgnsx.exe |
0x36602D00 | avgnt.exe |
0x222EBF57 | avgrsa.exe |
0xF9951575 | avgrsx.exe |
0x2377F90C | avgsvc.exe |
0x37FAB74F | avgsvca.exe |
0xEC411D6D | avgsvcx.exe |
0x0BED9FA2 | avgtray.exe |
0x168022D0 | avguard.exe |
0x99BA6EAA | avgui.exe |
0x7A77BA28 | avguix.exe |
0x0D22F74A | avgwdsvc.exe |
0x98313E09 | avira.servicehost.exe |
0x507E7C15 | avira.systray.exe |
0xFF934F08 | avp.exe |
0x9AC5F806 | avpui.exe |
0xBD07F203 | avshadow.exe |
0x64FDC22A | avwebg7.exe |
0x0BC69161 | avwebgrd.exe |
0xBACF2EAC | cureit.exe |
0x8FDEA9A9 | drwagntd.exe |
0xE1856E76 | drwagnui.exe |
0xF9BF908E | drwcsd.exe |
0xC84AB1DA | drwebcom.exe |
0x183AA5AC | drwebupw.exe |
0xAC255C5E | drwupsrv.exe |
0x23B9BE14 | dwantispam.exe |
0xDAC9F2B7 | dwarkdaemon.exe |
0x7400E3CB | dwengine.exe |
0x73982213 | dwnetfilter.exe |
0x1C6830BC | dwscanner.exe |
0x86D81873 | dwservice.exe |
0xB1D6E120 | dwwatcher.exe |
0xD56C1E6F | egui.exe |
0x69DD7DB4 | ekrn.exe |
0xFB1C0526 | guardgui.exe |
0x5BC1D859 | ipmgui.exe |
0x07711AAE | ksde.exe |
0x479CB9C4 | ksdeui.exe |
0x6B026A91 | nod32cc.exe |
0xCFFC2DBB | nod32krn.exe |
0x59B8DF4D | nod32kui.exe |
0x998B5896 | procexp.exe |
0xF3EEEFA8 | procexp64.exe |
0x81C16803 | sched.exe |
0x31F6B864 | spideragent.exe |
0x822C2BA2 | taskmgr.exe |
0x092E6ADA | updrgui.exe |
0x09375DFF | wsctool.exe |