有很多猜测,让我们尝试一下。
将 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 服务器来利用这一点。