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

Revision 112, 4.7 KB checked in by jabra, 4 years ago (diff)

remove socket6

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