虚拟机与网络模拟

前面「Docker与漏洞环境」一章解决了"单机单漏洞"的复现问题,但比赛里还有一类题靠单机环境练不了:内网渗透、多层网络渗透。这类题的难点不在某个具体漏洞,而在 网络拓扑——你和目标之间隔着路由、网段和跳板机。本章用 VMware / VirtualBox 搭一个最小但完整的多网段实验环境,为「实战能力」部分的「两层网络实战」打底。

为什么需要虚拟机拓扑

单机环境模拟不了什么

一个 Docker 容器跑起来的靶场,网络模型是"你的浏览器 → 靶机 80 端口",一条直线。但真实比赛中的内网题长这样:

  • 出题方只暴露一台 边界机(通常是 Web 服务)到你的网段;
  • 边界机身后还有一个你 直接访问不到 的内网段,里面跑着数据库、内网 Web、域控等;
  • flag 往往在内网机器上,你必须先打穿边界机,再把它当跳板往里走。

这里涉及的技能——双网卡、路由、转发、代理隧道——都不是单机环境能给的。要练,就得自己控制网段划分,亲手配出" reachable / unreachable "的边界。

自己搭拓扑的三个好处

  • 可控:网段、路由、防火墙全由你定义,可以精确还原比赛拓扑,也可以随手加一台机器升级难度。
  • 可快照:打坏了回滚快照即可,比重装 Docker 镜像还快。
  • 可复现:搭好之后,「立足点建立」「代理与隧道」「内网信息收集」这些章节的练习都可以在这套环境里做,一次搭建长期使用。

VMware / VirtualBox 网络模式速览

两种软件的叫法不同,但底层模型几乎一一对应。理解三种模式就够用:

NAT 模式

虚拟机通过宿主机做 NAT 上网,宿主机本身也在这个 NAT 网段里(VMware 默认是 VMnet8,VirtualBox 默认是 10.0.2.0/24 的 NATNetwork)。

  • 虚拟机 → 外网:通。
  • 宿主机 → 虚拟机:通(NAT 网段内)。
  • 物理局域网里的其他机器 → 虚拟机:默认不通。

用途:给虚拟机装系统、更新软件、装工具时用它上网最省事。

仅主机(Host-only)模式

虚拟机和宿主机组成一个私有网段,不通外网。VMware 默认是 VMnet1,VirtualBox 需要先在"主机网络管理器"里创建 vboxnet0

  • 虚拟机 ↔ 宿主机:通。
  • 虚拟机 → 外网:不通。

用途:本章用它做"攻击者所在的网段"——你的 Kali(或宿主机)和靶机的边界网卡都在这个段里,模拟"比赛方暴露给你的那个网"。

桥接(Bridged)模式

虚拟机直接接入宿主机所在的物理局域网,从路由器拿一个真实局域网 IP,和你手机、室友的电脑平起平坐。

用途:需要让局域网里其他真实设备访问虚拟机时才用。搭内网实验拓扑 不建议 用桥接——靶机漏洞服务暴露在真实局域网里有安全风险。

内网段:Internal Network / LAN Segment

除了三种常用模式,还有一个对内网实验最关键的模式:

  • VirtualBox 叫 Internal Network(内部网络),随便起个名字(如 intnet1),所有选了这个名字的虚拟机就在同一个二层段里;
  • VMware 叫 LAN Segment(在虚拟机网卡设置里添加)。

它和 Host-only 的唯一区别是:宿主机不参与这个网段。这正是我们要的"内网"——除了跳板机,没有任何路能走进来。

多网卡多网段拓扑搭建实操

目标拓扑

用一台双网卡跳板机 + 两台内网机,搭出两层网络:

                        外网段 192.168.10.0/24(Host-only)
        ┌───────────────────────────────────────────┐
        │                                           │
   攻击机 Kali                                  跳板机 web01
   192.168.10.100                          eth0: 192.168.10.10
                                           eth1: 172.16.1.10  ←──┐
        │                                (运行 Web 服务,有漏洞)  │
        └───────────────────────────────────────────┘      │
                                            内网段 172.16.1.0/24(Internal Network)
                                                       ┌───┴────┬──────────┐
                                                       │        │          │
                                                   内网机 db01   内网机 web02
                                                   172.16.1.20  172.16.1.30
                                                   (MySQL)      (内网 Web, flag)
  • Kali 只能直接到达 192.168.10.10
  • 172.16.1.0/24 里的机器只有跳板机能碰,这模拟"比赛方的内网";
  • 跳板机是唯一的通路——打穿它,才能进内网。

第一步:创建虚拟网络

VirtualBox 在"工具 → 网络"里确认 Host-only 网卡 vboxnet0 的网段是 192.168.10.0/24(DHCP 建议关掉,全程手动配 IP,方便记忆和写脚本)。VMware 则在"虚拟网络编辑器"里把 VMnet1 设为 Host-only 并指定同网段。

Internal Network 不需要预先创建,在虚拟机网卡设置里选"Internal Network"并填名字 intnet1 即可(VMware 则新建一个 LAN Segment)。

