Advertisement
Guest User

Untitled

a guest
Nov 9th, 2012
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.41 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use Net::Pcap;
  5. use NetPacket::Ethernet qw(:strip);
  6. use NetPacket::IP qw(:strip);
  7. use NetPacket::TCP;
  8. use Net::RawIP;
  9.  
  10. $|=1;
  11. my $dev='eth1';
  12. my $filter_str='dst port 80';
  13.  
  14. my @URL = ("www.ya.ru/test14","www.youtube.com/watch?v=1234567");
  15. my %URL_ARR = ();
  16. foreach (@URL) {
  17.     $URL_ARR{$_} = 1;
  18. }
  19.  
  20. print "Filter: $filter_str\n";
  21.  
  22. my $pcap_t = Net::RawIP->pcapinit($dev, $filter_str, 1500, 250);
  23. loop($pcap_t, -1, \&process_pkt,"xyz");
  24.  
  25. sub process_pkt {
  26.  
  27. my($pktuser, $hdr, $pkt) = @_;
  28.  
  29. my $ip_obj=NetPacket::IP->decode(eth_strip($pkt));
  30. my $srcip=$ip_obj->{src_ip};
  31. my $dstip=$ip_obj->{dest_ip};
  32. my $proto=$ip_obj->{proto};
  33. my ($tcp_obj, $srcport, $dstport, $dataset, $seqnum, $acknum);
  34.  
  35. if($proto==6){
  36.         $tcp_obj=NetPacket::TCP->decode(ip_strip(eth_strip($pkt)));
  37.         $srcport=$tcp_obj->{src_port};
  38.         $dstport=$tcp_obj->{dest_port};
  39.         $dataset=$tcp_obj->{data};
  40.         $seqnum=$tcp_obj->{seqnum};
  41.         $acknum=$tcp_obj->{acknum};
  42.  
  43.         http_handler($dataset, $srcip, $dstip, $srcport, $dstport, $seqnum, $acknum);
  44.     }
  45. }
  46.  
  47. sub http_handler {
  48. my ($dataset, $srcip, $dstip, $srcport, $dstport, $seqnum, $acknum) = @_;
  49. my ($dataportion, $query, $host);
  50.  
  51. $dataportion = unpack("A*", $dataset);
  52. #    print "\nDEBUG\n" . unpack("A*",$dataset);
  53.     if ($dataportion =~ s/^GET\s(.+)\sHTTP\/1\.\d\r\n//) {
  54.         $query = unpack("A*",$1);
  55.         $query =~ s/^\/$//;
  56.         if ($dataportion =~ s/Host:\s(.+)\r\n//) {
  57.             $host = unpack("A*",$1);
  58.             if ($URL_ARR{$host . $query}) {
  59.                 print "Matched: $host$query ($srcip)\n";
  60.                 send_answer($srcip, $dstip, $srcport, $dstport, $seqnum, $acknum);
  61.             }
  62.         }
  63.     }
  64. }
  65.  
  66. sub send_answer {
  67. my ($srcip, $dstip, $srcport, $dstport, $seqnum, $acknum) = @_;
  68.  
  69. my $header = "HTTP/1.1 301 Moved Permanently
  70. Location: http://google.com
  71. Connection: close
  72. ";
  73.  
  74. my  $packet = new Net::RawIP({ip =>
  75.                 {
  76.                     saddr => $dstip,
  77.                     daddr => $srcip
  78.                 },
  79.                 tcp =>
  80.                 {
  81.                     source => $dstport,
  82.                     dest => $srcport,
  83.                     seq => $acknum,
  84.                     ack_seq => $seqnum+1,
  85.                     ack => 1,
  86.                     data => $header
  87.                 }
  88.                 });
  89.         $packet->send(0,1);
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement