Imaginemos que eres sysadmin de una empresa con una red clase B, tus becarios están en exámenes finales, te acaba de llegar una notificación de la BSA amenazándote de una auditorÃa de software y encima es cierre y contabilidad te tiene azorado con preguntas repetitivas de los usaurios (no, no está mal escrito).
Obvio no tienes el tiempo de revisar cuales son los espontáneos con servicios arriba compartiendo MP3s, warez y pr0n (lo peor es que no te avisan por ser el sysadmin).
Este pequeño script en perl te permite automatizar la búsqueda de información dentro de servidores FTP sin tener que estar pegado al cliente.
#!/usr/bin/perl -w
#
# Script hecho por Adrián Puente Z.
# Script hecho para Sm4rt Security Services
# Dudas y comentarios a:
# adrian [AT] sm4rt.com
# ch0ks [AT] hackarandas.com
#
# Este script recibe los parámetros de usuario, contraseña
# y host (IP o nombre) por lÃnea de comando y se conecta
# al host creando un archivo con el listado del directorio
# raiz y muestra una salida con el estatus del proceso.
use Net::FTP;
if ( $#ARGV != 2 )
{
print "Sintáxis: ftpdirgrepable.pl [Usuario] [Password] [Host] \\n";
exit;
}
my $username = $ARGV[0];
my $password = $ARGV[1];
my $host = $ARGV[2];
my $directory="/";
my $newerr = 0;
push @ERRORS, "$host\\t$username\\t$password";
$ftp=Net::FTP->new($host,Timeout=>60) or $newerr=1;
push @ERRORS, "\\tno_conexion" if $newerr;
myerr() if $newerr;
push @ERRORS, "\\tsi_conexion";
$ftp->login($username,$password) or $newerr=1;
push @ERRORS, "\\tno_login" if $newerr;
$ftp->quit if $newerr;
myerr() if $newerr;
push @ERRORS, "\tsi_login";
@files=$ftp->dir or $newerr=1;
push @ERRORS, "\\tno_dir" if $newerr;
myerr() if $newerr;
push @ERRORS, "\\tsi_dir";
if ( $newerr != 1 )
{
open(DAT,">ftpdir-".$username.":".$password."_AT_".$host.".txt") || die("Error al abrir el archivo");
foreach(@files) { print DAT "$_n"; }
close(DAT);
}
$ftp->quit;
myerr();
sub myerr {
print @ERRORS;
print "n";
exit 0;
}
Esto lo podemos integrar a una salida de Nmap procesada de forma que sólo nos devuelva las IPs de las máquinas.Con este comando obtenemos una lista de IPs ordenaditas y sin repetirse con un puerto 21 (ftp) abierto a partir de un scaneo Nmap con una salida tipo gnmap.
grep -e 'Ports:.*21/open' *.gnmap | awk '{print $2}' | sort -n | uniq > lst.IPs.txt
Y para integrar nuestro script usamos el siguiente comando:
for i in `cat lst.IPs.txt` ; do ftpdirgrepable.pl anonymous [email protected] ${i} ; done
Terminado el comando nos generará varios archivos con el contenido del servidor y el directorio raiz. Para muestra un botón:
-=:)> ftpdirgrepable.pl anonymous [email protected] kernel.org
kernel.org anonymous [email protected] si_conexion si_login si_dir
-=:)> cat ftpdir-anonymous:[email protected]_AT_kernel.org.txt
drwxrwx--- 2 536 528 4096 May 21 2001 for_mirrors_only
drwx------ 2 0 0 16384 Oct 02 2005 lost+found
drwxrwsr-x 9 536 536 4096 Aug 21 23:21 pub
lrwxrwxrwx 1 0 0 1 Oct 03 2005 usr -> .
lrwxrwxrwx 1 0 0 10 Oct 03 2005 welcome.msg -> pub/README
Si vemos bien podemos observar que tiene una salida que nos permite aplicar un filtro con grep y al estar separado por tabs lo podemos redirigir a un archivo csv y abrirlo en excel.
A mi me sirvió mucho en el último pentest, sólo hubo que descartar los servidores cuyo contenido tenÃa un directorio JetDirect para descartar las impresoras. Puedes descargarlo de aqui.