#!/usr/bin/perl -w
#
# Copyright (C) 2007, Joshua D. Abraham (jabra@spl0it.org)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# use strict;
#
# get_fuzzer - fuzz a http login page using GET
#
# ex: $ ./get_fuzzer.pl --url http://www.DOMAIN.com/get \
# --fields user,passwd --values USER,PASS
#
#
# ex: $ ./get_fuzzer.pl --url http://www.DOMAIN.com/get \
# --fields user,passwd \
# --userlist USER_LIST_FILE.txt --passwdlist PASSWORD_LIST_FILE.txt
#
#
use strict;
use LWP::UserAgent;
use Getopt::Long;
use Array::Each;
my $ua = LWP::UserAgent->new;
use vars qw( $PROG );
( $PROG = $0 ) =~ s/^.*[\/\\]//; # Truncate calling path from the prog name
my $AUTH = 'Joshua D. Abraham'; # author
my $EMAIL = 'jabra@spl0it.org'; # email
my $VERSION = '1.0'; # version
my %options;
my $url;
my ( $field1, $field2, $value1, $value2 );
my ( @value1list, @value2list );
#
# help: ->
# display help information
# side effect: exits program
#
sub help {
print "Usage: $PROG [Options]
-u --url Get URL
--fields [field1,field2] Name of the fields to test
--values [value1,value2] Values to test
--userlist [file] File w/ values to test in field 1
--passlist [file] File w/ values to test in field 2
-v --version Display version
-h --help Display this information
Send Comments to $AUTH ( $EMAIL )\n";
exit;
}
#
# print_version ->
# displays version
# side effect: exits program
#
sub print_version {
print "$PROG version $VERSION by $AUTH ( $EMAIL )\n";
exit;
}
#
# get: value1 value2 ->
# get values to url
#
sub get {
my ($value1, $value2) = @_;
my $response = $ua->get($url, $field1 => $value1, $field2 => $value2);
# Check the outcome of the response
if ($response->is_success) {
print "Sucess! ( $field1 = $value1 $field2 = $value2 )\n";
exit;
}
else {
print "Failiure" . $response->status_line, "\n";
}
}
GetOptions(
\%options,
'userlist=s', 'passwdlist=s','fields=s','values=s',
'url|u=s',
'help|h' => sub { help(); },
'version|v' => sub { print_version(); },
)
or exit 1;
if ( $options{url} ) {
$url = $options{url};
}
if ( $options{fields} ) {
($field1, $field2) = split(',', $options{fields});
}
if ( $options{values} ) {
($value1, $value2) = split(',', $options{values});
}
if ( $options{userlist} ) {
my $file = $options{userlist};
open(INPUT, "<$file");
while( ) {
chomp;
push(@value1list,$_);
}
}
if ( $options{passwdlist} ) {
my $file = $options{passwdlist};
open(INPUT, "<$file");
while( ) {
chomp;
push(@value2list,$_);
}
}
if ( !defined($url) or !defined($field1) or !defined($field2) ) {
help();
}
if ( scalar(@value1list) >= 1 and scalar(@value2list) >= 1 ) {
my $set = Array::Each->new( \@value1list, \@value2list );
while( my( $value1_list, $value2_list, ) = $set->each() ) {
get($value1_list, $value2_list);
}
}
elsif ( scalar(@value1list) >= 1 ) {
if ( !defined($value2) ) {
help();
}
foreach(@value1list) {
get($_, $value2);
}
}
elsif ( scalar(@value2list) >= 1 ) {
if ( !defined($value1) ) {
help();
}
foreach(@value2list) {
get($value1, $_);
}
}
else {
if ( !defined($value1) or !defined($value2) ) {
help();
}
get($value1, $value2);
}