Cet article dĂ©crit un gros « hacking » pour les NAS QNAP permettant Ă des utilisateurs du NAS qui ne sont pas administrateurs dâavoir un accĂšs ssh.
Cette astuce est issue de mes recherches et jâai pas trouvĂ© de solution similaire sur Internet. Ă vos risques et pĂ©rils doncâŠ
Cependant, les modifications apportĂ©es par cette solution sont nettement plus limitĂ©es que par les solutions alternatives que jâai pu trouver.
Analyse et configuration du serveur ssh (sshd)
Ceci est en faire en ssh en utilisant le compte administrateur du NAS.
La liste des utilisateurs sâobtient Ă lâaide de :
cat /etc/passwd | cut -d':' -f1 | grep -v '^\['
Si vous envisager une automatisation, il faudra prévoir un peu de ménage.
Pour commencer on va rechercher processus sur serveur ssh:
ps faxo "%U %t %p %a" | grep '[s]shd'
16543 admin 4123 S /usr/sbin/sshd -f /etc/config/ssh/sshd_config -p 22
18765 admin 9123 S sshd: admin@pts/0
Cela permet de vérifier que le chemin de la configuration ssh se trouve dans /etc/config/ssh/
(a défaut vous devrez adapter la suite avec prudence !).
-
DĂ©tailsâŠ
Localiser la commande, permet de sâassurer quâon va bien exĂ©cuter la mĂȘme commande que celle trouvĂ©e dans la liste des processus.
which sshd
/usr/sbin/sshd
Ensuite on va essayer de dĂ©couvrir la version de sshd, comme souvent avec BusyBox la version nâest pas disponible,
voir avec des commandes compiler pour des environnements limitĂ©s mais le support de lâaide nâest pas prĂ©sent.
Une astuce que jâutilise consiste Ă passer un paramĂštre qui nâest probablement pas pris en charge, espĂ©rant que le message dâerreur affichera Ă©galement lâaide.sshd -XXX # Avec un paramĂštre bidon.
unknown option -- X OpenSSH_8.0p1, OpenSSL 1.1.1l 24 Aug 2021 usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file] [-E log_file] [-f config_file] [-g login_grace_time] [-h host_key_file] [-o option] [-p port] [-u len]
On apprend quâest câest OpenSSH 8, ce qui est plutĂŽt une bonne nouvelle, puisque nous somme en terrain connu.
La configuration de sshd se trouve donc dans:
ls /etc/config/ssh
Notez que ce dossier est Ă©galement accessible avec /root/.ssh
qui est un lien symbolique.
lrwxrwxrwx 1 admin administrators 15 2023-02-07 11:34 /root/.ssh -> /etc/config/ssh/
Dans ce dossier, on trouve un fichier nommé sshd_user_config
cat /etc/config/ssh/sshd_user_config
Il a le format suivant :
AllowUsers admin admin2 admin3
Imaginons quâon veuille ajouter lâutilisateur archives
à cette liste, il est possible de faire comme suit :
read -r CONTENT < /etc/config/ssh/sshd_user_config
echo "Avant: ${CONTENT}"
echo "${CONTENT} archives" > /etc/config/ssh/sshd_user_config
read -r CONTENT < /etc/config/ssh/sshd_user_config
echo "AprĂšs: ${CONTENT}"
Pour prendre en compte ce changement il faut redémarrer le service.
Le plus simple et le plus sur est de le faire depuis lâinterface web en dĂ©sactivant le support ssh et en le rĂ©activant.
-
Une générique version plus élaborée
Cette version sâassure que lâutilisateur existe et quâil nâest pas dĂ©jĂ prĂ©sent dans le fichier.
function add_user_to_sshd { local user="$1" if ! grep -q "^${user}:" /etc/passwd ; then echo "*** ERROR: User '${user}' does not exists." >&2 return 100 fi if grep -q "^AllowUsers ${user}$" /etc/config/ssh/sshd_user_config ; then echo "* WARN: User '${user}' already exist and is the only user allowed to use ssh." >&2 return 0 fi if grep -q "^AllowUsers ${user} " /etc/config/ssh/sshd_user_config ; then echo "* WARN: User '${user}' already exist and is the first user allowed to use ssh." >&2 return 0 fi if grep -q "^AllowUsers .* ${user}$" /etc/config/ssh/sshd_user_config ; then echo "* WARN: User '${user}' already exist and is the last user allowed to use ssh." >&2 return 0 fi if grep -q "^AllowUsers .* ${user} " /etc/config/ssh/sshd_user_config ; then echo "* WARN: User '${user}' already exist." >&2 return 0 fi read -r CONTENT < /etc/config/ssh/sshd_user_config || return $? echo "Before: ${CONTENT}" >&2 # shellcheck disable=SC2320 #Â False positive echo "${CONTENT} ${user}" > /etc/config/ssh/sshd_user_config || return $? read -r CONTENT < /etc/config/ssh/sshd_user_config || return $? echo "After: ${CONTENT}" >&2 echo 'added' }
Dans le cadre dâune automatisation, le service ssh peut ĂȘtre redĂ©marrĂ© Ă lâaide de :
/etc/init.d/login.sh restart & disown
-
Explication de la commande ci-dessus utilisant disown
Utilisation de "disown"
disown est une commande Unix permettant dâenlever des tĂąches de la table des tĂąches actives, ou de les marquer de telle sorte que le signal SIGHUP ne leur soit pas envoyĂ© lorsque le processus parent le reçoit, par exemple lors de la fermeture dâun terminal, qui dans notre cas intervient puis sshd, le service ssh, sâarrĂȘte.
Cette commande sâutilise en conjonction avec lâopĂ©rateur
&
qui permet de placer le processus en tache de fond. Les entrées/sorties (stdin, stdout, et stderr) sont alors commune au processus lancé avec&
et le terminal, qui est de nouveau « disponible ».
Si le terminal reçoit un signal SIGHUP, celui-ci est propagĂ© au processus lancĂ© en tache de fond, ce qui a normalement comme consĂ©quence de dĂ©truire ce processus. LâarrĂȘt du terminal propage Ă©galement le signal SIGHUP aux processus fils (et donc les arrĂȘte).La commande disown a comme effet de retirer de la liste des processus fils du shell. Cela a comme effet de plus propager le signal SIGHUP au processus dont on lui donne le PID (« Process ID »).
firefox & ps
PID TTY TIME CMD 4117 pts/2 00:00:00 bash 4127 pts/2 00:00:00 firefox-bin 4133 pts/2 00:00:00 ps
disown 4127 exit # On quitte le shell mais le processus reste actif.
Cette succession de commandes peut sâĂ©crire de maniĂšre simplifiĂ©e comme suit :
firefox & disown & exit
dâoĂč dans notre cas lâĂ©criture suivante :
/etc/init.d/login.sh restart & disown
Configurer un compte utilisateur
Le plus simple est de se connecter en ssh ce qui permettra de plus de vĂ©rifier lâĂ©tape prĂ©cĂ©dente.
ssh archives@192.168.1.121
Vous donnez le mot de passe de ce compte comme demandĂ©, vous ĂȘtes maintenant sur le NAS en tant que archives
.
mkdir -vp .ssh
chmod -c 750 .ssh/
cd .ssh/
# ensuite vous devez ajouter votre clé publique au fichier : authorized_keys
Dans un autre terminal depuis votre machine, vous pouvez rĂ©cupĂ©rer le contenu de votre clĂ© publique Ă lâaide de :
cat "${HOME}/.ssh/id_rsa.pub"
La prochaine fois que vous vous connecterez en tant que archives
vous nâaurez pas Ă donner votre mot de passe.
Cohabitation avec lâenvironnement QNAP
La bonne nouvelle est que cette modification rĂ©siste au redĂ©marrage du NAS, cependant si vous modifier dans lâinterface web la configuration ssh, ces changements seront perdus.
La contrainte semble assez acceptable.
Liens
኿