大家新年好呀。

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

想刷之前买的小米路由器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 1fi# 统计变量total=0success=0failed=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++))    fidone < <(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?

不愧是恩山论坛:

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

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

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