获取shell --> 本地提权 or 利用漏洞提权
Windows 账号概念
一般系统都是多用户,会根据不同的应用程序的需求赋予其相应的权限大小,从安全角度来说,只应赋予其满足需求的最小权限即可,Windows下的管理员账号为Administrator,类UNIX下为root。
而系统账号有两种,用户账号和服务账号,用户账号在登陆时会获取一个权限令牌,注销或关机时会销毁,每一次的令牌是不同的;服务账号则无需用户登录,在操作系统启动时就会在后台启动该服务,比如Mysql等数据库使用的特定账号,都是和用户账号分开来使用的,不建议使用用户账号作为服务的账号,这样是不安全的。
其次Windows下默认有以下类型的账号:Adiministrator
、user
、SYSTEM
(较为特殊,用于启动运行系统内核级别的权限功能,如操作注册表项等)。
所以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
7C:\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)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 | C:\Documents and Settings\float\桌面>wce-universal.exe -h |
最常用的参数就是-w
了,可以直接获取明文密码,其他常用参数如-l
用来列举当前机器中的所有用户密码哈希值,-s
用于更改用户的密码(容易被用户发觉)。
他的工作方式有两种:非安全模式和安全模式,这个程序主要是通过注入代码的形式来查找密码,非安全模式即注入的代码可能会注入到了操作系统在内存中的部分,导致操作系统崩溃等现象。下面是-w的结果:
1 | C:\Documents and Settings\float\桌面>wce-universal.exe -w |
WCE防护方法:修改注册表中LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Package
的键值即可
同样适用mimikatz也可以抓取到密码(因为配置了域所以有kerberos的密码):
1 | mimikatz # sekurlsa::logonPasswords |
利用漏洞提权
很多漏洞在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盘:
访问域控机器的注册表: