windows提权

windows提权学习笔记

一、系统内核溢出漏洞提权

  • 溢出漏洞就像往杯子里装水—如果水太多,杯子装不下了,就会溢出来。计算机中有个地方叫缓存区。程序缓存区的大小是事先设置好的,如果用户输入数据的大小超过了缓存区大小,程序就会溢出。
  • 系统内存溢出漏洞提权是一种通用的提权方法,攻击者通常可以使用该方法绕过系统的所有安全限制。
1.1 通过手动执行命令发现缺失补丁
输入systeminfo //查看目标机器上安装了哪些补丁
wmic qfe get Caption,Description,HotFixID,InstalledOn //查看目标机器上安装了哪些补丁
1.1.1寻找EXP

然而这些补丁的输出结果是不能被直接利用的。我们需要需寻找提权的EXP,将已安装的补丁编号与提权的EXP编号进行对比。

寻找漏洞这里我们使用cmd寻找目标机器是否包含KB3143141、KB976902漏洞,如果返回寻找到则不存在漏洞。

wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KB3143141" /C:"KB976902"
1.1.2exp脚本利用

在网上寻找或者自行编写脚本进行利用直到提权

1.2 利用Metasploit发现缺失补丁

利用Metasploit中的post/windows/gether/enum_patches模块,可以根据漏洞编号快速找出系统中缺失的补丁

1.3 Windows Exploit Suggester
1.4 PowerShell中的Sherlock脚本

通过PowerShell的Sherlock脚本可以快速查找可能用于本地权限提升的漏洞。

二、操作系统配置错误利用

  • 在windows操作系统中,攻击者通常会通过内核溢出漏洞来提权,但如果碰到无法通过系统内核溢出漏洞提权所在服务器权限的情况,就会利用系统中的配置错误来提权。windows操作系统中的常见配置错误包括管理员凭证配置错误,服务配置错误,故意削弱的安全措施,用户权限过高等。
2.1 系统服务权限配置错误
  • windows系统服务器文件在操作系统启动时加载和执行,并在后台调用可执行文件。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统的启动获得系统权限。(和linux SUID位提权一样)

系统服务权限配置错误有如下两种可能:

  • 服务未运行:攻击者会使用任意服务替换原来的服务,然后重启服务
  • 服务正在运行且无法被终止:这种情况符合大多数的漏洞利用场景,攻击者通常会利用DLL劫持技术并尝试重启服务来提权。
2.1.1 PowerUp脚本利用
  • powerUp提供了一些本地提权方法,可以通过很多实用的脚本来寻找目标机器中的windows服务漏洞
2.1.2 Metasploit利用
  • 在metaspoit中,对应的利用模块是exploit/windows/local/servcie_permissions
2.2 注册表键AlwaysInstallElevated
  • 注册表键AlwaysInstallElevated是一个策略设置项。windows允许低权限用户以System权限运行安装文件。如果启用此策略设置项,那么任何权限的用户都能以NT AUTHORITY\SYSTEM权限来安装恶意的MSI文件
2.2.1 powerUp脚本利用
  • 可以使用powerup的Get-RegistryAlwaysInstallElevated模块来检查注册表键是否被设置,如果AlwaysInstallElevated注册表键已经被设置,就意味着MSI文件是以System权限来运行的。
2.3 可信任服务路径漏洞

可信任服务路径漏洞利用了windows文件路径解析的特性,并涉及服务路径的文件/文件夹权限。如果一个服务调用的可执行文件没有正确地处理所引用的完整路径名,这个漏洞就会被攻击者用来上传任意可执行文件。也就是說,如果一個服务的可执行文件的路径没有被双引号起来且包含空格,那么这个服务就是有漏洞的。

该漏洞存在两种可能性

  • 如果路径与服务有关,就任意创建一个服务或编译Service模板
  • 如果路径与可执行文件有关,就任意创建一个可执行文件
2.3.1 Trusted Service Paths 漏洞产生的原因

因为windows服务通常都是以system权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以系统权限进行。

