以下文章转载自 phith0n《IPv6 三个访问本地地址的小Tips》

最近发现家里宽带支持 IPv6 了,这里分享三个利用 IPv6 访问本地地址(内网地址)的方法。

通常来说,我们用 localhost 来代表本地地址 127.0.0.1。其实在IPv6中有他自己的表示方法 ip6-localhost

ping ip6-localhost

笔者注:并不是所有的的系统都支持 ip6-localhost 这种访问方式。

在 OSX 上:

1
2
3
4
127.0.0.1          localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost

在 REHL 上:

1
2
127.0.0.1          localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

在 Debian 上

1
2
127.0.0.1          localhost
::1 localhost ip6-localhost ip6-loopback

而在 Windows 上,当有 IPv6 地址时,localhost 会解析到 ::1

另外,大家应该都知道 xip.io 这个服务,可以将任何IP地址用域名的形式表示,用来测试 SSRF 漏洞比较方便。但 xip.io 只支持 IPv4,IPv6 下也有个类似的服务,ip6.name

比如,我们可以通过 x.1.ip6.name 访问 ::1,也就是本地:

ping x.1.ip6.name

笔者注:在 Windows 下无法复现,似乎该网站已经修补了该漏洞

再分享一个Windows下有趣的冷知识吧。

UNC Path 是 Windows 中访问共享资源的方法,前段时间代码审计圈子里还分享过 PHP 利用 UNC、WebDAV 来包含远程文件的方法:https://t.zsxq.com/fUjiMfY

而 UNC Path 是不支持冒号的,所以我们没法在 UNC Path 中使用IPv6地址:\\[fe80::2]\share。所以微软官方想了一个歪招,他们注册了一个域名 ipv6-literal.net,然后在 Windows 系统中,将 IPv6 地址中的冒号换成横线作为 ipv6-literal.net 子域名,如 2408-8207-1850-2a60--4c8.ipv6-literal.net

通过这个域名即可访问到对应的IPv6目标:

ping 2408-8207-1850-2a60--4c8.ipv6-literal.net

这就类似于微软官方推出的一个 ip6.name 服务。

但是,有趣的是,这里和 ip6.namexip.io 有一个很大的区别,我们访问 2408-8207-1850-2a60--4c8.ipv6-literal.net 的时候,系统是不会真正发送DNS请求的,这个域名仿佛内置在 Windows 操作系统中,与生俱来就存在。

所以,你会发现,其实 ipv6-literal.net 这个域名微软早就已经不续费了(现在的所有者是 Godaddy),但我们仍然可以直接在浏览器里通过 0--1.ipv6-literal.net 来访问到 ::1,也就是我本地:

Browser access 0--1.ipv6-literal.net

所以在 SSRF 等漏洞的测试中,我们不妨利用一下上述三个 URL 技巧,尝试绕过一些限制。

另外,SSRF 测试中,即使目标没有连入 IPv6 网络,但本地系统、内网通常是支持 IPv6 的,所以不是说没有 IPv6外网 IP 的目标就不能用 IPv6 的技巧进行测试。