内网之权限提升总结
系统内核移除漏洞提权分析及防范
溢出漏洞的具体实际上是由于输入的数据大小超过了缓存区的大小,从而造成了溢出,覆盖了函数的返回地址,使其朝着攻击者期望的流程进行,这种方法存在着一定的局限性——如果目标系统的补丁更新工作较为迅速和完整,那么攻击者想要通过这种方式提权,就必须找出系统的0day。
通过手动执行命令发现缺失补丁
在拿到机器的Shell后,使用命令:
1 | whoami /groups |
当前权限是Mandatory Label\Medium Mandatory Level Label
,说明这是一个标准用户。
将权限从普通用户提升到管理员,也就是提升到Mandatory Label\High Mandatory Level Label
。
执行命令:
1 | systeminfo |
通过输出中的Hotfix(s)
或者修补程序
就可以看到机器上安装了哪些补丁。
当然也可以使用wmic来获取:
1 | wmic qfe get Caption,Description,HotFixID,InstalledOn |
输出结果是相同的。
通常是将已安装的补丁编号与提权的EXP编号进行对比,找出没有安装补丁的EXP进行提权。
对系统补丁包进行过滤(findstr),可以快速确定目标主机有哪些补丁没有安装。
使用MSF发现缺失补丁
利用MSF的posts/windows/gather/enum_patches
模块,可以根据漏洞编号快速找出系统中缺少的补丁。
使用方法简单,在Meterpreter下:
1 | run posts/windows/gather/enum_patches |
Windows Exploit Suggester
依赖项:
1 | python2 -m pip install xlrd==1.2.0 |
Windows下没有PIP2的,可以用
python2 -m pip ensurepip安装
,如果碰到了编码错误,先执行set PYTHONIOENCODING=utf-8
目标系统上使用systeminfo
获取系统的补丁安装情况,并重定向到文件。
使用该脚本下载安全公告数据库:
1 | python2 ./windows-exploit-suggester.py --update |
下载好后会输出文件名,如图:
然后将获得的systeminfo
信息执行如下命令:
1 | python2 .\windows-exploit-suggester.py -d .\2022-04-21-mssb.xls -i .\patches.txt |
WES-NG
上面那个工具的下一代版本,地址:bitsadmin/wesng: Windows Exploit Suggester - Next Generation (github.com)
便捷安装可以用pip install wesng
,或者克隆代码:
1 | git clone https://github.com/bitsadmin/wesng --depth 1 |
该版本支持Python3,比较好用。
下载最新的公告漏洞:
1 | python .\wes.py --update |
查看可能利用的漏洞:
1 | python .\wes.py patches.txt |
具体的使用方法还可以看一下帮助文档,这个工具比上面的更好用。
Sherlock of Powershell
作者已经废弃该工具了。
Watson of Powershell
Windows操作系统配置错误利用分析及防范
系统服务权限配置错误
Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。
尽管Windows服务是以System权限运行的,其文件夹、文件和注册表键值都是受强访问控制机制保护的。但是,在某些情况下,操作系统中仍然存在一些没有得到有效保护的服务。
系统服务权限配置错误可能有如下两种情况:
- 服务未运行:攻击者会使用任意服务替换原来的服务,然后重启服务
- 服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用常见,攻击者通常会利用DLL劫持技术并尝试重启服务来提权
PowerUp
使用PowerUp脚本可以寻找目标机器中的Windows服务漏洞。(可以从Powershell Empire或者PowerSploit来获得它)
PowerSploit可以看这里:内网基础知识总结 | 青 叶 (evalexp.top)
Powershell Empire可以看这里:PowerShellEmpire/PowerTools: PowerTools is a collection of PowerShell projects with a focus on offensive operations. (github.com)
其实两个都不太推荐了,都没人维护了。
1 | powershell.exe -exec bypass -command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}" |
可以根据列出的AbuseFunction来利用。
MSF
模块名:exploit/windows/local/service_permissions
AGGRESSIVE一般设为False,即提权成功就会停止工作。
该模块会反弹一个新的meterpreter shell。
注册表键AlwaysInstallElevated
该策略设置允许Windows低权限用户以System权限运行安装文件。如果该策略设置选项启用,那么任何权限的用户都可以以NT AUTHORITY\SYSTEM
权限来安装恶意的MSI文件。
产生原因
主要是开启了Windows Installer特权安装功能。
在组策略编辑器中,启用一下两个选项:
- 组策略-计算机配置-管理模板-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
相关知识点
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。
PowerUp检测利用
可以使用PowerUp脚本检测:
1 | Get-RegistryAlwaysInstallElevated |
如果返回为True的话,可以使用脚本生成一个MSI用于添加用户:
1 | Write-UserAddMSI |
上面的利用过程当然也可以使用MSF完成,使用MSF完成可以直接得到一个System的Meterpreter。
模块名:exploit/windows/local/always_install_elevated
,该模块会随机创建一个MSI文件,提权后就会删除已经部署的文件。
这个提权手法只需要禁用注册表键AlwaysInstallElevated即可阻止攻击者提权。
可信任服务路径漏洞
该漏洞利用了Windows文件路径解析的特性,并涉及服务路径的文件、文件夹权限。如果一个服务调用的可执行文件没有正确地处理所引用的完整路径名,这个漏洞就会被攻击者用来上传任意可执行文件。也就是说,如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的。
两种利用:
- 如果路径与服务有关,就任意创建一个服务或者编译Service模板
- 如果路径与可执行文件有关,就任意创建一个可执行文件
Trusted Service Paths漏洞产生原因
在Windows中,服务通常都是以System权限运行的,所以系统在解析服务对应的文件路径中的空格时,也会以系统权限进行。
举个例子,如某个服务的文件路径为:C:\Program Files\MySQL 5.6\bin\mysqld.exe
。
那么Windows对于该路径中的每一个空格都会尝试寻找并执行与空格前面的名字相匹配的程序,本例中,Windows会依次尝试确定和执行下列程序:
- C:\Program.exe
- C:\Program Files\MySQL.exe
- C:\Program File\MySQL 5.6\bin\mysqld.exe
如果我们能够上传一个木马,并且其路径为上面的一或二,那么程序就会以System权限运行(非绝对,大多数情况下可行)。
MSF利用
先用WMIC获取一下可能存在漏洞的服务:
1 | wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """ |
该命令必须在CMD下用,Powershell下会把”””特殊解析
该命令的意思是,通过寻找自动启动的服务,去除在C:\Windows\\
目录下的程序,并且去除使用了单引号包围的路径。
如果有输出服务的话,那么就存在可信任服务路径漏洞。
接下来应该检测是否对目标文件夹的写权限,可以使用Windows的内置工具icacls检测,如果能发现在某个目录后输出了Everyone:(OI)(CI)(F)
权限则说明了所有用户都具有修改这个文件夹的权限。
在确认存在上述漏洞后,可以把上传的木马重命名到合适位置,并且使用sc重启服务:
1 | sc stop service_name |
当然,使用MSF利用将更加简单:
模块名:exploit/windows/local/trusted_service_path
,如果存在漏洞利用成功的话将快速返回一个Meterpreter。
但是请注意,利用该方式获得的Meterpreter将会很快被目标主机中断,这是因为当一个进程在Windows操作系统中启动后,必须与服务控制管理器进行通信,如果没有通信,则服务控制管理器会认为出现了错误,进而终止该进程。
因此,在目标机器终止Meterpreter进程前,必须将Meterpreter迁移到其它进程。
可以使用:set AutuRunScript 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\Unaatend.xml
- C:\Windows\System32\Sysprep\unattend.xml
- C:\Windows\System32\Sysprep\Panther\unaatend.xml
搜索上述文件,打开,查看是否包含明文密码或者经过Base64编码的密码。
MSF也集成了该漏洞的利用模块:post/windows/gather/enum_unaatend
计划任务
使用下面的命令可以查看计算机的计划任务:
1 | schtasks /query /fo LIST /v |
AccessChk是SysInterals套件的一个工具,此套件的所有工具可以到:Sysinternals Utilities - Windows Sysinternals | Microsoft Docs下载。
该套件现在被微软官方提供,一般不会引起杀软的报警。
执行下面命令,查看指定目录的权限配置情况,如果攻击者对以高权限运行的任务所在的目录具有写权限,就可以使用恶意程序覆盖原来的程序。这样,下次计划任务启动时,就会以高权限来运行恶意程序:
1 | accesschk.exe -dqv "C:\Microsoft" -accepteula |
第一次使用会弹许可协议对话框。这里可以使用参数自动接收:
1 | accesschk.exe /accepteula |
列出某个驱动器下所有权限配置有缺陷的文件夹:
1 | accesschk.exe -uwdqsUsers C:\ |
列出某个驱动器下所有权限配置有缺陷的文件,命令如下:
1 | accesschk.exe -uwdqsUsersc:\*.* |
组策略首选项提权分析及方法
组策略首选项提权简介
SYSVOL是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制。SYSVOL文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其它域控制器需要的域信息等。
一般的域环境中,所有机器都是脚本化批量部署的,数据量通常很大。为了方便地对所有的机器进行操作,网关往往使用域策略进行统一的配置和管理。大多数组织在创建域环境后,会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员密码的安全性,这些组织的网关往往会修改本地管理员的密码。
但是这样仍然存在安全问题,通过组策略统一修改密码,虽然强度有所提高,但所有机器的本地管理员密码相同,如果攻击者获得了一台机器的本地管理员密码,就相当于获得了整个域中的所有机器的本地管理员密码。
常见的组策略首选项列举如下:
- 映射驱动器(Drives.xml)
- 创建本地用户
- 数据源(DataSources.xml)
- 打印机配置(Printers.xml)
- 创建/更新服务(Services.xml)
- 计划任务(ScheduledTasks.xml)
组策略首选项提权分析
创建组策略,批量修改域中机器的本地管理员密码
在Group Policy Management Editor中打开计算机配置页面,新建一个组策略,更新本地计算中用户的组策略首选项密码。
然后将Domain Computers组添加到验证组策略对象列表中,接着将新建的组策略应用到域中所有的非域控制器中。
域中的机器会从域控制器获取组策略的更新信息,手动更新可以使用:
1 | gpupdate |
获取组策略的凭据
2012年微软官方公布了SYSVOL的密码AES-256加密密钥,导致保存在XML文件中的密码安全性降低。
手动查找cpassword
浏览SYSVOL文件夹查看相关文件,也可以使用type命令直接搜索并访问XML文件:
1
type \\dc\sysvol\hackme.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\Groups.xml
可以使用脚本gpprefdecrypt.py解密密文。
PowerSloit提供了Get-GPPPassword.ps1
MSF模块
post/windows/gather/credentials/gpp
除了Groups.xml文件还有下面这些文件可能存在cpassword属性:
- Services\Services.xml
- ScheduledTasks\ScheduledTasks.xml
- Printers\Printers.xml
- Drives\Drives.xml
- DataSources\DataSources.xml
针对组策略首选项提权的防御措施
不将密码保存在组策略首选项中,此外,需要对Everyone访问权限进行设置:
- 设置共享文件夹SYSVOL的访问权限
- 将包含组策略密码的XML文件从SYSVOL目录中删除
- 不要把密码放在所有域用户都有权访问的文件中
- 如果需要更改域中机器的本地管理员密码,建议使用LAPS
Bypass UAC提权分析及防范
如果计算机的操作系统版本时Windows Vista或更高,在权限不够的情况下,访问系统磁盘的根目录(例如C:\)、Windows目录、Program Files目录,以及读写系统登录数据库的程序等操作,都需要经过UAC的认证才能进行。
bypassuac模块
MSF中模块名:exploit/windows/local/bypassuas
使用该模块提权有限制,当前用户必须在管理员组中,且UAC必须为默认设置(即仅在程序试图更改我的计算机时通知我
)。
当该模块运行时,会在 目标机器上创建多个文件,这些文件容易被杀软发现;exploit/windows/local/bypassuac_injection
模块直接运行在内存的反射DLL中,不会接触目标机器的硬盘,不容被发现。
该模板在MSF中对Win8不可用。
RunAS模块
MSF的exploit/windows/local/ask
,可以创建一个可执行文件,目标机器会运行一个发起权限提示请求的程序,提示用户是否要继续运行,如果用户选择继续运行程序,就会返回一个高权限的Meterpreter。
可以使用钓鱼手法完成攻击。
如果程序需要免杀,可以使用EXE::Custom
创建可执行文件。
针对Bypass UAC提权的防御措施
最好的方法是不让内网机器的使用者拥有本地管理权限,或者将UAC设置为始终通知
。
另外可以使用微软的EMET或者MalwareBytes方法0day。
令牌窃取分析及防范
令牌是指系统中的临时密钥,相对于账户和密码,用于决定是否允许当前请求及判断当前请求是属于哪个用户的。获得了令牌,就可以在不提供密码或其它凭证的情况下访问网络和系统资源。这些令牌将持续存在于系统中。
伪造令牌攻击的核心是Kerberos协议,Kerberos协议在密码学或者网络安全课程里都有讲过,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。
Windows Kerberos认证体系
如图:
一共有六次信息交互:
客户端Client向认证服务器AS发送请求,要求得到证书,包含明文信息
[ClientID|E(timestamp)|TGSID]
,这里的E是使用客户端的密钥进行加密。AS从收到的信息中解密
timestamp
,如果时间戳合法,就认为是一个正确的密码,随后返回两个内容,其一是使用Client密钥加密的[E(TGS SessionKey)]
,另一个是TGT
,包含信息:[E(TGS SessionKey)|ClientID|ClientIP|LifeTimeOfTGT]
客户端收到信息后,使用本地密钥解密信息(不是TGT,是给客户端的信息),
可以得到TGS SessionKey
,如果本地密钥无法解密那么认证失败。如果解密成功,客户端将发送一条使用TGS SessionKey加密
的Authencicator:[ClientID|Timestamp]
、一条明文信息:[ServiceID|Lifetime]
、以及收到的TGT
TGS检查服务ID是否在KDC中,没有问题则使用自己的密钥解
TGT
,利用然后使用TGS SessionKey
解密客户端信息,接着检查客户端ID、时间戳、TGT是否过期、认证信息是否在TGS的缓存中、客户端IP
,如果都检查通过,那么TGS随机生成一个Server SessionKey
,返回内容其一是使用TGS SessionKey
加密的[E(Server SessionKey)]
,其二是使用Server的密钥
加密的CST
:[Server SessionKey|ClientID|ClientIP|LifeTimeOfTicket]
客户端收到信息后解密得到Server SessionKey,向服务端发送上一次获得到的
CST
以及一个使用Server SessionKey
加密的Authenticator2:[ClientID|ClientIP|Timestamp]
,还会发送一个Flag,用于表示是否需要双向验证。服务端使用自己的密钥解密
CST
后,通过SessionKey
解密Authenticator2
,判断用户身份,如果验证成功就让其访问对应资源,否则拒绝。若需要双向验证,则返回
Timestamp
,使用Server SessionKey
加密,并返回用于Client验证Server身份。
令牌窃取
假如获得了目标机器的Meterpreter Shell,加载拓展incognito:
1 | use incognito |
然后列出可用令牌:
1 | list_tokens -u |
令牌有两种:
- Delegation Tokens —— 授权令牌,支持交互式登录
- Impersonation Tokens —— 模拟令牌,支持非交互式会话
可以在incognito中模拟令牌,假冒用户:
1 | impersonate_token desktop-lqcon8a\\administrator |
还可以直接窃取令牌:
1 | steal_token [pid] |
这个命令可以直接窃取对应PID的令牌,低权限无法向高权限进程窃取。
Rotten Potato本地提权
若目标系统存在有效的令牌,可以通过Rotten Potato程序快速模拟用户令牌实现权限提示。
下载编译后将程序上传到目标机器,使用:
1 | execute -HC -f rottenpotato.exe |
添加域管
假如网络设置了域管理进程,在Meterpreter中输入ps,查找进程,找到域管理进程,并使用Mirgrate迁移到该进程,随后使用:
1 | shell |
如果一切顺利应该可以看到添加域管成功。
使用MSF来模拟域管也是可行的:
1 | add_user shuteer xy@china110 -h 1.1.1.2 |
后面的IP是域控的。
针对令牌窃取提权的防御措施
防御措施如下:
- 即时安装微软推送的补丁
- 不要使用来路不明的危险软件
- 对令牌时效性进行限制,防止散列值被破解后泄露有效令牌信息
- 加密存储及多重验证保护令牌
- 使用加密链路SSL/TLS传输令牌
无凭证条件下的权限获取分析及防范
拿不到凭证的情况下,可以使用LLMNR和NetBIOS欺骗攻击对目标网络进行渗透测试。
LLMNR和NetBIOS欺骗的基本概念
LLMNR
本地链路多播名称解析是一种域名系统数据包格式。当局域网中的DNS服务器不可用时,DNS客户端会 使用LLMNR解析本地网段中机器的名称,直到DNS服务器恢复正常为止。从Windows Vista版本开始支持LLMNR,LLMNR也支持IPv6。
其工作流程如下:
- DNS客户端在自己的内部名称缓存中查询名称
- 若没有找到,主机向主DNS发送名称查询请求
- 如果主DNS没有回应或者收到了错误的信息,主机会向备DNS发送查询请求
- 如果备DNS没有回应或者收到了错误的信息,使用LLMNR进行解析
- 主机通过UDP协议向组播地址224.0.0.252的5355端口发送多播查询请求,以获取主机名的IP地址。查询范围仅限本地子网
- 本地子网中所有支持LLMNR的主机在收到查询请求后,对比自己的主机名,如果不同就丢弃,如果同,就向查询主机发送包含自己IP地址的单播信息。
NetBIOS
不支持IPv6。
一般提供三种服务:
- 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中保存的用户密码散列值,通常存储在SAM文件或者NTDS.DIT数据库中。
Net-NTLM Hash是指在网络环境中经过NTLM认证的散列值。挑战/响应验证的“响应”就包含Net-NTLM Hash。抓取到的通常都是Net-NTLM Hash,无法利用该哈希值进行哈希传递攻击,只能使用Hashcat攻击得到明文后进行横向移动。
LLMNR和NetBIOS欺骗攻击分析
当目标网络的DNS服务器故障时,会退回LLMNR和NBT-NS进行计算机名解析。
使用Responder工具可以抓取网络中的所有LLMNR和NBT-NS请求并响应,获取最初的账户凭证。
具体使用可以看它的文档。
- 本文标题:内网之权限提升总结
- 本文作者:青 叶
- 创建时间:2022-04-21 19:36:25
- 本文链接:p/60658/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!