Logo
失败的小米路由器ssh开启尝试

失败的小米路由器ssh开启尝试

January 4, 2026

大家新年好呀。

嗯…因为最近考试快考完了没什么事情干,于是我又手痒了(

想刷之前买的小米路由器BE3600 2.5G (RD15) 玩。

第一步当然是开ssh了。本质上就是用rce改命令参数

网上看到有一个start_binding的洞,之前版本都可以用,于是我也尝试了下:

不行。

进行了一系列搜索之后,我知道小米这一套系统是基于openwrt+luci,也就是lua语言为主。也就是我们需要找到一个命令注入,需要exec我们可控并且不被过滤的字符串。

尝试下了一个最新版本的包,binwalk发现是ubi镜像,于是用这个工具读取‣

接下来用binwalk直接拆开squashfs文件系统。

这里面的lua文件是加密了的,但是也有工具可以解开。‣可以去我fork的action里下载构建好的版本。

GPT写了个脚本,把所有lua改回来了:

BASH
#!/bin/bash

# 设置颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 输出目录
OUTPUT_DIR="../decompiled"

# 创建输出目录
mkdir -p "$OUTPUT_DIR"

# 检查unluac.jar是否存在
if [ ! -f "./unluac.jar" ]; then
    echo -e "${RED}错误: unluac.jar 未找到${NC}"
    exit 1
fi

# 统计变量
total=0
success=0
failed=0

# 查找并处理所有.lua文件
while IFS= read -r -d '' file; do
    ((total++))
    
    # 生成输出文件路径
    output_file="$OUTPUT_DIR/$file"
    
    # 创建输出目录
    mkdir -p "$(dirname "$output_file")"
    
    # 添加注释并反编译
    if echo "-- Decompiled from: $file" > "$output_file" && \
       java -jar ./unluac.jar "$file" >> "$output_file" 2>/dev/null; then
        echo -e "${GREEN}✓${NC} $file -> $output_file"
        ((success++))
    else
        echo -e "${RED}✗${NC} 失败: $file"
        rm -f "$output_file"
        ((failed++))
    fi
done < <(find . -type f -name "*.lua" -print0)

# 输出统计信息
echo ""
echo "====== 反编译完成 ======"
echo "总计: $total"
echo -e "${GREEN}成功: $success${NC}"
echo -e "${RED}失败: $failed${NC}"
echo "输出目录: $OUTPUT_DIR"

定位到了这个函数,重写了下:

可以看到上面有过滤,1523是因为被filter了,但是网上相关的内容就是这么做的,历史版本代码也一样,不应该有问题呀?搜了下commonstr,找到了过滤字符串

看上去过滤挺全的。不应该会有漏洞?

于是找了老版本拆包看看:

恍然大悟:老版本没有过滤掉换行拼接,这导致了绕过成功。

看起来小米工程师估计是潜伏在恩山内部的,一看到最新漏洞立马就修了!

还有没有其他solution?

不愧是恩山论坛:

但是我就不试了吧,毕竟现在这一套设备是已经能正常工作了,别添乱了(

不过感觉源代码里应该还是能有其他命令注入的

新年第一篇文章就这么愉快的水完了

comment

留言 / 评论

如果暂时没有看到评论,请点击下方按钮重新加载。