0%

OpenWrt破解switch的wifi联网验证

  • 问题:switch有个奇葩设定,就是连接的wifi必须能访问互联网,不然不给连,自动断开。但有时候需要就是需要在局域网中使用,有没有办法可以绕过这个校验?
  • 原理:switch连接wifi时,会GET请求http://ctest.cdn.n.nintendoswitch.cn(国行),该网页很简单,当User-Agent为"NX NIFM/00"时,返回文本"ok",浏览器直接访问显示禁止访问,这是因为服务端进行了"User-Agent"验证,只有"User-Agent": "NX NIFM/00"才能得到返回结果,并且响应头中带有'X-Organization': 'Nintendo'用于switch客户端校验。因此破解switch的wifi连接验证,就可以采用dns劫持ctest.cdn.n.nintendoswitch.cn这个域名到指定的服务器,访问时该服务器直接返回伪装的页面"ok"以及'X-Organization': 'Nintendo'即可

    访问ctest.cdn.n.nintendoswitch.cn的请求信息

  • 采用dns劫持方式,需要占用服务端的80端口,但是80端口用于只返回这个简单的页面就有点浪费,因此采用nginx反向代理的方式,来实现端口复用,而且这个简单页面完全可以直接用nginx配置文件来实现。

  • 如果OpenWrt装有nginx,可以在/etc/nginx/conf.d/目录下新建一个.conf配置文件,加入一下内容,然后运行/etc/init.d/nginx restart重启即可,这里server_name有3个(ctest.cdn.nintendo.net conntest.nintendowifi.net ctest.cdn.n.nintendoswitch.cn)是因为,非国行switch的验证域名是另外两个

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    server_names_hash_bucket_size  64;
    server {
    listen 80;
    listen [::]:80;

    server_name ctest.cdn.nintendo.net conntest.nintendowifi.net ctest.cdn.n.nintendoswitch.cn;
    location / {
    more_clear_headers 'Server';
    add_header X-Organization Nintendo;
    add_header Pragma no-cache;
    expires 0s;

    default_type text/plain;
    return 200 "ok";
    }
    }
  • 如果OpenWrt上没有装nginx或者不想在OpenWrt上安装nginx,可以在vps或者局域网内其他机器上的nginx配置加入上述配置即可。

  • 配置好nginx后,需要进行dns劫持,这个可以直接修改hosts文件来实现,这里选择修改OpenWRt的dhcp配置文件来实现,ssh连接到OpenWrt,将下面配置文件中的"你的nginx服务器ip"替换为搭建了伪装页面的服务器ip即可,例如在OpenWrt上搭建的,且路由后台为192.168.2.1,则填192.168.2.1即可,在vps上搭建的则填vps的公网ip,在局域网其他机器上搭建的则填该机器的局域网ip地址即可,修改完后,复制粘贴,回车运行即可。最后运行/etc/init.d/dnsmasq reload即可生效,这里还有其他规则,作用是屏蔽了所有任天堂服务器的连接,如果不需要可以自行删除。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    uci batch <<'EOF'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.com/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.net/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.jp/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.co.jp/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.co.uk/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo-europe.com/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendowifi.net/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/conntest.nintendowifi.net/你的nginx服务器ip'
    add_list dhcp.@dnsmasq[-1].address='/ctest.cdn.n.nintendoswitch.cn/你的nginx服务器ip'
    add_list dhcp.@dnsmasq[-1].address='/ctest.cdn.nintendo.net/你的nginx服务器ip'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.es/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.co.kr/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.tw/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.com.hk/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.com.au/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.co.nz/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.at/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.be/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendods.cz/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.dk/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.de/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.fi/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.fr/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.gr/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.hu/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.it/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.nl/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.no/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.pt/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.ru/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.co.za/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.se/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.ch/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendo.pl/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendoswitch.com/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendoswitch.com.cn/0.0.0.0'
    add_list dhcp.@dnsmasq[-1].address='/.nintendoswitch.cn/0.0.0.0'
    commit dhcp
    EOF
  • 验证是否生效,可以运行ctest.cdn.n.nintendoswitch.cn,如果解析到的ip变为上面所设置的,则dns劫持成功

  • 运行curl ctest.cdn.n.nintendoswitch.cn,如果正常返回"ok",则说明dns劫持成功,并且成功从伪装的服务器请求到了页面,因为直接不指定User-Agent的情况下curl该域名是不能得到"ok"的,真实服务器有简单的"User-Agent"验证,我们伪造的没有这个验证,只要GET请求就返回"ok",下图就是正常返回了"ok"但是因为没有换行符导致跟命令合在一块了

  • 至此,switch只要wifi连接到路由器就能保持连接状态,而不需要路由器能访问互联网

  • 参考链接: 90dns