История изменений
Исправление ne-vlezay, (текущая версия) :
Кстати, есть очень интересный 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, :
Кстати, есть очень интересный 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 у меня пока нет.