2049 - Pentesting NFS Service
Reading time: 10 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.
Informations de base
NFS est un système conçu pour client/serveur qui permet aux utilisateurs d'accéder facilement à des fichiers sur un réseau comme si ces fichiers étaient situés dans un répertoire local.
Port par défaut : 2049/TCP/UDP (sauf la version 4, il nécessite juste TCP ou UDP).
2049/tcp open nfs 2-3 (RPC #100003
Authentification
Un aspect notable de ce protocole est son absence habituelle de mécanismes d'authentification ou d'autorisation intégrés. Au lieu de cela, l'autorisation repose sur les informations du système de fichiers, le serveur étant chargé de traduire avec précision les informations utilisateur fournies par le client dans le format d'autorisation requis par le système de fichiers, suivant principalement la syntaxe UNIX.
L'authentification repose généralement sur les identifiants UID
/GID
UNIX et les appartenances à des groupes. Cependant, un défi se pose en raison du potentiel décalage dans les mappages UID
/GID
entre les clients et les serveurs, ne laissant aucune place à une vérification supplémentaire par le serveur. De plus, ces détails sont envoyés par le client et sont de confiance pour le serveur, donc un client malveillant pourrait potentiellement usurper un autre utilisateur en envoyant des uid
et gid
plus privilégiés.
Cependant, notez qu'il n'est pas possible par défaut d'usurper le UID
0 (root) en utilisant NFS. Plus d'informations à ce sujet dans la section sur le squashing.
Hôtes
Pour une meilleure (ou certaine) autorisation, vous pouvez spécifier les hôtes qui peuvent accéder au partage NFS. Cela peut être fait dans le fichier Linux /etc/exports
. Par exemple :
/PATH/TO/EXPORT CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share 192.168.2.123(rw,sec=krb5p:krb5i)
As you can see, cela permet de configurer une IP ou un nom d'hôte spécifique pour accéder au partage. Seule cette adresse pourra accéder au partage.
Versions
-
NFSv2 : Cette version est reconnue pour sa large compatibilité avec divers systèmes, marquant son importance avec des opérations initiales principalement sur UDP. Étant la plus ancienne de la série, elle a jeté les bases pour les développements futurs.
-
NFSv3 : Introduit avec une série d'améliorations, NFSv3 a élargi son prédécesseur en prenant en charge des tailles de fichiers variables et en offrant de meilleurs mécanismes de rapport d'erreurs. Malgré ses avancées, il a rencontré des limitations en matière de compatibilité totale avec les clients NFSv2.
-
NFSv4 : Une version marquante de la série NFS, NFSv4 a apporté un ensemble de fonctionnalités conçues pour moderniser le partage de fichiers à travers les réseaux. Les améliorations notables incluent l'intégration de Kerberos pour une sécurité élevée, la capacité de traverser les pare-feu et de fonctionner sur Internet sans avoir besoin de portmappers, le support des listes de contrôle d'accès (ACL), et l'introduction d'opérations basées sur l'état. Ses améliorations de performance et l'adoption d'un protocole orienté état distinguent NFSv4 comme une avancée majeure dans les technologies de partage de fichiers en réseau.
-
Notez qu'il est très étrange de trouver un hôte Linux NFS prenant en charge l'authentification kerberos.
Chaque version de NFS a été développée dans le but de répondre aux besoins évolutifs des environnements réseau, améliorant progressivement la sécurité, la compatibilité et la performance.
Squashing
Comme mentionné précédemment, NFS fera généralement confiance au uid
et au gid
du client pour accéder aux fichiers (si kerberos n'est pas utilisé). Cependant, il existe certaines configurations qui peuvent être définies sur le serveur pour changer ce comportement :
- all_squash : Cela écrase tous les accès en mappant chaque utilisateur et groupe à
nobody
(65534 non signé / -2 signé). Par conséquent, tout le monde estnobody
et aucun utilisateur n'est utilisé. - root_squash/no_all_squash : C'est par défaut sur Linux et n'écrase que l'accès avec uid 0 (root). Par conséquent, tout
UID
etGID
sont de confiance mais0
est écrasé ànobody
(donc aucune usurpation de root n'est possible). - no_root_squash : Cette configuration, si activée, n'écrase même pas l'utilisateur root. Cela signifie que si vous montez un répertoire avec cette configuration, vous pouvez y accéder en tant que root.
Subtree check
Disponible uniquement sur Linux. man(5) exports dit : "Si un sous-répertoire d'un système de fichiers est exporté, mais que l'ensemble du système de fichiers ne l'est pas, alors chaque fois qu'une requête NFS arrive, le serveur doit vérifier non seulement que le fichier accédé est dans le système de fichiers approprié (ce qui est facile) mais aussi qu'il est dans l'arbre exporté (ce qui est plus difficile). Cette vérification est appelée la vérification de sous-arbre."
Dans Linux, la fonctionnalité subtree_check
est désactivée par défaut.
Enumeration
Showmount
Cela peut être utilisé pour obtenir des informations d'un serveur NFSv3, comme la liste des exports, qui est autorisé à accéder à ces exports, et quels clients sont connectés (ce qui peut être inexact si un client se déconnecte sans informer le serveur). Dans NFSv4, les clients accèdent directement au /export et essaient d'accéder aux exports à partir de là, échouant si c'est invalide ou non autorisé pour une raison quelconque.
Si des outils comme showmount
ou des modules Metasploit ne montrent pas d'informations d'un port NFS, c'est potentiellement un serveur NFSv4 qui ne prend pas en charge la version 3.
showmount -e <IP>
Scripts nmap utiles
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
nfs-statfs #Disk statistics and info from NFS share
Modules Metasploit utiles
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
nfs_analyze
Cet outil de https://github.com/hvs-consulting/nfs-security-tooling peut être utilisé pour obtenir beaucoup de données d'un serveur NFS comme les montages, les versions NFS prises en charge, les IP connectées, et même s'il est possible de s'échapper des exports vers d'autres dossiers dans le FS ou si no_root_squash
est activé.
Mounting
Pour savoir quel dossier le serveur a disponible à monter, vous pouvez lui demander en utilisant :
showmount -e <IP>
Puis montez-le en utilisant :
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
Vous devez spécifier d'utiliser la version 2 car elle n'a aucune authentification ni autorisation.
Exemple :
mkdir /mnt/new_back
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
Attaques
Confiance en UID et GID
Bien sûr, le seul problème ici est qu'il n'est pas possible par défaut d'usurper l'identité de root (UID
0). Cependant, il est possible d'usurper l'identité de tout autre utilisateur ou si no_root_squash
est activé, vous pouvez également usurper l'identité de root.
- Si vous montez un dossier qui contient des fichiers ou des dossiers uniquement accessibles par un certain utilisateur (par UID). Vous pouvez créer localement un utilisateur avec cet UID et en utilisant cet utilisateur, vous pourrez accéder au fichier/dossier.
- L'outil
fuse_nfs
de https://github.com/hvs-consulting/nfs-security-tooling enverra toujours le UID et GID nécessaires pour accéder aux fichiers.
Escalade de privilèges SUID
Consultez la page :
NFS no_root_squash/no_all_squash misconfiguration PE
Évasion des exports
Dans cet excellent article, il est possible de voir qu'il est possible de s'échapper des exports pour accéder à d'autres dossiers dans le FS.
Par conséquent, si un export exporte un dossier qui est un sous-dossier du système de fichiers entier, il est possible d'accéder à des fichiers en dehors de l'export si subtree_check
est désactivé. Et c'est désactivé par défaut dans Linux.
Par exemple, si un serveur NFS exporte /srv/
et que /var/
est dans le même système de fichiers, il est possible de lire des journaux depuis /var/log/
ou de stocker un webshell dans /var/www/
.
De plus, notez qu'en règle générale, seul l'utilisateur root (0) est protégé contre l'usurpation d'identité (voir la section Squash). Cependant, si un fichier est possédé par root mais que le groupe n'est pas 0, il est possible d'y accéder. Par exemple, le fichier /etc/shadow
est possédé par root mais le groupe est shadow
(gid 42 sur Debian). Par conséquent, il est possible de le lire par défaut !
L'outil nfs_analyze
de https://github.com/hvs-consulting/nfs-security-tooling est conçu pour soutenir cette attaque contre les systèmes de fichiers ext4, xfs, btrfs dans la version 3 (il devrait également être possible dans v4).
NSFShell
Pour lister, monter et changer facilement UID et GID afin d'accéder aux fichiers, vous pouvez utiliser nfsshell.
Fichiers de configuration
/etc/exports
/etc/lib/nfs/etab
Paramètres dangereux
-
Permissions de lecture et d'écriture (
rw
): Ce paramètre permet à la fois la lecture et l'écriture dans le système de fichiers. Il est essentiel de considérer les implications de l'octroi d'un accès aussi large. -
Utilisation de ports non sécurisés (
insecure
): Lorsqu'il est activé, cela permet au système d'utiliser des ports au-dessus de 1024. La sécurité des ports au-dessus de cette plage peut être moins stricte, augmentant le risque. -
Visibilité des systèmes de fichiers imbriqués (
nohide
): Cette configuration rend les répertoires visibles même si un autre système de fichiers est monté en dessous d'un répertoire exporté. Chaque répertoire nécessite sa propre entrée d'exportation pour une gestion appropriée. -
Propriété des fichiers root (
no_root_squash
): Avec ce paramètre, les fichiers créés par l'utilisateur root conservent leur UID/GID d'origine de 0, ignorant le principe du moindre privilège et pouvant accorder des permissions excessives. -
Non-squash de tous les utilisateurs (
no_all_squash
): Cette option garantit que les identités des utilisateurs sont préservées à travers le système, ce qui pourrait entraîner des problèmes de permissions et de contrôle d'accès si ce n'est pas correctement géré.
Escalade de privilèges utilisant des erreurs de configuration NFS
NFS no_root_squash et no_all_squash escalade de privilèges
Commandes automatiques HackTricks
Protocol_Name: NFS #Protocol Abbreviation if there is one.
Port_Number: 2049 #Comma separated if there is more than one.
Protocol_Description: Network File System #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for NFS
Note: |
NFS is a system designed for client/server that enables users to seamlessly access files over a network as though these files were located within a local directory.
#apt install nfs-common
showmount 10.10.10.180 ~or~showmount -e 10.10.10.180
should show you available shares (example /home)
mount -t nfs -o ver=2 10.10.10.180:/home /mnt/
cd /mnt
nano into /etc/passwd and change the uid (probably 1000 or 1001) to match the owner of the files if you are not able to get in
https://book.hacktricks.wiki/en/network-services-pentesting/nfs-service-pentesting.html
Entry_2:
Name: Nmap
Description: Nmap with NFS Scripts
Command: nmap --script=nfs-ls.nse,nfs-showmount.nse,nfs-statfs.nse -p 2049 {IP}
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.