[转帖]揭秘VxWorks——直击物联网安全罩门
揭秘VxWorks——直击物联网安全罩门
一遍不错的文章,转过来分享给大家,原文链接见文末,欢迎大家讨论。

VxWorks是美国风河(WindRiver)公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。
VxWorks支持几乎所有现代市场上的嵌入式CPU,包括x86系列、MIPS、 PowerPC、Freescale ColdFire、Intel i960、SPARC、SH-4、ARM,StrongARM以及xScale CPU。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的F-16、F/A-18战斗机、B-2隐形轰炸机和爱国者导弹上,甚至连一些火星探测器,如1997年7月登陆的火星探测器,2008年5月登陆的凤凰号,和2012年8月登陆的好奇号也都使用到了VxWorks。——摘自《维基百科》
046K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6*7K9q4)9J5k6i4N6A6K9$3W2H3k6h3c8A6j5g2)9J5k6h3!0J5k6#2)9J5c8Y4N6A6K9$3W2Q4x3V1k6h3P5q4N6G2M7X3E0K6

正因为VxWorks操作系统的开放性、模块化和可扩展性的系统结构特征以及能在多线程、多任务的系统环境中达到高实时要求的PLC控制要求,在保证实时性的同时,实现多点位、复杂功能的PLC系统控制目标,因此被广泛用于物联网嵌入式设备及工业控制领域。西门子、施耐德的多款PLC设备软件搭载在VxWorks系统上运行。
来看下CVE公布的VxWorks相关漏洞:

对于一款被广泛应用的操作系统,CVE漏洞能控制在这个数量可以说安全做得已经挺好了。最新的7.0系统又做出了很多针对安全的功能,更是提出了应用程序加密这样的安全模式,任何一个系统应用在运行前需要做哈希验证,这样能极大程度减少恶意软件和木马的植入对于系统带来的威胁。
难道说搭载风河VxWorks系统的嵌入式设备真的就无懈可击了?我要告诉你,在系统以及网络层我们还是能做很多事情的。
先来简单了解下该系统。

这是我在Vmware上运行的基于Pentium架构的VxWorks 5.5.1版本系统,虽然不是最新版本,但用于了解系统的工作方式,做一些基本的测试已经足够了,而且本身大部分加载VxWorks系统的设备也并不是最新的,低于此版本的设备也不在少数。
在虚拟机上运行VxWorks5.5系统并通过tornado软件进行调试总的过程需要如下几步:
编译网卡驱动
修改系统配置文件
编译bootrom并加载到启动磁盘
编译VxWorks镜像
用FTP把系统镜像传到虚拟机里
配置target server来调试系统以及应用
如果对于嵌入式系统没有基础那么这几步还是挑战很大,因此网上能找到已经编译好的针对vmware的系统镜像以及VxWorks BSP文件。这极大得降低了研究的门槛,我们只需要进行相应的配置再通过系统专门的集成开发环境tornado 2.2就可以展开对于VxWorks系统的入门级研究。当然这只是入门级研究环境,对于熟悉系统工作原理和网络栈已经可以满足,但是如果要研究系统底层安全性如溢出、shellcode那就需要真实的系统以及针对性的指令架构。
另外推荐两款搭载VxWorks系统的设备,也可以针对真实的设备进行研究。第一款为经典的思科Linsys54g路由器,这款路由出厂内置VxWorks5.5系统,很多对于固件的逆向都是从这款路由的固件入手的,通过接入板子串口可以拿到系统boot shell,但我在尝试时系统运行不到VxWorks shell,会报一个网络配置的错误,有兴趣的朋友可以一起研究下,如果知道怎么解决可以和我联系。另外一款设备是华为的UAP2105 UMTS是一款家庭使用的小型蜂窝基站。这款设备在2015Blackhat上被爆出多个漏洞,可以通过JTAG接口拿到VxWorks shell,并且可以通过远程调试端口进行访问。
在做了如上准备工作后,我们就可以开始对于VxWorks系统的安全性进行探秘了。
我们先来直观的感受下这个系统,来看下VxWorks系统的shell,这是可用的基本命令,和我们熟悉的Linux Bash区别还是很大的。


