En nuestro análisis previo de las campañas maliciosas de RenPy, identificamos un cargador de varias etapas desplegado como parte de la cadena de infección.
Una investigación más exhaustiva sobre estas amenazas ha demostrado que el mismo cargador, al que rastreamos como PavinLoader , se está utilizando en varias campañas diferentes, incluidos ataques ClickFix y descargas de software falsas.
A pesar de las diferencias en cómo estas campañas llegan a las víctimas, encontramos varios elementos comunes. Estos incluyen cadenas de infección de múltiples etapas que involucran DLL .NET altamente ofuscadas y troyanizadas; abuso de MSBuild, .csproj, y .bat archivos para ejecutarlos; y EtherHiding para recuperar el dominio de comando y control (C2).
Cómo se ve un ataque
No todas las campañas comienzan de la misma manera. Una víctima puede encontrarse con un CAPTCHA falso que le pida que ejecute un comando, descargue lo que parece ser un software legítimo o instale un juego malicioso.
Lo que sucede a continuación es mucho más consistente. PavinLoader utiliza herramientas legítimas. Windows Utiliza herramientas junto con archivos .NET maliciosos para ejecutar varias etapas del malware. También emplea EtherHiding, una técnica que utiliza una cadena de bloques para ocultar información sobre su infraestructura, con el fin de localizar el servidor desde el que debe descargar malware adicional.
En la campaña de RenPy que analizamos, ese proceso finalmente condujo a Amatera Stealer , un malware diseñado para robar información de una computadora infectada. También observamos infecciones de PavinLoader que distribuían malware adicional.
PavinLoader aparece en varias campañas.
Hemos identificado PavinLoader en varios grupos de campañas:
- Las campañas maliciosas de RenPy, como se analizó en nuestra entrada anterior del blog.
- Varias campañas de ClickFix, incluyendo la actividad reciente del/de los operador(es) cubiertos en nuestro análisis anterior.
- Campañas de software fraudulentas que utilizaban Dropbox para descargar PavinLoader.
El uso del cargador en múltiples campañas plantea la posibilidad de que PavinLoader se ofrezca como un servicio de carga.
También encontramos varios artefactos que respaldan esta posibilidad, aunque no son suficientes para confirmarla. Un artefacto específico en VirusTotal es compartido por más de 200 archivos asociados con PavinLoader, lo que sugiere que podría tratarse de un artefacto de compilación del proceso de construcción.
También encontramos un script de PowerShell subido a VirusTotal que contenía comentarios como: EDIT HERE y REPLACE with a real direct link to your .batEl archivo BAT asociado contiene la cadena Automated builder helper.
Sin embargo, no hemos encontrado ningún panel de control ni canales de venta que confirmen que PavinLoader se esté ofreciendo comercialmente.


