diff --git a/discover.go b/discover.go index e306a51..fc53f38 100644 --- a/discover.go +++ b/discover.go @@ -114,11 +114,19 @@ func NmapParseResults(nmapResultFilePath string) ([]Stream, error) { if err != nil { continue } - streams = append(streams, Stream{ - Device: port.Service.Product, - Address: host.Address.Addr, - Port: port.PortID, - }) + + for _, addr := range host.Addresses { + err = validate.Struct(addr) + if err != nil { + continue + } + + streams = append(streams, Stream{ + Device: port.Service.Product, + Address: addr.Addr, + Port: port.PortID, + }) + } } } diff --git a/discover_test.go b/discover_test.go index d0b4573..ab65a97 100644 --- a/discover_test.go +++ b/discover_test.go @@ -107,6 +107,12 @@ func TestNmapParseResults(t *testing.T) { Port: 1337, } + invalidStreamMACAddress := Stream{ + Device: "invalidDevice", + Address: "00:12:16:FB:02:17", + Port: 1337, + } + testCases := []struct { fileExists bool streamsXML *nmapResult @@ -121,9 +127,11 @@ func TestNmapParseResults(t *testing.T) { streamsXML: &nmapResult{ Hosts: []host{ { - Address: address{ - Addr: validStream1.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: validStream1.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -141,9 +149,11 @@ func TestNmapParseResults(t *testing.T) { }, }, { - Address: address{ - Addr: validStream2.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: validStream2.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -165,6 +175,38 @@ func TestNmapParseResults(t *testing.T) { fileExists: true, }, // File exists + // Invalid stream, only a mac address + { + fileExists: true, + expectedStreams: []Stream{}, + streamsXML: &nmapResult{ + Hosts: []host{ + { + Addresses: []address{ + address{ + Addr: invalidStreamMACAddress.Address, + AddrType: "mac", + }, + }, + Ports: ports{ + Ports: []port{ + { + PortID: invalidStreamMACAddress.Port, + State: state{ + State: "open", + }, + Service: service{ + Name: "rtsp", + Product: invalidStreamMACAddress.Device, + }, + }, + }, + }, + }, + }, + }, + }, + // File exists // Two invalid targets, no error { fileExists: true, @@ -172,9 +214,11 @@ func TestNmapParseResults(t *testing.T) { streamsXML: &nmapResult{ Hosts: []host{ { - Address: address{ - Addr: invalidStreamNoAddress.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: invalidStreamNoAddress.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -192,9 +236,11 @@ func TestNmapParseResults(t *testing.T) { }, }, { - Address: address{ - Addr: invalidStreamNoPort.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: invalidStreamNoPort.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -226,9 +272,11 @@ func TestNmapParseResults(t *testing.T) { streamsXML: &nmapResult{ Hosts: []host{ { - Address: address{ - Addr: "Camera with closed ports", - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: "Camera with closed ports", + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -246,9 +294,11 @@ func TestNmapParseResults(t *testing.T) { }, }, { - Address: address{ - Addr: "Camera with closed ports", - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: "Camera with closed ports", + AddrType: "ipv4", + }, }, }, }, @@ -314,6 +364,9 @@ func TestNmapParseResults(t *testing.T) { } } assert.Equal(t, true, foundStream, "wrong streams parsed") + if foundStream == false { + fmt.Printf("%+v\n", results) + } } } assert.Equal(t, len(test.expectedStreams), len(results), "wrong streams parsed") @@ -366,9 +419,11 @@ func TestDiscover(t *testing.T) { streamsXML: &nmapResult{ Hosts: []host{ { - Address: address{ - Addr: validStream1.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: validStream1.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -386,9 +441,11 @@ func TestDiscover(t *testing.T) { }, }, { - Address: address{ - Addr: validStream2.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: validStream2.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -420,9 +477,11 @@ func TestDiscover(t *testing.T) { streamsXML: &nmapResult{ Hosts: []host{ { - Address: address{ - Addr: validStream1.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: validStream1.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -440,9 +499,11 @@ func TestDiscover(t *testing.T) { }, }, { - Address: address{ - Addr: validStream2.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: validStream2.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -477,9 +538,11 @@ func TestDiscover(t *testing.T) { streamsXML: &nmapResult{ Hosts: []host{ { - Address: address{ - Addr: validStream1.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: validStream1.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -497,9 +560,11 @@ func TestDiscover(t *testing.T) { }, }, { - Address: address{ - Addr: validStream2.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: validStream2.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -533,9 +598,11 @@ func TestDiscover(t *testing.T) { streamsXML: &nmapResult{ Hosts: []host{ { - Address: address{ - Addr: invalidStreamNoAddress.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: invalidStreamNoAddress.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -553,9 +620,11 @@ func TestDiscover(t *testing.T) { }, }, { - Address: address{ - Addr: invalidStreamNoPort.Address, - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: invalidStreamNoPort.Address, + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -597,9 +666,11 @@ func TestDiscover(t *testing.T) { streamsXML: &nmapResult{ Hosts: []host{ { - Address: address{ - Addr: "Camera with closed ports", - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: "Camera with closed ports", + AddrType: "ipv4", + }, }, Ports: ports{ Ports: []port{ @@ -617,9 +688,11 @@ func TestDiscover(t *testing.T) { }, }, { - Address: address{ - Addr: "Camera with closed ports", - AddrType: "ipv4", + Addresses: []address{ + address{ + Addr: "Camera with closed ports", + AddrType: "ipv4", + }, }, }, }, diff --git a/xml_models.go b/xml_models.go index fd105db..33bffe5 100644 --- a/xml_models.go +++ b/xml_models.go @@ -10,16 +10,16 @@ type nmapResult struct { // Host represents a host discovered during a scan type host struct { - XMLName xml.Name `xml:"host"` - Address address `xml:"address"` - Ports ports `xml:"ports"` + XMLName xml.Name `xml:"host"` + Addresses []address `xml:"address"` + Ports ports `xml:"ports"` } // Address is a host's address discovered during a scan type address struct { XMLName xml.Name `xml:"address"` Addr string `xml:"addr,attr"` - AddrType string `xml:"addrType,attr"` + AddrType string `xml:"addrType,attr" validate:"eq=ipv4|eq=ipv6"` } // Ports is the list of openned ports on a host