source: fierce2/branch/lib/Fierce/Domain/tBruteForceDNS.pm @ 125

Revision 125, 4.9 KB checked in by jabra, 4 years ago (diff)

use tCheckWildCard in the tBruteForceDNS

  • Property svn:keywords set to Id
Line 
1use threads;
2use threads::shared;
3
4# $Id$
5package tBruteForceDNS;
6{
7    use Object::InsideOut qw(:SHARED AttackObj);
8    use Data::Dumper;
9    use Fierce::Base;
10    use Fierce::Domain;
11    use Socket;
12    use Thread::Queue;
13    use Net::hostent;
14    use Fierce::Domain::tCheckWildCard;
15    use Data::Validate::IP qw(is_public_ipv4 is_ipv4);
16
17    ### required parameters
18    # none
19
20    ## optional parameters
21    # prefixes to use during bruteforce
22    my @prefix_list : Field : Arg(prefix_list) : Get(prefix_list) :
23        Type(Array) :
24        Default( ['imap','www', 'mail', 'files', 'file', 'ftp', 'dns','smtp', 'ns', 'mx', 'dev', 'devel', 'svn', 'cvs', 'test', 'vpn', 'unix', 'webmail'] );
25
26    # max number of interation to use for bruteforce attempts
27    my @max_bruteforce : Field : Arg(max_bruteforce) : Get(max_bruteforce) :
28        Default(5);
29
30    # contiue to perform bruteforce if a wildcard is being used
31    my @test_with_wildcard : Field : Arg(test_with_wildcard) :
32        All(test_with_wildcard) : Default(0);
33
34    # Base Configuration infomation
35    my @base : Field : Arg(base) : All(base) : Type(Base);
36   
37    my @has_wildcard : Field : Arg(has_wildcard) : Get(has_wildcard);
38
39    ### populated parameters
40    # list of nodes found
41    my @result : Field : Arg(result) : All(result) : Type(List(Node)) :
42        Default([]);
43
44    # domain object from execute
45    my @domain_obj : Field : Arg(domain_obj) : All(domain_obj) : Type(Domain);
46
47    # initialize the base obj
48    sub _init : Init {
49        my ($self) = @_;
50
51        # Set default if needed
52        if ( !exists( $base[$$self] ) ) {
53            $self->set( \@base, Base->new() );
54        }
55    }
56
57    # execute: Domain -> Fierce::Domain::tBruteForceDNS
58    # kicks off the dns bruteforce worker threads
59    sub execute {
60        my ( $self, $domain_obj ) = @_;
61
62        $self->_setup;
63        $self->domain_obj($domain_obj);
64
65        my $stream = Thread::Queue->new();
66       
67        $wildcard = tCheckWildCard->new();
68        $wildcard = $wildcard->execute($domain_obj);
69
70        $self->has_wildcard($wildcard->check());
71 
72        foreach my $prefix ( @{ $self->prefix_list } ) {
73            $stream->enqueue($prefix);
74        }
75        my $base = $self->base;
76        foreach ( 1 .. $base->threads ) {
77            threads->new( \&thr_work, $self, $stream );
78            $stream->enqueue(undef);    # for each thread
79        }
80        foreach my $thr ( threads->list() ) {
81            $thr->join();
82        }
83        $self->_complete;
84        return $self;
85    }
86
87    # thr_work: Thread::Queue ->
88    # perform dns bruteforce using prefix and url
89    sub thr_work {
90        my ( $self, $q ) = @_;
91        my $domain = $self->domain_obj->domain;
92        my $base   = $base[$$self];
93        #print( 'Thread = ', threads->tid(), "\n" );
94        sleep( $base->delay() );
95
96        while ( my $prefix = $q->dequeue() ) {
97            my $i    = 2;
98            my $max  = $self->max_bruteforce + 2;
99            chomp($prefix);
100            #print "testing $prefix.$domain\n";
101            my $inet = inet_aton("$prefix.$domain");
102
103            # checking to see if prefix1 resolves
104            if ( !defined $inet ) {
105                $prefix .= "1";
106                $inet = inet_aton("$prefix.$domain");
107            }
108
109            # checking to see if prefix01 resolves
110            if ( !defined $inet ) {
111                $prefix =~ s/1$//g;
112                $prefix .= "01";
113                $inet = inet_aton("$prefix.$domain");
114            }
115           
116            if ( defined $inet and is_public_ipv4(inet_ntoa($inet)) ) {
117                my $node = Node->new(
118                    hostname => "$prefix.$domain",
119                    ip       => inet_ntoa($inet),
120                    from     => 'DNS Prefix BruteForece'
121                );
122                push( @{ $result[$$self] }, $node );
123                if ( $self->test_with_wildcard == 0 or $self->test_with_wildcard == 1 ) {
124                    $prefix =~ s/01$|1$//g;
125                    while ( $i <= $max ) {
126                        my $num = $i;
127
128               # checking to see if prefix"NUMBER" or prefix"0NUMBER" resolves
129                        $inet = inet_aton("$prefix$num.$domain");
130                        if ( !defined $inet ) {
131                            $num  = "0$i";
132                            $inet = inet_aton("$prefix$num.$domain");
133                        }
134
135                        if ( defined $inet ) {
136                            my $node = Node->new(
137                                hostname => "$prefix$num.$domain",
138                                ip       => inet_ntoa($inet),
139                                from     => 'DNS Prefix BruteForece'
140                            );
141                            push( @{ $result[$$self] }, $node );
142                            $max++;
143                        }
144                        $i++;
145                    }
146                }
147            }
148
149            # Let others run
150            threads->yield();
151        }
152    }
153}
154
1551;
Note: See TracBrowser for help on using the repository browser.