Skip to main content

Command Palette

Search for a command to run...

Holmes CTF 2025 - The Card - Writeup [1/4]

Updated
5 min read

Introduction

Du 22 au 26 septembre 2025, j’ai participé au Holmes CTF 2025, organisé par Hack The Box.
Cet événement, orienté Blue Team, proposait une série de challenges centrés sur des thématiques telles que :

  • Threat Intelligence

  • Investigation SOC

  • DFIR (Digital Forensics & Incident Response)

  • Reverse Engineering

Le CTF était structuré en cinq grands challenges, chacun composé de 10 à 20 questions à résoudre pour valider l’ensemble.

Sur le plan des résultats, j’ai réussi à terminer 4 challenges sur 5, soit 60 questions résolues sur 65, ce qui m’a permis d’atteindre la 472ᵉ place au classement général.

Passons maintenant au vif du sujet.

The Card Writeup

Description : Holmes receives a breadcrumb from Dr. Nicole Vale - fragments from a string of cyber incidents across Cogwork-1. Each lead ends the same way: a digital calling card signed JM.

Difficulté : 🟩◻️◻️ - Easy

Questions

❓1 - Analyze the provided logs and identify what is the first User-Agent used by the attacker against Nicole Vale's honeypot. (string)

Pour ce challenge, trois fichiers de logs étaient fournis.

  • L’objectif ici est d’identifier le premier User-Agent utilisé par l’attaquant.

En analysant le fichier access.log, on peut rapidement repérer, dès les premières lignes, le User-Agent employé par l’attaquant :

✅ Réponse : Lilnunc/4A4D - SpecterEye

❓2 - It appears the threat actor deployed a web shell after bypassing the WAF. What is the file name? (filename.ext)

En poursuivant l’analyse du fichier access.log, on remarque dans les dernières lignes une activité suspecte indiquant le déploiement d’un fichier PHP.

Pour confirmer cette hypothèse, on peut consulter le fichier waf.log.

On y voit que le fichier temp_4A4D.php est détecté comme un web shell, et que l’attaquant s’en sert pour exécuter des commandes sur la machine compromise.

✅ Réponse : temp_4A4D.php

❓3 - The threat actor also managed to exfiltrate some data. What is the name of the database that was exfiltrated? (filename.ext)

En parcourant l’ensemble des fichiers de logs, on trouve plusieurs mentions d’un fichier de base de données nommé database_dump_4A4D.sql.

Dans waf.log, la règle DATABASE_DOWNLOAD est déclenchée lors du téléchargement de cette base.
Cependant, l’action associée est BYPASS, ce qui signifie que le WAF n’a appliqué aucune protection :

✅ Réponse : database_dump_4A4D.sql

❓4 - During the attack, a seemingly meaningless string seems to be recurring. Which one is it? (string)

En analysant les différents fichiers de logs, on remarque qu’une même chaîne de caractères revient fréquemment, aussi bien dans les noms de fichiers que dans les User-Agents observés.

Cette chaîne est la suivante : 4A4D

✅ Réponse : 4A4D

❓5 - OmniYard-3 (formerly Scotland Yard) has granted you access to its CTI platform. Browse to the first IP:port address and count how many campaigns appear to be linked to the honeypot attack.

En plus des trois fichiers de logs, trois instances Docker étaient également fournies.
Pour cette question, nous devons utiliser la première instance, qui donne accès à une plateforme de Cyber Threat Intelligence.

Via la plateforme on peut comprendre que 4A4D est un code hexadécimal qui se traduit par JM , la bulle au milieu en verte représente donc un acteur de menace qui est relié par plusieurs campagnes d’attaques qui lui sont attribué :

En comptant les liens visibles sur la plateforme, on obtient la réponse.

✅ Réponse : 5

❓6 - How many tools and malware in total are linked to the previously identified campaigns? (number)

D’après la légende du graphe CTI :

  • Les malwares sont représentés par des bulles rouge sombre accompagnées de l’émoji 🦠

  • Les outils sont représentés par des bulles marron clair accompagnées de l’émoji 🔧

En observant les cinq campagnes associées à l’acteur JM, et en comptant tous les outils et malwares qui leur sont liés, on obtient :

✅ Réponse : 9

❓7 - It appears that the threat actor has always used the same malware in their campaigns. What is its SHA-256 hash? (sha-256 hash)

Sur le graphe CTI, chaque malware est décrit par un IOC (Indicator of Compromise). Ici, il s’agit systématiquement d’un hash SHA-256 :

Pour les cinq campagnes attribuées à l’acteur JM, le même SHA-256 est utilisé, ce qui confirme l’emploi d’un malware identique sur l’ensemble des campagnes.

✅ Réponse : 7477c4f5e6d7c8b9a0f1e2d3c4b5a6f7e8d9c0b1a2f3e4d5c6b7a8f9e0d17477

❓8 - Browse to the second IP:port address and use the CogWork Security Platform to look for the hash and locate the IP address to which the malware connects. (Credentials: nvale/CogworkBurning!)

En accédant à la deuxième instance Docker (la plateforme CogWork Security) et en recherchant le hash SHA-256 indiqué, on obtient les informations réseau associées au malware :

Notamment la section Network Communication :

✅ Réponse : 74.77.74.77

❓9 - What is the full path of the file that the malware created to ensure its persistence on systems? (/path/filename.ext)

Toujours sur la plateforme CogWork, en ouvrant View Details sur la page du malware :

Et en consultant la section File Operations, on observe le fichier utilisé pour la persistance :

✅ Réponse : 4a4d_persistence.sh

❓10 - Finally, browse to the third IP:port address and use the CogNet Scanner Platform to discover additional details about the TA's infrastructure. How many open ports does the server have?

La troisième instance Docker (CogNet Scanner) permet de scanner l’IP malveillante précédemment identifiée (74.77.74.77) :

Le scan révèle que le serveur dispose de 11 ports ouverts.

✅ Réponse : 11

❓11 - Which organization does the previously identified IP belong to? (string)

Dans les résultats de recherche, on clique sur Details pour obtenir les informations complètes relatives à l’adresse IP :

En consultant la section Organization, on peut identifier l’entité à laquelle cette adresse est associée :

✅ Réponse : SenseShield MSP

❓12 - One of the exposed services displays a banner containing a cryptic message. What is it? (string)

Pour la dernière question, on reste dans la section Details :

L’onglet Services permet d’obtenir une vue détaillée des ports ouverts et des bannières associées.
En parcourant la liste, on trouve un service affichant le message suivant :

✅ Réponse :He's a ghost I carry, not to haunt me, but to hold me together - NULLINC REVENGE


Avec cette dernière question, le premier challenge est terminé.
Comme il s’agissait d’un challenge d’introduction, il n’était pas particulièrement difficile, mais il posait efficacement les bases pour la suite des investigations.


More from this blog

M

menta.re

5 posts

Cybersecurity Engineer 🛰️ Currently diving into defensive security operations & incident response

Root-Me profile : https://www.root-me.org/MenTa