第二步:给虚拟机分配网卡

  • Kali:1 张网卡,Host-only。
  • web01(跳板机):网卡 1 选 Host-only(eth0,外网侧);网卡 2 选 Internal Network intnet1(eth1,内网侧)。装系统时可先临时挂一张 NAT 网卡用于装软件,装完删掉。
  • db01 / web02(内网机):各 1 张网卡,Internal Network intnet1

用 VirtualBox 命令行配置跳板机的两张网卡等价于:

VBoxManage modifyvm "web01" --nic1 hostonly --hostonlyadapter1 vboxnet0
VBoxManage modifyvm "web01" --nic2 intnet --intnet2 intnet1

第三步:配置各机 IP

以内网机 db01(Ubuntu/Debian 系)为例,最小配置只需要 IP,不配默认网关——这是关键:内网机不该有能力直接出网,否则拓扑就失真了:

# db01 上临时配置(重启失效,练手够用)
sudo ip addr add 172.16.1.20/24 dev eth0
sudo ip link set eth0 up

web02 同理配 172.16.1.30/24。跳板机 web01 两张网卡各配各的:

# web01
sudo ip addr add 192.168.10.10/24 dev eth0
sudo ip addr add 172.16.1.10/24 dev eth1
sudo ip link set eth0 up
sudo ip link set eth1 up

Kali 配 192.168.10.100/24。需要永久生效的话,Debian/Ubuntu 写进 netplan 或 /etc/network/interfaces,这里不展开——比赛环境里你多半也是在 shell 里用 ip 命令临时配。

第四步:跳板机开启转发(先理解,后拆除)

先做一个"教学版"配置,让全网互通,验证每台机器配置无误。跳板机上开启内核转发:

# web01:开启 IPv4 转发
sudo sysctl -w net.ipv4.ip_forward=1
# 永久生效:把 net.ipv4.ip_forward=1 写进 /etc/sysctl.conf

Kali 上加一条到内网段的路由:

# Kali:去 172.16.1.0/24 的包交给跳板机
sudo ip route add 172.16.1.0/24 via 192.168.10.10

内网机回包也需要路由,把默认网关指向跳板机:

# db01 / web02
sudo ip route add default via 172.16.1.10

验证连通性

# Kali 上逐层 ping
ping -c 2 192.168.10.10   # 跳板机外网口,必须通
ping -c 2 172.16.1.10     # 跳板机内网口,通了说明路由生效
ping -c 2 172.16.1.30     # 内网机 web02,通了说明转发链路完整

不通时的排查顺序:ip addr 看 IP 配上没有 → ip route 看路由 → 跳板机上 cat /proc/sys/net/ipv4/ip_forward 是不是 1 → 抓包 sudo tcpdump -i eth1 icmp 看包走到哪一跳断了。

用这套拓扑模拟比赛中的两层网络

从"教学版"回到"比赛版"

上面为了验证配置,我们给 Kali 加了直连内网的路由——但 真实比赛里没有这条路。把 Kali 上那条路由删掉,拓扑就变成了比赛形态:

# Kali:删掉直连路由,内网段重新"消失"
sudo ip route del 172.16.1.0/24 via 192.168.10.10

此刻在 Kali 上 ping 172.16.1.30 必然超时。内网依然在,只是你看不见它——这正是比赛的起点。

对应关系一目了然:

实验拓扑 比赛中对应
Host-only 网段 比赛方 VPN 分配给你的网段
web01 外网口 + Web 漏洞 题目给的入口站点
Internal Network 比赛内网
db01 / web02 内网数据库、内网应用、flag 机
(可选)跳板机上的转发规则 比赛方预置的 NAT / 防火墙策略

一个最小演练流程

在这套"比赛版"拓扑里,完整走一遍两层渗透的链路:

  1. 打点:在 web01 的 192.168.10.10:80 上放一个你学过的漏洞——一个命令执行(见「RCE」一章)或者带 SSRF 的页面(见「SSRF注入」)都可以。Kali 上利用它拿到 web01 的 shell,这一步对应「立足点建立」。
  2. 发现内网:在 web01 的 shell 里 ip addr,看到第二张网卡 172.16.1.10,意识到还有一层网络;扫一下内网段,发现 172.16.1.30 的 80 端口。这一步对应「内网信息收集」。
  3. 建立通道:在 web01 上起一个 SOCKS 代理(比如 ssh -D 反弹、frp、chisel 任选其一),让 Kali 能透过跳板机访问内网。这一步是「代理与隧道」一章的主菜。
  4. 收割:挂上代理后访问 http://172.16.1.30/,拿到内网 flag。

与后续章节的衔接

这套环境搭一次,后面一整条线都能用:

  • 两层网络实战」会在这套拓扑上完整做一遍从外网到内网的渗透,本章搭的环境就是它的演武场;
  • 代理与隧道」练习 frp / chisel / SSH 隧道时,内网段就是最好的试验场;
  • 想升级难度,只需再加一张 Internal Network 网卡和一台机器,就演变成了「三层网络实战」需要的拓扑。

到这里,"环境"已经不再是障碍——剩下的就是去「Web入门题单」和各漏洞章节里挑漏洞,往你的 web01 上装了。

评论