loopback接口能被劫持吗?

信息安全 网络 路由
2021-08-19 17:58:09

这个问题的启发,我想出了一个奇怪的想法,即制作用户真正想要阻止的东西。所以,请容忍我一点:

假设由于某种原因,我们可以使从特定应用程序发送到另一个应用程序的流量传输到路由器/路由设备,因为源设备无法自行确定它必须将数据包发送到哪里。这意味着,即使是“localhost”之类的名称或 127.0.0.1 之类的 IP 也不适用于此源设备,而是必须将所有内容发送到另一个设备以将信息发送到其“目标”设备(我们知道,它就是同一台服务器)。

因此,简化并使其成为一个实际问题:有什么方法可以远程劫持路由表/环回接口/当这些通信应该是内部通信时,让机器发送它的流量所需的一切?

想想有多少网络服务器确实有他们的数据库并发送“内部”请求以连接数据...... TCP 服务......以及如何配置防火墙来阻止奇怪的流量,但对于流量的输出却没有那么多。这让我打勾,过来问这个奇怪的问题。

4个回答

有很多猜测,让我们尝试一下。

将 127.0.0.1/8 分配给网络接口

在 Debian 上,它以 root 身份将 127.0.0.1/8 分配给网络接口:

# ifconfig lo 10.0.0.1 netmask 255.0.0.0
# ifconfig eth0 127.0.0.2 netmask 255.0.0.0

并导致:

lo        Link encap:Lokale Schleife  
          inet Adresse:10.0.0.1  Maske:255.0.0.0
...
eth0      Link encap:Ethernet  Hardware Adresse 
          inet Adresse:127.0.0.2  Bcast:127.255.255.255  Maske:255.0.0.0
...

但是,ping 127.0.0.1 失败并出现非法参数错误:

 $ ping 127.0.0.2
 PING 127.0.0.2 (127.0.0.2) 56(84) bytes of data.
 64 bytes from 127.0.0.2: icmp_seq=1 ttl=64 time=0.030 ms

 $ ping 127.0.0.1
 connect: Invalid argument

所以这是需要通过分析源代码来更详细地研究的东西。

将“localhost”指向另一个 IP 地址

以 root 身份编辑 /etc/hosts 以便将 localhost 指向另一个 IP 地址可以工作:

ping localhost
PING localhost (209.85.149.147) 56(84) bytes of data.
64 bytes from localhost (209.85.149.147): icmp_seq=2 ttl=57 time=165 ms

这是否是一个问题取决于具体情况:客户端可以通过不使用 ssl 或不信任任何证书来发送密码而不验证服务器(那里有 localhost 的测试证书,由受信任的 CA 签名)。此密码可能会在其他地方重复使用,或者服务器可能会接受来自其他接口的连接,因为它无论如何都受密码保护。

在标准配置中,主机文件优先于 NIS 和 DNS,这需要本地 root 访问权限,这使得这种攻击毫无意义。但是,如果优先级发生了变化,则可以使用 DNS 或 NIS 服务器来利用这一点。

我相信你需要妥协内核才能做到这一点(当然,如果你能妥协内核,你可以做任何事情)。我刚刚对 IPTables 进行了一些测试,似乎环回流量绕过了 NAT / PREROUTING 功能,所以我认为它超出了用户空间的控制(在 Linux 中)。当然,操作系统会有所不同,但我认为通常你确实需要妥协内核来做你想做的事情。

这是一个假设,但我认为操作系统中的大多数网络堆栈都会绕过本地主机请求中的外部接口。当然是出于安全原因,但更出于性能原因。

除非网络代码有严重错误,可以远程触发,但这个错误也可能导致主机根本无法互通→成功概率低。此外,与其他类型的攻击相比,它过于复杂,因此几乎不现实。