Por qué una cuenta root comprometida significa reconstruir el servidor, no limpiarlo.
Una cuenta UID 0 sin registro de creación no se creó, se escribió. Cómo encontrar una cuenta root oculta, y por qué un root comprometido significa reconstruir, no limpiar.
En este artículo 5 secciones
Cada cuenta de un sistema Unix tiene una partida de nacimiento. Una línea en el registro de autenticación que anota quién la creó, cuándo y con qué herramienta. Una cuenta sin esa línea no se creó con ninguna herramienta. Se escribió, a mano, directamente en el fichero de usuarios. Cuando esa cuenta además tiene UID 0, la línea que falta no es un hueco en sus registros. Es la prueba.
- Una cuenta root oculta es el backdoor más difícil de ver, porque en Unix root es un número, no un nombre. Cualquier cuenta con UID 0 tiene root completo. Dele a una de esas cuentas un nombre que difiera en un solo carácter del de un daemon legítimo del sistema y sobrevive a un vistazo rápido a la lista de usuarios. El ojo lo lee como una errata, no como una amenaza.
- Dos observaciones corrientes envían al responsable de la respuesta en la dirección equivocada: el nombre disfrazado parece un daemon real mal escrito, y una comprobación de salud automatizada ya ha informado de éxito. Un «todo correcto».
- La señal que desmonta ambas: no hay ninguna entrada de creación de cuenta en los registros. El atacante nunca usó la herramienta de creación de cuentas. El hash de la contraseña se escribió directamente en el fichero de usuarios, y además en el fichero de usuarios, no en el shadow, lo que es un segundo indicador por sí solo.
- La doctrina: busque cuentas UID 0 con independencia de los registros de creación, trate un hash en el fichero equivocado como un hallazgo, no considere nunca una sola comprobación automatizada como prueba, y cuando root fue accesible durante cualquier intervalo, reconstruya desde un punto verificado como limpio anterior al compromiso. No limpie sobre la marcha.
UID 0 es un número, no un nombre
Root no es la cuenta que se llama root. Root es cualquier cuenta cuyo ID de usuario es 0. El kernel concede los privilegios por el número, y el nombre es decoración. Así que un backdoor no necesita tocar la cuenta root ni adivinar una contraseña. Necesita una línea más en el fichero de usuarios con un 0 en el tercer campo.
Dele a esa línea un nombre que difiera en un carácter del de un daemon legítimo del sistema y desaparece a plena vista. Una lista de usuarios es larga, los nombres son crípticos por diseño, y quien la repasa lee un daemon conocido, ligeramente mal escrito, y sigue adelante. El disfraz no es sofisticado. Solo tiene que sobrevivir a un vistazo.
# Root is a UID, not a name. List every account with UID 0.
awk -F: '$3 == 0 { print $1 }' /etc/passwd
# Exactly one line should come back: root. Any second line is a
# full-privilege account, whatever it calls itself.Dos razones para seguir adelante. Las dos equivocadas.
A un buen responsable de la respuesta lo pueden hacer pasar de largo ante una cuenta root oculta dos observaciones razonables. Las dos son de esas que uno acepta con un gesto y sigue. Ninguna resiste una segunda mirada.
| Lo que parece | Lo que es |
|---|---|
| El nombre de la cuenta se lee como una errata de un daemon legítimo del sistema | Una cuenta UID 0 completa, con un nombre hecho para sobrevivir a un vistazo, a un carácter de un daemon real |
| Una comprobación automatizada informa de éxito. | Una comprobación automatizada no es una prueba. |
“Una sola comprobación automatizada no es una prueba. Confírmela con un análisis independiente.”
La cuenta sin partida de nacimiento
Cada cuenta creada con las herramientas estándar deja una línea en el registro de autenticación: creada por quién, cuándo, con qué comando. Una cuenta plantada no tiene ninguna. No una línea borrada, ninguna línea, porque el atacante nunca usó la herramienta. El hash de la contraseña se escribe a mano directamente en el fichero de usuarios, y por eso no hay nada que registrar.
Y se escribe en el fichero equivocado. En cualquier sistema Unix moderno el campo de contraseña del fichero de usuarios está delegado al fichero shadow. Contiene un marcador, nunca un hash real. Un hash auténtico en el fichero de usuarios no es una opción de configuración ni una rareza heredada que se pueda pasar por alto. Es la huella de una edición manual, y es un indicador por sí solo.
Sin línea de registro, la hora real de creación de la cuenta hay que reconstruirla a partir de fuentes indirectas: marcas de tiempo de ficheros y los rastros que otros eventos dejaron a su alrededor. La ausencia de partida de nacimiento no le impide establecer la hora del nacimiento. Solo significa que tendrá que trabajárselo.
# The password field in /etc/passwd should be a placeholder (x),
# never a hash. The real hash lives in /etc/shadow.
awk -F: '$2 != "x" && $2 != "*" && $2 != "!" { print $1 }' /etc/passwd
# A name that comes back here has its hash in the wrong file.
# That is a manual edit, not a managed account.“Una cuenta UID 0 sin registro de creación no se creó. Se escribió.”
Cuando una actualización deja fuera al atacante por accidente
Lo más extraño de este modo de fallo es lo que puede hacerle una actualización automática rutinaria. Una actualización desatendida puede reescribir un hash plantado como efecto secundario y dejar al atacante fuera de su propio backdoor. La cuenta se queda. El acceso se pierde. El backdoor puede entonces permanecer latente indefinidamente: una puerta sin cerrar a una habitación cuya llave ya no gira. Eso parece seguridad. No lo es.
Un backdoor que dejó de funcionar no es un backdoor que ha desaparecido. Una cuenta UID 0 latente sigue siendo una cuenta UID 0 que alguien plantó. La presencia es el compromiso, no el inicio de sesión.
No lo limpie. Reconstrúyalo.
El cierre tentador es «borramos la cuenta mala, aplicamos el parche, listo». Recházelo. Acceso root durante cualquier intervalo, incluso uno que la suerte cerró después de golpe, significa que cada byte de esa máquina es ahora sospechoso: binarios, tareas cron, bibliotecas, y las mismas herramientas que usaría para inspeccionarla. No puede auditar su camino de vuelta a la confianza en un sistema cuyas herramientas de auditoría ya no son de fiar.
Busque root con independencia de los registros.
Liste cada cuenta UID 0 con awk. No se fíe del registro de creación, de una sola comprobación automatizada ni de que la lista de usuarios parezca normal.
Trate un hash en el fichero equivocado como un hallazgo.
Un hash real en el fichero de usuarios en lugar del shadow es una edición manual. Investíguelo, no lo justifique.
Confirme cada comprobación automatizada de forma independiente.
Si una comprobación automatizada dice «limpio» y su propio análisis encuentra una cuenta UID 0 sin explicación, persiga el hallazgo, no la tranquilidad.
Fije la hora del compromiso, no la hora en que lo notó.
Reconstruya el compromiso más temprano plausible a partir de fuentes indirectas. Su punto de restauración limpio debe ser anterior a eso, no al descubrimiento.
Reconstruya desde un punto verificado como limpio.
Restaure desde una imagen conocida como buena anterior al compromiso, rote cada credencial que la máquina pudo tocar y vuelva a verificar. No limpie sobre la marcha.
Root durante cualquier intervalo significa un sistema no fiable. Un sistema no fiable no se limpia. Se reconstruye desde un punto que pueda demostrar que estaba limpio, anterior al compromiso, nunca posterior.
“Root durante un minuto es root hasta la reconstrucción. Esa máquina no se limpia. Se reconstruye desde un punto que pueda demostrar que estaba limpio.”
Respuestas directas
¿Cómo encuentro una cuenta root oculta en Linux?+
Liste cada cuenta con UID 0, no solo la que se llama root: awk -F: '$3 == 0 {print $1}' /etc/passwd. El kernel concede root por UID, no por nombre, así que cualquier segunda línea es una cuenta con privilegios completos, se llame como se llame. Búsquela directamente. No se fíe de que la lista de usuarios parezca normal ni de una sola comprobación automatizada que informe «limpio».
¿Qué significa un hash de contraseña en /etc/passwd en lugar de /etc/shadow?+
En cualquier sistema Unix moderno el campo de contraseña de /etc/passwd es un marcador, normalmente x, y el hash real vive en /etc/shadow. Un hash auténtico en /etc/passwd no es una configuración normal. Es la huella de una edición manual del fichero de usuarios, y es un indicador de compromiso por sí solo.
¿Por qué no hay ninguna entrada de registro para una cuenta que claramente existe?+
Porque no se creó con las herramientas estándar de cuentas, que son las que escriben el registro de autenticación. Si alguien edita el fichero de usuarios a mano, la cuenta existe sin ningún registro de creación. Una cuenta UID 0 sin registro de creación no se creó con ninguna herramienta. Se escribió.
¿Puedo simplemente borrar la cuenta maliciosa y parchear el servidor?+
No. Acceso root durante cualquier intervalo significa que todo el sistema es no fiable: binarios, cron, bibliotecas y las herramientas con las que lo inspeccionaría. Borrar la cuenta y parchear le deja confiando en una máquina que ya no puede verificar. Reconstruya desde un punto de restauración anterior al compromiso, rote las credenciales y vuelva a verificar.
La cuenta backdoor parece inactiva. ¿Sigue siendo un problema?+
Sí. Una cuenta UID 0 latente o bloqueada sigue siendo una cuenta con privilegios completos que alguien plantó. Su presencia es el compromiso, no ningún inicio de sesión. Una actualización automática o un cambio de configuración puede desactivar un backdoor por accidente sin eliminar la brecha subyacente. Trate la presencia, no la actividad, como el detonante.
¿Una cuenta root que no puede explicar?
Si ha encontrado una cuenta UID 0 sin registro de creación, o no está seguro de que su último punto de restauración limpio sea anterior al problema, no la limpie sobre la marcha. Hable con un ingeniero que reconstruirá la cronología a partir de fuentes indirectas y reconstruirá el sistema desde un punto que pueda demostrar que estaba limpio.
Hable con un ingenieroHa llegado al final.
Ponga la lectura a trabajar
¿Qué está ejecutando?
Cuéntenos la carga de trabajo, el tráfico y los requisitos de recuperación. Empiece por el configurador de servidores o repase los detalles con un ingeniero.
Escrito por los ingenieros que construyen y operan la infraestructura que describe.Hable con un ingeniero
