逛闲鱼看到有富姐免费送全新的联通摇头机VS302,贪小便宜的我赶紧付了9块9邮费拿下。到手竟然是一个硕大的爱马仕盒子包装,里面还带着爱马仕的问候信,果然是富姐,拿爱马仕羞辱垃圾佬

对爱马仕不感兴趣,只喜欢研究摄像头。但是拆开大失所望,看到的是个一颗富瀚的主控。没玩头,互联网上几乎没任何资料,更没有开源的固件可以使用。

硬件参数

  • 型号:联通华盛通讯 VS302

  • SoC:富瀚微Fullhan FH8852V200

  • CMOS:格科微 GC4653 真·400万

  • DDR:SoC集成64MB

  • ROM:16MB NOR

  • 网络:有线 + WiFi,模块为SSV6155P USB接口

  • 生成厂家:从系统内的痕迹和主板丝印看,应该是易莱孚

  • 启动日志内得到的设备信息

    =============================================
      Kernel version : Linux 4.9.129
      Kernel date    : 2023-05-01 23:40:35
      SDK version    : bsp:FH885XV210_IPC_V1.0.0_20210928
      sdk:FH885XV200_IPC_V1.1.0_20210716
      patch:FH885XV200_IPC_V1.1.0.FP34_20230421
      Model name     : DUC-L73PA1250
      FW version     : 23.1207.1913
      Build date     : 2023-12-07T19:18
      Chip name      : FH8852V200
    =============================================
    

拿到手后搜这型号才发现竟然还上了富瀚微的官网:https://www.fullhan.com/en/index.php?c=article&id=503 早看到是Fullhan Inside的话我9块9邮费也不想掏了

但难能可贵的是,和其他大多数无良厂家截然相反,别人都是把2MP/3MP的CMOS给插值虚标到4MP,这款机器明明用的真·4MP的CMOS GC4653,可以看到视频的分辨率也确实是2560x1440p,但厂家却把摄像头标宣传为3MP

获取root权限

接上UART串口,先让他正常启动,得到启动日志。进入linux shell需要密码,没有。重启使用E中断启动进入uboot,但是uboot也需要密码,提示### Please input uboot password: ### ,也没有。namp扫描IP,没有一个端口开放。保护得真好,没办法只能把Flash焊下来用编程器读取了

闪存读出来可以看到uboot env内有参数ubootpwd=b817359827ef9919b7a0b7326e8c23b680196490f951c57c7f268f476fc16358,是一段hash,算法未知。网上没找到已知的对应密码,不过也不需要了

从启动日志得到的闪存布局

[    1.037943] 0x000000000000-0x000000010000 : "bootstrap"
[    1.044565] 0x000000010000-0x000000020000 : "uboot-env"
[    1.049515] 0x000000020000-0x000000060000 : "uboot"
[    1.054425] 0x000000060000-0x000000300000 : "kernel"
[    1.059298] 0x000000300000-0x000000380000 : "data"
[    1.064156] 0x000000380000-0x000000870000 : "app"
[    1.068739] 0x000000870000-0x000000b10000 : "kernel1"
[    1.073864] 0x000000b10000-0x000001000000 : "app1"

从中提取出app分区,格式是squashfs,使用squashfs-tools解包,根目录下有密码文件shadow,内容为root:$1$REnaghWZ$A5NEv7tAg6QM/.6o1ljpX/:18701:0:99999:7::: ,启动后会被映射到/etc/shadow。网上也没有现成的密码。将密码清空后,重新打包为squashfs分区并使用编程器写回到闪存中

启动后回车,输入用户名root,无需密码顺利进入linux shell,获得root权限

/app # uname -a
Linux (none) 4.9.129 2023-05-01 23:40:35 armv6l

/app # cat /proc/cpuinfo
processor       : 0
model name      : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS        : 2.00
Features        : half thumb fastmult vfp edsp java tls 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb76
CPU revision    : 7

Hardware        : FH8852V2X0
Revision        : 0000
Serial          : 0000000000000000

预留后门:TF卡获取root权限,开启telnetd

