Windows TelemetryController权限维持
本文是对以下文章的学习,记录学习心得和利用方法。
参考文章
- https://www.trustedsec.com/blog/abusing-windows-telemetry-for-persistence/
- https://3gstudent.github.io/利用TelemetryController实现的后门分析
- https://www.hexacorn.com/blog/2021/05/20/byot-bring-your-own-telemetry/
0x01 介绍
该方式由于要写注册表,需要管理员权限,感觉比较鸡肋,所以学习多一种权限维持的方法。拥有管理员权限也还有其他更多权限维持的方法可以利用。
该技术在ATT&CK中编号是T1053.005。利用了Windows计划任务进行权限维持。
0x02 前置知识
TelemetryController
Windows7及以上系统的遥测技术,是微软检测用户Win10兼容性的侦测程序,所以win7默认是没有这个的,需要打了[kb4507456](https://support.microsoft.com/en-us/topic/july-9-2019-kb4507456-security-only-update-cf4fc923-90c0-dd46-401e-d3741a2afe71)
或者是KB44900628
SSU补丁包后才会有该计划任务。
对应的进程为CompatTelRunner.exe
,会定期将计算机的诊断和使用数据、系统信息、自动发送给Windows。
可通过计划任务启动(管理员权限)。
1 | schtasks /run /tn "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" |
计划面板位置:\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser
该计划任务默认启用,并在有网络连接的前提下,每天运行一次。不管用户有没有登录也会运行。
在命令行中查看该计划任务
1 | schtasks /query /tn "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" |
除此之外CompatTelRunner.exe
有三种运行模式(Nighlty、Oobe、Maintenance),本文利用主要依赖普通模式(Nighlty),程序运行需要满足以下条件其中一条
- 系统是Windows10 或者是 Server 2019
- 系统是Windows客户端版本
- HKEY_LOCAL_MACHINE \Software\Microsoft\Windows\CurrentVersion\Policies\DataCollection\CommercialDataOptIn是DWORD类型 并且不为0
如果程序指定了dll和api函数,将会验证其是否在允许的白名单里面,避免被滥用。然后会启动dll执行指定的函数,如果没有指定dll和api函数,就会继续运行,执行下一步检查运行模式。
如果HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\TelemetryController\Oobe
存在并且没有提供maintenance
参数则会进入oobe模式(没搞懂这模式干什么的),如果提供了maintenance
参数,则会开始验证运行进入模式0,并验证注册表HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\TelemetryController\TestAllowRun
的类型是否为REG_DWORD和值不为0。然后会开始检查一些系统状态(主要是电源的状态)
- 电源保护程序没有开启,如果开启,则一直失败。
- 机器处于充电状态。
- 如果已经验证失败4次,电源状态未知,但电池大于5%,或者在充电,则通过检查。
如果通过了一次验证,则会将**HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\TelemetryController的RunsBlocked值项修改为0
,**如果验证没有通过则为1。
如果没有提供额外的命令行参数,则会进行模式1(Nightly)。
确定了运行模式后,则会对计划任务进行一些检查,然后进入**HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\TelemetryController
**的区域,运行该键下的子键内容。
0x03 利用
注册表位置:Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\
在该注册表项中添加的任意Key会影响到CompatTelRunner.exe
的运行参数。
常规利用
在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\
下添加任意键,并添加下面值项内容。
添加的值项信息如下
1 | Command REG_SZ C:\Windows\System32\notepad.exe |
通过命令实现
1 | reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\test" /v Nightly /t REG_DWORD /d 1 |
使用命令手动运行计划任务
1 | schtasks /run /tn "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" |
通过Process Explorer发现notepad.exe
被CompatTelRunner.exe
启动
在Win10系统下,通过CompatTelRunner.exe
检查后会以System权限运行notepad.exe
和CompatTelRunner.exe
。
Win10在无网络连接的情况下,命令行执行计划任务,还是会以System用户执行,CompatTelRunner.exe
会持续执行一段时间,大概十多分钟后CompatTelRunner.exe
将会运行notepad.exe
。
Win7在无网络连接(指网络连接被禁用)的情况,命令行运行该计划任务,CompatTelRunner.exe及其后续程序将不会被运行。
更稳定的利用方式
这个方法在三好学生的文章下看到。
三好学生发现直接修改HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\Appraiser
的Command值项,能绕过检查,并且能稳定执行Command。
修改注册表配置命令
1 | reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\Appraiser" /v Command /t REG_EXPAND_SZ /d "C:\WINDOWS\system32\cmd.exe /c notepad.exe" /f |
还原配置命令
1 | reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\Appraiser" /v Command /t REG_EXPAND_SZ /d "%windir%\system32\CompatTelRunner.exe -m:appraiser.dll -f:DoScheduledTelemetryRun" /f |
手动执行计划任务运行
1 | schtasks /run /tn "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" |
经过测试Sku项会影响compattelrunner.exe
执行,当Sku项值为1时,则会运行Command的内容,若Sku为0或者是其他,就不会运行Command项的内容,Sku项不存在,则默认为1(猜的)。
在测试模式的时候,发现以管理员权限在cmd下直接运行compattelrunner.exe
,也会执行相应的程序,不过这样执行的话,权限自然就是用户权限,不是System了。
另外Win7在断网的情况下,也可以正常执行(有网络连接,但是不能上网的情况)。
失败的DLL侧加载
当查看默认Command值时发现为
1 | CompatTelRunner.exe -m:appraiser.dll -f:DoScheduledTelemetryRun |
下意识的以为能够作为dll loader工具进行dll侧加载。但是进行了一些简单的测试后发现并不行。。
If command line parameters that specify a DLL/function are provided, CompatTelRunner.exe validates them against an approved list. This causes CompatTelRunner.exe to start the DLL provider and exit. If a DLL/function name is not provided, the program continues on to identifying the run mode.
这描述简单说明了,程序会检查输入的dll,和要执行的api函数,防止被滥用。
程序会检查是否从系统目录中进行加载dll,dll、api函数是否为白名单的内容,
1 | appraiser.dll |
尝试武器化
正好用来学习使用Win32api来对注册表进行修改。
常规利用方式的代码(C++实现)
1 |
|
0x04 防御加固
检查进程CompatTelRunner.exe
分析进程CompatTelRunner.exe下是否有可疑子进程。
禁用计划任务Microsoft Compatibility Appraiser
1 | schtasks /Change /DISABLE /tn "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" |
查看注册表的默认值是否被修改
查看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\Appraiser
键的Commond
项是否被篡改,默认值为:
1 | Command REG_EXPAND_SZ %windir%\system32\CompatTelRunner.exe -m:appraiser.dll -f:DoScheduledTelemetryRun |
查看注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController
下是否有可疑的子键
1 | reg query "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\" |
默认值如下:
1 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\Appraiser |
加固
将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\TelemetryController\
子键的Sku项设置为0