/isrcore/dnsserver.pm
Perl | 190 lines | 138 code | 14 blank | 38 comment | 3 complexity | ac2103ab75f84653608acd4d83bba6be MD5 | raw file
Possible License(s): GPL-2.0
- ###############
- # dnsserver.pm
- #
- # Copyright 2010 Francisco Amato
- #
- # This file is part of isr-evilgrade, www.infobytesec.com .
- #
- # isr-evilgrade 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 version 2 of the License.
- #
- # isr-evilgrade 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 isr-evilgrade; if not, write to the Free Software
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- #
- # '''
- ##
- package isrcore::dnsserver;
- use strict;
- #external modules
- use IO::Socket;
- use isrcore::utils;
- use POSIX ":sys_wait_h";
- use Data::Dump qw(dump);
- use FindBin;
- use lib "$FindBin::Bin";
- use IO::Socket;
- use Sys::Hostname;
- use isrcore::Stanford::DNS;
- use isrcore::Stanford::DNSserver;
- $SIG{INT} = sub { die "$$ dying\n" };
- sub catch_zap {
- my $signame = shift;
- return 1;
- }
- $SIG{HUP} = \&catch_zap; # best strategy
- my $base=
- {
- 'port' => 53,
- 'whoami' => "DNSSERVER",
- 'error' => "",
- 'enable' => 0,
- 'resolve_to' => "127.0.0.1",
- 'domains' => (),
- };
- ##########################################################################
- # FUNCTION new
- # RECEIVES
- # RETURNS
- # EXPECTS
- # DOES class's constructor
- sub new {
- my $class = shift;
- my $self = {'Base' => $base, @_ };
- return bless $self, $class;
- }
- ##########################################################################
- # FUNCTION start
- # RECEIVES [shellzobj]
- # RETURNS
- # EXPECTS
- # DOES start webserver
- sub start {
- my $self = shift;
- my $shellz = shift;
- #ignore child process avoid zombies.
- $SIG{CHLD} = 'IGNORE';
- #create socket
- if ( $self->{'Base'}->{'enable'} == 0 ){
- return;
- }
- my $nserver = new isrcore::Stanford::DNSserver (
- listen_on => ["0.0.0.0"],
- port => $self->{'Base'}->{'port'},
- daemon => "no",
- logfunc => sub { $shellz->printshell("[$self->{'Base'}->{'whoami'}] - $_[0]\n",1) },
- debug => 1,
- # loopfunc => sub { $shellz->printshell("[$self->{'Base'}->{'whoami'}] - ".dump(@_)."DNS Server Ready. Waiting for Connections\n"); },
- );
- if( !$nserver )
- {
- $self->{'Base'}->{'error'} = "[$self->{'Base'}->{'whoami'}] - Cant't create a listening socket: $@";
- return;
- }else{
- $shellz->printshell("[$self->{'Base'}->{'whoami'}] - DNS Server Ready. Waiting for Connections ...\n");
- }
- my $resolve_ip = unpack('N',inet_aton($self->{'Base'}->{'resolve_to'}) );
- my $vhost;
- foreach $vhost ( @{$self->{'Base'}->{'domains'}} ){
- $nserver->add_static($vhost, T_A, rr_A($resolve_ip));
- $nserver->add_static($vhost, T_AAAA, rr_A($resolve_ip));
- }
-
- while(1) {
- if( $nserver->answer_queries() == 0 ){
- $self->{'Base'}->{'error'} = "[$self->{'Base'}->{'whoami'}] - Error Initiating DNS Server";
- return 0;
- }
- }
-
-
- }
- ##########################################################################
- # FUNCTION loadconfig
- # RECEIVES
- # RETURNS
- # EXPECTS
- # DOES load dns server configuration
- sub loadconfig{
- my $self=shift;
- my $config=shift;
- my $vhosts;
- my @domains = ();
- $self->{'Base'}->{'port'}=$config->{'Base'}->{'options'}->{'DNSPort'}->{'val'};
- $self->{'Base'}->{'enable'}=$config->{'Base'}->{'options'}->{'DNSEnable'}->{'val'};
- $self->{'Base'}->{'resolve_to'}=$config->{'Base'}->{'options'}->{'DNSAnswerIp'}->{'val'};
-
- # load VHOSTS
-
- foreach my $name (keys %{$config->{'modules'}}){
- my $module = $config->{'modules'}->{$name};
- if ($module->{'Base'}->{'options'}->{'enable'}->{'val'} == 1) {
- $vhosts = $module->{'Base'}->{'vh'};
- $vhosts =~ s/\(|\)//g;
- push(@domains,split(/\|/,$vhosts));
-
-
- }
- }
- $self->{'Base'}->{'domains'} = \@domains;
- return 1;
-
- }
- ##########################################################################
- # FUNCTION stop
- # RECEIVES
- # RETURNS
- # EXPECTS
- # DOES stop dns server
- sub stop{
- my $self=shift;
- # hup x kill
- kill KILL => $self->{'Base'}->{'child'};
- $self->{'Base'}->{'child'}=0;
-
- return;
- }
- ##########################################################################
- # FUNCTION status
- # RECEIVES
- # RETURNS
- # EXPECTS
- # DOES dns status
- sub status{
- my $self = shift;
-
- if ($self->{'Base'}->{'child'} && waitpid($self->{'Base'}->{'child'},WNOHANG) != -1){
- return 1;
- } else {
- $self->{'Base'}->{'child'}=0;
- return 0;
- }
- }
- 1;