Network mapper
Nmap --traceroute
nmap -sS -p22,80,443,445,8080 -oX network_one.xml --traceroute 192.168.0.0/20Setup Neo4J
dbms.security.auth_enabled=falseNmap XML to Neo4J
import sys, json
from xml.dom.minidom import parse
from neo4j import GraphDatabase
NEO4J_URL = "bolt://127.0.0.1:7687"
created = []
driver = GraphDatabase.driver(NEO4J_URL)
session = driver.session(database="neo4j")
def add_node(tx, data):
result = tx.run("CREATE (h:Host) SET h.address = $address RETURN id(h)", address=data['data']['id'])
return result.single()[0]
def add_nmap_results(tx, results):
address, proto, nr, state, service = results
tx.run("MATCH (h:Host {address: $address}) MERGE (h)-[:has_port]->(:Port {number: $nr, proto: $proto, service: $service, state: $state})", address=address, nr=nr, state=state, proto=proto, service=service)
def relate_nodes(tx, nodes):
first, last = nodes
tx.run("MATCH (src:Host {address: $first}), (dst:Host {address: $last}) MERGE (src)-[:connects_to]->(dst)", first=first, last=last)
src = "SRC"
data = {'data': {'id': src}}
id = session.execute_write(add_node, data)
def parse_elements(dom):
hosts = dom.getElementsByTagName('host')
for host in hosts:
address = host.getElementsByTagName('address')[0].getAttribute('addr')
print("Adding " + address)
data = {'data': {'id': address}}
id = session.execute_write(add_node, data)
created.append(address)
ports = host.getElementsByTagName('ports')[0]
for port in ports.getElementsByTagName('port'):
proto, nr = port.getAttribute('protocol'), port.getAttribute('portid')
state = port.getElementsByTagName('state')[0].getAttribute('state')
try: service = port.getElementsByTagName('service')[0].getAttribute('name')
except: service = ""
session.execute_write(add_nmap_results, (address, proto, nr, state, service))
try:
trace = host.getElementsByTagName('trace')[0]
hops = trace.getElementsByTagName('hop')
last = src
for hop in hops:
ip = hop.getAttribute('ipaddr')
if ip not in created:
data = {'data': {'id': ip}}
session.execute_write(add_node, data)
created.append(ip)
session.execute_write(relate_nodes, (last, ip))
last = ip
except:
pass
for arg in sys.argv[1:]:
dom = parse(arg)
parse_elements(dom)Converting to a interactive HTML

Bonus
Reference
Last updated
