RPC 漏洞简介

Remote Procedure Call,分布式计算中常用到的技术。两台计算机通信过程可以分为两种形式:一种是数据的交换,另一种是进程间通信。RPC 属于进程间通信。

RPC 就是在程序中调用一个函数(可能需要很大的计算量),而这个函数是在另外一个或多个远程机器上执行,执行完后将结果返回到调用的机器上继续执行后续操作。RPC 调用过程中的网络操作对程序员来说是透明的,只要将接口定义好,RPC 体系会完成网络上建链、握手、验证、传参、返回等细节问题,让程序员更加关注程序算法与逻辑而非网络细节。

比起其他类型的漏洞,RPC 漏洞危害更大,攻击者不需要利用社工来使未 patch 的机器中招,而可以通过 RPC 主动进行攻击。

RPC 系列漏洞往往伴随蠕虫传播,2003 年的 Blaster、2006 年的 Wargbot / Mocbot、2008 年的 Conficker / Downadup / Kido 都 利用了不同的 RPC 漏洞。Wargbot 利用的 MS06040 和 Conficker 利用的 MS08067 时隔两年,但漏洞出现在同一个 RPC 函数中,同一个函数在修复后又出现如此严重的漏洞并不常见。

RPC 编程简介

使用 RPC 编程时首先要定义远程进程的接口 IDL(Interface Description Language)文件,在这个文件里要指定 RPC 的接口信息以及 interface 下的 function 信息。微软的 IDL 叫做 MIDL,是兼容 IDL 标准的。定义好的 IDL 文件接口经过微软的 MIDL 编译器编译后会生成 3 个文件,一个客户端 stub,一个服务端 stub,还有一个 RPC 调用的头文件。其中 stub 负责 RPC 调用过程所有的网络操作细节。

编译 MS06040 接口文件的命令如下:

midl /acf rpc_exp_040.acf rpc_exp_040.idl # vc6. 组件中有 midl 命令

将产生的 rpc_exp_040_s.c、rpc_exp_040_c.c 和 rpc_exp_040.h 添加进工程,并 include "rpc_exp_040.h" 即可。

(作者参考了 samba 上的 Windows 网络编程接口资料才找到相关 IDL 信息)

MS06040 简介

Windows 系统中有一些非常重要的 DLL,如负责 GUI 操作的 user32.dll、负责系统调用和内存操作的 kernel32.dll 与 ntdll.dll,负责网络操作的 netapi32.dll。几乎所有使用 socket 网络的程序都会加载 netapi32.dll。MS06040 指的就是这个 DLL 的导出函数 NetpwPathCanonicalize() 中存在的缓冲区溢出缺陷,而 NetpwPathCanonicalize() 又可以被 RPC 调用。

2006 年 8 月 8 日,微软公布 MS06040 漏洞和补丁,CVE-2006-3439,补丁号为 KB921883,威胁等级为严重。

动态调试

以 Windows 2000 Pro SP4 为例,进行动态调试。Windows 2000 中,netapi32.dll 位于 C:\WINNT\System32\ 下,如果系统已经 patch 过,则原先的漏洞 DLL 会备份到 C:\WINNT\$Nt UninstallKB921883$ 里。

NetpwPathCanonicalize() 是 netapi32.dll 的导出函数,用于格式化网络路径字符串,其原型如下:

 int NetpwPathCanonicalize (
uint16 path[], // [in] path name
uint8 can_path[], // [out] canonicalized path
uint32 maxbuf, // [in] max size of can_path
uint16 prefix[], // [in] path prefix
uint32* pathtype, // [in out] path type
uint32 pathflags, // [in] path flags, 0 or 1
);

这是一个 Unicode 字符串处理函数,大体功能是:如果 prefix 串非空,将 prefix 串与 path 串用 '\' 相连,并复制到 can_path 中,输出串的容量为 maxbuf 字节大小:

prefix + '\' + path => can_path[max_buf]

在路径合并过程中,函数会做各种检查,如 prefix 或 path 长度是否越界、是否符合路径规范,或 can_path 的容量是否够大等,否则函数将退出,并返回相应错误号,例如 ERROR_INVALID_NAME 0x7B,ERROR_INVALID_PARAMETER 0x135,NERR_BufTooSmall 0x84B 等;函数成功则返回 0,并对 pathtype 进行更新。(关于 NetpwPathCanonicalize() 的细节资料很难找到,Google 上也只是在 srvsvc 的接口定义文件 IDL 里看到函数声明。作者主要是通过 IDA 反汇编找到的这些信息。)

