论坛首页 漏洞分析研究区 阅读主题

[原创]TD路由器环境模拟与漏洞分析

267 浏览 13 回复
#1 楼主 2026-06-01 21:09:04
版本 : AX3000_Pro_V16.03.49.26EMUX : emux首先按照官方的步骤配置EMUX的环境:如果build-emux-docker编译失败,设置DOCKER_BUILDKIT=0:之后执行./run-emux-docker就进入了EMUX:路由器的固件配置是在files/emux/firmware目录,新建一个TENDA-USAX3000目录,目录结构如下:config 为配置文件,kernel下的为Linux内核文件,squashfs-root下的为路由器固件.config内容如下:然后在firmware下的devices中增加一条路由器的设备信息,路由器的固件环境配置就完成了.之后运行 ./build-emux-volume :然后运行 ./run-emux-docker ,进入emux shell:运行launcher 选择运行的设备,或者新开一个窗口,运行 ./emux-docker-shell同样进入EMUX-DOCKER的SHELL,之后运行launcher选择路由器固件:之后进入EMUX DEVICE CONSOLE:输入root进入路由器的环境选择页面:第一个是进入EMUX的AArch64环境,第二个是按照config的配置文件运行initcommands="/etc_ro/init_tab"后进入路由器的环境,第三个是直接进入路由器的固件shell,选择第三个进入路由器的固件shell:查看 inittab 的信息:路由器环境初始化运行的是rcS脚本,可以直接运行rcS脚本,也可以选择性的运行以下的命令:之后运行开启httpd服务的命令:HTTPD的报错提示分为两个部分,一个是connect和func:cfms_mib_proc_handle的错误,另一个是goahead的错误,优先分析goahead的错误。根据setLocalHost error的提示,应该是httpd的main调用libgo.so的websOpen时报错,在websOpen的子函数sub_FFFFF7983690发现有获取br0网桥的地址:使用ip link 新增一个虚拟网桥br0,并分配和eth0相同的IP地址:再次运行/bin/httpd --debugger --verbose 成功开启HTTPD服务:根据EMUX的端口映射信息,访问20080端口成功打开登陆页面:但是输入任何密码都无法进入,重新打开一个emux-docker 输入 userspace 选择第三个进入路由器的HOST:进入/var/webroot 查看 default.cfg 的配置文件:因为没有设置密码sys.userpass的值为空,但是sys.quickset.cfg为1应该进入路由器的设置页面,却没有进入。在libgo.so中的authSecurityHandler函数中有对g_fast_setting == 1时跳转到quickset.html的判断:查看g_fast_setting的写函数,是调用了libcommon.so的GetValue()函数获取sys.quickset.cfg的值:在libcommon.so的GetValue函数中,有对unix套接字/var/cfm_socket的连接操作:cfms_encode_msg 和 cfms_proc_send_msg 为发送MSG信息;ugw_proc_recv_msg 和 cfms_decode_msg 为接收MSG信息。搜索/var/cfm_socket字符串,在/bin/cfmd的程序中有注册unix socket /var/cfm_socket的操作:直接运行/bin/cfmd 提示获取mtd的大小失败:对应的代码如下:跟进get_mtd_size_w("CFG")函数,在libcommon.so的get_mtd_size中有对mtd的操作:对mtd_open函数进行分析,其读取/proc/mtd的内容,根据name的值找到对应的mtd:查看/proc/mtd信息,如果可以增加一条name为CFG的mtd1信息,然后在/dev/下创建一个mtd1的image,那么这个cfmd程序或许就会运行成功。另外一种方式是直接编程实现/var/cfm_socket的unix socket。CFM_SOCKET基本功能就是读写default.cfg配置文件信息,分析libcommon.so的GetValue和SetValue,其cfms_encode_msg和cfms_decode_msg的函数如下:消息格式为 [长度+JSON(type,name,value)]在cfmd程序调用cfms_encode_msg时,对type进行了+1:程序接收和发送查询信息的消息格式如下:首先将default.cfg转为ini格式的文件,生成default.ini的cfg_parser.py代码如下:模拟cfm_socket的uds_server.py代码如下:正常情况是直接在EMUX的路由器环境中模拟/var/cfm_socket通信,但是路由器的环境不支持PYTHON,需要在远程运行一个TCP服务,然后使用socat命令将远程的TCP服务端口映射到路由器的/var/cfm_socket路径。将uds_server.py和default.ini文件复制到workspace目录中,并在主机的SHELL运行以下命令:这样就开启了一个TCP服务,并监听172.22.197.151:8888端口。重新打开一个emux-docker 输入 userspace 选择第一个进入EMUX HOSTFS shell,运行以下的命令:这样远程的172.22.197.151:8888端口就被映射到了路由器固件的/var/cfm_socket路径上。在路由器环境中查看cfm_socket已经存在:现在运行/bin/httpd程序,不再提示任何错误:访问c3fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5%4x3W2)9J5k6e0t1J5i4K6u0W2x3e0V1%4i4K6u0W2x3e0f1I4i4K6y4m8x3U0l9H3z5o6m8Q4x3V1k6I4N6h3W2U0K9%4y4W2N6q4)9J5k6h3S2@1L8h3I4Q4c8e0g2Q4z5f1y4Q4b7U0m8Q4c8e0g2Q4z5f1c8Q4z5o6m8Q4c8e0S2Q4b7V1k6Q4z5f1u0Q4c8e0g2Q4z5o6g2Q4b7e0g2Q4c8e0S2Q4b7U0N6Q4b7f1k6Q4c8e0N6Q4z5e0c8Q4b7U0q4Q4c8e0g2Q4z5e0W2Q4b7e0S2Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0S2Q4b7f1g2Q4b7V1g2Q4c8e0N6Q4b7V1c8Q4b7f1g2Q4c8e0W2Q4b7e0q4Q4b7U0g2Q4c8e0W2Q4z5f1c8Q4b7e0u0Q4x3V1y4Q4c8e0S2Q4b7f1g2Q4b7V1g2Q4c8e0N6Q4b7V1c8Q4b7f1g2Q4c8e0N6Q4b7f1g2Q4b7

...(已截断)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-289226.htm
#2 2026-06-01 21:09:04
感谢分享
#3 2026-06-01 21:09:04
#4 2026-06-01 21:09:04
不错
#5 2026-06-01 21:09:04
感谢分享
#6 2026-06-01 21:09:04
感谢分享
#7 2026-06-01 21:09:04
感谢分享
#8 2026-06-01 21:09:04
感谢分享
#9 2026-06-01 21:09:04
感谢分享
#10 2026-06-01 21:09:04
感谢分享
#11 2026-06-01 21:09:04
感谢分享
#12 2026-06-01 21:09:04
感谢分享
#13 2026-06-01 21:09:04
感谢
#14 2026-06-01 21:09:04
赞!

请登录后参与讨论

立即登录 注册账号