#!/usr/bin/perl -w # # a perl tool to make a exploit hunters life easier. looks through source code # for possible exploits. the line found may not be an actual exploit, but it # sure does spot possible ones faster than you could by hand. you can add # functions that should be searched for yourself by editing the ifs in this # file. also this tool has the ability to tail certain variables that you may # find interesting. since sometimes you will find a possible exploit, but not # able to figure out if the variable in the function is allready declared or # not, you use this option to follow that variable and figure out if it is or # not. # # $Id: audit.pl,v 0.1 2007/O2/17 08:21:00 varc Exp $ use strict; use File::Find; use Getopt::Long; my ( $dir, $tail, $i ); my $options = { d => \$dir, t => \$tail }; GetOptions( $options, "d=s", "t:s" ); my @functions = ( "include", "include_once", "require", "require_once" ); &usage unless $dir; if ( !defined( $tail ) ) { find( { wanted => \&scan, no_chdir => 1 }, $dir ); } else { find( { wanted => \&tail, no_chdir => 1 }, $dir ); } exit; sub scan { my $fi = $File::Find::name; if ( ( $fi =~ /\.php$/i ) || ( $fi =~ /\.inc$/i ) || ( $fi =~ /\.inc.php$/i) || ( $fi =~ /\.php4$/i) ) { my $i = 1; open( FILY, "$fi" ) or warn "Failed to open $fi - $!"; foreach my $line ( ) { foreach my $f ( @functions ) { if ( $line =~ /\s*$f\s*\(([^)]+)\)\s*;/ ) { my $exp = $1; if ( $exp =~ /\$/ ) { print $fi . " [" . $exp . "] ". $line; } } } } } } sub tail { my $fi = $File::Find::name; if ( ( $fi =~ /\.php$/i ) || ( $fi =~ /\.inc$/i ) || ( $fi =~ /\.inc.php$/i) || ( $fi =~ /\.php4$/i) ) { open( FILY, "$fi" ) or warn "Failed to open $fi - $!"; foreach my $line ( ) { if ( $line =~ /(\$$tail)/ ) { print $fi . " [" . $1 . "] " . $line; } } } } sub usage { print "source code auditor\n"; print "usage: perl $0 -dt\n\n"; print " -d\t\tdirectory with the source code to scan\n"; print " -t\t\tvariable to tail (optional)\n"; exit; }