-
Notifications
You must be signed in to change notification settings - Fork 5
/
create_webserver_list.py
93 lines (76 loc) · 3.06 KB
/
create_webserver_list.py
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
#!/usr/bin/env python
"""
Create a webserver file with a url per line.
This script takes a csv file (created by nmap_to_csv.py) and builds a list of all of the servers that are running websites. It saves the output to a file that can be used by other scripts.
Usage
-----
python create_webserver_list.py /full/path/to/ports.csv /full/path/to/pentest/folder/
Parameters
----------
input : string
Required - Full path to ports.csv file (created by the nmap_to_csv.py script.)
output : string
Required - Full path to the output directory. The script will save the file to <output>/webservers.txt
Output
------
webservers.txt - created within the directory specified in output.
"""
import os
import logging
import argparse
from utils import utils
from utils import logging_config # noqa pylint: disable=unused-import
LOG = logging.getLogger("ptscripts.create_webserver_list")
def get_webserver_list(nmap_dict):
webservers = []
for host in nmap_dict:
if not host['service_name']:
continue
if host['service_name'] in ["http", "https"] or "200 OK" in host['get_request']:
# scheme
if host['service_tunnel'] == 'ssl' or host['service_name'] == 'https':
scheme = 'https'
else:
scheme = 'http'
# if scheme is http and it is not on port 80, add port info.
if scheme == 'http' and str(host['port']) != '80':
port = ":" + str(host['port'])
# if scheme is https and it is not on port 443, add port info.
elif scheme == 'https' and str(host['port']) != '443':
port = ":" + str(host["port"])
# scheme is http and port is 80 or scheme is https and port is 443.
else:
port = ""
formatted_url = scheme + "://" + host['ipv4'] + port + '/'
LOG.debug("Adding url: {}".format(formatted_url))
webservers.append(formatted_url)
return webservers
def main(args):
LOG.info("Starting to extract urls from {}".format(args.input))
hosts = utils.csv_to_dict(args.input)
webservers = get_webserver_list(hosts)
output_file = os.path.join(args.output, "webservers.txt")
LOG.info("Found {} urls.".format(len(webservers)))
LOG.info("Writing urls to {}".format(output_file))
with open(output_file, 'w') as f:
for webserver in webservers:
f.write(webserver + '\r\n')
def parse_args(args):
parser = argparse.ArgumentParser(
parents=[utils.parent_argparser()],
description='Extract URLs from ports.csv to a file.',
)
parser.add_argument('input', help="full path to ports.csv file.")
parser.add_argument('output', help="full path to where the 'webservers.txt' file will be saved.")
args = parser.parse_args(args)
logger = logging.getLogger("ptscripts")
if args.quiet:
logger.setLevel('ERROR')
elif args.verbose:
logger.setLevel('DEBUG')
else:
logger.setLevel('INFO')
return args
if __name__ == '__main__':
import sys
main(parse_args(sys.argv[1:]))