hackedteam/test-av2

View on GitHub
scripts/mobile/hardware/testmain.py

Summary

Maintainability
D
2 days
Test Coverage
import sys
import csv
import time
# import datetime
import traceback
from adbclient import AdbClient
import adb

# our files
from scripts.mobile.hardware.apk import apk_dataLoader
from scripts.mobile.hardware.utils import wifiutils, superuserutils, utils


sys.path.append("/Users/mlosito/Sviluppo/Rite/")
sys.path.append("/Users/zeno/AVTest/")

from AVAgent import build


#avs_to_test = ['avast', '360security', 'AVG']
#avs_to_test = ['AVG']
avs_to_test = ['avira']
avs_all = ['avast', '360security', 'AVG', 'avira', 'Lookout', 'Norton']


#build.connection.host = "rcs-minotauro"
build.connection.host = "rcs-castore"
build.connection.user = "marco"
build.connection.passwd = "passwordP123"

def main():
    devices = adb.get_attached_devices()

    print """
    !!! Test AntiVirus !!!
    !!! Attenzione:    !!!
    !!! Prima dell'installazione dell'agente, al dispositivo va impedito il libero accesso ad internet. !!!
    """
    print """ prerequisiti:
    1) Telefono connesso in USB,
    2) USB Debugging enabled (settings/developer options/usb debugging)
    3) connesso wifi TP-LINK_9EF638 <======== NB!!!!!!!!!!!!!!!!!!!!!!!
    4) NESSUNA SIM INSTALLATA <======== NB!!!!!!!!!!!!!!!!!!!!!!!
    5) screen time 2m (settings/display/sleep)
    """

    print "devices connessi:"
    for device in devices:
        print device

    if not devices:
        print "non ci sono device connessi"
    else:

        if len(devices) > 1:
            dev = raw_input("su quale device si vuole eseguire il test? ")
            print "Eseguo il test su %s" % dev

        if len(sys.argv) >= 2:
            serialno = sys.argv[1]

        else:
            serialno = '.*'

        device = AdbClient(serialno=serialno)

        pre_test(device)

        for av in avs_to_test:
            do_test(device, av)

        post_test(device)

    print "Fine."


def test_av(dev, antivirus_apk_instance, results):

    print "##################################################"
    print "##### STAGE 1 : TESTING ANTIVIRUS %s        #####" % antivirus_apk_instance.apk_file
    print "##################################################"

    print "#STEP 1.1: installing AV"
    antivirus_apk_instance.full_install(dev)

    print "#STEP 1.2: starting AV"
    antivirus_apk_instance.start_default_activity(dev)

    print "#STEP 1.3: going online for updates"
    wifiutils.start_wifi_open_network(dev)
    raw_input('Now update the av signatures and press Return to continue')

    print "#STEP 1.4: setting the local network to install agent"
    wifiutils.start_wifi_av_network(dev)
    raw_input('IF AND ONLY IF YOU ARE CONNECTED TO TPLINK press Return to continue')

    print "#STEP 1.5 WARNING INSTALLING AGENT"
    agent = apk_dataLoader.get_apk('agent')
    agent.install(dev)

    print "#STEP 1.6 WARNING LAUNCHING AGENT"
    agent.start_default_activity(dev)

    print "#STEP 1.7 MANUAL Invisibility check (NB: Check agent launch is no blocked by AV)"
    raw_input('Please check invisibility (and sync) and press Return to continue')

    print "#STEP 1.8 Uninstalling agent"
    agent.clean(dev)

    print "#STEP 1.9 Uninstalling AV"
    antivirus_apk_instance.clean(dev)


def pre_test(device):
    print "###########################################"
    print "##### STAGE 0: PREPARING TEST         #####"
    print "###########################################"
    dev = device.serialno

    #STEP 0.1: uninstall agent
    print "#STEP 0.1: uninstall agent"
    apk_instance = apk_dataLoader.get_apk('agent')
    apk_instance.clean(dev)

    #STEP 0.2: delete wifimanager!
    print "#STEP 0.2: delete wifimanager!"
    apk_instance = apk_dataLoader.get_apk('wifi_enabler')
    apk_instance.clean(dev)


    #STEP 0.3: delete ALL the avs!
    print "#STEP 0.3: delete ALL the avs!"
    for av_to_delete in avs_all:
        av_instance = apk_dataLoader.get_apk_av(av_to_delete)
        av_instance.clean(dev)

    #STEP 0.4: delete EICAR virus
    print "#STEP 0.6: installing EICAR virus"
    eicar_instance = apk_dataLoader.get_apk('eicar')
    eicar_instance.clean(dev)

    #STEP 0.5: install rilcap
    print "#STEP 0.4: install rilcap using: %s"
    if not superuserutils.install_rilcap_shell(dev):
        exit()

    #STEP 0.6: set wifi to 'protected' network with no access to internet
    print "#STEP 0.5: set wifi to 'protected' network with no access to internet"
    wifiutils.start_wifi_av_network(dev)

    #STEP 0.7: installing EICAR virus
    print "#STEP 0.6: installing EICAR virus"
    eicar_instance = apk_dataLoader.get_apk('eicar')
    eicar_instance.install(dev)

    #STEP 0.8: installing BusyBox
    print "#STEP 0.8: installing BusyBox"
    adb.install_busybox('assets/busybox-android')


