从 0 开始学习 VxWorks

在开始之前,让我们来回顾一下什么是实时操作系统,什么是分时操作系统。

实时操作系统(RTOS)是一种专门设计用于满足实时应用程序需求的操作系统。实时应用程序对任务的响应时间要求非常高,必须在严格的时间限制内完成。

分时操作系统是一种多任务处理系统,它通过在多个任务之间切换执行,为每个任务分配时间片。分时系统的目标是在多个任务之间共享处理器时间,以提高系统的整体吞吐量和资源利用率。

两者的主要区别包括:

  1. 响应时间要求:
    • 实时操作系统: 具有对任务响应时间的硬实时要求,即任务必须在预定的时间内完成。
    • 分时操作系统: 没有硬实时要求,任务的完成时间可以相对灵活,系统主要关注提高整体效率。
  2. 任务切换机制:
    • 实时操作系统: 任务切换是由于时间限制而严格控制的,以确保在规定的时间内完成任务。
    • 分时操作系统: 任务切换是基于时间片轮转或优先级调度等策略,以确保公平分配处理器时间。
  3. 应用领域:
    • 实时操作系统: 通常用于需要满足严格时间限制的应用领域,如航空航天系统、医疗设备、工业自动化等。
    • 分时操作系统: 通常用于一般计算机系统,如个人计算机、服务器等,其中任务的完成时间相对较为灵活。

VxWorks是美国风河系统公司(Wind River Systems)于1983年设计开发的一种嵌入式实时操作系统,是嵌入式开发环境的关键组成部分。VxWorks 具有良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器、2008年5月登陆的凤凰号,和2012年8月登陆的好奇号也都使用到了VxWorks。

0x01 环境搭建

本文用到的工具和软件如下:

  • Windows 10
  • VMware Workstation 16 Pro
  • Workbench 3.2
  • TFtpd64

0x02 安装 Workbench

打开 ISO 文件,点击 setup.ext,开始安装 Workbench ,如图1所示:

图1

图2-1 VxWorks 安装包图

需要注意的地方有两处,第一处在检查更新的地方,需要禁止更新,如图2所示:

图2

图2-2 禁止更新

第二处在加载 license 的地方,如图3所示:

图3

图2-3 设置 license 图

其他的按照默认的设置安装,无所任何改动。

0x03 编译

在编译之前需要 VxWorks 的文件进行一些修改,具体可以看食铁兽大佬的文章,笔者这里不再赘述。在修改时,DEFAULT_BOOT_LINE 需要根据自己的实际 IP 进行修改。

编译 BSP

打开 Wind River WorkBench 3.2 ,选择 File->New Wind River Workbench Project,选择操作系统为 VxWorks 6.8 ,如图 3-1 所示:

图3-1

图3-1 新建 BSP 项目图

接着下一步选择 Build TypeBoot loader/BSP Project , 如图 3-2 所示:

image-20240125182928154

图3-2 Build Type 设置图

下一步新建工程名,最好能表明是 bsp 项目,其他默认即可。接着进入 Board support package 设置,笔者这里在之前修改配置文件的时候,将 pcPentium4 复制了一份,并命名为 pcPentium4P ,此处一定要将 Copy file to project 勾选,否则下一个无法完成。读者可根据自己修改的配置进行设置,完整配置如图 3-3 所示:

image-20240125185438852

图3-3 Board support packet 配置图

最后点击 Finish 完成项目创建。接着右键点击项目,选择 Build Project 或者 Rebuild Project 编译项目。

编译完成之后,右键点击项目,选择 Open Wind River VxWorks 6.8 Development Shell,进入命令行编译引导程序。具体步骤:首先 cd 进入 pcPentium4P ,再执行 make bootrom.bin,完成编译。如图 3-4 所示:

image-20240125185629961

图3-4 编译 BSP 图

进入 workspace/项目目录/pcPentium4P 目录中,找到编译好的 bootrom.binbootrom.bin 重命名为 bootrom.sys ,至此引导程序编译完成。

编译 VxWorks

引导编译完成后,接下来开始 VxWorks 固件,选择菜单File->New->Project,新建一个 VIP 项目 ,如图 3-5 所示:

image-20240126103312873

图3-5 新建 VIP 项目图

下一步工程名,根据自己的喜好来命名,例如:vmware_vip。工程名输入完毕后,进入下一步工程设置,需要与之前的 BSP 项目相关联,具体设置如图 3-6 所示:

image-20240126103744689

图3-6 关联 BSP 图

点击 Finish 完成 VIP 项目的创建。为了保证后续的漏洞成功复现,需要在VxWorks Image的编译工程的Kernel Configuration中添加组件,添加的组件有 telnet/ftp,右键选中 NetWork Components,选择 Include 添加组件,如图 3-7 所示:

image-20240126104728749

图3-7 添加组件图

组件添加完成后,右键选择项目名,选择 Build Project 或者 Rebuild Project 进行构建。构建完成后,进入 workspace/[vip name]/default 目录下,找到生成的 VxWorks,将 VxWorks 复制出来,与 bootrom.sys 放入同一文件夹中,如图 3-8 所示:

image-20240126113708058

