LINUX.ORG.RU

История изменений

Исправление ne-vlezay, (текущая версия) :

cast: vel Dimonyga mky

Кстати, есть очень интересный perl скрипт:

#!/usr/bin/perl

use strict;
use Net::Pcap;
use NetPacket::Ethernet qw(:strip);
use NetPacket::IP qw(:strip);
use NetPacket::TCP;
use Net::RawIP;

$|=1;
my $dev='eth1';
my $filter_str='dst port 80';

my @URL = ("hospital-vrn.ru",);
my %URL_ARR = ();
foreach (@URL) {
    $URL_ARR{$_} = 1;
}

print "Filter: $filter_str\n";

my $pcap_t = Net::RawIP->pcapinit($dev, $filter_str, 1500, 250);
loop($pcap_t, -1, \&process_pkt,"0");

sub process_pkt {

my($pktuser, $hdr, $pkt) = @_;

my $ip_obj=NetPacket::IP->decode(eth_strip($pkt));
my $srcip=$ip_obj->{src_ip};
my $dstip=$ip_obj->{dest_ip};
my $proto=$ip_obj->{proto};
my ($tcp_obj, $srcport, $dstport, $dataset, $seqnum, $acknum);

if($proto==6){
        $tcp_obj=NetPacket::TCP->decode(ip_strip(eth_strip($pkt)));
        $srcport=$tcp_obj->{src_port};
        $dstport=$tcp_obj->{dest_port};
        $dataset=$tcp_obj->{data};
        $seqnum=$tcp_obj->{seqnum};
        $acknum=$tcp_obj->{acknum};

        http_handler($dataset, $srcip, $dstip, $srcport, $dstport, $seqnum, $acknum);
    }
}

sub http_handler {
my ($dataset, $srcip, $dstip, $srcport, $dstport, $seqnum, $acknum) = @_;
my ($dataportion, $query, $host);

$dataportion = unpack("A*", $dataset);
#    print "\nDEBUG\n" . unpack("A*",$dataset);
    if ($dataportion =~ s/^GET\s(.+)\sHTTP\/1\.\d\r\n//) {
        $query = unpack("A*",$1);
        $query =~ s/^\/$//;
        if ($dataportion =~ s/Host:\s(.+)\r\n//) {
            $host = unpack("A*",$1);
            if ($URL_ARR{$host . $query}) {
                print "Matched: $host$query ($srcip)\n";
                send_answer($srcip, $dstip, $srcport, $dstport, $seqnum, $acknum);
            }
        }
    }
}

sub send_answer {
my ($srcip, $dstip, $srcport, $dstport, $seqnum, $acknum) = @_;

my $header = "HTTP/1.1 301 Moved Permanently
Location: http://google.com
Connection: close
";

my  $packet = new Net::RawIP({ip =>
                {
                    saddr => $dstip,
                    daddr => $srcip
                },
                tcp =>
                {
                    source => $dstport,
                    dest => $srcport,
                    seq => $acknum,
                    ack_seq => $seqnum+1,
                    ack => 1,
                    data => $header
                }
                });
        $packet->send(0,1);
        exit 0;
}

Но внём есть косяки: 1. Блокируется только первый url, а остальные потом не блокируются, если не перезапустить скрипт 2. Как же сделать так, чтобы этот скрипт кешировал http пакеты, а потом анализировал их

P.S. Опыта работы с perl у меня пока нет.

От находится в: http://forum.nag.ru/forum/index.php?showtopic=79886&st=0

Исходная версия ne-vlezay, :

cast: vel Dimonyga mky

Кстати, есть очень интересный perl скрипт:

#!/usr/bin/perl

use strict;
use Net::Pcap;
use NetPacket::Ethernet qw(:strip);
use NetPacket::IP qw(:strip);
use NetPacket::TCP;
use Net::RawIP;

$|=1;
my $dev='eth1';
my $filter_str='dst port 80';

my @URL = ("hospital-vrn.ru",);
my %URL_ARR = ();
foreach (@URL) {
    $URL_ARR{$_} = 1;
}

print "Filter: $filter_str\n";

my $pcap_t = Net::RawIP->pcapinit($dev, $filter_str, 1500, 250);
loop($pcap_t, -1, \&process_pkt,"0");

sub process_pkt {

my($pktuser, $hdr, $pkt) = @_;

my $ip_obj=NetPacket::IP->decode(eth_strip($pkt));
my $srcip=$ip_obj->{src_ip};
my $dstip=$ip_obj->{dest_ip};
my $proto=$ip_obj->{proto};
my ($tcp_obj, $srcport, $dstport, $dataset, $seqnum, $acknum);

if($proto==6){
        $tcp_obj=NetPacket::TCP->decode(ip_strip(eth_strip($pkt)));
        $srcport=$tcp_obj->{src_port};
        $dstport=$tcp_obj->{dest_port};
        $dataset=$tcp_obj->{data};
        $seqnum=$tcp_obj->{seqnum};
        $acknum=$tcp_obj->{acknum};

        http_handler($dataset, $srcip, $dstip, $srcport, $dstport, $seqnum, $acknum);
    }
}

sub http_handler {
my ($dataset, $srcip, $dstip, $srcport, $dstport, $seqnum, $acknum) = @_;
my ($dataportion, $query, $host);

$dataportion = unpack("A*", $dataset);
#    print "\nDEBUG\n" . unpack("A*",$dataset);
    if ($dataportion =~ s/^GET\s(.+)\sHTTP\/1\.\d\r\n//) {
        $query = unpack("A*",$1);
        $query =~ s/^\/$//;
        if ($dataportion =~ s/Host:\s(.+)\r\n//) {
            $host = unpack("A*",$1);
            if ($URL_ARR{$host . $query}) {
                print "Matched: $host$query ($srcip)\n";
                send_answer($srcip, $dstip, $srcport, $dstport, $seqnum, $acknum);
            }
        }
    }
}

sub send_answer {
my ($srcip, $dstip, $srcport, $dstport, $seqnum, $acknum) = @_;

my $header = "HTTP/1.1 301 Moved Permanently
Location: http://google.com
Connection: close
";

my  $packet = new Net::RawIP({ip =>
                {
                    saddr => $dstip,
                    daddr => $srcip
                },
                tcp =>
                {
                    source => $dstport,
                    dest => $srcport,
                    seq => $acknum,
                    ack_seq => $seqnum+1,
                    ack => 1,
                    data => $header
                }
                });
        $packet->send(0,1);
        exit 0;
}

Но внём есть косяки: 1. Блокируется только первый url, а остальные потом не блокируются, если не перезапустить скрипт 2. Как же сделать так, чтобы этот скрипт кешировал http пакеты, а потом анализировал их

P.S. Опыта работы с perl у меня пока нет.