ipv6攻击视角


本文转自先知社区: 
作者:r0fus0d

前言

前段时间,突然对ipv6这块的资产收集感兴趣,分享下实践出的技巧和方案。

1. 如果目标有 ipv6 资产,你如何访问

获得ipv6地址

最简单的方法购买提供ipv6地址的vps

vultr

比如vultr,购买时选择启用ipv6地址即可

aws

aws的机器默认没有ipv6地址分配,要按如下步骤来开启

  1. vpc添加ipv6 CIDR

  1. vpc子网分配ipv6 CIDR块

  1. 创建ec2机器时选择自动分配ipv6 ip

这个时候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站点

临近饭点,老吴问我如何让自己机器访问ipv6地址,因为如果只能通过vps进行访问,那一些图形化操作无法实现。

想了想,确实有道理,简单分析下,如果要让客户端访问到ipv6机器,那么要么客户端获取公网ipv6地址,要么走一些ipv6代理服务,比如https://proxyline.net/zh-hant/ipv6/

获取公网ipv6地址不太可行,ipv6代理服务没必要,能自建干嘛要买。看网上文章里讲socks5,不用管客户端是ipv4还是ipv6协议,只要服务端是ipv6协议就可以让客户端畅通无阻的在ipv6环境下进行通讯。

那么我可以复用之前的clash代理池设计,只要节点端可以通ipv6,应该就可以了。

先看能不能访问

  • ipv6.ip.sb

  • ip.sb

正常来讲,无法访问。

下面配置一个aws服务器起ssr

先按照开始的教程为aws配置ipv6子网,确保机器可以通ipv6

curl ipv6.ip.sb
# 能够正确获取到ipv6地址,这个机子就可以用

起ssr服务

apt-get updateapt-get install -y shadowsocks-libevsystemctl 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 startservice shadowsocks-libev status
ps ax | grep ss-server
ss -tnlp

这里密码我随便设置了,如果生产环境不要用弱口令

启动ssr后,写一下clash配置

mixed-port: 64277allow-lan: truebind-address: '*'mode: rulelog-level: infoipv6: trueexternal-controller: 127.0.0.1:9090routing-mark: 6666hosts:
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

image.png

必须要配置为true

导入clash配置,再次测试访问

到了这一步,还是不够,因为目前是基于域名的ipv6访问,如果要直接访问ipv6地址,你会发现还是访问不了,那么该如何做呢

  1. 首先,在浏览器中访问ipv6地址,需要在前后加括号,例如 http://[2409:8c0c:310:314::100:38]/#/login

  2. 在burp中的代理配置,需要改成socks5代理,不能是upstream proxy servers


现在在浏览器中访问ipv6地址,就可以了

2. 如果你ipv6地址被封了,如何更改

云服务器ipv6地址绑定(vultr可行,aws不可行)

运营商一般会分配 /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 代理:# 安装 ndppdapt install ndppd
# 编辑 /etc/ndppd.conf 文件:vim /etc/ndppd.conf
route-ttl 30000proxy enp1s0 {router notimeout 500ttl 30000rule 2401:c080:1400:6787::/64 {static}}
# 启动 ndppdsystemctl start ndppd
# 接下来你可以验证一下了,用 curl --interface 指定出口 IP:curl --interface 2401:c080:1400:6787::1 ipv6.ip.sbcurl --interface 2401:c080:1400:6787::2 ipv6.ip.sbcurl --interface 2401:c080:1400:6787::3 http://icanhazip.com/

后来在看massdns项目的时候发现作者在freebind项目里实现了类似的需求

  • https://github.com/blechschmidt/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地址呢


3. 如何收集目标ipv6资产

域名AAAA查询

经过进一步查询,得知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

  • https://fofa.info/

is_ipv6=true && country="CN" && port="80" && protocol="http"

quake

  • https://quake.360.net/

is_ipv6:"true" && body:"登录"

zoomeye

  • https://www.zoomeye.org/

ip:"2600:3c00::f03c:91ff:fefc:574a"

ASN查找

asnmap

  • https://github.com/projectdiscovery/asnmap

echo hackerone.com | ./asnmap -json -silent | jq

有些asn信息会有ipv6地址范围

ipv6地址扫描

ipv6掩码计算器

  • https://jennieji.github.io/subipv6/

fi6s

  • https://github.com/sfan5/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

  • https://github.com/projectdiscovery/naabu

echo "2001:da8:9000:e013::199:4/118" | naabu -iv 6 -p 80 -rate 4000 -retries 3 -c 30 -silent -si 60


扫描速度比fi6s慢很多,但是漏报率低,精准度高.


Source & Reference

  • https://zu1k.com/posts/tutorials/http-proxy-ipv6-pool/

  • https://v2ex.com/t/833075

  • https://blog.yllhwa.com/2022/09/05/利用IPV6绕过B站的反爬/

本文作者:合天网安实验室

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/194570.html

Tags:
评论  (0)
快来写下你的想法吧!

合天网安实验室

文章数:342 积分: 877

www.hetianlab.com,网络安全靶场练习平台,涉及CTF赛前指导、职业技能训练、网安专项技能提升等。

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号