Etape 1 : reconnaissance du terrain.
Il s’agit d’un challenge portant sur une attaque web dont on a les logs du serveur web. L’énoncé parle d’une attaque réussie qui extrait des fichiers sensibles.
Etape 2 : analyse des logs.
L’attaque est réussie. Donc une ou plusieurs requêtes réussissent et ont donc un code HTTP 200.
Parmi ces requêtes réussies :
- On élimine les requêtes portant sur la racine du site web. Rapidement on voit qu’une telle requête renvoie 2272 octets.
- On élimine les requêtes sur des images JPEG.
- On élimine les requêtes sur des images PNG.
- On élimine les requêtes sur des fichiers CSS.
- On élimine les requêtes sur le endpoint
/server-status. - On élimine les requêtes de type
HEAD. - On élimine les requêtes de type
OPTION.
Cela conduit à cet enchainement de commandes grep que je n’ai pas
cherché à optimiser. Il faut comprendre cet enchainement comme l’analyse
pas à pas des résultats. Au fur et à mesure, j’affine en éliminant ce qui
apparait comme inutile.
#!/bin/bash
grep " 200 " webserver.log | \
grep -v "200 2272" | \
grep -v jpeg | \
grep -v png | \
grep -v css | \
grep -v server-status | \
grep -v HEAD | \
grep -v OPTION
Etape 3 : ce que l’on trouve.
Que trouve le petit script précédent ?
Deux lignes que voici (je les éclate en multilignes pour rendre le résultat plus lisible) :
May 7 00:40:21 front web-server mywebsite:80 127.0.0.1 - - [07/May/2025:00:40:21 +0000] \
"GET /?asset=../../../../home/webserver/.ssh/id_rsa HTTP/1.0" 200 2500 "-" \
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
May 7 00:40:22 front web-server mywebsite:80 127.0.0.1 - - [07/May/2025:00:40:22 +0000] \
"GET /?asset=../../../../home/webserver/.ssh/known_hosts HTTP/1.0" 200 2750 "-" \
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
Effectivement on extrait avec succès (code HTTP 200) deux fichiers sensibles :
- une clef privée SSH
- un fichier de known hosts
Potentiellement on pourrait tenter d’utiliser la clef pour se connecter sur
des hosts dont les noms seront trouvés dans known_hosts.
La technique qui a fonctionné ici s’appelle du « path traversal ». Ca ne s’invente pas, on le sait ou on ne le sait pas. Google is your friend.
En cherchant « path traversal cwe », on trouve facilement que c’est le CWE 35. https://cwe.mitre.org/data/definitions/35.html
On assemble donc les éléments trouvés en suivant le format de flag proposé par l’énoncé et le flag devrait donc être :
FCSC{CWE-35-05/07-/?asset=../../../../home/webserver/.ssh/id_rsa-/?asset=../../../../home/webserver/.ssh/known_hosts}
BINGO. Le flag se valide.
QED
🐒