年前买了个雄迈摄像头,对家里进行安防监控,
该摄像头其实就是个安装了linux系统的嵌入式设备,到手后,对于其未默认开启telnet服务感到很是不爽,所以打算hack之
最简单的办法其实是ttl连上去后开启,其次就是下载固件后直接更改固件,在启动脚本里增加启动telnetd的语句后刷进去,但是因为是新买的,不想失去保修,而且也想趁机多研究学习下,所以只考虑有没有远程开启的办法
从固件开始下手,先去官网下载该摄像头的最新固件
下载完后本地解压,查看了下busybox的定义列表,确实有telnetd,并且/bin下面也建立了telnetd的别名,也就是说是支持telnet服务的,只是没开启而已
在固件文件中搜索了下telnet的配置,也没找到相关配置,此路不太可行
从官方客服下手,在花言巧语之下,找官方要到了telnet开启工具opentelnet,输入目标设备ip后就能远程开启设备的telnet服务
但是该工具有几个限制
1.只可以临时开启telnet,摄像头重启后就得重新开启
2.该工具使用必须输入一个一次性的超级密码,而这个密码得找客服才能算出来
3.该工具会检测输入ip地址,只能对内网设备使用
超级密码这个比较简单,简单研究下后就破解掉了,内网使用也简单,本地做个端口映射也绕过了
只是暂时对telnet的临时开启没办法,每次重启再去开telnet也麻烦啊
所以开始研究永久开启telnet的办法
永久开启有两种途径
1.就和临时开启telnet一样,系统本身支持永久开启的命令
2.系统没有支持永久开启的命令,但是可以将telnetd加到启动脚本里去,达到系统启动时自动启动telnet服务的目的
先对工具抓包,发现是和摄像头的9530端口进行通信,发送了OpenTelnet:OpenOnce的命令给摄像头
然后telnet登陆上摄像头,使用命令netstat -ap查看是谁在用9530这个端口
# netstat -ap Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:34567 0.0.0.0:* LISTEN 1190/Sofia tcp 0 0 0.0.0.0:554 0.0.0.0:* LISTEN 1190/Sofia tcp 0 0 0.0.0.0:www 0.0.0.0:* LISTEN 1190/Sofia tcp 0 0 0.0.0.0:telnet 0.0.0.0:* LISTEN 1169/telnetd tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 1190/Sofia tcp 0 0 0.0.0.0:9530 0.0.0.0:* LISTEN 1165/dvrHelper
dvrHelper
这是个啥玩意呢?
因为摄像头的busybox里命令残缺不全,在里面找东西和分析都麻烦的很,所以还是在本地固件里分析吧。
在固件文件夹里搜索到dvrHelper,发现是dvrbox的链接,然后查找dvrbox中的文本
除了找到OpenTelnet:OpenOnce之外,还找到了OpenTelnet:Forever
顾名思义,难不成这个语句就是永久开启telnet的语句?
将之前的opentelnet工具改改,把发送的命令由OpenOnce改成OpenTelnet:Forever
执行后重启摄像头,telnet服务还是没启动,shit,看来是弄错了什么东西,或者系统根本不支持telnet的永久开启?此路已经不通,掉转方向继续进行研究
开始查找系统的可写目录,仅找到以下三个
/mnt/mtd
/utils
/var/tmp
其中/utils是内存系统,重启后会清空,所以不是此目录
/var/tmp也是临时文件夹,重启会删除,所以也不是此目录
本来试图修改/etc/init.d文件夹下的rcS文件,做到开机启动telnetd
但是该文件是只读,研究许久都没发现修改该文件或者其子过程的办法
/mnt/mtd呢?
研究半天/mnt/mtd,也是毫无头绪,改倒是可以改,但是没法添加到启动项中去
不过也可能是使用文件作为配置文件,启动检测到文件存在时则执行telnetd,否则不执行,这点只能从固件中找答案
仍然是研究dvrbox文件
#strings dvrbox |grep telnet telnetctrl LIBDVR : Get telnetctrl Fialed, telnetctrl=1 macGuarder: Open telnetd Forever killall telnetd macGuarder: Close telnetd Forever
居然还有 killall telnetd 语句,是不是即使将telnetd想办法添加到启动项,也会被干掉?
但是又注意到另外一个字符telnetctrl
难道telnetctrl就是该配置参数名?
使用telnetctrl在固件文件夹下全局搜索
发现仅在armbenv中再次提到了该参数
那armbenv是个什么呢?
执行armbenv命令,提示使用-r参数打印环境信息
继续执行armbenv -r
根据结果以及个人的猜测,我认为armbenv是设置系统启动环境变量用的
另外其有一个-s参数,可以设置param,要不试试?
执行以下命令 armbenv -s telnetctrl 1
提示成功
再执行armbenv -r
发现telnetctrl已经存在
重启
直接telnet
成功!
备注
1.经测试重置不会移除telnetctrl参数,目测armbenv工具应该是读写uboot配置的工具,所以在文件系统里当然找不到对应的配置记录了
2.telnet的账号密码获取其实很简单,把固件解压后,查看romfs-x.cramfs\etc\passwd文件,里面有加密后的密码串,把密码串在搜索引擎里面搜下,就找到了对应的密码
我手上这款摄像头的账号密码是
root
xmhdipc