• Publicidad

Identificar archivos con permisos peligrosos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Identificar archivos con permisos peligrosos

Notapor Mattias Castañeda » 2012-11-27 18:54 @829

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
Mattias Castañeda
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2012-11-09 14:20 @639

Publicidad

Re: Identificar archivos con permisos peligrosos

Notapor explorer » 2012-11-27 19:24 @850

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.
Última edición por explorer el 2012-12-07 11:51 @535, editado 2 veces en total
Razón: Correción de errores, y mejorar la explicación
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Identificar archivos con permisos peligrosos

Notapor pvaldes » 2012-11-28 17:58 @790

perldoc -f stat
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Identificar archivos con permisos peligrosos

Notapor Mattias Castañeda » 2012-11-30 18:42 @821

Gracias.
Mattias Castañeda
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2012-11-09 14:20 @639

Re: Identificar archivos con permisos peligrosos

Notapor Mattias Castañeda » 2012-12-05 19:05 @837

Al ejecutar el script por terminal dan los siguientes errores que salen en la foto:
Adjuntos
error.jpg
error.jpg (88.76 KiB) Visto 1307 veces
Mattias Castañeda
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2012-11-09 14:20 @639

Re: Identificar archivos con permisos peligrosos

Notapor explorer » 2012-12-05 19:50 @868

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Identificar archivos con permisos peligrosos

Notapor haganex » 2012-12-07 10:47 @491

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 !
Adjuntos
Pantallazo-1.png
Pantallaso
Pantallazo-1.png (101.25 KiB) Visto 1306 veces
haganex
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2012-08-25 08:15 @385

Re: Identificar archivos con permisos peligrosos

Notapor explorer » 2012-12-07 12:07 @546

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).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Identificar archivos con permisos peligrosos

Notapor haganex » 2012-12-07 21:12 @925

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
haganex
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2012-08-25 08:15 @385

Re: Identificar archivos con permisos peligrosos

Notapor explorer » 2012-12-07 21:53 @953

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 29 invitados