废物利用的双盘位丐版NAS/下载机雏形
注:研究过程有诸多反复,为节约看客宝贵阅读时间,以线性叙事为主,补充说明为辅。
0x00 前言
关注及研究NAS/HTPC/下载机也有些年份了,但到目前为止并没有实际架设过NAS/下载机,主要原因还是需求不强烈。三台NUC分别放在不同房间用作HTPC/办公机,需要下载就用主力工作机完成,反正网速也快,边做事边下很快就能完成。
近期又开始想弄台NAS/下载机,则是因为快递频繁丢失,自己用海鲜市场淘来的遗失密码摄像头(另一个故事,按下不表)配合路由的NAS功能搭好了楼道的监控以后,虽然几十G的U盘能存几个月视频,已经满足了需求,但也萌生了弄台NAS玩一下的念头。
对于各种方案的优缺点,熟悉的人都很熟悉了。我的核心需求:
功耗低:毕竟要常开
至少2个SATA接口:足够的存储扩容
可刷Linux:不一定需要直接可刷的OpenWRT/Armbian固件,实在需要可以自己移植
极度便宜:主要是玩,看看最低能以什么成本搭好
于是开始了漫长的货比三家。
0x01 筛选
NVR是重点考察目标之一,毕竟系统好刷,SATA口难求,而NVR往往至少有一个SATA。某天正好在海鲜市场看到了这块Hi3520Dv100。当初为了恢复捡垃圾来的那台HikVision摄像头的密码,查了不少资料,了解到OpenIPC这个项目的存在。该项目支持在一些IPCam/NVR上跑OpenWRT,而Hi3520D就在其可支持的列表中。并且有两个SATA,还只要20块包邮。价格是很可以了,只是好坏未知,卖家也不知道当废板出。看板子照片成色还可以,也没有焊过的痕迹,那就赌一把试试。
0x02 初试
板子收到后还算干净,和卖家图(如上)差不多,清了一下灰,量下电源正负极确认没有短路。考虑到一般监控都是12V,直接上电12V,板子自带的LED能亮了,D口电源附近也有亮。断电,插VGA,再次上电,显示器居然有输出了!(误:我难道不应该期望有输出吗!)换HDMI口也有输出。显示如下,查了一下可能是雄迈,也有说中维、巨峰、绿视等等。具体什么牌子暂时不重要,估计都是按Hi3520DV100的公版设计改的,也可能是贴牌的出口版本。
能亮只是第一步,要能刷固件才有折腾的可能。但系统只能停留在logo显示,没有其他内容,过几分钟似乎还会自动重启。nmap扫描全局域网设备,找到了这台NVR的IP,说明网络正常,端口扫描发现只开了一个9530端口。
于是开始根据主板上的印刷的各种信息开始大海捞针。
背面的T8-3520D-SA V2.02 20140313,能查到有关于AHB780XT8-3520D-SA的若干固件信息,按AHB780XT8的信息中文搜索,更确定了这是块比较老的雄迈板子(至少是兼容)。
正面的HQ-MBD0046,搜到GreenVision GV-N-S 001/08,看起来也是Hi3520D的板子。
先看网络部分:搜了一下9530端口,发现有个著名的0day漏洞,回忆了一下好像确实想到前几年有个知名国产摄像头漏洞的新闻似乎是和雄迈有关。查了一下相关资料,已经有了漏洞POC:
测试POC,运气爆棚,竟然直接能用root+默认密码telnet进了板子:
虽然暂时还不能做什么,但至少明确了芯片,Linux内核版本,内存大小,又多了些信息。
接下来是TTL。板子上现成的引脚、空焊盘并不多,开始以为是那个4pin的XH底座是TTL,换不同组合插TTL线,重启n次也读不出数据,后来才发现TTL是那个3pin的空焊盘,而4 pin按位置来看估计是另一个USB接口。TTL焊好插针以后如下,注意看中间,标签上方的3pin接头位置:
重新上电,顺利看到u-boot过程:
只可惜,无论怎么ctrl-c,都进不去u-boot菜单。看来要么是当前u-boot更换了快捷键,要么是禁用了。难道就这样放弃吗?当然不能浪费20块!注意到u-boot开始会扫描USB设备,那,插个U盘试试?
看来u-boot尝试读取auconfig.txt.auconfig, emmm, auto-update-config?看来有机会?
新建一个auconfig.txt文件,里面填上前面下到的固件之一update.img,重启。竟然开始刷了,但是显示型号不兼容。没事,好几个固件一个个试过来。几经尝试,发现00000099 (NBD6808T-PL)和00000119(NBD7808T-PL)这两个型号对应的固件基本都可以刷成功。这下可以进系统了,不过有的版本固件之前的漏洞不再有效,而有的固件直接开了telnetd。除了U盘,两个SATA接硬盘也能识别,但是不能mount ext2/ext3/ntfs, 只能mount FAT格式的U盘。进系统后见下图,为方便观察,又拿了块信号采集卡用OBS来读输出,这样就不必再接块屏了。
系统自己的菜单内也有选项可以刷固件。为了进管理员界面,还去找了个密码重置工具,原理是按系统时间当前时间计算一个复位密码,一旦使用,所有旧密码恢复出厂设置。
至此,这块Hi3520Dv100至少可以:
不能进入u-boot菜单,但可以同通过U盘更新系统,不怕变砖
SATA工作正常,有机会改造
0x03 二面
前面没有提及,选Hi3520DV100的另一个原因是能够下载到官方SDK。没有SDK,移植内核和驱动都成问题。但首先,还是要搞定如何构造刷机包。
刷机包有两种格式,一种是update.img,需要通过U盘的auconfig.txt更新;另一种是bin格式, 比如SimpGeneral_General_NBD7808T-PL_V4.02.R11.20150623.bin,需要先进入NVR,通过系统菜单来更新。
开始分析:
binwalk一下update.img,发现包含一个总文件头和若干CramFS和SquashFS镜像。
binwalk一下bin文件,直接看到就是几个zip文件,解包看一下,分别是:romfs-x.cramfs.img, user-x.cramfs.img, custom-x.cramfs.img,logo-x.cramfs.img。
再次binwalk每个image,都可以看到是一个由64字节的文件头,后接CramFS或SquashFS的u-boot image文件。
两种刷机包格式有什么区别?简单暴力diff了一下,发现update.img实际就是一个64字节的文件头依次拼接4个fs镜像而成:
而通过比较不同的update.img发现,实际只有高亮部分不同,其他部分都一致,猜测XM-DVR是签名,0x14开始的0x40估计是版本号,而高亮部分有可能是文件大小。计算了一下上面4个FS以及文件头自身的总大小,正好是0x6CF140。
下面验证一下:
先用dd从logo-x.cramfs.img提取出CramFS
再用fsck.cramfs解包,看到一张h264dvr.jpg的图片,正是那个HD iDVR的开机log
然后换掉图片,用mkcramfs重新打包成CramFS
接着mkimage转换成u-boot image
最后依次拼接img格式刷机包的64字节文件头,romfs-x.cramfs.img,user-x.cramfs.img, custom-x.cramfs.img, 以及自己生成的logo-x.cramfs.img,修正文件头中的总大小
刷机!
好了,成功了!
至于romfs-x.cramfs.img, user-x.cramfs.img, custom-x.cramfs.img这几个,则是SquashFS镜像,分别映射了根目录/, /usr及/mnt/custom,同样可以用类似步骤完成解包和重新打包的操作。
至此,这块Hi3520Dv100已经可以:
自己修改romfs-x.cramfs.img, user-x.cramfs.img, custom-x.cramfs.img, logo-x.cramfs.img这几个分区镜像
自己制作bin格式刷机包
0x04 录取
接下来的步骤就是要修改内核&应用程序了。好在Hi3520D_V100R001C01SPC040已经提供了完整的代码和编译步骤,除了踩过一些小坑,整体过程基本还算顺利。最终自己编译了linux kernel,helloworld, sshd并且成功更新, 后续就是移植需要的应用了。下图可以看出:
kernel已经换成我用vm编的版本Linuxversion 3.0.8 (root@ubuntu-vm)
helloworld正常运行,说明交叉编译应用测试成功,ulibc及其他需要的库也能正常加载
sshd也能正常运行。默认的telnetd被我关掉了,改用ssh登陆
挂一块硬盘,scp测试一下,非常可惜只有3.5MB/s左右,top一下发现CPU使用率已经超过90%。所以有可能还是CPU性能不足拖了后腿,毕竟这块CPU是这样的:
编译内核和移植应用过程中踩过的一些坑:
刚开始,发现替换了kernel直接导致无法启动,几经排查,才发现u-boot给romfs划分的空间太小,只有1984K。开始没注意,用hi3520d的最大config自己编译kernel,生成的romfs尺寸接都近3M了。其实dmesg开始都有列出romfs的大小,只是自己没注意。于是只能弃用hi3520d_full_defconfig,改用尺寸较小的hi3520d_mini_defconfig,并且去掉了一些不需要的驱动,增加了ext2/3/4以及NTFS/NAS的支持,最终把romfs控制在1986K。
本想通过自己编译busybox进一步压缩romfs大小,发现提供的busybox代码中并不直接包含板子所需要的himm等应用,需要从board_tools中移植,而且就算编译到最小,也并不比原始busybox更小,于是作罢,和u-boot一样, busybox也继续采用固件中默认的版本。
user-x.cramfs.img, custom-x.cramfs.img这两个分区空间较大,里面原本保存着其他内核模块,NVR应用程序Sofia和相关配置等等,全都删除之,可以挪腾出3776K(usr)+1664K(custom)整整5M空间,把编译出的应用及依赖库全放进/usr/lib然后软链接至/lib,完美解决romfs空间不足的问题。
openssh的编译费了一番周折。原本按习惯用最新的tag来搭配openssh,zlib,openssl,虽能编译通过,但连接到sshd总会遇到丢包,key交换失败等问题。逐渐降低版本,并用openssh代码中INSTALL文档建议的版本搭配,最终成功。目前采用的版本搭配是openssh-portable 7.5p1 + openssl 1.0.2l + zlib 1.2.11
开始直接用系统自带的mksquashfs,打包后的镜像无法被u-boot识别。后替换回SDK中的版本,工作正常。
0x05 尾声
基本验证了捡来的NVR主板当NAS/下载机的可行性。可惜整体性能受限于CPU体质无法得到进一步的发挥,毕竟下载工具还是需要一些CPU资源,不像NVR本身是走DMA来写入压缩后的监控数据的。
后续需要完成的收尾工作包括:
从OpenWRT再移植其他必要应用,至少包含httpd,类石像鬼的控制界面,nfs server,支持磁力/种子的下载工具。
能塞下双盘位硬盘支架的合适外壳。
完。感谢观看。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~













