| 221 | super().__init__() |
| 222 | |
| 223 | class AutoRecon(object): |
| 224 | |
| 225 | def __init__(self): |
| 226 | self.pending_targets = [] |
| 227 | self.scanning_targets = [] |
| 228 | self.completed_targets = [] |
| 229 | self.plugins = {} |
| 230 | self.__slug_regex = re.compile('^[a-z0-9\-]+$') |
| 231 | self.plugin_types = {'port':[], 'service':[], 'report':[]} |
| 232 | self.port_scan_semaphore = None |
| 233 | self.service_scan_semaphore = None |
| 234 | self.argparse = None |
| 235 | self.argparse_group = None |
| 236 | self.args = None |
| 237 | self.missing_services = [] |
| 238 | self.taglist = [] |
| 239 | self.tags = [] |
| 240 | self.excluded_tags = [] |
| 241 | self.patterns = [] |
| 242 | self.errors = False |
| 243 | self.lock = asyncio.Lock() |
| 244 | self.load_slug = None |
| 245 | self.load_module = None |
| 246 | |
| 247 | def add_argument(self, plugin, name, **kwargs): |
| 248 | # TODO: make sure name is simple. |
| 249 | name = '--' + plugin.slug + '.' + slugify(name) |
| 250 | |
| 251 | if self.argparse_group is None: |
| 252 | self.argparse_group = self.argparse.add_argument_group('plugin arguments', description='These are optional arguments for certain plugins.') |
| 253 | self.argparse_group.add_argument(name, **kwargs) |
| 254 | |
| 255 | def extract_service(self, line, regex): |
| 256 | if regex is None: |
| 257 | regex = '^(?P<port>\d+)\/(?P<protocol>(tcp|udp))(.*)open(\s*)(?P<service>[\w\-\/]+)(\s*)(.*)$' |
| 258 | match = re.search(regex, line) |
| 259 | if match: |
| 260 | protocol = match.group('protocol').lower() |
| 261 | port = int(match.group('port')) |
| 262 | service = match.group('service') |
| 263 | secure = True if 'ssl' in service or 'tls' in service else False |
| 264 | |
| 265 | if service.startswith('ssl/') or service.startswith('tls/'): |
| 266 | service = service[4:] |
| 267 | |
| 268 | return Service(protocol, port, service, secure) |
| 269 | else: |
| 270 | return None |
| 271 | |
| 272 | async def extract_services(self, stream, regex): |
| 273 | if not isinstance(stream, CommandStreamReader): |
| 274 | print('Error: extract_services must be passed an instance of a CommandStreamReader.') |
| 275 | sys.exit(1) |
| 276 | |
| 277 | services = [] |
| 278 | while True: |
| 279 | line = await stream.readline() |
| 280 | if line is not None: |