sábado, febrero 19, 2022

Cómo se puede explotar Log4jShell en servidores Minecraft Java (unpatched)

Hace casi mes y medio ya desde que Alibaba publicase la conocida vulnerabilidad de Log4jShell, un 0day con el cual la cual fácilmente cualquiera puede tomar el control de una máquina que utilice un servidor HTTP hecho en Java. Esto causó un gran revuelo en el mundo tecnológico y no es para menos dado que sus posibilidades en un primer momento eran infinitas, desde tomar el control de un servidor del gobierno hasta hackear satélites o dispositivos de la NASA.

Figura 1: Cómo se puede explotar Log4jShell en servidores Minecraft Java 

Desde que se publicó esta falla en la librería de log4j han salido numerosos parches y soluciones para la misma, además de que esta sólo puede ser explotada si el servidor en cuestión está abierto a Internet y corre un programa de Java que tenga esta biblioteca como dependencia.

¿Qué tiene que ver Minecraft en esto?

Minecraft tiene actualmente tres versiones totalmente diferentes, la versión multiplataforma en Java, la de código nativo de Windows y la Pocket Edition. La versión más importante, en este contexto, es la de Java, además de que es la que tiene una mayor comunidad. Y además, debido a la eclosión del interés por el Metaverso, hay que reconocerle a este mundo virtual ser uno de los pioneros este futuro que está por venir, así que, nos sirve de ejemplo de cómo puede funcionar la seguridad de estas plataformas, y cómo puede verse afectado un mundo virtual del Metaverso por un bug de tipo 0day.

Como he dicho, en las últimas semanas han surgido un montón de parches para esta vulnerabilidad, además de que todo sistema “importante” con desarrolladores a su cargo han solucionado ya esta vulnerabilidad, incluso Minecraft ha sacado una actualización que lo solucionaba. Pero aún así, este servidor, y esta vulnerabilidad, lo hacen muy jugoso como una nueva técnica hacking de aplicaciones web, similar a lo que fue Heartbleed (más importante aún).
Pero si conocéis el mundillo de Minecraft sabréis que este tiene una cantidad enorme de mods hechos por la comunidad para mejorar la experiencia de juego, y si actualizamos perderemos compatibilidad con muchos de ellos. También se puede jugar online y para ello hace falta que exista un servidor de juego al que se conectarán los diferentes jugadores o bien que alguno de los jugadores haga de host y los demás se conecten a su ordenador.

Pues entonces, si unimos la gran fragmentación que existe en el ecosistema de Minecraft, tanto en servidores como en clientes, con la gran cantidad de jugadores que tiene y que para jugar con amigos es necesario conectarse a un servidor remoto obtendremos diferentes modelos de ataques que pueden llegar a ser catastróficos.

Posibles ataques

Ahora vamos a ver los posibles ataques que se pueden dar y las circunstancias que tienen darse para que se puedan dar, todo acompañado de una pequeño video para demostrar el verdadero daño que puede causar esta vulnerabilidad. Pero antes que nada para poder entender los ataques que vamos a realizar debemos entender la topología de la red original de Minecraft.

Figura 3: Topología de conexión normal a Minecraft

Cuando nos conectamos a un servidor para jugar con nuestros amigos u otras personas lo que ocurre más o menos es lo que se ve en la imagen anterior. Los diferentes clientes se conectan a través de internet a un servidor que envía y recibe información. Este servidor puede estar alojado en la nube, pero lo normal cuando juegas con amigos es que uno de ellos hospede este en su ordenador. Sabiendo esto ahora vamos con algunos de los posibles ataques que se pueden dar.

Una partida casual

Supongamos que unos amigos deciden jugar juntos y para ello uno se ofrece a alojar un servidor en su ordenador para que así puedan estar juntos. Lo que él no sabe es que uno de ellos decide tomar el control de su máquina explotando la vulnerabilidad de log4shell. Más o menos el esquema de ataque que decide llevar es el siguiente que vamos a explicar. La topología de la red se aproximaba a la imagen siguiente. El objetivo es tomar el control del ordenador que alberga ese servidor y posteriormente tomar el control de los demás ordenadores conectados. Para ello seguirá los siguientes pasos:

Figura 4: Topología de red de una partida casual

Primero hay que preparar el entorno, para ello el atacante monta en su ordenador tres servidores distintos, un servidor LDAP que redirigirá a otro servidor HTTP que se encargará de servir código Java malicioso y finalmente un servidor NetCat para poder acceder en remoto a los demás ordenadores. 

Figura 5: Cliente maligno monta tres servidores LDAP, HTTP y NetCat

Una vez el servidor esté corriendo y los demás jugadores estén conectados el atacante simplemente escribirá por el chat del juego un comando que se encargará de que el servidor del juego se conecte al servidor LDAP

Figura 6: El atacante manda comando para conectarlo al LDAP

