废物利用的双盘位丐版NAS/下载机雏形

2022-03-21 10:13:03 115点赞 228收藏 83评论

注:研究过程有诸多反复,为节约看客宝贵阅读时间,以线性叙事为主,补充说明为辅。

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块包邮。价格是很可以了,只是好坏未知,卖家也不知道当废板出。看板子照片成色还可以,也没有焊过的痕迹,那就赌一把试试。

20块包邮20块包邮

卖家图,有点灰但不是太脏卖家图,有点灰但不是太脏

0x02 初试

板子收到后还算干净,和卖家图(如上)差不多,清了一下灰,量下电源正负极确认没有短路。考虑到一般监控都是12V,直接上电12V,板子自带的LED能亮了,D口电源附近也有亮。断电,插VGA,再次上电,显示器居然有输出了!(误:我难道不应该期望有输出吗!)换HDMI口也有输出。显示如下,查了一下可能是雄迈,也有说中维、巨峰、绿视等等。具体什么牌子暂时不重要,估计都是按Hi3520DV100的公版设计改的,也可能是贴牌的出口版本。

HD iDVRHD iDVR

能亮只是第一步,要能刷固件才有折腾的可能。但系统只能停留在logo显示,没有其他内容,过几分钟似乎还会自动重启。nmap扫描全局域网设备,找到了这台NVR的IP,说明网络正常,端口扫描发现只开了一个9530端口。

于是开始根据主板上的印刷的各种信息开始大海捞针。

  • 背面的T8-3520D-SA V2.02 20140313,能查到有关于AHB780XT8-3520D-SA的若干固件信息,按AHB780XT8的信息中文搜索,更确定了这是块比较老的雄迈板子(至少是兼容)。

  • 正面的HQ-MBD0046,搜到GreenVision GV-N-S 001/08,看起来也是Hi3520D的板子。


    接下来一个重要问题:如何刷固件。既然不知道系统运行到什么阶段,只能从网络和TTL上想办法。

先看网络部分:搜了一下9530端口,发现有个著名的0day漏洞,回忆了一下好像确实想到前几年有个知名国产摄像头漏洞的新闻似乎是和雄迈有关。查了一下相关资料,已经有了漏洞POC:

测试POC,运气爆棚,竟然直接能用root+默认密码telnet进了板子:

默认dmesg默认dmesg

虽然暂时还不能做什么,但至少明确了芯片,Linux内核版本,内存大小,又多了些信息。

接下来是TTL。板子上现成的引脚、空焊盘并不多,开始以为是那个4pin的XH底座是TTL,换不同组合插TTL线,重启n次也读不出数据,后来才发现TTL是那个3pin的空焊盘,而4 pin按位置来看估计是另一个USB接口。TTL焊好插针以后如下,注意看中间,标签上方的3pin接头位置:

焊好TTL焊好TTL

重新上电,顺利看到u-boot过程:

u-bootu-boot

只可惜,无论怎么ctrl-c,都进不去u-boot菜单。看来要么是当前u-boot更换了快捷键,要么是禁用了。难道就这样放弃吗?当然不能浪费20块!注意到u-boot开始会扫描USB设备,那,插个U盘试试?

auconfigauconfig

看来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来读输出,这样就不必再接块屏了。

NVR原始界面NVR原始界面

系统自己的菜单内也有选项可以刷固件。为了进管理员界面,还去找了个密码重置工具,原理是按系统时间当前时间计算一个复位密码,一旦使用,所有旧密码恢复出厂设置。

至此,这块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镜像而成:

XM-DVR文件头XM-DVR文件头

而通过比较不同的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,修正文件头中的总大小

  • 刷机!

用张大妈作logo试试?用张大妈作logo试试?

好了,成功了!

至于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登陆

AppApp

挂一块硬盘,scp测试一下,非常可惜只有3.5MB/s左右,top一下发现CPU使用率已经超过90%。所以有可能还是CPU性能不足拖了后腿,毕竟这块CPU是这样的:

cpuinfocpuinfo

编译内核和移植应用过程中踩过的一些坑:

  • 刚开始,发现替换了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,支持磁力/种子的下载工具。

  • 能塞下双盘位硬盘支架的合适外壳。

完。感谢观看。

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
83评论

  • 精彩
  • 最新
  • 你得到了远超20块的快乐……………………

    校验提示文案

    提交
    借一楼,我也想发这一句,可以让我来说吗? [小眼睛] 大佬得到了他自己远超20块钱的快乐!为大佬点赞!

    校验提示文案

    提交
    勉强看了一半,🐂🍺

    校验提示文案

    提交
    收起所有回复
  • 我的天,看第一句我还想笑话您来着 [喜极而泣] 看到后面发现超纲太多 [喜极而泣] 大佬太猛了 [赞一个]

    校验提示文案

    提交
  • 是不是太专业了点…… [喜极而泣] [喜极而泣] [喜极而泣] [喜极而泣]

    校验提示文案

    提交
  • 我以为我来到了恩山 [很惊讶]

    校验提示文案

    提交
  • 嵌入式大佬,您这多少年研发经验了。 [赞一个]

    校验提示文案

    提交
  • 太专业冷,超过一般垃圾佬的能力范围冷

    校验提示文案

    提交
  • 职业选手禁止参赛 [喜极而泣] [喜极而泣] [喜极而泣]

    校验提示文案

    提交
  • 看了文章的开始我翻箱倒柜地找出了我那个同款,看了一半又默默地扔了回去。

    校验提示文案

    提交
  • 这就是写个教程我也不一定搞得定。。。。

    校验提示文案

    提交
  • 点进来之前,应该还行,估计照着操作能做到,点进来后,超出我的知识了解范围了,告辞 [喜极而泣]

    校验提示文案

    提交
  • 我明明看不懂,但还是看完了,点赞

    校验提示文案

    提交
  • 几十万的技术,玩几十块的板子,有点大材小用了…

    校验提示文案

    提交
    大佬这技术用这时间随便干点外快就能买上白群晖全家桶了吧

    校验提示文案

    提交
    收起所有回复
  • 大佬🐮!这是20快能干的吗,这板子也没想到有一天能获此殊荣。

    校验提示文案

    提交
  • 大佬太牛了……不过这配置确实不大好用。还没我6年前的路由器性能好….。

    校验提示文案

    提交
  • 过于硬核吓得我中午饭都不消化了 [高兴]

    校验提示文案

    提交
  • 膜拜,大佬太牛了

    校验提示文案

    提交
  • 检阅完毕。是大佬 [赞一个]

    校验提示文案

    提交
  • d2550,n2800,1037u也就是七八十块钱就可以享受软路由,nas,Linux的快乐,玩好了转手下家也不会亏

    校验提示文案

    提交
  • 性能太差了.. 你也太能折腾了

    校验提示文案

    提交
  • 这折腾的技术都不止这20块 总共成本得有100了

    校验提示文案

    提交
    连特么文章排列序号都与众不同 [赞一个]

    校验提示文案

    提交
    收起所有回复
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
228
扫一下,分享更方便,购买更轻松