Linux提权-02 sudo提权

文章目录

  • 1. sudo 提权原理
    • 1.1 原理
    • 1.2 sudo文件配置
  • 2. 提权利用方式
    • 2.1 sudo权限分配不当
    • 2.2 sudo脚本篡改
    • 2.3 sudo脚本参数利用
    • 2.4 sudo绕过路径执行
    • 2.5 sudo LD_PRELOAD环境变量
    • 2.6 sudo caching
    • 2.7 sudo令牌进程注入
  • 3. 参考
  • 4. 附录
    • 什么是环境变量
      • **一、环境变量是什么?**
      • **二、为什么 `sudo` 可以重置环境变量?**
        • **1. 防止权限提升攻击**
        • **2. 隔离特权环境**
        • **3. 标准化执行环境**
      • **三、`sudo` 如何管理环境变量?**
        • **1. 默认行为**
        • **2. 自定义保留或删除变量**
        • **3. 临时继承环境变量**
      • **四、为什么用户需要关心 `sudo` 的环境变量重置?**
        • **1. 常见问题**
        • **2. 解决方案**
      • **五、安全与便利的平衡**
      • **总结**
    • 为什么可以重置环境变量
      • **分步解析:为什么环境变量是“全局”却可以重置?**
        • **1. 环境变量的本质:进程级别的全局**
        • **2. 为什么可以重置环境变量?**
          • **a. 进程隔离机制**
          • **b. 动态修改能力**
          • **c. 安全设计**
        • **3. `sudo` 重置环境变量的具体过程**
          • **步骤1:继承父进程环境**
          • **步骤2:应用安全规则**
          • **步骤3:按需添加保留变量**
          • **步骤4:启动目标命令**
        • **4. 示例:`sudo` 如何重置 `PATH`**
        • **5. 为何不直接禁止修改环境变量?**
      • **总结**
    • Linux 中的环境变量存储

1. sudo 提权原理

1.1 原理

sudo是一个用于在Linux和类Unix系统中以超级用户(root)或其他用户身份执行命令的程序。它的全称是 “superuser do”,允许普通用户以更高权限运行命令。
Linux提权-02 sudo提权_第1张图片

sudo 命令的工作原理是通过suid权限来实现的。具体来说,它的工作过程可以简要概述如下:

  1. 设置 setuid 权限:sudo 程序本身被设置了 setuid 属性,这意味着当任何用户执行这个程序时,它会以程序拥有者(通常是 root)的权限运行。

  2. 执行权限继承:当用户执行 sudo 后面跟随的命令时,这个命令会继承 sudo 的权限。在这种情况下,虽然用户是普通用户,但由于 sudo 在以 root 用户的身份执行,随后的命令则也可以在 root 权限下运行。

  3. 权限验证:在执行命令之前,sudo 会检查用户在/etc/sudoers文件中的配置,确保该用户被授权运行指定的命令。如果用户没有权限,则会被拒绝执行。

  4. 审计和日志:sudo 还会记录所有使用 sudo 的命令,这样管理员可以审计用户的行为,以确保系统安全。

总体流程可以用以下流程来表示:

用户执行 sudo command 命令
   ↓
    └── 检查用户权限(/etc/sudoers)
       ↓
        └── command 继承 root 权限执行命令

基本用法

sudo [选项] 命令
  • 常用选项
    • -u 用户:以指定用户身份执行命令(默认root)
    • -l:列出当前用户的sudo权限

1.2 sudo文件配置

*****************GPT生成***************
在 Linux 系统中,sudoers 文件用于定义哪些用户或用户组可以使用 sudo 命令,并在使用时可以执行哪些命令。通过对 sudoers 文件的配置,管理员能够为用户提供特定的权限控制。

编辑 sudoers 文件

要安全地编辑 sudoers 文件,推荐使用 visudo 命令,因其会进行语法检查,防止语法错误导致的安全风险。

打开终端输入以下命令:

sudo visudo

这将打开 sudoers 文件,通常使用 vi 或者 nano 编辑器。

基本配置格式

sudorers 文件的权限配置基本格式如下:

user    host = (runas) command
用户/组	主机=(目标用户:目标组)	[NOPASSWD:]	命令
  • user:指定用户或用户组。
  • host:允许执行命令的主机(通常使用 ALL 表示所有主机)。
  • (runas):指定用户在执行该命令时可以以哪个用户身份运行(使用 ALL 表示以所有用户身份运行),即限定用户执行命令时的身份切换范围:
    • 目标用户:允许通过-u参数切换到的用户身份
    • 目标组:允许通过-g参数切换到的用户组身份
  • command:允许用户执行的命令,可以使用 ALL 表示所有命令,也可以指定具体的命令路径。

示例配置

  1. 允许用户 alice 执行所有命令:

    alice ALL=(ALL) ALL
    
  2. 允许用户组 admin 以任何用户身份运行所有命令:

    %admin ALL=(ALL) ALL
    
  3. 允许用户 bob 在不需要密码的情况下执行 /usr/bin/systemctl 命令:

    bob ALL=(ALL) NOPASSWD: /usr/bin/systemctl
    
  4. 只允许用户 charlie 执行 /usr/bin/apt/usr/bin/dpkg 命令:

    charlie ALL=(ALL) /usr/bin/apt, /usr/bin/dpkg
    

其他常用选项

  • NOPASSWD:用户可以不输入密码执行特定命令。
  • Defaults:用于设置默认行为,例如锁定 sudo 命令的执行超时等。
    Defaults timestamp_timeout=15
    

保存和退出

在编辑结束后:

  • 如果使用 vi:按 Esc,输入 :wq,然后按 Enter 保存并退出。
  • 如果使用 nano:按 Ctrl+X,然后根据提示选择 Y 来确认保存。

注意事项

  1. 使用 visudo:始终通过 visudo 编辑 sudoers 文件,以避免语法错误。
  2. 备份:在修改前备份 sudoers 文件。
    sudo cp /etc/sudoers /etc/sudoers.bak
    
  3. 权限限制:尽量给用户分配最小权限,避免不必要的安全风险。

2. 提权利用方式

sudo权限配置不当,如果这些可执行文件本身又可以调用其他可执行文件,或者可以更改系统的一些配置选项,就可以达到提权的目的。

2.1 sudo权限分配不当

使用sudo -l查看当前sudo配置,看当前用户可以使用sudo执行的命令。 一些可用于执程序的命令可直接用于提权。

路径 提权命令 路径 提权命令
/usr/bin/bash bash -p /usr/bin/find find /etc/passwd -exec bash -p
/usr/bin/csh csh -p /usr/bin/awk awk ‘BEGIN {system(“/bin/bash”)}’
/usr/bin/sh sh -p /usr/bin/man !/bin/bash
/usr/bin/ksh ksh -p /usr/bin/more !/bin/bash
/usr/bin/zsh zsh -p /usr/bin/less !/bin/bash

2.2 sudo脚本篡改

管理员将某个shell脚本设置为sudo免密执行,且低权限用户对其可写,那么可将后门程序或反弹shell的代码写入该脚本,完成提权。
Linux提权-02 sudo提权_第2张图片

2.3 sudo脚本参数利用

回到2.2中的脚本,在无权限修改脚本内容时,可以通过阅读脚本代码来判断此脚本是否允许带入参数执行。如果脚本允许带参数执行且该参数可控,也可以进行提权。
Linux提权-02 sudo提权_第3张图片

2.4 sudo绕过路径执行

管理员在配置sudoers文件时使用了通配符,可利用这种情况执行命令或读取敏感文件。
Linux提权-02 sudo提权_第4张图片

2.5 sudo LD_PRELOAD环境变量

LD_PRELOAD 是 Linux 系统中一个强大的环境变量,允许用户在程序启动时强制优先加载自定义的共享库(.so 文件),从而覆盖或修改程序原本调用的系统库函数。说白了就是可以让我们自定义调用动态链接库,那么我们就可以写一个带后门的库文件,在使用sudo执行命令的时候指定后门的路径即可执行后门进行提取。
Linux提权-02 sudo提权_第5张图片

