Linux 权限提升 10 招:从 SUID 到内核漏洞(附靶机)
文章目录写在前面提前 5 分钟情报收集第 1 招SUID / SGID 二进制滥用第 2 招sudo 配置不当NOPASSWD / 危险命令第 3 招定时任务与可写脚本Cron第 4 招Linux Capabilities比 SUID 更隐蔽第 5 招敏感文件里的凭据历史、配置、备份第 6 招PATH 劫持与可写目录抢先执行第 7 招NFS no_root_squash 与共享权限错误第 8 招用户组与容器边界docker / lxd / disk第 9 招内核漏洞Dirty Pipe / Dirty Cow 一类第 10 招共享库劫持与动态链接投毒LD_LIBRARY_PATH / RPATH十条路径怎么串成一条攻击链示例附本地靶机一键布置「故意脆弱」环境防守者速查表写在前面拿到低权限 shell 之后真正拉开差距的往往不是「会不会打点」而是能不能在有限时间内把权限抬到 root。本文按实战顺序整理10 条最常见的 Linux 提权路径每条都给攻击者视角怎么发现、怎么利用概念 命令级手法防守者视角怎么查、怎么修靶机文末给一套可本地一键布置的「故意脆弱」环境供你合法演练仅限你自己拥有或已获书面授权的系统。内核漏洞章节只讲原理、CVE 线索与防护不提供可利用 PoC。提前 5 分钟情报收集先别急着搜 exploit先把画像画清楚id;whoamiuname-acat/etc/os-releasesudo-l2/dev/nullfind/-perm-4000-typef2/dev/null getcap-r/2/dev/nullenv;echo$PATHcat/etc/crontab;ls-la/etc/cron.*psauxfls-la/opt /var/www /home2/dev/null工具向linpeas.sh、pspy看定时/短生命周期进程、GTFOBins查合法二进制滥用方式。下面 10 招基本都能被这些输出点亮。第 1 招SUID / SGID 二进制滥用原理带 SUID 的程序以文件所有者身份运行。若所有者是 root且该程序能读文件、写文件、开 shell 或执行命令就可能提权。发现find/-perm-4000-typef2/dev/null# 重点看非常见项vim、find、python、nmap、bash、env、less...利用思路以find为例# 若 find 带 SUID错误配置find.-exec/bin/sh-p\;对照 GTFOBins查每个异常 SUID 的 “SUID” 条目而不是自己瞎猜参数。防守# 盘点并去掉不必要的 SUIDchmodu-s /path/to/binary# 白名单管理只保留 passwd、sudo、ping 等确需项第 2 招sudo 配置不当NOPASSWD / 危险命令原理sudo -l若显示可无密码执行 vim、less、find、python、ALL几乎等于半个 root。发现sudo-l# 典型危险# (ALL) NOPASSWD: /usr/bin/vim# (ALL) NOPASSWD: /usr/bin/find# (root) NOPASSWD: /bin/systemctl利用思路sudovim-c:!/bin/sh# 或sudoless/etc/profile# less 内执行 !shsystemctl、apt、dpkg、管道到 shell 的脚本都是高危 sudo 规则。防守最小权限只授权具体脚本不授权解释器脚本本身不可被普通用户写避免NOPASSWD必须用时配合Defaults审计与命令参数限制sudoers中的参数白名单第 3 招定时任务与可写脚本Cron原理root 的 cron 若调用了「普通用户可写」的脚本或 PATH 可被劫持下一分钟就可能变成 root 会话。发现cat/etc/crontabls-la/etc/cron.* /var/spool/cron2/dev/null# 对脚本做写权限检查ls-la/usr/local/bin/backup.sh配合pspy观察即使 crontab 文件你读不到短时 root 进程仍可能暴露自定义脚本路径。利用思路# 若 backup.sh 对你可写echochmod us /bin/bash/usr/local/bin/backup.sh# 等待 cron 执行后/bin/bash-p防守cron 脚本属主 root权限750或更严目录不可被他人写脚本内使用绝对路径避免依赖可被污染的PATH关键任务用 systemd timer ProtectSystem等加固第 4 招Linux Capabilities比 SUID 更隐蔽原理Capabilities 把 root 能力拆细。cap_setuid、cap_dac_read_search、cap_sys_admin等一旦赋给解释器危害不亚于 SUID。发现getcap-r/2/dev/null# 危险示例# /usr/bin/python3.10 cap_setuidep利用思路/usr/bin/python3.10-cimport os; os.setuid(0); os.system(/bin/bash)防守# 移除不必要 capabilitysetcap-r/usr/bin/python3.10# 用 getcap 纳入基线巡检可并入上篇 CIS 脚本第 5 招敏感文件里的凭据历史、配置、备份原理提权不一定靠漏洞靠「密码」。.bash_history、.env、wp-config.php、数据库备份、Ansible vault 误提交都是捷径。发现grep-RniEpass(word)?|pwd|secret|token|aws_|\.pem/home /var/www /opt2/dev/null|headls-la~/.bash_history /home/*/.bash_history2/dev/nullfind/-name*.bak-o-name*id_rsa*2/dev/null|head利用思路找到明文 → 横向到其他用户 →su/ SSH 私钥登录 → 再对更高权限用户做第 2、3 招。防守禁止在 shell 历史中留密码生产禁用HISTFILE存敏感命令密钥权限600私钥不进 Web 目录配置扫描进 CI杜绝密钥入库第 6 招PATH 劫持与可写目录抢先执行原理若 root 脚本这样写# 糟糕示例cd/tmpservice_namefoo# 未写绝对路径update_cache而/tmp在 PATH 前部或当前目录可写且脚本用相对命令名攻击者可放置同名恶意程序。发现echo$PATH# 检查 root 脚本是否调用无绝对路径命令grep-RnE^\s*[a-zA-Z0-9_]\s/usr/local/bin/*.sh2/dev/null# 可写目录是否插在 PATH 前面find/-writable-typed2/dev/null|head防守所有管理脚本使用/usr/bin/cmd绝对路径系统账户 PATH 不含.与全局可写目录/tmp、/var/tmp挂载noexec,nosuid见 CIS 基线第 7 招NFSno_root_squash与共享权限错误原理NFS 导出若带no_root_squash客户端 root 映射到服务端 root。攻击者若能挂载该共享可在共享内放置 SUID bash。发现服务端cat/etc/exports# 危险/tmp/share *(rw,no_root_squash)showmount-etarget利用思路概念在授权靶机上挂载共享 → 复制 bash 并chmod s→ 回到靶机执行 SUID shell。生产环境中这也是横向移动经典手法务必在隔离实验网完成。防守默认root_squash导出目录最小权限限制客户端 IP能不用 NFS 就用更可控的对象存储/同步方案第 8 招用户组与容器边界docker / lxd / disk原理在docker组 ≈ 能挂载宿主机根目录 ≈ root。lxd/lxc组类似。对磁盘设备有写权限也能直接改系统文件。发现id# uid1000(user) groups1000(user),999(docker)ls-la/var/run/docker.sock利用思路docker 组dockerrun-it--rm-v/:/mnt alpinechroot/mnt /bin/bash防守普通运维不要进docker组改用 rootless docker 或细粒度授权审计docker.sock权限容器逃逸另论缺 seccomp/AppArmor、特权容器--privileged都是放大器第 9 招内核漏洞Dirty Pipe / Dirty Cow 一类原理内核漏洞利用的是内存管理、权限检查或命名空间边界的缺陷把低权限进程抬到 root或改写受保护文件。历史上出名的有别名CVE示例特征Dirty CowCVE-2016-5195古老但教学常见Dirty PipeCVE-2022-0847影响特定内核版本区间PwnKitCVE-2021-4034严格说是 polkit常与“本地提权全家桶”一起查攻击者怎么判断「值不值得碰」uname-rcat/etc/os-release# 再对照发行版安全公告该版本是否仍受影响、是否已打补丁本文刻意不提供 exploit / PoC。原因很简单内核利用对稳定性与版本绑定极强随手跑公开 exploit 轻则机器崩溃重则踩法律红线。授权评估请用发行商安全公告与rpm -q --changelog/apt changelog厂商或合规扫描器的本地提权检测官方修复包验证防守最有效及时打内核与 polkit 补丁比任何“加固技巧”都重要减少攻击面关不用的 SUID、收紧 sudo、开 SELinux/AppArmor生产开启livepatchUbuntu Advantage / kpatch 等缩短窗口监控异常短时间内出现新的 SUID、 Unexpected root shell、审计日志里的execve尖刺第 10 招共享库劫持与动态链接投毒LD_LIBRARY_PATH / RPATH原理若 root 执行的程序从「用户可写目录」加载.so或错误配置了RPATH/LD_LIBRARY_PATH攻击者可投放恶意库在程序启动时执行代码。发现# 对可疑 SUID/root 守护进程ldd /usr/local/bin/some_root_svc readelf-d/usr/local/bin/some_root_svc|grep-ERPATH|RUNPATH# 看是否指向 /home、/tmp、/opt/world-writable利用思路概念在可写库路径放置同名.so构造constructor或挂钩函数等待 root 进程加载。具体恶意库编写属于武器化内容靶场请用课程方提供的示意库勿在非授权环境试验。防守禁止 root 服务依赖用户可写库路径清除危险LD_LIBRARY_PATH打包时审RPATH开启 AppArmor/SELinux 限制库加载路径十条路径怎么串成一条攻击链示例一次真实演练常见组合Web 漏洞拿到www-data在/var/www备份里读到数据库密码第 5 招密码复用登录普通用户第 5 招sudo -l发现可跑find第 2 招→ root或www-data→ 可写 cron 脚本第 3 招→ root → 再评估内核是否过期第 9 招防守侧补洞。提权的本质是错误配置的优先级通常高于漏洞利用。附本地靶机一键布置「故意脆弱」环境下面脚本在全新 Ubuntu 22.04 虚拟机里制造多处提权点对应本文第 1–4、6、8 招。请用 VirtualBox/VMware/UTM 快照不要装在个人主力机或生产机。#!/usr/bin/env bash# setup_privesc_lab.sh —— 仅用于本地授权靶机# 用法在 Ubuntu 22.04 VM 上 sudo bash setup_privesc_lab.shset-euopipefail[[$EUID-eq0]]||{echo请用 root 执行;exit1;}LAB_USER${LAB_USER:-trainee}LAB_PASS${LAB_PASS:-TraineeLab}id$LAB_USER/dev/null||useradd-m-s/bin/bash$LAB_USERecho${LAB_USER}:${LAB_PASS}|chpasswd# --- 招1危险 SUID find教学用极不安全---cp/usr/bin/find /usr/local/bin/lab-findchmodus /usr/local/bin/lab-find# --- 招2sudo NOPASSWD vim ---echo${LAB_USER}ALL(ALL) NOPASSWD: /usr/bin/vim/etc/sudoers.d/lab-vimchmod440/etc/sudoers.d/lab-vim# --- 招3root cron 可写脚本 ---cat/usr/local/bin/lab-backup.shEOF #!/bin/bash echo lab backup ran at $(date) /var/log/lab-backup.log EOFchmod777/usr/local/bin/lab-backup.sh# 故意可写echo* * * * * root /usr/local/bin/lab-backup.sh/etc/cron.d/lab-backupchmod644/etc/cron.d/lab-backup# --- 招4python3 赋予 cap_setuid若 setcap 可用---ifcommand-vsetcap/dev/null[[-x/usr/bin/python3]];thensetcap cap_setuidep /usr/bin/python3||truefi# --- 招5家目录留一份「假密钥」---sudo-u$LAB_USERbash-cecho DB_PASSWORDSuperSecret123 $HOME/.env; chmod 644 $HOME/.env# --- 招6PATH 陷阱目录 ---mkdir-p/opt/lab/binchmod777/opt/lab/binechoexport PATH/opt/lab/bin:\$PATH/home/${LAB_USER}/.bashrc# --- 招8把用户塞进 docker 组若已装 docker---ifgetent groupdocker/dev/null;thenusermod-aGdocker$LAB_USERficatEOF Linux 提权靶机就绪 SSH/本地登录:${LAB_USER}/${LAB_PASS}建议快照名 : pre-privesc-lab 练习目标任选其一拿到 root: 1) SUID: /usr/local/bin/lab-find 2) sudo vim NOPASSWD 3) 可写 cron: /usr/local/bin/lab-backup.sh 4) python3 capabilities若 setcap 成功 5) 读 ~/.env 练习凭据思维 8) docker 组需自行安装 docker 练习结束后请销毁 VM 或回滚快照。 EOF推荐练习顺序快照 → 以trainee登录不用外挂工具先手写枚举每打通一招记一条对应加固措施全部打通后把上篇《CIS 一键核查脚本》拿来扫这台靶机——你会同时看到「攻」与「防」的镜像关系可选第三方靶场授权平台适合进阶TryHackMe《Linux PrivEsc》、HackTheBox 起始靶机、VulnHub 经典机如Lin.Security。内核类请优先用平台提供的受控关卡不要对随机公网主机扫 CVE。防守者速查表招数一句话防御SUID减到最少异常项进基线sudo禁解释器脚本不可写Cron脚本属主/权限/绝对路径Capabilitiesgetcap -r /定期扫凭据残留密钥扫描 权限 600PATH绝对路径禁可写目录前置NFSroot_squash IP 限制Docker 组当 root 管宁缺毋滥内核漏洞补丁与 livepatch库劫持审 RPATH加固 MAC结语:Linux 提权从不是玄学枚举 → 匹配已知错误配置 → 稳定利用 → 留痕与清理红队/ 固化基线蓝队。