Página 1 de 1

Identificar archivos con permisos peligrosos

NotaPublicado: 2012-11-27 18:54 @829
por Mattias Castañeda
Intento desarrollar un script en Perl, que permita identificar todos los archivos con permisos peligrosos para la seguridad del sistema, y quiénes son sus dueños.

El script debe recibir el directorio donde se van a buscar los archivos y mostrar cuáles son los archivos (ruta completa, propietario, permisos).

¿Qué archivos son los que debo buscar?

Aquellos que tengan permisos 777 (-rwxrwxrwx), 766 (-rwx-wx-wx), 666 (--wx-wx-wx).

Ejemplo de uso:

./buscarPeligrosos.pl /home

Re: Identificar archivos con permisos peligrosos

NotaPublicado: 2012-11-27 19:24 @850
por explorer
Con el comando find2perl, desde la línea de comandos, lo tienes generado en una sola línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> find2perl / -type f -perm 0777 -o -perm 0766 -o -perm 0666 -exec ls -l {} \;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
El resultado es un programa que puedes meter en un archivo, y ejecutarlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl -w
  2.     eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
  3.         if 0; #$running_under_some_shell
  4.  
  5. use strict;
  6. use File::Find ();
  7.  
  8. # Set the variable $File::Find::dont_use_nlink if you're using AFS,
  9. # since AFS cheats.
  10.  
  11. # for the convenience of &wanted calls, including -eval statements:
  12. use vars qw/*name *dir *prune/;
  13. *name   = *File::Find::name;
  14. *dir    = *File::Find::dir;
  15. *prune  = *File::Find::prune;
  16.  
  17. sub wanted;
  18. sub doexec ($@);
  19.  
  20.  
  21. use Cwd ();
  22. my $cwd = Cwd::cwd();
  23.  
  24.  
  25. # Traverse desired filesystems
  26. File::Find::find({wanted => \&wanted}, '/');
  27. exit;
  28.  
  29. sub wanted {
  30.     my ($dev,$ino,$mode,$nlink,$uid,$gid);
  31.  
  32.     (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
  33.     -f _ &&
  34.     (($mode & 0777) == 0777)
  35.     ||
  36.     (($mode & 0777) == 0766)
  37.     ||
  38.     (($mode & 0777) == 0666) &&
  39.     doexec(0, 'ls','-l','{}');
  40. }
  41.  
  42. sub doexec ($@) {
  43.     my $ok = shift;
  44.     my @command = @_; # copy so we don't try to s/// aliases to constants
  45.     for my $word (@command)
  46.         { $word =~ s#{}#$name#g }
  47.     if ($ok) {
  48.         my $old = select(STDOUT);
  49.         $| = 1;
  50.         print "@command";
  51.         select($old);
  52.         return 0 unless <STDIN> =~ /^y/;
  53.     }
  54.     chdir $cwd; #sigh
  55.     system @command;
  56.     chdir $File::Find::dir;
  57.     return !$?;
  58. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Ya solo queda modificarlo un poco para poder pasarle a File::Find::find() el directorio que el usuario le pasa en la línea de argumentos, y listo.

Re: Identificar archivos con permisos peligrosos

NotaPublicado: 2012-11-28 17:58 @790
por pvaldes
perldoc -f stat

Re: Identificar archivos con permisos peligrosos

NotaPublicado: 2012-11-30 18:42 @821
por Mattias Castañeda
Gracias.

Re: Identificar archivos con permisos peligrosos

NotaPublicado: 2012-12-05 19:05 @837
por Mattias Castañeda
Al ejecutar el script por terminal dan los siguientes errores que salen en la foto:

Re: Identificar archivos con permisos peligrosos

NotaPublicado: 2012-12-05 19:50 @868
por explorer
El programa empieza en la siguiente línea :)

La primera es mi línea de comandos, donde ves que pongo el comando find2perl, y la salida (el programa), es lo que devuelve ese comando.

Prueba a escribir el comando find2perl en la línea de comandos y verás cómo lo genera también en tu máquina.
Luego, puedes guardarlo en otro archivo, y finalmente, ejecutarlo.

Re: Identificar archivos con permisos peligrosos

NotaPublicado: 2012-12-07 10:47 @491
por haganex
explorer, gracias como siempre por entregar pronta respuesta a nuestras dudas.

Mira: yo ejecuté el programa y me retornó varios archivos, eso está ok, pero cuando intento enviar algo por parámetro "./peligro.pl /home" capturo eso en un my $archivo=ARGV[0]; y esto debería poder enviarlo a File::Find::find({wanted => \&wanted}, 'find', '/'); pero no entendí qué es lo que tengo que reemplazar.

Estuve leyendo el mismo tutorial que hay aquí en la web sobre el uso del File::Find donde dice:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dir = 'C:/Perl/lib/';
  2. find(\&imprimir_archivo, $dir);
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Intenté hacer lo mismo pero con la diferencia que donde dice wanted lo reemplacé por el $dir que me llegó por parámetro pero no me resultó, me salió el siguiente error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $archivo = $ARGV[0];
  2. # Traverse desired filesystems
  3. File::Find::find({$archivo => \&wanted}, 'find', '/');
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

mint@mint ~/Desktop $ ./peligroso.pl /home/
no &wanted subroutine given at /usr/share/perl/5.14/File/Find.pm line 1048.

Espero me puedas explicar el problema ya que he intentado de varias formas y para probarlo hice un archivo que tuviera el ugo+rwx para ver si lo encontraba.

¡ Saludos !

Re: Identificar archivos con permisos peligrosos

NotaPublicado: 2012-12-07 12:07 @546
por explorer
Cometí un error... (explorer no es infalible).

Me equivoqué a la hora de llamar al comando find2perl, y por eso generaba una línea 26 errónea. Ahora ya sale bien.

Y me he dado cuenta porque he consultado la página de manual de File::Find (man File::Find), donde pone claramente cómo llamar a find2perl.

La función find() se puede llamar de varias maneras. Una de ellas es con dos o más argumentos, siendo el primero, una referencia a la subrutina que queremos que ejecute en cada archivo/directorio encontrado, y el resto de argumentos, los directorios a mirar.

Entonces, según tu código, sería así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $directorio = $ARGV[0];
  2.  
  3. File::Find::find({wanted => \&wanted}, $directorio);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
, aunque podemos ampliar la funcionalidad del programa, muy fácilmente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. File::Find::find({wanted => \&wanted}, @ARGV);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y así buscaremos en todos los directorios indicados en la línea de argumentos (uno o más).

Re: Identificar archivos con permisos peligrosos

NotaPublicado: 2012-12-07 21:12 @925
por haganex
explorer, gracias por la respuesta. Probé agregando al final del find() el $directorio pero no me muestra nada al momento de enviar por parámetro el directorio. Tengo un archivo con permisos 777, 766 y 666 para probar, pero nada, solamente me muestra cuando por parámetro envío
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1.  ./peligro.pl /
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Si envío /home/mint/Desktop, que es donde tengo creado los archivos con los permisos peligrosos,
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. ./peligro.pl /home/mint/Desktop
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
no me retorna nada por pantalla. Solamente me muestra una línea.

Esperando tu respuesta,

Saludos

Re: Identificar archivos con permisos peligrosos

NotaPublicado: 2012-12-07 21:53 @953
por explorer
Pues a mi sí que me funciona...
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@joaquinferrero:~/Documentos/Desarrollo> ./find1.pl /home/explorer/Documentos/Desarrollo
-rw-rw-rw- 1 explorer users 1904 dic 19  2007 /home/explorer/Documentos/Desarrollo/reporte.html
-rw-rw-rw- 1 explorer users 2308 abr 26  2008 /home/explorer/Documentos/Desarrollo/test/test.pl~
explorer@joaquinferrero:~/Documentos/Desarrollo> ./find1.pl .
-rw-rw-rw- 1 explorer users 1904 dic 19  2007 ./reporte.html
-rw-rw-rw- 1 explorer users 2308 abr 26  2008 ./test/test.pl~
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Lo que hice fue: ejecutar el comando find2perl anterior redireccionando la salida hacia el archivo find.pl. Luego lo abrí con un editor de textos y sustituí el '/' en el find() por @ARGV. Listo.