The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Fierce::Parser - Parse fierce scan data with Perl

VERSION

This document describes the latest version of Fierce::Parser

SYNOPSIS

 use Fierce::Parser;
 my $fp = new Fierce::Parser;

 # a Fierce::Parser Object
 my $parser = $fp->parse_file('test1.xml');

 # a Fierce::Parser::Host Object
 my $host = $parser->get_node('google.com');

For a full listing of methods see the documentation corresponding to each object.

DESCRIPTION

OVERVIEW

 Fierce::Parser                               -- Core parser
 |
 +--Fierce::Parser::Session                   -- Fierce scan session information
 |  
 +--Fierce::Parser::Domain                    -- General domain information
 |  |
 |  |--Fierce::Parser::Domain::NameServers    -- Nameserver Information about the Domain
 |  |
 |  |--Fierce::Parser::Domain::ZoneTransfer   -- Zone Transfer information
 |  |
 |  |--Fierce::Parser::Domain::Bruteforce     -- Nodes found using Bruteforce 
 |  |
 |  |--Fierce::Parser::Domain::ExtBruteforce  -- Nodes found using Extension Bruteforce 
 |  |
 |  |--Fierce::Parser::Domain::ReverseLookups -- Nodes found using Reverse Lookups
 |  |
 |  |--Fierce::Parser::Domain::WildCard       -- Information about MX records found
 |  |
 |  |--Fierce::Parser::Domain::WhoisLookup    -- Information about Whois lookups
 |  |
 |  |--Fierce::Parser::Domain::FindMX         -- Information about MX records found
 |  |
 |  |--Fierce::Parser::Domain::Vhost          -- Information about Virtual Hosts found
 

METHODS

Fierce::Parser

The main idea behind the core modules is, you will first parse the scan data then extract the information. Therefore, you should run parse_file then you can use any of the subroutines.

parse_file($xml_file)

Parse a fierce XML file. The XML files are generated from using the following command:

 fierce.pl -dns $DOMAIN -format xml -output domain.xml
parse_file($args,@domains)

Perform a fierce scan and parse the XML result.

 use Fierce::Parser;
 my $fp = new Fierce::Parser;
 my @domains;
 push(@domains,"google.com");
 
 my $parser = $fp->parse_scan("",@domains);
get_session()

Obtain the fierce::Parser::Session object which contains the session scan information.

get_node($domain)

Obtain the Fierce::Parser::Host object which the host information.

get_all_nodes()

Obtain an Array of Fierce::Parser::Node objects which contain domain information.

Fierce::Parser::Session

This object contains the scan session information of the Fierce scan.

options()

Returns the options used to execute fierce.

startscan()

Returns the start time of the scan in unixtime format.

startscanstr()

Returns the start time of the scan in a readable string.

endscan()

Returns the end time of the scan in unixtime format.

endscanstr()

Returns the end time of the scan in a readable string.

elapsedtime()

Returns the elapsed time of the scan.

fversion()

Returns the version of Fierce.

xmlversion()

Returns the xml version.

Fierce::Parser::Domain

This object contains the information for a domain.

domain()

Returns the domain name.

Fierce::Parser::Node

This object contains the information for a node. A Node is a simplistic object containing information about a device found during a Fierce scan. Many of the Fierce modules use a Node to represent the a device.

ip()

Returns the ip address of the node.

hostname()

Returns the hostname of the node.

type()

Return the type of the node.

Fierce::Parser::ZoneTransferResult

This Object contains the information for a zone transfer request.

domain

Returns the domain being tested.

name_server

Returns the name_server being tested.

bool

Returns 1 or 0 if a zone transfer exists. 1=true and 0=false.

raw_output

Returns the raw output of a axfr request.

nodes

Returns an ArrayRef containing Node Objects.

Fierce::Parser::Domain::NameServers

This object contains the Nameserver Information about the Domain.

startscan()

Returns the start time of the scan in unixtime format.

startscanstr()

Returns the start time of the scan in a readable string.

endscan()

Returns the end time of the scan in unixtime format.

endscanstr()

Returns the end time of the scan in a readable string.

elapsedtime()

Returns the elapsed time of the scan.

nodes()

Returns an Arrayref containing Node Objects.

EXAMPLE

 my $name_servers = $domain->name_servers;

 foreach my $i ( @{ $name_servers->nodes } ) {
     print "\thostname:" . "\t" . $i->hostname . "\n";
     print "\tip:" . "\t\t" . $i->ip . "\n";
 }   

Fierce::Parser::Domain::ZoneTransfer

This object contains the Zone Transfer information.

startscan()

Returns the start time of the scan in unixtime format.

startscanstr()

Returns the start time of the scan in a readable string.

endscan()

Returns the end time of the scan in unixtime format.

