Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/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 = ("www.ya.ru/test14","www.youtube.com/watch?v=1234567");
- 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,"xyz");
- 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);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement