一、基础概念
- 虚拟主机
- 定义:一台物理服务器上运行的多个虚拟实例,各有独立环境和资源,常用于 Web 托管。
- 注意:与 “虚拟机(VM)” 不同,虚拟机是包含操作系统、软件和硬件的完整虚拟化系统,可运行多个操作系统实例。
- Docker
- 一种容器化虚拟化技术,将应用及依赖打包成独立轻量环境,支持快速部署、高效运行和跨平台。当容器以特权模式(
--privileged
)启动时,容器内 root 用户权限接近宿主机 root,可能绕过隔离机制实现逃逸。
- 一种容器化虚拟化技术,将应用及依赖打包成独立轻量环境,支持快速部署、高效运行和跨平台。当容器以特权模式(
- K8s(Kubernetes)
- 开源容器编排平台,通过自动化部署、扩展和管理容器化应用,提供集群管理、服务发现、负载均衡等功能,实现高可用性和灵活性。
二、识别思路
在获取 shell 后,需根据环境类型采取针对性措施:
- 虚拟主机:优先横向移动以扩大攻击范围。
- Docker:先尝试容器逃逸,若为特权模式容器,可通过挂载宿主机分区、修改定时任务等方式突破隔离;成功逃逸后再进行内网横向移动。
- K8s:目标是接管集群,获取对容器和集群资源的完全控制。
三、具体识别方法
1. 先判断是否采用虚拟化技术
使用命令:
systemd-detect-virt
- 作用:识别系统是运行在虚拟机(VM)、容器还是裸机上。
2. 针对性识别环境类型
(1)查看主机名和进程
- 容器特征:主机名默认是随机字符串,且 PID1(进程 ID 为 1 的进程)非系统进程。
- 命令:
hostname
:查看主机名。ps aux
:显示所有用户的详细进程信息,检查 PID1 是否为系统进程。
(2)利用 cgroup 信息差异
- 原理:cgroup 用于控制进程资源,不同环境的 cgroup 信息不同。
- 命令:
cat /proc/1/cgroup
:查看 PID1 进程的 cgroup 信息,判断环境类型。grep 'docker' /proc/1/cgroup
:针对性查找是否包含 “docker” 字符串,识别 Docker 环境。
(3)检查根目录下.dockerenv 文件
- 容器特征:Docker 容器根目录通常存在.dockerenv 文件。
- 命令:
ls -alh /dockerenv
:查看该文件是否存在,确认是否为容器环境。
(4)检查挂载信息
- 命令:
mount | grep '/type'
:列出所有已挂载文件系统,筛选包含 /type 路径的信息,推测环境类型。若发现宿主机分区(如/dev/sda1
)挂载到容器内(如/host
),可能为特权模式容器。
(5)查看硬盘信息
- 命令:
fdisk -l
:列出系统所有磁盘分区信息,通过硬盘特征推断是否为容器环境。在特权容器中,此命令可直接查看宿主机磁盘分区(如/dev/sda1
为 Linux 分区)。
(6)获取文件系统和挂载点信息
- 命令:
df -h
:显示文件系统的磁盘使用情况和挂载点,辅助判断是否为容器环境。
(7)检查环境变量
- 命令:
env
:显示当前系统所有环境变量,通过特定环境变量信息识别环境类型。