继续在系统里转悠,发现一些有意思的脚本文件

/app/app_init.sh内,留有TF卡升级用的后门

if [ -d /mnt/sd/upgrade ] ; then
    if [ -f /mnt/sd/upgrade/img_up ] ; then
        cp /mnt/sd/upgrade/img_up /home/
        chmod +x /home/img_up
    fi
    if [ -f /mnt/sd/upgrade/iu.sh ] ; then
        cp /mnt/sd/upgrade/iu.sh /home/
    elif [ -f $cur_dir/iu.sh ] ; then
        cp $cur_dir/iu.sh /home/
    elif [ -f /usr/bin/iu.sh ] ; then
        cp /usr/bin/iu.sh /home/
    fi
    if [ -f /home/iu.sh ] ; then
        chmod +x /home/iu.sh
        /home/iu.sh -s
    fi
    rm -f /home/iu.sh
fi

我们可以在TF卡内创建目录upgrade,其内放入一个文件,名为iu.sh,内容如下

#! /bin/sh

echo "root::18701:0:99999:7:::" > /etc/shadow
telnetd &

插入机器内并重启,摄像头就会自动将root密码清零并打开telnet。需要注意的是,这里替换的密码文件是运行在内存中的,闪存中的并未改变,因此重启后会失效。

主程序 /app/apollo

主程序配置文件app.cfg

位于/app/prodit/PSEWN-04/config,是主程序的参数配置文件,只把感兴趣的几个参数摘出来

cloud_enable=yes
cloud_uc=yes
mptool=no
onvif=no
rtsp=no
telnetd=auto
web=no
yogurt=auto
  • 前两个是云开关,显而易见
  • rtsp改为yes可以打开rtsp端口8554,但是有密码,看不了,apollo内找到的下面这行,不对/user=admin_password=tlJwpbo6_channel=1_stream=1.sdp?real_stream
  • onvif和web,默认是关闭的,改为yes也不起作用,因为缺少httpd服务器和文件
  • yogurt,酸奶?不知为何物。设为yes后摄像头会打开9876端口,telnet可以连入,作用未知,curl返回empty response
  • mptool,亦不知为何物,可能是原厂调试用的程序。设为yes后摄像头会断开云连接,同时打开新的端口,包括843,1300,8699,9876,其中只有843可以响应,但也是empty response
  • telnetd,设为yes后可以开机自动运行telnetd

进入uboot

虽然已经没有任何必要了,但还是写一下进入uboot的方式。 先进入linux shell,运行命令

fw_setenv ubootpwd
fw_setenv bootdelay 3
reboot -f

重启后迅速按E就可以免密码进入uboot了,有一些常见的功能,可以从tftp和TF卡内下载内容到闪存上

需要注意的是,每次重启进入linux系统后,有一个脚本/app/app_check_setting.sh会检测uboot env并和预置的只读文件/app/sysinfo/uboot_env做比对,如果ubootpwdbootdelay被改变了的话,脚本会重新将其重置为预设值,即b817359827ef9919b7a0b7326e8c23b680196490f951c57c7f268f476fc163580

可以修改squashfs分区后重新打包写回闪存,但没什么必要了

telnet登录升级固件

  1. ps |grep apollo找到主程序apollo的pid
  2. kill -9 pid
  3. cat mtd5_new > /dev/mtdblock5
  4. reboot -f

开启RTSP协议,本地播放视频

能打开协议和端口,但是无法知道用户名密码,VLC提示密码错误。摄像头内没有找到有配置的地方。有待进一步研究,欢迎提供线索

共用固件的其他型号

通过分析固件内的配置文件,发现可能共用同一个固件的型号有

  • 联通枪机 VS301_400 代号 DUC-L73PA1250-PGENN-03
  • 未知枪机 代号 DUC-L73PA1250-PGENN-01
  • 未知摇头机,代号 DUC-L73PA1250-PSEWN-02
  • 易莱孚摇头机 EA9103-V2 代号 DUC-L73PA1250-PSEWN-05
  • 未知枪机 代号 DCM-L73PA1100-PGENN-01