Si bien PavinLoader ha cambiado con el tiempo, las campañas que analizamos comparten varias características:
- Instaladores Inno Setup o MSI generados con diferentes constructores que ejecutan el
.baty/o.csprojarchivos - DLLs .NET troyanizadas, incluyendo DotNetZip, Nancy, Renci.SshNet y OpenXML. En la mayoría de los casos analizados, los métodos maliciosos insertados siguen un patrón
TwoWordsoTwoWordsNumberpatrón de nomenclatura, como por ejemploDefaultEvaluator5, yFallbackFactory5 - Una técnica de ofuscación común utilizada en todas las DLL de .NET.
- Una convención de nomenclatura basada en dos palabras aleatorias, como por ejemplo:
GollopDevest,UnbrandRunover, yPavinWidepara nombres de DLL, funciones, cadenas, rutas C2 y otros artefactos - EtherHiding para obtener el dominio C2, seguido de solicitudes HTTP utilizando rutas como
assets/{two random words}.jsonpara recuperar etapas posteriores. Los dominios C2 suelen utilizar el.lat,.icu,.shop, y.cfddominios de nivel superior - Mecanismos de MSBuild para cargar y ejecutar código desde DLL, incluidas funciones de propiedades como
[System.Reflection.Assembly]::Load(...)yUsingTask - Patrones recurrentes en nombres de archivo como
name_4characters.cmd/bat/msi/exe-Por ejemplo,prefetch_9a59.cmd,telemetry_55db.cmd, ybootstrap_64be.cmd—o nombres aleatorios de nueve caracteres comoaegZpQ4C7.batTambién observamos nombres cortos, entre ellos:Small.msi,small.bat, ysmall.cmd
PavinLoader consta de varias DLL de .NET, y en los casos analizados identificamos las siguientes etapas:
- DLL de cargador : una DLL troyanizada, como la de Nancy analizada en nuestro artículo anterior sobre RenPy, o una DLL personalizada. Realiza operaciones antiforenses y antianálisis, cambia la configuración de red necesaria para las siguientes operaciones y carga el cargador EtherHiding.
- DLL de EtherHiding Loader : Obtiene el C2 a través de EtherHiding y descarga las siguientes etapas desde él.
- DLL anti-análisis : Realiza comprobaciones anti-análisis exhaustivas para detectar entornos virtualizados.
- DLL del cargador PE : Carga la carga útil PE final.
Las cargas útiles intermedias pueden variar según la configuración de la campaña. Primero, analizaremos algunos de los métodos utilizados para distribuir las etapas iniciales de PavinLoader. Luego, retomaremos la campaña del cargador RenPy que analizamos en nuestro artículo anterior para examinar las etapas posteriores del cargador.
Análisis técnico
El resto de este artículo analiza con más detalle cómo se distribuye PavinLoader y cómo funciona cada etapa del cargador.
Cómo se entrega PavinLoader
Hemos observado que PavinLoader se distribuye a través de varias campañas de ClickFix.
En particular, detectamos que el clúster ClickFix analizado en un análisis anterior artículo Recientemente ha comenzado a utilizar PavinLoader. Abuso de MSBuild y el uso de .csproj y .bat Los archivos siguen siendo comunes en todas las cadenas de infección que observamos.
Ya vimos un ejemplo en nuestro análisis anterior de RenPy. Aquí, veremos otros métodos de distribución.

Como vimos en nuestro análisis previo de estas campañas de ClickFix, los scripts de PowerShell asociados cambian con frecuencia. Encontramos varias versiones en esta actividad, incluyendo scripts tanto ofuscados como sin ofuscar.

En este ejemplo, el MSI descargado del bucket de Cloudflare se llama Installer_57be78.msi.

El paquete contiene:
prefetch_2f76.exe: El ejecutable legítimo de MSBuildprefetch_2f76.csproj: Se utiliza para ejecutar la DLL del cargador a través deUsingTaskDotNetZip.dll: La DLL del cargador
En .csproj El archivo se ejecuta con:
"C:\Users\{USER}\AppData\Local\Logitech\Device Configuration Helper\prefetch_2f76.exe" /nologo "C:\Users\{USER}\AppData\Local\Logitech\Device Configuration Helper\prefetch_2f76.csproj" /nr:false
La DLL Loader es una versión troyanizada de DotNetZip y se ejecuta utilizando el UsingTask elemento.


A diferencia del ejemplo de RenPy analizado en nuestro artículo anterior, el cargador EtherHiding se extrae de la propia DLL. Se utiliza un recurso incrustado como índice para extraer bytes directamente de la DLL, en lugar de obtener esos índices de la .csproj archivo.
Hemos detectado otra campaña que utiliza archivos BAT que contienen información falsa. BUILD VERIFICATION REPORT comentarios, aparentemente destinados a dificultar el análisis y la detección.
En este caso, el MSI CustomAction ejecuta el script BAT con:
cmd.exe /c C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd /launched

updater_8219.cmd. Haz clic para ampliarEl código ofuscado aparece debajo de los comentarios falsos. Concatena varias cadenas de texto y utiliza índices generados mediante operaciones matemáticas sencillas para reconstruirlas. Encontramos este tipo de ofuscación en la mayoría de los archivos BAT que analizamos.

