Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

572
Vistas
Cómo ejecutar un comando como root con C o C++ sin pam en Linux con autenticación de contraseña

TL;DR ¿Cómo funciona, por ejemplo, su o sudo sin PAM?

Hola,

Quiero jugar con suid y esas cosas, ya tengo la parte SUID y la parte SUID y esas cosas, pero el problema es que no me pide una contraseña y como quiero que pida una contraseña y encuentre su y sudo bastante destrozado en la fuente estoy muy confundido.

Revisé la documentación de setsuid() y getuid() y no parece que haya nada sobre la autenticación de contraseña.

¿Cómo se lograría la autenticación de contraseña sin PAM? Uso sudo sin pam y funciona bien, su con pam, ambos funcionan bien, estoy confundido sobre cómo lo haría funcionar

Este código C++ es lo que tengo ahora:

 // a.cc // #include <iostream> #include <unistd.h> #include <cerrno> #include <cstring> int main(int argc, char *argv[]) { uid_t user = getuid(); if (setuid(0) == -1) { std::cerr << strerror(errno) << '\n'; return 1; } system(argv[1]); if (setuid(user) == -1) { std::cerr << errno << '\n'; return 1; } return 0; }

y después de compilarlo con, por ejemplo, GCC y el archivo se llama a.cc:

 $ g++ a.cc -oa

y dándole permisos de ejecución y SUID y dando la propiedad a root

 $ sudo chown root:root ./a $ sudo chmod 4555 ./a

simplemente funciona, pero sin autenticación de contraseña

 $ ./a id uid=0(root) gid=1000(ari) groups=1000(ari),5(tty),10(wheel),27(video),78(kvm),250(portage)

(ari es mi usuario)

Incluso después de cerrar sesión o ejecutar sudo -k para finalizar el tiempo de espera de sudo, aún funciona sin autenticación de contraseña.

  • Su fuente: https://github.com/shadow-maint/shadow/blob/master/src/su.c
  • Fuente de Sudo: https://github.com/sudo-project/sudo/blob/main/src/sudo.c

Gracias por las respuestas de antemano

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Primero, lo básico: cada proceso tiene un ID de usuario y un ID de grupo (voy a ignorar los atributos complementarios como los ID de grupo adicionales).

El ID de usuario 0 es raíz. Eso es todo, fin de la historia.

Cuando tiene un proceso cuyo ID de usuario es 0, es un proceso raíz. Fin de la historia.

La forma en que un proceso adquiere su ID de usuario 0 es irrelevante. Si el ID de usuario de un proceso es 0, es un proceso raíz y eso es todo.

Cuando realiza los movimientos para configurar un proceso setuid, ese setuid(0) es en sí mismo, ya está. Eres un proceso raíz. Eso es todo. No hay nada más que decir al respecto.

setsuid() y getuid() documentación y no parece que haya nada sobre la autenticación de contraseña.

Correcto. Todo lo que hacen es ajustar/actualizar el ID de usuario. Eso es todo. No hay nada más que eso.

Los procesos su y sudo hacen lo siguiente:

  1. Son ejecutables setuid.
 $ ls -al /bin/su /bin/sudo -rwsr-xr-x. 1 root root 57504 Aug 17 04:59 /bin/su ---s--x--x. 1 root root 185440 Aug 7 13:17 /bin/sudo

¿Esto te parece familiar? Los permisos de su programa setuid hecho a mano se ven idénticos a esto, ¿no es así?

  1. Pero antes de ir más allá, exigen que proporcione una contraseña aceptable (o cumpla con otros criterios, de alguna forma o manera, no importa cuáles sean los detalles exactos de los criterios de autenticación aceptables, una contraseña en su caso, o una coincidencia aceptable en la configuración de sudo ). Si no lo hace, terminan sin que se lleve a cabo ninguna otra acción.

Toda la lógica de validación de contraseñas, que involucra PAM o algún otro marco de autenticación, es implementada por los propios procesos su y sudo . A menos que proporcione credenciales de autenticación aceptables (lo que sea que signifique para su o sudo ), finalizan sin que se lleve a cabo ninguna otra acción. Una autenticación exitosa da como resultado un shell, o un comando ejecutado, pero eso es por la razón muy simple y elemental de que los propios programas su y sudo usaron setuid (el bit de permiso y la llamada al sistema) para adquirir privilegios de root, como el primer orden de negocio.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda