一、网络拓扑总览
本系列的网络结构非常简单:一台 VMware 宿主机跑两台虚拟机,同处 10.10.10.0/24 实验网段,网关 10.10.10.2,与办公网和互联网完全隔离。
| 角色 | 主机 | 地址 | 说明 |
| 攻击机 | Kali Linux(kali-peng) | 10.10.10.110 | 所有渗透操作从这里发起 |
| 靶场宿主 | Rocky Linux 9.8(pxg) | 10.10.10.240 | 第 1 篇已搭好 15 个常驻靶场 |
| 网关 | VMware 虚拟网络 | 10.10.10.2 | 两台虚拟机的默认路由 |
攻击机的地址要固定下来。实验环境中虚拟机数量多、IP 资源紧张,采用「IP 复用 + 不同时开机」策略:同一 IP 可以登记多台机器,但同一时刻只开一台。为了不踩 ARP 冲突,攻击机 IP 必须静态固定,而不是依赖 DHCP。
二、Kali 安装与静态 IP 配置
Kali 用官方镜像安装即可(本系列使用 Kali Rolling,内核 6.x)。装完第一件事不是装工具,而是把 IP 固定。
2.1 改静态 IP:用 NetworkManager,别碰 interfaces 文件
Kali 的有线网卡由 NetworkManager 托管,/etc/network/interfaces 只管回环。改 IP 有一条命令就够——先备份,再修改,最后激活:
# 1. 备份 NetworkManager 连接文件(改动前必备)
cp "/etc/NetworkManager/system-connections/Wired connection 1" /root/net-backup/
# 2. 一条命令落 IP、网关、DNS
nmcli con mod "Wired connection 1" \
ipv4.method manual ipv4.addresses 10.10.10.110/24 \
ipv4.gateway 10.10.10.2 ipv4.dns "10.10.10.2,8.8.8.8"
# 3. 激活生效(持久,重启不丢)
nmcli con up "Wired connection 1"
验证:ip -4 -o a 确认 eth0 是 10.10.10.110/24;nmcli -g ipv4.method,ipv4.addresses,connection.autoconnect con show "Wired connection 1" 应输出 manual、地址与 yes(autoconnect 开启,开机自动生效)。

2.2 确认连通性
ping -c 2 10.10.10.240 # 到靶场宿主
cat /etc/os-release | head -1 # Kali GNU/Linux Rolling
hostname # kali-peng(认机看主机名,不靠 IP)

