Skip to content

Commit a587d76

Browse files
committed
Major revamp,code cleaning Fixes issue #33 and #30 and #18. Improved parsing of custom args passed.
1 parent c3ed5cd commit a587d76

File tree

3 files changed

+163
-381
lines changed

3 files changed

+163
-381
lines changed

nmap3/nmap3.py

Lines changed: 42 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,19 @@
2525
import shlex
2626
import subprocess
2727
import sys
28-
from nmap3.utils import get_nmap_path
2928
import simplejson as json
3029
import argparse
31-
from nmap3.nmapparser import NmapCommandParser
3230
from xml.etree import ElementTree as ET
3331
from xml.etree.ElementTree import ParseError
3432
from nmap3.exceptions import NmapNotInstalledError, NmapXMLParserError
33+
from nmap3.nmapparser import NmapCommandParser
34+
from nmap3.utils import get_nmap_path, user_is_root
35+
3536
import 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'
4041
OS_TYPE = sys.platform
4142

4243
class 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

401389
class 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

499479
class 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

Comments
 (0)