😇
牛牛的安全 Odin
  • 个人介绍
  • 数据安全
  • 工控安全
    • 工控概念
  • 车联网安全合规
    • R155
    • CSMS\VTA
    • GDPR认证
  • 车联网安全
    • 漏洞订阅
    • 汽车攻击时间轴
    • 汽车信息安全研究
      • 车厂安全需求 Custom Requirement
      • 安全威胁
      • 参考文章
      • Who’s Behind the Wheel?
      • 安全研究基础
      • 智能网联汽车安全渗透指标
      • 智能网联汽车软件安全测试关键技术研究
      • 基于硬件在环的整车控制器功能安全测试技术研究
      • 智能网联汽车信息安全解决方案
      • 自动驾驶汽车的安全性-识别挑战
    • ECU逆向案例
      • 特斯拉攻击链
      • 汽车动力系统ECU固件逆向工程初探
  • 物联网安全
    • IoT 技术和协议
    • 智能设备常规测试思路总结
    • 各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
    • QEMU 系统仿真
      • 如何“用 QEMU 模拟它”
      • 处理加密的路由器固件
    • 自动分析Automated Approach
    • IOT渗透测试(一)
    • 物联网安全目录
  • 固件分析案例
    • 智能门锁、手环
      • MCU固件反汇编
      • 云丁鹿客门锁中bootloader和FreeRTOS的分析
      • 云丁鹿客门锁BLE通信的分析(下)
      • 云丁鹿客门锁BLE通信的分析(中)
      • 云丁鹿客门锁BLE通信的分析(上)
      • 华为智联旗下小豚AI摄像头的完整分析(下)
      • 华为智联旗下小豚AI摄像头的完整分析(上)
      • 海康萤石智能门锁的网关分析(4)
      • 海康萤石智能门锁的网关分析(3)
      • 海康萤石智能门锁的网关分析(2)
      • 海康萤石智能门锁的网关分析(1)
      • idapython编写和调试
      • 果加智能门锁的全面分析(下)
      • 果加智能门锁的全面分析(中)
      • 果加智能门锁的全面分析(上)
      • BLE智能手环
      • 耶鲁智能门锁的简单测试(下)
      • 耶鲁智能门锁的简单测试(上)
      • 耶鲁门锁漏洞
      • 对一款BLE灯泡的分析
      • BLE协议栈与Android BLE接口简介
    • 在IoT设备中查找端口对应进程的四种方法
    • 路由器命令执行
    • 对基于Philips TriMedia CPU的网络摄像机进行逆向工程
    • 从Microsoft Band以及 Hello Sense 设备中提取自己的历史数据
    • CVE-2021-22909- 深入研究 UBIQUITI 固件更新错误
    • 复现|摄像头固件重打包
    • Dlink_DWR-932B路由器固件分析
    • 针对小米九号平衡车的无接触式攻击
    • 记一次智能印章设备的漏洞挖掘
  • APP 逆向
    • Go二进制文件逆向分析从基础到进阶——综述
    • Switch APP逆向分析
  • 传统静态代码分析
    • 静态分析案例
      • ELF恶意软件的静态分析原理和方法(上)
      • ELF恶意软件的静态分析原理和方法(下)
    • 静态代码分析工具清单
    • 企业级静态代码分析工具清单
  • 应用安全测试
    • DAST、SAST、IAST
    • IAST 工具初探
  • 芯片架构
    • ARM指令集概念
    • ARM指令集
    • 冯·诺伊曼结构
    • 指令集
    • 处理器架构、指令集和汇编语言,三者有何关系?
  • 病毒分析
    • 熊猫烧香
  • 编程知识
    • REST API 教程
  • 流量分析工具
    • 卡巴斯基开源的智能手机流量劫持工具
    • 利用 Burp Suite 劫持 Android App 的流量(二)
    • 利用 Burp Suite 劫持 Android App 的流量(一)
  • 区块链安全
    • 安全多方计算
    • Chainalysis 团队从区块链的角度分析发现 2020 年最大的 4 起勒索软件攻击实现存在关联
  • 攻击案例
    • 特斯拉Powerwall网关可能受到黑客攻击
  • 移动应用
    • Mac上使用Charles抓包
    • 手机抓包工具汇总
    • APP渗透测试流程和技巧大全
    • 加壳和脱壳
    • 浅谈 Android Dex 文件
    • 移动应用漏洞分析样例分享
    • 移动应用常见漏洞分析
    • 移动应用漏洞分析工具介绍
    • 渗透测试流程详解 及 移动APP安全测试要点
    • Frida Android hook
  • 安全设计
    • 【软件安全设计】安全开发生命周期(SDL)
Powered by GitBook
On this page
  1. 固件分析案例

对基于Philips TriMedia CPU的网络摄像机进行逆向工程

本文,我介绍了Philips TriMedia架构。

Trimedia

Trimedia 是由Philips公司1996年推出的新一代媒体处理器(Media Processor)芯片。被1996年美国微处理器论坛(Micro-Processor Forum)推荐为多媒体处理器的佼佼者。它是一款针对实时处理音频、视频、图像和通信数据流的通用微处理器,它选用了强大、通用的超长指令字VLIW(Very Long Instruction Word)的CPU和内嵌式DSP(Digital Signal Processing)相结合的方案,同时包含分离的数据和指令cache(高速缓冲存储器),峰值计算速度可达40亿次/秒。

它的主要结构由下述几部分组成:可编程的VLIW CPU、专门的数据和指令cache、无缝的存储系统接口、高速内部总线(数据高速通路)、视频输入单元(Video In)、视频输出单元(Video Out)、音频输入和输出单元(Audio In/Out)、专用的协处理器:图像协处理器ICP(Image Co-Processor)及变长解码协处理器VLD(Variable Length Decoder)、I2C接口、同步串行接口SSI(Synchronous Serial Interface)及定时器等。

我们通常都会认为网络摄像机内部装有ARM或MIPS CPU,但实际情况并非如此。该模型以及DCS-5xxx系列的其他模型都具有TriMedia CPU,这是一个非常旧的CPU。为什么这很有趣?就我个人而言,这是一个新的体系结构,这很棒,因为我可以学习新事物。但是,关于TriMedia CPU的文档很少。

