快速识别虚拟主机、Docker和K8s集群环境
一、基础
随着云原生应用不断普及,我们在针对linux操作系统getshell之后,我们还需要判断该shell是否处于虚拟环境中,并判断该虚拟环境的类型,通常情况下,shell的虚拟环境可能有如下三个类型:
-
虚拟主机
虚拟主机是指在一台物理服务器上运行的多个虚拟主机实例,每个虚拟主机实例都拥有自己的环境和资源,通常用于提供Web托管服务
注意:虚拟主机(Virtual Hosting)和虚拟机(Virtual Machine)是两个不同的概念,虚拟机是一个完整的虚拟化系统,包括操作系统、软件和硬件,可以在单个物理服务器上运行多个操作系统实例
-
Docker
Docker是一种虚拟化技术,利用容器化的方式将应用程序及其依赖项打包成独立、轻量级的环境,实现快速部署、高效运行和跨平台运行的功能
-
K8s
Kubernetes(通常简写为K8s)是一个开源的容器编排平台,通过自动化部署、扩展和管理容器化应用,实现高可用性、弹性和灵活性。它提供了集群管理、服务发现、负载均衡等功能,让用户可以更轻松地管理容器化应用的生命周期
二、思路
如果shell处于虚拟主机、Docker或K8s集群环境中,我们需要对环境进行识别,并采取针对性的措施,比如:
-
虚拟主机:通常考虑横向移动来扩大攻击效果
-
Docker:通常先进行容器逃逸,再进行内网横向移动
-
K8s:通常先尝试接管集群,以获取对容器和集群资源的完全控制
三、识别
首先判断当前shell是否采用了虚拟化技术:
systemd-detect-virt #识别系统虚拟机(VM)、容器还是裸机上运行
在确认采用了虚拟化技术后,常有如下检测方法可以快速识别当前所处环境类型
-
查看主机名和进程
容器的主机名默认随机生成的字符串,PID1非系统进程,可初步判断当前为容器环境
hostname #查看主机名 ps aux #显示系统上所有用户的详细进程信息
-
通过利用cgroup信息的差异
通过查看cgroup信息,可以判断当前环是否是虚拟机、Docker容器或K8s集群:
cat /proc/1/cgroup #用于查看进程ID为1的系统进程(通常是Init进程)所属的cgroup信息,即用于控制和管理进程资源使用的容器技术
也可以针对性的查找关键词,例如针对Docker字符串:
grep 'docker' /proc/1/cgroup #查找是否存在‘Docker’字符串
-
检查根目录下.dockerenv文件
通过判断根目录下的.dockerenv文件是否存在,确认当前环是否为容器环境:
ls -alh/dockerenv #列出/dockerenv目录下的所有文件和目录,并显示详细信息以及人类可读的文件大小
-
通过检查挂载信息
通过检查挂载信息,推测当前环境是虚拟机、Docker容器还是K8s集群:
mount lgrep '/type' #从当前系统中列出所有已挂载的文件系统,并使用grep命令筛选出包含/type路径的挂载信息
-
查看硬盘信息
通过查看硬盘信息,推断当前环境是否为容器环境:
fdisk -l #列出系统上所有磁盘的分区信息
-
获取当前环境的文件系统和挂载点信息
获取当前环境的文件系统和挂载点信息,用来判断是否容器环境:
df -h #显示文件系统的磁盘使用情况和挂载点信息
-
通过了解环境变量包含的信息
通过检查环境变量,了解特定环境的信息:
env #显示当前系统环境中的所有环境变量
四、反制
对于防守者而言,通过了解攻击者在云原生环境中可能采取的这些信息探测行为,可以建立有效的告警机制,以便及早发现潜在的攻击行为