孤毒老鼠
校验提示文案
killl君
校验提示文案
载酒买花年少事
校验提示文案
54hxz
校验提示文案
h55aa
校验提示文案
熊喵烧山
校验提示文案
玻璃水推广员
校验提示文案
好孩子他爹
校验提示文案
KingPZ
校验提示文案
值友6398713036
校验提示文案
天真的四脚蛇
校验提示文案
煮鸡蛋
校验提示文案
fanfan5306
校验提示文案
telanx
校验提示文案
背头咕咕鸡
校验提示文案
德玛西亚草薙京
校验提示文案
尚在捡垃圾
校验提示文案
大大大光头
校验提示文案
Hi王蕴
校验提示文案
我相信我能上天
校验提示文案
vivid
校验提示文案
阿密AMIZCMI
校验提示文案
值友1720418027
校验提示文案
刷哈存在感
校验提示文案
风絮_
校验提示文案
偏北就是我
校验提示文案
闲嗑瓜子
校验提示文案
嘎嘎好看
校验提示文案
值友1396409967
校验提示文案
Jayrang
校验提示文案
T99-S
校验提示文案
qwdn
校验提示文案
鱼尾纹
校验提示文案
锤锤勇闯天涯
校验提示文案
坚持奋斗的小胖
校验提示文案
风中独火
校验提示文案
值友7536808525
校验提示文案
白大白大白
校验提示文案
艺高人大胆
校验提示文案
BobH
校验提示文案