Repository navigation
Expand file tree
/
Copy pathwebmap.py
More file actions
104 lines (87 loc) · 3.36 KB
/
Copy pathwebmap.py
File metadata and controls
104 lines (87 loc) · 3.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import os
import shlex
import subprocess
from datetime import datetime
class WebMap:
def __init__(self, cmd="/usr/bin/sudo"):
self.nmapcmd = cmd
self.dtstamp = datetime.now().strftime('%Y%m%d%H%M%S')
# ...
def build_command(self, form_data):
"""Constructs and sanitizes the nmap command flags from request data."""
host = form_data.get('host', '').strip()
if not host:
return None, "Error: No target host specified."
# Prepend 'nmap' as the first argument to sudo
args = ["/usr/bin/nmap"]
# Scan Type
scan_type = form_data.get('scan_type', 'connect')
scan_flags = {
'connect': '-sT',
'syn': '-sS',
'null': '-sN',
'fin': '-sF',
'xmas': '-sX',
'ack': '-sA',
'window': '-sW',
'ping': '-sP'
}
args.append(scan_flags.get(scan_type, '-sT'))
# Ping Type
ping_type = form_data.get('ping_type', 'tcp_icmp')
ping_flags = {
'tcp': '-PT',
'tcp_icmp': '-PB',
'icmp': '-PI',
'none': '-P0'
}
args.append(ping_flags.get(ping_type, '-PB'))
# General Options
if form_data.get('use_port') and form_data.get('port_range'):
args.extend(['-p', form_data.get('port_range').strip()])
if form_data.get('use_decoy') and form_data.get('decoy_name'):
args.extend(['-D', form_data.get('decoy_name').strip()])
if form_data.get('use_device') and form_data.get('device_name'):
args.extend(['-e', form_data.get('device_name').strip()])
if form_data.get('dont_resolve'): args.append('-n')
if form_data.get('fast_scan'): args.append('-F')
if form_data.get('verbose'): args.append('-v')
if form_data.get('udp_scan'): args.append('-sU')
if form_data.get('rpc_scan'): args.append('-sV')
if form_data.get('fragmentation'):args.append('-f')
if form_data.get('os_detect'): args.append('-O')
if form_data.get('ident_info'): args.append('-I')
# Host Flags & Target Host
if form_data.get('host_flags'):
args.extend(shlex.split(form_data.get('host_flags')))
args.append(host)
full_cmd = [self.nmapcmd] + args
return full_cmd, None
def stream_nmap(self, cmd_list, log=False):
"""Executes nmap and yields output streams line by line."""
cmd_str = ' '.join(shlex.quote(x) for x in cmd_list)
yield f"Command: {cmd_str}\n" + ("=" * 60) + "\n\n"
log_file = None
if log:
log_filename = f"nmap.{self.dtstamp}.log"
log_file = open(log_filename, 'a')
try:
process = subprocess.Popen(
cmd_list,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
bufsize=1
)
for line in iter(process.stdout.readline, ''):
if log_file:
log_file.write(line)
log_file.flush()
yield line
process.stdout.close()
process.wait()
except Exception as e:
yield f"\nExecution Error: {str(e)}\n"
finally:
if log_file:
log_file.close()