在Session 0中创建用户进程
2013-09-12 13:13
274 查看
在Windows XP, Windows Server 2003或者更早期的Windows操作系统中,所有的服务和应用程序都是运行在与第一个登录到控制台的用户得Session中。这个Session叫做Session 0。在Session 0 中一起运行服务和用户应用程序,由于服务是以高权限运行的,所以会造成一些安全风险。这些因素使得一些恶意代理利用这点,来寻找提升他们自身权限的结构。
在Windows7中,服务在一个叫做Session 0 的特殊Session中承载。由于应用程序运行在用户登录到系统后所创建的Session 0 之后的Session中,所以应用程序和服务也就隔离开来:第一个登录的用户在Session 1中,第二个在Session 2中,以此类推。事实上运行在不同的Session中,如果没有特别将其放入全局命名空间(并且设置了相应的访问控制配置),是不能互相传递窗体消息,共享UI元素或者共享kernel对象。
利用CreateProcessAsUser,我们可以在Session 0中创建用户进程,下面提供两种创建方式:
在Windows7中,服务在一个叫做Session 0 的特殊Session中承载。由于应用程序运行在用户登录到系统后所创建的Session 0 之后的Session中,所以应用程序和服务也就隔离开来:第一个登录的用户在Session 1中,第二个在Session 2中,以此类推。事实上运行在不同的Session中,如果没有特别将其放入全局命名空间(并且设置了相应的访问控制配置),是不能互相传递窗体消息,共享UI元素或者共享kernel对象。
利用CreateProcessAsUser,我们可以在Session 0中创建用户进程,下面提供两种创建方式:
typedef BOOL (*FUNCTypeA)( LPVOID*, HANDLE, BOOL) ; typedef BOOL (*FUNCTypeB)( LPVOID ); typedef DWORD (WINAPI* PWTSActiveSessionID)(); DWORD GetActiveConsoleSessionId() { PWTSActiveSessionID pWTSActiveSessionID; DWORD dwResult = 0; HINSTANCE hKernal32 = NULL; do { OSVERSIONINFO os = {sizeof(OSVERSIONINFO)}; GetVersionEx(&os); if(os.dwMajorVersion == 5 && os.dwMinorVersion==0) { break; } else { hKernal32 = LoadLibrary(_T("kernel32.dll")); if(hKernal32 == NULL) { break; } pWTSActiveSessionID = (PWTSActiveSessionID)GetProcAddress(hKernal32, "WTSGetActiveConsoleSessionId" ); if(pWTSActiveSessionID == NULL) { break; } dwResult = pWTSActiveSessionID(); } } while(FALSE); if(hKernal32 != NULL) FreeLibrary(hKernal32); return dwResult; } BOOL CreateUserProcess1(LPTSTR szMonName) { DWORD dwSessionId; BOOL bResult; HANDLE hTokenThis = NULL; HANDLE hTokenDup = NULL; HANDLE hThisProcess; STARTUPINFO starinfo; PROCESS_INFORMATION processinfo; HMODULE hModule; FUNCTypeA CreateEnvironmentBlock; FUNCTypeB DestroyEnvironmentBlock; hThisProcess = GetCurrentProcess(); DWORD ddd = GetLastError(); bResult = OpenProcessToken(hThisProcess,TOKEN_ALL_ACCESS, &hTokenThis); ddd = GetLastError(); bResult = DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED,NULL, SecurityIdentification, TokenPrimary, &hTokenDup); dwSessionId = GetActiveConsoleSessionId(); bResult = SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD)); hModule =LoadLibrary(_T("userenv.dll")); if (hModule) { CreateEnvironmentBlock = (FUNCTypeA) GetProcAddress(hModule,"CreateEnvironmentBlock"); DestroyEnvironmentBlock= (FUNCTypeB)GetProcAddress(hModule,"DestroyEnvironmentBlock"); } ZeroMemory( &starinfo, sizeof(STARTUPINFO) ); ZeroMemory( &processinfo, sizeof(PROCESS_INFORMATION) ); starinfo.cb = sizeof(starinfo); starinfo.wShowWindow = SW_SHOWNORMAL; starinfo.dwFlags |= STARTF_USESTDHANDLES; starinfo.lpDesktop = L"WinSta0\\Default"; FreeLibrary(hModule); TCHAR zsAppName[MAX_PATH]; _tcscpy(zsAppName,szMonName); bResult = CreateProcessAsUser( hTokenDup, zsAppName, NULL, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &starinfo, &processinfo); CloseHandle(hTokenDup); if(bResult) { CloseHandle(processinfo.hThread); CloseHandle(processinfo.hProcess); return TRUE; } return 0; } typedef DWORD (*WTSGETACTIVECONSOLESESSIONID)(void); typedef BOOL (WINAPI *WTSQUERYUSERTOKEN)(ULONG,PHANDLE); WTSQUERYUSERTOKEN WTSProc=NULL; HMODULE hModWTS=NULL; BOOL CreateUserProcess2(TCHAR *filename) { PROCESS_INFORMATION pInfo; STARTUPINFO sInfo; BOOL bRet = FALSE; ZeroMemory(&sInfo,sizeof(sInfo)); ZeroMemory(&pInfo,sizeof(pInfo)); sInfo.cb=sizeof(STARTUPINFO); sInfo.cbReserved2=0; sInfo.dwFillAttribute=0; sInfo.dwFlags=STARTF_USESHOWWINDOW; sInfo.wShowWindow=SW_SHOW; sInfo.lpDesktop = L"winsta0\\default"; HANDLE hToken=NULL; HMODULE hmod = LoadLibrary( L"kernel32.dll"); if(hmod == NULL) { return bRet; } WTSGETACTIVECONSOLESESSIONID lpfnWTSGetActiveConsoleSessionId = (WTSGETACTIVECONSOLESESSIONID)GetProcAddress(hmod, "WTSGetActiveConsoleSessionId"); DWORD dwSessionId=-1; dwSessionId = lpfnWTSGetActiveConsoleSessionId(); FreeLibrary(hmod); hModWTS = LoadLibrary( L"wtsapi32.dll"); if(hModWTS !=NULL) { WTSProc = (WTSQUERYUSERTOKEN) GetProcAddress(hModWTS, "WTSQueryUserToken"); TCHAR zsAppName[MAX_PATH]; _tcscpy(zsAppName,filename); if(WTSProc!=NULL) { if(WTSProc(dwSessionId,&hToken)!=0) { if(CreateProcessAsUser(hToken,NULL,zsAppName,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS ,NULL,NULL,&sInfo,&pInfo)) { CloseHandle(pInfo.hThread); CloseHandle(pInfo.hProcess); bRet = TRUE; } CloseHandle(hToken); } } FreeLibrary(hModWTS); hModWTS = NULL; } return bRet; }
相关文章推荐
- 创建用户桌面进程(突破Session 0隔离)
- VS2010 ATL服务程序编写全攻略(三) - 创建用户桌面进程(突破Session 0隔离)
- "SYSTEM"用户创建进程
- 读取进程内所有用户Session
- java web 监听系统在线用户人数(tomcat session的创建时机)
- System进程无法创建一个Administrator用户的子进程
- salt进程查看插件&salt批量创建用户
- windows 模拟用户会话创建进程
- 通过API HOOK 创建SYSTEM用户进程
- 用户/服务器进程概念及v$session/V$PROCESS视图简介
- system 用户创建的进程创建当前用户(如Administrator)的进程。
- oracle创建用户ORA-01045:user lacks CREATE SESSION privilege;
- 在服务中创建用户进程的方法(C#版)
- 在服务中创建用户进程的方法(C#版)
- 详解 进程_用户及组的创建、更改、删除 附小李子
- OCM_Session7_2_创建组,用户,设置用户密码
- 子进程会继承父进程用户id,用户组id,用户信息,文件描述符,数据段,堆栈,当前工作目录,创建文件权限,信号处理方式,进程组号,会话期号。
- 逆向工程之内核下创建用户进程
- 如何利用Win32服务进程去创建一个GUI用户进程?
- Windows使用任意用户创建进程