本文通过 Google 翻译 Manual Enumeration -- Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。
导航
- [0 前言](#0 前言)
- [1 用户枚举](#1 用户枚举)
- [1.1 当前用户](#1.1 当前用户)
- [1.2 其他用户](#1.2 其他用户)
- [2 系统枚举](#2 系统枚举)
- [3 软件枚举](#3 软件枚举)
- [4 网络枚举](#4 网络枚举)
- [5 防病毒/防火墙枚举](#5 防病毒/防火墙枚举)
- [6 我的手动命令集](#6 我的手动命令集)
0、前言
在这篇文章中,我们将探讨手动枚举技术,该技术可帮助我们在目标建立立足点后快速获取目标的"地形"(即当前系统情况)。
手动枚举是攻击者需要具备的一项重要技能,因为它能更深入的洞悉目标系统中的现场清况,从而让攻击者发现可能存在的权限提升路径。
自动化工具很棒,它们对攻击者来说确实能够起到很大的作用。但是,熟练的攻击者绝不会只依赖工具,因为工具很容易就会错过一些重要的东西。【如果不能够真正了解这些工具实际上在做什么,那我们很容易就会错过一些东西。】
这篇文章并不会涵盖所有的枚举点,只对主要的枚举点进行了介绍,这些枚举点包括用户枚举、系统枚举、软件枚举、网络枚举、防病毒/防火墙枚举。另外还会展示,当我首次获得立足点时,我个人在使用自动枚举工具之前使用的一个手动命令集。
请记住,这些手动技术是非常高级的枚举技术,它能帮助我们快速了解当前正在处理的内容。
在这个例子中,假设我们以用户 bob 的身份在目标机器上取得了立足点。
1、用户枚举
一旦在目标机器上站稳脚跟,我们首先要做的就是枚举当前用户相关的信息,然后再枚举系统上其它用户的信息。
1.1、当前用户
首先,使用 whoami 命令查看自己是谁。

【特权:】确定了自己是谁之后,再看看当前用户所拥有的系统特权有哪些,命令如下:
cmd
whoami /priv

可以看到,当前用户拥有 SeShutdownPrivilege 特权,而该特权在利用弱服务获取 SYSTEM shell 时很有帮助。
另外,SeImpersonatePrivilege 和 SeBackupPrivilege 特权也都可以被用来轻松获取 SYSTEM shell。
想了解如何滥用各种特权的更多信息,可查看此页面。
【所属组:】whoami 命令的另一个用途是检查当前用户所属的组。
cmd
whoami /groups

上面的输出又告诉了我们以下几点信息:
- 箭头指示的四个组是所有标准用户所归属的组。了解这一点对于使用 icacls 或 accesschk 检查不同文件/目录的权限很重要。
- 第一个方框圈起来的组是远程桌面用户组。这意味着如果我们找到了用户的密码,那么就可以获取该受害者的 GUI 会话。【注:此时密码搜寻部分的内容就值得关注。】
- 第二个方框圈起来的组是强制级别组。当您使用 BeEF 等工具挂接 IE 或 Edge 浏览器,然后使用 Metasploit 利用浏览器获取 shell 时,这一点非常重要。当您这样做时,您将处于低强制级别 shell 中,这意味着您无法写入任何常规文件夹。【但可以在用户的
%USERPROFILE%\AppData\LocalLow
目录下写入文件。】

最后,也可以使用 whoami /all 命令一次性列出当前用户的所有信息。
1.2、其他用户
【查看用户:】可以使用 net user 命令查看系统上所有的用户,以了解还有哪些用户比较有用。因为我们的权限提升路径并不总是直接就被垂直提升到了管理员或 SYSTEM 级别,有时也需要先水平提升到另一个标准用户,然后再进一步进行提升。

可以看到,有 5 个账户存在,而每个帐户都应该进一步被枚举。
Guest 账户几乎总是处于禁用状态。
要查看特定用户的信息,可使用以下命令:
cmd
net user alice

这里提供了该帐户的大量信息,其中包括该帐户是否处于活动状态、帐户是否有密码、群组信息、以及Comment 备注说明等。
在群组信息中可以看到, alice 是远程桌面用户组 和远程管理用户组的成员。这意味着只要我们能找到 alice 的密码,就可以通过 RDP (3389) 或 WinRM (5985) 的方式进行登录。
【查看组:】最后,我们也应该检查下哪些用户属于本地管理员组。为此,可以使用以下命令查看:
cmd
net localgroup administrators

Great!我们发现,除了内置管理员 administrator 外,john 也是该系统的本地管理员。
上述命令中的"administrators"也可以替换为您想要枚举的任何其它组。
既然我们知道了与"谁"合作,接下来就该把注意力转向与"什么"合作,就从系统本身的高层开始吧。
2、系统枚举
系统枚举就是查看像如 操作系统名称/版本、架构、主机名、已安装的补丁、驱动器等信息。
【系统信息:】要查看系统相关的信息,只需使用 systeminfo 命令。

上面列出了大量的信息。当然也可以使用以下命令只筛选我们感兴趣的内容输出:
cmd
systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Network Card(s)" /C:"Hotfix(s)"

从上面可以看到,当前受害者的机器是 Windows 10 -- Build 18362(version 1903)-- 64 位操作系统;同时它只安装了 2 个补丁,这很有可能会存在内核漏洞;并且还有两张网卡,这表明有机会转向不同的网络!
【补丁程序:】上面这些信息太棒了!现在我们可以进一步调查这些补丁程序,看看它们的安装时间。此外,还需留意第二张网卡的信息。
为了深入了解补丁程序,我们可以使用 wmic 命令从本地系统提取信息:
cmd
wmic qfe get Caption,Description,HotFixID,InstalledOn

可以看到,这些补丁都是在 2019 年 4 月 1 日安装的。这也告诉我们,这台机器很容易受到 2019 年 4 月 1 日之后的发现的任何内核漏洞攻击!
关于内核漏洞的利用可以查看这篇文章。
【驱动器:】另一件值得检查的事情是系统上的其它驱动器(D、E、F?)。
要检查驱动器,我们可以使用 wmic 命令或等效的 PowerShell 命令:
powershell
wmic logicaldisk get caption,description,providername
Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| ft Name,Root

现在我们已经了解了系统相关的信息,接下来就可以检查系统上安装或运行的软件。
3、软件枚举
【方法1: 】检查已安装软件的最简单但不是很可靠的方法是枚举安装软件时默认使用的目录位置,如 C:\
、C:\Program Files
、C:\Program Files (x86)
,可依据里边的文件名称来判断可能安装了些什么软件。
cmd
dir /a C:\

【方法2:】检查已安装软件的另一种方法是使用以下 wmic 命令:
cmd
wmic product get name,version | findstr /i /v "Microsoft"

此搜索将检查系统上安装的所有软件。在末尾添加 findstr 过滤器,是为了删除所有包含"Microsoft"的匹配项,因为我们只对第三方软件感兴趣。在这里,可以看到安装了一个第三方软件:Python 2.7.16。
要向 findstr 命令添加更多过滤项,请用空格分隔。例如:"Microsoft Windows SQL"将会过滤掉带 Microsoft 或 Windows 或 SQL 这样的字符串的行。
【方法3:】也可以使用 tasklist 命令查看正在运行的进程,根据正在运行的进程,判断主机上安装了哪些软件。

可以看到,Firefox 正在运行,这表明它已安装在主机上。
现在我们了解了如何枚举系统上安装的软件,接下来可以继续进行网络的枚举。
4、网络枚举
当谈论网络枚举时,我们最感兴趣的是受害机如何与其它主机通信 、与哪些主机通信 、正在通信什么。
首先我们要了解系统有几个 IP 地址,这取决于机器上安装的 NIC 数量。
NIC 全称 Network Interface Card,通俗讲就是主机网卡或网络适配器。【注:NIC 就是指网卡硬件,而网络适配器则可以是网卡硬件,也可以是软件驱动的虚拟网卡。】
【IP 信息:】要查看当前受害机器的 IP 地址,可以使用 ipconfig 命令。

可以看到,这台机器有两个 IP 地址,这意味着这台机器很可能能够进入 10.0.3.0/24 网段的门户!
要查看包括 MAC 地址、DNS 服务器等信息,可以使用以下命令:
cmd
ipconfig /all

【ARP 表:】获取 IP 信息后,我们要查看的另一个地方是 ARP 表。因为每当同网段的两台机器进行通信时,双方机器都会将对方的 IP/MAC 地址记录在各自的 ARP 表中。
因此,通过查询该表中的信息,我们可能会发现受害者正在与另一台机器通信,而这有可能也是一个线索。
注:这种方法仅限于查看同网段之间通信的主机,如果是跨网段通信,那么 ARP 中只能看到网关的 IP/MAC 记录。
cmd
arp -a

可以看到,攻击者机器 172.16.1.30 此时正在与受害者机器进行通信。【请注意,动态类型的记录对我们来说才最有趣,因为这些都是当下正在活动所产生的自动学习记录。】
【路由表:】另一个需要检查的地方是路由表。通过路由表,我们可以知道是否还有其它可以通信的网络。
cmd
route print

可以看到,当前这台机器能够通往两个不同的网络,分别是 10.0.3.0/24 和 172.16.1.0/24 网络。
【网络状态:】在网络枚举过程中要查找的最后一件事是检查正在运行的服务以及分配给它们的端口。
cmd
netstat -nao

从上面的结果中,我们主要关注监听类型的端口。这将向我们显示在 nmap 扫描期间能看到的所有端口,同时它还能显示仅在主机本地开放的端口。
如果我们发现本地有服务正在运行,那么这会是一个关键的发现,因为它很有可能会帮助我们进行权限的提升。当发现服务仅在 localhost 运行时,可通过端口转发技术去建立攻击者机器与受害者本地服务的连接。这可以使用 Chisel、Plink 或 Meterpreter 工具来实现。
关于端口转发相关的技术,可查看这篇文章。
5、防病毒/防火墙枚举
在当今的环境中,我们几乎总是要应对额外的防御层:防病毒(AV)和防火墙。作为攻击者,最好找出系统使用的 AV,这样才能想办法去绕过系统的防护措施。
注:由于作者提供的查询方法不是太有效,此处补充的是我个人认为比较方便的查询办法。
【防病毒:】通过谷歌搜索"杀软在线识别",即可找到一些在线辨别杀毒软件的网站,通过将以下命令的结果粘贴就可以查询到比较准确的杀毒软件的名称了。
cmd
tasklist /svc

值得一提的是,AV 绕过技术一直在不断变化,今天有效的技术可能明天就失效了。
枚举完系统上的 AV 之后,我们将把精力转向防火墙。
【防火墙:】我们希望查看防火墙设置,以便确定哪些端口是开放的且可以从外部访问。
我们的目标是弄清楚为什么在访问某些端口时被阻止,以及可以使用哪些端口来掩盖我们的流量(例如,受害机运行反向 shell 载荷时,如果访问攻击机的 4444 端口被阻止,但访问 443 端口是开放的,那么就制作 443 端口的反向 shell 载荷)。
请注意,防火墙通常只允许特定端口上的出站访问。如果您尝试从漏洞中获取反向 shell,而您确信该漏洞利用确实有效,但由于某些原因却没有获得反向 shell,那么您可能就需要调整反连端口了。经验告诉我们,如果所有其它方法都失败了,那么把反连端口换成 80 就可能就让您通过。除了80 端口以外,其它值得考虑的端口是:21、443 和 445。
(1)在现代 Windows 操作系统(win10+)上,查看防火墙状态的命令如下:
cmd
netsh advfirewall show allprofiles | findstr -i "profile state policy"
注:由于中文的原因,以上命令在国内机器上不会有输出结果。建议直接使用
netsh advfirewall show allprofiles
命令即可。

从以上结果可以看到,当前主机的 域网络、公共网络、私有网络 的防火墙状态都是开启的,并且它们的出入站策略都是:阻止所有入站,放行所有出站。
(2)而在较旧的 Windows 操作系统( win7-)上,我们需要使用不同的命令来收集这些信息:
cmd
netsh firewall show state
现在已经确定防火墙正在运行,接下来就是检查它的规则配置,以确认哪些端口是被指定放行的。
cmd
netsh firewall show config

注:通常输出的内容中会包含很多基于应用程序的规则,但这不是我们感兴趣的东西,我们只需关注输出内容最下面和端口相关的信息。
最后,假设我们设法获得了 SYSTEM 或管理员 shell。凭借提升的权限,我们可以完全关闭防火墙,这在我们尝试切换到另一台主机时可能会有所帮助。为此,可以使用以下命令进行关闭:
cmd
netsh advfirewall set allprofiles state off
6、我的手动命令集
通常我不会手动进行以上所介绍的所有枚举,而是会让工具为我完成网络和 AV/防火墙部分的枚举,但我们也必须了解工具能为我们做些什么。此外,如果发现自己出于某种原因无法使用工具,此时就需要知道上面所介绍的这些枚举手段了。
在本小节,我要展示的只是一组快速命令,我喜欢在第一次登录主机时使用这些命令,待了解了主机基本情况之后,然后就会依照特定顺序加载一些工具。
【命令1:】当我第一次登录主机时,喜欢立即运行以下 5 个命令:
cmd
whoami
whoami /priv
whoami /groups
systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Hotfix(s)"
cmdkey /list
- 首先,使用 whoami 查看我是在哪个帐户上获得了立足点(标准用户?服务帐户?管理员帐户?)
- 接着,使用 whoami /priv 查看用户是否拥有任何特殊权限(包括关机的权限)。
- 之后,使用 whoami /groups 来帮助我确定该用户还拥有哪些组的访问权限。
- 然后,使用 systeminfo 来确定所在主机以及我将如何进行下一步(32 位还是 64 位?旧操作系统还是新操作系统?补丁程序?)--- 当发现旧操作系统或几乎没有安装补丁程序时,我们需要考虑内核漏洞。系统架构对于工具和漏洞利用很重要,请确保您为这项工作使用了对应架构版本的工具。
- 最后,使用 cmdkey 检查存储的密码,以期望能够快速取得胜利。
运行上述命令之后,我喜欢快速执行用户和组枚举,检查系统上所有的用户以及哪些用户属于管理员组。
cmd
net user
net localgroup administrators
如果发现这台机器上除了当前用户之外还有其它用户,我会把它们都记下来,然后就会根据搜寻密码这篇文章中介绍到的地方,在这台机器上的一些位置去搜寻可能存在这个用户的密码。此外,我还喜欢记下本地管理员组中的任何用户,因为它们是高价值目标。
当我找到其它用户时,我都会使用 net user <username>
命令以了解它们都加入了哪些组。
【命令2:】接下来,我将手动检查有趣的文件/目录。
下面的命令是基于 PowerShell 会话编写的。
powershell
Get-ChildItem -Recurse -Depth 4 C:\users | Select FullName
cmd.exe /c dir /a C:\
ls "C:\Program Files"
ls "C:\Program Files (x86)"
- 第 1 条命令以递归的方式检查系统上每个用户的配置文件,且最大深度为 4。这意味着它将检查
C:\Users\x\x\x\x
路径中的内容。 其中第一个"x"是用户帐户;第二个"x"代表用户家目录下的目录,例如桌面、文档、下载等;第三/四个"x"则依次继续向下遍历。 - 第 2 条命令只是简单地显示
C:\
目录下的所有文件/目录(包括隐藏的)。注意,任何非默认或隐藏的文件/目录都应该更深入地探索。 - 第 3/4 条命令用于枚举 Program Files 目录中的所有子目录。在这里能够寻找可能执行弱服务漏洞的非标准程序(这时关机权限就派上用场了)。
【命令3:】最后,在将工具带到受害者身上之前,我还喜欢使用一个命令,那就是:
cmd
netstat -nao
这是为了快速查找在 nmap 扫描期间没有发现的开放端口。
此时,在经历上述这 4 组命令的洗礼之后,要么我已经找到了权限提升的路径,并已开始着手研究。要么我会带一些自动工具来帮助我进一步枚举主机。
【工具:】以下便是我将要带来的四种工具,我将按照以下顺序分别使用它们:
- PowerUp
- WinPEAS
- Watson (newer OS)
- Windows Exploit Suggester (older OS)
如果通过上述工具的枚举之后,我还是没有找到权限提升路径,那么我会考虑使用 SeatBelt.exe,但通常在手动枚举和 PowerUp/WinPEAS 之间我能够找到权限提升的路径。