Пример #1
0
def dispatch_kind(vm_name, kind, args, r_id=None, tries=0):
    #   PREPARE FILES

    global status, test_id

    print "DBG test_id is %s" % test_id

    delay = len(args.vms)

    test_dir_7 = "C:\\Users\\avtest\\Desktop\\AVTEST"
    #    test_dir_xp = "C:\\Documents and Settings\\avtest\\Desktop\\AVTEST"

    buildbat = "build_%s_%s.bat" % (kind, args.server)

    filestocopy = ["./%s" % buildbat,
                   "lib/build.py",
                   "lib/logger.py",
                   "lib/rcs_client.py",
                   "conf/vmavtest.cfg",
                   "assets/config_desktop.json",
                   "assets/config_mobile.json",
                   "assets/keyinject.exe",
                   "assets/meltapp.exe",
                   "assets/meltexploit.txt",
                   "assets/meltexploit.docx",
                   "assets/meltexploit.ppsx"]

    if kind == "exploit_web":
        filestocopy.append("assets/avtest.swf")
        filestocopy.append("assets/owned.docm")
        filestocopy.append("assets/PMIEFuck-WinWord.dll")

    if kind == "mobile" or kind == "silent":
        filestocopy.append("assets/codec")
        filestocopy.append("assets/codec_mod")
        filestocopy.append("assets/sqlite")
        filestocopy.append("assets/sqlite_mod")

    res = "%s, %s, ERROR GENERAL" % (vm_name, kind)

    vm = VMachine(vm_conf_file, vm_name)
    job_log(vm.name, "DISPATCH %s" % kind)

    #   STARTUP VM

    if tries <= 0:
        vm.revert_last_snapshot()
        job_log(vm.name, "REVERTED")
        sleep(random.randint(30, delay * 30))
    elif tries == 10:
        return "%s, %s, ERROR not started after 10 tries." % (vm_name, kind)
    else:
        vm.shutdown()
        while vm.is_powered_off() is False:
            sleep(5)

    vm.startup()
    job_log(vm.name, "STARTUP")

    #   OPEN CHANNEL

    if kind == "silent" or kind == "melt":
        max_minute = 45
    elif kind == "exploit":
        max_minute = 20
    elif kind == "mobile" or "exploit_" in kind:
        max_minute = 5

    r = StrictRedis(socket_timeout=max_minute * 60)
    p = r.pubsub()
    p.subscribe(vm.name)

    started = False
    results = []
    log = ""
    res = ""

    try:
        for m in p.listen():
            print "DBG %s: %s" % (m['channel'], m['data'])
            try:
                if started is False:
                    if "STARTED" in m['data']:  # and started is False:
                        started = True

                        # PREPARE ENVIRONMENT

                        if r_id is None:
                            result_id = add_record_result(
                                vm_name, kind, test_id, status, "STARTED")
                        else:
                            result_id = r_id
                        print "DBG %s added result with id %s" % (vm_name, result_id)

                        job_log(vm_name, "LOGGED")
                        test_dir = test_dir_7
                        copy_to_guest(vm, test_dir, filestocopy)
                        job_log(vm_name, "ENVIRONMENT")

                        # EXECUTE

                        vmman.executeCmd(
                            vm, "%s\\%s" % (test_dir, buildbat), interactive=True, bg=True)

                        # CHECK FOR ERROR IN EXECUTION

                        sleep(3)
                        out = vmman.listProcesses(vm)
                        found = False
                        tick = 0
                        script_name = "build_%s_minotauro.bat" % kind
                        print "DBG script to find is %s" % script_name

                        while tick <= 5:
                            if "python.exe" in out or script_name in out or "cmd.exe" in out:
                                found = True
                                print "DBG process found for %s!" % vm_name
                            if found == True:
                                break
                            print "DBG Python.EXE not found for %s. sleeping 5 secs (retry %d)" % (vm_name, tick)
                            print "DBG processes:\n%s" % out
                            tick += 1
                            sleep(5)

                        if found == False:
                            tries += 1
                            print "%s STARTED but not EXECUTED. Retry %d setup" % (vm_name, tries)
                            return dispatch_kind(vm_name, kind, args, result_id, tries)

                        job_log(vm_name, "EXECUTED %s" % kind)

                else:  # started is True

                    if "ENDED" not in m['data']:  # and started is True:

                        #   SAVING LOGS

                        if log is "":
                            log = str(m['data'])
                            save_logs(result_id, log)
                        else:
                            log += ", %s" % str(m['data'])
                            save_logs(result_id, log)

                        # SAVING CURRENT RESULT

                        if "+" in m['data']:
                            results.append(str(m['data']))
                            if "STARTED" not in res:  # or res is not "":
                                res += ", %s" % str(m['data'])
                            else:
                                res += "%s" % str(m['data'])
                            upd_record_result(
                                result_id, result=res.replace("+ ", "").strip())

                        if "FAILED SCOUT BUILD" in m['data'] or "FAILED SCOUT EXECUTE" in m['data']:

                            # SAVING SAMPLE

                            test_dir = "C:\\Users\\avtest\\Desktop\\AVTEST\\build"
                            platform = m['data'].split(" ")[-1].split("\\")[-2]
                            build_zip_src = "%s\\%s\\build.zip" % (
                                test_dir, platform)
                            build_zip_dst = "tmp/detected_%s.zip" % vm
                            print "DBG copying %s to %s" % (build_zip_src, build_zip_dst)
                            vm.get_file(build_zip_src, build_zip_dst)
                            #vmman.copyFileFromGuest(vm, build_zip_src, build_zip_dst)
                            print "DBG adding record sample"
                            a = add_record_sample(result_id, build_zip_dst)
                            if a:
                                print "sample SAVED on db"
                                #os.system('sudo rm -fr %s') % build_zip_dst
                            else:
                                print "sample NOT SAVED on db"
                    else:
                        print "DBG [%s] passing debug files txt from host" % vm.name
                        res_txt_dst = "%s/results_%s_%s.txt" % (
                            logdir, vm, kind)
                        res_txt_src = "C:\\Users\\avtest\\Desktop\\AVTEST\\results.txt"
                        vm.get_file(res_txt_src, res_txt_dst)

                        print "DBG results are %s" % results

                        job_log(vm_name, "SAVED %s" % kind)

                        #execute(vm, test_id, result_id, "%s\\%s" % (test_dir, buildbat), kind)

                        #timestamp = time.strftime("%Y%m%d_%H%M", time.gmtime())
                        if save_screenshot(vm, result_id) is True:
                            job_log(vm_name, "SCREENSHOT ok")

                        # suspend & refresh snapshot
                        # vm.suspend()
                        vm.shutdown()
                        job_log(vm_name, "SUSPENDED %s" % kind)

                        # return results # should be: vm_name, kind, results
                        return "%s, %s, %s" % (vm_name, kind, res.split(",")[-1].replace("+ ", ""))
            except TypeError:
                pass
    except ConnectionError:
        if started is False:
            tries += 1
            print "DBG %s: not STARTED. Timeout occurred." % vm
            return dispatch_kind(vm_name, kind, args, None, tries)
        else:
            tries += 1
            print "DBG %s: Timeout occurred during execution" % vm
            return dispatch_kind(vm_name, kind, args, result_id, tries)
