Xbox One开发控制台上的权限提升-通过“按设计”的功能

2020-05-21 03:11:26

“UnattenddedUtilties”是在XboxDevService.exe中注册的Windows运行时类对象,XboxDevService.exe驻留在Xbox One的SRA分区中。此服务仅在授权的Xbox One在开发人员模式下运行时注册和执行,不会在零售环境中执行。最初,这是在注意到“Dev Home”应用程序文件列表中添加了一个名为“unattendent”的工具部分后发现的,该工具部分包含工具页面的脚本以及位于系统工具驱动器上的*.xboxunattendent文件。查看这些*.xboxunattend文件可以发现,它们只是带有重命名扩展名的批处理脚本。

奇怪的是,这些页面几乎没有一个实际上在标准的UWA开发人员模式下可用。它们在运行时根本不会出现在应用程序中。这些是故意藏起来的吗?它们还能用吗?

//版权所有(C)Microsoft Corporation。版权所有。_runScriptOnUsb:function(){尝试{//禁用该按钮以防止多次按下。这个。_runScriptOnUsbButton。DISABLED=TRUE;此。_closeConfigureUnattendButton。Focus();unattendUtils。runUnattenddedScriptOnUsbAsync();}catch(E){//不执行任何操作。这通常不会失败,但如果用户在正确的时间移除USB//驱动器,则可能会失败。}},

最突出的代码当然是‘unattendUtils.runUnattendedScriptOnUsbAsync()’,它达到了我的兴趣的顶峰,因为我很好奇这些“脚本”是基于调用的应用程序执行的,还是它是否是系统服务。接下来,我查看了函数所属的位置,这是一个简单的任务-‘unattendUtils’引用的名称空间是‘Microsoft.Xbox.Development.UnattendedUtilities’.。通常,在Dev Home应用程序的根目录中有一个“microsoft.xbox.development.winmd”文件!当然,如果您已经熟悉,这是Windows运行时系统使用的Windows元数据文件,其中包含驻留在另一个进程中的接口的信息。

这些文件类型可以简单地放入.NET反汇编程序(例如JetBrains dotPeek)中,并且能够查看类定义和其他类型。

哈!我们已经定义了一个接口,其中包含一些有趣的函数。但由于这些Windows元数据文件的性质,这意味着主机二进制文件与Dev Home是分开的。然而,这很容易发现,因为当客户端调用应用程序创建类对象的实例时,通常会有加载到所述应用程序中的“ProxyStub”。通过远程调试Dev Home应用程序,我们可以查看加载的模块并确定可能由哪个模块负责。由于我们在开发人员模式下运行,我怀疑它只需要与有限的可执行文件子集相关,因此,当发现Dev Home进程中加载的‘XboxDevService.ProxyStub.dll’时,我立即决定反汇编服务器本身。

由于这些脚本看起来只是批处理脚本,我认为XboxDevService将需要调用“CreateProcess”API,因此我查看了可执行文件导入并对CreateProcessW导入进行了外部引用,直到我遇到一个函数,该函数无疑为该服务提供了足够的基础。

hInput=GetStdHandle(0xFFFFFFF6);targ_Handle=hTarget;lpCmdLine=WindowsGetStringRawBuffer(scriptPath,0);//函数参数(A2)v31=(__Int64)&;v31;//如果((Unsign Int)CreateProcessW(0,lpCmdLine,0,0,1)),则通过完整路径执行脚本。//.//如果((Int)WindowsCreateStringReference(L";请参阅日志文件的SystemScratch\\boot\\logs目录),";,55,&;hSTR_HDR_LOG_DIR,&;hSTR_LOG_DIR)<;0)RaiseException(0xC000000D,1,0,0);hSTR_LOG_DIR,则创建带有吐司通知消息的字符串引用(0xC000000D,1,0,0);hSTR_LOG_。无人参与脚本完成。";,27,&;hSTR_HDR_COMPLETE_MSG,&;HSTR_CLASS_FRONTPANEL_UTILS)<;0){RaiseException(0xC000000D,1,0,0);res=CreateToast(HSTR_CLASS_FRONTPANEL_UTILS,hSTR_LOG_DIR_2,v25,v24);如果。//如果((Int)WindowsCreateStringReference(L";Microsoft.Xbox.Development.FrontPanelDisplayUtilities";,53,&;hSTR_HDR_COMPLETE_MSG,&;HSTR_CLASS_FRONTPANEL_UTILS)<;0)RaiseException(0xC000000D,1,0,0);hClassID=HSTR_CLASS_FRONTPANEL_UTILS;v28,则创建包含可激活类id的字符串引用。self_ret(*(__int64(**)(Void))(*(_QWORD*)v28+16));}//注册Windows运行时对象环

