Windows特权升级基础

我为自己和对发现有用的人做出了决定,收集了我所知道的一切,但在本文中我不记得这个话题了。 分享提示。 本文的主要来源是this

我自由翻译并从自己身上补充了一些东西,这些是我从其他来源收集和学习的。

通常,以下方法可以帮助我们实现特权升级目标。

这篇简短文章的起点是无特权的Shell(帐户)。 也许我们使用了漏洞利用程序或进行了攻击并获得了这个外壳。

基本上,一开始我们并不了解机器:它的功能,所连接的东西,所拥有的特权级别甚至是什么操作系统。

首先,我们需要获取所需的信息,以了解我们在哪里以及拥有什么:

systeminfo | findstr /B /C:" " /C:" " 

从中可以看到,该命令使您可以确定操作系统的名称和版本。 您可以在不带参数的情况下执行它,那么命令的输出将更加完整,但这对我们来说已经足够了。

接下来,重要的是找出机器的名称和我们用来连接的用户名。

  • 主机名是用户名。
  • echo%用户名%-用户名。

接下来,让我们看看哪些用户仍在此主机上,并获得有关其用户的更多详细信息。

  • 净用户-其他用户
  • 净用户user1-有关该用户的详细信息,其中user1是您的用户名。

收到有关该帐户的信息后,我们将看到有关此主机的网络交互的信息。

首先,看一下可用的接口和路由表。

  • ipconfig / all-有关可用接口的信息。
  • 路线打印-路线表
  • arp -A-arp条目表

接下来,我们将看到活动的网络连接和防火墙规则。

  • netstat -ano-活动的网络连接。

-a-使用此参数启动将显示所有活动的TCP连接以及系统侦听的TCP和UDP端口;
-n-该参数允许您显示带有地址和端口号的活动TCP连接;
-o-与上一个键相同,显示活动的TCP连接,但是将过程代码添加到统计信息中,已经可以确切确定哪个应用程序使用该连接。

  • netsh防火墙显示状态-防火墙状态
  • netsh防火墙显示配置-防火墙配置

最后,我们简要检查一下在受感染主机上起作用的内容:计划任务,运行进程,运行服务和已安装的驱动程序。

 schtasks /query /fo LIST /v 

在哪里
/查询-显示有关所有计划任务的数据,
/ FO LIST-列表输出。
/ v-打印作业详细信息。

以下命令将正在运行的进程与正在运行的服务相关联。

 tasklist /SVC 

在哪里
/ SVC-每个进程的映射服务。

另请参阅正在运行的Windows服务的列表。

 net start 

查看有关受感染系统的驱动程序的信息也很有用。

 DRIVERQUERY 

接下来,我想谈一谈最有用的Windows命令-wmic。 WMIC(Windows管理规范命令)命令用于获取有关硬件和系统的信息,管理进程及其组件以及使用Windows Management Instrumentation(Windows Management Instrumentation或WMI)的功能更改设置。 很好的描述

不幸的是,如果用户不是Administrators组的成员,则默认情况下,某些Windows配置不允许访问WMIC(这是一个好主意)。 任何版本的XP都不允许从无特权的帐户访问WMIC。

相反,默认情况下,Windows 7 Professional和Windows 8 Enterprise使具有低特权的用户可以使用WMIC。

像往常一样-程序参数:

 wmic /? 

一个通过wmic收集信息的好脚本。

在继续之前,值得仔细阅读所收集的信息。 还需要注意系统中安装的补丁程序,因为有关系统漏洞的任何信息都将为我们增加特权提供额外的支持。 HotFix可以查找特权升级漏洞。

接下来,我们将考虑无人值守的安装。 如果需要安装和配置大量机器,通常,技术人员将不会为了配置每个人而在机器之间移动。 有几种无人值守安装解决方案。 对于我们来说,这些方法是什么以及它们如何工作并不重要,但重要的是,它们会留下用于安装过程的配置文件,其中包含许多机密信息,例如操作系统产品密钥和管理员密码。 我们最感兴趣的是管理员密码,我们可以使用它来增加特权。

通常,这些是以下目录:

  • c:\ sysprep.inf
  • c:\ sysprep \ sysprep.xml
  • %WINDIR%\ Panther \ Unattend \ Unattended.xml
  • %WINDIR%\ Panther \ Unattended.xml

但是值得检查整个系统。

这些文件包含明文或BASE64编码的密码。
范例:

Sysprep.inf-密码为明文形式。



Sysprep.xml-base64编码的密码。



Unattended.xml-base64编码的密码。



另外,对于连接到域的主机,您可以搜索Group.xml文件,该文件包含AES256加密密码,但是可以解密,因为 密钥已发布在msdn(https://msdn.microsoft.com/zh-cn/library/cc422924.aspx)和其他来源上。 但是,如果使用在主机上创建本地用户或例如为本地管理员设置密码的策略,情况就是如此。

例如,我在这里:



打开它后,我们正在寻找“ cpassword”参数。



接下来,您需要解密此序列。 我们使用例如CrypTool 。 首先,解码Base64。
Base64的特征是其长度必须是4的倍数。因此,我们考虑4个块,如果最后一个块中没有足够的字符,则使用“ =”添加丢失的字符。
我得到2“ =”。



接下来我们解密。 使用上面的键。



我们删除了分隔字符的多余点,并获得了密码。

除了Group.xml,这里还有一些其他的策略首选项文件,它们可能具有一组额外的cPassword属性:

  • 服务\ Services.xml
  • ScheduledTasks \ ScheduledTasks.xml
  • 打印机\ Printers.xml
  • 驱动器\ Drives.xml
  • DataSources \ DataSources.xml

但是,我们都喜欢自动化解决方案,因此我们可以尽快到达终点。 这里有两个主要选项,具体取决于我们拥有的shell /访问类型。 有一个metasploit模块可以通过已建立的会话执行(https://www.rapid7.com/db/modules/post/windows/gather/credentials/gpp),也可以使用PowerSploit的Get- GPPPassword

好吧接下来 我们将搜索奇怪的注册表参数“ AlwaysInstallElevated”。 此选项允许非特权用户从NT AUTHORITY \ SYSTEM安装.msi文件。

为了能够使用此功能,我们必须验证是否同时安装了两个注册表项,如果已安装,则可以获得SYSTEM外壳程序。 检查:

 reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated 

 reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated 

Metasploit包含一个特殊的模块exploit / windows / local / always_install_elevated,该模块创建一个MSI文件,并内置一个特殊的可执行文件,安装程序将使用系统特权提取并执行该文件。 执行之后,msi文件停止安装,以防止在系统中注册操作。 此外,如果您使用/安静开关开始安装,那么您甚至都不会收到错误消息。

好了,系统上一些有用的搜索命令:

下面的命令将在文件系统中搜索包含特定关键字的文件名。 您可以指定任意数量的关键字。

 dir /s *pass* == *cred* == *vnc* == *.config* 

通过关键字搜索特定的文件类型,此命令可以生成大量输出。

 findstr /si password *.xml *.ini *.txt 

类似地,下面的两个命令可用于grep注册表中的关键字,在本例中为“ password”。

 reg query HKLM /f password /t REG_SZ /s 

 reg query HKCU /f password /t REG_SZ /s 

目前,我们已经有足够的资源来使系统正常运行。 但是还有两种针对性更强的攻击才能获得理想的结果:我们将研究Windows服务以及文件和文件夹的权限。 我们的目标是使用弱权限来增强会话特权。

我们将检查很多访问权限,accesschk.exe是Microsoft Sysinternals Suite中的一个工具,它将帮助我们解决此问题。 Microsoft Sysinternals包含许多出色的工具。 可以从Microsoft Technet网站(https://docs.microsoft.com/ru-ru/sysinternals/downloads/sysinternals-suite)下载该程序包。

我们可以使用accesschk检查每个服务所需的特权级别。

我们可以看到每个用户级别拥有的权限。



Accesschk可以自动检查我们是否具有特定用户级别的Windows服务的写权限。 通常,作为低特权用户,我们要检查“用户”。 确保检查您属于哪些用户组。

-c名称是Windows服务,例如ssdpsrv(指定“ *”以显示所有服务)
-d仅处理目录
-e仅显示明确指定的完整性级别(仅Windows Vista)
-k名称是注册表项,例如hklm \ software
-n仅显示没有访问规则的对象
-p名称或进程标识符(PID)被指定为名称,例如cmd.exe(指定“ *”作为显示所有进程的名称)
-q省略标题
-r仅打印具有读取权限的对象
-s递归处理
-v打印详细信息
-w仅列出具有写访问权的对象



还有另一个有趣的命令:

 autorunsc.exe -a | findstr /n /R "File\ not\ found" 

允许您找到有关自动启动但尚未从系统中丢失的文件的注册表项。 例如,如果服务被错误地删除,则该记录可以保留。 每次启动时,系统都尝试运行该文件失败。 您也可以利用这种情况来扩展权限。 只需将此文件替换为我们的文件即可。

接下来,我们考虑两个漏洞:

首先:复制GreveHatHacker的Parvez发表的帖子的结果; “通过利用弱文件夹权限来提升特权”(http://www.greyhathacker.net/?p=738)。

此示例是劫持dll的特例。 程序通常无法独立运行,它们具有许多需要连接的资源(主要是dll,但也包含自己的文件)。 如果程序或服务从我们具有写访问权的目录中下载文件,则我们可能会滥用该文件或服务来启动具有该程序运行权限的shell。

通常,Windows应用程序将使用预定义的搜索路径来查找dll,并且它将以特定顺序检查这些路径。 DLL劫持通常是通过沿这些路径之一放置恶意dll来发生的。 可以通过向应用程序指示所需dll的绝对路径来解决此问题。

dll搜索顺序:

  1. 运行应用程序的目录
  2. 32位系统目录(C:\ Windows \ System32)
  3. 16位系统目录(C:\ Windows \ System)
  4. Windows目录(C:\ Windows)
  5. 当前工作目录(CWD)
  6. PATH环境变量中的目录(系统然后是用户)

有时应用程序尝试下载计算机上缺少的dll文件。 发生这种情况的原因可能有多种,例如,如果某些未安装的某些插件或组件仅需要dll库,则可能会发生这种情况。 在这种情况下,Parvez发现某些Windows服务正在尝试加载默认设置中不存在的dll库。

由于dll不存在,因此我们最终要遍历所有搜索路径。 作为特权级别低的用户,我们几乎没有机会在项目1-4、5中放置恶意dll。但是,如果我们对任何目录具有写访问权限,那么获胜的机会就很大。

让我们看看它在实际中是如何工作的,对于我们的示例,我们将使用IKEEXT(IPSec IKE和AuthIP密钥模块)服务,该服务尝试下载wlbsctrl.dll。

“ C:\”中的任何目录都将为经过身份验证的用户提供写访问权限,这为我们提供了机会。

 C:\Users\user1\Desktop> accesschk.exe -dqv "C:\Python27" 

 C:\Python27 Medium Mandatory Level (Default) [No-Write-Up] RW BUILTIN\Administrators FILE_ALL_ACCESS RW NT AUTHORITY\SYSTEM FILE_ALL_ACCESS R BUILTIN\Users FILE_LIST_DIRECTORY FILE_READ_ATTRIBUTES FILE_READ_EA FILE_TRAVERSE SYNCHRONIZE READ_CONTROL RW NT AUTHORITY\Authenticated Users FILE_ADD_FILE FILE_ADD_SUBDIRECTORY FILE_LIST_DIRECTORY FILE_READ_ATTRIBUTES FILE_READ_EA FILE_TRAVERSE FILE_WRITE_ATTRIBUTES FILE_WRITE_EA DELETE SYNCHRONIZE READ_CONTROL 

 C:\Users\user1\Desktop> icacls "C:\Python27" 

 C:\Python27 BUILTIN\Administrators:(ID)F BUILTIN\Administrators:(OI)(CI)(IO)(ID)F NT AUTHORITY\SYSTEM:(ID)F NT AUTHORITY\SYSTEM:(OI)(CI)(IO)(ID)F BUILTIN\Users:(OI)(CI)(ID)R NT AUTHORITY\Authenticated Users:(ID)C NT AUTHORITY\Authenticated Users:(OI)(CI)(IO)(ID)C 

F-完全访问权限。
(OI)-对象继承。
(CI)-容器继承。
(IO)-仅继承。
(NP)-禁止继承分配。
(I)-从父容器继承权限。

在执行该操作之前,您必须检查IKEEXT服务的状态。 在这种情况下,我们可以看到它被设置为“ AUTO_START”!

 sc qc IKEEXT 

 [SC] QueryServiceConfig SUCCESS SERVICE_NAME: IKEEXT TYPE : 20 WIN32_SHARE_PROCESS START_TYPE : 2 AUTO_START ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k netsvcs LOAD_ORDER_GROUP : TAG : 0 DISPLAY_NAME : IKE and AuthIP IPsec Keying Modules DEPENDENCIES : BFE SERVICE_START_NAME : LocalSystem 

现在我们知道我们有必要的条件,并且我们可以创建一个恶意dll并拦截shell!

例如,我们使用Metasploit-> msfvenom。



将evil.dll传输到目标计算机后,我们要做的只是将其重命名为wlbsctrl.dll,然后将其移动到“ C:\ Python27”。 完成此操作后,我们需要耐心等待机器重新启动(或者我们可以尝试强制重新启动),我们将获得系统外壳。

 copy evil.dll C:\Python27\wlbsctrl.dll 

之后,仅等待系统重启。

对于最后一个示例,我们将考虑计划的任务。 我将描述原理,因为 可能会有不同的情况。

我们发现任务计划程序从SYSTEM启动的过程,服务,应用程序。
我们检查对目标所在文件夹的访问权限。

 accesschk.exe -dqv "__" 

显然,这是一个严重的配置问题,但更糟糕的是,任何已认证用户(已认证用户)都对此文件夹具有写访问权。 在此示例中,我们可以简单地用metasploit生成的文件覆盖二进制可执行文件。

可以选择编码。



现在剩下的就是下载恶意可执行文件并将其覆盖在可执行文件文件夹中。 完成此操作后,我们可以安全地上床睡觉并在清晨进行全身步行。

这两个示例应该使我们了解在考虑文件和文件夹权限时必须寻找的漏洞。 学习Windows服务,计划任务和自动运行任务的所有binpath路径将花费一些时间。

最后,一些使用accesschk.exe的技巧。

查找磁盘上文件夹的所有弱权限。

 accesschk.exe -uwdqs Users c:\ accesschk.exe -uwdqs "Authenticated Users" c:\ 

查找磁盘上文件的所有弱权限。

 accesschk.exe -uwqs Users c:\*.* accesschk.exe -uwqs "Authenticated Users" c:\*.* 

像一切。

Source: https://habr.com/ru/post/zh-CN418441/


All Articles