Пример #2
0
def dispatch_kind(vm_name, kind, args, r_id=None, res=None, tries=0, status=0):
    #global status, test_id
    global test_id #, res
    if res is None or status == 0:
        res = "%s, %s, ERROR GENERAL" % (vm_name, kind)

    #   PREPARE FILES

    print "DBG test_id is %s" % test_id

    delay = len(args.vms)

    buildbat = "build_%s_%s.bat" % (kind, args.server)

    filestocopy =[  "./%s" % buildbat,
                    "lib/agent.py",
                    "lib/logger.py",
                    "lib/rcs_client.py",
                    "conf/vmavtest.cfg",
                    "assets/config_desktop.json",
                    "assets/config_mobile.json",
                    "assets/keyinject.exe",
                    "assets/meltapp.exe",
                    "assets/meltexploit.txt",
                    "assets/meltexploit.docx",
                    "assets/meltexploit.ppsx"     ]

    if kind == "exploit_web":
        filestocopy.append("assets/avtest.swf")
        filestocopy.append("assets/owned.docm")
        filestocopy.append("assets/PMIEFuck-WinWord.dll")

    if kind == "mobile" or kind == "silent":
        filestocopy.append("assets/codec")
        filestocopy.append("assets/codec_mod")
        filestocopy.append("assets/sqlite")
        filestocopy.append("assets/sqlite_mod")

    #   OPEN CHANNEL

    if kind == "silent" or kind == "melt":
        max_minute = 45
    elif kind == "exploit":
        max_minute = 20
    elif kind == "mobile" or "exploit_" in kind:
        max_minute = 10

    vm = VMachine(vm_conf_file, vm_name)
    job_log(vm.name, "DISPATCH %s" % kind)

    r = StrictRedis(socket_timeout=max_minute * 60)
    p = r.pubsub()
    p.subscribe(vm.name)

#    results = []

    #   STARTUP VM
    if r_id is None:
        result_id = add_record_result(vm_name, kind, test_id, status, "NOT STARTED")
    else:
        result_id = r_id

    vm.revert_last_snapshot()
    job_log(vm.name, "REVERTED")
    sleep(random.randint(30, delay * 30))
    vm.startup()
    job_log(vm.name, "STARTUP")

#    print "DBG starting Test Loop"
    try:
        for m in p.listen():
            #
            # 1. dispatch vm test case
            # 2. executing test
            # 3. report results
            #
            try:
                print "DBG message on chan %s: %s"  % (m['channel'], m['data'])
                print "DBG status: %d, vm: %s, kind: %s, passing msg '%s'" % (status,vm.name,kind,m['data'])
                status, res = dispatch_status(vm, kind, args.server, test_id, result_id, res, status, m['data'])
                
                if status == 4:
                    print "DBG STATUS 4"
                    print "DBG [%s] passing debug files txt from host" % vm.name

                    res_txt_dst = "%s/results_%s_%s.txt" % (logdir, vm, kind)
                    res_txt_src = "C:\\Users\\avtest\\Desktop\\AVTEST\\results.txt"
                    vm.get_file(res_txt_src, res_txt_dst)
                    job_log(vm.name, "SAVED %s" % kind)
                    
                    if save_screenshot(vm, result_id) is True:
                        job_log(vm.name, "SCREENSHOT ok")
                        
                    # suspend & refresh snapshot
                    vm.shutdown()
                    job_log(vm.name, "SUSPENDED %s" % kind)
                    return res
            except TypeError:
                pass
    except ConnectionError:
#        """
        if status > 0:
            print "DBG ERROR: ConnectionError Exception trapped, restarting %s %s" % (vm_name, kind)
            status = 0
            tries += 1
            if tries < 2:
                return dispatch_kind(vm_name, kind, args, result_id, res, tries, status)
            else:
                upd_record_result(result_id, result="ERROR NOT EXECUTED")
                res = "%s, %s, ERROR NOT EXECUTED" % (vm.name, kind)
                return res
        else:
            print "DBG ERROR: ConnectionError test %s %s not started" % (vm_name, kind)
            upd_record_result(result_id, result="ERROR NOT EXECUTED")
            res = "%s, %s, ERROR NOT EXECUTED" % (vm.name, kind)
            return res