伪代码允许我们得出结论,这个特定的函数负责执行无人参与的脚本,因为它提供了弹出吐司通知的方式,而对于chuckwalla工具包,它将使用前面板,同时引用日志输出目录。通过确定前面找到的Windows元数据的宿主进程,我们现在可以开始尝试创建“UnattenddedUtilities”类的实例,并尝试执行我们自己的脚本。我在网上和Windows SDK中搜索了有关Windows Runtime类通常是如何指定的参考资料,找到了几个概述类定义的资源,但我仍然不确定。因此,我决定四处寻找其他可能依赖于UnattenddedUtilities类的二进制文件--那就是Windows设备门户。这使我走上了手动定义带有存根的接口的道路,以确保正确的偏移量…。

我很快就发现了Windows SDK中提供的实用程序,它可以帮我完成繁重的工作。

这将生成定义我们所需的所有内容的头文件。我是…。一团糟,所以我决定整理一下结果,清楚地定义我们需要什么。

MIDL_INTERFACE(";DE87AD07-75DC-4EEC-9226-5628E98B9914";)I无人参与实用工具Statics:PUBLIC IInspectable{PUBLIC:虚拟HRESULT STDMETHODCALLTYPE RemoveUnattenddScript(Void)=0;Virtual HRESULT STDMETHODCALTYPE RetrieveUnattenddScript(Void)=0;Virtual HRESULT STDMETHODCALLTYPE RetrieveAndRunUnde。virtual HRESULT STDMETHODCALLTYPE SendToastNotification(HSTRING title,HSTRING message)=0;virtual HRESULT STDMETHODCALLTYPE IsScriptRunning(boolean*isRunning)=0;virtual HRESULT STDMETHODCALLTYPE ShouldRunOobeScript(boolean*shouldRun)=0;virtual HRESULT STDMETHODCALLTYPE ShouldRunOobeScript(Boolean ShouldRun)=0;virtual HRESULT STDMETHODCALLTYPE ShouldBlockUsbScripts(boolean*shouldBlock)=0;virtual HRESULT STDMETHODCALLTYPE ShouldBlockUsbScripts(Boolean ShouldBlock)=0;virtual HRESULT STDMETHODCALLTYPE ShouldSkipAbortToast(boolean*skip)=0;virtual HRESULT STDMETHODCALLTYPE ShouldSkipAbortToast(Boolean Skip)=0;virtual HRESULT STDMETHODCALLTYPE ShouldCallDevCenter(boolean*shouldCall)=0;虚拟HRESULT STDMETHODCALLTYPE ShouldCallDevCenter(布尔值应调用)=0;虚拟HRESULT STDMETHODCALLTYPE ShouldBlockUnattendScripts(布尔值*应为块)=0;虚拟HRESULT STDMETHHODCALTYPE应为块未参加脚本(布尔值应为块)=0;虚拟HRESULT。

在编写了一个小的控制台程序并简单地使用了‘RetrieveAndRunUnattenddedScriptAsync()’函数之后,我编写了一个运行telnet的脚本,并创建了一个控制台通知来通知更明显的结果。在通过SSH部署和连接之后,我使用指定的脚本插入U盘,打开Xbox设备门户以监控进程,然后执行我的程序…。

是!。我们已经成功地运行了一个无人参与的脚本,并且还达到了最高权限级别!一旦有一个telnet实例在最高权限级别上运行,我们就可以利用从Windows Core内部版本中继承下来的‘net1.exe’,并添加一个具有管理员角色的新用户,还可以启用内置管理员帐户。只要您在切换回零售模式时避免清除数据,这些帐户在开发者模式下的重启过程中将持续存在。

利用无人值守实用程序,我们可以提升SRA分区中的现有用户权限,这也赋予了我们更大的灵活性和访问权,以便继续研究操作系统并对其进行反向工程。

由于该功能被隐藏起来,并且在做了一些调查之后,人们了解到“无人参与”功能是为了在“ERA”授权的开发工具包上使用的,并且在Xbox one XDK上有文档记录。由于这一功能在水声上起作用,我负责任地整理了一份POC和小写,并通知了MSRC。然而,反应并不是我所期待的,因为他们声称这是“故意的”,而我

由于锁定的功能要成功工作有点痛苦,我决定公开发布我的程序,使更多的人能够使用这些特权,而不仅仅是我自己和团队,希望能看到个人在做他们自己的研究。我决定公开发布我的程序,让更多的人能够使用这些特权,希望看到个人进行自己的研究。