Desde hace algún tiempo se viene observando un grupo bautizado por Mandiant como UNC1945 que utiliza una serie de herramientas y técnicas contra sistemas Windows, Linux y muy reseñablemente contra sistemas Solaris. Para los que no habéis tenido la oportunidad de tocar este sistema Unix ex-de Sun Microsystems he de deciros que era cosa fina a lomos de un Sparc dentro de una Enteprise 450 o hasta de una Ultra 5/10... pero esas son historias de un admin-cebolleta de hace más de 15 años...
Para dar un poquito más de contexto decir que el código fuente de Solaris se liberó en 2005 convirtiéndose en OpenSolaris hasta el año 2010 en el que Oracle compró Sun y decidió que dejara de ser "open". La última versión estable, la 11.4, data de 2018 es decir de hace más de 2 años. Aún así mantiene soporte y sigue habiendo todavía muchos servidores Solaris en circulación (incluso versiones obsoletas) y actores como UNC1945 lo consideran interesante de explotar pues pueden suponer un target importante de cara a infiltrarse en muchas redes corporativas.
static int
parse_user_name(char *user_input, char **ret_username)
{
register char *ptr;
register int index = 0;
char username[PAM_MAX_RESP_SIZE];
/* ... */
ptr = user_input;
/* ... */
/*
* username will be the first string we get from user_input
* - we skip leading whitespaces and ignore trailing whitespaces
*/
while (*ptr != '\0') {
if ((*ptr == ' ') || (*ptr == '\t'))
break;
else {
username[index] = *ptr;
index++;
ptr++;
}
}
/* ret_username will be freed in pam_get_user(). */
if ((*ret_username = malloc(index + 1)) == NULL)
return (PAM_BUF_ERR);
(void) strcpy(*ret_username, username);
return (PAM_SUCCESS);
}
Exploit PoC
Para ver si el servidor es vulnerable basta con recibir un "Authentication failed" (si no lo fuera se nos volvería a pedir el usuario). El desbordamiento en la librería PAM también hace que el servidor SSH crashee:
El sistema operativo escribe un dump por el crash en /core si el servidor SSH falla sin un debugger attacheado. De hecho, si existe un archivo /core en una máquina Solaris y vemos que se trata de sshd, esos son indicadores claros de que e ha explotado previamente esta vulnerabilidad.
Sistemas operativos vulnerables
- Solaris 9 (algunas versiones)
- Solaris 10 (todas las versiones)
- Solaris 11.0
- Si bien la función parse_user_name sigue siendo vulnerable en Solaris 11.1 sin parches y posteriores algunos cambios no documentados en la librería PAM truncan el nombre de usuario antes de que la función vulnerable lo reciba, lo que hace que el fallo no sea explotable a través de SSH. Si la función parse_user_name fuera accesible en otro contexto, entonces la vulnerabilidad podría volverse explotable.
- Illumos (OpenIndiana 2020.04)
Mitigaciones y workarounds
Fuentes:
- In Wild Critical Buffer Overflow Vulnerability in Solaris Can Allow Remote Takeover — CVE-2020-14871
- Live off the Land? How About Bringing Your Own Island? An Overview of UNC1945
- Hacker group uses Solaris zero-day to breach corporate networks
- UNC1945 Infiltrates Corporate Networks through a Solaris Zero-Day Bug