Présentation d’un write-up de résolution du challenge « Web – Linked Out » des qualifications du CTF de la Nuit du Hack 2018.
Le weekend du 31/03/2018 se déroulait les pré-qualifications pour la Nuit du Hack 2018 sous forme d’un CTF Jeopardy. Ayant eu l’occasion et le temps d’y participer avec quelques collègues et amis, voici un write-up de résolution d’un des challenges auquel nous avons pu participer.
- Catégorie : Web
- Nom : Linked Out
- Description : This service build an awesome curriculum vitae for you ! Test it, recruiters will enjoy it ! The developper of this chall too 😉
- URL : http://linkedout.challs.malice.fr/
- Points : 300
Ce challenge web permet de charger un modèle de CV au format YAML. L’idée est de manipuler le template de CV fourni pour y injecter des commandes dont les résultats seront visibles au sein du PDF du CV généré.
Lorsque l’on se rend sur l’URL du challenge, le service nous est présenté :
Il est possible de télécharger un modèle de CV au format YAML et de l’envoyer pour générer notre beau PDF :
L’objectif va être d’injecter des instructions TeX au sein du template YAML, pour modifier des données du CV. En se focalisant sur l’adresse postale (champ relativement large pouvant occuper plusieurs ligne dans le PDF généré), il est possible d’employer les instructions « /immediate » et « /write18 » pour exécuter des commandes shell :
Both \immediate and \write are TeX primitives. The \write operation is used to write to a file stream. Like many other things in TeX, file streams are accessed by number (although usually real files are given symbolic names to make life easier). Stream 18 is ‘special’ as it is not a file at all: instead, it is a way of sending commands to the operating system (shell).
Ainsi, dans le template du CV, nous pouvons réécrire la valeur de l’adresse à partir de ces instructions. On exécute une commande, dont la sortie sera mise en base64 dans un fichier pour éviter les caractères pouvant générer des erreurs lors de la création du PDF, puis nous rechargeons le contenu de ce fichier à la place de l’adresse :
cv: personal_informations: firstname: Bruce lastname: Schneier address: 221b Baker Street, London, ENGLAND}\address{\immediate\write18{ls /|base64 > toto}\input{toto} position: Security Expert ; Master of Internet [...]
Le résultat de la commande « ls / » sera mise dans le fichier « toto » en base64, et le contenu de ce fichier « \input{toto} » sera lu et remplacera immédiatement le contenu de « \address » dans le PDF.
Un PDF est généré en sortie, que nous consultons :
En décodant le base64 dans l’adresse postale, nous obtenons :
bin boot dev entrypoint.sh etc flag home lib lib64 media mnt opt proc root run sbin srv supervisord.log supervisord.pid sys tmp usr var
Le fichier « flag » nous semble évidemment d’intérêt. Consultons son contenu :
Ouverture du PDF correspondant :
Contenu en base64 décodé :
TkRIe0FuZF9Eb25hbGRfS251dGhfY3JlYXRlZF90aGVfaVRlWH0K Flag : NDH{And_Donald_Knuth_created_the_iTeX}
Salutations à toute l’équipe, on remet ça quand vous voulez 😉 // Gr3etZ
Sources & resources :