- Status Closed
- Percent Complete
- Task Type Anomalie
- Category Freebox OS
- Assigned To No-one
- Operating System Freebox Server V6 (Révolution)
- Severity Critical
- Priority Very High
- Reported Version 4.7.4
- Due in Version Undecided
-
Due Date
Undecided
- Votes 2
- Private
Opened by TDiffff - 18/02/2023
Last edited by mmakassikis - 28/03/2023
FS#37727 - Vulnérabilité XSS - nom de fichier / dossier (unauthenticated, stored)
Bonjour,
J'ai trouvé une autre XSS, encore plus simple à mettre en œuvre pour un attaquant.
Il suffit depuis un poste connecté au réseau local de se rendre sur l’adresse de la Freebox via le partage SMB, ouvert en écriture par défaut :
\\192.168.1.254\Disque dur\
et d’y écrire un fichier ou dossier dont le nom contient un script JS malicieux, qui sera exécuté si quelqu’un explore le dossier parent depuis l’interface web admin.
PoC : https://youtu.be/Ny0pgV4QT18 (vidéo non répertoriée)
Exemple de payload permettant de charger du contenu depuis une URL distante :
<img src="" onerror="s=document.createElement('img'); s.src='https:\x2F\x2Ftrollface.dk\x2FtrollfaceONE.png'; document.body.appendChild(s)">
(j’ai un peu galéré étant donné qu’il faut faire sans forward slash, en effet c’est un caractère interdit pour un nom de fichier)
Je reste à votre disposition si vous avez besoin de plus d’infos.
(un petit coup de pouce / geste de votre part ne serait pas de refus, bien que n’attendant évidement rien en retour; je cherche ces bugs sur mon temps libre)
Mon email de contact est dans mon profil.
Bonne journée et continuation.
28.03.2023 13:39
Reason for closing: Résolu
Additional comments about closing:
firmware 4.7.5
Loading...
Available keyboard shortcuts
- Alt + ⇧ Shift + l Login Dialog / Logout
- Alt + ⇧ Shift + a Add new task
- Alt + ⇧ Shift + m My searches
- Alt + ⇧ Shift + t focus taskid search
Tasklist
- o open selected task
- j move cursor down
- k move cursor up
Task Details
- n Next task
- p Previous task
- Alt + ⇧ Shift + e ↵ Enter Edit this task
- Alt + ⇧ Shift + w watch task
- Alt + ⇧ Shift + y Close Task
Task Editing
- Alt + ⇧ Shift + s save task
Bonjour
Merci pour le job !
Sans modification de la string, impossible à reproduire sous Linux :
Avec mkdir dans un partage samba impossible toujours sans modifications de la string) :
Avec "Nautilus" sous GNOME non plus : 'invalid character or bad ascii'
Avec l'API depuis BASH, non plus
ou
Après j'utilise le firmware 4.6.5.1 sur une delta pas encore reboot depuis 130 jours (avec les VM, c'est délicat, il faudrait pouvoir mettre à jour sans reboot la box, à minima pour les mises à jour mineures)
La ligne de mount utilisée pour monter le samba est :
//10.xxx.yyy.100/FBX24T /mnt/fbx/FBX24T cifs credentials=/you/are/not/concerned/.secret,rw,nounix,iocharset=utf8,file_mode=0666,dir_mode=0755,nofail,cache=none,x-systemd.automount,vers=3.0,rsize=32768,wsize=32768,mfsymlinks,user,_netdev 0 0
Je vais essayer de convertir tous les '"' et les "'" et autre '<' ou '>' de la ligne par des \x[0-9a-f]{2} avec hexdump,xxd ou encore printf pour voir si ça passe sous Linux ou depuis l'API (qui encode les path et filename en base64) et si on arrive à reproduire
ce serait particulièrement dangereux si ça fonctionnait depuis l'API avec les appli maisons sur smartphones …
Cordialement
nbanba
Bon, je n'arrive pas à commenter depuis la version mobile du site. Je réponds demain ou plus tard dans la soirée depuis mon ordi.
Avec l'API cela devrait donner quelque chose comme ça :
Call : /api/latest/fs/mkdir
JSon :
Bonjour
Oui pour l'API c'est ce que fait la fonction mkdir_fs_file de la lib que j'ai écrite mais je n'ai pas réussi à créer le répertoire (appel system mkdir au kernel de la box fait par l'API ?)
Le parsing du json contenant le JS depuis bash en est pour minimum 80% la cause; il faudrait que j'essaye avec 'jq' au lieu de JSON.sh
Sinon j'ai fais pas mal de tests depuis ce matin et ne n'ai pas réussi à reproduire de puis Linux
J'ai dump l'hexa et remplacé tous les caractères spéciaux avec des \xXX :
et mkdir renvoit une erreur
J'ai recommencé avec des % à la place des \x sans plus de succès .
Alors j'ai tracé les appels systèmes jusqu'au call système mkdir :
Et on trouve l'erreur 'EINVAL'
En regardant le code du kernel fs/namei.c on trouve l'appel system mkdir
qui appel la structure dentry getname(pathname)
Qui fait appel à do_path_lookup qui lui même appel link_path_walk
On voit clairement dans link_path_walk que les '/' sont interdits et que les path doivent etre valides :
Après je n'ai pas trouvé d'interdiction sur '\x' (juste '/' et un path valide) mais impossible de faire un mkdir de :
Et pourtant
Donc bonne nouvelle, ce n'est pas si facile à exploiter que ça depuis ce qui risque d'être exposé, comme une VM sur une delta ayant un share samba et un serveur web exposé au net.
Après, je ne suis pas dev kernel ni dev tout court, quelqu'un de plus expert que moi y arriverait certainement
Ce qu'il faut craindre c'est le gestionaire de downloads
Si un torrent contient un sous répertoire avec comme nom ce hack (voir beaucoup plus), il peut devenir facile pour un attaquant d'utiliser les navigateurs des utilisateurs du gestionaire de download pour attaquer n'importe qui (il doit bien y avoir un appel fopen() en JS, non ?)
La box ne permet pas de sandbox les requêtes réseaux ni de faire de l'UTM ou de déployer un IPS sur les flux sortant ⇒ aucun utilisateur / client freebox n'est donc protégé (sans utiliser un vrai firewall d'entreprise à X milliers d'€ par ans entre la freebox et le lan)
Cordialement
nbanba
Une chose est sure, quand je crée le dossier via l'interface admin web, le dossier est bien créé, avec le fameux appel /api/latest/fs/mkdir, donc le reste se trouve au niveau de l'implémentation de l'appel API que vous utilisez pour vos tests.
Pour ce qui est de SMB, après recherche, il me parrait très compliqué (impossible?) d'arriver à créer un dossier ou fichier contenant "<" ou ">" à cause du protocole en lui même. Vous allez vous retrouver invariablement avec une erreur "STATUS_OBJECT_NAME_INVALID", pas besoin selon moi de creuser cette piste plus loin, donc on peux oublier l'aspect unauthenticated de la vulnérabilité.
En effet ça rends moins facile l'exploitation.
Et oui, comme vous le mentionnez, si un torrent contient un nom de fichier de ce type, ça reste tout de même bien dangereux, je vous conseille donc de bien filtrer / encoder les "<" ">".
Cordialement
Je viens de tester une petite bidouille en modifiant avec HxD un fichier zip pour permettre la création d'un dossier avec ce nom :
L'extraction fonctionne et le dossier est bien créé avec le bon nom.
Merci pour votre retour
Effectivement, les dev tools de chrome montre la création du répertoire dans freeboxOS avec le JS dans le nom. C'est sans appel !
De mon côté, c'est bloqué au niveau du parsing par la fonction bash _parse_json | _tokenize_json qui ne comprends pas les '<' ni '>'
Concenrnant SMB, j'avoue avoir fait pas mal de tests sans succès, presque décevant …! (je plaisante)
Pour les torrents, de mon côté et pour le moment ça va être une instance qBittorrent (pas la box) qui écrit dans un FS LUKS (Cryptesetup loop mount) posé sur le share de la freebox monté en samba puis ouvert avec cryptsetup / device-mapper et monté comme un disque indépendant (depuis la box, on voit juste un contener LUKS de 4T, soit 1 seul fichier dont le contenu (un fs crypté) n'est pas lisible depuis l'interface d'admin de la freebox)
Ça donnera peut être des idées à d'autres, assez facile à mettre en place dans une VM dans une delta (et je peux fournir les scripts de création, montage, démontage d'un tel système, il faut juste demander …)
Cordialement
nbanba
Bien joué pour le zip… c'est comme ça que je créé des vrais symlink (pas de SMB msfsymlinks, mais des link type 'ln -s') sur le FS de la box utilisable par la box elle même (par exemple pour envoyer les répertoires par défaut dans un autre disque ou dans un sous répertoire au lieu de la racine), mais pour moi c'était du hack… ;)
Vous avez unzip avec l'API ?
Cordialement
nbanba
Au temps pour moi, l'extraction ne va pas à terme, je me suis emélée les pinceaux avec mes dossiers en bazar ^^'
En tout cas avec du .zip, pas possible. Je fais les tests avec les autres formats et reviens vers vous. (j'ai utilisé un pattern de même longueur de type "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" puis modifié avec un editeur hexa pour remplacer par une balise image avec un alert()
Alors par contre, avec du ZIP, si c'est un fichier et non un dossier ça fonctionne AHAH!
Voilà le sample :
https://easyupload.io/pq2k08
Méthodologie utilisée :
1) Création d'un fichier via SMB (toto.txt)
2) Renommage du fichier via l'explorateur de l'interface web admin
3) Création d'une archive exploit.(format) (fonctionne avec tous les formats disponibles)
4) Suppression du fichier initial (pour pas se faire avoir par un faux positif, lol…)
5) Clic-droit sur l'archive ⇒ Extraire ici
6) Profit?
Hello
Alors je vais tester depuis l API … Pour voir comment se comporte extract_fs_file … de manière sous jacente
Si vous avez accès à 1 machines Linux et que vous n avez oas vos propres sources, j ai contribué au développement (98% de code) de https://github.com/nbanb/fbx-delta-nba_bash_api.sh
Bon point de départ pour utiliser l API directement depuis le cmd shell bash d 1 machine Linux.
Cordialement
nbanba
Petite subtilité pour charger du contenu depuis un site externe dans le payload de la version "archive" de l'exploit : il ne faut pas utiliser de \x[0-9][A-F] sinon des sous-dossiers sont créés lors de l'extraction.
Privilégier &#[0-9]; à la place.
Exemple :
Un piti PoC pour la route : https://youtu.be/moLljBRCQsM
Je confirme votre crainte nbanba : le gestionnaire de téléchargement ne filtre ni n'encode les noms de fichiers se trouvant dans les fichier .torrent ^^'
Méthode utilisée :
1) créer un torrent avec un fichier XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.iso ou quelque chose du genre
2) modifier le nom du fichier avec un éditeur Héxa type HxD
3) importer le fichier torrent dans le gestionnaire de téléchargement
4) le fichier est automatiquement créé, avec le nom non-encodé et non filtré
5) en se déplacant à l'interieur du dossier téléchargement, le code JS est éxécuté
PoC : https://youtu.be/a9L09-4n268
Hello
Tout d'abord, BRAVO miss Tdiffff !
Et merci pour les contribs…
Desolé, je n'ai pas pu pousser les tests cet après-midi (famille oblige…) mais j'ai pu reproduire avec le gestionnaire de téléchargements/torrent et oui ça fonctionne également en encodage décimales.
Je pousserai les tests demain.
Merci encore
Cordialement
nbanba
Hello
Alors ça fonctionne super bien avec l'API !
Cordialement
nbanba