吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 1604|回复: 8
上一主题 下一主题

[漏洞分析] vxworks5.5里面rpcbind漏洞分析-2

[复制链接]
跳转到指定楼层
楼主
LovenSar 发表于 2020-6-21 13:26 回帖奖励
本帖最后由 LovenSar 于 2020-6-21 20:17 编辑

上周因为课程原因,分析中断了,这个是上一篇,这周末继续
vxworks5.5里面rpcbind漏洞分析-1

脚本长达60个字节,也就是480位:




首先进行静态分析一波

当系统完成启动之后会进行这样子的查询方式,中间会有关中断的一些操作。

vxIdleAutoHalt函数是检查任务队列

当前检查有东西的时候,ln97x启动初始化

ln97xInt函数对缓冲寄存器检查,做进一步的检查。如果已经处于full的状态,那么就进入下一步正式接收的状态。

继续深入可以看见驱动里面开始在内存里面申请

在网络这一块,官方vxworks对于内存的管理叫做cluster【簇】,但是根据效果图看得出来,这个就是堆管理。

我们直接将其当做堆管理即可。


OK,这一层分析的差不多了。

知道了基本上是堆块管理的方式,那我们只需要在堆中找到我们需要的东西即可。

对于svc来说,是有svctcp_recv, svcraw_recv 和 svcudp_recv的。

当然,对于RPC来说自然就是UDP。

这里乍一看是可以看到有具体的一个函数,recvfrom是一个关键函数。

所以我们关键就是要找到第二个缓冲区的地点就行了。

关键就是找到第二个地址

也就是这个ecx,这个时候的ecx的值是0Xfee3024这个地址。当运行完recvfrom之后,这个地址就会有我们想要的东西。

随便在recvfrom之后随便下个结点,F9

然后就可以看到这个地方出现了。

这个就是整个payload的拷贝,从图中的信息可以判断出,不是栈溢出,不是堆溢出。

我们可以先从程序的报错代码中找到我们需要的报错信息。

之前是已经分析好了程序,基本上的问题都是出现在eax寄存器上,我们只需要对这个寄存器进行回溯操作,也就是在这个出现问题的程序段上开头按下F2,。也就是下一个断点,这样程序往下面走我们就可以看见我们想要的值,最先出现在什么地方。

根据这个地方,我们可以确定内存地址,进而推断出进一步的调用关系。

可以看得到,基本上内存里面一个堆块,存储了payload的一半以上的信息,但是对于后面的那一段payload具体在什么地方,我们现在还没有定论,所以,可以先按照这个地址展开来看。

图中的圆圈就是我们找到的对应的payload。

回去看看伪代码我么可以知道这个具体的函数就是一个传参的过程,也就是说,这个payload是从a2这个地方继承过来的。

首先,我们关注一下这个a2的地址和数据,同时a1这个地址也请注意一下,因为是从上面继承来的,0XFEF39B4

找到gcc2_compiled__312上一级函数svc_getreqset

当前出问题的这个函数是svc_getreqset

根据基层调用关系,我们可以得出这样的结论。

第一层出现问题的是gcc2_compiled312

调用gcc2_compiled
312的是svc_getreqset

svc_getreqset上一层是svc_run

SVC是交换虚拟电路,信息包交换虚拟线路面向连接的网络中,从一台计算机到另一台计算机的连接。SVC是虚拟的,因为路径是从路由表中得到的,而不是建立物理线路。SVC是交换的,因为它能按需要建立,类似于一次电话呼叫。

从函数的调用关系可以看来,对于svc_runàsvc_getreqsetà gcc2_compiled__312是一个请求号,也就是说,系统是已经接受到了看似合理的请求,而造成这个的错误并不是一半的填充数据覆盖eip之类的,也就是说在从驱动拷贝到内存的过程当中,并没有出现一般的栈溢出或者堆溢出,不然会有其他的报错。

在分析的过程当中,我们经常可以看见一个命名就是taskIDcurrent这个值,从指针传递的值可以看到一直有一个值是0XFEF3B94,这个其实是portmap这个任务的栈基址

