mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 12:41:29 +00:00
Add nmaprun information to Ndiff output.
Patch by Daniel Miller.
This commit is contained in:
@@ -1,5 +1,8 @@
|
|||||||
# Nmap Changelog ($Id$); -*-text-*-
|
# Nmap Changelog ($Id$); -*-text-*-
|
||||||
|
|
||||||
|
o [Ndiff] Added nmaprun element information to the diff. [Daniel
|
||||||
|
Miller]
|
||||||
|
|
||||||
o Added a GKrellM service probe from Toni Ruottu.
|
o Added a GKrellM service probe from Toni Ruottu.
|
||||||
|
|
||||||
o [NSE] Removed the nmap.get_interface_link function, which was
|
o [NSE] Removed the nmap.get_interface_link function, which was
|
||||||
|
|||||||
@@ -73,6 +73,13 @@ version 0, which was rather different. -->
|
|||||||
|
|
||||||
<!ELEMENT scandiff (prescript | hostdiff | host | postscript | (a, b?) | b)*>
|
<!ELEMENT scandiff (prescript | hostdiff | host | postscript | (a, b?) | b)*>
|
||||||
|
|
||||||
|
<!ELEMENT nmaprun EMPTY>
|
||||||
|
<!ATTLIST nmaprun
|
||||||
|
scanner CDATA #REQUIRED
|
||||||
|
args CDATA #IMPLIED
|
||||||
|
start CDATA #IMPLIED
|
||||||
|
startstr CDATA #IMPLIED
|
||||||
|
version CDATA #REQUIRED>
|
||||||
|
|
||||||
<!ELEMENT prescript (script* | (a, b?) | b)>
|
<!ELEMENT prescript (script* | (a, b?) | b)>
|
||||||
<!ELEMENT postscript (script* | (a, b?) | b)>
|
<!ELEMENT postscript (script* | (a, b?) | b)>
|
||||||
@@ -127,6 +134,6 @@ version 0, which was rather different. -->
|
|||||||
|
|
||||||
<!ELEMENT hostscript (script | a | b)*>
|
<!ELEMENT hostscript (script | a | b)*>
|
||||||
|
|
||||||
<!ENTITY % diff-elem "(prescript | postscript | host | status | address | hostname | extraports* | port | state | service | script | os | osmatch* | hostscript)">
|
<!ENTITY % diff-elem "(nmaprun | prescript | postscript | host | status | address | hostname | extraports* | port | state | service | script | os | osmatch* | hostscript)">
|
||||||
<!ELEMENT a %diff-elem;>
|
<!ELEMENT a %diff-elem;>
|
||||||
<!ELEMENT b %diff-elem;>
|
<!ELEMENT b %diff-elem;>
|
||||||
|
|||||||
48
ndiff/ndiff
48
ndiff/ndiff
@@ -30,7 +30,9 @@ class Scan(object):
|
|||||||
container for a list of hosts. It also has utility methods to load itself
|
container for a list of hosts. It also has utility methods to load itself
|
||||||
from an Nmap XML file."""
|
from an Nmap XML file."""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
self.scanner = None
|
||||||
self.version = None
|
self.version = None
|
||||||
|
self.args = None
|
||||||
self.start_date = None
|
self.start_date = None
|
||||||
self.end_date = None
|
self.end_date = None
|
||||||
self.hosts = []
|
self.hosts = []
|
||||||
@@ -59,6 +61,21 @@ class Scan(object):
|
|||||||
finally:
|
finally:
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
def nmaprun_to_dom_fragment(self, document):
|
||||||
|
frag = document.createDocumentFragment()
|
||||||
|
elem = document.createElement(u"nmaprun")
|
||||||
|
if self.scanner is not None:
|
||||||
|
elem.setAttribute(u"scanner", self.scanner)
|
||||||
|
if self.args is not None:
|
||||||
|
elem.setAttribute(u"args", self.args)
|
||||||
|
if self.start_date is not None:
|
||||||
|
elem.setAttribute(u"start", "%d" % time.mktime(self.start_date.timetuple()))
|
||||||
|
elem.setAttribute(u"startstr", self.start_date.strftime("%a %b %d %H:%M:%S %Y"))
|
||||||
|
if self.version is not None:
|
||||||
|
elem.setAttribute(u"version", self.version)
|
||||||
|
frag.appendChild(elem)
|
||||||
|
return frag
|
||||||
|
|
||||||
class Host(object):
|
class Host(object):
|
||||||
"""A single host, with a state, addresses, host names, a dict mapping port
|
"""A single host, with a state, addresses, host names, a dict mapping port
|
||||||
specs to Ports, and a list of OS matches. Host states are strings, or None
|
specs to Ports, and a list of OS matches. Host states are strings, or None
|
||||||
@@ -383,11 +400,17 @@ class ScriptResult(object):
|
|||||||
|
|
||||||
def format_banner(scan):
|
def format_banner(scan):
|
||||||
"""Format a startup banner more or less like Nmap does."""
|
"""Format a startup banner more or less like Nmap does."""
|
||||||
parts = [u"Nmap"]
|
scanner = u"Nmap"
|
||||||
|
if scan.scanner is not None and scan.scanner != u"nmap":
|
||||||
|
scanner = scan.scanner
|
||||||
|
parts = [ scanner ]
|
||||||
if scan.version is not None:
|
if scan.version is not None:
|
||||||
parts.append(scan.version)
|
parts.append(scan.version)
|
||||||
|
parts.append(u"scan")
|
||||||
if scan.start_date is not None:
|
if scan.start_date is not None:
|
||||||
parts.append(u"at %s" % scan.start_date.strftime("%Y-%m-%d %H:%M"))
|
parts.append(u"initiated %s" % scan.start_date.strftime("%a %b %d %H:%M:%S %Y"))
|
||||||
|
if scan.args is not None:
|
||||||
|
parts.append(u"as: %s" % scan.args)
|
||||||
return u" ".join(parts)
|
return u" ".join(parts)
|
||||||
|
|
||||||
def print_script_result_diffs_text(title, script_results_a, script_results_b,
|
def print_script_result_diffs_text(title, script_results_a, script_results_b,
|
||||||
@@ -482,6 +505,16 @@ class ScanDiff(object):
|
|||||||
self.scan_a.post_script_results, self.scan_b.post_script_results,
|
self.scan_a.post_script_results, self.scan_b.post_script_results,
|
||||||
self.post_script_result_diffs)
|
self.post_script_result_diffs)
|
||||||
|
|
||||||
|
def nmaprun_to_dom_fragment(self, document):
|
||||||
|
frag = document.createDocumentFragment()
|
||||||
|
a_elem = document.createElement(u"a")
|
||||||
|
a_elem.appendChild(self.scan_a.nmaprun_to_dom_fragment(document))
|
||||||
|
frag.appendChild(a_elem)
|
||||||
|
b_elem = document.createElement(u"b")
|
||||||
|
b_elem.appendChild(self.scan_b.nmaprun_to_dom_fragment(document))
|
||||||
|
frag.appendChild(b_elem)
|
||||||
|
return frag
|
||||||
|
|
||||||
def print_xml(self, f = sys.stdout):
|
def print_xml(self, f = sys.stdout):
|
||||||
impl = xml.dom.minidom.getDOMImplementation()
|
impl = xml.dom.minidom.getDOMImplementation()
|
||||||
document = impl.createDocument(None, u"nmapdiff", None)
|
document = impl.createDocument(None, u"nmapdiff", None)
|
||||||
@@ -490,6 +523,15 @@ class ScanDiff(object):
|
|||||||
scandiff_elem = document.createElement(u"scandiff")
|
scandiff_elem = document.createElement(u"scandiff")
|
||||||
root.appendChild(scandiff_elem)
|
root.appendChild(scandiff_elem)
|
||||||
|
|
||||||
|
# nmaprun changes
|
||||||
|
if ( verbose or
|
||||||
|
self.scan_a.scanner != self.scan_b.scanner or
|
||||||
|
self.scan_a.version != self.scan_b.version or
|
||||||
|
self.scan_a.args != self.scan_b.args or
|
||||||
|
self.scan_a.start_date != self.scan_b.start_date or
|
||||||
|
self.scan_a.end_date != self.scan_b.end_date ):
|
||||||
|
scandiff_elem.appendChild(self.nmaprun_to_dom_fragment(document))
|
||||||
|
|
||||||
# prerule script changes.
|
# prerule script changes.
|
||||||
if len(self.pre_script_result_diffs) > 0 or verbose:
|
if len(self.pre_script_result_diffs) > 0 or verbose:
|
||||||
prescript_elem = document.createElement(u"prescript")
|
prescript_elem = document.createElement(u"prescript")
|
||||||
@@ -1052,6 +1094,8 @@ class NmapContentHandler(xml.sax.handler.ContentHandler):
|
|||||||
if attrs.has_key(u"start"):
|
if attrs.has_key(u"start"):
|
||||||
start_timestamp = int(attrs.get(u"start"))
|
start_timestamp = int(attrs.get(u"start"))
|
||||||
self.scan.start_date = datetime.datetime.fromtimestamp(start_timestamp)
|
self.scan.start_date = datetime.datetime.fromtimestamp(start_timestamp)
|
||||||
|
self.scan.scanner = attrs.get(u"scanner")
|
||||||
|
self.scan.args = attrs.get(u"args")
|
||||||
self.scan.version = attrs.get(u"version")
|
self.scan.version = attrs.get(u"version")
|
||||||
elif name == u"host":
|
elif name == u"host":
|
||||||
assert self.parent_element() == u"nmaprun"
|
assert self.parent_element() == u"nmaprun"
|
||||||
|
|||||||
@@ -48,6 +48,14 @@ class scan_test(unittest.TestCase):
|
|||||||
self.assertEqual(len(host.ports), 6)
|
self.assertEqual(len(host.ports), 6)
|
||||||
self.assertEqual(set(host.extraports.items()), set([("filtered", 95), ("open|filtered", 99)]))
|
self.assertEqual(set(host.extraports.items()), set([("filtered", 95), ("open|filtered", 99)]))
|
||||||
|
|
||||||
|
def test_nmaprun(self):
|
||||||
|
"""Test that nmaprun information is recorded."""
|
||||||
|
scan = Scan()
|
||||||
|
scan.load_from_file("test-scans/empty.xml")
|
||||||
|
self.assertEqual(scan.scanner, u"nmap")
|
||||||
|
self.assertEqual(scan.version, u"4.90RC2")
|
||||||
|
self.assertEqual(scan.args, u"nmap -oX empty.xml -p 1-100")
|
||||||
|
|
||||||
def test_addresses(self):
|
def test_addresses(self):
|
||||||
"""Test that addresses are recorded."""
|
"""Test that addresses are recorded."""
|
||||||
scan = Scan()
|
scan = Scan()
|
||||||
|
|||||||
Reference in New Issue
Block a user