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

## 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 :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759131593456/aca3a153-4f28-4b34-ad9e-fd9709d0c989.png align="center")

✅ 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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759131924442/55f53aeb-5ad3-4506-8ed4-9391bc5774e7.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759131931649/4879d8a8-5f8f-471c-a0c4-5c7f9c42345d.png align="center")

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 :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759132266745/4eaa5963-62c0-4bbb-b13d-224e09485c2e.png align="center")

✅ 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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759132783416/998aa8cd-34b0-4cb8-916a-25cefe0259fe.png align="center")

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é :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759133117023/3ed464f6-ba64-419c-8363-225d989dcbae.png align="center")

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 🔧
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759133295477/1213a91a-247b-4d7d-b653-667fa8248a3f.png align="center")

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 :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759133608253/338a0179-f919-41b4-9f6d-076c92941ea5.png align="center")

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 :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759133749343/07f23143-1505-4fd4-ae4e-9c9bb743429d.png align="center")

Notamment la section Network Communication :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759133777233/e52b9571-005b-48b4-a5df-6d3bccdf3223.png align="center")

✅ 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 :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759133925212/2d7ec196-3844-470f-979e-a58365b40685.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759133928513/282f64e0-75ba-4f3c-9e48-b6a5da405790.png align="center")

✅ 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`) :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759134249699/6f1574b6-399a-443c-a177-2709902ccd60.png align="center")

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 :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759134368418/16073212-8fa8-4fc9-b738-3c8726279714.png align="center")

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 :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759134463278/f1a021ca-9b82-4e95-bc42-38742eda603f.png align="center")

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 :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1759134498402/12b81175-a392-4851-842c-de895a117507.png align="center")

✅ 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.

---
