网安攻防实验(一)

发布于 2026-09-18  140 次阅读


网络安全对抗能力实践 · 课程实验报告

实验名称:攻防对抗环境搭建

项目 内容 项目 内容
学院 网络与信息安全学院 姓名 xxx
班级 xxxxxxx 学号 xxxxxx
实验日期 2026 年 9 月 17 日

一、实验目的

  1. 学习和了解 Linux Ubuntu 操作系统;
  2. 掌握 Linux 基本命令;
  3. 掌握 VMware 三种网络模式(桥接、NAT、仅主机)的原理与区别;
  4. 了解基本的网络攻防对抗技战术,为后续渗透测试实验建立可复现的靶场环境。

二、实验所用仪器(实验环境)

项目 配置说明
宿主机 Windows,16 逻辑核心,31.3 GB 内存,C 盘可用 107 GB
虚拟化平台 VMware Workstation 25.0.1(虚拟硬件版本 22)
攻击机 Kali Linux 2026.1(4 vCPU / 4 GB 内存 / 20 GB 磁盘)
跳板机 Ubuntu 24.04.3 LTS(noble,2 vCPU / 4 GB 内存 / 10 GB 磁盘)
靶机 Ubuntu 24.04.3 LTS(noble,4 vCPU / 4 GB 内存 / 10 GB 磁盘)
虚拟网络 VMnet8(NAT,192.168.116.0/24)、VMnet1(仅主机,192.168.113.0/24)
软件源 清华大学开源软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/ubuntu
客户机工具 open-vm-tools 2:13.0.10(升级后两台 Ubuntu 均为该版本)

三、实验基本原理及步骤

3.1 VMware 三种网络模式原理

模式 原理 连通性特点
桥接 Bridged 虚拟机经 VMnet0 直接桥接到物理网卡,与宿主机同处物理网段,独立获得 IP 可访问外网;被同网段其他主机直接访问;暴露面最大
NAT 虚拟机经 VMnet8 由宿主机完成地址转换后出网,宿主机充当网关与 DHCP 服务器 虚拟机能出网;外部主机无法主动访问虚拟机;隐蔽性较好
仅主机 Host-only 仅通过 VMnet1 或自定义 VMnet 与宿主机通信,无 NAT、无物理网卡桥接 与互联网完全隔离;仅宿主机与同 VMnet 内虚拟机互通

本实验采用 NAT + 仅主机 组合构造两层网络:攻击机位于 NAT 边界段,靶机位于与互联网隔离的仅主机内网段,跳板机双网卡跨接两个网段。

3.2 拓扑设计与 IP 地址分配

攻防对抗环境网络拓扑

图 1 攻防对抗环境网络拓扑图

主机 角色 网卡 IP 地址/掩码 网络模式 默认网关
Kali Linux 攻击机 eth0 192.168.116.128/24 VMnet8(NAT) 192.168.116.2
Ubuntu1 边界跳板 / 内网网关 ens33 192.168.116.129/24 VMnet8(NAT) 192.168.116.2
Ubuntu1 内网网关 ens37 192.168.113.128/24 VMnet1(Host-only) —(不配)
Ubuntu2 内网靶机 ens33 192.168.113.129/24 VMnet1(Host-only) —(不配)

3.3 虚拟机与虚拟网络配置步骤

  1. 虚拟网络配置:确认 VMnet8 为 NAT 模式(子网 192.168.116.0/24,网关 192.168.116.2),VMnet1 为「仅主机」模式(子网 192.168.113.0/24)。
    图 2 VMnet8 配置为 NAT 模式

图 2 VMnet8 配置为 NAT 模式

图 3 VMnet1 配置为仅主机模式

图 3 VMnet1 配置为仅主机模式

  1. 为跳板机添加第二块网卡:在虚拟机设置中添加网络适配器(ethernet1,PCI 槽位 37),第一块连 VMnet8、第二块连 VMnet1,使其同时位于两个网段;同时将靶机网卡由 NAT 切换至 VMnet1。
    图 4 跳板机双网卡设置(NAT + 自定义 VMnet1)

图 4 跳板机双网卡设置(NAT + 自定义 VMnet1)

  1. 开启内核转发:在跳板机上开启 net.ipv4.ip_forward,使跨网段流量可被转发。
  2. 配置跨网段路由:Kali 与靶机各添加一条指向对端网段的路由,均经跳板机转发。
    图 5 跳板机地址与路由表

图 5 跳板机地址与路由表

图 6 Kali 地址与路由表

图 6 Kali 地址与路由表

图 7 靶机地址与路由表

图 7 靶机地址与路由表

  1. 连通性验证:按「同网段 → 跨网段 → 出网」三层顺序逐级验证连通性。
    图 8 连通性验证:ping 与 traceroute(第一跳为跳板机)

图 8 连通性验证:ping 与 traceroute(第一跳为跳板机)

关键配置命令

# ① 跳板机开启内核转发
net.ipv4.ip_forward=1
# ② 跳板机配置 NAT 出网(使内网靶机可临时访问互联网)
sudo iptables -t nat -A POSTROUTING -s 192.168.113.0/24 -o ens33 -j MASQUERADE
# ③ Kali 添加内网路由
sudo ip route replace 192.168.113.0/24 via 192.168.116.129
# ④ 靶机添加回程路由
sudo ip route replace 192.168.116.0/24 via 192.168.113.128

3.4 软件更新源(APT 源)修改

实验机为 Ubuntu 24.04(noble),其软件源配置已由传统的 /etc/apt/sources.list 改为 DEB822 格式 的 /etc/apt/sources.list.d/ubuntu.sources,替换方式与旧版本不同。

# 备份原配置
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
# /etc/apt/sources.list.d/ubuntu.sources —— 替换为清华源
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# 验证并安装 open-vm-tools
sudo apt update
sudo apt install -y open-vm-tools open-vm-tools-desktop

实测结果:

命中:1 https://mirrors.tuna.tsinghua.edu.cn/ubuntu noble InRelease
命中:2 https://mirrors.tuna.tsinghua.edu.cn/ubuntu noble-updates InRelease
命中:3 https://mirrors.tuna.tsinghua.edu.cn/ubuntu noble-backports InRelease
命中:4 https://mirrors.tuna.tsinghua.edu.cn/ubuntu noble-security InRelease
正在读取软件包列表... 完成

图 9 apt update 命中清华源

图 9 apt update 命中清华源

图 10 安装 open-vm-tools

图 10 安装 open-vm-tools

图 11 复核安装结果(已是最新版)

图 11 复核安装结果(已是最新版)

补充:清理安装介质残留源

实验过程中发现系统残留了一条安装介质源,导致 apt update 直接报错退出,需先行清理(详见 5.1 节)。

grep -rn 'cdrom' /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null
sudo sed -i.bak '/cdrom/s/^/#/' /etc/apt/sources.list

3.5 Ubuntu 基本命令与文件系统探索

以下命令均在跳板机(Ubuntu1)上实际执行,输出为真实回显。

(1)系统基础信息与当前路径

whoami && id
uname -a
grep PRETTY_NAME /etc/os-release
pwd

实测输出(图 12、图 13):

cloverdayssss
uid=1000(cloverdayssss) gid=1000(cloverdayssss) 组=1000(cloverdayssss),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),114(lpadmin)
Linux cloverdayssss-VMware-Virtual-Platform 6.14.0-37-generic #37~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
PRETTY_NAME="Ubuntu 24.04.3 LTS"
/home/cloverdayssss/桌面

图 12 系统信息与用户身份(whoami / id / uname)

图 12 系统信息与用户身份(whoami / id / uname)

图 13 当前所在路径 pwd

图 13 当前所在路径 pwd

(2)新建文件并写入姓名拼音

cd ~
touch 25189100283.txt          # 以学号命名
cat > 25189100283.txt          # 写入姓名拼音
dengmingjie

cat 25189100283.txt            # 验证写入结果

(3)查看详细列表并解读权限

ls -l 25189100283.txt

实测输出:

-rw-rw-r-- 1 cloverdayssss cloverdayssss 12  9月 17 21:34 25189100283.txt

权限解读:

字段 值 含义
文件类型 - 普通文件(d 为目录、l 为符号链接)
属主权限 rw- 属主可读、可写、不可执行
属组权限 rw- 属组可读、可写(Ubuntu 用户私有组默认 umask 为 002)
其他用户权限 r-- 其他用户仅可读
硬链接数 1 指向该 inode 的链接数量
属主 / 属组 cloverdayssss cloverdayssss 文件所有者及其所属组
大小 12 文件字节数

(4)查看内容与统计字符数

cat 25189100283.txt
wc -c 25189100283.txt
wc -l -m 25189100283.txt

实测输出:

dengmingjie
12 25189100283.txt        ← 字节数(wc -c)
1 12 25189100283.txt      ← 行数、字符数(wc -l -m)

说明:内容 dengmingjie\n 共 12 个字符(11 个字母 + 1 个换行符),因全部为 ASCII 字符,字节数与字符数相同。

(5)压缩、删除、复制、改属主、改权限

gzip -k 25189100283.txt      # -k 保留原文件
ls                           # 可见新生成的 25189100283.txt.gz
rm -f 25189100283.txt.gz     # 删除压缩文件
ls                           # 确认已删除
cp 25189100283.txt /tmp/     # 复制到 /tmp 目录
ls /tmp                      # 确认复制成功
sudo chown root:root 25189100283.txt    # 将属主改为 root
ls -l 25189100283.txt
sudo chmod 777 25189100283.txt          # 将权限改为 777
ls -l 25189100283.txt

实测输出:

-rw-rw-r-- 1 root root 12  9月 17 21:34 25189100283.txt   ← 改属主后
-rwxrwxrwx 1 root root 12  9月 17 21:34 25189100283.txt   ← 改权限后

注意:gzip 不加 -k 会删除原文件,后续步骤将无法继续。

图 14 文件创建、内容写入、权限查看、字符统计、压缩与删除、复制全过程

图 14 文件创建、内容写入、权限查看、字符统计、压缩、删除与复制全过程

(6)搜索系统中的隐藏文件

ls -la
find / -name ".*" -type f 2>/dev/null | head -15

实测输出:

-rw-r--r--  1 cloverdayssss cloverdayssss 3771  3月 31  2024 .bashrc
-rw-r--r--  1 cloverdayssss cloverdayssss  807  3月 31  2024 .profile
drwx------ 12 cloverdayssss cloverdayssss 4096  9月 17 14:23 .config

/home/cloverdayssss/.config/.gsd-keyboard.settings-ported
/home/cloverdayssss/.bash_logout
/home/cloverdayssss/.profile
/home/cloverdayssss/.bashrc
/home/cloverdayssss/.sudo_as_admin_successful
/home/cloverdayssss/.bash_history
/tmp/.X1025-lock
/tmp/.X1-lock
/tmp/.X0-lock
/etc/.updated
/etc/.pwd.lock

图 15 属主/权限修改与隐藏文件搜索(ls -la 与 find)

图 15 属主/权限修改与隐藏文件搜索(ls -la 与 find)

3.6 /etc/passwd 文件多维度解读

(1)文件属性与结构

ls -l /etc/passwd
wc -l /etc/passwd
head -3 /etc/passwd

实测输出:

-rw-r--r-- 1 root root 2931  9月 17 20:44 /etc/passwd
50 /etc/passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

图 16 /etc/passwd 文件属性、行数与内容

图 16 /etc/passwd 文件属性、行数与内容

/etc/passwd 属主为 root,权限 644,即所有用户可读、仅 root 可写——这是必要的,因为登录、ls -l 等操作都需读取用户信息,而写入被严格限制以防止提权。

(2)字段含义(以 root 行为例)

序号 字段 含义 示例解析
1 用户名 登录账号名 root
2 密码占位符 x 表示密码已由 /etc/shadow 托管 x
3 UID 用户标识号,0 为超级用户 0
4 GID 主组标识号 0
5 注释/描述 用户全名等信息(GECOS) root
6 家目录 用户登录后的起始目录 /root
7 登录 Shell 登录时执行的 Shell;nologin 表示禁止登录 /bin/bash

(3)统计与筛选

wc -l /etc/passwd
cut -d: -f1 /etc/passwd
awk -F: '3>=1000 &&3<65534 {print 1,3}' /etc/passwd
awk -F: '3==0 {print1}' /etc/passwd
grep -v "nologin\|false" /etc/passwd | cut -d: -f1

实测输出:

50 /etc/passwd                    ← 共 50 个账户

普通用户(UID>=1000):
  cloverdayssss  UID=1000

UID=0 的账户:
  root

可登录用户(shell 非 nologin/false):
root sync cloverdayssss

(4)安全视角解读

  • UID 为 0 的账户即为超级用户。实测仅 root 一个,属正常状态;若出现 root 之外的 UID=0 账户,通常意味着攻击者留下的后门账户;
  • 空密码字段(第 2 字段为空)表示该账户无需密码即可登录,属高危配置;
  • Shell 为 /bin/bash 的服务账户同样可被用于登录。实测可登录账户为 root、sync、cloverdayssss 三个,其中 sync 为系统账户,其 shell 为 /bin/sync,并非交互式 shell;
  • 普通用户 UID 自 1000 起编号,可通过 UID 范围快速区分系统账户与人为创建账户(本机 50 个账户中仅 1 个为普通用户)。

因此 /etc/passwd 是主机安全检查与应急响应中必查的文件之一。

四、实验数据记录

表 1 虚拟机网络配置与连通性验证结果

序号 源主机 目标 命令 结果
1 Kali 192.168.116.128 跳板机 192.168.116.129 ping -c 3 通,min/avg/max = 0.495/0.745/0.931 ms
2 靶机 192.168.113.129 跳板机 192.168.113.128 ping -c 2 通,同网段
3 Kali 192.168.116.128 靶机 192.168.113.129 ping -c 3 通,经跳板机转发,min/avg/max = 0.788/1.750/2.619 ms
4 Kali 192.168.116.128 192.168.113.129 traceroute 第一跳 192.168.116.129,第二跳 192.168.113.129
5 靶机 192.168.113.129 223.5.5.5 ping -c 2 不通,网络不可达(Host-only 隔离生效)
6 跳板机 192.168.116.129 mirrors.tuna.tsinghua.edu.cn apt update 成功,四个仓库索引全部命中清华源,无 404 / GPG 报错

表 2 文件系统基本命令操作记录

操作 命令 结果
新建学号文件 touch 25189100283.txt 创建成功,0 字节
写入姓名拼音 cat > 25189100283.txt 输入 dengmingjie 12 字节
查看权限 ls -l 25189100283.txt -rw-rw-r-- 1 cloverdayssss cloverdayssss 12
查看内容 cat 25189100283.txt dengmingjie
统计字符 wc -c / wc -l -m 12 / 1 12
压缩 gzip -k 25189100283.txt 生成 25189100283.txt.gz
删除压缩包 rm -f 25189100283.txt.gz 删除成功
复制到 /tmp cp 25189100283.txt /tmp/ 成功
改属主 chown root:root -rw-rw-r-- 1 root root
改权限 chmod 777 -rwxrwxrwx 1 root root

表 3 软件源修改前后对比

阶段 源地址 结果
修改前 http://sg.archive.ubuntu.com/ubuntu(境外节点) apt update 耗时长,下载速率低
残留源 file:///cdrom noble 报错「不再含有 Release 文件」,导致 update 整体失败
修改后 https://mirrors.tuna.tsinghua.edu.cn/ubuntu 四个仓库索引全部命中,获取正常(见图 9)

五、实验结果分析及回答问题

5.1 实验过程中遇到的问题与排查

问题一:apt update 报错退出,open-vm-tools 未能安装

现象:执行 sudo apt update && sudo apt install open-vm-tools -y 时,命令在 update 阶段即报错终止,&& 之后的安装步骤完全未执行:

E: 仓库 "file:/cdrom noble Release" 不再含有 Release 文件。
N: 无法安全地用该源进行更新,所以默认禁用该源。

原因分析:系统安装时曾将安装光盘作为本地源写入配置(指向 file:/cdrom)。系统安装完成后 /cdrom 已不再挂载,该路径下不存在 dists/noble/Release 索引文件,APT 因无法验证该源而报错。由于命令使用 && 串联,前一条失败导致后续安装被跳过。

解决:定位并注释掉该条源后重新执行,问题解决。

grep -rn 'cdrom' /etc/apt/sources.list /etc/apt/sources.list.d/
sudo sed -i.bak '/cdrom/s/^/#/' /etc/apt/sources.list

经验总结:排查 apt 故障时应先单独执行 apt update 观察完整报错,再执行安装;使用 && 串联命令时,前置失败会静默跳过后续步骤,容易误判为「安装成功」。

问题二:DNS 解析失败导致 apt 无法工作

现象:修改源文件后 apt update 仍然失败,nslookup 报 SERVFAIL,但直接 ping 公网 IP(223.5.5.5)却可以通。

排查过程:

resolvectl status            # 显示 Link ens33 的 Current Scopes: none
nslookup mirrors.tuna.tsinghua.edu.cn 223.5.5.5   # 指定 DNS 服务器则解析成功

原因分析:NetworkManager 虽已通过 DHCP 获得网络配置,但未向 systemd-resolved 注册 DNS 服务器(Current Scopes: none),导致本地 stub 解析器(127.0.0.53)无可用上游。因此「能 ping 通 IP 但无法解析域名」。

解决:通过 nmcli 显式指定 DNS 并令其忽略 DHCP 下发的 DNS:

CON=(nmcli -t -f NAME,DEVICE con show --active | awk -F: '2=="ens33"{print 1; exit}')
sudo nmcli con mod "CON" ipv4.dns "223.5.5.5,114.114.114.114" ipv4.ignore-auto-dns yes
sudo nmcli con up "$CON"

修复后 resolvectl status 显示 Current Scopes: DNS、Current DNS Server: 223.5.5.5,解析恢复正常。

经验总结:Linux 网络故障排查应分层进行——先验证链路(ping IP),再验证 DNS 解析(nslookup),最后验证应用层(apt update)。若 ping IP 通而域名不通,问题一定在 DNS 环节。

问题三:跨网段流量无 NAT 规则,内网无法出网

现象:为靶机添加默认路由后,靶机仍无法访问互联网。

原因分析:跳板机虽已开启 ip_forward,但 iptables 的 POSTROUTING 链中没有地址转换规则。靶机的数据包虽然能被转发到 NAT 网段,但源地址仍是 192.168.113.129(私有内网地址),VMware 的 NAT 设备无法为其路由回包,因此必须做源地址转换(MASQUERADE)。

解决:

sudo iptables -t nat -A POSTROUTING -s 192.168.113.0/24 -o ens33 -j MASQUERADE

添加后靶机可正常访问互联网(实测时延 26.8 ms)。

经验总结:转发(ip_forward)与地址转换(MASQUERADE)是两个独立环节,前者负责「让包通过」,后者负责「让回包能找到源」。做跨网段网关时两者缺一不可。

5.2 结果分析

(1)网络层面:同网段(Kali–跳板机、跳板机–靶机)二层直通;跨网段(Kali–靶机)需跳板机开启 ip_forward 并具备双网卡后可达。traceroute 结果清晰印证了两层结构:

traceroute to 192.168.113.129, 5 hops max, 60 byte packets
 1  192.168.116.129  0.730 ms  0.653 ms  0.613 ms   ← 跳板机(边界网段)
 2  192.168.113.129  1.470 ms  1.453 ms  1.120 ms   ← 靶机(内网网段)

流量确实经过跳板机中转,而非直达,说明「攻击机—跳板—靶机」的隔离结构成立。靶机位于 Host-only 网段,实测 ping 223.5.5.5 返回 网络不可达,与设计预期一致。

(2)软件源层面:替换为清华镜像源后,apt update 的四个仓库索引全部命中(见图 9),安装 open-vm-tools 无依赖错误,说明源替换生效且版本代号(noble)匹配正确。若 Suites 字段误填其他版本代号,将出现 404 无法获取索引,因此替换前必须用 cat /etc/os-release 确认代号。

(3)文件权限层面:chmod 777 后文件对任意用户可读可写可执行,是典型的危险配置;若该文件为脚本并被 root 执行,则任何用户均可改写其内容从而实现提权,因此生产环境中应避免 777。

5.3 思考题:如何将文件时间修改为某个特定日期?

(1)Linux 文件的四类时间戳

在回答「如何修改」之前,需要先明确「修改哪个时间」。Linux 中一个文件并非只有一个时间,而是四类独立的时间戳,全部保存在 inode 中:

缩写 名称 含义 何时更新
atime Access Time 访问时间 文件内容最后一次被读取的时间 执行 cat、read 等读操作时
mtime Modify Time 修改时间 文件内容最后一次被修改的时间 写入内容时(echo、vim 保存等)
ctime Change Time 变更时间 文件元数据(inode)最后一次变更的时间 改权限、改属主、改文件名、以及 mtime 被修改时
btime Birth Time 创建时间 文件被创建的时间(又称 crtime) 文件创建时,一经写入不可修改

本机实测(Ubuntu 24.04 / 内核 6.14 / ext4,以新建的测试文件为例):

touch /tmp/payload.sh && stat /tmp/payload.sh
  文件:/tmp/payload.sh
  大小:11         块:8          IO 块大小:4096   普通文件
权限:(0644/-rw-r--r--)  Uid: ( 1000/cloverdayssss)   Gid: ( 1000/cloverdayssss)
访问时间:2026-09-17 22:11:00.112905170 +0800    ← atime
修改时间:2026-09-17 22:11:00.113984001 +0800    ← mtime
变更时间:2026-09-17 22:11:00.113984001 +0800    ← ctime
创建时间:2026-09-17 22:11:00.112905170 +0800    ← btime

可以看到四个时间精度均达到纳秒级,且初始状态下依次递增(btime < mtime = ctime < atime),符合「先创建 → 再写入 → 再读取」的操作顺序。

(2)回答思考题:如何修改文件时间为特定日期

# ① 修改为指定日期(同时改 atime 与 mtime)
touch -d "2020-01-01 00:00:00" payload.sh

# ② 引用已有文件的时间戳(伪装成与正常文件同一时间)
touch -r /bin/ls payload.sh

# ③ 分别指定 atime 与 mtime
touch -a -d "2020-01-01 00:00:00" payload.sh    # 仅访问时间
touch -m -d "2020-01-01 00:00:00" payload.sh    # 仅修改时间

# ④ 连带修改 ctime(touch 无法直接修改 ctime,需直接操作 inode)
sudo debugfs -w -R "set_inode_field /home/user/payload.sh ctime 202001010000" /dev/sda2

# ⑤ 更彻底的方式:修改系统时间后再操作
sudo date -s "2020-01-01 00:00:00" && touch payload.sh && sudo hwclock -w

实测验证:对 /tmp/payload.sh 执行 touch -d "2020-01-01 00:00:00" 后,各时间戳变化如下:

时间戳 篡改前 篡改后 是否被修改
atime 2026-09-17 22:11:00.112905170 2020-01-01 00:00:00.000000000 ✅ 已改
mtime 2026-09-17 22:11:00.113984001 2020-01-01 00:00:00.000000000 ✅ 已改
ctime 2026-09-17 22:11:00.113984001 2026-09-17 22:11:00.117905496 ⚠️ 未按预期改,反而更新为当前时间
btime 2026-09-17 22:11:00.112905170 2026-09-17 22:11:00.112905170 ❌ 完全未变

这个结果非常关键:touch 只能修改 atime 和 mtime,对 ctime 和 btime 无能为力。而且因为修改 mtime 本身属于「元数据变更」,反而触发了 ctime 更新为当前时间。

于是产生了一个无法掩盖的矛盾:

mtime = 2020-01-01 00:00:00.000000000   (伪装成四年前)
ctime = 2026-09-17 22:11:00.117905496   (实际篡改动作发生在今天)

