在2015年9月9日-11日举办的“44 CON 伦敦”峰会中,议题众多,本文将针对“攻击 VxWorks”这个议题进行学习研究。
0×01 前言
VxWorks 是世界上使用最广泛的一种在嵌入式系统中部署的实时操作系统,是由美国WindRiver公司(简称风河公司,即WRS 公司)于1983年设计开发的。其市场范围跨越所有的安全关键领域,仅举几例,包括火星好奇心流浪者、波音787梦幻客机、网络路由器。这些应用程序的安全高危性质使得VxWorks的安全被高度关注。
加拿大安全研究人员Yannick Formaggio发现VxWorks中存在严重的漏洞,允许攻击者远程执行代码。Formaggio对VxWorks进行了深入的安全分析,包括它所支持的网络协议和操作系统安全机制。演讲中他展示了其开发的VxWorks评估工具,主要目的是通过在python中实现WdbRPC协议来提供有效的渗透测试。为了显示它的效果,揭示一些在研究过程中发现的bug。
一个快速的互联网扫描显示了至少有10万台运行了VxWorks的设备连接到了互联网。考虑到VxWorks在物联网时代的普及,这一问题将会产生广泛的影响。
0×01 什么是VxWorks?
VxWorks操作系统是由美国Wind River(风河公司)开发的一种嵌入式实时操作系统(RTOS),已宣称拥有至少15亿台设备,VxWorks支持几乎所有现代市场上的嵌入式CPU架构,包括x86系列、MIPS、 PowerPC、Freescale ColdFire、Intel i960、SPARC、SH-4、ARM, StrongARM以及xScale CPU。
0×02 VxWorks的安全性
这一页是介绍VxWorks从2008年至2015年的CVE安全漏洞数量详细信息统计图表:
来源:http://www.cvedetails.com/product/15063/Windriver-Vxworks.html?vendor_id=95
风河公司非常注重VxWorks的安全性:
2011年与McAfee建立合作伙伴关系。 VxWorks 6.x 引进了一些内存保护机制。 VxWorks 7.x 进一步提升了以下方面: 数字签名模块(X.509) 加密 集中式的用户数据库 密码管理(SHA-256算法) 在运行过程中创建/删除用户 加密数据存储
0×03 以往的研究与启示
在这一节,演讲者主要介绍了以往一些大牛对VxWorks的漏洞挖掘的研究。
在2010年,HD Moore 在Metasploit社区发表了题为“Shiny Old VxWorks Vulnerabilities”的漏洞分析文章,并且提供了4个针对WDB RPC的msf攻击模块以及密码的哈希算法加密漏洞。
在2011年, /DEV/TTYS0 大牛对VxWorks的固件WRT54Gv8进行了逆向分析,并发表了题为“Reverse Engineering VxWorks Firmware: WRT54Gv8”的文章。
SecNiche Security Labs的安全研究人员对VxWorks整体的系统安全和固件进行了漏洞挖掘,并发表了题为“Digging Inside VxWorks OS and Firmware – Holistic Security”的文章。
0×04 VxWorks内部探究(内存布局与保护)
X86内存布局:上端内存
X86内存布局:中断向量表(在32位保护模式下该表称为中断描述符表)IDT
X86内存布局:致命错误异常消息的ASCII字符串
X86内存布局:VxWorks镜像入口点
X86内存布局:WDB(Wind Debug协议)共享内存
内存保护:
VxWorks 为带有 MMU 的目标板提供了虚拟内存机制,对于非 MMU 的目标板是基于堆错误检测进行内存保护。
接下来是介绍VxWorks在内存保护方面所实现的一些机制。
内存保护:
任务堆栈超荷和欠载检测 中断堆栈超荷和欠载检测
内存保护:
非可执行的任务堆栈 & 非可写文本段 INCLUDE_TASK_STACK_NO_EXEC INCLUDE_PROTECT_TEXT 任务堆栈大小 = MMU 页大小
内存保护:
空指针使用检测
堆区块超荷检测 / 使用情况跟踪与泄漏检测
0×05 什么是WDB RPC?
在对VxWorks进行模糊测试前,需要明白,WDB RPC是一个基于SUN-RPC协议的调试接口,它的服务运行在UDP协议的17185端口上,可以直接访问系统的内存。
接下来是介绍WDB协议V2的动态图解:
调用:由目标服务器发出
应答:由目标代理发出
针对VxWorks 5.x 使用WDB对过程进行监测(一): 绿色表示调用过程,红色表示应答过程。
针对VxWorks 5.x 使用WDB对过程进行监测(二): 调用过程:主机连接至目标。
针对VxWorks 5.x 使用WDB对过程进行监测(三): 应答过程:目标连接至主机。
针对VxWorks 5.x 使用WDB对过程进行监测(四): 调用过程:主机对目标发起WDB功能调用操作。
针对VxWorks 5.x 使用WDB对过程进行监测(五): 应答过程:目标对主机发起WDB功能调用操作。
针对VxWorks 5.x 使用WDB对过程进行监测(六): 调用过程:主机对目标发起WDB内容挂起操作。 应答过程:目标对主机发起WDB内容挂起操作。
针对VxWorks 5.x 使用WDB对过程进行监测(七): 调用过程:主机对目标发起WDB事件点添加操作。 应答过程:目标对主机发起WDB事件点添加操作。
针对VxWorks 5.x 使用WDB对过程进行监测(八): 调用过程:主机对目标发起WDB内容控制操作。 应答过程:目标对主机发起WDB内容控制操作。
下面是针对VxWorks 6.x 使用WDB对过程进行监测(一):
在Gopher上获取更多信息。
针对VxWorks 6.x 使用WDB对过程进行监测(二):
接下来是对崩溃检测机制的介绍:
目标向主机发送事件通知。
主机确认。
主机请求更多的信息(寄存器内容,内存区域......)
下一节的模糊测试将会用到WDBRPC框架,使用Python编写,支持VxWorks 5.x和6.x,实现了部分WDBRPC协议,实现了一个基本的远程调试器——WdbDbg。
一些外部依赖项:
PyElfTools: 从 VxWorks 图像读取导入
Capstone Engine: 对崩溃区周围的代码进行反汇编
0×06 从模糊测试到漏洞利用
这一节将对VxWorks的一些网络协议(RPC,FTP,TFTP,NTP等)进行fuzzing。使用Sulley fuzzing框架。对于没有可用的精确崩溃检测的问题可以使用 WdbRPC 作为解决方案。
与Sulley进行对接:
灵感来自于与 Sulley process_monitor.py 脚本 执行情况: DebuggerThread 实例化 WdbDbg,并实现回调在崩溃发生时调用。 ProcessMonitorPedRPCServer 与 Sulley 的 ped rpc 例程进行对接。 VxMon 包装的一切。
接下来是Fuzzing过程的图解:
VxMon使用WDB RPC对VxWorks目标进行监测,Sulley模糊测试框架对VxWorks目标进行模糊测试,当VxMon收到崩溃发生事件时,使用Sulley 的 ped rpc 例程与Sulley模糊测试框架进行通信,告知其崩溃发生。
这一页是模糊测试的一个Demo:
接下来是对Fuzzing过程中产生的崩溃进行分析:
Portmap任务在相同的 RPC 字段崩溃多次: 凭据的味道 当设置为负值,则 => PC 设置为任意的内存值
对系统的authenticate函数进行反汇编:
对eax寄存器进行赋值操作:
对ebx寄存器进行赋值操作:
使用cmp指令对比ebx寄存器和2的大小,注意右侧ebx寄存器的值为0:
jg是个大于转移的汇编指令,由于0<2不满足条件,所以不会跳到0x4173c7地址处执行。
由于上面并未跳转所以继续向下执行,call指令调用了svcauthsw函数:
进入svcauthsw函数内存空间,发现已经发生了溢出。
如何进行漏洞利用?
整数溢出导致了RCE(远程代码执行) 堆喷射shellcode 计算凭据风味值 直接跳进shellcode 绕过所有的内存保护 设置后门帐户
该议题的演讲者在PPT后面的一页中已作相关说明,因此此漏洞的exp他并不会发布。
在模糊测试的过程中发现了其他的bug:
FTP 服务器在被高速访问时容易出现环缓冲区溢出错误。 当FTP收到精心构造的用户名和密码时会崩溃,网络堆栈会挂掉!
0×07 结论
风河公司对VxWorks的安全的确很重视,实现了很多内存保护机制,不过最后被一个简单的整数溢出漏洞打败了。
本次公开的安全问题将会影响VxWorks 5.5版本,也就是需要补丁的设备要以百万来计数。风河公司已确认存在VxWorks系统中存在漏洞,并计划在不久之后发布更新。
原文PPT下载:http://www.slideshare.net/44Con/44con-london-attacking-vxworks-from-stone-age-to-interstellar
*投稿:FreeBuf特约作者丝绸之路,本文属FreeBuf原创奖励计划,未经许可禁止转载