权限提升(Privilege Escalation)战术在 Linux 环境下的检测策略
在 Linux 服务器攻防对抗中,攻击者在通过 Web 应用漏洞或弱口令获取到低权限 WebShell(如www-data、nobody或低权限业务账号)后,下一步的核心目标必然是获取系统的最高控制权——root权限。
提权技术五花八门,涵盖了内核漏洞利用、Sudo 配置疏漏、SUID 高危二进制文件滥用、环境变量劫持以及定时任务(Cron Job)不当权限配置等。蓝队防御人员不能等到主机被彻底控制才去排查,必须建立起常态化、多维度的本地权限提升威胁感知与检测机制。
Linux 提权的主要路径与威胁模型
根据 ATT&CK 框架中的TA0004 (Privilege Escalation)战术,Linux 环境下的提权手法通常分为以下四大流派:
graph TD A[低权限获取: www-data / 业务账号] --> B{提权路径决策} B -->|路径 1| C[SUID / SGID 危险二进制滥用] B -->|路径 2| D[Sudoers 权限过度赋予与免密配置] B -->|路径 3| E[可写 Cron 脚本与环境变量劫持] B -->|路径 4| F[未修复 Linux 内核溢出漏洞] C --> G[获取 root Shell] D --> G E --> G F --> G- SUID / SGID 危险二进制文件(GTFOBins 滥用):
管理员或安装包错误地为具备文件读写或命令执行能力的程序赋予了 SUID 权限(如chmod u+s /usr/bin/find或vim、cp、nmap),普通用户执行时将继承root权限。 - Sudoers 配置失误(NOPASSWD 过度开放):
在/etc/sudoers中配置了deploy ALL=(ALL) NOPASSWD: /usr/bin/python等免密执行规则,攻击者可直接通过 Python 启动交互式 root 终端。 - 敏感文件与定时任务可写权限(Insecure File Permissions):
由 root 周期性执行的脚本(如/etc/crontab或/etc/cron.d/*)其文件属主或所在目录对普通用户开放了写权限(777),攻击者只需向脚本末尾追加反弹指令即可。 - 内核漏洞提权(Kernel Exploits):
利用老旧未修补的 Linux 内核漏洞(如 Dirty COW、Dirty Pipe、io_uring 漏洞)直接覆写进程凭据结构体cred。
编写自动化提权风险基线巡检脚本
以下展示了一个用于在企业 Linux 主机中定期执行的提权风险自动化扫描与审计脚本:
import os import stat import subprocess import glob from typing import List, Dict # GTFOBins 常见的高危 SUID 目标清单 HIGH_RISK_SUID_BINARIES = { "find", "vim", "vi", "bash", "sh", "cp", "mv", "nano", "less", "more", "awk", "gawk", "python", "python3", "perl", "ruby", "lua", "env", "tar", "zip", "docker", "pkexec", "systemctl", "curl", "wget" } def scan_suid_binaries() -> List[Dict[str, str]]: """扫描系统中所有配置了 SUID 权限的文件并标记高危项""" findings = [] # 查找全局 SUID 文件 try: cmd = ["find", "/", "-perm", "-4000", "-type", "f", "-xdev"] output = subprocess.check_output(cmd, stderr=subprocess.DEVNULL, text=True) for filepath in output.strip().splitlines(): filename = os.path.basename(filepath) is_high_risk = filename in HIGH_RISK_SUID_BINARIES findings.append({ "path": filepath, "binary": filename, "is_dangerous": "CRITICAL" if is_high_risk else "NORMAL" }) except Exception as e: pass return findings def scan_writable_cron_jobs() -> List[str]: """检查以 root 身份运行的定时任务是否存在非 root 可写漏洞""" vulnerabilities = [] cron_paths = ["/etc/crontab", "/etc/cron.daily/*", "/etc/cron.hourly/*", "/etc/cron.d/*"] for pattern in cron_paths: for file in glob.glob(pattern): try: st = os.stat(file) # 检查是否对 Group 或 Others 开放了写权限 (0022 掩码之外的 0002 / 0020) if bool(st.st_mode & stat.S_IWOTH) or bool(st.st_mode & stat.S_IWGRP): vulnerabilities.append(f"危险:Cron 配置文件对普通用户可写: {file}") except Exception: continue return vulnerabilities基于 Auditd 与 eBPF 的实时提权行为检测
除了静态巡检,基于内核事件的实时阻断是防御高级提权的核心:
- Auditd 规则配置:监控
setuid、setgid与execve系统调用,对非常规提权行为进行告警:# 监控 setuid 系统调用 auditctl -a always,exit -F arch=b64 -S setuid -F auid>=1000 -F auid!=4294967295 -k priv_escalation # 监控 /etc/sudoers 文件的写操作 auditctl -w /etc/sudoers -p wa -k sudoers_modification - 开启内核安全加固参数:
在/etc/sysctl.conf中配置:# 禁止未授权用户查看 dmesg 内核日志(防止内核地址泄露) kernel.dmesg_restrict = 1 # 限制 ptrace 调试范围,仅允许父进程调试子进程 kernel.yama.ptrace_scope = 2 # 禁用非特权用户的 eBPF 加载 kernel.unprivileged_bpf_disabled = 1
收紧每一次配置细节,剥离非必要的 SUID 权限,开启内核级审计规则,才能在攻击者企图跨越权限边界的瞬间实现精确捕获与阻断。