.cmd archivo. Haz clic para ampliarEl archivo BAT localiza conhost.exe y se relanza con:
"C:\WINDOWS\System32\conhost.exe" --headless cmd.exe /c "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd" /launched
Luego establece el MSBUILDENABLEALLPROPERTYFUNCTIONS=1 variable de entorno, localiza MSBuild.exey lo ejecuta utilizando el mismo archivo como entrada:
"C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd"
En este caso, la DLL del cargador se reconstruye concatenando y decodificando cuatro variables codificadas en Base64.

La DLL del cargador tiene un nombre aleatorio y parece ser una versión anterior porque no contiene el código de bytes personalizado ni las cadenas cifradas en sus recursos.
Como en la campaña de RenPy analizada anteriormente, esta etapa recupera el cargador EtherHiding almacenado entre un Build-... marcador en el archivo CMD a través del _vezr variable de entorno, luego la decodifica usando XOR con una clave de 32 bytes.

Tras haber analizado varios métodos utilizados para distribuir las dos primeras etapas de PavinLoader, retomaremos ahora la cadena de infección de RenPy de nuestro análisis anterior y examinaremos el cargador en sí con más detalle.
Análisis de PavinLoader
Las DLL de .NET asociadas con PavinLoader están fuertemente ofuscadas mediante el aplanamiento del flujo de control, código de bytes personalizado y llamadas indirectas a través de calli/ldftn, cifrado de cadenas con diferentes algoritmos, hash de API y delegados, métodos redundantes y código y cadenas basura.
No hemos identificado ningún ofuscador conocido asociado a las muestras, por lo que, según nuestro conocimiento, PavinLoader utiliza un ofuscador personalizado.
Dado que desofuscar completamente las muestras sería complejo, utilizamos un enfoque híbrido que combina el análisis dinámico con la invocación de métodos mediante reflexión. Identificamos los métodos importantes en función de sus importaciones y parámetros, los invocamos y analizamos el resultado.
Este enfoque no cubre completamente el flujo de ejecución, pero nos permitió identificar la funcionalidad principal del cargador y extraer sus etapas intermedias. Dado que diferentes funciones suelen compartir el mismo nombre, utilizamos tokens de metadatos para identificar los métodos a lo largo del análisis.
DLL troyanizada por Nancy: DLL del cargador
Ya hemos tratado esta etapa en detalle en nuestra anterior publicación del blog, así que aquí solo ofreceremos una descripción general.
En la mayoría de los casos analizados, la DLL Loader es una DLL legítima troyanizada. El método malicioso normalmente utiliza un {RandomWord} o {RandomWord_Number} convención de nomenclatura.
La DLL contiene un recurso asociado al código de bytes personalizado interpretado por el método principal, dos recursos que contienen cadenas cifradas y, en algunos casos, recursos adicionales utilizados como índice para extraer la siguiente etapa. Otros recursos parecen ser señuelos diseñados para ralentizar el análisis. En las muestras que analizamos, esta DLL típicamente:
- Descifra cadenas de recursos mediante XOR de múltiples claves.
- Resuelve las API mediante el hash de API y
GetDelegateForFunctionPointer() - Modifica la configuración de red, incluyendo la desactivación de la validación de certificados TLS y la configuración del proxy del sistema predeterminado.
- Realiza una comprobación de sincronización anti-análisis utilizando
CreateEventW(),GetTickCount(), yWaitForSingleObject() - Realiza operaciones antiforenses
- Carga el cargador EtherHiding extrayéndolo de un marcador en el interior.
.csprojo archivos BAT, o utilizando un recurso como índice para recuperar bytes directamente de la DLL.
GollopDevest: Cargador EtherHiding
El cargador EtherHiding tiene dos funciones principales: obtener el dominio C2 a través de EtherHiding y descargar y cargar las etapas subsiguientes desde ese C2.
Clase 0x02000762 Es responsable de descifrar las cadenas asociadas con la cadena de bloques y la comunicación de red.
Las cadenas son descifradas por 0x060027BD como sigue:
- Función
0x060027BBInicializa la caja S utilizando la operación XOR de la clave maestra.activeValuesy el Base64 decodificadooptionsCollectioncadena - Función
0x060027BEaceptachildSyncObjectcomo entrada y devuelve bytes de índice usando XOR y permutaciones basadas en valores de encabezado codificados en los dos primeros caracteres de la cadena. - Función
0x060027B9Devuelve la cadena descifrada utilizando los índices y la caja S generada previamente.
Esta fue la única clase que encontramos con parámetros de cifrado codificados en este formato.
Para las cadenas restantes, identificamos funciones que devolvían datos descifrados según las firmas de sus parámetros (por ejemplo, métodos que devolvían cadenas o bytes) y las invocamos mediante reflexión. Esto nos permitió recuperar más de 1300 cadenas.

