Probleme Nmap XML Scan auszulesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
naseweis
User
Beiträge: 2
Registriert: Freitag 24. September 2021, 19:53

Hallo Leute,

bin noch ziemlich frisch was Python angeht. Ich habe zwei Nmap Scans in jeweils eine XML gepackt und moechte diese Vergleichen. Es geht darum welche Mac Adressen NICHT in beiden Scans vorkommen.

Ich habe jetzt aber schon beim auslesen der ersten das Problem das er mir den Fehler ausgibt:

Code: Alles auswählen

02:10:18:09:E0:DC
7C:8B:CA:17:6D:28
Traceback (most recent call last):
  File "/home/naseweis/Documents/Nmap/compare.py", line 17, in <module>
    mac=adress[1].attributes["addr"]
IndexError: list index out of range
Er gibt mir die ersten beiden Mac Adressen richtig aus. Da Nmap aber die eigene Adresse ohne Mac Adresse speichert (also nur IP). Fehlt die Zeile soert und es kommt zur besagter Fehlermeldung
Ich weiss warum der Fehler auftritt aber leider nicht wie ich das im Code loesen soll. Ware toll wenn ihr mir helft. Denke das Problem liegt darin, das ich hier

Code: Alles auswählen

mac=adress[1].attributes["addr"]
das ganze statisch anspreche. Ich weiss aber leider nicht wie ich das schoen loesen kann.

Code: Alles auswählen

# Compare 2 Scans
from xml.dom import minidom

xmldoc1=minidom.parse("file.xml")
hosts=xmldoc1.getElementsByTagName('host')

for host in hosts:
	adress=host.getElementsByTagName("address")
	if adress:
		mac=adress[1].attributes["addr"]
		MAC=mac.value
		print("%s"%(MAC))
		



file.xml

Code: Alles auswählen

?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl" type="text/xsl"?>
<!-- Nmap 7.91 scan initiated Fri Sep 24 17:22:47 2021 as: nmap -sn -oX ./Documents/Nmap/file.xml 192.168.0.0/24 -->
<nmaprun scanner="nmap" args="nmap -sn -oX ./Documents/Nmap/file.xml 192.168.0.0/24" start="1632500567" startstr="Fri Sep 24 17:22:47 2021" version="7.91" xmloutputversion="1.05">
<verbose level="0"/>
<debugging level="0"/>
<host><status state="up" reason="arp-response" reason_ttl="0"/>
<address addr="192.168.0.1" addrtype="ipv4"/>
<address addr="02:10:18:09:E0:DC" addrtype="mac"/>
<hostnames>
<hostname name="kabelbox" type="PTR"/>
</hostnames>
<times srtt="10411" rttvar="8438" to="100000"/>
</host>
<host><status state="up" reason="arp-response" reason_ttl="0"/>
<address addr="192.168.0.28" addrtype="ipv4"/>
<address addr="7C:8B:CA:17:6D:28" addrtype="mac" vendor="Tp-link Technologies"/>
<hostnames>
<hostname name="DESKTOP-2A5NKMC" type="PTR"/>
</hostnames>
<times srtt="256230" rttvar="256230" to="1281150"/>
</host>
<host><status state="up" reason="arp-response" reason_ttl="0"/>
<address addr="192.168.0.90" addrtype="ipv4"/>
<address addr="7C:0B:C6:40:B2:B0" addrtype="mac" vendor="Samsung Electronics"/>
<hostnames>
<hostname name="android-e857b307fef24a39" type="PTR"/>
</hostnames>
<times srtt="184769" rttvar="161219" to="829645"/>
</host>
<runstats><finished time="1632500571" timestr="Fri Sep 24 17:22:51 2021" summary="Nmap done at Fri Sep 24 17:22:51 2021; 256 IP addresses (4 hosts up) scanned in 4.39 seconds" elapsed="4.39" exit="success"/><hosts up="4" down="252" total="256"/>
</runstats>
</nmaprun>
Danke fuer die Hilfe
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naseweis: Was soll denn die 1 da? Bei den Hosts hast Du es doch auch geschafft ohne feste Indexwerte über alle Hosts zu gehen.

`minidom` verwendet übrigens niemand, das ist superhässliche Java-Kacke.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das ganze mit dem `lxml`-Package. Das kann XPath:

Code: Alles auswählen

#!/usr/bin/env python3
from lxml import etree


def main():
    mac_addresses = etree.parse("test.xml").xpath(
        "./host/address[@addrtype='mac']/@addr"
    )
    print(mac_addresses)


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
naseweis
User
Beiträge: 2
Registriert: Freitag 24. September 2021, 19:53

Danke fuer die Antwort. Das hat fuer mich aber so nicht funktioniert. Er meckert das er lxml nicht importieren kann. Habe das dann auf xml geaendert und da findet dann etree.parse nicht.

Ich habe das ganze jetzt so geloest

Code: Alles auswählen


for host in hosts:
	adress=host.getElementsByTagName("address")
	
	if len(adress) > 1:  
	
		mac=adress[1].attributes["addr"]
		MAC=mac.value
		maclist2.append(MAC)

Einfach abfragen das die Länge min 2 ist funktioniert.

Eine Frage habe ich aber dennoch ich moechte jetzt per cmd die Filenamen eingeben.

aber wenn ich

Code: Alles auswählen

file1=input("Filenamen eingeben:)
Wenn ich dort jetzt file.xml eingebe

Code: Alles auswählen

File "<string>", line 1, in <module>
AttributeError: type object 'file' has no attribute 'xml'
Wie kann ich das lösen?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

lxml muss man als extra Paket mit pip installieren.

Den Dateinamen so einzugeben ist ungewöhnlich und nervig. Man benutzt dafür Kommandozeilenargumente. Im einfachsten Fall einfach sys.argv[1]. Oder das Modul argparse.

Zu deinem Problem bitte den gesamten Code + die gesamte Fehlermeldung zeigen. Sonst ist das nicht nachvollziehbar.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naseweis: Das ist falsch was Du da mit der Länge und der festen 1 machst. Du willst nicht das zweite <address>-Element, sondern das/die vom Typ "mac". Das muss nicht an zweiter Stelle stehen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ganze geht auch ganz einfach mit dem in Python mitgelieferten ElementTree:

Code: Alles auswählen

import xml.etree.ElementTree as et

def main():
    doc = et.parse("test.xml")
    for mac_address in doc.findall("host/address[@addrtype='mac']"):
        print(mac_address.attrib['attr'])

if __name__ == "__main__":
    main()
Antworten