Esempio n. 1
0
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')
Esempio n. 2
0
    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))
Esempio n. 3
0
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)
Esempio n. 4
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()
Esempio n. 5
0
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)
Esempio n. 6
0
    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)
Esempio n. 7
0
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)
Esempio n. 8
0
 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)
Esempio n. 9
0
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)
Esempio n. 10
0
    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))
Esempio n. 11
0
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)
Esempio n. 12
0
File: vmm.py Progetto: dasec/hystck
    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))
Esempio n. 13
0
File: vmm.py Progetto: dasec/hystck
    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()
Esempio n. 14
0
    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))
Esempio n. 15
0
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)
Esempio n. 16
0
#       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:
Esempio n. 17
0
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)
Esempio n. 18
0
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)
Esempio n. 19
0
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)
Esempio n. 20
0
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)
Esempio n. 21
0
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)
Esempio n. 22
0
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.
Esempio n. 23
0
 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')
Esempio n. 24
0
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)
Esempio n. 25
0
 def __init__(self, logger=None):
     self.logger = logger
     if self.logger is None:
         self.logger = create_logger('webBrowserManager', logging.INFO)
Esempio n. 26
0
    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.')
Esempio n. 27
0
 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!")
Esempio n. 28
0
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(
Esempio n. 29
0
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)