其中还包括输入输出、调试、文件系统、网络等一些具体的命令。我们注意到这个系统的shell具有一些针对于任务(task)的操作命令以及可以修改内存的命令,可以说权限是相当大的。看下当前任务状态,我们就可以感受到实时操作系统的特点了。

有兴趣可以去自己了解,这里不做详细介绍。
我们来用nmap做下端口扫描,结果如下:

可以看到系统支持了多种标准网络协议进行通信,我们主要来针对wdbrpc调试端口进行hack。
什么是Wdbrpc?
wdbrpc是VxWorks的远程调试端口,以UDP方式进行通信,端口号为17185。协议基于sun-rpc。该服务主要用于支持系统远程通过集成开发环境Tornado交互。

通过Tornado开发环境软件可以进行应用程序代码编写、上传到设备、远程调试、rom烧录等一系列功能。支持通过wdbrpc、wdbpipe、wdbserial等不同的连接交互方式。

Vxworks系统将一起与硬件相关的模块都放在BSP库中。BSP库是硬件与软件的接口,处理硬件的初始化、中断处理与产生、硬件时钟与定时管理、局部和总线内存空间的映射、内存大小定义等等。能够自行启动目标设备、初始化目标设备,能够与host通信下载系统内核,将系统权限交由Vxworks内核来调用应用程序等功能。
因此该通信端口权限十分大,然后并没有身份认证与传输加密机制。该通信接口为远程攻击设备提供了无限可能。
通过以上简单了解,我们需要深入了解wdbrpc通信协议,然而网上并没有官方详细的协议说明,只有在风河开发文档中简单涉及一些协议说明。
Rapid7曾在2010年8月发表博客《Shiny Old VxWorks Vulnerabilities》其中说明了wdbrpc端口的问题并且给出了当时的统计报告以及4个metasploit攻击模块。因此我们可以从模块入手进行分析。
96fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0L8$3#2E0N6h3&6A6N6s2W2Q4x3X3g2J5j5i4m8A6k6o6N6Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3#2E0N6h3&6A6N6s2W2Q4x3V1k6E0k6i4c8S2M7%4m8D9L8$3W2@1i4K6u0r3j5X3I4G2k6#2)9J5c8U0t1H3x3e0m8Q4x3V1j5H3z5q4)9J5c8U0l9J5i4K6u0r3M7$3S2A6L8Y4W2Q4x3X3c8G2L8r3c8Q4x3X3c8$3P5s2N6G2M7X3E0K6i4K6u0V1N6Y4g2D9L8X3g2J5j5h3u0A6L8r3W2@1K9h3g2K6

包括wdbrpc_version、wdbrpc_bootline、wdbrpc_reboot、wdbrpc_memory_dump。分别提供远程获取系统版本号信息、获取bootline信息、远程重启系统以及远程dump内存。

通过对虚拟机远程设备进行尝试,可以看到我们能从wdbrpc端口上轻松获取到系统版本号以及bootline启动配置信息。通过wireshark我们在仔细看下协议过程。

可以看到协议内容并无加密,但是wireshark也不能解析该协议,因此攻击手段也将受限,wdbrpc提供的功能很多并且权限很大,但目前也只能通过这四个攻击模块进行攻击。初步尝试还发现获取系统版本号可以直接通过重放进行攻击,然而要是获取bootline信息或远程dump内存并不能简单的重放,协议的交互过程还是具备初始化等步骤。因此我们还是需要进一步深入了解该协议。
Vxworks开发文档上有如下对于wdbrpc协议请求和响应的说明:

这是一个请求数据包的格式,其中20字节IP头,8字节UDP头,40字节wdbrpc头,其中包含WDBPROG为4字节固定为0x55555555、WDBVERS为4字节(0x00000001)以及RPC调用编码。XDR stream为调用参数信息。
RPC请求数据头具体如下:

RPC请求参数wrapper部分具体如下:

建立连接的通信过程为,host首先给target发送一个Connect请求,收到回应包后,即可发送Fanc_call数据包。Connect请求的Procedure字段为0x00000001,data字段需要填充具体的调用参数为0x00000002,0x00000000,0x00000000。
远程内存读取的通信过程为,在建立连接的基础上发送以0x0000000A为Procedure、以offset/length/params为具体参数的data,即可收到相应内存地址上的数据。具体内容可
以通过阅读源码了解${WIND_BASE}/share/src/agents/wdb/wdb.h

