def cli(): parser = argparse.ArgumentParser(description='Haystack generator utility.') parser.add_argument('config_file', type=str, help='path to the config file') parser.add_argument('--guest', type=str, help='name of the guest virtual machine', nargs='?', default='guest-{}'.format(int(time.time()))) parser.add_argument( '--seed', type=int, help='initial seed to use for random number generation', nargs='?', default=None) args = parser.parse_args() logger_core = create_logger('haystack_core', logging.ERROR) logger_generator = create_logger('haystack_generator', logging.DEBUG) # Create virtual machine. macs_in_use = [] guests = [] guest_listener = GuestListener(guests, logger_core) virtual_machine_monitor = Vmm(macs_in_use, guests, logger_core) guest = virtual_machine_monitor.create_guest(guest_name=args.guest, platform="windows") # Waiting to connect to guest. logger_generator.info("[~] Trying to connect to guest.") while guest.state != "connected": logger_generator.debug(".") time.sleep(1) logger_generator.info('[+] Connected to %s', guest.guestname) # Load and parse config file. generator = Generator(guest, args.config_file, logger_generator, seed=args.seed) # Execute action suite. generator.execute() # Shutdown the generator before closing the VM. generator.shutdown() # Shutdown virtual machine but keep the disk. guest.shutdown('keep')
def __init__(self, operating_system="windows", logger=None): try: self._send_lock = Lock() self._pexec_threads = dict() self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.last_driven_url = "" self.window_is_crushed = False self.disconnectedByHost = False self.operatingSystem = operating_system self.applicationWindow = {} self.logger = logger if self.logger is None: self.logger = create_logger('agent', logging.DEBUG) # - TODO: add support for linux if operating_system == "Windows": from hystck.inputDevice.inputDevice import InputDeviceManagement self.inputDeviceManager = InputDeviceManagement(self, logger) # open pipe for Windows admin commands if platform.system() == "Windows": self.adminpipe = WinMessagePipe() self.adminpipe.open("hystckadmin", mode='w') self.logger.debug("agent::init finished") except Exception as e: raise Exception("Agent::init error: " + str(e))
def main(): """ Test Script for hystck. :return: no return value """ try: loggerId = 'hystckManager' logger = create_logger(loggerId, logging.DEBUG) logger.info("This is a test script to check the functionallity of the hystck library" +'\n') guest = create_vm(logger) deploy(guest, logger) #gen_email_traffic(guest, logger) #gen_browser_traffic(guest, logger) #gen_IM_traffic(guest, logger) ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) raw_input("Press Enter to continue...") logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0)
def main(): # create logger logger = create_logger('guestAgent', logging.DEBUG) logger.info("create Agent") a = Agent(operating_system=platform.system().lower(), logger=logger) logger.info("connect to hystck controller: %s:%i" % (HYSTCK_CONTROLLER_IP, HYSTCK_CONTROLLER_PORT)) a.connect(HYSTCK_CONTROLLER_IP, HYSTCK_CONTROLLER_PORT) # let all network interfaces come up time.sleep(15) # inform hystck controller about network configuration a.register() # setup and start the bot agent ba = BotAgentBase() ba.agent_start(HYSTCK_CONTROLLER_IP, HYSTCK_BOT_CONTROLLER_PORT) # wait for user commands while 1: time.sleep(1) a.receiveCommands() ba.agent_stop()
def main(): """ Test Script for hystck. :return: no return value """ try: logger = create_logger('hystckManager', logging.DEBUG) logger.info("This is a test script to check the functionallity of the hystck library" + '\n') guest = create_vm(logger) browser_obj = None browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) browser_obj.open(url="facebook.com") time.sleep(25) browser_obj.facebook_login("email", "pass", "loginbutton") # browser_obj.send_keys_to_browser_element(element=" pass", keys= "pass") # browser_obj.facebook_login(username="******", password="******") # time.sleep(15) # browser_obj.send_keys_to_browser_element(element=" email", keys= "email") # time.sleep(15) # browser_obj.send_keys_to_browser_element(element=" pass", keys= 'Keys.ENTER') # time.sleep(15) # browser_obj.close() time.sleep(5) guest.remove() ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
def __init__(self, agent_object, logger=None): self.keyboardManager = KeyboardManagement() self.mouseManager = MouseManagement() self.agent_object = agent_object self.logger = logger if self.logger is None: self.logger = create_logger('interactionManager', logging.INFO)
def main(): """ Test Script for hystck. :return: no return value """ try: logger = create_logger('hystckManager', logging.DEBUG) logger.info( "This is a test script to check the functionallity of the hystck library" + '\n') guest = create_vm(logger) browser_obj = None browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) browser_obj.open(url="faz.net") while browser_obj.is_busy: time.sleep(2) browser_obj.browse_to("heise.de") while browser_obj.is_busy: time.sleep(2) time.sleep(10) browser_obj.close() while browser_obj.is_busy: time.sleep(5) time.sleep(5) guest.remove() ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
def __init__(self, name, path='/usr/sbin/tcpdump', pcap_path=os.getcwd(), logger=None): self.name = name self.path = path self.process = None self.pcap_path = pcap_path self.logger = logger if logger is None: self.logger = create_logger(name, logging.INFO) atexit.register(self.stop)
def main(): """ Test Script for hystck. :return: no return value """ try: logger = create_logger('hystckManager', logging.DEBUG) logger.info( "This is a test script to check the functionallity of the hystck library" + '\n') guest = create_vm(logger) # call all test functions you want to run tests = { 'firefox': test_firefox, 'thunderbird': test_thunderbird } # all available test functions arguments = sys.argv[ 1:] # every argument but the first as the first is the filename for argument in arguments: try: tests[argument](guest, logger) except Exception as e: print("argument unknown: " + str(e)) time.sleep(5) guest.remove("keep") ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
def __init__(self, agent_obj, logger): try: self.agent_object = agent_obj self.window_id = None self.window_is_crushed = False self.module_name = "" self.logger = logger if self.logger is None: self.logger = create_logger('interactionManager', logging.DEBUG) except Exception as e: raise Exception("Error in " + self.__class__.__name__ + ": " + str(e))
def main(): """ Test Script for hystck. :return: no return value """ try: logger = create_logger('hystckManager', logging.DEBUG) logger.info( "This is a test script to check the functionallity of the hystck library" + '\n') guest = create_vm(logger) #deploy(guest, logger) #gen_email_traffic(guest, logger) gen_browser_traffic(guest, logger) #gen_IM_traffic(guest, logger) ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
def __init__(self, macsInUse, guests, logger=None, windows_template="windows-template", linux_template="linux-template", macosx_template="mac-template", hypervisor="kvm", hypervisor_ip="127.0.0.1", hypervisor_user="******", tcpdump="/usr/sbin/tcpdump"): """Set default guest values (ip, mac, listen socket, templates ... ) and create a listen socket on all interfaces on port 11000 for the agent on the guest. @param macsInUse A list of already used MACs, ['52:54:00:...', ...] @param windows_template: name of the guest registered by libvirt; operating system Windows. @param linux_template: name of the guest registered by libvirt; operating system Linux. @param macosx_template: name of the guest registered by libvirt; operating system Mac OS X. @param hypervisor: used hypervisor to manage guest's; currently implemented -> kvm @param hypervisor_ip: the host which the hypervisor is running on. @param tcpdump: path where tcpdump is installed. @param guests: List of all guests """ try: self.logger = logger if self.logger is None: self.logger = create_logger('virtual machine monitor', logging.INFO) self.logger.info("method Vmm::__init__ repoDec19") self.guest_template = { "windows": windows_template, "linux": linux_template, "macosx": macosx_template } self.hypervisor = hypervisor self.hypervisor_ip = hypervisor_ip self.hypervisor_user = hypervisor_user self.tcpdump = tcpdump self.myGuests = [] self.macsInUse = macsInUse self.allGuests = guests except Exception as e: self.logger.error("Vmm::__init__ failed:" + str(e))
def __init__(self, guests, logger=None, server_port="11000"): """ @param guests: List of all guests @param server_port: The port all guest-agents have to connect to """ self.logger = logger if self.logger is None: self.logger = create_logger('virtual machine monitor', logging.INFO) self.guests = guests self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.server_socket.bind(('', int(server_port))) self.server_socket.listen(255) # define thread for the listen socket for the connection from all guests self.thread = threading.Thread(target=self.listener) self.thread.setDaemon(True) self.thread.start()
def __init__(self, guest_obj, args): """Set default attribute values only. @param guest_obj: The guest on which this application is running. @param args: Contains dict with arguments: logger: for logging. """ print "in ApplicationVmmSide::init" try: self.logger = args['logger'] if self.logger is None: self.logger = create_logger('interactionManager', logging.INFO) # To identify this application object, the guestobj on which it is # running and the window id is needed self.guest_obj = guest_obj self.window_id = None self.is_opened = False self.is_busy = False self.has_error = False except Exception as e: raise Exception("Error in " + self.__class__.__name__ + ": " + self.guest_obj.guestname + " " + str(e))
def main(): """ Test Script for hystck. :return: no return value """ try: # create logger logger = create_logger('hystckManager', logging.DEBUG) # program code logger.info( "This is a sample script for using the MariposaBot simulation!" + '\n') # create GuestListener macs_in_use = [] guests = [] guest_listener = GuestListener(guests, logger) # create all control instances virtual_machine_monitor1 = Vmm(macs_in_use, guests, logger) bmon = BotMonitorBase() sm = SimulationManager(bmon) # setup groups bmon.group_manager.setup_group('mariposa_bot', 'mariposa-bot.py') bmon.group_manager.setup_group('mariposa_cnc', 'mariposa-cnc.py') bmon.group_manager.setup_group('mariposa_bm', 'mariposa-bm.py') # instanciate each vm cnc = virtual_machine_monitor1.create_guest( guest_name="windows-guest01", platform="windows") bmast = virtual_machine_monitor1.create_guest( guest_name="windows-guest02", platform="windows") bot1 = virtual_machine_monitor1.create_guest( guest_name="windows-guest03", platform="windows") bot2 = virtual_machine_monitor1.create_guest( guest_name="windows-guest04", platform="windows") # wait for dhcp cnc.wait_for_dhcp() bmast.wait_for_dhcp() bot1.wait_for_dhcp() bot2.wait_for_dhcp() # setup variables, etc. cnc_host = str(cnc.ip_internet) cnc_port = MariposaProtocol.MARIPOSA_PORT1 bmon.globals["cnc"] = cnc_host # optional, default: MARIPOSA_HOST1 bmon.globals["port"] = cnc_port # optional, default: MARIPOSA_PORT1 bmon.globals["bm_ip"] = str(bmast.ip_internet) # needed # allocate vms to groups bmon.group_manager.add_bot_to_group('mariposa_cnc', cnc) bmon.group_manager.add_bot_to_group('mariposa_bm', bmast) bmon.group_manager.add_bot_to_group('mariposa_bot', bot1) bmon.group_manager.add_bot_to_group('mariposa_bot', bot2) # begin listening for incomming connections bmon.start() # wait till the simulation is ready sm.wait_for_bots(4) # wait till bots have completed the initialization phase time.sleep(2 * 60) time.sleep(30) # wait some more bl = bmon.group_manager.get_bots_by_group_name('mariposa_bm') for b in bl: print "sending order to: " + b.ip_address order = { 'cnc_target_host': cnc_host, 'cnc_target_port': cnc_port, 'command': 'enable_google', 'args': '' } b.place_order(order) time.sleep(5 * 60) bl = bmon.group_manager.get_bots_by_group_name('mariposa_bm') for b in bl: print "sending order to: " + b.ip_address order = { 'cnc_target_host': cnc_host, 'cnc_target_port': cnc_port, 'command': 'download2', 'args': '' } b.place_order(order) raw_input("press enter to exit") # close all connections bmon.stop() virtual_machine_monitor1.clear() print "simulation has ended!" sys.exit(0) ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
# application plugin's module "mailClientThunderbird.py" before deploying for # slow VMs import time import logging import xml.etree.ElementTree as ET from hystck.core.vmm import Vmm from hystck.utility.logger_helper import create_logger from hystck.core.vmm import GuestListener import mailbox import email.utils import os # Instanciate VMM and a VM logger = create_logger('hystckManager', logging.DEBUG) macsInUse = [] guests = [] guestListener = GuestListener(guests, logger) virtual_machine_monitor1 = Vmm(macsInUse, guests, logger) guest = virtual_machine_monitor1.create_guest(guest_name="tbtest", platform="windows") # Wait for the VM to connect to the VMM guest.waitTillAgentIsConnected() # Create a mailer object mail = guest.application("mailClientThunderbird", {}) # Important set a password used by the mail service, it will be saved inside thunderbird mail.set_session_password("hystckMail") while mail.is_busy:
def main(): """ Test Script for hystck. :return: no return value """ try: logger = create_logger('hystckManager', logging.DEBUG) logger.info( "This is a test script to check the functionallity of the hystck library" + '\n') guest = create_vm(logger) #click element based on xpath test browser_obj = None browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) #browser_obj.open(url="faz.net") #time.sleep(20) #browser_obj.click_xpath_test('/html/body/div[6]/header/div[1]/div[1]/div[2]/nav/div/ul/li[2]/a') #time.sleep(15) #dl test without function download_from function #browser_obj.close() browser_obj.open(url="python.org/downloads") time.sleep(25) browser_obj.click_xpath_test( '/html/body/div/div[3]/div/section/div[1]/ol/li[1]/span[3]/a') time.sleep(25) browser_obj.click_xpath_test( '/html/body/div/div[3]/div/section/article/table/tbody/tr[1]/td[1]/a' ) time.sleep(25) browser_obj.save_as() time.sleep(25) browser_obj.press_enter_test() time.sleep(25) browser_obj.close() time.sleep(5) guest.remove() ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
def main(): """ Test Script for hystck. :return: no return value """ try: logger = create_logger('hystckManager', logging.DEBUG) logger.info( "This is a test script to check the functionallity of the hystck library" + '\n') guest = create_vm(logger) guest.setOSTime("2018-01-01 12:00:00") browser_obj = None browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) browser_obj.open(url="faz.net") time.sleep(30) browser_obj.browse_to("heise.de") time.sleep(20) browser_obj.browse_to("golem.de") time.sleep(30) browser_obj.browse_to("slashdot.org") time.sleep(50) browser_obj.browse_to("distrowatch.com") time.sleep(30) browser_obj.browse_to("archlinux.org") time.sleep(20) browser_obj.close() time.sleep(5) guest.setOSTime("2018-01-01 14:00:00") browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) browser_obj.open(url="faz.net") time.sleep(30) browser_obj.browse_to("heise.de") time.sleep(20) browser_obj.browse_to("golem.de") time.sleep(30) browser_obj.browse_to("slashdot.org") time.sleep(50) browser_obj.browse_to("distrowatch.com") time.sleep(30) browser_obj.browse_to("archlinux.org") time.sleep(20) browser_obj.close() time.sleep(5) se = guest.shellExec("calc") time.sleep(10) guest.killShellExec(se) time.sleep(5) # guest.setOSTime("2018-01-02 11:00:00") guest.shutdown('keep') while guest.isGuestPowered(): time.sleep(1) guest.start("2018-01-02 11:00:00") guest.waitTillAgentIsConnected() browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) browser_obj.open(url="faz.net") time.sleep(30) browser_obj.browse_to("heise.de") time.sleep(20) browser_obj.browse_to("golem.de") time.sleep(30) browser_obj.browse_to("archlinux.org") time.sleep(20) browser_obj.close() time.sleep(5) # guest.setOSTime("2018-01-03 13:00:00") guest.shutdown('keep') while guest.isGuestPowered(): time.sleep(1) guest.start("2018-01-03 13:00:00") guest.waitTillAgentIsConnected() browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) browser_obj.open(url="faz.net") time.sleep(30) browser_obj.browse_to("heise.de") time.sleep(20) browser_obj.browse_to("golem.de") time.sleep(30) browser_obj.browse_to("slashdot.org") time.sleep(50) browser_obj.browse_to("distrowatch.com") time.sleep(30) browser_obj.browse_to("archlinux.org") time.sleep(20) browser_obj.close() time.sleep(5) # guest.setOSTime("2018-01-04 12:00:00") guest.shutdown('keep') while guest.isGuestPowered(): time.sleep(1) guest.start("2018-01-04 12:00:00") guest.waitTillAgentIsConnected() browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) browser_obj.open(url="faz.net") time.sleep(30) browser_obj.browse_to("heise.de") time.sleep(20) browser_obj.browse_to("golem.de") time.sleep(30) browser_obj.browse_to("slashdot.org") time.sleep(50) browser_obj.browse_to("archlinux.org") time.sleep(20) browser_obj.close() time.sleep(5) # guest.setOSTime("2018-01-05 13:00:00") guest.shutdown('keep') while guest.isGuestPowered(): time.sleep(1) guest.start("2018-01-05 13:00:00") guest.waitTillAgentIsConnected() browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) browser_obj.open(url="faz.net") time.sleep(30) browser_obj.browse_to("heise.de") time.sleep(20) browser_obj.browse_to("golem.de") time.sleep(30) browser_obj.browse_to("archlinux.org") time.sleep(20) browser_obj.browse_to("wikipedia.org") time.sleep(10) browser_obj.close() time.sleep(5) se = guest.shellExec("calc") time.sleep(8) guest.killShellExec(se) time.sleep(5) # guest.setOSTime("2018-01-06 14:00:00") guest.shutdown('keep') while guest.isGuestPowered(): time.sleep(1) guest.start("2018-01-06 14:00:00") guest.waitTillAgentIsConnected() browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) browser_obj.open(url="faz.net") time.sleep(30) browser_obj.browse_to("heise.de") time.sleep(20) browser_obj.browse_to("golem.de") time.sleep(30) browser_obj.browse_to("slashdot.org") time.sleep(50) browser_obj.browse_to("distrowatch.com") time.sleep(30) browser_obj.browse_to("archlinux.org") time.sleep(20) browser_obj.close() time.sleep(5) # guest.setOSTime("2018-01-07 12:00:00") guest.shutdown('keep') while guest.isGuestPowered(): time.sleep(1) guest.start("2018-01-07 12:00:00") guest.waitTillAgentIsConnected() browser_obj = guest.application("webBrowserFirefox", {'webBrowser': "firefox"}) browser_obj.open(url="faz.net") time.sleep(30) browser_obj.browse_to("heise.de") time.sleep(20) browser_obj.browse_to("golem.de") time.sleep(30) browser_obj.browse_to("slashdot.org") time.sleep(50) browser_obj.browse_to("distrowatch.com") time.sleep(30) browser_obj.browse_to("archlinux.org") time.sleep(20) browser_obj.close() time.sleep(5) guest.remove("keep") ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
def main(): """ Test Script for hystck with HelloBot. :return: no return value """ try: # create logger logger = create_logger('hystckManager', logging.DEBUG) # program code logger.info( "This is a sample script for using the ZeusBot simulation!" + '\n') # create GuestListener macs_in_use = [] guests = [] guest_listener = GuestListener(guests, logger) # create all control instances virtual_machine_monitor1 = Vmm(macs_in_use, guests, logger) # instanciate each vm initiator = virtual_machine_monitor1.create_guest( guest_name="windows-guest01", platform="windows") target = virtual_machine_monitor1.create_guest( guest_name="windows-guest02", platform="windows") # wait for dhcp initiator.wait_for_dhcp() target.wait_for_dhcp() # run nmap portscan r1 = Nmap.guest_nmap_tcp_syn_scan(initiator, target) r1.wait() # run ncrack on ssh port r2 = Ncrack.crack_guests( initiator, target, service="ssh", user_list=["root", "admin", "user", "vm"], password_list=["root", "password", "vm", "admin", "user"]) r2.wait() # cleanup virtual_machine_monitor1.clear() print "simulation has ended!" sys.exit(0) ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
def main(): """ Test Script for hystck with HelloBot. :return: no return value """ try: # create logger logger = create_logger('hystckManager', logging.DEBUG) # program code logger.info("This is a sample script for using the ZeusBot simulation!" + '\n') # create GuestListener macs_in_use = [] guests = [] guest_listener = GuestListener(guests, logger) # create all control instances virtual_machine_monitor1 = Vmm(macs_in_use, guests, logger) bmon = BotMonitorBase() sm = SimulationManager(bmon) # setup groups bmon.group_manager.setup_group('zeus_bot', 'zeus-bot.py') bmon.group_manager.setup_group('zeus_cnc', 'zeus-cnc.py') # instanciate each vm cnc = virtual_machine_monitor1.create_guest(guest_name="windows-guest01", platform="windows") bot1 = virtual_machine_monitor1.create_guest(guest_name="windows-guest02", platform="windows") bot2 = virtual_machine_monitor1.create_guest(guest_name="windows-guest03", platform="windows") bot3 = virtual_machine_monitor1.create_guest(guest_name="windows-guest04", platform="windows") # wait for dhcp cnc.wait_for_dhcp() bot1.wait_for_dhcp() bot2.wait_for_dhcp() bot3.wait_for_dhcp() # if you want to enable the rc4 cypher, disable for plaintext messages (intended for debugging) enable_crypto = True encryption_key = "secret key" # setup the cnc ip for clients and a botnet name, simulate the bot's embedded config bmon.globals["cnc_host"] = str(cnc.ip_internet) # always needed bmon.globals["botnet_name"] = "samplebotnet" # if not set, 'default' will be used # bmon.globals["url_config"] = "/config.bin" # bmon.globals["url_compip"] = "/ip.php" # bmon.globals["url_server"] = "/gate.php" # bmon.globals["url_loader"] = "/bot.exe" if enable_crypto: bmon.globals["encryption_key"] = encryption_key else: encryption_key = None # allocate vms to groups bmon.group_manager.add_bot_to_group('zeus_cnc', cnc) bmon.group_manager.add_bot_to_group('zeus_bot', bot1) bmon.group_manager.add_bot_to_group('zeus_bot', bot2) bmon.group_manager.add_bot_to_group('zeus_bot', bot3) # begin listening for incoming connections bmon.start() # upload zeus server files after verifying that cnc is running sm.wait_for_bot(cnc) # wait till bot is ready cnc_bot = bmon.group_manager.get_single_bot(cnc) # load plaintext config.bin and send it to cnc bot with open('config.bin', 'rb') as f: c = f.read() ZeusCnC.push_file_to_server(cnc_bot, 'config.bin', c, encryption_key) # generate a command to send to all clients z = ZeusPacketGenerator() z.add_command_info("sethomepage http://example.com") cmd = str(z.generate_message(encryption_key)) # if encryption is enabled, cmd will already be encrypted ZeusCnC.push_file_to_server(cnc_bot, 'gate.php', cmd) # no need for an additional cypher round # wait till the simulation is ready sm.wait_for_bots(4) # let the bots create control traffic till key press raw_input("press enter to exit") # close all connections bmon.stop() virtual_machine_monitor1.clear() print "simulation has ended!" sys.exit(0) ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") bmon.stop() virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: bmon.stop() virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
def main(): """ Test Script for hystck. :return: no return value """ try: imagename = "kipo_scenario" author = "Thomas Schaefer" hostplatform = "windows" hashfile = generate_file_sh256("/var/lib/libvirt/images/" + hostplatform + "-template.qcow2") Reporter.add("imagename", imagename) Reporter.add("author", author) Reporter.add("baseimage", hostplatform + "-template.qcow2") Reporter.add("basehash", "sha256: " + hashfile) logger = create_logger('hystckManager', logging.DEBUG) logger.info( "This is a test script to check the functionallity of the hystck library" + '\n') guest = create_vm(logger) # call all test functions you want to run tests = { 'firefox': test_firefox, 'thunderbird': test_thunderbird, 'veracrypt': test_veracrypt, 'multiuser': test_multiuser } # all available test functions arguments = sys.argv[ 1:] # every argument but the first as the first is the filename for argument in arguments: try: tests[argument](guest, logger) except Exception as e: print("argument unknown: " + str(e)) time.sleep(5) logger.debug("All tests completed. Shutting down now.") time.sleep(5) guest.remove("keep") sha256 = "sha256: " + generate_file_sh256( "/var/lib/libvirt/images/backing/" + imagename + ".qcow2") Reporter.add("hash", sha256) # create report Reporter.generate() ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
import argparse import logging import time import threading from hystck.utility.logger_helper import create_logger from hystck.generator import Generator from hystck.core.vmm import Vmm from hystck.core.vmm import GuestListener # Create logger for the Haystack core and generator. logger_core = create_logger('haystack_core', logging.ERROR) logger_generator = create_logger('haystack_generator', logging.DEBUG) def start_guest(index, virtual_machine_monitor, args): guest = virtual_machine_monitor.create_guest(guest_name='{}-{}'.format( args.guest, index), platform="windows") # Waiting to connect to guest. logger_generator.info('[~] Trying to connect to guest {}.'.format(index)) guest.waitTillAgentIsConnected() logger_generator.info('[+] Connected to %s', guest.guestname) # Load and parse config file. generator = Generator(guest, args.config_file, logger_generator, args.seed) # Execute action suite.
def __init__(self): self.logger = create_logger("reporter", DEBUG) self.logger.info("Reporter has been loaded and can be used") self.root = ET.Element("root") self.date = datetime.datetime.today().strftime('%m-%d-%Y %H:%M')
def main(): """ Test Script for hystck with HelloBot. :return: no return value """ try: # create logger logger = create_logger('hystckManager', logging.DEBUG) # program code logger.info("This is a sample script for testing the HelloBot Sample" + '\n') # create GuestListener macs_in_use = [] guests = [] guest_listener = GuestListener(guests, logger) # create all control instances virtual_machine_monitor1 = Vmm(macs_in_use, guests, logger) bmon = BotMonitorBase() sm = SimulationManager(bmon) # setup groups bmon.group_manager.setup_group('hello_bot', 'hello-bot.py') bmon.group_manager.setup_group('hello_cnc', 'hello-cnc.py') bmon.group_manager.setup_group('hello_bm', 'hello-bm.py') # instantiate each vm cnc = virtual_machine_monitor1.create_guest(guest_name="windows-guest01", platform="windows") bmast = virtual_machine_monitor1.create_guest(guest_name="windows-guest02", platform="windows") bot1 = virtual_machine_monitor1.create_guest(guest_name="windows-guest03", platform="windows") bot2 = virtual_machine_monitor1.create_guest(guest_name="windows-guest04", platform="windows") bot3 = virtual_machine_monitor1.create_guest(guest_name="windows-guest04", platform="windows") # wait for dhcp cnc.wait_for_dhcp() bmast.wait_for_dhcp() bot1.wait_for_dhcp() bot2.wait_for_dhcp() bot3.wait_for_dhcp() # setup some variables, for demonstration purposes bmon.globals["cnc"] = str(cnc.ip_internet) bmon.globals["bmast"] = str(bmast.ip_internet) # allocate vms to groups bmon.group_manager.add_bot_to_group('hello_cnc', cnc) bmon.group_manager.add_bot_to_group('hello_bm', bmast) bmon.group_manager.add_bot_to_group('hello_bot', bot1) bmon.group_manager.add_bot_to_group('hello_bot', bot2) bmon.group_manager.add_bot_to_group('hello_bot', bot3) # begin listening for incomming connections bmon.start() # wait till the simulation is ready sm.wait_for_bots(5) # actions for i in range(0, 10): print "round " + str(i) bl = bmon.group_manager.get_bots_by_group_name("hello_bm") for b in bl: print b.ip_address + " is placing an order" msg = "hello: " + str(i) order = { 'cnc_target': str(cnc.ip_internet), 'cnc_target_port:': HELLO_PORT, 'command': 'send', 'bot_target': "192.168.110.1", # this is the hypervisor 'msg': msg } b.place_order(order) sleep(5) bl = bmon.group_manager.get_bots_by_group_name("hello_bot") for b in bl: print b.ip_address + " is pulling orders" b.pull_orders(str(cnc.ip_internet), HELLO_PORT) sleep(5) for b in bl: print b.ip_address + " is executing orders" b.execute_orders() sleep(5) raw_input("press enter to exit") # close all connections bmon.stop() virtual_machine_monitor1.clear() print "simulation has ended!" sys.exit(0) ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") bmon.stop() virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: bmon.stop() virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)
def __init__(self, logger=None): self.logger = logger if self.logger is None: self.logger = create_logger('webBrowserManager', logging.INFO)
def __init__(self, guest, path, logger=None, seed=None): """ :param guest: :param path: :param logger: """ self.guest = guest self._logger = logger self.actions = [] self.collections = { 'mail': { 'default': {} }, 'chat': { 'default': {} }, 'http': { 'default': [] }, 'printer': { 'default': [] }, 'smb': { 'default': [] } } self.settings = {} self.browser = None if self._logger is None: self._logger = create_logger('generator', logging.DEBUG) # Parse YAML config. try: with open(path, 'r') as f: self.config = yaml.safe_load(f) except (IOError, yaml.YAMLError) as error: self._logger.error( '[-] Could not find or parse config file %s: %s', path, error) sys.exit(1) # Check if user specified a seed to be used for randomization. # Does not override the seed passed as an argument if 'seed' in self.config and seed is None: self._logger.info('[~] Using the specified seed: %d.', self.config['seed']) seed = self.config['seed'] random.seed(seed) # Check if minimum requirements are fulfilled. if 'hay' not in self.config or 'needles' not in self.config: self._logger.error( '[-] Config file does not contain both hay and needle sections.' ) sys.exit(1) # Load collections for different applications. self._logger.info('[~] Loading collections.') self._load_collections() # Setup needed objects for applications. self._logger.info('[~] Setup applications.') self._setup_applications() self._logger.info('[~] Generating randomized action suite.') # Collect actions used for the hay and needle(s). for key, entry in self.config['hay'].items( ) + self.config['needles'].items(): # Generate action with specified parameters and generated missing parameters if needed. self.actions.extend(self._generate_action(key, entry)) self._logger.info('\t Created %s set.', key) # Randomize action suite. random.shuffle(self.actions, random.random) # Generate action suite from config. self._logger.info('[+] Generated randomized action suite.')
def __init__(self): self.logger = create_logger("winadminagent", DEBUG) self.logger.info("Establishing connecting to command pipe...") self.p = WinMessagePipe() self.p.open("hystckadmin") self.logger.info("Now connected to command pipe!")
import logging import time from hystck.core.vmm import GuestListener from hystck.core.vmm import Vmm from hystck.utility.logger_helper import create_logger logger = create_logger('print_documents', logging.DEBUG) macs = [] guests = [] guest_listener = GuestListener(guests, logger) vmm = Vmm(macs, guests, logger) windows = vmm.create_guest(guest_name='windows_print', platform='windows') windows.waitTillAgentIsConnected() # Add printer windows.shellExec( 'rundll32 printui.dll,PrintUIEntry /if /b IPPTool-Printer /m "Generic / Text Only" /r "http://192.168.103.123:631/ipp/print/name"' ) time.sleep(3) windows.shellExec('rundll32 printui.dll,PrintUIEntry /y /n IPPTool-Printer') time.sleep(3) windows.shellExec( 'REG ADD "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows" /t REG_DWORD /v LegacyDefaultPrinterMode /d 1 /f' ) time.sleep(5) # Print document windows.shellExec(
def main(): """ Test Script for hystck with DevControlClient. :return: no return value """ try: # create logger logger = create_logger('hystckManager', logging.DEBUG) # program code logger.info( "This is a sample script for using the ZeusBot simulation!" + '\n') # create GuestListener macs_in_use = [] guests = [] guest_listener = GuestListener(guests, logger) # create all control instances virtual_machine_monitor1 = Vmm(macs_in_use, guests, logger) bot = virtual_machine_monitor1.create_guest( guest_name="windows-guest01", platform="windows") bot.wait_for_dhcp() # at this point userspace tools and drivers should have been started # generate the client object for the drivers bot_drv = DevControlClient() bot_drv.connect(bot) # this will call winver as a demonstration bot_drv.kb_send_special_key("ESC", lctrl=True) time.sleep(2) bot_drv.kb_send_text( "winver\n" ) # the function also supports other escape codes to like '\b' for backspace time.sleep(2) bot_drv.kb_send_special_key("ENTER") time.sleep(2) # shutdown bot_drv.close() virtual_machine_monitor1.clear() sys.exit(0) ######## CLEANUP ############# ERROR HANDLING except KeyboardInterrupt as k: logger.debug(k) logger.debug("KeyboardInterrupt") logger.debug(k) logger.debug(virtual_machine_monitor1) raw_input("Press Enter to continue...") virtual_machine_monitor1.clear() logger.debug("cleanup here") try: virtual_machine_monitor1.clear() except NameError: logger.debug("well, host1 was not defined!") exit(0) except Exception as e: logger.debug("main gets the error: " + str(e)) logger.debug("cleanup here") raw_input("Press Enter to continue...") try: virtual_machine_monitor1.clear() subprocess.call(["/etc/init.d/libvirt-bin", "restart"]) except NameError: logger.debug("well, host1 was not defined!") sys.exit(1)