固件分析

开始分析新设备时,我要做的第一件事通常是从供应商的站点获取固件。固件的最新可用版本是A3 1.06(2009),但是我决定分析以前的版本v1.05,因为它是我在相机上安装的版本。

我会在固件映像运行binwalk,结果如下:

fastix@fastix-virtual-machine:~/dcs-5300$ binwalk dcs5300_firmware_105.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
978627        0xEEEC3         HTML document header
979192        0xEF0F8         HTML document footer
979238        0xEF126         HTML document header
995907        0xF3243         HTML document header
996327        0xF33E7         HTML document footer
997041        0xF36B1         HTML document header
997325        0xF37CD         HTML document footer
998169        0xF3B19         HTML document header
1000439       0xF43F7         HTML document footer
1000448       0xF4400         HTML document header
1000689       0xF44F1         HTML document footer
1000698       0xF44FA         HTML document header
1000743       0xF4527         HTML document footer
1007314       0xF5ED2         HTML document footer
1007323       0xF5EDB         HTML document header
1008041       0xF61A9         HTML document footer
1010780       0xF6C5C         HTML document footer
1010789       0xF6C65         HTML document header
1011723       0xF700B         HTML document footer
1011737       0xF7019         HTML document header
1012801       0xF7441         HTML document header
1013342       0xF765E         HTML document footer
1013438       0xF76BE         HTML document header
1017960       0xF8868         HTML document footer
1017969       0xF8871         HTML document header
1018032       0xF88B0         HTML document footer
1021031       0xF9467         HTML document footer
1025042       0xFA412         HTML document footer
1030588       0xFB9BC         HTML document footer
1034276       0xFC824         HTML document footer
1036344       0xFD038         HTML document footer
1038311       0xFD7E7         HTML document footer
1044539       0xFF03B         HTML document footer
1046711       0xFF8B7         HTML document footer
1047499       0xFFBCB         HTML document footer
1049110       0x100216        HTML document footer
1049897       0x100529        HTML document footer
1049906       0x100532        HTML document header
1050018       0x1005A2        HTML document footer
1050026       0x1005AA        HTML document header
1056592       0x101F50        HTML document footer
1060214       0x102D76        HTML document header
1060247       0x102D97        HTML document footer
1060755       0x102F93        XML document, version: "1.0"
1096400       0x10BAD0        Unix path: /usr/local/etc/zoneinfo
1103113       0x10D509        Base64 standard index table
1103407       0x10D62F        HTML document header
1103549       0x10D6BD        HTML document footer
1103557       0x10D6C5        HTML document header
1103691       0x10D74B        HTML document footer
1103699       0x10D753        HTML document header
1103857       0x10D7F1        HTML document footer
1106328       0x10E198        Microsoft Cabinet archive data, 278748 bytes, 1 file
1385220       0x152304        Certificate in DER format (x509 v3), header length: 4, sequence length: 964
1386188       0x1526CC        Certificate in DER format (x509 v3), header length: 4, sequence length: 1023
1387215       0x152ACF        Certificate in DER format (x509 v3), header length: 4, sequence length: 1215
1388434       0x152F92        Certificate in DER format (x509 v3), header length: 4, sequence length: 1269
1388593       0x153031        Digi International firmware, load address: 0x204D6963, entry point: 0x66742053,
1390788       0x1538C4        JPEG image data, JFIF standard 1.02
1392148       0x153E14        GIF image data, version "89a", 1 x 1
1392191       0x153E3F        GIF image data, version "89a", 1022 x 124
1424806       0x15BDA6        GIF image data, version "89a", 584 x 8
1426129       0x15C2D1        GIF image data, version "89a", 96 x 96
1431469       0x15D7AD        GIF image data, version "89a", 107 x 48
1432998       0x15DDA6        GIF image data, version "89a", 8 x 476
1434185       0x15E249        GIF image data, version "89a", 4 x 402
1434868       0x15E4F4        GIF image data, version "89a", 552 x 6
1436408       0x15EAF8        GIF image data, version "89a", 592 x 33
1440118       0x15F976        GIF image data, version "89a", 592 x 33
1445416       0x160E28        GIF image data, version "89a", 592 x 33
1450651       0x16229B        GIF image data, version "89a", 592 x 33
1455879       0x163707        GIF image data, version "89a", 107 x 48
1457575       0x163DA7        GIF image data, version "89a", 107 x 48
1459238       0x164426        GIF image data, version "89a", 107 x 48
1461378       0x164C82        GIF image data, version "89a", 107 x 48
1463544       0x1654F8        GIF image data, version "89a", 107 x 48
1465357       0x165C0D        GIF image data, version "89a", 107 x 48
1467138       0x166302        GIF image data, version "89a", 107 x 48
1468934       0x166A06        GIF image data, version "89a", 107 x 48
1470780       0x16713C        GIF image data, version "89a", 107 x 48
1472975       0x1679CF        GIF image data, version "89a", 107 x 48
1475212       0x16828C        GIF image data, version "89a", 107 x 48
1476772       0x1688A4        GIF image data, version "89a", 107 x 48
1478325       0x168EB5        GIF image data, version "89a", 107 x 48
1480001       0x169541        GIF image data, version "89a", 107 x 48
1481655       0x169BB7        GIF image data, version "89a", 107 x 48
1483360       0x16A260        GIF image data, version "89a", 107 x 48
1485155       0x16A963        GIF image data, version "89a", 107 x 48
1486785       0x16AFC1        GIF image data, version "89a", 107 x 48
1488409       0x16B619        GIF image data, version "89a", 107 x 48
1489931       0x16BC0B        GIF image data, version "89a", 107 x 48
1491372       0x16C1AC        GIF image data, version "89a", 107 x 48
1493089       0x16C861        GIF image data, version "89a", 107 x 48
1494774       0x16CEF6        GIF image data, version "89a", 45 x 62
1496151       0x16D457        GIF image data, version "89a", 45 x 62
1497544       0x16D9C8        GIF image data, version "89a", 592 x 33
1502797       0x16EE4D        GIF image data, version "89a", 592 x 33
1506569       0x16FD09        GIF image data, version "89a", 107 x 48
1508333       0x1703ED        GIF image data, version "89a", 107 x 48
1511052       0x170E8C        GIF image data, version "89a", 107 x 48
1512824       0x171578        GIF image data, version "89a", 58 x 34
1513950       0x1719DE        GIF image data, version "89a", 58 x 34
1515053       0x171E2D        GIF image data, version "89a", 107 x 48
1517167       0x17266F        GIF image data, version "89a", 107 x 48
1519329       0x172EE1        GIF image data, version "89a", 68 x 37
1521849       0x1738B9        GIF image data, version "89a", 68 x 37
1524424       0x1742C8        GIF image data, version "89a", 37 x 37
1525605       0x174765        GIF image data, version "89a", 37 x 37
1526826       0x174C2A        GIF image data, version "89a", 37 x 68
1529382       0x175626        GIF image data, version "89a", 37 x 68
1532007       0x176067        GIF image data, version "89a", 68 x 68
1536479       0x1771DF        GIF image data, version "89a", 68 x 68
1540151       0x178037        GIF image data, version "89a", 37 x 68
1542697       0x178A29        GIF image data, version "89a", 37 x 68
1545300       0x179454        GIF image data, version "89a", 37 x 37
1546541       0x17992D        GIF image data, version "89a", 68 x 37
1549014       0x17A2D6        GIF image data, version "89a", 68 x 37
1551567       0x17ACCF        GIF image data, version "89a", 37 x 37
1553024       0x17B280        HTML document header
1555494       0x17BC26        HTML document footer
1556564       0x17C054        HTML document header
1556598       0x17C076        HTML document footer
1556607       0x17C07F        HTML document header
1556720       0x17C0F0        HTML document footer
1556729       0x17C0F9        HTML document header
1557234       0x17C2F2        HTML document footer
1557742       0x17C4EE        GIF image data, version "89a", 82 x 40
1559960       0x17CD98        GIF image data, version "89a", 81 x 40
1562052       0x17D5C4        GIF image data, version "89a", 54 x 40
1564516       0x17DF64        Base64 standard index table
1565332       0x17E294        Base64 standard index table

