-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathhack3270.py
More file actions
73 lines (63 loc) · 2.98 KB
/
hack3270.py
File metadata and controls
73 lines (63 loc) · 2.98 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
#!/usr/bin/env python3
"""
Hack3270 - The TN3270 Penetration Testing Toolkit
Main entry point for the hack3270 application.
"""
__author__ = 'Garland Glessner'
__license__ = "GPL-3.0"
import sys
import os
_here = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(_here, 'hackterm-core'))
sys.path.insert(0, os.path.join(_here, 'hack3270_libs'))
import gui
import libhack3270
import argparse
import logging
def main():
desc = 'Hack3270 - The TN3270 Penetration Testing Toolkit'
epilog = '''Example:
%(prog)s -n prod_lpar3 10.10.10.10 992 -l 31337 --proxy_ip 0.0.0.0 --debug
%(prog)s -o'''
arg_parser = argparse.ArgumentParser(description=desc,
usage='%(prog)s [options] IP PORT',
formatter_class=argparse.RawTextHelpFormatter,
epilog=epilog)
arg_parser.add_argument('-n', '--name', help='Project name (default: %(default)s)', default="pentest")
arg_parser.add_argument('-p', '--proxy_port', help='Local TN3270 proxy port (default: %(default)s)', default=3271)
arg_parser.add_argument('--proxy_ip', help="Local TN3270 proxy IP (default: %(default)s)", default="127.0.0.1")
arg_parser.add_argument('-t', '--tls', help="Enable TLS encryption for server connection (default: %(default)s)", action="store_true", default=False)
arg_parser.add_argument('-o', '--offline', help="Offline log analysis mode (default: %(default)s)", action="store_true", default=False)
arg_parser.add_argument('-d', '--debug', help="Print debugging statements (default: %(default)s)", action="store_const", dest="loglevel", const=logging.DEBUG, default=logging.WARNING)
arg_parser.add_argument("IP", nargs='?', help="TN3270 server IP address")
arg_parser.add_argument("PORT", nargs='?', help="TN3270 server port")
args = arg_parser.parse_args()
# Validate: IP and PORT are required unless in offline mode
if not args.offline and (args.IP is None or args.PORT is None):
arg_parser.error("IP and PORT are required unless using -o/--offline mode")
hack3270 = libhack3270.hack3270(
server_ip = args.IP,
server_port = args.PORT,
proxy_port=args.proxy_port,
proxy_ip=args.proxy_ip,
offline_mode = args.offline,
project_name = args.name,
loglevel=args.loglevel,
tls_enabled = args.tls,
logfile=None
)
# Launch PySide6 GUI
# The root and style parameters are kept for compatibility but not used
my_gui = gui.tkhack3270(None, None, hack3270, logfile=None, loglevel=args.loglevel)
if __name__ == '__main__':
try:
main()
except libhack3270.Hack3270Error as e:
print(f"\nError: {e}", file=sys.stderr)
sys.exit(1)
except KeyboardInterrupt:
print("\nInterrupted by user.")
sys.exit(0)
except Exception as e:
print(f"\nUnexpected error: {e}", file=sys.stderr)
sys.exit(1)