前段时间,突然对ipv6这块的资产收集感兴趣,分享下实践出的技巧和方案。
最简单的方法购买提供ipv6地址的vps
比如vultr,购买时选择启用ipv6地址即可
aws的机器默认没有ipv6地址分配,要按如下步骤来开启
这个时候ip a就可以看到ipv6地址了
但是到这一步你会发现获取到了ipv6地址,但无法访问任何ipv6站点,这是因为这个vpc的路由表默认没有ipv6出口路由,手动配置如下
华为云和aws的步骤类似,现在vpc的subnet中开启ipv6功能,然后在创建ecs时选择分配ipv6地址
类似,vpc配置开启ipv6,创建ecs时选择ipv6的子网,创建完毕需要开通ipv6公网带宽
然后在开启的机器上运行以下命令,获取ipv6地址
wget https://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/ipv6/rhel/ecs-utils-ipv6 chmod +x ./ecs-utils-ipv6 ./ecs-utils-ipv6
开启ipv6公网带宽
临近饭点,老吴问我如何让自己机器访问ipv6地址,因为如果只能通过vps进行访问,那一些图形化操作无法实现。
想了想,确实有道理,简单分析下,如果要让客户端访问到ipv6机器,那么要么客户端获取公网ipv6地址,要么走一些ipv6代理服务,比如https://proxyline.net/zh-hant/ipv6/。
获取公网ipv6地址不太可行,ipv6代理服务没必要,能自建干嘛要买。看网上文章里讲socks5,不用管客户端是ipv4还是ipv6协议,只要服务端是ipv6协议就可以让客户端畅通无阻的在ipv6环境下进行通讯。
那么我可以复用之前的clash代理池设计,只要节点端可以通ipv6,应该就可以了。
先看能不能访问
正常来讲,无法访问。
下面配置一个aws服务器起ssr
先按照开始的教程为aws配置ipv6子网,确保机器可以通ipv6
curl ipv6.ip.sb
# 能够正确获取到ipv6地址,这个机子就可以用
起ssr服务
apt-get update apt-get install -y shadowsocks-libev systemctl status shadowsocks-libev vim /etc/shadowsocks-libev/config.json { "server":["::0","0.0.0.0"], "server_port":60001, "method":"chacha20-ietf-poly1305", "password":"1234567890", "mode":"tcp_and_udp", "fast_open":false } service shadowsocks-libev restart # service shadowsocks-libev start service shadowsocks-libev status ps ax | grep ss-server ss -tnlp
这里密码我随便设置了,如果生产环境不要用弱口令
启动ssr后,写一下clash配置
mixed-port: 64277 allow-lan: true bind-address: '*' mode: rule log-level: info ipv6: true external-controller: 127.0.0.1:9090 routing-mark: 6666 hosts: profile: store-selected: false store-fake-ip: true dns: enable: false listen: 0.0.0.0:53 ipv6: true default-nameserver: - 114.114.114.114 - 8.8.8.8 enhanced-mode: fake-ip # or redir-host (not recommended) fake-ip-range: 198.18.0.1/16 # Fake IP addresses pool CIDR nameserver: - 114.114.114.114 # default value - 8.8.8.8 # default value - tls://dns.rubyfish.cn:853 # DNS over TLS - https://1.1.1.1/dns-query # DNS over HTTPS - dhcp://en0 # dns from dhcp # - '8.8.8.8#en0' proxies: - name: "1.14.5.14" type: ss server: 1.14.5.14 port: 60001 cipher: chacha20-ietf-poly1305 password: "1234567890" proxy-groups: - name: "test" type: load-balance proxies: - 1.14.5.14 url: 'http://www.gstatic.com/generate_204' interval: 2400 strategy: round-robin rules: - DOMAIN-SUFFIX,google.com,test - DOMAIN-KEYWORD,google,test - DOMAIN,google.com,test - GEOIP,CN,test - MATCH,test - SRC-IP-CIDR,192.168.1.201/32,DIRECT - IP-CIDR,127.0.0.0/8,DIRECT - DOMAIN-SUFFIX,ad.com,REJECT
1.14.5.14是我这台aws的地址,60001是监听端口。这不是重点,重点在于2行ipv6: true
ipv6: true dns: enable: false listen: 0.0.0.0:53 ipv6: true
必须要配置为true
导入clash配置,再次测试访问
到了这一步,还是不够,因为目前是基于域名的ipv6访问,如果要直接访问ipv6地址,你会发现还是访问不了,那么该如何做呢
http://[2409:8c0c:310:314::100:38]/#/login
现在在浏览器中访问ipv6地址,就可以了
运营商一般会分配 /64 甚至 /60 的地址,有相当多的 ipv6 可以用
我们可以访问完一次,用命令直接改一下本机对应的 ipv6 地址就好了,譬如只改地址后 64 bits
ip a 查看,vultr给了如下的ipv6地址
2401:c080:1400:6787:5400:4ff:fe3b:622b/64 2401:c080:1400:6787::/64
# 添加路由 ip route add local 2401:c080:1400:6787::/64 dev enp1s0 # 为了能够绑定任意 IP,我们需要开启内核的 ip_nonlocal_bind 特性: sysctl net.ipv6.ip_nonlocal_bind=1 # NDP # 类似于 IPv4 中 ARP 协议的作用,IPv6 中需要使用 ND 协议来发现邻居并确定可用路径。我们需要开启一个 ND 代理: # 安装 ndppd apt install ndppd # 编辑 /etc/ndppd.conf 文件: vim /etc/ndppd.conf route-ttl 30000 proxy enp1s0 { router no timeout 500 ttl 30000 rule 2401:c080:1400:6787::/64 { static } } # 启动 ndppd systemctl start ndppd # 接下来你可以验证一下了,用 curl --interface 指定出口 IP: curl --interface 2401:c080:1400:6787::1 ipv6.ip.sb curl --interface 2401:c080:1400:6787::2 ipv6.ip.sb curl --interface 2401:c080:1400:6787::3 http://icanhazip.com/
后来在看massdns项目的时候发现作者在freebind项目里实现了类似的需求
测试下,先在机器上安装
git clone https://github.com/blechschmidt/freebind.git
cd freebind
apt install libnetfilter-queue-dev
make install
# 添加路由 ip -6 route add local 2a00:1450:4001:81b::/64 dev enp1s0 # 访问测试 freebind -r 2a00:1450:4001:81b::/64 wget -qO- ipv6.wtfismyip.com/text
那么网站方如何防御呢?
一种应对方式是直接 ban /64,/56乃至 /48
现在我们有了ipv6条件,那么接下来要找目标
如何获得目标的ipv6地址呢
经过进一步查询,得知AAAA类型的解析记录,可以实现IPv6的解析
使用dig进行查询
dig -t AAAA [域名] dig -t AAAA +short [域名]
使用 dnsx 进行查询
echo ip.sb | dnsx -silent -aaaa echo ip.sb | dnsx -silent -aaaa -resp-only dnsx -aaaa -o output.txt -l input.txt
目前各大搜索引擎基本都是支持ipv6的语法的,hunter好像不支持,可惜
fofa
is_ipv6=true && country="CN" && port="80" && protocol="http"
quake
is_ipv6:"true" && body:"登录"
zoomeye
ip:"2600:3c00::f03c:91ff:fefc:574a"
asnmap
echo hackerone.com | ./asnmap -json -silent | jq
有些asn信息会有ipv6地址范围
ipv6掩码计算器
fi6s
apt install gcc make git libpcap-dev git clone https://github.com/sfan5/fi6s.git cd fi6s make BUILD_TYPE=release
./fi6s -p 80 2001:da8:9000:e013::199:4/115 --randomize-hosts 0 /fi6s -p 80,8000-8100 2001:db8::/120
实际测试速度很快,但是掩码小于/112的情况下,扫描结果数会直线下降,就很难扫出结果
naabu
echo "2001:da8:9000:e013::199:4/118" | naabu -iv 6 -p 80 -rate 4000 -retries 3 -c 30 -silent -si 60
扫描速度比fi6s慢很多,但是漏报率低,精准度高.