从输出中可以看到,binwalk仅能识别一些HTML,XML和GIF文件。还有一些似乎是一些Base64索引表的证书,但是没有任何引导加载程序,内核或文件系统的迹象。通常,引导加载程序和内核映像通常位于固件映像文件的开头,但事实并非如此。

Binwalk还识别出一种称为“ Digi International固件”的东西,但是稍后我们将看到这只是一个误报。

binwalk能够识别一些从偏移量0xEEEC3开始的文件,其余的呢?我假设文件开头的二进制Blob被加密/压缩,或者两者都加密/压缩,所以我决定使用binwalk(“-E”和“ -B -E”选项)进行熵分析:

熵分析

熵加特征分析

通过观察这些图表,我们可以看到几乎第一个兆字节的数据有一个非常高的熵,而从变化来看,我们不能完全确定它只是被压缩或加密了。尽管我试图对熵做更详尽的分析,但我无法识别任何已知的算法或密码。此时,我确定我没有处理一个通用的固件映像。

此时,我尝试的最后一件事是查看字符串(字符串dcs5300_firmware_105.bin> output.txt),但是我没有找到任何可以提示我正在处理什么的东西。

因此,我暂时放弃了这种方法,我们将在稍后看到此二进制blob中包含的内容,并尝试了一些不同的方法。

寻找攻击面

接下来我试着去分析相机,看看是否有什么漏洞。

首先进行nmap扫描:

nmap -sV 192.168.1.0/24