def post_test(device):

    print "###########################################"
    print "##### STAGE 99: CLOSING TEST          #####"
    print "###########################################"
    dev = device.serialno

    print "#STEP 99.1 deactivating all wifi networks"
    wifiutils.disable_wifi_network(dev)

    print "#STEP 99.2 uninstalling AGENT"
    agent_instance = apk_dataLoader.get_apk('agent')
    agent_instance.clean(dev)

    print "#STEP 99.3 uninstalling rilcap"
    print device.shell('rilcap ru')

    print "#STEP 99.4 uninstalling eicar"
    eicar_instance = apk_dataLoader.get_apk('eicar')
    eicar_instance.clean(dev)

    #STEP 99.5: delete wifimanager!
    print "#STEP 99.5: delete wifimanager!"
    apk_instance = apk_dataLoader.get_apk('wifi_enabler')
    apk_instance.clean(dev)

    #STEP 99.6: delete ALL the avs!
    print "#STEP 99.6: delete ALL the avs!"
    for av_to_delete in avs_all:
        av_instance = apk_dataLoader.get_apk_av(av_to_delete)
        av_instance.clean(dev)

    #STEP 99.7: uninstalling BusyBox
    print "#STEP 99.7: uninstalling BusyBox"
    adb.uninstall_busybox(dev)


def do_test(device_id, av):

    # device_id = device #utils.get_deviceId(device)
    # assert device_id
    # assert len(device_id) >= 8

    with open('tmp/test-%s-%s.csv' % (device_id, av), 'wb') as csvfile:
        # write header
        devicelist = csv.writer(csvfile, delimiter=";", quotechar="|", quoting=csv.QUOTE_MINIMAL)

        #props = get_properties(device, "ro.product.manufacturer", "build.model", "build.selinux.enforce",
                                    # "build.version.release")
        props = utils.get_properties(device_id, av, "ro.product.manufacturer", "ro.product.model",
                                     "ro.build.selinux.enforce", "ro.build.version.release")

        # adds results to csv
        try:
            ret = test_device(device_id, av, props)
            props["return"] = ret
            print "return: %s " % ret
        except Exception, ex:
            traceback.print_exc(utils.get_deviceId(device_id))
            props['error'] = "%s" % ex

        print props
        devicelist.writerow(props.values())


def test_device(device, av, results):
    # extracts serial number (cannot pass an object to command line!)
    dev = device.serialno

    #Starts av installation and stealth check)
    test_av(dev, apk_dataLoader.get_apk_av(av), results)

    # print "Antivirus installed, configured and launched!"

    #return True

    # if not adb.install(apk, dev):
    #     return "installation failed"
    #
    # results["installed"] = True
    # if not adb.executeGui(service, dev):
    #     return "execution failed"
    # else:
    #     results["executed"] = True
    #
    # print "sleep 120"
    # time.sleep(120)
    # print "slept"

    # no skype bacause we have no real network in av testing

    # print "Skype call and sleep"
    # device.shell("am start -a android.intent.action.VIEW -d skype:echo123?call")
    #
    # time.sleep(120)
    #print "slept"

    # print "Checking evidences!"
    #
    # sync_and_check_evidences(operation="QA", target_name="Test 9_3", results=results)

    #check persistance

    # print "reboot"
    # adb.reboot(dev)
    # time.sleep(120)
    #
    # processes = adb.ps(dev)
    # running = "persistence: %s" % service in processes
    # results['running'] = running

    return True


def sync_and_check_evidences(operation, target_name, results):
        # sync e verifica

    with build.connection() as c:

        assert c
        if not c.logged_in():
            return "Not logged in"
        else:
            print "logged in"

        operation_id, group_id = c.operation(operation)
        target_id = c.targets(operation_id, target_name)[0]
        print "target_id: %s" % target_id

        instances = []
        while not instances:
            #print "operation: %s, %s" % (operation_id, group_id)
            print "waiting for sync"
            instances = c.instances_by_deviceid(results["id"], operation_id)
            time.sleep(10)

        instance_id = instances[0]['_id']
        print "instance_id: %s " % instance_id

        info = c.instance_info(instance_id)
        results['instance_name'] = info['name']
        print "instance_info name: %s" % info['name']

        info_evidences = []
        counter = 0
        while not info_evidences and counter < 10:
            infos = c.infos(target_id, instance_id)
            info_evidences = [e['data']['content'] for e in infos if 'Root' in e['data']['content']]
            counter += 1
            time.sleep(10)

        print "info_evidences: %s: " % info_evidences
        if not info_evidences:
            results['root'] = 'No'
            return "No root"

        results['info'] = len(info_evidences) > 0
        root_method = info_evidences[0]
        results['root'] = root_method

        roots = [r for r in info_evidences if 'previous' not in r]
        print "roots: %s " % roots
        assert len(roots) == 1

        # get "Root: "
        # togliere previous, ne deve rimanere uno

        evidences = c.evidences(target_id, instance_id)
        print evidences
        device_evidences = [e['data']['content'] for e in evidences if e['type'] == 'device']
        screenshot_evidences = [e for e in evidences if e['type'] == 'screenshot']
        call_evidences = [e for e in evidences if e['type'] == 'call']
        print len(device_evidences), len(screenshot_evidences), len(call_evidences)

        #assert len(device_evidences) > 0
        #assert len(screenshot_evidences) > 0

        type_evidences = set()
        for e in evidences:
            type_evidences.add(e['type'])
        print type_evidences

        results['evidences'] = type_evidences

        #print info_evidences[0].encode('utf-8')
        #for ev in info_evidences:
        #    print [ e for e in ev.split('\n') if "Root" in e ]

if __name__ == "__main__":
    main()