Maison >Tutoriel système >Linux >Transfert de port SFTP: activer la fonctionnalité supprimée
introduction
Le protocole SSH prend en charge trois grandes catégories d'activités de serveur distantes: a) l'exécution de la commande (y compris le shell de connexion), b) le transfert et le fonctionnement du réseau, et c) le transfert de fichiers.
Les responsables OpenSSH ont déterminé que SFTP et SCP n'ont aucun objectif juridique pour le transfert de port (via les options -l et -r). Pendant le transfert de fichiers à l'aide de ces utilitaires, un drapeau qui désactive explicitement ces fonctionnalités est transmis inconditionnellement à l'exécutable de l'enfant SSH.
Certains utilisateurs peuvent en effet avoir besoin de ces fonctionnalités. Un sous-ensemble évident est les testeurs de pénétration dont la tâche consiste à vérifier que cette fonctionnalité est explicitement désactivée sur un serveur SFTP public.
Voici deux techniques pour activer ces fonctionnalités supprimées en modifiant la chaîne du binaire SFTP elle-même, ou en redirigeant à travers un shell qui peut facilement modifier la ligne de commande. Selon les fonctionnalités de la plate-forme, l'une ou l'autre technologie peut être nécessaire pour atteindre cet objectif.
Supprimer les détails
Premièrement, il est important de trouver le processus d'intérêt en cours d'exécution. La fonction de shell ci-dessous affichera le PID qui correspond au motif de shell (notez que ce n'est pas une expression régulière). Cela s'exécute sous Debian Dash (et la plupart des autres coquilles courantes) et s'appuie sur l'option PS de BSD:
<code>pps () { local a= b= c= IFS=$'\r'; ps ax | while read -ra do [ "$b" ] || c=1; for b; do case "$a" in *"$b"*) c=1;; esac; done; [ "$c" ] && printf '%s\n' "$a" && c=; done; }</code>
Démarrez une session SFTP traditionnelle pour vérifier les processus qui y sont associés:
<code>$ id uid=1001(aturing) gid=1001(aturing) groups=1001(aturing)... $ sftp aturing@sftp.victimandum.com aturing@sftp.victimandum.com's password: Connected to sftp.victimandum.com. sftp></code>
Nous supposons que l'utilisateur UNIX local ci-dessus a le même compte d'utilisateur sur le serveur SFTP distant.
Une fois la session exécutée, une recherche de processus locale pour le nom d'utilisateur affichera le processus SSH de l'enfant généré par SFTP:
<code>$ pps aturing PID TTY STAT TIME COMMAND 9666 pts/0 S 0:00 sftp aturing@sftp.victimandum.com 9667 pts/0 S 0:00 /usr/bin/ssh -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings yes -oForwardAgent no -l aturing -s -- sftp.victimandum.com sftp</code>
Le paramètre ClearallForwardings Oui supprimera toute tentative de transfert sans prendre aucune mesure pour la casser.
Les drapeaux de transfert de port -l et -r n'existent pas comme options valides pour la ligne de commande SFTP, mais nous pouvons utiliser l'option -s pour les déclencher explicitement pour spécifier un gestionnaire SSH personnalisé, dans ce cas le serveur de messagerie:
<code>$ cat portssh #!/bin/sh exec ssh -L2525:smtp.victimandum.com:25 "$@"</code>
Si la suppression de transfert n'est pas en place, cet appel SFTP est suffisant pour établir une connexion de transfert:
<code>$ sftp -S ./portssh -oClearAllForwardings\ no aturing@sftp.victimandum.com aturing@sftp.victimandum.com's password: Connected to sftp.victimandum.com. sftp></code>
Vous pouvez maintenant voir des tentatives de transfert dans le processus SSH de l'enfant:
<code>$ pps aturing PID TTY STAT TIME COMMAND 9897 pts/0 S 0:00 sftp -S ./portssh -oClearAllForwardings no aturing@sftp.victimandum.com 9898 pts/0 S 0:00 ssh -L2525:smtp.victimandum.com:25 -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings yes -o ClearAllForwardings no -oForwardAgent no -l aturing -s -- sftp.victimandum.com sftp</code>
Cependant, tenter de contacter le serveur de messagerie distant via le port de transfert local est infructueux en raison d'une remplacement explicite:
<code>$ nc localhost 2525 $</code>
Cette suppression inconditionnelle est visible dans le code source:
<code>$ sed -n /X11/,/Forwardings/p openssh-8.7p1/sftp.c addargs(&args, "-oForwardX11 no"); addargs(&args, "-oPermitLocalCommand no"); addargs(&args, "-oClearAllForwardings yes");</code>
Ces chaînes statiques sont également visibles dans les fichiers binaires compilés:
<code>$ strings /usr/bin/sftp | grep [-]o[CFP] -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings yes -oForwardAgent no -oPort %d</code>
Enfin, la documentation indique clairement que cette suppression est intentionnelle et donne des raisons raisonnables:
<code>$ man ssh_config | sed -n /ClearAllForwardings/,/default/p ClearAllForwardings Specifies that all local, remote, and dynamic port forwardings specified in the configuration files or on the command line be cleared. This option is primarily useful when used from the ssh(1) command line to clear port forwardings set in configura‐ tion files, and is automatically set by scp(1) and sftp(1). The argument must be yes or no (the default).</code>
Modifier les chaînes compilées
Pour ceux qui souhaitent désactiver la configuration de oui par défaut ClearallForwardings, une option consiste à utiliser SED pour modifier directement les chaînes dans le binaire SFTP (en supposant que le SED de la plate-forme est en satelière binaire):
<code>$ sed 's/AllForwardings yes/AllForwardings no /' sftp.noclearforward</code>
Cette modification directe est beaucoup plus facile que la compilation de nouveaux fichiers binaires.
Nous pouvons confirmer que la chaîne a été modifiée avec succès:
<code>$ strings ./sftp.noclearforward | grep [-]o[CFP] -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings no -oForwardAgent no -oPort %d</code>
Bien que le contenu et la somme de contrôle du SFTP modifié soient différents, tout Linux BuildID SHA1 existant restera le même (mais ne soumettez pas les billets d'assistance lors de l'utilisation de SFTP modifiée):
<code>$ file /usr/bin/sftp ./sftp.noclearforward /usr/bin/sftp: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=d7e77e24d5fac0fdc89e62a4c9c656091f2c4a33, for GNU/Linux 3.2.0, stripped ./sftp.noclearforward: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=d7e77e24d5fac0fdc89e62a4c9c656091f2c4a33, for GNU/Linux 3.2.0, stripped $ sha1sum /usr/bin/sftp ./sftp.noclearforward d8bdaf0b4642b9c324f9c2e0aeee2d9578fbe383 /usr/bin/sftp b12dda8ecfd7bd2847919b5531aea7c03364c123 ./sftp.noclearforward $ sha256sum /usr/bin/sftp ./sftp.noclearforward 986eecdfc654c9b3ff3fd0dce59690d47cf56be96a4b98a04a3682aef95d3f52 /usr/bin/sftp c8f99ce33fc129250c11dc6dbb8a01112e01124e470a92d0acefb955fd17d670 ./sftp.noclearforward</code>
Vous pouvez appeler le binaire SFTP modifié pour activer le transfert de port:
<code>$ chmod 755 sftp.noclearforward $ ./sftp.noclearforward -S ./portssh aturing@sftp.victimandum.com aturing@sftp.victimandum.com's password: Connected to sftp.victimandum.com. sftp></code>
Vous pouvez maintenant voir les paramètres modifiés dans le processus de l'enfant:
<code>$ pps aturing PID TTY STAT TIME COMMAND 9991 pts/0 S 0:00 ./sftp.noclearforward -S ./portssh aturing@sftp.victimandum.com 9992 pts/0 S 0:00 ssh -L2525:smtp.victimandum.com:25 -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings no -oForwardAgent no -l aturing -s -- sftp.victimandum.com sftp</code>
Cette fonction est activée et exécutée sur un serveur distant et peut vérifier les connexions dans un shell séparé:
<code>$ nc localhost 2525 220 smtp.victimandum.com Microsoft ESMTP MAIL Service, Version: 1.2.3456.78901 ready at Sun, 1 Jan 2023 01:23:45 -0100 ^C</code>
Lorsque le transfert est désactivé sur le serveur, le client recevra une notification indiquant cet état lorsque la connexion tentera:
<code>channel 3: open failed: administratively prohibited: open failed</code>
L'administrateur SFTP a attribué un compte non fiable devrait être susceptible de vérifier que la configuration du serveur désactive explicitement le transfert et l'exécution des commandes.
Au-delà de la coque POSIX
Bien que les normes DASH et POSIX fournissent un ensemble - afin de réinitialiser les paramètres de ligne de commande, des fonctionnalités plus avancées sont fournies dans Bash et KSH93:
<code>$ cat ynargs #!/bin/bash echo "${@//yes/no}"</code>
Le test rapide confirme l'édition réussie:
<code>$ ./ynargs -oForwardX11 no -oPermitLocalCommand yes -oClearAllForwardings yes -oForwardAgent no -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings no -oForwardAgent no</code>
Notez que le $ ci-dessus {@ // ... / ...} n'est pas un POSIX valide et ne peut pas fonctionner dans Dash ou aucun shell (MKSH, OKSH) dérivé de PDKSH. De nombreuses plates-formes ne regroupent pas les coquilles avec cette fonctionnalité (comme Android et OpenBSD, bien qu'il existe des moyens de les ajouter);
Pour profiter de cette fonctionnalité avec un shell puissant, nous créons un répertoire, puis nous créons un wrapper SSH pour effacer les paramètres de problème:
<code>$ cat ~/switcharoo/ssh #!/bin/bash exec /usr/bin/ssh "${@//yes/no}"</code>
Réglez ensuite le répertoire avant System SSH dans $ PATH:
<code>$ export PATH=~/switcharoo:$PATH $ which ssh ~/switcharoo/ssh</code>
Ensuite, nous appelons le système SFTP dans cet environnement modifié:
<code>$ /usr/bin/sftp -S ./portssh aturing@sftp.victimandum.com aturing@sftp.victimandum.com's password: Connected to sftp.victimandum.com. sftp></code>
Nous avons observé que le shell réinitialise les paramètres du problème:
<code>$ pps aturing PID TTY STAT TIME COMMAND 10058 pts/0 S 0:00 /usr/bin/sftp -S ./portssh aturing@sftp.victimandum.com 10059 pts/0 S 0:00 /usr/bin/ssh -L2525:smtp.victimandum.com:25 -oForwardX11 no -oPermitLocalCommand no -oClearAllForwardings no -oForwardAgent no -l aturing -s -- sftp.victimandum.com sftp</code>
Reconfirmé la connexion locale au port de transfert:
<code>$ nc localhost 2525 220 smtp.victimandum.com Microsoft ESMTP MAIL Service, Version: 1.2.3456.78901 ready at Sun, 1 Jan 2023 01:23:45 -0100 ^C</code>
En tant que démonstration finale, un échange SMTP complet peut être effectué en utilisant le script suivant:
<code>$ cat awkmail #!/bin/gawk -f BEGIN { smtp="/inet/tcp/0/localhost/2525"; ORS="\r\n"; r=ARGV[1]; s=ARGV[2]; sbj=ARGV[3]; # /bin/awkmail to from subj 0) print |& smtp print "." |& smtp; smtp |& getline j; print j print "quit" |& smtp; smtp |& getline j; print j close(smtp) } # /inet/protocol/local-port/remote-host/remote-port</code>
Nous pouvons utiliser ce script pour envoyer notre propre courrier à un destinataire distant auquel le serveur SMTP cible peut accéder:
<code>$ ./awkmail jatanasoff@victimandum.com aturning@localhost awkmail Queued mail for delivery</code>
Dans des environnements hautement contrôlés, la présence de ces fonctions n'est pas optimale.
Restrictions de serveur
Il est compréhensible que les administrateurs SFTP ne souhaitent pas permettre à leurs utilisateurs de créer des connexions TCP arbitraires à l'aide du serveur, ce qui peut mettre en danger les réseaux sensibles. Limiter cette activité est un cadre de sécurité prudent.
Une configuration restrictive commune consiste à ajouter des utilisateurs de SFTP non fiables à un groupe, puis à contraindre l'activité de ce groupe dans SSHD_Config:
<code>Match Group sftponly ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no</code>
Cette configuration recommandée est généralement suffisante pour empêcher toutes les tentatives de transfert.
Il est recommandé d'ajouter une désactivation.
<code>$ man sshd_config | sed -n /DisableForwarding/,/configurations/p DisableForwarding Disables all forwarding features, including X11, ssh-agent(1), TCP and StreamLocal. This option overrides all other forwarding- related options and may simplify restricted configurations.</code>
Ceci est laissé à l'administrateur pour la pratique.
en conclusion
Les paramètres du client SFTP trop stricts peuvent conduire à un certain degré de cécité de gestion des serveurs. Les restrictions du client SFTP sont facilement contournées par une variété de méthodes.
Pour les administrateurs du serveur SFTP, il est important de savoir où ils sont restreints et où ils sont restreints et ne comptent pas sur les clients pour protéger le serveur contre le contrôle arbitraire du TCP. Le client est contrôlé par l'utilisateur, et si la configuration est erronée, il est difficile d'implémenter les commandes TCP sur le serveur. Tout test doit être effectué sans transmission approfondie dans l'utilisateur SSH_Config, faites attention aux avertissements dans le document.
Bien que cette fonctionnalité puisse avoir un objectif juridique imaginable, les abus seront rares.
Ces problèmes ne sont pas nouveaux, car les variantes de Site Exec sont présentes dans FTP en texte clair depuis des décennies. SFTP n'est pas une alternative simple au transfert de fichiers en texte clair, il dispose également de nombreuses fonctionnalités faciles à utiliser.
Espérons que les administrateurs pourront utiliser ces méthodes pour vérifier la sécurité de leurs serveurs afin de ne pas être pris au dépourvu.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!