def update(flargs): vms = len(flargs[1].vms) try: vm_name = flargs[0] vm = VMachine(vm_conf_file, vm_name) job_log(vm_name, "UPDATE") vm.revert_last_snapshot() job_log(vm_name, "REVERTED") sleep(random.randint(60, 60 * vms)) vm.startup() job_log(vm_name, "STARTED") #sleep(5 * 60) if wait_for_startup(vm) is False: job_log(vm_name, "NOT STARTED") return "ERROR wait for startup for %s" % vm_name if check_infection_status(vm) is not True: vm.shutdown() return "ERROR VM IS INFECTED!!!" out_img = "%s/screenshot_%s_update.png" % (logdir, vm_name) vmman.takeScreenshot(vm, out_img) print "[%s] waiting for Updates" % vm_name sleep(updatetime * 60) sleep(random.randint(10, 300)) job_log(vm_name, "SHUTDOWN") r = vmman.shutdownUpgrade(vm) if r is False: job_log(vm_name, "NOT UPDATED") return "%s, ERROR: NOT Updated! no shutdown..." % vm_name else: # RESTART TIME while vm.is_powered_off() is False: sleep(60) job_log(vm_name, "POWERED OFF") vm.startup() if wait_for_startup(vm) is False: job_log(vm_name, "NOT RESTARTED") vm.shutdown() job_log(vm_name, "RESTARTED") vm.refresh_snapshot() job_log(vm_name, "UPDATED") return "%s, SUCCESS: Updated!" % vm_name except Exception as e: job_log(vm_name, "ERROR") print "DBG trace %s" % traceback.format_exc() return "%s, ERROR: not updated. Reason: %s" % (vm_name, e)
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)
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
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
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)