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 * |