endscanstr()

Returns the end time of the scan in a readable string.

elapsedtime()

Returns the elapsed time of the scan.

result()

Returns an ArrayRef containing ZoneTransferResult objects.

EXAMPLE

 my $name_servers = $domain->name_servers;
 my $zone_transfers = $domain->zone_transfers;
 
 foreach my $i ( @{ $name_servers->nodes } ) {
     print "\tIP:" . "\t\t" . $i->ip . "\n";
     print "\tZone Transfer:" . "\t";
     foreach ( @{ $zone_transfers->result } ) {
         if ($i->hostname eq $_->name_server ) {
             if ($_->bool == 1) {
                print "Enabled\n";
                print "\n\tZone Trasfer Result:" . "\t";
                print "\t\t" . $_->raw_output  . "\n";
             }
             else {
                 print "Disabled\n";
             }
         }
      }
 } 

Fierce::Parser::Domain::Bruteforce

This object contains the Nodes found using Prefix Bruteforce.

startscan()

Returns the start time of the scan in unixtime format.

startscanstr()

Returns the start time of the scan in a readable string.

endscan()

Returns the end time of the scan in unixtime format.

endscanstr()

Returns the end time of the scan in a readable string.

elapsedtime()

Returns the elapsed time of the scan.

nodes()

Returns an ArrayRef containing Node objects.

EXAMPLE

 my $bruteforce = $domain->bruteforce;

 foreach ( @{ $bruteforce->nodes } ) {
     print "\tHostname:" . "\t" . $_->hostname . "\n";
     print "\tIP: " . "\t\t" . $_->ip . "\n";
 }

Fierce::Parser::Domain::ExtBruteForce

This object contains the Nodes found using Extension Bruteforce.

startscan()

Returns the start time of the scan in unixtime format.

startscanstr()

Returns the start time of the scan in a readable string.

endscan()

Returns the end time of the scan in unixtime format.

endscanstr()

Returns the end time of the scan in a readable string.

elapsedtime()

Returns the elapsed time of the scan.

nodes()

Returns an ArrayRef containing Node objects.

EXAMPLE

 my $ext_bruteforce = $domain->ext_bruteforce;

 foreach ( @{ $ext_bruteforce->nodes } ) {
     print "\thostname:" . "\t" . $_->hostname . "\n";
     print "\tip: " . "\t\t" . $_->ip . "\n";
 }

Fierce::Parser::Domain::ReverseLookups

This object contains the Nodes found using Reverse Lookups.

startscan()

Returns the start time of the scan in unixtime format.

startscanstr()

Returns the start time of the scan in a readable string.

endscan()

Returns the end time of the scan in unixtime format.

endscanstr()

Returns the end time of the scan in a readable string.

elapsedtime()

Returns the elapsed time of the scan.

nodes()

Returns an ArrayRef containing Node Objects.

EXAMPLE

 my $reverse_lookups = $domain->reverse_lookups;
 
 foreach ( @{ $reverse_lookups->nodes } ) {
    print "\thostname:" . "\t" . $_->hostname . "\n";
    print "\tip: " . "\t\t" . $_->ip . "\n";
 }

Fierce::Parser::Domain::WildCard

This object contains the Information about MX records found.

startscan()

Returns the start time of the scan in unixtime format.

startscanstr()

Returns the start time of the scan in a readable string.

endscan()

Returns the end time of the scan in unixtime format.

endscanstr()

Returns the end time of the scan in a readable string.

elapsedtime()

Returns the elapsed time of the scan.

Fierce::Parser::Domain::WhoisLookup

This object contains the Information about Whois lookups.

startscan()

Returns the start time of the scan in unixtime format.

startscanstr()

Returns the start time of the scan in a readable string.

endscan()

Returns the end time of the scan in unixtime format.

endscanstr()

Returns the end time of the scan in a readable string.

elapsedtime()

Returns the elapsed time of the scan.

EXAMPLE

 my $whois_lookup = $domain->whois_lookup;
 
 print "Whois:\n";
 foreach ( @{ $whois_lookup->result } ) {
     print "\tNetHandle:" . "\t" . $_->net_handle . "\n";
     print "\tNetRange: " . "\t" . $_->net_range . "\n";
 }
 print "\n";

Fierce::Parser::Domain::FindMX

This object contains Information about MX records found.

startscan()

Returns the start time of the scan in unixtime format.

startscanstr()

Returns the start time of the scan in a readable string.

endscan()

Returns the end time of the scan in unixtime format.

endscanstr()

Returns the end time of the scan in a readable string.

elapsedtime()

Returns the elapsed time of the scan.

EXAMPLE

 my $reverse_lookups = $domain->reverse_lookups;
 
 foreach ( @{ $findmx->result } ) {
     print "\tpreference:" . "\t" . $_->preference . "\n";
     print "\texchange: " . "\t" . $_->exchange . "\n";
 }
 

Fierce::Parser::Domain::Vhost

This object contains Information about Virtual Hosts found.

startscan()

Returns the start time of the scan in unixtime format.

startscanstr()

Returns the start time of the scan in a readable string.

endscan()

Returns the end time of the scan in unixtime format.

endscanstr()

Returns the end time of the scan in a readable string.

elapsedtime()

Returns the elapsed time of the scan.

nodes()

Returns an ArrayRef containing Node Objects.

EXAMPLE

 my $reverse_lookups = $domain->reverse_lookups;
 
 foreach ( @{ $vhost->nodes } ) {
    print "\thostname:" . "\t" . $_->hostname . "\n";
    print "\tip: " . "\t\t" . $_->ip . "\n";
 }

EXAMPLES

Here is an example of parsing an XML file using Fierce::Parser:

 use Fierce::Parser;
 my $fp = new Fierce::Parser;

 if (defined($ARGV[0])){
    my $file = $ARGV[0];
    my $parser = $fp->parse_file($file);
    my @nodes    = $parser->get_all_nodes();

    foreach my $n (@nodes){
        my $domain = $n;
        my $name_servers = $domain->name_servers;
        my $zone_transfers = $domain->zone_transfers;
        my $bruteforce = $domain->bruteforce;
        my $vhost = $domain->vhost;
        my $subdomain_bruteforce = $domain->subdomain_bruteforce;
        my $ext_bruteforce = $domain->ext_bruteforce;
        my $reverse_lookups = $domain->reverse_lookups;
        my $wildcard = $domain->wildcard;
        my $findmx = $domain->findmx;
        my $find_nearby = $domain->find_nearby;

        print "==== " . $n->domain . " ====\n";
        if ( $name_servers ) {
            print "Nameservers:\n";
            foreach my $i ( @{ $name_servers->nodes } ) {
                print "\tHostname:" . "\t" . $i->hostname . "\n";
                print "\tIP:" . "\t\t" . $i->ip . "\n";
                print "\tZone Transfer:" . "\t";
                foreach ( @{ $zone_transfers->result } ) {
                    if ($i->hostname eq $_->name_server ) {
                        if ($_->bool == 1) {
                            print "Enabled\n";
                            print "\n\tZone Trasfer Result:" . "\t";
                            print "\t\t" . $_->raw_output  . "\n";
                        }
                        else {
                            print "Disabled\n";
                    }
                }
            }   
            print "\n";
        }
        if ( $findmx ) {
            print "MX:\n";
            foreach ( @{ $findmx->result } ) {
                print "\tpreference:" . "\t" . $_->preference . "\n";
                print "\texchange: " . "\t" . $_->exchange . "\n";
            }   
            print "\n";
        }
        
        if ($bruteforce) {
            print "Prefix Bruteforce:\n";
            foreach ( @{ $bruteforce->nodes } ) {
                print "\tHostname:" . "\t" . $_->hostname . "\n";
                print "\tIP: " . "\t\t" . $_->ip . "\n";
            }
            print "\n";
        }
        if ($vhost) {
            print "Virtual Hosts:\n";
            foreach ( @{ $vhost->nodes } ) {
                print "\thostname:" . "\t" . $_->hostname . "\n";
                print "\tip: " . "\t\t" . $_->ip . "\n";
            }
            print "\n";
        }
        if ($ext_bruteforce){
            print "Extension Bruteforce:\n";
            foreach ( @{ $ext_bruteforce->nodes } ) {
                print "\thostname:" . "\t" . $_->hostname . "\n";
                print "\tip: " . "\t\t" . $_->ip . "\n";
            }
            print "\n";
        }
        if ($reverse_lookups){
            print "reverse lookup:\n";
            foreach ( @{ $reverse_lookups->nodes } ) {
                print "\thostname:" . "\t" . $_->hostname . "\n";
                print "\tip: " . "\t\t" . $_->ip . "\n";
            }
            print "\n";
        }
       
        if ($find_nearby){ 
            print "Find Nearby:\n";
            foreach ( @{ $find_nearby->ptrs } ) {
                print "\tPtrdname:" . "\t" . $_->ptrdname . "\n";
                print "\tIP: " . "\t\t" . $_->ip . "\n";
            }
        }
    }

 }
 else {
    print "Usage: $0 [fierce-xml]\n";
 }

SEE ALSO

 fierce, XML::LibXML and Object::InsideOut

AUTHOR

Joshua D. Abraham, <jabra AT spl0it DOT org>

COPYRIGHT AND LICENSE

Copyright 2009 Joshua D. Abraham. All rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.