Bueno, yo sigo mejorandolo y posteando en milw0rm los programas donde lo pruebo (http://www.milw0rm.com/author/1607) ... si creeis que puede ser interesante y lo vais a usar, yo no tengo ningun problema en subirlo a google code
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCita de: sirdarckcat en 7 Octubre 2008, 16:34 PM
pepelux: haz considerado manejar tu codigo en un control de versiones?
SVN?
http://code.google.com/hosting/createProject
Saludos!!
#! /usr/bin/perl
require 'scan.pm';
require 'rfi.pm';
require 'ich.pm';
require 'sql.pm';
@ficheros = (); # nombre del fichero afectado
@comandos = (); # comando que tiene el fallo
@lineas = (); # linea del fichero donde esta el fallo
@vbles = (); # vable afectada
@tipos = (); # tipo de fallo (RFI / SQL)
$log = "log.txt";
$lista_ficheros = "fichero.txt";
$fichero_tmp = "tmp.ph_";
open(LOG, ">$log");
print "\e[2J";
system(($^O eq 'MSWin32') ? 'cls' : 'clear');
#system(($^O eq 'MSWin32') ? ($so = "WINDOWS") : ($so = "LINUX"));
uso();
$ruta = $ARGV[0];
$ruta !~ /\/$/;
imprime("=- Directory to scan: $ruta*.php\"\n");
# creamos un listado de todos los ficheros PHP del directorio y subdirectorios
open(FICHERO, ">$lista_ficheros");
buscar_ficheros_php($ruta);
close(FICHERO);
#### comprobamos vulnerabilidades ####
# comprobamos las vulnerabilidades RFI
if ($modo =~ /RFI/)
{
rfi();
for ($i = 0; $i <= $#ficheros; $i++)
{
if ($tipos[$i] eq 'RFI')
{
print " Possible Remote File Inclusion vulnerability found:\n";
print " > File affected: $ficheros[$i]";
print " > Sentence: $lineas[$i] -> $comandos[$i]\n";
print " > Variable: = \$$vbles[$i]\n\n";
print LOG " Possible Remote File Inclusion vulnerability found:\n";
print LOG " > File affected: $ficheros[$i]";
print LOG " > Sentence: $lineas[$i] -> $comandos[$i]\n";
print LOG " > Variable: = \$$vbles[$i]\n\n";
}
}
print "\n";
}
#### comprobamos vulnerabilidades ####
# comprobamos las vulnerabilidades ICH
if ($modo =~ /ICH/)
{
ich();
for ($i = 0; $i <= $#ficheros; $i++)
{
if ($tipos[$i] eq 'ICH')
{
print " Possible Insecure Cookie Handling vulnerability found:\n";
print " > File affected: $ficheros[$i]";
print " > Sentence: $lineas[$i] -> $comandos[$i]\n\n";
print LOG " Possible Insecure Cookie Handling vulnerability found:\n";
print LOG " > File affected: $ficheros[$i]";
print LOG " > Sentence: $lineas[$i] -> $comandos[$i]\n\n";
}
}
print "\n";
}
# comprobamos las vulnerabilidades SQL
if ($modo =~ /SQL/)
{
sql();
for ($i = 0; $i <= $#ficheros; $i++)
{
if ($tipos[$i] eq 'SQL')
{
print " Possible Remote SQL Injection vulnerability found:\n";
print " > File affected: $ficheros[$i]";
print " > Sentence: $comandos[$i]\n";
print " > Variable: = \$$vbles[$i]\n\n";
}
}
print "\n";
}
imprime(":: End\n");
imprime(" |===|");
close(LOG);
print "\t << Log file was saved as $log >>\n\n";
sub uso()
{
imprime("=-|========================================-{ http://www.enye-sec.org }-=====|\n");
imprime("=-[ PHP Fuzzer v1.0 ]-=====================================================-=|\n");
imprime("=-|==========================================================================|\n");
imprime("=-[ by Pepelux <pepelux[at]enye-sec[dot]org> ]-==============================|\n\n");
$modo = "SQL RFI ICH";
ayuda() if ($#ARGV < 0 || $#ARGV > 1);
if ($#ARGV == 1)
{
if ($ARGV[1] eq 'SQL' || $ARGV[1] eq 'RFI' || $ARGV[1] eq 'ICH')
{
$modo = $ARGV[1];
}
else
{
ayuda();
}
}
}
sub ayuda()
{
print "Usage: perl $0 <directory_path> [RFI | SQL | ICH]\n\n";
print "\texamples:\n";
print "\t Scan for RFI & SQL: perl $0 myPHPSite/src\n";
print "\t Scan for SQL only : perl $0 myPHPSite/src SQL\n";
print "\t Scan for RFI only : perl $0 myPHPSite/src\ RFI\n\n";
print "\t Scan for ICH only : perl $0 myPHPSite/src\ ICH\n\n";
close(LOG);
exit();
}
sub imprime()
{
my $texto = shift;
print "$texto";
print LOG "$texto";
}
##############################################
# Search all PHP files in the (sub)directory #
##############################################
sub buscar_ficheros_php()
{
my $dir = shift;
if (opendir(DIRECTORIO, "$dir"))
{
foreach (readdir(DIRECTORIO))
{
# ignoramos . y ..
next if ($_ eq "." || $_ eq "..");
# buscamos los ficheros terminados en .php
if ($_ =~ /.php$/)
{
print FICHERO "$dir/$_\n";
}
buscar_ficheros_php("$dir/$_") if (-d "$dir/$_" && ! -l "$dir/$_");
}
closedir DIRECTORIO;
}
else
{
print "ERROR: can not read directory $dir\n";
}
}
1;
sub rfi()
{
print "\n:: Searching for possible Remote File Inclusion vulnerabilities\n";
print " |============================================================|\n";
print LOG "\n:: Searching for possible Remote File Inclusion vulnerabilities\n";
print LOG " |============================================================|\n";
$encontrado = 0;
open(FICHERO, "$lista_ficheros");
while(<FICHERO>)
{
$fichero_original = $_;
organizar_fichero($_);
buscar_rfi($fichero_original, $fichero_tmp);
}
if ($encontrado == 0)
{
print " Not RFI vulnerabilities found\n";
print LOG " Not RFI vulnerabilities found\n";
}
close(FICHERO);
}
##############################
# Read a PHP for search RFIs #
##############################
sub buscar_rfi()
{
my $file = shift;
my $fileTmp = shift;
$clinea = 0;
open FICHERO_PHP, $file;
while(<FICHERO_PHP>)
{
$clinea++;
# buscamos includes o requires seguidos de ($
$cadena = $_;
if (($cadena =~ /^\s*require\s*\(/ || $cadena =~ /^\s*require\s*\"/ ||
$cadena =~ /^\s*require_once\s*\(/ || $cadena =~ /^\s*require_once\s*\"/ ||
$cadena =~ /^\s*include\s*\(/ || $cadena =~ /^\s*include\s*\"/ ||
$cadena =~ /^\s*include_once\s*\(/ || $cadena =~ /^\s*include_once\s*\"/ )
&& $cadena !~ "^//" && $cadena =~ "\$")
{
$linea_original = $_;
@matriz = ();
extraer_datos_rfi($cadena);
for ($i = 0; $i <= $#matriz; $i++) {
$cadena = $matriz[$i];
if (uc($cadena) !~ /_GET/ && uc($cadena) !~ /_POST/ && uc($cadena) !~ /_COOKIE/) {
if (uc($cadena) =~ /\[/ || uc($cadena) =~ /\]/) {
$cadena = "";
}
}
if (length($cadena) > 0)
{
if (!comprobar_rfi($fileTmp, $cadena) == 0)
{
$encontrado = 1;
$linea_original =~ s/\s*//g;
push(@ficheros, $fichero_original);
push(@comandos, $linea_original);
push(@lineas, $clinea);
push(@vbles, $cadena);
push(@tipos, "RFI");
}
}
}
}
}
close FICHERO_PHP;
}
sub comprobar_rfi()
{
my $file = shift;
my $var = shift;
chop($var);
open FICHERO_PHP2, $file;
while(<FICHERO_PHP2>)
{
$tmp = $_;
$tmp =~ s/\s*//g;
chop($tmp);
if ($tmp =~ /$var[A-Z|a-z]*\s*=/)
{
$x = index($tmp, $var);
if ($x < 2)
{
close(FICHERO_PHP2);
return 0;
}
}
}
close(FICHERO_PHP2);
return 1;
}
sub extraer_datos_rfi()
{
$cadena = shift;
$cadena =~ s/\s*require_once\s*//g;
$cadena =~ s/\s*require\s*//g;
$cadena =~ s/\s*include_once\s*//g;
$cadena =~ s/\s*include\s*//g;
$cadena =~ s/\(//g;
$cadena =~ s/\)\s*\;//g;
$cadena =~ s/\s*\n$//g;
$cadena =~ s/\s*;$//g;
$cadena =~ s/\s*\)$//g;
$cadena =~ s/\s*\"$//g;
do
{
$x = index($cadena, "\$");
if ($x > -1)
{
$y = 999;
$y1 = index($cadena, "\.", $x)-1;
$y2 = index($cadena, "/", $x)-1;
$y3 = index($cadena, ")", $x)-1;
if ($y1 < 0) { $y1 = 999; }
if ($y2 < 0) { $y2 = 999; }
if ($y3 < 0) { $y3 = 999; }
if ($y1 < $y) { $y = $ y1; }
if ($y2 < $y) { $y = $ y2; }
if ($y3 < $y) { $y = $ y3; }
if ($y > 0 && $y < 999)
{
$valor = substr($cadena, $x+1, $y-$x);
push(@matriz, $valor);
$cadena = substr($cadena, $y+1, length($cadena)-$y);
}
else
{
$valor = substr($cadena, $x+1, length($cadena)-$x-1);
push(@matriz, $valor);
$x = -1;
}
}
} while($x > 0);
}
1;
sub ich()
{
print "\n:: Searching for possible Insecure Cookie Handling vulnerabilities\n";
print " |===============================================================|\n";
print LOG "\n:: Searching for possible Insecure Cookie Handling vulnerabilities\n";
print LOG " |===============================================================|\n";
$encontrado = 0;
open(FICHERO, "$lista_ficheros");
while(<FICHERO>)
{
$fichero_original = $_;
organizar_fichero($_);
buscar_ich($fichero_original, $fichero_tmp);
}
if ($encontrado == 0)
{
print " Not ICH vulnerabilities found\n";
print LOG " Not ICH vulnerabilities found\n";
}
close(FICHERO);
}
##############################
# Read a PHP for search ICHs #
##############################
sub buscar_ich()
{
my $file = shift;
my $fileTmp = shift;
$clinea = 0;
open FICHERO_PHP, $file;
while(<FICHERO_PHP>)
{
$clinea++;
# buscamos includes o requires seguidos de ($
$cadena = $_;
if ($cadena =~ /\$_COOKIE/ && $cadena !~ "^//")
{
$linea_original = $_;
@matriz = ();
$encontrado = 1;
$linea_original =~ s/\s*//g;
push(@ficheros, $fichero_original);
push(@comandos, $linea_original);
push(@lineas, $clinea);
push(@vbles, '');
push(@tipos, "ICH");
}
}
close FICHERO_PHP;
}
1;
require "unir.pm";
sub sql()
{
print "\n:: Searching for possible SQL Injection vulnerabilities\n";
print " |====================================================|\n";
print LOG "\n:: Searching for possible SQL Injection vulnerabilities\n";
print LOG " |====================================================|\n";
$encontrado = 0;
open(FICHERO, "$lista_ficheros");
while(<FICHERO>)
{
$fichero_original = $_;
# print " Creating a tmp file with: $_";
print LOG " Creating a tmp file with: $_";
@includes = ();
organizar_fichero($_);
# print "\n Analyzing vars in SQL SELECT sentences\n";
print LOG "\n Analyzing vars in SQL SELECT sentences\n";
buscar_select($fichero_tmp);
# print "\n";
print LOG "\n";
}
if ($encontrado == 0)
{
print " Not SQL vulnerabilities found\n";
print LOG " Not SQL vulnerabilities found\n";
}
close(FICHERO);
}
#######################################
# Search vars in SQL SELECT sentences #
#######################################
sub buscar_select()
{
my $file = shift;
open FICHERO_PHP, $file;
while(<FICHERO_PHP>)
{
$linea = $_;
$linea_entera = $linea;
# dejamos la linea en blanco en caso de que sea un comentario
$linea = "" if ($linea =~ /^\s*\/\//);
if ((uc($linea) =~ "SELECT" && uc($linea) =~ "FROM" && uc($linea) =~ "WHERE") ||
(uc($linea) =~ "UPDATE" && uc($linea) =~ "SET" && uc($linea) =~ "WHERE") ||
(uc($linea) =~ "DELETE" && uc($linea) =~ "FROM" && uc($linea) =~ "WHERE") ||
(uc($linea) =~ "INSERT" && uc($linea) =~ "INTO"))
{
$cadena = $linea;
$ini = index($cadena, "\"") + 1;
$cadena = substr($cadena, $ini, length($cadena) - $ini);
$fin = index($cadena, ";");
$cadena = substr($cadena, 0, $fin) if $fin > -1;
if ($cadena =~ /\$/)
{
# print " > Found: $cadena\n";
print LOG " > Found: $cadena\n";
if (uc($linea) =~ "INSERT" && uc($linea) =~ "INTO" && uc($linea) =~ "VALUES")
{
# buscamos a partir de VALUES
$ini = index(uc($linea), "VALUES") + 6;
}
else
{
if (uc($linea) =~ "INSERT" && uc($linea) =~ "INTO")
{
# buscamos a partir de INTO
$ini = index(uc($linea), "INTO") + 6;
}
else
{
# buscamos a partir de WHERE
$ini = index(uc($linea), "WHERE") + 5;
}
}
$linea = substr($linea, $ini, length($linea) - $ini);
$salir = 0;
do
{
# buscamos a partir de $, que identifica la variable
$ini = index($linea, "\$") + 1;
if ($ini == 0)
{
$salir = 1;
}
else
{
$linea = substr($linea, $ini, length($linea) - $ini);
$sentencia = $linea;
if (uc($sentencia) =~ "_GET")
{
$ini = index($sentencia, "_GET");
$fin = index($sentencia, "\]");
$sentencia = substr($linea, $ini+6, $fin-$ini-7);
}
if (uc($sentencia) =~ "_POST")
{
$ini = index($sentencia, "_POST");
$fin = index($sentencia, "\]");
$sentencia = substr($linea, $ini+7, $fin-$ini-8);
}
# cortamos en ) si existe
$fin = index($sentencia, "\)");
$sentencia = substr($sentencia, 0, $fin) if $fin > -1;
# cortamos en ' si existe
$fin = index($sentencia, "\'");
$sentencia = substr($sentencia, 0, $fin) if $fin > -1;
# cortamos en " si existe
$fin = index($sentencia, "\"");
$sentencia = substr($sentencia, 0, $fin) if $fin > -1;
# cortamos en . si existe
$fin = index($sentencia, ".");
$sentencia = substr($sentencia, 0, $fin) if $fin > -1;
# quitamos basura del final
$fin = index($sentencia, " ");
$sentencia = substr($sentencia, 0, $fin) if $fin > -1;
$fin = index($sentencia, "%");
$sentencia = substr($sentencia, 0, $fin) if $fin > -1;
$fin = index($sentencia, ";");
$sentencia = substr($sentencia, 0, $fin) if $fin > -1;
$fin = index($sentencia, ",");
$sentencia = substr($sentencia, 0, $fin) if $fin > -1;
if ($sentencia =~ /\[/ || $sentencia =~ /\]/ || $sentencia =~ /->/)
{
$sentencia = "";
}
if (length($sentencia) > 0)
{
$encontrado = 1;
if (comprobar_sql($file, $sentencia) == 0)
{
# print "\tChecking var: \$$sentencia ... not vulnerable\n\n";
print LOG "\tChecking var: \$$sentencia ... not vulnerable\n\n";
}
else
{
push(@ficheros, $fichero_original);
push(@comandos, $cadena);
push(@lineas, $lin);
push(@vbles, $sentencia);
push(@tipos, "SQL");
# print "\tChecking var: \$$sentencia ... VULNERABLE\n";
print LOG "\tChecking var: \$$sentencia ... VULNERABLE\n";
}
}
}
} while ($salir == 0);
# print "\n";
print LOG "\n";
}
}
}
close FICHERO_PHP;
}
sub comprobar_sql()
{
my $file = shift;
my $var = shift;
open FICHERO_PHP2, $file;
while(<FICHERO_PHP2>)
{
if ($_ =~ /\$$var\s*=/)
{
close(FICHERO_PHP2);
return 0;
}
}
close(FICHERO_PHP2);
return 1;
}
1;
###########################################################
# Organize a PHP file including all includes and requires #
###########################################################
sub organizar_fichero()
{
my $file = shift;
$cont = 0;
$clinea = 0;
open FICHERO_PHP, $file;
open FICHERO_TMP, ">$fichero_tmp";
while(<FICHERO_PHP>)
{
$clinea++;
$linea = uc($_);
# buscamos includes o requires seguidos de ("
# si encontramos alguno incluimos su contenido
# dentro del fichero temporal
if (($_ =~ /require\s*\(/ || $_ =~ /require\s*\"/ ||
$_ =~ /require_once\s*\(/ || $_ =~ /require_once\s*\"/ ||
$_ =~ /include\s*\(/ || $_ =~ /include\s*\"/ ||
$_ =~ /include_once\s*\(/ || $_ =~ /include_once\s*\"/ )
&& $_ !~ "^//" && $_ !~/\$/)
{
$cadena = $_;
$ini = index($cadena, "\"") + 1;
$fin = index($cadena, "\"", $ini) - $ini;
$cadena = substr($cadena, $ini, $fin);
$cadenatmp = $file;
$ruta = '';
do
{
$ini = index($cadenatmp, '/');
$fin = length($cadenatmp) - $ini;
$ruta .= substr($cadenatmp, 0, $ini+1);
$cadenatmp = substr($cadenatmp, $ini+1, $fin);
} until ($ini == -1);
$ruta .= $cadena;
push(@includes, $ruta);
# print " > Including: $ruta\n";
open FICHERO_INCLUDE, $ruta;
while(<FICHERO_INCLUDE>)
{
print FICHERO_TMP $_;
}
print FICHERO_TMP "\n";
close FICHERO_INCLUDE;
}
else
{
print FICHERO_TMP $_;
}
}
close FICHERO_TMP;
close FICHERO_PHP;
}
1;