一、环境搭建
1.拉取
git clone https://github.com/vulhub/vulhub
拉去成功后去官网找到cacti的安装包

下载后使用unzip解压后
wget https://github.com/Cacti/cacti/archive/refs/tags/release/1.2.22.zip
unzip 1.2.22.zip
2.启动容器
bash
docker restart $(docker ps -aq)

3.添加debug调试
物理机的 VScode 要安装好以下插件: Remote-ssh、Docker、dev containers。 在使用 Vcode 远程连接虚拟机,连接容器的时候需要用到。
以上插件安装好之后的具体步骤如下:
进入容器:
docker exec -it <your-container>
安装指定版本的 Xdebug:
pecl install xdebug-3.1.6。
启用 xdebug 扩展:
docker-php-ext-enable xdebug
重启容器:
docker restart <your-container>
编辑 .ini 文件:
/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini,添加如下内容: zend_extension=xdebug xdebug.mode=debug xdebug.start_with_request=yes
使用 VScode 连接容器后,为容器安装 Xdebug 插件
4.访问
安装完后使用主机IP:8080访问cacti登陆界面,使用admin/admin作为账号密码登录,并根据页面中的提示进行初始化,初始化的过程就是点击"下一步",直到安装成功即可:



5.测试

虽然响应包里没有回显,但是进入容器中即可发现
/tmp/success
已成功被创建:

二、代码审计
1.使用vscode远程连接cacti容器

- 看函数名称这是一个权限的识别,必须绕过
remote_client_authorized

再看get传递的参数,是用户可控的,一定能走进case polldata
这个开关语句,一定会触发poll_for_data
函数。

接下来有三个请求

之后,对这个数组进行一个判断,判断之后是一个查询。 再查询的时候,出现了一个函数 proc_open


如果需要执行命令,一定要将output
赋值给value
,否则output
就会变成U,
这里做了一个prepare_validate_result
提前的判断,必须要绕过这个函数

这两个不相等就绕过了
三、实现
在代码里打上断点

在浏览器里搜索
然后使用burpsuilte抓包,并在header头里加上 X-Forwarded-For:127.0.0.1

在访问容器后生成了sucess文件

构造相关的命令行

传参时,防止空格的影响要进行urlencode编码

经过解码之后就会得到对应的结果

