随笔 - 6  文章 - 0 评论 - 11 trackbacks - 0

年前买了个雄迈摄像头,对家里进行安防监控,
该摄像头其实就是个安装了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
 
20200326补充
opentelnet工具所使用的协议已经被破解并且有开源实现了

https://github.com/Snawoot/hisilicon-dvr-telnet

使用示例如下:
./hs-dvr-telnet 198.51.100.23 2wj9fsa2

 

将ip换成你的摄像头ip即可
 
关于这个工具的更多细节可以参考这篇:

https://habr.com/en/post/486856/

posted on 2017-03-12 15:52  mmseh  阅读(...)  评论(...编辑  收藏