399K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4G2k6r3g2X3L8%4u0Y4k6g2)9J5k6h3y4F1i4K6u0r3M7X3g2S2k6q4)9J5c8U0R3J5z5o6b7@1i4K6u0r3N6$3c8T1i4K6u0W2K9q4)9#2k6W2)9#2k6X3S2@1L8h3H3`.
今后会在Github上公布关于VxWorks系统攻击的python源码,敬请期待。
https//github.com/ameng929/VxworksHack
当我们具备了wdbrpc协议的基础,我们就可以通过该协议对Vxworks系统设备进行远程攻击了。列举几种简单的攻击方式:
一、篡改bootline绕过登录验证
首先看下ARM架构下的系统内存布局:

其中0x0700到0x0800地址之间存放Bootline配置信息。如果系统架构为x86那么对应地址将从0x1200开始。

我们可以通过wdbrpc远程修改内存地址数据令其以0x20方式启动,这样就可以绕过登录认证通过ftp或telnet访问系统。

二、Dump内存数据从中抓取登录密码
以一个远程昆腾PLC为例,通过wdbrpc协议dump全部内存空间数据。

10分钟后就拿到了远程设备约15M左右的完整内存数据。

可以看到ppc架构指定位置上的bootline信息,再通过string命令抓取内存文件中的字符串数据。
再通过这样一个正则就轻松的找到了内存中的所有ftp、telnet登录密码:
cat strings.memory.dmp |grep -n "[RSbcdeyz9Q]\{9\}"

具体为什么正则要这样写以及这个hash密码如何利用,请看我之前的文章《邪恶的0x4321》。
现在可以回答之前文章的问题了,0x4321即为wdbrpc的端口号17185的16进制格式。
下面交给Z-one大神 (⊙.⊙)
以下是全球暴漏在IPv4公网上的17185端口统计分析:

7e8K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4m8D9j5%4y4U0j5h3&6Q4x3X3g2G2M7X3N6Q4x3V1k6D9j5h3u0Q4x3V1k6U0k6h3&6K6N6i4y4Q4x3V1k6$3P5s2N6G2M7X3E0K6i4K6u0r3
通过Zmap调用wdbrpc-scan脚本扫描全网暴漏端口IP数约5万+,其中3.4万能读取到系统信息和bootline信息。
数量按国家分布Top10:
中国: 7861
美国: 5283
巴西: 3056
意大利: 1025
日本: 823
俄罗斯: 647
墨西哥: 505
哈萨克斯坦: 486
澳大利亚: 481
印度: 448
数量按VxWorks系统版本号统计:
VxWorks5.5.1 15601
VxWorks5.4.2 6583
VxWorks5.4 5410
VxWorks5.4.2 5254
VxWorks5.5 899
VxWorks 654
VxWorks5.3.1 236
数量按设备信息统计Top10:
Telogy Networks GG30E Reference Board 3674
TI TNETV1050 Communication Processor 3360
Motorola MPC82xx ADS - HIP7 2626
IP-ADSL DSLAM (MPC860/855T) 1972
HUAWEI ET&IAD 1796
MPC8245Board: EDSL , Map B (CHRP) 1678
PowerPC 875, 133MHZ 1553
Mips 4KEc 1239
MGCB 912
Intel IXP425 - IXDP425 BE 887
其中受影响的PLC模块型号:
罗克韦尔Rockwell Automation 1756-ENBT固件版本为3.2.6、3.6.1及其他
西门子Siemens CP 1604、Siemens CP 1616
施耐德Schneider Electric 昆腾部分以太网模块
另外通过Shodan和Zoomeye搜索“vxworks”Dork的数量对比:
知道创宇-ZoomEye:
FTP 77,123
Telnet 10,795
SNMP 133
Shodan:
FTP 26,212
SNMP 17,261
Telnet 4,735
以下的数据由Z-one提供,未经允许不得引用。

搞物联网安全的黑阔们又可以疯狂了。
原文链接:369K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3y4Z5N6h3q4F1M7$3!0F1k6#2)9J5k6h3#2W2i4K6u0r3L8W2)9J5c8U0p5^5y4U0b7K6x3K6V1`.