ipv6攻击视角
2022-12-28 11:28:0 Author: xz.aliyun.com(查看原文) 阅读量:83 收藏

前段时间,突然对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 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地址,你会发现还是访问不了,那么该如何做呢

  1. 首先,在浏览器中访问ipv6地址,需要在前后加括号,例如 http://[2409:8c0c:310:314::100:38]/#/login
  2. 在burp中的代理配置,需要改成socks5代理,不能是upstream proxy servers

现在在浏览器中访问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 代理:
# 安装 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查询

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

ASN查找

asnmap

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

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

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慢很多,但是漏报率低,精准度高.



文章来源: https://xz.aliyun.com/t/11986
如有侵权请联系:admin#unsafe.sh