NetCore 后门RCE漏洞
| 0 | 前言
在netcore路由器设备中存在硬编码的登录密码,可以通过登录+命令注入实现执行任意系统命令、上传/下载文件、控制路由器任意命令执行
| 1 | 固件下载&解包&qemu配置
固件下载
固件解包
1 | binwalk -e --preserve-symlinks T1.bin |
qemu配置
本固件是socket服务,我习惯使用qemu的system仿真
下载所需的qemu,内核文件
debian_wheezy_mipsel_standard.qcow2
将文件复制到虚拟机中,在同一路径下创建start.sh,赋予可执行权限+x
1 | !/bin/bash |
启动qemu后将固件的文件系统通过scp传入qemu中
| 2 | 逆向分析
找到/etc/rcS,打开发现
1 | !/bin/sh |
可以看到可执行文件的路径/bin/igdmptd,我们将其提取出来
1 | [*] '/home/zer00ne/Desktop/cve_review/stage1/netcore/_T1.bin.extracted/squashfs-root/igdmptd' |
将其放入IDA中分析

main函数先是fork子进程,再退出父进程.这会给我们的调试带来很大的麻烦,这里我直接把call create_daemon给patch成nop,不会影响程序逻辑.

create_server函数创建了个套接字,然后bind到0.0.0.0:53413上
这里本应该是大端序显示,但是不知道为什么不管是checksec还是IDA都给识别成小端序了(🤔🤔🤔)
我们继续进入operate_loop中

首次接受数据后,因为v2是0,所以不会进入这个if(v2)中
我们看到与这个if对应的else处

将接收到的数据复制一份,放在v5中,然后进入do_mptlogin中

这个call_mpptlogin函数与登录有关

逻辑简单到直接把输入数据的一部分与netcore对比,属于严重的硬编码密码
如果密码正确,就会返回0


最终do_mptlogin也会返回0,v2会被赋值为1,代表已登录
此时我们可以进入if(v2)中

根据输入数据的2,4字节的拼接出的token,选择进入不同的函数中处理

我们直接看到最后一个后门函数do_syscmd中,然后逆向分析token的条件
buf[2]!= '?' && '$',token == 0,sizeof(payload) != 8这三个条件才能使得进入sys

把我们输入的数据接过复杂的拼接后直接传给popen,使得我们能够RCE
调试分析
关于密码的输入,我选择第一次发送b"abcdefghijklmnopqrstuvwxyz",然后查看那部分被用于和netcore进行strcmp

所以我们这样写第一段payload =b'a'*8+b"netcore\x00"
然后我们逆向第二段的命令注入位置
先构造第二段的payload为payload=b"\x00\x00\x00\x00"+b"abcdefghijklmnopqrstuvwxyz"

所以第二段payload应该为#payload=b"\x00\x00\x00\x00"+b'b'*4+f"{cmd}".encode()
我们试着输入cmd="echo I needed to control you >> /tmp/pwn.txt\x00"

可以看到我们执行了此命令
| 3 | EXP
1 | from socket import * |