THM Honeynet Collapse – Zadanie 4

Następnym zadaniem w CTFie Honeynet Collapse było zadanie 4. Polegało ono na analizie śladów włamania na Windowsie.

Pytanie 1. — data dostępu przez RDP

  • Poziom trudności: łatwy 🟢
  • Liczba punktów: 30
  • Treść: Kiedy atakujący zalogował się do serwera za pomocą protokołu RDP?

Pierwsze pytanie polegało na znalezieniu daty i czasu logowania atakującego przez protokół RDP. Zacząłem od przeszukiwania logów zdarzeń z kategorii odpowiadającej RDP, korzystając z opisu zadania, który mówił, że połączenie przychodziło z adresu 172.16.8.239.

Zacząłem od przeszukiwania logów z TerminalServices-RemoteConnectionManager, wybierając jedynie zdarzenia o ID 1149 (pomyślne uwierzytelnienie w usłudze Zdalnego Pulpitu), znalazłem połączenie przychodzące z wcześniej wspomnianego adresu IP:

Odpowiedzią na pytanie była data i czas zdarzenia.

Pytanie 2. — podmieniony plik

  • Poziom trudności: łatwy 🟢
  • Liczba punktów: 30
  • Treść: Jaka jest pełna ścieżka do pliku binarnego zastąpionego w celu eskalacji uprawnień?

Z opisu zadania można było się dowiedzieć, że administratorka serwera zautomatyzowała okresowe sprawdzanie statusu systemu. Pierwsze co przyszło mi na myśl to sprawdzenie, czy atakujący nie podmienił plików służących temu zadaniu. Domyśliłem się, że stworzyła ona zadanie w harmonogramie zadań (taskschd.msc) — i tak właśnie było:

Wyświetlając szczegóły pliku od razu widać, że coś jest nie tak. Opis programu nie zgadza się z oczekiwanym. Czemu Coreinfo jest opisany jako serwer Apache? Tyle mi wystarczyło żeby wiedzieć, że to jest plik, który podmienił atakujący.

Pytanie 3. — co to za plik?

  • Poziom trudności: średni 🟡
  • Liczba punktów: 60
  • Treść: Jakiego rodzaju złośliwe oprogramowanie zawiera zastąpiony plik binarny?

Znaleźliśmy który to plik, ale pozostaje jeszcze się dowiedzieć, co on tak właściwie robi. To pytanie, rozwiązałem za pomocą VirusTotala. Wrzuciłem plik i od razu rzuciła mi się w oczy nazwa Meterpreter. Jest to wyjątkowo znany payload który daje szerokie możliwości interakcji z zainfekowanym systemem i pochodzi z frameworku Metasploit .

Odpowiedzią na pytanie była nazwa tego payloadu.

Odpowiedź dało się również znaleźć w logach PowerShella, znajdujących się w katalogu konta Administrator, ale do nich jeszcze przejdziemy.

Pytanie 4. — kradzież poświadczeń

  • Poziom trudności: średni 🟡
  • Liczba punktów: 60
  • Treść: Jakie pełne polecenie zostało użyte do zrzutu poświadczeń z systemu operacyjnego?

Po eskalacji uprawnień atakujący skradł poświadczenia dostępne w pamięci systemu operacyjnego. Musiałem znaleźć polecenie za pomocą którego wykonano zrzut.

W katalogu Dokumenty użytkownika Administrator został transkrypt PowerShella z dnia, w którym przeprowadzono atak na serwer.

Znalazłem potwierdzenie poprzedniej odpowiedzi:

Host Application: C:\Users\emily.ross\Documents\Coreinfo64.exe
[...]
PS>IEX ([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("DQpmdW5jdG [...]

Transkrypt zawierał polecenia zapisane w kodowaniu Base64. Po zdekodowaniu jednego z nich (przy użyciu CyberChefa) potwierdziła się odpowiedź z pytania trzeciego:

[...]
return [MSF.Powershell.Meterpreter.Transport]::Add($t)
[...]

Pomijając długi bootstrap Meterpretera, na końcu transkryptu znajdują się znacznie krótsze logi. Pierwszy z nich wygląda interesująco:

*****.exe /accepteula -ma lsass.exe text.txt

Po samej obecności nazwy lsass.exe od razu wiedziałem, że znalazłem odpowiedź. LSASS odpowiada za lokalne uwierzytelnianie użytkowników i zawiera hashe NTLM zalogowanych użytkowników (nawet domenowych).

Z otrzymanego zrzutu pamięci atakujący był w stanie wyeksportować hashe i za ich pomocą przeprowadzić atak Pass—the—Hash, którego ślady szukałem w następnym pytaniu.

Pytanie 5. — Pass-The-Hash

  • Poziom trudności: trudny 🔴
  • Liczba punktów: 120
  • Treść: Kiedy atakujący wykonał ruch lateralny przy użyciu skradzionych poświadczeń?

W tym pytaniu musimy znaleźć kiedy atakujący użył skradzionych poświadczeń. Jednym z narzędzi umożliwiających ich wykorzystanie jest alternatywna wersja PsExec z pakietu impacket (oficjalny PsExec z Sysinternals nie wspiera Pass-the-Hash).

Podczas wykonywania poleceń na zdalnym komputerze przy użyciu PsExec na komputerze ofiary uruchamia się plik PsExeSVC.exe. Postanowiłem, że poszukam dowodów wskazujących na jego aktywację.

Wykorzystałem fakt, że Windows zapisuje listę ostatnio uruchomionych plików w celu poprawienia wydajności. Ta funkcjonalność nazywa się systemem Prefetch, a jej pliki znajdują się w katalogu C:\Windows\Prefetch.

Użyłem programu PECmd autorstwa Erica Zimmermana do sparsowania plików Prefetch:

PECmd.exe -d C:\Windows\Prefetch --csv ..\Prefetch --csvf pe.csv

Następnie użyłem TimelineExplorera (również autorstwa Erica) do analizy wygenerowanych plików CSV. W pliku z dopiskiem Timeline znajduje się lista uruchamianych programów, możliwa do chronologicznego posortowania.

Okazuje się, że PsExeSVC.exe został uruchomiony w dniu ataku, kilka godzin po początkowym zalogowaniu:

Odpowiedzią był dzień i czas uruchomienia PsExeSVC.exe.

Pytanie 6. — kradniemy hash NTLM

  • Poziom trudności: bonus 🌟
  • Liczba punktów: 25
  • Treść: Jaki jest hash NTLM hasła użytkownika domenowego matthew.collins?

W tym pytaniu musiałem na chwilę wcielić się w rolę atakującego i znaleźć hash NTLM użytkownika matthew.collins. Jest jeden problem: zrzut pamięci lsass.exe nic mi nie da, ponieważ użytkownik ten od dawna nie jest zalogowany na serwerze. Być może atakujący nie usunął swojego zrzutu?

W transkrypcie z pytania czwartego było widać komunikaty z dumpera pcd.exe użytego do wykonania zrzutu procesu LSASS:

ProcDump v11.0 - Sysinternals process dump utility
Copyright (C) 2009-2022 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

[18:28:30] Dump 1 initiated: C:\Windows\system32\text.txt.dmp
[18:28:31] Dump 1 writing: Estimated dump file size is 51 MB.
[18:28:33] Dump 1 complete: 51 MB written in 2.9 seconds
[18:28:34] Dump count reached.

Okazuje się, że atakujący pozostawił ten plik nietknięty. Do odczytania hasha NTLM mogłem użyć mimikatza, albo pobrać plik na swoją maszynę i użyć pypykatza (implementacja mimikatza w Pythonie) — wybrałem tą drugą opcję.

Po pobraniu pliku text.txt.dmp na swoją maszynę, wykonałem następujące polecenie:

$ pypykatz lsa minidump text.txt.dmp

Z wyniku polecenia odczytałem hash NTLM:

[...]
== LogonSession ==
authentication_id 66488374 (3f68836)
session_id 4
username matthew.collins
domainname DECEPT
logon_server DC-01
logon_time 2025-06-30T15:28:15.619499+00:00
sid S-1-5-21-468272475-2474632594-3298944031-1118
luid 66488374
	== MSV ==
		Username: matthew.collins
		Domain: DECEPT
		LM: NA
		NT: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
		SHA1: 435e619bc84181f42fd4c01f517878a4efd5fd32
[...]

Gdzie hash NTLM to wartość po NT:.