什么是sudo逃逸?
sudo 逃逸(也常称 sudo 提权)是 Linux / 类 Unix 系统中,低权限用户利用sudo 配置错误或sudo 自身漏洞,突破权限限制,获取root(超级管理员)权限的攻击手段。
一、sudo 基础
sudo(Substitute User Do)是系统权限管理工具,允许普通用户以 指定用户(通常是 root) 身份执行特定命令,依赖 /etc/sudoers 配置文件控制权限。
查看当前用户 sudo 权限:
sudo -l正常逻辑:仅执行配置中允许的命令,且需用户自身密码(可配置免密)
二、逃逸核心原理
利用 sudo 的权限边界漏洞,让被授权的 “安全命令” 在执行过程中,间接调用 shell 或执行任意代码,从而拿到 root 权限
sudo核心特性
最小权限原则:不用切换到root用户,临时使用root用户权限执行单条命令
灵活配置:可以通过配置文件/etc/sudoers或/etc/sudoers.d/精确控制用户拥有权限
操作审计性:所有sudo操作会被记录到日志/var/log/auth.log
sudo工作原理

sudo配置文件详解
/etc/sudoers: 主配置文件是sudo“权限规则手册”,定义可以执行什么命令
/etc/sudoers.d/:附加配置目录
典型的配置语法结构
用户/用户组 主机名=(可切换到的用户:用户组) [NOPASSWD:]命令列表配置示例
# 允许 alice 在任意主机以 root 身份执行所有命令
alice ALL=(ALL:ALL) ALL
# 允许 wheel 组成员无需密码执行 systemctl 命令
%wheel ALL=(ALL) NOPASSWD: /bin/systemctl
# 允许 bob 以用户 www-data 身份管理 nginx
bob ALL=(www-data) /usr/sbin/nginx
# 管理员组可执行所有命令
%admin ALL=(ALL:ALL) ALL
# web管理员组可管理nginx
%webadmins ALL=(root) /usr/sbin/nginx, /bin/systemctl reload nginx三、权限逃逸:利用NOPASSWD 绕过常规提权
如果管理员给某个用户配置了 NOPASSWALL=(ALL:ALL) NOPASSWD: ALL权限,这实际上赋予了该用户极高的权限,比如可以使用vim 内部调用系统 Shell 或直接编辑敏感文件
先解决 jack 用户密码 / 存在性问题
1. 确认 jack 用户存在(不存在则创建)
# 检查用户是否存在
id jack
# 如果提示不存在,创建 jack 用户(按回车跳过密码设置,后续用sudo免密)
sudo useradd jack2.为 jack 设置系统登录密码(若需要切换用户)
如果后续要通过 su - jack 切换用户,必须设置密码:
sudo passwd jack
# 输入两次新密码(比如设置为:jack123,仅测试用)3. 编辑 sudoers 文件(唯一安全方式)
首先用 visudo 打开配置文件,它会自动检查语法,防止配置错误:
sudo visudo4. 添加 NOPASSWD 配置(按场景选择)
在文件末尾添加配置,优先遵循最小权限原则,不要全局授权!
场景 1:给单个用户(比如 jack)免密执行指定命令
(最安全,推荐)
# 格式:用户名 主机=(执行身份) NOPASSWD: 命令绝对路径
jack ALL=(ALL) NOPASSWD: /usr/bin/vim, /usr/bin/cat解释:jack 用户可以在所有主机(ALL)上,以所有用户身份(ALL),免密执行
vim和cat命令(必须写绝对路径)多个命令用逗号分隔,注意逗号后要有空格
场景 2:给单个用户免密执行所有命令
(极不安全,仅测试 / 应急用,禁止生产环境用)
jack ALL=(ALL) NOPASSWD: ALL结果图

5. 保存并验证配置
vi 编辑器:按
Esc→ 输入:wq保存退出;nano 编辑器:按
Ctrl+O保存,Ctrl+X退出。
保存后执行以下命令检查语法(无输出 = 无错误):
sudo visudo -c结果图