2.6 sudo caching

2.7 sudo令牌进程注入

3. 参考

[1] 《权限提升技术-攻防实战与技巧》
[2] Linux SUID提权
[3] sudo官网

4. 附录

什么是环境变量


一、环境变量是什么?

环境变量(Environment Variables) 是操作系统中用于存储动态值的全局变量,能够影响程序或进程的行为。它们在以下方面发挥作用:

  1. 配置程序行为

    • 例如:
      • PATH:定义可执行文件的搜索路径。
      • LANG:设置系统语言和区域。
      • HOME:指定用户的家目录路径。
      • HTTP_PROXY:配置网络代理地址。
  2. 传递信息
    程序运行时可通过环境变量读取配置,无需硬编码在代码中(如数据库地址、API 密钥)。

  3. 作用范围

    • 用户级:通过 Shell 配置文件(如 .bashrc.zshrc)设置,仅对当前用户生效。
    • 系统级:定义在 /etc/environment/etc/profile 中,对所有用户生效。

二、为什么 sudo 可以重置环境变量?

sudo 重置环境变量是出于安全性设计,主要原因如下:

1. 防止权限提升攻击
  • 风险场景
    用户可能通过环境变量注入恶意配置,例如:
    • 修改 PATH 变量,将 ls 指向恶意脚本。
    • 设置 LD_PRELOAD 加载恶意库,劫持特权进程。
  • sudo 的防御机制
    默认启用 env_reset 选项,清除非安全的环境变量,仅保留白名单变量(如 TERMLANG)。
2. 隔离特权环境
  • 用户环境不可信
    普通用户的环境变量可能包含错误配置或潜在危险参数(如 DEBUG=1)。
  • 特权进程安全
    sudoroot 身份运行时,需确保环境干净,避免用户变量干扰系统级操作。
3. 标准化执行环境
  • 一致性需求
    通过重置环境变量,sudo 保证命令在不同用户或主机上行为一致(例如固定 PATH 为安全路径)。

三、sudo 如何管理环境变量?

1. 默认行为
  • env_reset
    启用时,sudo 会重置环境变量,仅保留以下安全变量:
    LANG, LANGUAGE, LC_*, TERM, USER, SUDO_*, COLORS, MAIL, LOGNAME
    
  • secure_path
    强制覆盖 PATH,设置为安全路径(如 /usr/local/sbin:/usr/bin),防止路径劫持。
2. 自定义保留或删除变量

通过 /etc/sudoersDefaults 指令配置:

  • 保留变量
    Defaults env_keep += "HTTP_PROXY JAVA_HOME"
    
  • 删除变量
    Defaults env_delete += "GOPATH DEBUG"
    
3. 临时继承环境变量

使用 -E 选项临时继承当前用户的所有环境变量(需配置允许):

sudo -E command

四、为什么用户需要关心 sudo 的环境变量重置?

1. 常见问题
  • 命令找不到
    用户自定义的 PATH 未被继承,导致 sudo 执行时找不到命令。
  • 配置失效
    依赖环境变量的工具(如 docker-composenpm)在 sudo 下无法正常工作。
2. 解决方案
  • 配置 env_keep
    /etc/sudoers 中显式保留必要变量:
    Defaults env_keep += "PATH HTTP_PROXY"
    
  • 使用绝对路径
    直接指定命令的绝对路径(如 sudo /usr/local/bin/myapp)。
  • 切换用户身份
    使用 sudo -isudo su - 启动一个完整的 root Shell(继承 root 的环境)。

五、安全与便利的平衡

场景 安全优先 便利优先
生产服务器 严格限制环境变量,仅保留必要项 避免修改,使用默认配置
开发环境 按需保留 JAVA_HOME 等变量 允许临时 -E 继承变量
敏感操作 禁用 -E,强制 env_reset 仅在可信场景下放宽限制

