内网渗透体系建设-权限提升
权限提升可以分为横向权限提升和垂直权限提升,前者是指同级用户,后者是指低级用户到高级用户。
系统内核漏洞提权
当目标系统存在该漏洞且没有更新安全补丁时,利用已知的系统内核漏洞进行提权测试人员往往可以获得系统级别的访问权限。
查找漏洞
手动查找
|
可以利用该命令查看系统安装的补丁
然后可以结合系统版本信息,借助辅助工具寻找可用的提权漏洞。
借助WES-NG查找可用漏洞
项目地址:https://github.com/bitsadmin/wesng
使用方法:
执行下面命令更新漏洞库数据
python3 wes.py --update
在目标主机执行systeminfo命令,并将结果保存到sysinfo.txt中,然后执行下面命令,用WES-NG进行检查
python3 wes.py sysinfo.txt --impact "Elevation of Privilege"
#--impact指定漏洞类型为提权漏洞emmm我的win7systeminfo文件跑出来什么都没有,跑了一下我的win11竟然有cve没绷住
执行下面命令查找所有已公开EXP的提权漏洞
python3 wes.py sysinfo.txt --impact "Elevation of Privilege" --exploits-only
确定并利用漏洞
确定漏洞之后,就去找利用程序然后上传利用进行提权。
系统服务提权
通常情况下,用户安装的一些应用软件会在本地注册一些服务,并且大多数服务在计算机开机时以系统SYSTEM 权限启动。应用软件在注册服务时,会在以下路径中创建相应的注册表项,路径如下:
|
其中的ImagePath指向启动系统服务的二进制程序路径
如果让服务启动时执行其他程序,该程序就可以随着服务的启动获得系统权限,这是利用系统服务提权的主要思路。
不安全的服务权限
ACL 定义了安全对象的访问控制策略,用于规定哪些主体对其拥有访问权限和拥有什么样的权限。Windows 的系统服务正是通过 ACL 来指定用户对其拥有的权限,常见的权限列表如下:
权限 | 说明 |
---|---|
SERVICE_START | 启动服务的权限 |
SERVICE_STOP | 停止服务的权限 |
SERVICE_PAUSE_CONTINUE | 暂停/继续运行服务的权限 |
SERVICE_QUERY_STATUS | 查询服务状态的权限 |
SERVICE_QUERY_CONFIG | 查询服务配置的权限 |
SERVICE_CHANGE_CONFIG | 更改服务配置的权限 |
SERVICE_ALL_ACCESS | 完全控制权限 |
如果用户在配置服务时使得低权限用户对高权限下运行的系统服务拥有更改服务配置的权限,我们就可以直接修改系统服务启动时的二进制文件路径。
AccessChk工具可以枚举目标主机上存在权限缺陷的系统服务。AccessChk是微软官方提供的管理工具,常用来枚举或查看系统中指定用户、组对特定资源(包括但不限于文件、文件夹、注册表、全局对象和系统服务等)的访问权限。
工具地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/accesschk
低权限用户可以检查“Authenticated Users”组和“INTERACTIVE”组对系统服务的权限。前者为经过身份验证的用户,包含系统中所有使用用户名、密码登录并通过身份验证的账户,但不包括来宾账户;后者为交互式用户组,包含系统中所有直接登录到计算机进行操作的用户。默认情况下,这两个组为计算机本地“Users”组的成员。
执行下面命令枚举”Authenticated Users”组是否具有更改服务配置的权限
|
|
我在本机没有找到有更改权限的用户
以书上例子在找到权限的情况下应该如何利用:
可以看到该组对InsproSvc服务具有更改服务配置的权限,然后执行下面的命令,我们就可以将该服务启动时执行的二进制文件替换为我们上传的攻击载荷
|
如果当前用户对该服务拥有SERVICE_STOP和SERVICE_START权限,即我们拥有可以重启服务的权限
|
服务注册表权限脆弱
Windows 的注册表中存储了每个系统服务的条目,而注册表使用 ACL 来管理用户对其所拥有的访问权限。如果注册表的 ACL配置错误,使得一个低权限用户对服务的注册表拥有写入权限,此时可以通过修改注册表来更改服务配置。例如修改注册表中的ImagePath键。
执行下面命令枚举”Authenticated Users”是否具有服务注册表写入权限的用户
accesschk.exe /accepteula -uvwqk "Authenticated Users" HKLM\SYSTEM\CurrentControlSet\Services
-uvwqk: 这些选项表示 AccessChk 将以详细格式显示对象的安全描述符信息。每个选项的含义如下:
u: 显示所属用户(Owner)信息。
v: 显示所选对象的详细信息。
w: 深入显示子项的信息(递归检查)。
q: 静默模式,只显示结果而不显示头部信息。
k: 同意许可证。该用户组对RegSvc服务的注册表具有完全控制权限,所以我们可以执行下面命令将注册表中的ImagePath键指向我们上传的攻击载荷
reg add HKLM\SYSTEM\CurrentControlSet\Services\RegSvc /v ImagePath /t REG_EXPAND_SZ /d "cmd.exe /k C:\Users\Public\reverse_tcp.exe" /f
/v:指定要添加或修改的注册表值的名称。
/t:指定注册表值的类型。在这里是REG_EXPAND_SZ,表示该值包含可扩展的字符串。
/d:指定要设置的数据值。
/f:在执行命令时强制执行,即不进行提示确认操作。执行下面命令检查当前用户对该服务是否有重启权限:
accesschk.exe /accepteula -ucqv "Authenticated Users" RegSvc
然后我们就可以重启服务进行提权
服务路径权限可控
如果目标主机上用户存在错误配置或操作,使得一个低权限的用户对此服务调用的二进制文件或其所在目录拥有写入权限,那么可以直接将该文件替换成攻击载荷,并随着服务的启动继承系统权限。
执行下面命令查看InsexeSvc这个服务的二进制文件所在的目录是否有写入权限
accesschk.exe /accepteula /quv "C:\Program Files\Insecure Executables\"
结果中看到”INTERACTIVE”组对该文件夹具有完全控制权限、
该组包含所有能够登录到系统的成员。此时,测试人员可以将InsexeSvc 服务的二进制文件替换成一个同名的攻击载荷,并随着服务的重启继承系统权限
未引用的服务路径
未引用的服务路径(Unquoted Service Path)漏洞曾被称为可信任的服务路径(TrustedService Path),利用了 Windows 文件路径解析的特性。当服务启动所执行的二进制文件的路径中包含空格且未有效包含在引号中时,就会导致该漏洞。
造成该漏洞的根本原因在于 Windows 系统中用于创建进程的 CreateProcess 函数。
如果完整路径中包含空格且未有效包含在引号中,那么对于该路径中的每个空格Windows 会按照从左到右的顺序依次尝试寻找并执行与空格前的名字相匹配的程序。例如,对于路径 C:\Program Files\Sub Dir\Program Name.exe,系统依次寻找并执行以下程序C:\Program.exe,C:Program Files\Sub.exe ,C:\Program Files\Sub Dir\Program.exe,C:\Program Files\Sub Dir\Program Name.exe 。
当系统进行该路径尝试的时候,会以当前服务所拥有的权限进行。所以当对受影响的目录具有写入权限时,可以上传一个特殊命名的攻击载荷到该目录中
执行下面命令枚举主机上所有有该漏洞的服务
wmic service get DisplayName, PathName, StartMode|findstr /i /v "C:\Windows\\" |findstr /i /v """
可知UnquoteSvc这个服务的路径有空格且没有引号包裹
用Accesschk检查该受影响的目录
accesschk.exe /accepteula -quv "Authenticated Users" "C:\Program Files\Unquoted Path\"
这个时候就可以向该目录上传一个Sub.exe的攻击载荷,检查到这里的时候就会以SYSTEM权限执行Sub.exe程序。
PowerUp
powerup就是一个powershell脚本,里面集中了上面所说的所有方法。使用方法可以去看官方文档
项目地址:https://github.com/PowerShellMafia/PowerSploit/
这里有一篇使用的文章:https://blog.51cto.com/binghe001/5247921
MSI安装策略提权
MSI安装策略提权是由于用户在配置MSI安装策略时,启用了**“永远以高特权进行安装”(AlwaysInstallElevated,默认情况下为禁用状态)**,使得任何权限的用户都可以通过 SYSTEM 权限安装MSI程序。此时测试人员可以在目标主机上安装一个预先制作的恶意MSI文件,以获得SYSTEM 权限。
MSI(Microsoft Installer)是一种用于 Windows 操作系统的安装包格式,MSI 安装策略指的是针对 MSI 安装程序的一系列安装和配置规则。以下是一些常见的 MSI 安装策略:
- 组策略(Group Policy):管理员可以使用组策略来指定计算机或用户级别的 MSI 安装策略,例如允许或禁止特定程序的安装、配置安装包位置等。
- 静默安装(Silent Installation):通过在命令行中使用特定参数,可以实现无需用户干预的 MSI 静默安装。这种安装方式通常用于批量部署软件。
- 卸载策略:管理员可以指定卸载 MSI 软件的策略,包括是否允许用户卸载软件、是否强制卸载等。
- 修补策略(Patch Policy):允许管理员为已安装的 MSI 软件应用修补程序,以解决漏洞或增加功能。管理员可以规定哪些修补程序允许应用、如何应用修补程序等。
- 升级策略(Upgrade Policy):管理员可以定义升级策略来升级已安装的软件版本,以确保网络上的计算机都在运行最新版本。
- 限制策略(Restriction Policy):可以通过策略限制哪些用户或计算机可以安装某个 MSI 软件,从而控制软件的分发和访问权限。
MSI实际上是一个数据库,包含安装和卸载软件时需要使用的大量指令和程序数据
确定系统是否存在漏洞
如果用户配置了”永远以高特权进行安装”,会在注册表下面两个位置创建键值1
|
可以执行下面的命令进行确认是否开启该特权
|
创建恶意MSI并安装
确定目标系统存在该漏洞后,使用MetaSploit自动生成MSI
|
在现有的 Meterpreter 会话中将创建的MSI文件上传到目标计算机,执行以下命令:
|
最终提权如下:
访问令牌操纵
Windows 操作系统的访问控制模型(Access Control Model)是 Windows 系统安全性的基础构件,由访问令牌(Access Token)和安全描述符(Security Descriptor)两部分组成,二者分别被访问者和被访问者所持有。通过比较访问令牌和安全描述符的内容Windows 可以对访问者是否拥有访问资源对象的能力进行判定。
访问令牌
当用户登录时,如果验证通过就会为用户创建一个访问令牌,包括登录过程返回的SID以及由本地安全策略分配给用户和用户所属安全组的特权列表。代表该用户执行的每个进程都有此访问令牌的副本。
Windows 中的令牌可以分为主令牌(Primary Token)和模拟令牌(Impersonation Token)。主令牌与进程相关联,是由 Windows内核创建并分配给进程的默认访问令牌。主令牌与进程相关联,是由Windows内核创建并分配给进程的默认访问令牌。每个进程都有一个主令牌,描述了与当前进程关联的用户账户的安全上下文。
当进程与安全对象进行交互的时候,系统将使用主令牌;此外,线程可以模拟客户端账户,模拟是指线程在安全上下文中执行的能力,并且该上下文不同于拥有该线程的进程的上下文。当线程模拟客户端时,模拟线程将同时具有主访问令牌和模拟令牌。
通过操纵访问令牌,使当前的进程看起来像是其他进程所启动的子进程或者其他用户所启动的进程;使用内置的Windows API从指定的进程中复制访问令牌来用于现有进程或者生成新进程,并以此来绕过访问控制,提升权限,这个过程叫做令牌窃取。
内置API:
Win32 API | 说明 |
---|---|
OpenProcess | 根据提供的进程ID获取指定进程的句柄 |
OpenProcessToken | 获取与指定进程相关联的访问令牌的句柄 |
DuplicateTokenEx | 复制现有的访问令牌以创建一个新的访问令牌,包括创建主令牌或模拟令牌 |
ImpersonateLoggedOnUser | 调用线程来模拟登录用户的访问令牌的安全上下文 |
CreateProcessWithTokenW | 创建一个新进程及其主线程,新进程在指定令牌的安全上下文中运行 |
CreateProcessAsUserA | 创建一个新进程及其主线程,新进程在由指定令牌表示的用户的安全上下文中运行 |
这是一个使用api复制令牌的程序示例:
|
注意,令牌窃取只能在特权用户上下文中才能完成,因为通过令牌创建进程使用的CreateProcessWithTokenW和 CreateProcessAsUserA 两个 WindowsAPI分别要求用户必须拥有SeImpersonatePrivilege和 SeAssignPrimaryTokenPrivilege/SeIncreaseQuotaPrivilege 特权,而拥有这两个特权的用户一般为系统管理员账户、网络服务账户和系统服务账户(如IIS、MSSQL 等)。
常规令牌窃取操作
常规的令牌窃取操作往往用来将从管理员权限提升至SYSTEM、TrustedInstaller 等更高的系统权限。在实战中,如果本地管理员账户因为某些组策略设置无法获取某些特权,可以通过令牌窃取来假冒 NT AUTHORITY\SYSTEM 的令牌,以获取更高的系统权限。此外,令牌窃取还经常被用于降权或用户切换等操作。
利用incognito.exe窃取令牌
工具地址:https://github.com/milkdevil/incognito2/blob/master/incognito.exe
下面命令列举当前主机上的所有令牌:
|
|
该命令窃取目标账户的访问令牌并创建进程
执行下面命令可以直接实现用户的切换。
|
利用MetaSploit窃取令牌
如果获取了Meterpreter,就可以进行令牌窃取等系列操作
|
利用令牌获取TrustedInstaller权限
SYSTEM权限为Windows系统中的最高权限,但是即便获取了该权限也不能修改Windows的系统文件。
例如,C:\Windows\servicing目录即使拥有 SYSTEM权限也无法向该目录写入文件
我们可以用icacls查看一下该目录的权限:
|
发现 NT SERVICE\TrustedInstaller 账户对其具有完全控制权限
从 Windows Vista 开始系统内置了一个 TrustedInstaller 安全主体,拥有修改系统文件权限,专用于对系统进行维护、更新等操作。TrustedInstaller 以一个账户组的形式出现即 NT SERVICE\TrustedInstaller。
TrustedInstaller本身也是一个服务,启动该服务是会运行TrustedInstaller.exe程序,该程序的路径为“C:\Windows\servicing\TrustedInstaller.exe”
其拥有者就是NT SERVICE\TrustedInstaller;所以我们可以窃取该进程的令牌来获得修改系统文件的权限。
然后我们执行下面命令先启动该服务
|
然后在meterpreter中利用上面的pid窃取令牌
|
Potato家族提权
Potato家族是一种常用的提权技术,通过操纵访问令牌将已获取的Windows服务账户权限提升至系统SYSTEM权限。
Potato 家族是通过滥用前面令牌窃取提到的两个前提特权,将已获取的 NT AUTHORITY\SYSTEM 账户的访问令牌传入CreateProcessWithTokenW或CreateProcessAsUserA函数进行调用,从而在NT AUTHORITY\SYSTEM 账户的上下文创建新进程,以提升至SYSTEM权限。
在实战场景中,若成功拿到了IIS等服务的 WebShell 或者通过 MSSQL 服务的xp_cmdshell 成功执行了系统命令,此时获取的服务账户拥有 SeImpersonatePrivilege 和SeAssignPrimaryTokenPrivilege 特权,就可以通过 Potato 家族提升至 SYSTEM 权限。
Rotten Potato
即”烂土豆”,用于将已获取的服务账户权限提升至SYSTEM权限。
Rotten Potato 提权的实现机制相当复杂,拦截 NTLM 身份认证请求,并伪造 NT AUTHORITY\SYSTEM 账户的访问令牌,大致可以分为以下三个步骤:
- 通过 CoGetInstanceFromIStorage API,将一个COM对象(BITS)加载到本地可控的端口(TCP 6666),并诱骗 BITS 对象以 NT AUTHORITY\SYSTEM 账户的身份向该端口发起 NTLM 认证
- 借助本地RPC 135端口,对BITS对象的认证过程执行中间人攻击(NTLM Relay),同时调用相关 API为 NT AUTHORITY\SYSTEM 账户在本地生成一个访问令牌。
- 通过 NT AUTHORITY\SYSTEM 账户的令牌创建新进程,以获取SYSTEM 权限。
现在假设已经获取IIS服务账户的WebShell,执行whoami /priv查询当前的特权
通过webshell上线MetaSploit,此时加载incognito不能列举出高权限用户的令牌
接下来向目标主机上传Rotten Potato的利用程序,并通过下面命令在Meterpreter中运行
|
此时再次执行list_token -u就可以看到 高权限用户的令牌了
然后就可以用impersonate_token伪造该令牌获取SYSTEM权限
Juicy Potato
Juicy Potato 与 Rotten Potato 的原理几乎完全相同,只是在后者的基础上做了扩展,以便更灵活利用 Rotten Potato。Juicy Potato 不再像 Rotten Potato 那样依赖于一个现有的Meterpreter,并且可以自定义 COM 对象加载的端口,以及根据系统版本更换可用的 COM对象
还是以IIS服务演示,假设已经通过MetaSploit 获取了 IIS服务账户的权限。
上传 JuicyPotato 的利用程序,并根据操作系统版本选择一个可用的 COM 对象。在 Rotten Potato 中使用的 COM 对象为 BITS,而 Juicy Potato 为不同 Windows 版本提供了多个可以利用的COM对象。
对于Windows Server2016,可以选择的对象有COMXblGameSave,其CLSID为{F7FD3FD6-9994-452D-8DA7-9A8FD87AEEF4}
执行以下命令,运行 JuicyPotato,将获取 SYSTEM 权限并运行指定的攻击载荷,成功获取到了一个SYSTEM权限的Meterpreter
JuicyPotato.exe -t t -p "C:\inetpub\wwwroot\reverse_tcp.exe" -l 6666 -n 135 -c {F7FD3FD6-9994-452D-8DA7-9A8FD87AEEF4}
#-t,指定要使用 CreateProcesswithTokenW和CreateProcessAsUserA()中的哪个函数创建进程
#-p,指定要运行的程序;-l,指定COM对象加载的端口
#-n,指定本地RPC服务端口,默认为135;-c,指定COM对象的CLSID
注意,以上提权方法仅适用于 Windows 10 version 1809 和 Windows Server 2019 之前版本的系统。在之后的版本中,微软通过检查RPC 绑定字符串中指定的端口来修复了这个问题,修复后的系统无法通过原来的方法实现中间人攻击。
PrintSpoofer(Pipe Potato)
该提权技术主要利用了打印机组件路径检查中存在的一个Bug,使高权限的服务能连接到测试人员创建的命名管道,以获取高权限账户的令牌来创建新进程。
上线MetaSploit后,向目标主机上传PipePotato利用程序,在SHELL中直接运行就会获得SYSTEM权限
Sweet Potato
集成了上面所述的功能,有机会把这些提权方法复现一下。
Bypass UAC
用户账户控制(User Account Control,UAC)是Windows操作系统采用的一种控制机制,可以阻止自动安装未经授权的应用并防止意外更改系统设置,有助于防止恶意软件损坏计算机。用户账户控制使应用程序和任务始终在非管理员账户的安全上下文中运行,除非管理员专门授予管理员级别的权限。开启用户账户控制后,每个需要使用管理员访问令牌的应用都必须提示征得用户同意。
UAC限制限制所有用户包括非RID 500的管理员用户使用标准用户登录到他们的计算机,并在标准用户的安全上下文中访问资源和运行应用;非RID 500指的是除了Administrator以外、位于管理员组的其他用户。
非RID 500用户登录后,系统会为他们创建两个单独的访问令牌:标准用户访问令牌和管理员访问令牌。两个令牌的用户特定信息相同,只是标准用户令牌移除了Windows管理特权和相关SID。当要执行高权限任务时,系统会自动询问是否批准,也就是平时会弹出的是否以管理员权限运行。
Bypass UAC就是使非RID 500用户可以不需要批准直接使用管理员访问令牌。
UAC白名单
微软给一些系统程序设置了白名单机制,这些程序执行高权限时不用再询问;如:slui.exe、wusa.exe、taskmgr.exe、msra.exe、eudcedit.exe、eventvwr.exe、CompMgmtLauncher.exe、rundll32.exe、explorer.exe。
对这些程序进行DLL劫持、DLL注入或者注册表劫持就可以绕过UAC。
我们可以用微软官方提供的两个工具来寻找白名单程序:Sigcheck和Strings
白名单程序的特性就是Manifest 数据中 autoElevate 属性的值为 True。
Sigcheck可以检测程序是否有autoElevate属性,以ComputerDefaults.exe示例:
|
Strings可以找出所有具有autoElevate属性的程序
|
下面用ComputerDefaults.exe来进行分析,并通过该程序绕过UAC
该程序运行后会打开Windows默认应用,而且不会出现UAC弹窗
使用进程监控器Process Monitor(这也是微软的官方工具)监控该程序进程的所有操作行为(主要是监控注册表和文件的操作)
可以看到注册表的查询项和过程,我们就是利用修改查询注册表时会执行的可执行文件的路径来进行UAC绕过,书上用的注册表路径我这里没有,就记录一下绕过过程
书上的该程序使会查询注册表的这两个进程
通常情况下,以“shell\open\command“命名的注册表中存储的可能是可执行文件的路径,所以知道后就可以修改该项的值以修改可执行文件的路径
|
执行上面命令后就会在注册表HKCU\Software\Classes\ms-settings\shell\open\command(如果没有就创建)中将要执行的攻击载荷路径分别写入默认值和DelegateExecute值。标准用户对注册表键值有修改权限,并且对HKCU的修改会自动同步到HKCR
这时候再次运行ComputerDefaults.exe时,恶意程序就会随着该程序的启动绕过UAC并以高权限运行,如下图:
上线MetaSploit之后,执行getsystem命令可直接提升至SYSTEM权限
DLL劫持
DLL就是动态链接库,在程序运行的时候相关的DLL就会被加载进对应程序进程的内存空间,当我们能够通过一些手段让程序执行任意的DLL,就会造成DLL劫持。
应用程序加载DLL时,没有指定绝对路径就会以下面的路径搜索DLL
|
DLL劫持的原理就是将我们的同名恶意DLL文件放在合法DLL文件的搜索路径之前,程序就会优先加载我们的恶意DLL,造成DLL劫持;利用的前提是拥有对上述目录的写入权限,并且恶意 DLL 需要与原始 DLL拥有相同的导出表函数。
模拟可信任目录
当系统允许程序自动提升权限时,需要满足下面三个条件,任何一个条件不通过都会被系统拒绝:
- 检查可执行文件的 Manifest 信息autoElevate属性字段的值为True
- 检查可执行文件的签名
- 检查可执行文件是否位于系统可信任目录中
系统在检查可信任目录时,相关函数会去掉可执行文件路径中的空格,所以我们可以借助该特性来绕过第三个条件,比如文件位于”C:\Windows \System32”。
基于此原理,测试人员根据可信任目录来创建一个包含尾随空格的模拟可信任目录将一个白名单程序复制到模拟可信任目录中,配合 DIL劫持等技术即可成功绕过 UAC。
大致攻击流程如下:
先创建模拟可信任目录
md "\\?\C:\Windows "
md "\\?\C:\Windows \System32"
copy C:\Windows\System32\WinSAT.exe "\\?\C:\Windows \System32\WinSAT.exe" #这里复制白名单程序到模拟可信任目录
#\\?\前缀是为了保证路径解析正确启动该白名单程序用Process Monitor检测其进程所加载的DLL
然后选择一个DLL进行劫持,注意构造的恶意DLL文件需要与原来的DLL具有相同的导出函数。可以使用**ExportsToC++**工具来获取原DLL文件导出的函数并自动生成C++代码。
简单修改生成代码,在DLLMain入口函数加入要执行的操作,然后编译生成64位的DLL文件
将生成DLL文件放入模拟可信任目录再运行白名单程序即可。
相关辅助工具
UACME
UACME是一个专用于绕过 WindowsUAC的开源项目,目前已包含了70多种 BypassUAC的方法,项目地址:https://github.com/hfiref0x/UACME
在UACME项目中,每种BypassUAC 的方法都有一个数字编号,由一个名为Akagi.exe(需要自行编译生成)的主程序进行统一调用,相关命令如下:
|
MetaSploit
MetaSploit也有内置用于绕过UAC的模块
成功利用这些模块,将得到一个关闭了UAC保护的 Meterpreter,然后执行 getsystem命令,可直接提升至SYSTEM权限。
用户凭据操作
枚举Unattended凭据
无人值守(Unattended)安装允许应用程序在不需要管理员关注下自动安装。无人值守安装的问题是会在系统中残留一些配置文件,其中可能包含本地管理员的用户名和密码,常见的路径如下:
|
可以全盘搜索上述配置文件,并检索User、Accounts、UserAccounts、LocalAccounts、Administrator、Password等关键字来获取管理员凭据。
MetaSploit 提供了 post/windows/gather/enum_unattend 模块,可以从 Unattend 配置文件中自动化检索出用户密码
获取组策略凭据
微软在 Windows Server 2008中引入了组策略首选项,允许网络管理员对指定计算机和用户配置特定的设置。
在大型企业或组织的域环境中,网络管理员往往会通过下发组策略的方式对所有加入域的计算机的本地管理员密码进行批量修改。
在新建一个组策略后,域控制器会自动在SYSVOL 共享目录中生成一个XML 文件该文件保存了组策略更新后的密码。SYSVOL是在安装活动目录时创建的一个用于存储公共文件服务器副本的共享文件夹,主要存放登录脚本、组策略数据及其他域控制器需要的域信息,并在所有经过身份验证的域用户活域信任用户范围内共享
改目录中一个Groups.xml文件,其中的cpassword字段保存了AES256加密后的用户密码
但是后来微软在2012年公布了加密私钥,所以经过认证的用户都可以读取并解密出来。
MetaSploit 框架内置 post/windows/gather/credentials/gpp 模块,可以自动化搜索位于SYSVOL共享目录中的XML,并从中解密出用户密码
HiveNightmare
2021年7月,Microsoft发布紧急安全公告,公开了一个Windows 提权漏洞(CVE-2021-36934)。由于 Windows中多个系统文件的访问控制列表(ACL)过于宽松使得任何标准用户都可以从系统卷影副本中读取包括SAM、SYSTEM、SECURITY 在内的多个系统文件。由于SAM 文件是存储用户密码哈希值的安全账户管理器,进而可以获取所有本地用户 NTLM Hash值,通过暴力破解或哈希传递等方法就能实现本地权限提升。
该漏洞利用需要满足三个条件:
- 已启用系统保护(默认启用)
- 系统上存在已创建的系统还原点
- 系统启用本地管理员用户
Windows系统保护:是Windows操作系统的一个功能,旨在保护计算机的系统文件和设置免受意外更改或恶意软件的损害。它通过创建系统还原点和监控系统文件的完整性来实现这一目标。
具体来说,Windows系统保护有两个主要功能:
- 系统还原点:Windows系统保护会定期创建系统还原点,这是计算机在某个时间点的快照。当计算机遇到问题或系统文件损坏时,可以使用系统还原点将系统还原到先前的正常状态。系统还原点记录了操作系统、驱动程序和注册表的状态,而不会影响个人文件和数据。
- 文件完整性监控:Windows系统保护还会监控系统文件的完整性。它会定期扫描关键系统文件,验证其完整性,并修复任何被修改或损坏的文件。这有助于防止恶意软件或用户意外更改系统文件,从而确保系统的稳定性和安全性。
满足之后标准用户即可访问和转储SAM、SYSTEM、SECURITY文件,路径一般如下:
|
标准用户可以执行下面命令查看是否存在漏洞:
|
出现下面内容则表示存在该漏洞
然后将HiveNightmare.exe利用程序上传到目标主机直接运行就可以将这三个文件转储到当前目录,项目地址:https://github.com/GossiTheDog/HiveNightmare
最后使用Impacket 项目中的secretsdump.py导出 SAM 文件中的哈希值,项目地址:https://github.com/fortra/impacket
|
用mimikatz也一样
Zerologon域内提权
Zerologon(CVE-2020-1472)是Netlogon远程协议的一个特权提升漏洞,可以在不提供任何凭据的情况下通过身份验证,并实现域内提权。
Netlogon协议
|
该漏洞的最常见的利用方法是调用Netlogon中的RPC函数 NetrServerPasswordSet2来重置域控制器的密码。注意,这里重置的是域控机器账户的密码,该密码由系统随机生成,密码强度是 120个字符,并且会定时更新。
机器用户拥有域用户的一切属性,在特定意义上也是一种域用户。域内的机器账户以“机器名+$”来命名如域控制器DC-1的机器用户就是DC-1$。
但是机器账户不允许登录,因此不能重置密码后直接登录,机器账户默认情况下拥有DCSync权限,因此可以通过 DCSync攻击导出域管理员密码的哈希值,进而获取域控权限。
攻击过程:
重置域控密码
python3 cve-2020-1472-exploit.py DC-1 10.10.10.11 #将域控的密码置空,该攻击脚本可以网上查找
使用 secretsdump.py以空密码连接上域控,并导出域管理员的哈希值
python3 secretdump.py hack-my.com/DC-1\$@10.10.10.11 -just-dc-user "hack-my\administrator" -no-pass
然后执行哈希传递攻击获取域控的SYSTEM权限
也可以使用mimikatz
|
攻击结束后还需要及时恢复域控密码,否则可能导致域控制器脱域。主要原因是域控 NTDS.dit 中存储的密码和域控本地注册表中存储的密码不一致。
先导出本地注册表的值
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save使用secretsdump.py导出注册表中的哈希值
python secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
箭头所指即当前机器用户密码
通过运行 CVE-2020-1472 中的 restorepassword.py 恢复域控密码
pvthon3 restorepassword.py hack-my.com/DC-1@DC-1 -target-ip 10.10.10.11 -hexpass <导出的哈希值>
也可以直接使用mimikaze恢复
|
Print Spooler提权漏洞
Print Spooler 是 Windows 系统的打印后台处理服务,用来管理所有本地和网络打印队列,并控制所有打印工作。该服务在 Windows 中为默认开启状态
PrintDemon
2020年5月12日,微软发布安全更新补丁,公开了一个名为“PrintDemon”的本地提权漏洞(CVE-2020-1048)。由于 Windows Print Spooler 服务存在缺陷,用户可以在系统上写入任意文件,并可以借助其他方法提升权限。该漏洞广泛影响 Windows 系统的各版本。
PrintNightmare
PrintNightmare 是广泛影响 Windows 系统各版本的严重安全漏洞,发生在 WindowsPrint Spooler 服务中,有两种变体,一种导致权限提升(CVE-2021-1675),另一种允许远程代码执行(CVE-2021-34527)。
标准用户可以通过 PrintNightmare 漏洞绕过 PfcAddPrinterDriver 的安全验证,并在打印服务器中安装恶意的驱动程序。若当前所控制的用户在域中,则可以连接到域控制器中的 Print Spooler 服务并在域控制器中安装恶意的驱动程序,进而接管整个域环境。
Certifried域内提权
2022年5月10日,微软发布补丁修复了一个Active Directory 域权限提升漏洞(CVE-2022-26923)。该漏洞是由于对用户属性的不正确获取,允许低权限用户在安装了活动目录证书服务(Active Directory Certificate Services,AD CS)服务器角色的活动目录环境中将权限提升至域管理员。
活动目证书服务
活动目录证书服务(AD CS)是微软对PKI(PublicKey Infrastructure,公钥基本结构)的实现,与现有的活动目录森林集成,并提供从加密文件系统到数字签名,再到客户端身份验证等一切功能。虽然默认情况下没有为活动目录环境安装活动目录证书服务,但活动目录证书服务如今已在各大企业和组织中被广泛部署。
PKI 是用来实现证书的产生、管理、存储、分发和撤销等功能,可以理解为一套解决方案,其中需要有证书颁发机构,具有证书发布、证书撤掉等功能。
活动目录证书注册流程
要从活动目录证书服务(ADCS)获取证书,客户端需经过注册流程
CA证书是什么
CA证书是由权威的数字证书授权中心(Certification Authority,简称CA)签发的一种数字证书。CA证书用于验证和确认公钥的所有者身份,确保通信的安全性和可信度。
CA证书包含以下关键信息:
- 公钥:CA证书包含一个公钥,用于加密和验证数字签名。
- 主体信息:CA证书中包含证书的拥有者(通常是个人、组织或设备)的身份信息,如姓名、组织名称、电子邮件地址等。
- 有效期:CA证书具有一个指定的有效期,即证书的生效日期和过期日期。在有效期内,证书可以用于加密、解密和验证数字签名。
- 签名算法和签名值:CA使用其私钥对证书的信息进行数字签名,以确保证书的完整性和真实性。证书中包含了签名值和用于生成签名的算法信息。
CA证书的工作原理如下:
- 证书请求:申请者生成一个证书请求(Certificate Signing Request,简称CSR),包含其公钥和身份信息。CSR提交给CA以申请证书。
- CA验证:CA对申请者的身份进行验证,并确认其公钥的真实性。验证可以通过多种方式进行,如身份验证、域名验证等。
- 签发证书:经过验证后,CA使用自己的私钥对证书请求进行数字签名,生成最终的CA证书。
- 证书分发:CA将签发的证书发送给申请者。申请者可以将该证书用于加密通信、数字签名验证等操作。
CA证书的作用是建立数字身份和建立信任链。由于CA是被广泛认可和信任的权威机构,其签发的证书能够验证证书持有者的身份,确保通信的安全性和可信度。客户端可以验证服务器的CA证书,确保与其通信的服务器是合法和可信赖的。
在Web安全领域,CA证书也用于HTTPS协议,用于验证网站的真实性和建立安全的加密通信通道。
注册流程
概括地说,在注册期间,客户端首先根据活动目录Enrollment Services 容器中的对象找到企业 CA,然后生成一个公钥/私钥对,并将公钥、证书主题和证书模板名称等其他详细信息一起放入证书签名请求(Certificate SigningRequest,CSR)消息。客户端使用其私钥签署 CSR,并将 CSR发送到企业 CA 服务器。CA 服务器检查客户端是否可以请求证书,如果是,就会通过查找CSR 中指定的证书模板 AD 对象来确定是否会颁发证书CA 将检查证书模板 AD对象的权限是否允许该账户获取证书,如果是,就将使用证书模板定义的“蓝图”设置(如EKU、加密设置和颁发要求等)并使用 CSR中提供的其他信息(如果证书的模板设置允许)生成证书。CA使用其私钥签署证书,然后返回给客户端。
CA 颁发的证书可以提供加密(如加密文件系统)、数字签名(如代码签名)和身份验证(如对AD)等服务。