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

利用.NET反序列化漏洞获取NTLM Hashes

来源:本站整理 作者:佚名 时间:2018-05-08 TAG: 我要投稿

在最近的一次渗透测试中,我们遇到了一个用来获取管理员凭据的有趣技术(当然,NTLM散列已被破解)。这次攻击并没有什么特别新的东西,它需要特殊的条件才能实现,但我们认为这足让我们把它分享出来。在mediaservice.net博客上Gianluca Baldi最近发布的一篇博客文章中,也描述了非常类似的技术。我们发现我们能够做一些非常相似的事情,但针对利用的不是XXE而是.net反序列化漏洞。
当用户加载恶意文件时会触发此特定漏洞,因此需要用户交互,但在网络中可访问的应用程序中可能存在类似的漏洞。 这完全取决于数据的反序列化位置。
反序列化基础
反序列化是任何执行大量应用程序或Web应用程序安全测试的人都应该熟悉的东西。通常在Java环境中讨论,反序列化漏洞是许多应用程序(包括.NET应用程序)中都有可能会出现的漏洞。
对于那些不太熟悉的人来说,序列化就是将一个对象转换成一个字节流的过程,这样就可以轻松保存在磁盘文件或数据库中。反序列化是序列化的逆过程;通常这可以用于两个应用程序(可能位于不同主机上)间通信的RPC。当应用程序的状态需要保存时(这也很常见),序列化的数据会被写入磁盘并在之后进行恢复。
我们可以通过下面的例子看到这一点。
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace serialisationTest1
{
    [Serializable]
    class MyClass
    {
        private int x = 1;
        private int y = 2;
        public string s = "Hello World";
        public MyClass() { Console.WriteLine("In Constructor"); }
        public void Method() { Console.WriteLine("Method()"); }
        public void Dispose()
        {
            Console.WriteLine("Disposing Object");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            MyClass myClass = new MyClass();
            using (FileStream fileStream = File.OpenWrite("save"))
            {
                binaryFormatter.Serialize(fileStream, myClass);
            }
        }
    }
}
这将创建一个文件并保存,我们可以在文本编辑器中查看。

当应用程序对不可信数据进行反序列化时,有时可能会被攻击者所利用。如果我们看一下上面的反序列化的对象,很明显,虽然我们不能直接向应用程序注入代码,但是如果反序列化的对象在它的构造函数中或在它的dispose方法中,我们或许能够对其进行利用(即恶意的)- 当.NET对象被销毁时,垃圾回收器调用的方法。这是因为当进行反序列化尝试时,实际上该对象确实被创建并销毁,即使该对象由于类型错误而无法使用。
漏洞
在测试中,我们发现桌面安装了.NET应用程序。尽管我们并不了解应用程序的性质,但我们可以肯定的是它具有“保存”功能。为了保存,应用程序用一个特定的对象并将其序列化到磁盘。之后它可以通过相反的方式加载这个保存的对象并反序列化它。
漏洞代码类似于下面:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace serialisationTest1
{
    class Program
    {
        static void Main(string[] args)
        {
            string saveFile = "save";
            MyClass myClass = null;
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            FileStream fileStream = File.OpenRead(saveFile);
            try {
                Object o = binaryFormatter.Deserialize(fileStream);
                myClass = (MyClass)o;
                myClass.Method();

[1] [2]  下一页

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