今天看到这个文章
https://www.akamai.com/blog/security-research/2025/jun/botnets-flaw-mirai-spreads-through-wazuh-vulnerability
发现已经被几个mirai僵尸网络利用了,影响面广泛,而且还好用,僵尸网络用的一般就是品相这么香的漏洞,
wazuh是一款开源的XDR软件,其是用在威胁情报告警方面的
那就来看看,官方通告:https://github.com/wazuh/wazuh/security/advisories/GHSA-hcrc-79hj-m3qh
存在于版本4.9.1之前,
看起来问题出在版本 4.4.0 至 4.9.1 之前,存在一个不安全的反序列化漏洞,允许在 Wazuh 服务器上远程执行代码。DistributedAPI 参数被序列化为 JSON 格式,并使用 as_wazuh_object
(在 framework/wazuh/core/cluster/common.py
中)进行反序列化。如果攻击者成功地将未经验证的字典注入到 DAPI 请求/响应中,可以伪造一个未处理的异常(__unhandled_exc__
)来执行任意 Python 代码
在4.9.0版本的代码https://github.com/wazuh/wazuh/blob/v4.9.0/framework/wazuh/core/cluster/common.py里面找到了这样一个函数:
而漏洞报告中提到的unhandled_exc
被如此传入到exc_data中,并eval了其class部分内容。。。
问题来了,传入as_wazuh_object(dct: Dict)的是啥,
点开其实际引用,典型的就是长这样,看起来是对页面响应的,hook的函数?
后面知道,这个dapi很关键,其实际上是DistributedAPI缩写,关于分布式请求处理的api,意味着很多请求都得走这,而我们要想触发漏洞,就需要某个生成了dapi类的请求,再进一步执行 distribute_function函数
这里记住dapi和 distribute_function就好,下面有点没有头绪,反着看吧
poc的起始点在RUN_AS_LOGIN_ENDPOINT = “/security/user/authenticate/run_as”
这里有个叫做middlewares.py的文件,有点像中间件的效果,做了路径上的映射
对于该端点的处理,会被传入wazuh/api/api/controllers/security_controller.py的run_as_login,以生成用户登录成功的token
请求内容被json结构化,并传入f_wargs,其请求type是local_master,然后,给了dapi,并且正是执行了 distribute_function
至此,执行的流程梳理出来了,就是,请求 “/security/user/authenticate/run_as”,进入”wazuh/api/api/controllers/security_controller.py”,最后被创建了DistributedAPI,并且执行distribute_function
而如果我们传入的数据带有unhandled_exc,将会被执行代码,当然,这是python代码那种eval,不是shell,当然也简单,os.system()即可
poc
是这位老哥挖的,给出了poc
https://github.com/MuhammadWaseem29/CVE-2025-24016
POST /security/user/authenticate/run_as HTTP/1.1
Host: target.com:55000
Cache-Control: max-age=0
Accept-Language: en-US
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.183 Safari/537.36
Accept: application/json
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Authorization: Basic d2F6dXcta3dpTUltUzNjcjM3UDA1MHItOg== # Base64-encoded "wazuh-wui:MyS3cr37P450r.*-"
Content-Type: application/json
Content-Length: 83
{
"__unhandled_exc__": {
"__class__": "exit",
"__args__": []
}
}
其中:
__unhandled_exc__的__class__存放了会被exec的东西,exit会导致python退出而dos,当然可以改成更具攻击性的
Authorization: Basic d2F6dXcta3dpTUltUzNjcjM3UDA1MHItOg==
实际上是Base64-encoded 化的 “wazuh-wui:MyS3cr37P450r.*-“
奇怪的是我并没有遇到这个默认密码,默认密码看起来更可能是wazuh?
这意味着这是一个需要经过验证才能利用的rce,
资产数
两个达不溜
不敢乱打,原理分析到此为止,下播