快速识别虚拟主机、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 	#显示当前系统环境中的所有环境变量
    

四、反制

对于防守者而言,通过了解攻击者在云原生环境中可能采取的这些信息探测行为,可以建立有效的告警机制,以便及早发现潜在的攻击行为

posted @ 2024-05-29 18:11  Yuy0ung  阅读(96)  评论(0编辑  收藏  举报