La chinche del FTP.

Chinche del FTPImaginemos 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.

Adrián Puente Z.
Share

About ch0ks

Untamable cybersecurity enthusiast focused on DevOps and automatization. Former Pentester, CTFer, Linux fanboy, full time nerd and compulsive SciFy reader.
This entry was posted in Code, Security. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.