干货|MB5E固件逆向全流程:内核解密→QEMU模拟→thttpd服务器登录调试实战

admin 2026-01-30 18:30:32 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档详述MB5E固件逆向流程,演示了内核解密、QEMU模拟环境搭建及thttpd服务调试。作者通过chroot运行MIPS架构程序,修复挂载问题,并分析环境变量配置,最终通过构建htpasswd文件成功模拟登录,为IoT设备漏洞分析与固件调试提供了具体可操作的实战参考。 综合评分: 88 文章分类: IoT安全,逆向分析,二进制安全


cover_image

干货|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 服务器登录调试实战》

评论:0   参与:  0