Merge pull request #226 from seanheaton/master

A Goodie to extract IPv4 information encoded in Teredo tunnel IPv6 address
master
Jag Talon 2013-11-06 18:05:22 -08:00
commit 1762b6e034
3 changed files with 96 additions and 0 deletions

View File

@ -49,6 +49,8 @@ Games::Sudoku::Component = 0.02
Data::RandomPerson = 0.4
URI::Escape = 3.31
Lingua::EN::Words2Nums = 0
Net::IP = 0
Math::BaseConvert = 0
[Prereqs / TestRequires]
Test::More = 0.98

62
lib/DDG/Goodie/Teredo.pm Normal file
View File

@ -0,0 +1,62 @@
package DDG::Goodie::Teredo;
# ABSTRACT: Provides the Teredo server IPv4 address,
# NAT IPv4 address, and port number encoded in a given
# Teredo tunnel IPv6 address.
use DDG::Goodie;
use Net::IP;
use Math::BaseConvert;
triggers start => 'teredo';
primary_example_queries 'teredo 2001:0000:4136:e378:8000:63bf:3fff:fdd2';
description 'Teredo address analyzer';
name 'Teredo extractor';
code_url 'https://github.com/duckduckgo/zeroclickinfo-goodies/blob/master/lib/DDG/Goodie/Teredo.pm';
topics 'sysadmin';
category 'transformations';
attribution github => ['https://github.com/seanheaton','seanheaton'],
twitter => ['http://twitter.com/seanograph','@seanograph'],
email => ['mailto:seanoftime@gmail.com','seanoftime@gmail.com'];
handle remainder => sub {
my @output = ();
# Create an IPv6 address from the query value
my $ip = new Net::IP ($_,6) if $_;
# Verify the query value is a valid Teredo IPv6 address
if ((defined $ip) && ($ip->version() == 6) && (substr($ip->ip(),0,9) eq "2001:0000")) {
my $binip = $ip->binip();
# bits 32 to 64 designate IPv4 address of the Teredo server used
push @output, (new Net::IP (Net::IP::ip_bintoip((substr $binip, 32, 32),4)));
# negation of bits 80 to 96, converted to decimal, designate NAT port number
push @output, (65535 - cnv((substr $binip, 80, 16),2,10));
# negation of bits 96 to 128 designate IPv4 address of NAT device
push @output, (new Net::IP (Net::IP::ip_bintoip(~(substr $binip, 96, 32),4)));
return answer => to_text(@output), html => to_html(@output);
}
return;
# Params: server, port, client
sub to_text {
return "Teredo Server IPv4: " . $_[0]->ip() . "\nNAT Public IPv4: " . $_[2]->ip()
. "\nClient Port: " . $_[1];
}
# Params: server, port, client
sub to_html {
return "<div><i>Teredo Server IPv4: </i>" . $_[0]->ip() . "</div><div><i>NAT Public IPv4: </i>" . $_[2]->ip() . "</div><div><i>Client Port: </i>" . $_[1] . "</div>";
}
};
zci is_cached => 1;
1;

32
t/Teredo.t Normal file
View File

@ -0,0 +1,32 @@
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use DDG::Test::Goodie;
zci answer_type => 'teredo';
zci is_cached => 1;
ddg_goodie_test(
[
'DDG::Goodie::Teredo'
],
# Sample queries
'teredo 2001:0000:4136:e378:8000:63bf:3fff:fdd2' =>
test_zci("Teredo Server IPv4: 65.54.227.120\nNAT Public IPv4: 192.0.2.45\nClient Port: 40000",
html => "<div><i>Teredo Server IPv4: </i>65.54.227.120</div><div><i>NAT Public IPv4: </i>192.0.2.45</div><div><i>Client Port: </i>40000</div>",),
'teredo 2001:0000:4136:E378:8000:EC77:7C94:FFFE' =>
test_zci("Teredo Server IPv4: 65.54.227.120\nNAT Public IPv4: 131.107.0.1\nClient Port: 5000",
html => "<div><i>Teredo Server IPv4: </i>65.54.227.120</div><div><i>NAT Public IPv4: </i>131.107.0.1</div><div><i>Client Port: </i>5000</div>",),
'teredo 2001::CE49:7601:E866:EFFF:62C3:FFFE' =>
test_zci("Teredo Server IPv4: 206.73.118.1\nNAT Public IPv4: 157.60.0.1\nClient Port: 4096",
html => "<div><i>Teredo Server IPv4: </i>206.73.118.1</div><div><i>NAT Public IPv4: </i>157.60.0.1</div><div><i>Client Port: </i>4096</div>",),
);
done_testing;