OD: RPC - MS06040 & MS08067的更多相关文章

  1. 深入浅出MS06-040

    入浅出MS06-040 时至今日,网上已有颇多MS06-040的文章,当中不乏精辟之作.与其相比,本文突显业余,技术上无法超越,徒逞口舌之快.本文适合有一定计算机基础,初步了解溢出攻击原理,略微了解逆 ...

  2. ms08-067漏洞的复现

    MS08-067漏洞重现 (1):MS08-067远程溢出漏洞描述 MS08-067漏洞的全称为“Windows Server服务RPC请求缓冲区溢出漏洞”,如果用户在受影响的系统上收到特制的 RPC ...

  3. 使用Metaspoit攻击MS08-067

    kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 使用Metaspoit攻击MS08-067 MS08-067漏洞的全称为 ...

  4. 20169219 使用Metaspoit攻击MS08-067实验报告

    MS08-067漏洞介绍 MS08-067漏洞的全称为"Windows Server服务RPC请求缓冲区溢出漏洞",如果用户在受影响的系统上收到特制的 RPC 请求,则该漏洞可能允 ...

  5. 20169201 使用Metaspoit攻击MS08-067实验

    MS08-067漏洞介绍 MS08-067漏洞的全称为"Windows Server服务RPC请求缓冲区溢出漏洞",如果用户在受影响的系统上收到特制的 RPC 请求,则该漏洞可能允 ...

  6. FastSocket学习笔记~RPC的思想,面向对象的灵活

    首先非常感谢这位来自新浪的老兄,它开发的这个FastSocket非常不错,先不说性能如何,单说它的使用方式和理念上就很让人赞口,从宏观上看,它更像是一种远程过程的调用RPC,即服务器公开一些命令,供客 ...

  7. alluxio源码解析-rpc调用概述(1)

    alluxio中几种角色以及角色之间的rpc调用: 作为分布式架构的文件缓存系统,rpc调用必不可少 client作为客户端 master提供thrift rpc的服务,管理以下信息: block信息 ...

  8. 缓冲区溢出分析第08课:MS06-040漏洞研究——动态调试

    前言 经过上次的分析,我们已经知道了MS06-040漏洞的本质,那么这次我们就通过编程实现漏洞的利用. 编写漏洞利用程序的框架 这里我使用的是VC++6.0进行编写,需要将包含有漏洞的netapi32 ...

  9. MS06-040漏洞研究(中)【转载】

    课程简介 经过上次的分析,我们已经知道了MS06-040漏洞的本质,那么这次我们就通过编程实现漏洞的利用. 课程介绍 实验环境: 操作机: Windows XP 实验工具: Tools Path ID ...

随机推荐

  1. TreeList的VisibleNodesCount,Noes.Count,AllNdoesCount以及焦点节点的删除

    初始5个Nodes 隐藏23节点,打印全部节点Tag 显示23,打印全部节点Tag 隐藏全部节点,打印节点Tag TreeList.Nodes.Count == TreeList.AllNodesCo ...

  2. C++实现base64编码

    将昨天的php代码改造成C++ /*base_64.h文件*/ #ifndef BASE_64_H #define BASE_64_H /** * Base64 编码/解码 * @author lir ...

  3. NandFlash

    一.概述 1.NandFlash NAND结构能提供极高的单元密度,可以达到高存储密度,比如能达到256M,并且写入和擦除的速度也很快.应用NAND的困难在于flash的管理需要特殊的系统接口. 2. ...

  4. bzoj2734: [HNOI2012]集合选数

    Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...

  5. BZOJ 1296 粉刷匠

    Description windy有\(N\)条木板需要被粉刷.每条木板被分为\(M\)个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. ...

  6. BZOJ 1025 游戏

    Description windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对 ...

  7. Java吸收换行符

            今天做题遇到的--         由于读入的字符串可能包含空格,所以采用nextLine. int n = sc.nextInt(); for(int i=0; i<n; i+ ...

  8. XE5 Android 开发数据访问server端

    http://www.cnblogs.com/key-ok/p/3326064.html http://www.cnblogs.com/key-ok/p/3326055.html http://www ...

  9. JAVA循环结合标签使用,控制跳转

    public static void main(String[] args) { outer: for (int i = 0; true; i++) { inner: for (int j = 0; ...

  10. Ubuntu 中使用 谷歌日历

    简介 对于经常使用待办类软件的人来说,谷歌日历是个不错的选择.但每次,都要登录网页去查看,对于我这样的懒人来说似乎麻烦了些. 所以在网上找了个叫做 Calendar Indicator 的软件. 效果 ...