总结

  • 环境变量是影响程序行为的动态配置参数。
  • sudo 重置环境变量是安全机制的核心设计,防止恶意利用和配置污染。
  • 通过 /etc/sudoersDefaults 指令,可以精细控制环境变量继承,兼顾安全性与功能需求。
  • 普通用户应理解默认重置的逻辑,开发者可按需调整配置,管理员需严格审计权限。

为什么可以重置环境变量


分步解析:为什么环境变量是“全局”却可以重置?

环境变量的“全局性”容易让人误解为整个操作系统共享同一份变量,但实际上其作用域和生命周期与进程密切相关。以下是详细解析:


1. 环境变量的本质:进程级别的全局
  • 定义
    环境变量是键值对,存储在进程的内存空间中,用于传递配置信息。
  • 作用域
    • 进程内全局:同一进程的所有线程和函数均可访问。
    • 继承性:父进程创建子进程时,子进程会复制父进程的环境变量(非共享)。

示例
用户终端中设置的 PATH 变量仅影响该终端及其启动的子进程(如 bashls)。


2. 为什么可以重置环境变量?
a. 进程隔离机制
  • 独立性
    每个进程有独立的内存空间,环境变量副本互不影响。
    • 修改进程 A 的环境变量不会影响进程 B。
    • sudo 启动的新进程(如以 root 运行的命令)会创建独立的环境变量副本。
b. 动态修改能力
  • 运行时操作
    程序可通过系统调用(如 setenv()putenv())动态修改自身环境变量。
    • sudo 在启动子进程前,会主动重置或过滤环境变量。
c. 安全设计
  • 最小权限原则
    sudo 默认重置环境变量,仅保留必要项(如 TERM),防止用户通过变量注入攻击(如劫持 PATHLD_PRELOAD)。

3. sudo 重置环境变量的具体过程
步骤1:继承父进程环境
  • sudo 进程启动时,默认继承当前 Shell 的环境变量。
步骤2:应用安全规则
  • env_reset
    清除所有环境变量,仅保留白名单(如 LANG, TERM)。
  • secure_path
    强制覆盖 PATH 为安全路径(如 /usr/bin:/sbin)。
步骤3:按需添加保留变量
  • 通过 /etc/sudoers 中的 env_keep 配置,添加允许保留的变量(如 HTTP_PROXY)。
步骤4:启动目标命令
  • 最终以清理后的环境变量执行特权命令。

4. 示例:sudo 如何重置 PATH
  • 用户环境
    PATH=$HOME/bin:/usr/local/bin:$PATH
    
  • sudo 执行时
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    
  • 结果
    用户自定义的 $HOME/bin 路径被移除,防止恶意程序劫持。

5. 为何不直接禁止修改环境变量?
  • 灵活性需求
    某些场景需保留特定变量(如代理配置 HTTP_PROXY)。
  • 可控性
    通过 /etc/sudoersDefaults 指令,管理员可精细控制保留或删除的变量。

总结

  • 环境变量的“全局”是进程级别的:每个进程独立维护自己的变量副本,修改不影响其他进程。
  • sudo 重置环境变量是安全机制:通过进程隔离和动态清理,防止用户环境干扰特权操作。
  • 配置灵活性:管理员可平衡安全与便利,按需保留必要变量。

Linux 中的环境变量存储

在 Linux 系统中:

  1. 进程启动时
    父进程通过 fork() + exec() 创建子进程时,环境变量会通过 execve() 系统调用传递,并复制到子进程的用户空间内存中。
  2. 内存布局
    环境变量和命令行参数按以下格式存储在用户栈上方:
    // 内存布局示例(低地址 → 高地址)
    +-------------------+
    | 程序代码(text)    |
    | 静态数据(data/bss)|
    | 堆(heap)         |
    | ...               |
    | 栈(stack)        |
    | 命令行参数(argv)  |
    | 环境变量(envp)    | ← 栈的顶部
    +-------------------+
    

你可能感兴趣的:(权限提升,linux,运维,网络安全)