zoukankan      html  css  js  c++  java
  • 揭秘VxWorks——直击物联网安全罩门

     
    转载:http://chuansong.me/n/1864339

    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。——摘自《维基百科》

    https://zh.wikipedia.org/wiki/VxWorks

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

    来看下CVE公布的VxWorks相关漏洞:


    对于一款被广泛应用的操作系统,CVE漏洞能控制在这个数量可以说安全做得已经挺好了。最新的7.0系统又做出了很多针对安全的功能,更是提出了应用程序加密这样的安全模式,任何一个系统应用在运行前需要做哈希验证,这样能极大程度减少恶意软件和木马的植入对于系统带来的威胁。

    难道说搭载风河VxWorks系统的嵌入式设备真的就无懈可击了?我要告诉你,在系统以及网络层我们还是能做很多事情的。

    先来简单了解下该系统。


    这是我在Vmware上运行的基于Pentium架构的VxWorks 5.5.1版本系统,虽然不是最新版本,但用于了解系统的工作方式,做一些基本的测试已经足够了,而且本身大部分加载VxWorks系统的设备也并不是最新的,低于此版本的设备也不在少数。

    在虚拟机上运行VxWorks5.5系统并通过tornado软件进行调试总的过程需要如下几步:

    1. 编译网卡驱动

    2. 修改系统配置文件

    3. 编译bootrom并加载到启动磁盘

    4. 编译VxWorks镜像

    5. 用FTP把系统镜像传到虚拟机里

    6. 配置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攻击模块。因此我们可以从模块入手进行分析。

    https://community.rapid7.com/community/metasploit/blog/2010/08/02/shiny-old-vxworks-vulnerabilities


    包括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

    http://www.codeforge.cn/read/82844/wdb.h__html

    今后会在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端口统计分析:

    http://plcscan.org/lab/census/vxworks/

    通过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提供,未经允许不得引用。


    搞物联网安全的黑阔们又可以疯狂了。

    Make some noise~。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚

  • 相关阅读:
    docker 删除所有的 docker ps -a 记录
    使用ES6的Promise完美解决回调地狱
    linux查看历史命令history
    linux命令补全 忘记命令只记得开头
    linux更改shell
    java信号量PV操作 解决生产者-消费者问题
    eclipse代码自动提示功能设置
    linux下mysql修改数据库账户root密码
    IntelliJ Idea12 破解码与中文乱码配置
    linux usermod修改用户所在组方法
  • 原文地址:https://www.cnblogs.com/blacksunny/p/7208637.html
Copyright © 2011-2022 走看看