home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 15 / hacker15 / 15_H4CK3R#15.ISO / linux_security / engarde / ENGARDE_COMMUNITY_FEINT.ISO / etc / update / firewall-lib.pl < prev   
Encoding:
Perl Script  |  2003-02-10  |  11.0 KB  |  394 lines

  1. #!/usr/bin/perl
  2.  
  3. =begin comment info
  4.  +-----------------------------------------------------------------------------+
  5.  | Copyright 2001, Guardian Digital Inc.                                        
  6.  | $Id: firewall-lib.pl,v 1.7 2002/05/16 16:28:19 rwm Exp $
  7.  |
  8.  | Ryan W. Maple, <ryan@guardiandigital.com>
  9.  +-----------------------------------------------------------------------------+
  10. =end comment info
  11. =cut
  12.  
  13.   require "../Security.pl";
  14.  
  15.   ### ##########################################################################
  16.   ### Global Variables
  17.   ### ##########################################################################
  18.   $CONFIGURATION_FILE  =  '/etc/firewall/firewall.conf';
  19.   $PORTFW_FILE         =  '/etc/firewall/include/portfw.sh';
  20.   $IPCHAINS_INIT       =  '/etc/init.d/iptables';
  21.   $CHKCONFIG_BIN       =  '/sbin/chkconfig';
  22.   $IPCHAINS_BIN        =  '/sbin/iptables';
  23.   $IPFWADM_BIN         =  '/sbin/ipfwadm';
  24.   $IPMASQADM_BIN       =  '/usr/sbin/ipmasqadm';
  25.   $IPCALC_BIN          =  '/bin/ipcalc';
  26.   $FIREWALL_HTB_DIR    =  '/etc/firewall/htb';
  27.  
  28.   @PORTFW_PROTOCOLS   =  ('tcp', 'udp');
  29.  
  30.   %PORTFW_PORTS       =  ( 20,   'FTP Data (20)',
  31.                            21,   'FTP (21)',
  32.                            22,   'SSH (22)',
  33.                            23,   'Telnet (23)',
  34.                            25,   'SMTP (25)',
  35.                            53,   'DNS (53)',
  36.                            80,   'HTTP (80)',
  37.                            110,  'POP3 (110)',
  38.                            143,  'IMAP (143)',
  39.                            443,  'HTTPS (443)',
  40.                            993,  'SIMAP (993)',
  41.                            995,  'SPOP3 (995)',
  42.                            8080, 'Web Proxy (8080)' );
  43.  
  44.   @HTB_RATE_TYPES = ('Kbit', 'Mbit');
  45.  
  46.  
  47.   ##############################################################################
  48.   sub firewallHTBGetNextCID() {
  49.     my $PARENT = shift;
  50.     my %CLASS = &firewallHTBReadClasses();
  51.     my $RV = undef;
  52.     my @TMP = undef;
  53.  
  54.     # Build a list of all existing children nodes of this @PARENT in @TMP.
  55.     foreach my $k (sort keys %CLASS) {
  56.       push @TMP, $k if ($CLASS{$k}->{'PARENT'} eq "1:$PARENT");
  57.     }
  58.  
  59.     # This is the first child node of $PARENT.  Make it's LSB 0.
  60.     if (! $TMP[0]) { $RV = $PARENT . "0"; }
  61.  
  62.     # Get the largest cid, add one, and return the result.
  63.     else { @TMP = sort { $b <=> $a } @TMP; $RV = ++$TMP[0] }
  64.  
  65.     # Hand it back up.
  66.     return $RV;
  67.   }
  68.  
  69.   ### ##########################################################################
  70.   sub firewallHTBWalkTree() {
  71.     my $BASE_NODE = shift;
  72.     my $FCN = shift;
  73.     my %CLASS = &firewallHTBReadClasses();
  74.     my @CURRENT = ("$BASE_NODE");
  75.     my $DEPTH = 0;
  76.     my $CLASS_SEEN_COUNT = 1;
  77.     my $CLASS_TOUCHED_COUNT = 1;
  78.  
  79.     # Find out how many nodes we have.
  80.     foreach my $k (sort keys %CLASS) { $CLASS_SEEN_COUNT++; }
  81.  
  82.     # Loop until we've hit every node.
  83.     while ($CLASS_TOUCHED_COUNT < $CLASS_SEEN_COUNT) {
  84.       my $NEXT = undef;
  85.  
  86.       # Find any untouched children of this node (run till $NEXT is undef).
  87.       foreach my $k (sort keys %CLASS) {
  88.  
  89.         # Touch this child, bump our touched count, and do SOMETHING with it.
  90.         if (($CLASS{$k}->{'PARENT'} eq $CURRENT[$DEPTH]) &&
  91.             (! $CLASS{$k}->{'TOUCHED'}) && ! $NEXT) {
  92.           $CLASS{$k}->{'TOUCHED'} = 1;
  93.  
  94.          #
  95.          # ($FCN == 1) We want to print this in a table on list_htb.cgi.
  96.          #
  97.          if ($FCN == 1) {
  98.            my $SPACER = "";
  99.            for (my $i = 0; $i < $DEPTH; $i++) { $SPACER .= "  "; }
  100.  
  101.             # Print a row.
  102.             print <<EOF;
  103.           <TR $cb>
  104.           <TD WIDTH="10">   </TD>
  105.           <TD><DIV CLASS="nbody">$SPACER<B><A HREF="edit_htb_class.cgi?classid=$k">$CLASS{$k}->{'NAME'} (1:$k)</B></A></DIV></TD>
  106.           <TD><DIV CLASS="nbody">$CLASS{$k}->{'RATE'}</DIV></TD>
  107.           <TD><DIV CLASS="nbody">$CLASS{$k}->{'CEIL'}</DIV></TD>
  108.           </TR>
  109. EOF
  110.          }
  111.  
  112.           # Bump our touched count and move down to this node next pass.
  113.           $CLASS_TOUCHED_COUNT++;
  114.           $NEXT = "1:$k";
  115.         }
  116.       }
  117.  
  118.       #
  119.       # If $NEXT was not defined thn $CURRENT has no more children.  Move up a
  120.       # branch.  # Otherwise push our new $NEXT parent onto @CURRENT and move
  121.       # into the new branch.
  122.       #
  123.  
  124.       # If we didn't find any children then move up a node.  Otherwise move
  125.       # down to the new child.
  126.       if (! $NEXT) { pop @CURRENT; $DEPTH--; }
  127.       else { push @CURRENT, $NEXT; $DEPTH++; }
  128.     }
  129.  
  130.   }
  131.  
  132.   ### ##########################################################################
  133.   sub firewallHTBReadClasses() {
  134.     my %CLASS;
  135.  
  136.     opendir CLASSES, "$FIREWALL_HTB_DIR";
  137.       foreach my $c (sort readdir CLASSES) {
  138.        next if (($c !~ m/^[0-9]+$/) || (! -f "$FIREWALL_HTB_DIR/$c"));
  139.        $CLASS{$c} = &firewallReadHTBFile($c);
  140.        $CLASS_SEEN_COUNT++;
  141.       }
  142.     closedir CLASSES;
  143.  
  144.     return %CLASS;
  145.   }
  146.  
  147.   ### ############################################################################
  148.   sub firewallReadHTBFile() {
  149.     my $FILE = shift;
  150.     my $RV;
  151.  
  152.     open HTBFILE, "$FIREWALL_HTB_DIR/$FILE";
  153.       while (my $line = <HTBFILE>) {
  154.         chomp $line;
  155.  
  156.         my ($KEY, $VALUE);
  157.         ($KEY, $VALUE) = ($line =~ m/^([A-Z]+)\=\"?([^\"]+)\"?$/);
  158.         $RV->{$KEY} = $VALUE;
  159.       }
  160.     close HTBFILE;
  161.  
  162.     # Break RATE and CEIL apart for edit_htb_class.cgi
  163.     my @tmp = ($RV->{'RATE'} =~ m/^([0-9]+)(.*)$/);
  164.     $RV->{'RATE_n'} = $tmp[0]; $RV->{'RATE_t'} = $tmp[1];
  165.     my @tmp = ($RV->{'CEIL'} =~ m/^([0-9]+)(.*)$/);
  166.     $RV->{'CEIL_n'} = $tmp[0]; $RV->{'CEIL_t'} = $tmp[1];
  167.  
  168.     # Make sure this node isn't touched and hand it back.
  169.     $RV->{'TOUCHED'} = 0;
  170.     return $RV;
  171.   }
  172.  
  173.   ### ##########################################################################
  174.   sub firewallReadConfig() {
  175.     my (%C);
  176.  
  177.     open CONFIG, '/etc/firewall/firewall.conf';
  178.       while (my $line = <CONFIG>)
  179.       {
  180.         my ($key, $value);
  181.         chomp $line;
  182.  
  183.         next if (($line eq "") || ($line =~ m/^#/));
  184.  
  185.         ($key, $value)  =  split /\=/, $line;
  186.         $C{$key}        =  $value;
  187.       }
  188.     close CONFIG;
  189.  
  190.  
  191.     # Read our HTB 'defaults' file
  192.     open CONFIG, 'etc/fireall/htb/defaults';
  193.       while (my $line = <CONFIG>) {
  194.         chomp $line;
  195.  
  196.         if ($line =~ /^DEVICE=\"?([^\"]+)\"?$/) {
  197.           $C{'htb_device'} = $1;
  198.         }
  199.         elsif ($line =~ /^DEFAULT=\"?([^\"]+)\"?$/) {
  200.           $C{'htb_defaultclass'} = $1;
  201.         }
  202.       }
  203.     close CONFIG;
  204.  
  205.     return %C;
  206.   }
  207.  
  208.  
  209.   ### ##########################################################################
  210.   sub firewallGetInterfaces() {
  211.     my (@addresses, $IN_IFACE, $IS_VIRT, $tmp_iface);
  212.  
  213.     $IN_IFACE   =  0;
  214.     $IS_VIRT    =  0;
  215.     $tmp_iface  =  "";
  216.  
  217.     open IFCONFIG, "/sbin/ifconfig |";
  218.       while (<IFCONFIG>)
  219.       {
  220.         chomp $_;
  221.  
  222.         if (($_ =~ m/^(eth[0-9\:]+)\s+/) || ($_ =~ m/^(ppp[0-9\:]+)\s+/)) {
  223.           $IN_IFACE  =  1; $tmp_iface = $1;
  224.           $IS_VIRT   =  1 if ($tmp_iface =~ m/\:/);
  225.         }
  226.         elsif ($_ eq "")  { $IN_IFACE = 0; $IS_VIRT = 0; $tmp_iface = ""; }
  227.  
  228.         if (($_ =~ m/^\s+inet\ addr\:([0-9\.]+).*Mask\:([0-9\.]+)$/) &&
  229.             $IN_IFACE) {
  230.           my $IF = $1;
  231.           my $MASK = $2;
  232.           my @BYTES = split /\./, $2;
  233.           my $CIDR = 0;
  234.  
  235.           for (@BYTES) {
  236.             my $BITS = unpack( "B*", pack( "C", $_ ) );
  237.             $CIDR += $BITS =~ tr /1/1/;
  238.           }
  239.  
  240.           push @addresses, { 'iface'   => $tmp_iface,
  241.                              'address' => $IF,
  242.                              'netmask' => $MASK,
  243.                              'cidr'    => $CIDR,
  244.                              'virtual' => $IS_VIRT };
  245.         }
  246.     }
  247.       close IFCONFIG;
  248.  
  249.     return @addresses;
  250.   }
  251.  
  252.  
  253.   ### ##########################################################################
  254.   ### Usage:  &firewallBuildIfaceSelect($name, $selected, $novirt, $ifacefirst);
  255.   ### ##########################################################################
  256.   sub firewallBuildIfaceSelect() {
  257.     my ($ret, @INTERFACES); $ret = "";
  258.  
  259.     $ret         =  "<SELECT NAME=\"$_[0]\">\n";
  260.     $ret        .=  "  <OPTION VALUE=\"NULL\">Please Select</OPTION>\n";
  261.     @INTERFACES  =  &firewallGetInterfaces();
  262.  
  263.     foreach my $i (sort @INTERFACES) {
  264.       my ($if, $address);
  265.  
  266.       next if ($i->{'virtual'} && $_[2]);
  267.  
  268.       $if       =  $i->{'iface'};
  269.       $address  =  $i->{'address'};
  270.  
  271.       $ret  .=  "  <OPTION VALUE=\"$if\" ";
  272.       $ret  .=  "SELECTED" if ($if eq $_[1]);
  273.  
  274.       if ($_[3]) { $ret  .=  ">$if ($address)</OPTION>\n"; }
  275.       else       { $ret  .=  ">$address ($if)</OPTION>\n"; }
  276.     }
  277.  
  278.     $ret .=  "</SELECT>\n";
  279.  
  280.     return $ret;
  281.   }
  282.  
  283.  
  284.   ### ##########################################################################
  285.   sub firewallListPortfw() {
  286.     my (@PFW, $lineno, %GCONFIG);  $lineno = -1;
  287.  
  288.     %GCONFIG = &firewallReadConfig();
  289.  
  290.     open PORTFW, $PORTFW_FILE;
  291.       while (my $line = <PORTFW>)
  292.       {
  293.         my (@tmp);  chomp $line; $lineno++;
  294.  
  295.         ###  Skip all non-rule lines.
  296.         next if ( ($line !~ m/^\$IPTABLES\ /) ||
  297.                   ($line eq "\$IPTABLES -F"));
  298.  
  299.         ###  Split the $line apart and populate @PFW.
  300.         @tmp     =  split /\ /, $line;
  301.         @rtmp    =  split /:/, $tmp[14];
  302.         $rtmp[0]  =  $GCONFIG{'UNTRUSTED_IP'} if ($rtmp[0] eq "\$UNTRUSTED_IP");
  303.  
  304.         push @PFW, { 'lineno' => $lineno, 'proto' => $tmp[6],
  305.                      'laddr'  => $tmp[8], 'lport' => $tmp[10],
  306.                      'raddr'  => $rtmp[0], 'rport' => $rtmp[1] };
  307.       }
  308.     close PORTFW;
  309.  
  310.     return @PFW;
  311.   }
  312.  
  313.  
  314.   ### ##########################################################################
  315.   sub firewallGetNetworkNumber() {
  316.     my ($rv, $tmp);  $rv = undef;
  317.  
  318.     $rv = `$IPCALC_BIN --network $_[0] $_[1]`; chomp $rv; $rv =~ s/^NETWORK\=//;
  319.  
  320.     return $rv;
  321.   }
  322.  
  323.  
  324.   ### ##########################################################################
  325.   sub firewallNumInterfaces() {
  326.     my ($rv); $rv = 0;
  327.  
  328.     foreach my $i (&firewallGetInterfaces()) {
  329.       next if ($i->{'virtual'});
  330.       $rv++;
  331.     }
  332.  
  333.     return $rv;
  334.   }
  335.  
  336.  
  337.   ### ##########################################################################
  338.   sub firewallFirewallIsActive() {
  339.     my ($rv);
  340.  
  341.     ($rv) = `chkconfig --list iptables` =~ m/\s+3\:([onf]+)/;
  342.  
  343.     return $rv;
  344.   }
  345.  
  346.  
  347.   ### ##########################################################################
  348.   sub firewallPortFwCtl() {
  349.     my ($rc); $rc = undef;
  350.  
  351.     if ($_[0] eq 'restart') {
  352.       my (%E); %E = %ENV; %ENV = ();
  353. ##      $rc = system ("/etc/firewall/include/portfw.sh");
  354.         $rc = system ("/etc/firewall/include/default.sh");
  355.       %ENV = %E;
  356.     }
  357.  
  358.     return $rc;
  359.   }
  360.  
  361.  
  362.   ### ##########################################################################
  363.   sub firewallPrintError {
  364.     my ($message) = @_;
  365.  
  366.     print <<ErrorEOF;
  367. Content-type: text/html
  368.  
  369.  
  370. <HTML>
  371. <HEAD>
  372.   <TITLE> </TITLE>
  373.  
  374.   <SCRIPT LANGUAGE="JavaScript">
  375.     alert("$message");
  376.     history.go(-1);
  377.   </SCRIPT>
  378. </HEAD>
  379. </HTML>
  380. ErrorEOF
  381.   }
  382.  
  383.  
  384.   ### ##########################################################################
  385.   sub isIP() {
  386.     if ($_[0] =~ (m/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/)) {
  387.       return 1;
  388.     }
  389.  
  390.     return 0;
  391.   }
  392.  
  393.  
  394.