Clipboard, ese amigo del que nadie se acuerda

Publicada en Publicada en Malware, Programación, Pruebas de concepto

#Disclaimer

Lo que vengo a contar se ha realizado en condiciones de laboratorio, y en ningún momento pretende ser una guía de como hacer un malware, sino todo lo contrario, de manera didáctica se pretende enseñar como podría funcionar un malware que realizara las acciones del proceso que voy a explicar, las consecuencias que tendría y de como prevenirlo para no caer en la desgracia.

#Introducción

Buenos días amigos de lo imposible, hoy os traigo un caso especifico de malware que se me ocurrió hace tiempo en uno de esos momentos que se aparece el demonio que uno lleva dentro. Ese demonio que es indispensable para poder tomar medidas preventivas. Ya que si no piensas como los "bad guys", no podrás adelantarte a ellos.

Lo importante es saber controlar cuando aparece Hulk, es por eso que he hecho una prueba de concepto (POC) para intentar alertar de futuras infecciones de este tipo.

El malware en cuestión se basa (debido a mi crypto-adicción) en la suplantación de Transacciones válidas en cualquier blockchain actual, previa firma de la misma. Da igual que uses Trezor, Ledger*, MyEtherWallet*. Todo el mundo que use cualquier tipo de transacción (no hardcodeada o white-listeada) sería vulnerable.

*Trezor y Ledger
Son carteras físicas que proporcionan una máxima seguridad para operar con criptodivisas.

*MyEtherWallet
Es una web en javascript, que opera sin que las claves privadas salgan fuera de tu equipo
¿Y como es esto posible?

Todo malware explota una vulnerabilidad, en mi caso la vulnerabilidad a explotar es la mas importante y difícil de arreglar, la humana. El proceso de envio de "dinero" de una dirección a otra es prácticamente igual en todas las blockchains, y se puede reducir en los siguientes pasos.

1- El usuario tiene una clave privada con la que firma una transacción.
2- Este usuario firma una transacción hacia 0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (address) de X cantidad.
3- El nodo usa la clave publica para verificar que esa transacción es legitima.
4- Si es legítima la incorpora a un bloque de la blockchain, sino la descarta.

Para explotar esto me baso en el principio del copy/paste, ya que YO soy el primero en copiar una dirección y pegarla, ya sea para contribuir a una ICO*, o cualquier otro proceso relacionado con una transacción genérica. Yo por ejemplo, reviso que los primeros dígitos y los últimos sean los mismos que los que he leído, pero muchas veces, hasta ahí llega mi verificación (FAIL). Este problema se acrecienta más cuando tienes que enviar rápidamente a una dirección que te acaban de mandar, por que la ICO se llena.

*ICO = Es el proceso de crowdfunding previo a la aparición de una nueva criptodivisa

Y para mas inri, la gravedad se multiplica si usas carteras que sus direcciones no tienen checksum (ETH por defecto), ya que si te equivocas en una sola letra, enviaras el dinero a otra cartera de la que seguramente, nadie sea el dueño.

Pero ....

¿Te has planteado alguna vez toda la información sensible que pasa por tu clipboard?

¿Que pasaría si alguien te cambia esa dirección que acabas de copiar por una alternativa de igual comienzo y final? ¿Pondrías las manos en el fuego de que te darías cuenta? puede que tu no caigas en la trampa... pero créeme que una inmensa de personas SI. Así que manos a la obra, ¡vamos a infectar el Clipboard!

Tenéis todo el código fuente en la dirección:

https://github.com/shargon/CoinStealer

#PreparandoLaPOC

Lo primero que vamos a hacer es generar la lista de direcciones posibles a cambiar, como queremos tener todos las primeras y últimas 2 letras (1 byte en hexadecimal por delante y por detrás). Tendremos que generar 65536 direcciones posibles. Al principio tardará poco, pero conforme avances en el proceso, verás que se ralentiza debido a las colisiones. Pero en cuestión de unos minutos deberías tener la lista preparada.

Ejecutaremos el comando:

CoinStealer.exe --generate_all

Y veremos algo parecido a esto 🙂

Una vez termine este proceso, tendremos dos archivos de texto:

  • Keys.txt con todas las privateKey y direcciones generadas
  • Address.txt solo con las direcciones ordenadas alfabéticamente.

Ni que decir tiene, que se podría generar una lista de 4 letras por delante y por detrás, pero conllevaría una lista de mayor tamaño y para la POC, no tiene sentido.

Si quieres jugar a la lotería puedes comprobar el saldo de las cuentas que acabas de generar, si te toca, no has efectuado ningún ataque, no has robado nada, esta wallet es tuya :). Aunque si te dijera la posibilidad que tienes de encontrar una al azar. Se te quitaban las ganas de que siguieran buscando tus tataranietos sin encontrar nada.

BONUS: 
Si utilizas el parámetro --lotery podrás empezar a generar direcciones de ETH al azar y comprobar su saldo
Tampoco tengáis mucha esperanza ya que la probabilidad de acertar es de ((255^20)*NumeroDeDireccionesConSaldo)

#PreparandoUnNodoLocalDeETH

Como sería bueno detectar si alguna de las dirección de ETH tiene saldo (y nos ha tocado la lotería), tenemos que configurarnos un nodo de ETH, no entrare en detalle de como hacerlo ya que hay miles de tutoriales en internet acerca de esto, simplemente explicaré que necesitamos iniciarle con conectividad RPC, para poder solicitar al nodo balances y no tirar de APIs externas que podría banearnos o detectar el proceso.

Teneis información de como hacerlo en la dirección:

https://github.com/ethereum/wiki/wiki/JSON-RPC

Pero concretamente utilizaremos el comando

geth --rpc --rpcaddr <ip> --rpcport <portnumber>

De esta manera ya tendremos el nodo operativo (nos tocará esperar que se sincronize la cadena de bloques). Ahora tenemos la posibilidad de comprobar balances de las cuentas, ¡Y que nadie se entere! 🙂

#DetectandoBalances

Aunque la red Ethereum permite el envio de notificaciones al realizar una transacción. La comprobación del saldo no la haré en tiempo real. Para invocar dicha comprobación solo tenemos que ejecutar el comando:

CoinStealer.exe --check_balances [ArchivoDeDirecciones]

Al ejecutarlo conectará con nuestro servicio RPC de ethereum (127.0.0.1:8545) y empezará a comprobar los saldos de las cuentas, en caso de que encuentre una con saldo veremos algo así

Pero la realidad es que nos encontraremos seguramente algo mas parecido a esto jajaja

#Infectando

En el proceso de infección no vamos a entrar, solo en el contenido y código que ejecuta el malware. Es breve, sencillo y es el siguiente 🙂

Mediante búsqueda con expresiones regulares (Regex), buscaremos en el contenido del portapapeles una dirección de ETH, al estilo

Nos descargaremos antes de empezar una lista de las direcciones de ETH que vamos a reemplazar, cuando encontremos una la reemplazaremos por su correspondiente (de la que si tenemos nosotros las claves privadas)

Y para detectar los cambios del portapapeles, simplemente crearemos un objecto de Windows que esté a la escucha de los mensajitos que el Sistema operativo va enviando a todas y cada una de sus ventanas.

 

 

Destacar que no es necesario ningún privilegio especial para interceptar este tipo de llamadas, ni tampoco para modificar el portapapeles.

Pues ya solo hay que esperar a que mi objeto me envié el evento, buscar en mi diccionario local y realizar el reemplazo de la address donde va a enviar.

 

#POC

Pues ya tenemos todo ¡vamos a preparar el dropper!

Para reducir el tiempo de infección subiremos nuestro binario encodeado en Base64 a un sitio público y de manera anónima (https://pastebin.com/FYwAQyJn).

Después mediante un powershell como este realizaremos la descarga y ejecución del mismo en la víctima.

Vamos a ver los resultados

Podéis generar un dropper parecido utilizando

CoinStealer.exe --payload [UrlOfAddresses]

Todas estas acciones han sido realizadas en condiciones de laboratorio y no me hago responsable de las acciones malintencionadas que puedan realizarse como consecuencia de esta publicación.

Y recordar ...

#NoTeVayasSinAntesLeer

Si queréis entrar en detalle de como funcionaría algunos procesos de infección, recomiendo las entradas:

Infección pasiva (por explotación de un 0day)

No Woman No Cry - Ransomware WannaCry

Infección física (dame dos segundos en tu casa)

HACKERS GARAGE – Box 3 [Conejizando al Pato]

De 0 a Pato con Rubber Ducky y Powershell

2 comentarios en “Clipboard, ese amigo del que nadie se acuerda

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *