Write vm image added; tls-info python script added
This commit is contained in:
parent
ad5e17b2a6
commit
8de790d359
BIN
src/Images/Write your Own Virtual Machine.png
Normal file
BIN
src/Images/Write your Own Virtual Machine.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.9 MiB |
89
src/Python/Scripts/tls-info.py
Normal file
89
src/Python/Scripts/tls-info.py
Normal file
@ -0,0 +1,89 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
# Python imports
|
||||
import ssl
|
||||
import socket
|
||||
import argparse
|
||||
|
||||
# Lib imports
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
parser.add_argument("-f", "--file", help = "Specify input file with a list of hostnames to be checked", action = "store")
|
||||
parser.add_argument("-o", "--out", help = "Specify output file", action = "store")
|
||||
parser.add_argument("-d", "--domain", help = "Specify domain name of host to be checked", action = "store")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if (not args.domain and not args.file) or (args.domain and args.file):
|
||||
print("\nEither a single site's domain or a file containing sites must be used as input\n")
|
||||
parser.print_help()
|
||||
quit()
|
||||
|
||||
return args
|
||||
|
||||
|
||||
def process_ssl(host, args):
|
||||
hostname = host.strip()
|
||||
context = ssl.create_default_context()
|
||||
|
||||
with context.wrap_socket(socket.socket(), server_hostname = hostname) as sock:
|
||||
sock.settimeout(4)
|
||||
sock.connect((hostname, 443))
|
||||
ciphers = sock.shared_ciphers()
|
||||
selected_cipher = sock.cipher()
|
||||
cert = sock.getpeercert()
|
||||
|
||||
subject = dict(_[0] for _ in cert['subject'])
|
||||
issuer = dict(_[0] for _ in cert['issuer'])
|
||||
issued_to = subject['commonName']
|
||||
issued_by = issuer['commonName']
|
||||
not_before = cert['notBefore']
|
||||
not_after = cert['notAfter']
|
||||
|
||||
data = {
|
||||
"host": hostname,
|
||||
"issuer": {
|
||||
"org_name": issuer['organizationName'],
|
||||
"issued_by": issued_by
|
||||
},
|
||||
"subject": subject,
|
||||
"activation": not_before,
|
||||
"expiration": not_after,
|
||||
"common_name": issued_to,
|
||||
"selected_cipher": selected_cipher,
|
||||
"server_ciphers": str(ciphers)
|
||||
}
|
||||
|
||||
print(data)
|
||||
|
||||
if args.out:
|
||||
with open(args.out, "w+") as file:
|
||||
file.write(data)
|
||||
|
||||
|
||||
def main():
|
||||
args = parse_args()
|
||||
|
||||
if args.file:
|
||||
with open(args.file, "r") as file:
|
||||
hosts = file.readlines()
|
||||
|
||||
for host in hosts:
|
||||
try:
|
||||
process_ssl(host, args)
|
||||
except Exception:
|
||||
continue
|
||||
elif args.domain:
|
||||
process_ssl(args.domain, args)
|
||||
else:
|
||||
print("No input detected")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user