上个月极低的价格得到一台CR6606和一台CR6609, 一直没时间研究, 终于趁春节假期把这两个都刷成 OpenWRT
配置说明
- CPU: MT7621AT,双核880MHz
- 内存: NT5CC128M16JR-EKI 或 M15T2G16128A, 256MB
- 闪存: F59L1G81MB, 128MB
- 无线基带芯片(BB): T7905DAN
- 无线射频芯片(RF): MT7975DN
- 无外置FEM芯片,使用MT7975DN内置PA和LNA
配置和R3G相比是很像的, 区别就是升级了无线基带和射频芯片, 支持 WiFi6 支持 mesh. 但是去掉了USB口.
MT7905DAN + MT7975DN 组成了 MT7915D, 2.4G和5G均支持 2x2 MIMO, DBDC(双频并发), 2.4G最高速率574Mbps,5G最高速率1201Mbps. MT7975DN+MT7905DAN的发热量比 MT7603 + MT7612 要大一些, 因此功率也更大, 散热片比R3G更大.
相关连接
相关链接
- CR6609 拆机内部展示 https://www.acwifi.net/13821.html
- CR6606 拆机内部展示 https://www.acwifi.net/18380.html
- 通过OpenWRT路由器添加 lua脚本开启SSH https://www.luyouwang.com/7115.html
这种方法需要正好是兼容这种lua脚把的 OpenWRT 才行, 在OpenWRT 23.05.5 上无法使用 - 通过电脑运行python脚本启动http服务开启SSH, 相对简单 https://haoyu.love/blog1389.html
这种方法比前一种好, 因为对无线路由器没要求, 而且从电脑启动一个http服务很简单 - 通过TTL开启SSH https://www.bilibili.com/opus/870238271997739025
- SSH密码计算工具 https://blog.csdn.net/zhoujiazhao/article/details/102578244
- SSH密码计算工具 http://mi.avue.cn/
OpenWRT 下载
https://firmware-selector.openwrt.org/
在上面搜对应的型号, 例如 Xiaomi Mi Router CR6609
Breed下载
拉到底下, 在 r1338 [2021-12-16]/ 目录下, 搜 r3g.
CR6606 CR6608 CR6609 用的都是和小米 R3G 一样的 breed, 这个版本可以用于刷入 OpenWRT 上下载的固件
最新的版本是 r1416 [2022-07-24] (git-46ae2a1), 但是这个版本不能直接支持从 OpenWRT 下载的固件, 原因可以看 这里, 所以只能用旧一点的 r1338 版本
带SSH的降级固件
6606 1.0.103 链接: https://pan.baidu.com/s/1kn68F2M019rHB7PWqRYnCA 提取码: 9c92
刷机过程
CR660x 这一系列的型号属于小米给运营商的定制版, 在小米路由的官网上是不存在的, 所以也就不可能通过官方下载"开发版ROM"开启SSH烧录第三方系统. 开启SSH的方式主要有 TTL 和 getToken 漏洞两种方式
通过TTL获取SSH权限
通过TTL开启SSH相对简单, 不需要复杂设置, 如果有TTL2USB模块优先用这种方法, 但是不是所有设备都能用
有一台CR6609 电信版的版本是"系统版本: 1.0.41 稳定版", 不需要降级直接用TTL方法就可以进SSH, root口令和admin密码一样, 在背面的标签上. 而另一台 CR6606, 版本是"系统版本: 1.0.134 稳定版", 这个版本在TTL下没有命令行输入功能, 需要降级到 1.0.103 通过辅助路由器的方式获取SSH权限.
如果不想拆机的话, 背面把靠近wan口天线位置, 用水口钳剪掉一两根塑料打开一个口子, 方便刷机探针伸进去连里面的TTL口. 探针要用2mm间距的. 从网口那一侧往外4个焊盘分别是 VCC, RX, GND, TX, 如果不确定可以用万用表测一下, VCC的电压是3.3, GND是0, 其它两个都是3.2左右.
用探针接到TTL上, 只需要接RX, GND, TX三根线, 分别对应TTL的 TX, GND, RX, 码率 115200, 要在上电之后再连, 否则路由器不启动. 在日志输出结束后, 回车可以看到命令行提示符.
在电脑的串口终端上顺序执行这4个命令
bash
nvram set ssh_en=1
nvram commit
sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear
/etc/init.d/dropbear start
之后电脑和路由器之间连上网线, 就可以用ssh访问了.
通过小米路由的getToken漏洞开启SSH
这种方式相对复杂, 有一台 CR6606 通过 TTL 访问只有日志输入没法输入, 所以不得不用这种方式. 这种方式需要有电脑和另一台路由器配合
- 辅助路由器的LAN IP设置为 169.254.31.x 网段, 除了 169.254.31.1, 169.254.31.2 以外的任意一个IP, 因为31.1是电脑用的要提供链接地址, 31.2是待破解的CR660x用的默认地址
- 电脑的LAN IP设置为固定IP 169.254.31.1 用于启动http服务为目标CR660x路由器提供破解命令, 运行python脚本(内容附后), 命令
sudo python server.py
- 如果电脑是Ubuntu 记得把80端口防火墙打开, 命令是
udo ufw allow 80/tcp
, 查看实际的设置sudo ufw status
, - 电脑用网线连上辅助路由器的LAN口, 这时候从辅助路由器应该要能访问到 http://169.254.31.1 看到正确的输出, 如果没有输出则需要检查python服务是否启动, 端口是否生效, 防火墙是否打开
- 辅助路由器的2.4G WIFI 设置一个简单点的名称和密码, 方便下面输入
注意此时的连接状态是, 辅助路由器的LAN口连着电脑的LAN口, 其它没有任何连接, 后面也不需要动
下面是CR660x上的操作
- 首先要降级到一个可以开启SSH的版本, CR6606降级到 1.0.103
- 启动后, 从电脑用WIFI连接, 连接上进入管理后台后, 从链接地址中拿到 stok 字符串值
- 使用链接让CR660x连上辅助路由器的WIFI, 链接: http://[CR660x地址]/cgi-bin/luci/;stok=[刚才拿到的stok]/api/misystem/extendwifi_connect?ssid=[辅助路由器WIFI的SSID]&password=[辅助路由器的WIFI口令]
如果操作正确, 这里会响应{"msg":"connect succces!","code":0}
, 同时从电脑可以ping通 169.254.31.2 这时候说明可以从CR660x访问到你的电脑了, 如果ping不通说明前面操作有问题, 需要检查 - 使用链接让CR660x执行伪造的getToken指令打开, 链接: http://[CR660x地址]/cgi-bin/luci/;stok=[刚才拿到的stok]/api/xqsystem/oneclick_get_remote_token?username=xxx&password=xxx&nonce=xxx 后面的三个xxx不需要动
如果操作正确, 这里会响应{"token":"; nvram set ssh_en=1; nvram commit; sed -i 's/channel=.*/channel=\u0022debug\u0022/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;","code":0}
, 此时CR660X上的ssh就已经打开了
从电脑可以ssh连接CR660X, 口令在 http://mi.avue.cn/ 上通过序列号计算可以得到. 后续步骤跳到"写入breed"
附: python脚本, 因为请求可能是 GET 也可能是 POST, 所以两种method都要
python
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
class SimpleServer(BaseHTTPRequestHandler):
def do_GET(self):
print("It comes!")
data = {
"code": 0,
"token": "; nvram set ssh_en=1; nvram commit; sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;"
}
self.send_response(200)
self.end_headers()
self.wfile.write(json.dumps(data).encode())
def do_POST(self):
print("It comes!")
data = {
"code": 0,
"token": "; nvram set ssh_en=1; nvram commit; sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;"
}
self.send_response(200)
self.end_headers()
self.wfile.write(json.dumps(data).encode())
server_address = ('0.0.0.0', 80)
httpd = HTTPServer(server_address, SimpleServer)
httpd.serve_forever()
写入 breed
能ssh访问后, 从电脑上通过scp将 breed 上传到路由器
bash
scp breed-mt7621-xiaomi-r3g.bin root@192.168.2.1:/tmp/
然后在路由器的ssh里面, 使用mtd命令写入
bash
mtd write breed-mt7621-xiaomi-r3g.bin Bootloader
写入成功后, 关闭电源, 用针顶住reset孔, 然后上电, 待两个灯快速闪烁时就可以松开顶针, 此时就会启动进入Breed系统.
连接任意LAN口到电脑, 电脑会获取到 192.168.1.x 网段的地址, 此时访问 http://192.168.1.1 就能访问 breed 界面
在"小米 R3G Bdata" 界面可以看到当前路由器的型号和配置信息.
之后如果已经刷入了 Breed, 可以在 Breed 界面上用写入 Bootloader 的方式升级或降级成其它版本的 Breed.
写入 OpenWRT
- 在 Breed "固件更新"界面上, 选择闪存布局为"小米路由器 3G 固件 1", 在固件栏, 选择从 OpenWRT 下载的 kernel.bin 包写入. 待其重启, 这一步写入后, 路由器上就有基础的OpenWRT系统, 但是文件系统还没初始化, 做任何设置都不会保存.
- 重启后在电脑获得IP后(默认是192.168.1.1), 访问 http://192.168.1.1 可以进入 OpenWRT 界面(口令为空), 在 OpenWRT 界面上会提示仅有基本文件系统需要升级
System running in recovery (initramfs) mode.
, 到升级界面, 选择结尾为 sysupgrade.bin 的固件升级, 重启后就升级完成了.