Después de que se haya realizado la conexión con el servidor LDAP este redirigirá la conexión al servidor HTTP que enviará código malicioso de Java, gracias a la vulnerabilidad de Log4j una vez el servidor de Minecraft haya interceptado el código lo ejecutara y éste hará conectarse al ordenador que lo aloja, al servidor NetCat del atacante, dando así pleno acceso al ordenador que aloja el servidor de Minecraft.

Figura 7: Explotación de log4j

Posteriormente el atacante podría realizar el mismo ataque a los clientes conectados, puesto que ahora, como controla el servidor al que están conectados dispone de sus direcciones IP públicas.
 
Figura 8: Demo de explotación de log4shell en Minecraft Java version (unpatched)

Servidor atacante

Cambiemos ahora parte de nuestra trama, antes vimos que con un ordenador el atacante tomó el control del servidor y posteriormente el de los clientes, pero esto no es muy realista, ya que normalmente el atacante montaría un servidor en la nube para realizar el ataque. Imaginémonos ahora que nuestro atacante es más avanzado y en vez de atacar a sus amigos se propone un objetivo mucho más ambicioso, tomar el control de un gran servidor de Minecraft en el que juegan cientos de jugadores. 

Figura 9: El atacante controla un servidor

El objetivo no solo es ese servidor sino también “weaponizarlo” para después poder conseguir ejecución remota de comandos en los clientes conectados al mismo y así montar por ejemplo una botnet. No sería mucho más difícil de como ya lo hizo. La técnica sería la misma mediante la explotación de log4j conseguiría ejecución remota de código en el servidor de Minecraft y una vez tenga el control de éste obtiene las direcciones IP de los jugadores conectados y de la misma manera toma su control. El ataque como tal podría seguir el siguiente esquema:

Figura 10: Servidores del atacante montados: LDAP, NetCat, Minecraft client

Como preparativos nuestro atacante montaría dos servidores en la nube, uno para montar el servidor LDAP y alojar el código a ejecutar y otro distinto con el que tomaría el control de los servidores abriendo por ejemplo NetCat en un puerto determinado. Después en su ordenador solo tendría que abrir Minecraft y conectarse al servidor del juego. 

Figura 11: Comando para conectar el servidor al LDAP

Posteriormente con el cliente de juego que está conectado escribirá por chat un comando que hará al servidor conectarse al servidor LDAP que está en la nube y este le mandara código para que el servidor del juego ejecute. Este código por ejemplo podría hacer que establezca conexión con el NetCat del atacante y así este obtendría ejecución remota de comandos en el servidor. 

Figura 12: Atacando a los clientes

Como paso final solo tendría que tomar las direcciones IP de los demás jugadores conectados al servidor del juego y repetir el proceso una y otra vez. 

Cómo evitar el ataque

Estos dos ataques, tal y como están pensados, se podrían evitar simplemente conectado un plugin al servidor del juego que filtre los comandos que se envían al servidor. Y aunque seria una manera válida, no debemos de olvidarnos que la vulnerabilidad reside en el paquete de log4j con lo que existen otros vectores de ataque que podrían seguir funcionando.

La mejor manera de evitarlo en el lado del servidor es utilizar programas de servidor de la versión 1.18.1 para arriba, esto no siempre será lo deseado porque como ya dijimos se perdería compatibilidad con el progreso que ya tengamos y no se podría jugar con muchos mods de las versiones anteriores. Otra manera sería actualizando a mano las dependencias del servidor de Minecraft, para así tener la última versión de log4j en la que ya se ha parcheado la vulnerabilidad.

En el lado del cliente de manera oficial Minecraft ha actualizado su launcher para que en ninguna versión del juego sea posible explotar esta vulnerabilidad. Eso de cara al Launcher oficial, si por algún casual tenéis un Launcher pirata o modificado este parche seguramente no se haya aplicado con lo que correis un alto riesgo de ser atacados. En un post en la web oficial de Minecraft se explican otras posibles soluciones. Como solución general Java nos recomienda que actualicemos el jdk a la última versión, esto no detendrá todos los vectores de ataques posibles, pero sí mitigara algunos de ellos.

Conclusión final

Como ya hemos visto log4shell es una vulnerabilidad de seguridad muy importante que permite un montón de ataques diferentes, y la que hoy he mostrado es solo una de las muchas maneras en las que se puede explotar esta vulnerabilidad. Además este fallo de seguridad ha sido un “0day” lo que significa que ha estado activa hasta que se notificó hace dos meses, pudiendo haber dado lugar a muchos ataques como el que hoy he mostrado sin que ni siquiera nadie se diera cuenta. Habiendo pasado ya más de dos meses de que se crean numerosas soluciones para esta vulnerabilidad ya es un buen momento para sacar este artículo y enseñaros que todas precauciones son pocas y que siempre hay que estar alerta. Nos vemos en siguientes artículos,

Saludos,

Autor: Chema Garabito. Desarrollador Full-Stack. Ideas Locas Telefónica CDO.

No hay comentarios:

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares