tendaCT6摄像头固件分析
最近逛tenda发现新上了一款摄像头,这不下载个固件看看?
直接binwalk一把梭
firmAE
这里先不看文件系统,尝试下用firmAE来模拟固件
sudo ./run.sh -c ipc /mnt/hgfs/sharedir/tenda/ct6/IPC_SD_update.bin
需要使用root权限来执行firmAE文件夹下的run.sh,-c参数为check,来检查是否可以模拟,一般check完成后模拟起来会很快,但check很慢,ipc算是项目名字可定义即可
sudo ./run.sh -d ipc /mnt/hgfs/sharedir/tenda/ct6/IPC_SD_update.bin
check完成后可以使用 -a参数直接执行,或者-d参数以debug模式执行,debug模式
这个固件能模拟,但是不能完全模拟,知道用法就可了。
如何找到一个固件的服务进行分析
当解包一个固件的时候发现,没有http服务,没有html页面,没有httpd,boa,uhttpd,lighttpd等。
某些摄像头经常见到这个问题。
这个时候需要从启动来一点点看找到他启动了什么服务。
当然如果有设备并且获取了串口shell,也可以直接查看
这里推荐个超好用的命令 find
大概用法
find . -name “httpd”
find . -name “*cfg”
支持*这样的正则匹配
linux启动最先看inittab,一般在etc下面
启动rcS,一般都在/etc/init.d/rcS
这里就是执行了init.d文件夹下的文件
S00devs 里使用mknod创建Linux中的符设备文件和块设备文件,不重要
S01udev 它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及热插拔的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为。也不重要
S80network中也并没有发现启动的服务
那返回到rcS,执行完S*之后,执行了/opt/app/init.sh
但opt中没有任何文件,这个时候就需要上面说的find命令了。
吧squashfs-root-0和-1的所有内容移动到opt下
运行network_setup.sh,启动telnet服务,将execute放到tmp,启动execute服务,运行daemon.sh
network_setup.sh中没有服务启动,不赘述
daemon.sh中执行了tdseq服务
从先后顺序来看,来分析个execute。
这里tenda摄像头设备基本都是armel,自行file即可
execute
main中可以看到socket函数(具体请看socket网络编程)
这里绑定了8899端口,但是并没有监听。启动下看看
发现8899的udp协议。
可以使用netcat连接
这里分析下udp协议做了什么
通过recvfrom获取到传入的内容存放到v13,创建新线程将内容传进去。
在线程中,吧参数给了v9,然后注意这个v17获取了前四位做了个判断。
以为是magicnumber,满足条件执行my_system,但是这个magicnumbe没有做任何奇奇怪怪的判断。
所以可以直接命令执行,但是还是好奇这个sub_10D64做了什么。
点进去????????????????????????????
不是,脱裤子放屁都没这么放的吧。
开发者这么做,一定有他的用(大)意(病)
查了半天,也没发现这里if分支的区别。
这里应该算是个命令执行了。直接来吧(jitang)!
qemu user导致的问题
这里本来使用的 sudo chroot . ./qemu-arm-static ./opt/app/execute 启动的,但是命令执行死活不成功。
gdb调试了一天,愣是没找到问题。
第二天尝试了下qemu-arm-static -L . ./opt/app/execute
可以了。。。,这里xxxx就是为了填充magic number,可以写脚本传入0x00来执行到sub函数。
所以各位有时候遇到这种问题可以看一下是否是qemu的问题。
当然,如果像我一样,有一个同架构的其他设备,又刚好有该设备的rce,就可以搞点牛头人操作了。
关于gdb多线程调试
gdb多线程调试,大概说一下怎么搞。
使用qemu自带的-g参数启动远程server
qemu-arm-static -L . -g 1234 ./opt/app/execute # 1234为监听的端口
使用gdb-multiarch来进行调试
gdb-multiarch opt/app/execute
target remote 127.0.0.1
在子线程函数中下个断点,我这边位置是0x000110E8
使用c来执行程序
使用netcat连接udp
nc -uvv 127.0.0.1 8899
连上后gdb中能发现新线程
info threads
ID 2 就是断下来的心线程,使用thread 2来切换线程
thread 2
此时pc指向我们的断点,要回主线程,只需要再次切换即可。