图3-8 boot 文件夹

0x04 启动

在启动 VxWorks 之前,我们需要了解一下 VxWorks 的启动方式,在 VxWorks 4/5/6 中,需要使用 bootrom 对 VxWorks 进行加载,VxWorks 的 bootrom 是存在于flash存储当中并从复位开始自动运行。bootrom 会初始化所有运行VxWorks所需的硬件,然后加载VxWorks系统(通常以ELF文件形式存在)到内存并运行它,bootrom可以从包括可用格式的flash存储文件系统加载VxWorks镜像,或者通过网络连接从另一台机器上加载。具体方式可以参考 食铁兽 大佬的文章。

VxWorks 7不再支持编译一个旧风格的 bootrom(或者任何形式的只读VxWorks镜像),取而代之,硬件必须要安装一个独立的引导加载程序来从复位开始运行并启动系统。

由于 VxWorks 6 的启动方式过于复杂,因此笔者在这里使用了 VxWorks7 的引导方式来启动 VxWorks 6.8。具体操作方式如下:

找到编译好的 VxWorks 7 引导 vxStage1Boot.bin,并把 VxWorks 6.8 的镜像重命名为 bootapp.sys,将它们放入同一文件夹内,如图 4-1 所示:

image-20240130100453404

图4-1 启动文件夹示意图

开启 Tftpd,设置如下,图 4-2 、4-3 所示:

image-20240130101938468

图4-2 TFTP 设置

image-20240130102036067

图4-3 Ftpd64 DHCP 设置图

创建一个新的虚拟机,虚拟机的参数不重要,重要的是设置引导方式需要从 PXE 启动,设置完成后。开启虚拟机,等待引导完成,如图 4-4 所示:

image-20240130102855232

图4-4 等待引导 VxWorks 图

等待片刻后,VxWorks 成功运行,如图 4-5 所示:

image-20240130103014660

图4-5 成功运行 VxWorks 图

0x05 Hello World

在前面一节中,成功启动 VxWorks 6.8 ,在这一章节中我们将创建我们的第一个应用。首先打开 Workbench 3.2 ,新建一个 DKM(VxWorks Downloadable Kernel Module Project)项目,如图 5-1 所示:

image-20240130153703639

图5-1 新建 DKM 项目

点击 Finish 完成创建。右键选中 hellowd 项目,选择 New->File,创建一个 main.c 文件,如图 5-2 所示:

image-20240130153946176

图5-2 新建 main.c 文件

创建完成后在 main.c 输入代码如下:

1
2
3
4
5
6
7
#include <stdio.h>

int main()
{
printf("Hello, World!");
return 0;
}

右键选中项目,选择 Build Project ,编译工程。如果编译中出现弹窗请选择 Coutinue。接下来连接远程目标,首先点击 Workbench 左上方的 Run(一个绿色的播放按钮) ,在弹出的窗口中选择 VxWorks Kernel Task,再点击弹窗右上角的新建连接按钮,新建一个链接,创建一个 Target Server Connection,具体步骤如 图 5-3 所示:

image-20240130155019586

图5-3 创建 Target Server Connection 步骤图

新建 Target Server Connection 具体设置如下,如图5-4 所示:

image-20240130161550328

图5-4 新建 Target Server Connection

点击 Finish 完成创建。回到 Workbench 界面,需要指定函数入口,如图 5-5 所示:

image-20240130162913453

图5-5 选择入口函数

随后点击 Run ,就可以在 VxWorks中看到 Hello,World!。至此我们的第一个 VxWorks 应用就成功的运行了。

0x06 漏洞复现

目前公开的 VxWorks 漏洞危害较为严重当属 URGENT/11URGENT/11 由11个漏洞组成,可分为两类:

  • 可 RCE 的六个漏洞
  • 可导致拒绝服务、信息泄漏或者某些逻辑缺陷的五个漏洞

本文搭建的系统为 VxWorks 6.8,因此受到了部分漏洞的影响,下面使用 pocsuite3 对漏洞进行验证。首先扫描一下端口情况,如图 6-1 所示:

image-20240130181453172

图6-1 nmap 扫描结果

使用 pocusite3 对 URGENT/11 进行检测,结果如图 6-2 所示:

image-20240131171847435

图6-2 URGENT/11验证结果

既然存在 URGENT/11 漏洞,那我们找一个漏洞再验证一下,这里选择 CVE-2019-12255 进行验证,CVE-2019-12255 是一个栈溢出漏洞,可导致 VxWorks 的服务崩溃,如 telnet、ftp等。验证结果如图 6-3 所示:

image-20240131172327942

图6-3 CVE-2019-12255验证结果

笔者在这里选择的 telnet 服务,即 23 端口。VxWorks 崩溃,如图 6-4 所示:

image-20240131172456853

图6-4 VxWorks 崩溃图

0x08 总结

本次的学习过程比较曲折,主要是在环境搭建方面,国内这一块资料比较少,而 VxWorks 作为业界领先的实时操作系统,还有很多内容需要深入研究。

0x07 参考链接

VxWorks

VxWorks的那些Console

如何在 VmWare 上运行 VxWorks 7

VxWorks环境搭建与学习