Entre ellas se encontraban cadenas asociadas con la aplicación de parches AMSI y ETW:
AmsiScanStringSystem.Management.Automation.AmsiUtils
System.Management.Automation.AmsiUtils+AmsiNativeMethods
ntdll
EtwEventWriteNtQueryInformationProcess
NtSetInformationThread
VirtualProtect
Más de 100 URL pertenecientes a servicios legítimos también se descifran y se utilizan para generar solicitudes HTTP y ruido de red. No observamos este comportamiento en todas las muestras, lo que sugiere que podría depender de la compilación.
La clase Servidor (0x02000052) genera el X-Timestamp, X-Nonce, y X-Signature Encabezados HTTP y realiza solicitudes utilizadas para recuperar etapas posteriores.
Se realizan dos solicitudes HTTP para sincronizar parámetros y obtener la carga útil, utilizando HMAC para validar las solicitudes. Mediante reflexión, ejecutamos el método 0x06000A77 para obtener los valores de encabezado necesarios para recuperar las etapas subsiguientes.
El dominio C2 se obtiene mediante una llamada a procedimiento remoto (RPC) de ETH. bsc-dataseed.binance.org con el siguiente cuerpo JSON-RPC:
{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x328a1fadff154290f0ce1389a4e633698cdfdaa7","data":"0x06fdde03"},"latest"],"id":1783436775}
Las siguientes etapas se descargan del dominio C2 resultante. La carga útil codificada con XOR se almacena en la respuesta JSON en cache.content:
{"type":"cache-binary","meta":{"version":"2.3.1","timestamp":"…","platform":"win32-x64"},"cache":{"id":"e2b69…","content":"1c.."}}
En este caso, las rutas C2 y las claves XOR descifradas desde esta etapa y la DLL anti-análisis son:
| Camino | Clave XOR | Tipo/Función |
/assets/ExponeAboard.json | QBBBfWow4lb | PavinWride .NET DLL, Anti-análisis |
/assets/MailersKogasin.json | WjcsVTKmuoBRqe | Cargador PE de DLL .NET de GollopDevest |
/assets/LanoseThrip.json | WwUX66Br | WPA.exe PE ejecutable, Amatera Stealer |
La siguiente etapa que se ejecuta es la DLL anti-análisis.
PavinWride: DLL anti-análisis
Esta DLL es responsable de realizar varias comprobaciones anti-análisis.
La DLL anti-análisis ejecuta llamadas al sistema de diferentes maneras:
- Standard Llamadas a la biblioteca de clases base (BCL) de .NET, incluidas las relacionadas con el registro y las operaciones de red.
- Llamadas P/Invoke de Win32, incluidas
GetCurrentThread,NtQueryInformationThread,NtQueryInformationProcess, yNtCurrentTeb - Las API de Win32 se resuelven mediante el hash de API y un recorrido de la tabla de exportación del Bloque de Entorno de Proceso (PEB).
La función MenuItemService.ProcessDirectory (0x06000151) es el método principal responsable del almacenamiento en caché de delegados y la resolución de la API de Win32:
- Comprueba si el delegado ya está resuelto usando
managerMap.TryGetValue() - Si no, llama
ProcessDirectory (0x06000150)para obtener el identificador del HMODULE - Se llama
ProcessDirectory (0x0600003A)que realiza el recorrido de la tabla de exportación PE y coincide con el hash. Detectamos que se obtiene la misma salida de hash en varios otros métodos (por ejemplo,0x06000039,0x0600003B,0x0600004E) - Obtiene el delegado con
GetDelegateForFunctionPointer()y lo guarda en el diccionario

Utilizamos el mismo método de reflexión para obtener las cadenas. Muchas cadenas están cifradas con la clave XOR. 4B729A1F5CE387D6.

El cargador obtiene el LCID del sistema utilizando GetKeyboardLayoutList() y lo compara con más de 17 idiomas, entre ellos el ruso, el ucraniano, el bielorruso y el armenio.
También realiza un reconocimiento exhaustivo del sistema, que incluye la enumeración de claves de registro y la llamada a API de Win32 como GetSystemFirmwareTable() y EnumSystemFirmwareTables() para identificar entornos virtualizados.
| Categoría | Valor |
| Identificadores de proveedor/dispositivo PCI | VEN_80EE, VEN_15AD, VEN_1AB8, VEN_5853, VEN_1AF4, VEN_1234&DEV_111, … |
| Identificadores OEM de SMBIOS/ACPI | VMWARE, VBOX, BOCHS, VRTUAL, MSFTVM, MSHYPR, Xen, Parall, BHYVE, AMAZON, Google |
| firmas de tabla ACPI | VBOX, BXPC, VMW, Xen, PRLS, AMZN, MICR |
| Cadenas de BIOS/fabricante/producto | vmware, vmw, innotek, virtualbox, vbox, qemu, seabios, bochs, standard pc, kvm virtual machine, xen, hvm domu, parallels |

También observamos referencias descifradas a API, incluidas GetCurrentProcess(), CreateToolhelp32Snapshot(), Process32First(), Process32Next(), y OpenMutex(), aunque no observamos que se llamara a estas funciones durante nuestro flujo de ejecución.
También se realiza una solicitud HTTP a uno de estos servicios:
https://ipv4[.]ipleak[.]net/json/https://get[.]geojs[.]io/v1/ip/geo[.]jsonhttps://ipapi[.]co/json/https://api[.]ipapi[.]is/https://ipinfo[.]io/json
También compara los datos devueltos con 96 proveedores de alojamiento o infraestructura y comprueba si el código de región es uno de los siguientes: RU, UA, BY, AM, KZ, KG, TJ, UZ, GE, AZo MD.

Si las comprobaciones anti-análisis son satisfactorias, las dos etapas siguientes se descargan y descifran utilizando claves XOR.
Lo parcheamos SelectionScope.ProcessDirectory (0x06000014) para recuperar las rutas C2 y las claves XOR para esas etapas:
/assets/MailersKogasin.json|WjcsVTKmuoBRqe|/assets/LanoseThrip.json|WwUX66Br
GollopDevest: PE Loader DLL y Amatera Stealer
La tercera DLL tiene el mismo nombre que la segunda, GollopDevestpero realiza carga de PE.
Entre las cadenas descifradas se encuentran:
'GollopMailers LDR DllBase VeneryCondole EdiyaFoully=0x{0:X} EdiyaStelae=0x{1:X}'
'GollopMailers LDR Flags missing IMAGE_DLL 0x{0:X8}'
'GollopMailers LDR SaranPisco invalid 0x{0:X}'
'GollopMailers LDR TlsIndex invalid {0}'
'GollopMailers LDR sanity exception: '
'HIGHLOW relocation'
'Import DLL name'
'Import FunctusAurata'
'Import INT'
'Import descriptor'
'Import hint/name'
'Import thunk'
'LdrpHandleTlsData outside ntdll .text'
'LdrpReleaseTlsEntry outside ntdll .text'
'LoadConfig32'
'OK'
'PE headers'
'Required API resolve failed: type={0}, FreshBubals={1}, module=0x{2:X}'
'TLS32'
'TLS64'
'x86 disabled until ABI proof'
ntdll.dll
kernel32.dll
LdrpInitializeTls
"STATUS_SUCCESS"
UNKNOWN(0x00000001)
UNKNOWN(0x00000002)
UNKNOWN(0x00000003)
En ServerEditor.SortMemory método (0x06000014) comprueba la estructura PE y las banderas antes de cargar la carga útil.
Para confirmar este comportamiento, invocamos el método mediante reflexión utilizando el archivo descargado. WPA.exe Archivo como entrada. El PE se cargó correctamente.
El PE compilado en C++ se disfraza como WPA.exe ( Windows Analizador de rendimiento). Identificamos la carga útil como una versión ofuscada de Amatera Stealer 4.2.3-alpha1.
Utiliza aplanamiento del flujo de control, hash de API, comprobaciones anti-depuración y predicados opacos para complicar el análisis. También detectamos el uso de la técnica Heaven's Gate, resolución DNS-over-HTTPS (DoH) a través de Google DNS y sockets sin procesar. \Device\Afd\Endpoint para la comunicación en red.

Tras la ejecución de esta fase, también observamos que se descargaban y ejecutaban cargas útiles adicionales desde direcciones IP de C2.
En algunos casos, los paquetes de WiX Burn descargaron otra carga útil asociada con PavinLoader. En otros, detectamos HijackLoader. Esto permite a los operadores de la campaña desplegar múltiples cargas útiles en una máquina comprometida.
COIs
Hashes SHA-256
bdf313a019e025ebf58ccef4619444ee70e661bd444e0644ebeabd8f5caad14c
e3830f5747e3f46537d217124d80c9f3bb4d89f8d4f5138dce69ee54ea4fb6b9
a4f03272cf96732dc9f58bb466d16f358e7f50d46dba30526a9fbebfec11717b
bf04160dd1ce3571e0eb6d6dda1713c788797b5599399d4a93665a757eec376e
54fa8083c05334aa360256fbbb0ca901ce7e244a0359dd664cae78977371ec91
c1ea6d169565c70ac5d812e73483814929e9b3548ead6633595937e71a334adb
001337488c32d8610c2aef6f9330acca825f0afacd071bf6ebfc06b5a1a69f09
2837099af431e9afee76ce5e6ab5cb86bedce06e31c22be46250cb453cfdb978
252c5a3d150275013f52b4820097d7163ced4aa2f1be0fca032f8a5017673816
0c9c64b7383ec249bcf6271a4b73206d94de130ca401d16ab77fe01e5193a312
6700f62e1a3b33340cd678c388ecc8bac2e5943c0627df5d1b99b879c3ca42c9
Direcciones IP
93.152.224[.]75Descargas de PavinLoader
65.21.80[.]170Descargas de PavinLoader
195.63.142[.]49Descargas de PavinLoader
Dominios
perfectverified[.]com: ClickFix
PavinLoader C2
catalyst-pro[.]lat
twigoamwu[.]cfd
trusaifi[.]cfd
stellar-minds[.]cfd
pinnacle-labs[.]lat
nexahub[.]lat
fimwoglea[.]shop
velodium[.]lat
rpcsecnoweb[.]pro
more-arpc[.]icu
echo-systems[.]cfd
kelemet[.]shop
zarwieciv[.]cfd
URL
telegra[.]ph/Project-PySynth-06-28: Punto de entrega secreto de Amatera
Agradecimientos
- Análisis previo del cargador: https://www.derp.ca/research/hellsuchecker-clickfix-etherhiding/#26-anti-sandbox-checks-and-a-nintendo-bypass (posible contenido generado por IA)
- Posible actividad relacionada: https://cyberowi.pl/lumma-stealer-renpy-fitgirl-osmiowarstwowy-loader/
- Posible actividad relacionada: https://medium.com/@djordje.brankovic/from-fake-captcha-to-in-memory-execution-unraveling-a-multi-stage-malware-chain-part-1-496c603f3641
- Análisis de un usuario del foro malwarebytes malwarebytes
Desde denunciar las amenazas hasta eliminarlas.
Los riesgos de ciberseguridad nunca deben propagarse más allá de un titular. Mantenga las amenazas alejadas de sus dispositivos descargando Malwarebytes hoy mismo.




