持久化研究-Time Providers

Author:zusheng

Link:https://isbase.cc

0x01 什么是Time Providers

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

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

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

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

t0

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

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

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

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

t1

修改NtpClient注册表项:

恶意DLL成功运行。

t2

修改VMICTimeProvider注册表项:

恶意DLL成功运行。

t3

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

 

0x03 安全与隐蔽

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

重启可能会卡在System Event Nottification Service

t5

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

https://github.com/scottlundgren/w32time

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

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

t6

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

t7

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

生成注册表项GameTime

t8

修改注册表项GameTime:

成功执行恶意DLL。

t9

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

0x04 防御

  1. 限制文件和目录权限

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

  2. 限制注册表权限

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

0x05 自动检测

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

利用Sysinternals Autoruns工具分析。

t10