例如,有一个文件路径“C\progran Files\Some Folder\Service.exe"。对于该路径中的每一个空格,windows都会寻找尝试并执行与空格前面的名字相匹配的程序。操作系统会对该文件路径中空格的所有可能情况进行尝试,直到找到一个能匹配的程序。在本例中,windows会依次尝试确定和执行以下程序。

  • C:\Program.exe
  • C:\Program Files\Some.exe
  • C:\Program Files\Some Folder\Service.exe

因此,如果一个被“适当”命名的可执行程序被上传到受影响的目录中,服务一旦重启,该程序就会以system权限运行

2.3.2 Metasploit下的利用

1.首先,检测目标机器中是否存在该漏洞。使用wmic查询命令,列出目标机器中所有没有被引号引起来的服务的路径

wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """

结果返回:
  D:\softwarePath\Nessus\nessus-service.exe                                       D:\softwarePath\vmware16\vmware-authd.exe                                     

2.如果存在没有被引号引起来的服务路径,接下来检测是否对目标文件夹的写权限。

这里使用windows的内置工具icacls,使用来检测该路径是否有读写权限

icacls D:\softwarePath\Nessus\nessus-service.exe
Everyone:用户对这个文件夹有完全控制权限,也就是说,所有用户都具有修改这个文件夹的权限。
(M):修改
(F): 完全控制
(CI):从属容器将继承访问控制项。
(OI): 从属文件将继承访问控制项。
"Everyone:(OI)(CI)(F)"的意思是,该文件夹,用户有读、写、删除其下文件、删除其子目录的权限。

3.确认存在此漏洞后,要把上传程序重新命名并放置在存在此漏洞且可写的目录下,执行如下命令,尝试重启服务。

sc stop service_name
sc start service_name

4.也可以使用msf中的windows service Trusted Path Privilege Escalation模块进行渗透测试。

2.4 自动安装配置文件

网络管理员在内网中给多台机器配置同一个环境时,通常不会逐台配置,而会使用脚本化批量部署的方法。在这一过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中的一些还可能包含本地管理员账号和密码等信息。

msf集成了该漏洞的利用模块,/post/windows/gather/enum_unattend

2.5 计划任务

可以使用如下命令查看计算机的计划任务

schtasks /query /fo LIST /V

​ 如果攻击者对以高权限运行的任务所在的目录具有写权限,就可以使用恶意程序来覆盖原来的程序。这样,在计划任务下次执行时,就会以高权限来运行恶意程序。

2.6 Empire内置模块

empire内置了powerUp的部分模块

三、组策略首选项提权

SYSVOL是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有与控制器之间进行复制。SYSVOL文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他控制器需要的域信息等。SYSVOL在所有经过身份验证的域用户或者域信任用户具有读写权限的活动目录的域返回内共享。整个SYSVOL目录在所有的域控制器中是自动同步和共享的,所有域策略均存放在C:\Windows\SYSVOL\DOMAIN\Policies\目录中。

在一般的域环境中,所有机器都是校本化批量部署的,数据量通常很大。为了方便地对所有的机器进行操作,网络管理员往往会使用域策略进行统一的配置和管理。大多数组织在创建域环境后,会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员密码的安全性,这些组织的网络管理员往往会修改本地管理员密码。

尽管如此,安全问题依旧存在。通过组策略统一修改的密码,虽然强度有所提升,但是所有机器的本地管理员密码是相同的。攻击者获得了一台机器的本地管理员密码,就相当于获得了整个域中所有机器的本地管理密码。

常见的组策略首选项如下:

  • 映射驱动器
  • 创建本地用户
  • 数据源
  • 打印机配置
  • 创建/更新服务
  • 计划任务
3.1 组策略首选项提权分析

四、绕过UAC提权

如果计算机的操作系统版本是windows Vista或更高,在权限不够的情况下,访问系统磁盘的跟目录(例如C:)、windows目录、Program Files目录,以及读、写系统登录数据库的程序等操作,都需要经过UAC的认证才能进行。

4.1 UAC简介
  • UAC是微软为提高系统安全性在windows vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或者进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。
  • 在windows vista及更高版本的操作系统中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害最小。
4.2 需要UAC的授权才能进行的操作列举如下
  • 配置windows Update
  • 增加/删除账户
  • 更改账户类型
  • 更改UAC的设置
  • 安装ActiveX
  • 安装/卸载程序
  • 将文件移动/复制到Program Files或windows目录下
  • 查看其他用户的文件夹
4.3 UAC有如下四种设置要求
  • 始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户。
  • 仅在程序试图更改我的就安静时通知我:这是UAC的默认设置。当本地windwos程序要使用高级别的权限时,不会通知用户。但是,当第三方程序要使用高级别的权限时,会提示本地用户。
  • 仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但在提示用户时不降低桌面的亮度。
  • 从不提示:当用户为系统管理员时,所有程序都会以最高权限运行。
4.4 bypassUac模块

假设通过一系列前期渗透测试,已经获得了目标机器的meterpreter Shell。当前权限为普通用户权限,现在尝试获取系统的system权限。

首先,运行exploit/windows/local/bypassuac模块,获得一个新的meterpreter。然后,执行“getsystem"命令。再次查看权限,发现已经绕过UAC,获得了system权限。

——————————————————————————————————————

在使用bypassuac模块进行提权时,当前用户必须在管理员组中,且UAC必须为默认设置。

当bypassuac模块运行时,会在目标机器上创建多个文件,这些文件会被杀毒软件识别。但因为exploit/windows/local/bypassuac_injection模块直接运行内存反射DLL中,所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。

4.5 RunAS模块

1.使用exploit/windows/local/ask模块,创建一个可执行文件,目标机器会运行一个发起提升权限请求的程序,提升用户是否要继续运行,如果用户选择继续运行程序,就会返回一个最高权限的meterpreter Shell

2.输入“run”命令后,目标机器上会弹出UAC对话框。

3.单击“是”按钮,会返回一个新的meterpreter Shell

4.执行“getuid”命令,查看权限。如果是普通用户权限,就执行"getsystem"命令。再次查看权限,发现已经是system权限了。

注意:想要使用RunAs模块提权,当前用户必须在管理员组中或者知道管理员的密码,对UAC的设置没有要求。在使用RunAs模块时,需要使用EXE::Custom选项创建一个可执行文件(需要进行免杀处理)

4.6Nishang中的Invoke-PsUACme模块

Invoke-PsUACme模块使用来自UACME项目的DLL绕过UAC。

4.7Emprie 中的bypassuac模块
针对绕过UAC提权的防御措施

在企业网络环境中,防止绕过UAC的最好方法就是不让内网机器的使用者拥有本地管理员权限,从而降低系统遭受攻击的可能性。

在家庭网络环境中,建议使用非管理员权限进行日常办公和娱乐等活动。使用本地管理员权限登录的用户,要将UAC设置为“始终通知”或者删除该用户的本地管理员权限(这样设置后,会想在windwos Vista中一样,总是弹出警告。)

五、令牌窃取分析

​ 令牌(token)是指系统中的临时密钥,相当于账号和密码,用于决定是否运行当前请求及判断当前请求是属于哪个用户的。获得了令牌,就可以在不提供密码或者其他凭证的情况下访问网络和系统资源。这些令牌将持续存在域系统中(除非系统重新启动)

​ 令牌的最大特点是随机性和不可预测性。一般的攻击者或软件都无法将令牌猜测出来。访问令牌(access token)代表访问控制操作主体的系统对象。密保令牌(Security Token)也叫作认证令牌或者硬件令牌,是一种用于实现计算机身份校验的物理设备。例如U盾。会话令牌(Session Token)是交互会话中唯一的身份标识符。

​ 伪造令牌攻击的核心是Kerberos协议。Kerberos是一种网络认证协议,其设计目标就是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。Kerberos协议的工作机制客户端请求证书过程如下:

  1. 客户端向认证服务器发送请求,要求得到证书
  2. 认证服务器收到请求后,将包含客户端密钥的加密证书发送给客户端。该证书包含服务器Ticket(包含由服务器密钥加密的客户机身份和一份会话密钥)和一个临时加密密钥(又称为会话密钥,session Key) 当然,认证服务器也会向服务器发送一份该证书,使服务器能够验证登录的客户端的身份
  3. 客户端将Ticket传送给服务器。如果服务器确认客户端的身份,就允许它登录服务器。客户端登录服务器后,攻击者就能通过入侵服务器来窃取客户端的令牌。
5.1令牌窃取

​ 1.假设已经获取到了目标机器的meterpreter shell。首先输入"use incognito" 命令,然后输入"list-tokens-u"命令,列出可用的令牌。如列出:WIN-612313\Administrator

​ 2.从输出的信息中可以看出,分配的有效令牌为“WIN-612313\Administrator”。“WIN-612313”是目标机器的主机名,“Administrator”是登录的用户名。

​ 3.接下来,在incognito中调用impersonate_token,假冒Administrator用户进行渗透测试。在meterpreter shell中执行"shell"命令并输入"whoami",假冒的令牌WIN-612313\Administrator已经获得了系统管理员权限了。

	PS: 
	这里有两种类型的令牌:一种是Delegation Tokens,也就是授权令牌,它支持交互式登录(例如,可以通过远程桌面登录及访问);另一种是Impersonation Tokens模拟令牌,它支持非交互式的会话。令牌的数量其实取决于meterpreter shell的访问级别。假设已经获得了一个系统管理员的授权令牌,如果攻击者可以伪造这个令牌,便可以拥有它的权限。
	
	在meterpreter shell中输入主机名\用户名的时候,需要输入两个反斜杠(\\)
5.2 Rotten Potato 本地提权分析

​ 如果目标系统中存在有效的令牌,可以通过Rotten Potato程序快速模拟用户令牌来实现权限的提升。

​ 1.首先输入"use incognito"命令,然后输入"list_tokens-u"命令,列出可用的令牌。

​ 2.执行如下命令,将rottenpotato.exe上传到目标服务器上(rottenpotato在github上下载)

execute -HC -f rottenpotato.exe

impersonate_token "NT AUTHORITY\\SYSTEM"

​ 3.执行后输入getuid就可以看到权限为 "NT AUTHORITY\SYSTEM"了

5.3 添加域管理员

​ 1.假设网络中设置了域管理进程。在meterpreter 会话窗口中输入“PS”命令,查看系统进程。找到域管理进程,并使用migrate命令迁移到该进程。在meterpreter控制台输入“shell”,进入命令行界面。输入如下命令,把lendme用户添加到域管理员组中。

net user lendme lendme123 /ad /domain

#添加一个名为lendme的用户,并设置密码为lendme123

​ 2.查看域管理员组,可以看到域管理员已经添加成功了

net group "domain adminis" /domain

​ 3.同样,在meterpreter中可以使用incognito来模拟域管理员,然后通过迭代系统中所有可用的身份验证令牌来添加域管理员。

​ 在活动的meterpreter会话中执行如下命令,在域控主机上添加一个账户

add_user lendme lendme123 -h 1.1.1.2

​ 执行如下命令,将该账户加到域管理员组中

add_group_user "Domain Admins" lendme -h 1.1.1.2
5.4 Empire 下的令牌窃取分析

​ Empire具有令牌窃取的功能

5.5 针对令牌窃取提权的防御思路
  • 及时安装微软推送的补丁。
  • 对来路不明的或者有危险的软件,既不要在系统中使用,也不要在虚拟机中使用。
  • 对令牌的时效性进行限制,以防止散列值被破解后泄露有效的令牌信息,越敏感的数据,其对令牌时效应该越短。如果每个操作都使用独立的令牌,就可以比较容易地定位泄露令牌的操作或环节。
  • 对于令牌,应采取加密存储及多重验证保护。
  • 使用加密链路SSL/TLS传输令牌,以防止被中间人窃听。

六、无凭证条件下的权限获取分析

6.1 LLMNR

​ 本地链路多播名称解析(LLMNR)是一种域名系统数据包格式。当局域网中的DNS服务器不可用时,DNS客户端会使用LLMNR解析本地网段中机器的名称,直到DNS服务器恢复正常为止。从windows Vista版本开始支持LLMNR。LLMNR支持IPv6。

  • DNS客户端在自己的内部缓存中查询名称。
  • 如果没有找到,主机将向主DNS发送名称查询请求。
  • 如果主DNS没有回应或者收到了错误的信息,主机会向备DNS发送查询请求。
  • 如果备DNS没有回应或者收到了错误的信息,将使用LLMNR进行解析。
  • 主机通过UDP协议向组播地址244.0.0.252的5355端口发送多播查询请求,以获取主机名所对应的IP地址。查询范围仅限于本地子网。
  • 本地子网中所有支持LLMNR的主机在收到查询请求后,会对比主机的主机名。如果不同,就丢弃;如果相同,就向查询主机发送包含主机的IP的单播信息。
6.2NetBIOS

​ NetBIOS是一种网络协议,一般用于在由几十台计算机组成的局域网中(根据NetBIOS协议广播获得计算机名称,并将其解析为相应的IP地址)。在windows NT以后版本的所有操作系统中均可使用NetBIOS。但是,NetBIOS不支持IPv6。

NetBIOS提供三种服务如下:

  • NetBIOS-NS(名称服务):主要用于名称注册和解析,以启动会话和分发数据包。该服务需要使用域名服务器来注册NetBIOS的名称。默认监听UDP137端口,也可以使用TCP137端口。
  • Datagram Distribution Service(数据报分服务):无法连接服务。该服务负责进行错误检测和恢复,默认监听UDP138端口。
  • Session Service(会话服务):允许两台计算机建立连接,允许电子邮件跨越多个数据包进行传输,提供错误检测和恢复机制。默认使用TCP 139端口。
6.3 Net-NTLM Hash

​ Net-NTLM Hash 与 NTLM Hash不同。

NTLM Hash是指windows操作系统的Security Account Manager 中保存的用户密码散列值。NTLM Hash通常保存在windows的SAM文件或者NTDS.DIT数据库中,用于对访问资源的用户进行身份验证。

Net-NTML Hash是指在网络环境中经过NTLM认证的散列值。挑战/响应验证中的“响应”就包含Net-NTML Hash。使用Responder抓取的通常就是Net-NTML Hash。攻击者无法使用该散列值进行哈希传递,只能在使用Hashcat等工具得到明文后进行横向移动攻击。Net-NTLM hash是网络环境下NTLM认证的hash,该hash不能进行哈希传递,但是可以用于ntlm中继攻击。

6.4 LLMNR 和 NetBIOS欺骗攻击分析

​ 假设目标网络上的DNS服务器因发生故障而无法提供服务时,会退回LLMNR和NBT-NS进行计算机名解析。下面使用Responder工具进行渗透测试。

​ Responder是监听LLMNR和NBT-NS协议的工具之一,能够抓取网络中所有的LLMNR和NBT-NS请求并进行响应,获取最初的账户凭证。

​ Responder可以利用内置SMB认证服务器,MSSQL认证服务器、HTTP认证服务器、HTTPS认证服务器、LDAP认证服务器、DNS认证服务器、WPAD代理服务器、以及FTP、POP3、LMAP、SMTP等服务器,收集目标网络中计算机的凭证,还可以通过Multi-Relay功能在目标系统中执行命令。

Responder是使用python语言编写的。可以在github上下载

1.设置监听模式

​ 进入目标网络后,如果没有获得任何目标系统的相关信息和重要凭证,可以开启Responder的监听模式。Responder只会对网络的流量进行分析,不会主动响应任何请求。

​ 使用Responder查看网络是如何在没有主动定位任何主机的情况下运行的,"ON"代表针对该服务器数据包的监听,“OFF"代表关闭监听。由此可以分析出网络中存在的地址段、机器名等。

2.渗透测试

​ 在使用Responder对网络进行分析之后,可以利用SMB协议获取目标网络中计算机的Net-NTLM Hash。如果用户输入了错误的计算机名,在DNS服务器上进行的名称查询操作将会失败,名称解析请求将会被退回,使用NBT-NS和LLMNR进行解析。

​ 在渗透测试中,使用Responder并启动回应请求功能,Responder会自动回应客户端的请求并声明主机就是被输入了错误计算机名的哪台机器,然后尝试建立SMB连接。客户端会发送主机的Net-NTLM Hash进行身份验证,此时将得到目标机器的Net-NTLM Hash。

你可能感兴趣的:(windows,服务器,网络)