Пример #3
0
def dispatch_kind(vm_name, kind, args, r_id=None, res=None, tries=0, status=0):
    #global status, test_id
    global test_id  #, res
    if res is None or status == 0:
        res = "%s, %s, ERROR GENERAL" % (vm_name, kind)

    #   PREPARE FILES

    print "DBG test_id is %s" % test_id

    delay = len(args.vms)

    buildbat = "build_%s_%s.bat" % (kind, args.server)

    filestocopy = [
        "./%s" % buildbat, "lib/agent.py", "lib/logger.py",
        "lib/rcs_client.py", "conf/vmavtest.cfg", "assets/config_desktop.json",
        "assets/config_mobile.json", "assets/keyinject.exe",
        "assets/meltapp.exe", "assets/meltexploit.txt",
        "assets/meltexploit.docx", "assets/meltexploit.ppsx"
    ]

    if kind == "exploit_web":
        filestocopy.append("assets/avtest.swf")
        filestocopy.append("assets/owned.docm")
        filestocopy.append("assets/PMIEFuck-WinWord.dll")

    if kind == "mobile" or kind == "silent":
        filestocopy.append("assets/codec")
        filestocopy.append("assets/codec_mod")
        filestocopy.append("assets/sqlite")
        filestocopy.append("assets/sqlite_mod")

    #   OPEN CHANNEL

    if kind == "silent" or kind == "melt":
        max_minute = 45
    elif kind == "exploit":
        max_minute = 20
    elif kind == "mobile" or "exploit_" in kind:
        max_minute = 10

    vm = VMachine(vm_conf_file, vm_name)
    job_log(vm.name, "DISPATCH %s" % kind)

    r = StrictRedis(socket_timeout=max_minute * 60)
    p = r.pubsub()
    p.subscribe(vm.name)

    #    results = []

    #   STARTUP VM
    if r_id is None:
        result_id = add_record_result(vm_name, kind, test_id, status,
                                      "NOT STARTED")
    else:
        result_id = r_id

    vm.revert_last_snapshot()
    job_log(vm.name, "REVERTED")
    sleep(random.randint(30, delay * 30))
    vm.startup()
    job_log(vm.name, "STARTUP")

    #    print "DBG starting Test Loop"
    try:
        for m in p.listen():
            #
            # 1. dispatch vm test case
            # 2. executing test
            # 3. report results
            #
            try:
                print "DBG message on chan %s: %s" % (m['channel'], m['data'])
                print "DBG status: %d, vm: %s, kind: %s, passing msg '%s'" % (
                    status, vm.name, kind, m['data'])
                status, res = dispatch_status(vm, kind, args.server, test_id,
                                              result_id, res, status,
                                              m['data'])

                if status == 4:
                    print "DBG STATUS 4"
                    print "DBG [%s] passing debug files txt from host" % vm.name

                    res_txt_dst = "%s/results_%s_%s.txt" % (logdir, vm, kind)
                    res_txt_src = "C:\\Users\\avtest\\Desktop\\AVTEST\\results.txt"
                    vm.get_file(res_txt_src, res_txt_dst)
                    job_log(vm.name, "SAVED %s" % kind)

                    if save_screenshot(vm, result_id) is True:
                        job_log(vm.name, "SCREENSHOT ok")

                    # suspend & refresh snapshot
                    vm.shutdown()
                    job_log(vm.name, "SUSPENDED %s" % kind)
                    return res
            except TypeError:
                pass
    except ConnectionError:
        #        """
        if status > 0:
            print "DBG ERROR: ConnectionError Exception trapped, restarting %s %s" % (
                vm_name, kind)
            status = 0
            tries += 1
            if tries < 2:
                return dispatch_kind(vm_name, kind, args, result_id, res,
                                     tries, status)
            else:
                upd_record_result(result_id, result="ERROR NOT EXECUTED")
                res = "%s, %s, ERROR NOT EXECUTED" % (vm.name, kind)
                return res
        else:
            print "DBG ERROR: ConnectionError test %s %s not started" % (
                vm_name, kind)
            upd_record_result(result_id, result="ERROR NOT EXECUTED")
            res = "%s, %s, ERROR NOT EXECUTED" % (vm.name, kind)
            return res
