From 8c44455869756e422acea78aabb0ec3d914c138b Mon Sep 17 00:00:00 2001 From: Tib3rius <48113936+Tib3rius@users.noreply.github.com> Date: Sun, 12 Sep 2021 12:40:35 -0400 Subject: [PATCH] Reformatted code to be pip compatible. --- autorecon/{ => autorecon}/__init__.py | 0 autorecon/{ => autorecon}/config.py | 9 ++-- autorecon/{ => autorecon}/io.py | 0 autorecon/{ => autorecon}/plugins.py | 0 autorecon/{ => autorecon}/targets.py | 0 config.toml => autorecon/config.toml | 0 global.toml => autorecon/global.toml | 0 autorecon.py => autorecon/main.py | 27 +++++++--- {plugins => autorecon/plugins}/__init__.py | 0 {plugins => autorecon/plugins}/databases.py | 0 .../plugins}/default-port-scan.py | 0 {plugins => autorecon/plugins}/dns.py | 0 {plugins => autorecon/plugins}/ftp.py | 0 .../plugins}/guess-port-scan.py | 0 {plugins => autorecon/plugins}/http_server.py | 0 {plugins => autorecon/plugins}/kerberos.py | 0 {plugins => autorecon/plugins}/ldap.py | 0 {plugins => autorecon/plugins}/misc.py | 0 {plugins => autorecon/plugins}/nfs.py | 0 {plugins => autorecon/plugins}/rdp.py | 0 {plugins => autorecon/plugins}/redis.py | 0 {plugins => autorecon/plugins}/reporting.py | 0 {plugins => autorecon/plugins}/rpc.py | 0 {plugins => autorecon/plugins}/rsync.py | 0 {plugins => autorecon/plugins}/sip.py | 0 {plugins => autorecon/plugins}/smb.py | 0 {plugins => autorecon/plugins}/smtp.py | 0 {plugins => autorecon/plugins}/snmp.py | 0 {plugins => autorecon/plugins}/ssh.py | 0 {plugins => autorecon/plugins}/sslscan.py | 0 poetry.lock | 54 +++++++++++++++++++ pyproject.toml | 26 +++++++++ 32 files changed, 106 insertions(+), 10 deletions(-) rename autorecon/{ => autorecon}/__init__.py (100%) rename autorecon/{ => autorecon}/config.py (86%) rename autorecon/{ => autorecon}/io.py (100%) rename autorecon/{ => autorecon}/plugins.py (100%) rename autorecon/{ => autorecon}/targets.py (100%) rename config.toml => autorecon/config.toml (100%) rename global.toml => autorecon/global.toml (100%) rename autorecon.py => autorecon/main.py (98%) rename {plugins => autorecon/plugins}/__init__.py (100%) rename {plugins => autorecon/plugins}/databases.py (100%) rename {plugins => autorecon/plugins}/default-port-scan.py (100%) rename {plugins => autorecon/plugins}/dns.py (100%) rename {plugins => autorecon/plugins}/ftp.py (100%) rename {plugins => autorecon/plugins}/guess-port-scan.py (100%) rename {plugins => autorecon/plugins}/http_server.py (100%) rename {plugins => autorecon/plugins}/kerberos.py (100%) rename {plugins => autorecon/plugins}/ldap.py (100%) rename {plugins => autorecon/plugins}/misc.py (100%) rename {plugins => autorecon/plugins}/nfs.py (100%) rename {plugins => autorecon/plugins}/rdp.py (100%) rename {plugins => autorecon/plugins}/redis.py (100%) rename {plugins => autorecon/plugins}/reporting.py (100%) rename {plugins => autorecon/plugins}/rpc.py (100%) rename {plugins => autorecon/plugins}/rsync.py (100%) rename {plugins => autorecon/plugins}/sip.py (100%) rename {plugins => autorecon/plugins}/smb.py (100%) rename {plugins => autorecon/plugins}/smtp.py (100%) rename {plugins => autorecon/plugins}/snmp.py (100%) rename {plugins => autorecon/plugins}/ssh.py (100%) rename {plugins => autorecon/plugins}/sslscan.py (100%) create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/autorecon/__init__.py b/autorecon/autorecon/__init__.py similarity index 100% rename from autorecon/__init__.py rename to autorecon/autorecon/__init__.py diff --git a/autorecon/config.py b/autorecon/autorecon/config.py similarity index 86% rename from autorecon/config.py rename to autorecon/autorecon/config.py index d269aeb..0279d63 100644 --- a/autorecon/config.py +++ b/autorecon/autorecon/config.py @@ -1,4 +1,6 @@ -import os +import appdirs, os + +config_dir = appdirs.user_config_dir('AutoRecon') configurable_keys = [ 'ports', @@ -39,7 +41,8 @@ configurable_boolean_keys = [ config = { 'protected_classes': ['autorecon', 'target', 'service', 'commandstreamreader', 'plugin', 'portscan', 'servicescan', 'global', 'pattern'], - 'global_file': os.path.dirname(os.path.realpath(os.path.join(__file__, '..'))) + '/global.toml', + 'config_dir': config_dir, + 'global_file': os.path.join(config_dir, 'global.toml'), 'ports': None, 'max_scans': 50, 'max_port_scans': None, @@ -48,7 +51,7 @@ config = { 'port_scans': None, 'service_scans': None, 'reports': None, - 'plugins_dir': os.path.dirname(os.path.abspath(os.path.join(__file__, '..'))) + '/plugins', + 'plugins_dir': os.path.join(config_dir, 'plugins'), 'add_plugins_dir': None, 'outdir': 'results', 'single_target': False, diff --git a/autorecon/io.py b/autorecon/autorecon/io.py similarity index 100% rename from autorecon/io.py rename to autorecon/autorecon/io.py diff --git a/autorecon/plugins.py b/autorecon/autorecon/plugins.py similarity index 100% rename from autorecon/plugins.py rename to autorecon/autorecon/plugins.py diff --git a/autorecon/targets.py b/autorecon/autorecon/targets.py similarity index 100% rename from autorecon/targets.py rename to autorecon/autorecon/targets.py diff --git a/config.toml b/autorecon/config.toml similarity index 100% rename from config.toml rename to autorecon/config.toml diff --git a/global.toml b/autorecon/global.toml similarity index 100% rename from global.toml rename to autorecon/global.toml diff --git a/autorecon.py b/autorecon/main.py similarity index 98% rename from autorecon.py rename to autorecon/main.py index 950bb08..55afc6b 100644 --- a/autorecon.py +++ b/autorecon/main.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 -import argparse, asyncio, importlib, inspect, ipaddress, math, os, re, sys, signal, select, socket, termios, time, traceback, tty +import appdirs, argparse, asyncio, importlib, inspect, ipaddress, math, os, re, select, shutil, signal, socket, sys, termios, time, traceback, tty from datetime import datetime try: @@ -17,6 +17,16 @@ from autorecon.io import slugify, e, fformat, cprint, debug, info, warn, error, from autorecon.plugins import Pattern, PortScan, ServiceScan, Report, AutoRecon from autorecon.targets import Target, Service +def install(): + shutil.rmtree(config['config_dir'], ignore_errors=True) + os.makedirs(config['config_dir'], exist_ok=True) + shutil.copy(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'config.toml'), os.path.join(config['config_dir'], 'config.toml')) + shutil.copy(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'global.toml'), os.path.join(config['config_dir'], 'global.toml')) + shutil.copytree(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'plugins'), os.path.join(config['config_dir'], 'plugins')) + +if not os.path.exists(config['config_dir']): + install() + # Save current terminal settings so we can restore them. terminal_settings = termios.tcgetattr(sys.stdin.fileno()) @@ -711,15 +721,15 @@ async def scan_target(target): autorecon.completed_targets.append(target) autorecon.scanning_targets.remove(target) -async def main(): +async def run(): parser = argparse.ArgumentParser(add_help=False, description='Network reconnaissance tool to port scan and automatically enumerate services found on multiple targets.') parser.add_argument('targets', action='store', help='IP addresses (e.g. 10.0.0.1), CIDR notation (e.g. 10.0.0.1/24), or resolvable hostnames (e.g. foo.bar) to scan.', nargs='*') parser.add_argument('-t', '--targets', action='store', type=str, default='', dest='target_file', help='Read targets from file.') parser.add_argument('-p', '--ports', action='store', type=str, help='Comma separated list of ports / port ranges to scan. Specify TCP/UDP ports by prepending list with T:/U: To scan both TCP/UDP, put port(s) at start or specify B: e.g. 53,T:21-25,80,U:123,B:123. Default: %(default)s') parser.add_argument('-m', '--max-scans', action='store', type=int, help='The maximum number of concurrent scans to run. Default: %(default)s') parser.add_argument('-mp', '--max-port-scans', action='store', type=int, help='The maximum number of concurrent port scans to run. Default: 10 (approx 20%% of max-scans unless specified)') - parser.add_argument('-c', '--config', action='store', type=str, default=os.path.dirname(os.path.realpath(__file__)) + '/config.toml', dest='config_file', help='Location of AutoRecon\'s config file. Default: %(default)s') - parser.add_argument('-g', '--global-file', action='store', type=str, dest='global_file', help='Location of AutoRecon\'s global file. Default: ' + os.path.dirname(os.path.realpath(__file__)) + '/global.toml') + parser.add_argument('-c', '--config', action='store', type=str, default=os.path.join(config['config_dir'], 'config.toml'), dest='config_file', help='Location of AutoRecon\'s config file. Default: %(default)s') + parser.add_argument('-g', '--global-file', action='store', type=str, dest='global_file', help='Location of AutoRecon\'s global file. Default: ' + os.path.join(config['config_dir'], 'global.toml')) parser.add_argument('--tags', action='store', type=str, default='default', help='Tags to determine which plugins should be included. Separate tags by a plus symbol (+) to group tags together. Separate groups with a comma (,) to create multiple groups. For a plugin to be included, it must have all the tags specified in at least one group. Default: %(default)s') parser.add_argument('--exclude-tags', action='store', type=str, default='', metavar='TAGS', help='Tags to determine which plugins should be excluded. Separate tags by a plus symbol (+) to group tags together. Separate groups with a comma (,) to create multiple groups. For a plugin to be excluded, it must have all the tags specified in at least one group. Default: %(default)s') parser.add_argument('--port-scans', action='store', type=str, metavar='PLUGINS', help='Override --tags / --exclude-tags for the listed PortScan plugins (comma separated). Default: %(default)s') @@ -753,7 +763,7 @@ async def main(): autorecon.argparse = parser if args.version: - print('AutoRecon v2.0-beta3') + print('AutoRecon v2.0') sys.exit(0) # Parse config file and args for global.toml first. @@ -1368,12 +1378,15 @@ async def main(): # Restore original terminal settings. termios.tcsetattr(sys.stdin, termios.TCSADRAIN, terminal_settings) -if __name__ == '__main__': +def main(): # Capture Ctrl+C and cancel everything. signal.signal(signal.SIGINT, cancel_all_tasks) try: - asyncio.run(main()) + asyncio.run(run()) except asyncio.exceptions.CancelledError: pass except RuntimeError: pass + +if __name__ == '__main__': + main() diff --git a/plugins/__init__.py b/autorecon/plugins/__init__.py similarity index 100% rename from plugins/__init__.py rename to autorecon/plugins/__init__.py diff --git a/plugins/databases.py b/autorecon/plugins/databases.py similarity index 100% rename from plugins/databases.py rename to autorecon/plugins/databases.py diff --git a/plugins/default-port-scan.py b/autorecon/plugins/default-port-scan.py similarity index 100% rename from plugins/default-port-scan.py rename to autorecon/plugins/default-port-scan.py diff --git a/plugins/dns.py b/autorecon/plugins/dns.py similarity index 100% rename from plugins/dns.py rename to autorecon/plugins/dns.py diff --git a/plugins/ftp.py b/autorecon/plugins/ftp.py similarity index 100% rename from plugins/ftp.py rename to autorecon/plugins/ftp.py diff --git a/plugins/guess-port-scan.py b/autorecon/plugins/guess-port-scan.py similarity index 100% rename from plugins/guess-port-scan.py rename to autorecon/plugins/guess-port-scan.py diff --git a/plugins/http_server.py b/autorecon/plugins/http_server.py similarity index 100% rename from plugins/http_server.py rename to autorecon/plugins/http_server.py diff --git a/plugins/kerberos.py b/autorecon/plugins/kerberos.py similarity index 100% rename from plugins/kerberos.py rename to autorecon/plugins/kerberos.py diff --git a/plugins/ldap.py b/autorecon/plugins/ldap.py similarity index 100% rename from plugins/ldap.py rename to autorecon/plugins/ldap.py diff --git a/plugins/misc.py b/autorecon/plugins/misc.py similarity index 100% rename from plugins/misc.py rename to autorecon/plugins/misc.py diff --git a/plugins/nfs.py b/autorecon/plugins/nfs.py similarity index 100% rename from plugins/nfs.py rename to autorecon/plugins/nfs.py diff --git a/plugins/rdp.py b/autorecon/plugins/rdp.py similarity index 100% rename from plugins/rdp.py rename to autorecon/plugins/rdp.py diff --git a/plugins/redis.py b/autorecon/plugins/redis.py similarity index 100% rename from plugins/redis.py rename to autorecon/plugins/redis.py diff --git a/plugins/reporting.py b/autorecon/plugins/reporting.py similarity index 100% rename from plugins/reporting.py rename to autorecon/plugins/reporting.py diff --git a/plugins/rpc.py b/autorecon/plugins/rpc.py similarity index 100% rename from plugins/rpc.py rename to autorecon/plugins/rpc.py diff --git a/plugins/rsync.py b/autorecon/plugins/rsync.py similarity index 100% rename from plugins/rsync.py rename to autorecon/plugins/rsync.py diff --git a/plugins/sip.py b/autorecon/plugins/sip.py similarity index 100% rename from plugins/sip.py rename to autorecon/plugins/sip.py diff --git a/plugins/smb.py b/autorecon/plugins/smb.py similarity index 100% rename from plugins/smb.py rename to autorecon/plugins/smb.py diff --git a/plugins/smtp.py b/autorecon/plugins/smtp.py similarity index 100% rename from plugins/smtp.py rename to autorecon/plugins/smtp.py diff --git a/plugins/snmp.py b/autorecon/plugins/snmp.py similarity index 100% rename from plugins/snmp.py rename to autorecon/plugins/snmp.py diff --git a/plugins/ssh.py b/autorecon/plugins/ssh.py similarity index 100% rename from plugins/ssh.py rename to autorecon/plugins/ssh.py diff --git a/plugins/sslscan.py b/autorecon/plugins/sslscan.py similarity index 100% rename from plugins/sslscan.py rename to autorecon/plugins/sslscan.py diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..eeaf603 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,54 @@ +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "unidecode" +version = "1.3.1" +description = "ASCII transliterations of Unicode text" +category = "main" +optional = false +python-versions = ">=3.5" + +[metadata] +lock-version = "1.1" +python-versions = "^3.7" +content-hash = "681db41aa556d6d3f79e1e8ee0107bccd078e39c8db7e6e0159860c96ea93c5b" + +[metadata.files] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +unidecode = [ + {file = "Unidecode-1.3.1-py3-none-any.whl", hash = "sha256:5f58926b9125b499f8ab6816828e737578fa3e31fa24d351a3ab7f4b7c064ab0"}, + {file = "Unidecode-1.3.1.tar.gz", hash = "sha256:6efac090bf8f29970afc90caf4daae87b172709b786cb1b4da2d0c0624431ecc"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d8ba3c0 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,26 @@ +[tool.poetry] +name = "autorecon" +version = "2.0.0" +description = "A multi-threaded network reconaissance tool which performs automated enumeration of services." +authors = ["Tib3rius"] +license = "GNU GPL v3" +packages = [ + {include = "main.py", from = "autorecon"}, + {include = "autorecon", from = "autorecon"}, +] + +[tool.poetry.dependencies] +python = "^3.7" +appdirs = "^1.4.4" +colorama = "^0.4.4" +toml = "^0.10.2" +Unidecode = "^1.3.1" + +[tool.poetry.dev-dependencies] + +[tool.poetry.scripts] +autorecon = "main:main" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api"