2525import shlex
2626import subprocess
2727import sys
28- from nmap3 .utils import get_nmap_path
2928import simplejson as json
3029import argparse
31- from nmap3 .nmapparser import NmapCommandParser
3230from xml .etree import ElementTree as ET
3331from xml .etree .ElementTree import ParseError
3432from nmap3 .exceptions import NmapNotInstalledError , NmapXMLParserError
33+ from nmap3 .nmapparser import NmapCommandParser
34+ from nmap3 .utils import get_nmap_path , user_is_root
35+
3536import xml
3637
3738__author__ = 'Wangolo Joel ([email protected] )' 3839__version__ = '1.4.7'
39- __last_modification__ = '2020/08/01 '
40+ __last_modification__ = '2020/12/10 '
4041OS_TYPE = sys .platform
4142
4243class Nmap (object ):
@@ -101,22 +102,20 @@ def nmap_version(self):
101102 return version_data
102103
103104 # Unique method for repetitive tasks - Use of 'target' variable instead of 'host' or 'subnet' - no need to make difference between 2 strings that are used for the same purpose
104- def scan_command (self , target , arg , args ):
105+ def scan_command (self , target , arg , args = None ):
105106 self .target == target
106107
107108 command_args = "{target} {default}" .format (target = target , default = arg )
108- scan_command = self .default_command () + command_args
109+ scancommand = self .default_command () + command_args
109110 if (args ):
110- scan_command += " {0}" .format (args )
111-
112- scan_shlex = shlex .split (scan_command )
113-
111+ scancommand += " {0}" .format (args )
112+
113+ scan_shlex = shlex .split (scancommand )
114114 output = self .run_command (scan_shlex )
115115 xml_root = self .get_xml_et (output )
116116
117117 return xml_root
118118
119-
120119 def scan_top_ports (self , target , default = 10 , args = None ):
121120 """
122121 Perform nmap's top ports scan
@@ -183,47 +182,45 @@ def nmap_version_detection(self, target, arg="-sV", args=None):
183182 nmap -oX - nmmapper.com --script dns-brute.nse
184183 """
185184 xml_root = self .scan_command (target = target , arg = arg , args = args )
186-
187- services = self .parser .version_parser (xml_root )
185+ services = self .parser .filter_top_ports (xml_root )
188186 return services
189187
190188 # Using of basic options for stealth scan
191-
189+ @ user_is_root
192190 def nmap_stealth_scan (self , target , arg = "-Pn -sZ" , args = None ):
193191 """
194192 nmap -oX - nmmapper.com -Pn -sZ
195193 """
196194 xml_root = self .scan_command (target = target , arg = arg , args = args )
197- self .top_ports = self .parser .filter_stealth_scan (xml_root )
195+ self .top_ports = self .parser .filter_top_ports (xml_root )
198196 return self .top_ports
199-
197+
200198 def nmap_detect_firewall (self , target , arg = "-sA" , args = None ): # requires root
201199 """
202200 nmap -oX - nmmapper.com -sA
203201 @ TODO
204202 """
205203 xml_root = self .scan_command (target = target , arg = arg , args = args )
206-
207204 # TODO
208205
206+ @user_is_root
209207 def nmap_os_detection (self , target , arg = "-O" , args = None ): # requires root
210208 """
211209 nmap -oX - nmmapper.com -O
212210 NOTE: Requires root
213211 """
214212 xml_root = self .scan_command (target = target , arg = arg , args = args )
215- os_identified = self .parser .os_identifier_parser (xml_root )
216- return os_identified
213+ results = self .parser .os_identifier_parser (xml_root )
214+ return results
217215
218216 def nmap_subnet_scan (self , target , arg = "-p-" , args = None ): # requires root
219217 """
220218 nmap -oX - nmmapper.com -p-
221219 NOTE: Requires root
222220 """
223-
224221 xml_root = self .scan_command (target = target , arg = arg , args = args )
225- subnet_discovered = self .parser .parse_nmap_subnetscan (xml_root )
226- return subnet_discovered
222+ results = self .parser .filter_top_ports (xml_root )
223+ return results
227224
228225 def nmap_list_scan (self , target , arg = "-sL" , args = None ): # requires root
229226 """
@@ -234,9 +231,8 @@ def nmap_list_scan(self, target, arg="-sL", args=None): # requires root
234231 """
235232 self .target = target
236233 xml_root = self .scan_command (target = target , arg = arg , args = args )
237-
238- hosts_discovered = self .parser .parse_nmap_listscan (xml_root )
239- return hosts_discovered
234+ results = self .parser .filter_top_ports (xml_root )
235+ return results
240236
241237 def run_command (self , cmd ):
242238 """
@@ -331,9 +327,8 @@ def nmap_fin_scan(self, target, args=None):
331327
332328 """
333329 xml_root = self .scan_command (self .fin_scan , target = target , args = args )
334-
335- fin_results = self .parser .parse_nmap_idlescan (xml_root )
336- return fin_results
330+ results = self .parser .filter_top_ports (xml_root )
331+ return results
337332
338333 def nmap_syn_scan (self , target , args = None ):
339334 """
@@ -343,10 +338,9 @@ def nmap_syn_scan(self, target, args=None):
343338 @cmd nmap -sS 192.168.178.1
344339 """
345340 xml_root = self .scan_command (self .sync_scan , target = target , args = args )
346-
347341 # Use the top_port_parser
348- self . top_ports = self .parser .filter_top_ports (xml_root )
349- return self . top_ports
342+ results = self .parser .filter_top_ports (xml_root )
343+ return results
350344
351345 def nmap_tcp_scan (self , target , args = None ):
352346 """
@@ -356,11 +350,9 @@ def nmap_tcp_scan(self, target, args=None):
356350 """
357351 if (args ):
358352 assert (isinstance (args , str )), "Expected string got {0} instead" .format (type (args ))
359-
360353 xml_root = self .scan_command (self .tcp_connt , target = target , args = args )
361-
362- tcp_results = self .parser .filter_top_ports (xml_root )
363- return tcp_results
354+ results = self .parser .filter_top_ports (xml_root )
355+ return results
364356
365357 def nmap_udp_scan (self , target , args = None ):
366358 """
@@ -370,11 +362,9 @@ def nmap_udp_scan(self, target, args=None):
370362 """
371363 if (args ):
372364 assert (isinstance (args , str )), "Expected string got {0} instead" .format (type (args ))
373-
374365 xml_root = self .scan_command (self .udp_scan , target = target , args = args )
375-
376- tcp_results = self .parser .filter_top_ports (xml_root )
377- return tcp_results
366+ results = self .parser .filter_top_ports (xml_root )
367+ return results
378368
379369 def nmap_ping_scan (self , target , args = None ):
380370 """
@@ -383,9 +373,8 @@ def nmap_ping_scan(self, target, args=None):
383373 @cmd nmap -sP 192.168.178.1
384374 """
385375 xml_root = self .scan_command (self .ping_scan , target = target , args = args )
386-
387- ping_results = self .parser .parse_nmap_pingscan (xml_root )
388- return ping_results
376+ results = self .parser .filter_top_ports (xml_root )
377+ return results
389378
390379 def nmap_idle_scan (self , target , args = None ):
391380 """
@@ -394,9 +383,8 @@ def nmap_idle_scan(self, target, args=None):
394383 @cmd nmap -sL 192.168.178.1
395384 """
396385 xml_root = self .scan_command (self .idle_scan , target = target , args = args )
397-
398- idle_results = self .parser .parse_nmap_pingscan (xml_root )
399- return idle_results
386+ results = self .parser .filter_top_ports (xml_root )
387+ return results
400388
401389class NmapHostDiscovery (Nmap ):
402390 """
@@ -451,9 +439,8 @@ def nmap_portscan_only(self, target, args=None):
451439 @cmd nmap -Pn 192.168.178.1
452440 """
453441 xml_root = self .scan_command (self .port_scan_only , target = target , args = args )
454-
455- tcp_results = self .parser .filter_top_ports (xml_root )
456- return tcp_results
442+ results = self .parser .filter_top_ports (xml_root )
443+ return results
457444
458445 def nmap_no_portscan (self , target , args = None ):
459446 """
@@ -464,37 +451,30 @@ def nmap_no_portscan(self, target, args=None):
464451 if (args ):
465452 assert (isinstance (args , str )), "Expected string got {0} instead" .format (type (args ))
466453 xml_root = self .scan_command (self .no_port_scan , target = target , args = args )
467-
468- tcp_results = self .parser .parse_noportscan (xml_root )
469- return tcp_results
454+ results = self .parser .filter_top_ports (xml_root )
455+ return results
470456
471457 def nmap_arp_discovery (self , target , args = None ):
472458 """
473459 Scan target using the nmap tcp connect
474-
475460 @cmd nmap -PR 192.168.178.1
476461 """
477462 if (args ):
478463 assert (isinstance (args , str )), "Expected string got {0} instead" .format (type (args ))
479-
480464 xml_root = self .scan_command (self .arp_discovery , target = target , args = args )
481-
482- tcp_results = self .parser .filter_top_ports (xml_root )
483- return tcp_results
465+ results = self .parser .filter_top_ports (xml_root )
466+ return results
484467
485468 def nmap_disable_dns (self , target , args = None ):
486469 """
487470 Scan target using the nmap tcp connect
488-
489471 @cmd nmap -n 192.168.178.1
490472 """
491473 if (args ):
492474 assert (isinstance (args , str )), "Expected string got {0} instead" .format (type (args ))
493-
494475 xml_root = self .scan_command (self .disable_dns , target = target , args = args )
495-
496- tcp_results = self .parser .filter_top_ports (xml_root )
497- return tcp_results
476+ results = self .parser .filter_top_ports (xml_root )
477+ return results
498478
499479class NmapScripts (Nmap ):
500480 """
@@ -507,6 +487,6 @@ class NmapScripts(Nmap):
507487 parser .add_argument ('-d' , '--d' , help = 'Help' , required = True )
508488 args = parser .parse_args ()
509489
510- nmap = NmapHostDiscovery ()
511- result = nmap .nmap_no_portscan (args .d )
490+ nmap = Nmap ()
491+ result = nmap .nmap_os_detection (args .d )
512492 print (json .dumps (result , indent = 4 , sort_keys = True ))
0 commit comments