Пример #4
0
def dispatch_kind(vm_name, kind, args, r_id=None, tries=0):
    #   PREPARE FILES

    global status, test_id

    print "DBG test_id is %s" % test_id

    delay = len(args.vms)

    test_dir_7 = "C:\\Users\\avtest\\Desktop\\AVTEST"
    #    test_dir_xp = "C:\\Documents and Settings\\avtest\\Desktop\\AVTEST"

    buildbat = "build_%s_%s.bat" % (kind, args.server)

    filestocopy = [
        "./%s" % buildbat, "lib/build.py", "lib/logger.py",
        "lib/rcs_client.py", "conf/vmavtest.cfg", "assets/config_desktop.json",
        "assets/config_mobile.json", "assets/keyinject.exe",
        "assets/meltapp.exe", "assets/meltexploit.txt",
        "assets/meltexploit.docx", "assets/meltexploit.ppsx"
    ]

    if kind == "exploit_web":
        filestocopy.append("assets/avtest.swf")
        filestocopy.append("assets/owned.docm")
        filestocopy.append("assets/PMIEFuck-WinWord.dll")

    if kind == "mobile" or kind == "silent":
        filestocopy.append("assets/codec")
        filestocopy.append("assets/codec_mod")
        filestocopy.append("assets/sqlite")
        filestocopy.append("assets/sqlite_mod")

    res = "%s, %s, ERROR GENERAL" % (vm_name, kind)

    vm = VMachine(vm_conf_file, vm_name)
    job_log(vm.name, "DISPATCH %s" % kind)

    #   STARTUP VM

    if tries <= 0:
        vm.revert_last_snapshot()
        job_log(vm.name, "REVERTED")
        sleep(random.randint(30, delay * 30))
    elif tries == 10:
        return "%s, %s, ERROR not started after 10 tries." % (vm_name, kind)
    else:
        vm.shutdown()
        while vm.is_powered_off() is False:
            sleep(5)

    vm.startup()
    job_log(vm.name, "STARTUP")

    #   OPEN CHANNEL

    if kind == "silent" or kind == "melt":
        max_minute = 45
    elif kind == "exploit":
        max_minute = 20
    elif kind == "mobile" or "exploit_" in kind:
        max_minute = 5

    r = StrictRedis(socket_timeout=max_minute * 60)
    p = r.pubsub()
    p.subscribe(vm.name)

    started = False
    results = []
    log = ""
    res = ""

    try:
        for m in p.listen():
            print "DBG %s: %s" % (m['channel'], m['data'])
            try:
                if started is False:
                    if "STARTED" in m['data']:  # and started is False:
                        started = True

                        # PREPARE ENVIRONMENT

                        if r_id is None:
                            result_id = add_record_result(
                                vm_name, kind, test_id, status, "STARTED")
                        else:
                            result_id = r_id
                        print "DBG %s added result with id %s" % (vm_name,
                                                                  result_id)

                        job_log(vm_name, "LOGGED")
                        test_dir = test_dir_7
                        copy_to_guest(vm, test_dir, filestocopy)
                        job_log(vm_name, "ENVIRONMENT")

                        # EXECUTE

                        vmman.executeCmd(vm,
                                         "%s\\%s" % (test_dir, buildbat),
                                         interactive=True,
                                         bg=True)

                        # CHECK FOR ERROR IN EXECUTION

                        sleep(3)
                        out = vmman.listProcesses(vm)
                        found = False
                        tick = 0
                        script_name = "build_%s_minotauro.bat" % kind
                        print "DBG script to find is %s" % script_name

                        while tick <= 5:
                            if "python.exe" in out or script_name in out or "cmd.exe" in out:
                                found = True
                                print "DBG process found for %s!" % vm_name
                            if found == True:
                                break
                            print "DBG Python.EXE not found for %s. sleeping 5 secs (retry %d)" % (
                                vm_name, tick)
                            print "DBG processes:\n%s" % out
                            tick += 1
                            sleep(5)

                        if found == False:
                            tries += 1
                            print "%s STARTED but not EXECUTED. Retry %d setup" % (
                                vm_name, tries)
                            return dispatch_kind(vm_name, kind, args,
                                                 result_id, tries)

                        job_log(vm_name, "EXECUTED %s" % kind)

                else:  # started is True

                    if "ENDED" not in m['data']:  # and started is True:

                        #   SAVING LOGS

                        if log is "":
                            log = str(m['data'])
                            save_logs(result_id, log)
                        else:
                            log += ", %s" % str(m['data'])
                            save_logs(result_id, log)

                        # SAVING CURRENT RESULT

                        if "+" in m['data']:
                            results.append(str(m['data']))
                            if "STARTED" not in res:  # or res is not "":
                                res += ", %s" % str(m['data'])
                            else:
                                res += "%s" % str(m['data'])
                            upd_record_result(result_id,
                                              result=res.replace("+ ",
                                                                 "").strip())

                        if "FAILED SCOUT BUILD" in m[
                                'data'] or "FAILED SCOUT EXECUTE" in m['data']:

                            # SAVING SAMPLE

                            test_dir = "C:\\Users\\avtest\\Desktop\\AVTEST\\build"
                            platform = m['data'].split(" ")[-1].split("\\")[-2]
                            build_zip_src = "%s\\%s\\build.zip" % (test_dir,
                                                                   platform)
                            build_zip_dst = "tmp/detected_%s.zip" % vm
                            print "DBG copying %s to %s" % (build_zip_src,
                                                            build_zip_dst)
                            vm.get_file(build_zip_src, build_zip_dst)
                            #vmman.copyFileFromGuest(vm, build_zip_src, build_zip_dst)
                            print "DBG adding record sample"
                            a = add_record_sample(result_id, build_zip_dst)
                            if a:
                                print "sample SAVED on db"
                                #os.system('sudo rm -fr %s') % build_zip_dst
                            else:
                                print "sample NOT SAVED on db"
                    else:
                        print "DBG [%s] passing debug files txt from host" % vm.name
                        res_txt_dst = "%s/results_%s_%s.txt" % (logdir, vm,
                                                                kind)
                        res_txt_src = "C:\\Users\\avtest\\Desktop\\AVTEST\\results.txt"
                        vm.get_file(res_txt_src, res_txt_dst)

                        print "DBG results are %s" % results

                        job_log(vm_name, "SAVED %s" % kind)

                        #execute(vm, test_id, result_id, "%s\\%s" % (test_dir, buildbat), kind)

                        #timestamp = time.strftime("%Y%m%d_%H%M", time.gmtime())
                        if save_screenshot(vm, result_id) is True:
                            job_log(vm_name, "SCREENSHOT ok")

                        # suspend & refresh snapshot
                        # vm.suspend()
                        vm.shutdown()
                        job_log(vm_name, "SUSPENDED %s" % kind)

                        # return results # should be: vm_name, kind, results
                        return "%s, %s, %s" % (vm_name, kind,
                                               res.split(",")[-1].replace(
                                                   "+ ", ""))
            except TypeError:
                pass
    except ConnectionError:
        if started is False:
            tries += 1
            print "DBG %s: not STARTED. Timeout occurred." % vm
            return dispatch_kind(vm_name, kind, args, None, tries)
        else:
            tries += 1
            print "DBG %s: Timeout occurred during execution" % vm
            return dispatch_kind(vm_name, kind, args, result_id, tries)