SHOW:
|
|
- or go back to the newest paste.
1 | import requests | |
2 | import socket | |
3 | import sys | |
4 | import threading | |
5 | ||
6 | def getstatuscode(url): | |
7 | response = requests.head(url) | |
8 | code = response.status_code | |
9 | redirect = url | |
10 | code_and_redirect = [code,redirect] | |
11 | # follow redirects | |
12 | if (code >= 300 and code <= 302 ): | |
13 | redirect = response.headers['Location'] | |
14 | print('Got redirect to: ' + redirect) | |
15 | code_and_redirect = getstatuscode(redirect) | |
16 | return code_and_redirect; | |
17 | ||
18 | def knockport(ip,port): | |
19 | - | try: |
19 | + | try: |
20 | - | con = socket.socket().connect((ip,port)) |
20 | + | sock = socket.socket() |
21 | sock.settimeout(3) | |
22 | con = sock.connect((ip,port)) | |
23 | - | except: |
23 | + | |
24 | - | pass |
24 | + | |
25 | except: | |
26 | pass | |
27 | ||
28 | ||
29 | def multiknock(ip,ports): | |
30 | threads = list() | |
31 | for port in ports: | |
32 | # spawn threads | |
33 | thread = threading.Thread(target=knockport, args=(ip,port)) | |
34 | threads.append(thread) | |
35 | thread.start() | |
36 | ||
37 | for index, thread in enumerate(threads): | |
38 | # wait for threads to finish | |
39 | thread.join() | |
40 | ||
41 | ||
42 | ||
43 | def parse_additional_ports(str): | |
44 | tmp = str.split(',') | |
45 | #parse to int | |
46 | tmp_2 = [] | |
47 | for to_validate in tmp: | |
48 | try: | |
49 | tmp_2.append(int(to_validate)) | |
50 | except: | |
51 | print('Ignoriere ' + to_validate) | |
52 | return tmp_2 | |
53 | ||
54 | #common ports (ftp,ssh,telnet,smtp,dns,dhcp,pop3,imap,https,rdp) | |
55 | common_ports = [21,22,23,25,53,80,110,143,443,3389] | |
56 | ||
57 | url = str(input("Welche URL soll getestet werden? ")) | |
58 | ||
59 | ranged_scan = str(input("Soll ein ausführlicher Portscan ausgeführt werden? (y/N) ")) | |
60 | ||
61 | ||
62 | startport = 0 | |
63 | endport = 0 | |
64 | if ranged_scan == 'y': | |
65 | startport = int(input("Startport eingeben: ")) | |
66 | #todo: validate | |
67 | endport = int(input("Endport eingeben: ")) | |
68 | #todo: validate | |
69 | ||
70 | additional_ports_input = str(input('Gib hier weitere Ports ein, die du testen möchtest (kommaseparierte liste) ')) | |
71 | additional_ports = parse_additional_ports(additional_ports_input) | |
72 | ||
73 | # since we check for HTTP status codes, check if protocol is given | |
74 | if not url.startswith('http'): | |
75 | url = 'http://' + url | |
76 | print('Corrected input to: ' + url) | |
77 | ||
78 | #get the statuscode | |
79 | try: | |
80 | data = getstatuscode(url) | |
81 | except: | |
82 | print('Da lief etwas schief. War die URL korrekt?') | |
83 | sys.exit(42) | |
84 | ||
85 | final_url = data[1] | |
86 | ||
87 | if final_url != url: | |
88 | print('Finale URL nach Redirects: ' + final_url) | |
89 | ||
90 | code = data[0] | |
91 | ||
92 | print('Http Statuscode: ' + str(code)) | |
93 | ||
94 | # strip the protocol from the url and remove trailing slashes | |
95 | domain = final_url.split('//',1)[1].rstrip('/') | |
96 | ||
97 | # get domains ip | |
98 | ip = socket.gethostbyname(domain) | |
99 | print('IP: '+str(ip)) | |
100 | ||
101 | if ranged_scan == 'y': | |
102 | multiknock(ip,range(startport,endport+1)) | |
103 | else: | |
104 | multiknock(ip,common_ports) | |
105 | ||
106 | ||
107 | #additional ports | |
108 | multiknock(ip,additional_ports) |