验证 NOPASSWD 权限
切换到目标用户(比如 jack),执行配置的命令,验证是否免密:
# 切换到 jack
su - jack
# 执行配置的免密命令(比如 ls)
sudo ls
# 如果不需要输入密码,说明配置生效安全注意事项(避坑关键)
绝对路径:配置命令时必须写绝对路径(比如
/usr/bin/ls,而非ls),防止用户通过 PATH 劫持伪造命令;最小权限:只授权必要的命令,绝不配置
NOPASSWD: ALL(除非是测试机);禁止给低权限用户授权危险命令:比如
vim、find、python、bash等(这些命令容易被 sudo 逃逸提权);
定期审计:用 sudo -l -U jack 查看 jack 的 sudo 权限,确认配置符合预期:
sudo -l -U jack结果图

总结
配置
NOPASSWD必须用visudo编辑/etc/sudoers,避免语法错误;核心格式:
用户名 ALL=(ALL) NOPASSWD: 命令绝对路径;生产环境严格遵循最小权限,仅授权必要命令,禁用
NOPASSWD: ALL
使用vim创建隐藏用户
在 Linux 中,创建一个用户本质上是在 /etc/passwd、/etc/shadow 和 /etc/group 中添加记录。有了免密 vim 权限,我们可以直接通过编辑这些文件来“手动”创建用户。
先验证下有没有sudo权限,能不能免密登录
#输入指令
sudo vim
#在vim界面里面输入
:!bash返回结果,成功进入root账户并不需要密码

由于 vim 是以 root 身份启动的,派生出的子进程 bash 也会继承 root 权限
#在vim界面输入指令
:e /etc/passwd结果图

在里面创建一个用户moon,必须严格按照jack用户格式所写

输入 cat/etc/passwd 成功创建用户

给新创用户改密
核心操作
修改已掌控的普通用户 jack 的密码(设为拟给新用户 lucy 使用的密码)
目的是获取系统原生生成的合法哈希值(适配当前系统加密算法)
后续将该哈希克隆给新建用户 lucy,最后还原 jack 的原始密码,既规避算法不兼容问题,又避免直接改密码触发告警
1.修改jack密码,把新密码给lucy用(此前需要进入/etc/shadow把jack的旧哈希值保存,后续需要用)
#输入指令
passwd jack结果图:

2.使用vim免密权限进入shadow查看jack哈希,并把哈希复制给lucy
#输入指令
sudo vim
#在vim里面输入
:e /etc/shadow结果图:
可以注意一下,jack和lucy的哈希值此时是一致

3.把jack的源来的哈希值粘贴回去,这样避免被发现,此时jack和lucy哈希值不一样了

4.切换成lucy用户
su lucy结果图

成功绕过sudo权限通过vim创建一个用户,完成权限逃逸
sudo 逃逸防范
一、核心原则
最小权限:仅授权必要命令,绝不放开全量权限
环境可控:禁止篡改执行环境(PATH/LD_PRELOAD 等)
全程审计:sudo 操作留痕,异常行为可追溯
二、核心防范措施(必做)
规范 sudoers 配置
仅用 visudo 编辑,命令写绝对路径,禁用通配符 / 相对路径
禁止授权高危命令:
vim、find、python、bash、sed、awk等禁用 NOPASSWD: ALL,仅对非敏感命令按需免密
锁定执行环境
配置 env_reset 重置环境,secure_path 固定 PATH
禁用 LD_PRELOAD/LD_LIBRARY_PATH 等危险变量
版本与权限管控
升级 sudo 到 1.9.10+,修复已知漏洞
定期审计:sudo -l 检查权限,清理冗余授权
日志监控
监控 auth.log/secure 日志,关注逃逸特征命令(
sudo find/vim -c ':!/bin/sh'等)
三、快速自查
visudo -c 检查配置语法
排查
NOPASSWD: ALL/ALL=(ALL)高危配置检查 sudo 版本,查看日志是否有逃逸尝试
四、应急处置
暂停涉事用户 sudo 权限
检查
/etc/passwd、/etc/shadow、/etc/sudoers是否被篡改升级 sudo,复盘配置移除高危授权
法律声明
警告:本实验手册中的技术仅供安全研究和授权测试使用。未经授权在他人系统上使用这些技术属于违法行为,可能导致严重的法律后果。
请确保:
仅在自有系统或获得明确书面授权的系统上进行测试
了解并遵守所在地区的法律法规
负责任地使用所学知识,遵守职业道德规范