欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

.NET Remoting 远程代码执行漏洞探究

来源:本站整理 作者:佚名 时间:2016-04-22 TAG: 我要投稿

 本文 是一篇关于 .NET Remoting 安全的科普文,在文章中会使用一个简单的 RCE 漏洞和提权案例进行说明。

本文主要有以下内容:

  1. 对 .NET Remoting 技术作一个简单的介绍
  2. 使用 VS 编写一个简单的.NET Remoting客户端和有漏洞的服务端。
  3. 获取.NET Remoting传输的数据。
  4. 使用 dnSpy 对 .NET Remoting 过程进行简单的调试。
  5. 重新创建一个有缺陷的应用程序,演示漏洞。
  6. 使用dnSpy对修改过的 .NET 模块打补丁,并对有漏洞的服务端继续攻击利用。

0x00 所需的工具及说明

  • Win7 虚拟机。
  • VS 2015 社区版 ,本文只需要C#组件。
  • RawCap 抓取本地网络传输的数据包。
  • Wireshark 分析抓取到的数据包。
  • dnSpy (1.4.0.0) 反编译,调试 C# 代码。

0x01 .NET Remoting 技术简介

总的来说,.NET Remoting是一种进程间通信(IPC)的方式。一个程序(可以称之为服务端)暴露一些可以远程调用的对象。其他程序(可以称之为客户端)可以创建这些对象的实例,就如同创建本地对象一样。但是,这些“本地的对象”运行在服务器端。通常情况下,这些可远程调用的对象放在一个共享的库中(如:DLL)。客户端和服务端各自保存一份此DLL文件。.NET Remoting 机制可以使用 TCP,HTTP 以及命名管道传输可远程调用的对象。

.NET Remoting 的概念与 Java 中的 远程方法调用(Java RMI) 非常类似。在 Java 的RMI中,传递的是序列化的Java对象,在 .NET 中传递的则是一个 .NET 对象。

0x02 编写一个 .NET Remoting 应用程序

接下来我会创建两个简单的 .NET Remoting 应用程序。第一个程序主要是说明创建一个.NET Remoting 客户端/服务端应用程序的方法。第二个程序的目的是描述重新创建一个有缺陷的服务端程序。

整个程序由以下三部分组成:

  1. 远程可调用的库:是一个DLL文件,包含了可远程调用的对象。
  2. 服务端
  3. 客户端

第一个 DLL 文件。创建一个解决方案和一个新的工程。选择工程类型为“类库”。根据 MSDN 文档 的描述,要创建一个可远程调用的对象,此对象要么是一个Serializable对象,要么需要继承MarshalByRefObject类。需要了解更多信息,可以在这里 看到。

远程调用库(DLL文件)的代码如下:

#!csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;  namespace RemotingSample {   public class RemoteMath : MarshalByRefObject   {     public int Add(int a, int b)    // 加法     {       Console.WriteLine("Add({0},{1}) called", a, b);       return a + b;     }      public int Sub(int a, int b)    // 减法     {       Console.WriteLine("Sub({0},{1}) called", a, b);       return a - b;     }   } } 

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载