def get_gateway_ip_addresses(configuration): """ get gateway ip addresses Args: configuration: user final configuration Returns: list of gateway's IPs """ gateway_ips = [] for selected_module in configuration: container_name = virtual_machine_name_to_container_name( configuration[selected_module]["virtual_machine_name"], selected_module) try: gateway_ip = os.popen( "docker inspect -f '{{{{range.NetworkSettings.Networks}}}}" "{{{{.Gateway}}}}{{{{end}}}}' {0}".format( container_name)).read().rsplit()[0].replace("\'", "") gateway_ips.append(gateway_ip) except IndexError as _: warn("unable to get container {0} IP address".format( container_name)) return list(set(gateway_ips))
def start_containers(configuration): """ start containers based on configuration and dockerfile Args: configuration: JSON container configuration Returns: configuration containing IP Addresses """ for selected_module in configuration: # get the container name to start (organizing) # using pattern name will help us to remove/modify the images and modules container_name = virtual_machine_name_to_container_name( configuration[selected_module]["virtual_machine_name"], selected_module) real_machine_port = configuration[selected_module][ "real_machine_port_number"] virtual_machine_port = configuration[selected_module][ "virtual_machine_port_number"] # connect to owasp honeypot networks! if configuration[selected_module]["virtual_machine_internet_access"]: # run the container with internet access os.popen( "docker run {0} --net ohp_internet --name={1} -d -t -p {2}:{3} {4}" .format( " ".join(configuration[selected_module] ["extra_docker_options"]), container_name, real_machine_port, virtual_machine_port, configuration[selected_module] ["virtual_machine_name"])).read() else: # run the container without internet access os.popen( "docker run {0} --net ohp_no_internet --name={1} -d -t -p {2}:{3} {4}" .format( " ".join(configuration[selected_module] ["extra_docker_options"]), container_name, real_machine_port, virtual_machine_port, configuration[selected_module] ["virtual_machine_name"])).read() try: virtual_machine_ip_address = os.popen( "docker inspect -f '{{{{range.NetworkSettings.Networks}}}}" "{{{{.IPAddress}}}}{{{{end}}}}' {0}".format( container_name)).read().rsplit()[0].replace( "\'", "") # single quotes needs to be removed in windows except Exception as _: virtual_machine_ip_address = "CANNOT_FIND_IP_ADDRESS" # add virtual machine IP Address to configuration configuration[selected_module][ "ip_address"] = virtual_machine_ip_address # print started container information info("container {0} started, forwarding 0.0.0.0:{1} to {2}:{3}".format( container_name, real_machine_port, virtual_machine_ip_address, virtual_machine_port)) return configuration
def create_new_images(configuration): """ start new images based on configuration and dockerfile Args: configuration: user final configuration Returns: True """ for selected_module in configuration: # go to tmp folder to create Dockerfile and files dir tmp_dir_name = make_tmp_thread_dir() os.chdir(tmp_dir_name) # create files dir mkdir("files") # create Dockerfile dockerfile = open("Dockerfile", "w") dockerfile.write(configuration[selected_module]["dockerfile"]) dockerfile.close() # copy files copy_dir_tree(configuration[selected_module]["files"], "files") # create docker image image_name = virtual_machine_name_to_container_name( configuration[selected_module]["virtual_machine_name"], selected_module ) info("creating image {0}".format(image_name)) # in case if verbose mode is enabled, we will be use os.system # instead of os.popen to show the outputs in case # of anyone want to be aware what's happening or what's the error, # it's a good feature for developers as well # to create new modules if is_verbose_mode(): os.system("docker build . -t {0}".format(image_name)) else: os.popen("docker build . -t {0}".format(image_name)).read() # created info("image {0} created".format(image_name)) # go back to home directory os.chdir("../..") # submit tmp dir name tmp_directories.append(tmp_dir_name) return True
def run_modules_processors(configuration): """ run ModuleProcessor for each modules :param configuration: user final configuration :return: """ for module in configuration: module_processor_thread = Thread( target=configuration[module]["module_processor"].processor, name=virtual_machine_name_to_container_name( configuration[module]["virtual_machine_name"], module)) module_processor_thread.start() processor_threads.append(module_processor_thread) return
def test_vm_to_container_name(self): vm_name = "ohp_sshserver" module_name = "ssh/weak_password" container_name = virtual_machine_name_to_container_name( vm_name, module_name) self.assertEqual(container_name, "ohp_sshserver_weak_password")