即 ctime 晚于 mtime,这在正常情况下是不可能出现的(内容修改必然导致 ctime 同步或更晚更新)。取证人员只要对比 ctime 与 mtime,就能立刻判定该文件的时间戳被人为篡改过。这就是所谓「时间伪装」(timestomping)手法最主要的破绽。

图 17 实测:将文件时间改为 1919 年后,atime 与 mtime 已变,ctime 与 btime 均未改变

图 17 实测:将文件时间改为 1919 年后,atime 与 mtime 已变,ctime 与 btime 均未改变

(3)为什么需要这么多时间?——四类时间戳的设计用途

核心原因在于:单一时间无法完整还原一个文件的生命周期。四类时间各司其职,分别回答不同的问题:

时间戳 回答的问题 典型用途
btime 这个文件什么时候出现的? 判断文件是否为「新出现的可疑文件」;确定入侵时间窗口
mtime 内容最后一次被改动是什么时候? 判断配置是否被篡改、代码是否被植入;版本控制与增量备份的依据
atime 这个文件最后一次被读取是什么时候? 判断敏感文件是否被翻动过(如 /etc/shadow 被读取)
ctime 文件的属性/身份最后变更是何时? 抗篡改的关键证据;可揭示权限提升、属主变更、时间伪装等动作

从攻防两个视角看:

攻击者视角——木马上传后需要「融入环境」,避免时间戳异常引起注意。因此倾向于:

  • 把 mtime 改成与同目录正常文件一致的日期(touch -r);
  • 避免留下与文件创建时间矛盾的访问痕迹。

取证/防御视角——正是利用「四类时间互相牵制」来发现异常。常见的矛盾组合包括:

异常模式 可能含义
ctime 远晚于 mtime 时间戳被篡改(touch 修改 mtime 会更新 ctime)
btime 晚于 mtime 文件被替换或重建(先有旧时间,后创建新文件)
atime 极新但 mtime 很旧 该文件近期被人查看过(可能正在被侦察)
mtime 早于 btime 时间戳被伪造,属明显异常
多个文件 mtime 完全相同(精确到秒) 批量操作痕迹(如攻击者一次性释放多个文件)

因此,四类时间戳本质上构成了一套「交叉验证」机制:单独篡改其中一两个容易,但要同时让四个时间在逻辑上自洽,对普通攻击者而言极其困难。这也是数字取证中「时间线分析」(Timeline Analysis)的基础——取证工具(如 Sleuth Kit 的 fls/mactime)正是按 MAC(Modified-Accessed-Changed)时间排序来重建事件序列的。

(4)防御手段

  1. 使用 auditd 记录文件属性变更事件(ausearch 检索 write / attribute change);
  2. 部署完整性校验工具(AIDE、Tripwire)并保存基线,定期比对;
  3. 利用 ctime、btime 难以被普通手段篡改这一特性进行交叉比对,重点检查 ctime 与 mtime 的矛盾;
  4. 挂载时使用 noatime / relatime 选项减少 atime 噪声(本机实测挂载选项为 relatime),便于集中分析 mtime 异常;
  5. 对关键目录启用不可变属性(chattr +i),从根本上阻止篡改。

六、实验小结

  • 完成 VMware 三种网络模式的原理梳理,掌握 NAT 与 Host-only 的连通性差异;
  • 搭建出 Kali → 跳板机 → 靶机 的两层攻防对抗环境,traceroute 验证跨网段流量确实经跳板机转发;
  • 掌握 Ubuntu 24.04 的 DEB822 源文件格式及替换方法,能独立完成换源与软件安装;
  • 排查并解决了 cdrom 残留源、DNS 未注册、NAT 规则缺失三个实际问题;
  • 熟练掌握 Linux 文件系统相关命令(文件增删改查、权限与属主管理、隐藏文件搜索);
  • 掌握 /etc/passwd 的字段结构与安全审计方法;
  • 掌握 Linux 文件四类时间戳(atime / mtime / ctime / btime)的语义与用途,实测验证 touch 无法篡改 ctime 与 btime,理解「ctime 晚于 mtime」这一时间伪装的破绽,以及四类时间构成交叉验证机制的原理。

"Hasta Ia Victoria Siempre"