Nmap scan report for 192.168.1.106
Host is up (0.0018s latency).
Not shown: 994 closed ports
PORT     STATE SERVICE        VERSION
21/tcp   open  ftp
23/tcp   open  telnet
80/tcp   open  http           D-Link Internet Camera
5001/tcp open  commplex-link?
5002/tcp open  rfe?
5003/tcp open  filemaker?
3 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at https://nmap.org/cgi-bin/submit.cgi?new-service :
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port21-TCP:V=7.60%I=7%D=11/7%Time=5A01C181%P=i686-pc-windows-windows%r(
SF:NULL,20,"220\x20DCS-5300\x20FTP\x20server\x20ready\.\r\n")%r(GenericLin
SF:es,34,"220\x20DCS-5300\x20FTP\x20server\x20ready\.\r\n530\x20access\x20
SF:denied\.\r\n")%r(Help,34,"220\x20DCS-5300\x20FTP\x20server\x20ready\.\r
SF:\n530\x20access\x20denied\.\r\n")%r(SMBProgNeg,34,"220\x20DCS-5300\x20F
SF:TP\x20server\x20ready\.\r\n530\x20access\x20denied\.\r\n");
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port23-TCP:V=7.60%I=7%D=11/7%Time=5A01C181%P=i686-pc-windows-windows%r(
SF:NULL,26,"\xff\xfd\x18DCS-5300\x20Telnet\x20Daemon\r\nPassword\x20:\x20"
SF:)%r(GenericLines,26,"\xff\xfd\x18DCS-5300\x20Telnet\x20Daemon\r\nPasswo
SF:rd\x20:\x20")%r(tn3270,26,"\xff\xfd\x18DCS-5300\x20Telnet\x20Daemon\r\n
SF:Password\x20:\x20")%r(GetRequest,31,"\xff\xfd\x18DCS-5300\x20Telnet\x20
SF:Daemon\r\nPassword\x20:\x20Password\x20:\x20")%r(RPCCheck,26,"\xff\xfd\
SF:x18DCS-5300\x20Telnet\x20Daemon\r\nPassword\x20:\x20")%r(Help,31,"\xff\
SF:xfd\x18DCS-5300\x20Telnet\x20Daemon\r\nPassword\x20:\x20Password\x20:\x
SF:20")%r(SIPOptions,94,"\xff\xfd\x18DCS-5300\x20Telnet\x20Daemon\r\nPassw
SF:ord\x20:\x20Password\x20:\x20Password\x20:\x20Password\x20:\x20Password
SF:\x20:\x20Password\x20:\x20Password\x20:\x20Password\x20:\x20Password\x2
SF:0:\x20Password\x20:\x20Password\x20:\x20")%r(NCP,26,"\xff\xfd\x18DCS-53
SF:00\x20Telnet\x20Daemon\r\nPassword\x20:\x20");
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port80-TCP:V=7.60%I=7%D=11/7%Time=5A01C181%P=i686-pc-windows-windows%r(
SF:GetRequest,10D,"HTTP/1\.1\x20401\x20Unauthorized\r\nWWW-Authenticate:\x
SF:20Basic\x20realm=\"DCS-5300\"\r\nContent-Type:\x20text/html\r\nServer:\
SF:x20D-Link\x20Internet\x20Camera\r\n\r\n\n\nProtected
SF:\x20Object\nProtected\x20ObjectThis\x20ob
SF:ject\x20on\x20the\x20server\x20is\x20protected\.\n")%r
SF:(HTTPOptions,6E,"HTTP/1\.1\x20405\x20Method\x20Not\x20Allowed\r\nAllow:
SF:\x20GET,\x20HEAD,\x20POST\r\nContent-Length:\x200\r\nServer:\x20D-Link\
SF:x20Internet\x20Camera\r\n\r\n")%r(RTSPRequest,6E,"HTTP/1\.1\x20405\x20M
SF:ethod\x20Not\x20Allowed\r\nAllow:\x20GET,\x20HEAD,\x20POST\r\nContent-L
SF:ength:\x200\r\nServer:\x20D-Link\x20Internet\x20Camera\r\n\r\n")%r(Four
SF:OhFourRequest,E8,"HTTP/1\.1\x20404\x20Not\x20Found\r\nContent-Type:\x20
SF:text/html\r\nServer:\x20D-Link\x20Internet\x20Camera\r\n\r\n\n\nObject\x20Not\x20Found\nObject\x20
SF:Not\x20FoundThe\x20requested\x20URL\x20\x20was\x20not\x20found\x20
SF:on\x20the\x20server\.\n")%r(SIPOptions,6E,"HTTP/1\.1\x
SF:20405\x20Method\x20Not\x20Allowed\r\nAllow:\x20GET,\x20HEAD,\x20POST\r\
SF:nContent-Length:\x200\r\nServer:\x20D-Link\x20Internet\x20Camera\r\n\r\
SF:n");
MAC Address: 00:0D:88:7E:35:B9 (D-Link)

相机提供以下服务:

HTTP服务器:用于管理网络摄像机,可以从Web界面启用HTTPS服务器,但默认情况下不启用。

FTP服务器:用于访问相机可以生成的屏幕截图和音频,这是访问多媒体文件的最简单的方法。

Telnet服务器:用于对摄像机进行更“高级”的管理。

一开始我还不确定其他三项服务的功能,但是经过谷歌搜索后,我可以发现一些有趣的东西:

1. RFE (TCP 5002)是指无线免费以太网;

2. 无线免费以太网(RFE)是一种网络音频广播系统,它由允许音频数据包在网络上传输的程序和工具组成。

3. 摄像机内置了麦克风,因此该服务可能用于广播捕获的音频。

4. Filemaker(TCP 5003)服务用于流式传输实时视频,这是一种RTP/RTSP服务,借助D-ViewCam应用程序,我们可以访问相机传输的音频和视频。通过请求video.vam文件,通过HTTP进行传输。

5. commplex-link (TCP 5001) 服务用于同步摄像机传输的音频和视频;

所有这些服务似乎都是定制的,我没有找到知名的HTTP,FTP等服务器的banner。

Telnet服务

连接到Telnet服务器时,必须指定密码。密码为“admin”,用户无法在Web界面或使用Telnet服务进行更改。

如果输入“帮助”,则会出现以下菜单:

DCS-5300 Telnet Daemon
Password : Authorized and start service
Supported commands :
        debug   : Dump debug information
        dinote  : Dump changed input status
        stop    : Stop dumping debug info and input status
        diquery : Dump current input status
        do1=h   : Set output 1 to high
        do1=l   : Set output 1 to low
        erase graph : Erase all graphics
        erase homepage : Erase custom homepage
        lock    : Lock network settings
        unlock  : Reset network settings
        clear   : Restore factory settings
        reset   : Restart system
        save    : Save parameters

我们有一个重置为出厂设置的选项,一个重置网络设置的选项,另一个重启摄像机的选项,以及一些调试选项。例如,“调试”选项显示以下信息:

TLN: Start debugging
SYS: MAC address = 00-0D-88-7E-35-B9
ETH: Activate Ethernet
ETH: Ethernet link speed is 100Mbps.
SYS: Ethernet is chosen
SYS: -----NET INFO-----
SYS: Host IP=192.168.1.106
SYS: Subnet Mask=255.255.255.0
SYS: Default gateway=192.168.1.1
SYS: Primary DNS server=186.56.20.66
SYS: Secondary DNS server=186.56.20.67
SYS: Video modulation is NTSC
SYS: No logo
TLN: Server starts up
FTP: Server starts up
SYS: No background
SYS: No custom homepage
H263 Encode Task start!
Audio Encode Task start!
comm res0:0
h263_control.dwBitRate=356000
WWW: Server starts up
Reboot Timer started
Reboot after 86400 sec = 1day 00hr:00min:00sec
SYS: System starts at 2017/11/07 12:01:54 in local time
[UPNPMiniServer] Bind at port 19815
UPnP started:0
[RpSendingServerPushResponse]
TLN: Xf00b
 -STOP-

我们有关于摄像头的网络设置信息(MAC, IP, DNS服务器),不同服务运行的状态。

通常,总是可以选择获得shell,但实际情况并非如此。这似乎是一个非常有限的(伪造)Telnet服务器,只有几个选项。如果映像固件文件中的grep字符串,你会发现一些有趣的事情:

SYS: -----NET INFO-----
SYS: Host IP=%s
SYS: Subnet Mask=%s
SYS: Default gateway=%s
SYS: Fail to set gateway
SYS: Primary DNS server=%s
SYS: Secondary DNS server=%s
192.168.0.99
Network Interface OK
DHCP proceeding
DHCP proceed failed
DHCP proceed OK
End of get IP loop
!!!!
SYS: Ethernet is chosen
SYS: Jump out NetTask
system.log
network.log
video@%04d%02d%02d%02d%02d%02d.jpg
video.jpg
EML: socket error
0000000%04d%02d%02d
TLN: Telnet is logged in as admin
TLN: Telnet rejects user
reset
help
pass
stop
debug
newweb
Restart Web %X
conn?
conn%02d %d %02d %08X    conn%02d %d %02d %08X
mess?
mess=%d
lock
Fail
unlock
save
clear
erase graph
erase homepage
dinote
diquery
DI1=H
DI1=L
setmac
setlanguage
iicw
iicr
(%02X, %01X)->%02X
hang
suicide
fanon
on ok
fanoff
off ok
ethernet
report
Unknown command:
 -WRAPPED-
 -STOP-
TLN: Connected
 by %s
Telnet timeout for no action

在我们看到的一些Telnet命令中,有些字符串似乎是其他“未记录”命令的一部分,例如“ fanon”和“ fanoff”,我想它们分别用于打开和关闭。还有一个有趣的命令叫“suicide”,用来重启摄像机。还有一个“newweb”命令,用于为web服务器创建新根。

FTP服务器

当连接到FTP服务器时(匿名是默认的连接类型,我们可以从Web界面设置用户和密码),就会得到以下信息:

在获得了FTP服务器的根后,这是我们唯一可访问的文件夹。另外,如你所见,我们能得到的文件并不多,大多数文件大小为0。

我们可以看到一个名为“flash.bin”的文件,该文件包含相机的文件系统,但我们无法下载它,其仅为写入权限,并没有访问权限。但是,我们确实可以访问config.ini文件。该文件包含摄像机的所有配置,包括Web界面凭据。因此,假设我们将来会遇到一个远程执行代码漏洞,那么此文件就是我们应该获得的文件。以下是“config.ini”文件的部分内容:

DCS-5300 Initial Configuration File

[SYSTEM]YesDCS-5300000D887E35B9PT31x2-DLNK-0105b2017/11/0712:19:12-3(0)admin
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
(15)
(16)
(17)
(18)
(19)
(20)(0)admin

目前,我们无法对FTP服务器做太多其他事情,它主要用于存储相机收集的所有媒体(截图、音频、视频)。

HTTP服务器

HTTP服务器使我们可以通过浏览器访问Web界面:

默认管理员用户为“ admin”,密码为空。如你所见,你可以在Web界面中对其进行更改。另外,你可以添加不同的用户并将其限制为使用I/O和PT功能。一件有趣的事是,有一个 'guest'帐户,用户名为 'demo' ,密码为空。该来宾帐户使我们可以通过快照访问视频流。不幸的是,从攻击者的角度来看,默认情况下该帐户是禁用的。但是,我在shodan.io中找到的某些摄像机已启用了演示帐户。

如今,如果你在Shodan之类的服务中搜索DCS-5300摄像机,你将不会得到太多结果。

如果你注意到在响应的“WWW-Authenticate”标头中使用的“realm”,你会看到如果你在固件镜像文件中使用grep,则网络会报告一个不同的“用户代理”服务器:

Web服务器报告的“用户代理”是Vivotek 网络摄像机VVTK使用的代理,但是否与Vivotek使用的Web服务器相同,我还不确定。因为它共享与某些Vivotek 网络摄像机几乎相同的CGI API。例如,这是Vivotek PT31x4 网络摄像机提供的WEB API(请选中“网络摄像机的URL命令”部分),而这是DCS-5300提供的。你看到相似之处了吗?

与许多其他情况一样,CGI程序是寻找漏洞的很好的起点,我们的目标是通过Web管理界面对摄像机进行未经身份验证的访问,该界面通常是互联网的公开部分。

<html>
<body onload="javascript:document.forms[0].submit()">
<form method="POST" name="form0" action="http://www.example.com/setup/security.cgi">
<input type="hidden" name="rootpass" value="your_pass"/>
<input type="hidden" name="confirm" value="your_pass"/>
</form>
</body>
</html>

但是,此漏洞要求用户登录到Web管理界面。那不是我们想要的,我们需要未经身份验证的访问。所以,我决定把所有可能的CGI程序列在D-Link和Vivotek 网络摄像机的文档中:

CGIs available in the Vivotek IP camera documentation
--

/cgi-bin/video.jpg requires admin access (Protected Object)
/cgi-bin/getdi.cgi requires admin access (Protected Object)
/cgi-bin/setdo.cgi requires admin access (Protected Object)
/setup/restore.cgi requires admin access (Protected Object)
/setup/reset.cgi requires admin access (Protected Object)
/setup/system.cgi object not found
/setup/security.cgi object not found
/setup/network.cgi object not found
/setup/ddns.cgi requires admin access (Protected Object)
/setup/mailftp.cgi object not found
/setup/video.cgi object not found
/setup/ptcamera.cgi requires admin access (Protected Object)
/setup/image.cgi object not found
/setup/app.cgi object not found

CGIs available in the D-Link IP camera documentation
--

/cgi-bin/sysinfo.cgi requires admin access (Protected Object)
/cgi-bin/admin/configfile.cgi requires admin access (Protected Object)
/setup/setmd.cgi requires the privilege of I/O access control (Protected Object)
/cgi-bin/camctrl.cgi requires camera control access privilege (Protected Object)
/cgi-bin/recall.cgi requires camera control access privilege (Protected Object)
/cgi-bin/senddata.cgi requires camera control access privilege (Protected Object) (Only for models with RS-485 port)

此外,该文档还列出了CGI程序使用的所有参考URL:

Homepage name Referenced URL
Client settings page /client.html
configuration page /setup/config.html
system option /setup/system.html
security option /setup/security.html
network option /setup/network.html
DDNS & UPnP option /setup/ddns.html
audio/video option /setup/video.html
camera control option /setup/ptframe.html
motion detection /setup/motion.html
image quality option /setup/image.html
application option /setup/app.html
system log /setup/logfile.html
system parameters /setup/parafile.html
set factory default /setup/factory.html

Vivotek文档中列出的大多数CGI程序在D-Link相机中都不可用,而可用的那些都需要进行身份验证。 D-Link的文档中列出的内容也会发生同样的情况,所有CGI程序都需要进行身份验证。在某些其他Vivotek 网络摄像机模型中,其中一些CGI过去曾受到不同漏洞的影响,例如标记为CVE-2013-1594,getparam.cgi和parafile.html页面的漏洞。

为了确保我没有错过任何CGI程序,我对固件映像文件做了grep,检查了所有内容:

似乎我们找不到任何未经验证的CGI。

然后,我花了一些时间使用Burp Suite和某些CGI程序,以查看是否可以找到身份验证后漏洞(主要是远程命令执行)来访问内部文件系统,并以此方式访问CGI二进制文件。我尝试了最常见的问题,例如路径遍历,在DDNS,NTP,config之类的位置进行分号注入,但是由于缺少输出,我不确定命令是否成功。为了深入了解,我打开了摄像机的内部。

探索硬件

我决定打开相机,希望找到一个像UART之类的接口,以便能够通过外壳访问文件系统。相机有两个PCB。最大的组件具有我们可以在此类设备中找到的几乎所有有趣的组件(CPU,RAM,闪存等),而最小的组件则具有一些用于PTZ功能的芯片。

点此查看最大的PCB正面的图片

在这张图片中,我们可以识别出以下组件:

· SDRAM:华邦W9812G2DH-7 SDRAM

· 闪存:16 MB MX29LV160BBTC-90

· WiFi /以太网:RTL8100BL

· EEPROM:Altera EPM3032A

· 视频解码器:飞利浦SAA7113H

我们拥有128 MB的RAM,WiFi /以太网功能,16 MB的闪存,小型视频解码器和EEPROM芯片。

点此查看PCB背面的图片

在这张图片中,我们可以看到只有一块大芯片被标识为Philips TriMedia PNX1300EH(32位处理器),这是这篇文章的研究对象,我们将有一个专门的章节专门讨论它。

点此查看第二块PCB的图片

在这张图片中,我们可以看到一个Winbond W78E54BP-40和两个Allegro A3967SLBT芯片,所有这些东西都用于相机移动擎并使某些LED闪烁的装置。

如你所见,这款相机中的大多数硬件是任何人都希望在这种设备中找到的。它没有什么特别之处,除了CPU不是你今天在销售的网络摄像机中通常看到的,大多数都使用ARM或MIPS CPU。

在详细介绍TriMedia CPU之前,让我们先讨论一下此设备上的引脚排列。

查看这张图片,即最大的PCB正面的图片,我们可以看到两个有趣的引脚排列

可以看到有10个标有红色矩形的引脚和12个标有黄色矩形的引脚,乍一看,它们看上去都不错,但10个引脚距离主CPU有点远,并且没有可见的痕迹。取而代之的是,这12个引脚确实靠近主CPU,并且似乎在该方向上走线。如果我们阅读数据手册,特别是第18章“ JTAG功能规范”,我们可以看到TriMedia CPU具有JTAG接口。

这些都是好消息,但是我们必须确定正确的引脚排列。这并不总是一件容易的事,但是,我的第一种方法是尝试使用电压表对引出线进行逆向工程,如下所述,一段时间后,我得出以下结果:

P1:电压波动:0,94-1,14-2,x-3,46(TX?);

P2:电压波动:2,x-3,46(几秒钟后,稳定在3,46)(RX?);

P3/P4:固定电压:3.29;

P5/P7/P11:电压波动:3,27-3,29-3,30;

P9:固定电压:1,79;

P6/P8/P10/P12:GND。

即使获得了有关信号性质的一些信息,但我们也无法通过电压表获得过多的详细信息。在这种情况下,我们需要的工具是一个示波器。使用示波器,你可以检查信号的基本性质(VCC,GND,上拉线,数字信号)并猜测其参数,比如最大电压,频率等。那时,我手里没有那个工具,只装备了一个电压表和一个总线海盗(Bus Pirate),BusPirate 是由Dangerous prototypes 设计出品的一款硬件黑客方面的瑞士军刀,支持多项常见协议并可跨平台Windows/Linux/MAC,并拥有丰富的帮助文档。。即使可以使用Bus Pirate来构建廉价的示波器,带宽和采样率也不是很好(每秒5720个采样;实际上,可测量的最大频率约为1kHz)。最后,为了继续进行这项工作,我购买了PicoScope 2204A,详情我会在下面讲到。

总结

本文,我介绍了Philips TriMedia架构。我以网络摄像机为切入点,谈论如何研究一个基于TriMedia的设备,并介绍了软件和硬件有哪些公共信息资源、有多少公共信息资源,以及如何处理其神奇的ASM。

下文,我将深入探讨TriMedia架构。

飞利浦TriMedia CPU

TriMedia微处理器最初由飞利浦制造,目前名为NXP(Nexperia)半导体(高通公司于2016年宣布收购NXP)。它是VLIW(超长指令字)处理器家族,这意味着它们可以使用哈佛架构同时并行执行给定数量的指令,其主要用途是用于DSP(数字)信号处理)。

一开始,TriMedia处理器的名称是“PNX”,后来改为“TM”。

TriMedia微处理器运行一个实时操作系统,称为pSOS。此外,也有人尝试将2.6 Linux内核分支移植到TriMediacpu上运行。

另外,如果你想使用该处理器,还有一些配备TriMedia CPU的开发板,例如Streaming Networks提供的TriREF开发板。但是,这种包括IADK的板并不便宜。实际上,我联系了Streaming Network并向他们要了TriREF板,大约为5000美元,太贵了,我买不起。

在撰写本文时(2019年1月),我又有了其它选择,但其中不包括SDK。

在本文中,我将主要使用TriMedia PNX1300EH微处理器。

逆向TriMedia CPU的信息源

对TriMedia处理器进行逆向工程并不是一件容易的事,主要是由于缺少相关文档和工具。 互联网上关于TriMedia体系结构的文档很少,指令集文档很少,并且现有工具私有且昂贵。无论如何,我们可以使用一些旧的信息资源来开始我们的逆向工作。

开始研究的第一条信息来源是数据表,本文档包含有关处理器所有体系结构的信息。我们可以了解芯片中不同组件的主要思想,它们之间的相互作用方式,控制器使用的特定指令集等。如果你要从右边的引脚入手,则必须阅读数据表。

现在我们谈论JTAG,在上一节中,我提到了Monumental Data System提供的用于TriMedia CPU的JTAG PCI调试器。飞利浦还提供了一个官方的JTAG调试器,但是它比较特殊。TriMedia JTAG工具仅设计用于专有的JTAG电缆。 “电缆”实际上是一种复杂的编程设备。它是一个通过NetChip NET-2282外围控制器连接到PC的USB设备。编程器从其自己的EEPROM启动,并由带有NOR闪存和DRAM内存的Philips PNX1502 CPU驱动。

显然, IDA工具必不可少。 IDA从4.x版本(特别是4.21版本)开始就支持TriMedia CPU。

New features in version 4.21 (19/04/2002)
Processors
Trimedia (upon special request only)
[..]

如上所述,处理器模块仅在有特殊要求时才可用。我从HexRays请求了处理器模块,但他们不再提供。

接下来,我将讨论TriMedia架构本身。

TriMedia PNX1300EH CPU

在本文中,我将不对CPU上的每个组件进行非常详细的描述,因为这没有任何意义。该处理器的最高速度为143MHz,可在2.5V电压下工作。它的内核称为DSPCPU,是通用的32位CPU,它还实现了某些媒体标准,例如MPEG-1和MPEG-2。以下是PNX1300的所有组件的框图:

我们已经看到DSPCPU使用了VLIW指令集,这使得每个时钟周期可以同时执行5个操作。 DSPCPU具有不同的“issue插槽”,总共五个,每个“issue插槽”具有不同数量的“功能单元”,总共27个,每个指令中包含的每个操作都可以将其作为目标。由于每个VLIW指令编码5个独立的操作,相对于其他指令,理解每个指令有点困难,跟踪控制流并不容易。

关于PNX1300的寄存器模型,它有128个32位通用寄存器,从r0到r127。在这128个寄存器中,有两个具有固定值。它们是分别包含整数值0和1的r0和r1,且主要用作布尔值TRUE或FALSE,不允许程序员写入r0或r1。

还有一个用于程序计数器(PC)的寄存器和四个特殊寄存器:PCSW(程序控制和状态字),DPC(目标程序计数器),SPC(源程序计数器)和CCCOUNT(自复位以来的时钟周期计数)。 PCSW通常用作包含标志的寄存器,例如32位和64位Intel平台中的EFLAGS和RFLAGS。重要的是要说明PNX1300 CPU具有可切换的bytesex(单位)。通过将BSX标志(位大小)写入PCSW寄存器,由软件完成bytesex切换。这意味着可以在同一执行中找到小端字节排序和大端字节排序。例如,加载和存储操作会观察PCSW寄存器中的BSX标志,以了解该操作应按小端还是大端顺序进行。如果BSX标志等于1,则使用小端字节排序。如果BSX标志为0,则使用大端字节排序。

DPC和SPC是用于异常处理的寄存器, CCOUNT寄存器是PNX1300中唯一的64位寄存器,用于循环计数,它计算自上次重置事件以来的时钟周期。

关于内存和MMIO,如数据表中所述,PNX1300在32位地址空间中定义了四个孔:内存孔,DRAM,MMIO和PCI孔。 DRAM从DRAM_BASE中指定的地址映射到DRAM_LIMIT寄存器中的地址。最大大小为64 MB。 MMIO位于MMIO_BASE处,固定大小为2 MB。 DRAM和MMIO的值是在BIOS引导时设置的。内存孔从地址0映射到0xFF,因此为256个字节。最后,所有未标记为DRAM,MMIO或内存孔的空间都应考虑在PCI孔中。以下是PNX1300中的内存映射图:

现在,让我们进入困难的部分。因为,我将尝试向你解释TriMedia ASM

TriMedia ASM及其指令集

我不了解其他VLIW处理器,因为这是我处理过的第一个处理器。Trimedia处理器是具有多个功能单元的VLIW处理器,你可以在一个指令字中最多进行5个操作。我可以证明,TriMedia ASM的功能非常的优秀。举个例子,下面是来自TM32处理器的一些程序集:

(* instruction 0   : 224 bits (28 bytes) long *)
(* offset          : 0x00000000 *)
(* bytes           : 00 18 4c 0c c0 80 c0 81 c3 80 c0 b5 c0 81 02 00 12 00 8c 00 20 90 40 40 40 20 a0 d0 *)
(* format bytes    : 0x0018 & 0xff03 = 0x0000, format in little endian bit order: 00 00 00 00 00  *)
   IF r1   uimm(0x61a618) -> r0,               (* 42 bits: 0 02 30 c0 0c 4c *)
   IF r7   ijmpi(0x90030001),                  (* 42 bits: 2 40 81 81 c0 80 *)
   IF r2   fadd r67 r1 -> r32,                 (* 42 bits: 1 01 02 c0 80 c3 *)
   IF r10  bitand r64 r3 -> r16,               (* 42 bits: 0 81 02 02 81 c0 *)
   IF r1   uimm(0xd0060024) -> r0;             (* 42 bits: 3 42 83 00 12 00 *)

与其他体系结构中的许多其他汇编语言一样,TriMedia ASM包含有关数学运算(整数和浮点),逻辑,加载和存储数据,分支等的指令;特殊之处在于,所有操作最多可以并行执行五个。每个操作都有其自己的功能单元,该功能单元基本上是CPU中用于分配某些操作组的预定义插槽。

数学整数操作进入“alu”单元,控制流操作进入“branch”单元,直接操作进入“const”单元,依此类推;根据数据表,PNX1300最多具有27个功能单元。

使TriMedia ASM难以理解的是其编码方案,指令被压缩在一个可变大小的流中,解压单元负责在指令被发送到CPU之前展开它们。

让我们以第一条指令为例:

IF r1   uimm(0x61a618) -> r0

你可以看到一个“IF”语句,位于真正的助记符之前,后面是“r1”寄存器字符串。所有这些意味着这是一个“受保护的”指令。 TriMedia CPU中的所有操作都可以受到保护(可选),受保护的操作有条件地执行,具体取决于“保护”寄存器的值。在此特定示例中,这意味着“ r1”(保护寄存器)寄存器控制uimm操作的执行(uimm操作将无符号的32位操作码修饰符n写入rdest)。如果r1寄存器为“真”,则将值0x61a618移入r0寄存器。但是,在这种情况下,反汇编程序的输出会出现不一致的情况。根据官方文档,iimm和uimm指令不受保护,因此,在这种情况下,我们可以假定无论r1寄存器的值是多少,值0x61a618都将存储到r0寄存器中。

另一个要强调的重要事项是寻址模式,下表中总结了这些寻址模式:

在这些寻址模式中,R[i]表示一个通用寄存器。所应用的比例因子(1/2/4)等于加载或存储的项目的大小,即,对于字节操作为1,对于16位操作为2,对于32位操作为4。有效的“ i”, “ j”和“ k”值的范围在体系结构的实现之间可能有所不同。 “ i”和“k“参数的值可以介于0到127之间。“ j”参数的值可以介于-64和63之间。例如, ‘ld32d(–8) r3’从地址 (r3 – 8))加载一个32位值。

现在,如何对所有这些操作进行编码?

TriMedia ASM压缩方案

注意事项

我们需要学习的第一件事是区分“指令”和“操作”,TriMedia CPU中的每个指令最多可以有5种不同的操作。这些操作中的每一个都可以属于27个不同的功能单元中的任何一个,并被分配到相应的issue插槽中。TriMedia 32位CPU具有5个issue插槽。每个issue插槽代表CPU中处理每个操作的位置,并附加了适当功能单元类型的实例。

值得注意的是TriMedia CPU并不是唯一实现VLIW体系结构的CPU。还有其他诸如SHARC或C6000处理器之类的(或少于)5个issue插槽。

每个指令的长度将根据每个操作的大小而变化,TriMedia操作大小可以为26、34或42位。正如我们已经看到的,这些操作可以是保护的,也可以是不保护的,可以是零值的,一元的,也可以是二进制的(0,1或2个操作数),可以是无结果的,还可以包含直接参数(7位或32位)。惟一未压缩的操作是分支。每个操作都伴随着一些称为“格式位”的位,这些位包含有关操作的附加信息。指令的格式位位于先前指令中。由于TriMedia CPU每条指令有5个操作,这意味着我们总共有10个格式位(5个操作中的每一个有2个),因此,一个字节加上2个字节被使用。

格式位对于理解指令的编码非常重要,我们已经说过,在Trimedia CPU中,我们有5个issue插槽,这给了我们10个格式位。格式位将以矩阵表示法称为Format [j],其中j是位数。位Format [2i]和Format [2i + 1]给出有关issue插槽i的格式信息,其中0 <= i <= N。下表(表1)中解释了格式位的含义:

可以看出,操作对应于从左到右排列的issue插槽。

例如,如果Format = {1,1,1,1,1,0,1,0,1,0},则该指令包含三个34位操作({1,0},{1,0},{ 1,0})。

如上所述,操作可以具有26、34和42位。 26位操作被分解为2位部分,并与格式位和24位部分一起存储。 34位操作分为2位部分,24位部分和1个字节扩展名。 42位操作分为2位部分,24位部分和两个字节扩展名。这意味着使用五个42位操作加上10个格式位,我们可以拥有的最大指令大小为28个字节(224位)。如果进行数学运算,你将看到42位* 5个操作= 210位-> + 10个格式位= 220位= 27.5个字节,但是由于指令是按字节对齐的,因此我们必须添加四个填充位才能总共有28个字节。

此外,在指令的末尾有一个字节对齐的可选8位或16位操作扩展组,每个扩展都是字节对齐的。如果需要的话,这些扩展位用于将操作的大小从基本的26位扩展到34位或42位。

以上我们介绍了TriMedia架构,下文我们会接着介绍有关反汇编TriMedia代码的一些问题。

下文:

未翻译

Previous路由器命令执行Next从Microsoft Band以及 Hello Sense 设备中提取自己的历史数据

Last updated 3 years ago

到目前为止,唯一已知的漏洞,或者至少我唯一能找到的漏洞,是 ,它是/setup/security.cgi应用程序中的CSRF,,在这个程序中,通过身份验证的用户可能会被骗去跟踪一个链接,从而劫持管理员帐户。以下是此漏洞的PoC:

顺便提一句,提供了一个用于TriMedia微处理器的JTAG PCI调试器,可用于调试在此CPU上运行的代码。我不确定在这种情况下是否有用,但是很高兴知道我们还有更多选择。

为了编写TriMedia微处理器的代码,需要用官方的SDK,它包含了你需要的所有东西(库、编译器、调试器、模拟器等),但是除了那些销售使用TriMedia处理器的大公司(例如D-Link和2Wire)之外,它是不可用的。但是,有一些兼容TriMedia的SDK,如提供的IADK(集成应用程序开发工具包),专门为PNX1300系列设计。

尽管专门针对JTAG研究,但另一个很好的信息来源是。即使该博客不再可用,仍然有一些副本存储在web.archive.org中。这个家伙在反转基于TriMedia CPU的2Wire路由器方面做得非常出色,并创建了一些出色的工具,例如(基于urjtag,它是用于2Wire路由器和tm32dis的JTAG wiggler工具),这是TM32系列的TriMedia反汇编程序。

最后,在这项研究期间,我收集了有关TriMedia(文档、工具)的各种信息,并将其存储在中。

为了理解TriMedia指令是如何编码的,我查看了我能找到的唯一文档,即文档。另外,我使用了前面提到的TM32反汇编程序工具,以某种方式验证了我在文档中所读的内容。更好的解决方案是获得SDK或开发板,以编译一些代码并使用官方工具反汇编/调试它。

CVE-2012-5319
https://blog.quarkslab.com/resources/2019-01-03_reversing-trimedia-part-1/dcs-5300-front.jpg
Monument Data Systems
Streaming Networks
http://hackingbtbusinesshub.wordpress.com
2wiglet
github
“用于产生VLIW指令压缩的美国专利5787302软件”
https://blog.quarkslab.com/reverse-engineering-a-philips-trimedia-cpu-based-ip-camera-part-3.html