|
拿到一台虚拟机,虚拟第一件事不是机渗扫端口,是虚拟看它“像不像人”。 去年有个项目,机渗目标是虚拟一台跑在VMware里的Windows Server 2019。客户说这是机渗生产环境,别搞崩。虚拟我连上去,机渗发现机器名是虚拟WIN-7K2LQ8F3J4M,默认的机渗。管理员账户Administrator上次登录时间显示为“从未”。虚拟桌面干干净净,机渗回收站空的虚拟,连个临时文件都没有。机渗这不对劲。虚拟真实的生产服务器,哪怕刚部署,也会留下补丁安装日志、杀软更新记录、至少有个浏览器历史。这台机器太干净了,干净得像刚克隆出来的模板。 虚拟机渗透和物理机渗透最大的区别,在于“虚拟”这层壳。物理机你摸不到,但你能从硬件特征、驱动版本、甚至风扇噪音判断它的状态。虚拟机不一样,它的一切都是文件——vmdk、vhd、qcow2。你拿到的可能只是某个快照的副本,或者一个链接克隆。这意味着两件事:第一,你做的任何修改都可能被回滚;第二,宿主机上可能还跑着其他虚拟机,你只是其中之一。 我见过最离谱的案例,是一台Ubuntu虚拟机,SSH端口开着,密码是弱口令。登进去之后,发现/home目录下有个隐藏文件夹,里面全是其他虚拟机的SSH私钥。这哥们把跳板机当成了保险柜。他大概觉得虚拟机是隔离的,宿主机是安全的。但虚拟网络里,只要有一台机器被拿下,ARP欺骗、流量镜像、甚至直接访问VMware的vSphere API,都能把整个集群翻个底朝天。 怎么判断目标是不是虚拟机?Linux下,dmidecode -s system-product-name,如果输出VMware Virtual Platform、VirtualBox、KVM,基本就确定了。Windows下看设备管理器,显卡是VMware SVGA II,网卡是Intel E1000,磁盘控制器是LSI Logic。这些虚拟硬件有个特点:驱动版本往往很旧,而且不会自动更新。你看到一台Windows 10,显卡驱动还是2015年的,不用怀疑,它跑在虚拟机里。 但知道是虚拟机之后,真正的麻烦才开始。提权?虚拟机里的提权漏洞和物理机没区别,但利用方式可能受限。比如脏牛漏洞,在物理机上能改/etc/passwd,在虚拟机里如果磁盘是只读挂载的,就白搭。横向移动?虚拟网络通常用NAT或桥接,NAT模式下你只能看到同网段的机器,桥接模式下你能看到整个物理网络。但有个坑:很多虚拟化平台默认开启MAC地址欺骗防护,你改MAC地址可能直接断网。 我自己的习惯是,拿到虚拟机权限后,先看挂载点。mount命令,如果看到/dev/sda1 on / type ext4,正常。如果看到overlay on / type overlay,说明这是容器,不是虚拟机。容器和虚拟机的渗透思路完全不同。容器里你逃逸出去就是宿主机,虚拟机里你逃逸出去是Hypervisor。难度不是一个量级。 还有个细节:时间。虚拟机的时间同步往往有问题。你date一下,如果时间和你的本地时间差了几小时,或者和NTP服务器对不上,说明这台机器可能刚从快照恢复,或者宿主机时间没同步。这个信息可以用来判断目标是否在活跃使用中。如果时间停在三个月前,那大概率是个废弃的测试机,随便搞。 最后说个真事。某次渗透,目标是一台Windows虚拟机,我拿到了SYSTEM权限。准备留个后门,结果发现C盘有个文件夹叫_snapshot,里面是vmdk文件。我试着用7z解压,居然没加密。直接挂载,看到了宿主机上的其他虚拟机磁盘。那台宿主机上跑着12台虚拟机,包括一台域控。我什么都没做,把发现写进报告就撤了。客户后来把整个虚拟化平台重装了。 虚拟机渗透,说到底是在和“临时性”打交道。你以为你拿下了,其实你只是拿下了某个时间点的副本。真正的战场在宿主机,在存储,在那些你摸不到的vmdk文件里。 |