一、I2P在渗透测试中的一次遭遇
前几个月,我接到了一次关于某跨国公司的授权渗透任务。目标是一家在金融领域站稳脚跟的大型企业,手握大量敏感数据。任务的需求很清晰:潜入其内网,找到客户数据存储的核心数据库。然而,渗透过程中,我发现目标公司的一部分流量并未走常见的代理,而是被加密后转发到了一个看起来很陌生的匿名网络——这就是I2P (Invisible Internet Project)。
我当时的第一反应是,这家公司可能在利用 I2P 的隐匿性进行数据传输。作为红队成员,我的首要任务是搞清楚 I2P 的运行机制,并找到潜在的切入点。
二、I2P的架构:隐匿流量背后的奥秘
什么是 I2P?
I2P 是一种点对点的匿名网络协议,旨在保护用户的隐私,隐藏通信的来源和目的地,与更为熟知的 Tor 网络相似,但又有其独特的架构。I2P 的核心理念是通过一个基于路由器节点的分布式网络,实现数据流量的加密、混淆和匿名化。
独特架构:
- 入站隧道与出站隧道:I2P 的通信分为两条链路——发送和接收各自独立。这种双向分离机制大大增加了溯源难度。
- Garlic Routing(大蒜路由):相比 Tor 使用 Onion Routing(洋葱路由),I2P 的 Garlic Routing 更进一步,将多个数据包捆绑在一起传输,进一步提高了通信隐匿性。
- 全分布式设计:I2P 的路由器通过 DHT(分布式哈希表)存储路由信息,没有中心节点,使得追踪几乎不可能。

在我们的攻击场景中,I2P 被用作一种数据传输的隐匿通道,用来隐藏内部流量。接下来,我们先了解如何搭建一个 I2P 环境进行测试。
---
三、搭建 I2P 测试环境:模拟真实攻击场景
为了研究 I2P 的特性,我决定搭建一个小型的 I2P 网络环境来复现目标的流量场景。这是我当时的操作步骤:
环境需求:
- 操作系统:Ubuntu 22.04
- 软件工具:I2P 路由器、tcpdump、Wireshark
- 编程语言:Python 3.9
实验环境搭建步骤
1. 安装 I2P 路由器
在 Ubuntu 环境下安装 I2P 路由器非常简单:
<pre><code class="language-bash"># 添加 I2P 官方仓库 sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:i2p-maintainers/i2p
安装 I2P
sudo apt update sudo apt install i2p</code></pre>
安装完成后,启动 I2P 服务:
<pre><code class="language-bash"># 启动 I2P 服务 sudo i2prouter start
检查状态
sudo i2prouter status</code></pre>
I2P 路由器启动后,你可以通过浏览器访问它的控制台,默认地址是 http://127.0.0.1:7657。
2. 在虚拟机内部构造 I2P 应用流量
我们可以编写一个简单的 Python 脚本,模拟一个通过 I2P 网络传输数据的小型服务。以下示例展示了如何创建一个 I2P 的 HTTP 服务器。
<pre><code class="language-python">import socketserver import http.server
定义 HTTP 服务的 Handler
class I2PHandler(http.server.SimpleHTTPRequestHandler): def do_GET(self): self.send_response(200) self.end_headers() self.wfile.write(b"Hello from I2P!") return
启动本地 HTTP 服务
if __name__ == "__main__": PORT = 8080 with socketserver.TCPServer(("", PORT), I2PHandler) as httpd: print(f"Serving on port {PORT}...") httpd.serve_forever()</code></pre>
运行这个脚本后,你可以通过 I2P 转发的方式将此服务暴露为一个 I2P 隐匿站点。
3. 配置 I2P 隧道
在 I2P 控制台中,设置一个服务器隧道来将流量转发到上述 HTTP 服务:
- 打开 I2P 控制台 → 隧道管理
- 创建新的“服务器隧道”,目标是
127.0.0.1:8080 - 保存配置并启动隧道

这样,一个隐匿站点就建立好了。
---
四、流量捕获与分析:发现 I2P 的痕迹
I2P 的流量高度加密,但仍可以通过一些分析手段进行侦察。在我的渗透过程中,我使用了 Wireshark 和 tcpdump 来捕获 I2P 的通信流量。一些有趣的观察点包括:
特征流量分析
- 端口特征:I2P 默认使用以下端口:
- UDP 12345:用于路由器间的通信
- TCP 7657:用于控制台管理
- TCP 7654:用于客户端通信
在流量抓包时,注意观察这些端口的使用情况。
- 加密流量:I2P 的所有通信流量都经过 AES 和 ElGamal 加密,因此抓包后会发现大量的加密数据,几乎没有明文内容。
使用 Wireshark 捕获流量
以下是一个流量捕获的简单示例:
<pre><code class="language-bash"># 使用 tcpdump 捕获 I2P 流量 sudo tcpdump -i eth0 port 12345 -w i2p_traffic.pcap</code></pre>
用 Wireshark 打开 i2p_traffic.pcap 文件,筛选 UDP 12345 的流量,可以看到大量加密的数据包。
---
五、潜在的攻击切入点:攻破 I2P 的可能性
虽然 I2P 的匿名性非常强,但在实战中仍有一些可利用的攻击面:
1. 路由表污染
I2P 使用 DHT 存储路由信息,攻击者可以尝试通过伪造大量恶意节点,向目标路由器注入错误的路由信息,从而影响其通信。
以下是一个 Python 脚本示例,模拟一个伪造节点的行为:
<pre><code class="language-python">import socket
def fake_node():
构造伪造的 I2P 路由器节点信息
fake_data = b"Fake I2P Node Data" with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.sendto(fake_data, ("<I2P_Target_IP>", 12345))

if __name__ == "__main__": fake_node()</code></pre>
2. 端点暴露
如果目标的 I2P 隧道配置不当,例如暴露了真实 IP 或未启用防火墙规则,攻击者可以通过扫描公开的 I2P 地址来定位真实的服务器。这种场景在我的任务中倒是遇到过。
---
六、经验总结:I2P 的优劣与渗透启示
在深入研究 I2P 之后,我总结了一些关于这种匿名网络的要点:
- 优点:I2P 的双向隧道和大蒜路由设计确实让流量溯源变得异常困难,特别适合需要高隐匿性的数据传播。
- 缺点:由于架构的复杂性,I2P 流量的性能不足,且易受路由表污染和配置错误的影响。
对于红队来说,I2P 是一个重要的研究方向。它不仅是一个隐匿的通信工具,还可能成为 APT 攻击中的关键组成部分。掌握 I2P 的特性,可以帮助我们更好地理解对手的行为模式,也能在攻击中找到潜在的突破口。
警告:所有描述仅限合法授权范围内的安全研究,切勿用于非法用途!