然而,在一个文章中反编译并介绍所有RPC信息与我们的目标无关。幸运的是,通过阅读源代码,我们发现作者已经在工具中包含了我们需要的功能,但默认没有开启且只能通过一个特殊的命令行参数在调试模式下触发。由于这个限制,我们在RpcView GUI开启并修改原来的DecompileAllInterfaces函数。如果你对使用这个功能感兴趣,可以在我们的Github中找到我们订制的RpcView工具。我们现在可以在下一节介绍Decompile All Interfaces (反编译所有接口)功能的好处了。
我们判定目标是以UtcApi为前缀的UTC接口API之后,如图4所示,我们尝试判断是否这些接口API里的每一个都会调用Access Control List (ACL) API,如SetNamedSecurityInfo和SetSecurityInfo。我们对这些ACL API感兴趣,因为它们用于修改对象的自主访问控制(DACL)安全描述符,无论对于文件、目录还是注册表对象。IDA里的另一个有用的功能是它的proximity视图,它以图形形式呈现一个函数调用图。我们使用proximity视图来寻找被上面提到的ACL API引用或调用的函数。
从这点上说,我们需要弄明白如何提交一个权限提升请求。在尝试各种应用之后,我们偶然发现了Microsoft Feedback Hub,这是一个Windows默认自带的Universal Windows Platform (UWP)应用。在研究过程中,你会发现调试UWP应用很有用。不幸的是,你不能使用windbg直接打开或附加一个UWP应用。然而,可以通过PLMDebug工具开启UWP应用调试功能,这个工具来自Windows10 SDK调试工具集。你可以先通过Powershell内建cmdlet确定Feedback Hub的完整包家族名:
获得完整包名后,我们再次使用PLMDebug开启Feedback Hub的UWP调试:
下一次启动Feedback Hub时,应用将执行并自动附加到WinDbg。
图6:从Process Monitor的事件属性中确定API调用的偏移
启动Feedback Hub后,我们一步步按照应用在屏幕上的指令向下执行,并开始在Process Monitor中看活动记录。这是一个好信号,这表明我们已经在追踪了。当我们查看图6中高亮的SetSecurityFile事件的调用栈时,在偏移0x15A091(diagtrack.dll的基地址可以在事件属性(Event Properties)的Process标签页找到)处发现了ACL API SetSecurityInfo的返回地址。正如你所看到的,这个偏移属于函数Microsoft::Diagnostics::Utils::FileSystem::SetTokenAclOnFile,如图6中反汇编所示,它也出现在图5的proximity视图中。这证明了我们可以利用Feedback Hub到达我们期望的代码路径。
而且,Process Monitor的输出还告诉我们这个事件尝试设置文件对象的DACL,但是通过静态分析来找文件对象是如何产生的太耗时了。幸运的是,这个进程没有被Protected Process Light (PPL)机制保护,我们可以对svchost.exe附加一个有管理员权限的本地调试器,这个程序负责托管UTC服务。这就给了我们灵活性,可以通过动态调试UTC服务来了解文件路径产生的过程。