AWD神器—watchbird后台rce挖掘

server/2024/9/24 2:21:28/

简介

在传统的AWD攻防中,Waf扮演着重要的角色,Watchbird作为一款专门为AWD而生的PHP防火墙,具有部署简单,功能强大等特点,一出世便受到了广大CTFer的喜爱,目前在GitHub上已有600多star。本篇则详细介绍如果拿到watchbird后台,怎么利用watchbird后台进行rce。

项目部署

版本:除了最新版(两周前发布的新版本中此漏洞已修复)
具体部署细节可参考官方文档
Watchbird项目地址:https://github.com/leohearts/awd-watchbird

漏洞挖掘

获取后台账户密码

使用过watchbird的师傅应该都有所了解,watchbird的操作都是有鉴权的

图片

没有拿到用户的cookie或者密码,就谈不上后台rce了
这里只能通过爆破获取密码
可能很多人有疑问,watchbird不是有防DDOS,爆破不直接给封了吗?

图片

就像上面这样,短时间频繁访问会直接返回一个watchbird的logo,不会正常返回网站内容
watchbird确实是有这个功能,如果爆破目标网站就会被封,但是爆破watchbird密码就不会,因为,只是单纯验证watchbird密码的话,代码根本就走不到防DDOS这一步。所以,师傅们放心爆破吧,从比赛开始一直爆破到比赛结束都没问题!

图片

上面的示例中可以看到,当密码为123456时,返回长度不一样,说明爆破成功了
当然,还有一种方法就是打xss钓鱼,这里就不过多阐述具体细节了,我们直接入正题

修改配置的方法

进入后台后是这样的页面

图片

watchbird算是一个rasp(应用运行时自我保护)的waf,php程序是这样的。
也就是说,每次访问网站的时候,代码都是从头到尾重新运行一次,watchbird又没用到数据库,它是怎么存储用户信息和配置的呢?
开发常用方法,就是用序列化来保存用户配置
代码开头就定义了配置文件的路径
$config_path='/tmp/watchbird/watchbird.conf'

图片

图片

打开看一下,都是类序列化后的内容,这个类就是下面要讲的

图片

watchbird定义了一个configmanager类用来实现有关配置的一切功能,暂且叫它配置类

图片

图片

这个类的成员对应waf所有功能的开关状态,文件路径,过滤规则等等
同样这个类还有一个方法

图片

change方法接受一个$key和一个$val
接着把当前配置类的$key赋值为$val
最后用file_put_contents函数将当前配置类进行序列化后写入到配置文件watchbird.conf中,由此实现用户配置更新
但问题就在这里,他没有对这个$key和$val进行校验
所以$key和$val可以任意写入到配置文件中,我们可以更改原有配置,也可以新添配置
而且,调用这个change方法也很简单

图片

只需要验证用户身份,就可以直接调用。

修改密码(示例)

举个简单的例子,watchbird没有提供修改密码这一功能,总有人问密码忘了怎么修改,下面就演示一下
保存用户密码的是配置类中的$password_sha1属性

图片

它的初始值是unset
当用户第一次登录时

图片

它会先将前端ui输出出来,然后将配置类的password_sha1赋值给ui类的passwdhash,接着调用了ui的show方法

图片

在show方法中,他会判断这个passwdhash的值是不是unset,如果是的话,就会调用配置类的change方法初始化密码。
因此,只需要传参
?watchbird=change&key=password_sha1&value=unset

图片

password_sha1就被更改为unset了
删掉cookie后刷新一下

图片

就再次回到了初始化界面。
当然也可以到watchbird.conf中直接去改序列化后的数据

图片

这样就实现了用户密码修改

修改配置文件路径

但仅仅这样任意修改配置文件还不足以拿到shell
重点在文件最初运行时的操作

图片

当程序运行时
首先会检查配置文件路径是否存在,不存在则创建(这对应首次访问的情况)
接着会检查配置文件是否存在,不存在则将配置类序列化后写入配置文件中(同上)
然后反序列化读取配置,赋值给config变量
重点就在下面的foreach
这个foreach获取了config中的所有属性,并变成key=>val的形式
用了两个$,将config中的属性放到了全局中
前面说了,配置我们是可以随意更改的
如果我们在之前的操作中新增了一个config_path属性并写入到配置文件中
那么当代码走到这里的时候,从配置文件中读取的config_path会被写入到全局中
这样就覆盖了watchbird开头定义的congfig_path的值

