def init_audit_parser(parser: ModuleParser) -> None: subparsers = parser.add_subparsers(title='Available commands', dest="subparser_name", metavar='audit-command') subparsers.required = True parser_check_publickey = subparsers.add_parser( 'check-publickey', help='checks a username and publickey against a server') parser_check_publickey.add_argument('--host', type=str, required=True, help='Hostname or IP address') parser_check_publickey.add_argument('--port', type=int, default=22, help='port (default: 22)') parser_check_publickey.add_argument('--username', type=str, required=True, help='username to check') parser_check_publickey.add_argument('--public-key', type=str, required=True, help='publickey to check') parser_check_privatekey = subparsers.add_parser( 'check-privatekey', help='checks a username and privatekey against a server') parser_check_privatekey.add_argument('--host', type=str, required=True, help='Hostname or IP address') parser_check_privatekey.add_argument('--port', type=int, default=22, help='port (default: 22)') parser_check_privatekey.add_argument('--username', type=str, required=True, help='username to check') parser_check_privatekey.add_argument('--private-key', type=str, required=True, help='privatekey to check') parser_check_privatekey.add_argument( '--private-key-passphrase', type=str, help='used to decrypt the private key') parser_scan_auth = subparsers.add_parser( 'get-auth', help='checks authentication methods') parser_scan_auth.add_argument('--host', type=str, required=True, help='Hostname or IP address') parser_scan_auth.add_argument('--port', type=int, default=22, help='port (default: 22)')
def main() -> None: if os.environ.get('APPIMAGE', None): # if running as appimage, remove empty arguments if len(sys.argv) == 2 and sys.argv[-1] == '': sys.argv = sys.argv[:-1] parser = ModuleParser( description='SSH-MITM Tools', version=f"SSH-MITM {ssh_mitm_version}", modules_from_file=True, allow_abbrev=False ) parser.add_argument( '-d', '--debug', dest='debug', default=False, action='store_true', help='More verbose output of status information' ) parser.add_argument( '--paramiko-log-level', dest='paramiko_log_level', default='warning', choices=['warning', 'info', 'debug'], help='set paramikos log level' ) parser.add_argument( '--disable-workarounds', dest='disable_workarounds', action='store_true', help='disable paramiko workarounds' ) subparsers = parser.add_subparsers(title='Available commands', dest="subparser_name", metavar='subcommand') subparsers.required = True parser_mitm_server: ModuleParser = cast( ModuleParser, subparsers.add_parser( 'server', allow_abbrev=False, help='start the ssh-mitm server' ) ) init_server_parser(parser_mitm_server) parser_audit: ModuleParser = cast( ModuleParser, subparsers.add_parser( 'audit', allow_abbrev=False, help='audit tools for ssh servers' ) ) init_audit_parser(parser_audit) args = parser.parse_args() root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG if args.debug else logging.INFO) root_logger.handlers.clear() root_logger.addHandler(RichHandler( highlighter=NullHighlighter(), markup=False, rich_tracebacks=True, enable_link_path=args.debug, show_path=args.debug )) if not args.disable_workarounds: Transport.run = dropbear.transport_run # type: ignore if args.paramiko_log_level == 'debug': logging.getLogger("paramiko").setLevel(logging.DEBUG) elif args.paramiko_log_level == 'info': logging.getLogger("paramiko").setLevel(logging.INFO) else: logging.getLogger("paramiko").setLevel(logging.WARNING) if args.subparser_name == 'server': run_server(args=args) elif args.subparser_name == 'audit': run_audit(args=args)