一、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&quot;Hello from I2P!&quot;) return

启动本地 HTTP 服务

if __name__ == &quot;__main__&quot;: PORT = 8080 with socketserver.TCPServer((&quot;&quot;, PORT), I2PHandler) as httpd: print(f&quot;Serving on port {PORT}...&quot;) httpd.serve_forever()</code></pre>

运行这个脚本后,你可以通过 I2P 转发的方式将此服务暴露为一个 I2P 隐匿站点。

3. 配置 I2P 隧道

在 I2P 控制台中,设置一个服务器隧道来将流量转发到上述 HTTP 服务:

  • 打开 I2P 控制台 → 隧道管理
  • 创建新的“服务器隧道”,目标是 127.0.0.1:8080
  • 保存配置并启动隧道

黑客示意图

这样,一个隐匿站点就建立好了。

---

四、流量捕获与分析:发现 I2P 的痕迹

I2P 的流量高度加密,但仍可以通过一些分析手段进行侦察。在我的渗透过程中,我使用了 Wireshark 和 tcpdump 来捕获 I2P 的通信流量。一些有趣的观察点包括:

特征流量分析

  1. 端口特征:I2P 默认使用以下端口:
  • UDP 12345:用于路由器间的通信
  • TCP 7657:用于控制台管理
  • TCP 7654:用于客户端通信

在流量抓包时,注意观察这些端口的使用情况。

  1. 加密流量: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&quot;Fake I2P Node Data&quot; with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.sendto(fake_data, (&quot;&lt;I2P_Target_IP&gt;&quot;, 12345))

黑客示意图

if __name__ == &quot;__main__&quot;: fake_node()</code></pre>

2. 端点暴露

如果目标的 I2P 隧道配置不当,例如暴露了真实 IP 或未启用防火墙规则,攻击者可以通过扫描公开的 I2P 地址来定位真实的服务器。这种场景在我的任务中倒是遇到过。

---

六、经验总结:I2P 的优劣与渗透启示

在深入研究 I2P 之后,我总结了一些关于这种匿名网络的要点:

  • 优点:I2P 的双向隧道和大蒜路由设计确实让流量溯源变得异常困难,特别适合需要高隐匿性的数据传播。
  • 缺点:由于架构的复杂性,I2P 流量的性能不足,且易受路由表污染和配置错误的影响。

对于红队来说,I2P 是一个重要的研究方向。它不仅是一个隐匿的通信工具,还可能成为 APT 攻击中的关键组成部分。掌握 I2P 的特性,可以帮助我们更好地理解对手的行为模式,也能在攻击中找到潜在的突破口。

警告:所有描述仅限合法授权范围内的安全研究,切勿用于非法用途!