图片

这样一来,配置文件的路径和文件格式就被改变了
如果我们将他改为/var/www/html/shell.php
那么接下来用户的操作中,如果需要更改配置,用户的配置信息会被写入到/var/www/html/shell.php中

图片

而根据代码流程很容易看到,接下来就可以直接调用change方法来实现配置文件重新写入
我们来实现一下

图片

最初网站根目录下是没有其他文件的

图片

接着我们调用change方法添加一个config_path配置,并将他的值设为网站的根目录
这里要执行两次
第一次,是将config_path写入到/tmp/watchbird/watchbird.conf中
第二次,就会读取配置,覆盖config_path变量,将配置写入到shell.php中了

图片

查看根目录,果然他出现了
访问shell.php

图片

没问题,很nice

写入木马

因为配置我们可以随便写入,我们直接将配置名写为php程序

图片

像这样,我写入了一个php程序用于输出当前目录下的文件
查看一下shell.php文件

图片

写入成功
访问shell.php

图片

执行成功
到这一步ctfer都已经轻车熟路了,后面的环节就不再多说了,尽情写马吧!

总结

闲来无事,偶然翻阅源码发现的小tips,因为省事自己用本机windows的phpstudy搭的,真实awd比赛一般都是linux环境,所以以上仅供参考!欢迎师傅们多多交流!

更多网络安全优质免费学习资料与干货教程加v

渗透工具、技术文档、书籍,面试题、视频(基础到进阶。环境搭建,HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等)、应急响应笔记、学习路线。

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,

所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。


http://www.ppmy.cn/server/95625.html

相关文章

OD C卷 - 小华地图寻宝

小华地图寻宝&#xff08;200&#xff09; m x n的矩阵中&#xff0c;横纵坐标范围【0&#xff0c;n-1】【0&#xff0c;m-1】横纵坐标数位之和<k的方格中存在1g黄金&#xff0c;如&#xff08;21,13&#xff09;坐标中2113 < 10&#xff1b;从&#xff08;0,0&#xff…

今天的一件小事,亲身感受:付费是提高效率的重要途径

今天需要修改一个单页网站源码&#xff0c;有一个小问题困住我3个小时了。 毕竟我也不是专业的&#xff0c;没有系统学习过这些&#xff0c;搜答案都不知道怎么搜哈哈 吃过午饭&#xff0c;想着不能这么耗下去了&#xff0c;于是及时去了某宝&#xff0c;找到一个修改代码的 …

网络编程-

1-什么是网络编程 网络编程是指通过计算机网络实现程序之间的数据交换和通信的技术和方法。它涉及到如何在网络上传输数据、建立连接、处理请求和响应等内容。在软件开发中&#xff0c;网络编程通常用于开发客户端和服务器之间的交互&#xff0c;使得不同计算机之间可以进行数…

代码随想录算法训练营第二天 | 209. 长度最小的子数组、59. 螺旋矩阵 II

目录 209. 长度最小的子数组1、题目描述2、思路3、code4、复杂度分析 LC59 螺旋矩阵 II1、题目描述2、思路3、code4、复杂度分析 209. 长度最小的子数组 题目链接&#xff1a;209 1、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于…

mongodb 备份还原

### 加入 MongoDB 官方 repositoryecho [mongodb-org-4.4] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/ gpgcheck1 enabled1 gpgkeyhttps://www.mongodb.org/static/pgp/server-4.4.asc| tee /etc/yum.repos.d/mo…

文件包含漏洞Tomato靶机渗透_详解

一、导入靶机 将下载好的靶机拖入到VMware中&#xff0c;填写靶机机名称(随便起一个)和路径 虚拟机设置里修改网络状态为NAT模式 二、信息收集 1、主机发现 用御剑扫描工具扫描虚拟机的NAT网段&#xff0c;发现靶机的IP是192.168.204.141 2、端口扫描 用御剑端口扫描扫描全…

算法日记day 28(贪心之分发饼干|摆动序列|最大子数组和|买卖股票最佳时机)

一、分发饼干 题目&#xff1a; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干…

【Python系列】深入理解 Python 中的 `nonlocal` 关键字

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…