大家新年好呀。
嗯…因为最近考试快考完了没什么事情干,于是我又手痒了(
想刷之前买的小米路由器BE3600 2.5G (RD15) 玩。
第一步当然是开ssh了。本质上就是用rce改命令参数
网上看到有一个start_binding的洞,之前版本都可以用,于是我也尝试了下:
不行。
进行了一系列搜索之后,我知道小米这一套系统是基于openwrt+luci,也就是lua语言为主。也就是我们需要找到一个命令注入,需要exec我们可控并且不被过滤的字符串。
尝试下了一个最新版本的包,binwalk发现是ubi镜像,于是用这个工具读取‣
接下来用binwalk直接拆开squashfs文件系统。
这里面的lua文件是加密了的,但是也有工具可以解开。‣可以去我fork的action里下载构建好的版本。
GPT写了个脚本,把所有lua改回来了:
#!/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?
不愧是恩山论坛:
但是我就不试了吧,毕竟现在这一套设备是已经能正常工作了,别添乱了(
不过感觉源代码里应该还是能有其他命令注入的
新年第一篇文章就这么愉快的水完了