IP 复用环境下,「连的是哪台」不看 IP 看主机名:靶场宿主是 pxg,Kali 是 kali-peng。这个习惯在多机实验网段里能避免大量张冠李戴。
三、工具部署清单
Kali 官方仓库即可装齐本系列所需工具。按用途分组核对:
| 类别 | 工具 | 用途 |
| 信息收集 | nmap、masscan、dirsearch、feroxbuster、ffuf、whatweb | 端口扫描、目录爆破、指纹识别 |
| Web 漏洞 | sqlmap、burpsuite、zaproxy | 注入、抓改包、自动化扫描 |
| 漏洞框架 | metasploit-framework | vsftpd/Samba/Tomcat 等模块化利用 |
| 口令破解 | hydra、john、hashcat、crunch、cewl | 在线/离线口令破解 |
| 内网横向 | impacket、netexec、evil-winrm、responder | 内网凭据与横向移动 |
| 浏览器利用 | beef-xss | XSS 结合浏览器劫持 |
| 字典 | seclists、wordlists(rockyou) | 爆破与目录爆破字典 |
# 常用工具安装(Kali 仓库)
apt update && apt install -y dirsearch feroxbuster ffuf whatweb \
sqlmap burpsuite zaproxy hydra john hashcat seclists
# 字典确认
ls /usr/share/wordlists/rockyou.txt # 解压后使用
ls /usr/share/seclists/ | head
Burp Suite 浏览器代理默认监听 127.0.0.1:8080,与靶场端口不冲突(靶场在 240 上)。浏览器需配置代理指向它并安装 Burp 证书,这是后续抓改包的前提。
四、Metasploitable2 服务补全:端口通不等于服务可用
第 1 篇留了一个尾巴:Metasploitable2 容器(镜像 tleemcjr/metasploitable2)的原始启动配置只会拉起 4 个服务,其余十几个服务全靠手工补。这一节完整讲清现象、根因和最终方案。
4.1 现象:探测全通,服务全瘫
容器显示 Up,宿主机 12 个映射端口用 /dev/tcp 探测全部 OK,但访问 http://10.10.10.240:8180/ 返回 000,MySQL 客户端报 Can't connect。
关键认知:Docker 的端口发布由 docker-proxy 在宿主机监听,即使容器内进程没起来,宿主机 TCP 也能建连——这是「假通」。判断服务必须协议级验证:HTTP 用状态码、SSH/FTP/SMTP 读 banner、数据库跑一条 SQL。
4.2 根因:三个连环坑
坑一:镜像的 /etc/rc.local 只拉起 rmiregistry、unrealircd、vncserver、druby 四个服务。apache2、mysql、ssh、samba、tomcat、proftpd 等全都不会自动启动,必须逐个跑 /etc/init.d/服务名 start。
坑二:容器内没有 timeout 命令。这是 Ubuntu 8.04 时代的老系统,coreutils 里根本没有 timeout。启动脚本若用 timeout 25 做保护,结果 18 个服务日志里全是 command not found,静默失败一个都没起来。老容器里保护要用「后台并发 + 独立日志」替代。
坑三:docker exec 前台跑 init 脚本会卡死。老 Init 脚本自身会等待,逐个前台执行会拖到超时。解法:每个服务用后台方式启动,互不阻塞。
4.3 最终方案:启动脚本 + compose 外挂
写一个启动脚本挂载进容器,由 compose 的 command 执行。每个服务后台启动、日志独立落盘,Tomcat 5.5 启动极慢(jsvc 方式需 2~4 分钟),放在最后单独启动:
#!/bin/bash
# /data/pentest/lab/msf2-start.sh
for svc in sysklogd klogd bind9 ssh portmap mysql postgresql-8.3 distcc \
openbsd-inetd postfix rsync samba snmpd xinetd proftpd atd cron apache2; do
[ -x /etc/init.d/$svc ] && ( /etc/init.d/$svc start >/tmp/init-$svc.log 2>&1 ) &
sleep 2
done
sleep 20
( /etc/rc.local >/tmp/rc-local.log 2>&1 ) & # RMI / unrealircd / vnc / druby
[ -x /etc/init.d/tomcat5.5 ] && ( /etc/init.d/tomcat5.5 start >/tmp/init-tomcat5.5.log 2>&1 ) &
sleep 15
echo "LAB START DONE $(date)" >> /tmp/lab-boot.log
exec tail -f /dev/null
compose 中的接法(原 command 只跑 rc.local 是「服务只有 4 个」的元凶,必须替换并挂载脚本):
metasploitable2:
image: tleemcjr/metasploitable2
container_name: metasploitable2
command: ["/bin/bash", "/root/msf2-start.sh"]
volumes:
- "./msf2-start.sh:/root/msf2-start.sh:ro"
ports: ["2121:21", "2222:22", "2323:23", "2525:25",
"8180:80", "8181:8180", "1139:139", "1445:445",
"11099:1099", "33306:3306", "15432:5432", "5901:5900", "6200:6200"]
networks: [pentest-net]
restart: unless-stopped
改了 command 必须 force-recreate(restart 不会重读 command):
docker compose up -d --force-recreate metasploitable2
docker exec metasploitable2 cat /tmp/lab-boot.log # 看到 LAB START DONE 即脚本跑完
4.4 验收:协议级逐项核对
| 宿主端口 | 服务 | 验收方式与预期 |
| 2121 | vsftpd 2.3.4 | banner 应为 220 (vsFTPd 2.3.4) |
| 2222 | OpenSSH 4.7p1 | banner 应为 SSH-2.0-OpenSSH_4.7p1 Debian |
| 2525 | Postfix | banner 应为 220 metasploitable.localdomain ESMTP |
| 8180 | Apache 2.2.8 | curl 返回 200(DVWA/Mutillidae/phpMyAdmin 页面) |
| 8181 | Tomcat 5.5 | curl 返回 200,tomcat/tomcat 可登 Manager |
| 33306 | MySQL 5.0.51a | mysql -uroot -e 版本查询返回 5.0.51a-3ubuntu5 |
| 15432 | PostgreSQL 8.3 | 连接提示 PostgreSQL 8.3.1 |
| 1139/1445 | Samba 3.x | 139/445 监听 |
| 5901 | VNC | 监听正常,口令 password |
| 6200 | vsftpd 后门 | 平时不存在,触发后门后才短暂出现(勿探测) |
两个必记的端口事实:宿主机 8180 是容器内 Apache:80(DVWA 等),宿主机 8181 才是容器内 Tomcat:8180。新手最常在这里绕圈——对着 8181 找 DVWA、对着 8180 部署 WAR,自然处处碰壁。
另一个耐心活:容器刚起来时 curl 8181 返回 000 属正常,Tomcat 5.5 通过 jsvc 启动需要 2~4 分钟,不要误判为失败。另外判断 Tomcat 死活别用 ps 找 java——它的进程名是 jsvc。
五、全链路连通验收
攻击机与靶场就位后,从 Kali 做一次全链路验收,作为后续所有篇章的基线:
# 1) Web 靶场批量探活(HTTP 状态码)
for p in 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091; do
echo -n "$p -> "; curl -s -o /dev/null -w "%{http_code}" --max-time 6 \
-L http://10.10.10.240:"$p"/; echo
done
# 2) MSF2 关键服务 banner 核对
printf "QUIT\r\n" | nc 10.10.10.240 2121 | head -1 # 220 (vsFTPd 2.3.4)
exec 3<>/dev/tcp/10.10.10.240/2222; head -1 <&3; exec 3<&- # SSH banner
# 3) 数据库靶标(MySQL 客户端连 8.0 必加 --skip-ssl)
mysql -h10.10.10.240 -P3307 -uroot -proot --skip-ssl -e "select version();" # 5.7.44
redis-cli -h 10.10.10.240 -p 6380 ping # PONG
全部符合预期即基线成立。至此环境层完工:宿主机 15 个常驻容器(含 Metasploitable2 全服务)、攻击机固定 IP 且工具齐备。下一篇正式开打——从 sqli-labs 的 Less-1 开始,看见 SQL 注入是怎么发生的。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/qq_28608175/article/details/168947439