从“In addition, multithreaded RPC servers must call on svc_run(). Note that svc_getreqpoll() and svc_getreqset() are unsafe in MT applications.”

可以看出,对于svc_runàsvc_getreqsetà gcc2_compiled__312这里其实是一个不太安全的方法。

那么问题出现在哪里呢?


细数下来,我们的请求在复制的过程中并没有发生故障,相反的,反而在执行的时候出现了问题。排除了堆溢出、栈溢出和字符串格式化漏洞,那么还有一个极其隐晦的整数溢出漏洞。

不论只要保持88888888前面的长度,后面的长度可以截断,这就可以判断出不是栈溢出或者堆溢出之类的,实测有效。

所以,总的下来,出现问题的函数就是在执行请求那里出现了问题,那么也还是回到最初的函数那里可以看到,gcc2_compiled__312。

当eax为88888888乘以四之后就会溢出。


整数溢出漏洞。

官方已经给出了几个方式去写exp

  • 一个是整数溢出后导致RCE漏洞,执行危险命令

  • 堆喷射放置shellcode

  • 计算出可验证的??值

  • 直接跳到shellcode

综合来看,我可以尝试第四种,首先,我先控制call eax这个命令的eax值。

一般来说,填写负数将是一个不错的选择。

免费评分

参与人数 4威望 +2 吾爱币 +103 热心值 +4 收起 理由
gaosld + 1 + 1 用心讨论,共获提升!
yixi + 1 + 1 谢谢@Thanks!
fengbolee + 1 + 1 用心讨论,共获提升!
willJ + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
shellcode 发表于 2020-6-22 10:09
rpcbind这种漏洞很致命,文中提到的shellcode和我的马甲一样,抢个沙发
3#
willJ 发表于 2020-6-22 18:14
想请教下楼主,vxworks5.5这种产品有没有漏洞缓解措施呢?比如DEP这种,如果有,你直接部署好shellcode跳过去应该是不行的吧?
4#
 楼主| LovenSar 发表于 2020-6-22 18:41 |楼主
willJ 发表于 2020-6-22 18:14
想请教下楼主,vxworks5.5这种产品有没有漏洞缓解措施呢?比如DEP这种,如果有,你直接部署好shellcode跳过 ...

请教谈不上,vxworks是RTOS,实时性要求他们在实模式下运行,在硬件条件不变的情况下是没有随机化的。这个漏洞是非常隐蔽的整数溢出。风河公司已经在栈、堆溢出、格式化等漏洞上已经十分努力了。
5#
 楼主| LovenSar 发表于 2020-6-22 18:43 |楼主
willJ 发表于 2020-6-22 18:14
想请教下楼主,vxworks5.5这种产品有没有漏洞缓解措施呢?比如DEP这种,如果有,你直接部署好shellcode跳过 ...

而且这边的shellcode一般来说不熟悉vxworks的也还是很难达到的,它与linux不同,vxworks的源码一向保密做得很好
6#
lifebeyond 发表于 2020-6-28 16:53
字很多,看不完,看不懂,大神
7#
 楼主| LovenSar 发表于 2020-6-28 21:14 |楼主
lifebeyond 发表于 2020-6-28 16:53
字很多,看不完,看不懂,大神

之前都分析好了,等下我发一个你看得懂的,这是直接RCE代码。
8#
 楼主| LovenSar 发表于 2020-6-28 22:28 |楼主
LovenSar 发表于 2020-6-22 18:41
请教谈不上,vxworks是RTOS,实时性要求他们在实模式下运行,在硬件条件不变的情况下是没有随机化的。这 ...

还有一种“伪随机化”,也就是针对非底层的一些函数【开发人员根据自己的需求开发的】,以及vxworks是裁剪式系统,添加的组件不同的时候,同样一个函数,对于两个vxworks内部偏移量就可能不一样,就达到了“伪随机化”
9#
sssjcccz01a 发表于 2020-7-1 08:23
真不好说,只有部分系统看看,具体搞的少。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2020-7-2 15:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表