但却出现了问题,之前产品代码中会调用windows API - CreateProcessAsUser,来以另一个账号的身份启动另一个进程,另一个账号是通过UI单独提供的。 通过查询CreateProcessAsUser微软的官方文档可知,执行此API需要两个权限方可成功,如下: 1. SE_INCREASE_QUOTA_NAME 2. CreateProcessAsUser function https://msdn.microsoft.com/en-us/library/windows/desktop/ms682429(v=vs.85
在Windows平台,如果需要以某个指定用户来运行程序,此时可以通过使用 Windows CreateProcessAsUser API来实现。但是要实现这个功能首先需要有要切换用户的用户名和密码。 win32process.STARTUPINFO() (hProcess, hThread, dwProcessId, dwThreadId) = \ win32process.CreateProcessAsUser 在用 CreateProcessAsUser API执行命令后,可以通过 GetExitCodeProcess api 来检查进程状态,如果返回结果是 win32con.STILL_ACTIVE,我们可以继续等待
新访问令牌的模拟级别为SecurityIdentification,而且令牌类型为TokenPrimary,表示新令牌是可以在CreateProcessAsUser函数中使用的主令牌。 最后,根据新令牌调用CreateEnvironmentBlock函数创建一个环境块,用来传递给CreateProcessAsUser使用。 获取环境块之后,就可以调用CreateProcessAsUser来创建用户桌面进程了。 创建一个新进程及其主要线程,新进程在由指定令牌表示的用户的安全上下文中运行 BOOL WINAPI CreateProcessAsUser( _In_opt_ HANDLE 创建用户的session环境 ::CreateEnvironmentBlock(&lpEnvironment,hDuplicatedToken, FALSE) 再在复制的会话下面执行创建进程的操作 ::CreateProcessAsUser
///
S模式代替窗口消息 2、如果服务程序需要UI与用户交互的话,有两种方式: ①用WTSSendMessage来创建一个消息框与用户交互 ②使用一个代理(agent)来完成跟用户的交互,服务程序通过CreateProcessAsUser 在XP的FUS下能工作的服务程序将很可能可以在新版系统中工作,注意XP的FUS下的测试不能检测到在Session 0下跟视频驱动有关的问题 本文我们的服务程序将通过CreateProcessAsUser ; #endregion #region DllImports [DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUser CreateProcessAsUser(hUserToken, appPath, // Application Name 参考资料 穿透Session 0 隔离(一) Windows中Session 0隔离对服务程序和驱动程序的影响 CreateProcessAsUser 源代码下载 本示例代码托管地址可以在原出处找到
q 突破SESSION 0隔离创建进程:主要通过CreateProcessAsUser函数实现用户进程创建。 5.CreateProcessAsUser函数 创建一个新进程及主线程,新进程在由指定令牌表示的用户安全上下文中运行。 获取环境块后,就可以调用CreateProcessAsUser来创建用户桌面进程。CreateProcessAsUser函数的用法以及参数含义与CreateProcess函数的用法和参数含义类似。 该程序实现的关键是调用CreateProcessAsUser函数。需要程序创建并复制一个新的访问令牌,并获取访问令牌的进程环境块信息。 安全小贴士 可以通过挂钩CreateProcessAsUser函数监控进程创建。
UI程序 涉及的Win32 API WTSGetActiveConsoleSessionId获取活动的Session ID WTSQueryUserToken根据Session ID获取用户Token CreateProcessAsUser bool CloseHandle(IntPtr hSnapshot); [DllImport("advapi32.dll")] public extern static bool CreateProcessAsUser lpStratupInfo.lpDesktop = @"winsta0\default"; PROCESS_INFORMATION lpProcessInfo; isOk=CreateProcessAsUser
AIS服务(AppInfo Service)调用的CreateProcessAsUser() 函数创建进程而且赋予恰当的管理员权限,在理论上说AIS服务(所在的进程)是提权后进程的父进程。 IceSworld,Process Explorer等) 查看时,会发现提权的进程的父进程是创建它的进程,这是由于AIS利用了CreateProcessAsUser() API中的一个新的功能,这里的新功能就是将提权进程的父进程设置成创建该进程的进程 这里微软的东东首推MSDN,以下去看下喽: 在MSDN中介绍的,假设是CreateProcessAsUser 的dwCreationFlags 的參数被设置为EXTENDED_STARTUPINFO_PRESENT
ps:(winxp下没有尝试是否能创建进程) 所以我们有了新的方法.不调用CreateProcess函数.而调用 CreateProcessAsUser函数. 并且进行一定的设置才可以. CreateProcessAsUser(TokenDup, szPath, NULL, NULL, NULL, FALSE, dwCreationFlags, pEnv, NULL, &si, &pi) ) { int error2 = GetLastError(); WriteLogString(L"RunRemoteControl CreateProcessAsUser \r\n")); } else { OutputDebugString(TEXT("CreateProcessAsUser false! CreateProcessAsUser(TokenDup, szPath, NULL, NULL, NULL, FALSE, dwCreationFlags, pEnv, NULL, &si, &pi)
,这里不做过多介绍,详见CreateProcessAsUser,后续博文里可能会更详细的介绍. 创建新的工作对象大致经过如下步骤: 通过CreateJobObject创建一个工作对象; 通过SetInformationJobObject设置工作对象的参数,详见MSDN; 以CREATE_SUSPENDED方式启动进程,通过CreateProcessAsUser
调用CreateProcessAsUser()时,将显示扩展的_STARTUPINFO_以及步骤1和4的结果。 调用DeleteProcThreadAttributeList()。 Timeout, [out] struct APP_PROCESS_INFORMATION* ProcessInformation, [out] long *ElevationType ); 该函数的大部分参数与CreateProcessAsUser API类似,服务会使用CreateProcessAsUser来创建新的UAC进程。 此标志参数直接映射到CreateProcessAsUser的dwCreateFlags参数。
. [+] CreateProcessAsUser OK.
CloseHandle(pi.hThread); return true; } 管理员权限应用 启动 非管理员权限进程 针对这种场景,就是常说的降权运行进程的操作,这种有两种实现方式,一种是利用CreateProcessAsUser 传入用户态Token来实现用户权限启动进程,一种是explorer来代理进程启动,两种方法各有优劣 CreateProcessAsUser:通常,调用 CreateProcessAsUser函数的进程必须具有 CreateProcessAsUser简略实现如下,可自行适配调整使用 inline constexpr const wchar_t* SLowIntegritySid = L"S-1-16-4096" ::CreateProcessAsUser(token, NULL, (LPWSTR)commandLine.toStdWString().c_str(), NULL, NULL, FALSE, CREATE_PRESERVE_CODE_AUTHZ_LEVEL
TCHAR szCmd[1024] = {0}; _sntprintf_s(szCmd,_countof(szCmd),_TRUNCATE,_T("%s"),lpCommand); if( CreateProcessAsUser
后来逆向了一下Win32_Process所以在的dll文件,发现其中启动进程是使用CreateProcessAsUser,且在此之前做了很多和用户有关的操作。 ProcessInformation; memset(&ProcessInformation, 0, sizeof(ProcessInformation)); BOOL bRet = CreateProcessAsUser
最后,攻击者将能够获取到这个令牌,然后使用CreateProcessWithToken()或CreateProcessAsUser()函数传递令牌,并创建一个新的进程来获取SYSTEM权限。
You can also create a process using the CreateProcessAsUser or CreateProcessWithLogonW function.
然后需要更改的就是GetSystem函数,原来的exp,该函数是用来进行后续的CreateProcessAsUser操作的,我们这里用不到,把它改成下面这样就行了: BOOL GetSystem(HANDLE
测试:「同样功能的 CreateProcessAsUser、CreateProcessWithLogon、CreateProcessWithToken 应该有类似的问题,可以一起搜一下看看都处理了没有。
System\CurrentControlSet\Control\Session Manager\AppCertDlls下写入dll的路径,可以将此注册表项下的DLL加载到调用CreateProcess,CreateProcessAsUser