def remote_transform(args): entity_type, value = split_validate(args.input, 'entity') fields = {} params = [] for f in args.entity_field: name, value = split_validate(f, 'entity field') fields[name] = Field(name=name, value=value) for p in args.transform_parameter: name, value = split_validate(p, 'transform parameter') params += Field(name=name, value=value) try: r = remote_canari_transform_runner( args.host, args.base_path, args.transform, [_Entity(type=entity_type, value=value, fields=fields)], params, Limits(soft=args.soft_limit, hard=args.hard_limit), args.ssl) if r.status == 200: data = r.read() if args.raw_output: print data else: console_writer(MaltegoMessage.parse(data)) exit(0) print 'ERROR: Received status %d for %s://%s/%s. Are you sure you got the right server?' % ( r.status, 'https' if args.ssl else 'http', args.host, args.transform) except Exception, e: print 'ERROR: %s' % e
def do_transform(transform): try: # Let's get an XML object tree req = MaltegoMessage.parse(request.data).message # If our transform define an input entity type then we should check # whether the request contains the right type if transform.input_type and transform.input_type is not Unknown and \ not isinstance(req.entity, transform.input_type): return Response(application.four_o_four, status=404) # Execute it! msg = transform().do_transform(req, MaltegoTransformResponseMessage(), load_config()) # Let's serialize the return response and clean up whatever mess was left behind if isinstance(msg, MaltegoTransformResponseMessage): return message(msg) else: raise MaltegoException(str(msg)) # Unless we croaked somewhere, then we need to fix things up here... except MaltegoException as me: return croak(str(me)) except Exception: if application.debug: return croak(traceback.format_exc()) else: return croak('Transform execution failed.')
def do_transform(transform): try: # Let's get an XML object tree req = MaltegoMessage.parse(request.data).message # If our transform define an input entity type then we should check # whether the request contains the right type if transform.input_type and transform.input_type is not Unknown and \ not isinstance(req.entity, transform.input_type): return Response(application.four_o_four, status=404) # Execute it! msg = transform().do_transform( req, MaltegoTransformResponseMessage(), load_config() ) # Let's serialize the return response and clean up whatever mess was left behind if isinstance(msg, MaltegoTransformResponseMessage): return message(msg) else: raise MaltegoException(str(msg)) # Unless we croaked somewhere, then we need to fix things up here... except MaltegoException, me: return croak(str(me))
def remote_transform(host, transform, input, entity_field, transform_parameter, raw_output, ssl, base_path, soft_limit, hard_limit, verbose): if verbose: set_canari_mode(CanariMode.LocalDebug) entity_type, entity_value = split_validate(input, 'entity') fields = {} params = [] for f in entity_field: name, value = split_validate(f, 'entity field') fields[name] = Field(name=name, value=value) for p in transform_parameter: name, value = split_validate(p, 'transform parameter') params.append(Field(name=name, value=value)) try: r = remote_canari_transform_runner( host, base_path, transform, [_Entity(type=entity_type, value=entity_value, fields=fields)], params, Limits(soft=soft_limit, hard=hard_limit), ssl ) if r.status == 200: data = r.read().decode('utf8') if raw_output: click.echo(data, err=True) exit(0) else: console_writer(MaltegoMessage.parse(data)) exit(0) click.echo('ERROR: Received status %d for %s://%s/%s. Are you sure you got the right server?' % ( r.status, 'https' if ssl else 'http', host, transform ), err=True) if verbose: click.echo(r.read(), err=True) except Exception as e: click.echo('ERROR: %s' % e, err=True) if verbose: traceback.print_exc() exit(-1)
def dotransform(self, transform, valid_input_entity_types): try: if "Content-Length" not in self.headers: self.send_error(500, "What?") return request_str = self.rfile.read(int(self.headers["Content-Length"])) msg = MaltegoMessage.parse(request_str).message e = msg.entity entity_type = e.type if valid_input_entity_types and entity_type not in valid_input_entity_types: self.send_error(400, "Unsupported input entity!") return for k, i in msg.parameters.iteritems(): if "." in k: config[k.replace(".", "/", 1)] = i else: config["plume/%s" % k] = i msg = ( transform( msg, request_str if hasattr(transform, "cmd") and callable(transform.cmd) else MaltegoTransformResponseMessage(), ) if get_transform_version(transform) == 2 else transform( msg, request_str if hasattr(transform, "cmd") and callable(transform.cmd) else MaltegoTransformResponseMessage(), config, ) ) if isinstance(msg, MaltegoTransformResponseMessage) or isinstance(msg, basestring): message(msg, self) return else: raise MaltegoException("Could not resolve message type returned by transform.") except MaltegoException, me: croak(str(me), self)
def __call__(self, request, *args): self.args.append(request.entity.value) if isinstance(request.parameters, list) and request.parameters: self.args.extend(request.parameters) if request.entity.fields: self.args.append('#'.join([ '%s=%s' % (k, v.value.replace('#', '\\#').replace('=', '\\=')) for k, v in request.entity.fields.items() ])) if is_local_exec_mode(): p = Popen(self.args, env=self.env) p.communicate() exit(p.returncode) else: p = Popen(self.args, env=self.env, stdout=PIPE) out, _ = p.communicate() return MaltegoMessage.parse(out)
def dotransform(transform, valid_input_entity_types): try: # Get the body of the request request_str = request.data # Let's get an XML object tree maltego_request = MaltegoMessage.parse(request_str).message # Get the entity being passed in. e = maltego_request.entity entity_type = e.type if valid_input_entity_types and entity_type not in valid_input_entity_types: return Response(app.four_o_four, status=404) # Initialize a private copy of the config to pass into the transform config = _config.CanariConfigParser() for p in maltego_request.parameters.values(): if '.' in p.name: config[p.name.replace('.', '/', 1)] = p else: config['plume/%s' % p.name] = p.value # The private config variables CANNOT override the server's settings. This is for security? config._sections.update(_config.config._sections) # Execute it! msg = transform( maltego_request, request_str if hasattr(transform, 'cmd') and callable(transform.cmd) else MaltegoTransformResponseMessage(), config ) # Let's serialize the return response and clean up whatever mess was left behind if ( isinstance(msg, MaltegoTransformResponseMessage) or isinstance(msg, basestring) or isinstance(msg, MaltegoTransformExceptionMessage) ): return message(msg) else: raise MaltegoException('Could not resolve message type returned by transform.') # Unless we croaked somewhere, then we need to fix things up here... except MaltegoException, me: return croak(str(me))
def remote_transform(args): if args.verbose: set_canari_mode(CanariMode.LocalDebug) entity_type, entity_value = split_validate(args.input, 'entity') fields = {} params = [] for f in args.entity_field: name, value = split_validate(f, 'entity field') fields[name] = Field(name=name, value=value) for p in args.transform_parameter: name, value = split_validate(p, 'transform parameter') params.append(Field(name=name, value=value)) try: r = remote_canari_transform_runner( args.host, args.base_path, args.transform, [_Entity(type=entity_type, value=entity_value, fields=fields)], params, Limits(soft=args.soft_limit, hard=args.hard_limit), args.ssl ) if r.status == 200: data = r.read() if args.raw_output: print data exit(0) else: console_writer(MaltegoMessage.parse(data)) exit(0) print 'ERROR: Received status %d for %s://%s/%s. Are you sure you got the right server?' % ( r.status, 'https' if args.ssl else 'http', args.host, args.transform ) except Exception, e: print 'ERROR: %s' % e
def dotransform(transform, valid_input_entity_types): try: # Get the body of the request request_str = request.data # Let's get an XML object tree maltego_request = MaltegoMessage.parse(request_str).message # Get the entity being passed in. e = maltego_request.entity entity_type = e.type if valid_input_entity_types and entity_type not in valid_input_entity_types: return Response(app.four_o_four, status=404) # Initialize a private copy of the config to pass into the transform config = _config.CanariConfigParser() for p in maltego_request.parameters.values(): if '.' in p.name: config[p.name.replace('.', '/', 1)] = p.value else: config['plume/%s' % p.name] = p.value # The private config variables CANNOT override the server's settings. This is for security? config._sections.update(_config.config._sections) # Execute it! msg = transform( maltego_request, request_str if hasattr(transform, 'cmd') and callable(transform.cmd) else MaltegoTransformResponseMessage(), config) # Let's serialize the return response and clean up whatever mess was left behind if isinstance(msg, MaltegoTransformResponseMessage) or isinstance( msg, basestring): return message(msg) else: raise MaltegoException( 'Could not resolve message type returned by transform.') # Unless we croaked somewhere, then we need to fix things up here... except MaltegoException, me: return croak(str(me))