文章总结: 文档详述MB5E固件逆向流程,演示了内核解密、QEMU模拟环境搭建及thttpd服务调试。作者通过chroot运行MIPS架构程序,修复挂载问题,并分析环境变量配置,最终通过构建htpasswd文件成功模拟登录,为IoT设备漏洞分析与固件调试提供了具体可操作的实战参考。 综合评分: 88 文章分类: IoT安全,逆向分析,二进制安全
干货|MB5E 固件逆向全流程:内核解密→QEMU 模拟→thttpd 服务器登录调试实战
原创
小木说安全 小木说安全
小木说安全
2026年1月29日 11:18 陕西
binwalk -e MB5E.bin
出来E4发现在该文件里面是内核加密截取用
https://github.com/marin-m/vmlinux-to-elf
vmlinux-to-elf工具进行解密加载
将上面5b58a0以上全部删除留下下面部分的进行vmlinux-to-elf 运行
binwalk E4 (先查看)vmlinux-to-elf E4 kernel.binIda分析kernel.bin文件搜索 populate_rootfs
作用: Linux 内核启动过程中一个非常关键的函数。它的主要职责是在内核启动的早期阶段,为系统准备并加载初始的根文件系统,如果有加解密会在这个里面体现
跟进发现是压缩无解密
用binwalk -eM 解压E4
按照qemu模拟用户态
sudo apt install qemusudo apt install qemu-userqemu-mipselwhich qemu-mipsel
拷贝到当前路径(cpio-root)
cp /usr/bin/qemu-mipsel ./sudo chroot . ./qemu-mipsel ./bin/busybox (测试busybox)sudo chroot . ./qemu-mipsel --strace ./var/html/webserver(之前测试崩)/etc/mini_httpd/mini_httpd.conf(测试)
sudo chroot . ./qemu-mipsel ./usr/bin/thttpd -D -u root -d /var/html/ -c "*"(起来)sudo chroot . ./qemu-mipsel -g 12345 ./usr/bin/thttpd -D -u root -d /var/html/(调试)sudo chroot . ./qemu-mipsel --strace ./usr/bin/thttpd -D -u root -d /var/html/ -C sudo chroot . ./qemu-mipsel ./bin/sh 或者软连接到/bin/sh里面
需要挂载/proc与/dev到现在
启用脚本
Mount.sh
| | | — | | #!/bin/bash # run_thttpd.sh # 设置 chroot 目录 CHROOT_DIR=”.” # 创建目录 sudo mkdir -p $CHROOT_DIR/proc sudo mkdir -p $CHROOT_DIR/dev # 挂载文件系统 sudo mount -t proc proc $CHROOT_DIR/proc sudo mount -o bind /dev $CHROOT_DIR/dev # 清理函数 cleanup() { echo “Cleaning up…” sudo umount $CHROOT_DIR/proc sudo umount $CHROOT_DIR/dev sudo rmdir $CHROOT_DIR/proc sudo rmdir $CHROOT_DIR/dev exit 0 } # 捕获退出信号 trap cleanup EXIT SIGINT SIGTERM # 运行 chroot 命令并保持运行 echo “Starting thttpd server…” sudo chroot $CHROOT_DIR ./qemu-mipsel ./usr/bin/thttpd -D -u root -d /var/html/ -c “*” # 等待服务运行 echo “thttpd server is running. Press Ctrl+C to stop…” while true; do sleep 3600 # 每1小时检查一次,保持脚本运行 done |
Webserver
| | | — | | !/bin/sh env # Print all command-line arguments passed to this script echo “Total arguments: $#” echo “All arguments: $@” echo “Script name: $0” echo “” # Print each argument with its position echo “Arguments list:” count=1 for arg in “$@”; do echo “Argument $count: $arg” count=$((count + 1)) done # Print arguments as an array echo “” echo “Arguments array:” for arg in “$@”; do echo “$arg” done # Print arguments separated by newlines echo “” echo “Arguments separated:” echo “$@” | tr ‘ ‘ ‘\n’ |
现在网站界面以及出来,但是发送请求是不太正常的通过设置环境变量可以成功的进去,分析如下:(其中-E参数使用时用,会保存尽量避免)
结构分析 thttpd调用webserver初级调试于webserver
结构来源如上其中命令如下
sudo chroot . ./qemu-mipsel \ -E CONTENT_TYPE="application/x-www-form-urlencoded; charset=UTF-8" \-E GATEWAY_INTERFACE="CGI/1.1" \-E REMOTE_ADDR="192.168.238.1" \-E QUERY_STRING="parameter=login" \-E HTTP_USER_AGENT="Mozilla/5.0" \-E CGI_PATTERN="*" \-E CONTENT_LENGTH="37" \-E HTTP_HOST="192.168.238.129" \-E SERVER_SOFTWARE="Router Web Config System" \-E PATH="/usr/local/bin:/usr/ucb:/bin:/usr/bin" \-E HTTP_ACCEPT_LANGUAGE="zh-CN;q=0.9" \-E HTTP_REFERER="http://192.168.238.129/home/login.html" \-E SERVER_PROTOCOL="HTTP/1.1" \-E HTTP_ACCEPT_ENCODING="gzip" \-E REQUEST_METHOD="POST" \-E PWD="/var/html" \-E SERVER_PORT="80" \-E INIT_DONE="NO" \-E INIT_DONE_WISP="NO" \-E INIT_DONE_JUMP="NO" \-E SCRIPT_NAME="/send_order.cgi" \-E SERVER_NAME="lab" \ -g 12345 ./var/html/webserver -D -u root -d /var/html/ -c "*"
从这里进行调试发现比较参数
比较调试发现更-d比较
故在后面加上参数变为
sudo chroot . ./qemu-mipsel \ -E CONTENT_TYPE="application/x-www-form-urlencoded; charset=UTF-8" \-E GATEWAY_INTERFACE="CGI/1.1" \-E REMOTE_ADDR="192.168.238.1" \-E QUERY_STRING="parameter=login" \-E HTTP_USER_AGENT="Mozilla/5.0" \-E CGI_PATTERN="*" \-E CONTENT_LENGTH="37" \-E HTTP_HOST="192.168.238.129" \-E SERVER_SOFTWARE="Router Web Config System" \-E PATH="/usr/local/bin:/usr/ucb:/bin:/usr/bin" \-E HTTP_ACCEPT_LANGUAGE="zh-CN;q=0.9" \-E HTTP_REFERER="http://192.168.238.129/home/login.html" \-E SERVER_PROTOCOL="HTTP/1.1" \-E HTTP_ACCEPT_ENCODING="gzip" \-E REQUEST_METHOD="POST" \-E PWD="/var/html" \-E SERVER_PORT="80" \-E INIT_DONE="NO" \-E INIT_DONE_WISP="NO" \-E INIT_DONE_JUMP="NO" \-E SCRIPT_NAME="/send_order.cgi" \
-E SERVER_NAME="lab" \ ./var/html/webserver send_order -D -u root -d /var/html/ -c "*"
等待输入,其中因为没有”/var/html/.htpasswd”这个文件所以字节创建且填写密码,用ai生成的
perl -e 'print crypt("123", "\$1\$")."\n"'
此处匹配经文件发现不匹配,通过调试将正确的值放入
admin:$1$$GmbL3iXOMZR57QuGDLv.L1
调试
此处成功进去
最后使用thttp这是主要的,调试用webserver
{"username":"admin","password":"123"}
sudo chroot . ./qemu-mipsel \ -E CONTENT_TYPE="application/x-www-form-urlencoded; charset=UTF-8" \-E GATEWAY_INTERFACE="CGI/1.1" \-E REMOTE_ADDR="192.168.238.1" \-E QUERY_STRING="parameter=login" \-E HTTP_USER_AGENT="Mozilla/5.0" \-E CGI_PATTERN="*" \-E CONTENT_LENGTH="37" \-E HTTP_HOST="192.168.238.129" \-E SERVER_SOFTWARE="Router Web Config System" \-E PATH="/usr/local/bin:/usr/ucb:/bin:/usr/bin" \-E HTTP_ACCEPT_LANGUAGE="zh-CN;q=0.9" \-EHTTP_REFERER="http://192.168.238.129/home/login.html" \-E SERVER_PROTOCOL="HTTP/1.1" \-E HTTP_ACCEPT_ENCODING="gzip" \-E REQUEST_METHOD="POST" \-E PWD="/var/html" \-E SERVER_PORT="80" \-E INIT_DONE="NO" \-E INIT_DONE_WISP="NO" \-E INIT_DONE_JUMP="NO" \-E SCRIPT_NAME="/send_order.cgi" \ -E SERVER_NAME="lab" \ ./usr/bin/thttpd -D -u root -d /var/html/ -c "*"
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:小木说安全 小木说安全 小木说安全《干货|MB5E 固件逆向全流程:内核解密→QEMU 模拟→thttpd 服务器登录调试实战》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论