VxWorks环境搭建与学习
搭建环境所需的所有资源: https://pan.baidu.com/s/1sUF2I_DBHs-86IUJ4Ykn2Q 提取码: t7sj
实时系统vxWorks - Shell命令 https://blog.csdn.net/rt201314/article/details/119551651
VxWorks开发环境学习 https://www.daimajiaoliu.com/daima/4713a3a05900404
嵌入式操作系统VxWorks简介
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的F-16、FA-18战斗机、B-2隐形轰炸机和爱国者导弹上,甚至连1997年在火星表面登陆的火星探测器上也使用到了VxWorks。
workbench
由WindRiver提供的开发工具,集成了编辑器、编译器、调试器于一体的高度集成的窗口环境,同样也可以从Shell窗口下发命令和浏览。基于eclipse。
集成环境提供了高效明晰的图形化的实时应用开发平台,它包括一套完整的面向嵌入式系统的开发和调测工具。此环境采用主机-目标机交叉开发模型,应用程序在主机的Windows环境下编译链接生成可执行文件,下载到目标机,通过主机上的目标服务器(Target Server)与目标机上的目标代理(Target Agent)的通信完成对应用程序的调试、分析。它主要由以下几部分组成:
- VxWorks高性能的实时操作系统;
- 应用编译工具;
- 交互开发工具;
BSP
板载支持包(Board support package,BSP),用于支持开发板相关的功能,包括BIOS驱动、CPU、网卡驱动、硬盘驱动、ROM驱动、Flash驱动、显卡驱动等等。VxWorks BSP包含了开发人员要在特定的目标机上运行VxWorks所需要的一切支持:支持特定目标机的软件(如驱动程序等)和从主机通过网络引导VxWorks的Boot ROM。Wind River提供支持不同厂商的200多种商业体系结构和目标板的BSP。另外Wind River还提供一个BSP移植包,帮助用户移植VxWorks到客户化硬件板上(超过50%的VxWorks用户使用客户化目标机)。
BSP开发包帮助开发人员把VxWorks移植到客户化硬件平台上。BSP开发包的选项包括:测试工具,硬件设备的驱动程序库,BSP模板。用户可以根据需要选择不同的选项。Wind River还提供BSP测试验证等咨询服务。
VxVMI:VxVMI是VxWorks的虚拟内存接口。在调试阶段和软件运行时都能提供强大的内存管理功能。它包括代码段和数据段保护功能,并包含对不同CPU结构的标准编程接口。
VxMP:VxMP是VxWorks多处理器支持扩展包,它允许将任务分布在多个CPU上执行以提高效率。它透明的、高性能的设计使得在不同CPU上运行的任务可以通过现有的通信机制,如信号灯、消息队列等进行同步和数据交换。
BSP是介于底层硬件和上层软件之间的底层软件开发包,它主要功能为屏蔽硬件,提供操作系统的驱动及硬件驱动,具体功能包括:
- 单板硬件初始化,主要是CPU的初始化,为整个软件系统提供底层硬件支持;
- 为操作系统提供设备驱动程序和系统中断服务程序;
- 定制操作系统的功能,为软件系统提供一个实时多任务的运行环境;
- 初始化操作系统,为操作系统的正常运行做好准备;
BSP文件在vxworks/target/config/all和vxworks/target/config/bspname文件夹里。其中,all文件夹里的文件是所有BSP的通用文件,bspname文件夹的文件是用户自己定制的BSP文件。
经过编译、链接,并在makefile和depend. bspname等文件的控制下,原程序最后将生成镜像。VxWorks的镜像可分为两类:可下载镜像和可引导镜像。
- 可下载镜像(Loadable Image):实际包括两部分,一是vxWorks,二是boot ROM,两部分是独立创建的。其中boot ROM包括被压缩的boot ROM镜像(bootrom)、非压缩的boot ROM镜像(bootrom_uncmp)和驻留ROM的boot ROM镜像(bootrom_res)三种类型;
- 可引导镜像(Bootable Image):是将引导程序和vxWorks融为一体的镜像,它常常是最终产品,包括不驻留ROM的镜像和驻留ROM的镜像两种类型。
VxWorks虚拟机安装
安装版本:
VxWorks 6.8.3 + VxWorks Workbench 3.2.3 + VMware 16 + MS-DOS 6.22 软盘版
按照FTP连接的主机和目标机,将整个VxWorks6.8的安装分为两个部分,一是在主机(win10系统,可以使用虚拟机或者实体机,推荐使用虚拟机)上安装workbench3.2,进行bootrom与VxWroks映像文件的生成,二是在虚拟机上安装VxWorks系统。
WorkBench3.2安装
以下操作在win10虚拟机上进行
准备工作:
先关闭UAC。
在Windows中搜索UAC
搜索网络连接设置,选择其中的有线网卡(不能用也没关系,主要是有线网卡就可以)。右键点击属性菜单。
然后点击配置按钮,弹出配置界面,点击高级子界面
打开资源包中的WRSLicenseWH701-VX-2Hypervisor.lic文件,找到这里:
复制里面的hostid=字段的内容,16位MAC地址字符串。如果不是16位MAC地址而是字符串ANY
,表示此证书并未绑定网卡MAC地址,不限制网卡。
填入如下位置:
开始安装:
-
安装UItraISO(其他加载工具也可以)。运行uiso9_cn.exe,一路默认安装UItraISO,注意选择附加任务时三项都要勾选,尤其是“安装虚拟ISO驱动器”(默认三项都勾选)
-
加载DVD-R175636.1-1-00到虚拟光驱,接着打开所加载的虚拟光驱,运行setup程序;
-
安装过程没有特别描述的都以默认选项进行;
-
这一步将Check都取消勾选
-
- 这一步选择Permanent activation(永久激活),将所给的.lic文件(证书)导入
- 其余都用默认选项,选择Next即可,最后等待安装完成
编译BSP
-
找到WorkBench的安装目录,目录名为WindRiver,找到vxworks-6.8目录,进入找到target目录,进入找到config目录,进入找到pcPentium4目录
-
将“修改及增加文件”文件夹内提供的文件复制粘贴到Pentium4目录内,已有文件全部覆盖
需要修改以下文件,这里直接将修改好的复制过来。
-
打开config.h文件,定位到定义 DEFAULT_BOOT_LINE 宏的地方。修改预处理条件
CPU = = PENTIUM4
分支下的定义如下:这里的h(host)地址表示你的主机IP地址,可以先修改为主机IP地址,或者随便填一个IP地址,之后修改主机地址为该地址,e(target)地址表示VxWorks系统目标机的IP地址,只需要和主机IP地址在同一个网段内即可,u=target pw=target是FTP下载的用户名和密码,都可以根据自己实际情况修改,最好使用target,简单易记。
-
打开Workbench3.2,Workspace就选择WindRiver目录下的workspace目录
-
File->New->Wind River Workbench Project,选择Wind River VxWorks 6.8,然后Next
- Build type选择Boot Loader / BSP Project,然后Next
-
Project name任取,最好与BSP相关,Location选择默认的in workspace,然后Next
-
Board support package选择步骤2中经过修改的Pentium4目录,Tool chain选择gnu,勾上Copy files to project,然后Finish
- 右键选中项目,选择Build Project或者Rebuild Project进行构建
-
构建完成后,右键选中项目,选择Open Wind River VxWorks 6.8 Development Shell,打开命令行,cd进入Pentium4目录后,输入make bootrom.bin命令,将生成bootrom.bin文件
-
找到workspace目录,找到该项目目录,在项目目录下找到Pentium4目录,进入并找到生成的bootrom.bin,复制出来,并修改后缀名为.sys,后续该文件作为引导程序
-
找到vxload.com和vxsys.com两个文件(手动搜索,或者一般在XX\WindRiver\vxworks-6.8\host\x86-win32\bin目录下),与上一步得到的bootrom.sys放在一起,以待后续使用
生成VxWorks镜像
根据具体需要在命令行环境下利用Makefile创建各种镜像,也可以在Tornado的集成环境下Build菜单中选择Build Boot ROM来创建各种类型的Boot ROM;
除此以外,如果系统硬件包括串口,还要根据具体情况修改sysSerial.c文件;如果包含网络部分要修改configNet.h;如果包含NVRAM要修改bootnv.h文件。总之,BSP的开发要根据具体目标板的硬件进行。
1、打开Workbench3.2,Workspace就默认为WindRiver目录下的workspace目录
2、File->New->Other,在Wizards内输入VxWorks image查找并选择VxWorks Image Project,然后Next
3、Project name任取,最好与Image相关,Location选择默认项in workspace,然后Next
4、Based on选择an existing project,Project中将显示此时workspace中的项目,选择第2章节中创建好的BSP项目,然后Finish
5、如果需要额外开启各种服务,则需要在VxWorks Image的编译工程的Kernel Configuration中添加组件
选择所需要的服务,这里添加了telnet ftp rpc,然后点击finish
然后即可在Network Applications(default)模块下,看到对应的组件
还可以进行一些配置,例如TELNET组件:
6、组件添加完成后,右键选中项目,选择Build Project或者Rebuild Project构建
7、在workspace目录下,找到该项目目录,进行default目录,进入并找到生成的vxWorks以及vxWorks.sym,复制出来,后续这两个文件将作为VxWorks系统文件通过FTP引导系统
但是我这里并没有生成vxWorks.sym文件,不知道为什么...不过后面并没有影响
VxWorks虚拟机安装
1、首先使用DOS622镜像文件创建虚拟机,镜像文件格式为IMG,大小为1.44MB,软盘的大小。
2、使用VMware,新建虚拟机->典型->稍后安装操作系统->其他(MS-DOS)->自定义名称(默认为MS-DOS)和位置->使用默认最大磁盘大小2GB,将虚拟磁盘存储为单个文件->完成
3、打开上一步创建的虚拟机设置,在硬件部分“添加”“软盘驱动器”
4、软盘添加“完成”后,选择软盘,勾选“启动时连接”,以及“使用软盘映像文件”,并点击“浏览”选择提供的DOS662.img文件
5、选择CD/DVD,取消勾选“启动时连接”,修改内存大小为256MB(适当大小即可)
6、完成设置后,开启该虚拟机,进入开始界面,选择第三个选项Other IDE CD-ROM
7、选择3后进入真正的DOS界面,开始进行硬盘分区,输入fdisk
8、选择1,建立DOS分区
9、选择1,建立一个主分区
10、选择Y,此时询问这个分区是否使用全部的空间,由于我们只需要一个分区就可以,因此选择Y
11、输入任意键,虚拟机将重启
12、重新选择3 Other IDE CD-ROM,进行主分区的格式化,输入format c: /s
,这里输入Y确认
13、这里询问是否填写卷标,由于并不需要所以直接回车即可
14、此时已经有主分区C盘了,关闭虚拟机,在虚拟机设置中选择硬盘,选择“映射”,取消勾选“以只读模式打开文件”后确定,弹出警告点“是”即可,由此将打开该虚拟机的硬盘空间
之后,本地多出来个Z盘:
15、将"编译BSP"章节中的三个文件放入盘中后,在硬盘处“断开连接”,重新开启虚拟机,依然选择3,输入c:进入c盘(即主分区)
17、输入vxsys c: 命令,输入y确认
18、由此bootrom.sys成功设置为引导程序,关闭虚拟机,在虚拟机设置中选择软盘,取消勾选“启动时连接”,再次开启虚拟机,VxWroks系统虚拟机安装完成,其中IP地址为192.168.111.200,也就是所提供的config.h文件内设置的地址
19、移步到win10虚拟机,在C:\WindRiver\vxworks-6.8\host\x86-win32\bin下找到wftpd32.exe,使用该程序进行FTP的连接
20、在任意位置创建一个文件夹,用来给目标机提供FTP文件目录,方便起见,我们直接在桌面下创建一个名为ftp的文件夹,将之前得到的vxWorks
,vxWorks.sym
两个文件放入其中
这里我只生成了vxWorks
21、打开wftpd32.exe,Security->Users/Rights->New User->创建一个名为target,密码为target的用户(这个用户名密码是在config.h文件修改时设定好的)
22、用户创建好后选择该用户,在Home Directory内填入20步中创建的文件夹,然后选择“Done”
23、重启VxWorks虚拟机,此时虚拟机将通过FTP连接载入VxWroks系统,完成
这里我们在”生成VxWorks镜像“章节,并没有生成vxWorks.sym文件,但是依然可以搭建成功。
24、由于前面我们配置了RPC、TELNET、FTP组件,所以扫描可以看到对应的开放端口
漏洞测试
在上一部分,我们已经搭建成功了 VxWorks 6.8.3 + VxWorks Workbench 3.2.3
下面进行一些已知漏洞测试
urgent11
IPnet TCP/IP 堆栈检测
该工具以 TCP 和 ICMP 指纹的形式对目标主机实施 4 种独特的检测方法。通过计算所有方法得分的总和,我们可以高精度地确定设备是否运行依赖于 IPnet TCP/IP 堆栈的操作系统以及该操作系统是否为 VxWorks。此外,我们还测试了主机是否容易受到 CVE-2019-12258 的攻击,这是影响所有使用 IPnet 的 VxWorks 版本的 URGENT/11 漏洞之一。如果检测到设备在 VxWorks 上运行 IPnet,并且不受此 CVE 的攻击,则可以推断该设备已针对 URGENT/11 漏洞进行了修补。
对上面搭建的环境进行测试,可以发现没有修补漏洞:
CVE-2019-9865
https://github.com/dazhouzhou/vxworks-poc/tree/master/CVE-2019-9865
VxWorks的RPC组件存在此漏洞。 有关漏洞的详细信息可以在这里找到。
在 6.9.1 之前的 Wind River VxWorks 6.9 中启用 RPC 时,特制的 RPC 请求会触发整数溢出,从而导致内存复制越界。它可能允许远程攻击者导致拒绝服务(崩溃)或可能执行任意代码。
复现:
这里搭建的是6.8版本,不存在漏洞
修改poc.py里面的host地址:
运行poc.py
CVE-2019-12255
https://github.com/iweizime/urgent11-poc/tree/master/CVE-2019-12255
VxWorks的IPnet栈存在此漏洞。 有关漏洞的详细信息可以在这里找到。
PoC可以使VxWorks任务(设置与PoC中任务对应的端口)崩溃,例如telnet、ftp等。
影响版本:6.5 ≤ VxWorks<6.9.4
复现:
修改poc.py里面的ip和dport
运行:
#当OS收到非请求报文时,会发送RST (reset)报文。 我们可以使用iptables来避免这种情况。
iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.111.134(攻击者ip) -j DROP
#运行POC
python3 poc.py
CVE-2019-12260
https://github.com/iweizime/urgent11-poc/tree/master/CVE-2019-12260
此 PoC 使用 TCP 身份验证选项 (TCP-AO) 发送数据包
iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 172.18.101.121 -j DROP
python3 poc.py
CVE-2010-2965
VxWorks wdbrpc远程代码执行漏洞
VxWorks 6.x, 5.x和之前版本中的WDB目标代理调试服务中存在权限许可和访问控制漏洞。远程攻击者可以借助向UDP 17185端口发送的请求读取或修改任意存储单元,执行函数调用,从而造成任意代码执行。
WDB RPC有V1和V2两个版本,VxWorks 5.5中使用V1版本,而VxWorks 6.6中使用V2版本,V2版本相较于V1版本有较多处修改,具体体现在协议字段及交互方式。 以上这些脚本都是针对WDB RPC V1