From dc8b704332d89a32f7ae7ed2ad74f38767020b15 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 17 Sep 2021 15:14:17 -0700 Subject: [PATCH 001/203] Initial changes and testing for local dockerized detection testing service --- .../ansible/roles/update_escu/tasks/main.yml | 13 +- .../detection_testing_execution.py | 160 ++++++++++++++++-- .../modules/testing_service.py | 21 +-- .../detection_testing_batch/requirements.txt | 5 +- 4 files changed, 168 insertions(+), 31 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/ansible/roles/update_escu/tasks/main.yml b/automated_detection_testing/ci/detection_testing_batch/ansible/roles/update_escu/tasks/main.yml index 869e80ecc6..23fcbb9f24 100644 --- a/automated_detection_testing/ci/detection_testing_batch/ansible/roles/update_escu/tasks/main.yml +++ b/automated_detection_testing/ci/detection_testing_batch/ansible/roles/update_escu/tasks/main.yml @@ -14,8 +14,11 @@ group: splunk become: yes -- name: restart splunk - service: - name: splunkd - state: restarted - become: yes \ No newline at end of file +- name: restart containerized splunk + ansible.builtin.shell: /opt/splunk/bin/splunk restart + become: yes +#- name: restart splunk +# service: +# name: splunkd +# state: restarted +# become: yes \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index a1f58721f5..508d68f1ef 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -3,9 +3,14 @@ import argparse import shutil import os import time - +import random +import secrets +import docker +import threading +import queue from modules.github_service import GithubService from modules import aws_service, testing_service +import time DT_ATTACK_RANGE_STATE_STORE = "dt-attack-range-tf-state-store" @@ -13,18 +18,47 @@ DT_ATTACK_RANGE_STATE = "dt-attack-range-state" REGION = "eu-central-1" NAME = "detection-testing-attack-range" +PASSWORD_LENGTH=20 +MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING=2 +DOCKER_HUB_CONTAINER_PATH="splunk/splunk:latest" +BASE_CONTAINER_NAME="splunk" + +DOCKER_COMMIT_NAME = "splunk_configured" + + +BASE_CONTAINER_WEB_PORT=8000 +BASE_CONTAINER_MANAGEMENT_PORT=8089 + + +def wait_for_splunk_ready(splunk_container_name=None, splunk_web_port=None, max_seconds=30): + #The smarter version of this will try to hit one of the pages, + #probably the login page, and when that is available it means that + #splunk is fully started and ready to go. Until then, we just + #use a simple sleep + time.sleep(max_seconds) def main(args): parser = argparse.ArgumentParser(description="CI Detection Testing") - parser.add_argument("-b", "--branch", required=True, help="security content branch") - parser.add_argument("-u", "--uuid", required=True, help="uuid for detection test") - parser.add_argument("-pr", "--pr-number", required=False, help="Pull Request Number") + parser.add_argument("-b", "--branch", type=str, required=True, help="security content branch") + parser.add_argument("-u", "--uuid", type=str, required=True, help="uuid for detection test") + parser.add_argument("-pr", "--pr-number", type=int, required=False, help="Pull Request Number") + parser.add_argument("-n", "--num_containers", required=False, type=int, default=1, help="The number of splunk docker containers to start and run for testing") args = parser.parse_args() branch = args.branch uuid_test = args.uuid pr_number = args.pr_number + num_containers = args.num_containers + if num_containers < 1: + #Perhaps this should be a mock-run - do the initial steps but don't do testing on the containers? + print("Error, requested 0 containers. You must run with at least 1 container.") + sys.exit(1) + elif num_containers > MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING: + print("You requested to run with [%d] containers which may use a very large amount of resources \ + as they all run in parallel. The maximum suggested number of parallel. The maximum \ + suggested number of containers is [%d]. We will do what you asked, but be warned!"%(num_containers, MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING)) + if pr_number: github_service = GithubService(branch, pr_number) @@ -33,20 +67,124 @@ def main(args): test_files = github_service.get_changed_test_files() if len(test_files) == 0: print("No new detections to test.") - aws_service.dynamo_db_nothing_to_test(REGION, uuid_test, str(int(time.time()))) + #aws_service.dynamo_db_nothing_to_test(REGION, uuid_test, str(int(time.time()))) sys.exit(0) - dt_ar = aws_service.get_ar_information_from_dynamo_db(REGION, DT_ATTACK_RANGE_STATE) - splunk_instance = aws_service.get_splunk_instance(REGION, dt_ar['ssh_key_name']) + #dt_ar = aws_service.get_ar_information_from_dynamo_db(REGION, DT_ATTACK_RANGE_STATE) + #splunk_instance = aws_service.get_splunk_instance(REGION, dt_ar['ssh_key_name']) - splunk_ip = splunk_instance['NetworkInterfaces'][0]['Association']['PublicIp'] - splunk_password = dt_ar['password'] - ssh_key_name = dt_ar['ssh_key_name'] - private_key = dt_ar['private_key'] + #splunk_ip = splunk_instance['NetworkInterfaces'][0]['Association']['PublicIp'] + #splunk_password = dt_ar['password'] + #ssh_key_name = dt_ar['ssh_key_name'] + #private_key = dt_ar['private_key'] + + #because this is only accessible to localhost, the password doesn't need to be particularly secure + #We can also share it between splunk on all containers + + splunk_password = secrets.token_urlsafe(PASSWORD_LENGTH) + splunk_container_manager_threads = [] + + + print("***Files to test: %d"%(len(test_files))) + test_file_queue = queue.Queue() + for filename in test_files: + test_file_queue.put(filename) + print("***Test files enqueued") + + print("Getting docker client") + client = docker.client.from_env() + try: + print("Removing any existing containers called [%s]."%(BASE_CONTAINER_NAME)) + + c = client.containers.get(BASE_CONTAINER_NAME) + c.remove(v=True, force=True) #remove it even if it is running. remove volumes as well + except: + print("Container [%s] did not exist. No need to remove it"%(BASE_CONTAINER_NAME)) + + try: + try: + client.images.get(DOCKER_HUB_CONTAINER_PATH) + print("You already have an image named [%s]. We will not " + "download it again."%(DOCKER_HUB_CONTAINER_PATH)) + except: + print("You did not have an image named [%s]. We will " + "download it now from the Docker Hub. Please note " + "that this could take a long time depending on your " + "connection. It's around 2GB."%(DOCKER_HUB_CONTAINER_PATH)) + client.images.pull(DOCKER_HUB_CONTAINER_PATH) + print("Finished downloading the image [%s]"%(DOCKER_HUB_CONTAINER_PATH)) + + try: + image = client.images.get(DOCKER_COMMIT_NAME) + print("Found an image called [%s]. We will remove it"%(DOCKER_COMMIT_NAME)) + #Stop it if it's running, remove associated volumes too + image.remove(v=True, force=True) + except: + print("No image found named [%s]"%(DOCKER_COMMIT_NAME)) + + + + + + print("Creating a new container called [%s]"%(BASE_CONTAINER_NAME)) + environment = {"SPLUNK_START_ARGS": "--accept-license", + "SPLUNK_PASSWORD" : splunk_password } + ports= {"8000/tcp": BASE_CONTAINER_WEB_PORT - 1, + "8089/tcp": BASE_CONTAINER_MANAGEMENT_PORT - 1 + } + + base_container = client.containers.create("splunk/splunk:latest", ports=ports, environment=environment, name=BASE_CONTAINER_NAME, detach=True) + print("Running the new container called [%s]"%(BASE_CONTAINER_NAME)) + base_container.start() + print("Container is running [%s]"%(BASE_CONTAINER_NAME)) + print("Sleep for 60 seconds to allow the container to fully start up...") + wait_for_splunk_ready(max_seconds=60) + print("The container has fully started!") + + except Exception as e: + print("There was an error getting the base container up and running. " + "We cannot recover from this: [%s]\nGoodbye..."%(str(e))) + sys.exit(1) + + print("Do the ESCU installation on this container. That way we don't have to " + "do it on every container that we then spin up.") + + testing_service.prepare_detection_testing(BASE_CONTAINER_NAME, splunk_password) + print("Waiting for a few seconds for the splunk app to come up.") + wait_for_splunk_ready(max_seconds=30) + + print("Stopping the running container [%s]"%(BASE_CONTAINER_NAME)) + base_container.stop() + + print("Committing the configured container: [%s]--->[%s]"%(BASE_CONTAINER_NAME, DOCKER_COMMIT_NAME)) + base_container.commit(repository=DOCKER_COMMIT_NAME) + + + ''' + print("Removing container called splunk if it exists already...") + client.container.r + + print("Build base docker container") + + + for container_index in range(num_containers): + container_name = "splunk_runner_%d"%(container_index) + t = threading.Thread(target=splunk_container_manager, args=(test_file_queue, container_name, splunk_password)) + splunk_container_manager_threads.append(t) + + splunk_container_name = "splunk" testing_service.prepare_detection_testing(ssh_key_name, private_key, splunk_ip, splunk_password) testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) + ''' +def splunk_container_manager(testing_queue, container_name, splunk_password): + #Is this going to be safe to use in different threads + docker_client = docker.client.from_env() + #start up the container from the base container + #Assume that the base container has already been fully built with + #escu etc + pass if __name__ == "__main__": main(sys.argv[1:]) \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index cdb2502b3e..ab7511ffd5 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -10,20 +10,14 @@ from modules.DataManipulation import DataManipulation from modules import splunk_sdk, aws_service -def prepare_detection_testing(ssh_key_name, private_key, splunk_ip, splunk_password): - with open(ssh_key_name, 'w') as file : - file.write(private_key) - os.chmod(ssh_key_name, 0o600) - - sys.path.append(os.path.join(os.getcwd(),'security_content/bin')) - +def prepare_detection_testing(splunk_ip, splunk_password): try: module = __import__('generate') results = module.main(REPO_PATH = 'security_content' , OUTPUT_PATH = 'security_content/dist/escu', PRODUCT = 'ESCU', VERBOSE = 'False' ) except Exception as e: print('Error: ' + str(e)) - update_ESCU_app(splunk_ip, ssh_key_name, splunk_password) + update_ESCU_app(splunk_ip, splunk_password) def test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test): @@ -128,22 +122,21 @@ def load_file(file_path): return file -def update_ESCU_app(splunk_ip, ssh_key_name, splunk_password): +def update_ESCU_app(container_name, splunk_password): print("Update ESCU App. This can take some time") ansible_vars = {} - ansible_vars['ansible_user'] = 'ubuntu' - ansible_vars['ansible_ssh_private_key_file'] = ssh_key_name + ansible_vars['ansible_user'] = 'ansible' ansible_vars['splunk_password'] = splunk_password ansible_vars['security_content_path'] = 'security_content' - - cmdline = "-i %s, -u ubuntu" % (splunk_ip) + + cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), cmdline=cmdline, roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), playbook=os.path.join(os.path.dirname(__file__), '../ansible/update_escu.yml'), extravars=ansible_vars) - + print("Successfully updated the ESCU App!") def replay_attack_dataset(splunk_ip, splunk_password, ssh_key_name, folder_name, index, sourcetype, source, out): diff --git a/automated_detection_testing/ci/detection_testing_batch/requirements.txt b/automated_detection_testing/ci/detection_testing_batch/requirements.txt index 698a3b0abf..9fd488fd1f 100644 --- a/automated_detection_testing/ci/detection_testing_batch/requirements.txt +++ b/automated_detection_testing/ci/detection_testing_batch/requirements.txt @@ -7,4 +7,7 @@ Jinja2==3.0.0 PyYAML==5.4 requests==2.25.1 six==1.16.0 -splunk-sdk==1.6.12 \ No newline at end of file +splunk-sdk==1.6.12 +#newest version of docker for managing the splunk containers +#we will freeze at a specific version later +docker \ No newline at end of file From e5c87027c10d05822a8c7485093943031a5471a5 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 17 Sep 2021 16:45:05 -0700 Subject: [PATCH 002/203] Lots more changes building out the skeleton of the docker testing framework. Needs testing, breakup into simpler files, documentation, etc. But a good start. --- .../detection_testing_execution.py | 100 +++++++++++++++--- .../modules/splunk_sdk.py | 12 +-- .../modules/testing_service.py | 56 +++++----- 3 files changed, 115 insertions(+), 53 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 508d68f1ef..3ca89650c0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -24,6 +24,7 @@ DOCKER_HUB_CONTAINER_PATH="splunk/splunk:latest" BASE_CONTAINER_NAME="splunk" DOCKER_COMMIT_NAME = "splunk_configured" +RUNNER_BASE_NAME = "splunk_runner" BASE_CONTAINER_WEB_PORT=8000 @@ -156,35 +157,100 @@ def main(args): print("Stopping the running container [%s]"%(BASE_CONTAINER_NAME)) base_container.stop() + #The part below does not seem to be working as expected. Will need to look into it + #When I create the new container, it fails to boot with + '''The CA file specified (/opt/splunk/etc/auth/cacert.pem) does not exist. Cannot continue. + SSL certificate generation failed. + + + MSG: + + non-zero return code + ''' + #I am almost positive that I'm doing this wrong but it works for now... print("Committing the configured container: [%s]--->[%s]"%(BASE_CONTAINER_NAME, DOCKER_COMMIT_NAME)) base_container.commit(repository=DOCKER_COMMIT_NAME) + - - ''' - print("Removing container called splunk if it exists already...") - client.container.r - - print("Build base docker container") - - + print("Make all the threads...") for container_index in range(num_containers): - container_name = "splunk_runner_%d"%(container_index) - t = threading.Thread(target=splunk_container_manager, args=(test_file_queue, container_name, splunk_password)) + container_name = "%s_%d"%(RUNNER_BASE_NAME, container_index) + web_port = BASE_CONTAINER_WEB_PORT + container_index + management_port = BASE_CONTAINER_MANAGEMENT_PORT + container_index + print("Creating a new container called [%s]"%(container_name)) + environment = {"SPLUNK_START_ARGS": "--accept-license", + "SPLUNK_PASSWORD" : splunk_password } + ports= {"8000/tcp": web_port, + "8089/tcp": management_port + } + + test_container = client.containers.create(DOCKER_COMMIT_NAME, ports=ports, environment=environment, name=container_name, detach=True, volumes_from=[BASE_CONTAINER_NAME]) + t = threading.Thread(target=splunk_container_manager, args=(test_file_queue, container_name, "127.0.0.1", splunk_password, management_port, uuid_test)) splunk_container_manager_threads.append(t) - splunk_container_name = "splunk" + print("Start all the threads...") + for t in splunk_container_manager_threads: + t.start() + + #Try to join all the threads + for t in splunk_container_manager_threads: + t.join() #blocks on waiting to join + print("Joined a thread!") - testing_service.prepare_detection_testing(ssh_key_name, private_key, splunk_ip, splunk_password) - testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) - ''' + print("DONE!") + #read all the results out from the output queue + try: + while True: -def splunk_container_manager(testing_queue, container_name, splunk_password): + o = output_queue.get(block=False) + print("Got from queue:") + print(o) + except queue.Empty: + print("That's all the output!") + + #now we are done! + + + #detection testing service has already been prepared, no need to do it here! + #testing_service.prepare_detection_testing(ssh_key_name, private_key, splunk_ip, splunk_password) + + #testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) + + +def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_password, splunk_port, uuid_test, output_queue): + print("Starting the container [%s] after a sleep"%(container_name)) #Is this going to be safe to use in different threads - docker_client = docker.client.from_env() + client = docker.client.from_env() #start up the container from the base container #Assume that the base container has already been fully built with #escu etc - pass + #sleep for a little bit so that we don't all start at once... + time.sleep(random.randrange(0,120)) + + container = client.containers.get(container_name) + print("Starting the container [%s]"%(container_name)) + container.start() + wait_for_splunk_ready(max_seconds=60) + + index=0 + try: + while True: + #Try to get something from the queue + detection_to_test = testing_queue.get(block=False) + + + #There is a detection to test + print("Container [%s]--->[%s]"%(container_name, detection_to_test)) + + result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, index, uuid_test) + output_queue.put(result) + index=(index+1)%10 + except queue.Empty: + print("Queue was empty, [%s] finished testing detections!"%(container_name)) + + print("Shutting down the container [%s]"%(container_name)) + container.stop() + print("Finished shutting down the container [%s]"&(container_name)) if __name__ == "__main__": main(sys.argv[1:]) \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 159e43eecc..854ff47727 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -5,11 +5,11 @@ import splunklib.client as client import splunklib.results as results import requests -def test_baseline_search(splunk_host, splunk_password, search, pass_condition, baseline_name, baseline_file, earliest_time, latest_time): +def test_baseline_search(splunk_host, splunk_port, splunk_password, search, pass_condition, baseline_name, baseline_file, earliest_time, latest_time): try: service = client.connect( host=splunk_host, - port=8089, + port=splunk_port, username='admin', password=splunk_password ) @@ -54,11 +54,11 @@ def test_baseline_search(splunk_host, splunk_password, search, pass_condition, b return test_results -def test_detection_search(splunk_host, splunk_password, search, pass_condition, detection_name, detection_file, earliest_time, latest_time): +def test_detection_search(splunk_host, splunk_port, splunk_password, search, pass_condition, detection_name, detection_file, earliest_time, latest_time): try: service = client.connect( host=splunk_host, - port=8089, + port=splunk_port, username='admin', password=splunk_password ) @@ -103,11 +103,11 @@ def test_detection_search(splunk_host, splunk_password, search, pass_condition, return test_results -def delete_attack_data(splunk_host, splunk_password): +def delete_attack_data(splunk_host, splunk_password, splunk_port): try: service = client.connect( host=splunk_host, - port=8089, + port=splunk_port, username='admin', password=splunk_password ) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index ab7511ffd5..172536bc16 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -20,43 +20,40 @@ def prepare_detection_testing(splunk_ip, splunk_password): update_ESCU_app(splunk_ip, splunk_password) -def test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test): - test_index = 1 - result_tests = [] - for test_file in test_files: - uuid_var = str(uuid.uuid4()) - result_test = test_detection(ssh_key_name, private_key, splunk_ip, splunk_password, test_file, test_index, uuid_test, uuid_var) - result_tests.append(result_test) - if test_index == 10: - test_index = 1 - else: - test_index = test_index + 1 +def test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, test_file, test_index, uuid_test): - # delete test data - splunk_sdk.delete_attack_data(splunk_ip, splunk_password) + uuid_var = str(uuid.uuid4()) + result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var) + - for result_test in result_tests: - if result_test['detection_result']['error']: - print('Test failed for detection: ' + result_test['detection_result']['detection_name'] + ' ' + result_test['detection_result']['detection_file']) - else: - print('Test passed for detection: ' + result_test['detection_result']['detection_name'] + ' ' + result_test['detection_result']['detection_file']) + # delete test data + splunk_sdk.delete_attack_data(container_name, splunk_password, splunk_port) - return result_tests + + if result_test['detection_result']['error']: + print('Test failed for detection: ' + result_test['detection_result']['detection_name'] + ' ' + result_test['detection_result']['detection_file']) + else: + print('Test passed for detection: ' + result_test['detection_result']['detection_name'] + ' ' + result_test['detection_result']['detection_file']) + + return result_test -def test_detection(ssh_key_name, private_key, splunk_ip, splunk_password, test_file, test_index, uuid_test, uuid_var): +def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var): try: test_file_obj = load_file("security_content/" + test_file[2:]) except Exception as e: - print('Error: ' + str(e)) - return + raise + #print('Error: ' + str(e)) + #return if not test_file_obj: + print("Not test_file_obj!") + raise return #print(test_file_obj) # write entry dynamodb - aws_service.add_detection_results_in_dynamo_db('eu-central-1', uuid_var , uuid_test, test_file_obj['tests'][0]['name'], test_file_obj['tests'][0]['file'], str(int(time.time()))) + #aws_service.add_detection_results_in_dynamo_db('eu-central-1', uuid_var , uuid_test, test_file_obj['tests'][0]['name'], test_file_obj['tests'][0]['file'], str(int(time.time()))) epoch_time = str(int(time.time())) folder_name = "attack_data_" + epoch_time @@ -74,7 +71,7 @@ def test_detection(ssh_key_name, private_key, splunk_ip, splunk_password, test_f data_manipulation = DataManipulation() data_manipulation.manipulate_timestamp(folder_name + '/' + attack_data['file_name'], attack_data['sourcetype'], attack_data['source']) - replay_attack_dataset(splunk_ip, splunk_password, ssh_key_name, folder_name, 'test' + str(test_index), attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) + replay_attack_dataset(container_name, splunk_password, folder_name, 'test' + str(test_index), attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) time.sleep(200) @@ -89,12 +86,12 @@ def test_detection(ssh_key_name, private_key, splunk_ip, splunk_password, test_f result_obj = dict() result_obj['baseline'] = baseline_obj['name'] result_obj['baseline_file'] = baseline_obj['file'] - result = splunk_sdk.test_baseline_search(splunk_ip, splunk_password, baseline['search'], baseline_obj['pass_condition'], baseline['name'], baseline_obj['file'], baseline_obj['earliest_time'], baseline_obj['latest_time']) + result = splunk_sdk.test_baseline_search(splunk_ip, splunk_port, splunk_password, baseline['search'], baseline_obj['pass_condition'], baseline['name'], baseline_obj['file'], baseline_obj['earliest_time'], baseline_obj['latest_time']) result_test['baselines_result'] = results_baselines detection_file_name = test['file'] detection = load_file(os.path.join(os.path.dirname(__file__), '../security_content/detections', detection_file_name)) - result_detection = splunk_sdk.test_detection_search(splunk_ip, splunk_password, detection['search'], test['pass_condition'], detection['name'], test['file'], test['earliest_time'], test['latest_time']) + result_detection = splunk_sdk.test_detection_search(splunk_ip, splunk_port, splunk_password, detection['search'], test['pass_condition'], detection['name'], test['file'], test['earliest_time'], test['latest_time']) result_detection['detection_name'] = test['name'] result_detection['detection_file'] = test['file'] @@ -139,18 +136,17 @@ def update_ESCU_app(container_name, splunk_password): print("Successfully updated the ESCU App!") -def replay_attack_dataset(splunk_ip, splunk_password, ssh_key_name, folder_name, index, sourcetype, source, out): +def replay_attack_dataset(container_name, splunk_password, folder_name, index, sourcetype, source, out): ansible_vars = {} ansible_vars['folder_name'] = folder_name - ansible_vars['ansible_user'] = 'ubuntu' - ansible_vars['ansible_ssh_private_key_file'] = ssh_key_name + ansible_vars['ansible_user'] = 'ansible' ansible_vars['splunk_password'] = splunk_password ansible_vars['out'] = out ansible_vars['sourcetype'] = sourcetype ansible_vars['source'] = source ansible_vars['index'] = index - cmdline = "-i %s, -u ubuntu" % (splunk_ip) + cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), cmdline=cmdline, roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), From 4d1c456a337a5142e4fb790836079163ae4d3ca7 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 17 Sep 2021 16:49:05 -0700 Subject: [PATCH 003/203] Removed some aws calls which should no longer be made --- .../ci/detection_testing_batch/modules/testing_service.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 172536bc16..6cee4cb149 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -7,7 +7,7 @@ import os import time import requests from modules.DataManipulation import DataManipulation -from modules import splunk_sdk, aws_service +from modules import splunk_sdk def prepare_detection_testing(splunk_ip, splunk_password): @@ -98,9 +98,11 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test result_test['detection_result'] = result_detection if result_detection['error']: - aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'failed') + print("failed") + #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'failed') else: - aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'passed') + print("passed") + #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'passed') return result_test From ebb00af725ac332888168dc6ed05fd5e9b29b870 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 17 Sep 2021 16:58:14 -0700 Subject: [PATCH 004/203] Forgot to declare results_queue before using it. --- .../detection_testing_batch/detection_testing_execution.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 3ca89650c0..a5fe12c9a6 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -173,6 +173,7 @@ def main(args): print("Make all the threads...") + results_queue = queue.Queue() for container_index in range(num_containers): container_name = "%s_%d"%(RUNNER_BASE_NAME, container_index) web_port = BASE_CONTAINER_WEB_PORT + container_index @@ -185,7 +186,7 @@ def main(args): } test_container = client.containers.create(DOCKER_COMMIT_NAME, ports=ports, environment=environment, name=container_name, detach=True, volumes_from=[BASE_CONTAINER_NAME]) - t = threading.Thread(target=splunk_container_manager, args=(test_file_queue, container_name, "127.0.0.1", splunk_password, management_port, uuid_test)) + t = threading.Thread(target=splunk_container_manager, args=(test_file_queue, container_name, "127.0.0.1", splunk_password, management_port, uuid_test, results_queue)) splunk_container_manager_threads.append(t) print("Start all the threads...") @@ -217,7 +218,7 @@ def main(args): #testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) -def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_password, splunk_port, uuid_test, output_queue): +def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_password, splunk_port, uuid_test, results_queue): print("Starting the container [%s] after a sleep"%(container_name)) #Is this going to be safe to use in different threads client = docker.client.from_env() @@ -243,7 +244,7 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa print("Container [%s]--->[%s]"%(container_name, detection_to_test)) result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, index, uuid_test) - output_queue.put(result) + results_queue.put(result) index=(index+1)%10 except queue.Empty: print("Queue was empty, [%s] finished testing detections!"%(container_name)) From 94f05e573c66d9bb230710d1c36f53d6c0cf8568 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 17 Sep 2021 17:33:20 -0700 Subject: [PATCH 005/203] Added some error handling so that the show can go on while we debug. Fixed another bad variable naming error --- .../detection_testing_execution.py | 2 +- .../modules/testing_service.py | 51 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index a5fe12c9a6..64c21bd350 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -203,7 +203,7 @@ def main(args): try: while True: - o = output_queue.get(block=False) + o = results_queue.get(block=False) print("Got from queue:") print(o) except queue.Empty: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 6cee4cb149..3a0f8cbbd0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -77,33 +77,36 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test result_test = {} test = test_file_obj['tests'][0] + try: + if 'baselines' in test: + results_baselines = [] + for baseline_obj in test['baselines']: + baseline_file_name = baseline_obj['file'] + baseline = load_file(os.path.join(os.path.dirname(__file__), '../security_content', baseline_file_name)) + result_obj = dict() + result_obj['baseline'] = baseline_obj['name'] + result_obj['baseline_file'] = baseline_obj['file'] + result = splunk_sdk.test_baseline_search(splunk_ip, splunk_port, splunk_password, baseline['search'], baseline_obj['pass_condition'], baseline['name'], baseline_obj['file'], baseline_obj['earliest_time'], baseline_obj['latest_time']) + result_test['baselines_result'] = results_baselines - if 'baselines' in test: - results_baselines = [] - for baseline_obj in test['baselines']: - baseline_file_name = baseline_obj['file'] - baseline = load_file(os.path.join(os.path.dirname(__file__), '../security_content', baseline_file_name)) - result_obj = dict() - result_obj['baseline'] = baseline_obj['name'] - result_obj['baseline_file'] = baseline_obj['file'] - result = splunk_sdk.test_baseline_search(splunk_ip, splunk_port, splunk_password, baseline['search'], baseline_obj['pass_condition'], baseline['name'], baseline_obj['file'], baseline_obj['earliest_time'], baseline_obj['latest_time']) - result_test['baselines_result'] = results_baselines + detection_file_name = test['file'] + detection = load_file(os.path.join(os.path.dirname(__file__), '../security_content/detections', detection_file_name)) + result_detection = splunk_sdk.test_detection_search(splunk_ip, splunk_port, splunk_password, detection['search'], test['pass_condition'], detection['name'], test['file'], test['earliest_time'], test['latest_time']) - detection_file_name = test['file'] - detection = load_file(os.path.join(os.path.dirname(__file__), '../security_content/detections', detection_file_name)) - result_detection = splunk_sdk.test_detection_search(splunk_ip, splunk_port, splunk_password, detection['search'], test['pass_condition'], detection['name'], test['file'], test['earliest_time'], test['latest_time']) - - result_detection['detection_name'] = test['name'] - result_detection['detection_file'] = test['file'] - result_test['detection_result'] = result_detection - - if result_detection['error']: - print("failed") - #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'failed') - else: - print("passed") - #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'passed') + result_detection['detection_name'] = test['name'] + result_detection['detection_file'] = test['file'] + result_test['detection_result'] = result_detection + if result_detection['error']: + print("failed") + #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'failed') + else: + print("passed") + #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'passed') + except Exception as e: + print("Caught some exception in test detection: [%s]"%(str(e))) + #just log the error itself for now so that we can continue + result_test = str(e) return result_test From 5588eeabe1faf006490d7d74c9a5c8b4234433f5 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 17 Sep 2021 17:35:50 -0700 Subject: [PATCH 006/203] Fixed ugly multi line comment --- .../detection_testing_batch/detection_testing_execution.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 64c21bd350..10d3c685be 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -56,9 +56,9 @@ def main(args): print("Error, requested 0 containers. You must run with at least 1 container.") sys.exit(1) elif num_containers > MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING: - print("You requested to run with [%d] containers which may use a very large amount of resources \ - as they all run in parallel. The maximum suggested number of parallel. The maximum \ - suggested number of containers is [%d]. We will do what you asked, but be warned!"%(num_containers, MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING)) + print("You requested to run with [%d] containers which may use a very large amount of resources " + "as they all run in parallel. The maximum suggested number of parallel. The maximum " + "suggested number of containers is [%d]. We will do what you asked, but be warned!"%(num_containers, MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING)) if pr_number: From 2a3e220249c4a4495574016b36b8ba0f92214496 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 17 Sep 2021 17:51:27 -0700 Subject: [PATCH 007/203] Made the splunk management port dynamic for uploading replay data. --- .../ansible/roles/attack_replay/tasks/main.yml | 2 +- .../ci/detection_testing_batch/modules/testing_service.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml b/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml index 5265bd86ff..1f1ccfe8e9 100644 --- a/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml +++ b/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml @@ -8,7 +8,7 @@ - name: Call oneshot import uri: - url: https://localhost:8089/services/data/inputs/oneshot + url: https://localhost:{{ splunk_management_port }}/services/data/inputs/oneshot validate_certs: no method: POST user: admin diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 3a0f8cbbd0..e785833828 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -71,7 +71,7 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test data_manipulation = DataManipulation() data_manipulation.manipulate_timestamp(folder_name + '/' + attack_data['file_name'], attack_data['sourcetype'], attack_data['source']) - replay_attack_dataset(container_name, splunk_password, folder_name, 'test' + str(test_index), attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) + replay_attack_dataset(container_name, splunk_port, splunk_password, folder_name, 'test' + str(test_index), attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) time.sleep(200) @@ -141,7 +141,7 @@ def update_ESCU_app(container_name, splunk_password): print("Successfully updated the ESCU App!") -def replay_attack_dataset(container_name, splunk_password, folder_name, index, sourcetype, source, out): +def replay_attack_dataset(container_name, splunk_port, splunk_password, folder_name, index, sourcetype, source, out): ansible_vars = {} ansible_vars['folder_name'] = folder_name ansible_vars['ansible_user'] = 'ansible' @@ -150,6 +150,7 @@ def replay_attack_dataset(container_name, splunk_password, folder_name, index, s ansible_vars['sourcetype'] = sourcetype ansible_vars['source'] = source ansible_vars['index'] = index + ansible_vars['splunk_management_port'] = splunk_port cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), From ba78e372e2789faef60e81ce91c3f3f42ca0dc84 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 17 Sep 2021 18:12:02 -0700 Subject: [PATCH 008/203] Changed a port back to the original since it's run inside the docker container as part of a playbook --- .../ansible/roles/attack_replay/tasks/main.yml | 2 +- .../ci/detection_testing_batch/modules/testing_service.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml b/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml index 1f1ccfe8e9..5265bd86ff 100644 --- a/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml +++ b/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml @@ -8,7 +8,7 @@ - name: Call oneshot import uri: - url: https://localhost:{{ splunk_management_port }}/services/data/inputs/oneshot + url: https://localhost:8089/services/data/inputs/oneshot validate_certs: no method: POST user: admin diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index e785833828..3a0f8cbbd0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -71,7 +71,7 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test data_manipulation = DataManipulation() data_manipulation.manipulate_timestamp(folder_name + '/' + attack_data['file_name'], attack_data['sourcetype'], attack_data['source']) - replay_attack_dataset(container_name, splunk_port, splunk_password, folder_name, 'test' + str(test_index), attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) + replay_attack_dataset(container_name, splunk_password, folder_name, 'test' + str(test_index), attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) time.sleep(200) @@ -141,7 +141,7 @@ def update_ESCU_app(container_name, splunk_password): print("Successfully updated the ESCU App!") -def replay_attack_dataset(container_name, splunk_port, splunk_password, folder_name, index, sourcetype, source, out): +def replay_attack_dataset(container_name, splunk_password, folder_name, index, sourcetype, source, out): ansible_vars = {} ansible_vars['folder_name'] = folder_name ansible_vars['ansible_user'] = 'ansible' @@ -150,7 +150,6 @@ def replay_attack_dataset(container_name, splunk_port, splunk_password, folder_n ansible_vars['sourcetype'] = sourcetype ansible_vars['source'] = source ansible_vars['index'] = index - ansible_vars['splunk_management_port'] = splunk_port cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), From 0cd2cd850fad8f5c38610284415f6fa00d46cb8a Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 20 Sep 2021 11:01:06 -0700 Subject: [PATCH 009/203] Duplicate folder names were clobbering each other. Also commented around initial steps to speed up testing time. We will re use the docker containers that we initially built each time for testing. --- .../detection_testing_execution.py | 20 +++++++++++++------ .../modules/testing_service.py | 4 ++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 10d3c685be..bc8a2f8f69 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -115,6 +115,7 @@ def main(args): client.images.pull(DOCKER_HUB_CONTAINER_PATH) print("Finished downloading the image [%s]"%(DOCKER_HUB_CONTAINER_PATH)) + ''' try: image = client.images.get(DOCKER_COMMIT_NAME) print("Found an image called [%s]. We will remove it"%(DOCKER_COMMIT_NAME)) @@ -156,21 +157,28 @@ def main(args): print("Stopping the running container [%s]"%(BASE_CONTAINER_NAME)) base_container.stop() - + #The part below does not seem to be working as expected. Will need to look into it #When I create the new container, it fails to boot with - '''The CA file specified (/opt/splunk/etc/auth/cacert.pem) does not exist. Cannot continue. - SSL certificate generation failed. + # The CA file specified (/opt/splunk/etc/auth/cacert.pem) does not exist. Cannot continue. + # SSL certificate generation failed. - MSG: + # MSG: - non-zero return code - ''' + # non-zero return code + #I am almost positive that I'm doing this wrong but it works for now... print("Committing the configured container: [%s]--->[%s]"%(BASE_CONTAINER_NAME, DOCKER_COMMIT_NAME)) base_container.commit(repository=DOCKER_COMMIT_NAME) + ''' + + except Exception as e: + #Remove this since it exists in commented out section above. + print("There was an error getting the base container up and running. " + "We cannot recover from this: [%s]\nGoodbye..."%(str(e))) + sys.exit(1) print("Make all the threads...") results_queue = queue.Queue() diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 3a0f8cbbd0..131738174d 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -55,8 +55,8 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test # write entry dynamodb #aws_service.add_detection_results_in_dynamo_db('eu-central-1', uuid_var , uuid_test, test_file_obj['tests'][0]['name'], test_file_obj['tests'][0]['file'], str(int(time.time()))) - epoch_time = str(int(time.time())) - folder_name = "attack_data_" + epoch_time + #epoch_time = str(int(time.time())) + folder_name = "attack_data_%s"%(uuid.uuid4()) os.mkdir(folder_name) for attack_data in test_file_obj['tests'][0]['attack_data']: From f30a4c6997cc09bdd934eaaecc5639ee32cddbca Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 20 Sep 2021 11:05:17 -0700 Subject: [PATCH 010/203] Re-added rebuild code for full test. --- .../detection_testing_execution.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index bc8a2f8f69..d897b73067 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -115,7 +115,7 @@ def main(args): client.images.pull(DOCKER_HUB_CONTAINER_PATH) print("Finished downloading the image [%s]"%(DOCKER_HUB_CONTAINER_PATH)) - ''' + try: image = client.images.get(DOCKER_COMMIT_NAME) print("Found an image called [%s]. We will remove it"%(DOCKER_COMMIT_NAME)) @@ -172,13 +172,9 @@ def main(args): print("Committing the configured container: [%s]--->[%s]"%(BASE_CONTAINER_NAME, DOCKER_COMMIT_NAME)) base_container.commit(repository=DOCKER_COMMIT_NAME) - ''' - except Exception as e: - #Remove this since it exists in commented out section above. - print("There was an error getting the base container up and running. " - "We cannot recover from this: [%s]\nGoodbye..."%(str(e))) - sys.exit(1) + + print("Make all the threads...") results_queue = queue.Queue() From e0961ad0d31ec07c7cf7024a590a9cfe93a85bc2 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 20 Sep 2021 17:21:46 -0700 Subject: [PATCH 011/203] Still some issues when running more than one container in parallel. Might be a management port issue, but needs debugging. --- .../detection_testing_execution.py | 209 +++++++++++++----- .../modules/splunk_sdk.py | 2 + .../modules/testing_service.py | 59 ++--- 3 files changed, 191 insertions(+), 79 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index d897b73067..7e6e71316a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -13,10 +13,6 @@ from modules import aws_service, testing_service import time -DT_ATTACK_RANGE_STATE_STORE = "dt-attack-range-tf-state-store" -DT_ATTACK_RANGE_STATE = "dt-attack-range-state" -REGION = "eu-central-1" -NAME = "detection-testing-attack-range" PASSWORD_LENGTH=20 MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING=2 @@ -31,6 +27,8 @@ BASE_CONTAINER_WEB_PORT=8000 BASE_CONTAINER_MANAGEMENT_PORT=8089 + + def wait_for_splunk_ready(splunk_container_name=None, splunk_web_port=None, max_seconds=30): #The smarter version of this will try to hit one of the pages, #probably the login page, and when that is available it means that @@ -38,6 +36,45 @@ def wait_for_splunk_ready(splunk_container_name=None, splunk_web_port=None, max_ #use a simple sleep time.sleep(max_seconds) + +def remove_container(docker_client, container_name, force=True): + try: + container = docker_client.containers.get(container_name) + except Exception as e: + print("Could not find Docker Container [%s]. Container does not exist"%(container_name)) + return True + try: + container.remove(v=True, force=force) #remove it even if it is running. remove volumes as well + print("Successfully removed Docker Container [%s]"%(container_name)) + except Exception as e: + print("Could not remove Docker Container [%s]"%(container_name)) + raise(Exception("CONTAINER REMOVE ERROR")) + + +def stop_container(docker_client, container_name, force=True): + try: + container = docker_client.containers.get(container_name) + except: + print("Container with name [%s] does not exist"%(container_name)) + return True + + try: + print("Checking to see if [%s] is running..."%(container_name), end='') + if container.status == 'exited': + print("NO") + return True + else: + print("YES (container.status is [%s])"%(container.status)) + print("Stopping [%s]"%(container_name)) + container.stop(force=force) + return True + except Exception as e: + print("Error trying to stop the container [%s]"%(container_name)) + raise(Exception("CONTAINER STOP ERROR")) + + + + def main(args): parser = argparse.ArgumentParser(description="CI Detection Testing") @@ -45,12 +82,19 @@ def main(args): parser.add_argument("-u", "--uuid", type=str, required=True, help="uuid for detection test") parser.add_argument("-pr", "--pr-number", type=int, required=False, help="Pull Request Number") parser.add_argument("-n", "--num_containers", required=False, type=int, default=1, help="The number of splunk docker containers to start and run for testing") + + parser.add_argument("-i", "--reuse_images", required=False, type=bool, default=False, help="Should existing images be re-used, or should they be redownloaded?") + parser.add_argument("-c", "--reuse_containers", required=False, type=bool, default=False, help="Should existing containers be re-used, or should they be rebuilt?") args = parser.parse_args() branch = args.branch uuid_test = args.uuid pr_number = args.pr_number num_containers = args.num_containers + reuse_containers = args.reuse_containers + reuse_images = args.reuse_images + + if num_containers < 1: #Perhaps this should be a mock-run - do the initial steps but don't do testing on the containers? print("Error, requested 0 containers. You must run with at least 1 container.") @@ -82,7 +126,10 @@ def main(args): #because this is only accessible to localhost, the password doesn't need to be particularly secure #We can also share it between splunk on all containers - splunk_password = secrets.token_urlsafe(PASSWORD_LENGTH) + #splunk_password = secrets.token_urlsafe(PASSWORD_LENGTH) + + #Only accessible on local host, it's okay to expose the password for debugging + splunk_password = "123456qwerty!@#$%^QWERTY" splunk_container_manager_threads = [] @@ -94,70 +141,123 @@ def main(args): print("Getting docker client") client = docker.client.from_env() + try: print("Removing any existing containers called [%s]."%(BASE_CONTAINER_NAME)) c = client.containers.get(BASE_CONTAINER_NAME) - c.remove(v=True, force=True) #remove it even if it is running. remove volumes as well except: - print("Container [%s] did not exist. No need to remove it"%(BASE_CONTAINER_NAME)) + print("Container [%s] did not exist. No need to remove it. It will; be created for you."%(BASE_CONTAINER_NAME)) + c = None + + if (c and reuse_containers): + print("Found a container called [%s]. NOT removing it because you have specified --reuse_containers [%s]. " + "However, we must stop the container. Stopping it now..."%(BASE_CONTAINER_NAME, reuse_containers)) + stop_container(client, BASE_CONTAINER_NAME) + + elif c: + print("Found a container called [%s]. Removing it because you have specified --reuse_containers [%s]"%(BASE_CONTAINER_NAME, reuse_containers)) + remove_container(client, BASE_CONTAINER_NAME) + + + + + download_image = False try: + client.images.get(DOCKER_HUB_CONTAINER_PATH) + if reuse_images: + print("You already have an image named [%s]."%(DOCKER_HUB_CONTAINER_PATH)) + download_image = False + else: + print("You already have an image named [%s]., " + "but have speicified --reuse_images %s"%(DOCKER_HUB_CONTAINER_PATH, reuse_images)) + download_image = True + + except: + print("You did not have an image named [%s]."%(DOCKER_HUB_CONTAINER_PATH)) + download_image = True + + if download_image: try: - client.images.get(DOCKER_HUB_CONTAINER_PATH) - print("You already have an image named [%s]. We will not " - "download it again."%(DOCKER_HUB_CONTAINER_PATH)) - except: - print("You did not have an image named [%s]. We will " - "download it now from the Docker Hub. Please note " + print("Downloading image [%s]. Please note " "that this could take a long time depending on your " "connection. It's around 2GB."%(DOCKER_HUB_CONTAINER_PATH)) client.images.pull(DOCKER_HUB_CONTAINER_PATH) print("Finished downloading the image [%s]"%(DOCKER_HUB_CONTAINER_PATH)) + except Exception as e: + print("Unrecoverable error downloading image [%s]:[%s]"%(DOCKER_HUB_CONTAINER_PATH, str(e))) + sys.exit(1) - + + remove_tag = False + try: + image = client.images.get(DOCKER_COMMIT_NAME) + print("Found an image called [%s]"%(DOCKER_COMMIT_NAME)) + if reuse_images == False: + print("We will remove the image [%s] because you have specificed --reuse_images %s"%(DOCKER_COMMIT_NAME, reuse_images)) + remove_tag = True + build_Tag = True + else: + print("We will use the preexisting image for [%s]"%(DOCKER_COMMIT_NAME)) + build_tag = False + except: + print("No image found named [%s]"%(DOCKER_COMMIT_NAME)) + build_tag = True + + + if remove_tag: try: - image = client.images.get(DOCKER_COMMIT_NAME) - print("Found an image called [%s]. We will remove it"%(DOCKER_COMMIT_NAME)) #Stop it if it's running, remove associated volumes too - image.remove(v=True, force=True) - except: - print("No image found named [%s]"%(DOCKER_COMMIT_NAME)) - + client.images.remove(image=DOCKER_COMMIT_NAME, force=True) + + except Exception as e: + print("Unrecoverable error removing [%s]: [%s]"%(DOCKER_COMMIT_NAME, str(e))) + sys.exit(1) + + + + if not reuse_containers: + try: + print("Creating a new container called [%s]"%(BASE_CONTAINER_NAME)) - print("Creating a new container called [%s]"%(BASE_CONTAINER_NAME)) - environment = {"SPLUNK_START_ARGS": "--accept-license", - "SPLUNK_PASSWORD" : splunk_password } - ports= {"8000/tcp": BASE_CONTAINER_WEB_PORT - 1, - "8089/tcp": BASE_CONTAINER_MANAGEMENT_PORT - 1 - } + environment = {"SPLUNK_START_ARGS": "--accept-license", + "SPLUNK_PASSWORD" : splunk_password } + ports= {"8000/tcp": BASE_CONTAINER_WEB_PORT - 1, + "8089/tcp": BASE_CONTAINER_MANAGEMENT_PORT - 1 + } + base_container = client.containers.create("splunk/splunk:latest", ports=ports, environment=environment, name=BASE_CONTAINER_NAME, detach=True) + print("Running the new container called [%s]"%(BASE_CONTAINER_NAME)) + base_container.start() + print("Container is running [%s]"%(BASE_CONTAINER_NAME)) + print("Sleep for 60 seconds to allow the container to fully start up...") + wait_for_splunk_ready(max_seconds=60) + print("The container has fully started!") - base_container = client.containers.create("splunk/splunk:latest", ports=ports, environment=environment, name=BASE_CONTAINER_NAME, detach=True) - print("Running the new container called [%s]"%(BASE_CONTAINER_NAME)) - base_container.start() - print("Container is running [%s]"%(BASE_CONTAINER_NAME)) - print("Sleep for 60 seconds to allow the container to fully start up...") - wait_for_splunk_ready(max_seconds=60) - print("The container has fully started!") + print("Do the ESCU installation on this container. That way we don't have to " + "do it on every container that we then spin up.") - except Exception as e: - print("There was an error getting the base container up and running. " - "We cannot recover from this: [%s]\nGoodbye..."%(str(e))) - sys.exit(1) + testing_service.prepare_detection_testing(BASE_CONTAINER_NAME, splunk_password) + print("Waiting for a few seconds for the splunk app to come up.") + wait_for_splunk_ready(max_seconds=30) + + print("Stopping the running container [%s]"%(BASE_CONTAINER_NAME)) + base_container.stop() + #I am almost positive that I'm doing this wrong but it works for now... - print("Do the ESCU installation on this container. That way we don't have to " - "do it on every container that we then spin up.") - - testing_service.prepare_detection_testing(BASE_CONTAINER_NAME, splunk_password) - print("Waiting for a few seconds for the splunk app to come up.") - wait_for_splunk_ready(max_seconds=30) - - print("Stopping the running container [%s]"%(BASE_CONTAINER_NAME)) - base_container.stop() + print("Committing the configured container: [%s]--->[%s]"%(BASE_CONTAINER_NAME, DOCKER_COMMIT_NAME)) + base_container.commit(repository=DOCKER_COMMIT_NAME) + + except Exception as e: + print("There was an error getting the base container up and running. " + "We cannot recover from this: [%s]\nGoodbye..."%(str(e))) + sys.exit(1) + + #The part below does not seem to be working as expected. Will need to look into it #When I create the new container, it fails to boot with # The CA file specified (/opt/splunk/etc/auth/cacert.pem) does not exist. Cannot continue. @@ -168,9 +268,6 @@ def main(args): # non-zero return code - #I am almost positive that I'm doing this wrong but it works for now... - print("Committing the configured container: [%s]--->[%s]"%(BASE_CONTAINER_NAME, DOCKER_COMMIT_NAME)) - base_container.commit(repository=DOCKER_COMMIT_NAME) @@ -238,6 +335,8 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa wait_for_splunk_ready(max_seconds=60) index=0 + print("Inspect your containers, you have 5 minutes!") + wait_for_splunk_ready(max_seconds=60) try: while True: #Try to get something from the queue @@ -246,9 +345,15 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa #There is a detection to test print("Container [%s]--->[%s]"%(container_name, detection_to_test)) - - result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, index, uuid_test) - results_queue.put(result) + try: + pass + #result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, index, uuid_test) + #results_queue.put(result) + except Exception as e: + print("Caught some exception in test detection: [%s]"%(str(e))) + #just log the error itself for now so that we can continue + result_test = str(e) + index=(index+1)%10 except queue.Empty: print("Queue was empty, [%s] finished testing detections!"%(container_name)) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 854ff47727..b372a9bd07 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -64,6 +64,7 @@ def test_detection_search(splunk_host, splunk_port, splunk_password, search, pas ) except Exception as e: print("Unable to connect to Splunk instance: " + str(e)) + raise(Exception("NO CONNECTION EXCEPTION")) return 1, {} # search and replace \\ with \\\ @@ -84,6 +85,7 @@ def test_detection_search(splunk_host, splunk_port, splunk_password, search, pas job = service.jobs.create(splunk_search, **kwargs) except Exception as e: print("Unable to execute detection: " + str(e)) + raise(Exception("NO EXECUTION EXCEPTION")) return 1, {} test_results = dict() diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 131738174d..d74ea2a073 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -77,36 +77,41 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test result_test = {} test = test_file_obj['tests'][0] - try: - if 'baselines' in test: - results_baselines = [] - for baseline_obj in test['baselines']: - baseline_file_name = baseline_obj['file'] - baseline = load_file(os.path.join(os.path.dirname(__file__), '../security_content', baseline_file_name)) - result_obj = dict() - result_obj['baseline'] = baseline_obj['name'] - result_obj['baseline_file'] = baseline_obj['file'] - result = splunk_sdk.test_baseline_search(splunk_ip, splunk_port, splunk_password, baseline['search'], baseline_obj['pass_condition'], baseline['name'], baseline_obj['file'], baseline_obj['earliest_time'], baseline_obj['latest_time']) - result_test['baselines_result'] = results_baselines + + if 'baselines' in test: + results_baselines = [] + for baseline_obj in test['baselines']: + baseline_file_name = baseline_obj['file'] + baseline = load_file(os.path.join(os.path.dirname(__file__), '../security_content', baseline_file_name)) + result_obj = dict() + result_obj['baseline'] = baseline_obj['name'] + result_obj['baseline_file'] = baseline_obj['file'] + print("Making test_baseline_search request to: [%s:%d]"%(splunk_ip, splunk_port)) + result = splunk_sdk.test_baseline_search(splunk_ip, splunk_port, splunk_password, baseline['search'], baseline_obj['pass_condition'], baseline['name'], baseline_obj['file'], baseline_obj['earliest_time'], baseline_obj['latest_time']) + #we don't seem to be doing anything with this loop... are we supposed to have the following line belwo? + results_baselines.append(result) - detection_file_name = test['file'] - detection = load_file(os.path.join(os.path.dirname(__file__), '../security_content/detections', detection_file_name)) - result_detection = splunk_sdk.test_detection_search(splunk_ip, splunk_port, splunk_password, detection['search'], test['pass_condition'], detection['name'], test['file'], test['earliest_time'], test['latest_time']) + result_test['baselines_result'] = results_baselines - result_detection['detection_name'] = test['name'] - result_detection['detection_file'] = test['file'] - result_test['detection_result'] = result_detection + detection_file_name = test['file'] + detection = load_file(os.path.join(os.path.dirname(__file__), '../security_content/detections', detection_file_name)) + print("Making test_detection_search request to: [%s:%d]"%(splunk_ip, splunk_port)) + + result_detection = splunk_sdk.test_detection_search(splunk_ip, splunk_port, splunk_password, detection['search'], test['pass_condition'], detection['name'], test['file'], test['earliest_time'], test['latest_time']) + + + + result_detection['detection_name'] = test['name'] + result_detection['detection_file'] = test['file'] + result_test['detection_result'] = result_detection + + if result_detection['error']: + print("failed") + #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'failed') + else: + print("passed") + #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'passed') - if result_detection['error']: - print("failed") - #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'failed') - else: - print("passed") - #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'passed') - except Exception as e: - print("Caught some exception in test detection: [%s]"%(str(e))) - #just log the error itself for now so that we can continue - result_test = str(e) return result_test From 06a9c0f15ef82989fa00a1c82708a27bdd385fd6 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 11 Oct 2021 10:23:42 -0700 Subject: [PATCH 012/203] Lots more changes to how we run. Now based off of the splunk/splunk container on docker hub as much as possible. We use ENV arguments to install required apps. Still only at 50% pass rate, so we need more troubleshooting to figure out why. --- .../detection_testing_execution.py | 350 +++++++++++------- .../detection_testing_batch/indexes.conf.tar | Bin 0 -> 2560 bytes .../modules/splunk_sdk.py | 9 +- .../modules/testing_service.py | 135 ++++++- 4 files changed, 355 insertions(+), 139 deletions(-) create mode 100644 automated_detection_testing/ci/detection_testing_batch/indexes.conf.tar diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 7e6e71316a..07acac2a62 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -11,16 +11,20 @@ import queue from modules.github_service import GithubService from modules import aws_service, testing_service import time - - +import subprocess +from datetime import datetime +index_file_container_path = "/opt/splunk/etc/apps/search/" +index_file_local_path = "indexes.conf.tar" PASSWORD_LENGTH=20 MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING=2 DOCKER_HUB_CONTAINER_PATH="splunk/splunk:latest" BASE_CONTAINER_NAME="splunk" -DOCKER_COMMIT_NAME = "splunk_configured" -RUNNER_BASE_NAME = "splunk_runner" + + +#DOCKER_COMMIT_NAME = "splunk_configured" +#RUNNER_BASE_NAME = "splunk_runner" BASE_CONTAINER_WEB_PORT=8000 @@ -76,7 +80,7 @@ def stop_container(docker_client, container_name, force=True): def main(args): - + start_time = datetime.now() parser = argparse.ArgumentParser(description="CI Detection Testing") parser.add_argument("-b", "--branch", type=str, required=True, help="security content branch") parser.add_argument("-u", "--uuid", type=str, required=True, help="uuid for detection test") @@ -101,8 +105,8 @@ def main(args): sys.exit(1) elif num_containers > MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING: print("You requested to run with [%d] containers which may use a very large amount of resources " - "as they all run in parallel. The maximum suggested number of parallel. The maximum " - "suggested number of containers is [%d]. We will do what you asked, but be warned!"%(num_containers, MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING)) + "as they all run in parallel. The maximum suggested number of parallel containers is " + "[%d]. We will do what you asked, but be warned!"%(num_containers, MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING)) if pr_number: @@ -114,7 +118,30 @@ def main(args): print("No new detections to test.") #aws_service.dynamo_db_nothing_to_test(REGION, uuid_test, str(int(time.time()))) sys.exit(0) + print("The files to test: %s", str(test_files)) + + #Go into the security content directory + print("****GENERATE NEW CONTENT****") + os.chdir("security_content") + commands = ["python3 -m venv .venv", "source .venv/bin/activate", "python3 -m pip install -r requirements.txt", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu"] + ret = subprocess.run("; ".join(commands), shell=True, capture_output=False) + if ret.returncode != 0: + print("Error generating new content. Exiting...") + sys.exit(1) + print("New content generated successfully") + os.chdir("..") + client = docker.client.from_env() + splunk_password = '123456qwertyQWERTY' + + + + + + + #print("run it now!") + + #time.sleep(180) #dt_ar = aws_service.get_ar_information_from_dynamo_db(REGION, DT_ATTACK_RANGE_STATE) #splunk_instance = aws_service.get_splunk_instance(REGION, dt_ar['ssh_key_name']) @@ -129,170 +156,202 @@ def main(args): #splunk_password = secrets.token_urlsafe(PASSWORD_LENGTH) #Only accessible on local host, it's okay to expose the password for debugging - splunk_password = "123456qwerty!@#$%^QWERTY" + #splunk_password = "123456qwerty!@#$%^QWERTY" + #splunk_password = '123456qwerty%^QWERTY' splunk_container_manager_threads = [] - print("***Files to test: %d"%(len(test_files))) + # print("***Files to test: %d"%(len(test_files))) test_file_queue = queue.Queue() for filename in test_files: test_file_queue.put(filename) - print("***Test files enqueued") + # print("***Test files enqueued") - print("Getting docker client") + testing_service.test_detection_wrapper(None, None, splunk_password, None, test_file_queue.get(), 0%1, uuid_test) + + # print("Getting docker client") client = docker.client.from_env() + + # try: + # print("Removing any existing containers called [%s]."%(BASE_CONTAINER_NAME)) - try: - print("Removing any existing containers called [%s]."%(BASE_CONTAINER_NAME)) - - c = client.containers.get(BASE_CONTAINER_NAME) - except: - print("Container [%s] did not exist. No need to remove it. It will; be created for you."%(BASE_CONTAINER_NAME)) - c = None + # c = client.containers.get(BASE_CONTAINER_NAME) + # except: + # print("Container [%s] did not exist. No need to remove it. It will; be created for you."%(BASE_CONTAINER_NAME)) + # c = None - if (c and reuse_containers): - print("Found a container called [%s]. NOT removing it because you have specified --reuse_containers [%s]. " - "However, we must stop the container. Stopping it now..."%(BASE_CONTAINER_NAME, reuse_containers)) - stop_container(client, BASE_CONTAINER_NAME) + # if (c and reuse_containers): + # print("Found a container called [%s]. NOT removing it because you have specified --reuse_containers [%s]. " + # "However, we must stop the container. Stopping it now..."%(BASE_CONTAINER_NAME, reuse_containers)) + # stop_container(client, BASE_CONTAINER_NAME) - elif c: - print("Found a container called [%s]. Removing it because you have specified --reuse_containers [%s]"%(BASE_CONTAINER_NAME, reuse_containers)) - remove_container(client, BASE_CONTAINER_NAME) + # elif c: + # print("Found a container called [%s]. Removing it because you have specified --reuse_containers [%s]"%(BASE_CONTAINER_NAME, reuse_containers)) + # remove_container(client, BASE_CONTAINER_NAME) - download_image = False - try: - client.images.get(DOCKER_HUB_CONTAINER_PATH) - if reuse_images: - print("You already have an image named [%s]."%(DOCKER_HUB_CONTAINER_PATH)) - download_image = False - else: - print("You already have an image named [%s]., " - "but have speicified --reuse_images %s"%(DOCKER_HUB_CONTAINER_PATH, reuse_images)) - download_image = True + # download_image = False + # try: + # client.images.get(DOCKER_HUB_CONTAINER_PATH) + # if reuse_images: + # print("You already have an image named [%s]."%(DOCKER_HUB_CONTAINER_PATH)) + # download_image = False + # else: + # print("You already have an image named [%s]., " + # "but have speicified --reuse_images %s"%(DOCKER_HUB_CONTAINER_PATH, reuse_images)) + # download_image = True - except: - print("You did not have an image named [%s]."%(DOCKER_HUB_CONTAINER_PATH)) - download_image = True + # except: + # print("You did not have an image named [%s]."%(DOCKER_HUB_CONTAINER_PATH)) + # download_image = True - if download_image: - try: - print("Downloading image [%s]. Please note " - "that this could take a long time depending on your " - "connection. It's around 2GB."%(DOCKER_HUB_CONTAINER_PATH)) - client.images.pull(DOCKER_HUB_CONTAINER_PATH) - print("Finished downloading the image [%s]"%(DOCKER_HUB_CONTAINER_PATH)) - except Exception as e: - print("Unrecoverable error downloading image [%s]:[%s]"%(DOCKER_HUB_CONTAINER_PATH, str(e))) - sys.exit(1) + # if download_image: + # try: + # print("Downloading image [%s]. Please note " + # "that this could take a long time depending on your " + # "connection. It's around 2GB."%(DOCKER_HUB_CONTAINER_PATH)) + # client.images.pull(DOCKER_HUB_CONTAINER_PATH) + # print("Finished downloading the image [%s]"%(DOCKER_HUB_CONTAINER_PATH)) + # except Exception as e: + # print("Unrecoverable error downloading image [%s]:[%s]"%(DOCKER_HUB_CONTAINER_PATH, str(e))) + # sys.exit(1) - remove_tag = False - try: - image = client.images.get(DOCKER_COMMIT_NAME) - print("Found an image called [%s]"%(DOCKER_COMMIT_NAME)) - if reuse_images == False: - print("We will remove the image [%s] because you have specificed --reuse_images %s"%(DOCKER_COMMIT_NAME, reuse_images)) - remove_tag = True - build_Tag = True - else: - print("We will use the preexisting image for [%s]"%(DOCKER_COMMIT_NAME)) - build_tag = False - except: - print("No image found named [%s]"%(DOCKER_COMMIT_NAME)) - build_tag = True + # remove_tag = False + # try: + # image = client.images.get(DOCKER_COMMIT_NAME) + # print("Found an image called [%s]"%(DOCKER_COMMIT_NAME)) + # if reuse_images == False: + # print("We will remove the image [%s] because you have specificed --reuse_images %s"%(DOCKER_COMMIT_NAME, reuse_images)) + # remove_tag = True + # build_Tag = True + # else: + # print("We will use the preexisting image for [%s]"%(DOCKER_COMMIT_NAME)) + # build_tag = False + # except: + # print("No image found named [%s]"%(DOCKER_COMMIT_NAME)) + # build_tag = True - if remove_tag: - try: - #Stop it if it's running, remove associated volumes too - client.images.remove(image=DOCKER_COMMIT_NAME, force=True) + # if remove_tag: + # try: + # #Stop it if it's running, remove associated volumes too + # client.images.remove(image=DOCKER_COMMIT_NAME, force=True) - except Exception as e: - print("Unrecoverable error removing [%s]: [%s]"%(DOCKER_COMMIT_NAME, str(e))) - sys.exit(1) + # except Exception as e: + # print("Unrecoverable error removing [%s]: [%s]"%(DOCKER_COMMIT_NAME, str(e))) + # sys.exit(1) + # for ind in range(num_containers): + # ind = str(ind) + # if not reuse_containers: + # try: + # print("Creating a new container called [%s]"%(BASE_CONTAINER_NAME+ind)) + - if not reuse_containers: - try: - print("Creating a new container called [%s]"%(BASE_CONTAINER_NAME)) + # environment = {"SPLUNK_START_ARGS": "--accept-license", + # "SPLUNK_PASSWORD" : splunk_password } + # ports= {"8000/tcp": BASE_CONTAINER_WEB_PORT - 1 + int(ind) + 1, + # "8089/tcp": BASE_CONTAINER_MANAGEMENT_PORT - 1 + int(ind) + 1 + # } + # base_container = client.containers.create("splunk/splunk:latest", ports=ports, environment=environment, name=BASE_CONTAINER_NAME+ind, detach=True) + # print("Running the new container called [%s]"%(BASE_CONTAINER_NAME+ind)) + # base_container.start() + # print("Container is running [%s]"%(BASE_CONTAINER_NAME+ind)) + # print("Sleep for 60 seconds to allow the container to fully start up...") + # wait_for_splunk_ready(max_seconds=60) + # print("The container has fully started!") + + # print("Do the ESCU installation on this container. That way we don't have to " + # "do it on every container that we then spin up.") + + # testing_service.prepare_detection_testing(BASE_CONTAINER_NAME+ind, splunk_password) + # print("Waiting for a few seconds for the splunk app to come up.") + # wait_for_splunk_ready(max_seconds=30) + # print("Install the apps and enable accelerate") + # wait_for_splunk_ready(max_seconds=180) + # print("Stopping the running container [%s]"%(BASE_CONTAINER_NAME+ind)) + # base_container.stop() + # #I am almost positive that I'm doing this wrong but it works for now... + + # #print("Committing the configured container: [%s]--->[%s]"%(BASE_CONTAINER_NAME, DOCKER_COMMIT_NAME)) + # #base_container.commit(repository=DOCKER_COMMIT_NAME) - environment = {"SPLUNK_START_ARGS": "--accept-license", - "SPLUNK_PASSWORD" : splunk_password } - ports= {"8000/tcp": BASE_CONTAINER_WEB_PORT - 1, - "8089/tcp": BASE_CONTAINER_MANAGEMENT_PORT - 1 - } - base_container = client.containers.create("splunk/splunk:latest", ports=ports, environment=environment, name=BASE_CONTAINER_NAME, detach=True) - print("Running the new container called [%s]"%(BASE_CONTAINER_NAME)) - base_container.start() - print("Container is running [%s]"%(BASE_CONTAINER_NAME)) - print("Sleep for 60 seconds to allow the container to fully start up...") - wait_for_splunk_ready(max_seconds=60) - print("The container has fully started!") - - print("Do the ESCU installation on this container. That way we don't have to " - "do it on every container that we then spin up.") - - testing_service.prepare_detection_testing(BASE_CONTAINER_NAME, splunk_password) - print("Waiting for a few seconds for the splunk app to come up.") - wait_for_splunk_ready(max_seconds=30) - - print("Stopping the running container [%s]"%(BASE_CONTAINER_NAME)) - base_container.stop() - #I am almost positive that I'm doing this wrong but it works for now... - - print("Committing the configured container: [%s]--->[%s]"%(BASE_CONTAINER_NAME, DOCKER_COMMIT_NAME)) - base_container.commit(repository=DOCKER_COMMIT_NAME) - - - except Exception as e: - print("There was an error getting the base container up and running. " - "We cannot recover from this: [%s]\nGoodbye..."%(str(e))) - sys.exit(1) + # except Exception as e: + # print("There was an error getting the base container up and running. " + # "We cannot recover from this: [%s]\nGoodbye..."%(str(e))) + # sys.exit(1) - #The part below does not seem to be working as expected. Will need to look into it - #When I create the new container, it fails to boot with - # The CA file specified (/opt/splunk/etc/auth/cacert.pem) does not exist. Cannot continue. - # SSL certificate generation failed. + # # # #The part below does not seem to be working as expected. Will need to look into it + # # # #When I create the new container, it fails to boot with + # # # # The CA file specified (/opt/splunk/etc/auth/cacert.pem) does not exist. Cannot continue. + # # # # SSL certificate generation failed. - # MSG: + # # # # MSG: - # non-zero return code + # # # # non-zero return code + - - print("Make all the threads...") + print("The number of detections we will test is [%d]"%(test_file_queue.qsize())) + results_queue = queue.Queue() + success_names_queue = queue.Queue() + failure_names_queue = queue.Queue() for container_index in range(num_containers): - container_name = "%s_%d"%(RUNNER_BASE_NAME, container_index) + container_name = "%s_%d"%(BASE_CONTAINER_NAME, container_index) + web_port = BASE_CONTAINER_WEB_PORT + container_index management_port = BASE_CONTAINER_MANAGEMENT_PORT + container_index - print("Creating a new container called [%s]"%(container_name)) + + #docker run -p8089:8089 -p 8000:8000 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=123456qwertyQWERTY" -e "SPLUNK_APPS_URL=https://splunkbase.splunk.com/app/3435/release/3.3.4/download,https://splunkbase.splunk.com/app/5709/release/1.0.1/download,https://splunkbase.splunk.com/app/3449/release/3.29.0/download,https://splunkbase.splunk.com/app/1621/release/4.20.2/download" -e "SPLUNKBASE_USERNAME=ericmcginnistwo" -e "SPLUNKBASE_PASSWORD=splunkSecondAccount5@" -name splunktemplate splunk/splunk:latest environment = {"SPLUNK_START_ARGS": "--accept-license", - "SPLUNK_PASSWORD" : splunk_password } + "SPLUNK_PASSWORD" : splunk_password, + "SPLUNK_APPS_URL" : "https://splunkbase.splunk.com/app/3435/release/3.3.4/download,https://splunkbase.splunk.com/app/5709/release/1.0.1/download,https://splunkbase.splunk.com/app/3449/release/3.29.0/download,https://splunkbase.splunk.com/app/1621/release/4.20.2/download", + "SPLUNKBASE_USERNAME" : "emcginnistwo", + "SPLUNKBASE_PASSWORD" : "splunkSecondAccount5@" + } ports= {"8000/tcp": web_port, "8089/tcp": management_port - } + } - test_container = client.containers.create(DOCKER_COMMIT_NAME, ports=ports, environment=environment, name=container_name, detach=True, volumes_from=[BASE_CONTAINER_NAME]) - t = threading.Thread(target=splunk_container_manager, args=(test_file_queue, container_name, "127.0.0.1", splunk_password, management_port, uuid_test, results_queue)) + print("Creating CONTAINER: [%s]"%(container_name)) + base_container = client.containers.create(DOCKER_HUB_CONTAINER_PATH, ports=ports, environment=environment, name=container_name, detach=True) + print("Created CONTAINER : [%s]"%(container_name)) + #print("Creating a new container called [%s]"%(container_name)) + #environment = {"SPLUNK_START_ARGS": "--accept-license", + # "SPLUNK_PASSWORD" : splunk_password } + #ports= {"8000/tcp": web_port, + # "8089/tcp": management_port + # } + + #test_container = client.containers.create(DOCKER_COMMIT_NAME, ports=ports, environment=environment, name=container_name, detach=True, volumes_from=[BASE_CONTAINER_NAME]) + + t = threading.Thread(target=splunk_container_manager, args=(test_file_queue, container_name, "127.0.0.1", splunk_password, management_port, uuid_test, results_queue, success_names_queue, failure_names_queue)) splunk_container_manager_threads.append(t) + #add the queue status thread - there can be some error in one of the test threads, so this + #thread doesn't need to complete for the program to finish execution + status_thread = threading.Thread(target=queue_status_thread, args=(test_file_queue.qsize(), test_file_queue, results_queue, success_names_queue, failure_names_queue), daemon=True) + status_thread.start() print("Start all the threads...") for t in splunk_container_manager_threads: t.start() + #we need to start containers slowly. Would be great it we could do all the setup and + #app install once (with Dockerfile?) + time.sleep(60) #Try to join all the threads for t in splunk_container_manager_threads: @@ -305,38 +364,68 @@ def main(args): while True: o = results_queue.get(block=False) - print("Got from queue:") print(o) except queue.Empty: print("That's all the output!") #now we are done! - + stop_time = datetime.now() + print("Total Execution Time: [%s]"%(stop_time-start_time)) + #detection testing service has already been prepared, no need to do it here! #testing_service.prepare_detection_testing(ssh_key_name, private_key, splunk_ip, splunk_password) #testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) +def queue_status_thread(total_tests_count, testing_queue, results_queue, success_names_queue, failure_names_queue): + while True: + print("***Progress Update:\n"\ + "\tTests to run : %d\n"\ + "\tTests currently running: %d\n"\ + "\tTests completed : %d\n"\ + "\t\tSuccess : %d\n"\ + "\t\tFailure : %d"%(testing_queue.qsize(), total_tests_count - testing_queue.qsize() - results_queue.qsize(), results_queue.qsize(), success_names_queue.qsize(), failure_names_queue.qsize())) + if results_queue.qsize() == total_tests_count: + return + else: + time.sleep(10) -def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_password, splunk_port, uuid_test, results_queue): +def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_password, splunk_port, uuid_test, results_queue, success_names_queue, failure_names_queue): print("Starting the container [%s] after a sleep"%(container_name)) #Is this going to be safe to use in different threads client = docker.client.from_env() + #start up the container from the base container #Assume that the base container has already been fully built with #escu etc #sleep for a little bit so that we don't all start at once... - time.sleep(random.randrange(0,120)) + time.sleep(random.randrange(0,60)) container = client.containers.get(container_name) print("Starting the container [%s]"%(container_name)) + + #need to use the low level client to put a file onto a container + apiclient = docker.APIClient() + container.start() - wait_for_splunk_ready(max_seconds=60) + successful_copy = False + while not successful_copy: + try: + with open(index_file_local_path,"rb") as indexData: + #splunk will restart a few times will installation of apps takes place so it will reload its indexes... + time.sleep(10) + apiclient.put_archive(container=container_name, path=index_file_container_path, data=indexData) + successful_copy=True + except Exception as e: + print("Failed copy of index file to CONTAINER:[%s]...we will try again"%(container_name)) + successful_copy=False + + + + wait_for_splunk_ready(max_seconds=120) index=0 - print("Inspect your containers, you have 5 minutes!") - wait_for_splunk_ready(max_seconds=60) try: while True: #Try to get something from the queue @@ -346,9 +435,12 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa #There is a detection to test print("Container [%s]--->[%s]"%(container_name, detection_to_test)) try: - pass - #result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, index, uuid_test) - #results_queue.put(result) + result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, index%1, uuid_test) + if result['detection_result']['error']: + failure_names_queue.put(result['detection_result']['detection_name']) + else: + success_names_queue.put(result['detection_result']['detection_name']) + results_queue.put(result) except Exception as e: print("Caught some exception in test detection: [%s]"%(str(e))) #just log the error itself for now so that we can continue @@ -360,7 +452,7 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa print("Shutting down the container [%s]"%(container_name)) container.stop() - print("Finished shutting down the container [%s]"&(container_name)) + print("Finished shutting down the container [%s]"%(container_name)) if __name__ == "__main__": main(sys.argv[1:]) \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/indexes.conf.tar b/automated_detection_testing/ci/detection_testing_batch/indexes.conf.tar new file mode 100644 index 0000000000000000000000000000000000000000..813a484efefb92eddfc9f2c81965778d79e48461 GIT binary patch literal 2560 zcmeHF%WA_g5cJt!p+nEL{E%|$CC#PuL1@xbDMhh2u|Sr<-cYw+-}QqYN*zcb5U6w+ z(Cp5xW@KEhOcb2;aL#8!u%JUJd*n$rAl-F`#aW#4I31g9l14i86iu+7{44bDcYT=#3{XPS(h5$otRyQ!anyFNB;0 zjGs8~sJ4He|0_a+{4LC#DV7RLcEhe#%ZHbz`}f5>>dC0%icJVsZ44|FsymCYt2KV! zI*YY4)Wk=6-RPoyhGL(icD5% Date: Mon, 11 Oct 2021 17:05:28 -0700 Subject: [PATCH 013/203] Lots of testing changes.... lots of progress. Need to clean up and test entire set of detections properly with sleeps and diagnose how long sleep should be or if there is a way to block while input data is processed entirely. --- .../datamodels.conf.tar | Bin 0 -> 11776 bytes .../detection_testing_execution.py | 88 ++++++++++++++---- .../modules/github_service.py | 67 +++++++++++-- .../modules/splunk_sdk.py | 36 +++++-- .../modules/testing_service.py | 22 +++-- 5 files changed, 173 insertions(+), 40 deletions(-) create mode 100644 automated_detection_testing/ci/detection_testing_batch/datamodels.conf.tar diff --git a/automated_detection_testing/ci/detection_testing_batch/datamodels.conf.tar b/automated_detection_testing/ci/detection_testing_batch/datamodels.conf.tar new file mode 100644 index 0000000000000000000000000000000000000000..d374ca68cdd4cc6c571541e0809efc5765d8ebf3 GIT binary patch literal 11776 zcmeHNTW{Mo7|pYP1%bS51>M?-ooo+z2%0{0Xog_vx(8zrXzH^?gd#Ow?6|+aA9Zmq zkYqQlqo%VA#IktgNau*(<2=6B+`8)1b@3@N}hNI!}a5xwa zjz?rLJU$wo9+2@)ud4iVZyhsuX^`@{P)gW_f4WQnWW!iEoZrU!rbr9&hZ>T({xNeb z)iFr>nrk)t&R2-koQy_I`X3z~jmD4kKRFr=4#?m;Uq|iN{m=D3tlN5rhvZy>aTfP# zw%()|{kO+B2Lv)Fv?6ue8F9wL1KevSrCvr_#*y`D%8UR@>ToGjp2^6-)C(Eg{Ojv* zmM0K<2~lQ*Ho~nCc}5a3Pr$mKV{;oV6X8G#>uRp?jAUH&dJVT4sK_!YcyW){jyWK| zTtH?34?+BE!+Dc?XGQs0J7$X;t)hyG@;1-Naew^Vn=yG+ydLTR%t++kMNXu!KBGTO zwR#AAP9bPe36xNCnrY)`W;6$Dse$~X1+x$wXt-o*SBfWi+u}1&pJ5P#RvEoZK)F)M zM%f;qUW{g|4i$@G#=LY?C=1*hpj_gk<={4`Cl*4&9AcUxM9dg>+O(F11(BdJ z`rOCt71|u!sI`(hX{iFY)aHhAou*#pB)4jjFg1s!nesLt?S%iM{`mB3qgt0U1k8YU^O*nNs|98fZB}jgNr{fu=p8HdtZABOp56t1hczH~VgWRT6nR-c z+E%g5CfZSpbg_BJ*_hr_x&ULbW~5GQj7uKVI$a3ku-aV znMlVB>zKmw2ivwA`kx168i~l6#1UsHQX|1;j5n4-cRYT$YJGe!K3wgXyZVy#g$4Jf z=QYHOcV(on=eakj#yjEpSzCjY-9~6FV0maTau&_T85usTTC48mTN*ja^Ri@jZN$5j z3E3!U7<@5mc3Bc(&4cLz;}<>^*zY+y6B4sX(`;Htt@nsFWm8BlG4?UE?dJ7*l&RqU zDbf0rPE;E8$G^Xz!gU)pj1TFDTwn!@6#!ZXIqS85dJ~kQz(;HRUWYBp*HqYG%!;`$ zyf&H%L5-e!G(HqV%L09`&k*-x$lVdIKykCm(4V49VX(chcB7Vme7bDa4##(_)$!q6apfz{G)3_m42x`TJ3!V@ao<4#T4jn93h!*$V&G&pzV1gKP~z}A8C_&*Ygs-THbYOfHN01UCAz?xfC&YhkLg==j3SsAVMVBy*mdx=a{2HWJ`@^mM!94?e N2KEf>8Tb|kz5p7CHva$s literal 0 HcmV?d00001 diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 07acac2a62..128f44acef 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -13,8 +13,14 @@ from modules import aws_service, testing_service import time import subprocess from datetime import datetime -index_file_container_path = "/opt/splunk/etc/apps/search/" + +SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" +index_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "search") + +datamodel_file_local_path = "datamodels.conf.tar" +datamodel_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "Splunk_SA_CIM") + PASSWORD_LENGTH=20 MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING=2 @@ -90,6 +96,8 @@ def main(args): parser.add_argument("-i", "--reuse_images", required=False, type=bool, default=False, help="Should existing images be re-used, or should they be redownloaded?") parser.add_argument("-c", "--reuse_containers", required=False, type=bool, default=False, help="Should existing containers be re-used, or should they be rebuilt?") + parser.add_argument("-s", "--success", type=str, required=False, help="File that contains previously successful runs that we don't need to test") + args = parser.parse_args() branch = args.branch uuid_test = args.uuid @@ -97,6 +105,13 @@ def main(args): num_containers = args.num_containers reuse_containers = args.reuse_containers reuse_images = args.reuse_images + success_file = args.success_file + + if success_file is not None: + with open(success_file, "r") as successes: + success_tests = [x.strip() for x in successes.readlines()] + else: + success_tests = [] if num_containers < 1: @@ -119,11 +134,18 @@ def main(args): #aws_service.dynamo_db_nothing_to_test(REGION, uuid_test, str(int(time.time()))) sys.exit(0) print("The files to test: %s", str(test_files)) + new_test_files = [] + for f in test_files: + if f not in success_tests: + new_test_files.append(f) + else: + print("Already found [%s] in success file, not testing it again"%(f)) + test_files = new_test_files #Go into the security content directory print("****GENERATE NEW CONTENT****") os.chdir("security_content") - commands = ["python3 -m venv .venv", "source .venv/bin/activate", "python3 -m pip install -r requirements.txt", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu"] + commands = ["python3 -m venv .venv", "source .venv/bin/activate", "python3 -m pip install wheel", "python3 -m pip install -r requirements.txt", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu"] ret = subprocess.run("; ".join(commands), shell=True, capture_output=False) if ret.returncode != 0: print("Error generating new content. Exiting...") @@ -167,7 +189,6 @@ def main(args): test_file_queue.put(filename) # print("***Test files enqueued") - testing_service.test_detection_wrapper(None, None, splunk_password, None, test_file_queue.get(), 0%1, uuid_test) # print("Getting docker client") client = docker.client.from_env() @@ -310,16 +331,28 @@ def main(args): results_queue = queue.Queue() success_names_queue = queue.Queue() failure_names_queue = queue.Queue() + + + for container_index in range(num_containers): container_name = "%s_%d"%(BASE_CONTAINER_NAME, container_index) web_port = BASE_CONTAINER_WEB_PORT + container_index management_port = BASE_CONTAINER_MANAGEMENT_PORT + container_index + SPLUNK_COMMON_INFORMATION_MODEL = "https://splunkbase.splunk.com/app/1621/release/4.20.2/download" + SPLUNK_SECURITY_ESSENTIALS = "https://splunkbase.splunk.com/app/3435/release/3.3.4/download" + #SPLUNK_ADD_ON_FOR_SYSMON = "https://splunkbase.splunk.com/app/5709/release/1.0.1/download" + SPLUNK_ADD_ON_FOR_SYSMON = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" + SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" + SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" + + SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS, SPLUNK_ADD_ON_FOR_SYSMON, SYSMON_APP_FOR_SPLUNK, SPLUNK_ES_CONTENT_UPDATE] + #docker run -p8089:8089 -p 8000:8000 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=123456qwertyQWERTY" -e "SPLUNK_APPS_URL=https://splunkbase.splunk.com/app/3435/release/3.3.4/download,https://splunkbase.splunk.com/app/5709/release/1.0.1/download,https://splunkbase.splunk.com/app/3449/release/3.29.0/download,https://splunkbase.splunk.com/app/1621/release/4.20.2/download" -e "SPLUNKBASE_USERNAME=ericmcginnistwo" -e "SPLUNKBASE_PASSWORD=splunkSecondAccount5@" -name splunktemplate splunk/splunk:latest environment = {"SPLUNK_START_ARGS": "--accept-license", "SPLUNK_PASSWORD" : splunk_password, - "SPLUNK_APPS_URL" : "https://splunkbase.splunk.com/app/3435/release/3.3.4/download,https://splunkbase.splunk.com/app/5709/release/1.0.1/download,https://splunkbase.splunk.com/app/3449/release/3.29.0/download,https://splunkbase.splunk.com/app/1621/release/4.20.2/download", + "SPLUNK_APPS_URL" : ','.join(SPLUNK_APPS), "SPLUNKBASE_USERNAME" : "emcginnistwo", "SPLUNKBASE_PASSWORD" : "splunkSecondAccount5@" } @@ -360,6 +393,10 @@ def main(args): print("DONE!") #read all the results out from the output queue + strtime = str(int(time.time())) + #write success and failure + success_output = open("success_%s"%(strtime), "w") + failure_output = open("failure_%s"%(strtime), "w") try: while True: @@ -391,6 +428,23 @@ def queue_status_thread(total_tests_count, testing_queue, results_queue, success else: time.sleep(10) +def copy_file_to_container(localFilePath, remoteFilePath, containerName, sleepTimeSeconds=5): + successful_copy = False + #need to use the low level client to put a file onto a container + apiclient = docker.APIClient() + while not successful_copy: + try: + with open(localFilePath,"rb") as fileData: + #splunk will restart a few times will installation of apps takes place so it will reload its indexes... + apiclient.put_archive(container=containerName, path=remoteFilePath, data=fileData) + successful_copy=True + except Exception as e: + print("Failed copy of [%s] file to CONTAINER:[%s]...we will try again"%(localFilePath, containerName)) + time.sleep(10) + successful_copy=False + print("Successfully copied [%s] to [%s] on [%s]"%(localFilePath, remoteFilePath, containerName)) + + def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_password, splunk_port, uuid_test, results_queue, success_names_queue, failure_names_queue): print("Starting the container [%s] after a sleep"%(container_name)) #Is this going to be safe to use in different threads @@ -405,25 +459,22 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa container = client.containers.get(container_name) print("Starting the container [%s]"%(container_name)) - #need to use the low level client to put a file onto a container - apiclient = docker.APIClient() + container.start() - successful_copy = False - while not successful_copy: - try: - with open(index_file_local_path,"rb") as indexData: - #splunk will restart a few times will installation of apps takes place so it will reload its indexes... - time.sleep(10) - apiclient.put_archive(container=container_name, path=index_file_container_path, data=indexData) - successful_copy=True - except Exception as e: - print("Failed copy of index file to CONTAINER:[%s]...we will try again"%(container_name)) - successful_copy=False - + print("Start copying files to container") + copy_file_to_container(index_file_local_path, index_file_container_path, container_name) + copy_file_to_container(datamodel_file_local_path, datamodel_file_container_path, container_name) + print("Finished copying files to container!") wait_for_splunk_ready(max_seconds=120) + from modules.splunk_sdk import enable_delete_for_admin + if not enable_delete_for_admin(splunk_ip, splunk_port, splunk_password): + print("COULD NOT ENABLE DELETE FOR [%s].... quitting"%(container_name)) + sys.exit(0) + + print("Successfully enabled DELETE for [%s]"%(container_name)) index=0 try: @@ -431,7 +482,6 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa #Try to get something from the queue detection_to_test = testing_queue.get(block=False) - #There is a detection to test print("Container [%s]--->[%s]"%(container_name, detection_to_test)) try: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 418f53460d..d113ae6d54 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -4,7 +4,7 @@ import os import logging import glob import subprocess - +import yaml # Logger logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO")) @@ -33,7 +33,7 @@ class GithubService: branch2 = 'develop' g = git.Git('security_content') changed_test_files = [] - + changed_detection_files = [] if branch1 != 'develop': differ = g.diff('--name-status', branch2 + '...' + branch1) changed_files = differ.splitlines() @@ -49,12 +49,67 @@ class GithubService: # changed detections if 'detections' in file_path: if not os.path.basename(file_path).startswith('ssa') and os.path.basename(file_path).endswith('.yml'): - file_path_base = os.path.splitext(file_path)[0].replace('detections', 'tests') + '.test' - file_path_new = file_path_base + '.yml' - if file_path_new not in changed_test_files: - changed_test_files.append(file_path_new) + changed_detection_files.append(file_path) + #file_path_base = os.path.splitext(file_path)[0].replace('detections', 'tests') + '.test' + #file_path_new = file_path_base + '.yml' + #if file_path_new not in changed_test_files: + # changed_test_files.append(file_path_new) + #all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters + changed_test_files = [name.split('\t')[1] for name in changed_test_files if len(name.split('\t')) == 2] + changed_detection_files = [name.split('\t')[1] for name in changed_detection_files if len(name.split('\t')) == 2] + + + detections_to_test,_,_ = self.filter_test_types(changed_detection_files) + for f in detections_to_test: + file_path_base = os.path.splitext(f)[0].replace('detections', 'tests') + '.test' + file_path_new = file_path_base + '.yml' + if file_path_new not in changed_test_files: + changed_test_files.append(file_path_new) + + + + + + print("Total things to test (test files and detection files changed): [%d]"%(len(changed_test_files))) + #for l in changed_test_files: + # print(l) + #print(len(changed_test_files)) + import time + time.sleep(5) return changed_test_files + def filter_test_types(self, test_files, test_types = ["Anomaly", "Hunting", "TTP"]): + files_to_test = [] + files_not_to_test = [] + error_files = [] + for filename in test_files: + try: + with open(os.path.join("security_content", filename), "r") as fileData: + yaml_dict = list(yaml.safe_load_all(fileData))[0] + if 'type' not in yaml_dict.keys(): + print("Failed to find 'type' in the yaml for: [%s]"%(filename)) + error_files.append(filename) + if yaml_dict['type'] in test_types: + files_to_test.append(filename) + else: + files_not_to_test.append(filename) + except Exception as e: + print("Error on trying to scan [%s]: [%s]"%(filename, str(e))) + error_files.append(filename) + print("***Detection Information***\n"\ + "\tTotal Files : %d" + "\tFiles to test : %d" + "\tFiles not to test : %d" + "\tError files : %d"%(len(test_files), len(files_to_test), len(files_not_to_test), len(error_files))) + import time + time.sleep(5) + return files_to_test, files_not_to_test, error_files + + + + + + diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index adfd175baf..4ea12edd39 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -5,6 +5,31 @@ import splunklib.client as client import splunklib.results as results import requests + +def enable_delete_for_admin(splunk_host, splunk_port, splunk_password): + try: + service = client.connect( + host=splunk_host, + port=splunk_port, + username='admin', + password=splunk_password + ) + except Exception as e: + print("Unable to connect to Splunk instance: " + str(e)) + return 1, {} + + # search and replace \\ with \\\ + # search = search.replace('\\','\\\\') + role = service.roles['admin'] + try: + role.grant('delete_by_keyword') + except Exception as e: + print("Error - failed trying to grant 'can_delete' privs to admin: [%s]"%(str(e))) + return False + return True + + + def test_baseline_search(splunk_host, splunk_port, splunk_password, search, pass_condition, baseline_name, baseline_file, earliest_time, latest_time): try: service = client.connect( @@ -82,8 +107,8 @@ def test_detection_search(splunk_host, splunk_port, splunk_password, search, pas splunk_search = search + ' ' + pass_condition print("SEARCH:") print(splunk_search) - print("Sleep for 30 seconds") - sleep(30) + #print("Sleep for 30 seconds") + #sleep(30) try: job = service.jobs.create(splunk_search, **kwargs) except Exception as e: @@ -109,8 +134,7 @@ def test_detection_search(splunk_host, splunk_port, splunk_password, search, pas def delete_attack_data(splunk_host, splunk_password, splunk_port): - #print("DO NOT DELETE ANYTHING!") - #return None + print("Deleting test data!") try: service = client.connect( host=splunk_host, @@ -122,8 +146,8 @@ def delete_attack_data(splunk_host, splunk_password, splunk_port): print("Unable to connect to Splunk instance: " + str(e)) return 1, {} - splunk_search = 'search index=test* | delete' - + #splunk_search = 'search index=test* | delete' + splunk_search = 'search index=main | delete' kwargs = {"exec_mode": "blocking", "dispatch.earliest_time": "-1d", "dispatch.latest_time": "now"} diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 47dda5892b..6ba2fef846 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -28,8 +28,9 @@ def test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_po result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var) + #enter = input("Run some tests from [%s] on [%s] - we don't delete until you hit enter :)"%(container_name, test_file)) # delete test data - #splunk_sdk.delete_attack_data(splunk_ip, splunk_password, splunk_port) + splunk_sdk.delete_attack_data(splunk_ip, splunk_password, splunk_port) if result_test['detection_result']['error']: @@ -42,7 +43,7 @@ def test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_po def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var): try: - test_file_obj = load_file("security_content/" + test_file[2:]) + test_file_obj = load_file(os.path.join("security_content/", test_file)) except Exception as e: raise #print('Error: ' + str(e)) @@ -64,18 +65,21 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test for attack_data in test_file_obj['tests'][0]['attack_data']: url = attack_data['data'] r = requests.get(url, allow_redirects=True) - open(folder_name + '/' + attack_data['file_name'], 'wb').write(r.content) - print(folder_name + '/' + attack_data['file_name']) + target_file = os.path.join(folder_name, attack_data['file_name']) + with open(target_file, 'wb') as target: + target.write(r.content) + print(target_file) # Update timestamps before replay if 'update_timestamp' in attack_data: if attack_data['update_timestamp'] == True: data_manipulation = DataManipulation() - data_manipulation.manipulate_timestamp(folder_name + '/' + attack_data['file_name'], attack_data['sourcetype'], attack_data['source']) - - replay_attack_dataset(container_name, splunk_password, folder_name, 'test' + str(test_index), attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) + data_manipulation.manipulate_timestamp(target_file, attack_data['sourcetype'], attack_data['source']) + INDEX_TO_REPLAY_INTO = 'test' + str(test_index) + INDEX_TO_REPLAY_INTO = 'main' + replay_attack_dataset(container_name, splunk_password, folder_name, INDEX_TO_REPLAY_INTO, attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) print("START SLEEP AFTER REPLAY") - time.sleep(30) + time.sleep(60) print("DONE SLEEP AFTER REPLAY") result_test = {} test = test_file_obj['tests'][0] @@ -120,7 +124,7 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test def load_file(file_path): try: print("Opening file path [%s]"%(file_path)) - sys.exit(0) + with open(file_path, 'r', encoding="utf-8") as stream: try: file = list(yaml.safe_load_all(stream))[0] From 1a131ead59a74b75d7175e532b5674683039c873 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 12 Oct 2021 17:22:10 -0700 Subject: [PATCH 014/203] More changes for testing. Prep for long-term test of all detection with results output to file. --- .../detection_testing_execution.py | 46 +++++++++++++++---- .../modules/splunk_sdk.py | 4 +- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 128f44acef..321172a103 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -12,7 +12,10 @@ from modules.github_service import GithubService from modules import aws_service, testing_service import time import subprocess -from datetime import datetime + +from timeit import default_timer as timer +from datetime import timedelta + SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" @@ -24,7 +27,7 @@ datamodel_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "Splunk_ PASSWORD_LENGTH=20 MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING=2 -DOCKER_HUB_CONTAINER_PATH="splunk/splunk:latest" +DOCKER_HUB_CONTAINER_PATH="splunk/splunk:8.1" BASE_CONTAINER_NAME="splunk" @@ -86,7 +89,10 @@ def stop_container(docker_client, container_name, force=True): def main(args): - start_time = datetime.now() + + start_time = timer() + + parser = argparse.ArgumentParser(description="CI Detection Testing") parser.add_argument("-b", "--branch", type=str, required=True, help="security content branch") parser.add_argument("-u", "--uuid", type=str, required=True, help="uuid for detection test") @@ -96,7 +102,7 @@ def main(args): parser.add_argument("-i", "--reuse_images", required=False, type=bool, default=False, help="Should existing images be re-used, or should they be redownloaded?") parser.add_argument("-c", "--reuse_containers", required=False, type=bool, default=False, help="Should existing containers be re-used, or should they be rebuilt?") - parser.add_argument("-s", "--success", type=str, required=False, help="File that contains previously successful runs that we don't need to test") + parser.add_argument("-s", "--success_file", type=str, required=False, help="File that contains previously successful runs that we don't need to test") args = parser.parse_args() branch = args.branch @@ -107,11 +113,17 @@ def main(args): reuse_images = args.reuse_images success_file = args.success_file + success_tests = [] if success_file is not None: with open(success_file, "r") as successes: - success_tests = [x.strip() for x in successes.readlines()] + for line in successes.readlines(): + file_path_new = os.path.join("tests", os.path.splitext(line)[0]) + ".test.yml" + #file_path_base = os.path.splitext(line)[0].replace('detections', 'tests') + '.test' + #file_path_new = file_path_base + '.yml' + success_tests.append(file_path_new) + #success_tests = [x.strip() for x in successes.readlines()] else: - success_tests = [] + pass if num_containers < 1: @@ -141,6 +153,8 @@ def main(args): else: print("Already found [%s] in success file, not testing it again"%(f)) test_files = new_test_files + print(test_files) + time.sleep(10) #Go into the security content directory print("****GENERATE NEW CONTENT****") @@ -401,13 +415,23 @@ def main(args): while True: o = results_queue.get(block=False) - print(o) + o_result = o['detection_result'] + if o_result['error'] is False: + success_output.write(o_result['detection_file']+'\n') + else: + failure_output.write(o_result['detection_file']+'\n') + + print(o_result) except queue.Empty: print("That's all the output!") + + success_output.close() + failure_output.close() + #now we are done! - stop_time = datetime.now() - print("Total Execution Time: [%s]"%(stop_time-start_time)) + stop_time = timer() + print("Total Execution Time: [%s]"%(timedelta(seconds=stop_time - start_time, microseconds=0))) #detection testing service has already been prepared, no need to do it here! @@ -416,13 +440,15 @@ def main(args): #testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) def queue_status_thread(total_tests_count, testing_queue, results_queue, success_names_queue, failure_names_queue): + test_start_time = timer() while True: print("***Progress Update:\n"\ + "\tElapsed Time : %s\n"\ "\tTests to run : %d\n"\ "\tTests currently running: %d\n"\ "\tTests completed : %d\n"\ "\t\tSuccess : %d\n"\ - "\t\tFailure : %d"%(testing_queue.qsize(), total_tests_count - testing_queue.qsize() - results_queue.qsize(), results_queue.qsize(), success_names_queue.qsize(), failure_names_queue.qsize())) + "\t\tFailure : %d"%(timedelta(seconds=timer() - test_start_time, microseconds=0), testing_queue.qsize(), total_tests_count - testing_queue.qsize() - results_queue.qsize(), results_queue.qsize(), success_names_queue.qsize(), failure_names_queue.qsize())) if results_queue.qsize() == total_tests_count: return else: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 4ea12edd39..60b9294406 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -107,8 +107,7 @@ def test_detection_search(splunk_host, splunk_port, splunk_password, search, pas splunk_search = search + ' ' + pass_condition print("SEARCH:") print(splunk_search) - #print("Sleep for 30 seconds") - #sleep(30) + try: job = service.jobs.create(splunk_search, **kwargs) except Exception as e: @@ -147,6 +146,7 @@ def delete_attack_data(splunk_host, splunk_password, splunk_port): return 1, {} #splunk_search = 'search index=test* | delete' + #_ = input("****************Press ENTER to DELETE****************") splunk_search = 'search index=main | delete' kwargs = {"exec_mode": "blocking", "dispatch.earliest_time": "-1d", From b607f8a99d84b4492e507e71e11a128dd5433d2d Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 13 Oct 2021 12:31:02 -0700 Subject: [PATCH 015/203] Some small config updates --- .../detection_testing_execution.py | 34 ++++++++++++++++--- .../modules/github_service.py | 6 ++-- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 321172a103..95f8f9980d 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -27,7 +27,7 @@ datamodel_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "Splunk_ PASSWORD_LENGTH=20 MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING=2 -DOCKER_HUB_CONTAINER_PATH="splunk/splunk:8.1" +DOCKER_HUB_CONTAINER_PATH="splunk/splunk:8.2.0" BASE_CONTAINER_NAME="splunk" @@ -103,6 +103,8 @@ def main(args): parser.add_argument("-c", "--reuse_containers", required=False, type=bool, default=False, help="Should existing containers be re-used, or should they be rebuilt?") parser.add_argument("-s", "--success_file", type=str, required=False, help="File that contains previously successful runs that we don't need to test") + parser.add_argument("-user", "--splunkbase_username", type=str, require=True, help="Splunkbase username for downloading Splunkbase apps") + parser.add_argument("-pw", "--splunkbase_password", type=str, require=True, help="Splunkbase password for downloading Splunkbase apps") args = parser.parse_args() branch = args.branch @@ -112,6 +114,8 @@ def main(args): reuse_containers = args.reuse_containers reuse_images = args.reuse_images success_file = args.success_file + splunkbase_username = args.splunkbase_username + splunkbase_password = args.splunkbase_password success_tests = [] if success_file is not None: @@ -145,7 +149,7 @@ def main(args): print("No new detections to test.") #aws_service.dynamo_db_nothing_to_test(REGION, uuid_test, str(int(time.time()))) sys.exit(0) - print("The files to test: %s", str(test_files)) + #print("The files to test: %s", str(test_files)) new_test_files = [] for f in test_files: if f not in success_tests: @@ -153,7 +157,25 @@ def main(args): else: print("Already found [%s] in success file, not testing it again"%(f)) test_files = new_test_files + + test_files = [ + #"tests/endpoint/disable_registry_tool.test.yml", + #"tests/endpoint/disable_show_hidden_files.test.yml", + #"tests/endpoint/disable_windows_behavior_monitoring.test.yml", + #"tests/endpoint/disable_windows_smartscreen_protection.test.yml", + #"tests/endpoint/disabling_cmd_application.test.yml", + #"tests/endpoint/disabling_controlpanel.test.yml", + #"tests/endpoint/disabling_folderoptions_windows_feature.test.yml" + #"tests/endpoint/disabling_norun_windows_app.test.yml", + #"tests/endpoint/disabling_systemrestore_in_registry.test.yml", + #"tests/endpoint/disabling_task_manager.test.yml" + + + "tests/endpoint/any_powershell_downloadfile.test.yml" + ] + print(test_files) + time.sleep(10) #Go into the security content directory @@ -360,15 +382,17 @@ def main(args): SPLUNK_ADD_ON_FOR_SYSMON = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" + SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS = "https://splunkbase.splunk.com/app/742/release/8.1.2/download" - SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS, SPLUNK_ADD_ON_FOR_SYSMON, SYSMON_APP_FOR_SPLUNK, SPLUNK_ES_CONTENT_UPDATE] + + SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS, SPLUNK_ADD_ON_FOR_SYSMON, SYSMON_APP_FOR_SPLUNK, SPLUNK_ES_CONTENT_UPDATE, SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] #docker run -p8089:8089 -p 8000:8000 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=123456qwertyQWERTY" -e "SPLUNK_APPS_URL=https://splunkbase.splunk.com/app/3435/release/3.3.4/download,https://splunkbase.splunk.com/app/5709/release/1.0.1/download,https://splunkbase.splunk.com/app/3449/release/3.29.0/download,https://splunkbase.splunk.com/app/1621/release/4.20.2/download" -e "SPLUNKBASE_USERNAME=ericmcginnistwo" -e "SPLUNKBASE_PASSWORD=splunkSecondAccount5@" -name splunktemplate splunk/splunk:latest environment = {"SPLUNK_START_ARGS": "--accept-license", "SPLUNK_PASSWORD" : splunk_password, "SPLUNK_APPS_URL" : ','.join(SPLUNK_APPS), - "SPLUNKBASE_USERNAME" : "emcginnistwo", - "SPLUNKBASE_PASSWORD" : "splunkSecondAccount5@" + "SPLUNKBASE_USERNAME" : splunkbase_username, + "SPLUNKBASE_PASSWORD" : splunkbase_password } ports= {"8000/tcp": web_port, "8089/tcp": management_port diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index d113ae6d54..58330616d9 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -71,12 +71,12 @@ class GithubService: - print("Total things to test (test files and detection files changed): [%d]"%(len(changed_test_files))) + #print("Total things to test (test files and detection files changed): [%d]"%(len(changed_test_files))) #for l in changed_test_files: # print(l) #print(len(changed_test_files)) - import time - time.sleep(5) + #import time + #time.sleep(5) return changed_test_files def filter_test_types(self, test_files, test_types = ["Anomaly", "Hunting", "TTP"]): From 75fe6a9f618d0c60e7362d530a57a54ce0b2930a Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 15 Oct 2021 13:55:46 -0700 Subject: [PATCH 016/203] More progress. Now build and upload apps from local file system as well as install from splunkbase. --- .../detection_testing_execution.py | 117 +++++++++++++----- .../modules/github_service.py | 49 +++++++- .../modules/testing_service.py | 2 +- 3 files changed, 134 insertions(+), 34 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 95f8f9980d..ad68ebe662 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -103,8 +103,8 @@ def main(args): parser.add_argument("-c", "--reuse_containers", required=False, type=bool, default=False, help="Should existing containers be re-used, or should they be rebuilt?") parser.add_argument("-s", "--success_file", type=str, required=False, help="File that contains previously successful runs that we don't need to test") - parser.add_argument("-user", "--splunkbase_username", type=str, require=True, help="Splunkbase username for downloading Splunkbase apps") - parser.add_argument("-pw", "--splunkbase_password", type=str, require=True, help="Splunkbase password for downloading Splunkbase apps") + parser.add_argument("-user", "--splunkbase_username", type=str, required=True, help="Splunkbase username for downloading Splunkbase apps") + parser.add_argument("-pw", "--splunkbase_password", type=str, required=True, help="Splunkbase password for downloading Splunkbase apps") args = parser.parse_args() branch = args.branch @@ -157,23 +157,55 @@ def main(args): else: print("Already found [%s] in success file, not testing it again"%(f)) test_files = new_test_files - + ''' test_files = [ - #"tests/endpoint/disable_registry_tool.test.yml", - #"tests/endpoint/disable_show_hidden_files.test.yml", - #"tests/endpoint/disable_windows_behavior_monitoring.test.yml", - #"tests/endpoint/disable_windows_smartscreen_protection.test.yml", - #"tests/endpoint/disabling_cmd_application.test.yml", - #"tests/endpoint/disabling_controlpanel.test.yml", - #"tests/endpoint/disabling_folderoptions_windows_feature.test.yml" - #"tests/endpoint/disabling_norun_windows_app.test.yml", - #"tests/endpoint/disabling_systemrestore_in_registry.test.yml", - #"tests/endpoint/disabling_task_manager.test.yml" - - - "tests/endpoint/any_powershell_downloadfile.test.yml" - ] - + "tests/endpoint/active_setup_registry_autostart.test.yml", + "tests/endpoint/change_default_file_association.test.yml", + "tests/endpoint/delete_shadowcopy_with_powershell.test.yml", + "tests/endpoint/detect_processes_used_for_system_network_configuration_discovery.test.yml", + "tests/endpoint/enable_rdp_in_other_port_number.test.yml", + "tests/endpoint/enable_wdigest_uselogoncredential_registry.test.yml", + "tests/endpoint/etw_registry_disabled.test.yml", + "tests/endpoint/eventvwr_uac_bypass.test.yml", + "tests/endpoint/get_notable_history.test.yml", + "tests/endpoint/get_parent_process_info.test.yml", + "tests/endpoint/get_process_info.test.yml", + "tests/endpoint/hide_user_account_from_sign_in_screen.test.yml", + "tests/endpoint/logon_script_event_trigger_execution.test.yml", + "tests/endpoint/mailsniper_invoke_functions.test.yml", + "tests/endpoint/malicious_inprocserver32_modification.test.yml", + "tests/endpoint/modification_of_wallpaper.test.yml", + "tests/endpoint/monitor_registry_keys_for_print_monitors.test.yml", + "tests/endpoint/net_profiler_uac_bypass.test.yml", + "tests/endpoint/powershell_disable_security_monitoring.test.yml", + "tests/endpoint/powershell_enable_smb1protocol_feature.test.yml", + "tests/endpoint/process_writing_dynamicwrapperx.test.yml", + "tests/endpoint/registry_keys_used_for_persistence.test.yml", + "tests/endpoint/registry_keys_used_for_privilege_escalation.test.yml", + "tests/endpoint/remcos_client_registry_install_entry.test.yml", + "tests/endpoint/revil_registry_entry.test.yml", + "tests/endpoint/screensaver_event_trigger_execution.test.yml", + "tests/endpoint/sdclt_uac_bypass.test.yml", + "tests/endpoint/secretdumps_offline_ntds_dumping_tool.test.yml", + "tests/endpoint/silentcleanup_uac_bypass.test.yml", + "tests/endpoint/slui_runas_elevated.test.yml", + "tests/endpoint/disable_amsi_through_registry.test.yml", + "tests/endpoint/disable_etw_through_registry.test.yml", + "tests/endpoint/disable_registry_tool.test.yml", + "tests/endpoint/disable_security_logs_using_minint_registry.test.yml", + "tests/endpoint/disable_show_hidden_files.test.yml", + "tests/endpoint/disable_uac_remote_restriction.test.yml", + "tests/endpoint/disable_windows_app_hotkeys.test.yml", + "tests/endpoint/disable_windows_behavior_monitoring.test.yml", + "tests/endpoint/disable_windows_smartscreen_protection.test.yml", + "tests/endpoint/disabling_cmd_application.test.yml", + "tests/endpoint/disabling_controlpanel.test.yml", + "tests/endpoint/disabling_folderoptions_windows_feature.test.yml", + "tests/endpoint/disabling_norun_windows_app.test.yml", + "tests/endpoint/disabling_remote_user_account_control.test.yml", + "tests/endpoint/disabling_systemrestore_in_registry.test.yml", + "tests/endpoint/disabling_task_manager.test.yml"] + ''' print(test_files) time.sleep(10) @@ -181,14 +213,33 @@ def main(args): #Go into the security content directory print("****GENERATE NEW CONTENT****") os.chdir("security_content") - commands = ["python3 -m venv .venv", "source .venv/bin/activate", "python3 -m pip install wheel", "python3 -m pip install -r requirements.txt", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu"] + commands = ["python3 -m venv .venv", "source .venv/bin/activate", "python3 -m pip install wheel", "python3 -m pip install -r requirements.txt", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] ret = subprocess.run("; ".join(commands), shell=True, capture_output=False) if ret.returncode != 0: print("Error generating new content. Exiting...") sys.exit(1) - print("New content generated successfully") + print("New content generated successfully") os.chdir("..") + print("Generate new ESCU Package using new content") + commands = ["curl -Ls https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz -o splunk-packaging-toolkit-latest.tar.gz", + "rm -rf slim-latest", + "mkdir slim-latest", + "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", + "cd slim-latest", + "virtualenv --python=/usr/bin/python2.7 --clear venv", + "source venv/bin/activate", + "python2 -m pip install --upgrade pip", + "python2 -m pip install wheel", + "python2 -m pip install semantic_version", + "python2 -m pip install .", + "cp -R ../security_content/dist/escu DA-ESS-ContentUpdate" + "slim package -o upload DA-ESS-ContentUpdate", + "cp upload/DA-ESS-ContentUpdate*.tar.gz /tmp/apps/DA-ESS-ContentUpdate-latest.tar.gz" + ] + + sys.exit(1) + client = docker.client.from_env() splunk_password = '123456qwertyQWERTY' @@ -378,15 +429,16 @@ def main(args): SPLUNK_COMMON_INFORMATION_MODEL = "https://splunkbase.splunk.com/app/1621/release/4.20.2/download" SPLUNK_SECURITY_ESSENTIALS = "https://splunkbase.splunk.com/app/3435/release/3.3.4/download" - #SPLUNK_ADD_ON_FOR_SYSMON = "https://splunkbase.splunk.com/app/5709/release/1.0.1/download" - SPLUNK_ADD_ON_FOR_SYSMON = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" - SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" - SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" - SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS = "https://splunkbase.splunk.com/app/742/release/8.1.2/download" - - - SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS, SPLUNK_ADD_ON_FOR_SYSMON, SYSMON_APP_FOR_SPLUNK, SPLUNK_ES_CONTENT_UPDATE, SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] - + #SPLUNK_ADD_ON_FOR_SYSMON_OLD = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" + #SPLUNK_ADD_ON_FOR_SYSMON_NEW = "https://splunkbase.splunk.com/app/5709/release/1.0.1/download" + #SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" + #SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" + #SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS = "https://splunkbase.splunk.com/app/742/release/8.2.0/download" + LOCAL_GENERATED_ESCU_LATEST = os.path.join(os.getcwd(),"/tmp/apps/DA-ESS-ContentUpdate.tgz") + LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_NEW = os.path.join(os.getcwd(),"/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") + + SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS, LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_NEW, LOCAL_GENERATED_ESCU_LATEST] + #SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS , SPLUNK_ES_CONTENT_UPDATE, SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] #docker run -p8089:8089 -p 8000:8000 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=123456qwertyQWERTY" -e "SPLUNK_APPS_URL=https://splunkbase.splunk.com/app/3435/release/3.3.4/download,https://splunkbase.splunk.com/app/5709/release/1.0.1/download,https://splunkbase.splunk.com/app/3449/release/3.29.0/download,https://splunkbase.splunk.com/app/1621/release/4.20.2/download" -e "SPLUNKBASE_USERNAME=ericmcginnistwo" -e "SPLUNKBASE_PASSWORD=splunkSecondAccount5@" -name splunktemplate splunk/splunk:latest environment = {"SPLUNK_START_ARGS": "--accept-license", "SPLUNK_PASSWORD" : splunk_password, @@ -397,9 +449,10 @@ def main(args): ports= {"8000/tcp": web_port, "8089/tcp": management_port } + mounts = [docker.types.Mount(target = '/tmp/apps/', source = '/tmp/apps', type='bind', read_only=True)] print("Creating CONTAINER: [%s]"%(container_name)) - base_container = client.containers.create(DOCKER_HUB_CONTAINER_PATH, ports=ports, environment=environment, name=container_name, detach=True) + base_container = client.containers.create(DOCKER_HUB_CONTAINER_PATH, ports=ports, environment=environment, name=container_name, mounts=mounts, detach=True) print("Created CONTAINER : [%s]"%(container_name)) #print("Creating a new container called [%s]"%(container_name)) #environment = {"SPLUNK_START_ARGS": "--accept-license", @@ -504,7 +557,7 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa #Assume that the base container has already been fully built with #escu etc #sleep for a little bit so that we don't all start at once... - time.sleep(random.randrange(0,60)) + #time.sleep(random.randrange(0,60)) container = client.containers.get(container_name) print("Starting the container [%s]"%(container_name)) @@ -525,7 +578,7 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa sys.exit(0) print("Successfully enabled DELETE for [%s]"%(container_name)) - + time.sleep(60) index=0 try: while True: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 58330616d9..64b22a1f44 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -58,7 +58,54 @@ class GithubService: #all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters changed_test_files = [name.split('\t')[1] for name in changed_test_files if len(name.split('\t')) == 2] changed_detection_files = [name.split('\t')[1] for name in changed_detection_files if len(name.split('\t')) == 2] - + + changed_detection_files = [ + "detections/endpoint/active_setup_registry_autostart.yml", + "detections/endpoint/change_default_file_association.yml", + "detections/endpoint/delete_shadowcopy_with_powershell.yml", + "detections/endpoint/detect_processes_used_for_system_network_configuration_discovery.yml", + "detections/endpoint/enable_rdp_in_other_port_number.yml", + "detections/endpoint/enable_wdigest_uselogoncredential_registry.yml", + "detections/endpoint/etw_registry_disabled.yml", + "detections/endpoint/eventvwr_uac_bypass.yml", + "detections/endpoint/get_notable_history.yml", + "detections/endpoint/get_parent_process_info.yml", + "detections/endpoint/get_process_info.yml", + "detections/endpoint/hide_user_account_from_sign_in_screen.yml", + "detections/endpoint/logon_script_event_trigger_execution.yml", + "detections/endpoint/mailsniper_invoke_functions.yml", + "detections/endpoint/malicious_inprocserver32_modification.yml", + "detections/endpoint/modification_of_wallpaper.yml", + "detections/endpoint/monitor_registry_keys_for_print_monitors.yml", + "detections/endpoint/net_profiler_uac_bypass.yml", + "detections/endpoint/powershell_disable_security_monitoring.yml", + "detections/endpoint/powershell_enable_smb1protocol_feature.yml", + "detections/endpoint/process_writing_dynamicwrapperx.yml", + "detections/endpoint/registry_keys_used_for_persistence.yml", + "detections/endpoint/registry_keys_used_for_privilege_escalation.yml", + "detections/endpoint/remcos_client_registry_install_entry.yml", + "detections/endpoint/revil_registry_entry.yml", + "detections/endpoint/screensaver_event_trigger_execution.yml", + "detections/endpoint/sdclt_uac_bypass.yml", + "detections/endpoint/secretdumps_offline_ntds_dumping_tool.yml", + "detections/endpoint/silentcleanup_uac_bypass.yml", + "detections/endpoint/slui_runas_elevated.yml", + "detections/endpoint/disable_amsi_through_registry.yml", + "detections/endpoint/disable_etw_through_registry.yml", + "detections/endpoint/disable_registry_tool.yml", + "detections/endpoint/disable_security_logs_using_minint_registry.yml", + "detections/endpoint/disable_show_hidden_files.yml", + "detections/endpoint/disable_uac_remote_restriction.yml", + "detections/endpoint/disable_windows_app_hotkeys.yml", + "detections/endpoint/disable_windows_behavior_monitoring.yml", + "detections/endpoint/disable_windows_smartscreen_protection.yml", + "detections/endpoint/disabling_cmd_application.yml", + "detections/endpoint/disabling_controlpanel.yml", + "detections/endpoint/disabling_folderoptions_windows_feature.yml", + "detections/endpoint/disabling_norun_windows_app.yml", + "detections/endpoint/disabling_remote_user_account_control.yml", + "detections/endpoint/disabling_systemrestore_in_registry.yml", + "detections/endpoint/disabling_task_manager.yml"] detections_to_test,_,_ = self.filter_test_types(changed_detection_files) for f in detections_to_test: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 6ba2fef846..a6c8ce7f7c 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -28,7 +28,7 @@ def test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_po result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var) - #enter = input("Run some tests from [%s] on [%s] - we don't delete until you hit enter :)"%(container_name, test_file)) + enter = input("Run some tests from [%s] on [%s] - we don't delete until you hit enter :)"%(container_name, test_file)) # delete test data splunk_sdk.delete_attack_data(splunk_ip, splunk_password, splunk_port) From 9e76ab75fcf093768d6f256f1fcc5b35a0e92aee Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 19 Oct 2021 16:49:43 -0700 Subject: [PATCH 017/203] Working better during testing, but still needs a huge amount of cleanup. Lots of dead code and magic strings. --- .../detection_testing_execution.py | 98 +++++++------------ .../modules/github_service.py | 95 +++++++++--------- .../modules/testing_service.py | 18 ++-- 3 files changed, 91 insertions(+), 120 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index ad68ebe662..7eb257fa90 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -144,69 +144,38 @@ def main(args): github_service = GithubService(branch, pr_number) else: github_service = GithubService(branch) - test_files = github_service.get_changed_test_files() + #test_files = github_service.get_all_tests_and_detections(folders=["endpoint"], previously_successful_tests=success_tests) + test_files = github_service.get_all_tests_and_detections(folders=["endpoint"]) + print(len(test_files)) + sys.exit(1) + #test_files2 = github_service.get_changed_test_files() if len(test_files) == 0: print("No new detections to test.") #aws_service.dynamo_db_nothing_to_test(REGION, uuid_test, str(int(time.time()))) sys.exit(0) - #print("The files to test: %s", str(test_files)) + + #print(test_files2[:5]) + #sys.exit(0) + new_test_files = [] + + for f in test_files: if f not in success_tests: new_test_files.append(f) else: + #pass print("Already found [%s] in success file, not testing it again"%(f)) - test_files = new_test_files + + #test_files = new_test_files ''' - test_files = [ - "tests/endpoint/active_setup_registry_autostart.test.yml", - "tests/endpoint/change_default_file_association.test.yml", - "tests/endpoint/delete_shadowcopy_with_powershell.test.yml", - "tests/endpoint/detect_processes_used_for_system_network_configuration_discovery.test.yml", - "tests/endpoint/enable_rdp_in_other_port_number.test.yml", - "tests/endpoint/enable_wdigest_uselogoncredential_registry.test.yml", - "tests/endpoint/etw_registry_disabled.test.yml", - "tests/endpoint/eventvwr_uac_bypass.test.yml", - "tests/endpoint/get_notable_history.test.yml", - "tests/endpoint/get_parent_process_info.test.yml", - "tests/endpoint/get_process_info.test.yml", - "tests/endpoint/hide_user_account_from_sign_in_screen.test.yml", - "tests/endpoint/logon_script_event_trigger_execution.test.yml", - "tests/endpoint/mailsniper_invoke_functions.test.yml", - "tests/endpoint/malicious_inprocserver32_modification.test.yml", - "tests/endpoint/modification_of_wallpaper.test.yml", - "tests/endpoint/monitor_registry_keys_for_print_monitors.test.yml", - "tests/endpoint/net_profiler_uac_bypass.test.yml", - "tests/endpoint/powershell_disable_security_monitoring.test.yml", - "tests/endpoint/powershell_enable_smb1protocol_feature.test.yml", - "tests/endpoint/process_writing_dynamicwrapperx.test.yml", - "tests/endpoint/registry_keys_used_for_persistence.test.yml", - "tests/endpoint/registry_keys_used_for_privilege_escalation.test.yml", - "tests/endpoint/remcos_client_registry_install_entry.test.yml", - "tests/endpoint/revil_registry_entry.test.yml", - "tests/endpoint/screensaver_event_trigger_execution.test.yml", - "tests/endpoint/sdclt_uac_bypass.test.yml", - "tests/endpoint/secretdumps_offline_ntds_dumping_tool.test.yml", - "tests/endpoint/silentcleanup_uac_bypass.test.yml", - "tests/endpoint/slui_runas_elevated.test.yml", - "tests/endpoint/disable_amsi_through_registry.test.yml", - "tests/endpoint/disable_etw_through_registry.test.yml", - "tests/endpoint/disable_registry_tool.test.yml", - "tests/endpoint/disable_security_logs_using_minint_registry.test.yml", - "tests/endpoint/disable_show_hidden_files.test.yml", - "tests/endpoint/disable_uac_remote_restriction.test.yml", - "tests/endpoint/disable_windows_app_hotkeys.test.yml", - "tests/endpoint/disable_windows_behavior_monitoring.test.yml", - "tests/endpoint/disable_windows_smartscreen_protection.test.yml", - "tests/endpoint/disabling_cmd_application.test.yml", - "tests/endpoint/disabling_controlpanel.test.yml", - "tests/endpoint/disabling_folderoptions_windows_feature.test.yml", - "tests/endpoint/disabling_norun_windows_app.test.yml", - "tests/endpoint/disabling_remote_user_account_control.test.yml", - "tests/endpoint/disabling_systemrestore_in_registry.test.yml", - "tests/endpoint/disabling_task_manager.test.yml"] + print('\n'.join(test_files)) + for f in test_files: + with open('security_content/'+f,'r') as b: + data = b.read() + if 'baseline' in data.lower(): + print("baseline found in [%s]"%(f)) ''' - print(test_files) time.sleep(10) @@ -233,12 +202,18 @@ def main(args): "python2 -m pip install wheel", "python2 -m pip install semantic_version", "python2 -m pip install .", - "cp -R ../security_content/dist/escu DA-ESS-ContentUpdate" + "cp -R ../security_content/dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", "cp upload/DA-ESS-ContentUpdate*.tar.gz /tmp/apps/DA-ESS-ContentUpdate-latest.tar.gz" ] - sys.exit(1) + ret = subprocess.run("; ".join(commands), shell=True, capture_output=False) + if ret.returncode != 0: + print("Error generating new ESCU Package. Exiting...") + sys.exit(1) + print("New ESCU PAckage generated successfully") + + client = docker.client.from_env() splunk_password = '123456qwertyQWERTY' @@ -429,15 +404,18 @@ def main(args): SPLUNK_COMMON_INFORMATION_MODEL = "https://splunkbase.splunk.com/app/1621/release/4.20.2/download" SPLUNK_SECURITY_ESSENTIALS = "https://splunkbase.splunk.com/app/3435/release/3.3.4/download" - #SPLUNK_ADD_ON_FOR_SYSMON_OLD = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" + SPLUNK_ADD_ON_FOR_SYSMON_OLD = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" #SPLUNK_ADD_ON_FOR_SYSMON_NEW = "https://splunkbase.splunk.com/app/5709/release/1.0.1/download" + #LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_NEW = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" #SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" #SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" - #SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS = "https://splunkbase.splunk.com/app/742/release/8.2.0/download" - LOCAL_GENERATED_ESCU_LATEST = os.path.join(os.getcwd(),"/tmp/apps/DA-ESS-ContentUpdate.tgz") - LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_NEW = os.path.join(os.getcwd(),"/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") + SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS = "https://splunkbase.splunk.com/app/742/release/8.2.0/download" + LOCAL_GENERATED_ESCU_LATEST = "/tmp/apps/DA-ESS-ContentUpdate-latest.tar.gz" - SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS, LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_NEW, LOCAL_GENERATED_ESCU_LATEST] + SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS, SPLUNK_ADD_ON_FOR_SYSMON_OLD, LOCAL_GENERATED_ESCU_LATEST, SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] + #SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS, LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_NEW, LOCAL_GENERATED_ESCU_LATEST, SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] + + #SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS , SPLUNK_ES_CONTENT_UPDATE, SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] #docker run -p8089:8089 -p 8000:8000 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=123456qwertyQWERTY" -e "SPLUNK_APPS_URL=https://splunkbase.splunk.com/app/3435/release/3.3.4/download,https://splunkbase.splunk.com/app/5709/release/1.0.1/download,https://splunkbase.splunk.com/app/3449/release/3.29.0/download,https://splunkbase.splunk.com/app/1621/release/4.20.2/download" -e "SPLUNKBASE_USERNAME=ericmcginnistwo" -e "SPLUNKBASE_PASSWORD=splunkSecondAccount5@" -name splunktemplate splunk/splunk:latest environment = {"SPLUNK_START_ARGS": "--accept-license", @@ -557,7 +535,7 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa #Assume that the base container has already been fully built with #escu etc #sleep for a little bit so that we don't all start at once... - #time.sleep(random.randrange(0,60)) + time.sleep(random.randrange(0,60)) container = client.containers.get(container_name) print("Starting the container [%s]"%(container_name)) @@ -578,7 +556,7 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa sys.exit(0) print("Successfully enabled DELETE for [%s]"%(container_name)) - time.sleep(60) + index=0 try: while True: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 64b22a1f44..1d29e91a83 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -4,8 +4,9 @@ import os import logging import glob import subprocess +from git.objects import base import yaml - +import pathlib # Logger logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO")) LOGGER = logging.getLogger(__name__) @@ -28,6 +29,49 @@ class GithubService: repo_obj = git.Repo.clone_from(url, project, branch=branch) return repo_obj + + def get_all_tests_and_detections(self, folders=['endpoint', 'cloud', 'network'], ttps_to_test=["Anomaly","Hunting","TTP"], previously_successful_tests=[]): + detections = [] + for folder in folders: + detections.extend(self.get_all_files_in_folder(os.path.join("security_content/detections", folder), "*.yml")) + + + #Prune this down to only the subset of detections we can test + detections_to_test = [] + tests=[] + + + for detection in detections: + #Don't do anything with SSA stuff + if os.path.basename(detection).startswith("ssa"): + continue + with open(detection, "r") as d: + description = yaml.safe_load(d) + + test_filepath = os.path.splitext(detection)[0].replace('detections', 'tests') + '.test.yml' + test_filepath_without_security_content = str(pathlib.Path(*pathlib.Path(test_filepath).parts[1:])) + if 'type' in description and description['type'] in ttps_to_test: + + #print(description['type']) + if not os.path.exists(test_filepath): + print("Detection [%s] references [%s], but it does not exist"%(detection, test_filepath)) + #raise(Exception("Detection [%s] references [%s], but it does not exist"%(detection, test_filepath))) + elif test_filepath_without_security_content in previously_successful_tests: + print("Ignoring test [%s] before it has already passed previously"%(detection)) + else: + #remove leading security_content/ from path + tests.append(test_filepath_without_security_content) + else: + #Don't do anything with these files + pass + + return tests + + def get_all_files_in_folder(self, foldername, extension): + filesnames = glob.glob(os.path.join(foldername, extension)) + return filesnames + + def get_changed_test_files(self): branch1 = self.security_content_branch branch2 = 'develop' @@ -56,56 +100,9 @@ class GithubService: # changed_test_files.append(file_path_new) #all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters - changed_test_files = [name.split('\t')[1] for name in changed_test_files if len(name.split('\t')) == 2] + changed_test_files = [name.split('\t')[1] for name in changed_test_files if len(name.split('\t')) == 2] changed_detection_files = [name.split('\t')[1] for name in changed_detection_files if len(name.split('\t')) == 2] - changed_detection_files = [ - "detections/endpoint/active_setup_registry_autostart.yml", - "detections/endpoint/change_default_file_association.yml", - "detections/endpoint/delete_shadowcopy_with_powershell.yml", - "detections/endpoint/detect_processes_used_for_system_network_configuration_discovery.yml", - "detections/endpoint/enable_rdp_in_other_port_number.yml", - "detections/endpoint/enable_wdigest_uselogoncredential_registry.yml", - "detections/endpoint/etw_registry_disabled.yml", - "detections/endpoint/eventvwr_uac_bypass.yml", - "detections/endpoint/get_notable_history.yml", - "detections/endpoint/get_parent_process_info.yml", - "detections/endpoint/get_process_info.yml", - "detections/endpoint/hide_user_account_from_sign_in_screen.yml", - "detections/endpoint/logon_script_event_trigger_execution.yml", - "detections/endpoint/mailsniper_invoke_functions.yml", - "detections/endpoint/malicious_inprocserver32_modification.yml", - "detections/endpoint/modification_of_wallpaper.yml", - "detections/endpoint/monitor_registry_keys_for_print_monitors.yml", - "detections/endpoint/net_profiler_uac_bypass.yml", - "detections/endpoint/powershell_disable_security_monitoring.yml", - "detections/endpoint/powershell_enable_smb1protocol_feature.yml", - "detections/endpoint/process_writing_dynamicwrapperx.yml", - "detections/endpoint/registry_keys_used_for_persistence.yml", - "detections/endpoint/registry_keys_used_for_privilege_escalation.yml", - "detections/endpoint/remcos_client_registry_install_entry.yml", - "detections/endpoint/revil_registry_entry.yml", - "detections/endpoint/screensaver_event_trigger_execution.yml", - "detections/endpoint/sdclt_uac_bypass.yml", - "detections/endpoint/secretdumps_offline_ntds_dumping_tool.yml", - "detections/endpoint/silentcleanup_uac_bypass.yml", - "detections/endpoint/slui_runas_elevated.yml", - "detections/endpoint/disable_amsi_through_registry.yml", - "detections/endpoint/disable_etw_through_registry.yml", - "detections/endpoint/disable_registry_tool.yml", - "detections/endpoint/disable_security_logs_using_minint_registry.yml", - "detections/endpoint/disable_show_hidden_files.yml", - "detections/endpoint/disable_uac_remote_restriction.yml", - "detections/endpoint/disable_windows_app_hotkeys.yml", - "detections/endpoint/disable_windows_behavior_monitoring.yml", - "detections/endpoint/disable_windows_smartscreen_protection.yml", - "detections/endpoint/disabling_cmd_application.yml", - "detections/endpoint/disabling_controlpanel.yml", - "detections/endpoint/disabling_folderoptions_windows_feature.yml", - "detections/endpoint/disabling_norun_windows_app.yml", - "detections/endpoint/disabling_remote_user_account_control.yml", - "detections/endpoint/disabling_systemrestore_in_registry.yml", - "detections/endpoint/disabling_task_manager.yml"] detections_to_test,_,_ = self.filter_test_types(changed_detection_files) for f in detections_to_test: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index a6c8ce7f7c..b02c48d185 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -28,7 +28,7 @@ def test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_po result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var) - enter = input("Run some tests from [%s] on [%s] - we don't delete until you hit enter :)"%(container_name, test_file)) + #enter = input("Run some tests from [%s] on [%s] - we don't delete until you hit enter :)"%(container_name, test_file)) # delete test data splunk_sdk.delete_attack_data(splunk_ip, splunk_password, splunk_port) @@ -45,14 +45,12 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test try: test_file_obj = load_file(os.path.join("security_content/", test_file)) except Exception as e: - raise - #print('Error: ' + str(e)) - #return + print('Error: ' + str(e)) + return None if not test_file_obj: print("Not test_file_obj!") - raise - return + return None #print(test_file_obj) # write entry dynamodb @@ -79,7 +77,7 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test INDEX_TO_REPLAY_INTO = 'main' replay_attack_dataset(container_name, splunk_password, folder_name, INDEX_TO_REPLAY_INTO, attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) print("START SLEEP AFTER REPLAY") - time.sleep(60) + time.sleep(30) print("DONE SLEEP AFTER REPLAY") result_test = {} test = test_file_obj['tests'][0] @@ -129,11 +127,9 @@ def load_file(file_path): try: file = list(yaml.safe_load_all(stream))[0] except yaml.YAMLError as exc: - print("ERROR: reading {0}".format(file_path)) - return False + raise(Exception("ERROR: reading {0}:[{1}]".format(file_path, str(exc)))) except Exception as e: - print("ERROR: reading {0}".format(file_path)) - return False + raise(Exception("ERROR: reading {0}:[{1}]".format(file_path, str(e)))) return file From 9995e9123dab2a3037662c96367c04cb5cb03160 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 19 Oct 2021 17:14:30 -0700 Subject: [PATCH 018/203] Added some additional arguments to control which detections we will test. --- .../detection_testing_execution.py | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 7eb257fa90..664fe54fb5 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -40,7 +40,8 @@ BASE_CONTAINER_WEB_PORT=8000 BASE_CONTAINER_MANAGEMENT_PORT=8089 - +DETECTION_TYPES = ['endpoint', 'cloud', 'network'] +DETECTION_MODES = ['new', 'all', 'selected'] def wait_for_splunk_ready(splunk_container_name=None, splunk_web_port=None, max_seconds=30): #The smarter version of this will try to hit one of the pages, @@ -105,6 +106,8 @@ def main(args): parser.add_argument("-s", "--success_file", type=str, required=False, help="File that contains previously successful runs that we don't need to test") parser.add_argument("-user", "--splunkbase_username", type=str, required=True, help="Splunkbase username for downloading Splunkbase apps") parser.add_argument("-pw", "--splunkbase_password", type=str, required=True, help="Splunkbase password for downloading Splunkbase apps") + parser.add_argument("-m", "--mode", type=str, choices=DETECTION_MODES, required=False, help="Whether to test new detections, specific detections, or all detections", default="all") + parser.add_argument("-t", "--types", type=str, required=False, nargs='+', help="Detection types to test. Can be one of more of %s"%(str(DETECTION_TYPES)), default=DETECTION_TYPES) args = parser.parse_args() branch = args.branch @@ -116,6 +119,14 @@ def main(args): success_file = args.success_file splunkbase_username = args.splunkbase_username splunkbase_password = args.splunkbase_password + + mode = args.mode + folder_names = args.types + for t in args.types: + if t not in DETECTION_TYPES: + print("Error - requested test of [%s] but the only valid types are %s.\tQuitting..."%(t, str(DETECTION_TYPES))) + sys.exit(1) + success_tests = [] if success_file is not None: @@ -144,11 +155,8 @@ def main(args): github_service = GithubService(branch, pr_number) else: github_service = GithubService(branch) - #test_files = github_service.get_all_tests_and_detections(folders=["endpoint"], previously_successful_tests=success_tests) - test_files = github_service.get_all_tests_and_detections(folders=["endpoint"]) - print(len(test_files)) - sys.exit(1) - #test_files2 = github_service.get_changed_test_files() + test_files = github_service.get_all_tests_and_detections(folders=["endpoint"], previously_successful_tests=success_tests) + if len(test_files) == 0: print("No new detections to test.") #aws_service.dynamo_db_nothing_to_test(REGION, uuid_test, str(int(time.time()))) From 505e2f7986b11ded0b28053b139f28d10c01299f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 20 Oct 2021 15:13:50 -0700 Subject: [PATCH 019/203] Cleanup and restructuring of main logic. Better prints, error handling, and readability. --- .../detection_testing_execution.py | 149 +++++++++++++++++- 1 file changed, 143 insertions(+), 6 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 664fe54fb5..8140cee7fb 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -8,6 +8,8 @@ import secrets import docker import threading import queue + +from docker.client import DockerClient from modules.github_service import GithubService from modules import aws_service, testing_service import time @@ -27,8 +29,8 @@ datamodel_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "Splunk_ PASSWORD_LENGTH=20 MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING=2 -DOCKER_HUB_CONTAINER_PATH="splunk/splunk:8.2.0" -BASE_CONTAINER_NAME="splunk" +DEFAULT_CONTAINER_TAG="latest" +LOCAL_BASE_CONTAINER_NAME = "splunk_test_%d" @@ -89,6 +91,104 @@ def stop_container(docker_client, container_name, force=True): +def setup_image(client: DockerClient, reuse_images: bool, container_name: str) -> None: + if not reuse_images: + #Check to see if the image exists. If it does, then remove it. If it does not, then do nothing + docker_image = None + try: + docker_image = client.images.get(container_name) + except Exception as e: + #We don't need to do anything, the image did not exist on our system + print("Image named [%s] did not exist, so we don't need to try and remove it."%(container_name)) + if docker_image != None: + #We found the image. Let's try to delete it + print("Found docker image named [%s] and you have requested that we forcefully remove it"%(container_name)) + try: + client.images.remove(image=container_name, force=True, noprune=False) + print("Docker image named [%s] forcefully removed"%(container_name)) + except Exception as e: + print("Error forcefully removing [%s]"%(container_name)) + raise(e) + + #See if the image exists. If it doesn't, then pull it from Docker Hub + docker_image = None + try: + docker_image = client.images.get(container_name) + print("Docker image [%s] found, no need to download it."%(container_name)) + except Exception as e: + #Image did not exist on the system + docker_image = None + + if docker_image is None: + #We did not find the image, so pull it + try: + print("Downloading image [%s]. Please note " + "that this could take a long time depending on your " + "connection. It's around 2GB."%(container_name)) + pull_start_time = timer() + client.images.pull(container_name) + pull_finish_time = timer() + print("Successfully pulled the docker image [%s] in %ss"% + (container_name, + timedelta(seconds=pull_finish_time - pull_start_time, microseconds=0) )) + + except Exception as e: + print("There was an error trying to pull the image [%s]: [%s]"%(container_name,str(e))) + raise(e) + +def remove_existing_containers(client: DockerClient, reuse_containers: bool, container_template: str, num_containers: int, forceRemove: bool=True) -> bool: + if reuse_containers is True: + #Check to make sure that all of the requested containers exist + for index in range(0, num_containers): + container_name = container_template%(index) + print("Checking for the existence of container named [%s]"%(container_name)) + try: + this_container = client.containers.get(container_name) + except Exception as e: + print("Failed to find a container named [%s]"%(container_name)) + reuse_containers = False + break + try: + #Make sure that the container is stopped + print("Found [%s]. Stopping container..."%(container_name)) + this_container.stop() + except Exception as e: + print("Failed to stop a container named [%s]"%(container_name)) + reuse_containers = False + break + print("Found all of the containers, we will reuse them") + return True + + #Note that this variable can be changed by the block above, so don't + #convert this into an if/else + if reuse_containers is False: + for index in range(0,num_containers): + container_name = container_template%(index) + print("Trying to remove container [%s]"%(container_name)) + try: + container = client.containers.get(container_name) + except Exception as e: + print("Could not find Docker Container [%s]. Container does not exist, so no need to remove it"%(container_name)) + continue + try: + #container was found, so now we try to remove it + #v also removes volumes linked to the container + container.remove(v=True, force=forceRemove) #remove it even if it is running. remove volumes as well + print("Successfully removed Docker Container [%s]"%(container_name)) + except Exception as e: + print("Could not remove Docker Container [%s]"%(container_name)) + raise(Exception("CONTAINER REMOVE ERROR")) + return False + + + + + + + + + + def main(args): start_time = timer() @@ -100,14 +200,18 @@ def main(args): parser.add_argument("-pr", "--pr-number", type=int, required=False, help="Pull Request Number") parser.add_argument("-n", "--num_containers", required=False, type=int, default=1, help="The number of splunk docker containers to start and run for testing") - parser.add_argument("-i", "--reuse_images", required=False, type=bool, default=False, help="Should existing images be re-used, or should they be redownloaded?") - parser.add_argument("-c", "--reuse_containers", required=False, type=bool, default=False, help="Should existing containers be re-used, or should they be rebuilt?") + parser.add_argument("-i", "--interactive_failure", required=False, default=False, action='store_true', help="If a test fails, should we pause before removing data so that the search can be debugged?") + + parser.add_argument("-i", "--reuse_image", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") + + parser.add_argument("-c", "--reuse_containers", required=False, default=False, help="Should existing containers be re-used, or should they be rebuilt?") parser.add_argument("-s", "--success_file", type=str, required=False, help="File that contains previously successful runs that we don't need to test") parser.add_argument("-user", "--splunkbase_username", type=str, required=True, help="Splunkbase username for downloading Splunkbase apps") parser.add_argument("-pw", "--splunkbase_password", type=str, required=True, help="Splunkbase password for downloading Splunkbase apps") parser.add_argument("-m", "--mode", type=str, choices=DETECTION_MODES, required=False, help="Whether to test new detections, specific detections, or all detections", default="all") parser.add_argument("-t", "--types", type=str, required=False, nargs='+', help="Detection types to test. Can be one of more of %s"%(str(DETECTION_TYPES)), default=DETECTION_TYPES) + parser.add_argument("-ct", "--container_tag", type=str, required=False, help="The tag of the Splunk Container to use. Tags are located at https://hub.docker.com/r/splunk/splunk/tags",default=DEFAULT_CONTAINER_TAG) args = parser.parse_args() branch = args.branch @@ -115,11 +219,35 @@ def main(args): pr_number = args.pr_number num_containers = args.num_containers reuse_containers = args.reuse_containers - reuse_images = args.reuse_images + reuse_image = args.reuse_image success_file = args.success_file splunkbase_username = args.splunkbase_username splunkbase_password = args.splunkbase_password + full_docker_hub_container_name = "splunk/splunk:%s"%args.container_tag + + client = docker.client.from_env() + + #Remove containers that previously existed (if we are directed to do so) + try: + remove_existing_containers(client, reuse_containers, LOCAL_BASE_CONTAINER_NAME, num_containers) + except Exception as e: + print("Error tryting to remove existing containers.\n\tQuitting...") + sys.exit(1) + + #Download and setup the image + try: + setup_image(client, reuse_image, full_docker_hub_container_name) + except Exception as e: + print("Error trying to set up the image.\n\tQuitting...") + sys.exit(1) + + + sys.exit(0) + + + + mode = args.mode folder_names = args.types for t in args.types: @@ -155,7 +283,16 @@ def main(args): github_service = GithubService(branch, pr_number) else: github_service = GithubService(branch) - test_files = github_service.get_all_tests_and_detections(folders=["endpoint"], previously_successful_tests=success_tests) + if args.mode == "new": + test_files = github_service.get_all_tests_and_detections(folders=args.types, previously_successful_tests=success_tests) + elif args.mode == "all": + pass + elif args.mode == "selected": + pass + else: + print("Unsupported mode [%s] chosen. Supported modes are %s.\n\tQuitting..."%(args.mode, str(DETECTION_MODES))) + sys.exit(1) + if len(test_files) == 0: print("No new detections to test.") From 4e52891726ec8e189657300065ac14d42b0b5a4c Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 20 Oct 2021 17:06:44 -0700 Subject: [PATCH 020/203] Better parsing of files to test, better error handling, more code reuse. --- .../detection_testing_execution.py | 99 +++++++++++-------- .../modules/github_service.py | 89 ++++++++++------- 2 files changed, 109 insertions(+), 79 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 8140cee7fb..b59f4b862e 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -224,10 +224,54 @@ def main(args): splunkbase_username = args.splunkbase_username splunkbase_password = args.splunkbase_password full_docker_hub_container_name = "splunk/splunk:%s"%args.container_tag + interactive_failure = args.interactive_failure + + + #Read in all of the tests that we will ignore because they already passed + success_tests = [] + if success_file is not None: + try: + with open(success_file, "r") as successes: + for line in successes.readlines(): + file_path_new = os.path.join("tests", os.path.splitext(line)[0]) + ".test.yml" + success_tests.append(file_path_new) + except Exception as e: + print("Error - error reading success_file: [%s]"%(str(e))) + print("\n\tQuitting...") + sys.exit(1) + + + #Ensure that a valid mode was chosen + mode = args.mode + folder_names = args.types + for t in args.types: + if t not in DETECTION_TYPES: + print("Error - requested test of [%s] but the only valid types are %s.\tQuitting..."%(t, str(DETECTION_TYPES))) + sys.exit(1) + + + #Do some initial setup and validation of the containers and images + + #If a user requests to use existing containers, they must also explicitly request to reuse existing images + if reuse_containers and not reuse_image: + print("Error - requested --reuse_containers but did not explicitly request --reuse_image.\n\tQuitting") + sys.exit(1) + + if num_containers < 1: + #Perhaps this should be a mock-run - do the initial steps but don't do testing on the containers? + print("Error, requested 0 containers. You must run with at least 1 container.") + sys.exit(1) + elif num_containers > MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING: + print("You requested to run with [%d] containers which may use a very large amount of resources " + "as they all run in parallel. The maximum suggested number of parallel containers is " + "[%d]. We will do what you asked, but be warned!"%(num_containers, MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING)) + client = docker.client.from_env() + #Ensure that the images and containers are set up in a proper state + #Remove containers that previously existed (if we are directed to do so) try: remove_existing_containers(client, reuse_containers, LOCAL_BASE_CONTAINER_NAME, num_containers) @@ -243,65 +287,38 @@ def main(args): sys.exit(1) - sys.exit(0) + - mode = args.mode - folder_names = args.types - for t in args.types: - if t not in DETECTION_TYPES: - print("Error - requested test of [%s] but the only valid types are %s.\tQuitting..."%(t, str(DETECTION_TYPES))) - sys.exit(1) + - success_tests = [] - if success_file is not None: - with open(success_file, "r") as successes: - for line in successes.readlines(): - file_path_new = os.path.join("tests", os.path.splitext(line)[0]) + ".test.yml" - #file_path_base = os.path.splitext(line)[0].replace('detections', 'tests') + '.test' - #file_path_new = file_path_base + '.yml' - success_tests.append(file_path_new) - #success_tests = [x.strip() for x in successes.readlines()] - else: - pass - - - if num_containers < 1: - #Perhaps this should be a mock-run - do the initial steps but don't do testing on the containers? - print("Error, requested 0 containers. You must run with at least 1 container.") - sys.exit(1) - elif num_containers > MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING: - print("You requested to run with [%d] containers which may use a very large amount of resources " - "as they all run in parallel. The maximum suggested number of parallel containers is " - "[%d]. We will do what you asked, but be warned!"%(num_containers, MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING)) - if pr_number: github_service = GithubService(branch, pr_number) else: github_service = GithubService(branch) if args.mode == "new": - test_files = github_service.get_all_tests_and_detections(folders=args.types, previously_successful_tests=success_tests) + test_files = github_service.get_all_tests_and_detections(folders=args.types, + previously_successful_tests=success_tests) elif args.mode == "all": - pass - elif args.mode == "selected": - pass + test_files = github_service.get_changed_test_files(folders=args.types, + previously_successful_tests=success_tests) + #elif args.mode == "selected": + # test_files = github_service.get_selected_test_files(folders=args.types, + # previously_successful_tests=success_tests) + else: print("Unsupported mode [%s] chosen. Supported modes are %s.\n\tQuitting..."%(args.mode, str(DETECTION_MODES))) sys.exit(1) - if len(test_files) == 0: - print("No new detections to test.") - #aws_service.dynamo_db_nothing_to_test(REGION, uuid_test, str(int(time.time()))) - sys.exit(0) - - #print(test_files2[:5]) - #sys.exit(0) - + print("Number of detections to test: %d"%(len(test_files))) + time.sleep(5) + print(test_files) + sys.exit(0) new_test_files = [] diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 1d29e91a83..6854ba6607 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -30,20 +30,15 @@ class GithubService: return repo_obj - def get_all_tests_and_detections(self, folders=['endpoint', 'cloud', 'network'], ttps_to_test=["Anomaly","Hunting","TTP"], previously_successful_tests=[]): - detections = [] - for folder in folders: - detections.extend(self.get_all_files_in_folder(os.path.join("security_content/detections", folder), "*.yml")) - - - #Prune this down to only the subset of detections we can test - detections_to_test = [] - tests=[] - - - for detection in detections: - #Don't do anything with SSA stuff - if os.path.basename(detection).startswith("ssa"): + + def prune_detections(self, + detections_to_prune:list[str], + ttps_to_test:list[str], + previously_successful_tests:list[str], + exclude_ssa:bool=True)->list[str]: + pruned_tests = [] + for detection in detections_to_prune: + if os.path.basename(detection).startswith("ssa") and exclude_ssa: continue with open(detection, "r") as d: description = yaml.safe_load(d) @@ -60,19 +55,31 @@ class GithubService: print("Ignoring test [%s] before it has already passed previously"%(detection)) else: #remove leading security_content/ from path - tests.append(test_filepath_without_security_content) + pruned_tests.append(test_filepath_without_security_content) else: #Don't do anything with these files pass + return pruned_tests - return tests + + def get_all_tests_and_detections(self, + folders:list[str]=['endpoint', 'cloud', 'network'], + ttps_to_test:list[str]=["Anomaly","Hunting","TTP"], + previously_successful_tests:list[str]=[]) ->list[str]: + detections = [] + for folder in folders: + detections.extend(self.get_all_files_in_folder(os.path.join("security_content/detections", folder), "*.yml")) + - def get_all_files_in_folder(self, foldername, extension): - filesnames = glob.glob(os.path.join(foldername, extension)) - return filesnames + #Prune this down to only the subset of detections we can test + return self.prune_detections(detections, ttps_to_test, previously_successful_tests) + + def get_all_files_in_folder(self, foldername:str, extension:str)->list[str]: + filenames = glob.glob(os.path.join(foldername, extension)) + return filenames - def get_changed_test_files(self): + def get_changed_test_files(self, folders=['endpoint', 'cloud', 'network'], ttps_to_test=["Anomaly","Hunting","TTP"], previously_successful_tests=[]): branch1 = self.security_content_branch branch2 = 'develop' g = git.Git('security_content') @@ -85,31 +92,37 @@ class GithubService: for file_path in changed_files: # added or changed test files if file_path.startswith('A') or file_path.startswith('M'): - if 'tests' in file_path: - if not os.path.basename(file_path).startswith('ssa') and os.path.basename(file_path).endswith('.test.yml'): - if file_path not in changed_test_files: - changed_test_files.append(file_path) + if 'tests' in file_path and os.path.basename(file_path).endswith('.test.yml'): + changed_test_files.append(file_path) # changed detections - if 'detections' in file_path: - if not os.path.basename(file_path).startswith('ssa') and os.path.basename(file_path).endswith('.yml'): + if 'detections' in file_path and os.path.basename(file_path).endswith('.yml'): changed_detection_files.append(file_path) - #file_path_base = os.path.splitext(file_path)[0].replace('detections', 'tests') + '.test' - #file_path_new = file_path_base + '.yml' - #if file_path_new not in changed_test_files: - # changed_test_files.append(file_path_new) + #all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters changed_test_files = [name.split('\t')[1] for name in changed_test_files if len(name.split('\t')) == 2] changed_detection_files = [name.split('\t')[1] for name in changed_detection_files if len(name.split('\t')) == 2] - - detections_to_test,_,_ = self.filter_test_types(changed_detection_files) - for f in detections_to_test: - file_path_base = os.path.splitext(f)[0].replace('detections', 'tests') + '.test' - file_path_new = file_path_base + '.yml' - if file_path_new not in changed_test_files: - changed_test_files.append(file_path_new) + + #convert the test files to the detection file equivalent + converted_test_files = [] + for test_filepath in changed_test_files: + detection_filename = str(pathlib.Path(*pathlib.Path(test_filepath).parts[-2:])).replace("tests", "detections",1) + converted_test_files.append(detection_filename) + + for name in converted_test_files: + if name not in changed_detection_files: + changed_detection_files.append(name) + + return self.prune_detections(changed_detection_files, ttps_to_test, previously_successful_tests) + + #detections_to_test,_,_ = self.filter_test_types(changed_detection_files) + #for f in detections_to_test: + # file_path_base = os.path.splitext(f)[0].replace('detections', 'tests') + '.test' + # file_path_new = file_path_base + '.yml' + # if file_path_new not in changed_test_files: + # changed_test_files.append(file_path_new) @@ -121,7 +134,7 @@ class GithubService: #print(len(changed_test_files)) #import time #time.sleep(5) - return changed_test_files + def filter_test_types(self, test_files, test_types = ["Anomaly", "Hunting", "TTP"]): files_to_test = [] From 60262a57f82b617d14e4db58c7fb010bfbc0dcb0 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 20 Oct 2021 17:33:26 -0700 Subject: [PATCH 021/203] Added some more command line arguments to speed up testing and did some more smoketesting. --- .../detection_testing_execution.py | 34 +++++++++---------- .../modules/github_service.py | 4 +-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index b59f4b862e..d019d6660f 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -203,16 +203,18 @@ def main(args): parser.add_argument("-i", "--interactive_failure", required=False, default=False, action='store_true', help="If a test fails, should we pause before removing data so that the search can be debugged?") - parser.add_argument("-i", "--reuse_image", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") + parser.add_argument("-ri", "--reuse_image", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") - parser.add_argument("-c", "--reuse_containers", required=False, default=False, help="Should existing containers be re-used, or should they be rebuilt?") + parser.add_argument("-rc", "--reuse_containers", required=False, default=False, help="Should existing containers be re-used, or should they be rebuilt?") parser.add_argument("-s", "--success_file", type=str, required=False, help="File that contains previously successful runs that we don't need to test") parser.add_argument("-user", "--splunkbase_username", type=str, required=True, help="Splunkbase username for downloading Splunkbase apps") parser.add_argument("-pw", "--splunkbase_password", type=str, required=True, help="Splunkbase password for downloading Splunkbase apps") - parser.add_argument("-m", "--mode", type=str, choices=DETECTION_MODES, required=False, help="Whether to test new detections, specific detections, or all detections", default="all") - parser.add_argument("-t", "--types", type=str, required=False, nargs='+', help="Detection types to test. Can be one of more of %s"%(str(DETECTION_TYPES)), default=DETECTION_TYPES) + parser.add_argument("-m", "--mode", type=str, choices=DETECTION_MODES, required=False, help="Whether to test new detections, specific detections, or all detections", default="new") + parser.add_argument("-t", "--types", type=str, required=False, help="Detection types to test. Can be one of more of %s"%(str(DETECTION_TYPES)), default=DETECTION_TYPES) parser.add_argument("-ct", "--container_tag", type=str, required=False, help="The tag of the Splunk Container to use. Tags are located at https://hub.docker.com/r/splunk/splunk/tags",default=DEFAULT_CONTAINER_TAG) - + parser.add_argument("-p", "--persist_security_content", required=False, default=False, action="store_true", help="Assumes security_content directory already exists. Don't check it out and overwrite it again. Saves "\ + "time and allows you to test a detection that you've updated. Runs generate again in case you have "\ + "updated macros or anything else. Especially useful for quick, local, iterative testing.") args = parser.parse_args() branch = args.branch uuid_test = args.uuid @@ -245,14 +247,15 @@ def main(args): #Ensure that a valid mode was chosen mode = args.mode - folder_names = args.types - for t in args.types: + folders = [a.strip() for a in args.types.split(',')] + for t in folders: if t not in DETECTION_TYPES: print("Error - requested test of [%s] but the only valid types are %s.\tQuitting..."%(t, str(DETECTION_TYPES))) sys.exit(1) + + - - #Do some initial setup and validation of the containers and images + #Do some initial setup and validation of the containers and images #If a user requests to use existing containers, they must also explicitly request to reuse existing images if reuse_containers and not reuse_image: @@ -300,11 +303,11 @@ def main(args): github_service = GithubService(branch, pr_number) else: github_service = GithubService(branch) - if args.mode == "new": - test_files = github_service.get_all_tests_and_detections(folders=args.types, + if args.mode == "all": + test_files = github_service.get_all_tests_and_detections(folders=folders, previously_successful_tests=success_tests) - elif args.mode == "all": - test_files = github_service.get_changed_test_files(folders=args.types, + elif args.mode == "new": + test_files = github_service.get_changed_test_files(folders=folders, previously_successful_tests=success_tests) #elif args.mode == "selected": # test_files = github_service.get_selected_test_files(folders=args.types, @@ -315,10 +318,7 @@ def main(args): sys.exit(1) - print("Number of detections to test: %d"%(len(test_files))) - time.sleep(5) - print(test_files) - sys.exit(0) + new_test_files = [] diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 6854ba6607..80b9c0043b 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -101,8 +101,8 @@ class GithubService: #all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters - changed_test_files = [name.split('\t')[1] for name in changed_test_files if len(name.split('\t')) == 2] - changed_detection_files = [name.split('\t')[1] for name in changed_detection_files if len(name.split('\t')) == 2] + changed_test_files = [os.path.join("security_content",name.split('\t')[1]) for name in changed_test_files if len(name.split('\t')) == 2] + changed_detection_files = [os.path.join("security_content",name.split('\t')[1]) for name in changed_detection_files if len(name.split('\t')) == 2] #convert the test files to the detection file equivalent From 10d43aa599460a4ff07ca040c5d754475f1ea1c8 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 20 Oct 2021 18:17:07 -0700 Subject: [PATCH 022/203] Added functionality and checks to remove the security_content directory or persist the security_content directory. This is useful because, on slow connections, it makes running subsequent tests A LOT faster. It is also faster on a fast connection. Finally, and most importantly, it lets you easily persist and re-test changes that you've made to detections. --- .../detection_testing_execution.py | 28 +++++++++++++++---- .../modules/github_service.py | 7 ++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index d019d6660f..8fa5f8877a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -228,6 +228,7 @@ def main(args): full_docker_hub_container_name = "splunk/splunk:%s"%args.container_tag interactive_failure = args.interactive_failure + persist_security_content = args.persist_security_content #Read in all of the tests that we will ignore because they already passed success_tests = [] @@ -297,12 +298,30 @@ def main(args): + if persist_security_content is True and os.path.exists("security_content"): + print("******You chose --persist_security_content and the security_content directory exists. We will not check out the repo again. Please be aware, this could cause issues if you're out of date.******") + github_service = GithubService(branch, existing_directory=persist_security_content) - - if pr_number: - github_service = GithubService(branch, pr_number) + elif persist_security_content is True: + print("Error - you chose --persist_security_content but the security_content directory does not exist!\n\tQuitting...") + sys.exit(1) else: - github_service = GithubService(branch) + if os.path.exists("security_content/"): + print("Deleting the security_content directory") + try: + import shutil + shutil.rmtree("security_content/", ignore_errors=True) + print("Successfully removed security_content directory") + except Exception as e: + print("Error - could not remove the security_content directory: [%s].\n\tQuitting..."%(str(e))) + sys.exit(1) + + if pr_number: + github_service = GithubService(branch, pr_number) + else: + github_service = GithubService(branch) + + if args.mode == "all": test_files = github_service.get_all_tests_and_detections(folders=folders, previously_successful_tests=success_tests) @@ -318,7 +337,6 @@ def main(args): sys.exit(1) - new_test_files = [] diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 80b9c0043b..b2115b09d0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -16,9 +16,14 @@ SECURITY_CONTENT_URL = "https://github.com/splunk/security_content" class GithubService: - def __init__(self, security_content_branch, PR_number = None): + def __init__(self, security_content_branch:str, PR_number:int = None, existing_directory:bool=False): + self.security_content_branch = security_content_branch + if existing_directory: + return + print("Checking out security_content!") self.security_content_repo_obj = self.clone_project(SECURITY_CONTENT_URL, f"security_content", f"develop") + if PR_number: subprocess.call(["git", "-C", "security_content/", "fetch", "origin", "refs/pull/%d/head:%s"%(PR_number, security_content_branch)]) From 7ba61bc2b5c6c4dce4a105024eb252891bd727d8 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Thu, 21 Oct 2021 12:22:28 -0700 Subject: [PATCH 023/203] Generate good password for a container instead of always using a static password. Note that a password can also be supplied on the command line. --- .../detection_testing_execution.py | 128 +++++++++++------- 1 file changed, 76 insertions(+), 52 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 8fa5f8877a..c3e58e4d31 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -17,7 +17,7 @@ import subprocess from timeit import default_timer as timer from datetime import timedelta - +import string SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" @@ -34,10 +34,6 @@ LOCAL_BASE_CONTAINER_NAME = "splunk_test_%d" -#DOCKER_COMMIT_NAME = "splunk_configured" -#RUNNER_BASE_NAME = "splunk_runner" - - BASE_CONTAINER_WEB_PORT=8000 BASE_CONTAINER_MANAGEMENT_PORT=8089 @@ -45,6 +41,24 @@ BASE_CONTAINER_MANAGEMENT_PORT=8089 DETECTION_TYPES = ['endpoint', 'cloud', 'network'] DETECTION_MODES = ['new', 'all', 'selected'] + +#taken from attack_range +def get_random_password(): + random_source = string.ascii_letters + string.digits + password = random.choice(string.ascii_lowercase) + password += random.choice(string.ascii_uppercase) + password += random.choice(string.digits) + + + for i in range(random.randrange(16,26)): + password += random.choice(random_source) + + password_list = list(password) + random.SystemRandom().shuffle(password_list) + password = ''.join(password_list) + return password + + def wait_for_splunk_ready(splunk_container_name=None, splunk_web_port=None, max_seconds=30): #The smarter version of this will try to hit one of the pages, #probably the login page, and when that is available it means that @@ -200,7 +214,7 @@ def main(args): parser.add_argument("-pr", "--pr-number", type=int, required=False, help="Pull Request Number") parser.add_argument("-n", "--num_containers", required=False, type=int, default=1, help="The number of splunk docker containers to start and run for testing") - + parser.add_argument("-cw", "--container_password", required=False, help="A password to use for the container. If you don't choose one, a complex one will be generated for you.") parser.add_argument("-i", "--interactive_failure", required=False, default=False, action='store_true', help="If a test fails, should we pause before removing data so that the search can be debugged?") parser.add_argument("-ri", "--reuse_image", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") @@ -228,8 +242,16 @@ def main(args): full_docker_hub_container_name = "splunk/splunk:%s"%args.container_tag interactive_failure = args.interactive_failure - persist_security_content = args.persist_security_content + container_password = args.container_password + if container_password is None: + #Generate a sufficiently complex password + container_password = get_random_password() + print("Generated the password: [%s]"%container_password) + else: + print("Since you supplied a password, we will not generate one for you.") + sys.exit(0) + persist_security_content = args.persist_security_content #Read in all of the tests that we will ignore because they already passed success_tests = [] if success_file is not None: @@ -337,62 +359,66 @@ def main(args): sys.exit(1) - new_test_files = [] - - - for f in test_files: - if f not in success_tests: - new_test_files.append(f) - else: - #pass - print("Already found [%s] in success file, not testing it again"%(f)) - - #test_files = new_test_files - ''' - print('\n'.join(test_files)) - for f in test_files: - with open('security_content/'+f,'r') as b: - data = b.read() - if 'baseline' in data.lower(): - print("baseline found in [%s]"%(f)) - ''' - time.sleep(10) #Go into the security content directory print("****GENERATE NEW CONTENT****") os.chdir("security_content") - commands = ["python3 -m venv .venv", "source .venv/bin/activate", "python3 -m pip install wheel", "python3 -m pip install -r requirements.txt", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] - ret = subprocess.run("; ".join(commands), shell=True, capture_output=False) + print(os.getcwd()) + if persist_security_content is False: + commands = ["python3 -m venv .venv", "source .venv/bin/activate", "python3 -m pip install wheel", "python3 -m pip install -r requirements.txt", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + else: + commands = ["source .venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) if ret.returncode != 0: print("Error generating new content. Exiting...") sys.exit(1) print("New content generated successfully") - os.chdir("..") + print("Generate new ESCU Package using new content") - commands = ["curl -Ls https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz -o splunk-packaging-toolkit-latest.tar.gz", - "rm -rf slim-latest", - "mkdir slim-latest", - "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", - "cd slim-latest", - "virtualenv --python=/usr/bin/python2.7 --clear venv", - "source venv/bin/activate", - "python2 -m pip install --upgrade pip", - "python2 -m pip install wheel", - "python2 -m pip install semantic_version", - "python2 -m pip install .", - "cp -R ../security_content/dist/escu DA-ESS-ContentUpdate", - "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz /tmp/apps/DA-ESS-ContentUpdate-latest.tar.gz" - ] + if persist_security_content is True: + os.chdir("slim_packaging") + commands = ["cd slim-latest", + "source venv/bin/activate", + "cp -R ../../dist/escu DA-ESS-ContentUpdate", + "slim package -o upload DA-ESS-ContentUpdate", + "cp upload/DA-ESS-ContentUpdate*.tar.gz ../apps/DA-ESS-ContentUpdate-latest.tar.gz"] + + else: + os.mkdir("slim_packaging") + os.chdir("slim_packaging") + os.mkdir("apps") + commands = ["curl -Ls https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz -o splunk-packaging-toolkit-latest.tar.gz", + "rm -rf slim-latest", + "mkdir slim-latest", + "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", + "cd slim-latest", + "virtualenv --python=/usr/bin/python2.7 --clear venv", + "source venv/bin/activate", + "python2 -m pip install --upgrade pip", + "python2 -m pip install wheel", + "python2 -m pip install semantic_version", + "python2 -m pip install .", + "cp -R ../../dist/escu DA-ESS-ContentUpdate", + "slim package -o upload DA-ESS-ContentUpdate", + "cp upload/DA-ESS-ContentUpdate*.tar.gz ../apps/DA-ESS-ContentUpdate-latest.tar.gz"] + + + ret = subprocess.run("; ".join(commands), shell=True, capture_output=False) if ret.returncode != 0: - print("Error generating new ESCU Package. Exiting...") + print("Error generating new ESCU Package.\n\tQuitting..."%()) sys.exit(1) - print("New ESCU PAckage generated successfully") - + os.chdir("../..") + print("New ESCU Package generated successfully") + + #Enqueue all of the test files for processing + test_file_queue = queue.Queue() + for filename in test_files: + test_file_queue.put(filename) + client = docker.client.from_env() @@ -426,9 +452,7 @@ def main(args): # print("***Files to test: %d"%(len(test_files))) - test_file_queue = queue.Queue() - for filename in test_files: - test_file_queue.put(filename) + # print("***Test files enqueued") @@ -607,7 +631,7 @@ def main(args): ports= {"8000/tcp": web_port, "8089/tcp": management_port } - mounts = [docker.types.Mount(target = '/tmp/apps/', source = '/tmp/apps', type='bind', read_only=True)] + mounts = [docker.types.Mount(target = '/tmp/apps/', source = 'security_content/slim_packaging/apps', type='bind', read_only=True)] print("Creating CONTAINER: [%s]"%(container_name)) base_container = client.containers.create(DOCKER_HUB_CONTAINER_PATH, ports=ports, environment=environment, name=container_name, mounts=mounts, detach=True) From 365bcc82acb7173b9c638cad817faa4d8b636b00 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Thu, 21 Oct 2021 15:32:57 -0700 Subject: [PATCH 024/203] More cleanup and removal of dead code. Created an object to synchronize all the threads and their status instead of having a massive number of arguments to each thread. Includes a synchronization primitive. --- .../detection_testing_execution.py | 365 +++++++----------- 1 file changed, 148 insertions(+), 217 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index c3e58e4d31..6c4a29e8e3 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -17,7 +17,9 @@ import subprocess from timeit import default_timer as timer from datetime import timedelta +from datetime import datetime import string +import shutil SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" @@ -43,7 +45,7 @@ DETECTION_MODES = ['new', 'all', 'selected'] #taken from attack_range -def get_random_password(): +def get_random_password()->str: random_source = string.ascii_letters + string.digits password = random.choice(string.ascii_lowercase) password += random.choice(string.ascii_uppercase) @@ -215,6 +217,7 @@ def main(args): parser.add_argument("-n", "--num_containers", required=False, type=int, default=1, help="The number of splunk docker containers to start and run for testing") parser.add_argument("-cw", "--container_password", required=False, help="A password to use for the container. If you don't choose one, a complex one will be generated for you.") + parser.add_argument("-show", "--show_password", required=False, default=False, action='store_true', help="Show the generated password to use to login to splunk. For an CI/CD run, you probably don't want this.") parser.add_argument("-i", "--interactive_failure", required=False, default=False, action='store_true', help="If a test fails, should we pause before removing data so that the search can be debugged?") parser.add_argument("-ri", "--reuse_image", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") @@ -241,15 +244,16 @@ def main(args): splunkbase_password = args.splunkbase_password full_docker_hub_container_name = "splunk/splunk:%s"%args.container_tag interactive_failure = args.interactive_failure - - container_password = args.container_password - if container_password is None: + show_password = args.show_password + splunk_password = args.container_password + if splunk_password is None: #Generate a sufficiently complex password - container_password = get_random_password() - print("Generated the password: [%s]"%container_password) + splunk_password = get_random_password() + if show_password is True: + print("Generated the password: [%s]"%splunk_password) else: print("Since you supplied a password, we will not generate one for you.") - sys.exit(0) + persist_security_content = args.persist_security_content #Read in all of the tests that we will ignore because they already passed @@ -331,7 +335,6 @@ def main(args): if os.path.exists("security_content/"): print("Deleting the security_content directory") try: - import shutil shutil.rmtree("security_content/", ignore_errors=True) print("Successfully removed security_content directory") except Exception as e: @@ -407,7 +410,7 @@ def main(args): - ret = subprocess.run("; ".join(commands), shell=True, capture_output=False) + ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) if ret.returncode != 0: print("Error generating new ESCU Package.\n\tQuitting..."%()) sys.exit(1) @@ -421,207 +424,47 @@ def main(args): - client = docker.client.from_env() - splunk_password = '123456qwertyQWERTY' - - - #print("run it now!") - - #time.sleep(180) - #dt_ar = aws_service.get_ar_information_from_dynamo_db(REGION, DT_ATTACK_RANGE_STATE) - #splunk_instance = aws_service.get_splunk_instance(REGION, dt_ar['ssh_key_name']) - - #splunk_ip = splunk_instance['NetworkInterfaces'][0]['Association']['PublicIp'] - #splunk_password = dt_ar['password'] - #ssh_key_name = dt_ar['ssh_key_name'] - #private_key = dt_ar['private_key'] - - #because this is only accessible to localhost, the password doesn't need to be particularly secure - #We can also share it between splunk on all containers - - #splunk_password = secrets.token_urlsafe(PASSWORD_LENGTH) - - #Only accessible on local host, it's okay to expose the password for debugging - #splunk_password = "123456qwerty!@#$%^QWERTY" - #splunk_password = '123456qwerty%^QWERTY' + #Create threads to manage all of the containers that we will start up splunk_container_manager_threads = [] - # print("***Files to test: %d"%(len(test_files))) - - # print("***Test files enqueued") - - - # print("Getting docker client") - client = docker.client.from_env() - - # try: - # print("Removing any existing containers called [%s]."%(BASE_CONTAINER_NAME)) - - # c = client.containers.get(BASE_CONTAINER_NAME) - # except: - # print("Container [%s] did not exist. No need to remove it. It will; be created for you."%(BASE_CONTAINER_NAME)) - # c = None - - - # if (c and reuse_containers): - # print("Found a container called [%s]. NOT removing it because you have specified --reuse_containers [%s]. " - # "However, we must stop the container. Stopping it now..."%(BASE_CONTAINER_NAME, reuse_containers)) - # stop_container(client, BASE_CONTAINER_NAME) - - # elif c: - # print("Found a container called [%s]. Removing it because you have specified --reuse_containers [%s]"%(BASE_CONTAINER_NAME, reuse_containers)) - # remove_container(client, BASE_CONTAINER_NAME) - - - - - # download_image = False - # try: - # client.images.get(DOCKER_HUB_CONTAINER_PATH) - # if reuse_images: - # print("You already have an image named [%s]."%(DOCKER_HUB_CONTAINER_PATH)) - # download_image = False - # else: - # print("You already have an image named [%s]., " - # "but have speicified --reuse_images %s"%(DOCKER_HUB_CONTAINER_PATH, reuse_images)) - # download_image = True - - # except: - # print("You did not have an image named [%s]."%(DOCKER_HUB_CONTAINER_PATH)) - # download_image = True - - # if download_image: - # try: - # print("Downloading image [%s]. Please note " - # "that this could take a long time depending on your " - # "connection. It's around 2GB."%(DOCKER_HUB_CONTAINER_PATH)) - # client.images.pull(DOCKER_HUB_CONTAINER_PATH) - # print("Finished downloading the image [%s]"%(DOCKER_HUB_CONTAINER_PATH)) - # except Exception as e: - # print("Unrecoverable error downloading image [%s]:[%s]"%(DOCKER_HUB_CONTAINER_PATH, str(e))) - # sys.exit(1) - - - # remove_tag = False - # try: - # image = client.images.get(DOCKER_COMMIT_NAME) - # print("Found an image called [%s]"%(DOCKER_COMMIT_NAME)) - # if reuse_images == False: - # print("We will remove the image [%s] because you have specificed --reuse_images %s"%(DOCKER_COMMIT_NAME, reuse_images)) - # remove_tag = True - # build_Tag = True - # else: - # print("We will use the preexisting image for [%s]"%(DOCKER_COMMIT_NAME)) - # build_tag = False - # except: - # print("No image found named [%s]"%(DOCKER_COMMIT_NAME)) - # build_tag = True - - - # if remove_tag: - # try: - # #Stop it if it's running, remove associated volumes too - # client.images.remove(image=DOCKER_COMMIT_NAME, force=True) - - # except Exception as e: - # print("Unrecoverable error removing [%s]: [%s]"%(DOCKER_COMMIT_NAME, str(e))) - # sys.exit(1) - - - - - # for ind in range(num_containers): - # ind = str(ind) - # if not reuse_containers: - # try: - # print("Creating a new container called [%s]"%(BASE_CONTAINER_NAME+ind)) - - - # environment = {"SPLUNK_START_ARGS": "--accept-license", - # "SPLUNK_PASSWORD" : splunk_password } - # ports= {"8000/tcp": BASE_CONTAINER_WEB_PORT - 1 + int(ind) + 1, - # "8089/tcp": BASE_CONTAINER_MANAGEMENT_PORT - 1 + int(ind) + 1 - # } - # base_container = client.containers.create("splunk/splunk:latest", ports=ports, environment=environment, name=BASE_CONTAINER_NAME+ind, detach=True) - # print("Running the new container called [%s]"%(BASE_CONTAINER_NAME+ind)) - # base_container.start() - # print("Container is running [%s]"%(BASE_CONTAINER_NAME+ind)) - # print("Sleep for 60 seconds to allow the container to fully start up...") - # wait_for_splunk_ready(max_seconds=60) - # print("The container has fully started!") - - # print("Do the ESCU installation on this container. That way we don't have to " - # "do it on every container that we then spin up.") - - # testing_service.prepare_detection_testing(BASE_CONTAINER_NAME+ind, splunk_password) - # print("Waiting for a few seconds for the splunk app to come up.") - # wait_for_splunk_ready(max_seconds=30) - # print("Install the apps and enable accelerate") - # wait_for_splunk_ready(max_seconds=180) - # print("Stopping the running container [%s]"%(BASE_CONTAINER_NAME+ind)) - # base_container.stop() - # #I am almost positive that I'm doing this wrong but it works for now... - - # #print("Committing the configured container: [%s]--->[%s]"%(BASE_CONTAINER_NAME, DOCKER_COMMIT_NAME)) - # #base_container.commit(repository=DOCKER_COMMIT_NAME) - - - # except Exception as e: - # print("There was an error getting the base container up and running. " - # "We cannot recover from this: [%s]\nGoodbye..."%(str(e))) - # sys.exit(1) - - - # # # #The part below does not seem to be working as expected. Will need to look into it - # # # #When I create the new container, it fails to boot with - # # # # The CA file specified (/opt/splunk/etc/auth/cacert.pem) does not exist. Cannot continue. - # # # # SSL certificate generation failed. - - - # # # # MSG: - - # # # # non-zero return code - - - - print("Make all the threads...") - print("The number of detections we will test is [%d]"%(test_file_queue.qsize())) - - results_queue = queue.Queue() - success_names_queue = queue.Queue() - failure_names_queue = queue.Queue() - - + results_tracker = SynchronizedResultsTracker(test_files) for container_index in range(num_containers): - container_name = "%s_%d"%(BASE_CONTAINER_NAME, container_index) + container_name = LOCAL_BASE_CONTAINER_NAME%container_index web_port = BASE_CONTAINER_WEB_PORT + container_index management_port = BASE_CONTAINER_MANAGEMENT_PORT + container_index SPLUNK_COMMON_INFORMATION_MODEL = "https://splunkbase.splunk.com/app/1621/release/4.20.2/download" SPLUNK_SECURITY_ESSENTIALS = "https://splunkbase.splunk.com/app/3435/release/3.3.4/download" - SPLUNK_ADD_ON_FOR_SYSMON_OLD = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" + #SPLUNK_ADD_ON_FOR_SYSMON_OLD = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" #SPLUNK_ADD_ON_FOR_SYSMON_NEW = "https://splunkbase.splunk.com/app/5709/release/1.0.1/download" - #LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_NEW = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" + + #Just a hack until we get the new version of system deployed and available from splunkbase + LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser("~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") + LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_VOLUME_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" + shutil.copyfile(LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_PATH, "security_content/slim_packaging/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") + + #SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" #SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS = "https://splunkbase.splunk.com/app/742/release/8.2.0/download" LOCAL_GENERATED_ESCU_LATEST = "/tmp/apps/DA-ESS-ContentUpdate-latest.tar.gz" - SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS, SPLUNK_ADD_ON_FOR_SYSMON_OLD, LOCAL_GENERATED_ESCU_LATEST, SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] - #SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS, LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_NEW, LOCAL_GENERATED_ESCU_LATEST, SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] + SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, + SPLUNK_SECURITY_ESSENTIALS, + LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_VOLUME_PATH, + LOCAL_GENERATED_ESCU_LATEST, + SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] + - - #SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, SPLUNK_SECURITY_ESSENTIALS , SPLUNK_ES_CONTENT_UPDATE, SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] - #docker run -p8089:8089 -p 8000:8000 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=123456qwertyQWERTY" -e "SPLUNK_APPS_URL=https://splunkbase.splunk.com/app/3435/release/3.3.4/download,https://splunkbase.splunk.com/app/5709/release/1.0.1/download,https://splunkbase.splunk.com/app/3449/release/3.29.0/download,https://splunkbase.splunk.com/app/1621/release/4.20.2/download" -e "SPLUNKBASE_USERNAME=ericmcginnistwo" -e "SPLUNKBASE_PASSWORD=splunkSecondAccount5@" -name splunktemplate splunk/splunk:latest environment = {"SPLUNK_START_ARGS": "--accept-license", "SPLUNK_PASSWORD" : splunk_password, "SPLUNK_APPS_URL" : ','.join(SPLUNK_APPS), @@ -634,37 +477,47 @@ def main(args): mounts = [docker.types.Mount(target = '/tmp/apps/', source = 'security_content/slim_packaging/apps', type='bind', read_only=True)] print("Creating CONTAINER: [%s]"%(container_name)) - base_container = client.containers.create(DOCKER_HUB_CONTAINER_PATH, ports=ports, environment=environment, name=container_name, mounts=mounts, detach=True) + base_container = client.containers.create(full_docker_hub_container_name, ports=ports, environment=environment, name=container_name, mounts=mounts, detach=True) print("Created CONTAINER : [%s]"%(container_name)) - #print("Creating a new container called [%s]"%(container_name)) - #environment = {"SPLUNK_START_ARGS": "--accept-license", - # "SPLUNK_PASSWORD" : splunk_password } - #ports= {"8000/tcp": web_port, - # "8089/tcp": management_port - # } - - #test_container = client.containers.create(DOCKER_COMMIT_NAME, ports=ports, environment=environment, name=container_name, detach=True, volumes_from=[BASE_CONTAINER_NAME]) - t = threading.Thread(target=splunk_container_manager, args=(test_file_queue, container_name, "127.0.0.1", splunk_password, management_port, uuid_test, results_queue, success_names_queue, failure_names_queue)) + + + + t = threading.Thread(target=splunk_container_manager, + args=(results_tracker, + container_name, + "127.0.0.1", + splunk_password, + management_port, + uuid_test, + )) + splunk_container_manager_threads.append(t) #add the queue status thread - there can be some error in one of the test threads, so this #thread doesn't need to complete for the program to finish execution - status_thread = threading.Thread(target=queue_status_thread, args=(test_file_queue.qsize(), test_file_queue, results_queue, success_names_queue, failure_names_queue), daemon=True) + status_thread = threading.Thread(target=queue_status_thread, + args=(results_tracker,), + daemon=True) + #Start this thread immediately status_thread.start() - print("Start all the threads...") + + + print("Start the testing threads") for t in splunk_container_manager_threads: t.start() #we need to start containers slowly. Would be great it we could do all the setup and - #app install once (with Dockerfile?) + #app install once, but it looks like the container is unlikely to support that. + #We don't really want to fundamentally change this container, either, and will + #keep it as close to production as possible time.sleep(60) - #Try to join all the threads + #Wait for all of the testing threads to complete for t in splunk_container_manager_threads: t.join() #blocks on waiting to join - print("Joined a thread!") + print("Testing thread completed execution") - print("DONE!") + print("All testing threads have completed execution") #read all the results out from the output queue strtime = str(int(time.time())) #write success and failure @@ -698,20 +551,6 @@ def main(args): #testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) -def queue_status_thread(total_tests_count, testing_queue, results_queue, success_names_queue, failure_names_queue): - test_start_time = timer() - while True: - print("***Progress Update:\n"\ - "\tElapsed Time : %s\n"\ - "\tTests to run : %d\n"\ - "\tTests currently running: %d\n"\ - "\tTests completed : %d\n"\ - "\t\tSuccess : %d\n"\ - "\t\tFailure : %d"%(timedelta(seconds=timer() - test_start_time, microseconds=0), testing_queue.qsize(), total_tests_count - testing_queue.qsize() - results_queue.qsize(), results_queue.qsize(), success_names_queue.qsize(), failure_names_queue.qsize())) - if results_queue.qsize() == total_tests_count: - return - else: - time.sleep(10) def copy_file_to_container(localFilePath, remoteFilePath, containerName, sleepTimeSeconds=5): successful_copy = False @@ -790,4 +629,96 @@ def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_pa print("Finished shutting down the container [%s]"%(container_name)) if __name__ == "__main__": - main(sys.argv[1:]) \ No newline at end of file + main(sys.argv[1:]) + + +class SynchronizedResultsTracker: + def __init__(self, tests:list[str]): + #Create the queue and enque all of the tests + self.testing_queue = queue.Queue() + for test in tests: + self.testing_queue.put(test) + + self.total_number_of_tests = self.testing_queue.qsize() + #Creates a lock that will be used to synchronize access to this object + self.lock = threading.Lock() + self.start_time = timer() + self.failures = [] + self.successes = [] + self.errors = [] + def addSuccess(self, result:dict)->None: + self.lock.acquire() + try: + self.successes.append(result) + finally: + self.lock.release() + + + def addFailure(self, result:dict)->None: + self.lock.acquire() + try: + self.failures.append(result) + finally: + self.lock.release() + + def addError(self, result:dict)->None: + self.lock.acquire() + try: + self.errors.append(result) + finally: + self.lock.release() + def outputResultsFiles(self)->None: + self.lock.acquire() + try: + pass + finally: + self.lock.release() + + def summarize(self)->None: + + self.lock.acquire() + try: + current_time = timer() + numberOfCompletedTests = len(self.successes) + len(self.failures) + len(self.errors) + remaining_tests = self.testing_queue.qsize() + testsCurrentlyRunning = self.total_number_of_tests - remaining_tests + total_execution_time_seconds = current_time - self.start_time + + + if numberOfCompletedTests == 0: + estimated_seconds_to_finish_all_tests = "UNKNOWN" + estimated_completion_time_seconds = "UNKNOWN" + else: + average_time_per_test = total_execution_time_seconds / numberOfCompletedTests + estimated_seconds_to_finish_all_tests = average_time_per_test * remaining_tests + estimated_completion_time_seconds = timedelta(seconds=estimated_seconds_to_finish_all_tests) + + + + + print("***Progress Update:\n"\ + "\tElapsed Time : %s\n"\ + "\tEstimated Remaining Time : %s\n"\ + "\tTests to run : %d\n"\ + "\tTests currently running : %d\n"\ + "\tTests completed : %d\n"\ + "\t\tSuccess : %d\n"\ + "\t\tFailure : %d\n"\ + "\t\tError : %d"%(timedelta(total_execution_time_seconds), + estimated_completion_time_seconds, + remaining_tests, + testsCurrentlyRunning, + numberOfCompletedTests, + len(self.successes), + len(self.failures), + len(self.errors))) + + except Exception as e: + print("Error in printing execution summary: [%s]"%(str(e))) + finally: + self.lock.release() + +def queue_status_thread(status_object:SynchronizedResultsTracker)->None: + while True: + status_object.summarize() + time.sleep(10) From c5b5dfac8824a01c3816a77cfc5ff00b2228498c Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Thu, 21 Oct 2021 17:06:35 -0700 Subject: [PATCH 025/203] Lots more changes - adding more error checking, typing to more functions, and better logging for testing detections. Initial cut at fixing up issues involving bad return types. Still had not been run/tested yet. --- .../detection_testing_execution.py | 144 ++++++++++-------- .../modules/splunk_sdk.py | 107 +++++++------ .../modules/testing_service.py | 44 +++--- 3 files changed, 158 insertions(+), 137 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 6c4a29e8e3..363062badf 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -20,6 +20,7 @@ from datetime import timedelta from datetime import datetime import string import shutil +from typing import Union SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" @@ -567,69 +568,6 @@ def copy_file_to_container(localFilePath, remoteFilePath, containerName, sleepTi time.sleep(10) successful_copy=False print("Successfully copied [%s] to [%s] on [%s]"%(localFilePath, remoteFilePath, containerName)) - - -def splunk_container_manager(testing_queue, container_name, splunk_ip, splunk_password, splunk_port, uuid_test, results_queue, success_names_queue, failure_names_queue): - print("Starting the container [%s] after a sleep"%(container_name)) - #Is this going to be safe to use in different threads - client = docker.client.from_env() - - #start up the container from the base container - #Assume that the base container has already been fully built with - #escu etc - #sleep for a little bit so that we don't all start at once... - time.sleep(random.randrange(0,60)) - - container = client.containers.get(container_name) - print("Starting the container [%s]"%(container_name)) - - - - container.start() - print("Start copying files to container") - copy_file_to_container(index_file_local_path, index_file_container_path, container_name) - copy_file_to_container(datamodel_file_local_path, datamodel_file_container_path, container_name) - print("Finished copying files to container!") - - - wait_for_splunk_ready(max_seconds=120) - from modules.splunk_sdk import enable_delete_for_admin - if not enable_delete_for_admin(splunk_ip, splunk_port, splunk_password): - print("COULD NOT ENABLE DELETE FOR [%s].... quitting"%(container_name)) - sys.exit(0) - - print("Successfully enabled DELETE for [%s]"%(container_name)) - - index=0 - try: - while True: - #Try to get something from the queue - detection_to_test = testing_queue.get(block=False) - - #There is a detection to test - print("Container [%s]--->[%s]"%(container_name, detection_to_test)) - try: - result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, index%1, uuid_test) - if result['detection_result']['error']: - failure_names_queue.put(result['detection_result']['detection_name']) - else: - success_names_queue.put(result['detection_result']['detection_name']) - results_queue.put(result) - except Exception as e: - print("Caught some exception in test detection: [%s]"%(str(e))) - #just log the error itself for now so that we can continue - result_test = str(e) - - index=(index+1)%10 - except queue.Empty: - print("Queue was empty, [%s] finished testing detections!"%(container_name)) - - print("Shutting down the container [%s]"%(container_name)) - container.stop() - print("Finished shutting down the container [%s]"%(container_name)) - -if __name__ == "__main__": - main(sys.argv[1:]) class SynchronizedResultsTracker: @@ -646,7 +584,14 @@ class SynchronizedResultsTracker: self.failures = [] self.successes = [] self.errors = [] + def getTest(self)-> Union[str,None]: + try: + return self.testing_queue.get(block=False) + except Exception as e: + print("Testing queue empty!") + return None def addSuccess(self, result:dict)->None: + print("Test PASSED for detection: [%s --> %s"%(result['detection_result']['detection_name'], result['detection_result']['detection_file'])) self.lock.acquire() try: self.successes.append(result) @@ -655,6 +600,7 @@ class SynchronizedResultsTracker: def addFailure(self, result:dict)->None: + print("Test FAILED for detection: [%s --> %s"%(result['detection_result']['detection_name'], result['detection_result']['detection_file'])) self.lock.acquire() try: self.failures.append(result) @@ -717,6 +663,78 @@ class SynchronizedResultsTracker: print("Error in printing execution summary: [%s]"%(str(e))) finally: self.lock.release() + def addResult(self, result:dict)->None: + try: + if result['detection_result']['success'] is False: + #This is actually a failure of the detection, not an error. Naming is confusiong + self.addFailure(result) + elif result['detection_result']['success'] is True: + self.addSuccess(result) + except Exception as e: + #Neither a success or a failure, so add the object to the failures queue + self.addError(result) + + + +def splunk_container_manager(testing_object:SynchronizedResultsTracker, container_name, splunk_ip, splunk_password, splunk_port, uuid_test): + print("Starting the container [%s] after a sleep"%(container_name)) + #Is this going to be safe to use in different threads + client = docker.client.from_env() + + #start up the container from the base container + #Assume that the base container has already been fully built with + #escu etc + #sleep for a little bit so that we don't all start at once... + time.sleep(random.randrange(0,60)) + + container = client.containers.get(container_name) + print("Starting the container [%s]"%(container_name)) + + + + container.start() + print("Start copying files to container") + copy_file_to_container(index_file_local_path, index_file_container_path, container_name) + copy_file_to_container(datamodel_file_local_path, datamodel_file_container_path, container_name) + print("Finished copying files to container!") + + + wait_for_splunk_ready(max_seconds=120) + from modules.splunk_sdk import enable_delete_for_admin + if not enable_delete_for_admin(splunk_ip, splunk_port, splunk_password): + print("COULD NOT ENABLE DELETE FOR [%s].... quitting"%(container_name)) + sys.exit(0) + + print("Successfully enabled DELETE for [%s]"%(container_name)) + + + + while True: + #Try to get something from the queue + detection_to_test = testing_object.getTest() + if detection_to_test is None: + print("Container [%s] has finished running detections, time to stop the container."%(container_name)) + container.stop() + print("Container [%s] successfully stopped"%(container_name)) + return None + + + + #There is a detection to test + print("Container [%s]--->[%s]"%(container_name, detection_to_test)) + try: + result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, 0, uuid_test) + testing_object.addResult(result) + except Exception as e: + print("Warning - uncaught error in detection test for [%s] - this should not happen: [%s]"%(detection_to_test, str(e))) + + + +if __name__ == "__main__": + main(sys.argv[1:]) + + + def queue_status_thread(status_object:SynchronizedResultsTracker)->None: while True: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 60b9294406..9f8f356ee4 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -4,7 +4,7 @@ import splunklib.results as results import splunklib.client as client import splunklib.results as results import requests - +from typing import Union def enable_delete_for_admin(splunk_host, splunk_port, splunk_password): try: @@ -79,22 +79,7 @@ def test_baseline_search(splunk_host, splunk_port, splunk_password, search, pass return test_results -def test_detection_search(splunk_host, splunk_port, splunk_password, search, pass_condition, detection_name, detection_file, earliest_time, latest_time): - try: - service = client.connect( - host=splunk_host, - port=splunk_port, - username='admin', - password=splunk_password - ) - except Exception as e: - print("Unable to connect to Splunk instance: " + str(e)) - raise(Exception("NO CONNECTION EXCEPTION")) - return 1, {} - - # search and replace \\ with \\\ - # search = search.replace('\\','\\\\') - +def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, search:str, pass_condition:str, detection_name:str, detection_file:str, earliest_time:str, latest_time:str)->dict: if search.startswith('|'): search = search else: @@ -105,35 +90,10 @@ def test_detection_search(splunk_host, splunk_port, splunk_password, search, pas "dispatch.latest_time": "now"} splunk_search = search + ' ' + pass_condition - print("SEARCH:") - print(splunk_search) - - try: - job = service.jobs.create(splunk_search, **kwargs) - except Exception as e: - print("Unable to execute detection: " + str(e)) - raise(Exception("***********NO EXECUTION EXCEPTION***********")) - return 1, {} + + test_results = dict() - test_results['diskUsage'] = job['diskUsage'] - test_results['runDuration'] = job['runDuration'] - test_results['detection_name'] = detection_name - test_results['detection_file'] = detection_file - test_results['scanCount'] = job['scanCount'] - - if int(job['resultCount']) != 1: - print("Test failed for detection: " + detection_name) - test_results['error'] = True - return test_results - else: - print("Test successful for detection: " + detection_name) - test_results['error'] = False - return test_results - - -def delete_attack_data(splunk_host, splunk_password, splunk_port): - print("Deleting test data!") try: service = client.connect( host=splunk_host, @@ -143,10 +103,61 @@ def delete_attack_data(splunk_host, splunk_password, splunk_port): ) except Exception as e: print("Unable to connect to Splunk instance: " + str(e)) - return 1, {} + test_results['error'] = True + return test_results + + # search and replace \\ with \\\ + # search = search.replace('\\','\\\\') + + + + print("SEARCH: %s"%(splunk_search)) + + try: + job = service.jobs.create(splunk_search, **kwargs) + except Exception as e: + print("Unable to execute detection: " + str(e)) + test_results['error'] = True + return test_results + + + test_results['diskUsage'] = job['diskUsage'] + test_results['runDuration'] = job['runDuration'] + test_results['detection_name'] = detection_name + test_results['detection_file'] = detection_file + test_results['scanCount'] = job['scanCount'] + test_results['search_string'] = splunk_search + + test_results['error'] = False #The search may have FAILED, but there was no error in the search + + if int(job['resultCount']) != 1: + print("Test failed for detection: " + detection_name) + test_results['success'] = False + return test_results + else: + print("Test successful for detection: " + detection_name) + test_results['success'] = True + return test_results + + +def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wait_on_delete:bool, search_string:str)->bool: + + try: + service = client.connect( + host=splunk_host, + port=splunk_port, + username='admin', + password=splunk_password + ) + except Exception as e: + print("Unable to connect to Splunk instance: " + str(e)) + return False #splunk_search = 'search index=test* | delete' - #_ = input("****************Press ENTER to DELETE****************") + if wait_on_delete: + print ("************Allowing time to debug search************") + print(search_string) + _ = input("****************Press ENTER to DELETE****************") splunk_search = 'search index=main | delete' kwargs = {"exec_mode": "blocking", "dispatch.earliest_time": "-1d", @@ -156,4 +167,6 @@ def delete_attack_data(splunk_host, splunk_password, splunk_port): job = service.jobs.create(splunk_search, **kwargs) except Exception as e: print("Unable to execute search: " + str(e)) - return 1, {} \ No newline at end of file + return False + + return True \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index b02c48d185..9ef8228254 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -9,39 +9,34 @@ import requests from modules.DataManipulation import DataManipulation from modules import splunk_sdk - -def prepare_detection_testing(splunk_ip, splunk_password): - try: - pass - #import security_content.bin.generate as module - #module = __import__('security_content.bin.generate') - #results = module.main(REPO_PATH = 'security_content' , OUTPUT_PATH = 'security_content/dist/escu', PRODUCT = 'ESCU', VERBOSE = 'False' ) - except Exception as e: - print('Error: ' + str(e)) - - update_ESCU_app(splunk_ip, splunk_password) +from typing import Union -def test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, test_file, test_index, uuid_test): + +def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:str, splunk_port:int, test_file:str, test_index:int, uuid_test:str, wait_on_failure:bool=False)->dict: uuid_var = str(uuid.uuid4()) result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var) - + if result_test is None: + #We failed so early in the process that we could not produce any meaningful result + raise(Exception("Test execution Error")) #enter = input("Run some tests from [%s] on [%s] - we don't delete until you hit enter :)"%(container_name, test_file)) # delete test data - splunk_sdk.delete_attack_data(splunk_ip, splunk_password, splunk_port) - + search_string = result_test['detection_result']['search_string'] - if result_test['detection_result']['error']: - print('Test failed for detection: ' + result_test['detection_result']['detection_name'] + ' ' + result_test['detection_result']['detection_file']) + #search failed if there was an error or the detection failed to produce the expected result + if wait_on_failure and (result_test['detection_result']['error'] or not result_test['detection_result']['success']): + wait_on_delete = True else: - print('Test passed for detection: ' + result_test['detection_result']['detection_name'] + ' ' + result_test['detection_result']['detection_file']) + wait_on_delete = False + splunk_sdk.delete_attack_data(splunk_ip, splunk_password, splunk_port, wait_on_delete, search_string) + return result_test -def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var): +def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var)->Union[dict,None]: try: test_file_obj = load_file(os.path.join("security_content/", test_file)) except Exception as e: @@ -102,20 +97,15 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test print("Making test_detection_search request to: [%s:%d]"%(splunk_ip, splunk_port)) result_detection = splunk_sdk.test_detection_search(splunk_ip, splunk_port, splunk_password, detection['search'], test['pass_condition'], detection['name'], test['file'], test['earliest_time'], test['latest_time']) - + if result_detection['error']: + print("There was an error running the search: %s"%(result_detection['search_string'])) + result_detection['detection_name'] = test['name'] result_detection['detection_file'] = test['file'] result_test['detection_result'] = result_detection - if result_detection['error']: - print("failed") - #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'failed') - else: - print("passed") - #aws_service.update_detection_results_in_dynamo_db('eu-central-1', uuid_var, 'passed') - return result_test From 53dedd468f2396385b5e1ab52d767a9bf57f44c4 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 22 Oct 2021 12:57:38 -0700 Subject: [PATCH 026/203] Big changes to make the tool much more usable. Actually useful for testing, but no nice output files just yet. --- .../detection_testing_execution.py | 119 ++++++++++-------- .../modules/DataManipulation.py | 2 +- .../modules/splunk_sdk.py | 13 +- .../modules/testing_service.py | 11 +- 4 files changed, 80 insertions(+), 65 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 363062badf..8a7594c0b7 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -247,6 +247,10 @@ def main(args): interactive_failure = args.interactive_failure show_password = args.show_password splunk_password = args.container_password + + if splunk_password is None and reuse_containers is True: + print("Error - if you are going to reuse a container you MUST provide the password to it!") + sys.exit(1) if splunk_password is None: #Generate a sufficiently complex password splunk_password = get_random_password() @@ -475,7 +479,8 @@ def main(args): ports= {"8000/tcp": web_port, "8089/tcp": management_port } - mounts = [docker.types.Mount(target = '/tmp/apps/', source = 'security_content/slim_packaging/apps', type='bind', read_only=True)] + source_path = os.path.join(os.getcwd(), "security_content", "slim_packaging","apps") + mounts = [docker.types.Mount(target = '/tmp/apps/', source = source_path, type='bind', read_only=True)] print("Creating CONTAINER: [%s]"%(container_name)) base_container = client.containers.create(full_docker_hub_container_name, ports=ports, environment=environment, name=container_name, mounts=mounts, detach=True) @@ -490,7 +495,8 @@ def main(args): "127.0.0.1", splunk_password, management_port, - uuid_test, + uuid_test, + interactive_failure )) splunk_container_manager_threads.append(t) @@ -521,26 +527,12 @@ def main(args): print("All testing threads have completed execution") #read all the results out from the output queue strtime = str(int(time.time())) - #write success and failure - success_output = open("success_%s"%(strtime), "w") - failure_output = open("failure_%s"%(strtime), "w") - try: - while True: - o = results_queue.get(block=False) - o_result = o['detection_result'] - if o_result['error'] is False: - success_output.write(o_result['detection_file']+'\n') - else: - failure_output.write(o_result['detection_file']+'\n') - print(o_result) - except queue.Empty: - print("That's all the output!") + #Generate all of the output information + results_tracker.outputResultsFiles() + - - success_output.close() - failure_output.close() #now we are done! stop_time = timer() @@ -564,7 +556,7 @@ def copy_file_to_container(localFilePath, remoteFilePath, containerName, sleepTi apiclient.put_archive(container=containerName, path=remoteFilePath, data=fileData) successful_copy=True except Exception as e: - print("Failed copy of [%s] file to CONTAINER:[%s]...we will try again"%(localFilePath, containerName)) + #print("Failed copy of [%s] file to CONTAINER:[%s]...we will try again"%(localFilePath, containerName)) time.sleep(10) successful_copy=False print("Successfully copied [%s] to [%s] on [%s]"%(localFilePath, remoteFilePath, containerName)) @@ -584,12 +576,14 @@ class SynchronizedResultsTracker: self.failures = [] self.successes = [] self.errors = [] + self.container_ready_time = None def getTest(self)-> Union[str,None]: try: return self.testing_queue.get(block=False) except Exception as e: print("Testing queue empty!") return None + def addSuccess(self, result:dict)->None: print("Test PASSED for detection: [%s --> %s"%(result['detection_result']['detection_name'], result['detection_result']['detection_file'])) self.lock.acquire() @@ -607,10 +601,10 @@ class SynchronizedResultsTracker: finally: self.lock.release() - def addError(self, result:dict)->None: + def addError(self, detection:str, errorText:str)->None: self.lock.acquire() try: - self.errors.append(result) + self.errors.append((detection, errorText)) finally: self.lock.release() def outputResultsFiles(self)->None: @@ -623,34 +617,49 @@ class SynchronizedResultsTracker: def summarize(self)->None: self.lock.acquire() + try: current_time = timer() - numberOfCompletedTests = len(self.successes) + len(self.failures) + len(self.errors) - remaining_tests = self.testing_queue.qsize() - testsCurrentlyRunning = self.total_number_of_tests - remaining_tests - total_execution_time_seconds = current_time - self.start_time - - - if numberOfCompletedTests == 0: - estimated_seconds_to_finish_all_tests = "UNKNOWN" - estimated_completion_time_seconds = "UNKNOWN" + if self.testing_queue.qsize() == self.total_number_of_tests: + #Testing has not started yet. We are setting up containers + print("***********PROGRESS UPDATE***********\n"\ + "\tWaiting for container setup: %s"%(timedelta(seconds=current_time - self.start_time))) else: - average_time_per_test = total_execution_time_seconds / numberOfCompletedTests - estimated_seconds_to_finish_all_tests = average_time_per_test * remaining_tests - estimated_completion_time_seconds = timedelta(seconds=estimated_seconds_to_finish_all_tests) + if self.container_ready_time is None: + #This is the first status update since container setup has completed. Get the current time. + #This makes our remaining time estimates better since that estimate should not involve + #the container setup time + self.container_ready_time = current_time + + numberOfCompletedTests = len(self.successes) + len(self.failures) + len(self.errors) + remaining_tests = self.testing_queue.qsize() + testsCurrentlyRunning = self.total_number_of_tests - remaining_tests - numberOfCompletedTests + total_execution_time_seconds = current_time - self.start_time + + test_execution_time_seconds = current_time - self.container_ready_time + + + if numberOfCompletedTests == 0 or test_execution_time_seconds == 0: + estimated_seconds_to_finish_all_tests = "UNKNOWN" + estimated_completion_time_seconds = "UNKNOWN" + else: + average_time_per_test = test_execution_time_seconds / numberOfCompletedTests + #divide testsCurrentlyRunning by 2.0 because, on average, each running test will be 50% completed + estimated_seconds_to_finish_all_tests = average_time_per_test * (remaining_tests + testsCurrentlyRunning/2.0) + estimated_completion_time_seconds = timedelta(seconds=estimated_seconds_to_finish_all_tests) + - - print("***Progress Update:\n"\ - "\tElapsed Time : %s\n"\ - "\tEstimated Remaining Time : %s\n"\ - "\tTests to run : %d\n"\ - "\tTests currently running : %d\n"\ - "\tTests completed : %d\n"\ + print("***********PROGRESS UPDATE***********\n"\ + "\tElapsed Time : %s\n"\ + "\tEstimated Remaining Time : %s\n"\ + "\tTests to run : %d\n"\ + "\tTests currently running : %d\n"\ + "\tTests completed : %d\n"\ "\t\tSuccess : %d\n"\ "\t\tFailure : %d\n"\ - "\t\tError : %d"%(timedelta(total_execution_time_seconds), + "\t\tError : %d"%(timedelta(seconds=total_execution_time_seconds), estimated_completion_time_seconds, remaining_tests, testsCurrentlyRunning, @@ -663,6 +672,7 @@ class SynchronizedResultsTracker: print("Error in printing execution summary: [%s]"%(str(e))) finally: self.lock.release() + def addResult(self, result:dict)->None: try: if result['detection_result']['success'] is False: @@ -672,11 +682,11 @@ class SynchronizedResultsTracker: self.addSuccess(result) except Exception as e: #Neither a success or a failure, so add the object to the failures queue - self.addError(result) + self.addError("Unspecified Error", str(result)) -def splunk_container_manager(testing_object:SynchronizedResultsTracker, container_name, splunk_ip, splunk_password, splunk_port, uuid_test): +def splunk_container_manager(testing_object:SynchronizedResultsTracker, container_name, splunk_ip, splunk_password, splunk_port, uuid_test, interactive_failure:bool=False): print("Starting the container [%s] after a sleep"%(container_name)) #Is this going to be safe to use in different threads client = docker.client.from_env() @@ -685,7 +695,7 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe #Assume that the base container has already been fully built with #escu etc #sleep for a little bit so that we don't all start at once... - time.sleep(random.randrange(0,60)) + container = client.containers.get(container_name) print("Starting the container [%s]"%(container_name)) @@ -693,10 +703,10 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe container.start() - print("Start copying files to container") + print("Start copying files to container: [%s]"%(container_name)) copy_file_to_container(index_file_local_path, index_file_container_path, container_name) copy_file_to_container(datamodel_file_local_path, datamodel_file_container_path, container_name) - print("Finished copying files to container!") + print("Finished copying files to container: [%s]"%(container_name)) wait_for_splunk_ready(max_seconds=120) @@ -723,12 +733,18 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe #There is a detection to test print("Container [%s]--->[%s]"%(container_name, detection_to_test)) try: - result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, 0, uuid_test) + result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, 0, uuid_test, wait_on_failure=interactive_failure) testing_object.addResult(result) except Exception as e: print("Warning - uncaught error in detection test for [%s] - this should not happen: [%s]"%(detection_to_test, str(e))) + testing_object.addError(detection_to_test,str(e)) - +def queue_status_thread(status_object:SynchronizedResultsTracker)->None: + #This will run forever by design + print("start status") + while True: + status_object.summarize() + time.sleep(10) if __name__ == "__main__": main(sys.argv[1:]) @@ -736,7 +752,4 @@ if __name__ == "__main__": -def queue_status_thread(status_object:SynchronizedResultsTracker)->None: - while True: - status_object.summarize() - time.sleep(10) + diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py b/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py index faef36565b..b8905a6a6d 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py @@ -10,7 +10,7 @@ class DataManipulation: def manipulate_timestamp(self, file_path, sourcetype, source): - print('Updating timestamps in attack_data before replaying') + #print('Updating timestamps in attack_data before replaying') if sourcetype == 'aws:cloudtrail': self.manipulate_timestamp_cloudtrail(file_path) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 9f8f356ee4..9c65c41d4a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -131,16 +131,16 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, test_results['error'] = False #The search may have FAILED, but there was no error in the search if int(job['resultCount']) != 1: - print("Test failed for detection: " + detection_name) + #print("Test failed for detection: " + detection_name) test_results['success'] = False return test_results else: - print("Test successful for detection: " + detection_name) + #print("Test successful for detection: " + detection_name) test_results['success'] = True return test_results -def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wait_on_delete:bool, search_string:str)->bool: +def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wait_on_delete:bool, search_string:str, detection_filename:str)->bool: try: service = client.connect( @@ -155,9 +155,10 @@ def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wa #splunk_search = 'search index=test* | delete' if wait_on_delete: - print ("************Allowing time to debug search************") - print(search_string) - _ = input("****************Press ENTER to DELETE****************") + print("\n\n\n****SEARCH FAILURE: Allowing time to debug search****") + print("FILENAME : [%s]"%(detection_filename)) + print("SEARCH :\n%s"%(search_string)) + _ = input("****************Press ENTER to DELETE****************\n\n\n") splunk_search = 'search index=main | delete' kwargs = {"exec_mode": "blocking", "dispatch.earliest_time": "-1d", diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 9ef8228254..a94fbedc3b 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -30,7 +30,8 @@ def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:st wait_on_delete = True else: wait_on_delete = False - splunk_sdk.delete_attack_data(splunk_ip, splunk_password, splunk_port, wait_on_delete, search_string) + + splunk_sdk.delete_attack_data(splunk_ip, splunk_password, splunk_port, wait_on_delete, search_string, test_file) return result_test @@ -61,7 +62,7 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test target_file = os.path.join(folder_name, attack_data['file_name']) with open(target_file, 'wb') as target: target.write(r.content) - print(target_file) + #print(target_file) # Update timestamps before replay if 'update_timestamp' in attack_data: @@ -71,9 +72,9 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test INDEX_TO_REPLAY_INTO = 'test' + str(test_index) INDEX_TO_REPLAY_INTO = 'main' replay_attack_dataset(container_name, splunk_password, folder_name, INDEX_TO_REPLAY_INTO, attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) - print("START SLEEP AFTER REPLAY") + time.sleep(30) - print("DONE SLEEP AFTER REPLAY") + result_test = {} test = test_file_obj['tests'][0] @@ -111,7 +112,7 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test def load_file(file_path): try: - print("Opening file path [%s]"%(file_path)) + #print("Opening file path [%s]"%(file_path)) with open(file_path, 'r', encoding="utf-8") as stream: try: From 194de0c28a1626eb0796d4ead2afa5ac52514563 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 22 Oct 2021 15:41:18 -0700 Subject: [PATCH 027/203] Added ability to test individual detection by specifying them on the command line. --- .../detection_testing_execution.py | 144 +++++++++--------- .../modules/github_service.py | 10 +- 2 files changed, 84 insertions(+), 70 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 8a7594c0b7..1459a31629 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -70,40 +70,8 @@ def wait_for_splunk_ready(splunk_container_name=None, splunk_web_port=None, max_ time.sleep(max_seconds) -def remove_container(docker_client, container_name, force=True): - try: - container = docker_client.containers.get(container_name) - except Exception as e: - print("Could not find Docker Container [%s]. Container does not exist"%(container_name)) - return True - try: - container.remove(v=True, force=force) #remove it even if it is running. remove volumes as well - print("Successfully removed Docker Container [%s]"%(container_name)) - except Exception as e: - print("Could not remove Docker Container [%s]"%(container_name)) - raise(Exception("CONTAINER REMOVE ERROR")) -def stop_container(docker_client, container_name, force=True): - try: - container = docker_client.containers.get(container_name) - except: - print("Container with name [%s] does not exist"%(container_name)) - return True - - try: - print("Checking to see if [%s] is running..."%(container_name), end='') - if container.status == 'exited': - print("NO") - return True - else: - print("YES (container.status is [%s])"%(container.status)) - print("Stopping [%s]"%(container_name)) - container.stop(force=force) - return True - except Exception as e: - print("Error trying to stop the container [%s]"%(container_name)) - raise(Exception("CONTAINER STOP ERROR")) @@ -177,25 +145,32 @@ def remove_existing_containers(client: DockerClient, reuse_containers: bool, con return True #Note that this variable can be changed by the block above, so don't - #convert this into an if/else + #convert this into an if/else. Note that this IF is for verbosity: + if reuse_containers is False: for index in range(0,num_containers): container_name = container_template%(index) - print("Trying to remove container [%s]"%(container_name)) - try: - container = client.containers.get(container_name) - except Exception as e: - print("Could not find Docker Container [%s]. Container does not exist, so no need to remove it"%(container_name)) - continue - try: - #container was found, so now we try to remove it - #v also removes volumes linked to the container - container.remove(v=True, force=forceRemove) #remove it even if it is running. remove volumes as well - print("Successfully removed Docker Container [%s]"%(container_name)) - except Exception as e: - print("Could not remove Docker Container [%s]"%(container_name)) - raise(Exception("CONTAINER REMOVE ERROR")) + removeContainer(client, container_name, forceRemove) return False + else: + raise(Exception("Error removing existing containers")) + +def removeContainer(client: DockerClient, container_name:str, forceRemove:bool=True)->bool: + print("Trying to remove container [%s]"%(container_name)) + try: + container = client.containers.get(container_name) + except Exception as e: + print("Could not find Docker Container [%s]. Container does not exist, so no need to remove it"%(container_name)) + return True + try: + #container was found, so now we try to remove it + #v also removes volumes linked to the container + container.remove(v=True, force=forceRemove) #remove it even if it is running. remove volumes as well + print("Successfully removed Docker Container [%s]"%(container_name)) + return True + except Exception as e: + print("Could not remove Docker Container [%s]"%(container_name)) + raise(Exception("CONTAINER REMOVE ERROR")) @@ -223,11 +198,16 @@ def main(args): parser.add_argument("-ri", "--reuse_image", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") - parser.add_argument("-rc", "--reuse_containers", required=False, default=False, help="Should existing containers be re-used, or should they be rebuilt?") + #Allowing us to reuse containers is more trouble than it's worth (we may have rebuilt an app or, more likely, ESCU) and it is a pain to re-upload that + #instead of having the container restart and download/install itself. + #parser.add_argument("-rc", "--reuse_containers", required=False, default=False, help="Should existing containers be re-used, or should they be rebuilt?") + parser.add_argument("-s", "--success_file", type=str, required=False, help="File that contains previously successful runs that we don't need to test") - parser.add_argument("-user", "--splunkbase_username", type=str, required=True, help="Splunkbase username for downloading Splunkbase apps") - parser.add_argument("-pw", "--splunkbase_password", type=str, required=True, help="Splunkbase password for downloading Splunkbase apps") + parser.add_argument("-user", "--splunkbase_username", type=str, required=False, help="Splunkbase username for downloading Splunkbase apps") + parser.add_argument("-pw", "--splunkbase_password", type=str, required=False, help="Splunkbase password for downloading Splunkbase apps") parser.add_argument("-m", "--mode", type=str, choices=DETECTION_MODES, required=False, help="Whether to test new detections, specific detections, or all detections", default="new") + parser.add_argument("-tf","--test_files", type=str, required=False, help="The names of files that you want to test, separated by commas.") + parser.add_argument("-t", "--types", type=str, required=False, help="Detection types to test. Can be one of more of %s"%(str(DETECTION_TYPES)), default=DETECTION_TYPES) parser.add_argument("-ct", "--container_tag", type=str, required=False, help="The tag of the Splunk Container to use. Tags are located at https://hub.docker.com/r/splunk/splunk/tags",default=DEFAULT_CONTAINER_TAG) parser.add_argument("-p", "--persist_security_content", required=False, default=False, action="store_true", help="Assumes security_content directory already exists. Don't check it out and overwrite it again. Saves "\ @@ -238,7 +218,7 @@ def main(args): uuid_test = args.uuid pr_number = args.pr_number num_containers = args.num_containers - reuse_containers = args.reuse_containers + #reuse_containers = args.reuse_containers reuse_image = args.reuse_image success_file = args.success_file splunkbase_username = args.splunkbase_username @@ -248,9 +228,17 @@ def main(args): show_password = args.show_password splunk_password = args.container_password + + + + + + + ''' if splunk_password is None and reuse_containers is True: print("Error - if you are going to reuse a container you MUST provide the password to it!") sys.exit(1) + ''' if splunk_password is None: #Generate a sufficiently complex password splunk_password = get_random_password() @@ -279,21 +267,28 @@ def main(args): #Ensure that a valid mode was chosen mode = args.mode + if mode == "selected" and args.test_files == None: + print("Error - mode [%s] but did not provide any files to test.\nQuitting..."%(mode)) + + folders = [a.strip() for a in args.types.split(',')] for t in folders: if t not in DETECTION_TYPES: print("Error - requested test of [%s] but the only valid types are %s.\tQuitting..."%(t, str(DETECTION_TYPES))) sys.exit(1) + + #Do some initial setup and validation of the containers and images #If a user requests to use existing containers, they must also explicitly request to reuse existing images + ''' if reuse_containers and not reuse_image: print("Error - requested --reuse_containers but did not explicitly request --reuse_image.\n\tQuitting") sys.exit(1) - + ''' if num_containers < 1: #Perhaps this should be a mock-run - do the initial steps but don't do testing on the containers? print("Error, requested 0 containers. You must run with at least 1 container.") @@ -309,7 +304,7 @@ def main(args): #Remove containers that previously existed (if we are directed to do so) try: - remove_existing_containers(client, reuse_containers, LOCAL_BASE_CONTAINER_NAME, num_containers) + remove_existing_containers(client, False, LOCAL_BASE_CONTAINER_NAME, num_containers) except Exception as e: print("Error tryting to remove existing containers.\n\tQuitting...") sys.exit(1) @@ -351,24 +346,29 @@ def main(args): else: github_service = GithubService(branch) - - if args.mode == "all": - test_files = github_service.get_all_tests_and_detections(folders=folders, - previously_successful_tests=success_tests) - elif args.mode == "new": - test_files = github_service.get_changed_test_files(folders=folders, - previously_successful_tests=success_tests) - #elif args.mode == "selected": - # test_files = github_service.get_selected_test_files(folders=args.types, - # previously_successful_tests=success_tests) + try: + if mode == "all": + test_files = github_service.get_all_tests_and_detections(folders=folders, + previously_successful_tests=success_tests) + elif mode == "new": + test_files = github_service.get_changed_test_files(folders=folders, + previously_successful_tests=success_tests) + elif mode == "selected": + if set(folders) != set(DETECTION_TYPES): + print("You specified mode [%s] but also types: [%s]. We will ignore type restrictions and test all specified files"%(mode,str(folders))) + files_to_test = [name.strip() for name in args.test_files.split(',')] + test_files = github_service.get_selected_test_files(files_to_test, + previously_successful_tests=success_tests) - else: - print("Unsupported mode [%s] chosen. Supported modes are %s.\n\tQuitting..."%(args.mode, str(DETECTION_MODES))) + else: + print("Unsupported mode [%s] chosen. Supported modes are %s.\n\tQuitting..."%(args.mode, str(DETECTION_MODES))) + sys.exit(1) + except Exception as e: + print("Error - Failed to read in detection files: [%s].\nQuitting..."%(str(e))) sys.exit(1) - #Go into the security content directory print("****GENERATE NEW CONTENT****") os.chdir("security_content") @@ -723,9 +723,15 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe #Try to get something from the queue detection_to_test = testing_object.getTest() if detection_to_test is None: - print("Container [%s] has finished running detections, time to stop the container."%(container_name)) - container.stop() - print("Container [%s] successfully stopped"%(container_name)) + try: + print("Container [%s] has finished running detections, time to stop the container."%(container_name)) + container.stop() + print("Container [%s] successfully stopped"%(container_name)) + #remove the container + removeContainer(client, container_name, forceRemove=True) + except Exception as e: + print("Error stopping or removing the container: [%s]"%(str(e))) + return None diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index b2115b09d0..5b80bd0c58 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -67,10 +67,18 @@ class GithubService: return pruned_tests + def get_selected_test_files(self, + detection_file_list:list[str], + ttps_to_test:list[str]=["Anomaly","Hunting","TTP"], + previously_successful_tests:list[str]=[]) ->list[str]: + + return self.prune_detections(detection_file_list, ttps_to_test, previously_successful_tests) + + def get_all_tests_and_detections(self, folders:list[str]=['endpoint', 'cloud', 'network'], ttps_to_test:list[str]=["Anomaly","Hunting","TTP"], - previously_successful_tests:list[str]=[]) ->list[str]: + previously_successful_tests:list[str]=[]) ->list[str]: detections = [] for folder in folders: detections.extend(self.get_all_files_in_folder(os.path.join("security_content/detections", folder), "*.yml")) From 0846bb6d0b1171a9a9a681f8bcb83440e55c09b5 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 22 Oct 2021 16:42:53 -0700 Subject: [PATCH 028/203] Putting download attack data into a 'temp dir' and removing attack data as soon as it's used. We need to do this when we're testing on CI/CD, otherwise we will run out of space. Should keep/remove attack data be an option instead of forced? --- .../detection_testing_execution.py | 49 ++++++++++++++++--- .../modules/testing_service.py | 19 ++++--- 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 1459a31629..4e9cacd7de 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -22,6 +22,8 @@ import string import shutil from typing import Union +from tempfile import mkdtemp + SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" index_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "search") @@ -528,9 +530,14 @@ def main(args): #read all the results out from the output queue strtime = str(int(time.time())) + print("Wait for the status thread to finish executing...") + status_thread.join() + print("Status thread finished executing.") - #Generate all of the output information - results_tracker.outputResultsFiles() + + #Remove the attack data and + #generate all of the output information + results_tracker.finish() @@ -577,6 +584,11 @@ class SynchronizedResultsTracker: self.successes = [] self.errors = [] self.container_ready_time = None + + #Just make a random folder to store attack data that we donwload + self.attack_data_root_folder = mkdtemp(prefix="attack_data_", dir=os.getcwd()) + print("Attack data for this run will be stored at: [%s]"%(self.attack_data_root_folder)) + def getTest(self)-> Union[str,None]: try: return self.testing_queue.get(block=False) @@ -614,7 +626,21 @@ class SynchronizedResultsTracker: finally: self.lock.release() - def summarize(self)->None: + + def finish(self): + self.cleanup() + self.outputResultsFiles() + + + def cleanup(self): + self.lock.acquire() + try: + print("Removing all attack data that was downloaded during this test at: [%s]"%(self.attack_data_root_folder)) + shutil.rmtree(self.attack_data_root_folder) + print("Successfully removed all attack data") + finally: + self.lock.release() + def summarize(self)->bool: self.lock.acquire() @@ -673,6 +699,11 @@ class SynchronizedResultsTracker: finally: self.lock.release() + return (self.total_number_of_tests - + self.testing_queue.qsize() - + (len(self.successes) + len(self.failures) + len(self.errors)) > 0) + + def addResult(self, result:dict)->None: try: if result['detection_result']['success'] is False: @@ -731,7 +762,7 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe removeContainer(client, container_name, forceRemove=True) except Exception as e: print("Error stopping or removing the container: [%s]"%(str(e))) - + return None @@ -739,8 +770,12 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe #There is a detection to test print("Container [%s]--->[%s]"%(container_name, detection_to_test)) try: - result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, 0, uuid_test, wait_on_failure=interactive_failure) + result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, 0, uuid_test, testing_object.attack_data_root_folder, wait_on_failure=interactive_failure) testing_object.addResult(result) + + #Remove the data from the test that we just ran. We MUST do this when running on CI because otherwise, we will download + #a massive amount of data over the course of a long path and will run out of space on the relatively small CI runner drive + shutil.rmtree(result['attack_data_directory']) except Exception as e: print("Warning - uncaught error in detection test for [%s] - this should not happen: [%s]"%(detection_to_test, str(e))) testing_object.addError(detection_to_test,str(e)) @@ -749,7 +784,9 @@ def queue_status_thread(status_object:SynchronizedResultsTracker)->None: #This will run forever by design print("start status") while True: - status_object.summarize() + if status_object.summarize() == False: + #There are no more tests to run, so we can return from this thread + return None time.sleep(10) if __name__ == "__main__": diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index a94fbedc3b..38008e9915 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -10,13 +10,14 @@ from modules.DataManipulation import DataManipulation from modules import splunk_sdk from typing import Union +from os.path import relpath +from tempfile import mkdtemp - -def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:str, splunk_port:int, test_file:str, test_index:int, uuid_test:str, wait_on_failure:bool=False)->dict: - +def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:str, splunk_port:int, test_file:str, test_index:int, uuid_test:str, attack_data_root_folder, wait_on_failure:bool=False)->dict: + uuid_var = str(uuid.uuid4()) - result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var) + result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var, attack_data_root_folder) if result_test is None: #We failed so early in the process that we could not produce any meaningful result raise(Exception("Test execution Error")) @@ -37,7 +38,7 @@ def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:st return result_test -def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var)->Union[dict,None]: +def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_password:str, test_file:str, test_index:int, uuid_test, uuid_var, attack_data_root_folder)->Union[dict,None]: try: test_file_obj = load_file(os.path.join("security_content/", test_file)) except Exception as e: @@ -53,8 +54,11 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test #aws_service.add_detection_results_in_dynamo_db('eu-central-1', uuid_var , uuid_test, test_file_obj['tests'][0]['name'], test_file_obj['tests'][0]['file'], str(int(time.time()))) #epoch_time = str(int(time.time())) - folder_name = "attack_data_%s"%(uuid.uuid4()) - os.mkdir(folder_name) + + + abs_folder_path = mkdtemp(prefix="DATA_", dir=attack_data_root_folder) + #The ansible playbook wants the relative path, so we convert it as required + folder_name = relpath(abs_folder_path, os.getcwd()) for attack_data in test_file_obj['tests'][0]['attack_data']: url = attack_data['data'] @@ -106,6 +110,7 @@ def test_detection(splunk_ip, splunk_port, container_name, splunk_password, test result_detection['detection_name'] = test['name'] result_detection['detection_file'] = test['file'] result_test['detection_result'] = result_detection + result_test['attack_data_directory'] = abs_folder_path return result_test From 83d6869c6c5bdab93ec268c119da0ae5cafbdedd Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 25 Oct 2021 11:24:16 -0700 Subject: [PATCH 029/203] Better support for different types of structured output files, including a summary of all the detections before they are even run. --- .../detection_testing_execution.py | 45 +++++++++++++------ .../modules/github_service.py | 25 ++++++++++- 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 4e9cacd7de..47d94b813a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -23,7 +23,7 @@ import shutil from typing import Union from tempfile import mkdtemp - +import csv SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" index_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "search") @@ -597,7 +597,7 @@ class SynchronizedResultsTracker: return None def addSuccess(self, result:dict)->None: - print("Test PASSED for detection: [%s --> %s"%(result['detection_result']['detection_name'], result['detection_result']['detection_file'])) + print("Test PASSED for detection: [%s --> %s"%(result['detection_name'], result['detection_file'])) self.lock.acquire() try: self.successes.append(result) @@ -606,26 +606,45 @@ class SynchronizedResultsTracker: def addFailure(self, result:dict)->None: - print("Test FAILED for detection: [%s --> %s"%(result['detection_result']['detection_name'], result['detection_result']['detection_file'])) + print("Test FAILED for detection: [%s --> %s"%(result['detection_name'], result['detection_file'])) self.lock.acquire() try: self.failures.append(result) finally: self.lock.release() - def addError(self, detection:str, errorText:str)->None: + def addError(self, detection:dict)->None: self.lock.acquire() try: - self.errors.append((detection, errorText)) + self.errors.append(detection) finally: self.lock.release() - def outputResultsFiles(self)->None: + def outputResultsFile(self, column_names:list[str], output_filename:str, data:list[dict])->bool: + success = True + print("Generating %s"%(output_filename)) + print(data) self.lock.acquire() - try: - pass + try: + with open(output_filename, 'w') as csvfile: + csv_writer = csv.DictWriter(csvfile, fieldnames=column_names) + csv_writer.writeheader() + for row in self.successes: + csv_writer.writerow(row) + + except Exception as e: + print("Failure writing to CSV file for [%s]"%str(e)) + success = False + finally: self.lock.release() - + + return success + + def outputResultsFiles(self)->bool: + res = self.outputResultsFile(['detection_name', 'detection_file', 'detection_result','runDuration','diskUsage', 'search_string', 'error', 'success', 'scanCount'],"success.csv", self.successes) + res |= self.outputResultsFile(['detection_name', 'detection_file', 'detection_result','runDuration','diskUsage', 'search_string', 'error', 'success', 'scanCount'], "failures.csv", self.failures) + res |= self.outputResultsFile(['detection_file', 'detection_error'], "errors.csv", self.errors) + return res def finish(self): self.cleanup() @@ -708,12 +727,12 @@ class SynchronizedResultsTracker: try: if result['detection_result']['success'] is False: #This is actually a failure of the detection, not an error. Naming is confusiong - self.addFailure(result) + self.addFailure(result['detection_result']) elif result['detection_result']['success'] is True: - self.addSuccess(result) + self.addSuccess(result['detection_result']) except Exception as e: #Neither a success or a failure, so add the object to the failures queue - self.addError("Unspecified Error", str(result)) + self.addError({'detection_file':"Unknown File", "detection_error":str(result)}) @@ -778,7 +797,7 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe shutil.rmtree(result['attack_data_directory']) except Exception as e: print("Warning - uncaught error in detection test for [%s] - this should not happen: [%s]"%(detection_to_test, str(e))) - testing_object.addError(detection_to_test,str(e)) + testing_object.addError({"detection_file":detection_to_test,"detection_error":str(e)}) def queue_status_thread(status_object:SynchronizedResultsTracker)->None: #This will run forever by design diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 5b80bd0c58..61ac7b0122 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -7,6 +7,7 @@ import subprocess from git.objects import base import yaml import pathlib +import csv # Logger logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO")) LOGGER = logging.getLogger(__name__) @@ -40,8 +41,10 @@ class GithubService: detections_to_prune:list[str], ttps_to_test:list[str], previously_successful_tests:list[str], - exclude_ssa:bool=True)->list[str]: + exclude_ssa:bool=True, + summary_file:str=None)->list[str]: pruned_tests = [] + csvlines = [] for detection in detections_to_prune: if os.path.basename(detection).startswith("ssa") and exclude_ssa: continue @@ -61,9 +64,29 @@ class GithubService: else: #remove leading security_content/ from path pruned_tests.append(test_filepath_without_security_content) + if summary_file is not None: + try: + mitre_id = str(description['tags']['mitre_attack_id']) + except: + mitre_id = 'NONE' + try: + csvlines.append({'name':description['name'], 'description':description['description'], 'search':description['search'], 'mitre_attack_id':mitre_id, 'security_domain':description['tags']['security_domain'],'Relevant':'', 'Comments':''}) + except Exception as e: + print("Error outputting summary for [%s]: [%s]"%(detection, str(e))) else: #Don't do anything with these files pass + + if summary_file is not None: + with open('detectionWork.csv', 'w') as csvfile: + fieldnames = ['name', 'description', 'search', 'mitre_attack_id', 'security_domain', 'Relevant', 'Comments'] + writer = csv.DictWriter(csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_ALL) + writer.writeheader() + for r in csvlines: + writer.writerow(r) + + + return pruned_tests From fd9e91d569f882e7c8ff69fd50b179d4aa5d6e7f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 25 Oct 2021 14:28:06 -0700 Subject: [PATCH 030/203] Write out a summary csv and write environment iformation, to include datetime, splunk version, and installed splunk apps, to the csv files. --- .../detection_testing_execution.py | 56 +++++++++++-------- .../modules/github_service.py | 15 +++-- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 47d94b813a..fb378345a0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -20,7 +20,7 @@ from datetime import timedelta from datetime import datetime import string import shutil -from typing import Union +from typing import OrderedDict, Union from tempfile import mkdtemp import csv @@ -215,6 +215,8 @@ def main(args): parser.add_argument("-p", "--persist_security_content", required=False, default=False, action="store_true", help="Assumes security_content directory already exists. Don't check it out and overwrite it again. Saves "\ "time and allows you to test a detection that you've updated. Runs generate again in case you have "\ "updated macros or anything else. Especially useful for quick, local, iterative testing.") + start_datetime = datetime.now() + args = parser.parse_args() branch = args.branch uuid_test = args.uuid @@ -424,15 +426,10 @@ def main(args): os.chdir("../..") print("New ESCU Package generated successfully") - #Enqueue all of the test files for processing - test_file_queue = queue.Queue() - for filename in test_files: - test_file_queue.put(filename) - - + #Create threads to manage all of the containers that we will start up @@ -441,7 +438,7 @@ def main(args): - results_tracker = SynchronizedResultsTracker(test_files) + results_tracker = SynchronizedResultsTracker(test_files[:3]) for container_index in range(num_containers): container_name = LOCAL_BASE_CONTAINER_NAME%container_index @@ -482,6 +479,7 @@ def main(args): "8089/tcp": management_port } source_path = os.path.join(os.getcwd(), "security_content", "slim_packaging","apps") + mounts = [docker.types.Mount(target = '/tmp/apps/', source = source_path, type='bind', read_only=True)] print("Creating CONTAINER: [%s]"%(container_name)) @@ -537,7 +535,12 @@ def main(args): #Remove the attack data and #generate all of the output information - results_tracker.finish() + baseline = OrderedDict() + baseline['SPLUNK_VERSION'] = full_docker_hub_container_name + baseline['SPLUNK_APPS'] = ','.join(SPLUNK_APPS) + baseline['TEST_START_TIME'] = str(start_datetime) + + results_tracker.finish(baseline) @@ -619,20 +622,25 @@ class SynchronizedResultsTracker: self.errors.append(detection) finally: self.lock.release() - def outputResultsFile(self, column_names:list[str], output_filename:str, data:list[dict])->bool: + def outputResultsFile(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict)->bool: success = True - print("Generating %s"%(output_filename)) - print(data) + print("Generating %s..."%(output_filename), end='') self.lock.acquire() + try: with open(output_filename, 'w') as csvfile: - csv_writer = csv.DictWriter(csvfile, fieldnames=column_names) + header_writer = csv.writer(csvfile, quoting=csv.QUOTE_ALL) + for key in baseline: + header_writer.writerow([key, baseline[key]]) + header_writer.writerow(['','']) + csv_writer = csv.DictWriter(csvfile, fieldnames=field_names) csv_writer.writeheader() - for row in self.successes: + for row in data: csv_writer.writerow(row) + print("Done with [%d] detections"%(len(data))) except Exception as e: - print("Failure writing to CSV file for [%s]"%str(e)) + print("Failure writing to CSV file for [%s]:"%(output_filename, str(e))) success = False finally: @@ -640,15 +648,16 @@ class SynchronizedResultsTracker: return success - def outputResultsFiles(self)->bool: - res = self.outputResultsFile(['detection_name', 'detection_file', 'detection_result','runDuration','diskUsage', 'search_string', 'error', 'success', 'scanCount'],"success.csv", self.successes) - res |= self.outputResultsFile(['detection_name', 'detection_file', 'detection_result','runDuration','diskUsage', 'search_string', 'error', 'success', 'scanCount'], "failures.csv", self.failures) - res |= self.outputResultsFile(['detection_file', 'detection_error'], "errors.csv", self.errors) + def outputResultsFiles(self, baseline:OrderedDict, fields:list[str]=['detection_name', 'detection_file','runDuration','diskUsage', 'search_string', 'error', 'success', 'scanCount', 'detection_error'])->bool: + res = self.outputResultsFile(fields,"success.csv", self.successes, baseline) + res |= self.outputResultsFile(fields, "failures.csv", self.failures, baseline) + res |= self.outputResultsFile(fields, "errors.csv", self.errors, baseline) + res |= self.outputResultsFile(fields, "combined.csv", self.successes + self.failures + self.errors, baseline) return res - def finish(self): + def finish(self, baseline:OrderedDict): self.cleanup() - self.outputResultsFiles() + self.outputResultsFiles(baseline) def cleanup(self): @@ -718,8 +727,8 @@ class SynchronizedResultsTracker: finally: self.lock.release() + #Return true while there are tests remaining return (self.total_number_of_tests - - self.testing_queue.qsize() - (len(self.successes) + len(self.failures) + len(self.errors)) > 0) @@ -748,10 +757,11 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe container = client.containers.get(container_name) + print("Starting the container [%s]"%(container_name)) - + container.start() print("Start copying files to container: [%s]"%(container_name)) copy_file_to_container(index_file_local_path, index_file_container_path, container_name) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 61ac7b0122..4559640228 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -53,8 +53,8 @@ class GithubService: test_filepath = os.path.splitext(detection)[0].replace('detections', 'tests') + '.test.yml' test_filepath_without_security_content = str(pathlib.Path(*pathlib.Path(test_filepath).parts[1:])) - if 'type' in description and description['type'] in ttps_to_test: - + #If no TTPS are provided, then we will get everything + if 'type' in description and (description['type'] in ttps_to_test or len(ttps_to_test) == 0): #print(description['type']) if not os.path.exists(test_filepath): print("Detection [%s] references [%s], but it does not exist"%(detection, test_filepath)) @@ -70,7 +70,10 @@ class GithubService: except: mitre_id = 'NONE' try: - csvlines.append({'name':description['name'], 'description':description['description'], 'search':description['search'], 'mitre_attack_id':mitre_id, 'security_domain':description['tags']['security_domain'],'Relevant':'', 'Comments':''}) + + csvlines.append({'name':description['name'], 'filename':detection, 'description':description['description'], + 'search':description['search'], 'mitre_attack_id':mitre_id, 'security_domain':description['tags']['security_domain'], + 'Relevant':'', 'Comments':'', "Runnable on SSA?": str(os.path.basename(detection).startswith("ssa"))}) except Exception as e: print("Error outputting summary for [%s]: [%s]"%(detection, str(e))) else: @@ -78,15 +81,15 @@ class GithubService: pass if summary_file is not None: - with open('detectionWork.csv', 'w') as csvfile: - fieldnames = ['name', 'description', 'search', 'mitre_attack_id', 'security_domain', 'Relevant', 'Comments'] + print("writing") + with open(summary_file, 'w') as csvfile: + fieldnames = ['name', 'filename', 'description', 'search', 'mitre_attack_id', 'security_domain', 'Runnable on SSA?', 'Relevant', 'Comments'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_ALL) writer.writeheader() for r in csvlines: writer.writerow(r) - return pruned_tests From 549bcac8a7b291bfd777c3792fb7c2ecf4d80f0a Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 26 Oct 2021 14:33:01 -0700 Subject: [PATCH 031/203] Changes to support Ubuntu, which doesn't have curl installed by default, and moving to python3 for slim. --- .../detection_testing_execution.py | 105 ++++++++++++------ .../modules/splunk_sdk.py | 6 +- 2 files changed, 73 insertions(+), 38 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index fb378345a0..63526ddfa0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -24,6 +24,7 @@ from typing import OrderedDict, Union from tempfile import mkdtemp import csv +from urllib.request import urlretrieve SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" index_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "search") @@ -378,7 +379,11 @@ def main(args): os.chdir("security_content") print(os.getcwd()) if persist_security_content is False: - commands = ["python3 -m venv .venv", "source .venv/bin/activate", "python3 -m pip install wheel", "python3 -m pip install -r requirements.txt", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + commands = ["python3 -m venv .venv", + ". ./.venv/bin/activate", + "python3 -m pip install wheel", + "python3 -m pip install -r requirements.txt", + "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] else: commands = ["source .venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) @@ -392,7 +397,7 @@ def main(args): if persist_security_content is True: os.chdir("slim_packaging") commands = ["cd slim-latest", - "source venv/bin/activate", + ". ./.venv/bin/activate", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", "cp upload/DA-ESS-ContentUpdate*.tar.gz ../apps/DA-ESS-ContentUpdate-latest.tar.gz"] @@ -401,17 +406,28 @@ def main(args): os.mkdir("slim_packaging") os.chdir("slim_packaging") os.mkdir("apps") - commands = ["curl -Ls https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz -o splunk-packaging-toolkit-latest.tar.gz", - "rm -rf slim-latest", + + try: + SPLUNK_PACKAGING_TOOLKIT_URL = "https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz" + print("Downloading the Splunk Packaging Toolkit from %s..."%(SPLUNK_PACKAGING_TOOLKIT_URL), end='') + urlretrieve(SPLUNK_PACKAGING_TOOLKIT_URL, 'splunk-packaging-toolkit-latest.tar.gz') + print("success") + + + except Exception as e: + print("FAILED") + print("Error downloading the Splunk Packaging Toolkit: [%s]"%(str(e))) + sys.exit(1) + + + commands = ["rm -rf slim-latest", "mkdir slim-latest", "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", "cd slim-latest", - "virtualenv --python=/usr/bin/python2.7 --clear venv", - "source venv/bin/activate", - "python2 -m pip install --upgrade pip", - "python2 -m pip install wheel", - "python2 -m pip install semantic_version", - "python2 -m pip install .", + "python3 -m venv .venv", + ". ./.venv/bin/activate", + "python3 -m pip install wheel", + "python3 -m pip install -r requirements.txt", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", "cp upload/DA-ESS-ContentUpdate*.tar.gz ../apps/DA-ESS-ContentUpdate-latest.tar.gz"] @@ -438,35 +454,46 @@ def main(args): - results_tracker = SynchronizedResultsTracker(test_files[:3]) + + + results_tracker = SynchronizedResultsTracker(test_files) + local_volume_path = os.path.join(os.getcwd(), "security_content", "slim_packaging","apps") + + SPLUNK_COMMON_INFORMATION_MODEL = "https://splunkbase.splunk.com/app/1621/release/4.20.2/download" + SPLUNK_SECURITY_ESSENTIALS = "https://splunkbase.splunk.com/app/3435/release/3.3.4/download" + #SPLUNK_ADD_ON_FOR_SYSMON_OLD = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" + #SPLUNK_ADD_ON_FOR_SYSMON_NEW = "https://splunkbase.splunk.com/app/5709/release/1.0.1/download" + #SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" + #SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" + + #Just a hack until we get the new version of system deployed and available from splunkbase + LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser("~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") + shutil.copyfile(LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_PATH, os.path.join(local_volume_path, "Splunk_TA_microsoft_sysmon-1.0.2-B1.spl")) + SPLUNK_ADD_ON_FOR_SYSMON_VOLUME_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" + + + + + SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS = "https://splunkbase.splunk.com/app/742/release/8.2.0/download" + CONTAINER_VOLUME_PATH = '/tmp/apps/' + CONTAINER_GENERATED_ESCU_LATEST = os.path.join(CONTAINER_VOLUME_PATH, "DA-ESS-ContentUpdate-latest.tar.gz") + + SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, + SPLUNK_SECURITY_ESSENTIALS, + SPLUNK_ADD_ON_FOR_SYSMON_VOLUME_PATH, + CONTAINER_GENERATED_ESCU_LATEST, + SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] + + + for container_index in range(num_containers): container_name = LOCAL_BASE_CONTAINER_NAME%container_index web_port = BASE_CONTAINER_WEB_PORT + container_index management_port = BASE_CONTAINER_MANAGEMENT_PORT + container_index - SPLUNK_COMMON_INFORMATION_MODEL = "https://splunkbase.splunk.com/app/1621/release/4.20.2/download" - SPLUNK_SECURITY_ESSENTIALS = "https://splunkbase.splunk.com/app/3435/release/3.3.4/download" - #SPLUNK_ADD_ON_FOR_SYSMON_OLD = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" - #SPLUNK_ADD_ON_FOR_SYSMON_NEW = "https://splunkbase.splunk.com/app/5709/release/1.0.1/download" - #Just a hack until we get the new version of system deployed and available from splunkbase - LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser("~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") - LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_VOLUME_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" - shutil.copyfile(LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_PATH, "security_content/slim_packaging/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") - - - #SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" - #SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" - SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS = "https://splunkbase.splunk.com/app/742/release/8.2.0/download" - LOCAL_GENERATED_ESCU_LATEST = "/tmp/apps/DA-ESS-ContentUpdate-latest.tar.gz" - - SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, - SPLUNK_SECURITY_ESSENTIALS, - LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_VOLUME_PATH, - LOCAL_GENERATED_ESCU_LATEST, - SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] environment = {"SPLUNK_START_ARGS": "--accept-license", @@ -478,9 +505,10 @@ def main(args): ports= {"8000/tcp": web_port, "8089/tcp": management_port } - source_path = os.path.join(os.getcwd(), "security_content", "slim_packaging","apps") - mounts = [docker.types.Mount(target = '/tmp/apps/', source = source_path, type='bind', read_only=True)] + + + mounts = [docker.types.Mount(target = CONTAINER_VOLUME_PATH, source = local_volume_path, type='bind', read_only=True)] print("Creating CONTAINER: [%s]"%(container_name)) base_container = client.containers.create(full_docker_hub_container_name, ports=ports, environment=environment, name=container_name, mounts=mounts, detach=True) @@ -517,7 +545,7 @@ def main(args): #app install once, but it looks like the container is unlikely to support that. #We don't really want to fundamentally change this container, either, and will #keep it as close to production as possible - time.sleep(60) + time.sleep(5) #Wait for all of the testing threads to complete for t in splunk_container_manager_threads: @@ -573,7 +601,7 @@ def copy_file_to_container(localFilePath, remoteFilePath, containerName, sleepTi class SynchronizedResultsTracker: - def __init__(self, tests:list[str]): + def __init__(self, num_containers:int, tests:list[str]): #Create the queue and enque all of the tests self.testing_queue = queue.Queue() for test in tests: @@ -591,6 +619,7 @@ class SynchronizedResultsTracker: #Just make a random folder to store attack data that we donwload self.attack_data_root_folder = mkdtemp(prefix="attack_data_", dir=os.getcwd()) print("Attack data for this run will be stored at: [%s]"%(self.attack_data_root_folder)) + self.start_barrier = threading.Barrier(num_containers) def getTest(self)-> Union[str,None]: try: @@ -777,9 +806,13 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe print("Successfully enabled DELETE for [%s]"%(container_name)) - + #Wait for all of the threads to join here + print("Container [%s] setup complete and waiting for other containers to be ready..."%(container_name)) + testing_object.start_barrier.wait() while True: + #Sleep for a small random time so that containers drift apart and don't synchronize their testing + time.sleep(random.randint(1,30)) #Try to get something from the queue detection_to_test = testing_object.getTest() if detection_to_test is None: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 9c65c41d4a..69218ed9be 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -90,10 +90,12 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, "dispatch.latest_time": "now"} splunk_search = search + ' ' + pass_condition + test_results = dict() + test_results['search_string'] = splunk_search - test_results = dict() + try: service = client.connect( host=splunk_host, @@ -126,7 +128,7 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, test_results['detection_name'] = detection_name test_results['detection_file'] = detection_file test_results['scanCount'] = job['scanCount'] - test_results['search_string'] = splunk_search + test_results['error'] = False #The search may have FAILED, but there was no error in the search From 673c95673cd0aae8b49d8ed898fe8cd572bd6254 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 26 Oct 2021 14:47:01 -0700 Subject: [PATCH 032/203] Fixed slim install --- .../detection_testing_batch/detection_testing_execution.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 63526ddfa0..9146a3c54d 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -427,7 +427,8 @@ def main(args): "python3 -m venv .venv", ". ./.venv/bin/activate", "python3 -m pip install wheel", - "python3 -m pip install -r requirements.txt", + "python3 -m pip install semantic_version", + "python3 -m pip install .", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", "cp upload/DA-ESS-ContentUpdate*.tar.gz ../apps/DA-ESS-ContentUpdate-latest.tar.gz"] @@ -435,7 +436,7 @@ def main(args): - ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) + ret = subprocess.run("; ".join(commands), shell=True, capture_output=False) if ret.returncode != 0: print("Error generating new ESCU Package.\n\tQuitting..."%()) sys.exit(1) From b97fb1355531dad4814e9f90749aaf1490f39d6c Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 26 Oct 2021 15:25:26 -0700 Subject: [PATCH 033/203] Rolling back some changes that introduced slim installation errors --- .../detection_testing_execution.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 9146a3c54d..494b54fca4 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -397,7 +397,7 @@ def main(args): if persist_security_content is True: os.chdir("slim_packaging") commands = ["cd slim-latest", - ". ./.venv/bin/activate", + "source venv/bin/activate", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", "cp upload/DA-ESS-ContentUpdate*.tar.gz ../apps/DA-ESS-ContentUpdate-latest.tar.gz"] @@ -424,11 +424,12 @@ def main(args): "mkdir slim-latest", "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", "cd slim-latest", - "python3 -m venv .venv", - ". ./.venv/bin/activate", - "python3 -m pip install wheel", - "python3 -m pip install semantic_version", - "python3 -m pip install .", + "virtualenv --python=/usr/bin/python2.7 --clear .venv", + "source venv/bin/activate", + "python3 -m pip install --upgrade pip", + "python2 -m pip install wheel", + "python2 -m pip install semantic_version", + "python2 -m pip install .", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", "cp upload/DA-ESS-ContentUpdate*.tar.gz ../apps/DA-ESS-ContentUpdate-latest.tar.gz"] @@ -436,7 +437,7 @@ def main(args): - ret = subprocess.run("; ".join(commands), shell=True, capture_output=False) + ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) if ret.returncode != 0: print("Error generating new ESCU Package.\n\tQuitting..."%()) sys.exit(1) From 5fc1b7585b01e872a25e97981745adec95442fcb Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 26 Oct 2021 15:55:07 -0700 Subject: [PATCH 034/203] Fixed the last source to . changes for building slim. Also added the number of containers argument to the Synchronization object. --- .../detection_testing_execution.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 494b54fca4..52a9caab98 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -385,7 +385,7 @@ def main(args): "python3 -m pip install -r requirements.txt", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] else: - commands = ["source .venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + commands = ["s. ./.venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) if ret.returncode != 0: print("Error generating new content. Exiting...") @@ -397,7 +397,7 @@ def main(args): if persist_security_content is True: os.chdir("slim_packaging") commands = ["cd slim-latest", - "source venv/bin/activate", + ". ./.venv/bin/activate", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", "cp upload/DA-ESS-ContentUpdate*.tar.gz ../apps/DA-ESS-ContentUpdate-latest.tar.gz"] @@ -425,7 +425,7 @@ def main(args): "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", "cd slim-latest", "virtualenv --python=/usr/bin/python2.7 --clear .venv", - "source venv/bin/activate", + ". ./.venv/bin/activate", "python3 -m pip install --upgrade pip", "python2 -m pip install wheel", "python2 -m pip install semantic_version", @@ -458,7 +458,7 @@ def main(args): - results_tracker = SynchronizedResultsTracker(test_files) + results_tracker = SynchronizedResultsTracker(test_files, num_containers=num_containers) local_volume_path = os.path.join(os.getcwd(), "security_content", "slim_packaging","apps") From 710efec1a0b90f43b5cacae545e2ad198ac21e14 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 26 Oct 2021 16:19:37 -0700 Subject: [PATCH 035/203] Tweak how long we wait before starting tests with the containers. --- .../detection_testing_execution.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 52a9caab98..58dcfaf3ab 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -458,7 +458,7 @@ def main(args): - results_tracker = SynchronizedResultsTracker(test_files, num_containers=num_containers) + results_tracker = SynchronizedResultsTracker(test_files, num_containers) local_volume_path = os.path.join(os.getcwd(), "security_content", "slim_packaging","apps") @@ -603,7 +603,7 @@ def copy_file_to_container(localFilePath, remoteFilePath, containerName, sleepTi class SynchronizedResultsTracker: - def __init__(self, num_containers:int, tests:list[str]): + def __init__(self, tests:list[str], num_containers:int): #Create the queue and enque all of the tests self.testing_queue = queue.Queue() for test in tests: @@ -800,11 +800,11 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe print("Finished copying files to container: [%s]"%(container_name)) - wait_for_splunk_ready(max_seconds=120) + #wait_for_splunk_ready(max_seconds=120) from modules.splunk_sdk import enable_delete_for_admin - if not enable_delete_for_admin(splunk_ip, splunk_port, splunk_password): - print("COULD NOT ENABLE DELETE FOR [%s].... quitting"%(container_name)) - sys.exit(0) + print("Enabling DELETE for [%s]"%(container_name)) + while not enable_delete_for_admin(splunk_ip, splunk_port, splunk_password): + time.sleep(10) print("Successfully enabled DELETE for [%s]"%(container_name)) From afbc033601ac2df769e13f0d4a705881846fb0e7 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 26 Oct 2021 16:58:24 -0700 Subject: [PATCH 036/203] Wait some time after ready before starting all of the tests to allow the container to settle. --- .../detection_testing_execution.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 58dcfaf3ab..dd43d6a370 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -803,15 +803,18 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe #wait_for_splunk_ready(max_seconds=120) from modules.splunk_sdk import enable_delete_for_admin print("Enabling DELETE for [%s]"%(container_name)) - while not enable_delete_for_admin(splunk_ip, splunk_port, splunk_password): - time.sleep(10) + try: + while not enable_delete_for_admin(splunk_ip, splunk_port, splunk_password): + time.sleep(10) + except Exception as e: + print("Failure enabling DELETE for container [%s]: [%s].\n\tQuitting..."%(container_name, str(e))) print("Successfully enabled DELETE for [%s]"%(container_name)) #Wait for all of the threads to join here print("Container [%s] setup complete and waiting for other containers to be ready..."%(container_name)) testing_object.start_barrier.wait() - + wait_for_splunk_ready(max_seconds=60) while True: #Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1,30)) From 16d9cac1b5c9c65f34dbd57b106c5c4fd72fd6a6 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 27 Oct 2021 16:58:31 -0700 Subject: [PATCH 037/203] Added more apps that previously were not installed. Changed the order - CIM is installed last. Since we require a file copy to a directory that does not exist until that app is installed, it prevents us from getting ahead of ourselves and starting tests on the container until all apps have installed. --- .../detection_testing_execution.py | 104 +++++++++++++----- 1 file changed, 76 insertions(+), 28 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index dd43d6a370..c6d8fa1c23 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -24,7 +24,10 @@ from typing import OrderedDict, Union from tempfile import mkdtemp import csv -from urllib.request import urlretrieve + +from requests import get + + SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" index_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "search") @@ -65,13 +68,30 @@ def get_random_password()->str: return password -def wait_for_splunk_ready(splunk_container_name=None, splunk_web_port=None, max_seconds=30): +def wait_for_splunk_ready(container_name:str, splunk_web_port:int, splunk_ip:str="127.0.0.1", max_seconds:int=300)->bool: #The smarter version of this will try to hit one of the pages, #probably the login page, and when that is available it means that #splunk is fully started and ready to go. Until then, we just #use a simple sleep - time.sleep(max_seconds) - + splunk_ready_url = "http://%s:%d"%(splunk_ip, splunk_web_port) + print(splunk_ready_url) + start = timer() + while True: + try: + #Splunk container will not have proper ssl certificate + response = get(splunk_ready_url,timeout=5, verify=False) + response.raise_for_status() + print("\n\n\n*****CONTAINER GET WORKED OKAY******") + return True + except Exception as e: + elapsed = timer() - start + print(str(e)) + if elapsed > max_seconds: + raise(Exception("Container [%s] took longer than maximum start time of [%d].\n\tQuitting..."%(container_name, max_seconds))) + print("Wait progress [%d of %d]"%(elapsed, max_seconds)) + print(timer() - start) + time.sleep(5) + @@ -217,7 +237,8 @@ def main(args): "time and allows you to test a detection that you've updated. Runs generate again in case you have "\ "updated macros or anything else. Especially useful for quick, local, iterative testing.") start_datetime = datetime.now() - + import requests.packages.urllib3 + requests.packages.urllib3.disable_warnings() args = parser.parse_args() branch = args.branch uuid_test = args.uuid @@ -409,8 +430,13 @@ def main(args): try: SPLUNK_PACKAGING_TOOLKIT_URL = "https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz" + SPLUNK_PACKAGING_TOOLKIT_FILENAME = 'splunk-packaging-toolkit-latest.tar.gz' print("Downloading the Splunk Packaging Toolkit from %s..."%(SPLUNK_PACKAGING_TOOLKIT_URL), end='') - urlretrieve(SPLUNK_PACKAGING_TOOLKIT_URL, 'splunk-packaging-toolkit-latest.tar.gz') + response = get(SPLUNK_PACKAGING_TOOLKIT_URL) + response.raise_for_status() + with open(SPLUNK_PACKAGING_TOOLKIT_FILENAME, 'wb') as slim_file: + slim_file.write(response.content) + print("success") @@ -462,31 +488,51 @@ def main(args): local_volume_path = os.path.join(os.getcwd(), "security_content", "slim_packaging","apps") - SPLUNK_COMMON_INFORMATION_MODEL = "https://splunkbase.splunk.com/app/1621/release/4.20.2/download" - SPLUNK_SECURITY_ESSENTIALS = "https://splunkbase.splunk.com/app/3435/release/3.3.4/download" + + #SPLUNK_ADD_ON_FOR_SYSMON_OLD = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" #SPLUNK_ADD_ON_FOR_SYSMON_NEW = "https://splunkbase.splunk.com/app/5709/release/1.0.1/download" #SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" #SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" #Just a hack until we get the new version of system deployed and available from splunkbase - LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser("~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") - shutil.copyfile(LOCAL_SPLUNK_ADD_ON_FOR_SYSMON_PATH, os.path.join(local_volume_path, "Splunk_TA_microsoft_sysmon-1.0.2-B1.spl")) - SPLUNK_ADD_ON_FOR_SYSMON_VOLUME_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" - - - - - SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS = "https://splunkbase.splunk.com/app/742/release/8.2.0/download" CONTAINER_VOLUME_PATH = '/tmp/apps/' - CONTAINER_GENERATED_ESCU_LATEST = os.path.join(CONTAINER_VOLUME_PATH, "DA-ESS-ContentUpdate-latest.tar.gz") + BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser("~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") + shutil.copyfile(BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH, os.path.join(local_volume_path, "Splunk_TA_microsoft_sysmon-1.0.2-B1.spl")) - SPLUNK_APPS = [SPLUNK_COMMON_INFORMATION_MODEL, - SPLUNK_SECURITY_ESSENTIALS, - SPLUNK_ADD_ON_FOR_SYSMON_VOLUME_PATH, - CONTAINER_GENERATED_ESCU_LATEST, - SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS] + BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" + GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH = os.path.join(CONTAINER_VOLUME_PATH, "DA-ESS-ContentUpdate-latest.tar.gz") + SPLUNKBASE_URL = "https://splunkbase.splunk.com/app/%d/release/%s/download" + APPS_DICT = OrderedDict() + APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS'] = {"app_number":742, 'app_version':"8.2.0", 'location':'splunkbase'} + APPS_DICT['SPLUNK_SECURITY_ESSENTIALS'] = {"app_number":3435, 'app_version':"3.3.4", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES'] = {"app_number":1876, 'app_version':"5.2.0", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365'] = {"app_number":4055, 'app_version':"2.2.0", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE'] = {"app_number":3719, 'app_version':"1.3.2", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ANALYTIC_STORY_EXECUTION_APP'] = {"app_number":4971, 'app_version': "2.0.3", 'location':'splunkbase'} + APPS_DICT['PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT'] = {"app_number":2882, 'app_version':"2.0.2", 'location':'splunkbase'} + APPS_DICT['SPLUNK_MACHINE_LEARNING_TOOLKIT'] = {"app_number":2890, 'app_version':"5.2.2", 'location':'splunkbase'} + APPS_DICT['SPLUNK_APP_FOR_STREAM'] = {"app_number":1809, 'app_version':"8.0.1", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA'] = {"app_number":5234, 'app_version':"8.0.1", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS'] = {"app_number":5238, 'app_version':"8.0.1", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO'] = {"app_number":1617, 'app_version':"4.0.0", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX'] = {"app_number":833, 'app_version':"8.3.1", 'location':'splunkbase'} + APPS_DICT['GENERATED_SPLUNK_ES_CONTENT_UPDATE'] = {"app_number":3449, 'app_version':"Generated at %s"%(datetime.now()), 'location':GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH} + APPS_DICT['BETA_SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number":3449, 'app_version':"Generated at %s"%(datetime.now()), 'location':BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH} + APPS_DICT['SPLUNK_COMMON_INFORMATION_MODEL'] = {"app_number":1621, 'app_version':"4.20.2", 'location':'splunkbase'} + + + + SPLUNK_APPS = [] + for key, value in APPS_DICT.items(): + if value['location'] == 'splunkbase': + #The app is on Splunkbase + SPLUNK_APPS.append(SPLUNKBASE_URL%(value['app_number'],value['app_version'])) + else: + #The app is a file we generated locally + SPLUNK_APPS.append(value['location']) + for container_index in range(num_containers): @@ -523,7 +569,8 @@ def main(args): args=(results_tracker, container_name, "127.0.0.1", - splunk_password, + splunk_password, + web_port, management_port, uuid_test, interactive_failure @@ -776,7 +823,7 @@ class SynchronizedResultsTracker: -def splunk_container_manager(testing_object:SynchronizedResultsTracker, container_name, splunk_ip, splunk_password, splunk_port, uuid_test, interactive_failure:bool=False): +def splunk_container_manager(testing_object:SynchronizedResultsTracker, container_name, splunk_ip, splunk_password, splunk_web_port, splunk_management_port, uuid_test, interactive_failure:bool=False): print("Starting the container [%s] after a sleep"%(container_name)) #Is this going to be safe to use in different threads client = docker.client.from_env() @@ -800,11 +847,11 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe print("Finished copying files to container: [%s]"%(container_name)) - #wait_for_splunk_ready(max_seconds=120) + from modules.splunk_sdk import enable_delete_for_admin print("Enabling DELETE for [%s]"%(container_name)) try: - while not enable_delete_for_admin(splunk_ip, splunk_port, splunk_password): + while not enable_delete_for_admin(splunk_ip, splunk_management_port, splunk_password): time.sleep(10) except Exception as e: print("Failure enabling DELETE for container [%s]: [%s].\n\tQuitting..."%(container_name, str(e))) @@ -814,7 +861,8 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe #Wait for all of the threads to join here print("Container [%s] setup complete and waiting for other containers to be ready..."%(container_name)) testing_object.start_barrier.wait() - wait_for_splunk_ready(max_seconds=60) + wait_for_splunk_ready(container_name, splunk_web_port,splunk_ip, max_seconds=300) + while True: #Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1,30)) @@ -837,7 +885,7 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe #There is a detection to test print("Container [%s]--->[%s]"%(container_name, detection_to_test)) try: - result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_port, detection_to_test, 0, uuid_test, testing_object.attack_data_root_folder, wait_on_failure=interactive_failure) + result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_management_port, detection_to_test, 0, uuid_test, testing_object.attack_data_root_folder, wait_on_failure=interactive_failure) testing_object.addResult(result) #Remove the data from the test that we just ran. We MUST do this when running on CI because otherwise, we will download From 820207dc033a707fe5c48cb06c65d95870fa660e Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 27 Oct 2021 16:59:15 -0700 Subject: [PATCH 038/203] See the previous commit message. Added some comments around the CIM app to explain why it is the last app to be installed. --- .../detection_testing_batch/detection_testing_execution.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index c6d8fa1c23..fc7cecc072 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -520,6 +520,10 @@ def main(args): APPS_DICT['SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX'] = {"app_number":833, 'app_version':"8.3.1", 'location':'splunkbase'} APPS_DICT['GENERATED_SPLUNK_ES_CONTENT_UPDATE'] = {"app_number":3449, 'app_version':"Generated at %s"%(datetime.now()), 'location':GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH} APPS_DICT['BETA_SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number":3449, 'app_version':"Generated at %s"%(datetime.now()), 'location':BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH} + + #CIM is last here for a reason! Because we copy a file to a directory that does not exist until CIM + #has been installed, we use it to prevent the testing from beginning until the copy has succeeded. + #KEEP THIS APP LAST! APPS_DICT['SPLUNK_COMMON_INFORMATION_MODEL'] = {"app_number":1621, 'app_version':"4.20.2", 'location':'splunkbase'} @@ -843,6 +847,9 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe container.start() print("Start copying files to container: [%s]"%(container_name)) copy_file_to_container(index_file_local_path, index_file_container_path, container_name) + #The below copy will fail until the CIM app is installed. This app MUST be installed last! + #If we install it earlier, we will get ahead of ourselves and start doing tests before the container + #is truly ready for testing and all apps have been installed copy_file_to_container(datamodel_file_local_path, datamodel_file_container_path, container_name) print("Finished copying files to container: [%s]"%(container_name)) From c212b20dd517737825a481c244686e830927fb42 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 27 Oct 2021 17:50:18 -0700 Subject: [PATCH 039/203] Joined detection types default argument from list to string. --- .../ci/detection_testing_batch/detection_testing_execution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index fc7cecc072..4a24d015f7 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -231,7 +231,7 @@ def main(args): parser.add_argument("-m", "--mode", type=str, choices=DETECTION_MODES, required=False, help="Whether to test new detections, specific detections, or all detections", default="new") parser.add_argument("-tf","--test_files", type=str, required=False, help="The names of files that you want to test, separated by commas.") - parser.add_argument("-t", "--types", type=str, required=False, help="Detection types to test. Can be one of more of %s"%(str(DETECTION_TYPES)), default=DETECTION_TYPES) + parser.add_argument("-t", "--types", type=str, required=False, help="Detection types to test. Can be one of more of %s"%(str(DETECTION_TYPES)), default=','.join(DETECTION_TYPES)) parser.add_argument("-ct", "--container_tag", type=str, required=False, help="The tag of the Splunk Container to use. Tags are located at https://hub.docker.com/r/splunk/splunk/tags",default=DEFAULT_CONTAINER_TAG) parser.add_argument("-p", "--persist_security_content", required=False, default=False, action="store_true", help="Assumes security_content directory already exists. Don't check it out and overwrite it again. Saves "\ "time and allows you to test a detection that you've updated. Runs generate again in case you have "\ From a1521a1dce076bf5dbcd05e963feebf48eae83d9 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 13:23:56 -0700 Subject: [PATCH 040/203] Created a GitHub Action YML for testing using docker container on GitHub actions. Right now, it's just testing a single, static detection since that's easier and faster. --- .../workflows/docker-detection-testing.yml | 80 +++++++++++++++++++ .../detection_testing_execution.py | 55 ++++++++----- 2 files changed, 113 insertions(+), 22 deletions(-) create mode 100644 .github/workflows/docker-detection-testing.yml diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml new file mode 100644 index 0000000000..d5ee617342 --- /dev/null +++ b/.github/workflows/docker-detection-testing.yml @@ -0,0 +1,80 @@ +name: detection-testing +on: + push: +jobs: + + validate-tag-if-present: + runs-on: ubuntu-latest + + steps: + - name: TAGGED, Validate that the tag is in the correct format + + run: | + echo "The GITHUB_REF: $GITHUB_REF" + #First check to see if the release is a tag + if [[ $GITHUB_REF =~ refs/tags/* ]]; then + #Yes, this is a tag, so we need to test to make sure that the tag + #is in the correct format (like v1.10.20) + if [[ $GITHUB_REF =~ refs/tags/v[0-9]+.[0-9]+.[0-9]+ ]]; then + echo "PASS: Tagged release with good format" + exit 0 + else + echo "FAIL: Tagged release with bad format" + exit 1 + fi + else + echo "PASS: Not a tagged release" + exit 0 + fi + + quit-for-dependabot: + runs-on: ubuntu-latest + if: github.actor != 'dependabot[bot]' && github.actor != 'dependabot-preview[bot]' + steps: + - name: "Placeholder" + run: | + echo "No, this is not a dependabot run!" + + + detection-testing: + runs-on: ubuntu-latest + needs: [validate-tag-if-present, quit-for-dependabot] + steps: + - name: Get branch and PR required for detection testing main.py + id: vars + run: | + echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" + + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Install Docker + run: | + sudo apt update -qq + sudo apt install docker.io + sudo usermod -aG docker $USER + + #python2.7 needed for slim, for now + sudo apt install python2.7 + sudo apt install virtualenv python2.7-pip + + - uses: actions/setup-python@v2 + with: + python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install Python Dependencies + run: | + cd automated_detection_testing/ci/detection_testing_batch + python3 -m venv .venv + source .venv/bin/activate + python3 -m pip install wheel + python3 -m pip install -r requirements.txt + + - name: Run the CI + run: | + cd automated_detection_testing/ci/detection_testing_batch + source .venv/bin/activate + python3 detection_testing_execution.py -b {{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username {{ secrets.SPLUNKBASE_TESTING_USERANME }} --splunkbase_password {{ secrets.SPLUNKBASE_TESTING_KEY }} -m selected -tf security_content/detections/endpoint/7zip_commandline_to_smb_share_path.yml -n1 + echo "DONE!" + diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 4a24d015f7..93e80fe3a0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -81,15 +81,11 @@ def wait_for_splunk_ready(container_name:str, splunk_web_port:int, splunk_ip:str #Splunk container will not have proper ssl certificate response = get(splunk_ready_url,timeout=5, verify=False) response.raise_for_status() - print("\n\n\n*****CONTAINER GET WORKED OKAY******") return True except Exception as e: elapsed = timer() - start - print(str(e)) if elapsed > max_seconds: raise(Exception("Container [%s] took longer than maximum start time of [%d].\n\tQuitting..."%(container_name, max_seconds))) - print("Wait progress [%d of %d]"%(elapsed, max_seconds)) - print(timer() - start) time.sleep(5) @@ -497,30 +493,42 @@ def main(args): #Just a hack until we get the new version of system deployed and available from splunkbase CONTAINER_VOLUME_PATH = '/tmp/apps/' - BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser("~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") - shutil.copyfile(BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH, os.path.join(local_volume_path, "Splunk_TA_microsoft_sysmon-1.0.2-B1.spl")) - BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH = os.path.join(CONTAINER_VOLUME_PATH, "DA-ESS-ContentUpdate-latest.tar.gz") SPLUNKBASE_URL = "https://splunkbase.splunk.com/app/%d/release/%s/download" + #Order that we install the apps is actually important APPS_DICT = OrderedDict() APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS'] = {"app_number":742, 'app_version':"8.2.0", 'location':'splunkbase'} APPS_DICT['SPLUNK_SECURITY_ESSENTIALS'] = {"app_number":3435, 'app_version':"3.3.4", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES'] = {"app_number":1876, 'app_version':"5.2.0", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365'] = {"app_number":4055, 'app_version':"2.2.0", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE'] = {"app_number":3719, 'app_version':"1.3.2", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ANALYTIC_STORY_EXECUTION_APP'] = {"app_number":4971, 'app_version': "2.0.3", 'location':'splunkbase'} - APPS_DICT['PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT'] = {"app_number":2882, 'app_version':"2.0.2", 'location':'splunkbase'} - APPS_DICT['SPLUNK_MACHINE_LEARNING_TOOLKIT'] = {"app_number":2890, 'app_version':"5.2.2", 'location':'splunkbase'} - APPS_DICT['SPLUNK_APP_FOR_STREAM'] = {"app_number":1809, 'app_version':"8.0.1", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA'] = {"app_number":5234, 'app_version':"8.0.1", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS'] = {"app_number":5238, 'app_version':"8.0.1", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO'] = {"app_number":1617, 'app_version':"4.0.0", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX'] = {"app_number":833, 'app_version':"8.3.1", 'location':'splunkbase'} APPS_DICT['GENERATED_SPLUNK_ES_CONTENT_UPDATE'] = {"app_number":3449, 'app_version':"Generated at %s"%(datetime.now()), 'location':GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH} - APPS_DICT['BETA_SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number":3449, 'app_version':"Generated at %s"%(datetime.now()), 'location':BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH} + + try: + raise + BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser("~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") + shutil.copyfile(BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH, os.path.join(local_volume_path, "Splunk_TA_microsoft_sysmon-1.0.2-B1.spl")) + + BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" + APPS_DICT['BETA_SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number":5709, 'app_version':"Generated at %s"%(datetime.now()), 'location':BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH} + except Exception as e: + print("Failed to grab beta sysmon at ~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl. Using the one from Splunkbase") + APPS_DICT['SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number":5709, 'app_version':"1.0.1", 'location':'splunkbase'} + + if True: + APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES'] = {"app_number":1876, 'app_version':"5.2.0", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365'] = {"app_number":4055, 'app_version':"2.2.0", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE'] = {"app_number":3719, 'app_version':"1.3.2", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ANALYTIC_STORY_EXECUTION_APP'] = {"app_number":4971, 'app_version': "2.0.3", 'location':'splunkbase'} + APPS_DICT['PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT'] = {"app_number":2882, 'app_version':"2.0.2", 'location':'splunkbase'} + APPS_DICT['SPLUNK_MACHINE_LEARNING_TOOLKIT'] = {"app_number":2890, 'app_version':"5.2.2", 'location':'splunkbase'} + APPS_DICT['SPLUNK_APP_FOR_STREAM'] = {"app_number":1809, 'app_version':"8.0.1", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA'] = {"app_number":5234, 'app_version':"8.0.1", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS'] = {"app_number":5238, 'app_version':"8.0.1", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO'] = {"app_number":1617, 'app_version':"4.0.0", 'location':'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX'] = {"app_number":833, 'app_version':"8.3.1", 'location':'splunkbase'} + + #CIM is last here for a reason! Because we copy a file to a directory that does not exist until CIM #has been installed, we use it to prevent the testing from beginning until the copy has succeeded. #KEEP THIS APP LAST! @@ -528,6 +536,7 @@ def main(args): + SPLUNK_APPS = [] for key, value in APPS_DICT.items(): if value['location'] == 'splunkbase': @@ -560,8 +569,10 @@ def main(args): - mounts = [docker.types.Mount(target = CONTAINER_VOLUME_PATH, source = local_volume_path, type='bind', read_only=True)] + + mounts = [docker.types.Mount(target = CONTAINER_VOLUME_PATH, source = local_volume_path, type='bind', read_only=True)] + print("Creating CONTAINER: [%s]"%(container_name)) base_container = client.containers.create(full_docker_hub_container_name, ports=ports, environment=environment, name=container_name, mounts=mounts, detach=True) print("Created CONTAINER : [%s]"%(container_name)) @@ -852,7 +863,7 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe #is truly ready for testing and all apps have been installed copy_file_to_container(datamodel_file_local_path, datamodel_file_container_path, container_name) print("Finished copying files to container: [%s]"%(container_name)) - + from modules.splunk_sdk import enable_delete_for_admin @@ -869,7 +880,7 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe print("Container [%s] setup complete and waiting for other containers to be ready..."%(container_name)) testing_object.start_barrier.wait() wait_for_splunk_ready(container_name, splunk_web_port,splunk_ip, max_seconds=300) - + while True: #Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1,30)) From bb22ea0604a6846500b5766451b81ef0bb862238 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 13:31:37 -0700 Subject: [PATCH 041/203] Printing out version of containerd --- .github/workflows/docker-detection-testing.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index d5ee617342..0945d6a1ef 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -1,4 +1,4 @@ -name: detection-testing +name: docker-detection-testing on: push: jobs: @@ -36,7 +36,7 @@ jobs: echo "No, this is not a dependabot run!" - detection-testing: + docker-detection-testing: runs-on: ubuntu-latest needs: [validate-tag-if-present, quit-for-dependabot] steps: @@ -51,6 +51,7 @@ jobs: - name: Install Docker run: | sudo apt update -qq + which containerd sudo apt install docker.io sudo usermod -aG docker $USER From ceb606a01f8d2e1ac061cf13ae6ca8fb51dff73e Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 13:34:39 -0700 Subject: [PATCH 042/203] Explicitly installing containerd --- .github/workflows/docker-detection-testing.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 0945d6a1ef..63fe6d11fd 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -51,6 +51,7 @@ jobs: - name: Install Docker run: | sudo apt update -qq + sudo apt install containerd which containerd sudo apt install docker.io sudo usermod -aG docker $USER From c8615d208c0d82d5e38271f07fc4699b2735db87 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 13:48:46 -0700 Subject: [PATCH 043/203] Docker is already installed on VM, no need to install it. --- .github/workflows/docker-detection-testing.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 63fe6d11fd..4715c61658 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -50,11 +50,11 @@ jobs: - name: Install Docker run: | - sudo apt update -qq - sudo apt install containerd - which containerd - sudo apt install docker.io - sudo usermod -aG docker $USER + #sudo apt update -qq + #sudo apt install runc + #sudo apt install containerd + #sudo apt install docker.io + #sudo usermod -aG docker $USER #python2.7 needed for slim, for now sudo apt install python2.7 From e04135b8ae9f3a8ede32a18a1c2eb4dcd93581c4 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 14:02:55 -0700 Subject: [PATCH 044/203] Properly installing python2 --- .github/workflows/docker-detection-testing.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 4715c61658..c7c0a5bc22 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -50,15 +50,14 @@ jobs: - name: Install Docker run: | - #sudo apt update -qq - #sudo apt install runc - #sudo apt install containerd - #sudo apt install docker.io - #sudo usermod -aG docker $USER + sudo apt update -qq + #python2.7 needed for slim, for now - sudo apt install python2.7 + sudo apt install python2 sudo apt install virtualenv python2.7-pip + curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + sudo python2.7 get-pip.py - uses: actions/setup-python@v2 with: From 1bf59b0ca78e623fc1eca574c600bec5a9236529 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 14:05:11 -0700 Subject: [PATCH 045/203] Installing pip by script, not by apt --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index c7c0a5bc22..ec1e343c1c 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -55,7 +55,7 @@ jobs: #python2.7 needed for slim, for now sudo apt install python2 - sudo apt install virtualenv python2.7-pip + sudo apt install virtualenv curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py sudo python2.7 get-pip.py From 75bc9ee74c3f7a805f6e2a872b9aa408b3ed4257 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 14:10:41 -0700 Subject: [PATCH 046/203] Badly formatted secrets fixed --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index ec1e343c1c..20122fc264 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -76,6 +76,6 @@ jobs: run: | cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py -b {{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username {{ secrets.SPLUNKBASE_TESTING_USERANME }} --splunkbase_password {{ secrets.SPLUNKBASE_TESTING_KEY }} -m selected -tf security_content/detections/endpoint/7zip_commandline_to_smb_share_path.yml -n1 + python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m selected -tf security_content/detections/endpoint/7zip_commandline_to_smb_share_path.yml -n1 echo "DONE!" From e0dc0e6743dc53e0e0066a77287c09583f959482 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 14:24:49 -0700 Subject: [PATCH 047/203] Testing 2 containers with a larger number of detections --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 20122fc264..7406da3e14 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -76,6 +76,6 @@ jobs: run: | cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m selected -tf security_content/detections/endpoint/7zip_commandline_to_smb_share_path.yml -n1 + python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 echo "DONE!" From 0c53c4a9ab354527c5c69080ad6f4df6137aa7bf Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 14:45:57 -0700 Subject: [PATCH 048/203] Changed to test against a different branch for testing purposes --- .github/workflows/docker-detection-testing.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 7406da3e14..22d75da290 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -76,6 +76,7 @@ jobs: run: | cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 + #python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 + python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 echo "DONE!" From aadb588fff04b50e99fb71047e85f45a85cb2b64 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 17:23:22 -0700 Subject: [PATCH 049/203] Changes to generate JSON artifacts as well as CSV and upload them after a test run on GH Actions. --- .../workflows/docker-detection-testing.yml | 15 ++++- .../detection_testing_execution.py | 61 ++++++++++++++++--- .../modules/github_service.py | 5 +- 3 files changed, 69 insertions(+), 12 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 22d75da290..d8a17d22f6 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -77,6 +77,19 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate #python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 - python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 + python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n1 echo "DONE!" + - name: Upload Test Results Files + uses: actions/upload-artifact@v2 + with: + name: testing-results-files + path: | + automated_detection_testing/ci/detection_testing_batch/success.csv + automated_detection_testing/ci/detection_testing_batch/error.csv + automated_detection_testing/ci/detection_testing_batch/failure.csv + automated_detection_testing/ci/detection_testing_batch/combined.csv + automated_detection_testing/ci/detection_testing_batch/success.json + automated_detection_testing/ci/detection_testing_batch/error.json + automated_detection_testing/ci/detection_testing_batch/failure.json + automated_detection_testing/ci/detection_testing_batch/combined.json \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 93e80fe3a0..9a8bdd341b 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -26,7 +26,7 @@ from tempfile import mkdtemp import csv from requests import get - +import json SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" @@ -389,6 +389,10 @@ def main(args): print("Error - Failed to read in detection files: [%s].\nQuitting..."%(str(e))) sys.exit(1) + if len(test_files) == 0: + print("No files were found to be tested. Returning an error (should this return success?).\n\tQuitting...") + sys.exit(1) + #Go into the security content directory @@ -541,7 +545,8 @@ def main(args): for key, value in APPS_DICT.items(): if value['location'] == 'splunkbase': #The app is on Splunkbase - SPLUNK_APPS.append(SPLUNKBASE_URL%(value['app_number'],value['app_version'])) + target=SPLUNKBASE_URL%(value['app_number'],value['app_version']) + SPLUNK_APPS.append(target) else: #The app is a file we generated locally SPLUNK_APPS.append(value['location']) @@ -627,17 +632,20 @@ def main(args): #Remove the attack data and #generate all of the output information + stop_time = timer() + stop_datetime = datetime.now() baseline = OrderedDict() baseline['SPLUNK_VERSION'] = full_docker_hub_container_name - baseline['SPLUNK_APPS'] = ','.join(SPLUNK_APPS) + baseline['SPLUNK_APPS'] = APPS_DICT baseline['TEST_START_TIME'] = str(start_datetime) + baseline['TEST_FINISH_TIME'] = str(stop_datetime) results_tracker.finish(baseline) #now we are done! - stop_time = timer() + print("Total Execution Time: [%s]"%(timedelta(seconds=stop_time - start_time, microseconds=0))) @@ -715,8 +723,11 @@ class SynchronizedResultsTracker: self.errors.append(detection) finally: self.lock.release() - def outputResultsFile(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict)->bool: + + + def outputResultsCSV(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict)->bool: success = True + print("Generating %s..."%(output_filename), end='') self.lock.acquire() @@ -724,7 +735,19 @@ class SynchronizedResultsTracker: with open(output_filename, 'w') as csvfile: header_writer = csv.writer(csvfile, quoting=csv.QUOTE_ALL) for key in baseline: - header_writer.writerow([key, baseline[key]]) + #Very basic support for pretty pritning dicts. Doesn't handle more than 1 nested dict + if type(baseline[key]) is OrderedDict: + header_writer.writerow([key, "-"]) + for nestedkey in baseline[key]: + header_writer.writerow([nestedkey, baseline[key][nestedkey]]) + #Basic support for 1 layer nested list. Doesn't handle more than 1. + elif type(baseline[key]) is list and len(baseline[key])>0: + header_writer.writerow([key, baseline[key][0]]) + for i in range(1,len(baseline[key])): + header_writer.writerow(['-', baseline[key][i]]) + + else: + header_writer.writerow([key, baseline[key]]) header_writer.writerow(['','']) csv_writer = csv.DictWriter(csvfile, fieldnames=field_names) csv_writer.writeheader() @@ -741,11 +764,29 @@ class SynchronizedResultsTracker: return success + def outputResultsJSON(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict)->bool: + success = True + try: + with open(output_filename, "w") as jsonFile: + json.dump({'baseline': baseline, 'results':data}, jsonFile, indent=" ") + except Exception as e: + print("There was an error generating [%s]: [%s]"%(output_filename, str(e))) + success = False + return success + def outputResultsFile(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict, output_json:bool=True, output_csv:bool=True)->bool: + success = True + if output_csv: + success |= self.outputResultsCSV(field_names, output_filename + ".csv", data, baseline) + if output_json: + success |= self.outputResultsJSON(field_names, output_filename + ".json", data, baseline) + return success + + def outputResultsFiles(self, baseline:OrderedDict, fields:list[str]=['detection_name', 'detection_file','runDuration','diskUsage', 'search_string', 'error', 'success', 'scanCount', 'detection_error'])->bool: - res = self.outputResultsFile(fields,"success.csv", self.successes, baseline) - res |= self.outputResultsFile(fields, "failures.csv", self.failures, baseline) - res |= self.outputResultsFile(fields, "errors.csv", self.errors, baseline) - res |= self.outputResultsFile(fields, "combined.csv", self.successes + self.failures + self.errors, baseline) + res = self.outputResultsFile(fields,"success", self.successes, baseline) + res |= self.outputResultsFile(fields, "failure", self.failures, baseline) + res |= self.outputResultsFile(fields, "error", self.errors, baseline) + res |= self.outputResultsFile(fields, "combined", self.successes + self.failures + self.errors, baseline) return res def finish(self, baseline:OrderedDict): diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 4559640228..eba0fae6f8 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -118,7 +118,7 @@ class GithubService: return filenames - def get_changed_test_files(self, folders=['endpoint', 'cloud', 'network'], ttps_to_test=["Anomaly","Hunting","TTP"], previously_successful_tests=[]): + def get_changed_test_files(self, folders=['endpoint', 'cloud', 'network'], ttps_to_test=["Anomaly","Hunting","TTP"], previously_successful_tests=[])->list[str]: branch1 = self.security_content_branch branch2 = 'develop' g = git.Git('security_content') @@ -137,6 +137,9 @@ class GithubService: # changed detections if 'detections' in file_path and os.path.basename(file_path).endswith('.yml'): changed_detection_files.append(file_path) + else: + print("Looking for changed detections by diffing [%s] against [%s]. Of course none were returned."%(branch1, branch2)) + return [] #all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters From 79833fccd036210940f0c2c35b32e27bcda37a82 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 1 Nov 2021 18:10:25 -0700 Subject: [PATCH 050/203] Fixed how OrderedDict is imported to hopefully fix CSV output format. --- .../ci/detection_testing_batch/detection_testing_execution.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 9a8bdd341b..3b96cc8329 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -20,8 +20,8 @@ from datetime import timedelta from datetime import datetime import string import shutil -from typing import OrderedDict, Union - +from typing import Union +from collections import OrderedDict from tempfile import mkdtemp import csv From 8c501e789da92d9a037b60af126b74644cc7df65 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 3 Nov 2021 16:18:41 -0700 Subject: [PATCH 051/203] Distribute testing amongst multiple containers. --- .../workflows/docker-detection-testing.yml | 86 +++++++- .../detection_testing_execution.py | 203 +++++++++++------- 2 files changed, 204 insertions(+), 85 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index d8a17d22f6..d1c57204fc 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -36,7 +36,7 @@ jobs: echo "No, this is not a dependabot run!" - docker-detection-testing: + docker-detection-testing-setup: runs-on: ubuntu-latest needs: [validate-tag-if-present, quit-for-dependabot] steps: @@ -77,7 +77,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate #python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 - python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n1 + python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n5 -split echo "DONE!" - name: Upload Test Results Files @@ -85,11 +85,77 @@ jobs: with: name: testing-results-files path: | - automated_detection_testing/ci/detection_testing_batch/success.csv - automated_detection_testing/ci/detection_testing_batch/error.csv - automated_detection_testing/ci/detection_testing_batch/failure.csv - automated_detection_testing/ci/detection_testing_batch/combined.csv - automated_detection_testing/ci/detection_testing_batch/success.json - automated_detection_testing/ci/detection_testing_batch/error.json - automated_detection_testing/ci/detection_testing_batch/failure.json - automated_detection_testing/ci/detection_testing_batch/combined.json \ No newline at end of file + automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz + automated_detection_testing/ci/detection_testing_batch/container_0_tests.txt + automated_detection_testing/ci/detection_testing_batch/container_1_tests.txt + automated_detection_testing/ci/detection_testing_batch/container_2_tests.txt + automated_detection_testing/ci/detection_testing_batch/container_3_tests.txt + automated_detection_testing/ci/detection_testing_batch/container_4_tests.txt + + + docker-detection-testing-execution: + runs-on: ubuntu-latest + needs: [validate-tag-if-present, quit-for-dependabot, docker-detection-testing-setup] + strategy: + matrix: + test_filename: ["container_0_tests.txt", "container_1_tests.txt", "container_2_tests.txt", "container_3_tests.txt", "container_4_tests.txt"] + steps: + - name: Get branch and PR required for detection testing main.py + id: vars + run: | + echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" + + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: testing-results-files + path: automated_detection_testing/ci/detection_testing_batch + - name: Install Docker + run: | + sudo apt update -qq + + + #python2.7 needed for slim, for now + sudo apt install python2 + sudo apt install virtualenv + curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + sudo python2.7 get-pip.py + + - uses: actions/setup-python@v2 + with: + python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install Python Dependencies + run: | + cd automated_detection_testing/ci/detection_testing_batch + python3 -m venv .venv + source .venv/bin/activate + python3 -m pip install wheel + python3 -m pip install -r requirements.txt + + - name: Run the CI + run: | + cd automated_detection_testing/ci/detection_testing_batch + source .venv/bin/activate + #python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 + python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m selected -tff ${{ matrix.test_filename}} -n1 -e DA-ESS-ContentUpdate-latest.tar.gz + + + - name: Upload Test Results Files + uses: actions/upload-artifact@v2 + with: + name: testing-results-files + path: | + automated_detection_testing/ci/detection_testing_batch/success.csv + automated_detection_testing/ci/detection_testing_batch/error.csv + automated_detection_testing/ci/detection_testing_batch/failure.csv + automated_detection_testing/ci/detection_testing_batch/combined.csv + automated_detection_testing/ci/detection_testing_batch/success.json + automated_detection_testing/ci/detection_testing_batch/error.json + automated_detection_testing/ci/detection_testing_batch/failure.json + automated_detection_testing/ci/detection_testing_batch/combined.json + \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 3b96cc8329..5bb27358f1 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -225,13 +225,19 @@ def main(args): parser.add_argument("-user", "--splunkbase_username", type=str, required=False, help="Splunkbase username for downloading Splunkbase apps") parser.add_argument("-pw", "--splunkbase_password", type=str, required=False, help="Splunkbase password for downloading Splunkbase apps") parser.add_argument("-m", "--mode", type=str, choices=DETECTION_MODES, required=False, help="Whether to test new detections, specific detections, or all detections", default="new") - parser.add_argument("-tf","--test_files", type=str, required=False, help="The names of files that you want to test, separated by commas.") + parser.add_argument("-tfl","--test_files_list", type=str, required=False, help="The names of files that you want to test, separated by commas.") + parser.add_argument("-tff","--test_files_file", type=argparse.FileType('r'), required=False, help="A file containing a list of detections to run, one per line") + parser.add_argument("-e","--escu_package", type=argparse.FileType('rb'), required=False, help="The ESCU file to use - will not generate a new ESCU package") parser.add_argument("-t", "--types", type=str, required=False, help="Detection types to test. Can be one of more of %s"%(str(DETECTION_TYPES)), default=','.join(DETECTION_TYPES)) parser.add_argument("-ct", "--container_tag", type=str, required=False, help="The tag of the Splunk Container to use. Tags are located at https://hub.docker.com/r/splunk/splunk/tags",default=DEFAULT_CONTAINER_TAG) parser.add_argument("-p", "--persist_security_content", required=False, default=False, action="store_true", help="Assumes security_content directory already exists. Don't check it out and overwrite it again. Saves "\ "time and allows you to test a detection that you've updated. Runs generate again in case you have "\ "updated macros or anything else. Especially useful for quick, local, iterative testing.") + + + parser.add_argument("-split","--split_detections_then_stop", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") + start_datetime = datetime.now() import requests.packages.urllib3 requests.packages.urllib3.disable_warnings() @@ -249,7 +255,7 @@ def main(args): interactive_failure = args.interactive_failure show_password = args.show_password splunk_password = args.container_password - + pregenerated_escu_package = args.escu_package @@ -289,9 +295,17 @@ def main(args): #Ensure that a valid mode was chosen mode = args.mode - if mode == "selected" and args.test_files == None: + if mode == "selected" and args.test_files_list is None and args.test_files_file is None: print("Error - mode [%s] but did not provide any files to test.\nQuitting..."%(mode)) - + sys.exit(1) + elif mode == "selected" and args.test_files_list is not None and args.test_files_file is not None: + print("Error - mode [%s] but you specified a list of detections to test AND a file of detections to test.\nQuitting..."%(mode)) + sys.exit(1) + elif mode == "selected" and args.test_files_list is not None: + command_line_files_to_test = [name.strip() for name in args.test_files_list.split(',')] + elif mode == "selected" and args.test_files_file is not None: + lines = args.test_files_file.readlines() + command_line_files_to_test = [l.strip() for l in lines] folders = [a.strip() for a in args.types.split(',')] for t in folders: @@ -345,6 +359,7 @@ def main(args): + if persist_security_content is True and os.path.exists("security_content"): print("******You chose --persist_security_content and the security_content directory exists. We will not check out the repo again. Please be aware, this could cause issues if you're out of date.******") @@ -378,8 +393,8 @@ def main(args): elif mode == "selected": if set(folders) != set(DETECTION_TYPES): print("You specified mode [%s] but also types: [%s]. We will ignore type restrictions and test all specified files"%(mode,str(folders))) - files_to_test = [name.strip() for name in args.test_files.split(',')] - test_files = github_service.get_selected_test_files(files_to_test, + + test_files = github_service.get_selected_test_files(command_line_files_to_test, previously_successful_tests=success_tests) else: @@ -393,85 +408,124 @@ def main(args): print("No files were found to be tested. Returning an error (should this return success?).\n\tQuitting...") sys.exit(1) - - - #Go into the security content directory - print("****GENERATE NEW CONTENT****") - os.chdir("security_content") - print(os.getcwd()) - if persist_security_content is False: - commands = ["python3 -m venv .venv", - ". ./.venv/bin/activate", - "python3 -m pip install wheel", - "python3 -m pip install -r requirements.txt", - "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] - else: - commands = ["s. ./.venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] - ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) - if ret.returncode != 0: - print("Error generating new content. Exiting...") - sys.exit(1) - print("New content generated successfully") - - - print("Generate new ESCU Package using new content") - if persist_security_content is True: - os.chdir("slim_packaging") - commands = ["cd slim-latest", - ". ./.venv/bin/activate", - "cp -R ../../dist/escu DA-ESS-ContentUpdate", - "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz ../apps/DA-ESS-ContentUpdate-latest.tar.gz"] - - else: - os.mkdir("slim_packaging") - os.chdir("slim_packaging") + local_volume_path = os.path.join(os.getcwd(), "apps") + try: os.mkdir("apps") + except FileExistsError as e: + #Directory already exists, do nothing + pass + except Exception as e: + print("Caught an error when copying the ESCU package [%s] to the apps folder [%s].\n\tQuitting..."%(pregenerated_escu_package.name, local_volume_path)) + sys.exit(1) + + if pregenerated_escu_package is None: + #Go into the security content directory + print("****GENERATE NEW CONTENT****") + os.chdir("security_content") + print(os.getcwd()) + if persist_security_content is False: + commands = ["python3 -m venv .venv", + ". ./.venv/bin/activate", + "python3 -m pip install wheel", + "python3 -m pip install -r requirements.txt", + "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + else: + commands = ["s. ./.venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) + if ret.returncode != 0: + print("Error generating new content. Exiting...") + sys.exit(1) + print("New content generated successfully") - try: - SPLUNK_PACKAGING_TOOLKIT_URL = "https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz" - SPLUNK_PACKAGING_TOOLKIT_FILENAME = 'splunk-packaging-toolkit-latest.tar.gz' - print("Downloading the Splunk Packaging Toolkit from %s..."%(SPLUNK_PACKAGING_TOOLKIT_URL), end='') - response = get(SPLUNK_PACKAGING_TOOLKIT_URL) - response.raise_for_status() - with open(SPLUNK_PACKAGING_TOOLKIT_FILENAME, 'wb') as slim_file: - slim_file.write(response.content) + + print("Generate new ESCU Package using new content") + if persist_security_content is True: + os.chdir("slim_packaging") + commands = ["cd slim-latest", + ". ./.venv/bin/activate", + "cp -R ../../dist/escu DA-ESS-ContentUpdate", + "slim package -o upload DA-ESS-ContentUpdate", + "cp upload/DA-ESS-ContentUpdate*.tar.gz %s"%(os.path.join(local_volume_path, "DA-ESS-ContentUpdate-latest.tar.gz" ))] + + else: + os.mkdir("slim_packaging") + os.chdir("slim_packaging") + os.mkdir("apps") - print("success") + try: + SPLUNK_PACKAGING_TOOLKIT_URL = "https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz" + SPLUNK_PACKAGING_TOOLKIT_FILENAME = 'splunk-packaging-toolkit-latest.tar.gz' + print("Downloading the Splunk Packaging Toolkit from %s..."%(SPLUNK_PACKAGING_TOOLKIT_URL), end='') + response = get(SPLUNK_PACKAGING_TOOLKIT_URL) + response.raise_for_status() + with open(SPLUNK_PACKAGING_TOOLKIT_FILENAME, 'wb') as slim_file: + slim_file.write(response.content) + + print("success") + except Exception as e: + print("FAILED") + print("Error downloading the Splunk Packaging Toolkit: [%s]"%(str(e))) + sys.exit(1) + + + commands = ["rm -rf slim-latest", + "mkdir slim-latest", + "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", + "cd slim-latest", + "virtualenv --python=/usr/bin/python2.7 --clear .venv", + ". ./.venv/bin/activate", + "python3 -m pip install --upgrade pip", + "python2 -m pip install wheel", + "python2 -m pip install semantic_version", + "python2 -m pip install .", + "cp -R ../../dist/escu DA-ESS-ContentUpdate", + "slim package -o upload DA-ESS-ContentUpdate", + "cp upload/DA-ESS-ContentUpdate*.tar.gz %s"%(os.path.join(local_volume_path, "DA-ESS-ContentUpdate-latest.tar.gz" ))] + + + + + ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) + if ret.returncode != 0: + print("Error generating new ESCU Package.\n\tQuitting..."%()) + sys.exit(1) + os.chdir("../..") + print("New ESCU Package generated successfully") + else: + print("Using previous generated ESCU package: [%s]"%(pregenerated_escu_package.name)) + try: + with open(os.path.join(local_volume_path, os.path.basename(pregenerated_escu_package.name)),'wb') as escu_package: + escu_package.write(pregenerated_escu_package.read()) except Exception as e: - print("FAILED") - print("Error downloading the Splunk Packaging Toolkit: [%s]"%(str(e))) + print("Failure writing the ESCU package [%s] to [%s]: [%s].\n\tQuitting..."%(pregenerated_escu_package.name, local_volume_path, str(e))) sys.exit(1) - - commands = ["rm -rf slim-latest", - "mkdir slim-latest", - "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", - "cd slim-latest", - "virtualenv --python=/usr/bin/python2.7 --clear .venv", - ". ./.venv/bin/activate", - "python3 -m pip install --upgrade pip", - "python2 -m pip install wheel", - "python2 -m pip install semantic_version", - "python2 -m pip install .", - "cp -R ../../dist/escu DA-ESS-ContentUpdate", - "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz ../apps/DA-ESS-ContentUpdate-latest.tar.gz"] + + print("Wrote ESCU package to volume.") + if args.split_detections_then_stop: + for output_file_index in range(0,num_containers): + fname = "container_%d_tests.txt"%(output_file_index) + print("Writing tests to [%s]..."%(fname), end='') + with open(fname, "w") as output_file: + detection_tests = test_files[output_file_index::num_containers] + normalized_detection_names = [] + for d in detection_tests: + filename = os.path.basename(d) + filename = filename.replace(".test.yml", ".yml") + leading = os.path.split(d)[0] + leading = leading.replace("tests/", "detections/") + new_name = os.path.join("security_content", leading, filename) + normalized_detection_names.append(new_name) + output_file.write('\n'.join(normalized_detection_names)) + print("Done", end='') + sys.exit(0) + - ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) - if ret.returncode != 0: - print("Error generating new ESCU Package.\n\tQuitting..."%()) - sys.exit(1) - os.chdir("../..") - print("New ESCU Package generated successfully") - - - @@ -486,7 +540,7 @@ def main(args): results_tracker = SynchronizedResultsTracker(test_files, num_containers) - local_volume_path = os.path.join(os.getcwd(), "security_content", "slim_packaging","apps") + @@ -509,7 +563,6 @@ def main(args): try: - raise BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser("~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") shutil.copyfile(BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH, os.path.join(local_volume_path, "Splunk_TA_microsoft_sysmon-1.0.2-B1.spl")) From c4c1db1f2cf75b77df05ccd09f6b7fbcb0ef13de Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 3 Nov 2021 16:30:02 -0700 Subject: [PATCH 052/203] Fixed up the pathing related to the ESCU Package. --- .github/workflows/docker-detection-testing.yml | 8 ++++---- .../detection_testing_execution.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index d1c57204fc..3eb30e0540 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -83,7 +83,7 @@ jobs: - name: Upload Test Results Files uses: actions/upload-artifact@v2 with: - name: testing-results-files + name: testing-results-config path: | automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz automated_detection_testing/ci/detection_testing_batch/container_0_tests.txt @@ -111,8 +111,8 @@ jobs: - name: Download artifacts uses: actions/download-artifact@v2 with: - name: testing-results-files - path: automated_detection_testing/ci/detection_testing_batch + name: testing-results-config + path: automated_detection_testing/ci/detection_testing_batch/prior_config - name: Install Docker run: | sudo apt update -qq @@ -142,7 +142,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate #python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 - python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m selected -tff ${{ matrix.test_filename}} -n1 -e DA-ESS-ContentUpdate-latest.tar.gz + python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m selected -tff prior_config/${{ matrix.test_filename}} -n1 -e prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz - name: Upload Test Results Files diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 5bb27358f1..10deb2ed9e 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -522,7 +522,7 @@ def main(args): new_name = os.path.join("security_content", leading, filename) normalized_detection_names.append(new_name) output_file.write('\n'.join(normalized_detection_names)) - print("Done", end='') + print("Done") sys.exit(0) From 6592124a12f861753651dc6afd3c705d9eef8eae Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 3 Nov 2021 16:49:57 -0700 Subject: [PATCH 053/203] Uploading the artifacts as different names so that they don't clobber each other. --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 3eb30e0540..4ec66abf06 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -148,7 +148,7 @@ jobs: - name: Upload Test Results Files uses: actions/upload-artifact@v2 with: - name: testing-results-files + name: ${{ matrix.test_filename}}.results path: | automated_detection_testing/ci/detection_testing_batch/success.csv automated_detection_testing/ci/detection_testing_batch/error.csv From 522e2d03a650e61c527238920f8e24bd25837b74 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 3 Nov 2021 19:09:16 -0700 Subject: [PATCH 054/203] Changed the testing script to test everything. This is a test to see how long it takes. --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 4ec66abf06..5898369c64 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -77,7 +77,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate #python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 - python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n5 -split + python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m all -n5 -split echo "DONE!" - name: Upload Test Results Files From 22656ffe23460649495c1dff588d2441fa4c186a Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 5 Nov 2021 14:57:46 -0700 Subject: [PATCH 055/203] typo in NEEDS for test script. --- .../workflows/docker-detection-testing.yml | 90 ++++++++++++++++++- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 5898369c64..ae9cf277a4 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -77,7 +77,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate #python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 - python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m all -n5 -split + python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n10 -split echo "DONE!" - name: Upload Test Results Files @@ -91,6 +91,11 @@ jobs: automated_detection_testing/ci/detection_testing_batch/container_2_tests.txt automated_detection_testing/ci/detection_testing_batch/container_3_tests.txt automated_detection_testing/ci/detection_testing_batch/container_4_tests.txt + automated_detection_testing/ci/detection_testing_batch/container_5_tests.txt + automated_detection_testing/ci/detection_testing_batch/container_6_tests.txt + automated_detection_testing/ci/detection_testing_batch/container_7_tests.txt + automated_detection_testing/ci/detection_testing_batch/container_8_tests.txt + automated_detection_testing/ci/detection_testing_batch/container_9_tests.txt docker-detection-testing-execution: @@ -98,7 +103,16 @@ jobs: needs: [validate-tag-if-present, quit-for-dependabot, docker-detection-testing-setup] strategy: matrix: - test_filename: ["container_0_tests.txt", "container_1_tests.txt", "container_2_tests.txt", "container_3_tests.txt", "container_4_tests.txt"] + test_filename: ["container_0_tests.txt", + "container_1_tests.txt", + "container_2_tests.txt", + "container_3_tests.txt", + "container_4_tests.txt", + "container_5_tests.txt", + "container_6_tests.txt", + "container_7_tests.txt", + "container_8_tests.txt", + "container_9_tests.txt"] steps: - name: Get branch and PR required for detection testing main.py id: vars @@ -158,4 +172,74 @@ jobs: automated_detection_testing/ci/detection_testing_batch/error.json automated_detection_testing/ci/detection_testing_batch/failure.json automated_detection_testing/ci/detection_testing_batch/combined.json - \ No newline at end of file + + docker-detection-testing-execution-merge-results: + runs-on: ubuntu-latest + needs: [validate-tag-if-present, quit-for-dependabot, docker-detection-testing-setup, docker-detection-testing-execution] + + steps: + - name: Get branch and PR required for detection testing main.py + id: vars + run: | + echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" + + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: container_0_tests.txt.results + path: automated_detection_testing/ci/detection_testing_batch/results + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: container_1_tests.txt.results + path: automated_detection_testing/ci/detection_testing_batch/results + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: container_2_tests.txt.results + path: automated_detection_testing/ci/detection_testing_batch/results + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: container_3_tests.txt.results + path: automated_detection_testing/ci/detection_testing_batch/results + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: container_4_tests.txt.results + path: automated_detection_testing/ci/detection_testing_batch/results + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: container_5_tests.txt.results + path: automated_detection_testing/ci/detection_testing_batch/results + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: container_6_tests.txt.results + path: automated_detection_testing/ci/detection_testing_batch/results + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: container_7_tests.txt.results + path: automated_detection_testing/ci/detection_testing_batch/results + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: container_8_tests.txt.results + path: automated_detection_testing/ci/detection_testing_batch/results + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: container_9_tests.txt.results + path: automated_detection_testing/ci/detection_testing_batch/results + + - name: Merge Detections into single File + run: | + cd automated_detection_testing/ci/detection_testing_batch/results + ls -lah + echo "DONE!" + From 89b2ac1e4d849fb5e17e92ab512dc47b8c74ac48 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 5 Nov 2021 15:32:28 -0700 Subject: [PATCH 056/203] Added a script to summarize the runs of multiple runners and merge them together. Results are uploaded into a single artifact. --- .../workflows/docker-detection-testing.yml | 37 +++++++++----- .../detection_testing_batch/summarize_json.py | 51 +++++++++++++++++++ 2 files changed, 75 insertions(+), 13 deletions(-) create mode 100644 automated_detection_testing/ci/detection_testing_batch/summarize_json.py diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index ae9cf277a4..ef09efb5a4 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -190,56 +190,67 @@ jobs: uses: actions/download-artifact@v2 with: name: container_0_tests.txt.results - path: automated_detection_testing/ci/detection_testing_batch/results + path: automated_detection_testing/ci/detection_testing_batch/results_0 - name: Download artifacts uses: actions/download-artifact@v2 with: name: container_1_tests.txt.results - path: automated_detection_testing/ci/detection_testing_batch/results + path: automated_detection_testing/ci/detection_testing_batch/results_1 - name: Download artifacts uses: actions/download-artifact@v2 with: name: container_2_tests.txt.results - path: automated_detection_testing/ci/detection_testing_batch/results + path: automated_detection_testing/ci/detection_testing_batch/results_2 - name: Download artifacts uses: actions/download-artifact@v2 with: name: container_3_tests.txt.results - path: automated_detection_testing/ci/detection_testing_batch/results + path: automated_detection_testing/ci/detection_testing_batch/results_3 - name: Download artifacts uses: actions/download-artifact@v2 with: name: container_4_tests.txt.results - path: automated_detection_testing/ci/detection_testing_batch/results + path: automated_detection_testing/ci/detection_testing_batch/results_4 - name: Download artifacts uses: actions/download-artifact@v2 with: name: container_5_tests.txt.results - path: automated_detection_testing/ci/detection_testing_batch/results + path: automated_detection_testing/ci/detection_testing_batch/results_5 - name: Download artifacts uses: actions/download-artifact@v2 with: name: container_6_tests.txt.results - path: automated_detection_testing/ci/detection_testing_batch/results + path: automated_detection_testing/ci/detection_testing_batch/results_6 - name: Download artifacts uses: actions/download-artifact@v2 with: name: container_7_tests.txt.results - path: automated_detection_testing/ci/detection_testing_batch/results + path: automated_detection_testing/ci/detection_testing_batch/results_7 - name: Download artifacts uses: actions/download-artifact@v2 with: name: container_8_tests.txt.results - path: automated_detection_testing/ci/detection_testing_batch/results + path: automated_detection_testing/ci/detection_testing_batch/results_8 - name: Download artifacts uses: actions/download-artifact@v2 with: name: container_9_tests.txt.results - path: automated_detection_testing/ci/detection_testing_batch/results + path: automated_detection_testing/ci/detection_testing_batch/results_9 + - uses: actions/setup-python@v2 + with: + python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + - name: Merge Detections into single File run: | - cd automated_detection_testing/ci/detection_testing_batch/results - ls -lah - echo "DONE!" + cd automated_detection_testing/ci/detection_testing_batch + python summarize_json.py --files results_*/combined.json --output_filename summary_test_results.json + + - name: Upload Summary Test Results JSON + uses: actions/upload-artifact@v2 + with: + name: SummaryTestResults + path: | + automated_detection_testing/ci/detection_testing_batch/summary_test_results.json \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py new file mode 100644 index 0000000000..102252495a --- /dev/null +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -0,0 +1,51 @@ +import json +from collections import OrderedDict +import argparse +import sys +import json +def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict)->bool: + success = True + try: + with open(output_filename, "w") as jsonFile: + json.dump({'baseline': baseline, 'results':data}, jsonFile, indent=" ") + except Exception as e: + print("There was an error generating [%s]: [%s]"%(output_filename, str(e))) + success = False + return success + + + +parser = argparse.ArgumentParser(description="Results Merger") +parser.add_argument('-f', '--files', type=argparse.FileType('r'), required=True, nargs='+', help="The json files you would like to combine into a single file") +parser.add_argument('-o', '--output_filename', type=str, required=True, help="The name of the output file") +args = parser.parse_args() + +all_data = OrderedDict() +try: + for f in args.files: + if not f.name.endswith('.json'): + print("Error: passed in file must end in .json - you passed in [%s].\n\tQuitting..."%(f.name)) + sys.exit(1) + data = json.loads(f.read()) + if 'baseline' in all_data: + #everything has the same baseline, only need to do it once + pass + else: + all_data['baseline'] = data['baseline'] + if 'results' in all_data: + #this is a list of dictionaries, so add to it + all_data['results'].extend(data['results']) + else: + all_data['results'] = data['results'] + + outputResultsJSON(args.output_filename, all_data['results'], all_data['baseline']) + print("Successfully summarized [%d] detections!"%(len(all_data['results']))) +except Exception as e: + print("Error writing the summary file: [%s].\n\tQuitting..."%(str(e))) + sys.exit(1) + + + + + + From 0a3d51430656814ae53d1aab7e7b696291305942 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 10 Nov 2021 11:46:22 -0800 Subject: [PATCH 057/203] Small changes before large refactor --- .../detection_testing_batch/detection_testing_execution.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 10deb2ed9e..cd06198e3a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -252,6 +252,7 @@ def main(args): splunkbase_username = args.splunkbase_username splunkbase_password = args.splunkbase_password full_docker_hub_container_name = "splunk/splunk:%s"%args.container_tag + #full_docker_hub_container_name = "customimage" interactive_failure = args.interactive_failure show_password = args.show_password splunk_password = args.container_password @@ -826,6 +827,7 @@ class SynchronizedResultsTracker: print("There was an error generating [%s]: [%s]"%(output_filename, str(e))) success = False return success + def outputResultsFile(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict, output_json:bool=True, output_csv:bool=True)->bool: success = True if output_csv: @@ -974,7 +976,8 @@ def splunk_container_manager(testing_object:SynchronizedResultsTracker, containe print("Container [%s] setup complete and waiting for other containers to be ready..."%(container_name)) testing_object.start_barrier.wait() wait_for_splunk_ready(container_name, splunk_web_port,splunk_ip, max_seconds=300) - + #print("\n\n\nLONG WAIT FOR THE EXPORT PLEASE \n\n\n\n") + #time.sleep(3600) while True: #Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1,30)) From b20d34c6a2652578f24c161ddf68a88535b8216a Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 12 Nov 2021 15:32:02 -0800 Subject: [PATCH 058/203] Huge changes to refactor docker based detection testing. Broke down massive testing file into smaller files. Not running or tested yet, but in progress. --- .../detection_testing_execution.py | 441 +----------------- .../modules/container_manager.py | 108 +++++ .../modules/image_manager.py | 50 ++ .../modules/splunk_container.py | 338 ++++++++++++++ .../modules/test_driver.py | 228 +++++++++ .../detection_testing_batch/requirements.txt | 3 +- 6 files changed, 731 insertions(+), 437 deletions(-) create mode 100644 automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py create mode 100644 automated_detection_testing/ci/detection_testing_batch/modules/image_manager.py create mode 100644 automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py create mode 100644 automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index cd06198e3a..a0f594e255 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -51,43 +51,8 @@ DETECTION_TYPES = ['endpoint', 'cloud', 'network'] DETECTION_MODES = ['new', 'all', 'selected'] -#taken from attack_range -def get_random_password()->str: - random_source = string.ascii_letters + string.digits - password = random.choice(string.ascii_lowercase) - password += random.choice(string.ascii_uppercase) - password += random.choice(string.digits) - for i in range(random.randrange(16,26)): - password += random.choice(random_source) - - password_list = list(password) - random.SystemRandom().shuffle(password_list) - password = ''.join(password_list) - return password - - -def wait_for_splunk_ready(container_name:str, splunk_web_port:int, splunk_ip:str="127.0.0.1", max_seconds:int=300)->bool: - #The smarter version of this will try to hit one of the pages, - #probably the login page, and when that is available it means that - #splunk is fully started and ready to go. Until then, we just - #use a simple sleep - splunk_ready_url = "http://%s:%d"%(splunk_ip, splunk_web_port) - print(splunk_ready_url) - start = timer() - while True: - try: - #Splunk container will not have proper ssl certificate - response = get(splunk_ready_url,timeout=5, verify=False) - response.raise_for_status() - return True - except Exception as e: - elapsed = timer() - start - if elapsed > max_seconds: - raise(Exception("Container [%s] took longer than maximum start time of [%d].\n\tQuitting..."%(container_name, max_seconds))) - time.sleep(5) - @@ -95,102 +60,6 @@ def wait_for_splunk_ready(container_name:str, splunk_web_port:int, splunk_ip:str -def setup_image(client: DockerClient, reuse_images: bool, container_name: str) -> None: - if not reuse_images: - #Check to see if the image exists. If it does, then remove it. If it does not, then do nothing - docker_image = None - try: - docker_image = client.images.get(container_name) - except Exception as e: - #We don't need to do anything, the image did not exist on our system - print("Image named [%s] did not exist, so we don't need to try and remove it."%(container_name)) - if docker_image != None: - #We found the image. Let's try to delete it - print("Found docker image named [%s] and you have requested that we forcefully remove it"%(container_name)) - try: - client.images.remove(image=container_name, force=True, noprune=False) - print("Docker image named [%s] forcefully removed"%(container_name)) - except Exception as e: - print("Error forcefully removing [%s]"%(container_name)) - raise(e) - - #See if the image exists. If it doesn't, then pull it from Docker Hub - docker_image = None - try: - docker_image = client.images.get(container_name) - print("Docker image [%s] found, no need to download it."%(container_name)) - except Exception as e: - #Image did not exist on the system - docker_image = None - - if docker_image is None: - #We did not find the image, so pull it - try: - print("Downloading image [%s]. Please note " - "that this could take a long time depending on your " - "connection. It's around 2GB."%(container_name)) - pull_start_time = timer() - client.images.pull(container_name) - pull_finish_time = timer() - print("Successfully pulled the docker image [%s] in %ss"% - (container_name, - timedelta(seconds=pull_finish_time - pull_start_time, microseconds=0) )) - - except Exception as e: - print("There was an error trying to pull the image [%s]: [%s]"%(container_name,str(e))) - raise(e) - -def remove_existing_containers(client: DockerClient, reuse_containers: bool, container_template: str, num_containers: int, forceRemove: bool=True) -> bool: - if reuse_containers is True: - #Check to make sure that all of the requested containers exist - for index in range(0, num_containers): - container_name = container_template%(index) - print("Checking for the existence of container named [%s]"%(container_name)) - try: - this_container = client.containers.get(container_name) - except Exception as e: - print("Failed to find a container named [%s]"%(container_name)) - reuse_containers = False - break - try: - #Make sure that the container is stopped - print("Found [%s]. Stopping container..."%(container_name)) - this_container.stop() - except Exception as e: - print("Failed to stop a container named [%s]"%(container_name)) - reuse_containers = False - break - print("Found all of the containers, we will reuse them") - return True - - #Note that this variable can be changed by the block above, so don't - #convert this into an if/else. Note that this IF is for verbosity: - - if reuse_containers is False: - for index in range(0,num_containers): - container_name = container_template%(index) - removeContainer(client, container_name, forceRemove) - return False - else: - raise(Exception("Error removing existing containers")) - -def removeContainer(client: DockerClient, container_name:str, forceRemove:bool=True)->bool: - print("Trying to remove container [%s]"%(container_name)) - try: - container = client.containers.get(container_name) - except Exception as e: - print("Could not find Docker Container [%s]. Container does not exist, so no need to remove it"%(container_name)) - return True - try: - #container was found, so now we try to remove it - #v also removes volumes linked to the container - container.remove(v=True, force=forceRemove) #remove it even if it is running. remove volumes as well - print("Successfully removed Docker Container [%s]"%(container_name)) - return True - except Exception as e: - print("Could not remove Docker Container [%s]"%(container_name)) - raise(Exception("CONTAINER REMOVE ERROR")) - @@ -209,10 +78,11 @@ def main(args): parser.add_argument("-b", "--branch", type=str, required=True, help="security content branch") parser.add_argument("-u", "--uuid", type=str, required=True, help="uuid for detection test") parser.add_argument("-pr", "--pr-number", type=int, required=False, help="Pull Request Number") + parser.add_argument("-n", "--num_containers", required=False, type=int, default=1, help="The number of splunk docker containers to start and run for testing") parser.add_argument("-cw", "--container_password", required=False, help="A password to use for the container. If you don't choose one, a complex one will be generated for you.") - parser.add_argument("-show", "--show_password", required=False, default=False, action='store_true', help="Show the generated password to use to login to splunk. For an CI/CD run, you probably don't want this.") + parser.add_argument("-show", "--show_password", required=False, default=False, action='store_true', help="Show the generated password to use to login to splunk. For a CI/CD run, you probably don't want this.") parser.add_argument("-i", "--interactive_failure", required=False, default=False, action='store_true', help="If a test fails, should we pause before removing data so that the search can be debugged?") parser.add_argument("-ri", "--reuse_image", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") @@ -709,315 +579,14 @@ def main(args): #testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) -def copy_file_to_container(localFilePath, remoteFilePath, containerName, sleepTimeSeconds=5): - successful_copy = False - #need to use the low level client to put a file onto a container - apiclient = docker.APIClient() - while not successful_copy: - try: - with open(localFilePath,"rb") as fileData: - #splunk will restart a few times will installation of apps takes place so it will reload its indexes... - apiclient.put_archive(container=containerName, path=remoteFilePath, data=fileData) - successful_copy=True - except Exception as e: - #print("Failed copy of [%s] file to CONTAINER:[%s]...we will try again"%(localFilePath, containerName)) - time.sleep(10) - successful_copy=False - print("Successfully copied [%s] to [%s] on [%s]"%(localFilePath, remoteFilePath, containerName)) -class SynchronizedResultsTracker: - def __init__(self, tests:list[str], num_containers:int): - #Create the queue and enque all of the tests - self.testing_queue = queue.Queue() - for test in tests: - self.testing_queue.put(test) - - self.total_number_of_tests = self.testing_queue.qsize() - #Creates a lock that will be used to synchronize access to this object - self.lock = threading.Lock() - self.start_time = timer() - self.failures = [] - self.successes = [] - self.errors = [] - self.container_ready_time = None - - #Just make a random folder to store attack data that we donwload - self.attack_data_root_folder = mkdtemp(prefix="attack_data_", dir=os.getcwd()) - print("Attack data for this run will be stored at: [%s]"%(self.attack_data_root_folder)) - self.start_barrier = threading.Barrier(num_containers) - - def getTest(self)-> Union[str,None]: - try: - return self.testing_queue.get(block=False) - except Exception as e: - print("Testing queue empty!") - return None - - def addSuccess(self, result:dict)->None: - print("Test PASSED for detection: [%s --> %s"%(result['detection_name'], result['detection_file'])) - self.lock.acquire() - try: - self.successes.append(result) - finally: - self.lock.release() - - - def addFailure(self, result:dict)->None: - print("Test FAILED for detection: [%s --> %s"%(result['detection_name'], result['detection_file'])) - self.lock.acquire() - try: - self.failures.append(result) - finally: - self.lock.release() - - def addError(self, detection:dict)->None: - self.lock.acquire() - try: - self.errors.append(detection) - finally: - self.lock.release() - - - def outputResultsCSV(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict)->bool: - success = True - - print("Generating %s..."%(output_filename), end='') - self.lock.acquire() - - try: - with open(output_filename, 'w') as csvfile: - header_writer = csv.writer(csvfile, quoting=csv.QUOTE_ALL) - for key in baseline: - #Very basic support for pretty pritning dicts. Doesn't handle more than 1 nested dict - if type(baseline[key]) is OrderedDict: - header_writer.writerow([key, "-"]) - for nestedkey in baseline[key]: - header_writer.writerow([nestedkey, baseline[key][nestedkey]]) - #Basic support for 1 layer nested list. Doesn't handle more than 1. - elif type(baseline[key]) is list and len(baseline[key])>0: - header_writer.writerow([key, baseline[key][0]]) - for i in range(1,len(baseline[key])): - header_writer.writerow(['-', baseline[key][i]]) - - else: - header_writer.writerow([key, baseline[key]]) - header_writer.writerow(['','']) - csv_writer = csv.DictWriter(csvfile, fieldnames=field_names) - csv_writer.writeheader() - for row in data: - csv_writer.writerow(row) - print("Done with [%d] detections"%(len(data))) - - except Exception as e: - print("Failure writing to CSV file for [%s]:"%(output_filename, str(e))) - success = False - - finally: - self.lock.release() - - return success - - def outputResultsJSON(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict)->bool: - success = True - try: - with open(output_filename, "w") as jsonFile: - json.dump({'baseline': baseline, 'results':data}, jsonFile, indent=" ") - except Exception as e: - print("There was an error generating [%s]: [%s]"%(output_filename, str(e))) - success = False - return success - - def outputResultsFile(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict, output_json:bool=True, output_csv:bool=True)->bool: - success = True - if output_csv: - success |= self.outputResultsCSV(field_names, output_filename + ".csv", data, baseline) - if output_json: - success |= self.outputResultsJSON(field_names, output_filename + ".json", data, baseline) - return success - - - def outputResultsFiles(self, baseline:OrderedDict, fields:list[str]=['detection_name', 'detection_file','runDuration','diskUsage', 'search_string', 'error', 'success', 'scanCount', 'detection_error'])->bool: - res = self.outputResultsFile(fields,"success", self.successes, baseline) - res |= self.outputResultsFile(fields, "failure", self.failures, baseline) - res |= self.outputResultsFile(fields, "error", self.errors, baseline) - res |= self.outputResultsFile(fields, "combined", self.successes + self.failures + self.errors, baseline) - return res - - def finish(self, baseline:OrderedDict): - self.cleanup() - self.outputResultsFiles(baseline) - - - def cleanup(self): - self.lock.acquire() - try: - print("Removing all attack data that was downloaded during this test at: [%s]"%(self.attack_data_root_folder)) - shutil.rmtree(self.attack_data_root_folder) - print("Successfully removed all attack data") - finally: - self.lock.release() - def summarize(self)->bool: - - self.lock.acquire() - - try: - current_time = timer() - if self.testing_queue.qsize() == self.total_number_of_tests: - #Testing has not started yet. We are setting up containers - print("***********PROGRESS UPDATE***********\n"\ - "\tWaiting for container setup: %s"%(timedelta(seconds=current_time - self.start_time))) - else: - if self.container_ready_time is None: - #This is the first status update since container setup has completed. Get the current time. - #This makes our remaining time estimates better since that estimate should not involve - #the container setup time - self.container_ready_time = current_time - - numberOfCompletedTests = len(self.successes) + len(self.failures) + len(self.errors) - remaining_tests = self.testing_queue.qsize() - testsCurrentlyRunning = self.total_number_of_tests - remaining_tests - numberOfCompletedTests - total_execution_time_seconds = current_time - self.start_time - - test_execution_time_seconds = current_time - self.container_ready_time - - - if numberOfCompletedTests == 0 or test_execution_time_seconds == 0: - estimated_seconds_to_finish_all_tests = "UNKNOWN" - estimated_completion_time_seconds = "UNKNOWN" - else: - average_time_per_test = test_execution_time_seconds / numberOfCompletedTests - #divide testsCurrentlyRunning by 2.0 because, on average, each running test will be 50% completed - estimated_seconds_to_finish_all_tests = average_time_per_test * (remaining_tests + testsCurrentlyRunning/2.0) - estimated_completion_time_seconds = timedelta(seconds=estimated_seconds_to_finish_all_tests) - - - - - print("***********PROGRESS UPDATE***********\n"\ - "\tElapsed Time : %s\n"\ - "\tEstimated Remaining Time : %s\n"\ - "\tTests to run : %d\n"\ - "\tTests currently running : %d\n"\ - "\tTests completed : %d\n"\ - "\t\tSuccess : %d\n"\ - "\t\tFailure : %d\n"\ - "\t\tError : %d"%(timedelta(seconds=total_execution_time_seconds), - estimated_completion_time_seconds, - remaining_tests, - testsCurrentlyRunning, - numberOfCompletedTests, - len(self.successes), - len(self.failures), - len(self.errors))) - - except Exception as e: - print("Error in printing execution summary: [%s]"%(str(e))) - finally: - self.lock.release() - - #Return true while there are tests remaining - return (self.total_number_of_tests - - (len(self.successes) + len(self.failures) + len(self.errors)) > 0) - - - def addResult(self, result:dict)->None: - try: - if result['detection_result']['success'] is False: - #This is actually a failure of the detection, not an error. Naming is confusiong - self.addFailure(result['detection_result']) - elif result['detection_result']['success'] is True: - self.addSuccess(result['detection_result']) - except Exception as e: - #Neither a success or a failure, so add the object to the failures queue - self.addError({'detection_file':"Unknown File", "detection_error":str(result)}) - - - -def splunk_container_manager(testing_object:SynchronizedResultsTracker, container_name, splunk_ip, splunk_password, splunk_web_port, splunk_management_port, uuid_test, interactive_failure:bool=False): - print("Starting the container [%s] after a sleep"%(container_name)) - #Is this going to be safe to use in different threads - client = docker.client.from_env() - - #start up the container from the base container - #Assume that the base container has already been fully built with - #escu etc - #sleep for a little bit so that we don't all start at once... - - - container = client.containers.get(container_name) - - print("Starting the container [%s]"%(container_name)) - - - - container.start() - print("Start copying files to container: [%s]"%(container_name)) - copy_file_to_container(index_file_local_path, index_file_container_path, container_name) - #The below copy will fail until the CIM app is installed. This app MUST be installed last! - #If we install it earlier, we will get ahead of ourselves and start doing tests before the container - #is truly ready for testing and all apps have been installed - copy_file_to_container(datamodel_file_local_path, datamodel_file_container_path, container_name) - print("Finished copying files to container: [%s]"%(container_name)) - - - - from modules.splunk_sdk import enable_delete_for_admin - print("Enabling DELETE for [%s]"%(container_name)) - try: - while not enable_delete_for_admin(splunk_ip, splunk_management_port, splunk_password): - time.sleep(10) - except Exception as e: - print("Failure enabling DELETE for container [%s]: [%s].\n\tQuitting..."%(container_name, str(e))) - - print("Successfully enabled DELETE for [%s]"%(container_name)) - - #Wait for all of the threads to join here - print("Container [%s] setup complete and waiting for other containers to be ready..."%(container_name)) - testing_object.start_barrier.wait() - wait_for_splunk_ready(container_name, splunk_web_port,splunk_ip, max_seconds=300) - #print("\n\n\nLONG WAIT FOR THE EXPORT PLEASE \n\n\n\n") - #time.sleep(3600) - while True: - #Sleep for a small random time so that containers drift apart and don't synchronize their testing - time.sleep(random.randint(1,30)) - #Try to get something from the queue - detection_to_test = testing_object.getTest() - if detection_to_test is None: - try: - print("Container [%s] has finished running detections, time to stop the container."%(container_name)) - container.stop() - print("Container [%s] successfully stopped"%(container_name)) - #remove the container - removeContainer(client, container_name, forceRemove=True) - except Exception as e: - print("Error stopping or removing the container: [%s]"%(str(e))) - - return None - - #There is a detection to test - print("Container [%s]--->[%s]"%(container_name, detection_to_test)) - try: - result = testing_service.test_detection_wrapper(container_name, splunk_ip, splunk_password, splunk_management_port, detection_to_test, 0, uuid_test, testing_object.attack_data_root_folder, wait_on_failure=interactive_failure) - testing_object.addResult(result) - - #Remove the data from the test that we just ran. We MUST do this when running on CI because otherwise, we will download - #a massive amount of data over the course of a long path and will run out of space on the relatively small CI runner drive - shutil.rmtree(result['attack_data_directory']) - except Exception as e: - print("Warning - uncaught error in detection test for [%s] - this should not happen: [%s]"%(detection_to_test, str(e))) - testing_object.addError({"detection_file":detection_to_test,"detection_error":str(e)}) -def queue_status_thread(status_object:SynchronizedResultsTracker)->None: - #This will run forever by design - print("start status") - while True: - if status_object.summarize() == False: - #There are no more tests to run, so we can return from this thread - return None - time.sleep(10) + + + if __name__ == "__main__": main(sys.argv[1:]) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py new file mode 100644 index 0000000000..46dce75552 --- /dev/null +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -0,0 +1,108 @@ +from collections import OrderedDict +import docker +import docker.types +import random +import splunk_container +import string +from typing import Union + +WEB_PORT_STRING = "8000/tcp" +MANAGEMENT_PORT_STRING = "8089/tcp" + + +class ContainerManager: + def __init__( + self, + container_name_template: str, + num_containers: int, + apps: list[dict], + files_to_copy_to_container:OrderedDict=OrderedDict(), + web_port_start: int = 8000, + management_port_start: int = 8089, + mounts: list[dict[str, Union[str, bool]]] = [], + container_password: Union[str, None] = None, + splunkbase_username: Union[str, None] = None, + splunkbase_password: Union[str, None] = None, + ): + self.mounts = self.create_mounts(mounts) + self.apps = apps + self.client = docker.from_env() + + if container_password is None: + self.container_password = self.get_random_password() + else: + self.container_password = container_password + + self.create_containers( + container_name_template, + num_containers, + web_port_start, + management_port_start, + splunkbase_username, + splunkbase_password, + ) + + def create_containers( + self, + container_name_template: str, + num_containers: int, + web_port_start: int, + management_port_start: int, + splunkbase_username: Union[str, None] = None, + splunkbase_password: Union[str, None] = None, + ) -> list[splunk_container.SplunkContainer]: + new_containers = [] + for index in range(num_containers): + container_name = container_name_template % index + web_port = (WEB_PORT_STRING, web_port_start + index) + management_port = (MANAGEMENT_PORT_STRING, management_port_start + index) + + new_containers.append( + splunk_container.SplunkContainer( + self.client, + container_name, + self.apps, + web_port, + management_port, + self.container_password, + files_to_copy_to_container, + self.mounts, + splunkbase_username, + splunkbase_password, + ) + ) + + return new_containers + + def create_mounts( + self, mounts: list[dict[str, Union[str, bool]]] + ) -> list[docker.types.Mount]: + new_mounts = [] + for mount in mounts: + new_mounts.append(self.create_mount(mount)) + return new_mounts + + def create_mount(self, mount: dict[str, Union[str, bool]]) -> docker.types.Mount: + return docker.types.Mount( + source=mount["local_path"], + target=mount["container_path"], + type=mount["type"], + read_only=mount["read_only"], + ) + + # taken from attack_range + def get_random_password( + self, password_min_length: int = 16, password_max_length: int = 26 + ) -> str: + random_source = string.ascii_letters + string.digits + password = random.choice(string.ascii_lowercase) + password += random.choice(string.ascii_uppercase) + password += random.choice(string.digits) + + for i in range(random.randrange(password_min_length, password_max_length)): + password += random.choice(random_source) + + password_list = list(password) + random.SystemRandom().shuffle(password_list) + password = "".join(password_list) + return password diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/image_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/image_manager.py new file mode 100644 index 0000000000..0a48e97336 --- /dev/null +++ b/automated_detection_testing/ci/detection_testing_batch/modules/image_manager.py @@ -0,0 +1,50 @@ +import datetime +import docker +import timeit + +def setup_image(client: docker.client.DockerClient, reuse_images: bool, container_name: str) -> None: + if not reuse_images: + #Check to see if the image exists. If it does, then remove it. If it does not, then do nothing + docker_image = None + try: + docker_image = client.images.get(container_name) + except Exception as e: + #We don't need to do anything, the image did not exist on our system + print("Image named [%s] did not exist, so we don't need to try and remove it."%(container_name)) + if docker_image != None: + #We found the image. Let's try to delete it + print("Found docker image named [%s] and you have requested that we forcefully remove it"%(container_name)) + try: + client.images.remove(image=container_name, force=True, noprune=False) + print("Docker image named [%s] forcefully removed"%(container_name)) + except Exception as e: + print("Error forcefully removing [%s]"%(container_name)) + raise(e) + + #See if the image exists. If it doesn't, then pull it from Docker Hub + docker_image = None + try: + docker_image = client.images.get(container_name) + print("Docker image [%s] found, no need to download it."%(container_name)) + except Exception as e: + #Image did not exist on the system + docker_image = None + + if docker_image is None: + #We did not find the image, so pull it + try: + print("Downloading image [%s]. Please note " + "that this could take a long time depending on your " + "connection. It's around 2GB."%(container_name)) + pull_start_time = timeit.default_timer() + client.images.pull(container_name) + pull_finish_time = timeit.default_timer() + print("Successfully pulled the docker image [%s] in %ss"% + (container_name, + datetime.timedelta(seconds=pull_finish_time - pull_start_time, microseconds=0) )) + + except Exception as e: + print("There was an error trying to pull the image [%s]: [%s]"%(container_name,str(e))) + raise(e) + + diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py new file mode 100644 index 0000000000..c0a7e94279 --- /dev/null +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -0,0 +1,338 @@ +from collections import OrderedDict +import docker +import docker.types +import docker.models +import docker.models.resource +import docker.models.containers +import os.path +import requests +import shutil +import splunk_sdk +import testing_service +import time +import timeit +from typing import Union + + +SPLUNKBASE_URL = "https://splunkbase.splunk.com/app/%d/release/%s/download" +SPLUNK_START_ARGS = "--accept-license" + + +class SplunkContainer: + def __init__( + self, + synchronization_object, + full_docker_hub_path, + container_name: str, + apps: list[dict], + web_port: tuple[str, int], + management_port: tuple[str, int], + container_password: str, + files_to_copy_to_container: OrderedDict = OrderedDict(), + mounts: list[docker.types.Mount] = [], + splunkbase_username: Union[str, None] = None, + splunkbase_password: Union[str, None] = None, + splunk_ip:str = "127.0.0.1" + ): + self.synchronization_object = synchronization_object + self.client = docker.client.from_env() + self.full_docker_hub_path = full_docker_hub_path + self.container_password = container_password + self.apps = apps + self.files_to_copy_to_container = files_to_copy_to_container + self.splunk_ip = splunk_ip + self.container_name = container_name + self.mounts = mounts + self.environment = self.make_environment( + apps, container_password, splunkbase_username, splunkbase_password + ) + self.ports = self.make_ports(web_port, management_port) + self.web_port = web_port + self.management_port = management_port + self.container = self.make_container() + + def prepare_apps_path( + self, + apps: list[dict], + splunkbase_username: Union[str, None] = None, + splunkbase_password: Union[str, None] = None, + ) -> tuple[str, bool]: + apps_to_install = [] + require_credentials = False + for app in self.apps: + if app["location"] == "splunkbase": + if splunkbase_username is None or splunkbase_password is None: + raise Exception( + "Error: Requested app from Splunkbase but Splunkbase username and/or password were not supplied." + ) + target = SPLUNKBASE_URL % (app["app_number"], app["app_version"]) + apps_to_install.append(target) + require_credentials = True + elif app["location"] == "local": + apps_to_install.append(app["container_path"]) + return ",".join(apps_to_install), require_credentials + + def make_volume( + self, + local_path: str, + container_path: str, + type: str = "bind", + read_only: bool = True, + ) -> docker.types.Mount: + return docker.types.Mount( + source=local_path, target=container_path, type="bind", read_only=True + ) + + def make_environment( + self, + apps: list[dict], + container_password: str, + splunkbase_username: Union[str, None] = None, + splunkbase_password: Union[str, None] = None, + ) -> dict: + env = {} + env["SPLUNK_START_ARGS"] = SPLUNK_START_ARGS + env["SPLUNK_PASSWORD"] = container_password + splunk_apps_url, require_credentials = self.prepare_apps_path( + apps, splunkbase_username, splunkbase_password + ) + if require_credentials: + env["SPLUNKBASE_USERNAME"] = splunkbase_username + env["SPLUNKBASE_PASSWORD"] = splunkbase_password + env["SPLUNK_APPS_URL"] = splunk_apps_url + + return env + + def make_ports(self, *ports: tuple[str, int]) -> dict[str, int]: + port_dict = {} + for port in ports: + port_dict[port[0]] = port[1] + return port_dict + + def __str__(self) -> str: + container_string = ( + "Container Name: %s\n\t" + "Docker Hub Path: %s\n\t" + "Apps: %s\n\t" + "Ports: %s\n\t" + "Mounts: %s\n\t" + % ( + self.container_name, + self.full_docker_hub_path, + self.environment["SPLUNK_APPS_URL"], + self.ports, + ) + ) + + return container_string + + def make_container(self) -> docker.models.resource.Model: + container = self.client.containers.create( + self.full_docker_hub_path, + ports=self.ports, + environment=self.environment, + name=self.container_name, + mounts=self.mounts, + detach=True, + ) + + return container + + def extract_tar_file_to_container( + self, local_file_path: str, container_file_path: str, sleepTimeSeconds: int = 5 + ) -> bool: + # Check to make sure that the file ends in .tar. If it doesn't raise an exception + if os.path.splitext(local_file_path)[1] != ".tar": + raise Exception( + "Error - Failed copy of file [%s] to container [%s]. Only " + "files ending in .tar can be copied to the container using this function." + % (local_file_path, self.container_name) + ) + successful_copy = False + api_client = docker.APIClient() + # need to use the low level client to put a file onto a container + while not successful_copy: + try: + with open(local_file_path, "rb") as fileData: + # splunk will restart a few times will installation of apps takes place so it will reload its indexes... + + api_client.put_archive( + container=self.container_name, + path=container_file_path, + data=fileData, + ) + successful_copy = True + except Exception as e: + # print("Failed copy of [%s] file to CONTAINER:[%s]...we will try again"%(localFilePath, containerName)) + time.sleep(10) + successful_copy = False + print( + "Successfully copied [%s] to [%s] on [%s]" + % (local_file_path, container_file_path, self.container_name) + ) + return successful_copy + + def removeContainer( + self, removeVolumes: bool = True, forceRemove: bool = True + ) -> bool: + try: + container = self.client.containers.get(self.container_name) + except Exception as e: + # Container does not exist, no need to try and remove it + return True + try: + # container was found, so now we try to remove it + # v also removes volumes linked to the container + container.remove( + v=removeVolumes, force=forceRemove + ) # remove it even if it is running. remove volumes as well + # No need to print that the container has been removed, it is expected behavior + return True + except Exception as e: + print("Could not remove Docker Container [%s]" % (self.container_name)) + raise (Exception("CONTAINER REMOVE ERROR")) + + def wait_for_splunk_ready( + self, + max_seconds: int = 300, + seconds_between_attempts: int = 5, + ) -> bool: + # The smarter version of this will try to hit one of the pages, + # probably the login page, and when that is available it means that + # splunk is fully started and ready to go. Until then, we just + # use a simple sleep + splunk_ready_url = "http://%s:%d" % (self.splunk_ip, self.web_port) + start = timeit.default_timer() + while True: + try: + # Splunk container will not have proper ssl certificate + response = requests.get(splunk_ready_url, timeout=5, verify=False) + response.raise_for_status() + return True + except Exception as e: + elapsed = timeit.default_timer() - start + if elapsed > max_seconds: + raise ( + Exception( + "Container [%s] took longer than maximum start time of [%d].\n\tQuitting..." + % (self.container_name, max_seconds) + ) + ) + time.sleep(seconds_between_attempts) + + def run_container(self) -> None: + print("Starting the container [%s]" % (self.container_name)) + self.container.start() + + # By default, first copy the index file then the datamodel file + for f in self.files_to_copy_to_container: + self.extract_tar_file_to_container( + f["local_file_path"], f["container_file_path"] + ) + + print("Finished copying files to [%s]" % (self.container_name)) + + try: + while not splunk_sdk.enable_delete_for_admin( + self.splunk_ip, self.management_port, self.container_password + ): + time.sleep(10) + except Exception as e: + print( + "Failure enabling DELETE for container [%s]: [%s].\n\tQuitting..." + % (self.container_name, str(e)) + ) + + + # Wait for all of the threads to join here + print( + "Container [%s] setup complete and waiting for other containers to be ready..." + % (self.container_name) + ) + synchornization_object.start_barrier.wait() + self.wait_for_splunk_ready() + + while True: + # Sleep for a small random time so that containers drift apart and don't synchronize their testing + time.sleep(random.randint(1, 30)) + # Try to get something from the queue + detection_to_test = testing_object.getTest() + if detection_to_test is None: + try: + print( + "Container [%s] has finished running detections, time to stop the container." + % (container_name) + ) + container.stop() + print("Container [%s] successfully stopped" % (container_name)) + # remove the container + removeContainer(client, container_name, forceRemove=True) + except Exception as e: + print("Error stopping or removing the container: [%s]" % (str(e))) + + return None + + # There is a detection to test + print("Container [%s]--->[%s]" % (container_name, detection_to_test)) + try: + result = testing_service.test_detection_wrapper( + container_name, + splunk_ip, + splunk_password, + splunk_management_port, + detection_to_test, + 0, + uuid_test, + testing_object.attack_data_root_folder, + wait_on_failure=interactive_failure, + ) + testing_object.addResult(result) + + # Remove the data from the test that we just ran. We MUST do this when running on CI because otherwise, we will download + # a massive amount of data over the course of a long path and will run out of space on the relatively small CI runner drive + shutil.rmtree(result["attack_data_directory"]) + except Exception as e: + print( + "Warning - uncaught error in detection test for [%s] - this should not happen: [%s]" + % (detection_to_test, str(e)) + ) + testing_object.addError( + {"detection_file": detection_to_test, "detection_error": str(e)} + ) + + +""" +def remove_existing_containers(client: docker.client.DockerClient, reuse_containers: bool, container_template: str, num_containers: int, forceRemove: bool=True) -> bool: + if reuse_containers is True: + #Check to make sure that all of the requested containers exist + for index in range(0, num_containers): + container_name = container_template%(index) + print("Checking for the existence of container named [%s]"%(container_name)) + try: + this_container = client.containers.get(container_name) + except Exception as e: + print("Failed to find a container named [%s]"%(container_name)) + reuse_containers = False + break + try: + #Make sure that the container is stopped + print("Found [%s]. Stopping container..."%(container_name)) + this_container.stop() + except Exception as e: + print("Failed to stop a container named [%s]"%(container_name)) + reuse_containers = False + break + print("Found all of the containers, we will reuse them") + return True + + #Note that this variable can be changed by the block above, so don't + #convert this into an if/else. Note that this IF is for verbosity: + + if reuse_containers is False: + for index in range(0,num_containers): + container_name = container_template%(index) + removeContainer(client, container_name, forceRemove) + return False + else: + raise(Exception("Error removing existing containers")) + """ diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py new file mode 100644 index 0000000000..71015d0b29 --- /dev/null +++ b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -0,0 +1,228 @@ +from collections import OrderedDict +import csv +import datetime +import json +import os +import queue +import shutil +import tempfile +import threading +import time +import timeit +from typing import Union + + +class TestDriver: + def __init__(self, tests:list[str], num_containers:int): + #Create the queue and enque all of the tests + self.testing_queue = queue.Queue() + for test in tests: + self.testing_queue.put(test) + + self.total_number_of_tests = self.testing_queue.qsize() + #Creates a lock that will be used to synchronize access to this object + self.lock = threading.Lock() + self.start_time = timeit.default_timer() + self.failures = [] + self.successes = [] + self.errors = [] + self.container_ready_time = None + + #Just make a random folder to store attack data that we donwload + self.attack_data_root_folder = tempfile.mkdtemp(prefix="attack_data_", dir=os.getcwd()) + print("Attack data for this run will be stored at: [%s]"%(self.attack_data_root_folder)) + self.start_barrier = threading.Barrier(num_containers) + + def getTest(self)-> Union[str,None]: + try: + return self.testing_queue.get(block=False) + except Exception as e: + print("Testing queue empty!") + return None + + def addSuccess(self, result:dict)->None: + print("Test PASSED for detection: [%s --> %s"%(result['detection_name'], result['detection_file'])) + self.lock.acquire() + try: + self.successes.append(result) + finally: + self.lock.release() + + + def addFailure(self, result:dict)->None: + print("Test FAILED for detection: [%s --> %s"%(result['detection_name'], result['detection_file'])) + self.lock.acquire() + try: + self.failures.append(result) + finally: + self.lock.release() + + def addError(self, detection:dict)->None: + self.lock.acquire() + try: + self.errors.append(detection) + finally: + self.lock.release() + + + def outputResultsCSV(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict)->bool: + success = True + + print("Generating %s..."%(output_filename), end='') + self.lock.acquire() + + try: + with open(output_filename, 'w') as csvfile: + header_writer = csv.writer(csvfile, quoting=csv.QUOTE_ALL) + for key in baseline: + #Very basic support for pretty pritning dicts. Doesn't handle more than 1 nested dict + if type(baseline[key]) is OrderedDict: + header_writer.writerow([key, "-"]) + for nestedkey in baseline[key]: + header_writer.writerow([nestedkey, baseline[key][nestedkey]]) + #Basic support for 1 layer nested list. Doesn't handle more than 1. + elif type(baseline[key]) is list and len(baseline[key])>0: + header_writer.writerow([key, baseline[key][0]]) + for i in range(1,len(baseline[key])): + header_writer.writerow(['-', baseline[key][i]]) + + else: + header_writer.writerow([key, baseline[key]]) + header_writer.writerow(['','']) + csv_writer = csv.DictWriter(csvfile, fieldnames=field_names) + csv_writer.writeheader() + for row in data: + csv_writer.writerow(row) + print("Done with [%d] detections"%(len(data))) + + except Exception as e: + print("Failure writing to CSV file for [%s]:"%(output_filename, str(e))) + success = False + + finally: + self.lock.release() + + return success + + def outputResultsJSON(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict)->bool: + success = True + try: + with open(output_filename, "w") as jsonFile: + json.dump({'baseline': baseline, 'results':data}, jsonFile, indent=" ") + except Exception as e: + print("There was an error generating [%s]: [%s]"%(output_filename, str(e))) + success = False + return success + + def outputResultsFile(self, field_names:list[str], output_filename:str, data:list[dict], baseline:OrderedDict, output_json:bool=True, output_csv:bool=True)->bool: + success = True + if output_csv: + success |= self.outputResultsCSV(field_names, output_filename + ".csv", data, baseline) + if output_json: + success |= self.outputResultsJSON(field_names, output_filename + ".json", data, baseline) + return success + + + def outputResultsFiles(self, baseline:OrderedDict, fields:list[str]=['detection_name', 'detection_file','runDuration','diskUsage', 'search_string', 'error', 'success', 'scanCount', 'detection_error'])->bool: + res = self.outputResultsFile(fields,"success", self.successes, baseline) + res |= self.outputResultsFile(fields, "failure", self.failures, baseline) + res |= self.outputResultsFile(fields, "error", self.errors, baseline) + res |= self.outputResultsFile(fields, "combined", self.successes + self.failures + self.errors, baseline) + return res + + def finish(self, baseline:OrderedDict): + self.cleanup() + self.outputResultsFiles(baseline) + + + def cleanup(self): + self.lock.acquire() + try: + print("Removing all attack data that was downloaded during this test at: [%s]"%(self.attack_data_root_folder)) + shutil.rmtree(self.attack_data_root_folder) + print("Successfully removed all attack data") + finally: + self.lock.release() + def summarize(self)->bool: + + self.lock.acquire() + + try: + current_time = timeit.default_timer() + if self.testing_queue.qsize() == self.total_number_of_tests: + #Testing has not started yet. We are setting up containers + print("***********PROGRESS UPDATE***********\n"\ + "\tWaiting for container setup: %s"%(datetime.timedelta(seconds=current_time - self.start_time))) + else: + if self.container_ready_time is None: + #This is the first status update since container setup has completed. Get the current time. + #This makes our remaining time estimates better since that estimate should not involve + #the container setup time + self.container_ready_time = current_time + + numberOfCompletedTests = len(self.successes) + len(self.failures) + len(self.errors) + remaining_tests = self.testing_queue.qsize() + testsCurrentlyRunning = self.total_number_of_tests - remaining_tests - numberOfCompletedTests + total_execution_time_seconds = current_time - self.start_time + + test_execution_time_seconds = current_time - self.container_ready_time + + + if numberOfCompletedTests == 0 or test_execution_time_seconds == 0: + estimated_seconds_to_finish_all_tests = "UNKNOWN" + estimated_completion_time_seconds = "UNKNOWN" + else: + average_time_per_test = test_execution_time_seconds / numberOfCompletedTests + #divide testsCurrentlyRunning by 2.0 because, on average, each running test will be 50% completed + estimated_seconds_to_finish_all_tests = average_time_per_test * (remaining_tests + testsCurrentlyRunning/2.0) + estimated_completion_time_seconds = datetime.timedelta(seconds=estimated_seconds_to_finish_all_tests) + + + + + print("***********PROGRESS UPDATE***********\n"\ + "\tElapsed Time : %s\n"\ + "\tEstimated Remaining Time : %s\n"\ + "\tTests to run : %d\n"\ + "\tTests currently running : %d\n"\ + "\tTests completed : %d\n"\ + "\t\tSuccess : %d\n"\ + "\t\tFailure : %d\n"\ + "\t\tError : %d"%(datetime.timedelta(seconds=total_execution_time_seconds), + estimated_completion_time_seconds, + remaining_tests, + testsCurrentlyRunning, + numberOfCompletedTests, + len(self.successes), + len(self.failures), + len(self.errors))) + + except Exception as e: + print("Error in printing execution summary: [%s]"%(str(e))) + finally: + self.lock.release() + + #Return true while there are tests remaining + return (self.total_number_of_tests - + (len(self.successes) + len(self.failures) + len(self.errors)) > 0) + + + def addResult(self, result:dict)->None: + try: + if result['detection_result']['success'] is False: + #This is actually a failure of the detection, not an error. Naming is confusiong + self.addFailure(result['detection_result']) + elif result['detection_result']['success'] is True: + self.addSuccess(result['detection_result']) + except Exception as e: + #Neither a success or a failure, so add the object to the failures queue + self.addError({'detection_file':"Unknown File", "detection_error":str(result)}) + +def queue_status_thread(status_object:TestingSynchronization)->None: + #This will run forever by design + print("start status") + while True: + if status_object.summarize() == False: + #There are no more tests to run, so we can return from this thread + return None + time.sleep(10) \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/requirements.txt b/automated_detection_testing/ci/detection_testing_batch/requirements.txt index 9fd488fd1f..d4a44f878c 100644 --- a/automated_detection_testing/ci/detection_testing_batch/requirements.txt +++ b/automated_detection_testing/ci/detection_testing_batch/requirements.txt @@ -8,6 +8,7 @@ PyYAML==5.4 requests==2.25.1 six==1.16.0 splunk-sdk==1.6.12 +splunk-packaging-toolkit==1.0.1 #newest version of docker for managing the splunk containers #we will freeze at a specific version later -docker \ No newline at end of file +docker==5.0.3 From 4e16ab139d467cfc65926bcb5f4d775c6ecdce8c Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 12 Nov 2021 16:37:05 -0800 Subject: [PATCH 059/203] More maintenance to make the testing code more modular and better documented. --- .../modules/container_manager.py | 38 ++++++++--- .../modules/splunk_container.py | 65 ++++++++++--------- .../modules/test_driver.py | 2 +- .../modules/testing_service.py | 10 ++- 4 files changed, 69 insertions(+), 46 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 46dce75552..d28d2f25a0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -4,6 +4,7 @@ import docker.types import random import splunk_container import string +import test_driver from typing import Union WEB_PORT_STRING = "8000/tcp" @@ -13,10 +14,12 @@ MANAGEMENT_PORT_STRING = "8089/tcp" class ContainerManager: def __init__( self, + test_list: list[str], + full_docker_hub_name, container_name_template: str, num_containers: int, - apps: list[dict], - files_to_copy_to_container:OrderedDict=OrderedDict(), + apps: OrderedDict, + files_to_copy_to_container: OrderedDict = OrderedDict(), web_port_start: int = 8000, management_port_start: int = 8089, mounts: list[dict[str, Union[str, bool]]] = [], @@ -24,46 +27,61 @@ class ContainerManager: splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, ): + self.synchronization_object = test_driver.TestDriver(test_list, num_containers) + self.mounts = self.create_mounts(mounts) self.apps = apps - self.client = docker.from_env() if container_password is None: self.container_password = self.get_random_password() else: self.container_password = container_password - self.create_containers( + self.containers = self.create_containers( + full_docker_hub_name, container_name_template, num_containers, web_port_start, management_port_start, splunkbase_username, splunkbase_password, + files_to_copy_to_container, ) + self.run_containers() + + def run_containers(self) -> None: + for container in self.containers: + container.thread.run() + def create_containers( self, + full_docker_hub_name: str, container_name_template: str, num_containers: int, web_port_start: int, management_port_start: int, splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, + files_to_copy_to_container: OrderedDict = OrderedDict(), ) -> list[splunk_container.SplunkContainer]: new_containers = [] for index in range(num_containers): container_name = container_name_template % index - web_port = (WEB_PORT_STRING, web_port_start + index) - management_port = (MANAGEMENT_PORT_STRING, management_port_start + index) - + web_port_tuple = (WEB_PORT_STRING, web_port_start + index) + management_port_tuple = ( + MANAGEMENT_PORT_STRING, + management_port_start + index, + ) + #Get a new client for this container new_containers.append( splunk_container.SplunkContainer( - self.client, + self.synchronization_object, + full_docker_hub_name, container_name, self.apps, - web_port, - management_port, + web_port_tuple, + management_port_tuple, self.container_password, files_to_copy_to_container, self.mounts, diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index c0a7e94279..d7b11fa80e 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -5,14 +5,16 @@ import docker.models import docker.models.resource import docker.models.containers import os.path +import random import requests import shutil import splunk_sdk import testing_service +import test_driver import time import timeit from typing import Union - +import threading SPLUNKBASE_URL = "https://splunkbase.splunk.com/app/%d/release/%s/download" SPLUNK_START_ARGS = "--accept-license" @@ -21,19 +23,21 @@ SPLUNK_START_ARGS = "--accept-license" class SplunkContainer: def __init__( self, - synchronization_object, + synchronization_object:test_driver.TestDriver, full_docker_hub_path, container_name: str, - apps: list[dict], - web_port: tuple[str, int], - management_port: tuple[str, int], + apps: OrderedDict, + web_port_tuple: tuple[str, int], + management_port_tuple: tuple[str, int], container_password: str, files_to_copy_to_container: OrderedDict = OrderedDict(), mounts: list[docker.types.Mount] = [], splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, - splunk_ip:str = "127.0.0.1" + splunk_ip:str = "127.0.0.1", + interactive_failure:bool = False ): + self.interactive_failure = interactive_failure self.synchronization_object = synchronization_object self.client = docker.client.from_env() self.full_docker_hub_path = full_docker_hub_path @@ -46,20 +50,24 @@ class SplunkContainer: self.environment = self.make_environment( apps, container_password, splunkbase_username, splunkbase_password ) - self.ports = self.make_ports(web_port, management_port) - self.web_port = web_port - self.management_port = management_port + self.ports = self.make_ports(web_port_tuple, management_port_tuple) + self.web_port = web_port_tuple[1] + self.management_port = management_port_tuple[1] self.container = self.make_container() + self.thread = threading.Thread(target=self.run_container) + + def prepare_apps_path( self, - apps: list[dict], + apps: OrderedDict, splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, ) -> tuple[str, bool]: apps_to_install = [] require_credentials = False - for app in self.apps: + for app_name in self.apps: + app = self.apps[app_name] if app["location"] == "splunkbase": if splunkbase_username is None or splunkbase_password is None: raise Exception( @@ -85,7 +93,7 @@ class SplunkContainer: def make_environment( self, - apps: list[dict], + apps: OrderedDict, container_password: str, splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, @@ -249,44 +257,43 @@ class SplunkContainer: "Container [%s] setup complete and waiting for other containers to be ready..." % (self.container_name) ) - synchornization_object.start_barrier.wait() + + self.synchronization_object.start_barrier.wait() self.wait_for_splunk_ready() while True: # Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1, 30)) # Try to get something from the queue - detection_to_test = testing_object.getTest() + detection_to_test = self.synchronization_object.getTest() if detection_to_test is None: try: print( "Container [%s] has finished running detections, time to stop the container." - % (container_name) + % (self.container_name) ) - container.stop() - print("Container [%s] successfully stopped" % (container_name)) + self.container.stop() + print("Container [%s] successfully stopped" % (self.container_name)) # remove the container - removeContainer(client, container_name, forceRemove=True) + self.removeContainer() except Exception as e: print("Error stopping or removing the container: [%s]" % (str(e))) return None # There is a detection to test - print("Container [%s]--->[%s]" % (container_name, detection_to_test)) + print("Container [%s]--->[%s]" % (self.container_name, detection_to_test)) try: result = testing_service.test_detection_wrapper( - container_name, - splunk_ip, - splunk_password, - splunk_management_port, + self.container_name, + self.splunk_ip, + self.container_password, + self.management_port, detection_to_test, - 0, - uuid_test, - testing_object.attack_data_root_folder, - wait_on_failure=interactive_failure, + self.synchronization_object.attack_data_root_folder, + wait_on_failure=self.interactive_failure, ) - testing_object.addResult(result) + self.synchronization_object.addResult(result) # Remove the data from the test that we just ran. We MUST do this when running on CI because otherwise, we will download # a massive amount of data over the course of a long path and will run out of space on the relatively small CI runner drive @@ -296,7 +303,7 @@ class SplunkContainer: "Warning - uncaught error in detection test for [%s] - this should not happen: [%s]" % (detection_to_test, str(e)) ) - testing_object.addError( + self.synchronization_object.addError( {"detection_file": detection_to_test, "detection_error": str(e)} ) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index 71015d0b29..0277e0a18a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -218,7 +218,7 @@ class TestDriver: #Neither a success or a failure, so add the object to the failures queue self.addError({'detection_file':"Unknown File", "detection_error":str(result)}) -def queue_status_thread(status_object:TestingSynchronization)->None: +def queue_status_thread(status_object:TestDriver)->None: #This will run forever by design print("start status") while True: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 38008e9915..4134a87c78 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -14,10 +14,10 @@ from os.path import relpath from tempfile import mkdtemp -def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:str, splunk_port:int, test_file:str, test_index:int, uuid_test:str, attack_data_root_folder, wait_on_failure:bool=False)->dict: +def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:str, splunk_port:int, test_file:str, attack_data_root_folder, wait_on_failure:bool=False)->dict: uuid_var = str(uuid.uuid4()) - result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, test_index, uuid_test, uuid_var, attack_data_root_folder) + result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, uuid_var, attack_data_root_folder) if result_test is None: #We failed so early in the process that we could not produce any meaningful result raise(Exception("Test execution Error")) @@ -38,7 +38,7 @@ def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:st return result_test -def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_password:str, test_file:str, test_index:int, uuid_test, uuid_var, attack_data_root_folder)->Union[dict,None]: +def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_password:str, test_file:str, uuid_var, attack_data_root_folder)->Union[dict,None]: try: test_file_obj = load_file(os.path.join("security_content/", test_file)) except Exception as e: @@ -73,9 +73,7 @@ def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_pa if attack_data['update_timestamp'] == True: data_manipulation = DataManipulation() data_manipulation.manipulate_timestamp(target_file, attack_data['sourcetype'], attack_data['source']) - INDEX_TO_REPLAY_INTO = 'test' + str(test_index) - INDEX_TO_REPLAY_INTO = 'main' - replay_attack_dataset(container_name, splunk_password, folder_name, INDEX_TO_REPLAY_INTO, attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) + replay_attack_dataset(container_name, splunk_password, folder_name, "main", attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) time.sleep(30) From f64fef09d757701aad4c83b1a64f80a45d883c97 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 12 Nov 2021 17:11:10 -0800 Subject: [PATCH 060/203] Still needs a lot of rework and cleanup - can't run right now. Looking to finish cleanup on Monday. --- .../detection_testing_execution.py | 18 +------ .../modules/container_manager.py | 4 +- .../modules/splunk_container.py | 52 +++---------------- 3 files changed, 10 insertions(+), 64 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index a0f594e255..3c478d8191 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -36,7 +36,7 @@ datamodel_file_local_path = "datamodels.conf.tar" datamodel_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "Splunk_SA_CIM") -PASSWORD_LENGTH=20 + MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING=2 DEFAULT_CONTAINER_TAG="latest" LOCAL_BASE_CONTAINER_NAME = "splunk_test_%d" @@ -52,22 +52,6 @@ DETECTION_MODES = ['new', 'all', 'selected'] - - - - - - - - - - - - - - - - def main(args): diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index d28d2f25a0..896c976f89 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -15,7 +15,7 @@ class ContainerManager: def __init__( self, test_list: list[str], - full_docker_hub_name, + full_docker_hub_name: str, container_name_template: str, num_containers: int, apps: OrderedDict, @@ -48,8 +48,6 @@ class ContainerManager: files_to_copy_to_container, ) - self.run_containers() - def run_containers(self) -> None: for container in self.containers: container.thread.run() diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index d7b11fa80e..f1c65f234c 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -23,7 +23,7 @@ SPLUNK_START_ARGS = "--accept-license" class SplunkContainer: def __init__( self, - synchronization_object:test_driver.TestDriver, + synchronization_object: test_driver.TestDriver, full_docker_hub_path, container_name: str, apps: OrderedDict, @@ -34,8 +34,8 @@ class SplunkContainer: mounts: list[docker.types.Mount] = [], splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, - splunk_ip:str = "127.0.0.1", - interactive_failure:bool = False + splunk_ip: str = "127.0.0.1", + interactive_failure: bool = False, ): self.interactive_failure = interactive_failure self.synchronization_object = synchronization_object @@ -57,7 +57,6 @@ class SplunkContainer: self.thread = threading.Thread(target=self.run_container) - def prepare_apps_path( self, apps: OrderedDict, @@ -135,6 +134,9 @@ class SplunkContainer: return container_string def make_container(self) -> docker.models.resource.Model: + # First, make sure that the container has been removed if it already existed + self.removeContainer() + container = self.client.containers.create( self.full_docker_hub_path, ports=self.ports, @@ -251,16 +253,15 @@ class SplunkContainer: % (self.container_name, str(e)) ) - # Wait for all of the threads to join here print( "Container [%s] setup complete and waiting for other containers to be ready..." % (self.container_name) ) - + self.synchronization_object.start_barrier.wait() self.wait_for_splunk_ready() - + while True: # Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1, 30)) @@ -306,40 +307,3 @@ class SplunkContainer: self.synchronization_object.addError( {"detection_file": detection_to_test, "detection_error": str(e)} ) - - -""" -def remove_existing_containers(client: docker.client.DockerClient, reuse_containers: bool, container_template: str, num_containers: int, forceRemove: bool=True) -> bool: - if reuse_containers is True: - #Check to make sure that all of the requested containers exist - for index in range(0, num_containers): - container_name = container_template%(index) - print("Checking for the existence of container named [%s]"%(container_name)) - try: - this_container = client.containers.get(container_name) - except Exception as e: - print("Failed to find a container named [%s]"%(container_name)) - reuse_containers = False - break - try: - #Make sure that the container is stopped - print("Found [%s]. Stopping container..."%(container_name)) - this_container.stop() - except Exception as e: - print("Failed to stop a container named [%s]"%(container_name)) - reuse_containers = False - break - print("Found all of the containers, we will reuse them") - return True - - #Note that this variable can be changed by the block above, so don't - #convert this into an if/else. Note that this IF is for verbosity: - - if reuse_containers is False: - for index in range(0,num_containers): - container_name = container_template%(index) - removeContainer(client, container_name, forceRemove) - return False - else: - raise(Exception("Error removing existing containers")) - """ From 9e435bbc437d89c4e6f687c9c0b8a89164450b0a Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 15 Nov 2021 14:47:24 -0800 Subject: [PATCH 061/203] Lots more changes as we break into separate files for more readability and maintainability. Big changes around printing status and managing different threads as they run. --- .../modules/container_manager.py | 45 ++++++++++- .../modules/splunk_container.py | 81 ++++++++++++++++--- .../modules/test_driver.py | 8 -- 3 files changed, 114 insertions(+), 20 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 896c976f89..3cf7595deb 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -1,10 +1,13 @@ from collections import OrderedDict import docker +import datetime import docker.types import random import splunk_container import string import test_driver +import threading +import time from typing import Union WEB_PORT_STRING = "8000/tcp" @@ -27,7 +30,8 @@ class ContainerManager: splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, ): - self.synchronization_object = test_driver.TestDriver(test_list, num_containers) + self.synchronization_object = test_driver.TestDriver( + test_list, num_containers) self.mounts = self.create_mounts(mounts) self.apps = apps @@ -47,10 +51,39 @@ class ContainerManager: splunkbase_password, files_to_copy_to_container, ) + self.summary_thread = threading.Thread(target=self.queue_status_thread,args=()) + + #Construct the baseline from the splunk version and the apps to be installed + self.baseline = OrderedDict() + #Get a datetime and add it as the first entry in the baseline + self.baseline['DATE'] = str(datetime.datetime.now().replace(microsecond=0)) + self.baseline['SPLUNK_VERSION'] = full_docker_hub_name + for key in self.apps: + self.baseline[key] = self.apps[key] + + def run_test(self): + self.run_containers() + self.run_status_thread() + for container in self.containers: + container.thread.join() + print(container.get_container_summary()) + self.summary_thread.join() + print("All containers completed testing!") + + + self.synchronization_object.finish(self.baseline) + + + def run_containers(self) -> None: for container in self.containers: container.thread.run() + + def run_status_thread(self) -> None: + self.queue_status_thread.run() + + def create_containers( self, @@ -71,7 +104,7 @@ class ContainerManager: MANAGEMENT_PORT_STRING, management_port_start + index, ) - #Get a new client for this container + # Get a new client for this container new_containers.append( splunk_container.SplunkContainer( self.synchronization_object, @@ -122,3 +155,11 @@ class ContainerManager: random.SystemRandom().shuffle(password_list) password = "".join(password_list) return password + + def queue_status_thread(self)->None: + #This will run fo + while True: + if self.synchronization_object.summarize() == False: + #There are no more tests to run, so we can return from this thread + return None + time.sleep(10) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index f1c65f234c..e28370c101 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -1,4 +1,5 @@ from collections import OrderedDict +import datetime import docker import docker.types import docker.models @@ -57,6 +58,10 @@ class SplunkContainer: self.thread = threading.Thread(target=self.run_container) + self.container_start_time = 0 + self.test_start_time = 0 + self.num_tests_completed = 0 + def prepare_apps_path( self, apps: OrderedDict, @@ -72,7 +77,8 @@ class SplunkContainer: raise Exception( "Error: Requested app from Splunkbase but Splunkbase username and/or password were not supplied." ) - target = SPLUNKBASE_URL % (app["app_number"], app["app_version"]) + target = SPLUNKBASE_URL % ( + app["app_number"], app["app_version"]) apps_to_install.append(target) require_credentials = True elif app["location"] == "local": @@ -136,7 +142,7 @@ class SplunkContainer: def make_container(self) -> docker.models.resource.Model: # First, make sure that the container has been removed if it already existed self.removeContainer() - + container = self.client.containers.create( self.full_docker_hub_path, ports=self.ports, @@ -199,9 +205,53 @@ class SplunkContainer: # No need to print that the container has been removed, it is expected behavior return True except Exception as e: - print("Could not remove Docker Container [%s]" % (self.container_name)) + print("Could not remove Docker Container [%s]" % ( + self.container_name)) raise (Exception("CONTAINER REMOVE ERROR")) + def get_container_summary(self) -> str: + current_time = timeit.default_timer() + # Get rid of the decimal (microseconds) so that we have whole seconds + if self.container_start_time is None or self.test_start_time is None: + print(self.container_start_time) + + # Total time the container has been running + if self.container_start_time == -1: + total_time_string = "NOT STARTED" + else: + total_time_rounded = datetime.timedelta( + round(current_time - self.container_start_time)) + total_time_string = str(total_time_rounded) + + # Time that the container setup took + if self.test_start_time == -1 or self.container_start_time == -1: + setup_time_string = "NOT SET UP" + else: + setup_secounds_rounded = datetime.timedelta( + round(self.test_start_time - self.container_start_time)) + setup_time_string = str(setup_secounds_rounded) + + # Time that the tests have been running + if self.test_start_time == -1 or self.num_tests_completed == 0: + testing_time_string = "NO TESTS COMPLETED" + else: + testing_seconds_rounded = datetime.timedelta( + round(current_time - self.test_start_time)) + + # Get the approximate time per test. This is a clunky way to get rid of decimal + # seconds.... but it works + timedelta_per_test = testing_seconds_rounded/self.num_tests_completed + timedelta_per_test_rounded = timedelta_per_test - \ + datetime.timedelta( + microseconds=timedelta_per_test.microseconds) + + testing_time_string = "%s per test (%d tests)"%(timedelta_per_test_rounded, str(testing_seconds_rounded)) + + summary_str = "[%s] Summary\n\t"\ + "Total Time :"\ + "Container Start Time:"\ + "Test Execution Time :" %(total_time_string, setup_time_string, testing_time_string) + def wait_for_splunk_ready( self, max_seconds: int = 300, @@ -216,7 +266,8 @@ class SplunkContainer: while True: try: # Splunk container will not have proper ssl certificate - response = requests.get(splunk_ready_url, timeout=5, verify=False) + response = requests.get( + splunk_ready_url, timeout=5, verify=False) response.raise_for_status() return True except Exception as e: @@ -232,6 +283,7 @@ class SplunkContainer: def run_container(self) -> None: print("Starting the container [%s]" % (self.container_name)) + self.container_start_time = timeit.default_timer() self.container.start() # By default, first copy the index file then the datamodel file @@ -262,9 +314,10 @@ class SplunkContainer: self.synchronization_object.start_barrier.wait() self.wait_for_splunk_ready() + # Sleep for a small random time so that containers drift apart and don't synchronize their testing + time.sleep(random.randint(1, 30)) + self.test_start_time = timeit.default_timer() while True: - # Sleep for a small random time so that containers drift apart and don't synchronize their testing - time.sleep(random.randint(1, 30)) # Try to get something from the queue detection_to_test = self.synchronization_object.getTest() if detection_to_test is None: @@ -274,16 +327,19 @@ class SplunkContainer: % (self.container_name) ) self.container.stop() - print("Container [%s] successfully stopped" % (self.container_name)) + print("Container [%s] successfully stopped" % + (self.container_name)) # remove the container self.removeContainer() except Exception as e: - print("Error stopping or removing the container: [%s]" % (str(e))) + print( + "Error stopping or removing the container: [%s]" % (str(e))) return None # There is a detection to test - print("Container [%s]--->[%s]" % (self.container_name, detection_to_test)) + print("Container [%s]--->[%s]" % + (self.container_name, detection_to_test)) try: result = testing_service.test_detection_wrapper( self.container_name, @@ -305,5 +361,10 @@ class SplunkContainer: % (detection_to_test, str(e)) ) self.synchronization_object.addError( - {"detection_file": detection_to_test, "detection_error": str(e)} + {"detection_file": detection_to_test, + "detection_error": str(e)} ) + self.num_tests_completed+=1 + + # Sleep for a small random time so that containers drift apart and don't synchronize their testing + time.sleep(random.randint(1, 30)) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index 0277e0a18a..b21d2ed960 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -218,11 +218,3 @@ class TestDriver: #Neither a success or a failure, so add the object to the failures queue self.addError({'detection_file':"Unknown File", "detection_error":str(result)}) -def queue_status_thread(status_object:TestDriver)->None: - #This will run forever by design - print("start status") - while True: - if status_object.summarize() == False: - #There are no more tests to run, so we can return from this thread - return None - time.sleep(10) \ No newline at end of file From 7aca8f62038c4b0f1942a14f9df1be15bec1c298 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 15 Nov 2021 16:11:17 -0800 Subject: [PATCH 062/203] Removed the image_manager.py file - it was simple and its functionality was integrated into the container_manager.py. --- .../modules/container_manager.py | 71 ++++++++++++++++++- .../modules/image_manager.py | 50 ------------- .../modules/splunk_container.py | 3 + 3 files changed, 72 insertions(+), 52 deletions(-) delete mode 100644 automated_detection_testing/ci/detection_testing_batch/modules/image_manager.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 3cf7595deb..b703872057 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -8,6 +8,7 @@ import string import test_driver import threading import time +import timeit from typing import Union WEB_PORT_STRING = "8000/tcp" @@ -29,6 +30,7 @@ class ContainerManager: container_password: Union[str, None] = None, splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, + reuse_image:bool = True ): self.synchronization_object = test_driver.TestDriver( test_list, num_containers) @@ -50,14 +52,20 @@ class ContainerManager: splunkbase_username, splunkbase_password, files_to_copy_to_container, + reuse_image ) self.summary_thread = threading.Thread(target=self.queue_status_thread,args=()) #Construct the baseline from the splunk version and the apps to be installed self.baseline = OrderedDict() #Get a datetime and add it as the first entry in the baseline - self.baseline['DATE'] = str(datetime.datetime.now().replace(microsecond=0)) + self.start_time = datetime.datetime.now() self.baseline['SPLUNK_VERSION'] = full_docker_hub_name + #Added here first to preserve ordering for OrderedDict + self.baseline['TEST_START_TIME'] = "TO BE UPDATED" + self.baseline['TEST_FINISH_TIME'] = "TO BE UPDATED" + self.baseline['TEST_DURATION'] = "TO BE UPDATED" + for key in self.apps: self.baseline[key] = self.apps[key] @@ -71,6 +79,15 @@ class ContainerManager: print("All containers completed testing!") + stop_time = datetime.datetime.now() + x = stop_time - self.start_time + + self.baseline['TEST_START_TIME'] = str(self.start_time) + self.baseline['TEST_FINISH_TIME'] = str(stop_time) + + duration = stop_time - self.start_time + self.baseline['TEST_DURATION'] = duration - datetime.timedelta(microseconds=duration.microseconds) + self.synchronization_object.finish(self.baseline) @@ -95,7 +112,11 @@ class ContainerManager: splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, files_to_copy_to_container: OrderedDict = OrderedDict(), + reuse_image = True ) -> list[splunk_container.SplunkContainer]: + #First make sure that the image exists and has been downloaded + self.setup_image(reuse_image, full_docker_hub_name) + new_containers = [] for index in range(num_containers): container_name = container_name_template % index @@ -104,7 +125,7 @@ class ContainerManager: MANAGEMENT_PORT_STRING, management_port_start + index, ) - # Get a new client for this container + new_containers.append( splunk_container.SplunkContainer( self.synchronization_object, @@ -163,3 +184,49 @@ class ContainerManager: #There are no more tests to run, so we can return from this thread return None time.sleep(10) + + def setup_image(self, reuse_images: bool, container_name: str) -> None: + client = docker.client.from_env() + if not reuse_images: + #Check to see if the image exists. If it does, then remove it. If it does not, then do nothing + docker_image = None + try: + docker_image = client.images.get(container_name) + except Exception as e: + #We don't need to do anything, the image did not exist on our system + #print("Image named [%s] did not exist, so we don't need to try and remove it."%(container_name)) + pass + if docker_image != None: + #We found the image. Let's try to delete it + print("Found docker image named [%s] and you have requested that we forcefully remove it"%(container_name)) + try: + client.images.remove(image=container_name, force=True, noprune=False) + print("Docker image named [%s] forcefully removed"%(container_name)) + except Exception as e: + print("Error forcefully removing [%s]"%(container_name)) + raise(e) + + #See if the image exists. If it doesn't, then pull it from Docker Hub + try: + docker_image = client.images.get(container_name) + print("Docker image [%s] found, no need to download it."%(container_name)) + except Exception as e: + #Image did not exist on the system + docker_image = None + + if docker_image is None: + #We did not find the image, so pull it + try: + print("Downloading image [%s]. Please note " + "that this could take a long time depending on your " + "connection. It's around 2GB."%(container_name)) + pull_start_time = timeit.default_timer() + client.images.pull(container_name) + pull_finish_time = timeit.default_timer() + print("Successfully pulled the docker image [%s] in %ss"% + (container_name, + datetime.timedelta(seconds=pull_finish_time - pull_start_time, microseconds=0) )) + + except Exception as e: + print("There was an error trying to pull the image [%s]: [%s]"%(container_name,str(e))) + raise(e) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/image_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/image_manager.py deleted file mode 100644 index 0a48e97336..0000000000 --- a/automated_detection_testing/ci/detection_testing_batch/modules/image_manager.py +++ /dev/null @@ -1,50 +0,0 @@ -import datetime -import docker -import timeit - -def setup_image(client: docker.client.DockerClient, reuse_images: bool, container_name: str) -> None: - if not reuse_images: - #Check to see if the image exists. If it does, then remove it. If it does not, then do nothing - docker_image = None - try: - docker_image = client.images.get(container_name) - except Exception as e: - #We don't need to do anything, the image did not exist on our system - print("Image named [%s] did not exist, so we don't need to try and remove it."%(container_name)) - if docker_image != None: - #We found the image. Let's try to delete it - print("Found docker image named [%s] and you have requested that we forcefully remove it"%(container_name)) - try: - client.images.remove(image=container_name, force=True, noprune=False) - print("Docker image named [%s] forcefully removed"%(container_name)) - except Exception as e: - print("Error forcefully removing [%s]"%(container_name)) - raise(e) - - #See if the image exists. If it doesn't, then pull it from Docker Hub - docker_image = None - try: - docker_image = client.images.get(container_name) - print("Docker image [%s] found, no need to download it."%(container_name)) - except Exception as e: - #Image did not exist on the system - docker_image = None - - if docker_image is None: - #We did not find the image, so pull it - try: - print("Downloading image [%s]. Please note " - "that this could take a long time depending on your " - "connection. It's around 2GB."%(container_name)) - pull_start_time = timeit.default_timer() - client.images.pull(container_name) - pull_finish_time = timeit.default_timer() - print("Successfully pulled the docker image [%s] in %ss"% - (container_name, - datetime.timedelta(seconds=pull_finish_time - pull_start_time, microseconds=0) )) - - except Exception as e: - print("There was an error trying to pull the image [%s]: [%s]"%(container_name,str(e))) - raise(e) - - diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index e28370c101..d958ff1e81 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -251,6 +251,8 @@ class SplunkContainer: "Total Time :"\ "Container Start Time:"\ "Test Execution Time :" %(total_time_string, setup_time_string, testing_time_string) + + return summary_str def wait_for_splunk_ready( self, @@ -368,3 +370,4 @@ class SplunkContainer: # Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1, 30)) + From 4b42586bfd99ac30b994f0898007abec50a7cd16 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 16 Nov 2021 12:47:42 -0800 Subject: [PATCH 063/203] Created a new file to develop the arguments parsing logic. --- .../detection_testing_execution.py | 2 +- .../detection_testing_batch/new_arguments.py | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 automated_detection_testing/ci/detection_testing_batch/new_arguments.py diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 3c478d8191..992d20e9c3 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -422,7 +422,7 @@ def main(args): shutil.copyfile(BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH, os.path.join(local_volume_path, "Splunk_TA_microsoft_sysmon-1.0.2-B1.spl")) BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" - APPS_DICT['BETA_SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number":5709, 'app_version':"Generated at %s"%(datetime.now()), 'location':BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH} + APPS_DICT['BETA_SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number":5709, 'app_version':"Generated at %s"%(datetime.now()), 'location':"local", "container_path": BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH} except Exception as e: print("Failed to grab beta sysmon at ~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl. Using the one from Splunkbase") APPS_DICT['SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number":5709, 'app_version':"1.0.1", 'location':'splunkbase'} diff --git a/automated_detection_testing/ci/detection_testing_batch/new_arguments.py b/automated_detection_testing/ci/detection_testing_batch/new_arguments.py new file mode 100644 index 0000000000..a486dcecb2 --- /dev/null +++ b/automated_detection_testing/ci/detection_testing_batch/new_arguments.py @@ -0,0 +1,51 @@ +import argparse +import sys + + +def main(args): + parser = argparse.ArgumentParser( + description="Use 'SOME_PROGRAM_NAME_STRING --help' to get help with the arguments") + actions_parser = parser.add_subparsers(title="test action") + + configure_parser = actions_parser.add_parser( + "configure", help="configure a test run") + + configure_parser.add_argument( + '-c', '--context', required=True, help="Some help as a test") + + test_parser = actions_parser.add_parser("test", help="run a test") + test_parser.add_argument('-b', '--branch', required=True, + help="The branch whose detections you would like to test. "\ + "In order to calculate new/changed detections, the detections "\ + "in this branch will be diffed against those in the 'develop' branch") + test_parser.add_argument( + '-pr', '--pull_request_number', required=False, help="Pull request number.") + + mode_parser = test_parser.add_subparsers(title="Test Modes", required=True) + new_parser = mode_parser.add_parser("new", + #aliases=['changed'], + help="Test only the new or changed detections") + selected_parser = mode_parser.add_parser("selected", help="Test only the detections from the target branch that "\ + " are passed on the command line. These can be given as "\ + "a list of files or as a file containing a list of files.") + selected_group = selected_parser.add_mutually_exclusive_group(required=True) + selected_group.add_argument('-df', '--detections_file', type=argparse.FileType('r'), + required=False, help="A file containing a list of detections to run, one per line") + selected_group.add_argument('-dl', '--detections_list', + required=False, help="The names of files that you want to test, separated by commas. "\ + "Do not include spaces between the detections!") + + + + + all_parser = mode_parser.add_parser("all", + #aliases=['everything'], + help="Test all of the detections in the target branch. "\ + "Note that this could take a very long time.") + + + parser.parse_args() + + +if __name__ == "__main__": + main(sys.argv[1:]) From 80a1b9ad9b4095dafb880440685b35291f5064f4 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 16 Nov 2021 17:19:43 -0800 Subject: [PATCH 064/203] More progress adding and parsing new arguments. --- .../detection_testing_batch/new_arguments.py | 48 ++++++++++++++++--- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/new_arguments.py b/automated_detection_testing/ci/detection_testing_batch/new_arguments.py index a486dcecb2..037a12454e 100644 --- a/automated_detection_testing/ci/detection_testing_batch/new_arguments.py +++ b/automated_detection_testing/ci/detection_testing_batch/new_arguments.py @@ -3,6 +3,9 @@ import sys def main(args): + + default_args = {} + parser = argparse.ArgumentParser( description="Use 'SOME_PROGRAM_NAME_STRING --help' to get help with the arguments") actions_parser = parser.add_subparsers(title="test action") @@ -21,10 +24,41 @@ def main(args): test_parser.add_argument( '-pr', '--pull_request_number', required=False, help="Pull request number.") + VALID_DETECTION_TYPES = ['endpoint', 'cloud', 'network'] + + #Common Test Arguments + test_parser.add_argument('-t', '--types', type=str, action="append", + help="Detection types to test. Can be one or more of %s"%(VALID_DETECTION_TYPES)) + + + test_parser.add_argument('-e', '--escu_package', type=argparse.FileType('rb'), required=False, + help="A previously generated ESCU PAcklage to use. If you pass this "\ + "argument, a new ESCU package will not be generated. Note that this "\ + "may cause newly-written detections to fail (for example, if they "\ + "leverage macros that have been added or modified).") + + test_parser.add_argument('-p','--persist_security_content', required=False, action="store_true", + help="Assumes security_content directory already exists. Don't check it out and overwrite it again. Saves "\ + "time and allows you to test a detection that you've updated. Runs generate again in case you have "\ + "updated macros or anything else. Especially useful for quick, local, iterative testing.") + + + test_parser.add_argument('tag', '--container_tag', required=False, default = default_args['container_tag'], + help="The tag of the Splunk Container to use. Tags are located "\ + "at https://hub.docker.com/r/splunk/splunk/tags") + + test_parser.add_argument("-show", "--show_password", required=False, default=False, action='store_true', + help="Show the generated password to use to login to splunk. For a CI/CD run, "\ + "you probably don't want this.") + + + #Mode settings mode_parser = test_parser.add_subparsers(title="Test Modes", required=True) - new_parser = mode_parser.add_parser("new", - #aliases=['changed'], + #NEW + new_parser = mode_parser.add_parser("changes", help="Test only the new or changed detections") + + #SELECTED selected_parser = mode_parser.add_parser("selected", help="Test only the detections from the target branch that "\ " are passed on the command line. These can be given as "\ "a list of files or as a file containing a list of files.") @@ -35,16 +69,16 @@ def main(args): required=False, help="The names of files that you want to test, separated by commas. "\ "Do not include spaces between the detections!") - - - + #ALL all_parser = mode_parser.add_parser("all", - #aliases=['everything'], help="Test all of the detections in the target branch. "\ "Note that this could take a very long time.") - parser.parse_args() + a = parser.parse_args() + + print(a) + print(a.__dict__) if __name__ == "__main__": From 56f4223ecdbe86cd5d7ad5df6588651791e1c37f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 17 Nov 2021 14:09:28 -0800 Subject: [PATCH 065/203] Added some supporting code that will make generating config files and validating arguments easier. --- .../modules/jsonschema_errorprinter.py | 134 +++++++++++++ .../modules/validate_args.py | 181 ++++++++++++++++++ .../detection_testing_batch/new_arguments.py | 35 +++- .../detection_testing_batch/requirements.txt | 3 + 4 files changed, 345 insertions(+), 8 deletions(-) create mode 100644 automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py create mode 100644 automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py b/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py new file mode 100644 index 0000000000..438657e8f4 --- /dev/null +++ b/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py @@ -0,0 +1,134 @@ +""" +Courtesy https://github.com/ccpgames/jsonschema-errorprinter with minor +updates to support Python 3 (changed cStringIO to io), to print out +multiple errors, and a few other small changes. + +Licensed under the MIT License, reproduced below: +Copyright © 2015 CCP hf. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +THERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. +""" + +""" + Json Schema Validation Error Pretty-printer. + --------------------------------------------------- + + Makes a user friendly error message from a ValidationError. + +""" +import json +import io + + + +import jsonschema + + +def check_json(json_object, schema, context=None): + try: + validator = jsonschema.Draft7Validator(schema, jsonschema.FormatChecker()) + errors_formatted = [] + for error in sorted(validator.iter_errors(json_object), key=str): + + #validate(json_object, schema, format_checker=FormatChecker()) + #except jsonschema.ValidationError as e: + report = generate_validation_error_report(error, json_object) + #note = "\n*** Note - If there is more than one error, only the first error is shown ***\n\n" + if context: + errors_formatted.append("Schema check failed for '{}'\n{}".format(context, report)) + #return note + "Schema check failed for '{}'\n{}".format(context, report) + else: + errors_formatted.append("Schema check failed.\n{}".format(report)) + #return note + "Schema check failed.\n{}".format(report) + return errors_formatted + except Exception as e: + #Some error occurred, probably related to the schema itself + raise(Exception("Error validating the JSON Schema: %s"%(str(e)))) + + + +def generate_validation_error_report( + e, + json_object, + lines_before=7, + lines_after=7 + ): + """ + Generate a detailed report of a schema validation error. + + 'e' is a jsonschema.ValidationError exception that errored on + 'json_object'. + + Steps to discover the location of the validation error: + 1. Traverse the json object using the 'path' in the validation exception + and replace the offending value with a special marker. + 2. Pretty-print the json object indendented json text. + 3. Search for the special marker in the json text to find the actual + line number of the error. + 4. Make a report by showing the error line with a context of + 'lines_before' and 'lines_after' number of lines on each side. + """ + + if json_object is None: + return "'json_object' cannot be None." + if not e.path: + return str(e) + marker = "3fb539deef7c4e2991f265c0a982f5ea" + + # Find the object that is erroring, and replace it with the marker. + ob_tmp = json_object + for entry in list(e.path)[:-1]: + ob_tmp = ob_tmp[entry] + + orig, ob_tmp[e.path[-1]] = ob_tmp[e.path[-1]], marker + + # Pretty print the object and search for the marker. + json_error = json.dumps(json_object, indent=4) + string_io_instance = io.StringIO(json_error) + errline = None + + for lineno, text in enumerate(string_io_instance): + if marker in text: + errline = lineno + break + + if errline is not None: + # Re-create report. + report = [] + ob_tmp[e.path[-1]] = orig + json_error = json.dumps(json_object, indent=4) + string_io_instance = io.StringIO(json_error) + + for lineno, text in enumerate(string_io_instance): + if lineno == errline: + line_text = "{:4}: >>>".format(lineno+1) + else: + line_text = "{:4}: ".format(lineno+1) + report.append(line_text + text.rstrip("\n")) + + report = report[max(0, errline-lines_before):errline+1+lines_after] + + s = "Error in line {}:\n".format(errline+1) + s += "\n".join(report) + s+= '\n\tREASON:' + str(e).split('\n')[0] + #s += "\n\n" + str(e).replace("u'", "'") + else: + s = str(e) + return s \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py new file mode 100644 index 0000000000..df1195aa62 --- /dev/null +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -0,0 +1,181 @@ +import argparse +import io +import json +import jsonschema_errorprinter + + +setup_schema = { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": ["configure", "test"] + + }, + + "branch": { + "type":"string" + }, + + "container_tag": { + "type": "string" + }, + + "interactive_failure": { + "type": "boolean" + }, + + "local_apps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "local_path": { + "type": "string" + }, + "app_name": { + "type": "string" + }, + "app_number": { + "type": "integer" + }, + "app_version": { + "type": "string" + } + } + } + }, + + "mode": { + "type":"string", + "enum": ["changes", "selected", "new"] + }, + + "num_containers": { + "type": "integer", + "minimum": 1 + }, + + "persist_security_content": { + "type": "boolean" + }, + + "pr_number": { + "type":"integer" + }, + + "reuse_image": { + "type": "boolean" + }, + + "show_password": { + "type": "boolean" + }, + + "splunkbase_apps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "app_name": { + "type": "string" + }, + "app_number": { + "type": "integer" + }, + "app_version": { + "type": "string" + }, + "app_name": { + "type": "string" + } + } + } + }, + + "types": { + "type": "array", + "enum": ["endpoint", "cloud", "network"], + "maxItems": 3, + "maxItemsssss":2 + }, + + + + + + + + } +} + +import jsonschema +import jsonschema.exceptions +import sys + +def v(configuration:dict)->bool: + #v = jsonschema.Draft201909Validator(argument_schema) + test = {"action":"tests", "branch":15} + try: + validation_results = jsonschema_errorprinter.check_json(test, setup_schema) + if len(validation_results) == 0: + print("Input configuration successfully validated!") + return True + else: + print("[%d] failures detected during validation of the configuration!"%(len(validation_results))) + for error in validation_results: + print(error,end="\n\n", file=sys.stderr) + return False + except Exception as e: + print(str(e)) + return False + + + ''' + try: + v.validate({"action":"doot", "branch":"15"} ) + except jsonschema.exceptions.ValidationError as e: + print("Error validating the json", file=sys.stderr) + print(e) + return False + + except jsonschema.exceptions.SchemaError as e: + print("Error validating the schema", file=sys.stderr) + ''' +if __name__ == "__main__": + v() +''' +def load(json_settings: io.TextIOWrapper) -> dict: + default_settings = json.load(json_settings) + return default_settings + + +def load_and_validate(json_settings: io.TextIOWrapper) -> dict: + settings = load(json_settings) + validate(settings) + return settings + + +def validate(args: dict) -> bool: + validate_common_arguments() + + validate_mode() + + return True + + +def validate_mode(args: dict) -> bool: + return True + + +def validate_mode_selected(args: dict) -> bool: + return True + + +def validate_mode_changes(args: dict) -> -bool: + return True + + +def validate_mode_all(args: dict) -> bool: + return True +''' \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/new_arguments.py b/automated_detection_testing/ci/detection_testing_batch/new_arguments.py index 037a12454e..40a3f38409 100644 --- a/automated_detection_testing/ci/detection_testing_batch/new_arguments.py +++ b/automated_detection_testing/ci/detection_testing_batch/new_arguments.py @@ -1,10 +1,18 @@ import argparse +import json +from modules import validate_args import sys - +DEFAULT_CONFIG_FILE = "defaults.json" def main(args): - default_args = {} + try: + with open(DEFAULT_CONFIG_FILE, 'r') as settings_file: + default_settings = json.load(settings_file) + except Exception as e: + print("Error loading settings file %s: %s"%(DEFAULT_CONFIG_FILE, str(e)), file=sys.stderr) + sys.exit(1) + parser = argparse.ArgumentParser( description="Use 'SOME_PROGRAM_NAME_STRING --help' to get help with the arguments") @@ -14,7 +22,7 @@ def main(args): "configure", help="configure a test run") configure_parser.add_argument( - '-c', '--context', required=True, help="Some help as a test") + '-o', '--output_config', required=True, help="Name of config file to generate") test_parser = actions_parser.add_parser("test", help="run a test") test_parser.add_argument('-b', '--branch', required=True, @@ -43,7 +51,7 @@ def main(args): "updated macros or anything else. Especially useful for quick, local, iterative testing.") - test_parser.add_argument('tag', '--container_tag', required=False, default = default_args['container_tag'], + test_parser.add_argument('-tag', '--container_tag', required=False, default = default_args['container_tag'], help="The tag of the Splunk Container to use. Tags are located "\ "at https://hub.docker.com/r/splunk/splunk/tags") @@ -51,6 +59,13 @@ def main(args): help="Show the generated password to use to login to splunk. For a CI/CD run, "\ "you probably don't want this.") + test_parser.add_argument('-r','--reuse_image', required=False, default=True, action='store_true', + help="Should existing images be re-used, or should they be redownloaded?") + + test_parser.add_argument('-i', '--interactive_failure', required=False, default=False, action='store_true', + help="If a test fails, should we pause before removing data so that the search can be debugged?") + + #Mode settings mode_parser = test_parser.add_subparsers(title="Test Modes", required=True) @@ -75,10 +90,14 @@ def main(args): "Note that this could take a very long time.") - a = parser.parse_args() - - print(a) - print(a.__dict__) + args = parser.parse_args() + try: + validate_args.validate(args.__dict__) + + except Exception as e: + print("Error validating command line arguments: [%s]"%(str(e))) + sys.exit(1) + if __name__ == "__main__": diff --git a/automated_detection_testing/ci/detection_testing_batch/requirements.txt b/automated_detection_testing/ci/detection_testing_batch/requirements.txt index d4a44f878c..defe6be649 100644 --- a/automated_detection_testing/ci/detection_testing_batch/requirements.txt +++ b/automated_detection_testing/ci/detection_testing_batch/requirements.txt @@ -12,3 +12,6 @@ splunk-packaging-toolkit==1.0.1 #newest version of docker for managing the splunk containers #we will freeze at a specific version later docker==5.0.3 + +#For help getting and parsing the configuration +jsonschema From 82d53ccbd9978a7a862b65a148ba1ed23b7bc27f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 17 Nov 2021 16:23:39 -0800 Subject: [PATCH 066/203] Moving to json based configuration files and a framework to generate that file, too --- .../modules/jsonschema_errorprinter.py | 79 ++++++--- .../modules/new_arguments2.py | 138 +++++++++++++++ .../modules/validate_args.py | 166 ++++++++++++------ .../detection_testing_batch/new_arguments.py | 2 + 4 files changed, 308 insertions(+), 77 deletions(-) create mode 100644 automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py b/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py index 438657e8f4..afb07ebdf1 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py @@ -1,7 +1,8 @@ """ Courtesy https://github.com/ccpgames/jsonschema-errorprinter with minor updates to support Python 3 (changed cStringIO to io), to print out -multiple errors, and a few other small changes. +multiple errors, the ability to place default values, and a few +other small changes. Licensed under the MIT License, reproduced below: Copyright © 2015 CCP hf. @@ -33,35 +34,69 @@ OR OTHER DEALINGS IN THE SOFTWARE. Makes a user friendly error message from a ValidationError. """ -import json + + + import io - - - +import json import jsonschema +import jsonschema.validators + +# The 'default' field is really just for documentation in the +# json schema. We would like to use it to actually fill in +# values when they aren't supplied. This code is provided +# by the jsonschema project itself because this behavior +# is not part of the default jsonschema definition +# https://python-jsonschema.readthedocs.io/en/latest/faq/ +def extend_with_default(validator_class): + validate_properties = validator_class.VALIDATORS["properties"] + + def set_defaults(validator, properties, instance, schema): + for property, subschema in properties.items(): + if "default" in subschema: + instance.setdefault(property, subschema["default"]) + + for error in validate_properties( + validator, properties, instance, schema, + ): + yield error + + return jsonschema.validators.extend( + validator_class, {"properties": set_defaults}, + ) -def check_json(json_object, schema, context=None): +def check_json(json_object, schema, context=None) -> tuple[list[str], dict]: try: - validator = jsonschema.Draft7Validator(schema, jsonschema.FormatChecker()) + DefaultValidatingDraft7Validator = extend_with_default( + jsonschema.Draft7Validator) + + validator = DefaultValidatingDraft7Validator(schema, jsonschema.FormatChecker()) errors_formatted = [] for error in sorted(validator.iter_errors(json_object), key=str): #validate(json_object, schema, format_checker=FormatChecker()) - #except jsonschema.ValidationError as e: + # except jsonschema.ValidationError as e: report = generate_validation_error_report(error, json_object) #note = "\n*** Note - If there is more than one error, only the first error is shown ***\n\n" if context: - errors_formatted.append("Schema check failed for '{}'\n{}".format(context, report)) - #return note + "Schema check failed for '{}'\n{}".format(context, report) + errors_formatted.append( + "Schema check failed for '{}'\n{}".format(context, report)) + # return note + "Schema check failed for '{}'\n{}".format(context, report) else: - errors_formatted.append("Schema check failed.\n{}".format(report)) - #return note + "Schema check failed.\n{}".format(report) - return errors_formatted + errors_formatted.append( + "Schema check failed.\n{}".format(report)) + # return note + "Schema check failed.\n{}".format(report) + if len(errors_formatted) == 0: + #DefaultValidatingDraft7Validator = extend_with_default( + # jsonschema.Draft7Validator) + #DefaultValidatingDraft7Validator(schema).validate(json_object) + return (errors_formatted, json_object) + else: + return (errors_formatted, {}) except Exception as e: - #Some error occurred, probably related to the schema itself - raise(Exception("Error validating the JSON Schema: %s"%(str(e)))) - + # Some error occurred, probably related to the schema itself + raise(Exception("Error validating the JSON Schema: %s" % (str(e)))) def generate_validation_error_report( @@ -69,7 +104,7 @@ def generate_validation_error_report( json_object, lines_before=7, lines_after=7 - ): +): """ Generate a detailed report of a schema validation error. @@ -105,9 +140,9 @@ def generate_validation_error_report( errline = None for lineno, text in enumerate(string_io_instance): - if marker in text: - errline = lineno - break + if marker in text: + errline = lineno + break if errline is not None: # Re-create report. @@ -127,8 +162,8 @@ def generate_validation_error_report( s = "Error in line {}:\n".format(errline+1) s += "\n".join(report) - s+= '\n\tREASON:' + str(e).split('\n')[0] + s += '\n\tREASON:' + str(e).split('\n')[0] #s += "\n\n" + str(e).replace("u'", "'") else: s = str(e) - return s \ No newline at end of file + return s diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py new file mode 100644 index 0000000000..1dba7e68bf --- /dev/null +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -0,0 +1,138 @@ +import argparse +import json +from typing import OrderedDict +import validate_args +import sys + + +def configure_action(args): + print("WE ARE CONFIGURING!") + settings = OrderedDict() + + settings = validate_args.v(validate_args.setup_schema) + if settings is False: + print("Failure while processing settings.\n\tQuitting...", file=sys.stderr) + sys.exit(1) + for arg in settings: + choice = input("%s [%s]:"%(arg,settings[arg])) + + + + +DEFAULT_CONFIG_FILE = "defaults.json" +def main(args): + ''' + try: + with open(DEFAULT_CONFIG_FILE, 'r') as settings_file: + default_settings = json.load(settings_file) + except Exception as e: + print("Error loading settings file %s: %s"%(DEFAULT_CONFIG_FILE, str(e)), file=sys.stderr) + sys.exit(1) + ''' + + parser = argparse.ArgumentParser( + description="Use 'SOME_PROGRAM_NAME_STRING --help' to get help with the arguments") + parser.set_defaults(func=lambda _: parser.print_help()) + + actions_parser = parser.add_subparsers(title="Action") + + configure_parser = actions_parser.add_parser( + "configure", help="Configure a test run") + configure_parser.set_defaults(func=configure_action) + configure_parser.add_argument('-i', '--input_config_file', required=False, type=argparse.FileType('r'), default=DEFAULT_CONFIG_FILE, help="The config file to base the configuration off of.") + configure_parser.add_argument('-o', '--output_config_file', required=False, type=argparse.FileType('w'), help="The config file to write the configuration off of.") + + + + test_parser = actions_parser.add_parser( + "run", help="Run a test") + + args = parser.parse_args() + #Run the appropriate parser + + args.func(args) + + ''' + + configure_parser.add_argument( + '-o', '--output_config', required=True, help="Name of config file to generate") + + test_parser = actions_parser.add_parser("test", help="run a test") + test_parser.add_argument('-b', '--branch', required=True, + help="The branch whose detections you would like to test. "\ + "In order to calculate new/changed detections, the detections "\ + "in this branch will be diffed against those in the 'develop' branch") + test_parser.add_argument( + '-pr', '--pull_request_number', required=False, help="Pull request number.") + + VALID_DETECTION_TYPES = ['endpoint', 'cloud', 'network'] + + #Common Test Arguments + test_parser.add_argument('-t', '--types', type=str, action="append", + help="Detection types to test. Can be one or more of %s"%(VALID_DETECTION_TYPES)) + + + test_parser.add_argument('-e', '--escu_package', type=argparse.FileType('rb'), required=False, + help="A previously generated ESCU PAcklage to use. If you pass this "\ + "argument, a new ESCU package will not be generated. Note that this "\ + "may cause newly-written detections to fail (for example, if they "\ + "leverage macros that have been added or modified).") + + test_parser.add_argument('-p','--persist_security_content', required=False, action="store_true", + help="Assumes security_content directory already exists. Don't check it out and overwrite it again. Saves "\ + "time and allows you to test a detection that you've updated. Runs generate again in case you have "\ + "updated macros or anything else. Especially useful for quick, local, iterative testing.") + + + test_parser.add_argument('-tag', '--container_tag', required=False, default = default_args['container_tag'], + help="The tag of the Splunk Container to use. Tags are located "\ + "at https://hub.docker.com/r/splunk/splunk/tags") + + test_parser.add_argument("-show", "--show_password", required=False, default=False, action='store_true', + help="Show the generated password to use to login to splunk. For a CI/CD run, "\ + "you probably don't want this.") + + test_parser.add_argument('-r','--reuse_image', required=False, default=True, action='store_true', + help="Should existing images be re-used, or should they be redownloaded?") + + test_parser.add_argument('-i', '--interactive_failure', required=False, default=False, action='store_true', + help="If a test fails, should we pause before removing data so that the search can be debugged?") + + + + #Mode settings + mode_parser = test_parser.add_subparsers(title="Test Modes", required=True) + #NEW + new_parser = mode_parser.add_parser("changes", + help="Test only the new or changed detections") + + #SELECTED + + selected_parser = mode_parser.add_parser("selected", help="Test only the detections from the target branch that "\ + " are passed on the command line. These can be given as "\ + "a list of files or as a file containing a list of files.") + selected_group = selected_parser.add_mutually_exclusive_group(required=True) + selected_group.add_argument('-df', '--detections_file', type=argparse.FileType('r'), + required=False, help="A file containing a list of detections to run, one per line") + selected_group.add_argument('-dl', '--detections_list', + required=False, help="The names of files that you want to test, separated by commas. "\ + "Do not include spaces between the detections!") + + #ALL + all_parser = mode_parser.add_parser("all", + help="Test all of the detections in the target branch. "\ + "Note that this could take a very long time.") + + + args = parser.parse_args() + try: + validate_args.validate(args.__dict__) + + except Exception as e: + print("Error validating command line arguments: [%s]"%(str(e))) + sys.exit(1) + ''' + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index df1195aa62..7664dae569 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -1,28 +1,32 @@ +import sys +import jsonschema.exceptions +import jsonschema import argparse import io import json import jsonschema_errorprinter +from typing import Union +# If we want, we can easily add a description field to any of the objects here! setup_schema = { "type": "object", "properties": { - "action": { - "type": "string", - "enum": ["configure", "test"] - - }, + "branch": { - "type":"string" + "type": "string", + "default": "develop" }, "container_tag": { - "type": "string" + "type": "string", + "default": "latest" }, - + "interactive_failure": { - "type": "boolean" + "type": "boolean", + "default": False }, "local_apps": { @@ -30,9 +34,6 @@ setup_schema = { "items": { "type": "object", "properties": { - "local_path": { - "type": "string" - }, "app_name": { "type": "string" }, @@ -41,35 +42,46 @@ setup_schema = { }, "app_version": { "type": "string" - } - } + }, + "local_path": { + "type": "string" + }, + }, + "default": [] } }, "mode": { - "type":"string", - "enum": ["changes", "selected", "new"] + "type": "string", + "enum": ["changes", "selected", "new"], + "default": "changes" }, "num_containers": { "type": "integer", - "minimum": 1 + "minimum": 1, + "default": 1 }, "persist_security_content": { - "type": "boolean" + "type": "boolean", + "default": False }, "pr_number": { - "type":"integer" + "type": ["integer", "null"], + "default": None }, "reuse_image": { - "type": "boolean" + "type": "boolean", + "default": True }, "show_password": { - "type": "boolean" + "type": "boolean", + "default": False + }, "splunkbase_apps": { @@ -85,53 +97,90 @@ setup_schema = { }, "app_version": { "type": "string" - }, - "app_name": { - "type": "string" } - } - } + }, + }, + "default": [ + {"app_name": "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES", + "app_number": 1876, "app_version": "5.2.0"}, + {"app_name": "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365", + "app_number": 4055, "app_version": "2.2.0"}, + {"app_name": "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE", + "app_number": 3719, "app_version": "1.3.2"}, + {"app_name": "SPLUNK_ANALYTIC_STORY_EXECUTION_APP", + "app_number": 4971, "app_version": "2.0.3"}, + {"app_name": "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT", + "app_number": 2882, "app_version": "2.0.2"}, + {"app_name": "SPLUNK_MACHINE_LEARNING_TOOLKIT", + "app_number": 2890, "app_version": "5.2.2"}, + {"app_name": "SPLUNK_APP_FOR_STREAM", + "app_number": 1809, "app_version": "8.0.1"}, + {"app_name": "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA", + "app_number": 5234, "app_version": "8.0.1"}, + {"app_name": "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS", + "app_number": 5238, "app_version": "8.0.1"}, + {"app_name": "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO", + "app_number": 1617, "app_version": "4.0.0"}, + {"app_name": "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX", + "app_number": 833, "app_version": "8.3.1"}, + {"app_name": "SPLUNK_COMMON_INFORMATION_MODEL", + "app_number": 1621, "app_version": "4.20.2"} + ] + }, + "splunkbase_username": { + "type": ["string","null"], + "default": None + }, + "splunkbase_password": { + "type": ["string", "null"], + "default": None + }, + "splunk_container_apps_directory":{ + "type":"string", + "default": "/opt/splunk/etc/apps" + }, + "local_base_container_name": { + "type": "string", + "default": "splunk_test_%d" + }, + + "mock": { + "type": "boolean", + "default": False }, "types": { "type": "array", - "enum": ["endpoint", "cloud", "network"], - "maxItems": 3, - "maxItemsssss":2 + "items": { + "type": "string", + "enum": ["endpoint", "cloud", "network"] + }, + "default": ["endpoint", "cloud", "network"] }, - - - - - - - } } -import jsonschema -import jsonschema.exceptions -import sys -def v(configuration:dict)->bool: +def v(configuration: dict) -> Union[bool, dict]: #v = jsonschema.Draft201909Validator(argument_schema) - test = {"action":"tests", "branch":15} + try: - validation_results = jsonschema_errorprinter.check_json(test, setup_schema) - if len(validation_results) == 0: + validation_errors, validated_json = jsonschema_errorprinter.check_json( + configuration, setup_schema) + if len(validation_errors) == 0: print("Input configuration successfully validated!") - return True + return validated_json else: - print("[%d] failures detected during validation of the configuration!"%(len(validation_results))) - for error in validation_results: - print(error,end="\n\n", file=sys.stderr) - return False + print("[%d] failures detected during validation of the configuration!" % ( + len(validation_errors))) + for error in validation_errors: + print(error, end="\n\n", file=sys.stderr) + return False except Exception as e: - print(str(e)) + print(str(e), file=sys.stderr) return False - - ''' + """ try: v.validate({"action":"doot", "branch":"15"} ) except jsonschema.exceptions.ValidationError as e: @@ -141,10 +190,17 @@ def v(configuration:dict)->bool: except jsonschema.exceptions.SchemaError as e: print("Error validating the schema", file=sys.stderr) - ''' + """ + + if __name__ == "__main__": - v() -''' + c = v({"action": "test", "branch": "wow"}) + print(c) + if c is False: + print("whoops") + else: + print(c.keys()) +""" def load(json_settings: io.TextIOWrapper) -> dict: default_settings = json.load(json_settings) return default_settings @@ -178,4 +234,4 @@ def validate_mode_changes(args: dict) -> -bool: def validate_mode_all(args: dict) -> bool: return True -''' \ No newline at end of file +""" diff --git a/automated_detection_testing/ci/detection_testing_batch/new_arguments.py b/automated_detection_testing/ci/detection_testing_batch/new_arguments.py index 40a3f38409..b485bd9d69 100644 --- a/automated_detection_testing/ci/detection_testing_batch/new_arguments.py +++ b/automated_detection_testing/ci/detection_testing_batch/new_arguments.py @@ -3,6 +3,7 @@ import json from modules import validate_args import sys + DEFAULT_CONFIG_FILE = "defaults.json" def main(args): @@ -74,6 +75,7 @@ def main(args): help="Test only the new or changed detections") #SELECTED + selected_parser = mode_parser.add_parser("selected", help="Test only the detections from the target branch that "\ " are passed on the command line. These can be given as "\ "a list of files or as a file containing a list of files.") From cf8d5f2dffa3aaead48b98a3690b52c166a97002 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Thu, 18 Nov 2021 13:01:55 -0800 Subject: [PATCH 067/203] Much better configuration parsing, validation, and substitution of defaults using jsonschema. --- .../modules/jsonschema_errorprinter.py | 4 ++ .../modules/new_arguments2.py | 55 ++++++++++++++++--- .../modules/validate_args.py | 19 +++---- 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py b/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py index afb07ebdf1..9a1eb91888 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py @@ -71,13 +71,17 @@ def check_json(json_object, schema, context=None) -> tuple[list[str], dict]: DefaultValidatingDraft7Validator = extend_with_default( jsonschema.Draft7Validator) + validator = DefaultValidatingDraft7Validator(schema, jsonschema.FormatChecker()) + #validator = jsonschema.Draft7Validator(schema, jsonschema.FormatChecker()) errors_formatted = [] + for error in sorted(validator.iter_errors(json_object), key=str): #validate(json_object, schema, format_checker=FormatChecker()) # except jsonschema.ValidationError as e: report = generate_validation_error_report(error, json_object) + #note = "\n*** Note - If there is more than one error, only the first error is shown ***\n\n" if context: errors_formatted.append( diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index 1dba7e68bf..7a49308aad 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -6,15 +6,56 @@ import sys def configure_action(args): - print("WE ARE CONFIGURING!") settings = OrderedDict() - - settings = validate_args.v(validate_args.setup_schema) - if settings is False: + if args.input_config_file is None: + settings,schema = validate_args.validate({}) + else: + try: + cfg = json.loads(args.input_config_file.read()) + except Exception as e: + raise(e) + settings,schema = validate_args.validate(cfg) + + + + if settings == None: print("Failure while processing settings.\n\tQuitting...", file=sys.stderr) sys.exit(1) + + new_config = {} for arg in settings: - choice = input("%s [%s]:"%(arg,settings[arg])) + default = settings[arg] + default_string = str(default).replace("'", '"') + choice = input("%s [default: %s]: "%(arg,default_string)) + choice = choice.strip() + if len(choice) == 0: + print("\tNothing entered, using default:") + new_config[arg] = default + else: + if choice.lower() in ["true", "false"] and schema['properties'][arg]['type'] == "boolean" : + new_config[arg] = json.loads(choice.lower()) + else: + if choice in ['true','false'] or (choice.isdigit() and schema['properties'][arg]['type'] != "integer"): + choice = '"' + choice + '"' + # replace all single quotes with doubles quotes to make valid json + if "'" in choice: + print('''Found %d single quotes (') in input... we will convert these to double quotes (") to ensure valida json.'''%(choice.count("'"))) + choice = choice.replace("'",'"') + new_config[arg] = json.loads(choice) + print("\t{0}\n".format(new_config[arg])) + + + #Now parse the new config and make sure it's good + validated_new_settings, schema = validate_args.validate(new_config) + if validate_args == None: + print("Error in the new settings!") + else: + print("New settings worked great. Writing results to : %s"%(args.output_config_file.name)) + args.output_config_file.write(json.dumps(validated_new_settings, sort_keys=True, indent=4)) + + + + @@ -39,8 +80,8 @@ def main(args): configure_parser = actions_parser.add_parser( "configure", help="Configure a test run") configure_parser.set_defaults(func=configure_action) - configure_parser.add_argument('-i', '--input_config_file', required=False, type=argparse.FileType('r'), default=DEFAULT_CONFIG_FILE, help="The config file to base the configuration off of.") - configure_parser.add_argument('-o', '--output_config_file', required=False, type=argparse.FileType('w'), help="The config file to write the configuration off of.") + configure_parser.add_argument('-i', '--input_config_file', required=False, type=argparse.FileType('r'), help="The config file to base the configuration off of.") + configure_parser.add_argument('-o', '--output_config_file', required=True, type=argparse.FileType('w'), help="The config file to write the configuration off of.") diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 7664dae569..4ca67b8ddf 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -1,10 +1,11 @@ -import sys -import jsonschema.exceptions -import jsonschema import argparse +import copy import io import json +import jsonschema +import jsonschema.exceptions import jsonschema_errorprinter +import sys from typing import Union @@ -12,8 +13,6 @@ from typing import Union setup_schema = { "type": "object", "properties": { - - "branch": { "type": "string", "default": "develop" @@ -161,24 +160,24 @@ setup_schema = { } -def v(configuration: dict) -> Union[bool, dict]: +def validate(configuration: dict) -> tuple[Union[dict,None],dict]: #v = jsonschema.Draft201909Validator(argument_schema) - + try: validation_errors, validated_json = jsonschema_errorprinter.check_json( configuration, setup_schema) if len(validation_errors) == 0: print("Input configuration successfully validated!") - return validated_json + return validated_json, setup_schema else: print("[%d] failures detected during validation of the configuration!" % ( len(validation_errors))) for error in validation_errors: print(error, end="\n\n", file=sys.stderr) - return False + return None, setup_schema except Exception as e: print(str(e), file=sys.stderr) - return False + return None, setup_schema """ try: From aca21ef2857d5e0fb9664028e5e35a02e16fc097 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Thu, 18 Nov 2021 15:44:01 -0800 Subject: [PATCH 068/203] Changes to the interface used to construct the config file and perform additional validation of the file --- .../modules/new_arguments2.py | 143 ++++++++++++---- .../modules/validate_args.py | 157 ++++++++++++++---- 2 files changed, 232 insertions(+), 68 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index 7a49308aad..4375b08e4a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -4,63 +4,100 @@ from typing import OrderedDict import validate_args import sys +DEFAULT_CONFIG_FILE = "test_config.json" -def configure_action(args): +def configure_action(args) -> bool: settings = OrderedDict() if args.input_config_file is None: - settings,schema = validate_args.validate({}) + settings, schema = validate_args.validate({}) else: - try: - cfg = json.loads(args.input_config_file.read()) - except Exception as e: - raise(e) - settings,schema = validate_args.validate(cfg) - - + settings, schema = validate_args.validate_file(args.input_config_file) - if settings == None: + if settings is None: print("Failure while processing settings.\n\tQuitting...", file=sys.stderr) sys.exit(1) - + new_config = {} for arg in settings: default = settings[arg] default_string = str(default).replace("'", '"') - choice = input("%s [default: %s]: "%(arg,default_string)) + + if 'enum' in schema['properties'][arg]: + choice = input("%s [default: %s | choices: {%s}]: " % (arg, default_string,','.join(schema['properties'][arg]['enum']))) + else: + choice = input("%s [default: %s]: " % (arg, default_string)) choice = choice.strip() if len(choice) == 0: print("\tNothing entered, using default:") new_config[arg] = default + formatted_print = default else: - if choice.lower() in ["true", "false"] and schema['properties'][arg]['type'] == "boolean" : + if choice.lower() in ["true", "false"] and schema['properties'][arg]['type'] == "boolean": new_config[arg] = json.loads(choice.lower()) + formatted_print = choice.lower() else: - if choice in ['true','false'] or (choice.isdigit() and schema['properties'][arg]['type'] != "integer"): + if choice in ['true', 'false'] or (choice.isdigit() and schema['properties'][arg]['type'] != "integer"): choice = '"' + choice + '"' # replace all single quotes with doubles quotes to make valid json - if "'" in choice: - print('''Found %d single quotes (') in input... we will convert these to double quotes (") to ensure valida json.'''%(choice.count("'"))) - choice = choice.replace("'",'"') + elif "'" in choice: + print('''Found %d single quotes (') in input... we will convert these to double quotes (") to ensure valida json.''' % ( + choice.count("'"))) + choice = choice.replace("'", '"') + elif '"' in choice: + #Do nothing + pass + else: + choice = '"' + choice + '"' + new_config[arg] = json.loads(choice) - print("\t{0}\n".format(new_config[arg])) + formatted_print = choice + #We print out choice instead of new_config[arg] because the json.loads() messes up the quotation marks again + print("\t{0}\n".format(formatted_print)) - - #Now parse the new config and make sure it's good + # Now parse the new config and make sure it's good validated_new_settings, schema = validate_args.validate(new_config) - if validate_args == None: + if validated_new_settings == None: print("Error in the new settings!") + return False else: - print("New settings worked great. Writing results to : %s"%(args.output_config_file.name)) - args.output_config_file.write(json.dumps(validated_new_settings, sort_keys=True, indent=4)) + print("New settings worked great. Writing results to: %s" % + (args.output_config_file.name)) + args.output_config_file.write(json.dumps( + validated_new_settings, sort_keys=True, indent=4)) + return True + + +def update_config_with_cli_arguments(args_dict:dict)->dict: + #First load the config file + + settings,_ = validate_args.validate_file(args_dict['config_file']) + if settings is None: + print("Failure while processing settings in [%s].\n\tQuitting..."%(args_dict['config_file'].name), file=sys.stderr) + sys.exit(1) + + #Then update it with the values that were passed as command line arguments + for key, value in args_dict.items(): + if key in settings: + settings[key] = value + + #Validate again to make sure we didn't break anything + settings,_ = validate_args.validate(settings) + if settings is None: + print("Failure while processing updated settings from command line.\n\tQuitting...", file=sys.stderr) + sys.exit(1) + + return settings +def run_action(args) -> bool: - + config = update_config_with_cli_arguments(args.__dict__) + + + return True - -DEFAULT_CONFIG_FILE = "defaults.json" def main(args): ''' try: @@ -74,24 +111,62 @@ def main(args): parser = argparse.ArgumentParser( description="Use 'SOME_PROGRAM_NAME_STRING --help' to get help with the arguments") parser.set_defaults(func=lambda _: parser.print_help()) - + actions_parser = parser.add_subparsers(title="Action") + # Configure parser configure_parser = actions_parser.add_parser( "configure", help="Configure a test run") configure_parser.set_defaults(func=configure_action) - configure_parser.add_argument('-i', '--input_config_file', required=False, type=argparse.FileType('r'), help="The config file to base the configuration off of.") - configure_parser.add_argument('-o', '--output_config_file', required=True, type=argparse.FileType('w'), help="The config file to write the configuration off of.") - + configure_parser.add_argument('-i', '--input_config_file', required=False, + type=argparse.FileType('r'), help="The config file to base the configuration off of.") + configure_parser.add_argument('-o', '--output_config_file', required=False, default=DEFAULT_CONFIG_FILE, + type=argparse.FileType('w'), help="The config file to write the configuration off of.") - - test_parser = actions_parser.add_parser( + # Run parser + run_parser = actions_parser.add_parser( "run", help="Run a test") + run_parser.set_defaults(func=run_action) + run_parser.add_argument('-c', '--config_file', required=False, + type=argparse.FileType('r'), + default = DEFAULT_CONFIG_FILE, + help="The config file for the test. Note that this file "\ + "cannot be changed (except for credentials that can be "\ + "entered on the command line).") + + run_parser.add_argument('-user', '--splunkbase_username', required=False, type=str, + help="Username for login to splunkbase. This is required " + "if downloading packages from Splunkbase. While this can " + "be stored in the config file, it is strongly recommended " + "to enter it at runtime.") + run_parser.add_argument('-pass', '--splunkbase_password', required=False, type=str, + help="Password for login to splunkbase. This is required if " + "downloading packages from Splunkbase. While this can be " + "stored in the config file, it is strongly recommended " + "to enter it at runtime.") + + run_parser.add_argument('-splunkpass', '--splunk_app_password', required=False, type=str, + help="Password for login to the splunk app. If you don't " + "provide one here or in the config, it will be generated " + "automatically for you.") + run_parser.add_argument("-show_pass", "--show_splunk_app_password", required=False, + action="store_true", + help="The password to login to the Splunk Server. ") args = parser.parse_args() - #Run the appropriate parser + + # Run the appropriate parser - args.func(args) + try: + if args.func(args): + print("Success!") + sys.exit(0) + else: + print("Fail") + sys.exit(1) + except Exception as e: + print("Unknown Error - [%s]" % (str(e))) + sys.exit(1) ''' diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 4ca67b8ddf..624ae90e5e 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -10,6 +10,7 @@ from typing import Union # If we want, we can easily add a description field to any of the objects here! + setup_schema = { "type": "object", "properties": { @@ -27,6 +28,19 @@ setup_schema = { "type": "boolean", "default": False }, + + "detections_list": { + "type":["array"], + "items": { + "type":"string" + }, + "default":[], + }, + + "detections_file":{ + "type": ["string","null"], + "default": None + }, "local_apps": { "type": "array", @@ -52,7 +66,7 @@ setup_schema = { "mode": { "type": "string", - "enum": ["changes", "selected", "new"], + "enum": ["changes", "selected", "all"], "default": "changes" }, @@ -77,9 +91,9 @@ setup_schema = { "default": True }, - "show_password": { + "show_splunk_app_password": { "type": "boolean", - "default": False + "default": True }, @@ -100,49 +114,89 @@ setup_schema = { }, }, "default": [ - {"app_name": "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES", - "app_number": 1876, "app_version": "5.2.0"}, - {"app_name": "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365", - "app_number": 4055, "app_version": "2.2.0"}, - {"app_name": "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE", - "app_number": 3719, "app_version": "1.3.2"}, - {"app_name": "SPLUNK_ANALYTIC_STORY_EXECUTION_APP", - "app_number": 4971, "app_version": "2.0.3"}, - {"app_name": "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT", - "app_number": 2882, "app_version": "2.0.2"}, - {"app_name": "SPLUNK_MACHINE_LEARNING_TOOLKIT", - "app_number": 2890, "app_version": "5.2.2"}, - {"app_name": "SPLUNK_APP_FOR_STREAM", - "app_number": 1809, "app_version": "8.0.1"}, - {"app_name": "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA", - "app_number": 5234, "app_version": "8.0.1"}, - {"app_name": "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS", - "app_number": 5238, "app_version": "8.0.1"}, - {"app_name": "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO", - "app_number": 1617, "app_version": "4.0.0"}, - {"app_name": "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX", - "app_number": 833, "app_version": "8.3.1"}, - {"app_name": "SPLUNK_COMMON_INFORMATION_MODEL", - "app_number": 1621, "app_version": "4.20.2"} + { + "app_name": "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES", + "app_number": 1876, + "app_version": "5.2.0" + }, + { + "app_name": "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365", + "app_number": 4055, + "app_version": "2.2.0" + }, + { + "app_name": "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE", + "app_number": 3719, + "app_version": "1.3.2" + }, + { + "app_name": "SPLUNK_ANALYTIC_STORY_EXECUTION_APP", + "app_number": 4971, + "app_version": "2.0.3" + }, + { + "app_name": "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT", + "app_number": 2882, + "app_version": "2.0.2" + }, + { + "app_name": "SPLUNK_MACHINE_LEARNING_TOOLKIT", + "app_number": 2890, + "app_version": "5.2.2" + }, + { + "app_name": "SPLUNK_APP_FOR_STREAM", + "app_number": 1809, + "app_version": "8.0.1" + }, + { + "app_name": "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA", + "app_number": 5234, + "app_version": "8.0.1" + }, + { + "app_name": "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS", + "app_number": 5238, + "app_version": "8.0.1" + }, + { + "app_name": "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO", + "app_number": 1617, + "app_version": "4.0.0" + }, + { + "app_name": "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX", + "app_number": 833, + "app_version": "8.3.1" + }, + { + "app_name": "SPLUNK_COMMON_INFORMATION_MODEL", + "app_number": 1621, + "app_version": "4.20.2" + } ] }, "splunkbase_username": { - "type": ["string","null"], + "type": ["string", "null"], "default": None }, "splunkbase_password": { "type": ["string", "null"], "default": None }, - "splunk_container_apps_directory":{ - "type":"string", + "splunk_app_password": { + "type": ["string", "null"], + "default": None + }, + "splunk_container_apps_directory": { + "type": "string", "default": "/opt/splunk/etc/apps" }, "local_base_container_name": { "type": "string", "default": "splunk_test_%d" }, - + "mock": { "type": "boolean", "default": False @@ -160,15 +214,50 @@ setup_schema = { } -def validate(configuration: dict) -> tuple[Union[dict,None],dict]: - #v = jsonschema.Draft201909Validator(argument_schema) +def validate_file(file:io.TextIOWrapper)->tuple[Union[dict, None], dict]: + try: + settings = json.loads(file.read()) + return validate(settings) + except Exception as e: + raise(e) + + + +def check_dependencies(settings: dict)->bool: + #Check complex mode dependencies + error_free = True + if settings['mode'] == 'selected': + #Make sure that exactly one of the following fields is populated + if settings['detections_file'] == None and settings['detections_list'] == []: + print("Error - mode was 'selected' but no detections_list or detections_file were supplied.",file=sys.stderr) + error_free = False + elif settings['detections_file'] != None and settings['detections_list'] != []: + print("Error - mode was 'selected' but detections_list and detections_file were supplied.",file=sys.stderr) + error_free = False + if settings['mode'] != 'selected'and settings['detections_file'] != None: + print("Error - mode was not 'selected' but detections_file was supplied.",file=sys.stderr) + error_free = False + elif settings['mode'] != 'selected' and settings['detections_list'] != []: + print("Error - mode was not 'selected' but detections_list was supplied.",file=sys.stderr) + error_free = False + + #Returns true if there are not errors + return error_free + +def validate(configuration: dict) -> tuple[Union[dict, None], dict]: + #v = jsonschema.Draft201909Validator(argument_schema) + try: validation_errors, validated_json = jsonschema_errorprinter.check_json( configuration, setup_schema) - if len(validation_errors) == 0: + no_complex_errors = check_dependencies(validated_json) + if len(validation_errors) == 0 and no_complex_errors: print("Input configuration successfully validated!") return validated_json, setup_schema + elif no_complex_errors == False: + print("Failed due to error(s) listed above.", file=sys.stderr) + return None,setup_schema else: print("[%d] failures detected during validation of the configuration!" % ( len(validation_errors))) From 1f5386b7762cd8d826b64be21ec5487b10fa9b70 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Thu, 18 Nov 2021 16:56:46 -0800 Subject: [PATCH 069/203] Mostly done with overhaul to arguments. Initial testing show that it looks good. Now to integrate the newly parsed arguments in with the rewritten run behavior. --- .../detection_testing_execution.py | 34 ++++++----- .../modules/new_arguments2.py | 34 +++++------ .../modules/validate_args.py | 59 +++++++++++-------- 3 files changed, 70 insertions(+), 57 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 992d20e9c3..8e4654c115 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -27,6 +27,9 @@ import csv from requests import get import json +import requests.packages.urllib3 + +import modules.new_arguments2 SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" @@ -38,25 +41,28 @@ datamodel_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "Splunk_ MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING=2 -DEFAULT_CONTAINER_TAG="latest" -LOCAL_BASE_CONTAINER_NAME = "splunk_test_%d" -BASE_CONTAINER_WEB_PORT=8000 -BASE_CONTAINER_MANAGEMENT_PORT=8089 - - -DETECTION_TYPES = ['endpoint', 'cloud', 'network'] -DETECTION_MODES = ['new', 'all', 'selected'] def main(args): - - start_time = timer() - + requests.packages.urllib3.disable_warnings() + + start_datetime = datetime.now() + action, settings = modules.new_arguments2.parse(args) + if action == "configure": + #Done, nothing else to do + print("Configuration complete!") + sys.exit(0) + elif action != "run": + print("Unsupported action: [%s]"%(action), file=sys.stderr) + sys.exit(1) + print("time to run the test!") + sys.exit(0) + parser = argparse.ArgumentParser(description="CI Detection Testing") parser.add_argument("-b", "--branch", type=str, required=True, help="security content branch") @@ -92,9 +98,9 @@ def main(args): parser.add_argument("-split","--split_detections_then_stop", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") - start_datetime = datetime.now() - import requests.packages.urllib3 - requests.packages.urllib3.disable_warnings() + + + args = parser.parse_args() branch = args.branch uuid_test = args.uuid diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index 4375b08e4a..460d9af287 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -1,12 +1,12 @@ import argparse import json -from typing import OrderedDict -import validate_args +from typing import OrderedDict, Union +import modules.validate_args as validate_args import sys DEFAULT_CONFIG_FILE = "test_config.json" -def configure_action(args) -> bool: +def configure_action(args) -> tuple[str, dict]: settings = OrderedDict() if args.input_config_file is None: settings, schema = validate_args.validate({}) @@ -58,16 +58,18 @@ def configure_action(args) -> bool: validated_new_settings, schema = validate_args.validate(new_config) if validated_new_settings == None: print("Error in the new settings!") - return False + sys.exit(1) + else: - print("New settings worked great. Writing results to: %s" % + print("New settings successful. Writing results to: %s" % (args.output_config_file.name)) args.output_config_file.write(json.dumps( validated_new_settings, sort_keys=True, indent=4)) - return True + + return ("configure", validated_new_settings) -def update_config_with_cli_arguments(args_dict:dict)->dict: +def update_config_with_cli_arguments(args_dict:dict)->tuple[str, dict]: #First load the config file settings,_ = validate_args.validate_file(args_dict['config_file']) @@ -86,19 +88,19 @@ def update_config_with_cli_arguments(args_dict:dict)->dict: print("Failure while processing updated settings from command line.\n\tQuitting...", file=sys.stderr) sys.exit(1) - return settings + return ("run", settings) -def run_action(args) -> bool: +def run_action(args) -> tuple[str,dict]: config = update_config_with_cli_arguments(args.__dict__) - return True + return config -def main(args): +def parse(args)->tuple[str,dict]: ''' try: with open(DEFAULT_CONFIG_FILE, 'r') as settings_file: @@ -158,12 +160,8 @@ def main(args): # Run the appropriate parser try: - if args.func(args): - print("Success!") - sys.exit(0) - else: - print("Fail") - sys.exit(1) + action, settings = args.func(args) + return action, settings except Exception as e: print("Unknown Error - [%s]" % (str(e))) sys.exit(1) @@ -251,4 +249,4 @@ def main(args): if __name__ == "__main__": - main(sys.argv[1:]) + parse(sys.argv[1:]) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 624ae90e5e..af57245555 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -4,7 +4,7 @@ import io import json import jsonschema import jsonschema.exceptions -import jsonschema_errorprinter +import modules.jsonschema_errorprinter as jsonschema_errorprinter import sys from typing import Union @@ -28,17 +28,17 @@ setup_schema = { "type": "boolean", "default": False }, - + "detections_list": { - "type":["array"], + "type": ["array"], "items": { - "type":"string" + "type": "string" }, - "default":[], + "default": [], }, - "detections_file":{ - "type": ["string","null"], + "detections_file": { + "type": ["string", "null"], "default": None }, @@ -57,11 +57,20 @@ setup_schema = { "type": "string" }, "local_path": { - "type": "string" + "type": ["string", "null"], + "default": None }, - }, - "default": [] - } + } + }, + "default": [ + { + "app_name": "SPLUNK_ES_CONTENT_UPDATE", + "app_number": 3449, + "app_version": "GENERATED", + 'local_path': None + } + ] + }, "mode": { @@ -214,53 +223,53 @@ setup_schema = { } -def validate_file(file:io.TextIOWrapper)->tuple[Union[dict, None], dict]: +def validate_file(file: io.TextIOWrapper) -> tuple[Union[dict, None], dict]: try: settings = json.loads(file.read()) return validate(settings) except Exception as e: raise(e) - - -def check_dependencies(settings: dict)->bool: - #Check complex mode dependencies +def check_dependencies(settings: dict) -> bool: + # Check complex mode dependencies error_free = True if settings['mode'] == 'selected': - #Make sure that exactly one of the following fields is populated + # Make sure that exactly one of the following fields is populated if settings['detections_file'] == None and settings['detections_list'] == []: - print("Error - mode was 'selected' but no detections_list or detections_file were supplied.",file=sys.stderr) + print("Error - mode was 'selected' but no detections_list or detections_file were supplied.", file=sys.stderr) error_free = False elif settings['detections_file'] != None and settings['detections_list'] != []: - print("Error - mode was 'selected' but detections_list and detections_file were supplied.",file=sys.stderr) + print("Error - mode was 'selected' but detections_list and detections_file were supplied.", file=sys.stderr) error_free = False - if settings['mode'] != 'selected'and settings['detections_file'] != None: - print("Error - mode was not 'selected' but detections_file was supplied.",file=sys.stderr) + if settings['mode'] != 'selected' and settings['detections_file'] != None: + print("Error - mode was not 'selected' but detections_file was supplied.", file=sys.stderr) error_free = False elif settings['mode'] != 'selected' and settings['detections_list'] != []: - print("Error - mode was not 'selected' but detections_list was supplied.",file=sys.stderr) + print("Error - mode was not 'selected' but detections_list was supplied.", file=sys.stderr) error_free = False - #Returns true if there are not errors + # Returns true if there are not errors return error_free + def validate(configuration: dict) -> tuple[Union[dict, None], dict]: #v = jsonschema.Draft201909Validator(argument_schema) try: validation_errors, validated_json = jsonschema_errorprinter.check_json( configuration, setup_schema) + no_complex_errors = check_dependencies(validated_json) if len(validation_errors) == 0 and no_complex_errors: print("Input configuration successfully validated!") return validated_json, setup_schema elif no_complex_errors == False: print("Failed due to error(s) listed above.", file=sys.stderr) - return None,setup_schema + return None, setup_schema else: print("[%d] failures detected during validation of the configuration!" % ( - len(validation_errors))) + len(validation_errors)),file=sys.stderr) for error in validation_errors: print(error, end="\n\n", file=sys.stderr) return None, setup_schema From 844435a821f00cf89db97d0c415d35f22609dfe7 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 19 Nov 2021 11:21:31 -0800 Subject: [PATCH 070/203] Added a field to the jsonschema and renamed another field (types and folders). Continuing to rework the main detection_testing file. --- .../detection_testing_execution.py | 503 +++++++----------- .../modules/github_service.py | 226 ++++---- .../modules/validate_args.py | 15 +- 3 files changed, 336 insertions(+), 408 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 8e4654c115..ab50adf94a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -36,16 +36,41 @@ index_file_local_path = "indexes.conf.tar" index_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "search") datamodel_file_local_path = "datamodels.conf.tar" -datamodel_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "Splunk_SA_CIM") +datamodel_file_container_path = os.path.join( + SPLUNK_CONTAINER_APPS_DIR, "Splunk_SA_CIM") - -MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING=2 +MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING = 2 +def ensure_security_content(branch: str, pr_number: Union[int, None], persist_security_content: bool) -> GithubService: + if persist_security_content is True and os.path.exists("security_content"): + print("****** You chose --persist_security_content and the security_content directory exists. " + "We will not check out the repo again. Please be aware, this could cause issues if you're " + "out of date. ******") + github_service = GithubService( + branch, existing_directory=persist_security_content) + elif persist_security_content is True: + print("Error - you chose --persist_security_content but the security_content directory does not exist!\n\tQuitting...") + sys.exit(1) + else: + if os.path.exists("security_content/"): + print("Deleting the security_content directory") + try: + shutil.rmtree("security_content/", ignore_errors=True) + print("Successfully removed security_content directory") + except Exception as e: + print( + "Error - could not remove the security_content directory: [%s].\n\tQuitting..." % (str(e))) + sys.exit(1) + if pr_number: + github_service = GithubService(branch, pr_number) + else: + github_service = GithubService(branch) + return github_service def main(args): @@ -54,16 +79,15 @@ def main(args): start_datetime = datetime.now() action, settings = modules.new_arguments2.parse(args) if action == "configure": - #Done, nothing else to do + # Done, nothing else to do print("Configuration complete!") sys.exit(0) elif action != "run": - print("Unsupported action: [%s]"%(action), file=sys.stderr) + print("Unsupported action: [%s]" % (action), file=sys.stderr) sys.exit(1) print("time to run the test!") - sys.exit(0) - + ''' parser = argparse.ArgumentParser(description="CI Detection Testing") parser.add_argument("-b", "--branch", type=str, required=True, help="security content branch") parser.add_argument("-u", "--uuid", type=str, required=True, help="uuid for detection test") @@ -102,6 +126,8 @@ def main(args): args = parser.parse_args() + ''' + ''' branch = args.branch uuid_test = args.uuid pr_number = args.pr_number @@ -117,224 +143,99 @@ def main(args): show_password = args.show_password splunk_password = args.container_password pregenerated_escu_package = args.escu_package - - - - - - ''' - if splunk_password is None and reuse_containers is True: - print("Error - if you are going to reuse a container you MUST provide the password to it!") - sys.exit(1) - ''' - if splunk_password is None: - #Generate a sufficiently complex password - splunk_password = get_random_password() - if show_password is True: - print("Generated the password: [%s]"%splunk_password) - else: - print("Since you supplied a password, we will not generate one for you.") - - persist_security_content = args.persist_security_content - #Read in all of the tests that we will ignore because they already passed - success_tests = [] - if success_file is not None: - try: - with open(success_file, "r") as successes: - for line in successes.readlines(): - file_path_new = os.path.join("tests", os.path.splitext(line)[0]) + ".test.yml" - success_tests.append(file_path_new) - except Exception as e: - print("Error - error reading success_file: [%s]"%(str(e))) - print("\n\tQuitting...") - sys.exit(1) - + FULL_DOCKER_HUB_CONTAINER_NAME = "splunk/splunk:%s" % settings['container_tag'] - - - #Ensure that a valid mode was chosen - mode = args.mode - if mode == "selected" and args.test_files_list is None and args.test_files_file is None: - print("Error - mode [%s] but did not provide any files to test.\nQuitting..."%(mode)) - sys.exit(1) - elif mode == "selected" and args.test_files_list is not None and args.test_files_file is not None: - print("Error - mode [%s] but you specified a list of detections to test AND a file of detections to test.\nQuitting..."%(mode)) - sys.exit(1) - elif mode == "selected" and args.test_files_list is not None: - command_line_files_to_test = [name.strip() for name in args.test_files_list.split(',')] - elif mode == "selected" and args.test_files_file is not None: - lines = args.test_files_file.readlines() - command_line_files_to_test = [l.strip() for l in lines] - - folders = [a.strip() for a in args.types.split(',')] - for t in folders: - if t not in DETECTION_TYPES: - print("Error - requested test of [%s] but the only valid types are %s.\tQuitting..."%(t, str(DETECTION_TYPES))) - sys.exit(1) - - - - - - #Do some initial setup and validation of the containers and images - - #If a user requests to use existing containers, they must also explicitly request to reuse existing images - ''' - if reuse_containers and not reuse_image: - print("Error - requested --reuse_containers but did not explicitly request --reuse_image.\n\tQuitting") - sys.exit(1) - ''' - if num_containers < 1: - #Perhaps this should be a mock-run - do the initial steps but don't do testing on the containers? - print("Error, requested 0 containers. You must run with at least 1 container.") - sys.exit(1) - elif num_containers > MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING: + if settings['num_containers'] > MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING: print("You requested to run with [%d] containers which may use a very large amount of resources " - "as they all run in parallel. The maximum suggested number of parallel containers is " - "[%d]. We will do what you asked, but be warned!"%(num_containers, MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING)) + "as they all run in parallel. The maximum suggested number of parallel containers is " + "[%d]. We will do what you asked, but be warned!" % (settings['num_containers'], MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING)) - client = docker.client.from_env() + # Check out security content if required + github_service = ensure_security_content( + settings['branch'], settings['pr_number'], settings['persist_security_content']) - #Ensure that the images and containers are set up in a proper state - - #Remove containers that previously existed (if we are directed to do so) - try: - remove_existing_containers(client, False, LOCAL_BASE_CONTAINER_NAME, num_containers) - except Exception as e: - print("Error tryting to remove existing containers.\n\tQuitting...") - sys.exit(1) - - #Download and setup the image - try: - setup_image(client, reuse_image, full_docker_hub_container_name) - except Exception as e: - print("Error trying to set up the image.\n\tQuitting...") - sys.exit(1) - + all_test_files = github_service.get_test_files(settings['mode'], + settings['folders'], + settings['ttps'], + settings['detections_list'], + settings['detections_file']) - - - - - - - if persist_security_content is True and os.path.exists("security_content"): - print("******You chose --persist_security_content and the security_content directory exists. We will not check out the repo again. Please be aware, this could cause issues if you're out of date.******") - github_service = GithubService(branch, existing_directory=persist_security_content) - - elif persist_security_content is True: - print("Error - you chose --persist_security_content but the security_content directory does not exist!\n\tQuitting...") - sys.exit(1) - else: - if os.path.exists("security_content/"): - print("Deleting the security_content directory") - try: - shutil.rmtree("security_content/", ignore_errors=True) - print("Successfully removed security_content directory") - except Exception as e: - print("Error - could not remove the security_content directory: [%s].\n\tQuitting..."%(str(e))) - sys.exit(1) - - if pr_number: - github_service = GithubService(branch, pr_number) - else: - github_service = GithubService(branch) - - try: - if mode == "all": - test_files = github_service.get_all_tests_and_detections(folders=folders, - previously_successful_tests=success_tests) - elif mode == "new": - test_files = github_service.get_changed_test_files(folders=folders, - previously_successful_tests=success_tests) - elif mode == "selected": - if set(folders) != set(DETECTION_TYPES): - print("You specified mode [%s] but also types: [%s]. We will ignore type restrictions and test all specified files"%(mode,str(folders))) - - test_files = github_service.get_selected_test_files(command_line_files_to_test, - previously_successful_tests=success_tests) - - else: - print("Unsupported mode [%s] chosen. Supported modes are %s.\n\tQuitting..."%(args.mode, str(DETECTION_MODES))) - sys.exit(1) - except Exception as e: - print("Error - Failed to read in detection files: [%s].\nQuitting..."%(str(e))) - sys.exit(1) - if len(test_files) == 0: print("No files were found to be tested. Returning an error (should this return success?).\n\tQuitting...") sys.exit(1) - + local_volume_path = os.path.join(os.getcwd(), "apps") try: os.mkdir("apps") except FileExistsError as e: - #Directory already exists, do nothing + # Directory already exists, do nothing pass except Exception as e: - print("Caught an error when copying the ESCU package [%s] to the apps folder [%s].\n\tQuitting..."%(pregenerated_escu_package.name, local_volume_path)) + print("Caught an error when copying the ESCU package [%s] to the apps folder [%s].\n\tQuitting..." % ( + pregenerated_escu_package.name, local_volume_path)) sys.exit(1) if pregenerated_escu_package is None: - #Go into the security content directory + # Go into the security content directory print("****GENERATE NEW CONTENT****") os.chdir("security_content") print(os.getcwd()) if persist_security_content is False: - commands = ["python3 -m venv .venv", - ". ./.venv/bin/activate", - "python3 -m pip install wheel", - "python3 -m pip install -r requirements.txt", + commands = ["python3 -m venv .venv", + ". ./.venv/bin/activate", + "python3 -m pip install wheel", + "python3 -m pip install -r requirements.txt", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] else: - commands = ["s. ./.venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] - ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) + commands = ["s. ./.venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", + "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + ret = subprocess.run("; ".join(commands), + shell=True, capture_output=True) if ret.returncode != 0: print("Error generating new content. Exiting...") sys.exit(1) - print("New content generated successfully") - + print("New content generated successfully") print("Generate new ESCU Package using new content") if persist_security_content is True: os.chdir("slim_packaging") - commands = ["cd slim-latest", + commands = ["cd slim-latest", ". ./.venv/bin/activate", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz %s"%(os.path.join(local_volume_path, "DA-ESS-ContentUpdate-latest.tar.gz" ))] - + "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (os.path.join(local_volume_path, "DA-ESS-ContentUpdate-latest.tar.gz"))] + else: os.mkdir("slim_packaging") os.chdir("slim_packaging") os.mkdir("apps") - + try: SPLUNK_PACKAGING_TOOLKIT_URL = "https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz" SPLUNK_PACKAGING_TOOLKIT_FILENAME = 'splunk-packaging-toolkit-latest.tar.gz' - print("Downloading the Splunk Packaging Toolkit from %s..."%(SPLUNK_PACKAGING_TOOLKIT_URL), end='') + print("Downloading the Splunk Packaging Toolkit from %s..." % + (SPLUNK_PACKAGING_TOOLKIT_URL), end='') response = get(SPLUNK_PACKAGING_TOOLKIT_URL) response.raise_for_status() with open(SPLUNK_PACKAGING_TOOLKIT_FILENAME, 'wb') as slim_file: slim_file.write(response.content) - - print("success") + print("success") except Exception as e: print("FAILED") - print("Error downloading the Splunk Packaging Toolkit: [%s]"%(str(e))) + print( + "Error downloading the Splunk Packaging Toolkit: [%s]" % (str(e))) sys.exit(1) - - + commands = ["rm -rf slim-latest", - "mkdir slim-latest", + "mkdir slim-latest", "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", - "cd slim-latest", + "cd slim-latest", "virtualenv --python=/usr/bin/python2.7 --clear .venv", ". ./.venv/bin/activate", "python3 -m pip install --upgrade pip", @@ -343,35 +244,32 @@ def main(args): "python2 -m pip install .", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz %s"%(os.path.join(local_volume_path, "DA-ESS-ContentUpdate-latest.tar.gz" ))] - - - + "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (os.path.join(local_volume_path, "DA-ESS-ContentUpdate-latest.tar.gz"))] - ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) + ret = subprocess.run("; ".join(commands), + shell=True, capture_output=True) if ret.returncode != 0: - print("Error generating new ESCU Package.\n\tQuitting..."%()) + print("Error generating new ESCU Package.\n\tQuitting..." % ()) sys.exit(1) os.chdir("../..") print("New ESCU Package generated successfully") else: - print("Using previous generated ESCU package: [%s]"%(pregenerated_escu_package.name)) + print("Using previous generated ESCU package: [%s]" % ( + pregenerated_escu_package.name)) try: - with open(os.path.join(local_volume_path, os.path.basename(pregenerated_escu_package.name)),'wb') as escu_package: + with open(os.path.join(local_volume_path, os.path.basename(pregenerated_escu_package.name)), 'wb') as escu_package: escu_package.write(pregenerated_escu_package.read()) except Exception as e: - print("Failure writing the ESCU package [%s] to [%s]: [%s].\n\tQuitting..."%(pregenerated_escu_package.name, local_volume_path, str(e))) + print("Failure writing the ESCU package [%s] to [%s]: [%s].\n\tQuitting..." % ( + pregenerated_escu_package.name, local_volume_path, str(e))) sys.exit(1) - - + print("Wrote ESCU package to volume.") - - - + if args.split_detections_then_stop: - for output_file_index in range(0,num_containers): - fname = "container_%d_tests.txt"%(output_file_index) - print("Writing tests to [%s]..."%(fname), end='') + for output_file_index in range(0, num_containers): + fname = "container_%d_tests.txt" % (output_file_index) + print("Writing tests to [%s]..." % (fname), end='') with open(fname, "w") as output_file: detection_tests = test_files[output_file_index::num_containers] normalized_detection_names = [] @@ -380,172 +278,163 @@ def main(args): filename = filename.replace(".test.yml", ".yml") leading = os.path.split(d)[0] leading = leading.replace("tests/", "detections/") - new_name = os.path.join("security_content", leading, filename) + new_name = os.path.join( + "security_content", leading, filename) normalized_detection_names.append(new_name) output_file.write('\n'.join(normalized_detection_names)) print("Done") sys.exit(0) - - - - - - #Create threads to manage all of the containers that we will start up + # Create threads to manage all of the containers that we will start up splunk_container_manager_threads = [] - - - - - results_tracker = SynchronizedResultsTracker(test_files, num_containers) - - - - #SPLUNK_ADD_ON_FOR_SYSMON_OLD = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" #SPLUNK_ADD_ON_FOR_SYSMON_NEW = "https://splunkbase.splunk.com/app/5709/release/1.0.1/download" #SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" #SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" - #Just a hack until we get the new version of system deployed and available from splunkbase + # Just a hack until we get the new version of system deployed and available from splunkbase CONTAINER_VOLUME_PATH = '/tmp/apps/' - - GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH = os.path.join(CONTAINER_VOLUME_PATH, "DA-ESS-ContentUpdate-latest.tar.gz") + + GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH = os.path.join( + CONTAINER_VOLUME_PATH, "DA-ESS-ContentUpdate-latest.tar.gz") SPLUNKBASE_URL = "https://splunkbase.splunk.com/app/%d/release/%s/download" - #Order that we install the apps is actually important + # Order that we install the apps is actually important APPS_DICT = OrderedDict() - APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS'] = {"app_number":742, 'app_version':"8.2.0", 'location':'splunkbase'} - APPS_DICT['SPLUNK_SECURITY_ESSENTIALS'] = {"app_number":3435, 'app_version':"3.3.4", 'location':'splunkbase'} - APPS_DICT['GENERATED_SPLUNK_ES_CONTENT_UPDATE'] = {"app_number":3449, 'app_version':"Generated at %s"%(datetime.now()), 'location':GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH} - - + APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS'] = { + "app_number": 742, 'app_version': "8.2.0", 'location': 'splunkbase'} + APPS_DICT['SPLUNK_SECURITY_ESSENTIALS'] = { + "app_number": 3435, 'app_version': "3.3.4", 'location': 'splunkbase'} + APPS_DICT['GENERATED_SPLUNK_ES_CONTENT_UPDATE'] = {"app_number": 3449, 'app_version': "Generated at %s" % ( + datetime.now()), 'location': GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH} + try: - BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser("~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") - shutil.copyfile(BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH, os.path.join(local_volume_path, "Splunk_TA_microsoft_sysmon-1.0.2-B1.spl")) - - BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" - APPS_DICT['BETA_SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number":5709, 'app_version':"Generated at %s"%(datetime.now()), 'location':"local", "container_path": BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH} + BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser( + "~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") + shutil.copyfile(BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH, os.path.join( + local_volume_path, "Splunk_TA_microsoft_sysmon-1.0.2-B1.spl")) + + BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" + APPS_DICT['BETA_SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number": 5709, 'app_version': "Generated at %s" % ( + datetime.now()), 'location': "local", "container_path": BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH} except Exception as e: print("Failed to grab beta sysmon at ~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl. Using the one from Splunkbase") - APPS_DICT['SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number":5709, 'app_version':"1.0.1", 'location':'splunkbase'} - + APPS_DICT['SPLUNK_ADD_ON_FOR_SYSMON'] = { + "app_number": 5709, 'app_version': "1.0.1", 'location': 'splunkbase'} + if True: - APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES'] = {"app_number":1876, 'app_version':"5.2.0", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365'] = {"app_number":4055, 'app_version':"2.2.0", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE'] = {"app_number":3719, 'app_version':"1.3.2", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ANALYTIC_STORY_EXECUTION_APP'] = {"app_number":4971, 'app_version': "2.0.3", 'location':'splunkbase'} - APPS_DICT['PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT'] = {"app_number":2882, 'app_version':"2.0.2", 'location':'splunkbase'} - APPS_DICT['SPLUNK_MACHINE_LEARNING_TOOLKIT'] = {"app_number":2890, 'app_version':"5.2.2", 'location':'splunkbase'} - APPS_DICT['SPLUNK_APP_FOR_STREAM'] = {"app_number":1809, 'app_version':"8.0.1", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA'] = {"app_number":5234, 'app_version':"8.0.1", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS'] = {"app_number":5238, 'app_version':"8.0.1", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO'] = {"app_number":1617, 'app_version':"4.0.0", 'location':'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX'] = {"app_number":833, 'app_version':"8.3.1", 'location':'splunkbase'} - + APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES'] = { + "app_number": 1876, 'app_version': "5.2.0", 'location': 'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365'] = { + "app_number": 4055, 'app_version': "2.2.0", 'location': 'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE'] = { + "app_number": 3719, 'app_version': "1.3.2", 'location': 'splunkbase'} + APPS_DICT['SPLUNK_ANALYTIC_STORY_EXECUTION_APP'] = { + "app_number": 4971, 'app_version': "2.0.3", 'location': 'splunkbase'} + APPS_DICT['PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT'] = { + "app_number": 2882, 'app_version': "2.0.2", 'location': 'splunkbase'} + APPS_DICT['SPLUNK_MACHINE_LEARNING_TOOLKIT'] = { + "app_number": 2890, 'app_version': "5.2.2", 'location': 'splunkbase'} + APPS_DICT['SPLUNK_APP_FOR_STREAM'] = { + "app_number": 1809, 'app_version': "8.0.1", 'location': 'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA'] = { + "app_number": 5234, 'app_version': "8.0.1", 'location': 'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS'] = { + "app_number": 5238, 'app_version': "8.0.1", 'location': 'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO'] = { + "app_number": 1617, 'app_version': "4.0.0", 'location': 'splunkbase'} + APPS_DICT['SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX'] = { + "app_number": 833, 'app_version': "8.3.1", 'location': 'splunkbase'} - #CIM is last here for a reason! Because we copy a file to a directory that does not exist until CIM - #has been installed, we use it to prevent the testing from beginning until the copy has succeeded. - #KEEP THIS APP LAST! - APPS_DICT['SPLUNK_COMMON_INFORMATION_MODEL'] = {"app_number":1621, 'app_version':"4.20.2", 'location':'splunkbase'} - - + # CIM is last here for a reason! Because we copy a file to a directory that does not exist until CIM + # has been installed, we use it to prevent the testing from beginning until the copy has succeeded. + # KEEP THIS APP LAST! + APPS_DICT['SPLUNK_COMMON_INFORMATION_MODEL'] = { + "app_number": 1621, 'app_version': "4.20.2", 'location': 'splunkbase'} - SPLUNK_APPS = [] for key, value in APPS_DICT.items(): if value['location'] == 'splunkbase': - #The app is on Splunkbase - target=SPLUNKBASE_URL%(value['app_number'],value['app_version']) + # The app is on Splunkbase + target = SPLUNKBASE_URL % ( + value['app_number'], value['app_version']) SPLUNK_APPS.append(target) else: - #The app is a file we generated locally + # The app is a file we generated locally SPLUNK_APPS.append(value['location']) - - for container_index in range(num_containers): - container_name = LOCAL_BASE_CONTAINER_NAME%container_index - - web_port = BASE_CONTAINER_WEB_PORT + container_index + container_name = LOCAL_BASE_CONTAINER_NAME % container_index + + web_port = BASE_CONTAINER_WEB_PORT + container_index management_port = BASE_CONTAINER_MANAGEMENT_PORT + container_index - - - environment = {"SPLUNK_START_ARGS": "--accept-license", - "SPLUNK_PASSWORD" : splunk_password, - "SPLUNK_APPS_URL" : ','.join(SPLUNK_APPS), - "SPLUNKBASE_USERNAME" : splunkbase_username, - "SPLUNKBASE_PASSWORD" : splunkbase_password - } - ports= {"8000/tcp": web_port, - "8089/tcp": management_port - } - - - + "SPLUNK_PASSWORD": splunk_password, + "SPLUNK_APPS_URL": ','.join(SPLUNK_APPS), + "SPLUNKBASE_USERNAME": splunkbase_username, + "SPLUNKBASE_PASSWORD": splunkbase_password + } + ports = {"8000/tcp": web_port, + "8089/tcp": management_port + } - - mounts = [docker.types.Mount(target = CONTAINER_VOLUME_PATH, source = local_volume_path, type='bind', read_only=True)] - - print("Creating CONTAINER: [%s]"%(container_name)) - base_container = client.containers.create(full_docker_hub_container_name, ports=ports, environment=environment, name=container_name, mounts=mounts, detach=True) - print("Created CONTAINER : [%s]"%(container_name)) - + mounts = [docker.types.Mount( + target=CONTAINER_VOLUME_PATH, source=local_volume_path, type='bind', read_only=True)] - - - t = threading.Thread(target=splunk_container_manager, - args=(results_tracker, - container_name, - "127.0.0.1", + print("Creating CONTAINER: [%s]" % (container_name)) + base_container = client.containers.create( + full_docker_hub_container_name, ports=ports, environment=environment, name=container_name, mounts=mounts, detach=True) + print("Created CONTAINER : [%s]" % (container_name)) + + t = threading.Thread(target=splunk_container_manager, + args=(results_tracker, + container_name, + "127.0.0.1", splunk_password, - web_port, - management_port, + web_port, + management_port, uuid_test, - interactive_failure + interactive_failure )) splunk_container_manager_threads.append(t) - #add the queue status thread - there can be some error in one of the test threads, so this - #thread doesn't need to complete for the program to finish execution - status_thread = threading.Thread(target=queue_status_thread, - args=(results_tracker,), - daemon=True) - #Start this thread immediately + # add the queue status thread - there can be some error in one of the test threads, so this + # thread doesn't need to complete for the program to finish execution + status_thread = threading.Thread(target=queue_status_thread, + args=(results_tracker,), + daemon=True) + # Start this thread immediately status_thread.start() - print("Start the testing threads") for t in splunk_container_manager_threads: t.start() - #we need to start containers slowly. Would be great it we could do all the setup and - #app install once, but it looks like the container is unlikely to support that. - #We don't really want to fundamentally change this container, either, and will - #keep it as close to production as possible + # we need to start containers slowly. Would be great it we could do all the setup and + # app install once, but it looks like the container is unlikely to support that. + # We don't really want to fundamentally change this container, either, and will + # keep it as close to production as possible time.sleep(5) - - #Wait for all of the testing threads to complete + + # Wait for all of the testing threads to complete for t in splunk_container_manager_threads: - t.join() #blocks on waiting to join + t.join() # blocks on waiting to join print("Testing thread completed execution") print("All testing threads have completed execution") - #read all the results out from the output queue + # read all the results out from the output queue strtime = str(int(time.time())) print("Wait for the status thread to finish executing...") status_thread.join() print("Status thread finished executing.") - - #Remove the attack data and - #generate all of the output information + # Remove the attack data and + # generate all of the output information stop_time = timer() stop_datetime = datetime.now() baseline = OrderedDict() @@ -555,33 +444,17 @@ def main(args): baseline['TEST_FINISH_TIME'] = str(stop_datetime) results_tracker.finish(baseline) - - - #now we are done! - - print("Total Execution Time: [%s]"%(timedelta(seconds=stop_time - start_time, microseconds=0))) - + # now we are done! - #detection testing service has already been prepared, no need to do it here! + print("Total Execution Time: [%s]" % ( + timedelta(seconds=stop_time - start_time, microseconds=0))) + + # detection testing service has already been prepared, no need to do it here! #testing_service.prepare_detection_testing(ssh_key_name, private_key, splunk_ip, splunk_password) #testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) - - - - - - - - - if __name__ == "__main__": main(sys.argv[1:]) - - - - - diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index eba0fae6f8..efb4826ce5 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -1,13 +1,18 @@ +import csv +import glob +import logging +import os +import pathlib +import subprocess +import sys +from typing import Union +from docker import types + import git -import os -import logging -import glob -import subprocess -from git.objects import base import yaml -import pathlib -import csv +from git.objects import base + # Logger logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO")) LOGGER = logging.getLogger(__name__) @@ -17,16 +22,18 @@ SECURITY_CONTENT_URL = "https://github.com/splunk/security_content" class GithubService: - def __init__(self, security_content_branch:str, PR_number:int = None, existing_directory:bool=False): - + def __init__(self, security_content_branch: str, PR_number: int = None, existing_directory: bool = False): + self.security_content_branch = security_content_branch if existing_directory: return print("Checking out security_content!") - self.security_content_repo_obj = self.clone_project(SECURITY_CONTENT_URL, f"security_content", f"develop") + self.security_content_repo_obj = self.clone_project( + SECURITY_CONTENT_URL, f"security_content", f"develop") if PR_number: - subprocess.call(["git", "-C", "security_content/", "fetch", "origin", "refs/pull/%d/head:%s"%(PR_number, security_content_branch)]) + subprocess.call(["git", "-C", "security_content/", "fetch", "origin", + "refs/pull/%d/head:%s" % (PR_number, security_content_branch)]) self.security_content_repo_obj.git.checkout(security_content_branch) @@ -35,14 +42,12 @@ class GithubService: repo_obj = git.Repo.clone_from(url, project, branch=branch) return repo_obj - - - def prune_detections(self, - detections_to_prune:list[str], - ttps_to_test:list[str], - previously_successful_tests:list[str], - exclude_ssa:bool=True, - summary_file:str=None)->list[str]: + def prune_detections(self, + detections_to_prune: list[str], + ttps_to_test: list[str], + previously_successful_tests: list[str], + exclude_ssa: bool = True, + summary_file: str = None) -> list[str]: pruned_tests = [] csvlines = [] for detection in detections_to_prune: @@ -50,75 +55,125 @@ class GithubService: continue with open(detection, "r") as d: description = yaml.safe_load(d) - - test_filepath = os.path.splitext(detection)[0].replace('detections', 'tests') + '.test.yml' - test_filepath_without_security_content = str(pathlib.Path(*pathlib.Path(test_filepath).parts[1:])) - #If no TTPS are provided, then we will get everything + + test_filepath = os.path.splitext(detection)[0].replace( + 'detections', 'tests') + '.test.yml' + test_filepath_without_security_content = str( + pathlib.Path(*pathlib.Path(test_filepath).parts[1:])) + # If no TTPS are provided, then we will get everything if 'type' in description and (description['type'] in ttps_to_test or len(ttps_to_test) == 0): - #print(description['type']) + # print(description['type']) if not os.path.exists(test_filepath): - print("Detection [%s] references [%s], but it does not exist"%(detection, test_filepath)) + print("Detection [%s] references [%s], but it does not exist" % ( + detection, test_filepath)) #raise(Exception("Detection [%s] references [%s], but it does not exist"%(detection, test_filepath))) elif test_filepath_without_security_content in previously_successful_tests: - print("Ignoring test [%s] before it has already passed previously"%(detection)) + print( + "Ignoring test [%s] before it has already passed previously" % (detection)) else: - #remove leading security_content/ from path - pruned_tests.append(test_filepath_without_security_content) + # remove leading security_content/ from path + pruned_tests.append( + test_filepath_without_security_content) if summary_file is not None: try: - mitre_id = str(description['tags']['mitre_attack_id']) + mitre_id = str( + description['tags']['mitre_attack_id']) except: mitre_id = 'NONE' try: - csvlines.append({'name':description['name'], 'filename':detection, 'description':description['description'], - 'search':description['search'], 'mitre_attack_id':mitre_id, 'security_domain':description['tags']['security_domain'], - 'Relevant':'', 'Comments':'', "Runnable on SSA?": str(os.path.basename(detection).startswith("ssa"))}) + csvlines.append({'name': description['name'], 'filename': detection, 'description': description['description'], + 'search': description['search'], 'mitre_attack_id': mitre_id, 'security_domain': description['tags']['security_domain'], + 'Relevant': '', 'Comments': '', "Runnable on SSA?": str(os.path.basename(detection).startswith("ssa"))}) except Exception as e: - print("Error outputting summary for [%s]: [%s]"%(detection, str(e))) + print("Error outputting summary for [%s]: [%s]" % ( + detection, str(e))) else: - #Don't do anything with these files + # Don't do anything with these files pass - + if summary_file is not None: print("writing") with open(summary_file, 'w') as csvfile: - fieldnames = ['name', 'filename', 'description', 'search', 'mitre_attack_id', 'security_domain', 'Runnable on SSA?', 'Relevant', 'Comments'] - writer = csv.DictWriter(csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_ALL) + fieldnames = ['name', 'filename', 'description', 'search', 'mitre_attack_id', + 'security_domain', 'Runnable on SSA?', 'Relevant', 'Comments'] + writer = csv.DictWriter( + csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_ALL) writer.writeheader() for r in csvlines: writer.writerow(r) - - + return pruned_tests + def get_test_files(self, mode: str, folders:list[str], ttps:list[str], + detections_list: Union[list[str], None], + detections_file=Union[str, None]) -> list[str]: + if mode == "changes": + tests = self.get_changed_test_files(folders, ttps) + elif mode == "selected": + if detections_list is None and detections_file is None: + #It's actually valid to supply an EMPTY list of files and the test should pass. + #This can occur when we try to test, for example, 1 detection but start 2 containers. + #We still want this to pass testing, so we shouldn't fail there! + print("Trying to test a list of files, but None were provided", file=sys.stderr) + sys.exit(1) + + if detections_list is not None and detections_file is not None: + print("Both detections_list [%s] and detections_file [%s] were provided. "\ + "Because these confilect, we cannot test.\n\tQuitting..."% + (detections_list, detections_file), file=sys.stderr) + sys.exit(1) + if detections_list is not None: + tests = self.get_selected_test_files(detections_list, folders, ttps) + if detections_file is not None: + try: + with open(detections_file,'r') as f: + data = f.readlines() + #Strip all whitespace from lines and exclude lines that are just whitespace + files_to_test = [line.strip() for line in data if len(line.strip()) > 0] + except Exception as e: + print("There was an error reading the input file [%s]: [%s].\n\t"\ + "Quitting..."%(detections_file, str(e))) + sys.exit(1) + + tests = self.get_selected_test_files(files_to_test, folders, ttps) + + elif mode == "all": + tests = self.get_all_tests_and_detections(folders,ttps) + else: + print( + "Error, unsupported mode [%s]. Mode must be one of %s", file=sys.stderr) + sys.exit(1) + + return [] def get_selected_test_files(self, - detection_file_list:list[str], - ttps_to_test:list[str]=["Anomaly","Hunting","TTP"], - previously_successful_tests:list[str]=[]) ->list[str]: - + detection_file_list: list[str], + ttps_to_test: list[str] = [ + "Anomaly", "Hunting", "TTP"], + previously_successful_tests: list[str] = []) -> list[str]: + return self.prune_detections(detection_file_list, ttps_to_test, previously_successful_tests) - - def get_all_tests_and_detections(self, - folders:list[str]=['endpoint', 'cloud', 'network'], - ttps_to_test:list[str]=["Anomaly","Hunting","TTP"], - previously_successful_tests:list[str]=[]) ->list[str]: + def get_all_tests_and_detections(self, + folders: list[str] = [ + 'endpoint', 'cloud', 'network'], + ttps_to_test: list[str] = [ + "Anomaly", "Hunting", "TTP"], + previously_successful_tests: list[str] = []) -> list[str]: detections = [] for folder in folders: - detections.extend(self.get_all_files_in_folder(os.path.join("security_content/detections", folder), "*.yml")) - - - #Prune this down to only the subset of detections we can test + detections.extend(self.get_all_files_in_folder( + os.path.join("security_content/detections", folder), "*.yml")) + + # Prune this down to only the subset of detections we can test return self.prune_detections(detections, ttps_to_test, previously_successful_tests) - - def get_all_files_in_folder(self, foldername:str, extension:str)->list[str]: - filenames = glob.glob(os.path.join(foldername, extension)) + + def get_all_files_in_folder(self, foldername: str, extension: str) -> list[str]: + filenames = glob.glob(os.path.join(foldername, extension)) return filenames - - def get_changed_test_files(self, folders=['endpoint', 'cloud', 'network'], ttps_to_test=["Anomaly","Hunting","TTP"], previously_successful_tests=[])->list[str]: + def get_changed_test_files(self, folders=['endpoint', 'cloud', 'network'], ttps_to_test=["Anomaly", "Hunting", "TTP"], previously_successful_tests=[]) -> list[str]: branch1 = self.security_content_branch branch2 = 'develop' g = git.Git('security_content') @@ -132,25 +187,27 @@ class GithubService: # added or changed test files if file_path.startswith('A') or file_path.startswith('M'): if 'tests' in file_path and os.path.basename(file_path).endswith('.test.yml'): - changed_test_files.append(file_path) + changed_test_files.append(file_path) # changed detections if 'detections' in file_path and os.path.basename(file_path).endswith('.yml'): - changed_detection_files.append(file_path) + changed_detection_files.append(file_path) else: - print("Looking for changed detections by diffing [%s] against [%s]. Of course none were returned."%(branch1, branch2)) + print("Looking for changed detections by diffing [%s] against [%s]. Of course none were returned." % ( + branch1, branch2)) return [] - - #all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters - changed_test_files = [os.path.join("security_content",name.split('\t')[1]) for name in changed_test_files if len(name.split('\t')) == 2] - changed_detection_files = [os.path.join("security_content",name.split('\t')[1]) for name in changed_detection_files if len(name.split('\t')) == 2] + # all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters + changed_test_files = [os.path.join("security_content", name.split( + '\t')[1]) for name in changed_test_files if len(name.split('\t')) == 2] + changed_detection_files = [os.path.join("security_content", name.split( + '\t')[1]) for name in changed_detection_files if len(name.split('\t')) == 2] - - #convert the test files to the detection file equivalent + # convert the test files to the detection file equivalent converted_test_files = [] for test_filepath in changed_test_files: - detection_filename = str(pathlib.Path(*pathlib.Path(test_filepath).parts[-2:])).replace("tests", "detections",1) + detection_filename = str(pathlib.Path( + *pathlib.Path(test_filepath).parts[-2:])).replace("tests", "detections", 1) converted_test_files.append(detection_filename) for name in converted_test_files: @@ -160,25 +217,20 @@ class GithubService: return self.prune_detections(changed_detection_files, ttps_to_test, previously_successful_tests) #detections_to_test,_,_ = self.filter_test_types(changed_detection_files) - #for f in detections_to_test: + # for f in detections_to_test: # file_path_base = os.path.splitext(f)[0].replace('detections', 'tests') + '.test' # file_path_new = file_path_base + '.yml' # if file_path_new not in changed_test_files: # changed_test_files.append(file_path_new) - - - - #print("Total things to test (test files and detection files changed): [%d]"%(len(changed_test_files))) - #for l in changed_test_files: + # for l in changed_test_files: # print(l) - #print(len(changed_test_files)) + # print(len(changed_test_files)) #import time - #time.sleep(5) - + # time.sleep(5) - def filter_test_types(self, test_files, test_types = ["Anomaly", "Hunting", "TTP"]): + def filter_test_types(self, test_files, test_types=["Anomaly", "Hunting", "TTP"]): files_to_test = [] files_not_to_test = [] error_files = [] @@ -187,28 +239,22 @@ class GithubService: with open(os.path.join("security_content", filename), "r") as fileData: yaml_dict = list(yaml.safe_load_all(fileData))[0] if 'type' not in yaml_dict.keys(): - print("Failed to find 'type' in the yaml for: [%s]"%(filename)) + print( + "Failed to find 'type' in the yaml for: [%s]" % (filename)) error_files.append(filename) if yaml_dict['type'] in test_types: files_to_test.append(filename) else: files_not_to_test.append(filename) except Exception as e: - print("Error on trying to scan [%s]: [%s]"%(filename, str(e))) + print("Error on trying to scan [%s]: [%s]" % ( + filename, str(e))) error_files.append(filename) - print("***Detection Information***\n"\ + print("***Detection Information***\n" "\tTotal Files : %d" "\tFiles to test : %d" "\tFiles not to test : %d" - "\tError files : %d"%(len(test_files), len(files_to_test), len(files_not_to_test), len(error_files))) + "\tError files : %d" % (len(test_files), len(files_to_test), len(files_not_to_test), len(error_files))) import time time.sleep(5) - return files_to_test, files_not_to_test, error_files - - - - - - - - + return files_to_test, files_not_to_test, error_files diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index af57245555..db587a93a0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -30,11 +30,11 @@ setup_schema = { }, "detections_list": { - "type": ["array"], + "type": ["array","null"], "items": { "type": "string" }, - "default": [], + "default": None, }, "detections_file": { @@ -211,7 +211,7 @@ setup_schema = { "default": False }, - "types": { + "folders": { "type": "array", "items": { "type": "string", @@ -219,6 +219,15 @@ setup_schema = { }, "default": ["endpoint", "cloud", "network"] }, + + "types": { + "type": "array", + "items": { + "type": "string", + "enum": ["Anomaly", "Hutning", "TTP"] + }, + "default": ["Anomaly", "Hutning", "TTP"] + }, } } From 53b01c192f9a967930952ddb518c1eec499878ca Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 19 Nov 2021 13:00:23 -0800 Subject: [PATCH 071/203] More changes to the detection_testing_exeuction file and arg validation file to make it simpler. --- .../detection_testing_execution.py | 207 ++++++++++-------- .../modules/validate_args.py | 15 +- 2 files changed, 125 insertions(+), 97 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index ab50adf94a..1db14dd986 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -73,6 +73,83 @@ def ensure_security_content(branch: str, pr_number: Union[int, None], persist_se return github_service +def generate_escu_app(persist_security_content:bool=False)->str: + # Go into the security content directory + print("****GENERATING ESCU APP****") + os.chdir("security_content") + print(os.getcwd()) + if persist_security_content is False: + commands = ["python3 -m venv .venv", + ". ./.venv/bin/activate", + "python3 -m pip install wheel", + "python3 -m pip install -r requirements.txt", + "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + else: + commands = ["s. ./.venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", + "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + ret = subprocess.run("; ".join(commands), + shell=True, capture_output=True) + if ret.returncode != 0: + print("Error generating new content. Exiting...") + sys.exit(1) + + + + output_file_name = "DA-ESS-ContentUpdate-latest.tar.gz" + output_file_path_from_root = os.path.join("security_content", "slim_packaging", "apps", "upload", output_file_name) + output_file_path_from_apps = os.path.join("upload", output_file_name) + + if persist_security_content is True: + os.chdir("slim_packaging") + commands = ["cd slim-latest", + ". ./.venv/bin/activate", + "cp -R ../../dist/escu DA-ESS-ContentUpdate", + "slim package -o upload DA-ESS-ContentUpdate", + "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_apps)] + + else: + os.mkdir("slim_packaging") + os.chdir("slim_packaging") + os.mkdir("apps") + + try: + SPLUNK_PACKAGING_TOOLKIT_URL = "https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz" + SPLUNK_PACKAGING_TOOLKIT_FILENAME = 'splunk-packaging-toolkit-latest.tar.gz' + print("Downloading the Splunk Packaging Toolkit from %s..." % + (SPLUNK_PACKAGING_TOOLKIT_URL), end='') + response = get(SPLUNK_PACKAGING_TOOLKIT_URL) + response.raise_for_status() + with open(SPLUNK_PACKAGING_TOOLKIT_FILENAME, 'wb') as slim_file: + slim_file.write(response.content) + except Exception as e: + print("Error downloading the Splunk Packaging Toolkit: [%s].\n\tQuitting..." % + (str(e)), file=sys.stderr) + sys.exit(1) + + commands = ["rm -rf slim-latest", + "mkdir slim-latest", + "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", + "cd slim-latest", + "virtualenv --python=/usr/bin/python2.7 --clear .venv", + ". ./.venv/bin/activate", + "python3 -m pip install --upgrade pip", + "python2 -m pip install wheel", + "python2 -m pip install semantic_version", + "python2 -m pip install .", + "cp -R ../../dist/escu DA-ESS-ContentUpdate", + "slim package -o upload DA-ESS-ContentUpdate", + "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_apps)] + + ret = subprocess.run("; ".join(commands), + shell=True, capture_output=True) + if ret.returncode != 0: + print("Error generating new ESCU Package.\n\tQuitting..." % ()) + sys.exit(1) + os.chdir("../..") + + return output_file_path_from_root + + def main(args): requests.packages.urllib3.disable_warnings() @@ -162,11 +239,14 @@ def main(args): settings['detections_list'], settings['detections_file']) + - if len(test_files) == 0: - print("No files were found to be tested. Returning an error (should this return success?).\n\tQuitting...") - sys.exit(1) +# if len(all_test_files) == 0: +# print("No files were found to be tested. While this could be due to an error, "\ +# "this could be correct if there were no changes to detections. We will "\ +# "exit with success.\n\tQuitting...") +# sys.exit(0) local_volume_path = os.path.join(os.getcwd(), "apps") try: @@ -175,97 +255,46 @@ def main(args): # Directory already exists, do nothing pass except Exception as e: - print("Caught an error when copying the ESCU package [%s] to the apps folder [%s].\n\tQuitting..." % ( - pregenerated_escu_package.name, local_volume_path)) + print("Error creating the apps folder [%s]: [%s]\n\tQuitting..." + % (local_volume_path, str(e)), file=sys.stderr) sys.exit(1) - if pregenerated_escu_package is None: - # Go into the security content directory - print("****GENERATE NEW CONTENT****") - os.chdir("security_content") - print(os.getcwd()) - if persist_security_content is False: - commands = ["python3 -m venv .venv", - ". ./.venv/bin/activate", - "python3 -m pip install wheel", - "python3 -m pip install -r requirements.txt", - "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] - else: - commands = ["s. ./.venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", - "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] - ret = subprocess.run("; ".join(commands), - shell=True, capture_output=True) - if ret.returncode != 0: - print("Error generating new content. Exiting...") - sys.exit(1) - print("New content generated successfully") + #Check to see if we want to install ESCU and whether it was preeviously generated and we should use that file + if 'SPLUNK_ES_CONTENT_UPDATE' in settings['local_apps'] and settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE'] is not None: + #Using a pregenerated ESCU, copy it to apps (unless it) - print("Generate new ESCU Package using new content") - if persist_security_content is True: - os.chdir("slim_packaging") - commands = ["cd slim-latest", - ". ./.venv/bin/activate", - "cp -R ../../dist/escu DA-ESS-ContentUpdate", - "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (os.path.join(local_volume_path, "DA-ESS-ContentUpdate-latest.tar.gz"))] - - else: - os.mkdir("slim_packaging") - os.chdir("slim_packaging") - os.mkdir("apps") - - try: - SPLUNK_PACKAGING_TOOLKIT_URL = "https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz" - SPLUNK_PACKAGING_TOOLKIT_FILENAME = 'splunk-packaging-toolkit-latest.tar.gz' - print("Downloading the Splunk Packaging Toolkit from %s..." % - (SPLUNK_PACKAGING_TOOLKIT_URL), end='') - response = get(SPLUNK_PACKAGING_TOOLKIT_URL) - response.raise_for_status() - with open(SPLUNK_PACKAGING_TOOLKIT_FILENAME, 'wb') as slim_file: - slim_file.write(response.content) - - print("success") - - except Exception as e: - print("FAILED") - print( - "Error downloading the Splunk Packaging Toolkit: [%s]" % (str(e))) - sys.exit(1) - - commands = ["rm -rf slim-latest", - "mkdir slim-latest", - "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", - "cd slim-latest", - "virtualenv --python=/usr/bin/python2.7 --clear .venv", - ". ./.venv/bin/activate", - "python3 -m pip install --upgrade pip", - "python2 -m pip install wheel", - "python2 -m pip install semantic_version", - "python2 -m pip install .", - "cp -R ../../dist/escu DA-ESS-ContentUpdate", - "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (os.path.join(local_volume_path, "DA-ESS-ContentUpdate-latest.tar.gz"))] - - ret = subprocess.run("; ".join(commands), - shell=True, capture_output=True) - if ret.returncode != 0: - print("Error generating new ESCU Package.\n\tQuitting..." % ()) - sys.exit(1) - os.chdir("../..") - print("New ESCU Package generated successfully") + source_path = settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE'] + dest_path = os.path.join(local_volume_path, os.path.basename(settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE'])) + + elif 'SPLUNK_ES_CONTENT_UPDATE' not in settings['local_apps']: + print("%s was not found in %s. We assume this is an error and shut down.\n\t"\ + "Quitting..."%('SPLUNK_ES_CONTENT_UPDATE', "settings['local_apps']"), file=sys.stderr) + sys.exit(1) else: - print("Using previous generated ESCU package: [%s]" % ( - pregenerated_escu_package.name)) - try: - with open(os.path.join(local_volume_path, os.path.basename(pregenerated_escu_package.name)), 'wb') as escu_package: - escu_package.write(pregenerated_escu_package.read()) - except Exception as e: - print("Failure writing the ESCU package [%s] to [%s]: [%s].\n\tQuitting..." % ( - pregenerated_escu_package.name, local_volume_path, str(e))) - sys.exit(1) + #Need to generate that package + source_path = generate_escu_app(settings['persist_security_content']) + dest_path = os.path.join(local_volume_path, os.path.basename(source_path)) - print("Wrote ESCU package to volume.") + #Now write out the package, whether it was previously generated or + #we just generated it + try: + shutil.copy(source_path, dest_path) + except shutil.SameFileError as e: + #Same file, not a real error. The copy just doesn't happen + pass + except Exception as e: + print("Error copying ESCU Package [%s] to [%s].\n\tQuitting..."%(source_path, dest_path), file=sys.stderr) + sys.exit(1) + + + print("Wrote ESCU package to volume folder.") + + if settings['mock']: + print("Okay, just a mock") + sys.exit(0) + print("More than a mock") + ''' if args.split_detections_then_stop: for output_file_index in range(0, num_containers): fname = "container_%d_tests.txt" % (output_file_index) @@ -454,7 +483,7 @@ def main(args): #testing_service.prepare_detection_testing(ssh_key_name, private_key, splunk_ip, splunk_password) #testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) - + ''' if __name__ == "__main__": main(sys.argv[1:]) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index db587a93a0..4592279aa0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -54,7 +54,7 @@ setup_schema = { "type": "integer" }, "app_version": { - "type": "string" + "type": ["string","null"] }, "local_path": { "type": ["string", "null"], @@ -66,7 +66,7 @@ setup_schema = { { "app_name": "SPLUNK_ES_CONTENT_UPDATE", "app_number": 3449, - "app_version": "GENERATED", + "app_version": None, 'local_path': None } ] @@ -224,9 +224,9 @@ setup_schema = { "type": "array", "items": { "type": "string", - "enum": ["Anomaly", "Hutning", "TTP"] + "enum": ["Anomaly", "Hunting", "TTP"] }, - "default": ["Anomaly", "Hutning", "TTP"] + "default": ["Anomaly", "Hunting", "TTP"] }, } } @@ -245,16 +245,16 @@ def check_dependencies(settings: dict) -> bool: error_free = True if settings['mode'] == 'selected': # Make sure that exactly one of the following fields is populated - if settings['detections_file'] == None and settings['detections_list'] == []: + if settings['detections_file'] == None and settings['detections_list'] == None: print("Error - mode was 'selected' but no detections_list or detections_file were supplied.", file=sys.stderr) error_free = False - elif settings['detections_file'] != None and settings['detections_list'] != []: + elif settings['detections_file'] != None and settings['detections_list'] != None: print("Error - mode was 'selected' but detections_list and detections_file were supplied.", file=sys.stderr) error_free = False if settings['mode'] != 'selected' and settings['detections_file'] != None: print("Error - mode was not 'selected' but detections_file was supplied.", file=sys.stderr) error_free = False - elif settings['mode'] != 'selected' and settings['detections_list'] != []: + elif settings['mode'] != 'selected' and settings['detections_list'] != None: print("Error - mode was not 'selected' but detections_list was supplied.", file=sys.stderr) error_free = False @@ -271,7 +271,6 @@ def validate(configuration: dict) -> tuple[Union[dict, None], dict]: no_complex_errors = check_dependencies(validated_json) if len(validation_errors) == 0 and no_complex_errors: - print("Input configuration successfully validated!") return validated_json, setup_schema elif no_complex_errors == False: print("Failed due to error(s) listed above.", file=sys.stderr) From bc4a4c0f458dc80e6113b5119be54a9a895e8fb2 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 19 Nov 2021 14:19:14 -0800 Subject: [PATCH 072/203] More changes around the generation of the ESCU package and testing around persist_security_content option. --- .../detection_testing_execution.py | 57 ++++++++++++------- .../modules/github_service.py | 32 +++++------ 2 files changed, 52 insertions(+), 37 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 1db14dd986..bb529e259c 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -83,35 +83,47 @@ def generate_escu_app(persist_security_content:bool=False)->str: ". ./.venv/bin/activate", "python3 -m pip install wheel", "python3 -m pip install -r requirements.txt", - "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", + "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] else: - commands = ["s. ./.venv/bin/activate", "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", + commands = [". ./.venv/bin/activate", + "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) if ret.returncode != 0: - print("Error generating new content. Exiting...") + print("Error generating new content.\n\tQuitting and dumping error...\n[%s]" % (ret.stderr)) sys.exit(1) output_file_name = "DA-ESS-ContentUpdate-latest.tar.gz" - output_file_path_from_root = os.path.join("security_content", "slim_packaging", "apps", "upload", output_file_name) - output_file_path_from_apps = os.path.join("upload", output_file_name) + output_file_path_from_slim_latest = os.path.join("upload", output_file_name) + output_file_path_from_security_content = os.path.join("slim_packaging", "slim_latest", output_file_path_from_slim_latest) + output_file_path_from_root = os.path.join("security_content", output_file_path_from_security_content + + if persist_security_content is True: - os.chdir("slim_packaging") - commands = ["cd slim-latest", + try: + os.remove(output_file_path_from_slim_latest) + except FileNotFoundError: + #No problem if we fail to remove it, that just means it wasn't there and we didn't need to + pass + except Exception as e: + print("Error deleting the (possibly) existing old ESCU File: [%s]"%(str(e)), file=sys.stderr) + sys.exit(1) + + #There remove the latest file if it exists + commands = ["cd slim_packaging/slim_latest", ". ./.venv/bin/activate", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_apps)] + "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_slim_latest)] else: os.mkdir("slim_packaging") - os.chdir("slim_packaging") os.mkdir("apps") - try: SPLUNK_PACKAGING_TOOLKIT_URL = "https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz" SPLUNK_PACKAGING_TOOLKIT_FILENAME = 'splunk-packaging-toolkit-latest.tar.gz' @@ -126,10 +138,11 @@ def generate_escu_app(persist_security_content:bool=False)->str: (str(e)), file=sys.stderr) sys.exit(1) - commands = ["rm -rf slim-latest", - "mkdir slim-latest", - "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim-latest --strip-components=1", - "cd slim-latest", + commands = ["rm -rf slim_packaging/slim_latest", + "mkdir slim_packaging/slim_latest", + "cd splim_packaging", + "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim_latest --strip-components=1", + "cd slim_latest", "virtualenv --python=/usr/bin/python2.7 --clear .venv", ". ./.venv/bin/activate", "python3 -m pip install --upgrade pip", @@ -138,14 +151,15 @@ def generate_escu_app(persist_security_content:bool=False)->str: "python2 -m pip install .", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_apps)] + "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_slim_latest)] ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) if ret.returncode != 0: - print("Error generating new ESCU Package.\n\tQuitting..." % ()) + print("Command List:\n%s"%(commands)) + print("Error generating new ESCU Package.\n\tQuitting and dumping error...\n[%s]" % (ret.stderr.decode('utf-8')),file=sys.stderr) sys.exit(1) - os.chdir("../..") + os.chdir("../") return output_file_path_from_root @@ -162,7 +176,7 @@ def main(args): elif action != "run": print("Unsupported action: [%s]" % (action), file=sys.stderr) sys.exit(1) - print("time to run the test!") + ''' parser = argparse.ArgumentParser(description="CI Detection Testing") @@ -235,7 +249,7 @@ def main(args): all_test_files = github_service.get_test_files(settings['mode'], settings['folders'], - settings['ttps'], + settings['types'], settings['detections_list'], settings['detections_file']) @@ -266,7 +280,7 @@ def main(args): source_path = settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE'] dest_path = os.path.join(local_volume_path, os.path.basename(settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE'])) - elif 'SPLUNK_ES_CONTENT_UPDATE' not in settings['local_apps']: + elif 'SPLUNK_ES_CONTENT_UPDATE' not in [app['app_name'] for app in settings['local_apps']]: print("%s was not found in %s. We assume this is an error and shut down.\n\t"\ "Quitting..."%('SPLUNK_ES_CONTENT_UPDATE', "settings['local_apps']"), file=sys.stderr) sys.exit(1) @@ -284,7 +298,8 @@ def main(args): #Same file, not a real error. The copy just doesn't happen pass except Exception as e: - print("Error copying ESCU Package [%s] to [%s].\n\tQuitting..."%(source_path, dest_path), file=sys.stderr) + print(os.getcwd()) + print("Error copying ESCU Package [%s] to [%s]: [%s].\n\tQuitting..."%(source_path, dest_path, str(e)), file=sys.stderr) sys.exit(1) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index efb4826ce5..dad73ed194 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -44,7 +44,7 @@ class GithubService: def prune_detections(self, detections_to_prune: list[str], - ttps_to_test: list[str], + types_to_test: list[str], previously_successful_tests: list[str], exclude_ssa: bool = True, summary_file: str = None) -> list[str]: @@ -60,8 +60,8 @@ class GithubService: 'detections', 'tests') + '.test.yml' test_filepath_without_security_content = str( pathlib.Path(*pathlib.Path(test_filepath).parts[1:])) - # If no TTPS are provided, then we will get everything - if 'type' in description and (description['type'] in ttps_to_test or len(ttps_to_test) == 0): + # If no types are provided, then we will get everything + if 'type' in description and (description['type'] in types_to_test or len( types_to_test) == 0): # print(description['type']) if not os.path.exists(test_filepath): print("Detection [%s] references [%s], but it does not exist" % ( @@ -105,11 +105,11 @@ class GithubService: return pruned_tests - def get_test_files(self, mode: str, folders:list[str], ttps:list[str], + def get_test_files(self, mode: str, folders:list[str], types:list[str], detections_list: Union[list[str], None], detections_file=Union[str, None]) -> list[str]: if mode == "changes": - tests = self.get_changed_test_files(folders, ttps) + tests = self.get_changed_test_files(folders, types) elif mode == "selected": if detections_list is None and detections_file is None: #It's actually valid to supply an EMPTY list of files and the test should pass. @@ -124,7 +124,7 @@ class GithubService: (detections_list, detections_file), file=sys.stderr) sys.exit(1) if detections_list is not None: - tests = self.get_selected_test_files(detections_list, folders, ttps) + tests = self.get_selected_test_files(detections_list, folders, types) if detections_file is not None: try: with open(detections_file,'r') as f: @@ -136,10 +136,10 @@ class GithubService: "Quitting..."%(detections_file, str(e))) sys.exit(1) - tests = self.get_selected_test_files(files_to_test, folders, ttps) + tests = self.get_selected_test_files(files_to_test, folders, types) elif mode == "all": - tests = self.get_all_tests_and_detections(folders,ttps) + tests = self.get_all_tests_and_detections(folders, types) else: print( "Error, unsupported mode [%s]. Mode must be one of %s", file=sys.stderr) @@ -149,16 +149,16 @@ class GithubService: def get_selected_test_files(self, detection_file_list: list[str], - ttps_to_test: list[str] = [ + types_to_test: list[str] = [ "Anomaly", "Hunting", "TTP"], previously_successful_tests: list[str] = []) -> list[str]: - return self.prune_detections(detection_file_list, ttps_to_test, previously_successful_tests) + return self.prune_detections(detection_file_list, types_to_test, previously_successful_tests) def get_all_tests_and_detections(self, folders: list[str] = [ 'endpoint', 'cloud', 'network'], - ttps_to_test: list[str] = [ + types_to_test: list[str] = [ "Anomaly", "Hunting", "TTP"], previously_successful_tests: list[str] = []) -> list[str]: detections = [] @@ -167,13 +167,13 @@ class GithubService: os.path.join("security_content/detections", folder), "*.yml")) # Prune this down to only the subset of detections we can test - return self.prune_detections(detections, ttps_to_test, previously_successful_tests) + return self.prune_detections(detections, types_to_test, previously_successful_tests) def get_all_files_in_folder(self, foldername: str, extension: str) -> list[str]: filenames = glob.glob(os.path.join(foldername, extension)) return filenames - def get_changed_test_files(self, folders=['endpoint', 'cloud', 'network'], ttps_to_test=["Anomaly", "Hunting", "TTP"], previously_successful_tests=[]) -> list[str]: + def get_changed_test_files(self, folders=['endpoint', 'cloud', 'network'], types_to_test=["Anomaly", "Hunting", "TTP"], previously_successful_tests=[]) -> list[str]: branch1 = self.security_content_branch branch2 = 'develop' g = git.Git('security_content') @@ -193,8 +193,8 @@ class GithubService: if 'detections' in file_path and os.path.basename(file_path).endswith('.yml'): changed_detection_files.append(file_path) else: - print("Looking for changed detections by diffing [%s] against [%s]. Of course none were returned." % ( - branch1, branch2)) + print("Looking for changed detections by diffing [%s] against [%s]. They are the same branch, so none were returned." % ( + branch1, branch2), file=sys.stderr) return [] # all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters @@ -214,7 +214,7 @@ class GithubService: if name not in changed_detection_files: changed_detection_files.append(name) - return self.prune_detections(changed_detection_files, ttps_to_test, previously_successful_tests) + return self.prune_detections(changed_detection_files, types_to_test, previously_successful_tests) #detections_to_test,_,_ = self.filter_test_types(changed_detection_files) # for f in detections_to_test: From c0bdcc6c310ac7e300d66b970a86648889c08907 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 19 Nov 2021 14:38:45 -0800 Subject: [PATCH 073/203] Successful behavior generating escu package regardless of whether --persist-security-content is passed --- .../detection_testing_execution.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index bb529e259c..8eba06e44c 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -77,7 +77,6 @@ def generate_escu_app(persist_security_content:bool=False)->str: # Go into the security content directory print("****GENERATING ESCU APP****") os.chdir("security_content") - print(os.getcwd()) if persist_security_content is False: commands = ["python3 -m venv .venv", ". ./.venv/bin/activate", @@ -100,15 +99,15 @@ def generate_escu_app(persist_security_content:bool=False)->str: output_file_name = "DA-ESS-ContentUpdate-latest.tar.gz" output_file_path_from_slim_latest = os.path.join("upload", output_file_name) output_file_path_from_security_content = os.path.join("slim_packaging", "slim_latest", output_file_path_from_slim_latest) - output_file_path_from_root = os.path.join("security_content", output_file_path_from_security_content + output_file_path_from_root = os.path.join("security_content", output_file_path_from_security_content) if persist_security_content is True: try: - os.remove(output_file_path_from_slim_latest) + os.remove(output_file_path_from_security_content) except FileNotFoundError: - #No problem if we fail to remove it, that just means it wasn't there and we didn't need to + #No problem if we fail to remove it, that just means it wasn't there and we didn't need to pass except Exception as e: print("Error deleting the (possibly) existing old ESCU File: [%s]"%(str(e)), file=sys.stderr) @@ -140,7 +139,7 @@ def generate_escu_app(persist_security_content:bool=False)->str: commands = ["rm -rf slim_packaging/slim_latest", "mkdir slim_packaging/slim_latest", - "cd splim_packaging", + "cd slim_packaging", "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim_latest --strip-components=1", "cd slim_latest", "virtualenv --python=/usr/bin/python2.7 --clear .venv", @@ -298,7 +297,6 @@ def main(args): #Same file, not a real error. The copy just doesn't happen pass except Exception as e: - print(os.getcwd()) print("Error copying ESCU Package [%s] to [%s]: [%s].\n\tQuitting..."%(source_path, dest_path, str(e)), file=sys.stderr) sys.exit(1) From 6a9b5504aaba54d9117adddf6169f6c8884f324e Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 19 Nov 2021 16:06:04 -0800 Subject: [PATCH 074/203] Converted the app listings in the jsonschema from arrays to dicts. they are easier to search for apps that way. also some more testing of the escu app building and persist_security_content. looking good. --- .../detection_testing_execution.py | 59 +++++++- .../modules/new_arguments2.py | 13 +- .../modules/validate_args.py | 133 ++++++++++-------- 3 files changed, 130 insertions(+), 75 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 8eba06e44c..b7c7fe7ab5 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -10,6 +10,8 @@ import threading import queue from docker.client import DockerClient +from modules import validate_args +from modules.validate_args import validate from modules.github_service import GithubService from modules import aws_service, testing_service import time @@ -163,7 +165,7 @@ def generate_escu_app(persist_security_content:bool=False)->str: return output_file_path_from_root -def main(args): +def main(args:list[str]): requests.packages.urllib3.disable_warnings() start_datetime = datetime.now() @@ -273,13 +275,14 @@ def main(args): sys.exit(1) #Check to see if we want to install ESCU and whether it was preeviously generated and we should use that file - if 'SPLUNK_ES_CONTENT_UPDATE' in settings['local_apps'] and settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE'] is not None: + if 'SPLUNK_ES_CONTENT_UPDATE' in settings['local_apps'] and settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] is not None: #Using a pregenerated ESCU, copy it to apps (unless it) - source_path = settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE'] - dest_path = os.path.join(local_volume_path, os.path.basename(settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE'])) + file_path = settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] + source_path = file_path + dest_path = os.path.join(local_volume_path, os.path.basename(file_path)) - elif 'SPLUNK_ES_CONTENT_UPDATE' not in [app['app_name'] for app in settings['local_apps']]: + elif 'SPLUNK_ES_CONTENT_UPDATE' not in settings['local_apps']: print("%s was not found in %s. We assume this is an error and shut down.\n\t"\ "Quitting..."%('SPLUNK_ES_CONTENT_UPDATE', "settings['local_apps']"), file=sys.stderr) sys.exit(1) @@ -304,8 +307,50 @@ def main(args): print("Wrote ESCU package to volume folder.") if settings['mock']: - print("Okay, just a mock") - sys.exit(0) + def finish_mock(num_containers:int, detections:list[str], output_file_template:str="config_tests_%d.json"): + for output_file_index in range(0, num_containers): + fname = output_file_template % (output_file_index) + + #Get the n'th detection for this file + detection_tests = detections[output_file_index::num_containers] + normalized_detection_names = [] + #Normalize the test filename to the name of the detection instead. + #These are what we should write to the file + for d in detection_tests: + filename = os.path.basename(d) + filename = filename.replace(".test.yml", ".yml") + leading = os.path.split(d)[0] + leading = leading.replace("tests/", "detections/") + new_name = os.path.join( + "security_content", leading, filename) + normalized_detection_names.append(new_name) + + #Generate an appropriate config file for this test + import copy + mock_settings = copy.deepcopy(settings) + #This may be able to support as many as 2 for GitHub Actions... + #we will have to determine in testing. + mock_settings['num_containers'] = 1 + + #Must be selected since we are passing in a list of detections + mock_settings['mode'] = 'selected' + + #Pass in the list of detections to run + mock_settings['detections_list'] = normalized_detection_names + + #We want to persist security content and run with the escu package that we created + mock_settings['persist_security_content'] = True + + #mock_settings['persist_security_content'][] + + + + + + print("Done") + + + sys.exit(0) print("More than a mock") ''' if args.split_detections_then_stop: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index 460d9af287..808aa26f89 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -55,17 +55,12 @@ def configure_action(args) -> tuple[str, dict]: print("\t{0}\n".format(formatted_print)) # Now parse the new config and make sure it's good - validated_new_settings, schema = validate_args.validate(new_config) - if validated_new_settings == None: - print("Error in the new settings!") + validated_new_settings, schema = validate_args.validate_and_write(new_config, args.output_config_file) + if validated_new_settings == None: + print("Could not update settings.\n\tQuitting...", file=sys.stderr) sys.exit(1) - - else: - print("New settings successful. Writing results to: %s" % - (args.output_config_file.name)) - args.output_config_file.write(json.dumps( - validated_new_settings, sort_keys=True, indent=4)) + return ("configure", validated_new_settings) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 4592279aa0..3ae4c5b12a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -30,7 +30,7 @@ setup_schema = { }, "detections_list": { - "type": ["array","null"], + "type": ["array", "null"], "items": { "type": "string" }, @@ -43,36 +43,37 @@ setup_schema = { }, "local_apps": { - "type": "array", - "items": { - "type": "object", - "properties": { - "app_name": { + "type": "object", + "properties": { + "value": { + "type": "string", + "properties": { + "app_name": { "type": "string" }, "app_number": { "type": "integer" }, "app_version": { - "type": ["string","null"] + "type": ["string", "null"] }, "local_path": { "type": ["string", "null"], "default": None }, } - }, - "default": [ - { - "app_name": "SPLUNK_ES_CONTENT_UPDATE", - "app_number": 3449, - "app_version": None, - 'local_path': None } - ] - + }, + "default": { + "SPLUNK_ES_CONTENT_UPDATE": { + "app_number": 3449, + "app_version": None, + 'local_path': None + } + } }, + "mode": { "type": "string", "enum": ["changes", "selected", "all"], @@ -107,84 +108,80 @@ setup_schema = { }, "splunkbase_apps": { - "type": "array", - "items": { - "type": "object", - "properties": { - "app_name": { - "type": "string" - }, - "app_number": { - "type": "integer" - }, - "app_version": { - "type": "string" - } - }, - }, - "default": [ + "type": "object", + "properies": { + "value": { - "app_name": "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES", + "type": "string", + "properties": { + "app_number": { + "type": "integer" + }, + "app_version": { + "type": "string" + } + } + } + }, + "default": { + "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES":{ "app_number": 1876, "app_version": "5.2.0" }, + + "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365": { - "app_name": "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365", "app_number": 4055, "app_version": "2.2.0" }, - { - "app_name": "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE", + + "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE": { "app_number": 3719, "app_version": "1.3.2" }, - { - "app_name": "SPLUNK_ANALYTIC_STORY_EXECUTION_APP", + + "SPLUNK_ANALYTIC_STORY_EXECUTION_APP": { "app_number": 4971, "app_version": "2.0.3" }, - { - "app_name": "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT", + + "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT": { "app_number": 2882, "app_version": "2.0.2" }, - { - "app_name": "SPLUNK_MACHINE_LEARNING_TOOLKIT", + + "SPLUNK_MACHINE_LEARNING_TOOLKIT": { "app_number": 2890, "app_version": "5.2.2" }, - { - "app_name": "SPLUNK_APP_FOR_STREAM", + + "SPLUNK_APP_FOR_STREAM": { "app_number": 1809, "app_version": "8.0.1" }, - { - "app_name": "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA", + "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA": { "app_number": 5234, "app_version": "8.0.1" }, - { - "app_name": "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS", + "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS": { "app_number": 5238, "app_version": "8.0.1" }, - { - "app_name": "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO", + "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO": { "app_number": 1617, "app_version": "4.0.0" }, - { - "app_name": "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX", + "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX": { "app_number": 833, "app_version": "8.3.1" }, - { - "app_name": "SPLUNK_COMMON_INFORMATION_MODEL", + "SPLUNK_COMMON_INFORMATION_MODEL": { "app_number": 1621, "app_version": "4.20.2" } - ] + } }, + "splunkbase_username": { "type": ["string", "null"], "default": None @@ -262,13 +259,31 @@ def check_dependencies(settings: dict) -> bool: return error_free +def validate_and_write(configuration: dict, output_file: io.TextIOWrapper) -> tuple[Union[dict, None], dict]: + validated_json, setup_schema = validate(configuration) + if validated_json == None: + print("Error in the new settings! No output file written") + else: + print("Settings updated. Writing results to: %s" % + (output_file.name)) + try: + output_file.write(json.dumps( + validated_json, sort_keys=True, indent=4)) + except Exception as e: + print("Error writing settings to %s: [%s]" % ( + output_file.name, str(e)), file=sys.stderr) + return None, setup_schema + + return validated_json, setup_schema + + def validate(configuration: dict) -> tuple[Union[dict, None], dict]: - #v = jsonschema.Draft201909Validator(argument_schema) + # v = jsonschema.Draft201909Validator(argument_schema) try: validation_errors, validated_json = jsonschema_errorprinter.check_json( configuration, setup_schema) - + no_complex_errors = check_dependencies(validated_json) if len(validation_errors) == 0 and no_complex_errors: return validated_json, setup_schema @@ -277,7 +292,7 @@ def validate(configuration: dict) -> tuple[Union[dict, None], dict]: return None, setup_schema else: print("[%d] failures detected during validation of the configuration!" % ( - len(validation_errors)),file=sys.stderr) + len(validation_errors)), file=sys.stderr) for error in validation_errors: print(error, end="\n\n", file=sys.stderr) return None, setup_schema @@ -292,7 +307,7 @@ def validate(configuration: dict) -> tuple[Union[dict, None], dict]: print("Error validating the json", file=sys.stderr) print(e) return False - + except jsonschema.exceptions.SchemaError as e: print("Error validating the schema", file=sys.stderr) """ From 3f1b02590898b140cda56d96d0f16ad8a1be7e57 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 19 Nov 2021 17:07:27 -0800 Subject: [PATCH 075/203] Mock is now working and splits the tests as intended. Appropriate mock config.json files are created, validated, and written. --- .../detection_testing_execution.py | 96 ++++++++++++------- .../modules/github_service.py | 17 ++-- .../modules/new_arguments2.py | 6 ++ 3 files changed, 77 insertions(+), 42 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index b7c7fe7ab5..a80bb1a575 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -1,37 +1,33 @@ -import sys import argparse -import shutil +import copy +import csv +import json import os -import time +import queue import random import secrets -import docker -import threading -import queue - -from docker.client import DockerClient -from modules import validate_args -from modules.validate_args import validate -from modules.github_service import GithubService -from modules import aws_service, testing_service -import time -import subprocess - -from timeit import default_timer as timer -from datetime import timedelta -from datetime import datetime -import string import shutil -from typing import Union +import string +import subprocess +import sys +import threading +import time from collections import OrderedDict +from datetime import datetime, timedelta from tempfile import mkdtemp -import csv +from timeit import default_timer as timer +from typing import Union -from requests import get -import json +import docker import requests.packages.urllib3 +from docker.client import DockerClient +from requests import get +from modules.validate_args import validate_and_write import modules.new_arguments2 +from modules import aws_service, testing_service, validate_args +from modules.github_service import GithubService +from modules.validate_args import validate SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" @@ -52,12 +48,13 @@ def ensure_security_content(branch: str, pr_number: Union[int, None], persist_se "out of date. ******") github_service = GithubService( branch, existing_directory=persist_security_content) - - elif persist_security_content is True: - print("Error - you chose --persist_security_content but the security_content directory does not exist!\n\tQuitting...") - sys.exit(1) + else: - if os.path.exists("security_content/"): + if persist_security_content is True and not os.path.exists("security_content"): + print("Error - you chose --persist_security_content but the security_content directory does not exist!"\ + " We will check it out for you.\n\tQuitting...") + + elif os.path.exists("security_content/"): print("Deleting the security_content directory") try: shutil.rmtree("security_content/", ignore_errors=True) @@ -178,7 +175,8 @@ def main(args:list[str]): print("Unsupported action: [%s]" % (action), file=sys.stderr) sys.exit(1) - + + ''' parser = argparse.ArgumentParser(description="CI Detection Testing") parser.add_argument("-b", "--branch", type=str, required=True, help="security content branch") @@ -248,6 +246,7 @@ def main(args:list[str]): github_service = ensure_security_content( settings['branch'], settings['pr_number'], settings['persist_security_content']) + all_test_files = github_service.get_test_files(settings['mode'], settings['folders'], settings['types'], @@ -307,7 +306,18 @@ def main(args:list[str]): print("Wrote ESCU package to volume folder.") if settings['mock']: - def finish_mock(num_containers:int, detections:list[str], output_file_template:str="config_tests_%d.json"): + def finish_mock(settings:dict, detections:list[str], output_file_template:str="prior_config/config_tests_%d.json"): + num_containers = settings['num_containers'] + + + try: + os.mkdir("prior_config") + except FileExistsError: + pass + except Exception as e: + print("Some error occured when trying to make the configs folder: [%s]\n\tQuitting..."%(str(e)), file=sys.stderr) + sys.exit(1) + for output_file_index in range(0, num_containers): fname = output_file_template % (output_file_index) @@ -326,7 +336,6 @@ def main(args:list[str]): normalized_detection_names.append(new_name) #Generate an appropriate config file for this test - import copy mock_settings = copy.deepcopy(settings) #This may be able to support as many as 2 for GitHub Actions... #we will have to determine in testing. @@ -341,16 +350,33 @@ def main(args:list[str]): #We want to persist security content and run with the escu package that we created mock_settings['persist_security_content'] = True - #mock_settings['persist_security_content'][] - + mock_settings['local_apps'] = { + "SPLUNK_ES_CONTENT_UPDATE": { + "app_number": 3449, + "app_version": None, + 'local_path': "prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz"} + } + + mock_settings['mock'] = False + + #Make sure that it still validates after all of the changes - - print("Done") + try: + with open(fname,'w') as cfg: + validated_settings,b = validate_and_write(mock_settings,cfg) + if validated_settings is None: + print("There was an error validating the updated mock settings.\n\tQuitting...",file=sys.stderr) + sys.exit(1) + except Exception as e: + print("Error writing config file %s: [%s]\n\tQuitting..."%(fname,str(e)),file=sys.stderr) + sys.exit(1) sys.exit(0) + finish_mock(settings,all_test_files) + print("More than a mock") ''' if args.split_detections_then_stop: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index dad73ed194..5450279021 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -109,7 +109,7 @@ class GithubService: detections_list: Union[list[str], None], detections_file=Union[str, None]) -> list[str]: if mode == "changes": - tests = self.get_changed_test_files(folders, types) + tests = self.get_changed_test_files(folders, types) elif mode == "selected": if detections_list is None and detections_file is None: #It's actually valid to supply an EMPTY list of files and the test should pass. @@ -118,14 +118,14 @@ class GithubService: print("Trying to test a list of files, but None were provided", file=sys.stderr) sys.exit(1) - if detections_list is not None and detections_file is not None: + elif detections_list is not None and detections_file is not None: print("Both detections_list [%s] and detections_file [%s] were provided. "\ "Because these confilect, we cannot test.\n\tQuitting..."% (detections_list, detections_file), file=sys.stderr) sys.exit(1) - if detections_list is not None: + elif detections_list is not None: tests = self.get_selected_test_files(detections_list, folders, types) - if detections_file is not None: + elif detections_file is not None: try: with open(detections_file,'r') as f: data = f.readlines() @@ -137,15 +137,18 @@ class GithubService: sys.exit(1) tests = self.get_selected_test_files(files_to_test, folders, types) + else: + #impossible to get here + print("Impossible to get here. Just kept to make the if/elif more self describing",file=sys.stderr) + sys.exit(1) elif mode == "all": tests = self.get_all_tests_and_detections(folders, types) else: - print( - "Error, unsupported mode [%s]. Mode must be one of %s", file=sys.stderr) + print("Error, unsupported mode [%s]. Mode must be one of %s", file=sys.stderr) sys.exit(1) - return [] + return tests def get_selected_test_files(self, detection_file_list: list[str], diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index 808aa26f89..ff1cf6c19f 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -131,6 +131,8 @@ def parse(args)->tuple[str,dict]: "cannot be changed (except for credentials that can be "\ "entered on the command line).") + + run_parser.add_argument('-user', '--splunkbase_username', required=False, type=str, help="Username for login to splunkbase. This is required " "if downloading packages from Splunkbase. While this can " @@ -149,6 +151,10 @@ def parse(args)->tuple[str,dict]: run_parser.add_argument("-show_pass", "--show_splunk_app_password", required=False, action="store_true", help="The password to login to the Splunk Server. ") + + run_parser.add_argument("-m", "--mock", required=False, + action="store_true", + help="Split into multiple configs, don't actually run the tests.") args = parser.parse_args() From 3cd1e42ada50a7d7f27abf243a8f84eaa73d2258 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 22 Nov 2021 16:36:21 -0800 Subject: [PATCH 076/203] Huge refactor is almost complete. Able to launch and run multiple containers now as intended --- .../detection_testing_execution.py | 322 ++++++++++-------- .../modules/container_manager.py | 53 ++- .../modules/new_arguments2.py | 36 +- .../modules/splunk_container.py | 70 ++-- .../modules/validate_args.py | 34 +- 5 files changed, 309 insertions(+), 206 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index a80bb1a575..72ce7f2084 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -23,6 +23,7 @@ import requests.packages.urllib3 from docker.client import DockerClient from requests import get from modules.validate_args import validate_and_write +from modules import container_manager import modules.new_arguments2 from modules import aws_service, testing_service, validate_args @@ -33,6 +34,7 @@ SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" index_file_container_path = os.path.join(SPLUNK_CONTAINER_APPS_DIR, "search") +# Should be the last one we copy. datamodel_file_local_path = "datamodels.conf.tar" datamodel_file_container_path = os.path.join( SPLUNK_CONTAINER_APPS_DIR, "Splunk_SA_CIM") @@ -48,12 +50,12 @@ def ensure_security_content(branch: str, pr_number: Union[int, None], persist_se "out of date. ******") github_service = GithubService( branch, existing_directory=persist_security_content) - + else: if persist_security_content is True and not os.path.exists("security_content"): - print("Error - you chose --persist_security_content but the security_content directory does not exist!"\ + print("Error - you chose --persist_security_content but the security_content directory does not exist!" " We will check it out for you.\n\tQuitting...") - + elif os.path.exists("security_content/"): print("Deleting the security_content directory") try: @@ -72,97 +74,99 @@ def ensure_security_content(branch: str, pr_number: Union[int, None], persist_se return github_service -def generate_escu_app(persist_security_content:bool=False)->str: +def generate_escu_app(persist_security_content: bool = False) -> str: # Go into the security content directory - print("****GENERATING ESCU APP****") - os.chdir("security_content") - if persist_security_content is False: - commands = ["python3 -m venv .venv", - ". ./.venv/bin/activate", - "python3 -m pip install wheel", - "python3 -m pip install -r requirements.txt", - "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", - "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] - else: - commands = [". ./.venv/bin/activate", - "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", - "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] - ret = subprocess.run("; ".join(commands), - shell=True, capture_output=True) - if ret.returncode != 0: - print("Error generating new content.\n\tQuitting and dumping error...\n[%s]" % (ret.stderr)) + print("****GENERATING ESCU APP****") + os.chdir("security_content") + if persist_security_content is False: + commands = ["python3 -m venv .venv", + ". ./.venv/bin/activate", + "python3 -m pip install wheel", + "python3 -m pip install -r requirements.txt", + "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", + "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + else: + commands = [". ./.venv/bin/activate", + "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", + "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] + ret = subprocess.run("; ".join(commands), + shell=True, capture_output=True) + if ret.returncode != 0: + print("Error generating new content.\n\tQuitting and dumping error...\n[%s]" % ( + ret.stderr)) + sys.exit(1) + + output_file_name = "DA-ESS-ContentUpdate-latest.tar.gz" + output_file_path_from_slim_latest = os.path.join( + "upload", output_file_name) + output_file_path_from_security_content = os.path.join( + "slim_packaging", "slim_latest", output_file_path_from_slim_latest) + output_file_path_from_root = os.path.join( + "security_content", output_file_path_from_security_content) + + if persist_security_content is True: + try: + os.remove(output_file_path_from_security_content) + except FileNotFoundError: + # No problem if we fail to remove it, that just means it wasn't there and we didn't need to + pass + except Exception as e: + print("Error deleting the (possibly) existing old ESCU File: [%s]" % ( + str(e)), file=sys.stderr) sys.exit(1) - - - output_file_name = "DA-ESS-ContentUpdate-latest.tar.gz" - output_file_path_from_slim_latest = os.path.join("upload", output_file_name) - output_file_path_from_security_content = os.path.join("slim_packaging", "slim_latest", output_file_path_from_slim_latest) - output_file_path_from_root = os.path.join("security_content", output_file_path_from_security_content) - - + # There remove the latest file if it exists + commands = ["cd slim_packaging/slim_latest", + ". ./.venv/bin/activate", + "cp -R ../../dist/escu DA-ESS-ContentUpdate", + "slim package -o upload DA-ESS-ContentUpdate", + "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_slim_latest)] - if persist_security_content is True: - try: - os.remove(output_file_path_from_security_content) - except FileNotFoundError: - #No problem if we fail to remove it, that just means it wasn't there and we didn't need to - pass - except Exception as e: - print("Error deleting the (possibly) existing old ESCU File: [%s]"%(str(e)), file=sys.stderr) - sys.exit(1) - - #There remove the latest file if it exists - commands = ["cd slim_packaging/slim_latest", - ". ./.venv/bin/activate", - "cp -R ../../dist/escu DA-ESS-ContentUpdate", - "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_slim_latest)] - - else: - os.mkdir("slim_packaging") - os.mkdir("apps") - try: - SPLUNK_PACKAGING_TOOLKIT_URL = "https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz" - SPLUNK_PACKAGING_TOOLKIT_FILENAME = 'splunk-packaging-toolkit-latest.tar.gz' - print("Downloading the Splunk Packaging Toolkit from %s..." % - (SPLUNK_PACKAGING_TOOLKIT_URL), end='') - response = get(SPLUNK_PACKAGING_TOOLKIT_URL) - response.raise_for_status() - with open(SPLUNK_PACKAGING_TOOLKIT_FILENAME, 'wb') as slim_file: - slim_file.write(response.content) - except Exception as e: - print("Error downloading the Splunk Packaging Toolkit: [%s].\n\tQuitting..." % - (str(e)), file=sys.stderr) - sys.exit(1) - - commands = ["rm -rf slim_packaging/slim_latest", - "mkdir slim_packaging/slim_latest", - "cd slim_packaging", - "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim_latest --strip-components=1", - "cd slim_latest", - "virtualenv --python=/usr/bin/python2.7 --clear .venv", - ". ./.venv/bin/activate", - "python3 -m pip install --upgrade pip", - "python2 -m pip install wheel", - "python2 -m pip install semantic_version", - "python2 -m pip install .", - "cp -R ../../dist/escu DA-ESS-ContentUpdate", - "slim package -o upload DA-ESS-ContentUpdate", - "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_slim_latest)] - - ret = subprocess.run("; ".join(commands), - shell=True, capture_output=True) - if ret.returncode != 0: - print("Command List:\n%s"%(commands)) - print("Error generating new ESCU Package.\n\tQuitting and dumping error...\n[%s]" % (ret.stderr.decode('utf-8')),file=sys.stderr) + else: + os.mkdir("slim_packaging") + os.mkdir("apps") + try: + SPLUNK_PACKAGING_TOOLKIT_URL = "https://download.splunk.com/misc/packaging-toolkit/splunk-packaging-toolkit-0.9.0.tar.gz" + SPLUNK_PACKAGING_TOOLKIT_FILENAME = 'splunk-packaging-toolkit-latest.tar.gz' + print("Downloading the Splunk Packaging Toolkit from %s..." % + (SPLUNK_PACKAGING_TOOLKIT_URL), end='') + response = get(SPLUNK_PACKAGING_TOOLKIT_URL) + response.raise_for_status() + with open(SPLUNK_PACKAGING_TOOLKIT_FILENAME, 'wb') as slim_file: + slim_file.write(response.content) + except Exception as e: + print("Error downloading the Splunk Packaging Toolkit: [%s].\n\tQuitting..." % + (str(e)), file=sys.stderr) sys.exit(1) - os.chdir("../") - return output_file_path_from_root + commands = ["rm -rf slim_packaging/slim_latest", + "mkdir slim_packaging/slim_latest", + "cd slim_packaging", + "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim_latest --strip-components=1", + "cd slim_latest", + "virtualenv --python=/usr/bin/python2.7 --clear .venv", + ". ./.venv/bin/activate", + "python3 -m pip install --upgrade pip", + "python2 -m pip install wheel", + "python2 -m pip install semantic_version", + "python2 -m pip install .", + "cp -R ../../dist/escu DA-ESS-ContentUpdate", + "slim package -o upload DA-ESS-ContentUpdate", + "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_slim_latest)] + + ret = subprocess.run("; ".join(commands), + shell=True, capture_output=True) + if ret.returncode != 0: + print("Command List:\n%s" % (commands)) + print("Error generating new ESCU Package.\n\tQuitting and dumping error...\n[%s]" % ( + ret.stderr.decode('utf-8')), file=sys.stderr) + sys.exit(1) + os.chdir("../") + + return output_file_path_from_root -def main(args:list[str]): +def main(args: list[str]): requests.packages.urllib3.disable_warnings() start_datetime = datetime.now() @@ -174,9 +178,8 @@ def main(args:list[str]): elif action != "run": print("Unsupported action: [%s]" % (action), file=sys.stderr) sys.exit(1) - - - + + ''' parser = argparse.ArgumentParser(description="CI Detection Testing") parser.add_argument("-b", "--branch", type=str, required=True, help="security content branch") @@ -246,7 +249,6 @@ def main(args:list[str]): github_service = ensure_security_content( settings['branch'], settings['pr_number'], settings['persist_security_content']) - all_test_files = github_service.get_test_files(settings['mode'], settings['folders'], settings['types'], @@ -254,78 +256,83 @@ def main(args:list[str]): settings['detections_file']) - - # if len(all_test_files) == 0: # print("No files were found to be tested. While this could be due to an error, "\ # "this could be correct if there were no changes to detections. We will "\ # "exit with success.\n\tQuitting...") # sys.exit(0) - local_volume_path = os.path.join(os.getcwd(), "apps") + local_volume_absolute_path = os.path.abspath( + os.path.join(os.getcwd(), "apps")) try: os.mkdir("apps") except FileExistsError as e: # Directory already exists, do nothing pass except Exception as e: - print("Error creating the apps folder [%s]: [%s]\n\tQuitting..." - % (local_volume_path, str(e)), file=sys.stderr) + print("Error creating the apps folder [%s]: [%s]\n\tQuitting..." + % (local_volume_absolute_path, str(e)), file=sys.stderr) sys.exit(1) - #Check to see if we want to install ESCU and whether it was preeviously generated and we should use that file + # Check to see if we want to install ESCU and whether it was preeviously generated and we should use that file if 'SPLUNK_ES_CONTENT_UPDATE' in settings['local_apps'] and settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] is not None: - #Using a pregenerated ESCU, copy it to apps (unless it) + # Using a pregenerated ESCU, copy it to apps (unless it) - file_path = settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] + file_path = os.path.expanduser(settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path']) source_path = file_path - dest_path = os.path.join(local_volume_path, os.path.basename(file_path)) - + dest_path = os.path.join( + local_volume_absolute_path, os.path.basename(file_path)) + elif 'SPLUNK_ES_CONTENT_UPDATE' not in settings['local_apps']: - print("%s was not found in %s. We assume this is an error and shut down.\n\t"\ - "Quitting..."%('SPLUNK_ES_CONTENT_UPDATE', "settings['local_apps']"), file=sys.stderr) + print("%s was not found in %s. We assume this is an error and shut down.\n\t" + "Quitting..." % ('SPLUNK_ES_CONTENT_UPDATE', "settings['local_apps']"), file=sys.stderr) sys.exit(1) else: - #Need to generate that package + # Need to generate that package source_path = generate_escu_app(settings['persist_security_content']) - dest_path = os.path.join(local_volume_path, os.path.basename(source_path)) + dest_path = os.path.join( + local_volume_absolute_path, os.path.basename(source_path)) + COPY_ALL_LOCAL_FILES_NOT_JUST_ESCU + - - #Now write out the package, whether it was previously generated or - #we just generated it + # Now write out the package, whether it was previously generated or + # we just generated it try: shutil.copy(source_path, dest_path) + #Update apps path for the ESCU package we just built + settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] = dest_path + except shutil.SameFileError as e: - #Same file, not a real error. The copy just doesn't happen + # Same file, not a real error. The copy just doesn't happen pass except Exception as e: - print("Error copying ESCU Package [%s] to [%s]: [%s].\n\tQuitting..."%(source_path, dest_path, str(e)), file=sys.stderr) + print("Error copying ESCU Package [%s] to [%s]: [%s].\n\tQuitting..." % ( + source_path, dest_path, str(e)), file=sys.stderr) sys.exit(1) - print("Wrote ESCU package to volume folder.") if settings['mock']: - def finish_mock(settings:dict, detections:list[str], output_file_template:str="prior_config/config_tests_%d.json"): + def finish_mock(settings: dict, detections: list[str], output_file_template: str = "prior_config/config_tests_%d.json"): num_containers = settings['num_containers'] - try: os.mkdir("prior_config") except FileExistsError: pass except Exception as e: - print("Some error occured when trying to make the configs folder: [%s]\n\tQuitting..."%(str(e)), file=sys.stderr) + print("Some error occured when trying to make the configs folder: [%s]\n\tQuitting..." % ( + str(e)), file=sys.stderr) sys.exit(1) for output_file_index in range(0, num_containers): fname = output_file_template % (output_file_index) - - #Get the n'th detection for this file + + # Get the n'th detection for this file detection_tests = detections[output_file_index::num_containers] normalized_detection_names = [] - #Normalize the test filename to the name of the detection instead. - #These are what we should write to the file + # Normalize the test filename to the name of the detection instead. + # These are what we should write to the file for d in detection_tests: filename = os.path.basename(d) filename = filename.replace(".test.yml", ".yml") @@ -334,50 +341,80 @@ def main(args:list[str]): new_name = os.path.join( "security_content", leading, filename) normalized_detection_names.append(new_name) - - #Generate an appropriate config file for this test + + # Generate an appropriate config file for this test mock_settings = copy.deepcopy(settings) - #This may be able to support as many as 2 for GitHub Actions... - #we will have to determine in testing. + # This may be able to support as many as 2 for GitHub Actions... + # we will have to determine in testing. mock_settings['num_containers'] = 1 - - #Must be selected since we are passing in a list of detections + + # Must be selected since we are passing in a list of detections mock_settings['mode'] = 'selected' - - #Pass in the list of detections to run + + # Pass in the list of detections to run mock_settings['detections_list'] = normalized_detection_names - #We want to persist security content and run with the escu package that we created + # We want to persist security content and run with the escu package that we created mock_settings['persist_security_content'] = True - mock_settings['local_apps'] = { + mock_settings['local_apps'] = { "SPLUNK_ES_CONTENT_UPDATE": { "app_number": 3449, "app_version": None, 'local_path': "prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz"} - } - - mock_settings['mock'] = False - - #Make sure that it still validates after all of the changes + } + + mock_settings['mock'] = False + + # Make sure that it still validates after all of the changes - - try: - with open(fname,'w') as cfg: - validated_settings,b = validate_and_write(mock_settings,cfg) + with open(fname, 'w') as cfg: + validated_settings, b = validate_and_write( + mock_settings, cfg) if validated_settings is None: - print("There was an error validating the updated mock settings.\n\tQuitting...",file=sys.stderr) + print( + "There was an error validating the updated mock settings.\n\tQuitting...", file=sys.stderr) sys.exit(1) except Exception as e: - print("Error writing config file %s: [%s]\n\tQuitting..."%(fname,str(e)),file=sys.stderr) + print("Error writing config file %s: [%s]\n\tQuitting..." % ( + fname, str(e)), file=sys.stderr) sys.exit(1) - - sys.exit(0) - finish_mock(settings,all_test_files) - print("More than a mock") + sys.exit(0) + finish_mock(settings, all_test_files) + + files_to_copy_to_container = OrderedDict() + files_to_copy_to_container["INDEXES"] = { + "local_file_path": index_file_local_path, "container_file_path": index_file_container_path} + files_to_copy_to_container["DATAMODELS"] = { + "local_file_path": datamodel_file_local_path, "container_file_path": datamodel_file_container_path} + + mounts = [{"local_path": local_volume_absolute_path, + "container_path": "/tmp/apps", "type": "bind", "read_only": True}] + + cm = container_manager.ContainerManager(all_test_files, + FULL_DOCKER_HUB_CONTAINER_NAME, + settings['local_base_container_name'], + settings['num_containers'], + settings['local_apps'], + settings['splunkbase_apps'], + files_to_copy_to_container=files_to_copy_to_container, + web_port_start=8000, + management_port_start=8089, + mounts=mounts, + show_container_password=settings['show_splunk_app_password'], + container_password=settings['splunk_app_password'], + splunkbase_username=settings['splunkbase_username'], + splunkbase_password=settings['splunkbase_password'], + reuse_image=settings['reuse_image'], + interactive_failure=settings['interactive_failure']) + + + print(cm.containers[0].environment) + cm.run_test() + ''' if args.split_detections_then_stop: for output_file_index in range(0, num_containers): @@ -569,5 +606,6 @@ def main(args:list[str]): #testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) ''' + if __name__ == "__main__": main(sys.argv[1:]) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index b703872057..a7136ea937 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -2,13 +2,16 @@ from collections import OrderedDict import docker import datetime import docker.types +import os import random -import splunk_container + +from modules import splunk_container import string -import test_driver +from modules import test_driver import threading import time import timeit + from typing import Union WEB_PORT_STRING = "8000/tcp" @@ -22,26 +25,35 @@ class ContainerManager: full_docker_hub_name: str, container_name_template: str, num_containers: int, - apps: OrderedDict, + local_apps: OrderedDict, + splunkbase_apps:OrderedDict, files_to_copy_to_container: OrderedDict = OrderedDict(), web_port_start: int = 8000, management_port_start: int = 8089, - mounts: list[dict[str, Union[str, bool]]] = [], + mounts: list[dict[str, str]] = [], + show_container_password:bool=True, container_password: Union[str, None] = None, splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, - reuse_image:bool = True + reuse_image:bool = True, + interactive_failure:bool=False + ): self.synchronization_object = test_driver.TestDriver( test_list, num_containers) self.mounts = self.create_mounts(mounts) - self.apps = apps + self.local_apps = local_apps + self.splunkbase_apps = splunkbase_apps if container_password is None: self.container_password = self.get_random_password() else: self.container_password = container_password + + if show_container_password: + print("Splunk App Password: [%s]"%(self.container_password)) + self.containers = self.create_containers( full_docker_hub_name, @@ -52,7 +64,8 @@ class ContainerManager: splunkbase_username, splunkbase_password, files_to_copy_to_container, - reuse_image + reuse_image, + interactive_failure ) self.summary_thread = threading.Thread(target=self.queue_status_thread,args=()) @@ -66,8 +79,12 @@ class ContainerManager: self.baseline['TEST_FINISH_TIME'] = "TO BE UPDATED" self.baseline['TEST_DURATION'] = "TO BE UPDATED" - for key in self.apps: - self.baseline[key] = self.apps[key] + for key in self.local_apps: + self.baseline[key] = self.local_apps[key] + + for key in self.splunkbase_apps: + self.baseline[key] = self.splunkbase_apps[key] + def run_test(self): self.run_containers() @@ -95,10 +112,11 @@ class ContainerManager: def run_containers(self) -> None: for container in self.containers: - container.thread.run() + container.thread.start() + def run_status_thread(self) -> None: - self.queue_status_thread.run() + self.summary_thread.start() @@ -112,7 +130,8 @@ class ContainerManager: splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, files_to_copy_to_container: OrderedDict = OrderedDict(), - reuse_image = True + reuse_image:bool = True, + interactive_failure:bool = True ) -> list[splunk_container.SplunkContainer]: #First make sure that the image exists and has been downloaded self.setup_image(reuse_image, full_docker_hub_name) @@ -131,7 +150,8 @@ class ContainerManager: self.synchronization_object, full_docker_hub_name, container_name, - self.apps, + self.local_apps, + self.splunkbase_apps, web_port_tuple, management_port_tuple, self.container_password, @@ -139,22 +159,23 @@ class ContainerManager: self.mounts, splunkbase_username, splunkbase_password, + interactive_failure=interactive_failure ) ) return new_containers def create_mounts( - self, mounts: list[dict[str, Union[str, bool]]] + self, mounts: list[dict[str, str]] ) -> list[docker.types.Mount]: new_mounts = [] for mount in mounts: new_mounts.append(self.create_mount(mount)) return new_mounts - def create_mount(self, mount: dict[str, Union[str, bool]]) -> docker.types.Mount: + def create_mount(self, mount: dict[str, str]) -> docker.types.Mount: return docker.types.Mount( - source=mount["local_path"], + source=os.path.abspath(mount["local_path"]), target=mount["container_path"], type=mount["type"], read_only=mount["read_only"], diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index ff1cf6c19f..978fcdafd8 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -14,7 +14,7 @@ def configure_action(args) -> tuple[str, dict]: settings, schema = validate_args.validate_file(args.input_config_file) if settings is None: - print("Failure while processing settings.\n\tQuitting...", file=sys.stderr) + print("Failure while processing settings\n\tQuitting...", file=sys.stderr) sys.exit(1) new_config = {} @@ -36,6 +36,7 @@ def configure_action(args) -> tuple[str, dict]: new_config[arg] = json.loads(choice.lower()) formatted_print = choice.lower() else: + if choice in ['true', 'false'] or (choice.isdigit() and schema['properties'][arg]['type'] != "integer"): choice = '"' + choice + '"' # replace all single quotes with doubles quotes to make valid json @@ -46,6 +47,8 @@ def configure_action(args) -> tuple[str, dict]: elif '"' in choice: #Do nothing pass + elif choice.isdigit(): + pass else: choice = '"' + choice + '"' @@ -148,20 +151,43 @@ def parse(args)->tuple[str,dict]: help="Password for login to the splunk app. If you don't " "provide one here or in the config, it will be generated " "automatically for you.") - run_parser.add_argument("-show_pass", "--show_splunk_app_password", required=False, + + run_parser.add_argument("-show_pass", "--show_splunk_app_password", required=False, action="store_true", - help="The password to login to the Splunk Server. ") + help="The password to login to the Splunk Server. If the config "\ + "file is set to true, it will override the default False for this. True "\ + "will override the default value in the config file.") run_parser.add_argument("-m", "--mock", required=False, action="store_true", - help="Split into multiple configs, don't actually run the tests.") + help="Split into multiple configs, don't actually run the tests. If the config "\ + "file is set to true, it will override the default False for this. True "\ + "will override the default value in the config file.") args = parser.parse_args() + # Run the appropriate parser - try: + #If an argument is not passed on the command line, don't overwrite its config + #file value with None - keep the config file value + keys = list(args.__dict__.keys()) + for key in keys: + if args.__dict__[key] is None and key in ["show_pass", "mock"]: + del args.__dict__[key] + action, settings = args.func(args) + + ''' + default_settings,_ = validate_args.validate({}) + if default_settings is None: + print("Somehow default settings were None.\n\tQuitting...",file=sys.stderr) + sys.exit(1) + #Fix up the show_app_password and mock arguments, as shown in the documentation + #for those args + settings['show_splunk_app_password'] |= default_settings['show_splunk_app_password'] + settings['mock'] |= default_settings['mock'] + ''' return action, settings except Exception as e: print("Unknown Error - [%s]" % (str(e))) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index d958ff1e81..1318eda110 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -9,9 +9,9 @@ import os.path import random import requests import shutil -import splunk_sdk -import testing_service -import test_driver +from modules import splunk_sdk +from modules import testing_service +from modules import test_driver import time import timeit from typing import Union @@ -27,7 +27,8 @@ class SplunkContainer: synchronization_object: test_driver.TestDriver, full_docker_hub_path, container_name: str, - apps: OrderedDict, + local_apps: OrderedDict, + splunkbase_apps: OrderedDict, web_port_tuple: tuple[str, int], management_port_tuple: tuple[str, int], container_password: str, @@ -43,13 +44,15 @@ class SplunkContainer: self.client = docker.client.from_env() self.full_docker_hub_path = full_docker_hub_path self.container_password = container_password - self.apps = apps + self.local_apps = local_apps + self.splunkbase_apps = splunkbase_apps + self.files_to_copy_to_container = files_to_copy_to_container self.splunk_ip = splunk_ip self.container_name = container_name self.mounts = mounts self.environment = self.make_environment( - apps, container_password, splunkbase_username, splunkbase_password + local_apps, splunkbase_apps, container_password, splunkbase_username, splunkbase_password ) self.ports = self.make_ports(web_port_tuple, management_port_tuple) self.web_port = web_port_tuple[1] @@ -64,41 +67,40 @@ class SplunkContainer: def prepare_apps_path( self, - apps: OrderedDict, + local_apps: OrderedDict, + splunkbase_apps: OrderedDict, splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, ) -> tuple[str, bool]: apps_to_install = [] require_credentials = False - for app_name in self.apps: - app = self.apps[app_name] - if app["location"] == "splunkbase": - if splunkbase_username is None or splunkbase_password is None: - raise Exception( - "Error: Requested app from Splunkbase but Splunkbase username and/or password were not supplied." - ) - target = SPLUNKBASE_URL % ( - app["app_number"], app["app_version"]) - apps_to_install.append(target) - require_credentials = True - elif app["location"] == "local": - apps_to_install.append(app["container_path"]) + + for app_name, app_info in self.local_apps.items(): + + app_file_name = os.path.basename(app_info['local_path']) + app_file_container_path = os.path.join("/tmp/apps", app_file_name) + apps_to_install.append(app_file_container_path) + + for app_name, app_info in self.splunkbase_apps.items(): + + if splunkbase_username is None or splunkbase_password is None: + raise Exception( + "Error: Requested app from Splunkbase but Splunkbase username and/or password were not supplied." + ) + target = SPLUNKBASE_URL % ( + app_info["app_number"], app_info["app_version"]) + apps_to_install.append(target) + require_credentials = True + #elif app["location"] == "local": + # apps_to_install.append(app["container_path"]) return ",".join(apps_to_install), require_credentials - def make_volume( - self, - local_path: str, - container_path: str, - type: str = "bind", - read_only: bool = True, - ) -> docker.types.Mount: - return docker.types.Mount( - source=local_path, target=container_path, type="bind", read_only=True - ) + def make_environment( self, - apps: OrderedDict, + local_apps: OrderedDict, + splunkbase_apps: OrderedDict, container_password: str, splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, @@ -107,7 +109,7 @@ class SplunkContainer: env["SPLUNK_START_ARGS"] = SPLUNK_START_ARGS env["SPLUNK_PASSWORD"] = container_password splunk_apps_url, require_credentials = self.prepare_apps_path( - apps, splunkbase_username, splunkbase_password + local_apps, splunkbase_apps, splunkbase_username, splunkbase_password ) if require_credentials: env["SPLUNKBASE_USERNAME"] = splunkbase_username @@ -289,9 +291,9 @@ class SplunkContainer: self.container.start() # By default, first copy the index file then the datamodel file - for f in self.files_to_copy_to_container: + for file_description, file_dict in self.files_to_copy_to_container.items(): self.extract_tar_file_to_container( - f["local_file_path"], f["container_file_path"] + file_dict["local_file_path"], file_dict["container_file_path"] ) print("Finished copying files to [%s]" % (self.container_name)) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 3ae4c5b12a..92a89471b4 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -69,6 +69,11 @@ setup_schema = { "app_number": 3449, "app_version": None, 'local_path': None + }, + "BETA_SPLUNK_ADD_ON_FOR_SYSMON": { + "app_number": 5709, + "app_version": None, + "local_path": "~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" } } }, @@ -178,6 +183,10 @@ setup_schema = { "SPLUNK_COMMON_INFORMATION_MODEL": { "app_number": 1621, "app_version": "4.20.2" + }, + "SPLUNK_ADD_ON_FOR_SYSMON": { + "app_number": 5709, + "app_version": "1.0.1" } } }, @@ -240,8 +249,11 @@ def validate_file(file: io.TextIOWrapper) -> tuple[Union[dict, None], dict]: def check_dependencies(settings: dict) -> bool: # Check complex mode dependencies error_free = True + + if settings['mode'] == 'selected': # Make sure that exactly one of the following fields is populated + if settings['detections_file'] == None and settings['detections_list'] == None: print("Error - mode was 'selected' but no detections_list or detections_file were supplied.", file=sys.stderr) error_free = False @@ -254,7 +266,7 @@ def check_dependencies(settings: dict) -> bool: elif settings['mode'] != 'selected' and settings['detections_list'] != None: print("Error - mode was not 'selected' but detections_list was supplied.", file=sys.stderr) error_free = False - + # Returns true if there are not errors return error_free @@ -281,23 +293,27 @@ def validate(configuration: dict) -> tuple[Union[dict, None], dict]: # v = jsonschema.Draft201909Validator(argument_schema) try: + validation_errors, validated_json = jsonschema_errorprinter.check_json( configuration, setup_schema) - - no_complex_errors = check_dependencies(validated_json) - if len(validation_errors) == 0 and no_complex_errors: - return validated_json, setup_schema - elif no_complex_errors == False: - print("Failed due to error(s) listed above.", file=sys.stderr) - return None, setup_schema + + if len(validation_errors) == 0: + #check to make sure there were no complex errors + no_complex_errors = check_dependencies(validated_json) + if no_complex_errors: + return validated_json, setup_schema + else: + print("Validation failed due to error(s) listed above.", file=sys.stderr) + return None, setup_schema else: print("[%d] failures detected during validation of the configuration!" % ( len(validation_errors)), file=sys.stderr) for error in validation_errors: print(error, end="\n\n", file=sys.stderr) return None, setup_schema + except Exception as e: - print(str(e), file=sys.stderr) + print("There was an error validation the configuration: [%s]"%(str(e)), file=sys.stderr) return None, setup_schema """ From 914f49d6f7d1a8f3373b546a06ca53c53e056fbd Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 11:59:01 -0800 Subject: [PATCH 077/203] Delete intermediate testing artifacts/container config files in CI. Better job packaging all local apps, not just escu, into the same folder for --mock. --- .../workflows/docker-detection-testing.yml | 17 ++++- .../detection_testing_execution.py | 70 ++++++++++++++----- .../modules/validate_args.py | 8 +-- 3 files changed, 71 insertions(+), 24 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index ef09efb5a4..52b18d4c41 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -253,4 +253,19 @@ jobs: with: name: SummaryTestResults path: | - automated_detection_testing/ci/detection_testing_batch/summary_test_results.json \ No newline at end of file + automated_detection_testing/ci/detection_testing_batch/summary_test_results.json + + - name: Clean up intermediate Files + uses: geekyeggo/delete-artifact@v1 + with: + name: | + container_0_tests.txt.results + container_1_tests.txt.results + container_2_tests.txt.results + container_3_tests.txt.results + container_4_tests.txt.results + container_5_tests.txt.results + container_6_tests.txt.results + container_7_tests.txt.results + container_8_tests.txt.results + container_9_tests.txt.results \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 72ce7f2084..2a25ce999f 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -3,6 +3,7 @@ import copy import csv import json import os +from posixpath import basename import queue import random import secrets @@ -42,6 +43,24 @@ datamodel_file_container_path = os.path.join( MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING = 2 +def copy_local_apps_to_directory(apps: dict[str,dict], target_directory)->None: + for key, item in apps.items(): + source_path = os.path.abspath(os.path.expanduser(item['local_path'])) + base_name = os.path.basename(source_path) + dest_path = os.path.join(target_directory, base_name) + try: + shutil.copy(source_path, dest_path) + item['local_path'] = dest_path + print("Copied %s to apps"%(base_name)) + except shutil.SameFileError as e: + # Same file, not a real error. The copy just doesn't happen + print("err:%s"%(str(e))) + pass + except Exception as e: + print("Error copying ESCU Package [%s] to [%s]: [%s].\n\tQuitting..." % ( + source_path, dest_path, str(e)), file=sys.stderr) + sys.exit(1) + def ensure_security_content(branch: str, pr_number: Union[int, None], persist_security_content: bool) -> GithubService: if persist_security_content is True and os.path.exists("security_content"): @@ -265,7 +284,9 @@ def main(args: list[str]): local_volume_absolute_path = os.path.abspath( os.path.join(os.getcwd(), "apps")) try: - os.mkdir("apps") + #remove the directory first + shutil.rmtree(local_volume_absolute_path,ignore_errors=True) + os.mkdir(local_volume_absolute_path) except FileExistsError as e: # Directory already exists, do nothing pass @@ -277,11 +298,11 @@ def main(args: list[str]): # Check to see if we want to install ESCU and whether it was preeviously generated and we should use that file if 'SPLUNK_ES_CONTENT_UPDATE' in settings['local_apps'] and settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] is not None: # Using a pregenerated ESCU, copy it to apps (unless it) - - file_path = os.path.expanduser(settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path']) - source_path = file_path - dest_path = os.path.join( - local_volume_absolute_path, os.path.basename(file_path)) + pass + #file_path = os.path.expanduser(settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path']) + #source_path = file_path + #dest_path = os.path.join( + # local_volume_absolute_path, os.path.basename(file_path)) elif 'SPLUNK_ES_CONTENT_UPDATE' not in settings['local_apps']: print("%s was not found in %s. We assume this is an error and shut down.\n\t" @@ -290,11 +311,18 @@ def main(args: list[str]): else: # Need to generate that package source_path = generate_escu_app(settings['persist_security_content']) - dest_path = os.path.join( - local_volume_absolute_path, os.path.basename(source_path)) - COPY_ALL_LOCAL_FILES_NOT_JUST_ESCU + settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] = source_path + #dest_path = os.path.join( + # local_volume_absolute_path, os.path.basename(source_path)) + + copy_local_apps_to_directory(settings['local_apps'], local_volume_absolute_path) + + + + + ''' # Now write out the package, whether it was previously generated or # we just generated it try: @@ -311,20 +339,31 @@ def main(args: list[str]): sys.exit(1) print("Wrote ESCU package to volume folder.") + ''' if settings['mock']: def finish_mock(settings: dict, detections: list[str], output_file_template: str = "prior_config/config_tests_%d.json"): num_containers = settings['num_containers'] try: - os.mkdir("prior_config") - except FileExistsError: - pass + #Remove the prior config directory if it exists. If not, continue + shutil.rmtree("prior_config", ignore_errors=True) + + #We want to make the prior_config directory and the prior_config/apps directory + os.makedirs("prior_config/apps") + except FileExistsError as e: + print("Directory priorconfig/apps exists, but we just deleted it!\m\tQuitting...",file=sys.stderr) + sys.exit(1) except Exception as e: print("Some error occured when trying to make the configs folder: [%s]\n\tQuitting..." % ( str(e)), file=sys.stderr) sys.exit(1) + + #Copy the apps to the appropriate local. This will also update + #the app paths in settings['local_apps'] + copy_local_apps_to_directory(settings['local_apps'], "prior_config/apps") + for output_file_index in range(0, num_containers): fname = output_file_template % (output_file_index) @@ -357,13 +396,6 @@ def main(args: list[str]): # We want to persist security content and run with the escu package that we created mock_settings['persist_security_content'] = True - mock_settings['local_apps'] = { - "SPLUNK_ES_CONTENT_UPDATE": { - "app_number": 3449, - "app_version": None, - 'local_path': "prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz"} - } - mock_settings['mock'] = False # Make sure that it still validates after all of the changes diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 92a89471b4..3682607218 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -180,13 +180,13 @@ setup_schema = { "app_number": 833, "app_version": "8.3.1" }, - "SPLUNK_COMMON_INFORMATION_MODEL": { - "app_number": 1621, - "app_version": "4.20.2" - }, "SPLUNK_ADD_ON_FOR_SYSMON": { "app_number": 5709, "app_version": "1.0.1" + }, + "SPLUNK_COMMON_INFORMATION_MODEL": { + "app_number": 1621, + "app_version": "4.20.2" } } }, From dab746bb0c7ebd92b41af4628087382bd8f76cec Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 14:30:54 -0800 Subject: [PATCH 078/203] Save out a json file showing the config, to include the command line arguments with credentials removed, whenever a test is actually run. This makes it trivial to reproduce the test run on another machine or again on the same machine. --- .../detection_testing_execution.py | 23 ++++++++++--------- .../modules/container_manager.py | 2 +- .../modules/github_service.py | 11 +++++---- .../modules/new_arguments2.py | 21 ++++++++++++++++- .../modules/splunk_container.py | 20 ++++++++-------- 5 files changed, 49 insertions(+), 28 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 2a25ce999f..b3ef52ac68 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -48,10 +48,10 @@ def copy_local_apps_to_directory(apps: dict[str,dict], target_directory)->None: source_path = os.path.abspath(os.path.expanduser(item['local_path'])) base_name = os.path.basename(source_path) dest_path = os.path.join(target_directory, base_name) + try: shutil.copy(source_path, dest_path) item['local_path'] = dest_path - print("Copied %s to apps"%(base_name)) except shutil.SameFileError as e: # Same file, not a real error. The copy just doesn't happen print("err:%s"%(str(e))) @@ -153,6 +153,7 @@ def generate_escu_app(persist_security_content: bool = False) -> str: response.raise_for_status() with open(SPLUNK_PACKAGING_TOOLKIT_FILENAME, 'wb') as slim_file: slim_file.write(response.content) + print("Done") except Exception as e: print("Error downloading the Splunk Packaging Toolkit: [%s].\n\tQuitting..." % (str(e)), file=sys.stderr) @@ -186,6 +187,11 @@ def generate_escu_app(persist_security_content: bool = False) -> str: def main(args: list[str]): + try: + docker.client.from_env() + except Exception as e: + print("Error, failed to get docker client. Is Docker Running?\n\t%s"%(str(e))) + requests.packages.urllib3.disable_warnings() start_datetime = datetime.now() @@ -197,8 +203,8 @@ def main(args: list[str]): elif action != "run": print("Unsupported action: [%s]" % (action), file=sys.stderr) sys.exit(1) - - + + ''' parser = argparse.ArgumentParser(description="CI Detection Testing") parser.add_argument("-b", "--branch", type=str, required=True, help="security content branch") @@ -274,13 +280,8 @@ def main(args: list[str]): settings['detections_list'], settings['detections_file']) - -# if len(all_test_files) == 0: -# print("No files were found to be tested. While this could be due to an error, "\ -# "this could be correct if there were no changes to detections. We will "\ -# "exit with success.\n\tQuitting...") -# sys.exit(0) - + + local_volume_absolute_path = os.path.abspath( os.path.join(os.getcwd(), "apps")) try: @@ -444,7 +445,7 @@ def main(args: list[str]): interactive_failure=settings['interactive_failure']) - print(cm.containers[0].environment) + cm.run_test() ''' diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index a7136ea937..4e45a9010d 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -103,7 +103,7 @@ class ContainerManager: self.baseline['TEST_FINISH_TIME'] = str(stop_time) duration = stop_time - self.start_time - self.baseline['TEST_DURATION'] = duration - datetime.timedelta(microseconds=duration.microseconds) + self.baseline['TEST_DURATION'] = str(duration - datetime.timedelta(microseconds=duration.microseconds)) self.synchronization_object.finish(self.baseline) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 5450279021..f1e88a3dae 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -50,6 +50,7 @@ class GithubService: summary_file: str = None) -> list[str]: pruned_tests = [] csvlines = [] + for detection in detections_to_prune: if os.path.basename(detection).startswith("ssa") and exclude_ssa: continue @@ -61,8 +62,8 @@ class GithubService: test_filepath_without_security_content = str( pathlib.Path(*pathlib.Path(test_filepath).parts[1:])) # If no types are provided, then we will get everything - if 'type' in description and (description['type'] in types_to_test or len( types_to_test) == 0): - # print(description['type']) + if 'type' in description and (description['type'] in types_to_test or len(types_to_test) == 0): + if not os.path.exists(test_filepath): print("Detection [%s] references [%s], but it does not exist" % ( detection, test_filepath)) @@ -124,7 +125,7 @@ class GithubService: (detections_list, detections_file), file=sys.stderr) sys.exit(1) elif detections_list is not None: - tests = self.get_selected_test_files(detections_list, folders, types) + tests = self.get_selected_test_files(detections_list, types) elif detections_file is not None: try: with open(detections_file,'r') as f: @@ -156,7 +157,7 @@ class GithubService: "Anomaly", "Hunting", "TTP"], previously_successful_tests: list[str] = []) -> list[str]: - return self.prune_detections(detection_file_list, types_to_test, previously_successful_tests) + return self.prune_detections(detection_file_list, types_to_test, previously_successful_tests) def get_all_tests_and_detections(self, folders: list[str] = [ @@ -170,7 +171,7 @@ class GithubService: os.path.join("security_content/detections", folder), "*.yml")) # Prune this down to only the subset of detections we can test - return self.prune_detections(detections, types_to_test, previously_successful_tests) + return self.prune_detections(detections, types_to_test, previously_successful_tests) def get_all_files_in_folder(self, foldername: str, extension: str) -> list[str]: filenames = glob.glob(os.path.join(foldername, extension)) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index 978fcdafd8..2ec757b9a9 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -1,4 +1,6 @@ import argparse +import copy +import datetime import json from typing import OrderedDict, Union import modules.validate_args as validate_args @@ -86,6 +88,16 @@ def update_config_with_cli_arguments(args_dict:dict)->tuple[str, dict]: print("Failure while processing updated settings from command line.\n\tQuitting...", file=sys.stderr) sys.exit(1) + now = datetime.datetime.now() + configname = now.strftime('%Y-%m-%dT%H:%M:%S.%f%z') + '-test-run.json' + with open(configname,'w') as test_config: + settings_with_creds_stripped = copy.deepcopy(settings) + #strip out credentials + settings_with_creds_stripped['splunkbase_password'] = None + settings_with_creds_stripped['splunkbase_username'] = None + settings_with_creds_stripped['container_password'] = None + validate_args.validate_and_write(settings_with_creds_stripped, test_config) + return ("run", settings) @@ -141,6 +153,13 @@ def parse(args)->tuple[str,dict]: "if downloading packages from Splunkbase. While this can " "be stored in the config file, it is strongly recommended " "to enter it at runtime.") + + run_parser.add_argument('-b', '--branch', required=False, type=str, + help="The branch to run the tests on.") + + run_parser.add_argument('-m', '--mode', required=False, type=str, + help="The mode all, changes, or selected for the testing.") + run_parser.add_argument('-pass', '--splunkbase_password', required=False, type=str, help="Password for login to splunkbase. This is required if " "downloading packages from Splunkbase. While this can be " @@ -158,7 +177,7 @@ def parse(args)->tuple[str,dict]: "file is set to true, it will override the default False for this. True "\ "will override the default value in the config file.") - run_parser.add_argument("-m", "--mock", required=False, + run_parser.add_argument("-mock", "--mock", required=False, action="store_true", help="Split into multiple configs, don't actually run the tests. If the config "\ "file is set to true, it will override the default False for this. True "\ diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 1318eda110..1c9f3ff0f0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -59,7 +59,7 @@ class SplunkContainer: self.management_port = management_port_tuple[1] self.container = self.make_container() - self.thread = threading.Thread(target=self.run_container) + self.thread = threading.Thread(target=self.run_container, ) self.container_start_time = 0 self.test_start_time = 0 @@ -221,7 +221,7 @@ class SplunkContainer: if self.container_start_time == -1: total_time_string = "NOT STARTED" else: - total_time_rounded = datetime.timedelta( + total_time_rounded = datetime.timedelta( seconds = round(current_time - self.container_start_time)) total_time_string = str(total_time_rounded) @@ -229,7 +229,7 @@ class SplunkContainer: if self.test_start_time == -1 or self.container_start_time == -1: setup_time_string = "NOT SET UP" else: - setup_secounds_rounded = datetime.timedelta( + setup_secounds_rounded = datetime.timedelta(seconds = round(self.test_start_time - self.container_start_time)) setup_time_string = str(setup_secounds_rounded) @@ -237,7 +237,7 @@ class SplunkContainer: if self.test_start_time == -1 or self.num_tests_completed == 0: testing_time_string = "NO TESTS COMPLETED" else: - testing_seconds_rounded = datetime.timedelta( + testing_seconds_rounded = datetime.timedelta( seconds = round(current_time - self.test_start_time)) # Get the approximate time per test. This is a clunky way to get rid of decimal @@ -246,13 +246,13 @@ class SplunkContainer: timedelta_per_test_rounded = timedelta_per_test - \ datetime.timedelta( microseconds=timedelta_per_test.microseconds) + + testing_time_string = "%s per test (%d tests)"%(timedelta_per_test_rounded, self.num_tests_completed) - testing_time_string = "%s per test (%d tests)"%(timedelta_per_test_rounded, str(testing_seconds_rounded)) - - summary_str = "[%s] Summary\n\t"\ - "Total Time :"\ - "Container Start Time:"\ - "Test Execution Time :" %(total_time_string, setup_time_string, testing_time_string) + summary_str = "Summary\n\t"\ + "Total Time : [%s]\n\t"\ + "Container Start Time: [%s]\n\t"\ + "Test Execution Time : [%s]" %(total_time_string, setup_time_string, testing_time_string) return summary_str From fab525a6821a51f8d841dd37f9cce139055c422d Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 14:48:37 -0800 Subject: [PATCH 079/203] Added support for more command line arguments for number containers and mode and branch. --- .../ci/detection_testing_batch/modules/new_arguments2.py | 4 ++++ .../ci/detection_testing_batch/modules/validate_args.py | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index 2ec757b9a9..fa8a8ead97 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -183,6 +183,10 @@ def parse(args)->tuple[str,dict]: "file is set to true, it will override the default False for this. True "\ "will override the default value in the config file.") + run_parser.add_argument("-n", "--num_containers", required=False, type=int, + help="The number of Splunk containers to run or mock") + + args = parser.parse_args() diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 3682607218..625fed0390 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -69,11 +69,6 @@ setup_schema = { "app_number": 3449, "app_version": None, 'local_path': None - }, - "BETA_SPLUNK_ADD_ON_FOR_SYSMON": { - "app_number": 5709, - "app_version": None, - "local_path": "~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" } } }, From 1015abc30aec3060b8737988c423c14b6f4ffb8d Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 15:10:28 -0800 Subject: [PATCH 080/203] Finally ready to try the full integration test after modifying the docker-detection-testing.yml with new names, paths, and arguments. Fingers crossed... --- .../workflows/docker-detection-testing.yml | 95 +++++++++---------- .../modules/new_arguments2.py | 20 +++- 2 files changed, 64 insertions(+), 51 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 52b18d4c41..1ccff1eaa7 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -76,43 +76,41 @@ jobs: run: | cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - #python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 - python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n10 -split - echo "DONE!" + + python3 detection_testing_execution.py run --branch RegistryDetectionFixes --mode selected --num_containers 10 --mock - name: Upload Test Results Files uses: actions/upload-artifact@v2 with: name: testing-results-config path: | - automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz - automated_detection_testing/ci/detection_testing_batch/container_0_tests.txt - automated_detection_testing/ci/detection_testing_batch/container_1_tests.txt - automated_detection_testing/ci/detection_testing_batch/container_2_tests.txt - automated_detection_testing/ci/detection_testing_batch/container_3_tests.txt - automated_detection_testing/ci/detection_testing_batch/container_4_tests.txt - automated_detection_testing/ci/detection_testing_batch/container_5_tests.txt - automated_detection_testing/ci/detection_testing_batch/container_6_tests.txt - automated_detection_testing/ci/detection_testing_batch/container_7_tests.txt - automated_detection_testing/ci/detection_testing_batch/container_8_tests.txt - automated_detection_testing/ci/detection_testing_batch/container_9_tests.txt - + automated_detection_testing/ci/detection_testing_batch/prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_0.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_1.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_2.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_3.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_4.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_5.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_6.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_7.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_8.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_9.json docker-detection-testing-execution: runs-on: ubuntu-latest needs: [validate-tag-if-present, quit-for-dependabot, docker-detection-testing-setup] strategy: matrix: - test_filename: ["container_0_tests.txt", - "container_1_tests.txt", - "container_2_tests.txt", - "container_3_tests.txt", - "container_4_tests.txt", - "container_5_tests.txt", - "container_6_tests.txt", - "container_7_tests.txt", - "container_8_tests.txt", - "container_9_tests.txt"] + manifest_filename: ["config_tests_0.json", + "config_tests_1.json", + "config_tests_2.json", + "config_tests_3.json", + "config_tests_4.json", + "config_tests_5.json", + "config_tests_6.json", + "config_tests_7.json", + "config_tests_8.json", + "config_tests_9.json"] steps: - name: Get branch and PR required for detection testing main.py id: vars @@ -155,14 +153,14 @@ jobs: run: | cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - #python3 detection_testing_execution.py -b ${{ steps.vars.outputs.branch }} -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m new -n2 - python3 detection_testing_execution.py -b RegistryDetectionFixes -u 123456789 --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} -m selected -tff prior_config/${{ matrix.test_filename}} -n1 -e prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz + + python3 detection_testing_execution.py run -c prior_config/${{ matrix.manifest_filename}} --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} - name: Upload Test Results Files uses: actions/upload-artifact@v2 with: - name: ${{ matrix.test_filename}}.results + name: ${{ matrix.manifest_filename}}.results path: | automated_detection_testing/ci/detection_testing_batch/success.csv automated_detection_testing/ci/detection_testing_batch/error.csv @@ -189,52 +187,52 @@ jobs: - name: Download artifacts uses: actions/download-artifact@v2 with: - name: container_0_tests.txt.results + name: config_tests_0.json.results path: automated_detection_testing/ci/detection_testing_batch/results_0 - name: Download artifacts uses: actions/download-artifact@v2 with: - name: container_1_tests.txt.results + name: config_tests_1.json.results path: automated_detection_testing/ci/detection_testing_batch/results_1 - name: Download artifacts uses: actions/download-artifact@v2 with: - name: container_2_tests.txt.results + name: config_tests_2.json.results path: automated_detection_testing/ci/detection_testing_batch/results_2 - name: Download artifacts uses: actions/download-artifact@v2 with: - name: container_3_tests.txt.results + name: config_tests_3.json.txt.results path: automated_detection_testing/ci/detection_testing_batch/results_3 - name: Download artifacts uses: actions/download-artifact@v2 with: - name: container_4_tests.txt.results + name: config_tests_4.json.results path: automated_detection_testing/ci/detection_testing_batch/results_4 - name: Download artifacts uses: actions/download-artifact@v2 with: - name: container_5_tests.txt.results + name: config_tests_5.json.results path: automated_detection_testing/ci/detection_testing_batch/results_5 - name: Download artifacts uses: actions/download-artifact@v2 with: - name: container_6_tests.txt.results + name: config_tests_6.json.results path: automated_detection_testing/ci/detection_testing_batch/results_6 - name: Download artifacts uses: actions/download-artifact@v2 with: - name: container_7_tests.txt.results + name: config_tests_7.json.results path: automated_detection_testing/ci/detection_testing_batch/results_7 - name: Download artifacts uses: actions/download-artifact@v2 with: - name: container_8_tests.txt.results + name: config_tests_8.json.results path: automated_detection_testing/ci/detection_testing_batch/results_8 - name: Download artifacts uses: actions/download-artifact@v2 with: - name: container_9_tests.txt.results + name: config_tests_9.json.results path: automated_detection_testing/ci/detection_testing_batch/results_9 - uses: actions/setup-python@v2 @@ -259,13 +257,14 @@ jobs: uses: geekyeggo/delete-artifact@v1 with: name: | - container_0_tests.txt.results - container_1_tests.txt.results - container_2_tests.txt.results - container_3_tests.txt.results - container_4_tests.txt.results - container_5_tests.txt.results - container_6_tests.txt.results - container_7_tests.txt.results - container_8_tests.txt.results - container_9_tests.txt.results \ No newline at end of file + config_tests_0.json.results + config_tests_1.json.results + config_tests_2.json.results + config_tests_3.json.results + config_tests_4.json.results + config_tests_5.json.results + config_tests_6.json.results + config_tests_7.json.results + config_tests_8.json.results + config_tests_9.json.results + \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index fa8a8ead97..409bc56ad5 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -3,7 +3,8 @@ import copy import datetime import json from typing import OrderedDict, Union -import modules.validate_args as validate_args +#import modules.validate_args as validate_args +from modules import validate_args import sys DEFAULT_CONFIG_FILE = "test_config.json" @@ -120,6 +121,14 @@ def parse(args)->tuple[str,dict]: sys.exit(1) ''' + import os + #if there is no default config file, then generate one + if not os.path.exists(DEFAULT_CONFIG_FILE): + print("No default configuration file [%s] found. Creating one..."%(DEFAULT_CONFIG_FILE)) + with open(DEFAULT_CONFIG_FILE,'w') as cfg: + validate_args.validate_and_write({},cfg) + + parser = argparse.ArgumentParser( description="Use 'SOME_PROGRAM_NAME_STRING --help' to get help with the arguments") parser.set_defaults(func=lambda _: parser.print_help()) @@ -186,8 +195,13 @@ def parse(args)->tuple[str,dict]: run_parser.add_argument("-n", "--num_containers", required=False, type=int, help="The number of Splunk containers to run or mock") - - args = parser.parse_args() + try: + args = parser.parse_args() + except Exception as e: + print(str(e)) + print(dir(e)) + print("doot") + sys.exit(1) # Run the appropriate parser From b0e7c33c4d3592d56ed82356d7c2ba63c4c1ce7d Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 15:14:49 -0800 Subject: [PATCH 081/203] Changing mode for CI PR test from selected to changes. --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 1ccff1eaa7..39093040a1 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -77,7 +77,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch RegistryDetectionFixes --mode selected --num_containers 10 --mock + python3 detection_testing_execution.py run --branch RegistryDetectionFixes --num_containers 10 --mock - name: Upload Test Results Files uses: actions/upload-artifact@v2 From 451d2500db598f09d207537a07defe52f8824f92 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 15:22:11 -0800 Subject: [PATCH 082/203] Fixed overwriting mode with null if nothing is passed on the command line. --- .../modules/new_arguments2.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index 409bc56ad5..b71dae52ac 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -195,13 +195,9 @@ def parse(args)->tuple[str,dict]: run_parser.add_argument("-n", "--num_containers", required=False, type=int, help="The number of Splunk containers to run or mock") - try: - args = parser.parse_args() - except Exception as e: - print(str(e)) - print(dir(e)) - print("doot") - sys.exit(1) + + args = parser.parse_args() + # Run the appropriate parser @@ -210,7 +206,7 @@ def parse(args)->tuple[str,dict]: #file value with None - keep the config file value keys = list(args.__dict__.keys()) for key in keys: - if args.__dict__[key] is None and key in ["show_pass", "mock"]: + if args.__dict__[key] is None and key in ["show_pass", "mock", "mode"]: del args.__dict__[key] action, settings = args.func(args) From 1afbaa3a1d8531a98e8b777daa9d2a483626e656 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 15:35:05 -0800 Subject: [PATCH 083/203] Fixed bad value substitution into the schema coming from command line arguments. --- .../ci/detection_testing_batch/modules/new_arguments2.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index b71dae52ac..ab125b4b67 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -202,11 +202,13 @@ def parse(args)->tuple[str,dict]: # Run the appropriate parser try: - #If an argument is not passed on the command line, don't overwrite its config + #If one of these arguments is not passed on the command line, don't overwrite its config #file value with None - keep the config file value keys = list(args.__dict__.keys()) for key in keys: - if args.__dict__[key] is None and key in ["show_pass", "mock", "mode"]: + if args.__dict__[key] is None and key in ["splunkbase_username","branch","mode", + "splunkbase_password","splunk_app_password", + "mock","num_containers"]: del args.__dict__[key] action, settings = args.func(args) From 1a39321be6fbfc59a974747fedcca5875d7190c4 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 15:54:12 -0800 Subject: [PATCH 084/203] Small typo in artifact filename. --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 39093040a1..ebc2e5a817 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -202,7 +202,7 @@ jobs: - name: Download artifacts uses: actions/download-artifact@v2 with: - name: config_tests_3.json.txt.results + name: config_tests_3.json.results path: automated_detection_testing/ci/detection_testing_batch/results_3 - name: Download artifacts uses: actions/download-artifact@v2 From ae7fb140856e7d9afea755af4cb09f12a04304b1 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 16:38:22 -0800 Subject: [PATCH 085/203] Updated summarize_json.py to provide a total success/failure field and also return a nonzero return code if at least one test fails. --- .../detection_testing_batch/summarize_json.py | 54 +++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index 102252495a..6cc49684bc 100644 --- a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -6,11 +6,47 @@ import json def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict)->bool: success = True try: + test_count = len(data) + #Passed + pass_count = len([x for x in data if x['success'] == True]) + + #A failure or an error + fail_only_count = len([x for x in data if x['success'] == False]) + + #An error (every error is also a failure) + fail_and_error_count = len([x for x in data if x['error'] == True]) + + #A failure without an error + fail_without_error_count = len([x for x in data if x['success'] == False and x['error'] == False]) + + #This number should always be zero... + error_and_success_count = len([x for x in data if x['success'] == True and x['error'] == True]) + if error_and_success_count > 0: + print("Error - a test was successful, but also included an error. This should be impossible.",file=sys.stderr) + success = False + + if test_count != (pass_count + fail_only_count): + print("Error - the total tests [%d] does not equal the pass[%d]/fails[%d]"%(test_count, pass_count,fail_only_count)) + success=False + + if fail_only_count > 0: + result = "FAIL for %d detections"%(fail_only_count) + success = False + else: + result = "PASS for all %d detections"%(pass_count) + + summary={"TOTAL_TESTS": test_count, "TESTS_PASSED": pass_count, + "TOTAL_FAILURES": fail_only_count, "FAIL_ONLY": fail_without_error_count, + "FAIL_AND_ERROR":fail_and_error_count } + with open(output_filename, "w") as jsonFile: - json.dump({'baseline': baseline, 'results':data}, jsonFile, indent=" ") + json.dump({'summary':summary, 'baseline': baseline, 'results':data}, jsonFile, indent=" ") except Exception as e: - print("There was an error generating [%s]: [%s]"%(output_filename, str(e))) - success = False + print("There was an error generating [%s]: [%s]"%(output_filename, str(e)),file=sys.stderr) + raise(e) + #success = False + #return success, False + return success @@ -38,8 +74,16 @@ try: else: all_data['results'] = data['results'] - outputResultsJSON(args.output_filename, all_data['results'], all_data['baseline']) - print("Successfully summarized [%d] detections!"%(len(all_data['results']))) + test_pass = outputResultsJSON(args.output_filename, all_data['results'], all_data['baseline']) + print("Successfully summarized [%d] detections"%(len(all_data['results']))) + if not test_pass: + print("Result: FAIL") + sys.exit(1) + else: + print("Result: PASS!") + sys.exit(0) + + except Exception as e: print("Error writing the summary file: [%s].\n\tQuitting..."%(str(e))) sys.exit(1) From a302d952b41642b11d440753b138a2a8903ea7f4 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 17:12:25 -0800 Subject: [PATCH 086/203] tiny ci change to test everything overnight --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index ebc2e5a817..0370c36f34 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -77,7 +77,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch RegistryDetectionFixes --num_containers 10 --mock + python3 detection_testing_execution.py run --branch develop --mode all --num_containers 10 --mock - name: Upload Test Results Files uses: actions/upload-artifact@v2 From 6b292ba2c1a8d9432c40c34d62f5949e0b2ae0af Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 23 Nov 2021 17:13:44 -0800 Subject: [PATCH 087/203] upload artifacts even if summarize fails. --- .github/workflows/docker-detection-testing.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 0370c36f34..e704469387 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -248,6 +248,7 @@ jobs: - name: Upload Summary Test Results JSON uses: actions/upload-artifact@v2 + if: always() with: name: SummaryTestResults path: | @@ -255,6 +256,7 @@ jobs: - name: Clean up intermediate Files uses: geekyeggo/delete-artifact@v1 + if: always() with: name: | config_tests_0.json.results From 3cd3ca6692df66bf68e39a5cc561730a0dc1cb3f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 09:54:27 -0800 Subject: [PATCH 088/203] Another CI change to list directory structure during summarize step. --- .github/workflows/docker-detection-testing.yml | 3 ++- .../ci/detection_testing_batch/summarize_json.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index e704469387..6a8a5b929e 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -77,7 +77,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch develop --mode all --num_containers 10 --mock + python3 detection_testing_execution.py run --branch develop --mode changes --num_containers 10 --mock - name: Upload Test Results Files uses: actions/upload-artifact@v2 @@ -243,6 +243,7 @@ jobs: - name: Merge Detections into single File run: | cd automated_detection_testing/ci/detection_testing_batch + ls -lah python summarize_json.py --files results_*/combined.json --output_filename summary_test_results.json diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index 6cc49684bc..38ddb61a16 100644 --- a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -40,7 +40,7 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict "FAIL_AND_ERROR":fail_and_error_count } with open(output_filename, "w") as jsonFile: - json.dump({'summary':summary, 'baseline': baseline, 'results':data}, jsonFile, indent=" ") + json.dump({'summary':summary, 'baseline': baseline, 'results':data}, jsonFile, indent=" ") except Exception as e: print("There was an error generating [%s]: [%s]"%(output_filename, str(e)),file=sys.stderr) raise(e) From 5012b0f76647623b4f8c7eceda04004b8e313938 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 10:10:27 -0800 Subject: [PATCH 089/203] Another run to check and see if the summarization works and confirm the directory structure of the artifacts. --- .github/workflows/docker-detection-testing.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 6a8a5b929e..fa47136773 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -243,8 +243,8 @@ jobs: - name: Merge Detections into single File run: | cd automated_detection_testing/ci/detection_testing_batch - ls -lah - python summarize_json.py --files results_*/combined.json --output_filename summary_test_results.json + ls -lahR results_* + python summarize_json.py --files results_*/*/combined.json --output_filename summary_test_results.json - name: Upload Summary Test Results JSON From 54a34608feeabdbb873f8462cb912f2108a64ee1 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 10:36:33 -0800 Subject: [PATCH 090/203] Fixed results paths once more for summary. --- .github/workflows/docker-detection-testing.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index fa47136773..edcb1e588a 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -243,8 +243,7 @@ jobs: - name: Merge Detections into single File run: | cd automated_detection_testing/ci/detection_testing_batch - ls -lahR results_* - python summarize_json.py --files results_*/*/combined.json --output_filename summary_test_results.json + python summarize_json.py --files results_*/combined.json --output_filename summary_test_results.json - name: Upload Summary Test Results JSON From ccc29005fa7ad13c3023df62bf7c8ff33c3596d7 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 11:12:19 -0800 Subject: [PATCH 091/203] Still diagnosing path issues for summarize. --- .github/workflows/docker-detection-testing.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index edcb1e588a..0c75b7d2ec 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -243,6 +243,13 @@ jobs: - name: Merge Detections into single File run: | cd automated_detection_testing/ci/detection_testing_batch + echo "res0" + ls + echo "res1" + ls + echo "res2" + ls results_* + python summarize_json.py --files results_*/combined.json --output_filename summary_test_results.json From f32f1bed2a55ea6fb8a31baf06a6dbc16d08ef44 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 11:45:52 -0800 Subject: [PATCH 092/203] More verbose debug messages in summarize_json. --- .github/workflows/docker-detection-testing.yml | 7 ------- .../ci/detection_testing_batch/summarize_json.py | 3 +++ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 0c75b7d2ec..edcb1e588a 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -243,13 +243,6 @@ jobs: - name: Merge Detections into single File run: | cd automated_detection_testing/ci/detection_testing_batch - echo "res0" - ls - echo "res1" - ls - echo "res2" - ls results_* - python summarize_json.py --files results_*/combined.json --output_filename summary_test_results.json diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index 38ddb61a16..f648d444f5 100644 --- a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -58,11 +58,14 @@ args = parser.parse_args() all_data = OrderedDict() try: + print("We will summarize the files: %s"%(str(args.files))) for f in args.files: if not f.name.endswith('.json'): print("Error: passed in file must end in .json - you passed in [%s].\n\tQuitting..."%(f.name)) sys.exit(1) data = json.loads(f.read()) + print(f.name) + print(data) if 'baseline' in all_data: #everything has the same baseline, only need to do it once pass From 4f6be1058119b5e60fe8623f7211856b68d2eeef Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 12:00:02 -0800 Subject: [PATCH 093/203] Testing with the proper mode for a specific branch. --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index edcb1e588a..4cbcad53da 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -77,7 +77,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch develop --mode changes --num_containers 10 --mock + python3 detection_testing_execution.py run --branch RegistryDetectionFixes --mode changes --num_containers 10 --mock - name: Upload Test Results Files uses: actions/upload-artifact@v2 From 88977a9fb8e37f7682f9395acd4015e207e93859 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 13:58:32 -0800 Subject: [PATCH 094/203] Changes to template and summary to support passing a commit_hash parameter, not just a branch parameter, so that even old tests can be replicated. --- .../workflows/docker-detection-testing.yml | 9 + .../detection_testing_execution.py | 438 ++++-------------- .../modules/container_manager.py | 4 + .../modules/github_service.py | 27 +- .../modules/new_arguments2.py | 24 +- .../modules/validate_args.py | 80 +--- .../detection_testing_batch/summarize_json.py | 19 +- 7 files changed, 174 insertions(+), 427 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 4cbcad53da..9473fdd9bb 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -253,6 +253,15 @@ jobs: name: SummaryTestResults path: | automated_detection_testing/ci/detection_testing_batch/summary_test_results.json + + - name: Upload Failures Manifest on Failure + uses: actions/upload-artifact@v2 + if: failure() + with: + name: DetectionFailureManifest + path: | + automated_detection_testing/ci/detection_testing_batch/detection_failure_manifest.json + - name: Clean up intermediate Files uses: geekyeggo/delete-artifact@v1 diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index b3ef52ac68..fc3529e564 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -23,6 +23,7 @@ import docker import requests.packages.urllib3 from docker.client import DockerClient from requests import get +from modules import new_arguments2 from modules.validate_args import validate_and_write from modules import container_manager @@ -62,13 +63,13 @@ def copy_local_apps_to_directory(apps: dict[str,dict], target_directory)->None: sys.exit(1) -def ensure_security_content(branch: str, pr_number: Union[int, None], persist_security_content: bool) -> GithubService: +def ensure_security_content(branch: str, commit_hash:str, pr_number: Union[int, None], persist_security_content: bool) -> GithubService: if persist_security_content is True and os.path.exists("security_content"): print("****** You chose --persist_security_content and the security_content directory exists. " "We will not check out the repo again. Please be aware, this could cause issues if you're " "out of date. ******") github_service = GithubService( - branch, existing_directory=persist_security_content) + branch, commit_hash, existing_directory=persist_security_content) else: if persist_security_content is True and not os.path.exists("security_content"): @@ -86,9 +87,9 @@ def ensure_security_content(branch: str, pr_number: Union[int, None], persist_se sys.exit(1) if pr_number: - github_service = GithubService(branch, pr_number) + github_service = GithubService(branch, commit_hash, pr_number) else: - github_service = GithubService(branch) + github_service = GithubService(branch, commit_hash) return github_service @@ -185,6 +186,80 @@ def generate_escu_app(persist_security_content: bool = False) -> str: return output_file_path_from_root +def finish_mock(settings: dict, detections: list[str], output_file_template: str = "prior_config/config_tests_%d.json"): + num_containers = settings['num_containers'] + + try: + #Remove the prior config directory if it exists. If not, continue + shutil.rmtree("prior_config", ignore_errors=True) + + #We want to make the prior_config directory and the prior_config/apps directory + os.makedirs("prior_config/apps") + except FileExistsError as e: + print("Directory priorconfig/apps exists, but we just deleted it!\m\tQuitting...",file=sys.stderr) + sys.exit(1) + except Exception as e: + print("Some error occured when trying to make the configs folder: [%s]\n\tQuitting..." % ( + str(e)), file=sys.stderr) + sys.exit(1) + + + #Copy the apps to the appropriate local. This will also update + #the app paths in settings['local_apps'] + copy_local_apps_to_directory(settings['local_apps'], "prior_config/apps") + + for output_file_index in range(0, num_containers): + fname = output_file_template % (output_file_index) + + # Get the n'th detection for this file + detection_tests = detections[output_file_index::num_containers] + normalized_detection_names = [] + # Normalize the test filename to the name of the detection instead. + # These are what we should write to the file + for d in detection_tests: + filename = os.path.basename(d) + filename = filename.replace(".test.yml", ".yml") + leading = os.path.split(d)[0] + leading = leading.replace("tests/", "detections/") + new_name = os.path.join( + "security_content", leading, filename) + normalized_detection_names.append(new_name) + + # Generate an appropriate config file for this test + mock_settings = copy.deepcopy(settings) + # This may be able to support as many as 2 for GitHub Actions... + # we will have to determine in testing. + mock_settings['num_containers'] = 1 + + # Must be selected since we are passing in a list of detections + mock_settings['mode'] = 'selected' + + # Pass in the list of detections to run + mock_settings['detections_list'] = normalized_detection_names + + # We want to persist security content and run with the escu package that we created + mock_settings['persist_security_content'] = True + + mock_settings['mock'] = False + + # Make sure that it still validates after all of the changes + + try: + with open(fname, 'w') as cfg: + validated_settings, b = validate_and_write( + mock_settings, cfg) + if validated_settings is None: + print( + "There was an error validating the updated mock settings.\n\tQuitting...", file=sys.stderr) + sys.exit(1) + + except Exception as e: + print("Error writing config file %s: [%s]\n\tQuitting..." % ( + fname, str(e)), file=sys.stderr) + sys.exit(1) + + sys.exit(0) + def main(args: list[str]): try: @@ -204,64 +279,6 @@ def main(args: list[str]): print("Unsupported action: [%s]" % (action), file=sys.stderr) sys.exit(1) - - ''' - parser = argparse.ArgumentParser(description="CI Detection Testing") - parser.add_argument("-b", "--branch", type=str, required=True, help="security content branch") - parser.add_argument("-u", "--uuid", type=str, required=True, help="uuid for detection test") - parser.add_argument("-pr", "--pr-number", type=int, required=False, help="Pull Request Number") - - parser.add_argument("-n", "--num_containers", required=False, type=int, default=1, help="The number of splunk docker containers to start and run for testing") - - parser.add_argument("-cw", "--container_password", required=False, help="A password to use for the container. If you don't choose one, a complex one will be generated for you.") - parser.add_argument("-show", "--show_password", required=False, default=False, action='store_true', help="Show the generated password to use to login to splunk. For a CI/CD run, you probably don't want this.") - parser.add_argument("-i", "--interactive_failure", required=False, default=False, action='store_true', help="If a test fails, should we pause before removing data so that the search can be debugged?") - - parser.add_argument("-ri", "--reuse_image", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") - - #Allowing us to reuse containers is more trouble than it's worth (we may have rebuilt an app or, more likely, ESCU) and it is a pain to re-upload that - #instead of having the container restart and download/install itself. - #parser.add_argument("-rc", "--reuse_containers", required=False, default=False, help="Should existing containers be re-used, or should they be rebuilt?") - - parser.add_argument("-s", "--success_file", type=str, required=False, help="File that contains previously successful runs that we don't need to test") - parser.add_argument("-user", "--splunkbase_username", type=str, required=False, help="Splunkbase username for downloading Splunkbase apps") - parser.add_argument("-pw", "--splunkbase_password", type=str, required=False, help="Splunkbase password for downloading Splunkbase apps") - parser.add_argument("-m", "--mode", type=str, choices=DETECTION_MODES, required=False, help="Whether to test new detections, specific detections, or all detections", default="new") - parser.add_argument("-tfl","--test_files_list", type=str, required=False, help="The names of files that you want to test, separated by commas.") - parser.add_argument("-tff","--test_files_file", type=argparse.FileType('r'), required=False, help="A file containing a list of detections to run, one per line") - parser.add_argument("-e","--escu_package", type=argparse.FileType('rb'), required=False, help="The ESCU file to use - will not generate a new ESCU package") - - parser.add_argument("-t", "--types", type=str, required=False, help="Detection types to test. Can be one of more of %s"%(str(DETECTION_TYPES)), default=','.join(DETECTION_TYPES)) - parser.add_argument("-ct", "--container_tag", type=str, required=False, help="The tag of the Splunk Container to use. Tags are located at https://hub.docker.com/r/splunk/splunk/tags",default=DEFAULT_CONTAINER_TAG) - parser.add_argument("-p", "--persist_security_content", required=False, default=False, action="store_true", help="Assumes security_content directory already exists. Don't check it out and overwrite it again. Saves "\ - "time and allows you to test a detection that you've updated. Runs generate again in case you have "\ - "updated macros or anything else. Especially useful for quick, local, iterative testing.") - - - parser.add_argument("-split","--split_detections_then_stop", required=False, default=False, action='store_true', help="Should existing images be re-used, or should they be redownloaded?") - - - - - args = parser.parse_args() - ''' - ''' - branch = args.branch - uuid_test = args.uuid - pr_number = args.pr_number - num_containers = args.num_containers - #reuse_containers = args.reuse_containers - reuse_image = args.reuse_image - success_file = args.success_file - splunkbase_username = args.splunkbase_username - splunkbase_password = args.splunkbase_password - full_docker_hub_container_name = "splunk/splunk:%s"%args.container_tag - #full_docker_hub_container_name = "customimage" - interactive_failure = args.interactive_failure - show_password = args.show_password - splunk_password = args.container_password - pregenerated_escu_package = args.escu_package - ''' FULL_DOCKER_HUB_CONTAINER_NAME = "splunk/splunk:%s" % settings['container_tag'] @@ -272,7 +289,13 @@ def main(args: list[str]): # Check out security content if required github_service = ensure_security_content( - settings['branch'], settings['pr_number'], settings['persist_security_content']) + settings['branch'], settings['commit_hash'], settings['pr_number'], settings['persist_security_content']) + settings['commit_hash'] = github_service.commit_hash + + #Make a backup of this config containing the hash and stripped credentials. + #This makes the test perfectly reproducible. + validate_args.validate_and_write(settings,output_file=None,strip_credentials=True) + all_test_files = github_service.get_test_files(settings['mode'], settings['folders'], @@ -321,101 +344,7 @@ def main(args: list[str]): copy_local_apps_to_directory(settings['local_apps'], local_volume_absolute_path) - - - ''' - # Now write out the package, whether it was previously generated or - # we just generated it - try: - shutil.copy(source_path, dest_path) - #Update apps path for the ESCU package we just built - settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] = dest_path - - except shutil.SameFileError as e: - # Same file, not a real error. The copy just doesn't happen - pass - except Exception as e: - print("Error copying ESCU Package [%s] to [%s]: [%s].\n\tQuitting..." % ( - source_path, dest_path, str(e)), file=sys.stderr) - sys.exit(1) - - print("Wrote ESCU package to volume folder.") - ''' - if settings['mock']: - def finish_mock(settings: dict, detections: list[str], output_file_template: str = "prior_config/config_tests_%d.json"): - num_containers = settings['num_containers'] - - try: - #Remove the prior config directory if it exists. If not, continue - shutil.rmtree("prior_config", ignore_errors=True) - - #We want to make the prior_config directory and the prior_config/apps directory - os.makedirs("prior_config/apps") - except FileExistsError as e: - print("Directory priorconfig/apps exists, but we just deleted it!\m\tQuitting...",file=sys.stderr) - sys.exit(1) - except Exception as e: - print("Some error occured when trying to make the configs folder: [%s]\n\tQuitting..." % ( - str(e)), file=sys.stderr) - sys.exit(1) - - - #Copy the apps to the appropriate local. This will also update - #the app paths in settings['local_apps'] - copy_local_apps_to_directory(settings['local_apps'], "prior_config/apps") - - for output_file_index in range(0, num_containers): - fname = output_file_template % (output_file_index) - - # Get the n'th detection for this file - detection_tests = detections[output_file_index::num_containers] - normalized_detection_names = [] - # Normalize the test filename to the name of the detection instead. - # These are what we should write to the file - for d in detection_tests: - filename = os.path.basename(d) - filename = filename.replace(".test.yml", ".yml") - leading = os.path.split(d)[0] - leading = leading.replace("tests/", "detections/") - new_name = os.path.join( - "security_content", leading, filename) - normalized_detection_names.append(new_name) - - # Generate an appropriate config file for this test - mock_settings = copy.deepcopy(settings) - # This may be able to support as many as 2 for GitHub Actions... - # we will have to determine in testing. - mock_settings['num_containers'] = 1 - - # Must be selected since we are passing in a list of detections - mock_settings['mode'] = 'selected' - - # Pass in the list of detections to run - mock_settings['detections_list'] = normalized_detection_names - - # We want to persist security content and run with the escu package that we created - mock_settings['persist_security_content'] = True - - mock_settings['mock'] = False - - # Make sure that it still validates after all of the changes - - try: - with open(fname, 'w') as cfg: - validated_settings, b = validate_and_write( - mock_settings, cfg) - if validated_settings is None: - print( - "There was an error validating the updated mock settings.\n\tQuitting...", file=sys.stderr) - sys.exit(1) - - except Exception as e: - print("Error writing config file %s: [%s]\n\tQuitting..." % ( - fname, str(e)), file=sys.stderr) - sys.exit(1) - - sys.exit(0) finish_mock(settings, all_test_files) files_to_copy_to_container = OrderedDict() @@ -433,6 +362,8 @@ def main(args: list[str]): settings['num_containers'], settings['local_apps'], settings['splunkbase_apps'], + settings['branch'], + settings['commit_hash'], files_to_copy_to_container=files_to_copy_to_container, web_port_start=8000, management_port_start=8089, @@ -444,201 +375,8 @@ def main(args: list[str]): reuse_image=settings['reuse_image'], interactive_failure=settings['interactive_failure']) - cm.run_test() - ''' - if args.split_detections_then_stop: - for output_file_index in range(0, num_containers): - fname = "container_%d_tests.txt" % (output_file_index) - print("Writing tests to [%s]..." % (fname), end='') - with open(fname, "w") as output_file: - detection_tests = test_files[output_file_index::num_containers] - normalized_detection_names = [] - for d in detection_tests: - filename = os.path.basename(d) - filename = filename.replace(".test.yml", ".yml") - leading = os.path.split(d)[0] - leading = leading.replace("tests/", "detections/") - new_name = os.path.join( - "security_content", leading, filename) - normalized_detection_names.append(new_name) - output_file.write('\n'.join(normalized_detection_names)) - print("Done") - sys.exit(0) - - # Create threads to manage all of the containers that we will start up - splunk_container_manager_threads = [] - - results_tracker = SynchronizedResultsTracker(test_files, num_containers) - - #SPLUNK_ADD_ON_FOR_SYSMON_OLD = "https://splunkbase.splunk.com/app/1914/release/10.6.2/download" - #SPLUNK_ADD_ON_FOR_SYSMON_NEW = "https://splunkbase.splunk.com/app/5709/release/1.0.1/download" - #SYSMON_APP_FOR_SPLUNK = "https://splunkbase.splunk.com/app/3544/release/2.0.0/download" - #SPLUNK_ES_CONTENT_UPDATE = "https://splunkbase.splunk.com/app/3449/release/3.29.0/download" - - # Just a hack until we get the new version of system deployed and available from splunkbase - CONTAINER_VOLUME_PATH = '/tmp/apps/' - - GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH = os.path.join( - CONTAINER_VOLUME_PATH, "DA-ESS-ContentUpdate-latest.tar.gz") - - SPLUNKBASE_URL = "https://splunkbase.splunk.com/app/%d/release/%s/download" - # Order that we install the apps is actually important - APPS_DICT = OrderedDict() - APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_WINDOWS'] = { - "app_number": 742, 'app_version': "8.2.0", 'location': 'splunkbase'} - APPS_DICT['SPLUNK_SECURITY_ESSENTIALS'] = { - "app_number": 3435, 'app_version': "3.3.4", 'location': 'splunkbase'} - APPS_DICT['GENERATED_SPLUNK_ES_CONTENT_UPDATE'] = {"app_number": 3449, 'app_version': "Generated at %s" % ( - datetime.now()), 'location': GENERATED_SPLUNK_ES_CONTENT_UPDATE_CONTAINER_PATH} - - try: - BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH = os.path.expanduser( - "~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl") - shutil.copyfile(BETA_SPLUNK_ADD_ON_FOR_SYSMON_PATH, os.path.join( - local_volume_path, "Splunk_TA_microsoft_sysmon-1.0.2-B1.spl")) - - BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH = "/tmp/apps/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl" - APPS_DICT['BETA_SPLUNK_ADD_ON_FOR_SYSMON'] = {"app_number": 5709, 'app_version': "Generated at %s" % ( - datetime.now()), 'location': "local", "container_path": BETA_SPLUNK_ADD_ON_FOR_SYSMON_CONTAINER_PATH} - except Exception as e: - print("Failed to grab beta sysmon at ~/Downloads/Splunk_TA_microsoft_sysmon-1.0.2-B1.spl. Using the one from Splunkbase") - APPS_DICT['SPLUNK_ADD_ON_FOR_SYSMON'] = { - "app_number": 5709, 'app_version': "1.0.1", 'location': 'splunkbase'} - - if True: - APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES'] = { - "app_number": 1876, 'app_version': "5.2.0", 'location': 'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365'] = { - "app_number": 4055, 'app_version': "2.2.0", 'location': 'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE'] = { - "app_number": 3719, 'app_version': "1.3.2", 'location': 'splunkbase'} - APPS_DICT['SPLUNK_ANALYTIC_STORY_EXECUTION_APP'] = { - "app_number": 4971, 'app_version': "2.0.3", 'location': 'splunkbase'} - APPS_DICT['PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT'] = { - "app_number": 2882, 'app_version': "2.0.2", 'location': 'splunkbase'} - APPS_DICT['SPLUNK_MACHINE_LEARNING_TOOLKIT'] = { - "app_number": 2890, 'app_version': "5.2.2", 'location': 'splunkbase'} - APPS_DICT['SPLUNK_APP_FOR_STREAM'] = { - "app_number": 1809, 'app_version': "8.0.1", 'location': 'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA'] = { - "app_number": 5234, 'app_version': "8.0.1", 'location': 'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS'] = { - "app_number": 5238, 'app_version': "8.0.1", 'location': 'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO'] = { - "app_number": 1617, 'app_version': "4.0.0", 'location': 'splunkbase'} - APPS_DICT['SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX'] = { - "app_number": 833, 'app_version': "8.3.1", 'location': 'splunkbase'} - - # CIM is last here for a reason! Because we copy a file to a directory that does not exist until CIM - # has been installed, we use it to prevent the testing from beginning until the copy has succeeded. - # KEEP THIS APP LAST! - APPS_DICT['SPLUNK_COMMON_INFORMATION_MODEL'] = { - "app_number": 1621, 'app_version': "4.20.2", 'location': 'splunkbase'} - - SPLUNK_APPS = [] - for key, value in APPS_DICT.items(): - if value['location'] == 'splunkbase': - # The app is on Splunkbase - target = SPLUNKBASE_URL % ( - value['app_number'], value['app_version']) - SPLUNK_APPS.append(target) - else: - # The app is a file we generated locally - SPLUNK_APPS.append(value['location']) - - for container_index in range(num_containers): - container_name = LOCAL_BASE_CONTAINER_NAME % container_index - - web_port = BASE_CONTAINER_WEB_PORT + container_index - management_port = BASE_CONTAINER_MANAGEMENT_PORT + container_index - - environment = {"SPLUNK_START_ARGS": "--accept-license", - "SPLUNK_PASSWORD": splunk_password, - "SPLUNK_APPS_URL": ','.join(SPLUNK_APPS), - "SPLUNKBASE_USERNAME": splunkbase_username, - "SPLUNKBASE_PASSWORD": splunkbase_password - } - ports = {"8000/tcp": web_port, - "8089/tcp": management_port - } - - mounts = [docker.types.Mount( - target=CONTAINER_VOLUME_PATH, source=local_volume_path, type='bind', read_only=True)] - - print("Creating CONTAINER: [%s]" % (container_name)) - base_container = client.containers.create( - full_docker_hub_container_name, ports=ports, environment=environment, name=container_name, mounts=mounts, detach=True) - print("Created CONTAINER : [%s]" % (container_name)) - - t = threading.Thread(target=splunk_container_manager, - args=(results_tracker, - container_name, - "127.0.0.1", - splunk_password, - web_port, - management_port, - uuid_test, - interactive_failure - )) - - splunk_container_manager_threads.append(t) - - # add the queue status thread - there can be some error in one of the test threads, so this - # thread doesn't need to complete for the program to finish execution - status_thread = threading.Thread(target=queue_status_thread, - args=(results_tracker,), - daemon=True) - # Start this thread immediately - status_thread.start() - - print("Start the testing threads") - for t in splunk_container_manager_threads: - t.start() - # we need to start containers slowly. Would be great it we could do all the setup and - # app install once, but it looks like the container is unlikely to support that. - # We don't really want to fundamentally change this container, either, and will - # keep it as close to production as possible - time.sleep(5) - - # Wait for all of the testing threads to complete - for t in splunk_container_manager_threads: - t.join() # blocks on waiting to join - print("Testing thread completed execution") - - print("All testing threads have completed execution") - # read all the results out from the output queue - strtime = str(int(time.time())) - - print("Wait for the status thread to finish executing...") - status_thread.join() - print("Status thread finished executing.") - - # Remove the attack data and - # generate all of the output information - stop_time = timer() - stop_datetime = datetime.now() - baseline = OrderedDict() - baseline['SPLUNK_VERSION'] = full_docker_hub_container_name - baseline['SPLUNK_APPS'] = APPS_DICT - baseline['TEST_START_TIME'] = str(start_datetime) - baseline['TEST_FINISH_TIME'] = str(stop_datetime) - - results_tracker.finish(baseline) - - # now we are done! - - print("Total Execution Time: [%s]" % ( - timedelta(seconds=stop_time - start_time, microseconds=0))) - - # detection testing service has already been prepared, no need to do it here! - #testing_service.prepare_detection_testing(ssh_key_name, private_key, splunk_ip, splunk_password) - - #testing_service.test_detections(ssh_key_name, private_key, splunk_ip, splunk_password, test_files, uuid_test) - ''' - - if __name__ == "__main__": main(sys.argv[1:]) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 4e45a9010d..a09dc2ae5a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -27,6 +27,8 @@ class ContainerManager: num_containers: int, local_apps: OrderedDict, splunkbase_apps:OrderedDict, + branch:str, + commit_hash:str, files_to_copy_to_container: OrderedDict = OrderedDict(), web_port_start: int = 8000, management_port_start: int = 8089, @@ -74,6 +76,8 @@ class ContainerManager: #Get a datetime and add it as the first entry in the baseline self.start_time = datetime.datetime.now() self.baseline['SPLUNK_VERSION'] = full_docker_hub_name + self.baseline["branch"] = branch + self.baseline["commit_hash"] = commit_hash #Added here first to preserve ordering for OrderedDict self.baseline['TEST_START_TIME'] = "TO BE UPDATED" self.baseline['TEST_FINISH_TIME'] = "TO BE UPDATED" diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index f1e88a3dae..f14957a642 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -22,7 +22,7 @@ SECURITY_CONTENT_URL = "https://github.com/splunk/security_content" class GithubService: - def __init__(self, security_content_branch: str, PR_number: int = None, existing_directory: bool = False): + def __init__(self, security_content_branch: str, commit_hash:str, PR_number: int = None, existing_directory: bool = False): self.security_content_branch = security_content_branch if existing_directory: @@ -31,11 +31,27 @@ class GithubService: self.security_content_repo_obj = self.clone_project( SECURITY_CONTENT_URL, f"security_content", f"develop") - if PR_number: + if commit_hash is not None and PR_number is not None: + print("Error - both the PR number [%d] and the commit hash [%s] were provided. "\ + "Only 0 or 1 can be passed.\n\tQuitting..."%(PR_number, commit_hash)) + sys.exit() + + elif PR_number: subprocess.call(["git", "-C", "security_content/", "fetch", "origin", "refs/pull/%d/head:%s" % (PR_number, security_content_branch)]) - self.security_content_repo_obj.git.checkout(security_content_branch) + # No checking to see if the hash is to a commit inside of the branch - the user + # has to do that by hand + if commit_hash is not None: + print("Checking out commit hash: [%s]"%(commit_hash)) + self.security_content_repo_obj.git.checkout(commit_hash) + else: + print("Checking out branch: [%s]..."%(security_content_branch),end='') + self.security_content_repo_obj.git.checkout(security_content_branch) + commit_hash = self.security_content_repo_obj.head.object.hexsha + print("commit_hash %s"%(commit_hash)) + + self.commit_hash = commit_hash def clone_project(self, url, project, branch): LOGGER.info(f"Clone Security Content Project") @@ -184,7 +200,10 @@ class GithubService: changed_test_files = [] changed_detection_files = [] if branch1 != 'develop': - differ = g.diff('--name-status', branch2 + '...' + branch1) + if self.commit_hash is None: + differ = g.diff('--name-status', branch2 + '...' + branch1) + else: + differ = g.diff('--name-status', branch2 + '...' + self.commit_hash) changed_files = differ.splitlines() for file_path in changed_files: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index ab125b4b67..e0548ea868 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -89,16 +89,7 @@ def update_config_with_cli_arguments(args_dict:dict)->tuple[str, dict]: print("Failure while processing updated settings from command line.\n\tQuitting...", file=sys.stderr) sys.exit(1) - now = datetime.datetime.now() - configname = now.strftime('%Y-%m-%dT%H:%M:%S.%f%z') + '-test-run.json' - with open(configname,'w') as test_config: - settings_with_creds_stripped = copy.deepcopy(settings) - #strip out credentials - settings_with_creds_stripped['splunkbase_password'] = None - settings_with_creds_stripped['splunkbase_username'] = None - settings_with_creds_stripped['container_password'] = None - validate_args.validate_and_write(settings_with_creds_stripped, test_config) - + return ("run", settings) @@ -166,6 +157,13 @@ def parse(args)->tuple[str,dict]: run_parser.add_argument('-b', '--branch', required=False, type=str, help="The branch to run the tests on.") + run_parser.add_argument('-hash', '--commit_hash', required=False, type=str, + help="The hash to run the tests on.") + + run_parser.add_argument('-pr', '--pr_number', required=False, type=int, + help="The Pull request to run the tests on.") + + run_parser.add_argument('-m', '--mode', required=False, type=str, help="The mode all, changes, or selected for the testing.") @@ -206,9 +204,9 @@ def parse(args)->tuple[str,dict]: #file value with None - keep the config file value keys = list(args.__dict__.keys()) for key in keys: - if args.__dict__[key] is None and key in ["splunkbase_username","branch","mode", - "splunkbase_password","splunk_app_password", - "mock","num_containers"]: + if args.__dict__[key] is None and key in ["splunkbase_username","branch", "commit_hash", + "pr_number", "mode", "splunkbase_password", + "splunk_app_password", "mock","num_containers"]: del args.__dict__[key] action, settings = args.func(args) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 625fed0390..3f45737f96 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -18,6 +18,10 @@ setup_schema = { "type": "string", "default": "develop" }, + "commit_hash": { + "type": ["string","null"], + "default": None + }, "container_tag": { "type": "string", @@ -266,7 +270,21 @@ def check_dependencies(settings: dict) -> bool: return error_free -def validate_and_write(configuration: dict, output_file: io.TextIOWrapper) -> tuple[Union[dict, None], dict]: +def validate_and_write(configuration: dict, output_file: Union[io.TextIOWrapper,None]=None, strip_credentials:bool=False) -> tuple[Union[dict, None], dict]: + closeFile = False + if output_file is None: + import datetime + now = datetime.datetime.now() + configname = now.strftime('%Y-%m-%dT%H:%M:%S.%f%z') + '-test-run.json' + output_file = open(configname, "w") + closeFile = True + + if strip_credentials: + configuration = copy.deepcopy(configuration) + configuration['splunkbase_password'] = None + configuration['splunkbase_username'] = None + configuration['container_password'] = None + validated_json, setup_schema = validate(configuration) if validated_json == None: print("Error in the new settings! No output file written") @@ -279,7 +297,9 @@ def validate_and_write(configuration: dict, output_file: io.TextIOWrapper) -> tu except Exception as e: print("Error writing settings to %s: [%s]" % ( output_file.name, str(e)), file=sys.stderr) - return None, setup_schema + sys.exit(1) + if closeFile is True: + output_file.close() return validated_json, setup_schema @@ -311,58 +331,4 @@ def validate(configuration: dict) -> tuple[Union[dict, None], dict]: print("There was an error validation the configuration: [%s]"%(str(e)), file=sys.stderr) return None, setup_schema - """ - try: - v.validate({"action":"doot", "branch":"15"} ) - except jsonschema.exceptions.ValidationError as e: - print("Error validating the json", file=sys.stderr) - print(e) - return False - - except jsonschema.exceptions.SchemaError as e: - print("Error validating the schema", file=sys.stderr) - """ - - -if __name__ == "__main__": - c = v({"action": "test", "branch": "wow"}) - print(c) - if c is False: - print("whoops") - else: - print(c.keys()) -""" -def load(json_settings: io.TextIOWrapper) -> dict: - default_settings = json.load(json_settings) - return default_settings - - -def load_and_validate(json_settings: io.TextIOWrapper) -> dict: - settings = load(json_settings) - validate(settings) - return settings - - -def validate(args: dict) -> bool: - validate_common_arguments() - - validate_mode() - - return True - - -def validate_mode(args: dict) -> bool: - return True - - -def validate_mode_selected(args: dict) -> bool: - return True - - -def validate_mode_changes(args: dict) -> -bool: - return True - - -def validate_mode_all(args: dict) -> bool: - return True -""" + \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index f648d444f5..30d8ef281b 100644 --- a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -3,6 +3,9 @@ from collections import OrderedDict import argparse import sys import json +from modules import validate_args +import os.path + def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict)->bool: success = True try: @@ -41,6 +44,18 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict with open(output_filename, "w") as jsonFile: json.dump({'summary':summary, 'baseline': baseline, 'results':data}, jsonFile, indent=" ") + + + #Generate a failure that the user can download to reproduce and test ONLY the failures locally. + #This makes it easy to test and debug ONLY those that failed. No need to test the ones + #that succeeded! + + fail_list = [os.path.join("security_content/detections",x['detection_file'] ) for x in data if x['success'] == False] + failures_test_override = {"detection_list": fail_list, "interactive_failure":True, + "num_containers":1, "branch": baseline["branch"], "commit_hash":baseline["commit_hash"], + "mode":"selected"} + with open("detection_failure_manifest.json","w") as failures: + validate_args.validate_and_write(failures_test_override, failures) except Exception as e: print("There was an error generating [%s]: [%s]"%(output_filename, str(e)),file=sys.stderr) raise(e) @@ -58,14 +73,12 @@ args = parser.parse_args() all_data = OrderedDict() try: - print("We will summarize the files: %s"%(str(args.files))) + print("We will summarize the files: %s"%(str([f.name for f in args.files]))) for f in args.files: if not f.name.endswith('.json'): print("Error: passed in file must end in .json - you passed in [%s].\n\tQuitting..."%(f.name)) sys.exit(1) data = json.loads(f.read()) - print(f.name) - print(data) if 'baseline' in all_data: #everything has the same baseline, only need to do it once pass From 9517171204260cd8fa148b51b9889a795e02edaa Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 14:20:46 -0800 Subject: [PATCH 095/203] Small change to the output format of the test-config file that is generated at runtime to accurately describe the current test. Also added install of requirements.txt to final summary step. --- .github/workflows/docker-detection-testing.yml | 8 ++++++++ .../ci/detection_testing_batch/modules/validate_args.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 9473fdd9bb..505820b37f 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -239,6 +239,14 @@ jobs: with: python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install Python Dependencies + run: | + cd automated_detection_testing/ci/detection_testing_batch + python3 -m venv .venv + source .venv/bin/activate + python3 -m pip install wheel + python3 -m pip install -r requirements.txt - name: Merge Detections into single File run: | diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 3f45737f96..66a45f68d0 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -275,7 +275,7 @@ def validate_and_write(configuration: dict, output_file: Union[io.TextIOWrapper, if output_file is None: import datetime now = datetime.datetime.now() - configname = now.strftime('%Y-%m-%dT%H:%M:%S.%f%z') + '-test-run.json' + configname = now.strftime('%Y-%m-%dT%H:%M:%S%z') + '-test-run.json' output_file = open(configname, "w") closeFile = True From aa985d5077224a39da75297aad35e05034966f24 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 14:42:18 -0800 Subject: [PATCH 096/203] Made some small changes to printed strings. Fixed summarize_json missing python library error by sourcing virtualenv set up in previous step. --- .github/workflows/docker-detection-testing.yml | 8 +------- .../detection_testing_execution.py | 2 +- .../detection_testing_batch/modules/splunk_container.py | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 505820b37f..ad818fd7f8 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -52,13 +52,6 @@ jobs: run: | sudo apt update -qq - - #python2.7 needed for slim, for now - sudo apt install python2 - sudo apt install virtualenv - curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py - sudo python2.7 get-pip.py - - uses: actions/setup-python@v2 with: python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy @@ -251,6 +244,7 @@ jobs: - name: Merge Detections into single File run: | cd automated_detection_testing/ci/detection_testing_batch + source .venv/bin/activate python summarize_json.py --files results_*/combined.json --output_filename summary_test_results.json diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index fc3529e564..f2c0d74603 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -74,7 +74,7 @@ def ensure_security_content(branch: str, commit_hash:str, pr_number: Union[int, else: if persist_security_content is True and not os.path.exists("security_content"): print("Error - you chose --persist_security_content but the security_content directory does not exist!" - " We will check it out for you.\n\tQuitting...") + " We will check it out for you.") elif os.path.exists("security_content/"): print("Deleting the security_content directory") diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 1c9f3ff0f0..7a2d245d1e 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -247,7 +247,7 @@ class SplunkContainer: datetime.timedelta( microseconds=timedelta_per_test.microseconds) - testing_time_string = "%s per test (%d tests)"%(timedelta_per_test_rounded, self.num_tests_completed) + testing_time_string = "%s (%d tests @ %s per test)"%(testing_seconds_rounded, self.num_tests_completed, timedelta_per_test_rounded) summary_str = "Summary\n\t"\ "Total Time : [%s]\n\t"\ From ae3e8f1b757c8dd221d046717bb1d7f319a698b9 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 14:56:38 -0800 Subject: [PATCH 097/203] slim failed to install, causing escu app install to fail. --- .github/workflows/docker-detection-testing.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index ad818fd7f8..d23da9fb1c 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -48,10 +48,15 @@ jobs: - name: Checkout Repo uses: actions/checkout@v2 - - name: Install Docker + - name: Install requirements for installing slim during execution run: | sudo apt update -qq - + #python2.7 needed for slim, for now + sudo apt install python2 + sudo apt install virtualenv + curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + sudo python2.7 get-pip.py + - uses: actions/setup-python@v2 with: python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy From eb01127d035c9a0ac98a72793ab88d92a4fc1ce6 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 15:25:24 -0800 Subject: [PATCH 098/203] Fixed key error in summarize.json. Had called detection_list detections_list, so it was failing jsonschema validation. --- .../ci/detection_testing_batch/summarize_json.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index 30d8ef281b..2f90b367bb 100644 --- a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -50,12 +50,15 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict #This makes it easy to test and debug ONLY those that failed. No need to test the ones #that succeeded! + fail_list = [os.path.join("security_content/detections",x['detection_file'] ) for x in data if x['success'] == False] - failures_test_override = {"detection_list": fail_list, "interactive_failure":True, - "num_containers":1, "branch": baseline["branch"], "commit_hash":baseline["commit_hash"], - "mode":"selected"} - with open("detection_failure_manifest.json","w") as failures: - validate_args.validate_and_write(failures_test_override, failures) + + if len(fail_list) > 0: + failures_test_override = {"detections_list": fail_list, "interactive_failure":True, + "num_containers":1, "branch": baseline["branch"], "commit_hash":baseline["commit_hash"], + "mode":"selected"} + with open("detection_failure_manifest.json","w") as failures: + validate_args.validate_and_write(failures_test_override, failures) except Exception as e: print("There was an error generating [%s]: [%s]"%(output_filename, str(e)),file=sys.stderr) raise(e) From abd568f7d7e4330508cec11e97d99c5c55fc4e28 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 15:57:13 -0800 Subject: [PATCH 099/203] Small update to summarize_json.py to set show_splunk_app_password to True when generatingf the detection_failure_manifest.json file. This way, you can run that file directly as the configuration without making any other changes or passing command line values and get right into debugging everything --- .../ci/detection_testing_batch/summarize_json.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index 2f90b367bb..a1084a4a44 100644 --- a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -56,7 +56,7 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict if len(fail_list) > 0: failures_test_override = {"detections_list": fail_list, "interactive_failure":True, "num_containers":1, "branch": baseline["branch"], "commit_hash":baseline["commit_hash"], - "mode":"selected"} + "mode":"selected", "show_splunk_app_password": True} with open("detection_failure_manifest.json","w") as failures: validate_args.validate_and_write(failures_test_override, failures) except Exception as e: From 827cc97cdc3e6e27dc47d4273f7e55400af48ed1 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 17:06:07 -0800 Subject: [PATCH 100/203] Better support for arg validation and command line arguments. Print out the password for the container, if the flag exists to print it out, to enable interactive testing. A few other format updates. --- .../detection_testing_execution.py | 57 +++-- .../modules/container_manager.py | 9 +- .../modules/github_service.py | 72 ++++--- .../modules/new_arguments2.py | 204 +++++------------- .../modules/validate_args.py | 2 +- 5 files changed, 133 insertions(+), 211 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index f2c0d74603..59149f8bdc 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -44,18 +44,19 @@ datamodel_file_container_path = os.path.join( MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING = 2 -def copy_local_apps_to_directory(apps: dict[str,dict], target_directory)->None: + +def copy_local_apps_to_directory(apps: dict[str, dict], target_directory) -> None: for key, item in apps.items(): source_path = os.path.abspath(os.path.expanduser(item['local_path'])) base_name = os.path.basename(source_path) dest_path = os.path.join(target_directory, base_name) - + try: shutil.copy(source_path, dest_path) item['local_path'] = dest_path except shutil.SameFileError as e: # Same file, not a real error. The copy just doesn't happen - print("err:%s"%(str(e))) + print("err:%s" % (str(e))) pass except Exception as e: print("Error copying ESCU Package [%s] to [%s]: [%s].\n\tQuitting..." % ( @@ -63,7 +64,7 @@ def copy_local_apps_to_directory(apps: dict[str,dict], target_directory)->None: sys.exit(1) -def ensure_security_content(branch: str, commit_hash:str, pr_number: Union[int, None], persist_security_content: bool) -> GithubService: +def ensure_security_content(branch: str, commit_hash: str, pr_number: Union[int, None], persist_security_content: bool) -> GithubService: if persist_security_content is True and os.path.exists("security_content"): print("****** You chose --persist_security_content and the security_content directory exists. " "We will not check out the repo again. Please be aware, this could cause issues if you're " @@ -186,26 +187,26 @@ def generate_escu_app(persist_security_content: bool = False) -> str: return output_file_path_from_root + def finish_mock(settings: dict, detections: list[str], output_file_template: str = "prior_config/config_tests_%d.json"): num_containers = settings['num_containers'] try: - #Remove the prior config directory if it exists. If not, continue + # Remove the prior config directory if it exists. If not, continue shutil.rmtree("prior_config", ignore_errors=True) - - #We want to make the prior_config directory and the prior_config/apps directory + + # We want to make the prior_config directory and the prior_config/apps directory os.makedirs("prior_config/apps") except FileExistsError as e: - print("Directory priorconfig/apps exists, but we just deleted it!\m\tQuitting...",file=sys.stderr) + print("Directory priorconfig/apps exists, but we just deleted it!\m\tQuitting...", file=sys.stderr) sys.exit(1) except Exception as e: print("Some error occured when trying to make the configs folder: [%s]\n\tQuitting..." % ( str(e)), file=sys.stderr) sys.exit(1) - - #Copy the apps to the appropriate local. This will also update - #the app paths in settings['local_apps'] + # Copy the apps to the appropriate local. This will also update + # the app paths in settings['local_apps'] copy_local_apps_to_directory(settings['local_apps'], "prior_config/apps") for output_file_index in range(0, num_containers): @@ -265,7 +266,7 @@ def main(args: list[str]): try: docker.client.from_env() except Exception as e: - print("Error, failed to get docker client. Is Docker Running?\n\t%s"%(str(e))) + print("Error, failed to get docker client. Is Docker Running?\n\t%s" % (str(e))) requests.packages.urllib3.disable_warnings() @@ -278,8 +279,8 @@ def main(args: list[str]): elif action != "run": print("Unsupported action: [%s]" % (action), file=sys.stderr) sys.exit(1) - + FULL_DOCKER_HUB_CONTAINER_NAME = "splunk/splunk:%s" % settings['container_tag'] if settings['num_containers'] > MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING: @@ -291,11 +292,11 @@ def main(args: list[str]): github_service = ensure_security_content( settings['branch'], settings['commit_hash'], settings['pr_number'], settings['persist_security_content']) settings['commit_hash'] = github_service.commit_hash - - #Make a backup of this config containing the hash and stripped credentials. - #This makes the test perfectly reproducible. - validate_args.validate_and_write(settings,output_file=None,strip_credentials=True) - + + # Make a backup of this config containing the hash and stripped credentials. + # This makes the test perfectly reproducible. + validate_args.validate_and_write( + settings, output_file=None, strip_credentials=True) all_test_files = github_service.get_test_files(settings['mode'], settings['folders'], @@ -303,13 +304,11 @@ def main(args: list[str]): settings['detections_list'], settings['detections_file']) - - local_volume_absolute_path = os.path.abspath( os.path.join(os.getcwd(), "apps")) try: - #remove the directory first - shutil.rmtree(local_volume_absolute_path,ignore_errors=True) + # remove the directory first + shutil.rmtree(local_volume_absolute_path, ignore_errors=True) os.mkdir(local_volume_absolute_path) except FileExistsError as e: # Directory already exists, do nothing @@ -325,7 +324,7 @@ def main(args: list[str]): pass #file_path = os.path.expanduser(settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path']) #source_path = file_path - #dest_path = os.path.join( + # dest_path = os.path.join( # local_volume_absolute_path, os.path.basename(file_path)) elif 'SPLUNK_ES_CONTENT_UPDATE' not in settings['local_apps']: @@ -336,13 +335,11 @@ def main(args: list[str]): # Need to generate that package source_path = generate_escu_app(settings['persist_security_content']) settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] = source_path - #dest_path = os.path.join( + # dest_path = os.path.join( # local_volume_absolute_path, os.path.basename(source_path)) - - - copy_local_apps_to_directory(settings['local_apps'], local_volume_absolute_path) - + copy_local_apps_to_directory( + settings['local_apps'], local_volume_absolute_path) if settings['mock']: finish_mock(settings, all_test_files) @@ -355,7 +352,7 @@ def main(args: list[str]): mounts = [{"local_path": local_volume_absolute_path, "container_path": "/tmp/apps", "type": "bind", "read_only": True}] - + cm = container_manager.ContainerManager(all_test_files, FULL_DOCKER_HUB_CONTAINER_NAME, settings['local_base_container_name'], @@ -375,8 +372,8 @@ def main(args: list[str]): reuse_image=settings['reuse_image'], interactive_failure=settings['interactive_failure']) - cm.run_test() + if __name__ == "__main__": main(sys.argv[1:]) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index a09dc2ae5a..5e0cd67cc5 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -53,8 +53,15 @@ class ContainerManager: else: self.container_password = container_password + print("\n\n***********************") + print("Log into your Splunk Container(s) after they boot at at http://127.0.0.1:[%d-%d]"%(web_port_start, web_port_start + num_containers - 1)) + print("\tSplunk App Username: [%s]"%("admin")) + print("\tSplunk App Password: ", end='') if show_container_password: - print("Splunk App Password: [%s]"%(self.container_password)) + print("[%s]"%(self.container_password)) + else: + print(" --show_splunk_app_password set to False - password not printed") + print("***********************\n\n") self.containers = self.create_containers( diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index f14957a642..eea00800d4 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -22,7 +22,7 @@ SECURITY_CONTENT_URL = "https://github.com/splunk/security_content" class GithubService: - def __init__(self, security_content_branch: str, commit_hash:str, PR_number: int = None, existing_directory: bool = False): + def __init__(self, security_content_branch: str, commit_hash: str, PR_number: int = None, existing_directory: bool = False): self.security_content_branch = security_content_branch if existing_directory: @@ -32,8 +32,8 @@ class GithubService: SECURITY_CONTENT_URL, f"security_content", f"develop") if commit_hash is not None and PR_number is not None: - print("Error - both the PR number [%d] and the commit hash [%s] were provided. "\ - "Only 0 or 1 can be passed.\n\tQuitting..."%(PR_number, commit_hash)) + print("Error - both the PR number [%d] and the commit hash [%s] were provided. " + "Only 0 or 1 can be passed.\n\tQuitting..." % (PR_number, commit_hash)) sys.exit() elif PR_number: @@ -43,14 +43,16 @@ class GithubService: # No checking to see if the hash is to a commit inside of the branch - the user # has to do that by hand if commit_hash is not None: - print("Checking out commit hash: [%s]"%(commit_hash)) + print("Checking out commit hash: [%s]" % (commit_hash)) self.security_content_repo_obj.git.checkout(commit_hash) else: - print("Checking out branch: [%s]..."%(security_content_branch),end='') - self.security_content_repo_obj.git.checkout(security_content_branch) + print("Checking out branch: [%s]..." % + (security_content_branch), end='') + self.security_content_repo_obj.git.checkout( + security_content_branch) commit_hash = self.security_content_repo_obj.head.object.hexsha - print("commit_hash %s"%(commit_hash)) - + print("commit_hash %s" % (commit_hash)) + self.commit_hash = commit_hash def clone_project(self, url, project, branch): @@ -60,13 +62,13 @@ class GithubService: def prune_detections(self, detections_to_prune: list[str], - types_to_test: list[str], + types_to_test: list[str], previously_successful_tests: list[str], exclude_ssa: bool = True, summary_file: str = None) -> list[str]: pruned_tests = [] csvlines = [] - + for detection in detections_to_prune: if os.path.basename(detection).startswith("ssa") and exclude_ssa: continue @@ -79,7 +81,7 @@ class GithubService: pathlib.Path(*pathlib.Path(test_filepath).parts[1:])) # If no types are provided, then we will get everything if 'type' in description and (description['type'] in types_to_test or len(types_to_test) == 0): - + if not os.path.exists(test_filepath): print("Detection [%s] references [%s], but it does not exist" % ( detection, test_filepath)) @@ -122,54 +124,59 @@ class GithubService: return pruned_tests - def get_test_files(self, mode: str, folders:list[str], types:list[str], - detections_list: Union[list[str], None], + def get_test_files(self, mode: str, folders: list[str], types: list[str], + detections_list: Union[list[str], None], detections_file=Union[str, None]) -> list[str]: if mode == "changes": tests = self.get_changed_test_files(folders, types) elif mode == "selected": if detections_list is None and detections_file is None: - #It's actually valid to supply an EMPTY list of files and the test should pass. - #This can occur when we try to test, for example, 1 detection but start 2 containers. - #We still want this to pass testing, so we shouldn't fail there! - print("Trying to test a list of files, but None were provided", file=sys.stderr) + # It's actually valid to supply an EMPTY list of files and the test should pass. + # This can occur when we try to test, for example, 1 detection but start 2 containers. + # We still want this to pass testing, so we shouldn't fail there! + print( + "Trying to test a list of files, but None were provided", file=sys.stderr) sys.exit(1) elif detections_list is not None and detections_file is not None: - print("Both detections_list [%s] and detections_file [%s] were provided. "\ - "Because these confilect, we cannot test.\n\tQuitting..."% + print("Both detections_list [%s] and detections_file [%s] were provided. " + "Because these confilect, we cannot test.\n\tQuitting..." % (detections_list, detections_file), file=sys.stderr) sys.exit(1) elif detections_list is not None: tests = self.get_selected_test_files(detections_list, types) elif detections_file is not None: try: - with open(detections_file,'r') as f: + with open(detections_file, 'r') as f: data = f.readlines() - #Strip all whitespace from lines and exclude lines that are just whitespace - files_to_test = [line.strip() for line in data if len(line.strip()) > 0] + # Strip all whitespace from lines and exclude lines that are just whitespace + files_to_test = [line.strip() + for line in data if len(line.strip()) > 0] except Exception as e: - print("There was an error reading the input file [%s]: [%s].\n\t"\ - "Quitting..."%(detections_file, str(e))) + print("There was an error reading the input file [%s]: [%s].\n\t" + "Quitting..." % (detections_file, str(e))) sys.exit(1) - - tests = self.get_selected_test_files(files_to_test, folders, types) + + tests = self.get_selected_test_files( + files_to_test, folders, types) else: - #impossible to get here - print("Impossible to get here. Just kept to make the if/elif more self describing",file=sys.stderr) + # impossible to get here + print( + "Impossible to get here. Just kept to make the if/elif more self describing", file=sys.stderr) sys.exit(1) elif mode == "all": tests = self.get_all_tests_and_detections(folders, types) else: - print("Error, unsupported mode [%s]. Mode must be one of %s", file=sys.stderr) + print( + "Error, unsupported mode [%s]. Mode must be one of %s", file=sys.stderr) sys.exit(1) return tests def get_selected_test_files(self, detection_file_list: list[str], - types_to_test: list[str] = [ + types_to_test: list[str] = [ "Anomaly", "Hunting", "TTP"], previously_successful_tests: list[str] = []) -> list[str]: @@ -178,7 +185,7 @@ class GithubService: def get_all_tests_and_detections(self, folders: list[str] = [ 'endpoint', 'cloud', 'network'], - types_to_test: list[str] = [ + types_to_test: list[str] = [ "Anomaly", "Hunting", "TTP"], previously_successful_tests: list[str] = []) -> list[str]: detections = [] @@ -203,7 +210,8 @@ class GithubService: if self.commit_hash is None: differ = g.diff('--name-status', branch2 + '...' + branch1) else: - differ = g.diff('--name-status', branch2 + '...' + self.commit_hash) + differ = g.diff('--name-status', branch2 + + '...' + self.commit_hash) changed_files = differ.splitlines() for file_path in changed_files: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index e0548ea868..838276ce0f 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -1,14 +1,12 @@ import argparse -import copy -import datetime import json from typing import OrderedDict, Union -#import modules.validate_args as validate_args from modules import validate_args import sys DEFAULT_CONFIG_FILE = "test_config.json" + def configure_action(args) -> tuple[str, dict]: settings = OrderedDict() if args.input_config_file is None: @@ -24,9 +22,10 @@ def configure_action(args) -> tuple[str, dict]: for arg in settings: default = settings[arg] default_string = str(default).replace("'", '"') - + if 'enum' in schema['properties'][arg]: - choice = input("%s [default: %s | choices: {%s}]: " % (arg, default_string,','.join(schema['properties'][arg]['enum']))) + choice = input("%s [default: %s | choices: {%s}]: " % ( + arg, default_string, ','.join(schema['properties'][arg]['enum']))) else: choice = input("%s [default: %s]: " % (arg, default_string)) choice = choice.strip() @@ -48,7 +47,7 @@ def configure_action(args) -> tuple[str, dict]: choice.count("'"))) choice = choice.replace("'", '"') elif '"' in choice: - #Do nothing + # Do nothing pass elif choice.isdigit(): pass @@ -57,52 +56,50 @@ def configure_action(args) -> tuple[str, dict]: new_config[arg] = json.loads(choice) formatted_print = choice - #We print out choice instead of new_config[arg] because the json.loads() messes up the quotation marks again + # We print out choice instead of new_config[arg] because the json.loads() messes up the quotation marks again print("\t{0}\n".format(formatted_print)) # Now parse the new config and make sure it's good - validated_new_settings, schema = validate_args.validate_and_write(new_config, args.output_config_file) - if validated_new_settings == None: + validated_new_settings, schema = validate_args.validate_and_write( + new_config, args.output_config_file) + if validated_new_settings == None: print("Could not update settings.\n\tQuitting...", file=sys.stderr) sys.exit(1) - return ("configure", validated_new_settings) -def update_config_with_cli_arguments(args_dict:dict)->tuple[str, dict]: - #First load the config file +def update_config_with_cli_arguments(args_dict: dict) -> tuple[str, dict]: + # First load the config file - settings,_ = validate_args.validate_file(args_dict['config_file']) + settings, _ = validate_args.validate_file(args_dict['config_file']) if settings is None: - print("Failure while processing settings in [%s].\n\tQuitting..."%(args_dict['config_file'].name), file=sys.stderr) + print("Failure while processing settings in [%s].\n\tQuitting..." % ( + args_dict['config_file'].name), file=sys.stderr) sys.exit(1) - - #Then update it with the values that were passed as command line arguments + + # Then update it with the values that were passed as command line arguments for key, value in args_dict.items(): if key in settings: settings[key] = value - - #Validate again to make sure we didn't break anything - settings,_ = validate_args.validate(settings) + + # Validate again to make sure we didn't break anything + settings, _ = validate_args.validate(settings) if settings is None: print("Failure while processing updated settings from command line.\n\tQuitting...", file=sys.stderr) sys.exit(1) - - + return ("run", settings) - -def run_action(args) -> tuple[str,dict]: +def run_action(args) -> tuple[str, dict]: config = update_config_with_cli_arguments(args.__dict__) - return config -def parse(args)->tuple[str,dict]: +def parse(args) -> tuple[str, dict]: ''' try: with open(DEFAULT_CONFIG_FILE, 'r') as settings_file: @@ -113,12 +110,12 @@ def parse(args)->tuple[str,dict]: ''' import os - #if there is no default config file, then generate one + # if there is no default config file, then generate one if not os.path.exists(DEFAULT_CONFIG_FILE): - print("No default configuration file [%s] found. Creating one..."%(DEFAULT_CONFIG_FILE)) - with open(DEFAULT_CONFIG_FILE,'w') as cfg: - validate_args.validate_and_write({},cfg) - + print("No default configuration file [%s] found. Creating one..." % ( + DEFAULT_CONFIG_FILE)) + with open(DEFAULT_CONFIG_FILE, 'w') as cfg: + validate_args.validate_and_write({}, cfg) parser = argparse.ArgumentParser( description="Use 'SOME_PROGRAM_NAME_STRING --help' to get help with the arguments") @@ -132,7 +129,7 @@ def parse(args)->tuple[str,dict]: configure_parser.set_defaults(func=configure_action) configure_parser.add_argument('-i', '--input_config_file', required=False, type=argparse.FileType('r'), help="The config file to base the configuration off of.") - configure_parser.add_argument('-o', '--output_config_file', required=False, default=DEFAULT_CONFIG_FILE, + configure_parser.add_argument('-o', '--output_config_file', required=False, default=DEFAULT_CONFIG_FILE, type=argparse.FileType('w'), help="The config file to write the configuration off of.") # Run parser @@ -141,13 +138,11 @@ def parse(args)->tuple[str,dict]: run_parser.set_defaults(func=run_action) run_parser.add_argument('-c', '--config_file', required=False, type=argparse.FileType('r'), - default = DEFAULT_CONFIG_FILE, - help="The config file for the test. Note that this file "\ - "cannot be changed (except for credentials that can be "\ + default=DEFAULT_CONFIG_FILE, + help="The config file for the test. Note that this file " + "cannot be changed (except for credentials that can be " "entered on the command line).") - - run_parser.add_argument('-user', '--splunkbase_username', required=False, type=str, help="Username for login to splunkbase. This is required " "if downloading packages from Splunkbase. While this can " @@ -156,14 +151,13 @@ def parse(args)->tuple[str,dict]: run_parser.add_argument('-b', '--branch', required=False, type=str, help="The branch to run the tests on.") - + run_parser.add_argument('-hash', '--commit_hash', required=False, type=str, help="The hash to run the tests on.") - + run_parser.add_argument('-pr', '--pr_number', required=False, type=int, help="The Pull request to run the tests on.") - run_parser.add_argument('-m', '--mode', required=False, type=str, help="The mode all, changes, or selected for the testing.") @@ -180,133 +174,49 @@ def parse(args)->tuple[str,dict]: run_parser.add_argument("-show_pass", "--show_splunk_app_password", required=False, action="store_true", - help="The password to login to the Splunk Server. If the config "\ - "file is set to true, it will override the default False for this. True "\ + help="The password to login to the Splunk Server. If the config " + "file is set to true, it will override the default False for this. True " "will override the default value in the config file.") - - run_parser.add_argument("-mock", "--mock", required=False, + + run_parser.add_argument("-mock", "--mock", required=False, action="store_true", - help="Split into multiple configs, don't actually run the tests. If the config "\ - "file is set to true, it will override the default False for this. True "\ + help="Split into multiple configs, don't actually run the tests. If the config " + "file is set to true, it will override the default False for this. True " "will override the default value in the config file.") run_parser.add_argument("-n", "--num_containers", required=False, type=int, help="The number of Splunk containers to run or mock") - - + args = parser.parse_args() - - - + + # Run the appropriate parser try: - #If one of these arguments is not passed on the command line, don't overwrite its config - #file value with None - keep the config file value + # If one of these arguments is not passed on the command line, don't overwrite its config + # file value with None - keep the config file value keys = list(args.__dict__.keys()) for key in keys: - if args.__dict__[key] is None and key in ["splunkbase_username","branch", "commit_hash", - "pr_number", "mode", "splunkbase_password", - "splunk_app_password", "mock","num_containers"]: + + # We have to do the check separately because booleans using the --store_true + # action have an implict default=False value, even if we don't set it. We cannot + # set their value to something else, like None + + # Don't overwite booleans + if args.__dict__[key] is False and key in ["show_splunk_app_password", "mock"]: + del args.__dict__[key] + # Don't overwrite other values + elif args.__dict__[key] is None and key in ["splunkbase_username", "branch", "commit_hash", + "pr_number", "mode", "splunkbase_password", + "num_containers"]: del args.__dict__[key] action, settings = args.func(args) + - ''' - default_settings,_ = validate_args.validate({}) - if default_settings is None: - print("Somehow default settings were None.\n\tQuitting...",file=sys.stderr) - sys.exit(1) - #Fix up the show_app_password and mock arguments, as shown in the documentation - #for those args - settings['show_splunk_app_password'] |= default_settings['show_splunk_app_password'] - settings['mock'] |= default_settings['mock'] - ''' return action, settings except Exception as e: print("Unknown Error - [%s]" % (str(e))) sys.exit(1) - ''' - - configure_parser.add_argument( - '-o', '--output_config', required=True, help="Name of config file to generate") - - test_parser = actions_parser.add_parser("test", help="run a test") - test_parser.add_argument('-b', '--branch', required=True, - help="The branch whose detections you would like to test. "\ - "In order to calculate new/changed detections, the detections "\ - "in this branch will be diffed against those in the 'develop' branch") - test_parser.add_argument( - '-pr', '--pull_request_number', required=False, help="Pull request number.") - - VALID_DETECTION_TYPES = ['endpoint', 'cloud', 'network'] - - #Common Test Arguments - test_parser.add_argument('-t', '--types', type=str, action="append", - help="Detection types to test. Can be one or more of %s"%(VALID_DETECTION_TYPES)) - - - test_parser.add_argument('-e', '--escu_package', type=argparse.FileType('rb'), required=False, - help="A previously generated ESCU PAcklage to use. If you pass this "\ - "argument, a new ESCU package will not be generated. Note that this "\ - "may cause newly-written detections to fail (for example, if they "\ - "leverage macros that have been added or modified).") - - test_parser.add_argument('-p','--persist_security_content', required=False, action="store_true", - help="Assumes security_content directory already exists. Don't check it out and overwrite it again. Saves "\ - "time and allows you to test a detection that you've updated. Runs generate again in case you have "\ - "updated macros or anything else. Especially useful for quick, local, iterative testing.") - - - test_parser.add_argument('-tag', '--container_tag', required=False, default = default_args['container_tag'], - help="The tag of the Splunk Container to use. Tags are located "\ - "at https://hub.docker.com/r/splunk/splunk/tags") - - test_parser.add_argument("-show", "--show_password", required=False, default=False, action='store_true', - help="Show the generated password to use to login to splunk. For a CI/CD run, "\ - "you probably don't want this.") - - test_parser.add_argument('-r','--reuse_image', required=False, default=True, action='store_true', - help="Should existing images be re-used, or should they be redownloaded?") - - test_parser.add_argument('-i', '--interactive_failure', required=False, default=False, action='store_true', - help="If a test fails, should we pause before removing data so that the search can be debugged?") - - - - #Mode settings - mode_parser = test_parser.add_subparsers(title="Test Modes", required=True) - #NEW - new_parser = mode_parser.add_parser("changes", - help="Test only the new or changed detections") - - #SELECTED - - selected_parser = mode_parser.add_parser("selected", help="Test only the detections from the target branch that "\ - " are passed on the command line. These can be given as "\ - "a list of files or as a file containing a list of files.") - selected_group = selected_parser.add_mutually_exclusive_group(required=True) - selected_group.add_argument('-df', '--detections_file', type=argparse.FileType('r'), - required=False, help="A file containing a list of detections to run, one per line") - selected_group.add_argument('-dl', '--detections_list', - required=False, help="The names of files that you want to test, separated by commas. "\ - "Do not include spaces between the detections!") - - #ALL - all_parser = mode_parser.add_parser("all", - help="Test all of the detections in the target branch. "\ - "Note that this could take a very long time.") - - - args = parser.parse_args() - try: - validate_args.validate(args.__dict__) - - except Exception as e: - print("Error validating command line arguments: [%s]"%(str(e))) - sys.exit(1) - ''' - - if __name__ == "__main__": parse(sys.argv[1:]) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 66a45f68d0..0602ca92d5 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -107,7 +107,7 @@ setup_schema = { "show_splunk_app_password": { "type": "boolean", - "default": True + "default": False }, From b94ef641ecc4ed0c2aaf5f085ba1778af7c8d8da Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 17:13:41 -0800 Subject: [PATCH 101/203] Changed the detection testing to run on all, develop instead of changes to a different branch. This will collect some data for us over the next few days. --- .github/workflows/docker-detection-testing.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index d23da9fb1c..d4afad7469 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -1,6 +1,9 @@ name: docker-detection-testing on: - push: + #push: + #run nightly at 0500 UTC + schedule: + - cron: "0 5 * * *" jobs: validate-tag-if-present: @@ -75,7 +78,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch RegistryDetectionFixes --mode changes --num_containers 10 --mock + python3 detection_testing_execution.py run --branch develop --mode all --num_containers 10 --mock - name: Upload Test Results Files uses: actions/upload-artifact@v2 From afb07b671494912d7b395d9ccc8c6aa2157d5a60 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 24 Nov 2021 17:14:33 -0800 Subject: [PATCH 102/203] Run it on push too for an immediate test --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index d4afad7469..68ecde80f7 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -1,6 +1,6 @@ name: docker-detection-testing on: - #push: + push: #run nightly at 0500 UTC schedule: - cron: "0 5 * * *" From 38ad36c296bf859dee4caec8ed89c0ec368b7219 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 29 Nov 2021 10:49:54 -0800 Subject: [PATCH 103/203] Run at 55th minute each hour for testing. --- .github/workflows/docker-detection-testing.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 68ecde80f7..baae897de2 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -1,9 +1,7 @@ name: docker-detection-testing on: - push: - #run nightly at 0500 UTC schedule: - - cron: "0 5 * * *" + - cron: "55 * * * *" jobs: validate-tag-if-present: From e8fb9578ea81b2b197c2d5956b9d1d1db5f19971 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 29 Nov 2021 10:51:44 -0800 Subject: [PATCH 104/203] Change types of quotes around schedule --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index baae897de2..3c7ea6985d 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -1,7 +1,7 @@ name: docker-detection-testing on: schedule: - - cron: "55 * * * *" + - cron: '55 * * * *'' jobs: validate-tag-if-present: From 95e7169e05c75601f01cdbff705cf293858ced2f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 29 Nov 2021 10:53:29 -0800 Subject: [PATCH 105/203] fix quote --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 3c7ea6985d..8b6fa0a1f7 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -1,7 +1,7 @@ name: docker-detection-testing on: schedule: - - cron: '55 * * * *'' + - cron: '55 * * * *' jobs: validate-tag-if-present: From fff797358c6a2b9b43eeee86c22abdbdca59c2fc Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 29 Nov 2021 11:34:59 -0800 Subject: [PATCH 106/203] Run a handlful of tests on push to produce output artifacts. --- .github/workflows/docker-detection-testing.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 8b6fa0a1f7..1098a48362 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -1,7 +1,11 @@ name: docker-detection-testing on: + push: + #run nightly at 0500 UTC + #Note the scheduled workflows will only run if the Action has + #been committed to the default branch (develop) schedule: - - cron: '55 * * * *' + - cron: "0 5 * * *" jobs: validate-tag-if-present: @@ -76,7 +80,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch develop --mode all --num_containers 10 --mock + python3 detection_testing_execution.py run --branch RegistryDetectionFixes --mode changes --num_containers 10 --mock - name: Upload Test Results Files uses: actions/upload-artifact@v2 From 2b3fd66bb39ad21e56a1ee2a953bd52b324600d1 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 29 Nov 2021 11:54:26 -0800 Subject: [PATCH 107/203] Run a test on everything, saving the intermediate files to help debugging. --- .../workflows/docker-detection-testing.yml | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 1098a48362..9d1fb93066 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -80,7 +80,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch RegistryDetectionFixes --mode changes --num_containers 10 --mock + python3 detection_testing_execution.py run --branch develop --mode all --num_containers 10 --mock - name: Upload Test Results Files uses: actions/upload-artifact@v2 @@ -275,19 +275,19 @@ jobs: automated_detection_testing/ci/detection_testing_batch/detection_failure_manifest.json - - name: Clean up intermediate Files - uses: geekyeggo/delete-artifact@v1 - if: always() - with: - name: | - config_tests_0.json.results - config_tests_1.json.results - config_tests_2.json.results - config_tests_3.json.results - config_tests_4.json.results - config_tests_5.json.results - config_tests_6.json.results - config_tests_7.json.results - config_tests_8.json.results - config_tests_9.json.results + #Don't delete the intermediate files, they can be useful for debugging + # - name: Clean up intermediate Files + # uses: geekyeggo/delete-artifact@v1 + # with: + # name: | + # config_tests_0.json.results + # config_tests_1.json.results + # config_tests_2.json.results + # config_tests_3.json.results + # config_tests_4.json.results + # config_tests_5.json.results + # config_tests_6.json.results + # config_tests_7.json.results + # config_tests_8.json.results + # config_tests_9.json.results \ No newline at end of file From 180785c7d495182c9fbc28e0d1eb13fcbb09d950 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 29 Nov 2021 14:40:17 -0800 Subject: [PATCH 108/203] Certain types of error would have missing fields in the results json, causing the summarization code to crash. Fixed that. Also sorted the output of the summarization to made it easier to look at a glance. Errors and failures will be at the top and the rest will be sorted alphabetically. --- .../detection_testing_execution.py | 68 ++++++++++++------- .../modules/splunk_container.py | 43 ++++++------ .../modules/test_driver.py | 9 +++ .../detection_testing_batch/summarize_json.py | 9 ++- 4 files changed, 83 insertions(+), 46 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 59149f8bdc..80563e57c6 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -188,7 +188,7 @@ def generate_escu_app(persist_security_content: bool = False) -> str: return output_file_path_from_root -def finish_mock(settings: dict, detections: list[str], output_file_template: str = "prior_config/config_tests_%d.json"): +def finish_mock(settings: dict, detections: list[str], output_file_template: str = "prior_config/config_tests_%d.json")->bool: num_containers = settings['num_containers'] try: @@ -199,11 +199,11 @@ def finish_mock(settings: dict, detections: list[str], output_file_template: str os.makedirs("prior_config/apps") except FileExistsError as e: print("Directory priorconfig/apps exists, but we just deleted it!\m\tQuitting...", file=sys.stderr) - sys.exit(1) + return False except Exception as e: print("Some error occured when trying to make the configs folder: [%s]\n\tQuitting..." % ( str(e)), file=sys.stderr) - sys.exit(1) + return False # Copy the apps to the appropriate local. This will also update # the app paths in settings['local_apps'] @@ -252,22 +252,20 @@ def finish_mock(settings: dict, detections: list[str], output_file_template: str if validated_settings is None: print( "There was an error validating the updated mock settings.\n\tQuitting...", file=sys.stderr) - sys.exit(1) + return False except Exception as e: print("Error writing config file %s: [%s]\n\tQuitting..." % ( fname, str(e)), file=sys.stderr) - sys.exit(1) + return False - sys.exit(0) + return True def main(args: list[str]): - try: - docker.client.from_env() - except Exception as e: - print("Error, failed to get docker client. Is Docker Running?\n\t%s" % (str(e))) - + #Disable insecure warnings. We make a number of HTTPS requests to Splunk + #docker containers that we've set up. Without this line, we get an + #insecure warning every time due to invalid cert. requests.packages.urllib3.disable_warnings() start_datetime = datetime.now() @@ -280,6 +278,16 @@ def main(args: list[str]): print("Unsupported action: [%s]" % (action), file=sys.stderr) sys.exit(1) + if settings['mock'] is False: + # If this is a real run, then make sure Docker is installed and running and usable + # If this is a mock, then that is not required. By only checking on a non-mock + # run, we save ourselves the need to install docker in the CI for the manifest + # generation step. + try: + docker.client.from_env() + except Exception as e: + print("Error, failed to get docker client. Is Docker Installed and Running?\n\t%s" % (str(e))) + FULL_DOCKER_HUB_CONTAINER_NAME = "splunk/splunk:%s" % settings['container_tag'] @@ -304,6 +312,8 @@ def main(args: list[str]): settings['detections_list'], settings['detections_file']) + + #Set up the directory that will be used to store the local apps/apps we build local_volume_absolute_path = os.path.abspath( os.path.join(os.getcwd(), "apps")) try: @@ -317,41 +327,51 @@ def main(args: list[str]): print("Error creating the apps folder [%s]: [%s]\n\tQuitting..." % (local_volume_absolute_path, str(e)), file=sys.stderr) sys.exit(1) + #Add the info about the mount + mounts = [{"local_path": local_volume_absolute_path, + "container_path": "/tmp/apps", "type": "bind", "read_only": True}] + # Check to see if we want to install ESCU and whether it was preeviously generated and we should use that file if 'SPLUNK_ES_CONTENT_UPDATE' in settings['local_apps'] and settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] is not None: - # Using a pregenerated ESCU, copy it to apps (unless it) + # Using a pregenerated ESCU, no need to build it pass - #file_path = os.path.expanduser(settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path']) - #source_path = file_path - # dest_path = os.path.join( - # local_volume_absolute_path, os.path.basename(file_path)) - elif 'SPLUNK_ES_CONTENT_UPDATE' not in settings['local_apps']: print("%s was not found in %s. We assume this is an error and shut down.\n\t" "Quitting..." % ('SPLUNK_ES_CONTENT_UPDATE', "settings['local_apps']"), file=sys.stderr) sys.exit(1) else: - # Need to generate that package + # Generate the ESCU package from this branch. source_path = generate_escu_app(settings['persist_security_content']) settings['local_apps']['SPLUNK_ES_CONTENT_UPDATE']['local_path'] = source_path - # dest_path = os.path.join( - # local_volume_absolute_path, os.path.basename(source_path)) + + # Copy all the apps, to include ESCU (whether pregenerated or just generated) copy_local_apps_to_directory( settings['local_apps'], local_volume_absolute_path) - if settings['mock']: - finish_mock(settings, all_test_files) + # If this is a mock run, finish it now + if settings['mock']: + #The function below + if finish_mock(settings, all_test_files): + # mock was successful! + print("Mock successful! Manifests generated!") + sys.exit(0) + else: + print("There was an unrecoverage error during the mock.\n\tQuitting...",file=sys.stderr) + sys.exit(1) + + + + #Add some files that always need to be copied to to container to set up indexes and datamodels. files_to_copy_to_container = OrderedDict() files_to_copy_to_container["INDEXES"] = { "local_file_path": index_file_local_path, "container_file_path": index_file_container_path} files_to_copy_to_container["DATAMODELS"] = { "local_file_path": datamodel_file_local_path, "container_file_path": datamodel_file_container_path} - mounts = [{"local_path": local_volume_absolute_path, - "container_path": "/tmp/apps", "type": "bind", "read_only": True}] + cm = container_manager.ContainerManager(all_test_files, FULL_DOCKER_HUB_CONTAINER_NAME, diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 7a2d245d1e..f6d43ee6ce 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -11,7 +11,7 @@ import requests import shutil from modules import splunk_sdk from modules import testing_service -from modules import test_driver +from modules import test_driver import time import timeit from typing import Union @@ -46,7 +46,7 @@ class SplunkContainer: self.container_password = container_password self.local_apps = local_apps self.splunkbase_apps = splunkbase_apps - + self.files_to_copy_to_container = files_to_copy_to_container self.splunk_ip = splunk_ip self.container_name = container_name @@ -74,15 +74,15 @@ class SplunkContainer: ) -> tuple[str, bool]: apps_to_install = [] require_credentials = False - + for app_name, app_info in self.local_apps.items(): - + app_file_name = os.path.basename(app_info['local_path']) app_file_container_path = os.path.join("/tmp/apps", app_file_name) apps_to_install.append(app_file_container_path) for app_name, app_info in self.splunkbase_apps.items(): - + if splunkbase_username is None or splunkbase_password is None: raise Exception( "Error: Requested app from Splunkbase but Splunkbase username and/or password were not supplied." @@ -91,12 +91,10 @@ class SplunkContainer: app_info["app_number"], app_info["app_version"]) apps_to_install.append(target) require_credentials = True - #elif app["location"] == "local": + # elif app["location"] == "local": # apps_to_install.append(app["container_path"]) return ",".join(apps_to_install), require_credentials - - def make_environment( self, local_apps: OrderedDict, @@ -221,24 +219,24 @@ class SplunkContainer: if self.container_start_time == -1: total_time_string = "NOT STARTED" else: - total_time_rounded = datetime.timedelta( seconds = - round(current_time - self.container_start_time)) + total_time_rounded = datetime.timedelta( + seconds=round(current_time - self.container_start_time)) total_time_string = str(total_time_rounded) # Time that the container setup took if self.test_start_time == -1 or self.container_start_time == -1: setup_time_string = "NOT SET UP" else: - setup_secounds_rounded = datetime.timedelta(seconds = - round(self.test_start_time - self.container_start_time)) + setup_secounds_rounded = datetime.timedelta( + seconds=round(self.test_start_time - self.container_start_time)) setup_time_string = str(setup_secounds_rounded) # Time that the tests have been running if self.test_start_time == -1 or self.num_tests_completed == 0: testing_time_string = "NO TESTS COMPLETED" else: - testing_seconds_rounded = datetime.timedelta( seconds = - round(current_time - self.test_start_time)) + testing_seconds_rounded = datetime.timedelta( + seconds=round(current_time - self.test_start_time)) # Get the approximate time per test. This is a clunky way to get rid of decimal # seconds.... but it works @@ -246,14 +244,16 @@ class SplunkContainer: timedelta_per_test_rounded = timedelta_per_test - \ datetime.timedelta( microseconds=timedelta_per_test.microseconds) - - testing_time_string = "%s (%d tests @ %s per test)"%(testing_seconds_rounded, self.num_tests_completed, timedelta_per_test_rounded) + + testing_time_string = "%s (%d tests @ %s per test)" % ( + testing_seconds_rounded, self.num_tests_completed, timedelta_per_test_rounded) summary_str = "Summary\n\t"\ "Total Time : [%s]\n\t"\ "Container Start Time: [%s]\n\t"\ - "Test Execution Time : [%s]" %(total_time_string, setup_time_string, testing_time_string) - + "Test Execution Time : [%s]" % ( + total_time_string, setup_time_string, testing_time_string) + return summary_str def wait_for_splunk_ready( @@ -364,12 +364,15 @@ class SplunkContainer: "Warning - uncaught error in detection test for [%s] - this should not happen: [%s]" % (detection_to_test, str(e)) ) + # Fill in all the "Empty" fields with default values. Otherwise, we will not be able to + # process the result correctly. self.synchronization_object.addError( {"detection_file": detection_to_test, "detection_error": str(e)} + + ) - self.num_tests_completed+=1 + self.num_tests_completed += 1 # Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1, 30)) - diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index b21d2ed960..171a524598 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -58,6 +58,15 @@ class TestDriver: self.lock.release() def addError(self, detection:dict)->None: + #Make sure that even errors have all of the required fields. + for required_field in ['search_string', 'diskUsage','runDuration', 'detection_name', 'scanCount']: + if required_field not in detection: + detection[required_field] = "" + if 'error' not in detection: + detection['error'] = True + if 'success' not in detection: + detection['success'] = False + self.lock.acquire() try: self.errors.append(detection) diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index a1084a4a44..0e80a3782d 100644 --- a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -5,14 +5,17 @@ import sys import json from modules import validate_args import os.path +from operator import itemgetter def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict)->bool: success = True + try: test_count = len(data) #Passed pass_count = len([x for x in data if x['success'] == True]) + #A failure or an error fail_only_count = len([x for x in data if x['success'] == False]) @@ -42,8 +45,9 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict "TOTAL_FAILURES": fail_only_count, "FAIL_ONLY": fail_without_error_count, "FAIL_AND_ERROR":fail_and_error_count } + data_sorted = sorted(data, key = lambda k: (-k['error'], k['success'], k['detection_file'])) with open(output_filename, "w") as jsonFile: - json.dump({'summary':summary, 'baseline': baseline, 'results':data}, jsonFile, indent=" ") + json.dump({'summary':summary, 'baseline': baseline, 'results':data_sorted}, jsonFile, indent=" ") #Generate a failure that the user can download to reproduce and test ONLY the failures locally. @@ -51,7 +55,7 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict #that succeeded! - fail_list = [os.path.join("security_content/detections",x['detection_file'] ) for x in data if x['success'] == False] + fail_list = [os.path.join("security_content/detections",x['detection_file'] ) for x in data_sorted if x['success'] == False] if len(fail_list) > 0: failures_test_override = {"detections_list": fail_list, "interactive_failure":True, @@ -61,6 +65,7 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict validate_args.validate_and_write(failures_test_override, failures) except Exception as e: print("There was an error generating [%s]: [%s]"%(output_filename, str(e)),file=sys.stderr) + print(data) raise(e) #success = False #return success, False From 868c98082b9dbd381e4d14b343c0d7b671c575c1 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 29 Nov 2021 16:49:06 -0800 Subject: [PATCH 109/203] Small change to test changes on a specific branch instead of develop. --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 9d1fb93066..65a8ed89cc 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -80,7 +80,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch develop --mode all --num_containers 10 --mock + python3 detection_testing_execution.py run --branch DetectionBaselineFixes --mode changes --num_containers 10 --mock - name: Upload Test Results Files uses: actions/upload-artifact@v2 From eb6378e805ab27b8c65355535664b9409945661e Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 30 Nov 2021 09:52:36 -0800 Subject: [PATCH 110/203] Made some changes to properly supporting testing changed test file. Had some trouble before locating the appropriate detection file. Also throw an error if we try to test a file that was changed and is in the experimental path. Set up to run a test of the DetectionBaselineFixes branch to test these changes in GitHub Actions. --- .../workflows/docker-detection-testing.yml | 30 ++++++------- .../detection_testing_execution.py | 16 ++++--- .../modules/github_service.py | 44 ++++++++++++++++--- 3 files changed, 63 insertions(+), 27 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 65a8ed89cc..aac8c1f8c9 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -275,19 +275,19 @@ jobs: automated_detection_testing/ci/detection_testing_batch/detection_failure_manifest.json - #Don't delete the intermediate files, they can be useful for debugging - # - name: Clean up intermediate Files - # uses: geekyeggo/delete-artifact@v1 - # with: - # name: | - # config_tests_0.json.results - # config_tests_1.json.results - # config_tests_2.json.results - # config_tests_3.json.results - # config_tests_4.json.results - # config_tests_5.json.results - # config_tests_6.json.results - # config_tests_7.json.results - # config_tests_8.json.results - # config_tests_9.json.results + + - name: Clean up intermediate Files + uses: geekyeggo/delete-artifact@v1 + with: + name: | + config_tests_0.json.results + config_tests_1.json.results + config_tests_2.json.results + config_tests_3.json.results + config_tests_4.json.results + config_tests_5.json.results + config_tests_6.json.results + config_tests_7.json.results + config_tests_8.json.results + config_tests_9.json.results \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 80563e57c6..7207981984 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -306,12 +306,16 @@ def main(args: list[str]): validate_args.validate_and_write( settings, output_file=None, strip_credentials=True) - all_test_files = github_service.get_test_files(settings['mode'], - settings['folders'], - settings['types'], - settings['detections_list'], - settings['detections_file']) - + try: + all_test_files = github_service.get_test_files(settings['mode'], + settings['folders'], + settings['types'], + settings['detections_list'], + settings['detections_file']) + except Exception as e: + print("Error getting test files:\n%s"%(str(e)), file=sys.stderr) + print("\tQuitting...", file=sys.stderr) + sys.exit(1) #Set up the directory that will be used to store the local apps/apps we build local_volume_absolute_path = os.path.abspath( diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index eea00800d4..1a083527bb 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -68,7 +68,7 @@ class GithubService: summary_file: str = None) -> list[str]: pruned_tests = [] csvlines = [] - + for detection in detections_to_prune: if os.path.basename(detection).startswith("ssa") and exclude_ssa: continue @@ -228,22 +228,54 @@ class GithubService: branch1, branch2), file=sys.stderr) return [] + # all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters changed_test_files = [os.path.join("security_content", name.split( '\t')[1]) for name in changed_test_files if len(name.split('\t')) == 2] changed_detection_files = [os.path.join("security_content", name.split( '\t')[1]) for name in changed_detection_files if len(name.split('\t')) == 2] - # convert the test files to the detection file equivalent + + # Convert the test files to the detection file equivalent. + # Note that some of these tests may be baselines and their associated + # detection could be in experimental or not in the experimental folder converted_test_files = [] - for test_filepath in changed_test_files: - detection_filename = str(pathlib.Path( - *pathlib.Path(test_filepath).parts[-2:])).replace("tests", "detections", 1) - converted_test_files.append(detection_filename) + #for test_filepath in changed_test_files: + # detection_filename = str(pathlib.Path( + # *pathlib.Path(test_filepath).parts[-2:])).replace("tests", "detections", 1) + # converted_test_files.append(detection_filename) + + #check and throw an error if we somehow got experimental tests + experimental_tests = [x for x in changed_test_files if 'experimental' in x] + if len(experimental_tests) > 0: + raise(Exception("Error - expected no experimental detections, but found:\n\t%s]"%("\n\t".join(experimental_tests)))) + #Get the appropriate detection file paths for a modified test file + for test_filepath in changed_test_files: + folder_and_filename = str(pathlib.Path(*pathlib.Path(test_filepath).parts[-2:])) + folder_and_filename_fixed_suffix = folder_and_filename.replace(".test.yml",".yml") + result = None + for f in glob.glob("security_content/detections/**/" + folder_and_filename_fixed_suffix,recursive=True): + if result != None: + #found a duplicate filename that matches + raise(Exception("Error - Found at least two detection files to match for test file [%s]: [%s] and [%s]"%(test_filepath, result, f))) + else: + result = f + if result is None: + raise(Exception("Error - Failed to find detection file for test file [%s]"%(test_filepath))) + else: + converted_test_files.append(result) + + + for name in converted_test_files: if name not in changed_detection_files: changed_detection_files.append(name) + + #check and throw an error if we somehow got experimental detections + experimental_detections = [x for x in changed_detection_files if 'experimental' in x] + if len(experimental_detections) > 0: + raise(Exception("Error - expected no experimental detections, but found:\n\t%s"%('\n\t'.join(experimental_detections)))) return self.prune_detections(changed_detection_files, types_to_test, previously_successful_tests) From e759f01e0c8a151b62acc01ddf4c0785fa5245cc Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 30 Nov 2021 10:16:05 -0800 Subject: [PATCH 111/203] Better command line summary of pass and fail for summarize_json.py --- .../ci/detection_testing_batch/summarize_json.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index 0e80a3782d..2aa1a7a277 100644 --- a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -7,7 +7,8 @@ from modules import validate_args import os.path from operator import itemgetter -def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict)->bool: + +def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict)->tuple[bool,int,int,int]: success = True try: @@ -70,7 +71,7 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict #success = False #return success, False - return success + return success, test_count, pass_count, fail_and_error_count @@ -98,8 +99,11 @@ try: else: all_data['results'] = data['results'] - test_pass = outputResultsJSON(args.output_filename, all_data['results'], all_data['baseline']) - print("Successfully summarized [%d] detections"%(len(all_data['results']))) + test_pass, test_count, pass_count, fail_and_error_count = outputResultsJSON(args.output_filename, all_data['results'], all_data['baseline']) + print("Summary:"\ + "\n\tTotal Tests: %d"\ + "\n\tTotal Pass : %d"\ + "\n\tTotal Fail : %d"%(test_count, pass_count, fail_and_error_count)) if not test_pass: print("Result: FAIL") sys.exit(1) From f1a10f0d65ada68b6dac638d35a6d0ef15ad3a27 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 30 Nov 2021 10:36:12 -0800 Subject: [PATCH 112/203] Upload the updated test file so we can replicate the test in the future. --- .github/workflows/docker-detection-testing.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index aac8c1f8c9..a565b48527 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -81,7 +81,7 @@ jobs: source .venv/bin/activate python3 detection_testing_execution.py run --branch DetectionBaselineFixes --mode changes --num_containers 10 --mock - + mv *-test-run.json replicate_test.json - name: Upload Test Results Files uses: actions/upload-artifact@v2 with: @@ -99,6 +99,13 @@ jobs: automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_8.json automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_9.json + - name: Upload File to Enable Replication of the Test at a Different Time or Place + uses: actions/upload-artifact@v2 + with: + name: replicate_test + path: | + automated_detection_testing/ci/detection_testing_batch/replicate_test.json + docker-detection-testing-execution: runs-on: ubuntu-latest needs: [validate-tag-if-present, quit-for-dependabot, docker-detection-testing-setup] @@ -275,9 +282,10 @@ jobs: automated_detection_testing/ci/detection_testing_batch/detection_failure_manifest.json - + #Always clean these up, they make the output messy - name: Clean up intermediate Files uses: geekyeggo/delete-artifact@v1 + if: always() with: name: | config_tests_0.json.results From 9700571e0c8889ff9da322b678bf83d47b79462f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 30 Nov 2021 13:43:25 -0800 Subject: [PATCH 113/203] Set required version of jsonschema. Added an --interactive_failure command line option. Fixed a typo and removed non required jsonschema library --- .../detection_testing_execution.py | 2 +- .../modules/new_arguments2.py | 8 +++++++- .../modules/validate_args.py | 2 -- .../detection_testing_batch/requirements.txt | 2 +- .../detection_testing_batch/summarize_json.py | 18 +++++++++--------- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 7207981984..efff34381f 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -198,7 +198,7 @@ def finish_mock(settings: dict, detections: list[str], output_file_template: str # We want to make the prior_config directory and the prior_config/apps directory os.makedirs("prior_config/apps") except FileExistsError as e: - print("Directory priorconfig/apps exists, but we just deleted it!\m\tQuitting...", file=sys.stderr) + print("Directory priorconfig/apps exists, but we just deleted it!\n\tQuitting...", file=sys.stderr) return False except Exception as e: print("Some error occured when trying to make the configs folder: [%s]\n\tQuitting..." % ( diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index 838276ce0f..e93a49e807 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -187,6 +187,12 @@ def parse(args) -> tuple[str, dict]: run_parser.add_argument("-n", "--num_containers", required=False, type=int, help="The number of Splunk containers to run or mock") + run_parser.add_argument("-i", "--interactive_failure", required=False, + action="store_true", + help="After a detection fails, pause and allow the user to log into "\ + "the Splunk server to interactively debug the failure. Wait for them "\ + "to hit enter before removing the test data and moving on to the next test.") + args = parser.parse_args() @@ -202,7 +208,7 @@ def parse(args) -> tuple[str, dict]: # set their value to something else, like None # Don't overwite booleans - if args.__dict__[key] is False and key in ["show_splunk_app_password", "mock"]: + if args.__dict__[key] is False and key in ["show_splunk_app_password", "mock", "interactive_failure"]: del args.__dict__[key] # Don't overwrite other values elif args.__dict__[key] is None and key in ["splunkbase_username", "branch", "commit_hash", diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 0602ca92d5..86a4de37ee 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -2,8 +2,6 @@ import argparse import copy import io import json -import jsonschema -import jsonschema.exceptions import modules.jsonschema_errorprinter as jsonschema_errorprinter import sys from typing import Union diff --git a/automated_detection_testing/ci/detection_testing_batch/requirements.txt b/automated_detection_testing/ci/detection_testing_batch/requirements.txt index defe6be649..e134bc79f9 100644 --- a/automated_detection_testing/ci/detection_testing_batch/requirements.txt +++ b/automated_detection_testing/ci/detection_testing_batch/requirements.txt @@ -14,4 +14,4 @@ splunk-packaging-toolkit==1.0.1 docker==5.0.3 #For help getting and parsing the configuration -jsonschema +jsonschema==4.2.1 diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index 2aa1a7a277..d55b7c46e3 100644 --- a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -18,7 +18,7 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict #A failure or an error - fail_only_count = len([x for x in data if x['success'] == False]) + fail_count = len([x for x in data if x['success'] == False]) #An error (every error is also a failure) fail_and_error_count = len([x for x in data if x['error'] == True]) @@ -32,18 +32,18 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict print("Error - a test was successful, but also included an error. This should be impossible.",file=sys.stderr) success = False - if test_count != (pass_count + fail_only_count): - print("Error - the total tests [%d] does not equal the pass[%d]/fails[%d]"%(test_count, pass_count,fail_only_count)) + if test_count != (pass_count + fail_count): + print("Error - the total tests [%d] does not equal the pass[%d]/fails[%d]"%(test_count, pass_count,fail_count)) success=False - if fail_only_count > 0: - result = "FAIL for %d detections"%(fail_only_count) + if fail_count > 0: + result = "FAIL for %d detections"%(fail_count) success = False else: result = "PASS for all %d detections"%(pass_count) summary={"TOTAL_TESTS": test_count, "TESTS_PASSED": pass_count, - "TOTAL_FAILURES": fail_only_count, "FAIL_ONLY": fail_without_error_count, + "TOTAL_FAILURES": fail_count, "FAIL_ONLY": fail_without_error_count, "FAIL_AND_ERROR":fail_and_error_count } data_sorted = sorted(data, key = lambda k: (-k['error'], k['success'], k['detection_file'])) @@ -71,7 +71,7 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict #success = False #return success, False - return success, test_count, pass_count, fail_and_error_count + return success, test_count, pass_count, fail_count @@ -99,11 +99,11 @@ try: else: all_data['results'] = data['results'] - test_pass, test_count, pass_count, fail_and_error_count = outputResultsJSON(args.output_filename, all_data['results'], all_data['baseline']) + test_pass, test_count, pass_count, fail_count = outputResultsJSON(args.output_filename, all_data['results'], all_data['baseline']) print("Summary:"\ "\n\tTotal Tests: %d"\ "\n\tTotal Pass : %d"\ - "\n\tTotal Fail : %d"%(test_count, pass_count, fail_and_error_count)) + "\n\tTotal Fail : %d"%(test_count, pass_count, fail_count)) if not test_pass: print("Result: FAIL") sys.exit(1) From fee83d2cfd05d4e9e3a0d7d2ec80f39e4a6c41a8 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 30 Nov 2021 14:22:34 -0800 Subject: [PATCH 114/203] Check for splunkbase_username and splunkbase_password immediately if Splunkbase apps are to be installed and fail with a descriptive error if they are not provided. --- .../detection_testing_execution.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index efff34381f..c990b066ba 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -287,6 +287,26 @@ def main(args: list[str]): docker.client.from_env() except Exception as e: print("Error, failed to get docker client. Is Docker Installed and Running?\n\t%s" % (str(e))) + + credentials_needed = False + credential_error = False + if len(settings['splunkbase_apps']) > 0: + credentials_needed = True + + + if settings['splunkbase_username'] == None and credentials_needed: + print("Error - you have listed apps to download from Splunkbase but have "\ + "not provided --splunkbase_username via the command line or config file.",file=sys.stderr) + credential_error = True + + if settings['splunkbase_password'] == None and credentials_needed: + print("Error - you have listed apps to download from Splunkbase but have "\ + "not provided --splunkbase_password via the command line or config file.",file=sys.stderr) + credential_error = True + + if credential_error: + print("Please supply the required credentials to continue.\n\tQuitting...",file=sys.stderr) + sys.exit(1) FULL_DOCKER_HUB_CONTAINER_NAME = "splunk/splunk:%s" % settings['container_tag'] From c9c2f7c3e37d89f2e1c119c5e3f5fd384e1e5f50 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 30 Nov 2021 19:32:52 -0800 Subject: [PATCH 115/203] Initial support for testing if a container crashes or fails to start during setup. In that case, the whole test will finish, the other containers will be stopped, and we will fail. --- .../detection_testing_execution.py | 11 +++- .../modules/container_manager.py | 15 ++++- .../modules/splunk_container.py | 58 ++++++++++++----- .../modules/splunk_sdk.py | 22 +++---- .../modules/test_driver.py | 63 +++++++++++++++++-- 5 files changed, 133 insertions(+), 36 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index c990b066ba..4e41da9a87 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -416,7 +416,16 @@ def main(args: list[str]): reuse_image=settings['reuse_image'], interactive_failure=settings['interactive_failure']) - cm.run_test() + result = cm.run_test() + + #Return code indicates whether testing succeeded and all tests were run. + #It does NOT indicate that all tests passed! + if result is True: + print("Test Execution Successful") + sys.exit(0) + else: + print("Test Execution Failed - review the logs for more details") + sys.exit(1) if __name__ == "__main__": diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 5e0cd67cc5..1794f1f6fb 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -97,7 +97,7 @@ class ContainerManager: self.baseline[key] = self.splunkbase_apps[key] - def run_test(self): + def run_test(self)->bool: self.run_containers() self.run_status_thread() for container in self.containers: @@ -116,7 +116,7 @@ class ContainerManager: duration = stop_time - self.start_time self.baseline['TEST_DURATION'] = str(duration - datetime.timedelta(microseconds=duration.microseconds)) - self.synchronization_object.finish(self.baseline) + return self.synchronization_object.finish(self.baseline) @@ -211,9 +211,18 @@ class ContainerManager: def queue_status_thread(self)->None: #This will run fo - while True: + while True: + print("running in queue status thread") + if self.synchronization_object.checkContainerFailure(): + print("One of the containers has shut down prematurely and generated an exception. Shut down the rest of the containers.") + for container in self.containers: + container.stopContainer() + print("All containers stopped") + print("return from queue status thread") + return None if self.synchronization_object.summarize() == False: #There are no more tests to run, so we can return from this thread + print("return from queue status thread") return None time.sleep(10) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index f6d43ee6ce..329876f800 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -60,9 +60,10 @@ class SplunkContainer: self.container = self.make_container() self.thread = threading.Thread(target=self.run_container, ) + - self.container_start_time = 0 - self.test_start_time = 0 + self.container_start_time = -1 + self.test_start_time = -1 self.num_tests_completed = 0 def prepare_apps_path( @@ -188,6 +189,21 @@ class SplunkContainer: ) return successful_copy + def stopContainer(self,timeout=10) -> bool: + try: + container = self.client.containers.get(self.container_name) + #Note that stopping does not remove any of the volumes or logs, + #so stopping can be useful if we want to debug any container failure + container.stop(timeout=10) + self.synchronization_object.containerFailure() + return True + + except Exception as e: + # Container does not exist, or we could not get it. Throw and error + print("Error stopping docker container [%s]"%(self.container_name)) + return False + + def removeContainer( self, removeVolumes: bool = True, forceRemove: bool = True ) -> bool: @@ -211,9 +227,6 @@ class SplunkContainer: def get_container_summary(self) -> str: current_time = timeit.default_timer() - # Get rid of the decimal (microseconds) so that we have whole seconds - if self.container_start_time is None or self.test_start_time is None: - print(self.container_start_time) # Total time the container has been running if self.container_start_time == -1: @@ -248,11 +261,11 @@ class SplunkContainer: testing_time_string = "%s (%d tests @ %s per test)" % ( testing_seconds_rounded, self.num_tests_completed, timedelta_per_test_rounded) - summary_str = "Summary\n\t"\ + summary_str = "Summary for %s\n\t"\ "Total Time : [%s]\n\t"\ "Container Start Time: [%s]\n\t"\ "Test Execution Time : [%s]" % ( - total_time_string, setup_time_string, testing_time_string) + self.container_name, total_time_string, setup_time_string, testing_time_string) return summary_str @@ -261,6 +274,7 @@ class SplunkContainer: max_seconds: int = 300, seconds_between_attempts: int = 5, ) -> bool: + # The smarter version of this will try to hit one of the pages, # probably the login page, and when that is available it means that # splunk is fully started and ready to go. Until then, we just @@ -271,18 +285,21 @@ class SplunkContainer: try: # Splunk container will not have proper ssl certificate response = requests.get( - splunk_ready_url, timeout=5, verify=False) + splunk_ready_url, timeout=seconds_between_attempts, verify=False) response.raise_for_status() return True except Exception as e: elapsed = timeit.default_timer() - start + if elapsed > max_seconds: + self.stopContainer() raise ( Exception( - "Container [%s] took longer than maximum start time of [%d].\n\tQuitting..." + "Container [%s] took longer than maximum start time of [%d].\n\tStopping container..." % (self.container_name, max_seconds) ) ) + time.sleep(seconds_between_attempts) def run_container(self) -> None: @@ -299,9 +316,7 @@ class SplunkContainer: print("Finished copying files to [%s]" % (self.container_name)) try: - while not splunk_sdk.enable_delete_for_admin( - self.splunk_ip, self.management_port, self.container_password - ): + while not splunk_sdk.enable_delete_for_admin(self.splunk_ip, self.management_port, self.container_password): time.sleep(10) except Exception as e: print( @@ -316,12 +331,25 @@ class SplunkContainer: ) self.synchronization_object.start_barrier.wait() - self.wait_for_splunk_ready() + + try: + self.wait_for_splunk_ready() + except Exception as e: + print("Error starting docker container: [%s]"%(str(e))) + return None + # Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1, 30)) + self.test_start_time = timeit.default_timer() while True: + print("%s is getting dertection"%(self.container_name)) + if self.synchronization_object.checkContainerFailure(): + self.container.stop() + print("Container [%s] successfully stopped early due to failure" % (self.container_name)) + return None + # Try to get something from the queue detection_to_test = self.synchronization_object.getTest() if detection_to_test is None: @@ -330,9 +358,7 @@ class SplunkContainer: "Container [%s] has finished running detections, time to stop the container." % (self.container_name) ) - self.container.stop() - print("Container [%s] successfully stopped" % - (self.container_name)) + # remove the container self.removeContainer() except Exception as e: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 69218ed9be..f51231ce5f 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -15,8 +15,8 @@ def enable_delete_for_admin(splunk_host, splunk_port, splunk_password): password=splunk_password ) except Exception as e: - print("Unable to connect to Splunk instance: " + str(e)) - return 1, {} + raise(Exception("Unable to connect to Splunk instance: " + str(e))) + # search and replace \\ with \\\ # search = search.replace('\\','\\\\') @@ -30,7 +30,7 @@ def enable_delete_for_admin(splunk_host, splunk_port, splunk_password): -def test_baseline_search(splunk_host, splunk_port, splunk_password, search, pass_condition, baseline_name, baseline_file, earliest_time, latest_time): +def test_baseline_search(splunk_host, splunk_port, splunk_password, search, pass_condition, baseline_name, baseline_file, earliest_time, latest_time)->dict: try: service = client.connect( host=splunk_host, @@ -39,8 +39,8 @@ def test_baseline_search(splunk_host, splunk_port, splunk_password, search, pass password=splunk_password ) except Exception as e: - print("Unable to connect to Splunk instance: " + str(e)) - return 1, {} + raise(Exception("Unable to connect to Splunk instance: " + str(e))) + # search and replace \\ with \\\ # search = search.replace('\\','\\\\') @@ -59,8 +59,8 @@ def test_baseline_search(splunk_host, splunk_port, splunk_password, search, pass try: job = service.jobs.create(splunk_search, **kwargs) except Exception as e: - print("Unable to execute baseline: " + str(e)) - return 1, {} + raise(Exception("Unable to execute baseline: " + str(e))) + test_results = dict() test_results['diskUsage'] = job['diskUsage'] @@ -104,7 +104,7 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, password=splunk_password ) except Exception as e: - print("Unable to connect to Splunk instance: " + str(e)) + print("Unable to connect to Splunk instance: " + str(e),file=sys.stderr) test_results['error'] = True return test_results @@ -152,8 +152,7 @@ def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wa password=splunk_password ) except Exception as e: - print("Unable to connect to Splunk instance: " + str(e)) - return False + raise(Exception("Unable to connect to Splunk instance: " + str(e))) #splunk_search = 'search index=test* | delete' if wait_on_delete: @@ -169,7 +168,6 @@ def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wa try: job = service.jobs.create(splunk_search, **kwargs) except Exception as e: - print("Unable to execute search: " + str(e)) - return False + raise(Exception("Unable to execute search: " + str(e))) return True \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index 171a524598..69ce72efd6 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -10,7 +10,7 @@ import threading import time import timeit from typing import Union - +import sys class TestDriver: def __init__(self, tests:list[str], num_containers:int): @@ -28,12 +28,47 @@ class TestDriver: self.errors = [] self.container_ready_time = None + #No containers have failed + self.container_failure = False + #Just make a random folder to store attack data that we donwload self.attack_data_root_folder = tempfile.mkdtemp(prefix="attack_data_", dir=os.getcwd()) print("Attack data for this run will be stored at: [%s]"%(self.attack_data_root_folder)) self.start_barrier = threading.Barrier(num_containers) + + def checkContainerFailure(self)->bool: + + self.lock.acquire() + + try: + result = self.container_failure + finally: + self.lock.release() + + + + return result + + + def containerFailure(self)->None: + self.lock.acquire() + try: + self.container_failure = True + finally: + self.lock.release() + + def getTest(self)-> Union[str,None]: + + failure = self.checkContainerFailure() + + + + if failure: + #Just return None, don't continue testing if a container crashed + return None + try: return self.testing_queue.get(block=False) except Exception as e: @@ -142,6 +177,13 @@ class TestDriver: def finish(self, baseline:OrderedDict): self.cleanup() self.outputResultsFiles(baseline) + + if self.checkContainerFailure(): + print("One or more containers crashed, so testing did not complete successfully. We wrote out the results we have") + return False + else: + return True + def cleanup(self): @@ -154,15 +196,25 @@ class TestDriver: self.lock.release() def summarize(self)->bool: + if self.checkContainerFailure() == True: + print("Error running containers... shutting down", file=sys.stderr) + return False + + self.lock.acquire() try: + current_time = timeit.default_timer() + + + if self.testing_queue.qsize() == self.total_number_of_tests: #Testing has not started yet. We are setting up containers print("***********PROGRESS UPDATE***********\n"\ - "\tWaiting for container setup: %s"%(datetime.timedelta(seconds=current_time - self.start_time))) + "\tWaiting for container setup: %s\n"%(datetime.timedelta(seconds=current_time - self.start_time))) else: + if self.container_ready_time is None: #This is the first status update since container setup has completed. Get the current time. #This makes our remaining time estimates better since that estimate should not involve @@ -210,10 +262,13 @@ class TestDriver: print("Error in printing execution summary: [%s]"%(str(e))) finally: self.lock.release() + #Return true while there are tests remaining - return (self.total_number_of_tests - - (len(self.successes) + len(self.failures) + len(self.errors)) > 0) + completed_tests = len(self.successes) + len(self.failures) + len(self.errors) + remaining_tests = self.total_number_of_tests - completed_tests + return remaining_tests > 0 + def addResult(self, result:dict)->None: From c085327a721f3ca074628f7275f11336b2cf005f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 30 Nov 2021 19:33:46 -0800 Subject: [PATCH 116/203] Change the detection testing mode to all for a test of everything. --- .github/workflows/docker-detection-testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index a565b48527..12922767be 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -80,7 +80,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch DetectionBaselineFixes --mode changes --num_containers 10 --mock + python3 detection_testing_execution.py run --branch develop --mode all --num_containers 10 --mock mv *-test-run.json replicate_test.json - name: Upload Test Results Files uses: actions/upload-artifact@v2 From 859bd9c6da7e773202ed6f9ecb92b71f09600171 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 1 Dec 2021 11:00:04 -0800 Subject: [PATCH 117/203] Some small changes dealing with errors during a test. --- .../modules/testing_service.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 4134a87c78..b8b0866d5f 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -39,15 +39,13 @@ def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:st def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_password:str, test_file:str, uuid_var, attack_data_root_folder)->Union[dict,None]: - try: - test_file_obj = load_file(os.path.join("security_content/", test_file)) - except Exception as e: - print('Error: ' + str(e)) - return None + + test_file_obj = load_file(os.path.join("security_content/", test_file)) + if not test_file_obj: print("Not test_file_obj!") - return None + raise(Exception("No test file object found for [%s]"%(test_file))) #print(test_file_obj) # write entry dynamodb @@ -75,7 +73,7 @@ def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_pa data_manipulation.manipulate_timestamp(target_file, attack_data['sourcetype'], attack_data['source']) replay_attack_dataset(container_name, splunk_password, folder_name, "main", attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) - time.sleep(30) + #time.sleep(30) result_test = {} test = test_file_obj['tests'][0] @@ -115,15 +113,14 @@ def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_pa def load_file(file_path): try: - #print("Opening file path [%s]"%(file_path)) with open(file_path, 'r', encoding="utf-8") as stream: try: file = list(yaml.safe_load_all(stream))[0] except yaml.YAMLError as exc: - raise(Exception("ERROR: reading {0}:[{1}]".format(file_path, str(exc)))) + raise(Exception("ERROR: parsing YAML for {0}:[{1}]".format(file_path, str(exc)))) except Exception as e: - raise(Exception("ERROR: reading {0}:[{1}]".format(file_path, str(e)))) + raise(Exception("ERROR: opening {0}:[{1}]".format(file_path, str(e)))) return file From 531d550b3be39dfb97b7ced6f7350f57a4fb55b6 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 1 Dec 2021 14:44:51 -0800 Subject: [PATCH 118/203] Just change the workflow to explicitly test the RegistryDetectionFixes branch. --- .github/workflows/docker-detection-testing.yml | 2 +- .../ci/detection_testing_batch/modules/container_manager.py | 1 - .../ci/detection_testing_batch/modules/splunk_container.py | 1 - .../ci/detection_testing_batch/modules/testing_service.py | 3 ++- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 12922767be..351ba245f9 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -80,7 +80,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch develop --mode all --num_containers 10 --mock + python3 detection_testing_execution.py run --branch RegistryDetectionFixes --mode changes --num_containers 10 --mock mv *-test-run.json replicate_test.json - name: Upload Test Results Files uses: actions/upload-artifact@v2 diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 1794f1f6fb..15d82b7842 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -212,7 +212,6 @@ class ContainerManager: def queue_status_thread(self)->None: #This will run fo while True: - print("running in queue status thread") if self.synchronization_object.checkContainerFailure(): print("One of the containers has shut down prematurely and generated an exception. Shut down the rest of the containers.") for container in self.containers: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 329876f800..e0462d2b23 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -344,7 +344,6 @@ class SplunkContainer: self.test_start_time = timeit.default_timer() while True: - print("%s is getting dertection"%(self.container_name)) if self.synchronization_object.checkContainerFailure(): self.container.stop() print("Container [%s] successfully stopped early due to failure" % (self.container_name)) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index b8b0866d5f..5ab9271bfa 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -73,7 +73,8 @@ def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_pa data_manipulation.manipulate_timestamp(target_file, attack_data['sourcetype'], attack_data['source']) replay_attack_dataset(container_name, splunk_password, folder_name, "main", attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) - #time.sleep(30) + #Allow some time for the data to be ingested and processed + time.sleep(60) result_test = {} test = test_file_obj['tests'][0] From 6457b505db7a1f1c3a70d4f3c7b02d6c819a0e16 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 1 Dec 2021 15:58:31 -0800 Subject: [PATCH 119/203] When there is an error checking out a git PR. If the PR number is bad, we will exit. Also updated the CI/CD to test all of develop again. We will look at the results after we have increased the wait time after loading data a bit. --- .github/workflows/docker-detection-testing.yml | 2 +- .../detection_testing_execution.py | 10 +++++++--- .../detection_testing_batch/modules/github_service.py | 4 +++- .../ci/detection_testing_batch/modules/splunk_sdk.py | 1 - 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 351ba245f9..12922767be 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -80,7 +80,7 @@ jobs: cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python3 detection_testing_execution.py run --branch RegistryDetectionFixes --mode changes --num_containers 10 --mock + python3 detection_testing_execution.py run --branch develop --mode all --num_containers 10 --mock mv *-test-run.json replicate_test.json - name: Upload Test Results Files uses: actions/upload-artifact@v2 diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 4e41da9a87..7efbdc1675 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -317,9 +317,13 @@ def main(args: list[str]): "[%d]. We will do what you asked, but be warned!" % (settings['num_containers'], MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING)) # Check out security content if required - github_service = ensure_security_content( - settings['branch'], settings['commit_hash'], settings['pr_number'], settings['persist_security_content']) - settings['commit_hash'] = github_service.commit_hash + try: + github_service = ensure_security_content( + settings['branch'], settings['commit_hash'], settings['pr_number'], settings['persist_security_content']) + settings['commit_hash'] = github_service.commit_hash + except Exception as e: + print("Failure checking out git repository: %s\n\tQuitting",file=sys.stderr) + sys.exit(1) # Make a backup of this config containing the hash and stripped credentials. # This makes the test perfectly reproducible. diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 1a083527bb..15f5e5acf7 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -37,8 +37,10 @@ class GithubService: sys.exit() elif PR_number: - subprocess.call(["git", "-C", "security_content/", "fetch", "origin", + ret = subprocess.call(["git", "-C", "security_content/", "fetch", "origin", "refs/pull/%d/head:%s" % (PR_number, security_content_branch)]) + if ret != 0: + raise(Exception("Error checking out repository")) # No checking to see if the hash is to a commit inside of the branch - the user # has to do that by hand diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index f51231ce5f..2294b27501 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -122,7 +122,6 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, test_results['error'] = True return test_results - test_results['diskUsage'] = job['diskUsage'] test_results['runDuration'] = job['runDuration'] test_results['detection_name'] = detection_name From 17726fcdff84449bb950330f4649fb824cf2bd45 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Thu, 2 Dec 2021 10:00:01 -0800 Subject: [PATCH 120/203] Running a test with the old sysmon to compare the results. --- .../ci/detection_testing_batch/modules/validate_args.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 86a4de37ee..b8dc120639 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -177,9 +177,9 @@ setup_schema = { "app_number": 833, "app_version": "8.3.1" }, - "SPLUNK_ADD_ON_FOR_SYSMON": { - "app_number": 5709, - "app_version": "1.0.1" + "SPLUNK_ADD_ON_FOR_SYSMON_OLD": { + "app_number": 1914, + "app_version": "10.6.2" }, "SPLUNK_COMMON_INFORMATION_MODEL": { "app_number": 1621, From 9be4d1a4eb04bafd026b00ac9acb2391a1330194 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 6 Dec 2021 11:41:35 -0800 Subject: [PATCH 121/203] Large changes to json validation for local_apps. json validation was wrong. also changed CI to run on push and on PR using the new CI job! Note that it will still require lots of testing. --- .github/workflows/build-and-validate.yml | 282 +++++++++++++++++- .../workflows/docker-detection-testing.yml | 62 ++-- .../modules/splunk_container.py | 6 +- .../modules/testing_service.py | 2 +- .../modules/validate_args.py | 130 ++++---- .../test_config_github_actions.json | 91 ++++++ 6 files changed, 494 insertions(+), 79 deletions(-) create mode 100644 automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index 9943233b53..a3946e7b33 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -293,7 +293,287 @@ jobs: build/DA-ESS_AmazonWebServices_Content-latest.tar.gz build/dev_sec_ops_analytics-latest.tar.gz build/checksum.txt - + + + docker-detection-testing-setup: + runs-on: ubuntu-latest + needs: [build-package] + steps: + - name: Get branch and PR required for detection testing main.py + id: vars + run: | + echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" + + - name: Checkout Repo + uses: actions/checkout@v2 + + #- name: Install requirements for installing slim during execution + # run: | + # sudo apt update -qq + # #python2.7 needed for slim, for now + # sudo apt install python2 + # sudo apt install virtualenv + # curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + # sudo python2.7 get-pip.py + + # Get the previously built ESCU + - name: Get ESCU + uses: actions/download-artifact@v2 + with: + name: content-latest + path: automated_detection_testing/ci/detection_testing_batch/prior_config/apps + + - uses: actions/setup-python@v2 + with: + python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install Python Dependencies + run: | + cd automated_detection_testing/ci/detection_testing_batch + python3 -m venv .venv + source .venv/bin/activate + python3 -m pip install wheel + python3 -m pip install -r requirements.txt + + - name: Run the CI + run: | + cd automated_detection_testing/ci/detection_testing_batch + source .venv/bin/activate + echo "github.event.issue.pull_request : [${{ github.event.issue.pull_request }}]" + echo "github.event.pull_request.number : [${{ github.event.pull_request.number }}]" + echo "steps.vars.outputs.branch : [${{ steps.vars.outputs.branch }}]" + echo "github.event.pull_request.head.ref: [${{ github.event.pull_request.head.ref }}]" + + ls -lahr prior_config + if [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then + echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" + python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_fig test_config_github_actions.json + else + echo "Push from branch [${{ steps.vars.outputs.branch }}]" + python detection_testing_execution.py run --branch [${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json + fi + + mv *-test-run.json replicate_test.json + - name: Upload Test Results Files + uses: actions/upload-artifact@v2 + with: + name: testing-results-config + path: | + automated_detection_testing/ci/detection_testing_batch/prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_0.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_1.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_2.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_3.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_4.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_5.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_6.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_7.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_8.json + automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_9.json + + - name: Upload File to Enable Replication of the Test at a Different Time or Place + uses: actions/upload-artifact@v2 + with: + name: replicate_test + path: | + automated_detection_testing/ci/detection_testing_batch/replicate_test.json + + docker-detection-testing-execution: + runs-on: ubuntu-latest + needs: [docker-detection-testing-setup] + strategy: + matrix: + manifest_filename: ["config_tests_0.json", + "config_tests_1.json", + "config_tests_2.json", + "config_tests_3.json", + "config_tests_4.json", + "config_tests_5.json", + "config_tests_6.json", + "config_tests_7.json", + "config_tests_8.json", + "config_tests_9.json"] + steps: + - name: Get branch and PR required for detection testing main.py + id: vars + run: | + echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" + + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: testing-results-config + path: automated_detection_testing/ci/detection_testing_batch/prior_config + # - name: Install Docker + # run: | + # sudo apt update -qq + + + # #python2.7 needed for slim, for now + # sudo apt install python2 + # sudo apt install virtualenv + # curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + # sudo python2.7 get-pip.py + + - uses: actions/setup-python@v2 + with: + python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install Python Dependencies + run: | + cd automated_detection_testing/ci/detection_testing_batch + python3 -m venv .venv + source .venv/bin/activate + python3 -m pip install wheel + python3 -m pip install -r requirements.txt + + - name: Run the CI + run: | + cd automated_detection_testing/ci/detection_testing_batch + source .venv/bin/activate + + python3 detection_testing_execution.py run -c prior_config/${{ matrix.manifest_filename}} --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} + + + - name: Upload Test Results Files + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.manifest_filename}}.results + path: | + automated_detection_testing/ci/detection_testing_batch/success.csv + automated_detection_testing/ci/detection_testing_batch/error.csv + automated_detection_testing/ci/detection_testing_batch/failure.csv + automated_detection_testing/ci/detection_testing_batch/combined.csv + automated_detection_testing/ci/detection_testing_batch/success.json + automated_detection_testing/ci/detection_testing_batch/error.json + automated_detection_testing/ci/detection_testing_batch/failure.json + automated_detection_testing/ci/detection_testing_batch/combined.json + + docker-detection-testing-execution-merge-results: + runs-on: ubuntu-latest + needs: [docker-detection-testing-setup, docker-detection-testing-execution] + + steps: + - name: Get branch and PR required for detection testing main.py + id: vars + run: | + echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" + + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_0.json.results + path: automated_detection_testing/ci/detection_testing_batch/results_0 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_1.json.results + path: automated_detection_testing/ci/detection_testing_batch/results_1 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_2.json.results + path: automated_detection_testing/ci/detection_testing_batch/results_2 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_3.json.results + path: automated_detection_testing/ci/detection_testing_batch/results_3 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_4.json.results + path: automated_detection_testing/ci/detection_testing_batch/results_4 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_5.json.results + path: automated_detection_testing/ci/detection_testing_batch/results_5 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_6.json.results + path: automated_detection_testing/ci/detection_testing_batch/results_6 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_7.json.results + path: automated_detection_testing/ci/detection_testing_batch/results_7 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_8.json.results + path: automated_detection_testing/ci/detection_testing_batch/results_8 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_9.json.results + path: automated_detection_testing/ci/detection_testing_batch/results_9 + + - uses: actions/setup-python@v2 + with: + python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install Python Dependencies + run: | + cd automated_detection_testing/ci/detection_testing_batch + python3 -m venv .venv + source .venv/bin/activate + python3 -m pip install wheel + python3 -m pip install -r requirements.txt + + - name: Merge Detections into single File + run: | + cd automated_detection_testing/ci/detection_testing_batch + source .venv/bin/activate + python summarize_json.py --files results_*/combined.json --output_filename summary_test_results.json + + + - name: Upload Summary Test Results JSON + uses: actions/upload-artifact@v2 + if: always() + with: + name: SummaryTestResults + path: | + automated_detection_testing/ci/detection_testing_batch/summary_test_results.json + + - name: Upload Failures Manifest on Failure + uses: actions/upload-artifact@v2 + if: failure() + with: + name: DetectionFailureManifest + path: | + automated_detection_testing/ci/detection_testing_batch/detection_failure_manifest.json + + + #Always clean these up, they make the output messy + - name: Clean up intermediate Files + uses: geekyeggo/delete-artifact@v1 + if: always() + with: + name: | + config_tests_0.json.results + config_tests_1.json.results + config_tests_2.json.results + config_tests_3.json.results + config_tests_4.json.results + config_tests_5.json.results + config_tests_6.json.results + config_tests_7.json.results + config_tests_8.json.results + config_tests_9.json.results + + + #Everything below this line should ONLY run on a tag and nothing else #We still want all of the above checks to run and pass before running these diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml index 12922767be..d898d65180 100644 --- a/.github/workflows/docker-detection-testing.yml +++ b/.github/workflows/docker-detection-testing.yml @@ -1,11 +1,12 @@ name: docker-detection-testing on: - push: + #push: + #pull_request: #run nightly at 0500 UTC #Note the scheduled workflows will only run if the Action has #been committed to the default branch (develop) - schedule: - - cron: "0 5 * * *" + #schedule: + # - cron: "0 5 * * *" jobs: validate-tag-if-present: @@ -53,14 +54,21 @@ jobs: - name: Checkout Repo uses: actions/checkout@v2 - - name: Install requirements for installing slim during execution - run: | - sudo apt update -qq - #python2.7 needed for slim, for now - sudo apt install python2 - sudo apt install virtualenv - curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py - sudo python2.7 get-pip.py + #- name: Install requirements for installing slim during execution + # run: | + # sudo apt update -qq + # #python2.7 needed for slim, for now + # sudo apt install python2 + # sudo apt install virtualenv + # curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + # sudo python2.7 get-pip.py + + # Get the previously built ESCU + - name: Get ESCU + uses: actions/download-artifact@v2 + with: + name: content-latest + path: automated_detection_testing/ci/detection_testing_batch/prior_config/apps - uses: actions/setup-python@v2 with: @@ -79,8 +87,20 @@ jobs: run: | cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - - python3 detection_testing_execution.py run --branch develop --mode all --num_containers 10 --mock + echo "github.event.issue.pull_request : [${{ github.event.issue.pull_request }}]" + echo "github.event.pull_request.number : [${{ github.event.pull_request.number }}]" + echo "steps.vars.outputs.branch : [${{ steps.vars.outputs.branch }}]" + echo "github.event.pull_request.head.ref: [${{ github.event.pull_request.head.ref }}]" + + ls -lahr prior_config + if [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then + echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" + python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_fig test_config_github_actions.json + else + echo "Push from branch [${{ steps.vars.outputs.branch }}]" + python detection_testing_execution.py run --branch [${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json + fi + mv *-test-run.json replicate_test.json - name: Upload Test Results Files uses: actions/upload-artifact@v2 @@ -135,16 +155,16 @@ jobs: with: name: testing-results-config path: automated_detection_testing/ci/detection_testing_batch/prior_config - - name: Install Docker - run: | - sudo apt update -qq + # - name: Install Docker + # run: | + # sudo apt update -qq - #python2.7 needed for slim, for now - sudo apt install python2 - sudo apt install virtualenv - curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py - sudo python2.7 get-pip.py + # #python2.7 needed for slim, for now + # sudo apt install python2 + # sudo apt install virtualenv + # curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py + # sudo python2.7 get-pip.py - uses: actions/setup-python@v2 with: diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index e0462d2b23..2b00b0ad0c 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -77,7 +77,6 @@ class SplunkContainer: require_credentials = False for app_name, app_info in self.local_apps.items(): - app_file_name = os.path.basename(app_info['local_path']) app_file_container_path = os.path.join("/tmp/apps", app_file_name) apps_to_install.append(app_file_container_path) @@ -94,6 +93,8 @@ class SplunkContainer: require_credentials = True # elif app["location"] == "local": # apps_to_install.append(app["container_path"]) + + print(apps_to_install) return ",".join(apps_to_install), require_credentials def make_environment( @@ -337,7 +338,8 @@ class SplunkContainer: except Exception as e: print("Error starting docker container: [%s]"%(str(e))) return None - + input("CONTAINTER WANTS TO START.... WAIT FOR INPUT FROM USER") + # Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1, 30)) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 5ab9271bfa..f45e649fe7 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -74,7 +74,7 @@ def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_pa replay_attack_dataset(container_name, splunk_password, folder_name, "main", attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) #Allow some time for the data to be ingested and processed - time.sleep(60) + time.sleep(30) result_test = {} test = test_file_obj['tests'][0] diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index b8dc120639..28ac4a9105 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -17,7 +17,7 @@ setup_schema = { "default": "develop" }, "commit_hash": { - "type": ["string","null"], + "type": ["string", "null"], "default": None }, @@ -44,38 +44,58 @@ setup_schema = { "default": None }, + "local_apps": { "type": "object", - "properties": { - "value": { - "type": "string", + "additionalProperties": False, + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": False, "properties": { - "app_name": { - "type": "string" + "app_number": { + "type": [ + "integer", + "null" + ] + }, + "app_version": { + "type": [ + "string", + "null" + ] + }, + "local_path": { + "type": [ + "string", + "null" + ] + }, + "http_path": { + "type": [ + "string" + ] + } }, - "app_number": { - "type": "integer" - }, - "app_version": { - "type": ["string", "null"] - }, - "local_path": { - "type": ["string", "null"], - "default": None - }, - } + "oneOf": [ + {"required": ["local_path"]}, + {"required": ["http_path"]} + ] } }, "default": { - "SPLUNK_ES_CONTENT_UPDATE": { - "app_number": 3449, - "app_version": None, - 'local_path': None - } + "SPLUNK_ES_CONTENT_UPDATE": { + "app_number": 3449, + "app_version": None, + "local_path": None + } } }, + + + "mode": { "type": "string", "enum": ["changes", "selected", "all"], @@ -109,24 +129,26 @@ setup_schema = { }, + + "splunkbase_apps": { "type": "object", - "properies": { - "value": - { - "type": "string", - "properties": { - "app_number": { - "type": "integer" - }, - "app_version": { - "type": "string" + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": False, + "properties": { + "app_number": { + "type": "integer" + }, + "app_version": { + "type": "string" + } + } } - } - } }, "default": { - "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES":{ + "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES": { "app_number": 1876, "app_version": "5.2.0" }, @@ -177,10 +199,11 @@ setup_schema = { "app_number": 833, "app_version": "8.3.1" }, - "SPLUNK_ADD_ON_FOR_SYSMON_OLD": { - "app_number": 1914, - "app_version": "10.6.2" + "SPLUNK_ADD_ON_FOR_SYSMON": { + "app_number": 5709, + "app_version": "1.0.1" }, + # According to https://docs.splunk.com/Documentation/ES/6.6.2/Install/Datamodels, these are included in ES. Don't install separately. "SPLUNK_COMMON_INFORMATION_MODEL": { "app_number": 1621, "app_version": "4.20.2" @@ -246,11 +269,10 @@ def validate_file(file: io.TextIOWrapper) -> tuple[Union[dict, None], dict]: def check_dependencies(settings: dict) -> bool: # Check complex mode dependencies error_free = True - - + if settings['mode'] == 'selected': # Make sure that exactly one of the following fields is populated - + if settings['detections_file'] == None and settings['detections_list'] == None: print("Error - mode was 'selected' but no detections_list or detections_file were supplied.", file=sys.stderr) error_free = False @@ -263,21 +285,21 @@ def check_dependencies(settings: dict) -> bool: elif settings['mode'] != 'selected' and settings['detections_list'] != None: print("Error - mode was not 'selected' but detections_list was supplied.", file=sys.stderr) error_free = False - + # Returns true if there are not errors return error_free -def validate_and_write(configuration: dict, output_file: Union[io.TextIOWrapper,None]=None, strip_credentials:bool=False) -> tuple[Union[dict, None], dict]: +def validate_and_write(configuration: dict, output_file: Union[io.TextIOWrapper, None] = None, strip_credentials: bool = False) -> tuple[Union[dict, None], dict]: closeFile = False if output_file is None: import datetime now = datetime.datetime.now() - configname = now.strftime('%Y-%m-%dT%H:%M:%S%z') + '-test-run.json' + configname = now.strftime('%Y-%m-%dT%H:%M:%S%z') + '-test-run.json' output_file = open(configname, "w") closeFile = True - if strip_credentials: + if strip_credentials: configuration = copy.deepcopy(configuration) configuration['splunkbase_password'] = None configuration['splunkbase_username'] = None @@ -306,17 +328,18 @@ def validate(configuration: dict) -> tuple[Union[dict, None], dict]: # v = jsonschema.Draft201909Validator(argument_schema) try: - + validation_errors, validated_json = jsonschema_errorprinter.check_json( configuration, setup_schema) - + if len(validation_errors) == 0: - #check to make sure there were no complex errors + # check to make sure there were no complex errors no_complex_errors = check_dependencies(validated_json) if no_complex_errors: return validated_json, setup_schema else: - print("Validation failed due to error(s) listed above.", file=sys.stderr) + print("Validation failed due to error(s) listed above.", + file=sys.stderr) return None, setup_schema else: print("[%d] failures detected during validation of the configuration!" % ( @@ -324,9 +347,8 @@ def validate(configuration: dict) -> tuple[Union[dict, None], dict]: for error in validation_errors: print(error, end="\n\n", file=sys.stderr) return None, setup_schema - - except Exception as e: - print("There was an error validation the configuration: [%s]"%(str(e)), file=sys.stderr) - return None, setup_schema - \ No newline at end of file + except Exception as e: + print("There was an error validation the configuration: [%s]" % ( + str(e)), file=sys.stderr) + return None, setup_schema diff --git a/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json b/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json new file mode 100644 index 0000000000..c14dc8fe03 --- /dev/null +++ b/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json @@ -0,0 +1,91 @@ +{ + "branch": "BRANCH_DOES_NOT_EXIST_USE_CLI_ARGUMENT", + "commit_hash": null, + "container_tag": "latest", + "detections_file": null, + "detections_list": null, + "folders": [ + "endpoint", + "cloud", + "network" + ], + "interactive_failure": false, + "local_apps": { + "SPLUNK_ES_CONTENT_UPDATE": { + "app_number": 3449, + "app_version": null, + "local_path": "prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz" + } + }, + "local_base_container_name": "splunk_test_%d", + "mock": false, + "mode": "changes", + "num_containers": 10, + "persist_security_content": false, + "pr_number": null, + "reuse_image": true, + "show_splunk_app_password": false, + "splunk_app_password": null, + "splunk_container_apps_directory": "/opt/splunk/etc/apps", + "splunkbase_apps": { + "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT": { + "app_number": 2882, + "app_version": "2.0.2" + }, + "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE": { + "app_number": 3719, + "app_version": "1.3.2" + }, + "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES": { + "app_number": 1876, + "app_version": "5.2.0" + }, + "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365": { + "app_number": 4055, + "app_version": "2.2.0" + }, + "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS": { + "app_number": 5238, + "app_version": "8.0.1" + }, + "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA": { + "app_number": 5234, + "app_version": "8.0.1" + }, + "SPLUNK_ADD_ON_FOR_SYSMON": { + "app_number": 5709, + "app_version": "1.0.1" + }, + "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX": { + "app_number": 833, + "app_version": "8.3.1" + }, + "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO": { + "app_number": 1617, + "app_version": "4.0.0" + }, + "SPLUNK_ANALYTIC_STORY_EXECUTION_APP": { + "app_number": 4971, + "app_version": "2.0.3" + }, + "SPLUNK_APP_FOR_STREAM": { + "app_number": 1809, + "app_version": "8.0.1" + }, + "SPLUNK_COMMON_INFORMATION_MODEL": { + "app_number": 1621, + "app_version": "4.20.2" + }, + "SPLUNK_MACHINE_LEARNING_TOOLKIT": { + "app_number": 2890, + "app_version": "5.2.2" + } + }, + "splunkbase_password": null, + "splunkbase_username": null, + "types": [ + "Anomaly", + "Hunting", + "TTP" + ] +} From 652355a1245673ae901e9847df59992866cfbb1c Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 6 Dec 2021 11:51:14 -0800 Subject: [PATCH 122/203] Typo in branch name caused an error during checking. --- .github/workflows/build-and-validate.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index a3946e7b33..c1dd26f5ab 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -343,7 +343,7 @@ jobs: echo "github.event.issue.pull_request : [${{ github.event.issue.pull_request }}]" echo "github.event.pull_request.number : [${{ github.event.pull_request.number }}]" echo "steps.vars.outputs.branch : [${{ steps.vars.outputs.branch }}]" - echo "github.event.pull_request.head.ref: [${{ github.event.pull_request.head.ref }}]" + echo "github.event.pull_request.head.ref : [${{ github.event.pull_request.head.ref }}]" ls -lahr prior_config if [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then @@ -351,7 +351,7 @@ jobs: python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_fig test_config_github_actions.json else echo "Push from branch [${{ steps.vars.outputs.branch }}]" - python detection_testing_execution.py run --branch [${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json + python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json fi mv *-test-run.json replicate_test.json From e453ffefb8a857f2f149be309dac986d67eaa454 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 6 Dec 2021 11:55:08 -0800 Subject: [PATCH 123/203] More verbose error message if the Git checkout fails. --- .../ci/detection_testing_batch/detection_testing_execution.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 7efbdc1675..1c35e6f0bd 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -322,7 +322,8 @@ def main(args: list[str]): settings['branch'], settings['commit_hash'], settings['pr_number'], settings['persist_security_content']) settings['commit_hash'] = github_service.commit_hash except Exception as e: - print("Failure checking out git repository: %s\n\tQuitting",file=sys.stderr) + print("Failure checking out git repository:\n\t\n\tHash: [%s]\n\tBranch: [%s]\n\tPR: [%s]\n\tQuitting"% + (settings['commit_hash'],settings['branch'],settings['pr_number']),file=sys.stderr) sys.exit(1) # Make a backup of this config containing the hash and stripped credentials. From f19c7c08f21d9eef2f9eb9590e1b30cc3a2bbebd Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 6 Dec 2021 12:29:04 -0800 Subject: [PATCH 124/203] touched a detection and a test to see if the ci runs correctly. --- detections/endpoint/7zip_commandline_to_smb_share_path.yml | 2 +- tests/endpoint/access_lsass_memory_for_dump_creation.test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/detections/endpoint/7zip_commandline_to_smb_share_path.yml b/detections/endpoint/7zip_commandline_to_smb_share_path.yml index 7a6633a5b3..1138658414 100644 --- a/detections/endpoint/7zip_commandline_to_smb_share_path.yml +++ b/detections/endpoint/7zip_commandline_to_smb_share_path.yml @@ -2,7 +2,7 @@ name: 7zip CommandLine To SMB Share Path id: 01d29b48-ff6f-11eb-b81e-acde48001122 version: 1 date: '2021-08-17' -author: Teoderick Contreras, Splunk +author: Teoderick Contreras, Splunk TESTCHANGES type: Hunting datamodel: - Endpoint diff --git a/tests/endpoint/access_lsass_memory_for_dump_creation.test.yml b/tests/endpoint/access_lsass_memory_for_dump_creation.test.yml index 32e5fb0e48..b8f4ee4ec8 100644 --- a/tests/endpoint/access_lsass_memory_for_dump_creation.test.yml +++ b/tests/endpoint/access_lsass_memory_for_dump_creation.test.yml @@ -1,4 +1,4 @@ -name: Access LSASS Memory for Dump Creation Unit Test +name: Access LSASS Memory for Dump Creation Unit Test TESTCHANGES tests: - name: Access LSASS Memory for Dump Creation file: endpoint/access_lsass_memory_for_dump_creation.yml From 20bc63c34d2f25159e3e31d640efab5a58518f3d Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 6 Dec 2021 14:06:11 -0800 Subject: [PATCH 125/203] Forgot to remove a wait for user input. Removed and running again. --- .../ci/detection_testing_batch/detection_testing_execution.py | 3 ++- .../ci/detection_testing_batch/modules/splunk_container.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 1c35e6f0bd..35a8bed3d2 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -238,7 +238,8 @@ def finish_mock(settings: dict, detections: list[str], output_file_template: str # Pass in the list of detections to run mock_settings['detections_list'] = normalized_detection_names - # We want to persist security content and run with the escu package that we created + # We want to persist security content and run with the escu package that we created. + #Note that if we haven't checked this out yet, we will check it out for you. mock_settings['persist_security_content'] = True mock_settings['mock'] = False diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 2b00b0ad0c..a27dd9b509 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -338,7 +338,7 @@ class SplunkContainer: except Exception as e: print("Error starting docker container: [%s]"%(str(e))) return None - input("CONTAINTER WANTS TO START.... WAIT FOR INPUT FROM USER") + #input("CONTAINTER WANTS TO START.... WAIT FOR INPUT FROM USER") # Sleep for a small random time so that containers drift apart and don't synchronize their testing From 2981a9c592635928d662a585de96c81624ef0ac2 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 6 Dec 2021 14:37:24 -0800 Subject: [PATCH 126/203] added a check to see if we are running on develop, meaning that it is a nightly job. Also, added a cron job to fun of 04:44 UTC. GitHub recommends against the top of the hour because load is higher at that time. --- .github/workflows/build-and-validate.yml | 10 ++++++++-- .../endpoint/7zip_commandline_to_smb_share_path.yml | 2 +- .../access_lsass_memory_for_dump_creation.test.yml | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index c1dd26f5ab..fa86376384 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -17,6 +17,8 @@ on: push: pull_request: types: [opened, reopened] + schedule: + - cron: "44 4 * * *" jobs: validate-tag-if-present: runs-on: ubuntu-latest @@ -346,9 +348,13 @@ jobs: echo "github.event.pull_request.head.ref : [${{ github.event.pull_request.head.ref }}]" ls -lahr prior_config - if [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then + + if [[ ${{ steps.vars.outputs.branch == develop }} ]] + echo "Running a nightly test on all detections" + python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode all --mock --config_file test_config_github_actions.json + elif [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" - python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_fig test_config_github_actions.json + python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_file test_config_github_actions.json else echo "Push from branch [${{ steps.vars.outputs.branch }}]" python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json diff --git a/detections/endpoint/7zip_commandline_to_smb_share_path.yml b/detections/endpoint/7zip_commandline_to_smb_share_path.yml index 1138658414..7a6633a5b3 100644 --- a/detections/endpoint/7zip_commandline_to_smb_share_path.yml +++ b/detections/endpoint/7zip_commandline_to_smb_share_path.yml @@ -2,7 +2,7 @@ name: 7zip CommandLine To SMB Share Path id: 01d29b48-ff6f-11eb-b81e-acde48001122 version: 1 date: '2021-08-17' -author: Teoderick Contreras, Splunk TESTCHANGES +author: Teoderick Contreras, Splunk type: Hunting datamodel: - Endpoint diff --git a/tests/endpoint/access_lsass_memory_for_dump_creation.test.yml b/tests/endpoint/access_lsass_memory_for_dump_creation.test.yml index b8f4ee4ec8..32e5fb0e48 100644 --- a/tests/endpoint/access_lsass_memory_for_dump_creation.test.yml +++ b/tests/endpoint/access_lsass_memory_for_dump_creation.test.yml @@ -1,4 +1,4 @@ -name: Access LSASS Memory for Dump Creation Unit Test TESTCHANGES +name: Access LSASS Memory for Dump Creation Unit Test tests: - name: Access LSASS Memory for Dump Creation file: endpoint/access_lsass_memory_for_dump_creation.yml From 3de3ffeadadbf141ee45792a6c2f6dd30dce8373 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 6 Dec 2021 14:44:27 -0800 Subject: [PATCH 127/203] Brace in wrong location - around non environment variable --- .github/workflows/build-and-validate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index fa86376384..ba91447608 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -349,7 +349,7 @@ jobs: ls -lahr prior_config - if [[ ${{ steps.vars.outputs.branch == develop }} ]] + if [[ ${{ steps.vars.outputs.branch }} == develop ]] echo "Running a nightly test on all detections" python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode all --mock --config_file test_config_github_actions.json elif [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then From 14e548c65a044025d3dcee3c8187a06aec06716e Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 6 Dec 2021 14:54:58 -0800 Subject: [PATCH 128/203] More changes to CI. Fixed a bash typo and removed the docker-detection-testing.yml since it has been integrated into build-and-validate. --- .github/workflows/build-and-validate.yml | 2 +- .../workflows/docker-detection-testing.yml | 321 ------------------ .../ci/detection_testing_batch/Dockerfile | 16 - 3 files changed, 1 insertion(+), 338 deletions(-) delete mode 100644 .github/workflows/docker-detection-testing.yml delete mode 100644 automated_detection_testing/ci/detection_testing_batch/Dockerfile diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index ba91447608..43fb214ce3 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -349,7 +349,7 @@ jobs: ls -lahr prior_config - if [[ ${{ steps.vars.outputs.branch }} == develop ]] + if [[ ${{ steps.vars.outputs.branch }} == develop ]]; then echo "Running a nightly test on all detections" python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode all --mock --config_file test_config_github_actions.json elif [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then diff --git a/.github/workflows/docker-detection-testing.yml b/.github/workflows/docker-detection-testing.yml deleted file mode 100644 index d898d65180..0000000000 --- a/.github/workflows/docker-detection-testing.yml +++ /dev/null @@ -1,321 +0,0 @@ -name: docker-detection-testing -on: - #push: - #pull_request: - #run nightly at 0500 UTC - #Note the scheduled workflows will only run if the Action has - #been committed to the default branch (develop) - #schedule: - # - cron: "0 5 * * *" -jobs: - - validate-tag-if-present: - runs-on: ubuntu-latest - - steps: - - name: TAGGED, Validate that the tag is in the correct format - - run: | - echo "The GITHUB_REF: $GITHUB_REF" - #First check to see if the release is a tag - if [[ $GITHUB_REF =~ refs/tags/* ]]; then - #Yes, this is a tag, so we need to test to make sure that the tag - #is in the correct format (like v1.10.20) - if [[ $GITHUB_REF =~ refs/tags/v[0-9]+.[0-9]+.[0-9]+ ]]; then - echo "PASS: Tagged release with good format" - exit 0 - else - echo "FAIL: Tagged release with bad format" - exit 1 - fi - else - echo "PASS: Not a tagged release" - exit 0 - fi - - quit-for-dependabot: - runs-on: ubuntu-latest - if: github.actor != 'dependabot[bot]' && github.actor != 'dependabot-preview[bot]' - steps: - - name: "Placeholder" - run: | - echo "No, this is not a dependabot run!" - - - docker-detection-testing-setup: - runs-on: ubuntu-latest - needs: [validate-tag-if-present, quit-for-dependabot] - steps: - - name: Get branch and PR required for detection testing main.py - id: vars - run: | - echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" - - - name: Checkout Repo - uses: actions/checkout@v2 - - #- name: Install requirements for installing slim during execution - # run: | - # sudo apt update -qq - # #python2.7 needed for slim, for now - # sudo apt install python2 - # sudo apt install virtualenv - # curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py - # sudo python2.7 get-pip.py - - # Get the previously built ESCU - - name: Get ESCU - uses: actions/download-artifact@v2 - with: - name: content-latest - path: automated_detection_testing/ci/detection_testing_batch/prior_config/apps - - - uses: actions/setup-python@v2 - with: - python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy - architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified - - - name: Install Python Dependencies - run: | - cd automated_detection_testing/ci/detection_testing_batch - python3 -m venv .venv - source .venv/bin/activate - python3 -m pip install wheel - python3 -m pip install -r requirements.txt - - - name: Run the CI - run: | - cd automated_detection_testing/ci/detection_testing_batch - source .venv/bin/activate - echo "github.event.issue.pull_request : [${{ github.event.issue.pull_request }}]" - echo "github.event.pull_request.number : [${{ github.event.pull_request.number }}]" - echo "steps.vars.outputs.branch : [${{ steps.vars.outputs.branch }}]" - echo "github.event.pull_request.head.ref: [${{ github.event.pull_request.head.ref }}]" - - ls -lahr prior_config - if [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then - echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" - python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_fig test_config_github_actions.json - else - echo "Push from branch [${{ steps.vars.outputs.branch }}]" - python detection_testing_execution.py run --branch [${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json - fi - - mv *-test-run.json replicate_test.json - - name: Upload Test Results Files - uses: actions/upload-artifact@v2 - with: - name: testing-results-config - path: | - automated_detection_testing/ci/detection_testing_batch/prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_0.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_1.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_2.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_3.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_4.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_5.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_6.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_7.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_8.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_9.json - - - name: Upload File to Enable Replication of the Test at a Different Time or Place - uses: actions/upload-artifact@v2 - with: - name: replicate_test - path: | - automated_detection_testing/ci/detection_testing_batch/replicate_test.json - - docker-detection-testing-execution: - runs-on: ubuntu-latest - needs: [validate-tag-if-present, quit-for-dependabot, docker-detection-testing-setup] - strategy: - matrix: - manifest_filename: ["config_tests_0.json", - "config_tests_1.json", - "config_tests_2.json", - "config_tests_3.json", - "config_tests_4.json", - "config_tests_5.json", - "config_tests_6.json", - "config_tests_7.json", - "config_tests_8.json", - "config_tests_9.json"] - steps: - - name: Get branch and PR required for detection testing main.py - id: vars - run: | - echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" - - - name: Checkout Repo - uses: actions/checkout@v2 - - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: testing-results-config - path: automated_detection_testing/ci/detection_testing_batch/prior_config - # - name: Install Docker - # run: | - # sudo apt update -qq - - - # #python2.7 needed for slim, for now - # sudo apt install python2 - # sudo apt install virtualenv - # curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py - # sudo python2.7 get-pip.py - - - uses: actions/setup-python@v2 - with: - python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy - architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified - - - name: Install Python Dependencies - run: | - cd automated_detection_testing/ci/detection_testing_batch - python3 -m venv .venv - source .venv/bin/activate - python3 -m pip install wheel - python3 -m pip install -r requirements.txt - - - name: Run the CI - run: | - cd automated_detection_testing/ci/detection_testing_batch - source .venv/bin/activate - - python3 detection_testing_execution.py run -c prior_config/${{ matrix.manifest_filename}} --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} - - - - name: Upload Test Results Files - uses: actions/upload-artifact@v2 - with: - name: ${{ matrix.manifest_filename}}.results - path: | - automated_detection_testing/ci/detection_testing_batch/success.csv - automated_detection_testing/ci/detection_testing_batch/error.csv - automated_detection_testing/ci/detection_testing_batch/failure.csv - automated_detection_testing/ci/detection_testing_batch/combined.csv - automated_detection_testing/ci/detection_testing_batch/success.json - automated_detection_testing/ci/detection_testing_batch/error.json - automated_detection_testing/ci/detection_testing_batch/failure.json - automated_detection_testing/ci/detection_testing_batch/combined.json - - docker-detection-testing-execution-merge-results: - runs-on: ubuntu-latest - needs: [validate-tag-if-present, quit-for-dependabot, docker-detection-testing-setup, docker-detection-testing-execution] - - steps: - - name: Get branch and PR required for detection testing main.py - id: vars - run: | - echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" - - - name: Checkout Repo - uses: actions/checkout@v2 - - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_0.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_0 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_1.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_1 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_2.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_2 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_3.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_3 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_4.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_4 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_5.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_5 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_6.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_6 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_7.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_7 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_8.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_8 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_9.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_9 - - - uses: actions/setup-python@v2 - with: - python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy - architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified - - - name: Install Python Dependencies - run: | - cd automated_detection_testing/ci/detection_testing_batch - python3 -m venv .venv - source .venv/bin/activate - python3 -m pip install wheel - python3 -m pip install -r requirements.txt - - - name: Merge Detections into single File - run: | - cd automated_detection_testing/ci/detection_testing_batch - source .venv/bin/activate - python summarize_json.py --files results_*/combined.json --output_filename summary_test_results.json - - - - name: Upload Summary Test Results JSON - uses: actions/upload-artifact@v2 - if: always() - with: - name: SummaryTestResults - path: | - automated_detection_testing/ci/detection_testing_batch/summary_test_results.json - - - name: Upload Failures Manifest on Failure - uses: actions/upload-artifact@v2 - if: failure() - with: - name: DetectionFailureManifest - path: | - automated_detection_testing/ci/detection_testing_batch/detection_failure_manifest.json - - - #Always clean these up, they make the output messy - - name: Clean up intermediate Files - uses: geekyeggo/delete-artifact@v1 - if: always() - with: - name: | - config_tests_0.json.results - config_tests_1.json.results - config_tests_2.json.results - config_tests_3.json.results - config_tests_4.json.results - config_tests_5.json.results - config_tests_6.json.results - config_tests_7.json.results - config_tests_8.json.results - config_tests_9.json.results - \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/Dockerfile b/automated_detection_testing/ci/detection_testing_batch/Dockerfile deleted file mode 100644 index 1ed762dde5..0000000000 --- a/automated_detection_testing/ci/detection_testing_batch/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM ubuntu:18.04 - -RUN apt-get update -RUN DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata -RUN apt-get install -y python3-dev git python-dev unzip python3-pip awscli -RUN apt-get install -y python-gitdb -RUN apt-get install -y wget unzip -RUN apt-get install -y git - -ADD . /app - -WORKDIR /app -RUN pip3 install -r requirements.txt - -ENTRYPOINT ["python3", "detection_testing_execution.py"] -CMD ["-b", "automated_detections_testing_2"] From b82873bbde48f262a82551cc7dc819ca86fadcc9 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 6 Dec 2021 15:56:07 -0800 Subject: [PATCH 129/203] Removed unused code from testing_service. --- .../modules/testing_service.py | 132 ------------------ 1 file changed, 132 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index f45e649fe7..d060419c36 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -142,135 +142,3 @@ def update_ESCU_app(container_name, splunk_password): print("Successfully updated the ESCU App!") -def configure_splunk_vm(container_name, splunk_password): - ansible_vars = {} - ansible_vars['splunk_password'] = splunk_password - ansible_vars['ansible_user'] = 'ansible' - - #BEGIN BLOCK VARS FROM ATTACK_RANGE_LOCAL.CONF - splunk_url = "https://download.splunk.com/products/splunk/releases/8.0.2/linux/splunk-8.0.2-a7f645ddaf91-Linux-x86_64.tgz" - # Specify the download URL of Splunk Enterprise - - splunk_binary = "splunk-8.0.2-a7f645ddaf91-Linux-x86_64.tgz" - # Specify the name of the Splunk Enterprise executable - - s3_bucket_url = "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com" - # Specify the S3 bucket url from which you want to download the Splunk Apps - - splunk_windows_ta = "splunk-add-on-for-microsoft-windows_800.tgz" - # Specify the Splunk Windows TA - - splunk_sysmon_ta = "splunk-add-on-for-microsoft-sysmon_1062.tgz" - # Specify the Splunk Sysmon TA - - splunk_cim_app = "splunk-common-information-model-cim_4180.tgz" - # Specify the Splunk CIM App - - splunk_escu_app = "DA-ESS-ContentUpdate-latest.tar.gz" - # Specify the Splunk ESCU App - - splunk_asx_app = "Splunk_ASX-latest.tar.gz" - # Specify the Splunk ASX App - - splunk_python_app = "python-for-scientific-computing-for-linux-64-bit_200.tgz" - # Specify the Splunk python for scientific computing dependency that is needed by the MLTK app - - splunk_mltk_app = "splunk-machine-learning-toolkit_510.tgz" - # Specify the Splunk MLTK App - - splunk_stream_app = "splunk-stream_720.tgz" - # Specify the Splunk Stream App - - splunk_security_essentials_app = "splunk-security-essentials_310.tgz" - # Specify the Splunk SSE App - - punchard_custom_visualization = "punchcard-custom-visualization_140.tgz" - # Specify the Punchard Custom Visualization App - - status_indicator_custom_visualization = "status-indicator-custom-visualization_140.tgz" - # Specify the Status Indicator Custom Visualization App - - splunk_attack_range_dashboard = "splunk_attack_range_reporting-1.0.5.tar.gz" - # Specify the Attack Range Dashboard App - - timeline_custom_visualization = "timeline-custom-visualization_140.tgz" - # Specify the Timeline Custom Visualization App - - splunk_aws_app = "splunk-add-on-for-amazon-web-services_500.tgz" - # Specify the Splunk AWS App - # Will be only installed when cloud_attack_range=1 - #END BLOCK VARS FROM ATTACK_RANGE_LOCAL.CONF - - - - splunk_es_app = 'splunk-enterprise-security_640.spl' - splunk_es_app_version = re.findall(r'\d+', splunk_es_app)[0] - - #ansible_vars['ansible_python_interpreter'] = "/usr/bin/python3", - ansible_vars['splunk_admin_password'] = splunk_password - ansible_vars['splunk_url'] = splunk_url - ansible_vars['splunk_binary'] = splunk_binary - ansible_vars['s3_bucket_url'] = s3_bucket_url - ansible_vars['splunk_escu_app'] = splunk_escu_app - ansible_vars['splunk_asx_app'] = splunk_asx_app - ansible_vars['splunk_windows_ta'] = splunk_windows_ta - ansible_vars['splunk_cim_app'] = splunk_cim_app - ansible_vars['splunk_sysmon_ta'] = splunk_sysmon_ta - #ansible_vars['caldera_password'] = '{{ caldera_password }}' - ansible_vars['splunk_mltk_app'] = splunk_mltk_app - #ansible_vars['splunk_bots_dataset'] = '{{ splunk_bots_dataset }}' - ansible_vars['splunk_stream_app'] = splunk_stream_app - ansible_vars['splunk_python_app'] = splunk_python_app - #ansible_vars['phantom_app'] = '{{ phantom_app }}' - #ansible_vars['phantom_server'] = '{{ phantom_server }}' - #ansible_vars['phantom_server_private_ip'] = '{{ phantom_server_private_ip }}' - #ansible_vars['phantom_admin_password'] = '{{ phantom_admin_password }}' - ansible_vars['splunk_security_essentials_app'] = splunk_security_essentials_app - ansible_vars['punchard_custom_visualization'] = punchard_custom_visualization - ansible_vars['status_indicator_custom_visualization'] = status_indicator_custom_visualization - ansible_vars['splunk_attack_range_dashboard'] = splunk_attack_range_dashboard - ansible_vars['timeline_custom_visualization'] = timeline_custom_visualization - #ansible_vars['install_mission_control'] = install_mission_control - #ansible_vars['mission_control_app'] = mission_control_app - #ansible_vars['install_dsp'] = install_dsp - #ansible_vars['dsp_client_cert_path'] = dsp_client_cert_path - #ansible_vars['dsp_node'] = dsp_node - ansible_vars['splunk_server_private_ip'] = "127.0.0.1" - ansible_vars['cloud_attack_range'] = '0' - - ansible_vars['install_es'] = '1' - ansible_vars['install_mltk'] = '0' - ansible_vars['install_mission_control'] = '0' - ansible_vars['install_dsp'] = '0' - - ansible_vars['splunk_es_app'] = splunk_es_app - ansible_vars['splunk_es_app_version'] = splunk_es_app_version - print(ansible_vars['splunk_es_app_version']) - - - - - cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) - runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), - cmdline=cmdline, - roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), - playbook=os.path.join(os.path.dirname(__file__), '../ansible/splunk_server.yml'), - extravars=ansible_vars) - -def replay_attack_dataset(container_name, splunk_password, folder_name, index, sourcetype, source, out): - ansible_vars = {} - ansible_vars['folder_name'] = folder_name - ansible_vars['ansible_user'] = 'ansible' - ansible_vars['splunk_password'] = splunk_password - ansible_vars['out'] = out - ansible_vars['sourcetype'] = sourcetype - ansible_vars['source'] = source - ansible_vars['index'] = index - - cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) - runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), - cmdline=cmdline, - roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), - playbook=os.path.join(os.path.dirname(__file__), '../ansible/attack_replay.yml'), - extravars=ansible_vars) - From 9176e24d4468eef9e8dc9c83108a982cf9826e3b Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 7 Dec 2021 12:11:29 -0800 Subject: [PATCH 130/203] A number of small usability updates. Added and tested a --interactive mode flag and changed --interactive_failure to --no_interactive_failure. Interactive_failure mode is now the default mode. Improved spacing and messages on some error strings. --- .../detection_testing_execution.py | 16 +++++++---- .../modules/container_manager.py | 16 +++++++---- .../modules/github_service.py | 15 ++++++---- .../modules/new_arguments2.py | 12 ++++++-- .../modules/splunk_container.py | 5 +++- .../modules/splunk_sdk.py | 6 ++-- .../modules/testing_service.py | 28 +++++++++++++++++-- .../modules/validate_args.py | 7 ++++- 8 files changed, 77 insertions(+), 28 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 35a8bed3d2..427858ab25 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -70,7 +70,7 @@ def ensure_security_content(branch: str, commit_hash: str, pr_number: Union[int, "We will not check out the repo again. Please be aware, this could cause issues if you're " "out of date. ******") github_service = GithubService( - branch, commit_hash, existing_directory=persist_security_content) + branch, commit_hash, persist_security_content=persist_security_content) else: if persist_security_content is True and not os.path.exists("security_content"): @@ -160,11 +160,11 @@ def generate_escu_app(persist_security_content: bool = False) -> str: print("Error downloading the Splunk Packaging Toolkit: [%s].\n\tQuitting..." % (str(e)), file=sys.stderr) sys.exit(1) - + print(os.getcwd()) commands = ["rm -rf slim_packaging/slim_latest", "mkdir slim_packaging/slim_latest", "cd slim_packaging", - "tar -zxf splunk-packaging-toolkit-latest.tar.gz -C slim_latest --strip-components=1", + "tar -zxf ../splunk-packaging-toolkit-latest.tar.gz -C slim_latest --strip-components=1", "cd slim_latest", "virtualenv --python=/usr/bin/python2.7 --clear .venv", ". ./.venv/bin/activate", @@ -323,7 +323,10 @@ def main(args: list[str]): settings['branch'], settings['commit_hash'], settings['pr_number'], settings['persist_security_content']) settings['commit_hash'] = github_service.commit_hash except Exception as e: - print("Failure checking out git repository:\n\t\n\tHash: [%s]\n\tBranch: [%s]\n\tPR: [%s]\n\tQuitting"% + print("\nFailure checking out git repository:"\ + "\n\tHash: [%s]"\ + "\n\tBranch: [%s]"\ + "\n\tPR: [%s]\n\tQuitting"% (settings['commit_hash'],settings['branch'],settings['pr_number']),file=sys.stderr) sys.exit(1) @@ -343,6 +346,8 @@ def main(args: list[str]): print("\tQuitting...", file=sys.stderr) sys.exit(1) + print("***This run will test [%d] detections!***"%(len(all_test_files))) + #Set up the directory that will be used to store the local apps/apps we build local_volume_absolute_path = os.path.abspath( os.path.join(os.getcwd(), "apps")) @@ -420,7 +425,8 @@ def main(args: list[str]): splunkbase_username=settings['splunkbase_username'], splunkbase_password=settings['splunkbase_password'], reuse_image=settings['reuse_image'], - interactive_failure=settings['interactive_failure']) + interactive_failure=not settings['no_interactive_failure'], + interactive=settings['interactive']) result = cm.run_test() diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 15d82b7842..30d0c34ad1 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -38,7 +38,8 @@ class ContainerManager: splunkbase_username: Union[str, None] = None, splunkbase_password: Union[str, None] = None, reuse_image:bool = True, - interactive_failure:bool=False + interactive_failure:bool=False, + interactive:bool=False ): self.synchronization_object = test_driver.TestDriver( @@ -74,7 +75,8 @@ class ContainerManager: splunkbase_password, files_to_copy_to_container, reuse_image, - interactive_failure + interactive_failure, + interactive ) self.summary_thread = threading.Thread(target=self.queue_status_thread,args=()) @@ -142,7 +144,8 @@ class ContainerManager: splunkbase_password: Union[str, None] = None, files_to_copy_to_container: OrderedDict = OrderedDict(), reuse_image:bool = True, - interactive_failure:bool = True + interactive_failure:bool = False, + interactive:bool = False ) -> list[splunk_container.SplunkContainer]: #First make sure that the image exists and has been downloaded self.setup_image(reuse_image, full_docker_hub_name) @@ -170,7 +173,8 @@ class ContainerManager: self.mounts, splunkbase_username, splunkbase_password, - interactive_failure=interactive_failure + interactive_failure=interactive_failure, + interactive=interactive ) ) @@ -209,7 +213,7 @@ class ContainerManager: password = "".join(password_list) return password - def queue_status_thread(self)->None: + def queue_status_thread(self, status_interval:int=60)->None: #This will run fo while True: if self.synchronization_object.checkContainerFailure(): @@ -223,7 +227,7 @@ class ContainerManager: #There are no more tests to run, so we can return from this thread print("return from queue status thread") return None - time.sleep(10) + time.sleep(status_interval) def setup_image(self, reuse_images: bool, container_name: str) -> None: client = docker.client.from_env() diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 15f5e5acf7..a62dbaed4a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -22,14 +22,16 @@ SECURITY_CONTENT_URL = "https://github.com/splunk/security_content" class GithubService: - def __init__(self, security_content_branch: str, commit_hash: str, PR_number: int = None, existing_directory: bool = False): + def __init__(self, security_content_branch: str, commit_hash: str, PR_number: int = None, persist_security_content: bool = False): self.security_content_branch = security_content_branch - if existing_directory: - return - print("Checking out security_content!") - self.security_content_repo_obj = self.clone_project( - SECURITY_CONTENT_URL, f"security_content", f"develop") + if persist_security_content: + print("Getting handle on existing security_content repo!") + self.security_content_repo_obj = git.Repo("security_content") + else: + print("Checking out security_content repo!") + self.security_content_repo_obj = self.clone_project( + SECURITY_CONTENT_URL, f"security_content", f"develop") if commit_hash is not None and PR_number is not None: print("Error - both the PR number [%d] and the commit hash [%s] were provided. " @@ -50,6 +52,7 @@ class GithubService: else: print("Checking out branch: [%s]..." % (security_content_branch), end='') + sys.stdout.flush() self.security_content_repo_obj.git.checkout( security_content_branch) commit_hash = self.security_content_repo_obj.head.object.hexsha diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index e93a49e807..21603a6e34 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -187,10 +187,16 @@ def parse(args) -> tuple[str, dict]: run_parser.add_argument("-n", "--num_containers", required=False, type=int, help="The number of Splunk containers to run or mock") - run_parser.add_argument("-i", "--interactive_failure", required=False, + run_parser.add_argument("-nif", "--no_interactive_failure", required=False, action="store_true", help="After a detection fails, pause and allow the user to log into "\ - "the Splunk server to interactively debug the failure. Wait for them "\ + "the Splunk server to interactively debug the failure. Wait for the user "\ + "to hit enter before removing the test data and moving on to the next test.") + + run_parser.add_argument("-i", "--interactive", required=False, + action="store_true", + help="After a detection runs, pause and allow the user to log into "\ + "the Splunk server to debug the detection. Wait for the user "\ "to hit enter before removing the test data and moving on to the next test.") args = parser.parse_args() @@ -208,7 +214,7 @@ def parse(args) -> tuple[str, dict]: # set their value to something else, like None # Don't overwite booleans - if args.__dict__[key] is False and key in ["show_splunk_app_password", "mock", "interactive_failure"]: + if args.__dict__[key] is False and key in ["show_splunk_app_password", "mock", "no_interactive_failure", "interactive"]: del args.__dict__[key] # Don't overwrite other values elif args.__dict__[key] is None and key in ["splunkbase_username", "branch", "commit_hash", diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index a27dd9b509..251a0fab14 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -38,8 +38,10 @@ class SplunkContainer: splunkbase_password: Union[str, None] = None, splunk_ip: str = "127.0.0.1", interactive_failure: bool = False, + interactive:bool = False ): self.interactive_failure = interactive_failure + self.interactive = interactive self.synchronization_object = synchronization_object self.client = docker.client.from_env() self.full_docker_hub_path = full_docker_hub_path @@ -94,7 +96,7 @@ class SplunkContainer: # elif app["location"] == "local": # apps_to_install.append(app["container_path"]) - print(apps_to_install) + return ",".join(apps_to_install), require_credentials def make_environment( @@ -380,6 +382,7 @@ class SplunkContainer: detection_to_test, self.synchronization_object.attack_data_root_folder, wait_on_failure=self.interactive_failure, + wait_on_completion = self.interactive ) self.synchronization_object.addResult(result) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 2294b27501..d0099f1a7c 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -141,7 +141,7 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, return test_results -def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wait_on_delete:bool, search_string:str, detection_filename:str)->bool: +def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wait_on_delete:Union[dict,None], search_string:str, detection_filename:str)->bool: try: service = client.connect( @@ -155,10 +155,10 @@ def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wa #splunk_search = 'search index=test* | delete' if wait_on_delete: - print("\n\n\n****SEARCH FAILURE: Allowing time to debug search****") + print(wait_on_delete['message']) print("FILENAME : [%s]"%(detection_filename)) print("SEARCH :\n%s"%(search_string)) - _ = input("****************Press ENTER to DELETE****************\n\n\n") + _ = input("****************Press ENTER to Complete Test and DELETE data****************\n\n\n") splunk_search = 'search index=main | delete' kwargs = {"exec_mode": "blocking", "dispatch.earliest_time": "-1d", diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index d060419c36..bddca333c1 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -14,7 +14,8 @@ from os.path import relpath from tempfile import mkdtemp -def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:str, splunk_port:int, test_file:str, attack_data_root_folder, wait_on_failure:bool=False)->dict: +def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:str, splunk_port:int, + test_file:str, attack_data_root_folder, wait_on_failure:bool=False, wait_on_completion:bool=False)->dict: uuid_var = str(uuid.uuid4()) result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, uuid_var, attack_data_root_folder) @@ -28,9 +29,11 @@ def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:st #search failed if there was an error or the detection failed to produce the expected result if wait_on_failure and (result_test['detection_result']['error'] or not result_test['detection_result']['success']): - wait_on_delete = True + wait_on_delete = {'message':"\n\n\n****SEARCH FAILURE: Allowing time to debug search/data****"} + elif wait_on_completion: + wait_on_delete = {'message':"\n\n\n****SEARCH SUCCESS: Allowing time to examine search/data****"} else: - wait_on_delete = False + wait_on_delete = None splunk_sdk.delete_attack_data(splunk_ip, splunk_password, splunk_port, wait_on_delete, search_string, test_file) @@ -142,3 +145,22 @@ def update_ESCU_app(container_name, splunk_password): print("Successfully updated the ESCU App!") +def replay_attack_dataset(container_name, splunk_password, folder_name, index, sourcetype, source, out): + ansible_vars = {} + ansible_vars['folder_name'] = folder_name + ansible_vars['ansible_user'] = 'ansible' + ansible_vars['splunk_password'] = splunk_password + ansible_vars['out'] = out + ansible_vars['sourcetype'] = sourcetype + ansible_vars['source'] = source + ansible_vars['index'] = index + envvars = {"ANSIBLE_STDOUT_CALLBACK": "community.general.null"} + cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) + + print("ABOUT TO RUN PLAYBOOK WITH SUPPRESSED OUTPUT") + runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), + cmdline=cmdline, + roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), + playbook=os.path.join(os.path.dirname(__file__), '../ansible/attack_replay.yml'), + extravars=ansible_vars, envvars=envvars) + \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 28ac4a9105..3cb526aa5b 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -26,7 +26,12 @@ setup_schema = { "default": "latest" }, - "interactive_failure": { + "no_interactive_failure": { + "type": "boolean", + "default": False + }, + + "interactive": { "type": "boolean", "default": False }, From 0f87a6011c4071e13564640eda87753bf89fe48a Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 7 Dec 2021 13:27:38 -0800 Subject: [PATCH 131/203] Changes to support more of interactive mode and interactive_failure_mode as well as better logic around whether or not the password should be printed to the command line. In short, it will be printed if you are in interactive mode and have not included it in the config. If you are interactive and the password is in the config file, you will be warned but it will not be printed. If you are not interactive, it will not be printed unless you ask it to print. --- .../detection_testing_execution.py | 1 + .../modules/new_arguments2.py | 8 ++--- .../modules/validate_args.py | 29 +++++++++++++++---- .../test_config_github_actions.json | 3 +- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 427858ab25..512ca30813 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -270,6 +270,7 @@ def main(args: list[str]): requests.packages.urllib3.disable_warnings() start_datetime = datetime.now() + action, settings = modules.new_arguments2.parse(args) if action == "configure": # Done, nothing else to do diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py index 21603a6e34..c47c02362a 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py @@ -61,7 +61,7 @@ def configure_action(args) -> tuple[str, dict]: # Now parse the new config and make sure it's good validated_new_settings, schema = validate_args.validate_and_write( - new_config, args.output_config_file) + new_config, args.output_config_file, skip_password_accessibility_check=False) if validated_new_settings == None: print("Could not update settings.\n\tQuitting...", file=sys.stderr) sys.exit(1) @@ -84,7 +84,7 @@ def update_config_with_cli_arguments(args_dict: dict) -> tuple[str, dict]: settings[key] = value # Validate again to make sure we didn't break anything - settings, _ = validate_args.validate(settings) + settings, _ = validate_args.validate(settings,skip_password_accessibility_check=False) if settings is None: print("Failure while processing updated settings from command line.\n\tQuitting...", file=sys.stderr) sys.exit(1) @@ -115,7 +115,7 @@ def parse(args) -> tuple[str, dict]: print("No default configuration file [%s] found. Creating one..." % ( DEFAULT_CONFIG_FILE)) with open(DEFAULT_CONFIG_FILE, 'w') as cfg: - validate_args.validate_and_write({}, cfg) + validate_args.validate_and_write({}, cfg, skip_password_accessibility_check=True) parser = argparse.ArgumentParser( description="Use 'SOME_PROGRAM_NAME_STRING --help' to get help with the arguments") @@ -227,7 +227,7 @@ def parse(args) -> tuple[str, dict]: return action, settings except Exception as e: - print("Unknown Error - [%s]" % (str(e))) + print("Unknown Error Validating Json Configuration - [%s]" % (str(e))) sys.exit(1) if __name__ == "__main__": diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 3cb526aa5b..856f6c0f4c 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -271,10 +271,11 @@ def validate_file(file: io.TextIOWrapper) -> tuple[Union[dict, None], dict]: raise(e) -def check_dependencies(settings: dict) -> bool: +def check_dependencies(settings: dict, skip_password_accessibility_check:bool=True) -> bool: # Check complex mode dependencies error_free = True + # Make sure that all the mode arguments are sane if settings['mode'] == 'selected': # Make sure that exactly one of the following fields is populated @@ -291,11 +292,28 @@ def check_dependencies(settings: dict) -> bool: print("Error - mode was not 'selected' but detections_list was supplied.", file=sys.stderr) error_free = False + + # Make sure that if we will be in an interactive mode, that either the user has provided the password or the password will be printed + if skip_password_accessibility_check: + pass + elif (settings['interactive'] or not settings['no_interactive_failure']) and settings['show_splunk_app_password'] is False: + print("\n\n******************************************************\n\n") + if settings['splunk_app_password'] is not None: + print("Warning: You have chosen an interactive mode, set show_splunk_app_password False,\n"\ + "and provided a password in the config file. We will NOT print this password to\n"\ + "stdout. Look in the config file for this password.",file=sys.stderr) + else: + print("Warning: You have chosen an interactive mode, set show_splunk_app_password False,\n"\ + "and DID NOT provide a password in the config file. We have updated show_splunk_app_password\n"\ + "to True for you. Otherwise, interactive mode login would be impossible.",file=sys.stderr) + settings['show_splunk_app_password'] = True + print("\n\n******************************************************\n\n") + # Returns true if there are not errors return error_free -def validate_and_write(configuration: dict, output_file: Union[io.TextIOWrapper, None] = None, strip_credentials: bool = False) -> tuple[Union[dict, None], dict]: +def validate_and_write(configuration: dict, output_file: Union[io.TextIOWrapper, None] = None, strip_credentials: bool = False, skip_password_accessibility_check:bool=True) -> tuple[Union[dict, None], dict]: closeFile = False if output_file is None: import datetime @@ -309,8 +327,9 @@ def validate_and_write(configuration: dict, output_file: Union[io.TextIOWrapper, configuration['splunkbase_password'] = None configuration['splunkbase_username'] = None configuration['container_password'] = None + configuration['show_splunk_app_password'] = True - validated_json, setup_schema = validate(configuration) + validated_json, setup_schema = validate(configuration,skip_password_accessibility_check) if validated_json == None: print("Error in the new settings! No output file written") else: @@ -329,7 +348,7 @@ def validate_and_write(configuration: dict, output_file: Union[io.TextIOWrapper, return validated_json, setup_schema -def validate(configuration: dict) -> tuple[Union[dict, None], dict]: +def validate(configuration: dict, skip_password_accessibility_check:bool=True) -> tuple[Union[dict, None], dict]: # v = jsonschema.Draft201909Validator(argument_schema) try: @@ -339,7 +358,7 @@ def validate(configuration: dict) -> tuple[Union[dict, None], dict]: if len(validation_errors) == 0: # check to make sure there were no complex errors - no_complex_errors = check_dependencies(validated_json) + no_complex_errors = check_dependencies(validated_json,skip_password_accessibility_check) if no_complex_errors: return validated_json, setup_schema else: diff --git a/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json b/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json index c14dc8fe03..81fa25f89d 100644 --- a/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json +++ b/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json @@ -9,7 +9,7 @@ "cloud", "network" ], - "interactive_failure": false, + "interactive": false, "local_apps": { "SPLUNK_ES_CONTENT_UPDATE": { "app_number": 3449, @@ -20,6 +20,7 @@ "local_base_container_name": "splunk_test_%d", "mock": false, "mode": "changes", + "no_interactive_failure": true, "num_containers": 10, "persist_security_content": false, "pr_number": null, From 934a3727f20e8d8d84092c79892233568b1fbf5e Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 7 Dec 2021 17:08:11 -0800 Subject: [PATCH 132/203] A number of changes. First we quit immediately if docker is not running on the machine... we were missing the quit before but not the check and error message. Next, we fix a persistent problem with storing the output of a test that encounters an error. We also remove some un-needed print statements --- .../detection_testing_execution.py | 1 + .../modules/container_manager.py | 4 ++-- .../modules/splunk_sdk.py | 17 ++++++++++++----- .../modules/test_driver.py | 1 + .../modules/testing_service.py | 6 ++---- .../modules/validate_args.py | 4 ++++ 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 512ca30813..1a4dbe8915 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -289,6 +289,7 @@ def main(args: list[str]): docker.client.from_env() except Exception as e: print("Error, failed to get docker client. Is Docker Installed and Running?\n\t%s" % (str(e))) + sys.exit(1) credentials_needed = False credential_error = False diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 30d0c34ad1..b11f1669dd 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -221,11 +221,11 @@ class ContainerManager: for container in self.containers: container.stopContainer() print("All containers stopped") - print("return from queue status thread") + return None if self.synchronization_object.summarize() == False: #There are no more tests to run, so we can return from this thread - print("return from queue status thread") + return None time.sleep(status_interval) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index d0099f1a7c..ea782d72e1 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -92,8 +92,14 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, splunk_search = search + ' ' + pass_condition test_results = dict() + #These will always be present. By default, we will say that the + #test has failed AND there was an error (until they are set otherwise) test_results['search_string'] = splunk_search + test_results['detection_name'] = detection_name + test_results['detection_file'] = detection_file + test_results['success'] = False + test_results['error'] = True try: @@ -118,19 +124,20 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, try: job = service.jobs.create(splunk_search, **kwargs) except Exception as e: - print("Unable to execute detection: " + str(e)) + print("Unable to execute detection:\n%s"%(str(e))) test_results['error'] = True return test_results test_results['diskUsage'] = job['diskUsage'] test_results['runDuration'] = job['runDuration'] - test_results['detection_name'] = detection_name - test_results['detection_file'] = detection_file test_results['scanCount'] = job['scanCount'] - - test_results['error'] = False #The search may have FAILED, but there was no error in the search + #If we get this far, then there was not an error + #The search may have FAILED, but there was no error in the search + test_results['error'] = False + + #Should this be 1 for a pass, or should it be greater than 0? if int(job['resultCount']) != 1: #print("Test failed for detection: " + detection_name) test_results['success'] = False diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index 69ce72efd6..170c3fb19d 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -280,5 +280,6 @@ class TestDriver: self.addSuccess(result['detection_result']) except Exception as e: #Neither a success or a failure, so add the object to the failures queue + print('"There was an error adding the result: [%s]'%(str(e))) self.addError({'detection_file':"Unknown File", "detection_error":str(result)}) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index bddca333c1..189e141dfa 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -154,13 +154,11 @@ def replay_attack_dataset(container_name, splunk_password, folder_name, index, s ansible_vars['sourcetype'] = sourcetype ansible_vars['source'] = source ansible_vars['index'] = index - envvars = {"ANSIBLE_STDOUT_CALLBACK": "community.general.null"} - cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) - print("ABOUT TO RUN PLAYBOOK WITH SUPPRESSED OUTPUT") + cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), cmdline=cmdline, roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), playbook=os.path.join(os.path.dirname(__file__), '../ansible/attack_replay.yml'), - extravars=ansible_vars, envvars=envvars) + extravars=ansible_vars) \ No newline at end of file diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 856f6c0f4c..86c8f81a3f 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -153,6 +153,10 @@ setup_schema = { } }, "default": { + "ADD-ON_FOR_LINUX_SYSMON": { + "app_number": 6176, + "app_version": "1.0.3" + }, "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES": { "app_number": 1876, "app_version": "5.2.0" From 8f55eb5848aa421060f338f464a1512f44909220 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 8 Dec 2021 12:00:51 -0800 Subject: [PATCH 133/203] Proper summary.json files are now always generated after a run of the CI. It does not require a separate run of summarize_json.py. Becuase the CI runs different jobs, though, it is still required to run this explicitly in the CI. Also fixed an issue where searches that resulted in an error had incorrect json output due to improper python error handling. --- .github/workflows/build-and-validate.yml | 20 +++-- .../detection_testing_execution.py | 7 +- .../modules/test_driver.py | 42 +++++++-- .../detection_testing_batch/summarize_json.py | 89 +++++++++++-------- 4 files changed, 101 insertions(+), 57 deletions(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index 43fb214ce3..04d06b57f0 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -451,14 +451,16 @@ jobs: with: name: ${{ matrix.manifest_filename}}.results path: | - automated_detection_testing/ci/detection_testing_batch/success.csv - automated_detection_testing/ci/detection_testing_batch/error.csv - automated_detection_testing/ci/detection_testing_batch/failure.csv - automated_detection_testing/ci/detection_testing_batch/combined.csv - automated_detection_testing/ci/detection_testing_batch/success.json - automated_detection_testing/ci/detection_testing_batch/error.json - automated_detection_testing/ci/detection_testing_batch/failure.json - automated_detection_testing/ci/detection_testing_batch/combined.json + automated_detection_testing/ci/detection_testing_batch/test_results/success.csv + automated_detection_testing/ci/detection_testing_batch/test_results/error.csv + automated_detection_testing/ci/detection_testing_batch/test_results/failure.csv + automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv + automated_detection_testing/ci/detection_testing_batch/test_results/success.json + automated_detection_testing/ci/detection_testing_batch/test_results/error.json + automated_detection_testing/ci/detection_testing_batch/test_results/failure.json + automated_detection_testing/ci/detection_testing_batch/test_results/combined.json + + automated_detection_testing/ci/detection_testing_batch/test_results/summary.json docker-detection-testing-execution-merge-results: runs-on: ubuntu-latest @@ -541,7 +543,7 @@ jobs: run: | cd automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate - python summarize_json.py --files results_*/combined.json --output_filename summary_test_results.json + python summarize_json.py --files results_*/summary.json --output_filename summary_test_results.json - name: Upload Summary Test Results JSON diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 1a4dbe8915..e9b42b6526 100644 --- a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -67,8 +67,11 @@ def copy_local_apps_to_directory(apps: dict[str, dict], target_directory) -> Non def ensure_security_content(branch: str, commit_hash: str, pr_number: Union[int, None], persist_security_content: bool) -> GithubService: if persist_security_content is True and os.path.exists("security_content"): print("****** You chose --persist_security_content and the security_content directory exists. " - "We will not check out the repo again. Please be aware, this could cause issues if you're " - "out of date. ******") + "We will not check out the repo again. Please be aware, this could cause issues if your " + "repo is out of date or if a previous build failed to download all required tools and "\ + "libraries. If this occurs, it is suggested to change the "\ + "persist_security_content setting to false. ******") + github_service = GithubService( branch, commit_hash, persist_security_content=persist_security_content) diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index 170c3fb19d..47d78472ff 100644 --- a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -5,6 +5,7 @@ import json import os import queue import shutil +import summarize_json import tempfile import threading import time @@ -168,21 +169,44 @@ class TestDriver: def outputResultsFiles(self, baseline:OrderedDict, fields:list[str]=['detection_name', 'detection_file','runDuration','diskUsage', 'search_string', 'error', 'success', 'scanCount', 'detection_error'])->bool: - res = self.outputResultsFile(fields,"success", self.successes, baseline) - res |= self.outputResultsFile(fields, "failure", self.failures, baseline) - res |= self.outputResultsFile(fields, "error", self.errors, baseline) - res |= self.outputResultsFile(fields, "combined", self.successes + self.failures + self.errors, baseline) + results_directory = "test_results" + try: + shutil.rmtree(results_directory,ignore_errors=True) + os.mkdir(results_directory) + except Exception as e: + print("There was an error removing the results directory [%s]: [%s].\n\t We will try to continue output anyway."%(results_directory, str(e))) + + + res = self.outputResultsFile(fields,os.path.join(results_directory, "success"), self.successes, baseline) + res |= self.outputResultsFile(fields, os.path.join(results_directory, "failure"), self.failures, baseline) + res |= self.outputResultsFile(fields, os.path.join(results_directory, "error"), self.errors, baseline) + combined_data = self.successes + self.failures + self.errors + res |= self.outputResultsFile(fields, os.path.join(results_directory, "combined"), combined_data, baseline) + + try: + success, test_count,pass_count,fail_count,error_count = summarize_json.outputResultsJSON("summary.json", combined_data, baseline, output_folder=results_directory) + summarize_json.print_summary(test_count, pass_count, fail_count, error_count) + res |= success + except Exception as e: + print("Failure writing the summary file: [%s]",file=sys.stderr) + res = False + return res def finish(self, baseline:OrderedDict): self.cleanup() - self.outputResultsFiles(baseline) + success = True + if self.outputResultsFiles(baseline) == False: + print("There was an error generating one or more of the output files. "\ + "Check the logs for details.",file=sys.stderr) + success = False + if self.checkContainerFailure(): - print("One or more containers crashed, so testing did not complete successfully. We wrote out the results we have") + print("One or more containers crashed, so testing did not complete successfully. We wrote out all the results that we could") return False else: - return True + return success @@ -273,7 +297,9 @@ class TestDriver: def addResult(self, result:dict)->None: try: - if result['detection_result']['success'] is False: + if result['detection_result']['error'] is True: + self.addError(result['detection_result']) + elif result['detection_result']['success'] is False: #This is actually a failure of the detection, not an error. Naming is confusiong self.addFailure(result['detection_result']) elif result['detection_result']['success'] is True: diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index d55b7c46e3..eddfe456ab 100644 --- a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -8,7 +8,9 @@ import os.path from operator import itemgetter -def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict)->tuple[bool,int,int,int]: +def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict, + failure_manifest_filename = "detection_failure_manifest.json", + output_folder:str="")->tuple[bool,int,int,int,int]: success = True try: @@ -47,7 +49,7 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict "FAIL_AND_ERROR":fail_and_error_count } data_sorted = sorted(data, key = lambda k: (-k['error'], k['success'], k['detection_file'])) - with open(output_filename, "w") as jsonFile: + with open(os.path.join(output_folder,output_filename), "w") as jsonFile: json.dump({'summary':summary, 'baseline': baseline, 'results':data_sorted}, jsonFile, indent=" ") @@ -62,7 +64,7 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict failures_test_override = {"detections_list": fail_list, "interactive_failure":True, "num_containers":1, "branch": baseline["branch"], "commit_hash":baseline["commit_hash"], "mode":"selected", "show_splunk_app_password": True} - with open("detection_failure_manifest.json","w") as failures: + with open(os.path.join(output_folder,failure_manifest_filename),"w") as failures: validate_args.validate_and_write(failures_test_override, failures) except Exception as e: print("There was an error generating [%s]: [%s]"%(output_filename, str(e)),file=sys.stderr) @@ -71,39 +73,16 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict #success = False #return success, False - return success, test_count, pass_count, fail_count + #note that total failures is fail_count, fail_and_error count is JUST errors (and every error is also a failure) + return success, test_count, pass_count, fail_count, fail_and_error_count - - -parser = argparse.ArgumentParser(description="Results Merger") -parser.add_argument('-f', '--files', type=argparse.FileType('r'), required=True, nargs='+', help="The json files you would like to combine into a single file") -parser.add_argument('-o', '--output_filename', type=str, required=True, help="The name of the output file") -args = parser.parse_args() - -all_data = OrderedDict() -try: - print("We will summarize the files: %s"%(str([f.name for f in args.files]))) - for f in args.files: - if not f.name.endswith('.json'): - print("Error: passed in file must end in .json - you passed in [%s].\n\tQuitting..."%(f.name)) - sys.exit(1) - data = json.loads(f.read()) - if 'baseline' in all_data: - #everything has the same baseline, only need to do it once - pass - else: - all_data['baseline'] = data['baseline'] - if 'results' in all_data: - #this is a list of dictionaries, so add to it - all_data['results'].extend(data['results']) - else: - all_data['results'] = data['results'] - - test_pass, test_count, pass_count, fail_count = outputResultsJSON(args.output_filename, all_data['results'], all_data['baseline']) +def print_summary(test_count: int, pass_count:int, fail_count:int, error_count:int)->None: print("Summary:"\ - "\n\tTotal Tests: %d"\ - "\n\tTotal Pass : %d"\ - "\n\tTotal Fail : %d"%(test_count, pass_count, fail_count)) + "\n\tTotal Tests: %d"\ + "\n\tTotal Pass : %d"\ + "\n\tTotal Fail : %d (%d of these were ERRORS)"%(test_count, pass_count, fail_count, error_count)) + +def exit_with_status(test_pass:bool, test_count: int, pass_count:int, fail_count:int, error_count:int)->None: if not test_pass: print("Result: FAIL") sys.exit(1) @@ -111,11 +90,45 @@ try: print("Result: PASS!") sys.exit(0) - -except Exception as e: - print("Error writing the summary file: [%s].\n\tQuitting..."%(str(e))) - sys.exit(1) +def finish(test_pass:bool, test_count: int, pass_count:int, fail_count:int, error_count:int)->None: + print_summary(test_count, pass_count, fail_count,error_count) + exit_with_status(test_pass, test_count, pass_count, fail_count,error_count) + +def main(): + parser = argparse.ArgumentParser(description="Results Merger") + parser.add_argument('-f', '--files', type=argparse.FileType('r'), required=True, nargs='+', help="The json files you would like to combine into a single file") + parser.add_argument('-o', '--output_filename', type=str, required=True, help="The name of the output file") + args = parser.parse_args() + + all_data = OrderedDict() + try: + print("We will summarize the files: %s"%(str([f.name for f in args.files]))) + for f in args.files: + if not f.name.endswith('.json'): + print("Error: passed in file must end in .json - you passed in [%s].\n\tQuitting..."%(f.name)) + sys.exit(1) + data = json.loads(f.read()) + if 'baseline' in all_data: + #everything has the same baseline, only need to do it once + pass + else: + all_data['baseline'] = data['baseline'] + if 'results' in all_data: + #this is a list of dictionaries, so add to it + all_data['results'].extend(data['results']) + else: + all_data['results'] = data['results'] + + test_pass, test_count, pass_count, fail_count, error_count = outputResultsJSON(args.output_filename, all_data['results'], all_data['baseline']) + finish(test_pass, test_count, pass_count, fail_count, error_count) + + except Exception as e: + print("Error generating the summary file: [%s].\n\tQuitting..."%(str(e))) + sys.exit(1) + +if __name__=="__main__": + main() From cc4f91d8c2487b47ada51956c87bf416fb71d9a6 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 8 Dec 2021 12:46:06 -0800 Subject: [PATCH 134/203] Moved everything into the bin directory. --- .../automated_detection_testing}/.dockerignore | 0 .../automated_detection_testing}/Dockerfile | 0 .../automated_detection_testing}/README.md | 0 .../architecture_automated_detection_testing.png | Bin .../ci/attack_range_for_testing/Dockerfile | 0 .../attack_range_for_testing/detection_service.py | 0 .../helpers/attack_range_controller.py | 0 .../attack_range_for_testing/helpers/aws_service.py | 0 .../helpers/github_service.py | 0 .../ci/attack_range_for_testing/requirements.txt | 0 .../ansible/attack_replay.yml | 0 .../ansible/roles/attack_replay/tasks/main.yml | 0 .../ansible/roles/update_escu/tasks/main.yml | 0 .../detection_testing_batch/ansible/update_escu.yml | 0 .../ci/detection_testing_batch/datamodels.conf.tar | Bin .../detection_testing_execution.py | 0 .../ci/detection_testing_batch/indexes.conf.tar | Bin .../modules/DataManipulation.py | 0 .../ci/detection_testing_batch/modules/__init__.py | 0 .../detection_testing_batch/modules/aws_service.py | 0 .../modules/container_manager.py | 0 .../modules/github_service.py | 0 .../modules/jsonschema_errorprinter.py | 0 .../modules/new_arguments2.py | 0 .../modules/splunk_container.py | 0 .../detection_testing_batch/modules/splunk_sdk.py | 0 .../detection_testing_batch/modules/test_driver.py | 0 .../modules/testing_service.py | 0 .../modules/tmp/tstats_endpoint_processes | 0 .../modules/validate_args.py | 0 .../ci/detection_testing_batch/new_arguments.py | 0 .../ci/detection_testing_batch/requirements.txt | 0 .../ci/detection_testing_batch/summarize_json.py | 0 .../test_config_github_actions.json | 0 .../ci/labeled_data/Dockerfile | 0 .../ci/labeled_data/ansible/attack_replay.yml | 0 .../ansible/roles/attack_replay/tasks/main.yml | 0 .../ansible/roles/update_escu/tasks/main.yml | 0 .../ci/labeled_data/ansible/update_escu.yml | 0 .../ci/labeled_data/labeled_data.py | 0 .../ci/labeled_data/modules/DataManipulation.py | 0 .../ci/labeled_data/modules/aws_service.py | 0 .../ci/labeled_data/modules/github_service.py | 0 .../ci/labeled_data/modules/splunk_sdk.py | 0 .../ci/labeled_data/modules/testing_service.py | 0 .../ci/labeled_data/requirements.txt | 0 .../ci/python_ci_code/main.py | 0 .../ci/python_ci_code/requirements.txt | 0 .../automated_detection_testing}/config | 0 .../detection_service.py | 0 .../automated_detection_testing}/requirements.txt | 0 .../templates/PR_template.j2 | 0 .../templates/PR_template_attack_data.j2 | 0 53 files changed, 0 insertions(+), 0 deletions(-) rename {automated_detection_testing => bin/automated_detection_testing}/.dockerignore (100%) rename {automated_detection_testing => bin/automated_detection_testing}/Dockerfile (100%) rename {automated_detection_testing => bin/automated_detection_testing}/README.md (100%) rename {automated_detection_testing => bin/automated_detection_testing}/architecture_automated_detection_testing.png (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/attack_range_for_testing/Dockerfile (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/attack_range_for_testing/detection_service.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/attack_range_for_testing/helpers/attack_range_controller.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/attack_range_for_testing/helpers/aws_service.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/attack_range_for_testing/helpers/github_service.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/attack_range_for_testing/requirements.txt (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/ansible/attack_replay.yml (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/ansible/roles/update_escu/tasks/main.yml (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/ansible/update_escu.yml (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/datamodels.conf.tar (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/detection_testing_execution.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/indexes.conf.tar (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/DataManipulation.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/__init__.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/aws_service.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/container_manager.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/github_service.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/jsonschema_errorprinter.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/new_arguments2.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/splunk_container.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/splunk_sdk.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/test_driver.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/testing_service.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/tmp/tstats_endpoint_processes (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/modules/validate_args.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/new_arguments.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/requirements.txt (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/summarize_json.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/detection_testing_batch/test_config_github_actions.json (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/Dockerfile (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/ansible/attack_replay.yml (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/ansible/roles/attack_replay/tasks/main.yml (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/ansible/roles/update_escu/tasks/main.yml (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/ansible/update_escu.yml (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/labeled_data.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/modules/DataManipulation.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/modules/aws_service.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/modules/github_service.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/modules/splunk_sdk.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/modules/testing_service.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/labeled_data/requirements.txt (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/python_ci_code/main.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/ci/python_ci_code/requirements.txt (100%) rename {automated_detection_testing => bin/automated_detection_testing}/config (100%) rename {automated_detection_testing => bin/automated_detection_testing}/detection_service.py (100%) rename {automated_detection_testing => bin/automated_detection_testing}/requirements.txt (100%) rename {automated_detection_testing => bin/automated_detection_testing}/templates/PR_template.j2 (100%) rename {automated_detection_testing => bin/automated_detection_testing}/templates/PR_template_attack_data.j2 (100%) diff --git a/automated_detection_testing/.dockerignore b/bin/automated_detection_testing/.dockerignore similarity index 100% rename from automated_detection_testing/.dockerignore rename to bin/automated_detection_testing/.dockerignore diff --git a/automated_detection_testing/Dockerfile b/bin/automated_detection_testing/Dockerfile similarity index 100% rename from automated_detection_testing/Dockerfile rename to bin/automated_detection_testing/Dockerfile diff --git a/automated_detection_testing/README.md b/bin/automated_detection_testing/README.md similarity index 100% rename from automated_detection_testing/README.md rename to bin/automated_detection_testing/README.md diff --git a/automated_detection_testing/architecture_automated_detection_testing.png b/bin/automated_detection_testing/architecture_automated_detection_testing.png similarity index 100% rename from automated_detection_testing/architecture_automated_detection_testing.png rename to bin/automated_detection_testing/architecture_automated_detection_testing.png diff --git a/automated_detection_testing/ci/attack_range_for_testing/Dockerfile b/bin/automated_detection_testing/ci/attack_range_for_testing/Dockerfile similarity index 100% rename from automated_detection_testing/ci/attack_range_for_testing/Dockerfile rename to bin/automated_detection_testing/ci/attack_range_for_testing/Dockerfile diff --git a/automated_detection_testing/ci/attack_range_for_testing/detection_service.py b/bin/automated_detection_testing/ci/attack_range_for_testing/detection_service.py similarity index 100% rename from automated_detection_testing/ci/attack_range_for_testing/detection_service.py rename to bin/automated_detection_testing/ci/attack_range_for_testing/detection_service.py diff --git a/automated_detection_testing/ci/attack_range_for_testing/helpers/attack_range_controller.py b/bin/automated_detection_testing/ci/attack_range_for_testing/helpers/attack_range_controller.py similarity index 100% rename from automated_detection_testing/ci/attack_range_for_testing/helpers/attack_range_controller.py rename to bin/automated_detection_testing/ci/attack_range_for_testing/helpers/attack_range_controller.py diff --git a/automated_detection_testing/ci/attack_range_for_testing/helpers/aws_service.py b/bin/automated_detection_testing/ci/attack_range_for_testing/helpers/aws_service.py similarity index 100% rename from automated_detection_testing/ci/attack_range_for_testing/helpers/aws_service.py rename to bin/automated_detection_testing/ci/attack_range_for_testing/helpers/aws_service.py diff --git a/automated_detection_testing/ci/attack_range_for_testing/helpers/github_service.py b/bin/automated_detection_testing/ci/attack_range_for_testing/helpers/github_service.py similarity index 100% rename from automated_detection_testing/ci/attack_range_for_testing/helpers/github_service.py rename to bin/automated_detection_testing/ci/attack_range_for_testing/helpers/github_service.py diff --git a/automated_detection_testing/ci/attack_range_for_testing/requirements.txt b/bin/automated_detection_testing/ci/attack_range_for_testing/requirements.txt similarity index 100% rename from automated_detection_testing/ci/attack_range_for_testing/requirements.txt rename to bin/automated_detection_testing/ci/attack_range_for_testing/requirements.txt diff --git a/automated_detection_testing/ci/detection_testing_batch/ansible/attack_replay.yml b/bin/automated_detection_testing/ci/detection_testing_batch/ansible/attack_replay.yml similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/ansible/attack_replay.yml rename to bin/automated_detection_testing/ci/detection_testing_batch/ansible/attack_replay.yml diff --git a/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml b/bin/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml rename to bin/automated_detection_testing/ci/detection_testing_batch/ansible/roles/attack_replay/tasks/main.yml diff --git a/automated_detection_testing/ci/detection_testing_batch/ansible/roles/update_escu/tasks/main.yml b/bin/automated_detection_testing/ci/detection_testing_batch/ansible/roles/update_escu/tasks/main.yml similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/ansible/roles/update_escu/tasks/main.yml rename to bin/automated_detection_testing/ci/detection_testing_batch/ansible/roles/update_escu/tasks/main.yml diff --git a/automated_detection_testing/ci/detection_testing_batch/ansible/update_escu.yml b/bin/automated_detection_testing/ci/detection_testing_batch/ansible/update_escu.yml similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/ansible/update_escu.yml rename to bin/automated_detection_testing/ci/detection_testing_batch/ansible/update_escu.yml diff --git a/automated_detection_testing/ci/detection_testing_batch/datamodels.conf.tar b/bin/automated_detection_testing/ci/detection_testing_batch/datamodels.conf.tar similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/datamodels.conf.tar rename to bin/automated_detection_testing/ci/detection_testing_batch/datamodels.conf.tar diff --git a/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py rename to bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py diff --git a/automated_detection_testing/ci/detection_testing_batch/indexes.conf.tar b/bin/automated_detection_testing/ci/detection_testing_batch/indexes.conf.tar similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/indexes.conf.tar rename to bin/automated_detection_testing/ci/detection_testing_batch/indexes.conf.tar diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/__init__.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/__init__.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/__init__.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/__init__.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/aws_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/aws_service.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/aws_service.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/aws_service.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/github_service.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/jsonschema_errorprinter.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/new_arguments2.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/tmp/tstats_endpoint_processes b/bin/automated_detection_testing/ci/detection_testing_batch/modules/tmp/tstats_endpoint_processes similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/tmp/tstats_endpoint_processes rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/tmp/tstats_endpoint_processes diff --git a/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py rename to bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py diff --git a/automated_detection_testing/ci/detection_testing_batch/new_arguments.py b/bin/automated_detection_testing/ci/detection_testing_batch/new_arguments.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/new_arguments.py rename to bin/automated_detection_testing/ci/detection_testing_batch/new_arguments.py diff --git a/automated_detection_testing/ci/detection_testing_batch/requirements.txt b/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/requirements.txt rename to bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt diff --git a/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/bin/automated_detection_testing/ci/detection_testing_batch/summarize_json.py similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/summarize_json.py rename to bin/automated_detection_testing/ci/detection_testing_batch/summarize_json.py diff --git a/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json similarity index 100% rename from automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json rename to bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json diff --git a/automated_detection_testing/ci/labeled_data/Dockerfile b/bin/automated_detection_testing/ci/labeled_data/Dockerfile similarity index 100% rename from automated_detection_testing/ci/labeled_data/Dockerfile rename to bin/automated_detection_testing/ci/labeled_data/Dockerfile diff --git a/automated_detection_testing/ci/labeled_data/ansible/attack_replay.yml b/bin/automated_detection_testing/ci/labeled_data/ansible/attack_replay.yml similarity index 100% rename from automated_detection_testing/ci/labeled_data/ansible/attack_replay.yml rename to bin/automated_detection_testing/ci/labeled_data/ansible/attack_replay.yml diff --git a/automated_detection_testing/ci/labeled_data/ansible/roles/attack_replay/tasks/main.yml b/bin/automated_detection_testing/ci/labeled_data/ansible/roles/attack_replay/tasks/main.yml similarity index 100% rename from automated_detection_testing/ci/labeled_data/ansible/roles/attack_replay/tasks/main.yml rename to bin/automated_detection_testing/ci/labeled_data/ansible/roles/attack_replay/tasks/main.yml diff --git a/automated_detection_testing/ci/labeled_data/ansible/roles/update_escu/tasks/main.yml b/bin/automated_detection_testing/ci/labeled_data/ansible/roles/update_escu/tasks/main.yml similarity index 100% rename from automated_detection_testing/ci/labeled_data/ansible/roles/update_escu/tasks/main.yml rename to bin/automated_detection_testing/ci/labeled_data/ansible/roles/update_escu/tasks/main.yml diff --git a/automated_detection_testing/ci/labeled_data/ansible/update_escu.yml b/bin/automated_detection_testing/ci/labeled_data/ansible/update_escu.yml similarity index 100% rename from automated_detection_testing/ci/labeled_data/ansible/update_escu.yml rename to bin/automated_detection_testing/ci/labeled_data/ansible/update_escu.yml diff --git a/automated_detection_testing/ci/labeled_data/labeled_data.py b/bin/automated_detection_testing/ci/labeled_data/labeled_data.py similarity index 100% rename from automated_detection_testing/ci/labeled_data/labeled_data.py rename to bin/automated_detection_testing/ci/labeled_data/labeled_data.py diff --git a/automated_detection_testing/ci/labeled_data/modules/DataManipulation.py b/bin/automated_detection_testing/ci/labeled_data/modules/DataManipulation.py similarity index 100% rename from automated_detection_testing/ci/labeled_data/modules/DataManipulation.py rename to bin/automated_detection_testing/ci/labeled_data/modules/DataManipulation.py diff --git a/automated_detection_testing/ci/labeled_data/modules/aws_service.py b/bin/automated_detection_testing/ci/labeled_data/modules/aws_service.py similarity index 100% rename from automated_detection_testing/ci/labeled_data/modules/aws_service.py rename to bin/automated_detection_testing/ci/labeled_data/modules/aws_service.py diff --git a/automated_detection_testing/ci/labeled_data/modules/github_service.py b/bin/automated_detection_testing/ci/labeled_data/modules/github_service.py similarity index 100% rename from automated_detection_testing/ci/labeled_data/modules/github_service.py rename to bin/automated_detection_testing/ci/labeled_data/modules/github_service.py diff --git a/automated_detection_testing/ci/labeled_data/modules/splunk_sdk.py b/bin/automated_detection_testing/ci/labeled_data/modules/splunk_sdk.py similarity index 100% rename from automated_detection_testing/ci/labeled_data/modules/splunk_sdk.py rename to bin/automated_detection_testing/ci/labeled_data/modules/splunk_sdk.py diff --git a/automated_detection_testing/ci/labeled_data/modules/testing_service.py b/bin/automated_detection_testing/ci/labeled_data/modules/testing_service.py similarity index 100% rename from automated_detection_testing/ci/labeled_data/modules/testing_service.py rename to bin/automated_detection_testing/ci/labeled_data/modules/testing_service.py diff --git a/automated_detection_testing/ci/labeled_data/requirements.txt b/bin/automated_detection_testing/ci/labeled_data/requirements.txt similarity index 100% rename from automated_detection_testing/ci/labeled_data/requirements.txt rename to bin/automated_detection_testing/ci/labeled_data/requirements.txt diff --git a/automated_detection_testing/ci/python_ci_code/main.py b/bin/automated_detection_testing/ci/python_ci_code/main.py similarity index 100% rename from automated_detection_testing/ci/python_ci_code/main.py rename to bin/automated_detection_testing/ci/python_ci_code/main.py diff --git a/automated_detection_testing/ci/python_ci_code/requirements.txt b/bin/automated_detection_testing/ci/python_ci_code/requirements.txt similarity index 100% rename from automated_detection_testing/ci/python_ci_code/requirements.txt rename to bin/automated_detection_testing/ci/python_ci_code/requirements.txt diff --git a/automated_detection_testing/config b/bin/automated_detection_testing/config similarity index 100% rename from automated_detection_testing/config rename to bin/automated_detection_testing/config diff --git a/automated_detection_testing/detection_service.py b/bin/automated_detection_testing/detection_service.py similarity index 100% rename from automated_detection_testing/detection_service.py rename to bin/automated_detection_testing/detection_service.py diff --git a/automated_detection_testing/requirements.txt b/bin/automated_detection_testing/requirements.txt similarity index 100% rename from automated_detection_testing/requirements.txt rename to bin/automated_detection_testing/requirements.txt diff --git a/automated_detection_testing/templates/PR_template.j2 b/bin/automated_detection_testing/templates/PR_template.j2 similarity index 100% rename from automated_detection_testing/templates/PR_template.j2 rename to bin/automated_detection_testing/templates/PR_template.j2 diff --git a/automated_detection_testing/templates/PR_template_attack_data.j2 b/bin/automated_detection_testing/templates/PR_template_attack_data.j2 similarity index 100% rename from automated_detection_testing/templates/PR_template_attack_data.j2 rename to bin/automated_detection_testing/templates/PR_template_attack_data.j2 From 5a554f3b5b59b019dd9746645d46e5d4bf137a9f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 8 Dec 2021 14:09:22 -0800 Subject: [PATCH 135/203] Updated paths in workflows that changed due to relocating the automated_detection_testing folder in bin/ --- .github/workflows/build-and-validate.yml | 82 ++++++++++++------------ 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index fce542b2ee..c6ed4e4db5 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -324,7 +324,7 @@ jobs: uses: actions/download-artifact@v2 with: name: content-latest - path: automated_detection_testing/ci/detection_testing_batch/prior_config/apps + path: bin/automated_detection_testing/ci/detection_testing_batch/prior_config/apps - uses: actions/setup-python@v2 with: @@ -333,7 +333,7 @@ jobs: - name: Install Python Dependencies run: | - cd automated_detection_testing/ci/detection_testing_batch + cd bin/automated_detection_testing/ci/detection_testing_batch python3 -m venv .venv source .venv/bin/activate python3 -m pip install wheel @@ -341,7 +341,7 @@ jobs: - name: Run the CI run: | - cd automated_detection_testing/ci/detection_testing_batch + cd bin/automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate echo "github.event.issue.pull_request : [${{ github.event.issue.pull_request }}]" echo "github.event.pull_request.number : [${{ github.event.pull_request.number }}]" @@ -367,24 +367,24 @@ jobs: with: name: testing-results-config path: | - automated_detection_testing/ci/detection_testing_batch/prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_0.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_1.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_2.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_3.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_4.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_5.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_6.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_7.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_8.json - automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_9.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_0.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_1.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_2.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_3.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_4.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_5.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_6.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_7.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_8.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_9.json - name: Upload File to Enable Replication of the Test at a Different Time or Place uses: actions/upload-artifact@v2 with: name: replicate_test path: | - automated_detection_testing/ci/detection_testing_batch/replicate_test.json + bin/automated_detection_testing/ci/detection_testing_batch/replicate_test.json docker-detection-testing-execution: runs-on: ubuntu-latest @@ -414,7 +414,7 @@ jobs: uses: actions/download-artifact@v2 with: name: testing-results-config - path: automated_detection_testing/ci/detection_testing_batch/prior_config + path: bin/automated_detection_testing/ci/detection_testing_batch/prior_config # - name: Install Docker # run: | # sudo apt update -qq @@ -433,7 +433,7 @@ jobs: - name: Install Python Dependencies run: | - cd automated_detection_testing/ci/detection_testing_batch + cd bin/automated_detection_testing/ci/detection_testing_batch python3 -m venv .venv source .venv/bin/activate python3 -m pip install wheel @@ -441,7 +441,7 @@ jobs: - name: Run the CI run: | - cd automated_detection_testing/ci/detection_testing_batch + cd bin/automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate python3 detection_testing_execution.py run -c prior_config/${{ matrix.manifest_filename}} --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} @@ -452,16 +452,16 @@ jobs: with: name: ${{ matrix.manifest_filename}}.results path: | - automated_detection_testing/ci/detection_testing_batch/test_results/success.csv - automated_detection_testing/ci/detection_testing_batch/test_results/error.csv - automated_detection_testing/ci/detection_testing_batch/test_results/failure.csv - automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv - automated_detection_testing/ci/detection_testing_batch/test_results/success.json - automated_detection_testing/ci/detection_testing_batch/test_results/error.json - automated_detection_testing/ci/detection_testing_batch/test_results/failure.json - automated_detection_testing/ci/detection_testing_batch/test_results/combined.json + bin/automated_detection_testing/ci/detection_testing_batch/test_results/success.csv + bin/automated_detection_testing/ci/detection_testing_batch/test_results/error.csv + bin/automated_detection_testing/ci/detection_testing_batch/test_results/failure.csv + bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv + bin/automated_detection_testing/ci/detection_testing_batch/test_results/success.json + bin/automated_detection_testing/ci/detection_testing_batch/test_results/error.json + bin/automated_detection_testing/ci/detection_testing_batch/test_results/failure.json + bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.json - automated_detection_testing/ci/detection_testing_batch/test_results/summary.json + bin/automated_detection_testing/ci/detection_testing_batch/test_results/summary.json docker-detection-testing-execution-merge-results: runs-on: ubuntu-latest @@ -480,52 +480,52 @@ jobs: uses: actions/download-artifact@v2 with: name: config_tests_0.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_0 + path: bin/automated_detection_testing/ci/detection_testing_batch/results_0 - name: Download artifacts uses: actions/download-artifact@v2 with: name: config_tests_1.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_1 + path: bin/automated_detection_testing/ci/detection_testing_batch/results_1 - name: Download artifacts uses: actions/download-artifact@v2 with: name: config_tests_2.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_2 + path: bin/automated_detection_testing/ci/detection_testing_batch/results_2 - name: Download artifacts uses: actions/download-artifact@v2 with: name: config_tests_3.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_3 + path: bin/automated_detection_testing/ci/detection_testing_batch/results_3 - name: Download artifacts uses: actions/download-artifact@v2 with: name: config_tests_4.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_4 + path: bin/automated_detection_testing/ci/detection_testing_batch/results_4 - name: Download artifacts uses: actions/download-artifact@v2 with: name: config_tests_5.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_5 + path: bin/automated_detection_testing/ci/detection_testing_batch/results_5 - name: Download artifacts uses: actions/download-artifact@v2 with: name: config_tests_6.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_6 + path: bin/automated_detection_testing/ci/detection_testing_batch/results_6 - name: Download artifacts uses: actions/download-artifact@v2 with: name: config_tests_7.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_7 + path: bin/automated_detection_testing/ci/detection_testing_batch/results_7 - name: Download artifacts uses: actions/download-artifact@v2 with: name: config_tests_8.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_8 + path: bin/automated_detection_testing/ci/detection_testing_batch/results_8 - name: Download artifacts uses: actions/download-artifact@v2 with: name: config_tests_9.json.results - path: automated_detection_testing/ci/detection_testing_batch/results_9 + path: bin/automated_detection_testing/ci/detection_testing_batch/results_9 - uses: actions/setup-python@v2 with: @@ -534,7 +534,7 @@ jobs: - name: Install Python Dependencies run: | - cd automated_detection_testing/ci/detection_testing_batch + cd bin/automated_detection_testing/ci/detection_testing_batch python3 -m venv .venv source .venv/bin/activate python3 -m pip install wheel @@ -542,7 +542,7 @@ jobs: - name: Merge Detections into single File run: | - cd automated_detection_testing/ci/detection_testing_batch + cd bin/automated_detection_testing/ci/detection_testing_batch source .venv/bin/activate python summarize_json.py --files results_*/summary.json --output_filename summary_test_results.json @@ -553,7 +553,7 @@ jobs: with: name: SummaryTestResults path: | - automated_detection_testing/ci/detection_testing_batch/summary_test_results.json + bin/automated_detection_testing/ci/detection_testing_batch/summary_test_results.json - name: Upload Failures Manifest on Failure uses: actions/upload-artifact@v2 @@ -561,7 +561,7 @@ jobs: with: name: DetectionFailureManifest path: | - automated_detection_testing/ci/detection_testing_batch/detection_failure_manifest.json + bin/automated_detection_testing/ci/detection_testing_batch/detection_failure_manifest.json #Always clean these up, they make the output messy From 49695ed2c5882d54f131d4c15f89f81028644de9 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 14 Dec 2021 12:59:17 -0800 Subject: [PATCH 136/203] Preparing fixes for properly allowing testing to include or exclude folders. For example, by default we will not include and test detections or tests in experimental. --- .../modules/github_service.py | 86 ++++++++++++++++--- .../modules/splunk_container.py | 7 +- 2 files changed, 81 insertions(+), 12 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 71c14c3104..c12fa2bf76 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -7,11 +7,12 @@ import subprocess import sys from typing import Union from docker import types - +import datetime import git import yaml from git.objects import base - +from modules import testing_service +import pathlib # Logger logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO")) @@ -62,6 +63,56 @@ class GithubService: self.commit_hash = commit_hash + def update_and_commit_passed_tests(self, results:list[dict])->bool: + + changed_file_paths = [] + for result in results: + detection_obj_path = os.path.join("security_content","detections",result['detection_file']) + + test_obj_path = detection_obj_path.replace("detections", "tests", 1) + test_obj_path = test_obj_path.replace(".yml",".test.yml") + + detection_obj = testing_service.load_file(detection_obj_path) + test_obj = testing_service.load_file(test_obj_path) + detection_obj['tags']['automated_detection_testing'] = 'passed' + #detection_obj['tags']['automated_detection_testing_date'] = datetime.datetime.today().strftime('%Y-%m-%d-%H:%M:%S') + + for o in test_obj['tests']: + if 'attack_data' in o: + datasets = [] + for dataset in o['attack_data']: + datasets.append(dataset['data']) + detection_obj['tags']['dataset'] = datasets + with open(detection_obj_path, "w") as f: + yaml.dump(detection_obj, f, sort_keys=False, allow_unicode=True) + + changed_file_paths.append(detection_obj_path) + + relpaths = [pathlib.Path(*pathlib.Path(p).parts[1:]).as_posix() for p in changed_file_paths] + newpath = relpaths[0]+'.wow' + relpaths.append(newpath) + with open('security_content/' + newpath,'w') as d: + d.write("fake file") + print("status results:") + print(self.security_content_repo_obj.index.diff(self.security_content_repo_obj.head.commit)) + + if len(relpaths) > 0: + print('there is at least one changed file') + print(relpaths) + self.security_content_repo_obj.index.add(relpaths) + print("status results after add:") + print(self.security_content_repo_obj.index.diff(self.security_content_repo_obj.head.commit)) + + commit_message = "The following detections passed detection testing. Their YAMLs have been updated and their datasets linked:\n - %s"%("\n - ".join(relpaths)) + self.security_content_repo_obj.index.commit(commit_message) + return True + else: + return False + + + + + return True def clone_project(self, url, project, branch): LOGGER.info(f"Clone Security Content Project") @@ -214,9 +265,9 @@ class GithubService: branch1 = self.security_content_branch branch2 = 'develop' g = git.Git('security_content') - changed_test_files = [] + all_changed_test_files = [] - changed_detection_files = [] + all_changed_detection_files = [] if branch1 != 'develop': if self.commit_hash is None: differ = g.diff('--name-status', branch2 + '...' + branch1) @@ -230,11 +281,11 @@ class GithubService: # added or changed test files if file_path.startswith('A') or file_path.startswith('M'): if 'tests' in file_path and os.path.basename(file_path).endswith('.test.yml'): - changed_test_files.append(file_path) + all_changed_test_files.append(file_path) # changed detections if 'detections' in file_path and os.path.basename(file_path).endswith('.yml'): - changed_detection_files.append(file_path) + all_changed_detection_files.append(file_path) else: print("Looking for changed detections by diffing [%s] against [%s]. They are the same branch, so none were returned." % ( branch1, branch2), file=sys.stderr) @@ -242,11 +293,26 @@ class GithubService: # all files have the format A\tFILENAME or M\tFILENAME. Get rid of those leading characters - changed_test_files = [os.path.join("security_content", name.split( - '\t')[1]) for name in changed_test_files if len(name.split('\t')) == 2] - changed_detection_files = [os.path.join("security_content", name.split( - '\t')[1]) for name in changed_detection_files if len(name.split('\t')) == 2] + all_changed_test_files = [os.path.join("security_content", name.split( + '\t')[1]) for name in all_changed_test_files if len(name.split('\t')) == 2] + all_changed_detection_files = [os.path.join("security_content", name.split( + '\t')[1]) for name in all_changed_detection_files if len(name.split('\t')) == 2] + + + #Trim out any of the tests/detection that are not in the selected folders, but at least print a notice + # to the user. + changed_test_files = [x for x in all_changed_test_files if len(pathlib.Path(x).parts) > 3 and + pathlib.Path(x).parts[2] in folders ] + changed_detection_files = [x for x in all_changed_detection_files if + (len(pathlib.Path(x).parts) > 3 and pathlib.Path(x).parts[2] in folders) ] + + #Print out the skipped tests to the user + for missing in set(changed_test_files).intersection(all_changed_test_files): + print("Ignoring modified test [%s] not in set of selected folders: %s"%(missing,folders)) + + for missing in set(changed_detection_files).intersection(all_changed_detection_files): + print("Ignoring modified detecton [%s] not in set of selected folders: %s"%(missing,folders)) # Convert the test files to the detection file equivalent. # Note that some of these tests may be baselines and their associated diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 251a0fab14..71ef0f66fc 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -355,6 +355,10 @@ class SplunkContainer: # Try to get something from the queue detection_to_test = self.synchronization_object.getTest() + + # Sleep for a small random time so that containers drift apart and don't synchronize their testing + time.sleep(random.randint(1, 30)) + if detection_to_test is None: try: print( @@ -404,5 +408,4 @@ class SplunkContainer: ) self.num_tests_completed += 1 - # Sleep for a small random time so that containers drift apart and don't synchronize their testing - time.sleep(random.randint(1, 30)) + From a475df1cb0b8e3c82d9293753df27019ee586976 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 14 Dec 2021 13:01:07 -0800 Subject: [PATCH 137/203] Removed throwing error if experimental is in the path of a test/detection. --- .../ci/detection_testing_batch/modules/github_service.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index c12fa2bf76..742ccc2f3c 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -324,9 +324,9 @@ class GithubService: # converted_test_files.append(detection_filename) #check and throw an error if we somehow got experimental tests - experimental_tests = [x for x in changed_test_files if 'experimental' in x] - if len(experimental_tests) > 0: - raise(Exception("Error - expected no experimental detections, but found:\n\t%s]"%("\n\t".join(experimental_tests)))) + #experimental_tests = [x for x in changed_test_files if 'experimental' in x] + #if len(experimental_tests) > 0: + # raise(Exception("Error - expected no experimental detections, but found:\n\t%s]"%("\n\t".join(experimental_tests)))) #Get the appropriate detection file paths for a modified test file for test_filepath in changed_test_files: From 34cfcef5cbea2b9896e729f6fa184b7621d64567 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 14 Dec 2021 13:14:31 -0800 Subject: [PATCH 138/203] Fixed a bug where we were printing the wrong skipped tests due to folder names. Instead we were printing the tests we did not skip. --- .../ci/detection_testing_batch/modules/github_service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 742ccc2f3c..fd0c6b1afb 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -308,10 +308,10 @@ class GithubService: (len(pathlib.Path(x).parts) > 3 and pathlib.Path(x).parts[2] in folders) ] #Print out the skipped tests to the user - for missing in set(changed_test_files).intersection(all_changed_test_files): + for missing in set(changed_test_files).symmetric_difference(all_changed_test_files): print("Ignoring modified test [%s] not in set of selected folders: %s"%(missing,folders)) - for missing in set(changed_detection_files).intersection(all_changed_detection_files): + for missing in set(changed_detection_files).symmetric_difference(all_changed_detection_files): print("Ignoring modified detecton [%s] not in set of selected folders: %s"%(missing,folders)) # Convert the test files to the detection file equivalent. From c8082984f063417a1065ee50ffb387abed127bca Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 17 Dec 2021 10:13:49 -0800 Subject: [PATCH 139/203] A large number of changes and fixes to make everything smoother. The largest differences are improving detection of containers that take too long to start (or that crash while) they are starting by adding a timeout. That timeout is set to 360 seconds and might need to be tuned in the future to a larger number since this was tested on a fast machine with fast network. The other large change is an initial pass at updating and committing detections that have passed the test back to the repo. This still needs a lot of testing and refinement. --- .../detection_testing_execution.py | 6 ++ .../modules/github_service.py | 12 +-- .../modules/splunk_container.py | 86 +++++++++---------- .../modules/splunk_sdk.py | 43 ++++++++-- .../modules/validate_args.py | 2 +- .../detection_testing_batch/requirements.txt | 1 + 6 files changed, 87 insertions(+), 63 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 7340dd969e..2bc41acdf8 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -335,6 +335,9 @@ def main(args: list[str]): (settings['commit_hash'],settings['branch'],settings['pr_number']),file=sys.stderr) sys.exit(1) + #passes = [{'search_string': '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where (Processes.process_name ="7z.exe" OR Processes.process_name = "7za.exe" OR Processes.original_file_name = "7z.exe" OR Processes.original_file_name = "7za.exe") AND (Processes.process="*\\\\C$\\\\*" OR Processes.process="*\\\\Admin$\\\\*" OR Processes.process="*\\\\IPC$\\\\*") by Processes.original_file_name Processes.parent_process_name Processes.parent_process Processes.process_name Processes.process Processes.parent_process_id Processes.process_id Processes.dest Processes.user | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `7zip_commandline_to_smb_share_path_filter` | stats count | where count > 0', 'detection_name': '7zip CommandLine To SMB Share Path', 'detection_file': 'endpoint/7zip_commandline_to_smb_share_path.yml', 'success': True, 'error': False, 'diskUsage': '286720', 'runDuration': '0.922', 'scanCount': '4897'}] + #github_service.update_and_commit_passed_tests(passes) + #sys.exit(0) # Make a backup of this config containing the hash and stripped credentials. # This makes the test perfectly reproducible. validate_args.validate_and_write( @@ -435,6 +438,9 @@ def main(args: list[str]): result = cm.run_test() + github_service.update_and_commit_passed_tests(cm.synchronization_object.successes) + + #Return code indicates whether testing succeeded and all tests were run. #It does NOT indicate that all tests passed! if result is True: diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index fd0c6b1afb..798ae31914 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -313,7 +313,7 @@ class GithubService: for missing in set(changed_detection_files).symmetric_difference(all_changed_detection_files): print("Ignoring modified detecton [%s] not in set of selected folders: %s"%(missing,folders)) - + # Convert the test files to the detection file equivalent. # Note that some of these tests may be baselines and their associated # detection could be in experimental or not in the experimental folder @@ -323,11 +323,7 @@ class GithubService: # *pathlib.Path(test_filepath).parts[-2:])).replace("tests", "detections", 1) # converted_test_files.append(detection_filename) - #check and throw an error if we somehow got experimental tests - #experimental_tests = [x for x in changed_test_files if 'experimental' in x] - #if len(experimental_tests) > 0: - # raise(Exception("Error - expected no experimental detections, but found:\n\t%s]"%("\n\t".join(experimental_tests)))) - + #Get the appropriate detection file paths for a modified test file for test_filepath in changed_test_files: folder_and_filename = str(pathlib.Path(*pathlib.Path(test_filepath).parts[-2:])) @@ -350,10 +346,6 @@ class GithubService: if name not in changed_detection_files: changed_detection_files.append(name) - #check and throw an error if we somehow got experimental detections - experimental_detections = [x for x in changed_detection_files if 'experimental' in x] - if len(experimental_detections) > 0: - raise(Exception("Error - expected no experimental detections, but found:\n\t%s"%('\n\t'.join(experimental_detections)))) return self.prune_detections(changed_detection_files, types_to_test, previously_successful_tests) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 71ef0f66fc..efb423be2e 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -16,11 +16,13 @@ import time import timeit from typing import Union import threading +import wrapt_timeout_decorator +import sys SPLUNKBASE_URL = "https://splunkbase.splunk.com/app/%d/release/%s/download" SPLUNK_START_ARGS = "--accept-license" - +MAX_CONTAINER_START_TIME_SECONDS = 360 class SplunkContainer: def __init__( self, @@ -68,6 +70,7 @@ class SplunkContainer: self.test_start_time = -1 self.num_tests_completed = 0 + def prepare_apps_path( self, local_apps: OrderedDict, @@ -274,42 +277,38 @@ class SplunkContainer: def wait_for_splunk_ready( self, - max_seconds: int = 300, - seconds_between_attempts: int = 5, + seconds_between_attempts: int = 10, ) -> bool: # The smarter version of this will try to hit one of the pages, # probably the login page, and when that is available it means that # splunk is fully started and ready to go. Until then, we just # use a simple sleep - splunk_ready_url = "http://%s:%d" % (self.splunk_ip, self.web_port) - start = timeit.default_timer() + + while True: try: - # Splunk container will not have proper ssl certificate - response = requests.get( - splunk_ready_url, timeout=seconds_between_attempts, verify=False) - response.raise_for_status() - return True + service = splunk_sdk.client.connect(host=self.splunk_ip, port=self.management_port, username='admin', password=self.container_password) + if service.restart_required: + #The sleep below will wait + pass + else: + return True + except Exception as e: - elapsed = timeit.default_timer() - start - - if elapsed > max_seconds: - self.stopContainer() - raise ( - Exception( - "Container [%s] took longer than maximum start time of [%d].\n\tStopping container..." - % (self.container_name, max_seconds) - ) - ) + # There is a good chance the server is restarting, so the SDK connection failed. + # Or, we tried to check restart_required while the server was restarting. In the + # calling function, we have a timeout, so it's okay if this function could get + # stuck in an infinite loop (the caller will generate a timeout error) + pass time.sleep(seconds_between_attempts) - def run_container(self) -> None: - print("Starting the container [%s]" % (self.container_name)) - self.container_start_time = timeit.default_timer() - self.container.start() + + @wrapt_timeout_decorator.timeout(MAX_CONTAINER_START_TIME_SECONDS, timeout_exception=RuntimeError) + def setup_container(self): + self.container.start() # By default, first copy the index file then the datamodel file for file_description, file_dict in self.files_to_copy_to_container.items(): self.extract_tar_file_to_container( @@ -317,35 +316,34 @@ class SplunkContainer: ) print("Finished copying files to [%s]" % (self.container_name)) + self.wait_for_splunk_ready() + - try: - while not splunk_sdk.enable_delete_for_admin(self.splunk_ip, self.management_port, self.container_password): - time.sleep(10) - except Exception as e: - print( - "Failure enabling DELETE for container [%s]: [%s].\n\tQuitting..." - % (self.container_name, str(e)) - ) - - # Wait for all of the threads to join here - print( - "Container [%s] setup complete and waiting for other containers to be ready..." - % (self.container_name) - ) - - self.synchronization_object.start_barrier.wait() + def run_container(self) -> None: + print("Starting the container [%s]" % (self.container_name)) + self.container_start_time = timeit.default_timer() + + container_start_time = timeit.default_timer() try: - self.wait_for_splunk_ready() + self.setup_container() except Exception as e: - print("Error starting docker container: [%s]"%(str(e))) + print("There was an exception starting the container [%s]: [%s]. Shutting down container"%(self.container_name,str(e)),file=sys.stdout) + self.stopContainer() + elapsed_rounded = round(timeit.default_timer() - container_start_time) + time_string = (datetime.timedelta(seconds=elapsed_rounded)) + print("Container [%s] FAILED in [%s]"%(self.container_name, time_string)) return None - #input("CONTAINTER WANTS TO START.... WAIT FOR INPUT FROM USER") + + + #GTive some info about how long the container took to start up + elapsed_rounded = round(timeit.default_timer() - container_start_time) + time_string = (datetime.timedelta(seconds=elapsed_rounded)) + print("Container [%s] took [%s] to start"%(self.container_name, time_string)) # Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1, 30)) - self.test_start_time = timeit.default_timer() while True: if self.synchronization_object.checkContainerFailure(): diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 9c0c567caf..0ed8259077 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -175,15 +175,42 @@ def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wa print("FILENAME : [%s]"%(detection_filename)) print("SEARCH :\n%s"%(search_string)) _ = input("****************Press ENTER to Complete Test and DELETE data****************\n\n\n") - splunk_search = 'search index=main | delete' + + data_exists = True + already_enabled_delete = False + while data_exists: + splunk_search = 'search index=main | delete' - kwargs = {"exec_mode": "blocking", - "dispatch.earliest_time": "-1d", - "dispatch.latest_time": "now"} + kwargs = {"dispatch.earliest_time": "-1d", + "dispatch.latest_time": "now"} + try: + + job = service.jobs.oneshot(splunk_search, **kwargs) + reader = results.ResultsReader(job) + error_in_results = False + for result in reader: + if hasattr(result,"message") and hasattr(result,"type") and ("You have insufficient privileges to delete events" in result.message or result.type == "FATAL"): + print("Delete is not enabled for admin: [%s] - enabling delete and trying to delete again..."%(result.message), file=sys.stderr) + if already_enabled_delete is True: + print("We already enabled delete, but the setting did not take effect.") + raise(Exception("Enabling delete command failed to take effect")) + if enable_delete_for_admin(splunk_host, splunk_port,splunk_password) != True: + raise(Exception("Failure enabling delete for admin. We cannot continue")) + # We enabled delete, so now we will try to delete again + already_enabled_delete = True + break + else: + #This is not one of the error messages, do nothing + pass - try: - job = service.jobs.create(splunk_search, **kwargs) - except Exception as e: - raise(Exception("Unable to execute search: " + str(e))) + #No need to issue Delete command again, we will now break out of the loop + if error_in_results is False: + data_exists = False + + #Otherwise, we will loop again + + except Exception as e: + raise(Exception("Unable to delete data from a run: " + str(e))) + return True diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 86c8f81a3f..2b9933fed8 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -250,7 +250,7 @@ setup_schema = { "type": "array", "items": { "type": "string", - "enum": ["endpoint", "cloud", "network"] + "enum": ["endpoint", "cloud", "network","web"] }, "default": ["endpoint", "cloud", "network"] }, diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt b/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt index c2cd26da5c..d8419b7d63 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt +++ b/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt @@ -16,3 +16,4 @@ docker==5.0.3 #For help getting and parsing the configuration jsonschema==4.2.1 +wrapt_timeout_decorator==1.3.1 From 76364bf1c0310a26d2b7b24084b16945e966c975 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Fri, 17 Dec 2021 20:06:42 -0800 Subject: [PATCH 140/203] Updated the default configuration to use attack_range apps stored on S3. Pointed at the PATCHED linux_sysmon. Added a slight delay in between starts of containers for performance reasons. Enabled better handling and ability to download http_path local apps to a folder instead of passing them in as string for the container to download. --- .../detection_testing_execution.py | 86 ++++--- .../modules/container_manager.py | 2 + .../modules/splunk_container.py | 18 +- .../modules/validate_args.py | 217 +++++++++++++----- 4 files changed, 230 insertions(+), 93 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 2bc41acdf8..3e5cd98672 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -3,7 +3,6 @@ import copy import csv import json import os -from posixpath import basename import queue import random import secrets @@ -15,22 +14,23 @@ import threading import time from collections import OrderedDict from datetime import datetime, timedelta +from posixpath import basename from tempfile import mkdtemp from timeit import default_timer as timer from typing import Union +from urllib.parse import urlparse import docker +import requests import requests.packages.urllib3 from docker.client import DockerClient from requests import get -from modules import new_arguments2 -from modules.validate_args import validate_and_write -from modules import container_manager import modules.new_arguments2 -from modules import aws_service, testing_service, validate_args +from modules import (aws_service, container_manager, new_arguments2, + testing_service, validate_args) from modules.github_service import GithubService -from modules.validate_args import validate +from modules.validate_args import validate, validate_and_write SPLUNK_CONTAINER_APPS_DIR = "/opt/splunk/etc/apps" index_file_local_path = "indexes.conf.tar" @@ -45,23 +45,53 @@ datamodel_file_container_path = os.path.join( MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING = 2 +def download_file_from_http(url:str, target:str)->None: + #Will just overwrite an existing file + file_to_download = requests.get(url, stream=True) + with open(target, "wb") as output: + for piece in file_to_download.iter_content(chunk_size=(1024*1024)): + output.write(piece) + + def copy_local_apps_to_directory(apps: dict[str, dict], target_directory) -> None: for key, item in apps.items(): - source_path = os.path.abspath(os.path.expanduser(item['local_path'])) - base_name = os.path.basename(source_path) - dest_path = os.path.join(target_directory, base_name) + + #local apps can either have a local_path or an http_path + if 'local_path' in item: + source_path = os.path.abspath(os.path.expanduser(item['local_path'])) + base_name = os.path.basename(source_path) + dest_path = os.path.join(target_directory, base_name) + try: + shutil.copy(source_path, dest_path) + item['local_path'] = dest_path + except shutil.SameFileError as e: + # Same file, not a real error. The copy just doesn't happen + print("err:%s" % (str(e))) + pass + except Exception as e: + print("Error copying ESCU Package [%s] to [%s]: [%s].\n\tQuitting..." % ( + source_path, dest_path, str(e)), file=sys.stderr) + sys.exit(1) + + # These apps are URLs that will be passed. The apps will be downloaded and installed by the container + # # Get the file from an http source + # elif 'http_path' in item: + # http_path = item['http_path'] + # try: + # url_parse_obj = urlparse(http_path) + # path_after_host = url_parse_obj[2].rstrip('/') #removes / at the end, if applicable + # base_name = path_after_host.rpartition('/')[-1] #just get the file name + # dest_path = os.path.join(target_directory, base_name) #write the whole path + # download_file_from_http(http_path, dest_path) + # #we need to updat the local path because this is used to copy it into the container later + # item['local_path'] = dest_path + # except Exception as e: + # print("Error trying to download %s @ %s: [%s]. This app is required.\n\tQuitting..."%(key, http_path, str(e)),file=sys.stderr) + # sys.exit(1) + # else: + # print("Error - trying to install a local app that does not have 'local_path' or 'http_path'.\n\tQuitting...") + # sys.exit(1) - try: - shutil.copy(source_path, dest_path) - item['local_path'] = dest_path - except shutil.SameFileError as e: - # Same file, not a real error. The copy just doesn't happen - print("err:%s" % (str(e))) - pass - except Exception as e: - print("Error copying ESCU Package [%s] to [%s]: [%s].\n\tQuitting..." % ( - source_path, dest_path, str(e)), file=sys.stderr) - sys.exit(1) def ensure_security_content(branch: str, commit_hash: str, pr_number: Union[int, None], persist_security_content: bool) -> GithubService: @@ -105,13 +135,13 @@ def generate_escu_app(persist_security_content: bool = False) -> str: if persist_security_content is False: commands = ["python3 -m venv .venv", ". ./.venv/bin/activate", - "python3 -m pip install wheel", - "python3 -m pip install -r requirements.txt", - "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", + "python -m pip install wheel", + "python -m pip install -r requirements.txt", + "python contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] else: commands = [". ./.venv/bin/activate", - "python3 contentctl.py --path . --verbose generate --product ESCU --output dist/escu", + "python contentctl.py --path . --verbose generate --product ESCU --output dist/escu", "tar -czf DA-ESS-ContentUpdate.spl -C dist/escu ."] ret = subprocess.run("; ".join(commands), shell=True, capture_output=True) @@ -171,10 +201,10 @@ def generate_escu_app(persist_security_content: bool = False) -> str: "cd slim_latest", "virtualenv --python=/usr/bin/python2.7 --clear .venv", ". ./.venv/bin/activate", - "python3 -m pip install --upgrade pip", - "python2 -m pip install wheel", - "python2 -m pip install semantic_version", - "python2 -m pip install .", + "python -m pip install --upgrade pip", + "python -m pip install wheel", + "python -m pip install semantic_version", + "python -m pip install .", "cp -R ../../dist/escu DA-ESS-ContentUpdate", "slim package -o upload DA-ESS-ContentUpdate", "cp upload/DA-ESS-ContentUpdate*.tar.gz %s" % (output_file_path_from_slim_latest)] diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index b11f1669dd..2635cdc24c 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -125,6 +125,8 @@ class ContainerManager: def run_containers(self) -> None: for container in self.containers: + #give a little time between container startup + time.sleep(15) container.thread.start() diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index efb423be2e..648a33b488 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -82,9 +82,16 @@ class SplunkContainer: require_credentials = False for app_name, app_info in self.local_apps.items(): - app_file_name = os.path.basename(app_info['local_path']) - app_file_container_path = os.path.join("/tmp/apps", app_file_name) - apps_to_install.append(app_file_container_path) + + if 'local_path' in app_info: + app_file_name = os.path.basename(app_info['local_path']) + app_file_container_path = os.path.join("/tmp/apps", app_file_name) + apps_to_install.append(app_file_container_path) + elif 'http_path' in app_info: + apps_to_install.append(app_info['http_path']) + else: + print("Error, the app %s: %s has no http_path or local_path.\n\tQuitting..."%(app_name,app_info), file=sys.stderr) + sys.exit(1) for app_name, app_info in self.splunkbase_apps.items(): @@ -99,7 +106,9 @@ class SplunkContainer: # elif app["location"] == "local": # apps_to_install.append(app["container_path"]) - + #for printing out all the app paths we will install + #for num, name in zip(range(len(apps_to_install)),apps_to_install): + # print("%d: %s"%(num,name)) return ",".join(apps_to_install), require_credentials def make_environment( @@ -116,6 +125,7 @@ class SplunkContainer: splunk_apps_url, require_credentials = self.prepare_apps_path( local_apps, splunkbase_apps, splunkbase_username, splunkbase_password ) + if require_credentials: env["SPLUNKBASE_USERNAME"] = splunkbase_username env["SPLUNKBASE_PASSWORD"] = splunkbase_password diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 2b9933fed8..868c2455c8 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -93,7 +93,99 @@ setup_schema = { "app_number": 3449, "app_version": None, "local_path": None - } + }, + #The default apps below were taken from the attack_range loadout: https://github.com/splunk/attack_range/blob/develop/attack_range.conf.template + "SPLUNK_WINDOWS_TA": { + "app_number": 0, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-windows_812.tgz" + }, + "SPLUNK_ADD_ON_FOR_SYSMON_OLD": { + "app_number": 1, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-sysmon_1062.tgz" + }, + "SPLUNK_SYSMON_LINUX_TA_PATCHED": { + "app_number": 2, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/add-on-for-linux-sysmon_103_PATCHED.tgz" + }, + "SPLUNK_CIM_APP": { + "app_number": 3, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-common-information-model-cim_4200.tgz" + }, + "SPLUNK_AWS_TA": { + "app_number": 4, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-amazon-web-services_510.tgz" + }, + "SPLUNK_PYTHON_APP": { + "app_number": 5, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/python-for-scientific-computing-for-linux-64-bit_202.tgz" + }, + "SPLUNK_ASX_APP": { + "app_number": 17, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/Splunk_ASX-latest.tar.gz" + }, + "SPLUNK_MLTK_APP": { + "app_number": 6, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-machine-learning-toolkit_521.tgz" + }, + "SPLUNK_STREAM_APP": { + "app_number": 7, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-app-for-stream_730.tgz" + }, + "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA": { + "app_number": 8, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-stream-wire-data_730.tgz" + }, + "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS": { + "app_number": 9, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-stream-forwarders_730.tgz" + }, + "SPLUNK_SECURITY_ESSENTIALS": { + "app_number": 10, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-security-essentials_333.tgz" + }, + "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO": { + "app_number": 11, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-zeek-aka-bro_400.tgz" + }, + "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE": { + "app_number": 12, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-amazon-kinesis-firehose_131r7d1d093.tgz" + }, + "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365": { + "app_number": 13, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-office-365_202.tgz" + }, + "SPLUNK_LINUX_TA": { + "app_number": 14, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-unix-and-linux_820.tgz" + }, + "SPLUNK_NGINX_TA": { + "app_number": 15, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-nginx_310.tgz" + }, + "SPLUNK_TA_FOR_ZEEK": { + "app_number": 16, + "app_version": None, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/ta-for-zeek_105.tgz" + }, + } }, @@ -152,72 +244,75 @@ setup_schema = { } } }, - "default": { - "ADD-ON_FOR_LINUX_SYSMON": { - "app_number": 6176, - "app_version": "1.0.3" - }, - "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES": { - "app_number": 1876, - "app_version": "5.2.0" - }, + + "default": {}, + + # "default": { + # "ADD-ON_FOR_LINUX_SYSMON": { + # "app_number": 6176, + # "app_version": "1.0.3" + # }, + # "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES": { + # "app_number": 1876, + # "app_version": "5.2.0" + # }, - "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365": - { - "app_number": 4055, - "app_version": "2.2.0" - }, + # "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365": + # { + # "app_number": 4055, + # "app_version": "2.2.0" + # }, - "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE": { - "app_number": 3719, - "app_version": "1.3.2" - }, + # "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE": { + # "app_number": 3719, + # "app_version": "1.3.2" + # }, - "SPLUNK_ANALYTIC_STORY_EXECUTION_APP": { - "app_number": 4971, - "app_version": "2.0.3" - }, + # "SPLUNK_ANALYTIC_STORY_EXECUTION_APP": { + # "app_number": 4971, + # "app_version": "2.0.3" + # }, - "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT": { - "app_number": 2882, - "app_version": "2.0.2" - }, + # "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT": { + # "app_number": 2882, + # "app_version": "2.0.2" + # }, - "SPLUNK_MACHINE_LEARNING_TOOLKIT": { - "app_number": 2890, - "app_version": "5.2.2" - }, + # "SPLUNK_MACHINE_LEARNING_TOOLKIT": { + # "app_number": 2890, + # "app_version": "5.2.2" + # }, - "SPLUNK_APP_FOR_STREAM": { - "app_number": 1809, - "app_version": "8.0.1" - }, - "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA": { - "app_number": 5234, - "app_version": "8.0.1" - }, - "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS": { - "app_number": 5238, - "app_version": "8.0.1" - }, - "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO": { - "app_number": 1617, - "app_version": "4.0.0" - }, - "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX": { - "app_number": 833, - "app_version": "8.3.1" - }, - "SPLUNK_ADD_ON_FOR_SYSMON": { - "app_number": 5709, - "app_version": "1.0.1" - }, - # According to https://docs.splunk.com/Documentation/ES/6.6.2/Install/Datamodels, these are included in ES. Don't install separately. - "SPLUNK_COMMON_INFORMATION_MODEL": { - "app_number": 1621, - "app_version": "4.20.2" - } - } + # "SPLUNK_APP_FOR_STREAM": { + # "app_number": 1809, + # "app_version": "8.0.1" + # }, + # "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA": { + # "app_number": 5234, + # "app_version": "8.0.1" + # }, + # "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS": { + # "app_number": 5238, + # "app_version": "8.0.1" + # }, + # "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO": { + # "app_number": 1617, + # "app_version": "4.0.0" + # }, + # "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX": { + # "app_number": 833, + # "app_version": "8.3.1" + # }, + # "SPLUNK_ADD_ON_FOR_SYSMON": { + # "app_number": 5709, + # "app_version": "1.0.1" + # }, + # # According to https://docs.splunk.com/Documentation/ES/6.6.2/Install/Datamodels, these are included in ES. Don't install separately. + # "SPLUNK_COMMON_INFORMATION_MODEL": { + # "app_number": 1621, + # "app_version": "4.20.2" + # } + # } }, "splunkbase_username": { From cc8113ec8680efb8da7aeadbb4d98c8cdab3a3e8 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 20 Dec 2021 08:34:54 -0800 Subject: [PATCH 141/203] Fixed output of manifest for detection_failure_manifest.json. Previously, it contained mostly default settings and most notably did not container the proper apps configuration. Also updated a few documentation strings. --- .../detection_testing_execution.py | 10 +++++++--- .../modules/container_manager.py | 5 +++-- .../modules/test_driver.py | 15 +++++++++++---- .../ci/detection_testing_batch/summarize_json.py | 10 ++++++---- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 3e5cd98672..8977119ec2 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -370,8 +370,11 @@ def main(args: list[str]): #sys.exit(0) # Make a backup of this config containing the hash and stripped credentials. # This makes the test perfectly reproducible. - validate_args.validate_and_write( - settings, output_file=None, strip_credentials=True) + reproduce_test_config, _ = validate_args.validate_and_write(settings, output_file=None, strip_credentials=True) + if reproduce_test_config == None: + print("Error - there was an error writing out the file to reproduce the test. This should not happen, as all "\ + "settings should have been validated by this point.\n\tQuitting...",file=sys.stderr) + sys.exit(1) try: all_test_files = github_service.get_test_files(settings['mode'], @@ -454,6 +457,7 @@ def main(args: list[str]): settings['splunkbase_apps'], settings['branch'], settings['commit_hash'], + reproduce_test_config, files_to_copy_to_container=files_to_copy_to_container, web_port_start=8000, management_port_start=8089, @@ -468,7 +472,7 @@ def main(args: list[str]): result = cm.run_test() - github_service.update_and_commit_passed_tests(cm.synchronization_object.successes) + #github_service.update_and_commit_passed_tests(cm.synchronization_object.successes) #Return code indicates whether testing succeeded and all tests were run. diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 2635cdc24c..6bc53da95a 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -29,6 +29,7 @@ class ContainerManager: splunkbase_apps:OrderedDict, branch:str, commit_hash:str, + summarization_reproduce_failure_config:dict, files_to_copy_to_container: OrderedDict = OrderedDict(), web_port_start: int = 8000, management_port_start: int = 8089, @@ -43,7 +44,7 @@ class ContainerManager: ): self.synchronization_object = test_driver.TestDriver( - test_list, num_containers) + test_list, num_containers, summarization_reproduce_failure_config) self.mounts = self.create_mounts(mounts) self.local_apps = local_apps @@ -55,7 +56,7 @@ class ContainerManager: self.container_password = container_password print("\n\n***********************") - print("Log into your Splunk Container(s) after they boot at at http://127.0.0.1:[%d-%d]"%(web_port_start, web_port_start + num_containers - 1)) + print("Log into your [%d] Splunk Container(s) after they boot at http://127.0.0.1:[%d-%d]"%(num_containers, web_port_start, web_port_start + num_containers - 1)) print("\tSplunk App Username: [%s]"%("admin")) print("\tSplunk App Password: ", end='') if show_container_password: diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index 47d78472ff..9f7e49e9c9 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -12,9 +12,9 @@ import time import timeit from typing import Union import sys - +import copy class TestDriver: - def __init__(self, tests:list[str], num_containers:int): + def __init__(self, tests:list[str], num_containers:int, summarization_reproduce_failure_config:dict): #Create the queue and enque all of the tests self.testing_queue = queue.Queue() for test in tests: @@ -35,8 +35,12 @@ class TestDriver: #Just make a random folder to store attack data that we donwload self.attack_data_root_folder = tempfile.mkdtemp(prefix="attack_data_", dir=os.getcwd()) print("Attack data for this run will be stored at: [%s]"%(self.attack_data_root_folder)) + + #Not used right now, but we will keep it around for a bit in case we want to use it again self.start_barrier = threading.Barrier(num_containers) + #The config that will be used for writing out the error config reproduction fiel + self.summarization_reproduce_failure_config = copy.deepcopy(summarization_reproduce_failure_config) def checkContainerFailure(self)->bool: @@ -184,11 +188,14 @@ class TestDriver: res |= self.outputResultsFile(fields, os.path.join(results_directory, "combined"), combined_data, baseline) try: - success, test_count,pass_count,fail_count,error_count = summarize_json.outputResultsJSON("summary.json", combined_data, baseline, output_folder=results_directory) + success, test_count,pass_count,fail_count,error_count = \ + summarize_json.outputResultsJSON("summary.json", combined_data, + baseline, output_folder=results_directory, + summarization_reproduce_failure_config=self.summarization_reproduce_failure_config) summarize_json.print_summary(test_count, pass_count, fail_count, error_count) res |= success except Exception as e: - print("Failure writing the summary file: [%s]",file=sys.stderr) + print("Failure writing the summary file: [%s]"%str(e),file=sys.stderr) res = False return res diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/bin/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index eddfe456ab..0a868334d8 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -6,11 +6,11 @@ import json from modules import validate_args import os.path from operator import itemgetter - +import copy def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict, failure_manifest_filename = "detection_failure_manifest.json", - output_folder:str="")->tuple[bool,int,int,int,int]: + output_folder:str="", summarization_reproduce_failure_config:dict={})->tuple[bool,int,int,int,int]: success = True try: @@ -61,9 +61,11 @@ def outputResultsJSON(output_filename:str, data:list[dict], baseline:OrderedDict fail_list = [os.path.join("security_content/detections",x['detection_file'] ) for x in data_sorted if x['success'] == False] if len(fail_list) > 0: - failures_test_override = {"detections_list": fail_list, "interactive_failure":True, + + failures_test_override = copy.deepcopy(summarization_reproduce_failure_config) + failures_test_override.update({"detections_list": fail_list, "no_interactive_failure":False, "num_containers":1, "branch": baseline["branch"], "commit_hash":baseline["commit_hash"], - "mode":"selected", "show_splunk_app_password": True} + "mode":"selected", "show_splunk_app_password": True}) with open(os.path.join(output_folder,failure_manifest_filename),"w") as failures: validate_args.validate_and_write(failures_test_override, failures) except Exception as e: From 7230b5c63d62d29c96c75a7631eaf06518806a2d Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 20 Dec 2021 12:02:11 -0800 Subject: [PATCH 142/203] Print out some system usage information on each update. This will help users dianose if their systems are overburdend and also helps us figure out what the appropriate number of containers to run on cloud infrastructure, like GitHub Actions, may be without logging directly into the machine doing the testing. In some cases, we can't log into those machines by design. If you're running tests at home, you can also just listen to the volume of your computer's fans. --- .../modules/container_manager.py | 2 +- .../modules/splunk_container.py | 5 +- .../modules/test_driver.py | 50 ++++++++++++++++--- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 6bc53da95a..5ad47cd70a 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -217,7 +217,7 @@ class ContainerManager: return password def queue_status_thread(self, status_interval:int=60)->None: - #This will run fo + while True: if self.synchronization_object.checkContainerFailure(): print("One of the containers has shut down prematurely and generated an exception. Shut down the rest of the containers.") diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 648a33b488..0845b3fc65 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -199,10 +199,7 @@ class SplunkContainer: # print("Failed copy of [%s] file to CONTAINER:[%s]...we will try again"%(localFilePath, containerName)) time.sleep(10) successful_copy = False - print( - "Successfully copied [%s] to [%s] on [%s]" - % (local_file_path, container_file_path, self.container_name) - ) + #print("Successfully copied [%s] to [%s] on [%s]"% (local_file_path, container_file_path, self.container_name)) return successful_copy def stopContainer(self,timeout=10) -> bool: diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index 9f7e49e9c9..87cb71855f 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -1,18 +1,22 @@ -from collections import OrderedDict +import copy import csv import datetime import json import os import queue import shutil -import summarize_json +import sys import tempfile import threading import time import timeit +from collections import OrderedDict from typing import Union -import sys -import copy + +import psutil +import summarize_json + + class TestDriver: def __init__(self, tests:list[str], num_containers:int, summarization_reproduce_failure_config:dict): #Create the queue and enque all of the tests @@ -42,6 +46,13 @@ class TestDriver: #The config that will be used for writing out the error config reproduction fiel self.summarization_reproduce_failure_config = copy.deepcopy(summarization_reproduce_failure_config) + + #According to the docs: + # Warning the first time this function is called with interval = 0.0 or None it will return a meaningless 0.0 value which you are supposed to ignore. + # We call this exactly once here to prime for future calls and throw away the result + cpu_info = psutil.cpu_times_percent(percpu=False) + + def checkContainerFailure(self)->bool: self.lock.acquire() @@ -225,17 +236,40 @@ class TestDriver: print("Successfully removed all attack data") finally: self.lock.release() + + def get_system_stats(self)->str: + + + cpu_info = psutil.cpu_times_percent(percpu=False) + print(cpu_info) + cpu_info_string = "Total CPU Usage: %d%% (%d CPUs)"%(100 - cpu_info.idle, psutil.cpu_count(logical=False)) + + bytes_per_GB = 1024 * 1024 * 1024 + memory_info = psutil.virtual_memory() + memory_info_string = "Total Memory Usage: %0.1fGB USED / %0.1fGB TOTAL"%(memory_info.used / bytes_per_GB, memory_info.total / bytes_per_GB) + + disk_usage_info = psutil.disk_usage('/') + disk_usage_info_string = "Total Disk Usage: %0.1fGB USED / %0.1fGB TOTAL"%(disk_usage_info.free / bytes_per_GB, disk_usage_info.total / bytes_per_GB) + + return "System Information:\n\t%s\n\t%s\n\t%s"%(cpu_info_string, memory_info_string, disk_usage_info_string) + + def summarize(self)->bool: if self.checkContainerFailure() == True: print("Error running containers... shutting down", file=sys.stderr) return False + + self.lock.acquire() try: + #Get a summary of some system stats + system_stats=self.get_system_stats() + current_time = timeit.default_timer() @@ -243,7 +277,7 @@ class TestDriver: if self.testing_queue.qsize() == self.total_number_of_tests: #Testing has not started yet. We are setting up containers print("***********PROGRESS UPDATE***********\n"\ - "\tWaiting for container setup: %s\n"%(datetime.timedelta(seconds=current_time - self.start_time))) + "\tWaiting for container setup: %s\n\t%s\n"%(datetime.timedelta(seconds=current_time - self.start_time),system_stats)) else: if self.container_ready_time is None: @@ -280,14 +314,16 @@ class TestDriver: "\tTests completed : %d\n"\ "\t\tSuccess : %d\n"\ "\t\tFailure : %d\n"\ - "\t\tError : %d"%(datetime.timedelta(seconds=total_execution_time_seconds), + "\t\tError : %d\n"\ + "\t%s\n"%(datetime.timedelta(seconds=total_execution_time_seconds), estimated_completion_time_seconds, remaining_tests, testsCurrentlyRunning, numberOfCompletedTests, len(self.successes), len(self.failures), - len(self.errors))) + len(self.errors), + system_stats)) except Exception as e: print("Error in printing execution summary: [%s]"%(str(e))) From 0e26dc76ff4053f0065e203f37d82cf9c5f8e93c Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 20 Dec 2021 13:17:46 -0800 Subject: [PATCH 143/203] Changed so that we no longer start a container if we know that we will not have a test for it. For example, if we try to start 4 containers by have only 2 tests at the beginning we will only start 2 containers. This saves a lot of startup time and resources. There is a descriptive printout for this as well. Also, bumped the maximum startup time for 6 minutes to 10 minutes. This, combined with the system info from the previous commit should let us determine if we can bump the number of containers per GitHub Actions VM from 1 to 2 or more. --- .../modules/container_manager.py | 4 +- .../modules/splunk_container.py | 56 ++++++++++++------- .../modules/test_driver.py | 29 +++++++--- 3 files changed, 59 insertions(+), 30 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 5ad47cd70a..f231a7b915 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -150,7 +150,9 @@ class ContainerManager: interactive_failure:bool = False, interactive:bool = False ) -> list[splunk_container.SplunkContainer]: - #First make sure that the image exists and has been downloaded + #First make sure that the image exists and has been downloaded. + #Note that this is intentionally not part of the time to start + #since it can take a long time on a slow connection! self.setup_image(reuse_image, full_docker_hub_name) new_containers = [] diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 0845b3fc65..ffe9b78653 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -22,7 +22,8 @@ import sys SPLUNKBASE_URL = "https://splunkbase.splunk.com/app/%d/release/%s/download" SPLUNK_START_ARGS = "--accept-license" -MAX_CONTAINER_START_TIME_SECONDS = 360 +#Give ten minutes to start - this is probably enough time +MAX_CONTAINER_START_TIME_SECONDS = 60*10 class SplunkContainer: def __init__( self, @@ -277,7 +278,7 @@ class SplunkContainer: summary_str = "Summary for %s\n\t"\ "Total Time : [%s]\n\t"\ "Container Start Time: [%s]\n\t"\ - "Test Execution Time : [%s]" % ( + "Test Execution Time : [%s]\n" % ( self.container_name, total_time_string, setup_time_string, testing_time_string) return summary_str @@ -325,9 +326,34 @@ class SplunkContainer: print("Finished copying files to [%s]" % (self.container_name)) self.wait_for_splunk_ready() + def successfully_finish_tests(self)->None: + try: + if self.num_tests_completed == 0: + print("Container [%s] did not find any tests and will not start.\n"\ + "This does not mean there was an error!"%(self.container_name)) + else: + print("Container [%s] has finished running [%d] detections, time to stop the container." + % (self.container_name, self.num_tests_completed)) + + + # remove the container + self.removeContainer() + except Exception as e: + print( + "Error stopping or removing the container: [%s]" % (str(e))) + + return None + def run_container(self) -> None: print("Starting the container [%s]" % (self.container_name)) + + # Try to get something from the queue. Check this early on + # before launching the container because it can save us a lot of time! + detection_to_test = self.synchronization_object.getTest() + if detection_to_test is None: + return self.successfully_finish_tests() + self.container_start_time = timeit.default_timer() container_start_time = timeit.default_timer() @@ -352,33 +378,17 @@ class SplunkContainer: # Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1, 30)) self.test_start_time = timeit.default_timer() - while True: + while detection_to_test is not None: if self.synchronization_object.checkContainerFailure(): self.container.stop() print("Container [%s] successfully stopped early due to failure" % (self.container_name)) return None - # Try to get something from the queue - detection_to_test = self.synchronization_object.getTest() # Sleep for a small random time so that containers drift apart and don't synchronize their testing time.sleep(random.randint(1, 30)) - if detection_to_test is None: - try: - print( - "Container [%s] has finished running detections, time to stop the container." - % (self.container_name) - ) - - # remove the container - self.removeContainer() - except Exception as e: - print( - "Error stopping or removing the container: [%s]" % (str(e))) - - return None - + # There is a detection to test print("Container [%s]--->[%s]" % (self.container_name, detection_to_test)) @@ -413,4 +423,10 @@ class SplunkContainer: ) self.num_tests_completed += 1 + # Try to get something from the queue + detection_to_test = self.synchronization_object.getTest() + + #We failed to get a test from the queue, so we must be done gracefully! Quit + return self.successfully_finish_tests() + diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index 87cb71855f..d77ee433d1 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -74,6 +74,21 @@ class TestDriver: finally: self.lock.release() + def checkIfTestsRemain(self): + failure = self.checkContainerFailure() + if failure: + #Just return None, don't continue testing if a container crashed + #Indicate there are no tests remaining + return False + + try: + #This call isn't reliable according to documentation, but can save us some time. + #Err on the side of caution + return not self.testing_queue.empty() + except Exception as e: + print("Error determinging if testing queue was empty. Return False and try to get something.",file=sys.stderr) + return True + def getTest(self)-> Union[str,None]: @@ -88,7 +103,6 @@ class TestDriver: try: return self.testing_queue.get(block=False) except Exception as e: - print("Testing queue empty!") return None def addSuccess(self, result:dict)->None: @@ -239,17 +253,14 @@ class TestDriver: def get_system_stats(self)->str: - - cpu_info = psutil.cpu_times_percent(percpu=False) - print(cpu_info) - cpu_info_string = "Total CPU Usage: %d%% (%d CPUs)"%(100 - cpu_info.idle, psutil.cpu_count(logical=False)) - bytes_per_GB = 1024 * 1024 * 1024 + cpu_info = psutil.cpu_times_percent(percpu=False) memory_info = psutil.virtual_memory() - memory_info_string = "Total Memory Usage: %0.1fGB USED / %0.1fGB TOTAL"%(memory_info.used / bytes_per_GB, memory_info.total / bytes_per_GB) - disk_usage_info = psutil.disk_usage('/') - disk_usage_info_string = "Total Disk Usage: %0.1fGB USED / %0.1fGB TOTAL"%(disk_usage_info.free / bytes_per_GB, disk_usage_info.total / bytes_per_GB) + + cpu_info_string = "Total CPU Usage : %d%% (%d CPUs)"%(100 - cpu_info.idle, psutil.cpu_count(logical=False)) + memory_info_string = "Total Memory Usage: %0.1fGB USED / %0.1fGB TOTAL"%(memory_info.used / bytes_per_GB, memory_info.total / bytes_per_GB) + disk_usage_info_string = "Total Disk Usage : %0.1fGB USED / %0.1fGB TOTAL"%(disk_usage_info.free / bytes_per_GB, disk_usage_info.total / bytes_per_GB) return "System Information:\n\t%s\n\t%s\n\t%s"%(cpu_info_string, memory_info_string, disk_usage_info_string) From d26032b912993c02255b25646a58a46b823aa7a0 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 20 Dec 2021 13:38:51 -0800 Subject: [PATCH 144/203] Updated the github_actions config with S3 binary paths.Updated the default args to include web and experimental as possible folders with Web being a default. --- .../modules/validate_args.py | 4 +- .../test_config_github_actions.json | 152 +++++++++++------- 2 files changed, 97 insertions(+), 59 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 868c2455c8..186a2a5ded 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -345,9 +345,9 @@ setup_schema = { "type": "array", "items": { "type": "string", - "enum": ["endpoint", "cloud", "network","web"] + "enum": ["endpoint", "cloud", "network","web","experimental"] }, - "default": ["endpoint", "cloud", "network"] + "default": ["endpoint", "cloud", "network","web"] }, "types": { diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json index 81fa25f89d..374f1b5187 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json +++ b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json @@ -7,14 +7,105 @@ "folders": [ "endpoint", "cloud", - "network" + "network", + "web" ], "interactive": false, "local_apps": { + "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE": { + "app_number": 12, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-amazon-kinesis-firehose_131r7d1d093.tgz" + }, + "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365": { + "app_number": 13, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-office-365_202.tgz" + }, + "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS": { + "app_number": 9, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-stream-forwarders_730.tgz" + }, + "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA": { + "app_number": 8, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-stream-wire-data_730.tgz" + }, + "SPLUNK_ADD_ON_FOR_SYSMON_OLD": { + "app_number": 1, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-sysmon_1062.tgz" + }, + "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO": { + "app_number": 11, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-zeek-aka-bro_400.tgz" + }, + "SPLUNK_ASX_APP": { + "app_number": 17, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/Splunk_ASX-latest.tar.gz" + }, + "SPLUNK_AWS_TA": { + "app_number": 4, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-amazon-web-services_510.tgz" + }, + "SPLUNK_CIM_APP": { + "app_number": 3, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-common-information-model-cim_4200.tgz" + }, "SPLUNK_ES_CONTENT_UPDATE": { "app_number": 3449, "app_version": null, - "local_path": "prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz" + "local_path": null + }, + "SPLUNK_LINUX_TA": { + "app_number": 14, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-unix-and-linux_820.tgz" + }, + "SPLUNK_MLTK_APP": { + "app_number": 6, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-machine-learning-toolkit_521.tgz" + }, + "SPLUNK_NGINX_TA": { + "app_number": 15, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-nginx_310.tgz" + }, + "SPLUNK_PYTHON_APP": { + "app_number": 5, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/python-for-scientific-computing-for-linux-64-bit_202.tgz" + }, + "SPLUNK_SECURITY_ESSENTIALS": { + "app_number": 10, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-security-essentials_333.tgz" + }, + "SPLUNK_STREAM_APP": { + "app_number": 7, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-app-for-stream_730.tgz" + }, + "SPLUNK_SYSMON_LINUX_TA_PATCHED": { + "app_number": 2, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/add-on-for-linux-sysmon_103_PATCHED.tgz" + }, + "SPLUNK_TA_FOR_ZEEK": { + "app_number": 16, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/ta-for-zeek_105.tgz" + }, + "SPLUNK_WINDOWS_TA": { + "app_number": 0, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-windows_812.tgz" } }, "local_base_container_name": "splunk_test_%d", @@ -22,66 +113,13 @@ "mode": "changes", "no_interactive_failure": true, "num_containers": 10, - "persist_security_content": false, + "persist_security_content": true, "pr_number": null, "reuse_image": true, "show_splunk_app_password": false, "splunk_app_password": null, "splunk_container_apps_directory": "/opt/splunk/etc/apps", - "splunkbase_apps": { - "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT": { - "app_number": 2882, - "app_version": "2.0.2" - }, - "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE": { - "app_number": 3719, - "app_version": "1.3.2" - }, - "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES": { - "app_number": 1876, - "app_version": "5.2.0" - }, - "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365": { - "app_number": 4055, - "app_version": "2.2.0" - }, - "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS": { - "app_number": 5238, - "app_version": "8.0.1" - }, - "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA": { - "app_number": 5234, - "app_version": "8.0.1" - }, - "SPLUNK_ADD_ON_FOR_SYSMON": { - "app_number": 5709, - "app_version": "1.0.1" - }, - "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX": { - "app_number": 833, - "app_version": "8.3.1" - }, - "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO": { - "app_number": 1617, - "app_version": "4.0.0" - }, - "SPLUNK_ANALYTIC_STORY_EXECUTION_APP": { - "app_number": 4971, - "app_version": "2.0.3" - }, - "SPLUNK_APP_FOR_STREAM": { - "app_number": 1809, - "app_version": "8.0.1" - }, - "SPLUNK_COMMON_INFORMATION_MODEL": { - "app_number": 1621, - "app_version": "4.20.2" - }, - "SPLUNK_MACHINE_LEARNING_TOOLKIT": { - "app_number": 2890, - "app_version": "5.2.2" - } - }, + "splunkbase_apps": {}, "splunkbase_password": null, "splunkbase_username": null, "types": [ From 264dbfb7f487da7151afbc88ad775d6b370081ae Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 20 Dec 2021 13:58:58 -0800 Subject: [PATCH 145/203] Fixed up and error that could occur where the environment is not properly set up if the users requested PERSIST_SECURITY_CONTENT, but the directory did not exist. Also fixed the default argument for this on GitHub Actions., --- .../detection_testing_execution.py | 8 +++++--- .../test_config_github_actions.json | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 8977119ec2..c81c4cb86b 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -94,7 +94,7 @@ def copy_local_apps_to_directory(apps: dict[str, dict], target_directory) -> Non -def ensure_security_content(branch: str, commit_hash: str, pr_number: Union[int, None], persist_security_content: bool) -> GithubService: +def ensure_security_content(branch: str, commit_hash: str, pr_number: Union[int, None], persist_security_content: bool) -> tuple[GithubService, bool]: if persist_security_content is True and os.path.exists("security_content"): print("****** You chose --persist_security_content and the security_content directory exists. " "We will not check out the repo again. Please be aware, this could cause issues if your " @@ -109,6 +109,7 @@ def ensure_security_content(branch: str, commit_hash: str, pr_number: Union[int, if persist_security_content is True and not os.path.exists("security_content"): print("Error - you chose --persist_security_content but the security_content directory does not exist!" " We will check it out for you.") + persist_security_content = False elif os.path.exists("security_content/"): print("Deleting the security_content directory") @@ -125,7 +126,7 @@ def ensure_security_content(branch: str, commit_hash: str, pr_number: Union[int, else: github_service = GithubService(branch, commit_hash) - return github_service + return github_service, persist_security_content def generate_escu_app(persist_security_content: bool = False) -> str: @@ -354,7 +355,8 @@ def main(args: list[str]): # Check out security content if required try: - github_service = ensure_security_content( + #Make sure we fix up the persist_securiy_content argument if it is passed in error (we say it exists but it doesn't) + github_service, settings['persist_security_content'] = ensure_security_content( settings['branch'], settings['commit_hash'], settings['pr_number'], settings['persist_security_content']) settings['commit_hash'] = github_service.commit_hash except Exception as e: diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json index 374f1b5187..5b94c52a15 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json +++ b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json @@ -113,7 +113,7 @@ "mode": "changes", "no_interactive_failure": true, "num_containers": 10, - "persist_security_content": true, + "persist_security_content": false, "pr_number": null, "reuse_image": true, "show_splunk_app_password": false, From d4aae32b3d15179d2af0cd4dfec0198aafbcd717 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 20 Dec 2021 14:26:57 -0800 Subject: [PATCH 146/203] Removed Python 2 which was previously used for splunk packaging toolkit. Replaced with python3 --- .../ci/detection_testing_batch/detection_testing_execution.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index c81c4cb86b..ad77b8b5a3 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -194,13 +194,13 @@ def generate_escu_app(persist_security_content: bool = False) -> str: print("Error downloading the Splunk Packaging Toolkit: [%s].\n\tQuitting..." % (str(e)), file=sys.stderr) sys.exit(1) - print(os.getcwd()) + commands = ["rm -rf slim_packaging/slim_latest", "mkdir slim_packaging/slim_latest", "cd slim_packaging", "tar -zxf ../splunk-packaging-toolkit-latest.tar.gz -C slim_latest --strip-components=1", "cd slim_latest", - "virtualenv --python=/usr/bin/python2.7 --clear .venv", + "python3 -m venv .venv", ". ./.venv/bin/activate", "python -m pip install --upgrade pip", "python -m pip install wheel", From 63555bc53148570f0787966822839deaef7af95e Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Mon, 20 Dec 2021 14:45:01 -0800 Subject: [PATCH 147/203] Added some more robust error handling to the high level test runner. It looks like we were getting errors pulling the image from docker hub - was it down... --- .../detection_testing_execution.py | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index ad77b8b5a3..7502fd64dc 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -450,30 +450,37 @@ def main(args: list[str]): "local_file_path": datamodel_file_local_path, "container_file_path": datamodel_file_container_path} + try: + cm = container_manager.ContainerManager(all_test_files, + FULL_DOCKER_HUB_CONTAINER_NAME, + settings['local_base_container_name'], + settings['num_containers'], + settings['local_apps'], + settings['splunkbase_apps'], + settings['branch'], + settings['commit_hash'], + reproduce_test_config, + files_to_copy_to_container=files_to_copy_to_container, + web_port_start=8000, + management_port_start=8089, + mounts=mounts, + show_container_password=settings['show_splunk_app_password'], + container_password=settings['splunk_app_password'], + splunkbase_username=settings['splunkbase_username'], + splunkbase_password=settings['splunkbase_password'], + reuse_image=settings['reuse_image'], + interactive_failure=not settings['no_interactive_failure'], + interactive=settings['interactive']) + except Exception as e: + print("Error - unrecoverable error trying to set up the containers: [%s].\n\tQuitting..."%(str(e)),file=sys.stderr) + sys.exit(1) - cm = container_manager.ContainerManager(all_test_files, - FULL_DOCKER_HUB_CONTAINER_NAME, - settings['local_base_container_name'], - settings['num_containers'], - settings['local_apps'], - settings['splunkbase_apps'], - settings['branch'], - settings['commit_hash'], - reproduce_test_config, - files_to_copy_to_container=files_to_copy_to_container, - web_port_start=8000, - management_port_start=8089, - mounts=mounts, - show_container_password=settings['show_splunk_app_password'], - container_password=settings['splunk_app_password'], - splunkbase_username=settings['splunkbase_username'], - splunkbase_password=settings['splunkbase_password'], - reuse_image=settings['reuse_image'], - interactive_failure=not settings['no_interactive_failure'], - interactive=settings['interactive']) + try: + result = cm.run_test() + except Exception as e: + print("Error - there was an error running the tests: [%s]\n\tQuitting..."%(str(e)),file=sys.stderr) + sys.exit(1) - result = cm.run_test() - #github_service.update_and_commit_passed_tests(cm.synchronization_object.successes) From fb087ea8b3ab3562bcd7fda90cf6946d7e404b07 Mon Sep 17 00:00:00 2001 From: tccontre Date: Tue, 21 Dec 2021 11:02:15 +0100 Subject: [PATCH 148/203] linux_persist_priv_batch_1 --- ...add_files_in_known_crontab_directories.yml | 69 ++++++++++++++++++ .../linux_at_allow_config_file_creation.yml | 69 ++++++++++++++++++ .../linux_at_application_execution.yml | 70 ++++++++++++++++++ .../linux_edit_cron_table_parameter.yml | 70 ++++++++++++++++++ ...append_command_to_at_allow_config_file.yml | 73 +++++++++++++++++++ ...cronjob_entry_on_existing_cronjob_file.yml | 72 ++++++++++++++++++ ...sible_cronjob_modification_with_editor.yml | 70 ++++++++++++++++++ stories/linux_persistence_techniques.yml | 27 +++++++ stories/linux_privilege_escalation.yml | 27 +++++++ ...iles_in_known_crontab_directories.test.yml | 12 +++ ...nux_at_allow_config_file_creation.test.yml | 12 +++ .../linux_at_application_execution.test.yml | 12 +++ .../linux_edit_cron_table_parameter.test.yml | 12 +++ ...d_command_to_at_allow_config_file.test.yml | 12 +++ ...ob_entry_on_existing_cronjob_file.test.yml | 12 +++ ..._cronjob_modification_with_editor.test.yml | 12 +++ 16 files changed, 631 insertions(+) create mode 100644 detections/endpoint/linux_add_files_in_known_crontab_directories.yml create mode 100644 detections/endpoint/linux_at_allow_config_file_creation.yml create mode 100644 detections/endpoint/linux_at_application_execution.yml create mode 100644 detections/endpoint/linux_edit_cron_table_parameter.yml create mode 100644 detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml create mode 100644 detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml create mode 100644 detections/endpoint/linux_possible_cronjob_modification_with_editor.yml create mode 100644 stories/linux_persistence_techniques.yml create mode 100644 stories/linux_privilege_escalation.yml create mode 100644 tests/endpoint/linux_add_files_in_known_crontab_directories.test.yml create mode 100644 tests/endpoint/linux_at_allow_config_file_creation.test.yml create mode 100644 tests/endpoint/linux_at_application_execution.test.yml create mode 100644 tests/endpoint/linux_edit_cron_table_parameter.test.yml create mode 100644 tests/endpoint/linux_possible_append_command_to_at_allow_config_file.test.yml create mode 100644 tests/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.test.yml create mode 100644 tests/endpoint/linux_possible_cronjob_modification_with_editor.test.yml diff --git a/detections/endpoint/linux_add_files_in_known_crontab_directories.yml b/detections/endpoint/linux_add_files_in_known_crontab_directories.yml new file mode 100644 index 0000000000..4ad54b00a0 --- /dev/null +++ b/detections/endpoint/linux_add_files_in_known_crontab_directories.yml @@ -0,0 +1,69 @@ +name: Linux Add Files In Known Crontab Directories +id: 023f3452-5f27-11ec-bf00-acde48001122 +version: 1 +date: '2021-12-17' +author: Teoderick Contreras, Splunk +type: Anomaly +datamodel: +- Endpoint +description: The following analytic identifies a suspicious file creation in known cron table directories. + This event is commonly abuse by malware, adversaries and red teamers to persist on the target or compromised host. + crontab or cronjob is like a schedule task in windows environment where you can create an executable or script on the known crontab directories to + run it base on its schedule. This Anomaly query is a good indicator to look further what file is added and who added the file if to consider it legitimate file. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem + where Filesystem.file_path IN ("*/etc/cron*", "*/var/spool/cron/*") + by Filesystem.dest Filesystem.file_create_time Filesystem.file_name Filesystem.process_guid Filesystem.file_path + | `drop_dm_object_name(Filesystem)` + | `security_content_ctime(lastTime)` + | `security_content_ctime(firstTime)` + | `linux_add_files_in_known_crontab_directories_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the file name, file path, and process_guid executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: administrator or network operator can create file in crontab folders for automation purposes. filter is needed +references: +- https://www.sandflysecurity.com/blog/detecting-cronrat-malware-on-linux-instantly/ +- https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.003/cronjobs_entry/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1053.003 + - T1053 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Filesystem.dest + - Filesystem.file_create_time + - Filesystem.file_name + - Filesystem.process_guid + - Filesystem.file_path + security_domain: endpoint + impact: 50 + confidence: 50 + # (impact * confidence)/100 + risk_score: 25 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a file $file_name$ is created in $file_path$ on $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_at_allow_config_file_creation.yml b/detections/endpoint/linux_at_allow_config_file_creation.yml new file mode 100644 index 0000000000..fe911eb592 --- /dev/null +++ b/detections/endpoint/linux_at_allow_config_file_creation.yml @@ -0,0 +1,69 @@ +name: Linux At Allow Config File Creation +id: 977b3082-5f3d-11ec-b954-acde48001122 +version: 1 +date: '2021-12-17' +author: Teoderick Contreras, Splunk +type: Anomaly +datamodel: +- Endpoint +description: The following analytic identifies a suspicious file creation of /etc/at.allow or /etc/at.deny. + These 2 files are commonly abused by malware, adversaries or red teamers to persist on the targeted or compromised host. + These config file can restrict user that can only execute at application (another schedule task application in linux). attacker can + create a user or add the compromised username to that config file to execute at to schedule it malicious code. This anomaly detection + can be a good indicator to investigate further the entry in created config file and who created it to verify if it is a false positive. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem + where Filesystem.file_path IN ("*/etc/at.allow", "*/etc/at.deny") + by Filesystem.dest Filesystem.file_create_time Filesystem.file_name Filesystem.process_guid Filesystem.file_path + | `drop_dm_object_name(Filesystem)` + | `security_content_ctime(lastTime)` + | `security_content_ctime(firstTime)` + | `linux_at_allow_config_file_creation_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the file name, file path, and process_guid executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: administrator or network operator can create this file for automation purposes. filter is needed +references: +- https://linuxize.com/post/at-command-in-linux/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - UPDATE_DATASET_URL + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1053.003 + - T1053 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Filesystem.dest + - Filesystem.file_create_time + - Filesystem.file_name + - Filesystem.process_guid + - Filesystem.file_path + security_domain: endpoint + impact: 50 + confidence: 50 + # (impact * confidence)/100 + risk_score: 25 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a file $file_name$ is created in $file_path$ on $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_at_application_execution.yml b/detections/endpoint/linux_at_application_execution.yml new file mode 100644 index 0000000000..3a737e133c --- /dev/null +++ b/detections/endpoint/linux_at_application_execution.yml @@ -0,0 +1,70 @@ +name: Linux At Application Execution +id: bf0a378e-5f3c-11ec-a6de-acde48001122 +version: 1 +date: '2021-12-17' +author: Teoderick Contreras, Splunk +type: Anomaly +datamodel: +- Endpoint +description: The following analytic identifies a suspicious process creation of At application. + This process can be used by malware, adversaries and red teamers to create persistence entry to the targeted or compromised host with their + malicious code. This anomaly detection can be a good indicator to investigate the event before and after this process execution, when it was executed and what + schedule task it will execute. +search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes where Processes.process_name = at OR Processes.parent_process_name = at + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_at_application_execution_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: Administrator or network operator can use this application for automation purposes. filter is needed +references: +- https://attack.mitre.org/techniques/T1053/001/ +- https://www.linkedin.com/pulse/getting-attacker-ip-address-from-malicious-linux-job-craig-rowland/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1053.001 + - T1053 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 30 + confidence: 30 + # (impact * confidence)/100 + risk_score: 9 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: at application was executed in $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_edit_cron_table_parameter.yml b/detections/endpoint/linux_edit_cron_table_parameter.yml new file mode 100644 index 0000000000..b27fd3c0da --- /dev/null +++ b/detections/endpoint/linux_edit_cron_table_parameter.yml @@ -0,0 +1,70 @@ +name: Linux Edit Cron Table Parameter +id: 0d370304-5f26-11ec-a4bb-acde48001122 +version: 1 +date: '2021-12-17' +author: Teoderick Contreras, Splunk +type: Hunting +datamodel: +- Endpoint +description: The following analytic identifies a suspicious edit cronjobs parameter. + This commandline parameter can be abuse by malware author, adversaries, and red red teamers to add cronjob entry to their malicious code to execute + to the schedule they want. This event can also be executed by administrator or normal user for automation purposes so filter is needed. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) + as lastTime from datamodel=Endpoint.Processes + where Processes.process_name = crontab Processes.process = "*crontab *" Processes.process = "* -e*" + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_edit_cron_table_parameter_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: Administrator or network operator can use this application for automation purposes. filter is needed +references: +- https://attack.mitre.org/techniques/T1053/003/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.003/crontab_edit_parameter/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1053.003 + - T1053 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 30 + confidence: 30 + # (impact * confidence)/100 + risk_score: 9 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a possible crontab edit command $process$ executed on $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml b/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml new file mode 100644 index 0000000000..53759c627d --- /dev/null +++ b/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml @@ -0,0 +1,73 @@ +name: Linux Possible Append Command To At Allow Config File +id: 7bc20606-5f40-11ec-a586-acde48001122 +version: 1 +date: '2021-12-17' +author: Teoderick Contreras, Splunk +type: Anomaly +datamodel: +- Endpoint +description: This analytic looks for suspicious commandline that may use to append user entry to /etc/at.allow or /etc/at.deny. + These 2 files are commonly abused by malware, adversaries or red teamers to persist on the targeted or compromised host. + These config file can restrict user that can only execute at application (another schedule task application in linux). attacker can + create a user or add the compromised username to that config file to execute at to schedule it malicious code. This anomaly detection + can be a good indicator to investigate further the entry in created config file and who created it to verify if it is a false positive. +search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes + where Processes.process = "*echo*" Processes.process = "*>>*" + AND Processes.process IN("*/etc/at.allow", "*/etc/at.deny") + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_possible_append_command_to_at_allow_config_file_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: Administrator or network operator can use this commandline for automation purposes. filter is needed +references: +- https://linuxize.com/post/at-command-in-linux/ +- https://attack.mitre.org/techniques/T1053/001/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1053.001 + - T1053 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 30 + confidence: 30 + # (impact * confidence)/100 + risk_score: 9 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a commandline $process$ that may modify at allow config file in $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml b/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml new file mode 100644 index 0000000000..b405d05a6a --- /dev/null +++ b/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml @@ -0,0 +1,72 @@ +name: Linux Possible Append Cronjob Entry on Existing Cronjob File +id: b5b91200-5f27-11ec-bb4e-acde48001122 +version: 1 +date: '2021-12-17' +author: Teoderick Contreras, Splunk +type: Hunting +datamodel: +- Endpoint +description: This analytic looks for possible suspicious commandline that may use to append a code to any existing cronjob files + for persistence or privilege escalation. This technique is commonly abused by malware, adversaries and red teamers to automatically execute their code + within a existing or sometimes in normal cronjob script file. +search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes + where Processes.process = "*echo*" Processes.process = "*>>*" + AND Processes.process IN("*/etc/cron*", "*/var/spool/cron/*", "*/etc/anacrontab*") + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_possible_append_cronjob_entry_on_existing_cronjob_file_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: Administrator or network operator can use this commandline for automation purposes. filter is needed +references: +- https://attack.mitre.org/techniques/T1053/003/ +- https://blog.aquasec.com/threat-alert-kinsing-malware-container-vulnerability +- https://www.intezer.com/blog/research/kaiji-new-chinese-linux-malware-turning-to-golang/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.003/cronjobs_entry/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1053.003 + - T1053 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 70 + confidence: 70 + # (impact * confidence)/100 + risk_score: 49 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a commandline $process$ that may modify cronjob file in $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml b/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml new file mode 100644 index 0000000000..620cc73adc --- /dev/null +++ b/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml @@ -0,0 +1,70 @@ +name: Linux Possible Cronjob Modification With Editor +id: dcc89bde-5f24-11ec-87ca-acde48001122 +version: 1 +date: '2021-12-17' +author: Teoderick Contreras, Splunk +type: Hunting +datamodel: +- Endpoint +description: This analytic looks for possible modification of cronjobs file using editor. + This event is can be seen in normal user but can also be a good hunting indicator for unwanted user modifying cronjobs for possible persistence or + privilege escalation. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) + as lastTime from datamodel=Endpoint.Processes where (Processes.process_name IN("nano","vim.basic") OR Processes.process IN ("*nano *", "*vi *", "*vim *")) + AND Processes.process IN("*/etc/cron*", "*/var/spool/cron/*", "*/etc/anacrontab*") + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_possible_cronjob_modification_with_editor_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: Administrator or network operator can use this commandline for automation purposes. filter is needed +references: +- https://attack.mitre.org/techniques/T1053/003/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.003/cronjobs_entry/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1053.003 + - T1053 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 20 + confidence: 30 + # (impact * confidence)/100 + risk_score: 6 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a commandline $process$ that may modify cronjob file using editor in $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/stories/linux_persistence_techniques.yml b/stories/linux_persistence_techniques.yml new file mode 100644 index 0000000000..a1cbdfea75 --- /dev/null +++ b/stories/linux_persistence_techniques.yml @@ -0,0 +1,27 @@ +name: Linux Persistence Techniques +id: e40d13e5-d38b-457e-af2a-e8e6a2f2b516 +version: 1 +date: '2021-12-17' +author: Teoderick Contreras, Splunk +description: Monitor for activities and techniques associated with maintaining persistence + on a Linux system--a sign that an adversary may have compromised your environment. +narrative: Maintaining persistence is one of the first steps taken by attackers after + the initial compromise. Attackers leverage various custom and built-in tools to + ensure survivability and persistent access within a compromised enterprise. This + Analytic Story provides searches to help you identify various behaviors used by + attackers to maintain persistent access to a Linux environment. +references: +- https://attack.mitre.org/techniques/T1053/ +- https://kifarunix.com/scheduling-tasks-using-at-command-in-linux/ +- https://gtfobins.github.io/gtfobins/at/ +- https://www.cert.ssi.gouv.fr/uploads/CERTFR-2021-CTI-005.pdf + +tags: + analytic_story: Linux Persistence Techniques + category: + - Adversary Tactics + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + usecase: Advanced Threat Detection \ No newline at end of file diff --git a/stories/linux_privilege_escalation.yml b/stories/linux_privilege_escalation.yml new file mode 100644 index 0000000000..006f5c2ca6 --- /dev/null +++ b/stories/linux_privilege_escalation.yml @@ -0,0 +1,27 @@ +name: Linux Privilege Escalation +id: b9879c24-670a-44c0-895e-98cdb7d0e848 +version: 1 +date: '2021-12-17' +author: Teoderick Contreras, Splunk +description: Monitor for and investigate activities that may be associated with a + Linux privilege-escalation attack, including unusual processes running on endpoints, + schedule task, services, setuid, root execution and more. +narrative: 'Privilege escalation is a "land-and-expand" technique, wherein an adversary + gains an initial foothold on a host and then exploits its weaknesses to increase + his privileges. The motivation is simple: certain actions on a Linux machine--such + as installing software--may require higher-level privileges than those the attacker + initially acquired. By increasing his privilege level, the attacker can gain the + control required to carry out his malicious ends. This Analytic Story provides searches + to detect and investigate behaviors that attackers may use to elevate their privileges + in your environment.' +references: +- https://attack.mitre.org/tactics/TA0004/ +tags: + analytic_story: Linux Privilege Escalation + category: + - Adversary Tactics + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + usecase: Advanced Threat Detection \ No newline at end of file diff --git a/tests/endpoint/linux_add_files_in_known_crontab_directories.test.yml b/tests/endpoint/linux_add_files_in_known_crontab_directories.test.yml new file mode 100644 index 0000000000..e0d0767e9b --- /dev/null +++ b/tests/endpoint/linux_add_files_in_known_crontab_directories.test.yml @@ -0,0 +1,12 @@ +name: Linux Add Files In Known Crontab Directories Unit Test +tests: +- name: Linux Add Files In Known Crontab Directories + file: endpoint/linux_add_files_in_known_crontab_directories.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.003/cronjobs_entry/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_at_allow_config_file_creation.test.yml b/tests/endpoint/linux_at_allow_config_file_creation.test.yml new file mode 100644 index 0000000000..d2f3ba2a95 --- /dev/null +++ b/tests/endpoint/linux_at_allow_config_file_creation.test.yml @@ -0,0 +1,12 @@ +name: Linux At Allow Config File Creation Unit Test +tests: +- name: Linux At Allow Config File Creation + file: endpoint/linux_at_allow_config_file_creation.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/at_execution/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_at_application_execution.test.yml b/tests/endpoint/linux_at_application_execution.test.yml new file mode 100644 index 0000000000..ea3b48dbd0 --- /dev/null +++ b/tests/endpoint/linux_at_application_execution.test.yml @@ -0,0 +1,12 @@ +name: Linux At Application Execution Unit Test +tests: +- name: Linux At Application Execution + file: endpoint/linux_at_application_execution.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/at_execution/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_edit_cron_table_parameter.test.yml b/tests/endpoint/linux_edit_cron_table_parameter.test.yml new file mode 100644 index 0000000000..2dd65af9e5 --- /dev/null +++ b/tests/endpoint/linux_edit_cron_table_parameter.test.yml @@ -0,0 +1,12 @@ +name: Linux Edit Cron Table Parameter Unit Test +tests: +- name: Linux Edit Cron Table Parameter + file: endpoint/linux_edit_cron_table_parameter.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.003/crontab_edit_parameter/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_possible_append_command_to_at_allow_config_file.test.yml b/tests/endpoint/linux_possible_append_command_to_at_allow_config_file.test.yml new file mode 100644 index 0000000000..92331f683e --- /dev/null +++ b/tests/endpoint/linux_possible_append_command_to_at_allow_config_file.test.yml @@ -0,0 +1,12 @@ +name: Linux Possible Append Command To At Allow Config File Unit Test +tests: +- name: Linux Possible Append Command To At Allow Config File + file: endpoint/linux_possible_append_command_to_at_allow_config_file.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/at_execution/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.test.yml b/tests/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.test.yml new file mode 100644 index 0000000000..e1ee69373c --- /dev/null +++ b/tests/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.test.yml @@ -0,0 +1,12 @@ +name: Linux Possible Append Cronjob Entry on Existing Cronjob File Unit Test +tests: +- name: Linux Possible Append Cronjob Entry on Existing Cronjob File + file: endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.003/cronjobs_entry/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_possible_cronjob_modification_with_editor.test.yml b/tests/endpoint/linux_possible_cronjob_modification_with_editor.test.yml new file mode 100644 index 0000000000..83dca42143 --- /dev/null +++ b/tests/endpoint/linux_possible_cronjob_modification_with_editor.test.yml @@ -0,0 +1,12 @@ +name: Linux Possible Cronjob Modification With Editor Unit Test +tests: +- name: Linux Possible Cronjob Modification With Editor + file: endpoint/linux_possible_cronjob_modification_with_editor.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.003/cronjobs_entry/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file From 9ba7abd0e83a32f061d097071ff0d713ef31e296 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 21 Dec 2021 10:44:50 -0800 Subject: [PATCH 149/203] Fixed a small error. If you specified a PR number and a branch that did not exist, then it would create a branch and that would be bad. Now, when you specify a branch and a PR number, the branch MUST exist. If not, we fail and bail. --- .../detection_testing_execution.py | 10 +++--- .../modules/github_service.py | 32 ++++++++++++++----- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 7502fd64dc..235417869d 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -360,11 +360,11 @@ def main(args: list[str]): settings['branch'], settings['commit_hash'], settings['pr_number'], settings['persist_security_content']) settings['commit_hash'] = github_service.commit_hash except Exception as e: - print("\nFailure checking out git repository:"\ - "\n\tHash: [%s]"\ - "\n\tBranch: [%s]"\ - "\n\tPR: [%s]\n\tQuitting"% - (settings['commit_hash'],settings['branch'],settings['pr_number']),file=sys.stderr) + print("\nFailure checking out git repository: [%s]"\ + "\n\tCommit Hash: [%s]"\ + "\n\tBranch : [%s]"\ + "\n\tPR : [%s]\n\tQuitting..."% + (str(e),settings['commit_hash'],settings['branch'],settings['pr_number']),file=sys.stderr) sys.exit(1) #passes = [{'search_string': '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where (Processes.process_name ="7z.exe" OR Processes.process_name = "7za.exe" OR Processes.original_file_name = "7z.exe" OR Processes.original_file_name = "7za.exe") AND (Processes.process="*\\\\C$\\\\*" OR Processes.process="*\\\\Admin$\\\\*" OR Processes.process="*\\\\IPC$\\\\*") by Processes.original_file_name Processes.parent_process_name Processes.parent_process Processes.process_name Processes.process Processes.parent_process_id Processes.process_id Processes.dest Processes.user | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `7zip_commandline_to_smb_share_path_filter` | stats count | where count > 0', 'detection_name': '7zip CommandLine To SMB Share Path', 'detection_file': 'endpoint/7zip_commandline_to_smb_share_path.yml', 'success': True, 'error': False, 'diskUsage': '286720', 'runDuration': '0.922', 'scanCount': '4897'}] diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index 798ae31914..a1962a710d 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -35,23 +35,39 @@ class GithubService: self.security_content_repo_obj = self.clone_project( SECURITY_CONTENT_URL, f"security_content", f"develop") + #Ensure that the branch name is valid + #Get all the branch names, prefixed with "origin/" + branch_names = [branch.name for branch in self.security_content_repo_obj.remote().refs] + + if "origin/%s"%(security_content_branch) not in branch_names: + raise(Exception("Branch name [%s] not found in valid branches. Try running \n"\ + "'git branch -a' to examine [%d] branches"%(security_content_branch, len(branch_names)))) + + if commit_hash is not None and PR_number is not None: - print("Error - both the PR number [%d] and the commit hash [%s] were provided. " - "Only 0 or 1 can be passed.\n\tQuitting..." % (PR_number, commit_hash)) - sys.exit() + raise(Exception("Error - both the PR number [%d] and the commit hash [%s] were provided. " + "Only 0 or 1 can be passed." % (PR_number, commit_hash))) + elif PR_number: - ret = subprocess.call(["git", "-C", "security_content/", "fetch", "origin", - "refs/pull/%d/head:%s" % (PR_number, security_content_branch)]) - if ret != 0: - raise(Exception("Error checking out repository")) + ret = subprocess.run(["git", "-C", "security_content/", "fetch", "origin", + "refs/pull/%d/head:%s" % (PR_number, security_content_branch)], capture_output=True) + #ret = subprocess.call(["git", "-C", "security_content/", "fetch", "origin", + # "refs/pull/%d/head:%s" % (PR_number, security_content_branch)]) + + + if ret.returncode != 0: + raise(Exception("Error checking out repository: [%s]"%(ret.stdout.decode("utf-8") + "\n" + ret.stderr.decode("utf-8")))) + # No checking to see if the hash is to a commit inside of the branch - the user - # has to do that by hand + # has to do that by hand. if commit_hash is not None: print("Checking out commit hash: [%s]" % (commit_hash)) self.security_content_repo_obj.git.checkout(commit_hash) else: + #Even if we have fetched a PR, we still MUST check out the branch to + # be able to do anything with it. Otherwise we won't have the files print("Checking out branch: [%s]..." % (security_content_branch), end='') sys.stdout.flush() From 5f972f734feeef6832d2cff0776cdc491aa90e7c Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 21 Dec 2021 11:00:11 -0800 Subject: [PATCH 150/203] Re-push to test everything with 2 containers per GH Actions machine. --- .github/workflows/build-and-validate.yml | 2 +- .../ci/detection_testing_batch/detection_testing_execution.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index c6ed4e4db5..5cddd0389e 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -355,7 +355,7 @@ jobs: python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode all --mock --config_file test_config_github_actions.json elif [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" - python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_file test_config_github_actions.json + python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode all --mock --config_file test_config_github_actions.json else echo "Push from branch [${{ steps.vars.outputs.branch }}]" python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 235417869d..c8f5557eec 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -264,7 +264,7 @@ def finish_mock(settings: dict, detections: list[str], output_file_template: str mock_settings = copy.deepcopy(settings) # This may be able to support as many as 2 for GitHub Actions... # we will have to determine in testing. - mock_settings['num_containers'] = 1 + mock_settings['num_containers'] = 2 # Must be selected since we are passing in a list of detections mock_settings['mode'] = 'selected' From 04c526ba6de64260488a093d4d05f985c8f09837 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 21 Dec 2021 11:17:09 -0800 Subject: [PATCH 151/203] Changed the wrong line to trigger a test of everything. Trying again. --- .github/workflows/build-and-validate.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index 5cddd0389e..2c7347c1f9 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -355,10 +355,10 @@ jobs: python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode all --mock --config_file test_config_github_actions.json elif [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" - python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode all --mock --config_file test_config_github_actions.json + python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_file test_config_github_actions.json else echo "Push from branch [${{ steps.vars.outputs.branch }}]" - python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json + python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode all --mock --config_file test_config_github_actions.json fi mv *-test-run.json replicate_test.json From 47e155b74724b7b19c8770d90eedd5af54a5305c Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 21 Dec 2021 14:22:33 -0800 Subject: [PATCH 152/203] Changed back to one container per GH Action Machine config with the mock option. Also, shuffling detections after they are put into a list to distribute runtime and load as much as possible. --- .../detection_testing_execution.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index c8f5557eec..c7cd6c466a 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -264,7 +264,7 @@ def finish_mock(settings: dict, detections: list[str], output_file_template: str mock_settings = copy.deepcopy(settings) # This may be able to support as many as 2 for GitHub Actions... # we will have to determine in testing. - mock_settings['num_containers'] = 2 + mock_settings['num_containers'] = 1 # Must be selected since we are passing in a list of detections mock_settings['mode'] = 'selected' @@ -384,6 +384,15 @@ def main(args: list[str]): settings['types'], settings['detections_list'], settings['detections_file']) + + #We randomly shuffle this because there are likely patterns in searches. For example, + #cloud/endpoint/network likely have different impacts on the system. By shuffling, + #we spread out this load on a single computer, but also spread it in case + #we are running on GitHub Actions against multiple machines. Hopefully, this + #will reduce that chnaces the some machines run and complete quickly while + #others take a long time. + random.shuffle(all_test_files) + except Exception as e: print("Error getting test files:\n%s"%(str(e)), file=sys.stderr) print("\tQuitting...", file=sys.stderr) From 05821f43037ad1c1892e73c332417e34f49f0bd8 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 21 Dec 2021 14:46:44 -0800 Subject: [PATCH 153/203] Fixed some parts of the CI that don't give a descriptive error message in the output files when a search generates certain types of errors. For example, an error where it cannot reach the Splunk endpoint server. These are rare, but good to have. --- .../ci/detection_testing_batch/modules/splunk_sdk.py | 11 ++++++++--- .../modules/testing_service.py | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 0ed8259077..508da4efe3 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -1,3 +1,4 @@ +from os import error import sys from time import sleep import splunklib.results as results @@ -114,8 +115,10 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, password=splunk_password ) except Exception as e: - print("Unable to connect to Splunk instance: " + str(e),file=sys.stderr) + error_message = "Unable to connect to Splunk instance: %s"%(str(e)) + print(error_message,file=sys.stderr) test_results['error'] = True + test_results['detection_error'] = error_message return test_results @@ -130,9 +133,11 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, try: job = service.jobs.create(splunk_search, **kwargs) except Exception as e: - - print("Unable to execute detection:\n%s"%(str(e))) + + error_message = "Unable to execute detection: %s"%(str(e)) + print(error_message,file=sys.stderr) test_results['error'] = True + test_results['detection_error'] = error_message return test_results test_results['diskUsage'] = job['diskUsage'] diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 6efda4c375..1329431269 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -109,6 +109,7 @@ def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_pa result_detection = splunk_sdk.test_detection_search(splunk_ip, splunk_port, splunk_password, detection['search'], test['pass_condition'], detection['name'], test['file'], test['earliest_time'], test['latest_time']) if result_detection['error']: print("There was an error running the search: %s"%(result_detection['search_string'])) + From d1c95a44addd605be7ea22b35d2979f899cba92c Mon Sep 17 00:00:00 2001 From: root Date: Wed, 22 Dec 2021 09:02:46 +0000 Subject: [PATCH 154/203] Added detection testing service results inLinux Possible Cronjob Modification With Editor --- ...sible_cronjob_modification_with_editor.yml | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml b/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml index 620cc73adc..6fb5f3563c 100644 --- a/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml +++ b/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml @@ -6,24 +6,25 @@ author: Teoderick Contreras, Splunk type: Hunting datamodel: - Endpoint -description: This analytic looks for possible modification of cronjobs file using editor. - This event is can be seen in normal user but can also be a good hunting indicator for unwanted user modifying cronjobs for possible persistence or - privilege escalation. +description: This analytic looks for possible modification of cronjobs file using + editor. This event is can be seen in normal user but can also be a good hunting + indicator for unwanted user modifying cronjobs for possible persistence or privilege + escalation. search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) - as lastTime from datamodel=Endpoint.Processes where (Processes.process_name IN("nano","vim.basic") OR Processes.process IN ("*nano *", "*vi *", "*vim *")) - AND Processes.process IN("*/etc/cron*", "*/var/spool/cron/*", "*/etc/anacrontab*") - by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id - | `drop_dm_object_name(Processes)` - | `security_content_ctime(firstTime)` - | `security_content_ctime(lastTime)` + as lastTime from datamodel=Endpoint.Processes where (Processes.process_name IN("nano","vim.basic") + OR Processes.process IN ("*nano *", "*vi *", "*vim *")) AND Processes.process IN("*/etc/cron*", + "*/var/spool/cron/*", "*/etc/anacrontab*") by Processes.dest Processes.user Processes.parent_process_name + Processes.process_name Processes.process Processes.process_id Processes.parent_process_id + | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_possible_cronjob_modification_with_editor_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: Administrator or network operator can use this commandline for automation purposes. filter is needed + Sysmon TA. +known_false_positives: Administrator or network operator can use this commandline + for automation purposes. filter is needed references: -- https://attack.mitre.org/techniques/T1053/003/ +- https://attack.mitre.org/techniques/T1053/003/ tags: analytic_story: - Linux Privilege Escalation @@ -41,17 +42,16 @@ tags: - Splunk Cloud required_fields: - _time - - Processes.dest - - Processes.user - - Processes.parent_process_name - - Processes.process_name - - Processes.process - - Processes.process_id + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id - Processes.parent_process_id security_domain: endpoint impact: 20 - confidence: 30 - # (impact * confidence)/100 + confidence: 30 risk_score: 6 context: - source:endpoint @@ -67,4 +67,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From 3a68d044ef448bc06ded970cbdeab78016541ef4 Mon Sep 17 00:00:00 2001 From: tccontre <26181693+tccontre@users.noreply.github.com> Date: Wed, 22 Dec 2021 10:46:27 +0100 Subject: [PATCH 155/203] Update linux_possible_append_cronjob_entry_on_existing_cronjob_file.test.yml --- ...ble_append_cronjob_entry_on_existing_cronjob_file.test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.test.yml b/tests/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.test.yml index e1ee69373c..ef57ab1fea 100644 --- a/tests/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.test.yml +++ b/tests/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.test.yml @@ -3,10 +3,10 @@ tests: - name: Linux Possible Append Cronjob Entry on Existing Cronjob File file: endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml pass_condition: '| stats count | where count > 0' - earliest_time: '-24h' + earliest_time: '-30d' latest_time: 'now' attack_data: - file_name: sysmon_linux.log data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.003/cronjobs_entry/sysmon_linux.log source: Syslog:Linux-Sysmon/Operational - sourcetype: sysmon_linux \ No newline at end of file + sourcetype: sysmon_linux From b38beadde2f23008a47385703e0575d30092e308 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 22 Dec 2021 10:03:26 +0000 Subject: [PATCH 156/203] Added detection testing service results inLinux Edit Cron Table Parameter --- .../linux_edit_cron_table_parameter.yml | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/detections/endpoint/linux_edit_cron_table_parameter.yml b/detections/endpoint/linux_edit_cron_table_parameter.yml index b27fd3c0da..b20897b8aa 100644 --- a/detections/endpoint/linux_edit_cron_table_parameter.yml +++ b/detections/endpoint/linux_edit_cron_table_parameter.yml @@ -6,24 +6,25 @@ author: Teoderick Contreras, Splunk type: Hunting datamodel: - Endpoint -description: The following analytic identifies a suspicious edit cronjobs parameter. - This commandline parameter can be abuse by malware author, adversaries, and red red teamers to add cronjob entry to their malicious code to execute - to the schedule they want. This event can also be executed by administrator or normal user for automation purposes so filter is needed. +description: The following analytic identifies a suspicious edit cronjobs parameter. + This commandline parameter can be abuse by malware author, adversaries, and red + red teamers to add cronjob entry to their malicious code to execute to the schedule + they want. This event can also be executed by administrator or normal user for automation + purposes so filter is needed. search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) - as lastTime from datamodel=Endpoint.Processes - where Processes.process_name = crontab Processes.process = "*crontab *" Processes.process = "* -e*" - by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id - | `drop_dm_object_name(Processes)` - | `security_content_ctime(firstTime)` - | `security_content_ctime(lastTime)` - | `linux_edit_cron_table_parameter_filter`' + as lastTime from datamodel=Endpoint.Processes where Processes.process_name = crontab + Processes.process = "*crontab *" Processes.process = "* -e*" by Processes.dest Processes.user + Processes.parent_process_name Processes.process_name Processes.process Processes.process_id + Processes.parent_process_id | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` | `linux_edit_cron_table_parameter_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: Administrator or network operator can use this application for automation purposes. filter is needed + Sysmon TA. +known_false_positives: Administrator or network operator can use this application + for automation purposes. filter is needed references: -- https://attack.mitre.org/techniques/T1053/003/ +- https://attack.mitre.org/techniques/T1053/003/ tags: analytic_story: - Linux Privilege Escalation @@ -41,17 +42,16 @@ tags: - Splunk Cloud required_fields: - _time - - Processes.dest - - Processes.user - - Processes.parent_process_name - - Processes.process_name - - Processes.process - - Processes.process_id + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id - Processes.parent_process_id security_domain: endpoint impact: 30 - confidence: 30 - # (impact * confidence)/100 + confidence: 30 risk_score: 9 context: - source:endpoint @@ -67,4 +67,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From 9a6806ce75f3e75e0a7fc7300a2ea6b78ab500ff Mon Sep 17 00:00:00 2001 From: root Date: Wed, 22 Dec 2021 10:22:07 +0000 Subject: [PATCH 157/203] Added detection testing service results inLinux At Application Execution --- .../linux_at_application_execution.yml | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/detections/endpoint/linux_at_application_execution.yml b/detections/endpoint/linux_at_application_execution.yml index 3a737e133c..7aa146299e 100644 --- a/detections/endpoint/linux_at_application_execution.yml +++ b/detections/endpoint/linux_at_application_execution.yml @@ -6,21 +6,23 @@ author: Teoderick Contreras, Splunk type: Anomaly datamodel: - Endpoint -description: The following analytic identifies a suspicious process creation of At application. - This process can be used by malware, adversaries and red teamers to create persistence entry to the targeted or compromised host with their - malicious code. This anomaly detection can be a good indicator to investigate the event before and after this process execution, when it was executed and what - schedule task it will execute. -search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes where Processes.process_name = at OR Processes.parent_process_name = at - by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid - | `drop_dm_object_name(Processes)` - | `security_content_ctime(firstTime)` - | `security_content_ctime(lastTime)` - | `linux_at_application_execution_filter`' +description: The following analytic identifies a suspicious process creation of At + application. This process can be used by malware, adversaries and red teamers to + create persistence entry to the targeted or compromised host with their malicious + code. This anomaly detection can be a good indicator to investigate the event before + and after this process execution, when it was executed and what schedule task it + will execute. +search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes + where Processes.process_name = at OR Processes.parent_process_name = at by Processes.dest + Processes.user Processes.parent_process_name Processes.process_name Processes.process + Processes.process_id Processes.parent_process_id Processes.process_guid | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_at_application_execution_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: Administrator or network operator can use this application for automation purposes. filter is needed + Sysmon TA. +known_false_positives: Administrator or network operator can use this application + for automation purposes. filter is needed references: - https://attack.mitre.org/techniques/T1053/001/ - https://www.linkedin.com/pulse/getting-attacker-ip-address-from-malicious-linux-job-craig-rowland/ @@ -29,7 +31,7 @@ tags: - Linux Privilege Escalation - Linux Persistence Techniques dataset: - - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/sysmon_linux.log + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/at_execution/sysmon_linux.log kill_chain_phases: - Privilege Escalation mitre_attack_id: @@ -41,17 +43,16 @@ tags: - Splunk Cloud required_fields: - _time - - Processes.dest - - Processes.user - - Processes.parent_process_name - - Processes.process_name - - Processes.process - - Processes.process_id + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id - Processes.parent_process_id security_domain: endpoint impact: 30 - confidence: 30 - # (impact * confidence)/100 + confidence: 30 risk_score: 9 context: - source:endpoint @@ -67,4 +68,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From d708418dd8a95228eed35e610c0852df7062a60c Mon Sep 17 00:00:00 2001 From: root Date: Wed, 22 Dec 2021 10:25:23 +0000 Subject: [PATCH 158/203] Added detection testing service results inLinux At Allow Config File Creation --- .../linux_at_allow_config_file_creation.yml | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/detections/endpoint/linux_at_allow_config_file_creation.yml b/detections/endpoint/linux_at_allow_config_file_creation.yml index fe911eb592..75849e9477 100644 --- a/detections/endpoint/linux_at_allow_config_file_creation.yml +++ b/detections/endpoint/linux_at_allow_config_file_creation.yml @@ -6,31 +6,32 @@ author: Teoderick Contreras, Splunk type: Anomaly datamodel: - Endpoint -description: The following analytic identifies a suspicious file creation of /etc/at.allow or /etc/at.deny. - These 2 files are commonly abused by malware, adversaries or red teamers to persist on the targeted or compromised host. - These config file can restrict user that can only execute at application (another schedule task application in linux). attacker can - create a user or add the compromised username to that config file to execute at to schedule it malicious code. This anomaly detection - can be a good indicator to investigate further the entry in created config file and who created it to verify if it is a false positive. -search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem - where Filesystem.file_path IN ("*/etc/at.allow", "*/etc/at.deny") - by Filesystem.dest Filesystem.file_create_time Filesystem.file_name Filesystem.process_guid Filesystem.file_path - | `drop_dm_object_name(Filesystem)` - | `security_content_ctime(lastTime)` - | `security_content_ctime(firstTime)` - | `linux_at_allow_config_file_creation_filter`' +description: The following analytic identifies a suspicious file creation of /etc/at.allow + or /etc/at.deny. These 2 files are commonly abused by malware, adversaries or red + teamers to persist on the targeted or compromised host. These config file can restrict + user that can only execute at application (another schedule task application in + linux). attacker can create a user or add the compromised username to that config + file to execute at to schedule it malicious code. This anomaly detection can be + a good indicator to investigate further the entry in created config file and who + created it to verify if it is a false positive. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) + as lastTime FROM datamodel=Endpoint.Filesystem where Filesystem.file_path IN ("*/etc/at.allow", + "*/etc/at.deny") by Filesystem.dest Filesystem.file_create_time Filesystem.file_name + Filesystem.process_guid Filesystem.file_path | `drop_dm_object_name(Filesystem)` + | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `linux_at_allow_config_file_creation_filter`' how_to_implement: To successfully implement this search, you need to be ingesting - logs with the file name, file path, and process_guid executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can create this file for automation purposes. filter is needed + logs with the file name, file path, and process_guid executions from your endpoints. + If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA. +known_false_positives: administrator or network operator can create this file for + automation purposes. filter is needed references: -- https://linuxize.com/post/at-command-in-linux/ +- https://linuxize.com/post/at-command-in-linux/ tags: analytic_story: - Linux Privilege Escalation - Linux Persistence Techniques dataset: - - UPDATE_DATASET_URL + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/at_execution/sysmon_linux.log kill_chain_phases: - Privilege Escalation mitre_attack_id: @@ -42,15 +43,14 @@ tags: - Splunk Cloud required_fields: - _time - - Filesystem.dest - - Filesystem.file_create_time - - Filesystem.file_name - - Filesystem.process_guid + - Filesystem.dest + - Filesystem.file_create_time + - Filesystem.file_name + - Filesystem.process_guid - Filesystem.file_path security_domain: endpoint impact: 50 - confidence: 50 - # (impact * confidence)/100 + confidence: 50 risk_score: 25 context: - source:endpoint @@ -66,4 +66,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From 9b3ecff01851bbd986b49cf3e659dca1c85d4909 Mon Sep 17 00:00:00 2001 From: tccontre <26181693+tccontre@users.noreply.github.com> Date: Wed, 22 Dec 2021 11:51:16 +0100 Subject: [PATCH 159/203] Update linux_possible_append_command_to_at_allow_config_file.test.yml --- ...x_possible_append_command_to_at_allow_config_file.test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/endpoint/linux_possible_append_command_to_at_allow_config_file.test.yml b/tests/endpoint/linux_possible_append_command_to_at_allow_config_file.test.yml index 92331f683e..a3ff049444 100644 --- a/tests/endpoint/linux_possible_append_command_to_at_allow_config_file.test.yml +++ b/tests/endpoint/linux_possible_append_command_to_at_allow_config_file.test.yml @@ -3,10 +3,10 @@ tests: - name: Linux Possible Append Command To At Allow Config File file: endpoint/linux_possible_append_command_to_at_allow_config_file.yml pass_condition: '| stats count | where count > 0' - earliest_time: '-24h' + earliest_time: '-30d' latest_time: 'now' attack_data: - file_name: sysmon_linux.log data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/at_execution/sysmon_linux.log source: Syslog:Linux-Sysmon/Operational - sourcetype: sysmon_linux \ No newline at end of file + sourcetype: sysmon_linux From ae6cca1cf4a9b293f29afdab2528b59672ac34a8 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 22 Dec 2021 10:54:26 +0000 Subject: [PATCH 160/203] Added detection testing service results inLinux Add Files In Known Crontab Directories --- ...add_files_in_known_crontab_directories.yml | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/detections/endpoint/linux_add_files_in_known_crontab_directories.yml b/detections/endpoint/linux_add_files_in_known_crontab_directories.yml index 4ad54b00a0..0eb2178788 100644 --- a/detections/endpoint/linux_add_files_in_known_crontab_directories.yml +++ b/detections/endpoint/linux_add_files_in_known_crontab_directories.yml @@ -6,25 +6,26 @@ author: Teoderick Contreras, Splunk type: Anomaly datamodel: - Endpoint -description: The following analytic identifies a suspicious file creation in known cron table directories. - This event is commonly abuse by malware, adversaries and red teamers to persist on the target or compromised host. - crontab or cronjob is like a schedule task in windows environment where you can create an executable or script on the known crontab directories to - run it base on its schedule. This Anomaly query is a good indicator to look further what file is added and who added the file if to consider it legitimate file. -search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem - where Filesystem.file_path IN ("*/etc/cron*", "*/var/spool/cron/*") - by Filesystem.dest Filesystem.file_create_time Filesystem.file_name Filesystem.process_guid Filesystem.file_path - | `drop_dm_object_name(Filesystem)` - | `security_content_ctime(lastTime)` - | `security_content_ctime(firstTime)` - | `linux_add_files_in_known_crontab_directories_filter`' +description: The following analytic identifies a suspicious file creation in known + cron table directories. This event is commonly abuse by malware, adversaries and + red teamers to persist on the target or compromised host. crontab or cronjob is + like a schedule task in windows environment where you can create an executable or + script on the known crontab directories to run it base on its schedule. This Anomaly + query is a good indicator to look further what file is added and who added the file + if to consider it legitimate file. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) + as lastTime FROM datamodel=Endpoint.Filesystem where Filesystem.file_path IN ("*/etc/cron*", + "*/var/spool/cron/*") by Filesystem.dest Filesystem.file_create_time Filesystem.file_name + Filesystem.process_guid Filesystem.file_path | `drop_dm_object_name(Filesystem)` + | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `linux_add_files_in_known_crontab_directories_filter`' how_to_implement: To successfully implement this search, you need to be ingesting - logs with the file name, file path, and process_guid executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can create file in crontab folders for automation purposes. filter is needed + logs with the file name, file path, and process_guid executions from your endpoints. + If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA. +known_false_positives: administrator or network operator can create file in crontab + folders for automation purposes. filter is needed references: -- https://www.sandflysecurity.com/blog/detecting-cronrat-malware-on-linux-instantly/ -- https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/ +- https://www.sandflysecurity.com/blog/detecting-cronrat-malware-on-linux-instantly/ +- https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/ tags: analytic_story: - Linux Privilege Escalation @@ -42,15 +43,14 @@ tags: - Splunk Cloud required_fields: - _time - - Filesystem.dest - - Filesystem.file_create_time - - Filesystem.file_name - - Filesystem.process_guid + - Filesystem.dest + - Filesystem.file_create_time + - Filesystem.file_name + - Filesystem.process_guid - Filesystem.file_path security_domain: endpoint impact: 50 - confidence: 50 - # (impact * confidence)/100 + confidence: 50 risk_score: 25 context: - source:endpoint @@ -66,4 +66,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From dc3fc8296d3632e4ca95a557b93a240eac2c3c97 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 22 Dec 2021 13:02:21 -0800 Subject: [PATCH 161/203] Added a config file to run tests against latest splunkbase apps. Also, added slightly better error output for certain types of test failures. Finally updated splunkbase app defaults in validate_args, but they are commented out for now while we use the S3 versions. --- .../modules/splunk_container.py | 3 +- .../modules/test_driver.py | 2 +- .../modules/validate_args.py | 10 +- ...test_config_github_actions_splunkbase.json | 111 ++++++++++++++++++ 4 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index ffe9b78653..71de2a9ed6 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -131,7 +131,8 @@ class SplunkContainer: env["SPLUNKBASE_USERNAME"] = splunkbase_username env["SPLUNKBASE_PASSWORD"] = splunkbase_password env["SPLUNK_APPS_URL"] = splunk_apps_url - + + return env def make_ports(self, *ports: tuple[str, int]) -> dict[str, int]: diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index d77ee433d1..67c367853b 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -124,7 +124,7 @@ class TestDriver: def addError(self, detection:dict)->None: #Make sure that even errors have all of the required fields. - for required_field in ['search_string', 'diskUsage','runDuration', 'detection_name', 'scanCount']: + for required_field in ['search_string', 'diskUsage','runDuration', 'detection_name', 'scanCount', 'detection_error']: if required_field not in detection: detection[required_field] = "" if 'error' not in detection: diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 186a2a5ded..20704aed77 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -254,7 +254,7 @@ setup_schema = { # }, # "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES": { # "app_number": 1876, - # "app_version": "5.2.0" + # "app_version": "5.2.1" # }, # "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365": @@ -275,12 +275,12 @@ setup_schema = { # "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT": { # "app_number": 2882, - # "app_version": "2.0.2" + # "app_version": "3.0.1" # }, # "SPLUNK_MACHINE_LEARNING_TOOLKIT": { # "app_number": 2890, - # "app_version": "5.2.2" + # "app_version": "5.3.0" # }, # "SPLUNK_APP_FOR_STREAM": { @@ -301,7 +301,7 @@ setup_schema = { # }, # "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX": { # "app_number": 833, - # "app_version": "8.3.1" + # "app_version": "8.4.0" # }, # "SPLUNK_ADD_ON_FOR_SYSMON": { # "app_number": 5709, @@ -310,7 +310,7 @@ setup_schema = { # # According to https://docs.splunk.com/Documentation/ES/6.6.2/Install/Datamodels, these are included in ES. Don't install separately. # "SPLUNK_COMMON_INFORMATION_MODEL": { # "app_number": 1621, - # "app_version": "4.20.2" + # "app_version": "5.0.0" # } # } }, diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json new file mode 100644 index 0000000000..e4e04c2ee4 --- /dev/null +++ b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json @@ -0,0 +1,111 @@ +{ + "branch": "BRANCH_DOES_NOT_EXIST_USE_CLI_ARGUMENT", + "commit_hash": null, + "container_tag": "latest", + "detections_file": null, + "detections_list": null, + "folders": [ + "endpoint", + "cloud", + "network", + "web" + ], + "interactive": false, + "local_apps": { + "SPLUNK_ES_CONTENT_UPDATE": { + "app_number": 3449, + "app_version": null, + "local_path": null + }, + + "SPLUNK_SYSMON_LINUX_TA_PATCHED": { + "app_number": 2, + "app_version": null, + "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/add-on-for-linux-sysmon_103_PATCHED.tgz" + } + + }, + "local_base_container_name": "splunk_test_%d", + "mock": false, + "mode": "changes", + "no_interactive_failure": true, + "num_containers": 10, + "persist_security_content": false, + "pr_number": null, + "reuse_image": true, + "show_splunk_app_password": false, + "splunk_app_password": null, + "splunk_container_apps_directory": "/opt/splunk/etc/apps", + "splunkbase_apps": { + + + "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES": { + "app_number": 1876, + "app_version": "5.2.1" + }, + + "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365": + { + "app_number": 4055, + "app_version": "2.2.0" + }, + + "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE": { + "app_number": 3719, + "app_version": "1.3.2" + }, + + "SPLUNK_ANALYTIC_STORY_EXECUTION_APP": { + "app_number": 4971, + "app_version": "2.0.3" + }, + + "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT": { + "app_number": 2882, + "app_version": "3.0.1" + }, + + "SPLUNK_MACHINE_LEARNING_TOOLKIT": { + "app_number": 2890, + "app_version": "5.3.0" + }, + + "SPLUNK_APP_FOR_STREAM": { + "app_number": 1809, + "app_version": "8.0.1" + }, + "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA": { + "app_number": 5234, + "app_version": "8.0.1" + }, + "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS": { + "app_number": 5238, + "app_version": "8.0.1" + }, + "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO": { + "app_number": 1617, + "app_version": "4.0.0" + }, + "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX": { + "app_number": 833, + "app_version": "8.4.0" + }, + "SPLUNK_ADD_ON_FOR_SYSMON": { + "app_number": 5709, + "app_version": "1.0.1" + }, + + "SPLUNK_COMMON_INFORMATION_MODEL": { + "app_number": 1621, + "app_version": "5.0.0" + } + + }, + "splunkbase_password": null, + "splunkbase_username": null, + "types": [ + "Anomaly", + "Hunting", + "TTP" + ] +} From 2574fb2fea26fdfedc09cb11e1b6bef4de3364f2 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 22 Dec 2021 13:19:05 -0800 Subject: [PATCH 162/203] Hardcoding the branch to develop for CI testing. --- .github/workflows/build-and-validate.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index 2c7347c1f9..022bc06615 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -358,7 +358,8 @@ jobs: python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_file test_config_github_actions.json else echo "Push from branch [${{ steps.vars.outputs.branch }}]" - python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode all --mock --config_file test_config_github_actions.json + #python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode all --mock --config_file test_config_github_actions.json + python detection_testing_execution.py run --branch develop --mode all --mock --config_file test_config_github_actions_splunkbase.json fi mv *-test-run.json replicate_test.json From eb48e000a84e1d1dc0dc60a760e3eda1a6c19a45 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 22 Dec 2021 14:05:55 -0800 Subject: [PATCH 163/203] Updated default app loadout for splunkbase. Added splunk_ta_for_nginz, splunk_security_essentials, and ta_for_zeek. --- .../test_config_github_actions_splunkbase.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json index e4e04c2ee4..3e6ae86949 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json +++ b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json @@ -98,8 +98,19 @@ "SPLUNK_COMMON_INFORMATION_MODEL": { "app_number": 1621, "app_version": "5.0.0" + }, + "SPLUNK_ADD_ON_FOR_NGINX" : { + "app_number": 3258, + "app_version": "3.1.0" + }, + "SPLUNK_SECURITY_ESSENTIALS": { + "app_number": 3435, + "app_version": "3.4.0" + }, + "TA_FOR_ZEEK": { + "app_number": 5466, + "app_version": "1.0.5" } - }, "splunkbase_password": null, "splunkbase_username": null, From 204670cbe1d023e7c770a77fe9eda424fd212431 Mon Sep 17 00:00:00 2001 From: tccontre <26181693+tccontre@users.noreply.github.com> Date: Wed, 5 Jan 2022 16:33:43 +0100 Subject: [PATCH 164/203] Update linux_at_allow_config_file_creation.yml --- detections/endpoint/linux_at_allow_config_file_creation.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/detections/endpoint/linux_at_allow_config_file_creation.yml b/detections/endpoint/linux_at_allow_config_file_creation.yml index 75849e9477..59f5500f96 100644 --- a/detections/endpoint/linux_at_allow_config_file_creation.yml +++ b/detections/endpoint/linux_at_allow_config_file_creation.yml @@ -8,10 +8,10 @@ datamodel: - Endpoint description: The following analytic identifies a suspicious file creation of /etc/at.allow or /etc/at.deny. These 2 files are commonly abused by malware, adversaries or red - teamers to persist on the targeted or compromised host. These config file can restrict - user that can only execute at application (another schedule task application in + teamers to persist on the targeted or compromised host. These config files can restrict or allow + user to execute "at" application (another schedule task application in linux). attacker can create a user or add the compromised username to that config - file to execute at to schedule it malicious code. This anomaly detection can be + file to execute "at" to schedule it malicious code. This anomaly detection can be a good indicator to investigate further the entry in created config file and who created it to verify if it is a false positive. search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) From cebc5ac4fd1aba5873eed1aad608c41a72f5feca Mon Sep 17 00:00:00 2001 From: tccontre <26181693+tccontre@users.noreply.github.com> Date: Wed, 5 Jan 2022 16:38:48 +0100 Subject: [PATCH 165/203] Update linux_edit_cron_table_parameter.yml --- detections/endpoint/linux_edit_cron_table_parameter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detections/endpoint/linux_edit_cron_table_parameter.yml b/detections/endpoint/linux_edit_cron_table_parameter.yml index b20897b8aa..a2e4695ee0 100644 --- a/detections/endpoint/linux_edit_cron_table_parameter.yml +++ b/detections/endpoint/linux_edit_cron_table_parameter.yml @@ -6,7 +6,7 @@ author: Teoderick Contreras, Splunk type: Hunting datamodel: - Endpoint -description: The following analytic identifies a suspicious edit cronjobs parameter. +description: The following analytic identifies a suspicious cronjobs modification using crontab edit parameter. This commandline parameter can be abuse by malware author, adversaries, and red red teamers to add cronjob entry to their malicious code to execute to the schedule they want. This event can also be executed by administrator or normal user for automation From 64abbe44586ba07f0cd079cfec5a8c23a5ab051f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 5 Jan 2022 14:39:13 -0800 Subject: [PATCH 166/203] Significant changes. Most importantly, instead of a hard-coded wait time after uploading data, we poll to make sure that all the data has been indexed. When this is complete, we move ahead with the test. While this costs extra in terms of CPU and Disk access, it usually allows us to go much faster since wait time is usually just a few seconds. Better tracking of time per test and time estimation. --- .../detection_testing_execution.py | 8 ++ .../modules/container_manager.py | 8 +- .../modules/splunk_container.py | 14 +- .../modules/splunk_sdk.py | 97 +++++++++++++- .../modules/test_driver.py | 76 ++++++----- .../modules/testing_service.py | 120 ++++++++++++------ 6 files changed, 235 insertions(+), 88 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index c7cd6c466a..6e63261ef6 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -42,6 +42,10 @@ datamodel_file_container_path = os.path.join( SPLUNK_CONTAINER_APPS_DIR, "Splunk_SA_CIM") +authorizations_file_local_path = "authorize.conf.tar" +authorizations_file_container_path = "/opt/splunk/etc/system/local" + + MAX_RECOMMENDED_CONTAINERS_BEFORE_WARNING = 2 @@ -399,6 +403,7 @@ def main(args: list[str]): sys.exit(1) print("***This run will test [%d] detections!***"%(len(all_test_files))) + #Set up the directory that will be used to store the local apps/apps we build local_volume_absolute_path = os.path.abspath( @@ -457,6 +462,9 @@ def main(args: list[str]): "local_file_path": index_file_local_path, "container_file_path": index_file_container_path} files_to_copy_to_container["DATAMODELS"] = { "local_file_path": datamodel_file_local_path, "container_file_path": datamodel_file_container_path} + files_to_copy_to_container["AUTHORIZATIONS"] = { + "local_file_path": authorizations_file_local_path, "container_file_path": authorizations_file_container_path} + try: diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index f231a7b915..8bd38d9668 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -228,7 +228,13 @@ class ContainerManager: print("All containers stopped") return None - if self.synchronization_object.summarize() == False: + + at_least_one_container_has_started_running_tests = False + for container in self.containers: + if container.test_start_time != -1: + at_least_one_container_has_started_running_tests = True + break + if self.synchronization_object.summarize(testing_currently_active = at_least_one_container_has_started_running_tests) == False: #There are no more tests to run, so we can return from this thread return None diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 71de2a9ed6..72986d27f1 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -18,7 +18,7 @@ from typing import Union import threading import wrapt_timeout_decorator import sys - +import traceback SPLUNKBASE_URL = "https://splunkbase.splunk.com/app/%d/release/%s/download" SPLUNK_START_ARGS = "--accept-license" @@ -198,7 +198,7 @@ class SplunkContainer: ) successful_copy = True except Exception as e: - # print("Failed copy of [%s] file to CONTAINER:[%s]...we will try again"%(localFilePath, containerName)) + #print("Failed copy of [%s] file to [%s] on CONTAINER [%s]: [%s]\n...we will try again"%(local_file_path, container_file_path, self.container_name, str(e))) time.sleep(10) successful_copy = False #print("Successfully copied [%s] to [%s] on [%s]"% (local_file_path, container_file_path, self.container_name)) @@ -374,6 +374,7 @@ class SplunkContainer: elapsed_rounded = round(timeit.default_timer() - container_start_time) time_string = (datetime.timedelta(seconds=elapsed_rounded)) print("Container [%s] took [%s] to start"%(self.container_name, time_string)) + self.synchronization_object.start_barrier.wait() # Sleep for a small random time so that containers drift apart and don't synchronize their testing @@ -387,10 +388,11 @@ class SplunkContainer: # Sleep for a small random time so that containers drift apart and don't synchronize their testing - time.sleep(random.randint(1, 30)) + #time.sleep(random.randint(1, 30)) # There is a detection to test + print("Container [%s]--->[%s]" % (self.container_name, detection_to_test)) try: @@ -408,12 +410,16 @@ class SplunkContainer: # Remove the data from the test that we just ran. We MUST do this when running on CI because otherwise, we will download # a massive amount of data over the course of a long path and will run out of space on the relatively small CI runner drive - shutil.rmtree(result["attack_data_directory"]) + shutil.rmtree(result["attack_data_directory"],ignore_errors=True) except Exception as e: print( "Warning - uncaught error in detection test for [%s] - this should not happen: [%s]" % (detection_to_test, str(e)) ) + + traceback.print_exc() + import pdb + pdb.set_trace() # Fill in all the "Empty" fields with default values. Otherwise, we will not be able to # process the result correctly. self.synchronization_object.addError( diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index 508da4efe3..d21f093439 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -5,10 +5,12 @@ import splunklib.results as results import splunklib.client as client import splunklib.results as results import requests - +import time +import timeit +import datetime from typing import Union -def enable_delete_for_admin(splunk_host, splunk_port, splunk_password): +def enable_delete_for_admin(splunk_host:str, splunk_port:int, splunk_password:str)->bool: try: service = client.connect( host=splunk_host, @@ -20,6 +22,29 @@ def enable_delete_for_admin(splunk_host, splunk_port, splunk_password): raise(Exception("Unable to connect to Splunk instance: " + str(e))) + #write the following contents to /opt/splunk/etc/system/local/authorize.conf + "[role_admin]"\ + "delete_by_keyword = enabled"\ + "grantableRoles = admin"\ + "importRoles = can_delete;user;power_user"\ + "srchIndexesAllowed = *;_*;main"\ + "srchIndexesDefault = main"\ + "srchMaxTime = 8640000" + + #Run the following search, equivalent to running ./splunk reload auth, to get the settings to take effect + + update_changed_auth_search = "| rest splunk_server=* /services/authentication/providers/services/_reload" + + + try: + job = service.jobs.create(update_changed_auth_search) + except Exception as e: + error_message = "Unable to enable delete: %s"%(str(e)) + return False + + input("Waiting for you to check that delete has been enabled with: %s"%(update_changed_auth_search)) + return True + ''' # search and replace \\ with \\\ # search = search.replace('\\','\\\\') role = service.roles['admin'] @@ -28,10 +53,64 @@ def enable_delete_for_admin(splunk_host, splunk_port, splunk_password): except Exception as e: print("Error - failed trying to grant 'can_delete' privs to admin: [%s]"%(str(e))) return False + ''' return True + +def wait_for_indexing_to_complete(splunk_host, splunk_port, splunk_password, sourcetype:str, index:str, check_interval_seconds:int=5): + + startTime = timeit.default_timer() + previous_count = -1 + time.sleep(check_interval_seconds) + while True: + #print("waiting for search...") + try: + service = client.connect( + host=splunk_host, + port=splunk_port, + username='admin', + password=splunk_password + ) + except Exception as e: + raise(Exception("Unable to connect to Splunk instance: " + str(e))) + + search = '''search index="%s" sourcetype="%s" | stats count'''%(index,sourcetype) + kwargs = {"exec_mode":"blocking"} + try: + search_result = service.jobs.create(search, **kwargs) + except Exception as e: + print("Error while waiting for indexing of data to complete: %s"%(str(e))) + #return False + + #This returns the count in string form, not as an int. For example: + #OrderedDict([('count', '59630')]) + try: + for result in results.ResultsReader(search_result.results()): + count = int(result['count']) + #print("count is %d, previous count is %d"%(count,previous_count)) + if previous_count == -1: + if count == 0: + pass + else: + previous_count = count + else: + if count == previous_count: + #After waiting for the check interval, we return the same number of results. The indexing must be complete + stopTime = timeit.default_timer() + #print("Indexing completed after: %s "%(datetime.timedelta(seconds=stopTime-startTime))) + return True + else: + previous_count = count + + except Exception as e: + print("Error trying to get the count while waiting for indexing to complete: %s"%(str(e))) + #return False + time.sleep(check_interval_seconds) + + + def test_baseline_search(splunk_host, splunk_port, splunk_password, search, pass_condition, baseline_name, baseline_file, earliest_time, latest_time)->dict: try: service = client.connect( @@ -127,7 +206,7 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, - print("SEARCH: %s"%(splunk_search)) + #print("SEARCH: %s"%(splunk_search)) try: @@ -192,6 +271,8 @@ def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wa job = service.jobs.oneshot(splunk_search, **kwargs) reader = results.ResultsReader(job) + data_exists = False + ''' error_in_results = False for result in reader: if hasattr(result,"message") and hasattr(result,"type") and ("You have insufficient privileges to delete events" in result.message or result.type == "FATAL"): @@ -207,15 +288,17 @@ def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wa else: #This is not one of the error messages, do nothing pass - + ''' #No need to issue Delete command again, we will now break out of the loop - if error_in_results is False: - data_exists = False + #if error_in_results is False: + # data_exists = False #Otherwise, we will loop again except Exception as e: - raise(Exception("Unable to delete data from a run: " + str(e))) + print("Trouble deleting data from a run.... we will try again") + time.sleep(5) + #raise(Exception("Unable to delete data from a run: " + str(e))) return True diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index 67c367853b..40909ccba7 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -106,7 +106,7 @@ class TestDriver: return None def addSuccess(self, result:dict)->None: - print("Test PASSED for detection: [%s --> %s"%(result['detection_name'], result['detection_file'])) + print("Test PASSED: [%s --> %s]"%(result['detection_name'], result['detection_file'])) self.lock.acquire() try: self.successes.append(result) @@ -115,26 +115,26 @@ class TestDriver: def addFailure(self, result:dict)->None: - print("Test FAILED for detection: [%s --> %s"%(result['detection_name'], result['detection_file'])) + print("Test FAILED: [%s --> %s"%(result['detection_name'], result['detection_file'])) self.lock.acquire() try: self.failures.append(result) finally: self.lock.release() - def addError(self, detection:dict)->None: + def addError(self, result:dict)->None: #Make sure that even errors have all of the required fields. - for required_field in ['search_string', 'diskUsage','runDuration', 'detection_name', 'scanCount', 'detection_error']: - if required_field not in detection: - detection[required_field] = "" - if 'error' not in detection: - detection['error'] = True - if 'success' not in detection: - detection['success'] = False - + for required_field in ['search_string', 'diskUsage','runDuration', 'detection_name', 'scanCount', 'detection_error', 'detection_file']: + if required_field not in result: + result[required_field] = "" + if 'error' not in result: + result['error'] = True + if 'success' not in result: + result['success'] = False + print("Test ERROR: [%s --> %s"%(result['detection_name'], result['detection_file'])) self.lock.acquire() try: - self.errors.append(detection) + self.errors.append(result) finally: self.lock.release() @@ -259,13 +259,13 @@ class TestDriver: disk_usage_info = psutil.disk_usage('/') cpu_info_string = "Total CPU Usage : %d%% (%d CPUs)"%(100 - cpu_info.idle, psutil.cpu_count(logical=False)) - memory_info_string = "Total Memory Usage: %0.1fGB USED / %0.1fGB TOTAL"%(memory_info.used / bytes_per_GB, memory_info.total / bytes_per_GB) + memory_info_string = "Total Memory Usage: %0.1fGB USED / %0.1fGB TOTAL"%((memory_info.total - memory_info.available) / bytes_per_GB, memory_info.total / bytes_per_GB) disk_usage_info_string = "Total Disk Usage : %0.1fGB USED / %0.1fGB TOTAL"%(disk_usage_info.free / bytes_per_GB, disk_usage_info.total / bytes_per_GB) - + return "System Information:\n\t%s\n\t%s\n\t%s"%(cpu_info_string, memory_info_string, disk_usage_info_string) - def summarize(self)->bool: + def summarize(self,testing_currently_active:bool=False)->bool: if self.checkContainerFailure() == True: print("Error running containers... shutting down", file=sys.stderr) @@ -285,7 +285,7 @@ class TestDriver: - if self.testing_queue.qsize() == self.total_number_of_tests: + if not testing_currently_active: #Testing has not started yet. We are setting up containers print("***********PROGRESS UPDATE***********\n"\ "\tWaiting for container setup: %s\n\t%s\n"%(datetime.timedelta(seconds=current_time - self.start_time),system_stats)) @@ -295,47 +295,45 @@ class TestDriver: #This is the first status update since container setup has completed. Get the current time. #This makes our remaining time estimates better since that estimate should not involve #the container setup time + print("SETTING THE CONTAINER READY TIME!") + self.container_ready_time = current_time numberOfCompletedTests = len(self.successes) + len(self.failures) + len(self.errors) remaining_tests = self.testing_queue.qsize() testsCurrentlyRunning = self.total_number_of_tests - remaining_tests - numberOfCompletedTests - total_execution_time_seconds = current_time - self.start_time + total_execution_time_seconds = round(current_time - self.start_time) test_execution_time_seconds = current_time - self.container_ready_time if numberOfCompletedTests == 0 or test_execution_time_seconds == 0: estimated_seconds_to_finish_all_tests = "UNKNOWN" - estimated_completion_time_seconds = "UNKNOWN" + estimated_completion_time_string = "UNKNOWN" + average_time_per_test_string = "UNKNOWN" else: average_time_per_test = test_execution_time_seconds / numberOfCompletedTests + average_time_per_test_string = datetime.timedelta(seconds=round(test_execution_time_seconds/numberOfCompletedTests)) #divide testsCurrentlyRunning by 2.0 because, on average, each running test will be 50% completed - estimated_seconds_to_finish_all_tests = average_time_per_test * (remaining_tests + testsCurrentlyRunning/2.0) - estimated_completion_time_seconds = datetime.timedelta(seconds=estimated_seconds_to_finish_all_tests) + estimated_seconds_to_finish_all_tests = round(average_time_per_test * (remaining_tests + testsCurrentlyRunning/2.0)) + estimated_completion_time_string = datetime.timedelta(seconds=estimated_seconds_to_finish_all_tests) - print("***********PROGRESS UPDATE***********\n"\ - "\tElapsed Time : %s\n"\ - "\tEstimated Remaining Time : %s\n"\ - "\tTests to run : %d\n"\ - "\tTests currently running : %d\n"\ - "\tTests completed : %d\n"\ - "\t\tSuccess : %d\n"\ - "\t\tFailure : %d\n"\ - "\t\tError : %d\n"\ - "\t%s\n"%(datetime.timedelta(seconds=total_execution_time_seconds), - estimated_completion_time_seconds, - remaining_tests, - testsCurrentlyRunning, - numberOfCompletedTests, - len(self.successes), - len(self.failures), - len(self.errors), - system_stats)) - + print(f"***********PROGRESS UPDATE***********\n"\ + f"\tElapsed Time : {datetime.timedelta(seconds=total_execution_time_seconds)}\n"\ + f"\tTest Execution Time : {datetime.timedelta(seconds=round(test_execution_time_seconds))}\n"\ + f"\tEstimated Remaining Time : {estimated_completion_time_string}\n"\ + f"\tTests to run : {remaining_tests}\n"\ + f"\tAverage Time Per Test : {average_time_per_test_string}\n", + f"\tTests currently running : {testsCurrentlyRunning}\n"\ + f"\tTests completed : {numberOfCompletedTests}\n"\ + f"\t\tSuccess : {len(self.successes)}\n"\ + f"\t\tFailure : {len(self.failures)}\n"\ + f"\t\tError : {len(self.errors)}\n"\ + f"\t{system_stats}\n") + except Exception as e: print("Error in printing execution summary: [%s]"%(str(e))) finally: diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 1329431269..036ef3d2b2 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -1,7 +1,7 @@ import re -import ansible_runner +#import ansible_runner import yaml import uuid import sys @@ -10,17 +10,20 @@ import time import requests from modules.DataManipulation import DataManipulation from modules import splunk_sdk - +import timeit from typing import Union from os.path import relpath from tempfile import mkdtemp - +import datetime def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:str, splunk_port:int, test_file:str, attack_data_root_folder, wait_on_failure:bool=False, wait_on_completion:bool=False)->dict: + one_test_start = timeit.default_timer() uuid_var = str(uuid.uuid4()) result_test = test_detection(splunk_ip, splunk_port, container_name, splunk_password, test_file, uuid_var, attack_data_root_folder) + one_test_stop = timeit.default_timer() + if result_test is None: #We failed so early in the process that we could not produce any meaningful result raise(Exception("Test execution Error")) @@ -29,11 +32,15 @@ def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:st # delete test data search_string = result_test['detection_result']['search_string'] + #get pretty time info + elapsed_search_time_string = str(datetime.timedelta(seconds=round(one_test_stop - one_test_start))) + #search failed if there was an error or the detection failed to produce the expected result + #print("Elapsed search time: %s"%(elapsed_search_time_string)) if wait_on_failure and (result_test['detection_result']['error'] or not result_test['detection_result']['success']): - wait_on_delete = {'message':"\n\n\n****SEARCH FAILURE: Allowing time to debug search/data****"} + wait_on_delete = {'message':"\n\n\n****SEARCH FAILURE : Allowing time to debug search/data****"} elif wait_on_completion: - wait_on_delete = {'message':"\n\n\n****SEARCH SUCCESS: Allowing time to examine search/data****"} + wait_on_delete = {'message':"\n\n\n****SEARCH SUCCESS : Allowing time to examine search/data****"} else: wait_on_delete = None @@ -43,6 +50,20 @@ def test_detection_wrapper(container_name:str, splunk_ip:str, splunk_password:st return result_test +import splunklib.client as client +def get_service(splunk_ip:str, splunk_port:int, splunk_password:str): + + try: + service = client.connect( + host=splunk_ip, + port=splunk_port, + username='admin', + password=splunk_password + ) + except Exception as e: + raise(Exception("Unable to connect to Splunk instance: " + str(e))) + return service + def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_password:str, test_file:str, uuid_var, attack_data_root_folder)->Union[dict,None]: test_file_obj = load_file(os.path.join("security_content/", test_file)) @@ -64,6 +85,9 @@ def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_pa folder_name = relpath(abs_folder_path, os.getcwd()) + + + for attack_data in test_file_obj['tests'][0]['attack_data']: url = attack_data['data'] r = requests.get(url, allow_redirects=True) @@ -78,10 +102,32 @@ def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_pa if attack_data['update_timestamp'] == True: data_manipulation = DataManipulation() data_manipulation.manipulate_timestamp(target_file, attack_data['sourcetype'], attack_data['source']) - replay_attack_dataset(container_name, splunk_password, folder_name, "main", attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) - + #replay_attack_dataset(container_name, splunk_password, folder_name, "test0", attack_data['sourcetype'], attack_data['source'], attack_data['file_name']) + import http.client + try: + service = get_service(splunk_ip, splunk_port, splunk_password) + test_index = service.indexes["main"] + + with open(target_file, 'rb') as target: + test_index.submit(target.read(), sourcetype=attack_data['sourcetype'], source=attack_data['source']) + + except http.client.HTTPException as e: + print("caught the offending exception!") + sys.exit(1) + except Exception as e: + print("did not catch the offending exception") + sys.exit(1) + + + if not splunk_sdk.wait_for_indexing_to_complete(splunk_ip, splunk_port, splunk_password, attack_data['sourcetype'], "main"): + raise Exception("There was an error waiting for indexing to complete.") + #Allow some time for the data to be ingested and processed - time.sleep(30) + #print("begin sleep 30") + #time.sleep(60) + + + #print("end sleep 30") result_test = {} test = test_file_obj['tests'][0] @@ -104,7 +150,7 @@ def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_pa detection_file_name = test['file'] detection = load_file(os.path.join(os.path.dirname(__file__), '../security_content/detections', detection_file_name)) - print("Making test_detection_search request to: [%s:%d]"%(splunk_ip, splunk_port)) + #print("Making test_detection_search request to: [%s:%d]"%(splunk_ip, splunk_port)) result_detection = splunk_sdk.test_detection_search(splunk_ip, splunk_port, splunk_password, detection['search'], test['pass_condition'], detection['name'], test['file'], test['earliest_time'], test['latest_time']) if result_detection['error']: @@ -136,40 +182,40 @@ def load_file(file_path): return file -def update_ESCU_app(container_name, splunk_password): - print("Update ESCU App. This can take some time") +# def update_ESCU_app(container_name, splunk_password): +# print("Update ESCU App. This can take some time") - ansible_vars = {} - ansible_vars['ansible_user'] = 'ansible_user' - ansible_vars['splunk_password'] = splunk_password - ansible_vars['security_content_path'] = 'security_content' +# ansible_vars = {} +# ansible_vars['ansible_user'] = 'ansible_user' +# ansible_vars['splunk_password'] = splunk_password +# ansible_vars['security_content_path'] = 'security_content' - cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) +# cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) - runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), - cmdline=cmdline, - roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), - playbook=os.path.join(os.path.dirname(__file__), '../ansible/update_escu.yml'), - extravars=ansible_vars) - print("Successfully updated the ESCU App!") +# runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), +# cmdline=cmdline, +# roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), +# playbook=os.path.join(os.path.dirname(__file__), '../ansible/update_escu.yml'), +# extravars=ansible_vars) +# print("Successfully updated the ESCU App!") -def replay_attack_dataset(container_name, splunk_password, folder_name, index, sourcetype, source, out): - ansible_vars = {} - ansible_vars['folder_name'] = folder_name - ansible_vars['ansible_user'] = 'ansible' +# def replay_attack_dataset(container_name, splunk_password, folder_name, index, sourcetype, source, out): +# ansible_vars = {} +# ansible_vars['folder_name'] = folder_name +# ansible_vars['ansible_user'] = 'ansible' - ansible_vars['splunk_password'] = splunk_password - ansible_vars['out'] = out - ansible_vars['sourcetype'] = sourcetype - ansible_vars['source'] = source - ansible_vars['index'] = index +# ansible_vars['splunk_password'] = splunk_password +# ansible_vars['out'] = out +# ansible_vars['sourcetype'] = sourcetype +# ansible_vars['source'] = source +# ansible_vars['index'] = index - cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) +# cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) - runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), - cmdline=cmdline, - roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), - playbook=os.path.join(os.path.dirname(__file__), '../ansible/attack_replay.yml'), - extravars=ansible_vars) +# runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), +# cmdline=cmdline, +# roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), +# playbook=os.path.join(os.path.dirname(__file__), '../ansible/attack_replay.yml'), +# extravars=ansible_vars) From 1dea66d75ccf30f5a21678075df81a84902d0b21 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 5 Jan 2022 15:26:43 -0800 Subject: [PATCH 167/203] Added authorize.conf.tar to make it possible to delete data from completed searches properly. --- .../detection_testing_batch/authorize.conf.tar | Bin 0 -> 2048 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 bin/automated_detection_testing/ci/detection_testing_batch/authorize.conf.tar diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/authorize.conf.tar b/bin/automated_detection_testing/ci/detection_testing_batch/authorize.conf.tar new file mode 100644 index 0000000000000000000000000000000000000000..3a624a3b27a8fc5451df076403d5db682ca9c90e GIT binary patch literal 2048 zcmeH@J!``-5QaVbS7^>q&PJ9CrbD4ihb*C6DMGQ&iKsq;B$K4SzGs`1lA&9m0c*Lt z_thPDj~de62mOT)t#^HPlLr8TbCyx8g_t6gb4?OJDQZ^mLU2)5RS67=3hE+baFcDW zh7K{QK&zo`ciK4}ul!3%-}=A!OqalX98kQI_a3}KsXD9ON8X{qgmQb9pLjm{(6J|m zPHhc#`7S7z#&kmsk&LM)*Y@B;x@fI(avstQ5kqtEM+|aI^BCIwtLyND@!1&C$Kk6+ qt{SVf`)$8quLhII{&Cjo^rkJ6^eFg9`cCLBYc2#90t Date: Mon, 10 Jan 2022 09:43:33 +0100 Subject: [PATCH 168/203] Update linux_possible_append_command_to_at_allow_config_file.yml --- ...linux_possible_append_command_to_at_allow_config_file.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml b/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml index 53759c627d..516207b4a6 100644 --- a/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml +++ b/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml @@ -12,8 +12,7 @@ description: This analytic looks for suspicious commandline that may use to appe create a user or add the compromised username to that config file to execute at to schedule it malicious code. This anomaly detection can be a good indicator to investigate further the entry in created config file and who created it to verify if it is a false positive. search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes - where Processes.process = "*echo*" Processes.process = "*>>*" - AND Processes.process IN("*/etc/at.allow", "*/etc/at.deny") + where Processes.process = "*echo*" AND Processes.process IN("*/etc/at.allow", "*/etc/at.deny") by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` @@ -70,4 +69,4 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 From 265a1f049490bab3a22f0ae391ae97f5c4931d52 Mon Sep 17 00:00:00 2001 From: tccontre <26181693+tccontre@users.noreply.github.com> Date: Mon, 10 Jan 2022 09:44:05 +0100 Subject: [PATCH 169/203] Update linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml --- ...ossible_append_cronjob_entry_on_existing_cronjob_file.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml b/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml index b405d05a6a..a368528567 100644 --- a/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml +++ b/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml @@ -10,8 +10,7 @@ description: This analytic looks for possible suspicious commandline that may us for persistence or privilege escalation. This technique is commonly abused by malware, adversaries and red teamers to automatically execute their code within a existing or sometimes in normal cronjob script file. search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes - where Processes.process = "*echo*" Processes.process = "*>>*" - AND Processes.process IN("*/etc/cron*", "*/var/spool/cron/*", "*/etc/anacrontab*") + where Processes.process = "*echo*" AND Processes.process IN("*/etc/cron*", "*/var/spool/cron/*", "*/etc/anacrontab*") by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` @@ -69,4 +68,4 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 From f48713b301a6723cbbeb45153457587d21619f4a Mon Sep 17 00:00:00 2001 From: tccontre <26181693+tccontre@users.noreply.github.com> Date: Mon, 10 Jan 2022 09:46:50 +0100 Subject: [PATCH 170/203] Update linux_possible_append_command_to_at_allow_config_file.yml --- .../linux_possible_append_command_to_at_allow_config_file.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml b/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml index 516207b4a6..3b674b0369 100644 --- a/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml +++ b/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml @@ -31,7 +31,7 @@ tags: - Linux Privilege Escalation - Linux Persistence Techniques dataset: - - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/sysmon_linux.log + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1053.001/at_execution/sysmon_linux.log kill_chain_phases: - Privilege Escalation mitre_attack_id: From 856635f60193024bd770caefebae48f5981a42df Mon Sep 17 00:00:00 2001 From: tccontre Date: Mon, 10 Jan 2022 12:51:04 +0100 Subject: [PATCH 171/203] linux_persist_priv_batch_4 --- .../endpoint/linux_add_user_account.yml | 69 ++++++++++++++++++ ...x_common_process_for_elevation_control.yml | 71 ++++++++++++++++++ .../linux_doas_conf_file_creation.yml | 70 ++++++++++++++++++ .../endpoint/linux_doas_tool_execution.yml | 71 ++++++++++++++++++ ...ux_possible_access_to_credential_files.yml | 72 +++++++++++++++++++ .../linux_possible_access_to_sudoers_file.yml | 71 ++++++++++++++++++ .../endpoint/linux_sudo_or_su_execution.yml | 70 ++++++++++++++++++ .../endpoint/linux_add_user_account.test.yml | 12 ++++ ...mon_process_for_elevation_control.test.yml | 12 ++++ .../linux_doas_conf_file_creation.test.yml | 12 ++++ .../linux_doas_tool_execution.test.yml | 12 ++++ ...ssible_access_to_credential_files.test.yml | 12 ++++ ...x_possible_access_to_sudoers_file.test.yml | 12 ++++ .../linux_sudo_or_su_execution.test.yml | 12 ++++ 14 files changed, 578 insertions(+) create mode 100644 detections/endpoint/linux_add_user_account.yml create mode 100644 detections/endpoint/linux_common_process_for_elevation_control.yml create mode 100644 detections/endpoint/linux_doas_conf_file_creation.yml create mode 100644 detections/endpoint/linux_doas_tool_execution.yml create mode 100644 detections/endpoint/linux_possible_access_to_credential_files.yml create mode 100644 detections/endpoint/linux_possible_access_to_sudoers_file.yml create mode 100644 detections/endpoint/linux_sudo_or_su_execution.yml create mode 100644 tests/endpoint/linux_add_user_account.test.yml create mode 100644 tests/endpoint/linux_common_process_for_elevation_control.test.yml create mode 100644 tests/endpoint/linux_doas_conf_file_creation.test.yml create mode 100644 tests/endpoint/linux_doas_tool_execution.test.yml create mode 100644 tests/endpoint/linux_possible_access_to_credential_files.test.yml create mode 100644 tests/endpoint/linux_possible_access_to_sudoers_file.test.yml create mode 100644 tests/endpoint/linux_sudo_or_su_execution.test.yml diff --git a/detections/endpoint/linux_add_user_account.yml b/detections/endpoint/linux_add_user_account.yml new file mode 100644 index 0000000000..ba96c211d8 --- /dev/null +++ b/detections/endpoint/linux_add_user_account.yml @@ -0,0 +1,69 @@ +name: Linux Add User Account +id: 51fbcaf2-6259-11ec-b0f3-acde48001122 +version: 1 +date: '2021-12-21' +author: Teoderick Contreras, Splunk +type: Hunting +datamodel: +- Endpoint +description: This analytic looks for commands to create user accounts on the linux platform. + This technique is commonly abuse by adversaries, malware author and red teamers to persist on the targeted or compromised host by creating new user + with an elevated privilege. This Hunting query may catch normal creation of user by administrator so filter is needed. +search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes where + Processes.process_name IN ("useradd", "adduser") OR Processes.process IN ("*useradd *", "*adduser *") + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_add_user_account_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: administrator or network operator can execute this command. filter is needed +references: +- https://linuxize.com/post/how-to-create-users-in-linux-using-the-useradd-command/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548.003/linux_adduser/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1136.001 + - T1136 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 50 + confidence: 50 + # (impact * confidence)/100 + risk_score: 25 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a commandline $process$ that may create user account on $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_common_process_for_elevation_control.yml b/detections/endpoint/linux_common_process_for_elevation_control.yml new file mode 100644 index 0000000000..1de8c5acab --- /dev/null +++ b/detections/endpoint/linux_common_process_for_elevation_control.yml @@ -0,0 +1,71 @@ +name: Linux Common Process For Elevation Control +id: 66ab15c0-63d0-11ec-9e70-acde48001122 +version: 1 +date: '2021-12-23' +author: Teoderick Contreras, Splunk +type: Hunting +datamodel: +- Endpoint +description: This analytic is to look for possible elevation control access using a common known process in linux platform to change the attribute and file ownership. + This technique is commonly abused by adversaries, malware author and red teamers to gain persistence or privilege escalation on the target or compromised host. + Tis common process is used to modify file attribute, file ownership or SUID. This tools can be used in legitimate purposes so filter is needed. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where + Processes.process_name IN ("chmod", "chown", "fchmod", "fchmodat", "fchown", "fchownat", "fremovexattr", "fsetxattr", "lchown", "lremovexattr", "lsetxattr", "removexattr", "setuid", "setgid", "setreuid", "setregid") + OR Processes.process IN ("*chmod *", "*chown *", "*fchmod *", "*fchmodat *", "*fchown *", "*fchownat *", "*fremovexattr *", "*fsetxattr *", "*lchown *", + "*lremovexattr *", "*lsetxattr *", "*removexattr *", "*setuid *", "*setgid *", "*setreuid *", "*setregid *", “*setcap *”) + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_common_process_for_elevation_control_filter`' +how_to_implement: UPDATE_HOW_TO_IMPLEMENT +known_false_positives: UPDATE_KNOWN_FALSE_POSITIVES +references: +- https://attack.mitre.org/techniques/T1548/001/ +- https://github.com/Neo23x0/auditd/blob/master/audit.rules#L285-L297 +- https://github.com/bfuzzy1/auditd-attack/blob/master/auditd-attack/auditd-attack.rules#L269-L270 +- https://github.com/microsoft/MSTIC-Sysmon/blob/main/linux/configs/attack-based/privilege_escalation/T1548.001_ElevationControl_CommonProcesses.xml +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548.001/chmod_uid/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1548.001 + - T1548 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 30 + confidence: 30 + # (impact * confidence)/100 + risk_score: 9 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a commandline $process$ with process $process_name$ on $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_doas_conf_file_creation.yml b/detections/endpoint/linux_doas_conf_file_creation.yml new file mode 100644 index 0000000000..63864e7d81 --- /dev/null +++ b/detections/endpoint/linux_doas_conf_file_creation.yml @@ -0,0 +1,70 @@ +name: Linux Doas Conf File Creation +id: f6343e86-6e09-11ec-9376-acde48001122 +version: 1 +date: '2022-01-05' +author: Teoderick Contreras, Splunk +type: Anomaly +datamodel: +- Endpoint +description: This analytic is to detect the creation of doas.conf file in linux host platform. This configuration file can be use by + doas utility tool to allow or permit standard users to perform tasks as root, the same way sudo does. + This tool is developed as a minimalistic alternative to sudo application. This tool can be abused + advesaries, attacker or malware to gain elevated privileges to the targeted or compromised host. On the other hand this can also be executed by + administrator for a certain task that needs admin rights. In this case filter is needed. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem + where Filesystem.file_path IN ("*/etc/doas.conf") + by Filesystem.dest Filesystem.file_create_time Filesystem.file_name Filesystem.process_guid Filesystem.file_path + | `drop_dm_object_name(Filesystem)` + | `security_content_ctime(lastTime)` + | `security_content_ctime(firstTime)` + | `linux_doas_conf_file_creation_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: administrator or network operator can execute this command. filter is needed +references: +- https://wiki.gentoo.org/wiki/Doas +- https://www.makeuseof.com/how-to-install-and-use-doas/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548.003/doas/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1548.003 + - T1548 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Filesystem.dest + - Filesystem.file_create_time + - Filesystem.file_name + - Filesystem.process_guid + - Filesystem.file_path + security_domain: endpoint + impact: 70 + confidence: 70 + # (impact * confidence)/100 + risk_score: 49 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a file $file_name$ is created in $file_path$ on $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_doas_tool_execution.yml b/detections/endpoint/linux_doas_tool_execution.yml new file mode 100644 index 0000000000..24ce248c77 --- /dev/null +++ b/detections/endpoint/linux_doas_tool_execution.yml @@ -0,0 +1,71 @@ +name: Linux Doas Tool Execution +id: d5a62490-6e09-11ec-884e-acde48001122 +version: 1 +date: '2022-01-05' +author: Teoderick Contreras, Splunk +type: Anomaly +datamodel: +- Endpoint +description: This analytic is to detect the doas tool execution in linux host platform. This utility tool allow standard users to perform + tasks as root, the same way sudo does. This tool is developed as a minimalistic alternative to sudo application. This tool can be abused + advesaries, attacker or malware to gain elevated privileges to the targeted or compromised host. On the other hand this can also be executed by + administrator for a certain task that needs admin rights. In this case filter is needed. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes + where Processes.process_name = "doas" + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_doas_tool_execution_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: administrator or network operator can execute this command. filter is needed +references: +- https://wiki.gentoo.org/wiki/Doas +- https://www.makeuseof.com/how-to-install-and-use-doas/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548.003/doas_exec/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1548.003 + - T1548 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 70 + confidence: 70 + # (impact * confidence)/100 + risk_score: 49 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a doas $process_name$ with commandline $process$ was executed on $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_possible_access_to_credential_files.yml b/detections/endpoint/linux_possible_access_to_credential_files.yml new file mode 100644 index 0000000000..f8d604e03d --- /dev/null +++ b/detections/endpoint/linux_possible_access_to_credential_files.yml @@ -0,0 +1,72 @@ +name: Linux Possible Access To Credential Files +id: 16107e0e-71fc-11ec-b862-acde48001122 +version: 1 +date: '2022-01-10' +author: Teoderick Contreras, Splunk +type: Anomaly +datamodel: +- Endpoint +description: This analytic is to detect a possible attempt to dump or access the content of /etc/passwd and /etc/shadow to enable offline credential cracking. + "etc/passwd" store user information within linux OS while "etc/shadow" contain the user passwords hash. Adversaries and threat actors may attempt to access this + to gain persistence and/or privilege escalation. This anomaly detection can be a good indicator of possible credential dumping technique but it might catch + some normal administrator automation scripts or during credential auditing. In this scenario filter is needed. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) + as lastTime from datamodel=Endpoint.Processes where Processes.process_name + IN("cat", "nano*","vim*", "vi*") AND Processes.process IN("*/etc/shadow*", "*/etc/passwd*") + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_possible_access_to_credential_files_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: administrator or network operator can execute this command. filter is needed +references: +- https://askubuntu.com/questions/445361/what-is-difference-between-etc-shadow-and-etc-passwd +- https://attack.mitre.org/techniques/T1003/008/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1003.008/copy_file_stdoutpipe/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1003.008 + - T1003 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 50 + confidence: 50 + # (impact * confidence)/100 + risk_score: 25 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a commandline $process$ executed on $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_possible_access_to_sudoers_file.yml b/detections/endpoint/linux_possible_access_to_sudoers_file.yml new file mode 100644 index 0000000000..bbddbf2c23 --- /dev/null +++ b/detections/endpoint/linux_possible_access_to_sudoers_file.yml @@ -0,0 +1,71 @@ +name: Linux Possible Access To Sudoers File +id: 4479539c-71fc-11ec-b2e2-acde48001122 +version: 1 +date: '2022-01-10' +author: Teoderick Contreras, Splunk +type: Anomaly +datamodel: +- Endpoint +description: This analytic is to detect a possible access or modification of /etc/sudoers file. + "/etc/sudoers" file controls who can run what command as what users on what machine and can also control whether a specific user need a password for + particular commands. adversaries and threat actors abuse this file to gain persistence and/or privilege escalation during attack on targeted host. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) + as lastTime from datamodel=Endpoint.Processes where Processes.process_name + IN("cat", "nano*","vim*", "vi*") AND Processes.process IN("*/etc/sudoers*") + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_possible_access_to_sudoers_file_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. +known_false_positives: administrator or network operator can execute this command. filter is needed +references: +- https://attack.mitre.org/techniques/T1548/003/ +- https://web.archive.org/web/20210708035426/https://www.cobaltstrike.com/downloads/csmanual43.pdf +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1003.008/copy_file_stdoutpipe/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1548.003 + - T1548 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 50 + confidence: 50 + # (impact * confidence)/100 + risk_score: 25 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a commandline $process$ executed on $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/detections/endpoint/linux_sudo_or_su_execution.yml b/detections/endpoint/linux_sudo_or_su_execution.yml new file mode 100644 index 0000000000..af92028cf3 --- /dev/null +++ b/detections/endpoint/linux_sudo_or_su_execution.yml @@ -0,0 +1,70 @@ +name: Linux Sudo OR Su Execution +id: 4b00f134-6d6a-11ec-a90c-acde48001122 +version: 1 +date: '2022-01-04' +author: Teoderick Contreras, Splunk +type: Hunting +datamodel: +- Endpoint +description: This analytic is to detect the execution of sudo or su command in linux operating system. + The "sudo" command allows a system administrator to delegate authority to give certain users (or groups of users) the ability to run + some (or all) commands as root or another user while providing an audit trail of the commands and their arguments. + This command is commonly abused by adversaries, malware author and red teamers to elevate privileges to the targeted host. This command + can be executed by administrator for legitimate purposes or to execute process that need admin privileges, In this scenario filter is needed. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes + where Processes.process_name IN ("sudo", "su") OR Processes.parent_process_name IN ("sudo", "su") + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid + | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` + | `linux_sudo_or_su_execution_filter`' +how_to_implement: To successfully implement this search you need to be ingesting information + on process that include the name of the process responsible for the changes from + your endpoints into the `Endpoint` datamodel in the `Processes` node. +known_false_positives: administrator or network operator can execute this command. filter is needed +references: +- https://attack.mitre.org/techniques/T1548/003/ +tags: + analytic_story: + - Linux Privilege Escalation + - Linux Persistence Techniques + dataset: + - https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548.003/sudo_su/sysmon_linux.log + kill_chain_phases: + - Privilege Escalation + mitre_attack_id: + - T1548.003 + - T1548 + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id + - Processes.parent_process_id + security_domain: endpoint + impact: 30 + confidence: 30 + # (impact * confidence)/100 + risk_score: 9 + context: + - source:endpoint + - stage:Privilege Escalation Persistence + message: a commandline $process$ that execute sudo or su in $dest$ + observable: + - name: dest + type: Hostname + role: + - Victim + nist: + - DE.CM + cis20: + - CIS 3 + - CIS 5 + - CIS 16 \ No newline at end of file diff --git a/tests/endpoint/linux_add_user_account.test.yml b/tests/endpoint/linux_add_user_account.test.yml new file mode 100644 index 0000000000..90a79d5973 --- /dev/null +++ b/tests/endpoint/linux_add_user_account.test.yml @@ -0,0 +1,12 @@ +name: Linux Add User Account Unit Test +tests: +- name: Linux Add User Account + file: endpoint/linux_add_user_account.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548.003/linux_adduser/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_common_process_for_elevation_control.test.yml b/tests/endpoint/linux_common_process_for_elevation_control.test.yml new file mode 100644 index 0000000000..60f8445ae2 --- /dev/null +++ b/tests/endpoint/linux_common_process_for_elevation_control.test.yml @@ -0,0 +1,12 @@ +name: Linux Common Process For Elevation Control Unit Test +tests: +- name: Linux Common Process For Elevation Control + file: endpoint/linux_common_process_for_elevation_control.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548.001/chmod_uid/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_doas_conf_file_creation.test.yml b/tests/endpoint/linux_doas_conf_file_creation.test.yml new file mode 100644 index 0000000000..001f805563 --- /dev/null +++ b/tests/endpoint/linux_doas_conf_file_creation.test.yml @@ -0,0 +1,12 @@ +name: Linux Doas Conf File Creation Unit Test +tests: +- name: Linux Doas Conf File Creation + file: endpoint/linux_doas_conf_file_creation.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548.003/doas/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_doas_tool_execution.test.yml b/tests/endpoint/linux_doas_tool_execution.test.yml new file mode 100644 index 0000000000..de4ddb2671 --- /dev/null +++ b/tests/endpoint/linux_doas_tool_execution.test.yml @@ -0,0 +1,12 @@ +name: Linux Doas Tool Execution Unit Test +tests: +- name: Linux Doas Tool Execution + file: endpoint/linux_doas_tool_execution.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548.003/doas_exec/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_possible_access_to_credential_files.test.yml b/tests/endpoint/linux_possible_access_to_credential_files.test.yml new file mode 100644 index 0000000000..054315ab72 --- /dev/null +++ b/tests/endpoint/linux_possible_access_to_credential_files.test.yml @@ -0,0 +1,12 @@ +name: Linux Possible Access To Credential Files Unit Test +tests: +- name: Linux Possible Access To Credential Files + file: endpoint/linux_possible_access_to_credential_files.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1003.008/copy_file_stdoutpipe/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_possible_access_to_sudoers_file.test.yml b/tests/endpoint/linux_possible_access_to_sudoers_file.test.yml new file mode 100644 index 0000000000..d5f90456ff --- /dev/null +++ b/tests/endpoint/linux_possible_access_to_sudoers_file.test.yml @@ -0,0 +1,12 @@ +name: Linux Possible Access To Sudoers File Unit Test +tests: +- name: Linux Possible Access To Sudoers File + file: endpoint/linux_possible_access_to_sudoers_file.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1003.008/copy_file_stdoutpipe/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file diff --git a/tests/endpoint/linux_sudo_or_su_execution.test.yml b/tests/endpoint/linux_sudo_or_su_execution.test.yml new file mode 100644 index 0000000000..7d50de70b4 --- /dev/null +++ b/tests/endpoint/linux_sudo_or_su_execution.test.yml @@ -0,0 +1,12 @@ +name: Linux Sudo OR Su Execution Unit Test +tests: +- name: Linux Sudo OR Su Execution + file: endpoint/linux_sudo_or_su_execution.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: sysmon_linux.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1548.003/sudo_su/sysmon_linux.log + source: Syslog:Linux-Sysmon/Operational + sourcetype: sysmon_linux \ No newline at end of file From 745e9181764dc6cc5ed0a9ceec78ce02d7c38811 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 10 Jan 2022 23:51:42 +0000 Subject: [PATCH 172/203] Added detection testing service results inLinux Add User Account --- .../endpoint/linux_add_user_account.yml | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/detections/endpoint/linux_add_user_account.yml b/detections/endpoint/linux_add_user_account.yml index ba96c211d8..bf2bbe6227 100644 --- a/detections/endpoint/linux_add_user_account.yml +++ b/detections/endpoint/linux_add_user_account.yml @@ -6,23 +6,25 @@ author: Teoderick Contreras, Splunk type: Hunting datamodel: - Endpoint -description: This analytic looks for commands to create user accounts on the linux platform. - This technique is commonly abuse by adversaries, malware author and red teamers to persist on the targeted or compromised host by creating new user - with an elevated privilege. This Hunting query may catch normal creation of user by administrator so filter is needed. -search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes where - Processes.process_name IN ("useradd", "adduser") OR Processes.process IN ("*useradd *", "*adduser *") - by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid - | `drop_dm_object_name(Processes)` - | `security_content_ctime(firstTime)` - | `security_content_ctime(lastTime)` - | `linux_add_user_account_filter`' +description: This analytic looks for commands to create user accounts on the linux + platform. This technique is commonly abuse by adversaries, malware author and red + teamers to persist on the targeted or compromised host by creating new user with + an elevated privilege. This Hunting query may catch normal creation of user by administrator + so filter is needed. +search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint.Processes + where Processes.process_name IN ("useradd", "adduser") OR Processes.process IN ("*useradd + *", "*adduser *") by Processes.dest Processes.user Processes.parent_process_name + Processes.process_name Processes.process Processes.process_id Processes.parent_process_id + Processes.process_guid | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` | `linux_add_user_account_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can execute this command. filter is needed + Sysmon TA. +known_false_positives: administrator or network operator can execute this command. + filter is needed references: -- https://linuxize.com/post/how-to-create-users-in-linux-using-the-useradd-command/ +- https://linuxize.com/post/how-to-create-users-in-linux-using-the-useradd-command/ tags: analytic_story: - Linux Privilege Escalation @@ -40,18 +42,17 @@ tags: - Splunk Cloud required_fields: - _time - - Processes.dest - - Processes.user - - Processes.parent_process_name - - Processes.process_name - - Processes.process - - Processes.process_id + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id - Processes.parent_process_id security_domain: endpoint impact: 50 - confidence: 50 - # (impact * confidence)/100 - risk_score: 25 + confidence: 50 + risk_score: 25 context: - source:endpoint - stage:Privilege Escalation Persistence @@ -66,4 +67,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From eeff9d94b27a8a4c1fd991ebe14f9f9333193959 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 11 Jan 2022 00:11:47 +0000 Subject: [PATCH 173/203] Added detection testing service results inLinux Doas Conf File Creation --- .../linux_doas_conf_file_creation.yml | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/detections/endpoint/linux_doas_conf_file_creation.yml b/detections/endpoint/linux_doas_conf_file_creation.yml index 63864e7d81..7ab383a703 100644 --- a/detections/endpoint/linux_doas_conf_file_creation.yml +++ b/detections/endpoint/linux_doas_conf_file_creation.yml @@ -6,23 +6,24 @@ author: Teoderick Contreras, Splunk type: Anomaly datamodel: - Endpoint -description: This analytic is to detect the creation of doas.conf file in linux host platform. This configuration file can be use by - doas utility tool to allow or permit standard users to perform tasks as root, the same way sudo does. - This tool is developed as a minimalistic alternative to sudo application. This tool can be abused - advesaries, attacker or malware to gain elevated privileges to the targeted or compromised host. On the other hand this can also be executed by - administrator for a certain task that needs admin rights. In this case filter is needed. -search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Filesystem - where Filesystem.file_path IN ("*/etc/doas.conf") - by Filesystem.dest Filesystem.file_create_time Filesystem.file_name Filesystem.process_guid Filesystem.file_path - | `drop_dm_object_name(Filesystem)` - | `security_content_ctime(lastTime)` - | `security_content_ctime(firstTime)` - | `linux_doas_conf_file_creation_filter`' +description: This analytic is to detect the creation of doas.conf file in linux host + platform. This configuration file can be use by doas utility tool to allow or permit + standard users to perform tasks as root, the same way sudo does. This tool is developed + as a minimalistic alternative to sudo application. This tool can be abused advesaries, + attacker or malware to gain elevated privileges to the targeted or compromised host. + On the other hand this can also be executed by administrator for a certain task + that needs admin rights. In this case filter is needed. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) + as lastTime FROM datamodel=Endpoint.Filesystem where Filesystem.file_path IN ("*/etc/doas.conf") + by Filesystem.dest Filesystem.file_create_time Filesystem.file_name Filesystem.process_guid + Filesystem.file_path | `drop_dm_object_name(Filesystem)` | `security_content_ctime(lastTime)` + | `security_content_ctime(firstTime)` | `linux_doas_conf_file_creation_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can execute this command. filter is needed + Sysmon TA. +known_false_positives: administrator or network operator can execute this command. + filter is needed references: - https://wiki.gentoo.org/wiki/Doas - https://www.makeuseof.com/how-to-install-and-use-doas/ @@ -43,15 +44,14 @@ tags: - Splunk Cloud required_fields: - _time - - Filesystem.dest - - Filesystem.file_create_time - - Filesystem.file_name - - Filesystem.process_guid + - Filesystem.dest + - Filesystem.file_create_time + - Filesystem.file_name + - Filesystem.process_guid - Filesystem.file_path security_domain: endpoint impact: 70 - confidence: 70 - # (impact * confidence)/100 + confidence: 70 risk_score: 49 context: - source:endpoint @@ -67,4 +67,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From fbc5e53407b4b738df28021d33c5dc534008aead Mon Sep 17 00:00:00 2001 From: root Date: Tue, 11 Jan 2022 00:12:45 +0000 Subject: [PATCH 174/203] Added detection testing service results inLinux Doas Tool Execution --- .../endpoint/linux_doas_tool_execution.yml | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/detections/endpoint/linux_doas_tool_execution.yml b/detections/endpoint/linux_doas_tool_execution.yml index 24ce248c77..477c3d0a43 100644 --- a/detections/endpoint/linux_doas_tool_execution.yml +++ b/detections/endpoint/linux_doas_tool_execution.yml @@ -6,22 +6,25 @@ author: Teoderick Contreras, Splunk type: Anomaly datamodel: - Endpoint -description: This analytic is to detect the doas tool execution in linux host platform. This utility tool allow standard users to perform - tasks as root, the same way sudo does. This tool is developed as a minimalistic alternative to sudo application. This tool can be abused - advesaries, attacker or malware to gain elevated privileges to the targeted or compromised host. On the other hand this can also be executed by - administrator for a certain task that needs admin rights. In this case filter is needed. -search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes - where Processes.process_name = "doas" - by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid - | `drop_dm_object_name(Processes)` - | `security_content_ctime(firstTime)` - | `security_content_ctime(lastTime)` +description: This analytic is to detect the doas tool execution in linux host platform. + This utility tool allow standard users to perform tasks as root, the same way sudo + does. This tool is developed as a minimalistic alternative to sudo application. + This tool can be abused advesaries, attacker or malware to gain elevated privileges + to the targeted or compromised host. On the other hand this can also be executed + by administrator for a certain task that needs admin rights. In this case filter + is needed. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) + as lastTime from datamodel=Endpoint.Processes where Processes.process_name = "doas" + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name + Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid + | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_doas_tool_execution_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can execute this command. filter is needed + Sysmon TA. +known_false_positives: administrator or network operator can execute this command. + filter is needed references: - https://wiki.gentoo.org/wiki/Doas - https://www.makeuseof.com/how-to-install-and-use-doas/ @@ -42,17 +45,16 @@ tags: - Splunk Cloud required_fields: - _time - - Processes.dest - - Processes.user - - Processes.parent_process_name - - Processes.process_name - - Processes.process - - Processes.process_id + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id - Processes.parent_process_id security_domain: endpoint impact: 70 - confidence: 70 - # (impact * confidence)/100 + confidence: 70 risk_score: 49 context: - source:endpoint @@ -68,4 +70,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From ba46f791bb00af36be9bd604adeb8976c0e8b22d Mon Sep 17 00:00:00 2001 From: root Date: Tue, 11 Jan 2022 00:51:50 +0000 Subject: [PATCH 175/203] Added detection testing service results inLinux Possible Access To Credential Files --- ...ux_possible_access_to_credential_files.yml | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/detections/endpoint/linux_possible_access_to_credential_files.yml b/detections/endpoint/linux_possible_access_to_credential_files.yml index f8d604e03d..a9e726c7b4 100644 --- a/detections/endpoint/linux_possible_access_to_credential_files.yml +++ b/detections/endpoint/linux_possible_access_to_credential_files.yml @@ -6,25 +6,27 @@ author: Teoderick Contreras, Splunk type: Anomaly datamodel: - Endpoint -description: This analytic is to detect a possible attempt to dump or access the content of /etc/passwd and /etc/shadow to enable offline credential cracking. - "etc/passwd" store user information within linux OS while "etc/shadow" contain the user passwords hash. Adversaries and threat actors may attempt to access this - to gain persistence and/or privilege escalation. This anomaly detection can be a good indicator of possible credential dumping technique but it might catch - some normal administrator automation scripts or during credential auditing. In this scenario filter is needed. +description: This analytic is to detect a possible attempt to dump or access the content + of /etc/passwd and /etc/shadow to enable offline credential cracking. "etc/passwd" + store user information within linux OS while "etc/shadow" contain the user passwords + hash. Adversaries and threat actors may attempt to access this to gain persistence + and/or privilege escalation. This anomaly detection can be a good indicator of possible + credential dumping technique but it might catch some normal administrator automation + scripts or during credential auditing. In this scenario filter is needed. search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) - as lastTime from datamodel=Endpoint.Processes where Processes.process_name - IN("cat", "nano*","vim*", "vi*") AND Processes.process IN("*/etc/shadow*", "*/etc/passwd*") - by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id - | `drop_dm_object_name(Processes)` - | `security_content_ctime(firstTime)` - | `security_content_ctime(lastTime)` - | `linux_possible_access_to_credential_files_filter`' + as lastTime from datamodel=Endpoint.Processes where Processes.process_name IN("cat", + "nano*","vim*", "vi*") AND Processes.process IN("*/etc/shadow*", "*/etc/passwd*") + by Processes.dest Processes.user Processes.parent_process_name Processes.process_name + Processes.process Processes.process_id Processes.parent_process_id | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_possible_access_to_credential_files_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can execute this command. filter is needed + Sysmon TA. +known_false_positives: administrator or network operator can execute this command. + filter is needed references: -- https://askubuntu.com/questions/445361/what-is-difference-between-etc-shadow-and-etc-passwd +- https://askubuntu.com/questions/445361/what-is-difference-between-etc-shadow-and-etc-passwd - https://attack.mitre.org/techniques/T1003/008/ tags: analytic_story: @@ -43,18 +45,17 @@ tags: - Splunk Cloud required_fields: - _time - - Processes.dest - - Processes.user - - Processes.parent_process_name - - Processes.process_name - - Processes.process - - Processes.process_id + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id - Processes.parent_process_id security_domain: endpoint impact: 50 - confidence: 50 - # (impact * confidence)/100 - risk_score: 25 + confidence: 50 + risk_score: 25 context: - source:endpoint - stage:Privilege Escalation Persistence @@ -69,4 +70,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From d7d8acaced29df66c853d437d888540c4f1ec9dd Mon Sep 17 00:00:00 2001 From: root Date: Tue, 11 Jan 2022 00:54:51 +0000 Subject: [PATCH 176/203] Added detection testing service results inLinux Sudo OR Su Execution --- .../endpoint/linux_sudo_or_su_execution.yml | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/detections/endpoint/linux_sudo_or_su_execution.yml b/detections/endpoint/linux_sudo_or_su_execution.yml index af92028cf3..40371377da 100644 --- a/detections/endpoint/linux_sudo_or_su_execution.yml +++ b/detections/endpoint/linux_sudo_or_su_execution.yml @@ -6,24 +6,27 @@ author: Teoderick Contreras, Splunk type: Hunting datamodel: - Endpoint -description: This analytic is to detect the execution of sudo or su command in linux operating system. - The "sudo" command allows a system administrator to delegate authority to give certain users (or groups of users) the ability to run - some (or all) commands as root or another user while providing an audit trail of the commands and their arguments. - This command is commonly abused by adversaries, malware author and red teamers to elevate privileges to the targeted host. This command - can be executed by administrator for legitimate purposes or to execute process that need admin privileges, In this scenario filter is needed. -search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes - where Processes.process_name IN ("sudo", "su") OR Processes.parent_process_name IN ("sudo", "su") - by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid - | `drop_dm_object_name(Processes)` - | `security_content_ctime(firstTime)` - | `security_content_ctime(lastTime)` - | `linux_sudo_or_su_execution_filter`' +description: This analytic is to detect the execution of sudo or su command in linux + operating system. The "sudo" command allows a system administrator to delegate authority + to give certain users (or groups of users) the ability to run some (or all) commands + as root or another user while providing an audit trail of the commands and their + arguments. This command is commonly abused by adversaries, malware author and red + teamers to elevate privileges to the targeted host. This command can be executed + by administrator for legitimate purposes or to execute process that need admin privileges, + In this scenario filter is needed. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) + as lastTime from datamodel=Endpoint.Processes where Processes.process_name IN ("sudo", + "su") OR Processes.parent_process_name IN ("sudo", "su") by Processes.dest Processes.user + Processes.parent_process_name Processes.process_name Processes.process Processes.process_id + Processes.parent_process_id Processes.process_guid | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_sudo_or_su_execution_filter`' how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from your endpoints into the `Endpoint` datamodel in the `Processes` node. -known_false_positives: administrator or network operator can execute this command. filter is needed +known_false_positives: administrator or network operator can execute this command. + filter is needed references: -- https://attack.mitre.org/techniques/T1548/003/ +- https://attack.mitre.org/techniques/T1548/003/ tags: analytic_story: - Linux Privilege Escalation @@ -41,17 +44,16 @@ tags: - Splunk Cloud required_fields: - _time - - Processes.dest - - Processes.user - - Processes.parent_process_name - - Processes.process_name - - Processes.process - - Processes.process_id + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id - Processes.parent_process_id security_domain: endpoint impact: 30 - confidence: 30 - # (impact * confidence)/100 + confidence: 30 risk_score: 9 context: - source:endpoint @@ -67,4 +69,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From b44fe4b8d85f31a5aefe2c8f0cd2f8b8660388bb Mon Sep 17 00:00:00 2001 From: patel-bhavin Date: Mon, 10 Jan 2022 16:59:08 -0800 Subject: [PATCH 177/203] text and yml updates --- ...linux_add_files_in_known_crontab_directories.yml | 11 ++++++----- .../linux_at_allow_config_file_creation.yml | 13 +++++++------ .../endpoint/linux_at_application_execution.yml | 12 ++++++------ .../endpoint/linux_edit_cron_table_parameter.yml | 12 ++++++------ ...sible_append_command_to_at_allow_config_file.yml | 12 ++++++------ ...ppend_cronjob_entry_on_existing_cronjob_file.yml | 12 ++++++------ ...ux_possible_cronjob_modification_with_editor.yml | 12 ++++++------ 7 files changed, 43 insertions(+), 41 deletions(-) diff --git a/detections/endpoint/linux_add_files_in_known_crontab_directories.yml b/detections/endpoint/linux_add_files_in_known_crontab_directories.yml index 0eb2178788..406df926d4 100644 --- a/detections/endpoint/linux_add_files_in_known_crontab_directories.yml +++ b/detections/endpoint/linux_add_files_in_known_crontab_directories.yml @@ -20,9 +20,9 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `linux_add_files_in_known_crontab_directories_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the file name, file path, and process_guid executions from your endpoints. - If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA. -known_false_positives: administrator or network operator can create file in crontab - folders for automation purposes. filter is needed + If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: Administrator or network operator can create file in crontab + folders for automation purposes. Please update the filter macros to remove false positives. references: - https://www.sandflysecurity.com/blog/detecting-cronrat-malware-on-linux-instantly/ - https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/ @@ -53,8 +53,9 @@ tags: confidence: 50 risk_score: 25 context: - - source:endpoint - - stage:Privilege Escalation Persistence + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence message: a file $file_name$ is created in $file_path$ on $dest$ observable: - name: dest diff --git a/detections/endpoint/linux_at_allow_config_file_creation.yml b/detections/endpoint/linux_at_allow_config_file_creation.yml index 59f5500f96..bed66afb4c 100644 --- a/detections/endpoint/linux_at_allow_config_file_creation.yml +++ b/detections/endpoint/linux_at_allow_config_file_creation.yml @@ -21,9 +21,9 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `linux_at_allow_config_file_creation_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the file name, file path, and process_guid executions from your endpoints. - If you are using Sysmon, you must have at least version 6.0.4 of the Sysmon TA. -known_false_positives: administrator or network operator can create this file for - automation purposes. filter is needed + If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: Administrator or network operator can create this file for + automation purposes. Please update the filter macros to remove false positives. references: - https://linuxize.com/post/at-command-in-linux/ tags: @@ -53,9 +53,10 @@ tags: confidence: 50 risk_score: 25 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a file $file_name$ is created in $file_path$ on $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A file $file_name$ is created in $file_path$ on $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_at_application_execution.yml b/detections/endpoint/linux_at_application_execution.yml index 7aa146299e..9f5560bcf5 100644 --- a/detections/endpoint/linux_at_application_execution.yml +++ b/detections/endpoint/linux_at_application_execution.yml @@ -19,10 +19,9 @@ search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_at_application_execution_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. known_false_positives: Administrator or network operator can use this application - for automation purposes. filter is needed + for automation purposes. Please update the filter macros to remove false positives. references: - https://attack.mitre.org/techniques/T1053/001/ - https://www.linkedin.com/pulse/getting-attacker-ip-address-from-malicious-linux-job-craig-rowland/ @@ -55,9 +54,10 @@ tags: confidence: 30 risk_score: 9 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: at application was executed in $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: At application was executed in $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_edit_cron_table_parameter.yml b/detections/endpoint/linux_edit_cron_table_parameter.yml index a2e4695ee0..65a0b12b9a 100644 --- a/detections/endpoint/linux_edit_cron_table_parameter.yml +++ b/detections/endpoint/linux_edit_cron_table_parameter.yml @@ -19,10 +19,9 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime | `security_content_ctime(lastTime)` | `linux_edit_cron_table_parameter_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. known_false_positives: Administrator or network operator can use this application - for automation purposes. filter is needed + for automation purposes. Please update the filter macros to remove false positives. references: - https://attack.mitre.org/techniques/T1053/003/ tags: @@ -54,9 +53,10 @@ tags: confidence: 30 risk_score: 9 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a possible crontab edit command $process$ executed on $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A possible crontab edit command $process$ executed on $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml b/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml index 3b674b0369..0afcfd2950 100644 --- a/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml +++ b/detections/endpoint/linux_possible_append_command_to_at_allow_config_file.yml @@ -20,9 +20,8 @@ search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint | `linux_possible_append_command_to_at_allow_config_file_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: Administrator or network operator can use this commandline for automation purposes. filter is needed + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: Administrator or network operator can use this commandline for automation purposes. Please update the filter macros to remove false positives. references: - https://linuxize.com/post/at-command-in-linux/ - https://attack.mitre.org/techniques/T1053/001/ @@ -56,9 +55,10 @@ tags: # (impact * confidence)/100 risk_score: 9 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a commandline $process$ that may modify at allow config file in $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A commandline $process$ that may modify at allow config file in $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml b/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml index a368528567..d13faae1b5 100644 --- a/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml +++ b/detections/endpoint/linux_possible_append_cronjob_entry_on_existing_cronjob_file.yml @@ -18,9 +18,8 @@ search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint | `linux_possible_append_cronjob_entry_on_existing_cronjob_file_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: Administrator or network operator can use this commandline for automation purposes. filter is needed + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: Administrator or network operator can use this commandline for automation purposes. Please update the filter macros to remove false positives. references: - https://attack.mitre.org/techniques/T1053/003/ - https://blog.aquasec.com/threat-alert-kinsing-malware-container-vulnerability @@ -55,9 +54,10 @@ tags: # (impact * confidence)/100 risk_score: 49 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a commandline $process$ that may modify cronjob file in $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A commandline $process$ that may modify cronjob file in $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml b/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml index 6fb5f3563c..dc9603aca2 100644 --- a/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml +++ b/detections/endpoint/linux_possible_cronjob_modification_with_editor.yml @@ -19,10 +19,9 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime | `linux_possible_cronjob_modification_with_editor_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. known_false_positives: Administrator or network operator can use this commandline - for automation purposes. filter is needed + for automation purposes. Please update the filter macros to remove false positives. references: - https://attack.mitre.org/techniques/T1053/003/ tags: @@ -54,9 +53,10 @@ tags: confidence: 30 risk_score: 6 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a commandline $process$ that may modify cronjob file using editor in $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A commandline $process$ that may modify cronjob file using editor in $dest$ observable: - name: dest type: Hostname From d4259f39ef5c3298b434acc5e8516002c9f7bd2b Mon Sep 17 00:00:00 2001 From: root Date: Tue, 11 Jan 2022 09:12:52 +0000 Subject: [PATCH 178/203] Added detection testing service results inLinux Possible Access To Sudoers File --- .../linux_possible_access_to_sudoers_file.yml | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/detections/endpoint/linux_possible_access_to_sudoers_file.yml b/detections/endpoint/linux_possible_access_to_sudoers_file.yml index bbddbf2c23..dfbfc24933 100644 --- a/detections/endpoint/linux_possible_access_to_sudoers_file.yml +++ b/detections/endpoint/linux_possible_access_to_sudoers_file.yml @@ -6,22 +6,23 @@ author: Teoderick Contreras, Splunk type: Anomaly datamodel: - Endpoint -description: This analytic is to detect a possible access or modification of /etc/sudoers file. - "/etc/sudoers" file controls who can run what command as what users on what machine and can also control whether a specific user need a password for - particular commands. adversaries and threat actors abuse this file to gain persistence and/or privilege escalation during attack on targeted host. +description: This analytic is to detect a possible access or modification of /etc/sudoers + file. "/etc/sudoers" file controls who can run what command as what users on what + machine and can also control whether a specific user need a password for particular + commands. adversaries and threat actors abuse this file to gain persistence and/or + privilege escalation during attack on targeted host. search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) - as lastTime from datamodel=Endpoint.Processes where Processes.process_name - IN("cat", "nano*","vim*", "vi*") AND Processes.process IN("*/etc/sudoers*") - by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id - | `drop_dm_object_name(Processes)` - | `security_content_ctime(firstTime)` - | `security_content_ctime(lastTime)` - | `linux_possible_access_to_sudoers_file_filter`' + as lastTime from datamodel=Endpoint.Processes where Processes.process_name IN("cat", + "nano*","vim*", "vi*") AND Processes.process IN("*/etc/sudoers*") by Processes.dest + Processes.user Processes.parent_process_name Processes.process_name Processes.process + Processes.process_id Processes.parent_process_id | `drop_dm_object_name(Processes)` + | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_possible_access_to_sudoers_file_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can execute this command. filter is needed + Sysmon TA. +known_false_positives: administrator or network operator can execute this command. + filter is needed references: - https://attack.mitre.org/techniques/T1548/003/ - https://web.archive.org/web/20210708035426/https://www.cobaltstrike.com/downloads/csmanual43.pdf @@ -42,18 +43,17 @@ tags: - Splunk Cloud required_fields: - _time - - Processes.dest - - Processes.user - - Processes.parent_process_name - - Processes.process_name - - Processes.process - - Processes.process_id + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id - Processes.parent_process_id security_domain: endpoint impact: 50 - confidence: 50 - # (impact * confidence)/100 - risk_score: 25 + confidence: 50 + risk_score: 25 context: - source:endpoint - stage:Privilege Escalation Persistence @@ -68,4 +68,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From ec7e006abb2546f4818cc8939451fb106afc76e3 Mon Sep 17 00:00:00 2001 From: tccontre Date: Tue, 11 Jan 2022 11:09:41 +0100 Subject: [PATCH 179/203] linux_persist_priv_batch_4 --- .../endpoint/linux_common_process_for_elevation_control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detections/endpoint/linux_common_process_for_elevation_control.yml b/detections/endpoint/linux_common_process_for_elevation_control.yml index 1de8c5acab..e345bb9afb 100644 --- a/detections/endpoint/linux_common_process_for_elevation_control.yml +++ b/detections/endpoint/linux_common_process_for_elevation_control.yml @@ -12,7 +12,7 @@ description: This analytic is to look for possible elevation control access usin search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process_name IN ("chmod", "chown", "fchmod", "fchmodat", "fchown", "fchownat", "fremovexattr", "fsetxattr", "lchown", "lremovexattr", "lsetxattr", "removexattr", "setuid", "setgid", "setreuid", "setregid") OR Processes.process IN ("*chmod *", "*chown *", "*fchmod *", "*fchmodat *", "*fchown *", "*fchownat *", "*fremovexattr *", "*fsetxattr *", "*lchown *", - "*lremovexattr *", "*lsetxattr *", "*removexattr *", "*setuid *", "*setgid *", "*setreuid *", "*setregid *", “*setcap *”) + "*lremovexattr *", "*lsetxattr *", "*removexattr *", "*setuid *", "*setgid *", "*setreuid *", "*setregid *", "*setcap *") by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` From 60edc89fdcdab75d674db51e1278bca6c552cecf Mon Sep 17 00:00:00 2001 From: root Date: Tue, 11 Jan 2022 10:30:16 +0000 Subject: [PATCH 180/203] Added detection testing service results inLinux Common Process For Elevation Control --- ...x_common_process_for_elevation_control.yml | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/detections/endpoint/linux_common_process_for_elevation_control.yml b/detections/endpoint/linux_common_process_for_elevation_control.yml index e345bb9afb..ffccfef597 100644 --- a/detections/endpoint/linux_common_process_for_elevation_control.yml +++ b/detections/endpoint/linux_common_process_for_elevation_control.yml @@ -6,18 +6,23 @@ author: Teoderick Contreras, Splunk type: Hunting datamodel: - Endpoint -description: This analytic is to look for possible elevation control access using a common known process in linux platform to change the attribute and file ownership. - This technique is commonly abused by adversaries, malware author and red teamers to gain persistence or privilege escalation on the target or compromised host. - Tis common process is used to modify file attribute, file ownership or SUID. This tools can be used in legitimate purposes so filter is needed. -search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where - Processes.process_name IN ("chmod", "chown", "fchmod", "fchmodat", "fchown", "fchownat", "fremovexattr", "fsetxattr", "lchown", "lremovexattr", "lsetxattr", "removexattr", "setuid", "setgid", "setreuid", "setregid") - OR Processes.process IN ("*chmod *", "*chown *", "*fchmod *", "*fchmodat *", "*fchown *", "*fchownat *", "*fremovexattr *", "*fsetxattr *", "*lchown *", - "*lremovexattr *", "*lsetxattr *", "*removexattr *", "*setuid *", "*setgid *", "*setreuid *", "*setregid *", "*setcap *") - by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid - | `drop_dm_object_name(Processes)` - | `security_content_ctime(firstTime)` - | `security_content_ctime(lastTime)` - | `linux_common_process_for_elevation_control_filter`' +description: This analytic is to look for possible elevation control access using + a common known process in linux platform to change the attribute and file ownership. + This technique is commonly abused by adversaries, malware author and red teamers + to gain persistence or privilege escalation on the target or compromised host. Tis + common process is used to modify file attribute, file ownership or SUID. This tools + can be used in legitimate purposes so filter is needed. +search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) + as lastTime from datamodel=Endpoint.Processes where Processes.process_name IN ("chmod", + "chown", "fchmod", "fchmodat", "fchown", "fchownat", "fremovexattr", "fsetxattr", + "lchown", "lremovexattr", "lsetxattr", "removexattr", "setuid", "setgid", "setreuid", + "setregid") OR Processes.process IN ("*chmod *", "*chown *", "*fchmod *", "*fchmodat + *", "*fchown *", "*fchownat *", "*fremovexattr *", "*fsetxattr *", "*lchown *", + "*lremovexattr *", "*lsetxattr *", "*removexattr *", "*setuid *", "*setgid *", "*setreuid + *", "*setregid *", "*setcap *") by Processes.dest Processes.user Processes.parent_process_name + Processes.process_name Processes.process Processes.process_id Processes.parent_process_id + Processes.process_guid | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` + | `security_content_ctime(lastTime)` | `linux_common_process_for_elevation_control_filter`' how_to_implement: UPDATE_HOW_TO_IMPLEMENT known_false_positives: UPDATE_KNOWN_FALSE_POSITIVES references: @@ -42,17 +47,16 @@ tags: - Splunk Cloud required_fields: - _time - - Processes.dest - - Processes.user - - Processes.parent_process_name - - Processes.process_name - - Processes.process - - Processes.process_id + - Processes.dest + - Processes.user + - Processes.parent_process_name + - Processes.process_name + - Processes.process + - Processes.process_id - Processes.parent_process_id security_domain: endpoint impact: 30 - confidence: 30 - # (impact * confidence)/100 + confidence: 30 risk_score: 9 context: - source:endpoint @@ -68,4 +72,5 @@ tags: cis20: - CIS 3 - CIS 5 - - CIS 16 \ No newline at end of file + - CIS 16 + automated_detection_testing: passed From 81df4e0eec017087142882d1e9b66295cfa01add Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 11 Jan 2022 11:59:26 -0800 Subject: [PATCH 181/203] A bunch of changes to support parallel testing and waiting to ensure data has been properly ingested/indexed before running a test. Still double-checking edge cases for this. Also improved some error printouts and status printouts. When a test completes, it now includes its runtime in its pass/fail/error print. --- .../modules/DataManipulation.py | 12 ++- .../modules/container_manager.py | 1 + .../modules/splunk_container.py | 14 +-- .../modules/splunk_sdk.py | 92 ++++++++++++++++--- .../modules/test_driver.py | 25 ++--- 5 files changed, 112 insertions(+), 32 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py index a9b516611c..08606e595f 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py @@ -40,7 +40,11 @@ class DataManipulation: difference = now - latest_event f.close() - for line in fileinput.input(path, inplace=True): + #Order to make this threadsafe, we need to use fileinput.FileInput. + #We cannot use fileinput.fileinput because + #"The instance will be used as global state for the functions of this module, and is also returned to use during iteration." + #from: https://docs.python.org/2/library/fileinput.html#fileinput.input + for line in fileinput.FileInput(path, inplace=True): d = json.loads(line) original_time = datetime.strptime(d["CreationTime"],"%Y-%m-%dT%H:%M:%S") new_time = (difference + original_time) @@ -113,7 +117,11 @@ class DataManipulation: difference = now - latest_event f.close() - for line in fileinput.input(path, inplace=True): + #Order to make this threadsafe, we need to use fileinput.FileInput. + #We cannot use fileinput.fileinput because + #"The instance will be used as global state for the functions of this module, and is also returned to use during iteration." + #from: https://docs.python.org/2/library/fileinput.html#fileinput.input + for line in fileinput.FileInput(path, inplace=True): try: d = json.loads(line) original_time = datetime.strptime(d["eventTime"],"%Y-%m-%dT%H:%M:%S.%fZ") diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py index 8bd38d9668..6b25b19b7f 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/container_manager.py @@ -106,6 +106,7 @@ class ContainerManager: for container in self.containers: container.thread.join() print(container.get_container_summary()) + print("Waiting for next summary thread printout to finish...") self.summary_thread.join() print("All containers completed testing!") diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py index 72986d27f1..fea6d69bad 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_container.py @@ -238,7 +238,7 @@ class SplunkContainer: except Exception as e: print("Could not remove Docker Container [%s]" % ( self.container_name)) - raise (Exception("CONTAINER REMOVE ERROR")) + raise (Exception(f"CONTAINER REMOVE ERROR: {str(e)}")) def get_container_summary(self) -> str: current_time = timeit.default_timer() @@ -386,7 +386,7 @@ class SplunkContainer: print("Container [%s] successfully stopped early due to failure" % (self.container_name)) return None - + current_test_start_time = timeit.default_timer() # Sleep for a small random time so that containers drift apart and don't synchronize their testing #time.sleep(random.randint(1, 30)) @@ -406,7 +406,9 @@ class SplunkContainer: wait_on_failure=self.interactive_failure, wait_on_completion = self.interactive ) - self.synchronization_object.addResult(result) + + + self.synchronization_object.addResult(result, duration_string = datetime.timedelta(seconds=round(timeit.default_timer() - current_test_start_time))) # Remove the data from the test that we just ran. We MUST do this when running on CI because otherwise, we will download # a massive amount of data over the course of a long path and will run out of space on the relatively small CI runner drive @@ -418,13 +420,13 @@ class SplunkContainer: ) traceback.print_exc() - import pdb - pdb.set_trace() + #import pdb + #pdb.set_trace() # Fill in all the "Empty" fields with default values. Otherwise, we will not be able to # process the result correctly. self.synchronization_object.addError( {"detection_file": detection_to_test, - "detection_error": str(e)} + "detection_error": str(e)}, duration_string = datetime.timedelta(seconds=round(timeit.default_timer() - current_test_start_time)) ) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py index d21f093439..7c9a0a0ea9 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/splunk_sdk.py @@ -1,7 +1,6 @@ from os import error import sys from time import sleep -import splunklib.results as results import splunklib.client as client import splunklib.results as results import requests @@ -59,11 +58,73 @@ def enable_delete_for_admin(splunk_host:str, splunk_port:int, splunk_password:st -def wait_for_indexing_to_complete(splunk_host, splunk_port, splunk_password, sourcetype:str, index:str, check_interval_seconds:int=5): +def get_number_of_indexed_events(splunk_host, splunk_port, splunk_password, index:str, sourcetype:Union[str,None]=None )->int: + + try: + service = client.connect( + host=splunk_host, + port=splunk_port, + username='admin', + password=splunk_password + ) + except Exception as e: + raise(Exception("Unable to connect to Splunk instance: " + str(e))) + + if sourcetype is not None: + search = '''search index="%s" sourcetype="%s" | stats count'''%(index,sourcetype) + else: + search = '''search index="%s" | stats count'''%(index) + kwargs = {"exec_mode":"blocking"} + try: + search_result = service.jobs.create(search, **kwargs) + + #This returns the count in string form, not as an int. For example: + #OrderedDict([('count', '59630')]) + search_results = list(results.ResultsReader(search_result.results())) + if len(search_results) != 1: + raise Exception(f"Expected the get_number_of_indexed_events search to only return 1 count, but got {len(search_results)} instead.") + + count = int(search_results[0]['count']) + return count + + except Exception as e: + raise Exception("Error trying to get the count while waiting for indexing to complete: %s"%(str(e))) + + + + +def wait_for_indexing_to_complete(splunk_host, splunk_port, splunk_password, sourcetype:str, index:str, check_interval_seconds:int=5)->bool: startTime = timeit.default_timer() previous_count = -1 time.sleep(check_interval_seconds) + while True: + new_count = get_number_of_indexed_events(splunk_host, splunk_port, splunk_password, index=index, sourcetype=sourcetype) + #print(f"Previous Count [{previous_count}] New Count [{new_count}]") + if previous_count == -1: + previous_count = new_count + else: + if new_count == previous_count: + stopTime = timeit.default_timer() + return True + else: + previous_count = new_count + + #If new_count is really low, then the server is taking some extra time to index the data. + # So sleep for longer to make sure that we give time to complete (or at least process more + # events so we don't return from this function prematurely) + if new_count < 2: + time.sleep(check_interval_seconds*3) + else: + time.sleep(check_interval_seconds) + + +''' +def wait_for_indexing_to_complete(splunk_host, splunk_port, splunk_password, sourcetype:str, index:str, check_interval_seconds:int=10): + + startTime = timeit.default_timer() + previous_count = -1 + time.sleep(check_interval_seconds/2) while True: #print("waiting for search...") try: @@ -76,7 +137,7 @@ def wait_for_indexing_to_complete(splunk_host, splunk_port, splunk_password, sou except Exception as e: raise(Exception("Unable to connect to Splunk instance: " + str(e))) - search = '''search index="%s" sourcetype="%s" | stats count'''%(index,sourcetype) + search = 'search index="%s" sourcetype="%s" | stats count'%(index,sourcetype) kwargs = {"exec_mode":"blocking"} try: search_result = service.jobs.create(search, **kwargs) @@ -89,7 +150,7 @@ def wait_for_indexing_to_complete(splunk_host, splunk_port, splunk_password, sou try: for result in results.ResultsReader(search_result.results()): count = int(result['count']) - #print("count is %d, previous count is %d"%(count,previous_count)) + print("count is %d, previous count is %d"%(count,previous_count)) if previous_count == -1: if count == 0: pass @@ -108,7 +169,7 @@ def wait_for_indexing_to_complete(splunk_host, splunk_port, splunk_password, sou print("Error trying to get the count while waiting for indexing to complete: %s"%(str(e))) #return False time.sleep(check_interval_seconds) - +''' def test_baseline_search(splunk_host, splunk_port, splunk_password, search, pass_condition, baseline_name, baseline_file, earliest_time, latest_time)->dict: @@ -239,7 +300,7 @@ def test_detection_search(splunk_host:str, splunk_port:int, splunk_password:str, return test_results -def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wait_on_delete:Union[dict,None], search_string:str, detection_filename:str)->bool: +def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wait_on_delete:Union[dict,None], search_string:str, detection_filename:str, index:str="main")->bool: try: service = client.connect( @@ -261,17 +322,22 @@ def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wa _ = input("****************Press ENTER to Complete Test and DELETE data****************\n\n\n") data_exists = True - already_enabled_delete = False - while data_exists: - splunk_search = 'search index=main | delete' - kwargs = {"dispatch.earliest_time": "-1d", + + + while (get_number_of_indexed_events(splunk_host, splunk_port, splunk_password, index=index) != 0) : + splunk_search = f'search index={index} | delete' + + kwargs = { + "exec_mode": "blocking", + "dispatch.earliest_time": "-1d", "dispatch.latest_time": "now"} try: - job = service.jobs.oneshot(splunk_search, **kwargs) + job = service.jobs.create(splunk_search, **kwargs) reader = results.ResultsReader(job) - data_exists = False + + ''' error_in_results = False for result in reader: @@ -296,7 +362,7 @@ def delete_attack_data(splunk_host:str, splunk_password:str, splunk_port:int, wa #Otherwise, we will loop again except Exception as e: - print("Trouble deleting data from a run.... we will try again") + print(f"Trouble deleting data from a run.... we will try again: {str(e)}") time.sleep(5) #raise(Exception("Unable to delete data from a run: " + str(e))) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py index 40909ccba7..a55dc9edb2 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/test_driver.py @@ -105,8 +105,8 @@ class TestDriver: except Exception as e: return None - def addSuccess(self, result:dict)->None: - print("Test PASSED: [%s --> %s]"%(result['detection_name'], result['detection_file'])) + def addSuccess(self, result:dict, duration_string:str)->None: + print("Test PASSED: [%s --> %s] in %s"%(result['detection_name'], result['detection_file'], duration_string)) self.lock.acquire() try: self.successes.append(result) @@ -114,15 +114,15 @@ class TestDriver: self.lock.release() - def addFailure(self, result:dict)->None: - print("Test FAILED: [%s --> %s"%(result['detection_name'], result['detection_file'])) + def addFailure(self, result:dict, duration_string:str)->None: + print("Test FAILED: [%s --> %s] in %s"%(result['detection_name'], result['detection_file'], duration_string)) self.lock.acquire() try: self.failures.append(result) finally: self.lock.release() - def addError(self, result:dict)->None: + def addError(self, result:dict, duration_string:str)->None: #Make sure that even errors have all of the required fields. for required_field in ['search_string', 'diskUsage','runDuration', 'detection_name', 'scanCount', 'detection_error', 'detection_file']: if required_field not in result: @@ -131,7 +131,7 @@ class TestDriver: result['error'] = True if 'success' not in result: result['success'] = False - print("Test ERROR: [%s --> %s"%(result['detection_name'], result['detection_file'])) + print("Test ERROR: [%s --> %s] in %s"%(result['detection_name'], result['detection_file'], duration_string)) self.lock.acquire() try: self.errors.append(result) @@ -258,9 +258,12 @@ class TestDriver: memory_info = psutil.virtual_memory() disk_usage_info = psutil.disk_usage('/') + #macOS is really weird about disk usage.... so to get free space we use TOTAL-FREE = USED instead of just USED + corrected_used_space = disk_usage_info.total - disk_usage_info.free + cpu_info_string = "Total CPU Usage : %d%% (%d CPUs)"%(100 - cpu_info.idle, psutil.cpu_count(logical=False)) memory_info_string = "Total Memory Usage: %0.1fGB USED / %0.1fGB TOTAL"%((memory_info.total - memory_info.available) / bytes_per_GB, memory_info.total / bytes_per_GB) - disk_usage_info_string = "Total Disk Usage : %0.1fGB USED / %0.1fGB TOTAL"%(disk_usage_info.free / bytes_per_GB, disk_usage_info.total / bytes_per_GB) + disk_usage_info_string = "Total Disk Usage : %0.1fGB USED / %0.1fGB TOTAL"%(corrected_used_space / bytes_per_GB, disk_usage_info.total / bytes_per_GB) return "System Information:\n\t%s\n\t%s\n\t%s"%(cpu_info_string, memory_info_string, disk_usage_info_string) @@ -347,15 +350,15 @@ class TestDriver: - def addResult(self, result:dict)->None: + def addResult(self, result:dict, duration_string:str)->None: try: if result['detection_result']['error'] is True: - self.addError(result['detection_result']) + self.addError(result['detection_result'], duration_string = duration_string) elif result['detection_result']['success'] is False: #This is actually a failure of the detection, not an error. Naming is confusiong - self.addFailure(result['detection_result']) + self.addFailure(result['detection_result'], duration_string = duration_string) elif result['detection_result']['success'] is True: - self.addSuccess(result['detection_result']) + self.addSuccess(result['detection_result'], duration_string = duration_string) except Exception as e: #Neither a success or a failure, so add the object to the failures queue print('"There was an error adding the result: [%s]'%(str(e))) From d4b1b48d5d5d3f61e661b89c16bb9378d4528bb3 Mon Sep 17 00:00:00 2001 From: mhaag-spl <5632822+MHaggis@users.noreply.github.com> Date: Tue, 11 Jan 2022 13:14:35 -0700 Subject: [PATCH 182/203] Cred Dump Resolving #1744 . --- .../windows_possible_credential_dumping.yml | 89 +++++++++++++++++++ ...ndows_possible_credential_dumping.test.yml | 12 +++ 2 files changed, 101 insertions(+) create mode 100644 detections/endpoint/windows_possible_credential_dumping.yml create mode 100644 tests/endpoint/windows_possible_credential_dumping.test.yml diff --git a/detections/endpoint/windows_possible_credential_dumping.yml b/detections/endpoint/windows_possible_credential_dumping.yml new file mode 100644 index 0000000000..14d66f23e0 --- /dev/null +++ b/detections/endpoint/windows_possible_credential_dumping.yml @@ -0,0 +1,89 @@ +name: Windows Possible Credential Dumping +id: e4723b92-7266-11ec-af45-acde48001122 +version: 1 +date: '2022-01-10' +author: Michael Haag, Splunk +type: TTP +datamodel: +- Endpoint +description: 'The following analytic is an enhanced version of two previous analytics that identifies common GrantedAccess permission requests and CallTrace DLLs in order to detect credential dumping. \ + + GrantedAccess is the requested permissions by the SourceImage into the TargetImage. \ + + CallTrace Stack trace of where open process is called. Included is the DLL and the relative virtual address of the functions in the call stack right before the open process call. \ + + dbgcore.dll or dbghelp.dll are two core Windows debug DLLs that have minidump functions which provide a way for applications to produce crashdump files that contain a useful subset of the entire process context. \ + + The idea behind using ntdll.dll is to blend in by using native api of ntdll.dll. For example in sekurlsa module there are many ntdll exported api, like RtlCopyMemory, used to execute this module which is related to lsass dumping.' +search: '`sysmon` EventCode=10 TargetImage=*lsass.exe GrantedAccess IN ("0x01000", "0x1010", "0x1038", "0x40", "0x1400", "0x1fffff", "0x1410", "0x1438", "0x143a", "0x1438", "0x1000") CallTrace IN ("*dbgcore.dll*", "*dbghelp.dll*", "*ntdll.dll*") + | stats count min(_time) as firstTime max(_time) as lastTime by Computer, TargetImage, GrantedAccess, SourceImage, SourceProcessId, SourceUser, TargetUser | rename Computer as dest | `security_content_ctime(firstTime)`| + `security_content_ctime(lastTime)` + | `windows_possible_credential_dumping_filter`' +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the + Sysmon TA. Enabling EventCode 10 TargetProcess lsass.exe is required. +known_false_positives: False positives will occur based on GrantedAccess, filter based on source image as needed. +references: + - https://en.wikipedia.org/wiki/Local_Security_Authority_Subsystem_Service + - https://docs.microsoft.com/en-us/windows/win32/api/minidumpapiset/nf-minidumpapiset-minidumpwritedump + - https://cyberwardog.blogspot.com/2017/03/chronicles-of-threat-hunter-hunting-for_22.html + - https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1 + - https://docs.microsoft.com/en-us/windows/win32/procthread/process-security-and-access-rights?redirectedfrom=MSDN +tags: + analytic_story: + - Credential Dumping + - Detect Zerologon Attack + - DarkSide Ransomware + dataset: [] + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + confidence: 80 + context: + - Source:Endpoint + - Stage:Credential Access + impact: 80 + kill_chain_phases: + - Actions on Objectives + message: A process, $Image$, has loaded $ImageLoaded$ that are typically related + to credential dumping on $dest$. Review for further details. + mitre_attack_id: + - T1003.001 + - T1003 + nist: + - DE.AE + - DE.CM + observable: + - name: user + type: User + role: + - Victim + - name: dest + type: Hostname + role: + - Victim + - name: ImageLoaded + type: Parent Process + role: + - Other + - name: Image + type: Process + role: + - Child Process + product: + - Splunk Enterprise + - Splunk Enterprise Security + - Splunk Cloud + required_fields: + - _time + - Computer + - TargetImage + - GrantedAccess + - SourceImage + - SourceProcessId + - SourceUser + - TargetUser + risk_score: 64 + security_domain: endpoint diff --git a/tests/endpoint/windows_possible_credential_dumping.test.yml b/tests/endpoint/windows_possible_credential_dumping.test.yml new file mode 100644 index 0000000000..7776a045fe --- /dev/null +++ b/tests/endpoint/windows_possible_credential_dumping.test.yml @@ -0,0 +1,12 @@ +name: Windows Possible Credential Dumping Unit Test +tests: +- name: Windows Possible Credential Dumping + file: endpoint/windows_possible_credential_dumping.yml + pass_condition: '| stats count | where count > 0' + earliest_time: '-24h' + latest_time: 'now' + attack_data: + - file_name: windows-sysmon.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1003.001/atomic_red_team/windows-sysmon.log + source: XmlWinEventLog:Microsoft-Windows-Sysmon/Operational + sourcetype: xmlwineventlog \ No newline at end of file From 29cb276dec419eeca8dc4d37d9ced45014bf3847 Mon Sep 17 00:00:00 2001 From: mhaag-spl <5632822+MHaggis@users.noreply.github.com> Date: Tue, 11 Jan 2022 13:16:22 -0700 Subject: [PATCH 183/203] control_rundll32 update --- .../endpoint/rundll32_control_rundll_hunt.yml | 14 +++++++------- ...l32_control_rundll_world_writable_directory.yml | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/detections/endpoint/rundll32_control_rundll_hunt.yml b/detections/endpoint/rundll32_control_rundll_hunt.yml index 0c97df842c..d4d2c5b084 100644 --- a/detections/endpoint/rundll32_control_rundll_hunt.yml +++ b/detections/endpoint/rundll32_control_rundll_hunt.yml @@ -14,8 +14,7 @@ description: The following hunting detection identifies rundll32.exe with `contr to be a bit more broad by not including .cpl. \ During triage, review parallel processes to identify any further suspicious behavior. search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) - as lastTime from datamodel=Endpoint.Processes where (Processes.process_name=rundll32.exe - OR Processes.original_file_name=RUNDLL32.EXE) Processes.process=*Control_RunDLL* by + as lastTime from datamodel=Endpoint.Processes where `process_rundll32` Processes.process=*Control_RunDLL* by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.original_file_name | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` @@ -28,11 +27,12 @@ how_to_implement: To successfully implement this search you need to be ingesting known_false_positives: This is a hunting detection, meant to provide a understanding of how voluminous control_rundll is within the environment. references: -- https://strontic.github.io/xcyclopedia/library/rundll32.exe-111474C61232202B5B588D2B512CBB25.html -- https://app.any.run/tasks/36c14029-9df8-439c-bba0-45f2643b0c70/ -- https://attack.mitre.org/techniques/T1218/011/ -- https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-40444 -- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.002/T1218.002.yaml + - https://strontic.github.io/xcyclopedia/library/rundll32.exe-111474C61232202B5B588D2B512CBB25.html + - https://app.any.run/tasks/36c14029-9df8-439c-bba0-45f2643b0c70/ + - https://attack.mitre.org/techniques/T1218/011/ + - https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-40444 + - https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.002/T1218.002.yaml + - https://redcanary.com/blog/intelligence-insights-december-2021/ tags: analytic_story: - Suspicious Rundll32 Activity diff --git a/detections/endpoint/rundll32_control_rundll_world_writable_directory.yml b/detections/endpoint/rundll32_control_rundll_world_writable_directory.yml index 1ae968e3cc..d7fbb56b40 100644 --- a/detections/endpoint/rundll32_control_rundll_world_writable_directory.yml +++ b/detections/endpoint/rundll32_control_rundll_world_writable_directory.yml @@ -15,8 +15,7 @@ description: The following detection identifies rundll32.exe with `control_rundl broad by not including .cpl. The paths are specified, add more as needed. During triage, review parallel processes to identify any further suspicious behavior. search: '| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) - as lastTime from datamodel=Endpoint.Processes where (Processes.process_name=rundll32.exe - OR Processes.original_file_name=RUNDLL32.EXE) Processes.process=*Control_RunDLL* + as lastTime from datamodel=Endpoint.Processes where `process_rundll32` Processes.process=*Control_RunDLL* AND Processes.process IN ("*\\appdata\\*", "*\\windows\\temp\\*", "*\\programdata\\*") by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.original_file_name @@ -30,11 +29,12 @@ how_to_implement: To successfully implement this search you need to be ingesting known_false_positives: This may be tuned, or a new one related, by adding .cpl to command-line. However, it's important to look for both. Tune/filter as needed. references: -- https://strontic.github.io/xcyclopedia/library/rundll32.exe-111474C61232202B5B588D2B512CBB25.html -- https://app.any.run/tasks/36c14029-9df8-439c-bba0-45f2643b0c70/ -- https://attack.mitre.org/techniques/T1218/011/ -- https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-40444 -- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.002/T1218.002.yaml + - https://strontic.github.io/xcyclopedia/library/rundll32.exe-111474C61232202B5B588D2B512CBB25.html + - https://app.any.run/tasks/36c14029-9df8-439c-bba0-45f2643b0c70/ + - https://attack.mitre.org/techniques/T1218/011/ + - https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-40444 + - https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1218.002/T1218.002.yaml + - https://redcanary.com/blog/intelligence-insights-december-2021/ tags: analytic_story: - Suspicious Rundll32 Activity From 79d13fccef0f9a0098a043751d1d9609c48fe714 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 11 Jan 2022 14:18:04 -0800 Subject: [PATCH 184/203] Converted DataManipulation from using FileInput to with open, readline, etc. We needed to do this because FileInput with inplace=True remaps the print command, which may be called by several parallel threads running DataManipulation or to output status info, will cause a crash if multiple threads write to it. --- .../modules/DataManipulation.py | 65 ++++++++++++++++++- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py index 08606e595f..53b1543a85 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py @@ -1,7 +1,7 @@ import json from datetime import datetime from datetime import timedelta -import fileinput +#import fileinput import os import re import io @@ -40,10 +40,36 @@ class DataManipulation: difference = now - latest_event f.close() + #Mimic the behavior of fileinput but in a threadsafe way + #Rename the file, which fileinput does for inplace. + #Note that path will now be the new file + original_backup_file = f"{path}.bak" + os.rename(path, original_backup_file) + + with open(original_backup_file, "r") as original_file: + with open(path, "w") as new_file: + for line in original_file: + d = json.loads(line) + original_time = datetime.strptime(d["CreationTime"],"%Y-%m-%dT%H:%M:%S") + new_time = (difference + original_time) + + original_time = original_time.strftime("%Y-%m-%dT%H:%M:%S") + new_time = new_time.strftime("%Y-%m-%dT%H:%M:%S") + #There is no end character appended, no need for end='' + new_file.write(line.replace(original_time, new_time)) + + + os.remove(original_backup_file) + + + + ''' #Order to make this threadsafe, we need to use fileinput.FileInput. #We cannot use fileinput.fileinput because #"The instance will be used as global state for the functions of this module, and is also returned to use during iteration." #from: https://docs.python.org/2/library/fileinput.html#fileinput.input + + for line in fileinput.FileInput(path, inplace=True): d = json.loads(line) original_time = datetime.strptime(d["CreationTime"],"%Y-%m-%dT%H:%M:%S") @@ -52,6 +78,7 @@ class DataManipulation: original_time = original_time.strftime("%Y-%m-%dT%H:%M:%S") new_time = new_time.strftime("%Y-%m-%dT%H:%M:%S") print (line.replace(original_time, new_time),end ='') + ''' def manipulate_timestamp_windows_event_log_raw(self, file_path): @@ -117,6 +144,39 @@ class DataManipulation: difference = now - latest_event f.close() + + + #Mimic the behavior of fileinput but in a threadsafe way + #Rename the file, which fileinput does for inplace. + #Note that path will now be the new file + original_backup_file = f"{path}.bak" + os.rename(path, original_backup_file) + + with open(original_backup_file, "r") as original_file: + with open(path, "w") as new_file: + for line in original_file: + try: + d = json.loads(line) + original_time = datetime.strptime(d["eventTime"],"%Y-%m-%dT%H:%M:%S.%fZ") + new_time = (difference + original_time) + + original_time = original_time.strftime("%Y-%m-%dT%H:%M:%S.%fZ") + new_time = new_time.strftime("%Y-%m-%dT%H:%M:%S.%fZ") + new_file.write(line.replace(original_time, new_time)) + except ValueError: + d = json.loads(line) + original_time = datetime.strptime(d["eventTime"],"%Y-%m-%dT%H:%M:%SZ") + new_time = (difference + original_time) + + original_time = original_time.strftime("%Y-%m-%dT%H:%M:%SZ") + new_time = new_time.strftime("%Y-%m-%dT%H:%M:%SZ") + new_file.write(line.replace(original_time, new_time)) + + + os.remove(original_backup_file) + + + ''' #Order to make this threadsafe, we need to use fileinput.FileInput. #We cannot use fileinput.fileinput because #"The instance will be used as global state for the functions of this module, and is also returned to use during iteration." @@ -137,4 +197,5 @@ class DataManipulation: original_time = original_time.strftime("%Y-%m-%dT%H:%M:%SZ") new_time = new_time.strftime("%Y-%m-%dT%H:%M:%SZ") - print (line.replace(original_time, new_time),end ='') \ No newline at end of file + print (line.replace(original_time, new_time),end ='') + ''' \ No newline at end of file From e8b6be29c7ee9a06eaf3120a4f33545ca0141f50 Mon Sep 17 00:00:00 2001 From: patel-bhavin Date: Tue, 11 Jan 2022 15:44:16 -0800 Subject: [PATCH 185/203] yml changes and testing --- detections/endpoint/linux_add_user_account.yml | 14 +++++++------- .../linux_common_process_for_elevation_control.yml | 14 +++++++++----- .../endpoint/linux_doas_conf_file_creation.yml | 14 +++++++------- detections/endpoint/linux_doas_tool_execution.yml | 14 +++++++------- .../linux_possible_access_to_credential_files.yml | 13 ++++++------- .../linux_possible_access_to_sudoers_file.yml | 13 ++++++------- detections/endpoint/linux_sudo_or_su_execution.yml | 12 ++++++------ 7 files changed, 48 insertions(+), 46 deletions(-) diff --git a/detections/endpoint/linux_add_user_account.yml b/detections/endpoint/linux_add_user_account.yml index bf2bbe6227..b77daccbde 100644 --- a/detections/endpoint/linux_add_user_account.yml +++ b/detections/endpoint/linux_add_user_account.yml @@ -19,10 +19,9 @@ search: '| tstats `security_content_summariesonly` count from datamodel=Endpoint | `security_content_ctime(lastTime)` | `linux_add_user_account_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can execute this command. - filter is needed + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: Administrator or network operator can execute this command. + Please update the filter macros to remove false positives. references: - https://linuxize.com/post/how-to-create-users-in-linux-using-the-useradd-command/ tags: @@ -54,9 +53,10 @@ tags: confidence: 50 risk_score: 25 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a commandline $process$ that may create user account on $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A commandline $process$ that may create user account on $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_common_process_for_elevation_control.yml b/detections/endpoint/linux_common_process_for_elevation_control.yml index ffccfef597..904b32a0a0 100644 --- a/detections/endpoint/linux_common_process_for_elevation_control.yml +++ b/detections/endpoint/linux_common_process_for_elevation_control.yml @@ -23,8 +23,11 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_common_process_for_elevation_control_filter`' -how_to_implement: UPDATE_HOW_TO_IMPLEMENT -known_false_positives: UPDATE_KNOWN_FALSE_POSITIVES +how_to_implement: To successfully implement this search, you need to be ingesting + logs with the process name, parent process, and command-line executions from your + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: Administrator or network operator can execute this command. + Please update the filter macros to remove false positives. references: - https://attack.mitre.org/techniques/T1548/001/ - https://github.com/Neo23x0/auditd/blob/master/audit.rules#L285-L297 @@ -59,9 +62,10 @@ tags: confidence: 30 risk_score: 9 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a commandline $process$ with process $process_name$ on $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A commandline $process$ with process $process_name$ on $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_doas_conf_file_creation.yml b/detections/endpoint/linux_doas_conf_file_creation.yml index 7ab383a703..35f72a92e5 100644 --- a/detections/endpoint/linux_doas_conf_file_creation.yml +++ b/detections/endpoint/linux_doas_conf_file_creation.yml @@ -20,10 +20,9 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime | `security_content_ctime(firstTime)` | `linux_doas_conf_file_creation_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can execute this command. - filter is needed + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: Administrator or network operator can execute this command. + Please update the filter macros to remove false positives. references: - https://wiki.gentoo.org/wiki/Doas - https://www.makeuseof.com/how-to-install-and-use-doas/ @@ -54,9 +53,10 @@ tags: confidence: 70 risk_score: 49 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a file $file_name$ is created in $file_path$ on $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A file $file_name$ is created in $file_path$ on $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_doas_tool_execution.yml b/detections/endpoint/linux_doas_tool_execution.yml index 477c3d0a43..f6b50a06f3 100644 --- a/detections/endpoint/linux_doas_tool_execution.yml +++ b/detections/endpoint/linux_doas_tool_execution.yml @@ -21,10 +21,9 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime | `linux_doas_tool_execution_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can execute this command. - filter is needed + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: Administrator or network operator can execute this command. + Please update the filter macros to remove false positives. references: - https://wiki.gentoo.org/wiki/Doas - https://www.makeuseof.com/how-to-install-and-use-doas/ @@ -57,9 +56,10 @@ tags: confidence: 70 risk_score: 49 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a doas $process_name$ with commandline $process$ was executed on $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A doas $process_name$ with commandline $process$ was executed on $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_possible_access_to_credential_files.yml b/detections/endpoint/linux_possible_access_to_credential_files.yml index a9e726c7b4..be46affa88 100644 --- a/detections/endpoint/linux_possible_access_to_credential_files.yml +++ b/detections/endpoint/linux_possible_access_to_credential_files.yml @@ -21,10 +21,8 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_possible_access_to_credential_files_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can execute this command. - filter is needed + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: Administrator or network operator can execute this command. Please update the filter macros to remove false positives. references: - https://askubuntu.com/questions/445361/what-is-difference-between-etc-shadow-and-etc-passwd - https://attack.mitre.org/techniques/T1003/008/ @@ -57,9 +55,10 @@ tags: confidence: 50 risk_score: 25 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a commandline $process$ executed on $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A commandline $process$ executed on $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_possible_access_to_sudoers_file.yml b/detections/endpoint/linux_possible_access_to_sudoers_file.yml index dfbfc24933..df23a9d833 100644 --- a/detections/endpoint/linux_possible_access_to_sudoers_file.yml +++ b/detections/endpoint/linux_possible_access_to_sudoers_file.yml @@ -19,10 +19,8 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_possible_access_to_sudoers_file_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your - endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the - Sysmon TA. -known_false_positives: administrator or network operator can execute this command. - filter is needed + endpoints. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: administrator or network operator can execute this command. Please update the filter macros to remove false positives. references: - https://attack.mitre.org/techniques/T1548/003/ - https://web.archive.org/web/20210708035426/https://www.cobaltstrike.com/downloads/csmanual43.pdf @@ -55,9 +53,10 @@ tags: confidence: 50 risk_score: 25 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a commandline $process$ executed on $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A commandline $process$ executed on $dest$ observable: - name: dest type: Hostname diff --git a/detections/endpoint/linux_sudo_or_su_execution.yml b/detections/endpoint/linux_sudo_or_su_execution.yml index 40371377da..ee45705384 100644 --- a/detections/endpoint/linux_sudo_or_su_execution.yml +++ b/detections/endpoint/linux_sudo_or_su_execution.yml @@ -22,9 +22,8 @@ search: '| tstats `security_content_summariesonly` count min(_time) as firstTime | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `linux_sudo_or_su_execution_filter`' how_to_implement: To successfully implement this search you need to be ingesting information on process that include the name of the process responsible for the changes from - your endpoints into the `Endpoint` datamodel in the `Processes` node. -known_false_positives: administrator or network operator can execute this command. - filter is needed + your endpoints into the `Endpoint` datamodel in the `Processes` node. If you are using Sysmon, you can use the Add-on for Linux Sysmon from Splunkbase. +known_false_positives: Administrator or network operator can execute this command. Please update the filter macros to remove false positives. references: - https://attack.mitre.org/techniques/T1548/003/ tags: @@ -56,9 +55,10 @@ tags: confidence: 30 risk_score: 9 context: - - source:endpoint - - stage:Privilege Escalation Persistence - message: a commandline $process$ that execute sudo or su in $dest$ + - Source:Endpoint + - Stage:Privilege Escalation + - Stage:Persistence + message: A commandline $process$ that execute sudo or su in $dest$ observable: - name: dest type: Hostname From 6a6bd04819d4415e39cdd9b496415888e64b65c7 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 11 Jan 2022 15:46:38 -0800 Subject: [PATCH 186/203] Removing some dead code from DataManipulation.py --- .../test_results/combined.csv | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv b/bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv new file mode 100644 index 0000000000..fa91805f76 --- /dev/null +++ b/bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv @@ -0,0 +1,73 @@ +"SPLUNK_VERSION","splunk/splunk:latest" +"branch","UpdateRequiredFields" +"commit_hash","2670d58f5018345c37bae30e80535a864614133c" +"TEST_START_TIME","2022-01-11 12:32:39.925019" +"TEST_FINISH_TIME","2022-01-11 12:59:54.934815" +"TEST_DURATION","0:27:15" +"SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE","{'app_number': 12, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-amazon-kinesis-firehose_131r7d1d093.tgz'}" +"SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365","{'app_number': 13, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-office-365_202.tgz'}" +"SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS","{'app_number': 9, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-stream-forwarders_730.tgz'}" +"SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA","{'app_number': 8, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-stream-wire-data_730.tgz'}" +"SPLUNK_ADD_ON_FOR_SYSMON_OLD","{'app_number': 1, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-sysmon_1062.tgz'}" +"SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO","{'app_number': 11, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-zeek-aka-bro_400.tgz'}" +"SPLUNK_ASX_APP","{'app_number': 17, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/Splunk_ASX-latest.tar.gz'}" +"SPLUNK_AWS_TA","{'app_number': 4, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-amazon-web-services_510.tgz'}" +"SPLUNK_CIM_APP","{'app_number': 3, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-common-information-model-cim_4200.tgz'}" +"SPLUNK_ES_CONTENT_UPDATE","{'app_number': 3449, 'app_version': None, 'local_path': '/Users/emcginnis/Documents/GitHub/security_content/bin/automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz'}" +"SPLUNK_LINUX_TA","{'app_number': 14, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-unix-and-linux_820.tgz'}" +"SPLUNK_MLTK_APP","{'app_number': 6, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-machine-learning-toolkit_521.tgz'}" +"SPLUNK_NGINX_TA","{'app_number': 15, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-nginx_310.tgz'}" +"SPLUNK_PYTHON_APP","{'app_number': 5, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/python-for-scientific-computing-for-linux-64-bit_202.tgz'}" +"SPLUNK_SECURITY_ESSENTIALS","{'app_number': 10, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-security-essentials_333.tgz'}" +"SPLUNK_STREAM_APP","{'app_number': 7, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-app-for-stream_730.tgz'}" +"SPLUNK_SYSMON_LINUX_TA_PATCHED","{'app_number': 2, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/add-on-for-linux-sysmon_103_PATCHED.tgz'}" +"SPLUNK_TA_FOR_ZEEK","{'app_number': 16, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/ta-for-zeek_105.tgz'}" +"SPLUNK_WINDOWS_TA","{'app_number': 0, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-windows_812.tgz'}" +"SPLUNK_ADD_ON_FOR_SYSMON","{'app_number': 5709, 'app_version': '1.0.1'}" +"","" +detection_name,detection_file,runDuration,diskUsage,search_string,error,success,scanCount,detection_error +CMD Carry Out String Command Parameter,endpoint/cmd_carry_out_string_command_parameter.yml,1.6640000000000001,393216,"| tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where `process_cmd` AND Processes.process=""* /c *"" by Processes.dest Processes.user Processes.parent_process Processes.process_name Processes.original_file_name Processes.process Processes.process_id Processes.parent_process_id | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `cmd_carry_out_string_command_parameter_filter` | stats count | where count > 0",False,True,2109, +Suspicious writes to windows Recycle Bin,endpoint/suspicious_writes_to_windows_recycle_bin.yml,1.8760000000000001,589824,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Filesystem.file_path) as file_path values(Filesystem.file_name) as file_name FROM datamodel=Endpoint.Filesystem where Filesystem.file_path = ""*$Recycle.Bin*"" by Filesystem.process_id Filesystem.dest | `drop_dm_object_name(""Filesystem"")`| search [| tstats `security_content_summariesonly` values(Processes.user) as user values(Processes.process_name) as process_name values(Processes.parent_process_name) as parent_process_name FROM datamodel=Endpoint.Processes where Processes.process_name != ""explorer.exe"" by Processes.process_id Processes.dest| `drop_dm_object_name(""Processes"")` | table process_id dest] | `suspicious_writes_to_windows_recycle_bin_filter` | stats count | where count > 0",False,True,848, +Process Kill Base On File Path,endpoint/process_kill_base_on_file_path.yml,118.84100000000001,364544,"| tstats `security_content_summariesonly` values(Processes.process) as process values(Processes.process_id) as process_id count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where `process_wmic` AND Processes.process=""*process*"" AND Processes.process=""*executablepath*"" AND Processes.process=""*delete*"" by Processes.parent_process_name Processes.process_name Processes.original_file_name Processes.dest Processes.user | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `process_kill_base_on_file_path_filter` | stats count | where count > 0",False,True,271715, +High Process Termination Frequency,endpoint/high_process_termination_frequency.yml,17.758,155648,search `sysmon` EventCode=5 |bin _time span=3s |stats values(Image) as proc_terminated min(_time) as firstTime max(_time) as lastTime count by Computer EventCode ProcessID | where count >= 15 | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)` | `high_process_termination_frequency_filter` | stats count | where count > 0,False,True,46964, +Detect Rundll32 Application Control Bypass - advpack and ieadvpack,endpoint/detect_rundll32_application_control_bypass___advpack.yml,7.022,360448,| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where `process_rundll32` Processes.process=*advpack* by Processes.dest Processes.user Processes.parent_process_name Processes.original_file_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `detect_rundll32_application_control_bypass___advpack_filter` | stats count | where count > 0,False,True,13364, +Detect hosts connecting to dynamic domain providers,network/detect_hosts_connecting_to_dynamic_domain_providers.yml,1.052,274432,"| tstats `security_content_summariesonly` count values(DNS.answer) as answer min(_time) as firstTime from datamodel=Network_Resolution.DNS by DNS.query host | `drop_dm_object_name(""DNS"")` | `security_content_ctime(firstTime)` | `dynamic_dns_providers` | `detect_hosts_connecting_to_dynamic_domain_providers_filter` | stats count | where count > 0",False,True,644, +Process execution via wmi,endpoint/process_execution_via_wmi.yml,3.237,339968,| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.parent_process_name=WmiPrvSE.exe by Processes.dest Processes.user Processes.parent_process Processes.process_name Processes.process Processes.process_id Processes.parent_process_id | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `process_execution_via_wmi_filter` | stats count | where count = 1,False,False,6572, +Registry Keys Used For Privilege Escalation,endpoint/registry_keys_used_for_privilege_escalation.yml,2.915,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where (Registry.registry_path=""*Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options*"") AND (Registry.registry_value_name=GlobalFlag OR Registry.registry_value_name=Debugger) by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `drop_dm_object_name(Registry)` | `registry_keys_used_for_privilege_escalation_filter` | stats count | where count > 0",False,False,6391, +Disable Defender BlockAtFirstSeen Feature,endpoint/disable_defender_blockatfirstseen_feature.yml,2.364,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\Microsoft\\Windows Defender\\SpyNet*"" Registry.registry_value_name = DisableBlockAtFirstSeen Registry.registry_value_data = 0x00000001 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_blockatfirstseen_feature_filter` | stats count | where count > 0",False,False,4369, +Allow Operation with Consent Admin,endpoint/allow_operation_with_consent_admin.yml,7.696,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path= ""*\\Microsoft\\Windows\\CurrentVersion\\Policies\\System*"" Registry.registry_value_name = ConsentPromptBehaviorAdmin Registry.registry_value_data = ""0x00000000"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `allow_operation_with_consent_admin_filter` | stats count | where count > 0",False,False,17459, +Cloud Provisioning Activity From Previously Unseen IP Address,cloud/cloud_provisioning_from_previously_unseen_ip_address.yml,2.399,512000,"| tstats earliest(_time) as firstTime, latest(_time) as lastTime, values(All_Changes.object_id) as object_id from datamodel=Change.All_Changes where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.command | `drop_dm_object_name(""All_Changes"")` | lookup previously_seen_cloud_provisioning_activity_sources src as src OUTPUT firstTimeSeen, enough_data | eventstats max(enough_data) as enough_data | where enough_data=1 | eval firstTimeSeenSrc=min(firstTimeSeen) | where isnull(firstTimeSeenSrc) OR firstTimeSeenSrc > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`) | table firstTime, src, user, object_id, command | `cloud_provisioning_activity_from_previously_unseen_ip_address_filter` | `security_content_ctime(firstTime)` | stats count | where count > 0",False,False,8104, +Disable Defender Enhanced Notification,endpoint/disable_defender_enhanced_notification.yml,2.622,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*Microsoft\\Windows Defender\\Reporting*"" Registry.registry_value_name = DisableEnhancedNotifications Registry.registry_value_data = 0x00000001 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_enhanced_notification_filter` | stats count | where count > 0",False,False,4369, +Disable Defender Submit Samples Consent Feature,endpoint/disable_defender_submit_samples_consent_feature.yml,2.262,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\Microsoft\\Windows Defender\\SpyNet*"" Registry.registry_value_name = SubmitSamplesConsent Registry.registry_value_data = 0x00000000 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_submit_samples_consent_feature_filter` | stats count | where count > 0",False,False,4369, +Monitor Registry Keys for Print Monitors,endpoint/monitor_registry_keys_for_print_monitors.yml,3.4130000000000003,401408,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.action=modified AND Registry.registry_path=""*CurrentControlSet\\Control\\Print\\Monitors*"" by Registry.dest, Registry.registry_key_name Registry.user Registry.registry_path Registry.registry_value_name Registry.action | `drop_dm_object_name(Registry)` | `monitor_registry_keys_for_print_monitors_filter` | stats count | where count > 0",False,False,6309, +Disabling CMD Application,endpoint/disabling_cmd_application.yml,5.796,307200,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Policies\\Microsoft\\Windows\\System\\DisableCMD"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disabling_cmd_application_filter` | stats count | where count > 0",False,False,11619, +Disabling FolderOptions Windows Feature,endpoint/disabling_folderoptions_windows_feature.yml,0.869,303104,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoFolderOptions"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `disabling_folderoptions_windows_feature_filter` | stats count | where count > 0",False,False,11620, +Disabling NoRun Windows App,endpoint/disabling_norun_windows_app.yml,5.142,307200,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoRun"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `disabling_norun_windows_app_filter` | stats count | where count > 0",False,False,11620, +Enable RDP In Other Port Number,endpoint/enable_rdp_in_other_port_number.yml,5.255,315392,"| tstats `security_content_summariesonly` count values(Registry.registry_key_name) as registry_key_name values(Registry.registry_path) as registry_path min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path=""*HKLM\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp*"" Registry.registry_value_name = ""PortNumber"" by Registry.dest Registry.user Registry.registry_value_name | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `drop_dm_object_name(Registry)` | `enable_rdp_in_other_port_number_filter` | stats count | where count > 0",False,False,12982, +Disable Defender Spynet Reporting,endpoint/disable_defender_spynet_reporting.yml,2.149,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\Microsoft\\Windows Defender\\SpyNet*"" Registry.registry_value_name = SpynetReporting Registry.registry_value_data = 0x00000000 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_spynet_reporting_filter` | stats count | where count > 0",False,False,4367, +Disable Defender AntiVirus Registry,endpoint/disable_defender_antivirus_registry.yml,2.126,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\Policies\\Microsoft\\Windows Defender*"" Registry.registry_value_name = DisableAntiVirus Registry.registry_value_data = 0x00000001 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_antivirus_registry_filter` | stats count | where count > 0",False,False,4367, +Disable Show Hidden Files,endpoint/disable_show_hidden_files.yml,4.976,344064,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where (Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Hidden"" OR Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\HideFileExt"" Registry.registry_value_data = ""0x00000001"") OR (Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\ShowSuperHidden"" Registry.registry_value_data = ""0x00000000"") by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disable_show_hidden_files_filter` | stats count | where count > 0",False,False,11618, +Disabling SystemRestore In Registry,endpoint/disabling_systemrestore_in_registry.yml,4.792,323584,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SystemRestore\\DisableSR"" OR Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SystemRestore\\DisableConfig"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disabling_systemrestore_in_registry_filter` | stats count | where count > 0",False,False,11619, +Disable Defender MpEngine Registry,endpoint/disable_defender_mpengine_registry.yml,2.201,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\Policies\\Microsoft\\Windows Defender\\MpEngine*"" Registry.registry_value_name = MpEnablePus Registry.registry_value_data = 0x00000000 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_mpengine_registry_filter` | stats count | where count > 0",False,False,4368, +Disable AMSI Through Registry,endpoint/disable_amsi_through_registry.yml,2.164,307200,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows Script\\Settings\\AmsiEnable"" Registry.registry_value_data = ""0x00000000"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disable_amsi_through_registry_filter` | stats count | where count > 0",False,False,4624, +Circle CI Disable Security Step,cloud/circle_ci_disable_security_step.yml,0.6920000000000001,241664,"search `circleci` | rename workflows.job_id AS job_id | join job_id [ | search `circleci` | stats values(name) as step_names count by job_id job_name ] | stats count by step_names job_id job_name vcs.committer_name vcs.subject vcs.url owners{} | rename vcs.* as * , owners{} as user | lookup mandatory_step_for_job job_name OUTPUTNEW step_name AS mandatory_step | search mandatory_step=* | eval mandatory_step_executed=if(like(step_names, ""%"".mandatory_step.""%""), 1, 0) | where mandatory_step_executed=0 | rex field=url ""(?[^\/]*\/[^\/]*)$"" | eval phase=""build"" | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `circle_ci_disable_security_step_filter` | stats count | where count > 0",False,False,4, +Disabling Task Manager,endpoint/disabling_task_manager.yml,4.777,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\DisableTaskMgr"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `disabling_task_manager_filter` | stats count | where count > 0",False,False,11618, +Disable ETW Through Registry,endpoint/disable_etw_through_registry.yml,2.216,307200,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\.NETFramework\\ETWEnabled"" Registry.registry_value_data = ""0x00000000"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disable_etw_through_registry_filter` | stats count | where count > 0",False,False,4623, +Cloud Provisioning Activity From Previously Unseen City,cloud/cloud_provisioning_from_previously_unseen_city.yml,2.341,499712,"| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change.All_Changes where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.object, All_Changes.command | `drop_dm_object_name(""All_Changes"")` | iplocation src | where isnotnull(City) | lookup previously_seen_cloud_provisioning_activity_sources City as City OUTPUT firstTimeSeen, enough_data | eventstats max(enough_data) as enough_data | where enough_data=1 | eval firstTimeSeenCity=min(firstTimeSeen) | where isnull(firstTimeSeenCity) OR firstTimeSeenCity > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`) | table firstTime, src, City, user, object, command | `cloud_provisioning_activity_from_previously_unseen_city_filter` | `security_content_ctime(firstTime)` | stats count | where count > 0",False,False,8111, +Excessive Usage of NSLOOKUP App,endpoint/excessive_usage_of_nslookup_app.yml,1.704,315392,"search `sysmon` EventCode = 1 process_name = ""nslookup.exe"" | bucket _time span=15m | stats count as numNsLookup by Computer, _time | eventstats avg(numNsLookup) as avgNsLookup, stdev(numNsLookup) as stdNsLookup, count as numSlots by Computer | eval upperThreshold=(avgNsLookup + stdNsLookup *3) | eval isOutlier=if(avgNsLookup > 20 and avgNsLookup >= upperThreshold, 1, 0) | search isOutlier=1 | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `excessive_usage_of_nslookup_app_filter` | stats count | where count > 0",False,False,2950, +MSHTML Module Load in Office Product,endpoint/mshtml_module_load_in_office_product.yml,0.5680000000000001,544768,"search `sysmon` EventID=7 process_name IN (""winword.exe"",""excel.exe"",""powerpnt.exe"",""mspub.exe"",""visio.exe"",""wordpad.exe"",""wordview.exe"") ImageLoaded IN (""*\\mshtml.dll"", ""*\\Microsoft.mshtml.dll"",""*\\IE.Interop.MSHTML.dll"",""*\\MshtmlDac.dll"",""*\\MshtmlDed.dll"",""*\\MshtmlDer.dll"") | stats count min(_time) as firstTime max(_time) as lastTime by Computer, process_name, ImageLoaded, OriginalFileName, process_id | rename Computer as dest | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `mshtml_module_load_in_office_product_filter` | stats count | where count > 0",False,False,1, +Cloud Provisioning Activity From Previously Unseen Region,cloud/cloud_provisioning_from_previously_unseen_region.yml,2.455,499712,"| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change.All_Changes where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.object, All_Changes.command | `drop_dm_object_name(""All_Changes"")` | iplocation src | where isnotnull(Region) | lookup previously_seen_cloud_provisioning_activity_sources Region as Region OUTPUT firstTimeSeen, enough_data | eventstats max(enough_data) as enough_data | where enough_data=1 | eval firstTimeSeenRegion=min(firstTimeSeen) | where isnull(firstTimeSeenRegion) OR firstTimeSeenRegion > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`) | table firstTime, src, Region, user, object, command | `cloud_provisioning_activity_from_previously_unseen_region_filter` | `security_content_ctime(firstTime)` | stats count | where count > 0",False,False,8109, +Outbound Network Connection from Java Using Default Ports,endpoint/outbound_network_connection_from_java_using_default_ports.yml,4.581,569344,"| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Processes where (Processes.process_name=""java.exe"" OR Processes.process_name=javaw.exe OR Processes.process_name=javaw.exe) by _time Processes.process_guid Processes.process_name Processes.dest Processes.process_path Processes.process Processes.parent_process_name | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | join process_guid [| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Ports where (Ports.dest_port= 389 OR Ports.dest_port= 636 OR Ports.dest_port = 1389 OR Ports.dest_port = 1099 ) by Ports.process_guid Ports.dest Ports.dest_port| `drop_dm_object_name(Ports)` | rename dest as connection_to_CNC] | table _time dest parent_process_name process_name process_path process connection_to_CNC dest_port | `outbound_network_connection_from_java_using_default_ports_filter` | stats count | where count > 0",False,False,4459, +Windows Disable Antispyware Reg,endpoint/windows_disableantispyware_reg.yml,3.4090000000000003,303104,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_value_name=""DisableAntiSpyware"" AND Registry.registry_value_data=""0x00000001"" by Registry.dest Registry.user Registry.registry_path Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `windows_disableantispyware_registry_filter` | stats count | where count > 0",False,False,7398, +Disable Registry Tool,endpoint/disable_registry_tool.yml,9.412,319488,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\DisableRegistryTools"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disable_registry_tool_filter` | stats count | where count > 0",False,False,11618, +Disabling Defender Services,endpoint/disabling_defender_services.yml,3.1670000000000003,352256,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\System\\CurrentControlSet\\Services\\*"" AND (Registry.registry_path IN(""*WdBoot*"", ""*WdFilter*"", ""*WdNisDrv*"", ""*WdNisSvc*"", ""*WinDefend*"", ""*SecurityHealthService*"")) AND Registry.registry_value_name = Start Registry.registry_value_data = 0x00000004 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disabling_defender_services_filter` | stats count | where count > 0",False,False,5228, +Disabling Remote User Account Control,endpoint/disabling_remote_user_account_control.yml,3.205,315392,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path=*HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\EnableLUA* Registry.registry_value_data=""0x00000000"" by Registry.dest, Registry.registry_key_name Registry.user Registry.registry_path Registry.registry_value_data Registry.action | `drop_dm_object_name(Registry)` | `disabling_remote_user_account_control_filter` | stats count | where count > 0",False,False,6715, +Windows InstallUtil Credential Theft,endpoint/windows_installutil_credential_theft.yml,0.366,307200,"search `sysmon` EventCode=7 process_name=installutil.exe ImageLoaded IN (""*\\samlib.dll"", ""*\\vaultcli.dll"") | stats count min(_time) as firstTime max(_time) as lastTime by Computer, process_name, ImageLoaded, OriginalFileName, process_id | rename Computer as dest | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_installutil_credential_theft_filter` | stats count | where count > 0",False,False,4, +Wermgr Process Connecting To IP Check Web Services,endpoint/wermgr_process_connecting_to_ip_check_web_services.yml,3.145,323584,"search `sysmon` EventCode =22 process_name = wermgr.exe QueryName IN (""*wtfismyip.com"", ""*checkip.amazonaws.com"", ""*ipecho.net"", ""*ipinfo.io"", ""*api.ipify.org"", ""*icanhazip.com"", ""*ip.anysrc.com"",""*api.ip.sb"", ""ident.me"", ""www.myexternalip.com"", ""*zen.spamhaus.org"", ""*cbl.abuseat.org"", ""*b.barracudacentral.org"",""*dnsbl-1.uceprotect.net"", ""*spam.dnsbl.sorbs.net"") | stats min(_time) as firstTime max(_time) as lastTime count by process_path process_name process_id QueryName QueryStatus QueryResults Computer EventCode | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `wermgr_process_connecting_to_ip_check_web_services_filter` | stats count | where count > 0",False,False,6829, +Gsuite Drive Share In External Email,cloud/gsuite_drive_share_in_external_email.yml,0.343,151552,"search `gsuite_drive` NOT (email IN("""", ""null"")) | rex field=parameters.owner ""[^@]+@(?[^@]+)"" | rex field=email ""[^@]+@(?[^@]+)"" | where src_domain = ""internal_test_email.com"" and not dest_domain = ""internal_test_email.com"" | eval phase=""plan"" | eval severity=""low"" | stats values(parameters.doc_title) as doc_title, values(parameters.doc_type) as doc_types, values(email) as dst_email_list, values(parameters.visibility) as visibility, values(parameters.doc_id) as doc_id, count min(_time) as firstTime max(_time) as lastTime by parameters.owner ip_address phase severity | rename parameters.owner as user ip_address as src_ip | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `gsuite_drive_share_in_external_email_filter` | stats count | where count > 0",False,False,1, +Spoolsv Suspicious Loaded Modules,endpoint/spoolsv_suspicious_loaded_modules.yml,0.364,159744,"search `sysmon` EventCode=7 Image =""*\\spoolsv.exe"" ImageLoaded=""*\\Windows\\System32\\spool\\drivers\\x64\\*"" ImageLoaded = ""*.dll"" | stats dc(ImageLoaded) as countImgloaded values(ImageLoaded) as ImgLoaded count min(_time) as firstTime max(_time) as lastTime by Image Computer process_id EventCode | where countImgloaded >= 3 | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `spoolsv_suspicious_loaded_modules_filter` | stats count | where count > 0",False,False,45, +Disabling ControlPanel,endpoint/disabling_controlpanel.yml,5.238,315392,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoControlPanel"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `disabling_controlpanel_filter` | stats count | where count > 0",False,False,11619, +Print Spooler Failed to Load a Plug-in,endpoint/print_spooler_failed_to_load_a_plug_in.yml,0.375,139264,"search `printservice` ((ErrorCode=""0x45A"" (EventCode=""808"" OR EventCode=""4909"")) OR (""The print spooler failed to load a plug-in module"" OR ""\\drivers\\x64\\"")) | stats count min(_time) as firstTime max(_time) as lastTime by OpCode EventCode ComputerName Message | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `print_spooler_failed_to_load_a_plug_in_filter` | stats count | where count > 0",False,False,0, +Hide User Account From Sign-In Screen,endpoint/hide_user_account_from_sign_in_screen.yml,1.373,319488,"| tstats `security_content_summariesonly` count values(Registry.registry_key_name) as registry_key_name values(Registry.registry_path) as registry_path min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path=""*\\Windows NT\\CurrentVersion\\Winlogon\\SpecialAccounts\\Userlist*"" AND Registry.registry_value_data = ""0x00000000"" by Registry.dest Registry.user Registry.registry_value_data | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `drop_dm_object_name(Registry)` | `hide_user_account_from_sign_in_screen_filter` | stats count | where count > 0",False,False,1978, +Disable Windows Behavior Monitoring,endpoint/disable_windows_behavior_monitoring.yml,4.997,401408,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableBehaviorMonitoring"" OR Registry.registry_path= ""*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableOnAccessProtection"" OR Registry.registry_path= ""*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableScanOnRealtimeEnable"" OR Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableRealtimeMonitoring"" OR Registry.registry_path= ""*\\Real-Time Protection\\DisableIntrusionPreventionSystem"" OR Registry.registry_path= ""*\\Real-Time Protection\\DisableIOAVProtection"" OR Registry.registry_path= ""*\\Real-Time Protection\\DisableScriptScanning"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disable_windows_behavior_monitoring_filter` | stats count | where count > 0",False,False,11619, +Interactive Session on Remote Endpoint with PowerShell,endpoint/interactive_session_on_remote_endpoint_with_powershell.yml,,,"search powershell` EventCode=4104 (Message=""*Enter-PSSession*"" AND Message=""*-ComputerName*"") | stats count min(_time) as firstTime max(_time) as lastTime by EventCode Message ComputerName User | `security_content_ctime(firstTime)` | `interactive_session_on_remote_endpoint_with_powershell_filter` | stats count | where count > 0",True,False,,"Unable to execute detection: HTTP 400 Bad Request -- Error in 'SearchParser': The name 'EventCode=4104 ' is invalid. Macro and argument names might only include alphanumerics, '_' and '-'." From e3ba9f0074a4761f456549353acba1e3ae89d09a Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 11 Jan 2022 16:03:04 -0800 Subject: [PATCH 187/203] Finished removing dead code from DataManipulation. Added the new_sysmon as an additional default application. While it is not ideal to have the old and new sysmons installed side by side, there are some detection that only work with one and not the other. We will run both until we have moved all detections to the new sysmon. --- .../modules/DataManipulation.py | 47 +------------------ .../modules/validate_args.py | 7 ++- .../test_config_github_actions.json | 11 +++-- 3 files changed, 15 insertions(+), 50 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py index 53b1543a85..9c28b4a156 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/DataManipulation.py @@ -61,26 +61,6 @@ class DataManipulation: os.remove(original_backup_file) - - - ''' - #Order to make this threadsafe, we need to use fileinput.FileInput. - #We cannot use fileinput.fileinput because - #"The instance will be used as global state for the functions of this module, and is also returned to use during iteration." - #from: https://docs.python.org/2/library/fileinput.html#fileinput.input - - - for line in fileinput.FileInput(path, inplace=True): - d = json.loads(line) - original_time = datetime.strptime(d["CreationTime"],"%Y-%m-%dT%H:%M:%S") - new_time = (difference + original_time) - - original_time = original_time.strftime("%Y-%m-%dT%H:%M:%S") - new_time = new_time.strftime("%Y-%m-%dT%H:%M:%S") - print (line.replace(original_time, new_time),end ='') - ''' - - def manipulate_timestamp_windows_event_log_raw(self, file_path): path = os.path.join(os.path.dirname(__file__), '../' + file_path) path = path.replace('modules/../','') @@ -173,29 +153,4 @@ class DataManipulation: new_file.write(line.replace(original_time, new_time)) - os.remove(original_backup_file) - - - ''' - #Order to make this threadsafe, we need to use fileinput.FileInput. - #We cannot use fileinput.fileinput because - #"The instance will be used as global state for the functions of this module, and is also returned to use during iteration." - #from: https://docs.python.org/2/library/fileinput.html#fileinput.input - for line in fileinput.FileInput(path, inplace=True): - try: - d = json.loads(line) - original_time = datetime.strptime(d["eventTime"],"%Y-%m-%dT%H:%M:%S.%fZ") - new_time = (difference + original_time) - - original_time = original_time.strftime("%Y-%m-%dT%H:%M:%S.%fZ") - new_time = new_time.strftime("%Y-%m-%dT%H:%M:%S.%fZ") - print (line.replace(original_time, new_time),end ='') - except ValueError: - d = json.loads(line) - original_time = datetime.strptime(d["eventTime"],"%Y-%m-%dT%H:%M:%SZ") - new_time = (difference + original_time) - - original_time = original_time.strftime("%Y-%m-%dT%H:%M:%SZ") - new_time = new_time.strftime("%Y-%m-%dT%H:%M:%SZ") - print (line.replace(original_time, new_time),end ='') - ''' \ No newline at end of file + os.remove(original_backup_file) \ No newline at end of file diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py index 20704aed77..a7398dd0d0 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/validate_args.py @@ -245,7 +245,12 @@ setup_schema = { } }, - "default": {}, + "default": { + "SPLUNK_ADD_ON_FOR_SYSMON": { + "app_number": 5709, + "app_version": "1.0.1" + } + }, # "default": { # "ADD-ON_FOR_LINUX_SYSMON": { diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json index 5b94c52a15..cf84556d02 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json +++ b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions.json @@ -8,7 +8,7 @@ "endpoint", "cloud", "network", - "web" + "web" ], "interactive": false, "local_apps": { @@ -119,7 +119,12 @@ "show_splunk_app_password": false, "splunk_app_password": null, "splunk_container_apps_directory": "/opt/splunk/etc/apps", - "splunkbase_apps": {}, + "splunkbase_apps": { + "SPLUNK_ADD_ON_FOR_SYSMON": { + "app_number": 5709, + "app_version": "1.0.1" + } + }, "splunkbase_password": null, "splunkbase_username": null, "types": [ @@ -127,4 +132,4 @@ "Hunting", "TTP" ] -} +} \ No newline at end of file From 23da2f45d24954cb8728952577e444f1e4be940f Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 11 Jan 2022 16:06:47 -0800 Subject: [PATCH 188/203] removing file that was accidentally added. --- .../test_results/combined.csv | 73 ------------------- 1 file changed, 73 deletions(-) delete mode 100644 bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv b/bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv deleted file mode 100644 index fa91805f76..0000000000 --- a/bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv +++ /dev/null @@ -1,73 +0,0 @@ -"SPLUNK_VERSION","splunk/splunk:latest" -"branch","UpdateRequiredFields" -"commit_hash","2670d58f5018345c37bae30e80535a864614133c" -"TEST_START_TIME","2022-01-11 12:32:39.925019" -"TEST_FINISH_TIME","2022-01-11 12:59:54.934815" -"TEST_DURATION","0:27:15" -"SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE","{'app_number': 12, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-amazon-kinesis-firehose_131r7d1d093.tgz'}" -"SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365","{'app_number': 13, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-office-365_202.tgz'}" -"SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS","{'app_number': 9, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-stream-forwarders_730.tgz'}" -"SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA","{'app_number': 8, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-stream-wire-data_730.tgz'}" -"SPLUNK_ADD_ON_FOR_SYSMON_OLD","{'app_number': 1, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-sysmon_1062.tgz'}" -"SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO","{'app_number': 11, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-zeek-aka-bro_400.tgz'}" -"SPLUNK_ASX_APP","{'app_number': 17, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/Splunk_ASX-latest.tar.gz'}" -"SPLUNK_AWS_TA","{'app_number': 4, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-amazon-web-services_510.tgz'}" -"SPLUNK_CIM_APP","{'app_number': 3, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-common-information-model-cim_4200.tgz'}" -"SPLUNK_ES_CONTENT_UPDATE","{'app_number': 3449, 'app_version': None, 'local_path': '/Users/emcginnis/Documents/GitHub/security_content/bin/automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz'}" -"SPLUNK_LINUX_TA","{'app_number': 14, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-unix-and-linux_820.tgz'}" -"SPLUNK_MLTK_APP","{'app_number': 6, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-machine-learning-toolkit_521.tgz'}" -"SPLUNK_NGINX_TA","{'app_number': 15, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-nginx_310.tgz'}" -"SPLUNK_PYTHON_APP","{'app_number': 5, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/python-for-scientific-computing-for-linux-64-bit_202.tgz'}" -"SPLUNK_SECURITY_ESSENTIALS","{'app_number': 10, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-security-essentials_333.tgz'}" -"SPLUNK_STREAM_APP","{'app_number': 7, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-app-for-stream_730.tgz'}" -"SPLUNK_SYSMON_LINUX_TA_PATCHED","{'app_number': 2, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/add-on-for-linux-sysmon_103_PATCHED.tgz'}" -"SPLUNK_TA_FOR_ZEEK","{'app_number': 16, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/ta-for-zeek_105.tgz'}" -"SPLUNK_WINDOWS_TA","{'app_number': 0, 'app_version': None, 'http_path': 'https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/splunk-add-on-for-microsoft-windows_812.tgz'}" -"SPLUNK_ADD_ON_FOR_SYSMON","{'app_number': 5709, 'app_version': '1.0.1'}" -"","" -detection_name,detection_file,runDuration,diskUsage,search_string,error,success,scanCount,detection_error -CMD Carry Out String Command Parameter,endpoint/cmd_carry_out_string_command_parameter.yml,1.6640000000000001,393216,"| tstats `security_content_summariesonly` min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where `process_cmd` AND Processes.process=""* /c *"" by Processes.dest Processes.user Processes.parent_process Processes.process_name Processes.original_file_name Processes.process Processes.process_id Processes.parent_process_id | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `cmd_carry_out_string_command_parameter_filter` | stats count | where count > 0",False,True,2109, -Suspicious writes to windows Recycle Bin,endpoint/suspicious_writes_to_windows_recycle_bin.yml,1.8760000000000001,589824,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime values(Filesystem.file_path) as file_path values(Filesystem.file_name) as file_name FROM datamodel=Endpoint.Filesystem where Filesystem.file_path = ""*$Recycle.Bin*"" by Filesystem.process_id Filesystem.dest | `drop_dm_object_name(""Filesystem"")`| search [| tstats `security_content_summariesonly` values(Processes.user) as user values(Processes.process_name) as process_name values(Processes.parent_process_name) as parent_process_name FROM datamodel=Endpoint.Processes where Processes.process_name != ""explorer.exe"" by Processes.process_id Processes.dest| `drop_dm_object_name(""Processes"")` | table process_id dest] | `suspicious_writes_to_windows_recycle_bin_filter` | stats count | where count > 0",False,True,848, -Process Kill Base On File Path,endpoint/process_kill_base_on_file_path.yml,118.84100000000001,364544,"| tstats `security_content_summariesonly` values(Processes.process) as process values(Processes.process_id) as process_id count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where `process_wmic` AND Processes.process=""*process*"" AND Processes.process=""*executablepath*"" AND Processes.process=""*delete*"" by Processes.parent_process_name Processes.process_name Processes.original_file_name Processes.dest Processes.user | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `process_kill_base_on_file_path_filter` | stats count | where count > 0",False,True,271715, -High Process Termination Frequency,endpoint/high_process_termination_frequency.yml,17.758,155648,search `sysmon` EventCode=5 |bin _time span=3s |stats values(Image) as proc_terminated min(_time) as firstTime max(_time) as lastTime count by Computer EventCode ProcessID | where count >= 15 | `security_content_ctime(firstTime)`| `security_content_ctime(lastTime)` | `high_process_termination_frequency_filter` | stats count | where count > 0,False,True,46964, -Detect Rundll32 Application Control Bypass - advpack and ieadvpack,endpoint/detect_rundll32_application_control_bypass___advpack.yml,7.022,360448,| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where `process_rundll32` Processes.process=*advpack* by Processes.dest Processes.user Processes.parent_process_name Processes.original_file_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `detect_rundll32_application_control_bypass___advpack_filter` | stats count | where count > 0,False,True,13364, -Detect hosts connecting to dynamic domain providers,network/detect_hosts_connecting_to_dynamic_domain_providers.yml,1.052,274432,"| tstats `security_content_summariesonly` count values(DNS.answer) as answer min(_time) as firstTime from datamodel=Network_Resolution.DNS by DNS.query host | `drop_dm_object_name(""DNS"")` | `security_content_ctime(firstTime)` | `dynamic_dns_providers` | `detect_hosts_connecting_to_dynamic_domain_providers_filter` | stats count | where count > 0",False,True,644, -Process execution via wmi,endpoint/process_execution_via_wmi.yml,3.237,339968,| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.parent_process_name=WmiPrvSE.exe by Processes.dest Processes.user Processes.parent_process Processes.process_name Processes.process Processes.process_id Processes.parent_process_id | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `process_execution_via_wmi_filter` | stats count | where count = 1,False,False,6572, -Registry Keys Used For Privilege Escalation,endpoint/registry_keys_used_for_privilege_escalation.yml,2.915,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where (Registry.registry_path=""*Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options*"") AND (Registry.registry_value_name=GlobalFlag OR Registry.registry_value_name=Debugger) by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `drop_dm_object_name(Registry)` | `registry_keys_used_for_privilege_escalation_filter` | stats count | where count > 0",False,False,6391, -Disable Defender BlockAtFirstSeen Feature,endpoint/disable_defender_blockatfirstseen_feature.yml,2.364,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\Microsoft\\Windows Defender\\SpyNet*"" Registry.registry_value_name = DisableBlockAtFirstSeen Registry.registry_value_data = 0x00000001 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_blockatfirstseen_feature_filter` | stats count | where count > 0",False,False,4369, -Allow Operation with Consent Admin,endpoint/allow_operation_with_consent_admin.yml,7.696,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path= ""*\\Microsoft\\Windows\\CurrentVersion\\Policies\\System*"" Registry.registry_value_name = ConsentPromptBehaviorAdmin Registry.registry_value_data = ""0x00000000"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `allow_operation_with_consent_admin_filter` | stats count | where count > 0",False,False,17459, -Cloud Provisioning Activity From Previously Unseen IP Address,cloud/cloud_provisioning_from_previously_unseen_ip_address.yml,2.399,512000,"| tstats earliest(_time) as firstTime, latest(_time) as lastTime, values(All_Changes.object_id) as object_id from datamodel=Change.All_Changes where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.command | `drop_dm_object_name(""All_Changes"")` | lookup previously_seen_cloud_provisioning_activity_sources src as src OUTPUT firstTimeSeen, enough_data | eventstats max(enough_data) as enough_data | where enough_data=1 | eval firstTimeSeenSrc=min(firstTimeSeen) | where isnull(firstTimeSeenSrc) OR firstTimeSeenSrc > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`) | table firstTime, src, user, object_id, command | `cloud_provisioning_activity_from_previously_unseen_ip_address_filter` | `security_content_ctime(firstTime)` | stats count | where count > 0",False,False,8104, -Disable Defender Enhanced Notification,endpoint/disable_defender_enhanced_notification.yml,2.622,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*Microsoft\\Windows Defender\\Reporting*"" Registry.registry_value_name = DisableEnhancedNotifications Registry.registry_value_data = 0x00000001 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_enhanced_notification_filter` | stats count | where count > 0",False,False,4369, -Disable Defender Submit Samples Consent Feature,endpoint/disable_defender_submit_samples_consent_feature.yml,2.262,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\Microsoft\\Windows Defender\\SpyNet*"" Registry.registry_value_name = SubmitSamplesConsent Registry.registry_value_data = 0x00000000 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_submit_samples_consent_feature_filter` | stats count | where count > 0",False,False,4369, -Monitor Registry Keys for Print Monitors,endpoint/monitor_registry_keys_for_print_monitors.yml,3.4130000000000003,401408,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.action=modified AND Registry.registry_path=""*CurrentControlSet\\Control\\Print\\Monitors*"" by Registry.dest, Registry.registry_key_name Registry.user Registry.registry_path Registry.registry_value_name Registry.action | `drop_dm_object_name(Registry)` | `monitor_registry_keys_for_print_monitors_filter` | stats count | where count > 0",False,False,6309, -Disabling CMD Application,endpoint/disabling_cmd_application.yml,5.796,307200,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Policies\\Microsoft\\Windows\\System\\DisableCMD"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disabling_cmd_application_filter` | stats count | where count > 0",False,False,11619, -Disabling FolderOptions Windows Feature,endpoint/disabling_folderoptions_windows_feature.yml,0.869,303104,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoFolderOptions"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `disabling_folderoptions_windows_feature_filter` | stats count | where count > 0",False,False,11620, -Disabling NoRun Windows App,endpoint/disabling_norun_windows_app.yml,5.142,307200,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoRun"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `disabling_norun_windows_app_filter` | stats count | where count > 0",False,False,11620, -Enable RDP In Other Port Number,endpoint/enable_rdp_in_other_port_number.yml,5.255,315392,"| tstats `security_content_summariesonly` count values(Registry.registry_key_name) as registry_key_name values(Registry.registry_path) as registry_path min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path=""*HKLM\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp*"" Registry.registry_value_name = ""PortNumber"" by Registry.dest Registry.user Registry.registry_value_name | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `drop_dm_object_name(Registry)` | `enable_rdp_in_other_port_number_filter` | stats count | where count > 0",False,False,12982, -Disable Defender Spynet Reporting,endpoint/disable_defender_spynet_reporting.yml,2.149,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\Microsoft\\Windows Defender\\SpyNet*"" Registry.registry_value_name = SpynetReporting Registry.registry_value_data = 0x00000000 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_spynet_reporting_filter` | stats count | where count > 0",False,False,4367, -Disable Defender AntiVirus Registry,endpoint/disable_defender_antivirus_registry.yml,2.126,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\Policies\\Microsoft\\Windows Defender*"" Registry.registry_value_name = DisableAntiVirus Registry.registry_value_data = 0x00000001 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_antivirus_registry_filter` | stats count | where count > 0",False,False,4367, -Disable Show Hidden Files,endpoint/disable_show_hidden_files.yml,4.976,344064,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where (Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Hidden"" OR Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\HideFileExt"" Registry.registry_value_data = ""0x00000001"") OR (Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\ShowSuperHidden"" Registry.registry_value_data = ""0x00000000"") by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disable_show_hidden_files_filter` | stats count | where count > 0",False,False,11618, -Disabling SystemRestore In Registry,endpoint/disabling_systemrestore_in_registry.yml,4.792,323584,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SystemRestore\\DisableSR"" OR Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SystemRestore\\DisableConfig"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disabling_systemrestore_in_registry_filter` | stats count | where count > 0",False,False,11619, -Disable Defender MpEngine Registry,endpoint/disable_defender_mpengine_registry.yml,2.201,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\Policies\\Microsoft\\Windows Defender\\MpEngine*"" Registry.registry_value_name = MpEnablePus Registry.registry_value_data = 0x00000000 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disable_defender_mpengine_registry_filter` | stats count | where count > 0",False,False,4368, -Disable AMSI Through Registry,endpoint/disable_amsi_through_registry.yml,2.164,307200,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows Script\\Settings\\AmsiEnable"" Registry.registry_value_data = ""0x00000000"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disable_amsi_through_registry_filter` | stats count | where count > 0",False,False,4624, -Circle CI Disable Security Step,cloud/circle_ci_disable_security_step.yml,0.6920000000000001,241664,"search `circleci` | rename workflows.job_id AS job_id | join job_id [ | search `circleci` | stats values(name) as step_names count by job_id job_name ] | stats count by step_names job_id job_name vcs.committer_name vcs.subject vcs.url owners{} | rename vcs.* as * , owners{} as user | lookup mandatory_step_for_job job_name OUTPUTNEW step_name AS mandatory_step | search mandatory_step=* | eval mandatory_step_executed=if(like(step_names, ""%"".mandatory_step.""%""), 1, 0) | where mandatory_step_executed=0 | rex field=url ""(?[^\/]*\/[^\/]*)$"" | eval phase=""build"" | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `circle_ci_disable_security_step_filter` | stats count | where count > 0",False,False,4, -Disabling Task Manager,endpoint/disabling_task_manager.yml,4.777,311296,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\DisableTaskMgr"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `disabling_task_manager_filter` | stats count | where count > 0",False,False,11618, -Disable ETW Through Registry,endpoint/disable_etw_through_registry.yml,2.216,307200,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\.NETFramework\\ETWEnabled"" Registry.registry_value_data = ""0x00000000"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disable_etw_through_registry_filter` | stats count | where count > 0",False,False,4623, -Cloud Provisioning Activity From Previously Unseen City,cloud/cloud_provisioning_from_previously_unseen_city.yml,2.341,499712,"| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change.All_Changes where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.object, All_Changes.command | `drop_dm_object_name(""All_Changes"")` | iplocation src | where isnotnull(City) | lookup previously_seen_cloud_provisioning_activity_sources City as City OUTPUT firstTimeSeen, enough_data | eventstats max(enough_data) as enough_data | where enough_data=1 | eval firstTimeSeenCity=min(firstTimeSeen) | where isnull(firstTimeSeenCity) OR firstTimeSeenCity > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`) | table firstTime, src, City, user, object, command | `cloud_provisioning_activity_from_previously_unseen_city_filter` | `security_content_ctime(firstTime)` | stats count | where count > 0",False,False,8111, -Excessive Usage of NSLOOKUP App,endpoint/excessive_usage_of_nslookup_app.yml,1.704,315392,"search `sysmon` EventCode = 1 process_name = ""nslookup.exe"" | bucket _time span=15m | stats count as numNsLookup by Computer, _time | eventstats avg(numNsLookup) as avgNsLookup, stdev(numNsLookup) as stdNsLookup, count as numSlots by Computer | eval upperThreshold=(avgNsLookup + stdNsLookup *3) | eval isOutlier=if(avgNsLookup > 20 and avgNsLookup >= upperThreshold, 1, 0) | search isOutlier=1 | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `excessive_usage_of_nslookup_app_filter` | stats count | where count > 0",False,False,2950, -MSHTML Module Load in Office Product,endpoint/mshtml_module_load_in_office_product.yml,0.5680000000000001,544768,"search `sysmon` EventID=7 process_name IN (""winword.exe"",""excel.exe"",""powerpnt.exe"",""mspub.exe"",""visio.exe"",""wordpad.exe"",""wordview.exe"") ImageLoaded IN (""*\\mshtml.dll"", ""*\\Microsoft.mshtml.dll"",""*\\IE.Interop.MSHTML.dll"",""*\\MshtmlDac.dll"",""*\\MshtmlDed.dll"",""*\\MshtmlDer.dll"") | stats count min(_time) as firstTime max(_time) as lastTime by Computer, process_name, ImageLoaded, OriginalFileName, process_id | rename Computer as dest | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `mshtml_module_load_in_office_product_filter` | stats count | where count > 0",False,False,1, -Cloud Provisioning Activity From Previously Unseen Region,cloud/cloud_provisioning_from_previously_unseen_region.yml,2.455,499712,"| tstats earliest(_time) as firstTime, latest(_time) as lastTime from datamodel=Change.All_Changes where (All_Changes.action=started OR All_Changes.action=created) All_Changes.status=success by All_Changes.src, All_Changes.user, All_Changes.object, All_Changes.command | `drop_dm_object_name(""All_Changes"")` | iplocation src | where isnotnull(Region) | lookup previously_seen_cloud_provisioning_activity_sources Region as Region OUTPUT firstTimeSeen, enough_data | eventstats max(enough_data) as enough_data | where enough_data=1 | eval firstTimeSeenRegion=min(firstTimeSeen) | where isnull(firstTimeSeenRegion) OR firstTimeSeenRegion > relative_time(now(), `previously_unseen_cloud_provisioning_activity_window`) | table firstTime, src, Region, user, object, command | `cloud_provisioning_activity_from_previously_unseen_region_filter` | `security_content_ctime(firstTime)` | stats count | where count > 0",False,False,8109, -Outbound Network Connection from Java Using Default Ports,endpoint/outbound_network_connection_from_java_using_default_ports.yml,4.581,569344,"| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Processes where (Processes.process_name=""java.exe"" OR Processes.process_name=javaw.exe OR Processes.process_name=javaw.exe) by _time Processes.process_guid Processes.process_name Processes.dest Processes.process_path Processes.process Processes.parent_process_name | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | join process_guid [| tstats `security_content_summariesonly` count FROM datamodel=Endpoint.Ports where (Ports.dest_port= 389 OR Ports.dest_port= 636 OR Ports.dest_port = 1389 OR Ports.dest_port = 1099 ) by Ports.process_guid Ports.dest Ports.dest_port| `drop_dm_object_name(Ports)` | rename dest as connection_to_CNC] | table _time dest parent_process_name process_name process_path process connection_to_CNC dest_port | `outbound_network_connection_from_java_using_default_ports_filter` | stats count | where count > 0",False,False,4459, -Windows Disable Antispyware Reg,endpoint/windows_disableantispyware_reg.yml,3.4090000000000003,303104,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_value_name=""DisableAntiSpyware"" AND Registry.registry_value_data=""0x00000001"" by Registry.dest Registry.user Registry.registry_path Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `windows_disableantispyware_registry_filter` | stats count | where count > 0",False,False,7398, -Disable Registry Tool,endpoint/disable_registry_tool.yml,9.412,319488,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\DisableRegistryTools"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disable_registry_tool_filter` | stats count | where count > 0",False,False,11618, -Disabling Defender Services,endpoint/disabling_defender_services.yml,3.1670000000000003,352256,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path = ""*\\System\\CurrentControlSet\\Services\\*"" AND (Registry.registry_path IN(""*WdBoot*"", ""*WdFilter*"", ""*WdNisDrv*"", ""*WdNisSvc*"", ""*WinDefend*"", ""*SecurityHealthService*"")) AND Registry.registry_value_name = Start Registry.registry_value_data = 0x00000004 by Registry.dest Registry.user Registry.registry_path Registry.registry_value_name Registry.registry_value_data | `drop_dm_object_name(Registry)` | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `disabling_defender_services_filter` | stats count | where count > 0",False,False,5228, -Disabling Remote User Account Control,endpoint/disabling_remote_user_account_control.yml,3.205,315392,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path=*HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\EnableLUA* Registry.registry_value_data=""0x00000000"" by Registry.dest, Registry.registry_key_name Registry.user Registry.registry_path Registry.registry_value_data Registry.action | `drop_dm_object_name(Registry)` | `disabling_remote_user_account_control_filter` | stats count | where count > 0",False,False,6715, -Windows InstallUtil Credential Theft,endpoint/windows_installutil_credential_theft.yml,0.366,307200,"search `sysmon` EventCode=7 process_name=installutil.exe ImageLoaded IN (""*\\samlib.dll"", ""*\\vaultcli.dll"") | stats count min(_time) as firstTime max(_time) as lastTime by Computer, process_name, ImageLoaded, OriginalFileName, process_id | rename Computer as dest | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `windows_installutil_credential_theft_filter` | stats count | where count > 0",False,False,4, -Wermgr Process Connecting To IP Check Web Services,endpoint/wermgr_process_connecting_to_ip_check_web_services.yml,3.145,323584,"search `sysmon` EventCode =22 process_name = wermgr.exe QueryName IN (""*wtfismyip.com"", ""*checkip.amazonaws.com"", ""*ipecho.net"", ""*ipinfo.io"", ""*api.ipify.org"", ""*icanhazip.com"", ""*ip.anysrc.com"",""*api.ip.sb"", ""ident.me"", ""www.myexternalip.com"", ""*zen.spamhaus.org"", ""*cbl.abuseat.org"", ""*b.barracudacentral.org"",""*dnsbl-1.uceprotect.net"", ""*spam.dnsbl.sorbs.net"") | stats min(_time) as firstTime max(_time) as lastTime count by process_path process_name process_id QueryName QueryStatus QueryResults Computer EventCode | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `wermgr_process_connecting_to_ip_check_web_services_filter` | stats count | where count > 0",False,False,6829, -Gsuite Drive Share In External Email,cloud/gsuite_drive_share_in_external_email.yml,0.343,151552,"search `gsuite_drive` NOT (email IN("""", ""null"")) | rex field=parameters.owner ""[^@]+@(?[^@]+)"" | rex field=email ""[^@]+@(?[^@]+)"" | where src_domain = ""internal_test_email.com"" and not dest_domain = ""internal_test_email.com"" | eval phase=""plan"" | eval severity=""low"" | stats values(parameters.doc_title) as doc_title, values(parameters.doc_type) as doc_types, values(email) as dst_email_list, values(parameters.visibility) as visibility, values(parameters.doc_id) as doc_id, count min(_time) as firstTime max(_time) as lastTime by parameters.owner ip_address phase severity | rename parameters.owner as user ip_address as src_ip | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `gsuite_drive_share_in_external_email_filter` | stats count | where count > 0",False,False,1, -Spoolsv Suspicious Loaded Modules,endpoint/spoolsv_suspicious_loaded_modules.yml,0.364,159744,"search `sysmon` EventCode=7 Image =""*\\spoolsv.exe"" ImageLoaded=""*\\Windows\\System32\\spool\\drivers\\x64\\*"" ImageLoaded = ""*.dll"" | stats dc(ImageLoaded) as countImgloaded values(ImageLoaded) as ImgLoaded count min(_time) as firstTime max(_time) as lastTime by Image Computer process_id EventCode | where countImgloaded >= 3 | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `spoolsv_suspicious_loaded_modules_filter` | stats count | where count > 0",False,False,45, -Disabling ControlPanel,endpoint/disabling_controlpanel.yml,5.238,315392,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoControlPanel"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `disabling_controlpanel_filter` | stats count | where count > 0",False,False,11619, -Print Spooler Failed to Load a Plug-in,endpoint/print_spooler_failed_to_load_a_plug_in.yml,0.375,139264,"search `printservice` ((ErrorCode=""0x45A"" (EventCode=""808"" OR EventCode=""4909"")) OR (""The print spooler failed to load a plug-in module"" OR ""\\drivers\\x64\\"")) | stats count min(_time) as firstTime max(_time) as lastTime by OpCode EventCode ComputerName Message | `security_content_ctime(firstTime)` | `security_content_ctime(lastTime)` | `print_spooler_failed_to_load_a_plug_in_filter` | stats count | where count > 0",False,False,0, -Hide User Account From Sign-In Screen,endpoint/hide_user_account_from_sign_in_screen.yml,1.373,319488,"| tstats `security_content_summariesonly` count values(Registry.registry_key_name) as registry_key_name values(Registry.registry_path) as registry_path min(_time) as firstTime max(_time) as lastTime FROM datamodel=Endpoint.Registry where Registry.registry_path=""*\\Windows NT\\CurrentVersion\\Winlogon\\SpecialAccounts\\Userlist*"" AND Registry.registry_value_data = ""0x00000000"" by Registry.dest Registry.user Registry.registry_value_data | `security_content_ctime(lastTime)` | `security_content_ctime(firstTime)` | `drop_dm_object_name(Registry)` | `hide_user_account_from_sign_in_screen_filter` | stats count | where count > 0",False,False,1978, -Disable Windows Behavior Monitoring,endpoint/disable_windows_behavior_monitoring.yml,4.997,401408,"| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Registry where Registry.registry_path= ""*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableBehaviorMonitoring"" OR Registry.registry_path= ""*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableOnAccessProtection"" OR Registry.registry_path= ""*\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableScanOnRealtimeEnable"" OR Registry.registry_path= ""*\\SOFTWARE\\Microsoft\\Windows Defender\\Real-Time Protection\\DisableRealtimeMonitoring"" OR Registry.registry_path= ""*\\Real-Time Protection\\DisableIntrusionPreventionSystem"" OR Registry.registry_path= ""*\\Real-Time Protection\\DisableIOAVProtection"" OR Registry.registry_path= ""*\\Real-Time Protection\\DisableScriptScanning"" Registry.registry_value_data = ""0x00000001"" by Registry.registry_path Registry.registry_key_name Registry.registry_value_data Registry.dest | `drop_dm_object_name(Registry)` | `security_content_ctime(firstTime)` |`security_content_ctime(lastTime)` | `disable_windows_behavior_monitoring_filter` | stats count | where count > 0",False,False,11619, -Interactive Session on Remote Endpoint with PowerShell,endpoint/interactive_session_on_remote_endpoint_with_powershell.yml,,,"search powershell` EventCode=4104 (Message=""*Enter-PSSession*"" AND Message=""*-ComputerName*"") | stats count min(_time) as firstTime max(_time) as lastTime by EventCode Message ComputerName User | `security_content_ctime(firstTime)` | `interactive_session_on_remote_endpoint_with_powershell_filter` | stats count | where count > 0",True,False,,"Unable to execute detection: HTTP 400 Bad Request -- Error in 'SearchParser': The name 'EventCode=4104 ' is invalid. Macro and argument names might only include alphanumerics, '_' and '-'." From 7b3029b18743e4408eabff392e8c6460f99ebc74 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 11 Jan 2022 16:35:19 -0800 Subject: [PATCH 189/203] Removed splunkbase-only test_config file. Pushing to run a test on all. Will push again for changes only. --- .github/workflows/build-and-validate.yml | 5 +- ...test_config_github_actions_splunkbase.json | 122 ------------------ 2 files changed, 2 insertions(+), 125 deletions(-) delete mode 100644 bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index 022bc06615..6d8d4aae7b 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -352,14 +352,13 @@ jobs: if [[ ${{ steps.vars.outputs.branch }} == develop ]]; then echo "Running a nightly test on all detections" - python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode all --mock --config_file test_config_github_actions.json + python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode changes --mock --config_file test_config_github_actions.json elif [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_file test_config_github_actions.json else echo "Push from branch [${{ steps.vars.outputs.branch }}]" - #python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode all --mock --config_file test_config_github_actions.json - python detection_testing_execution.py run --branch develop --mode all --mock --config_file test_config_github_actions_splunkbase.json + python detection_testing_execution.py run --branch develop --mode all --mock --config_file test_config_github_actions.json fi mv *-test-run.json replicate_test.json diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json b/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json deleted file mode 100644 index 3e6ae86949..0000000000 --- a/bin/automated_detection_testing/ci/detection_testing_batch/test_config_github_actions_splunkbase.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "branch": "BRANCH_DOES_NOT_EXIST_USE_CLI_ARGUMENT", - "commit_hash": null, - "container_tag": "latest", - "detections_file": null, - "detections_list": null, - "folders": [ - "endpoint", - "cloud", - "network", - "web" - ], - "interactive": false, - "local_apps": { - "SPLUNK_ES_CONTENT_UPDATE": { - "app_number": 3449, - "app_version": null, - "local_path": null - }, - - "SPLUNK_SYSMON_LINUX_TA_PATCHED": { - "app_number": 2, - "app_version": null, - "http_path": "https://attack-range-appbinaries.s3-us-west-2.amazonaws.com/add-on-for-linux-sysmon_103_PATCHED.tgz" - } - - }, - "local_base_container_name": "splunk_test_%d", - "mock": false, - "mode": "changes", - "no_interactive_failure": true, - "num_containers": 10, - "persist_security_content": false, - "pr_number": null, - "reuse_image": true, - "show_splunk_app_password": false, - "splunk_app_password": null, - "splunk_container_apps_directory": "/opt/splunk/etc/apps", - "splunkbase_apps": { - - - "SPLUNK_ADD_ON_FOR_AMAZON_WEB_SERVICES": { - "app_number": 1876, - "app_version": "5.2.1" - }, - - "SPLUNK_ADD_ON_FOR_MICROSOFT_OFFICE_365": - { - "app_number": 4055, - "app_version": "2.2.0" - }, - - "SPLUNK_ADD_ON_FOR_AMAZON_KINESIS_FIREHOSE": { - "app_number": 3719, - "app_version": "1.3.2" - }, - - "SPLUNK_ANALYTIC_STORY_EXECUTION_APP": { - "app_number": 4971, - "app_version": "2.0.3" - }, - - "PYTHON_FOR_SCIENTIC_COMPUTING_LINUX_64_BIT": { - "app_number": 2882, - "app_version": "3.0.1" - }, - - "SPLUNK_MACHINE_LEARNING_TOOLKIT": { - "app_number": 2890, - "app_version": "5.3.0" - }, - - "SPLUNK_APP_FOR_STREAM": { - "app_number": 1809, - "app_version": "8.0.1" - }, - "SPLUNK_ADD_ON_FOR_STREAM_WIRE_DATA": { - "app_number": 5234, - "app_version": "8.0.1" - }, - "SPLUNK_ADD_ON_FOR_STREAM_FORWARDERS": { - "app_number": 5238, - "app_version": "8.0.1" - }, - "SPLUNK_ADD_ON_FOR_ZEEK_AKA_BRO": { - "app_number": 1617, - "app_version": "4.0.0" - }, - "SPLUNK_ADD_ON_FOR_UNIX_AND_LINUX": { - "app_number": 833, - "app_version": "8.4.0" - }, - "SPLUNK_ADD_ON_FOR_SYSMON": { - "app_number": 5709, - "app_version": "1.0.1" - }, - - "SPLUNK_COMMON_INFORMATION_MODEL": { - "app_number": 1621, - "app_version": "5.0.0" - }, - "SPLUNK_ADD_ON_FOR_NGINX" : { - "app_number": 3258, - "app_version": "3.1.0" - }, - "SPLUNK_SECURITY_ESSENTIALS": { - "app_number": 3435, - "app_version": "3.4.0" - }, - "TA_FOR_ZEEK": { - "app_number": 5466, - "app_version": "1.0.5" - } - }, - "splunkbase_password": null, - "splunkbase_username": null, - "types": [ - "Anomaly", - "Hunting", - "TTP" - ] -} From 4d9349084e49796fc5ef801c99fd744acfc537f6 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Tue, 11 Jan 2022 16:37:03 -0800 Subject: [PATCH 190/203] Changed to run nightly on develop and changes on other branches for pushes and PRs. --- .github/workflows/build-and-validate.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index 6d8d4aae7b..ce4e667277 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -352,13 +352,13 @@ jobs: if [[ ${{ steps.vars.outputs.branch }} == develop ]]; then echo "Running a nightly test on all detections" - python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode changes --mock --config_file test_config_github_actions.json + python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode all --mock --config_file test_config_github_actions.json elif [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_file test_config_github_actions.json else echo "Push from branch [${{ steps.vars.outputs.branch }}]" - python detection_testing_execution.py run --branch develop --mode all --mock --config_file test_config_github_actions.json + python detection_testing_execution.py run --branch develop --mode changes --mock --config_file test_config_github_actions.json fi mv *-test-run.json replicate_test.json From 56b5159b5d52a8a9ccf5f7d39efe463279fdfc67 Mon Sep 17 00:00:00 2001 From: mhaag-spl <5632822+MHaggis@users.noreply.github.com> Date: Wed, 12 Jan 2022 09:39:14 -0700 Subject: [PATCH 191/203] Update windows_possible_credential_dumping.test.yml --- tests/endpoint/windows_possible_credential_dumping.test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/endpoint/windows_possible_credential_dumping.test.yml b/tests/endpoint/windows_possible_credential_dumping.test.yml index 7776a045fe..f2979d3803 100644 --- a/tests/endpoint/windows_possible_credential_dumping.test.yml +++ b/tests/endpoint/windows_possible_credential_dumping.test.yml @@ -7,6 +7,6 @@ tests: latest_time: 'now' attack_data: - file_name: windows-sysmon.log - data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1003.001/atomic_red_team/windows-sysmon.log + data: https://media.githubusercontent.com/media/splunk/attack_data/master/datasets/attack_techniques/T1003.001/atomic_red_team/windows-sysmon_creddump.log source: XmlWinEventLog:Microsoft-Windows-Sysmon/Operational sourcetype: xmlwineventlog \ No newline at end of file From 815fa610e9b66deea5ea8c2717788f1c0de492a1 Mon Sep 17 00:00:00 2001 From: mhaag-spl <5632822+MHaggis@users.noreply.github.com> Date: Wed, 12 Jan 2022 09:45:32 -0700 Subject: [PATCH 192/203] Updated PowerShell - Connect To Internet With Hidden Window --- ...wershell___connect_to_internet_with_hidden_window.yml} | 8 ++++---- ...ell___connect_to_internet_with_hidden_window.test.yml} | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) rename detections/endpoint/{malicious_powershell_process___connect_to_internet_with_hidden_window.yml => powershell___connect_to_internet_with_hidden_window.yml} (93%) rename tests/endpoint/{malicious_powershell_process___connect_to_internet_with_hidden_window.test.yml => powershell___connect_to_internet_with_hidden_window.test.yml} (61%) diff --git a/detections/endpoint/malicious_powershell_process___connect_to_internet_with_hidden_window.yml b/detections/endpoint/powershell___connect_to_internet_with_hidden_window.yml similarity index 93% rename from detections/endpoint/malicious_powershell_process___connect_to_internet_with_hidden_window.yml rename to detections/endpoint/powershell___connect_to_internet_with_hidden_window.yml index a820995c29..c6cf21808e 100644 --- a/detections/endpoint/malicious_powershell_process___connect_to_internet_with_hidden_window.yml +++ b/detections/endpoint/powershell___connect_to_internet_with_hidden_window.yml @@ -1,7 +1,7 @@ -name: Malicious PowerShell Process - Connect To Internet With Hidden Window +name: PowerShell - Connect To Internet With Hidden Window id: ee18ed37-0802-4268-9435-b3b91aaa18db -version: 7 -date: '2021-10-05' +version: 8 +date: '2022-01-12' author: David Dorsey, Michael Haag Splunk type: Hunting datamodel: @@ -20,7 +20,7 @@ search: "| tstats `security_content_summariesonly` count min(_time) as firstTime \ Processes.process_name Processes.process Processes.parent_process_name Processes.original_file_name\ \ Processes.dest Processes.process_id | `drop_dm_object_name(Processes)` | `security_content_ctime(firstTime)`\ \ | `security_content_ctime(lastTime)` | where match(process,\"(?i)[\\-|\\/|\u2013\ - |\u2014|\u2015]w(in*d*o*w*s*t*y*l*e*)*\\s+[^-]\") | `malicious_powershell_process___connect_to_internet_with_hidden_window_filter`" + |\u2014|\u2015]w(in*d*o*w*s*t*y*l*e*)*\\s+[^-]\") | `powershell___connect_to_internet_with_hidden_window_filter`" how_to_implement: You must be ingesting data that records process activity from your hosts to populate the Endpoint data model in the Processes node. You must also be ingesting logs with both the process name and command line from your endpoints. diff --git a/tests/endpoint/malicious_powershell_process___connect_to_internet_with_hidden_window.test.yml b/tests/endpoint/powershell___connect_to_internet_with_hidden_window.test.yml similarity index 61% rename from tests/endpoint/malicious_powershell_process___connect_to_internet_with_hidden_window.test.yml rename to tests/endpoint/powershell___connect_to_internet_with_hidden_window.test.yml index 98b7dc80c1..c9f8db2233 100644 --- a/tests/endpoint/malicious_powershell_process___connect_to_internet_with_hidden_window.test.yml +++ b/tests/endpoint/powershell___connect_to_internet_with_hidden_window.test.yml @@ -1,7 +1,7 @@ -name: Malicious PowerShell Process - Connect To Internet With Hidden Window Unit Test +name: PowerShell - Connect To Internet With Hidden Window Unit Test tests: -- name: Malicious PowerShell Process - Connect To Internet With Hidden Window - file: endpoint/malicious_powershell_process___connect_to_internet_with_hidden_window.yml +- name: PowerShell - Connect To Internet With Hidden Window + file: endpoint/powershell___connect_to_internet_with_hidden_window.yml pass_condition: '| stats count | where count > 0' earliest_time: '-24h' latest_time: 'now' From 3afef5d55902f82c4a011f4e1b09fc0c49458d2a Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 12 Jan 2022 10:38:23 -0800 Subject: [PATCH 193/203] Updated the error for providing both PR and commit_hash to a warning. This was causing an error during PR triggered testing in github actions as both of these are provided. Perhaps we actually can include both of these and can get old PRs based on commit hash, but until then we will just test using the PR number and ignore the commit_hash if we find both. --- .../detection_testing_execution.py | 4 +++- .../modules/github_service.py | 13 ++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 6e63261ef6..32e2d045bb 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -98,7 +98,7 @@ def copy_local_apps_to_directory(apps: dict[str, dict], target_directory) -> Non -def ensure_security_content(branch: str, commit_hash: str, pr_number: Union[int, None], persist_security_content: bool) -> tuple[GithubService, bool]: +def ensure_security_content(branch: str, commit_hash: Union[str,None], pr_number: Union[int, None], persist_security_content: bool) -> tuple[GithubService, bool]: if persist_security_content is True and os.path.exists("security_content"): print("****** You chose --persist_security_content and the security_content directory exists. " "We will not check out the repo again. Please be aware, this could cause issues if your " @@ -508,6 +508,8 @@ def main(args: list[str]): sys.exit(0) else: print("Test Execution Failed - review the logs for more details") + print("IN THE FUTURE, THIS WILL RETURN NONZERO CAUSING THE WORKFLOW TO FAIL!") + sys.exit(0) sys.exit(1) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py index a1962a710d..ffedd07ea2 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/github_service.py @@ -24,7 +24,7 @@ SECURITY_CONTENT_URL = "https://github.com/splunk/security_content" class GithubService: - def __init__(self, security_content_branch: str, commit_hash: str, PR_number: int = None, persist_security_content: bool = False): + def __init__(self, security_content_branch: str, commit_hash: Union[str,None], PR_number: int = None, persist_security_content: bool = False): self.security_content_branch = security_content_branch if persist_security_content: @@ -44,12 +44,15 @@ class GithubService: "'git branch -a' to examine [%d] branches"%(security_content_branch, len(branch_names)))) - if commit_hash is not None and PR_number is not None: - raise(Exception("Error - both the PR number [%d] and the commit hash [%s] were provided. " - "Only 0 or 1 can be passed." % (PR_number, commit_hash))) + if commit_hash is not None and PR_number is not None: + print(f"\n************\nWARNING - both the PR_number {PR_number} and the commit_hash {commit_hash} were provided. " + f"You should only pass neither or one of these. We will ASSUME you want to use the PR_number, not the commit_hash. " + f"Removing the commit_hash...\n************\n") + commit_hash = None + - elif PR_number: + if PR_number: ret = subprocess.run(["git", "-C", "security_content/", "fetch", "origin", "refs/pull/%d/head:%s" % (PR_number, security_content_branch)], capture_output=True) #ret = subprocess.call(["git", "-C", "security_content/", "fetch", "origin", From b12ccf0cd23eed28f9e629698d344251c89da8ea Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 12 Jan 2022 10:54:45 -0800 Subject: [PATCH 194/203] Added a readme.md. Need to check that the markdown renders appropriately --- .../ci/detection_testing_batch/README.md | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 bin/automated_detection_testing/ci/detection_testing_batch/README.md diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/README.md b/bin/automated_detection_testing/ci/detection_testing_batch/README.md new file mode 100644 index 0000000000..bfd203c515 --- /dev/null +++ b/bin/automated_detection_testing/ci/detection_testing_batch/README.md @@ -0,0 +1,97 @@ +# Batch Detection Testing + +The Splunk Threat Research Team produces the [Enterprise Security Content Update Splunk App](https://splunkbase.splunk.com/app/3449/), a power app that includes hundreds of curated, tested detections that you can run on your own Splunk Enterprise Server today. The splunk/security_content repo gives users an insight into our work and allows them to replicate our workflow and even author their own detections! + +A core component of ESCU is that all of detections must be tested and validated against datasets to ensure they work correctly. In order to achieve that, the Security Content Detection Testing System was built with a few goals in mind: + - How can we quickly test a small number of detections, and how can I easily debug those detections? + - How can we reliably test new or modified detections every time they are committed to our repo (or every time that a PR is created) inside of GitHub Actions? + - At the time of this writing, ESCU contains over 550 detections! How can we quickly test a large number of detections? + - How can we run these tests on a wide variety of architectures, from develops' own machines to GitHub Actions to other Cloud Instances? + +This architecture diagram gives insight into the workflow: +In summary, the tool: + + 1. Downloads the latest version of the security_content Repo + 2. Lints/Sanity Checks all the Detections + 3. Builds an ESCU Splunk App + 4. Starts Docker containers (available from Docker Hub as splunk/splunk:latest), installing required Splunkbase Apps and ESCU + 5. Distributes Detection Tests Across those Containers + 6. Summarizes the Results of those Detections + + +# Running a Basic Test + +## Running the Tool +The easiest way to run a tests with default, which is suitable for most use cases, is to run: + + python detection_testing_exectuion.py run --branch BRANCH_TO_TEST [--splunkbase_username YOUR_USERNAME --splunkbase_password YOUR_PASSWORD] + + While the test is running, you'll see helpful information printed, letting you know what step of the process is taking place and what detection is being tested. + When you start your Splunk Server, the credentials will be printed out on the command line. You may want to use these credentials to log into the Splunk server, hosted locally, during testing for debugging or other exploration: + + *********************** + Log into your [1] Splunk Container(s) after they boot at http://127.0.0.1:[8000-8000] + Splunk App Username: [admin] + Splunk App Password: [PBlZEeGvQrOF57zmUXFPOP] + *********************** + +While you're running, you'll receive helpful progress updates each minute. They give you information about how long your test has been running, your approximate time remaining, and your approximate system load. Please note that this is total system load, not JUST load used by the detection testing: + + ***********PROGRESS UPDATE*********** + Elapsed Time : 0:27:53.358628 + Estimated Remaining Time : 0:49:18.896474 + Tests to run : 36 + Tests currently running : 1 + Tests completed : 20 + Success : 15 + Failure : 5 + Error : 0 + System Information: + Total CPU Usage : 44% (2 CPUs) + Total Memory Usage: 2.1GB USED / 6.8GB TOTAL + Total Disk Usage : 21.4GB USED / 83.2GB TOTAL + + Since you're probably running locally to test and debug your searches, there is a feature (enabled by default) called interactive_failure. If one of your detections fails, the test will pause and the offending detection will print out a message like this: + + + + This allows you to login to your Splunk server and debug the search. All of the uploaded data for this search remains on the server. To continue, delete the data for this search, and move on to the next search, simply hit "Enter" in the command prompt. + +When the test run is completed, you'll see some cleanup and summarization information. Finally, asimple output summarizes the test run, such as: + + All containers completed testing! + Removing all attack data that was downloaded during this test at: [/home/runner/work/security_content/security_content/bin/automated_detection_testing/ci/detection_testing_batch/attack_data_ogcm5da9] + Successfully removed all attack data + Generating test_results/success.csv...Done with [48] detections + Generating test_results/failure.csv...Done with [9] detections + Generating test_results/error.csv...Done with [0] detections + Generating test_results/combined.csv...Done with [57] detections + Settings updated. Writing results to: test_results/detection_failure_manifest.json + Summary: + Total Tests: 57 + Total Pass : 48 + Total Fail : 9 (0 of these were ERRORS) + Test Execution Successful + + Note that execution of this test will be successful if all tests complete, **even if 1 or more of the tests fail or contain errors!** + +## Viewing Detailed Results +A number of helpful files are generated when the tool runs and written to the `test_results/` directory. The most important files are: + + - summary.json - A file which contains a summary of the test : + - Successes, failures, and errors + - The Splunk Apps (and their versions) that were installed + - Specific Information about the Branch and Commit Hash the test was run against + - Detailed Information about each individual test, including success/failure/error information. + + - detection_failure_manifest.json - A file which allows you to replicate your test, testing ONLY the detections that have failed. This gives the user the chance to interactively debug these failures. This is especially useful because it is also generated by the GitHub Actions CI Pipeline - allowing you to pull a single file and debug failed tests locally in minutes! Because it contains specific application versions and the commit hash, this also lets you reproduce this test, exactly, at any point in the future. + + +## Advanced Usage + +### Command Line Arguments +There are a large number of configurable parameters for advanced users. To view the most common parameters, simply run + + python detection_testing_batch.py --help + +These commands will be described in more detail at a later time. \ No newline at end of file From 588eaad92a22742665dfdd9f771f4cbf70b14d57 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 12 Jan 2022 13:44:01 -0800 Subject: [PATCH 195/203] Accidentally hardcoded the branch name for testing. Fixed. --- .github/workflows/build-and-validate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index ce4e667277..0af278ae59 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -358,7 +358,7 @@ jobs: python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_file test_config_github_actions.json else echo "Push from branch [${{ steps.vars.outputs.branch }}]" - python detection_testing_execution.py run --branch develop --mode changes --mock --config_file test_config_github_actions.json + python detection_testing_execution.py run --branch [${{ steps.vars.outputs.branch }}] --mode changes --mock --config_file test_config_github_actions.json fi mv *-test-run.json replicate_test.json From c9d0e72cf30f2cc5488daac06f2565817d09f73b Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 12 Jan 2022 14:04:38 -0800 Subject: [PATCH 196/203] removed accidental brackets from branch name in CI testing branch name. --- .github/workflows/build-and-validate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index 0af278ae59..c6ed4e4db5 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -358,7 +358,7 @@ jobs: python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_file test_config_github_actions.json else echo "Push from branch [${{ steps.vars.outputs.branch }}]" - python detection_testing_execution.py run --branch [${{ steps.vars.outputs.branch }}] --mode changes --mock --config_file test_config_github_actions.json + python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json fi mv *-test-run.json replicate_test.json From 649c43f237872fb7face1a2188dd268ee2101ae5 Mon Sep 17 00:00:00 2001 From: Bhavin Patel Date: Wed, 12 Jan 2022 14:39:35 -0800 Subject: [PATCH 197/203] Update windows_possible_credential_dumping.yml --- detections/endpoint/windows_possible_credential_dumping.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/detections/endpoint/windows_possible_credential_dumping.yml b/detections/endpoint/windows_possible_credential_dumping.yml index 14d66f23e0..788e304c0e 100644 --- a/detections/endpoint/windows_possible_credential_dumping.yml +++ b/detections/endpoint/windows_possible_credential_dumping.yml @@ -17,8 +17,7 @@ description: 'The following analytic is an enhanced version of two previous anal The idea behind using ntdll.dll is to blend in by using native api of ntdll.dll. For example in sekurlsa module there are many ntdll exported api, like RtlCopyMemory, used to execute this module which is related to lsass dumping.' search: '`sysmon` EventCode=10 TargetImage=*lsass.exe GrantedAccess IN ("0x01000", "0x1010", "0x1038", "0x40", "0x1400", "0x1fffff", "0x1410", "0x1438", "0x143a", "0x1438", "0x1000") CallTrace IN ("*dbgcore.dll*", "*dbghelp.dll*", "*ntdll.dll*") | stats count min(_time) as firstTime max(_time) as lastTime by Computer, TargetImage, GrantedAccess, SourceImage, SourceProcessId, SourceUser, TargetUser | rename Computer as dest | `security_content_ctime(firstTime)`| - `security_content_ctime(lastTime)` - | `windows_possible_credential_dumping_filter`' + `security_content_ctime(lastTime)` | `windows_possible_credential_dumping_filter`' how_to_implement: To successfully implement this search, you need to be ingesting logs with the process name, parent process, and command-line executions from your endpoints. If you are using Sysmon, you must have at least version 6.0.4 of the From 73998ca5c11d0b380c01eb4145e95ae058f6b5d9 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 12 Jan 2022 14:57:17 -0800 Subject: [PATCH 198/203] Changed summarize_json.py to return success (0) code even if there are failures or errors found during testing during the initial testing of CI/CD. This is because we don't want these to hold up the build process. Eventually we will report actual success/failure of all tests after we have the opportunity to validate the new testing pipeline and make updates to failing searches. --- .../ci/detection_testing_batch/detection_testing_execution.py | 2 -- .../ci/detection_testing_batch/summarize_json.py | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index 32e2d045bb..e88cce0acd 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -508,8 +508,6 @@ def main(args: list[str]): sys.exit(0) else: print("Test Execution Failed - review the logs for more details") - print("IN THE FUTURE, THIS WILL RETURN NONZERO CAUSING THE WORKFLOW TO FAIL!") - sys.exit(0) sys.exit(1) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/summarize_json.py b/bin/automated_detection_testing/ci/detection_testing_batch/summarize_json.py index 0a868334d8..d2912773cf 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/summarize_json.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/summarize_json.py @@ -87,6 +87,9 @@ def print_summary(test_count: int, pass_count:int, fail_count:int, error_count:i def exit_with_status(test_pass:bool, test_count: int, pass_count:int, fail_count:int, error_count:int)->None: if not test_pass: print("Result: FAIL") + print("DURING TESTING, THIS WILL STILL EXIT WITH AN EXIT CODE OF 0 (SUCCESS) TO ALLOW THE WORKFLOW " + "TO PASS AND CI/CD TO CONTINUE. THIS WILL BE CHANGED IN A FUTURE VERSION.") + sys.exit(0) sys.exit(1) else: print("Result: PASS!") From 2cb339016423fd8aa6221af6ae3f9fca6f431a75 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 12 Jan 2022 16:05:22 -0800 Subject: [PATCH 199/203] Migrated the docker detection testing from build-and-validate.yml into detection-testing.yml workflow. Removed the unused AWS batch testing workflow. This makes much more sense --- .github/workflows/build-and-validate.yml | 287 +------------------- .github/workflows/detection-testing.yml | 321 ++++++++++++++++++----- 2 files changed, 260 insertions(+), 348 deletions(-) diff --git a/.github/workflows/build-and-validate.yml b/.github/workflows/build-and-validate.yml index c6ed4e4db5..f08b0d3859 100644 --- a/.github/workflows/build-and-validate.yml +++ b/.github/workflows/build-and-validate.yml @@ -17,8 +17,6 @@ on: push: pull_request: types: [opened, reopened] - schedule: - - cron: "44 4 * * *" jobs: validate-tag-if-present: runs-on: ubuntu-latest @@ -298,290 +296,7 @@ jobs: - docker-detection-testing-setup: - runs-on: ubuntu-latest - needs: [build-package] - steps: - - name: Get branch and PR required for detection testing main.py - id: vars - run: | - echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" - - - name: Checkout Repo - uses: actions/checkout@v2 - - #- name: Install requirements for installing slim during execution - # run: | - # sudo apt update -qq - # #python2.7 needed for slim, for now - # sudo apt install python2 - # sudo apt install virtualenv - # curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py - # sudo python2.7 get-pip.py - - # Get the previously built ESCU - - name: Get ESCU - uses: actions/download-artifact@v2 - with: - name: content-latest - path: bin/automated_detection_testing/ci/detection_testing_batch/prior_config/apps - - - uses: actions/setup-python@v2 - with: - python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy - architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified - - - name: Install Python Dependencies - run: | - cd bin/automated_detection_testing/ci/detection_testing_batch - python3 -m venv .venv - source .venv/bin/activate - python3 -m pip install wheel - python3 -m pip install -r requirements.txt - - - name: Run the CI - run: | - cd bin/automated_detection_testing/ci/detection_testing_batch - source .venv/bin/activate - echo "github.event.issue.pull_request : [${{ github.event.issue.pull_request }}]" - echo "github.event.pull_request.number : [${{ github.event.pull_request.number }}]" - echo "steps.vars.outputs.branch : [${{ steps.vars.outputs.branch }}]" - echo "github.event.pull_request.head.ref : [${{ github.event.pull_request.head.ref }}]" - - ls -lahr prior_config - - if [[ ${{ steps.vars.outputs.branch }} == develop ]]; then - echo "Running a nightly test on all detections" - python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode all --mock --config_file test_config_github_actions.json - elif [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then - echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" - python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_file test_config_github_actions.json - else - echo "Push from branch [${{ steps.vars.outputs.branch }}]" - python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json - fi - - mv *-test-run.json replicate_test.json - - name: Upload Test Results Files - uses: actions/upload-artifact@v2 - with: - name: testing-results-config - path: | - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_0.json - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_1.json - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_2.json - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_3.json - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_4.json - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_5.json - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_6.json - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_7.json - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_8.json - bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_9.json - - - name: Upload File to Enable Replication of the Test at a Different Time or Place - uses: actions/upload-artifact@v2 - with: - name: replicate_test - path: | - bin/automated_detection_testing/ci/detection_testing_batch/replicate_test.json - - docker-detection-testing-execution: - runs-on: ubuntu-latest - needs: [docker-detection-testing-setup] - strategy: - matrix: - manifest_filename: ["config_tests_0.json", - "config_tests_1.json", - "config_tests_2.json", - "config_tests_3.json", - "config_tests_4.json", - "config_tests_5.json", - "config_tests_6.json", - "config_tests_7.json", - "config_tests_8.json", - "config_tests_9.json"] - steps: - - name: Get branch and PR required for detection testing main.py - id: vars - run: | - echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" - - - name: Checkout Repo - uses: actions/checkout@v2 - - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: testing-results-config - path: bin/automated_detection_testing/ci/detection_testing_batch/prior_config - # - name: Install Docker - # run: | - # sudo apt update -qq - - - # #python2.7 needed for slim, for now - # sudo apt install python2 - # sudo apt install virtualenv - # curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py - # sudo python2.7 get-pip.py - - - uses: actions/setup-python@v2 - with: - python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy - architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified - - - name: Install Python Dependencies - run: | - cd bin/automated_detection_testing/ci/detection_testing_batch - python3 -m venv .venv - source .venv/bin/activate - python3 -m pip install wheel - python3 -m pip install -r requirements.txt - - - name: Run the CI - run: | - cd bin/automated_detection_testing/ci/detection_testing_batch - source .venv/bin/activate - - python3 detection_testing_execution.py run -c prior_config/${{ matrix.manifest_filename}} --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} - - - - name: Upload Test Results Files - uses: actions/upload-artifact@v2 - with: - name: ${{ matrix.manifest_filename}}.results - path: | - bin/automated_detection_testing/ci/detection_testing_batch/test_results/success.csv - bin/automated_detection_testing/ci/detection_testing_batch/test_results/error.csv - bin/automated_detection_testing/ci/detection_testing_batch/test_results/failure.csv - bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv - bin/automated_detection_testing/ci/detection_testing_batch/test_results/success.json - bin/automated_detection_testing/ci/detection_testing_batch/test_results/error.json - bin/automated_detection_testing/ci/detection_testing_batch/test_results/failure.json - bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.json - - bin/automated_detection_testing/ci/detection_testing_batch/test_results/summary.json - - docker-detection-testing-execution-merge-results: - runs-on: ubuntu-latest - needs: [docker-detection-testing-setup, docker-detection-testing-execution] - - steps: - - name: Get branch and PR required for detection testing main.py - id: vars - run: | - echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" - - - name: Checkout Repo - uses: actions/checkout@v2 - - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_0.json.results - path: bin/automated_detection_testing/ci/detection_testing_batch/results_0 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_1.json.results - path: bin/automated_detection_testing/ci/detection_testing_batch/results_1 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_2.json.results - path: bin/automated_detection_testing/ci/detection_testing_batch/results_2 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_3.json.results - path: bin/automated_detection_testing/ci/detection_testing_batch/results_3 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_4.json.results - path: bin/automated_detection_testing/ci/detection_testing_batch/results_4 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_5.json.results - path: bin/automated_detection_testing/ci/detection_testing_batch/results_5 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_6.json.results - path: bin/automated_detection_testing/ci/detection_testing_batch/results_6 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_7.json.results - path: bin/automated_detection_testing/ci/detection_testing_batch/results_7 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_8.json.results - path: bin/automated_detection_testing/ci/detection_testing_batch/results_8 - - name: Download artifacts - uses: actions/download-artifact@v2 - with: - name: config_tests_9.json.results - path: bin/automated_detection_testing/ci/detection_testing_batch/results_9 - - - uses: actions/setup-python@v2 - with: - python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy - architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified - - - name: Install Python Dependencies - run: | - cd bin/automated_detection_testing/ci/detection_testing_batch - python3 -m venv .venv - source .venv/bin/activate - python3 -m pip install wheel - python3 -m pip install -r requirements.txt - - - name: Merge Detections into single File - run: | - cd bin/automated_detection_testing/ci/detection_testing_batch - source .venv/bin/activate - python summarize_json.py --files results_*/summary.json --output_filename summary_test_results.json - - - - name: Upload Summary Test Results JSON - uses: actions/upload-artifact@v2 - if: always() - with: - name: SummaryTestResults - path: | - bin/automated_detection_testing/ci/detection_testing_batch/summary_test_results.json - - - name: Upload Failures Manifest on Failure - uses: actions/upload-artifact@v2 - if: failure() - with: - name: DetectionFailureManifest - path: | - bin/automated_detection_testing/ci/detection_testing_batch/detection_failure_manifest.json - - - #Always clean these up, they make the output messy - - name: Clean up intermediate Files - uses: geekyeggo/delete-artifact@v1 - if: always() - with: - name: | - config_tests_0.json.results - config_tests_1.json.results - config_tests_2.json.results - config_tests_3.json.results - config_tests_4.json.results - config_tests_5.json.results - config_tests_6.json.results - config_tests_7.json.results - config_tests_8.json.results - config_tests_9.json.results - - + diff --git a/.github/workflows/detection-testing.yml b/.github/workflows/detection-testing.yml index 82d471d5f6..eff019ec73 100644 --- a/.github/workflows/detection-testing.yml +++ b/.github/workflows/detection-testing.yml @@ -3,6 +3,8 @@ on: push: pull_request: types: [opened, reopened] + schedule: + - cron: "44 4 * * *" jobs: validate-tag-if-present: @@ -37,71 +39,266 @@ jobs: run: | echo "yes it ran" + docker-detection-testing-setup: + runs-on: ubuntu-latest + needs: [validate-tag-if-present, quit-for-dependabot] + steps: + - name: Get branch and PR required for detection testing main.py + id: vars + run: | + echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" - detection-testing: - runs-on: ubuntu-latest - environment: Detection-Testing-Approval - needs: [validate-tag-if-present, quit-for-dependabot] - steps: - - - name: Checkout Repo - uses: actions/checkout@v2 - - - #The following branch name only works (and is only used) for a push - #to a branch. We used a different method for getting the source branch - #from a PR - - name: Get branch and PR required for detection testing main.py - id: vars - run: | - echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" - - - name: Install System Packages - run: | - sudo apt update -qq - sudo apt install jq -qq + - name: Checkout Repo + uses: actions/checkout@v2 - - uses: actions/setup-python@v2 - with: - python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy - architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + - - name: Install Python Dependencies - run: | - #Get the virtualenv set up - cd bin/automated_detection_testing/ci/python_ci_code - rm -rf venv - python3 -m venv --clear venv - source venv/bin/activate - python3 -m pip install --upgrade pip - python3 -m pip install wheel - python3 -m pip install -q -r requirements.txt + - uses: actions/setup-python@v2 + with: + python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install Python Dependencies + run: | + cd bin/automated_detection_testing/ci/detection_testing_batch + python3 -m venv .venv + source .venv/bin/activate + python3 -m pip install wheel + python3 -m pip install -r requirements.txt + + - name: Run the CI + run: | + cd bin/automated_detection_testing/ci/detection_testing_batch + source .venv/bin/activate + echo "github.event.issue.pull_request : [${{ github.event.issue.pull_request }}]" + echo "github.event.pull_request.number : [${{ github.event.pull_request.number }}]" + echo "steps.vars.outputs.branch : [${{ steps.vars.outputs.branch }}]" + echo "github.event.pull_request.head.ref : [${{ github.event.pull_request.head.ref }}]" + + ls -lahr prior_config + + if [[ ${{ steps.vars.outputs.branch }} == develop ]]; then + echo "Running a nightly test on all detections" + python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --mode all --mock --config_file test_config_github_actions.json + elif [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then + echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" + python detection_testing_execution.py run --branch ${{ github.event.pull_request.head.ref }} --pr_number ${{ github.event.pull_request.number }} --mode changes --mock --config_file test_config_github_actions.json + else + echo "Push from branch [${{ steps.vars.outputs.branch }}]" + python detection_testing_execution.py run --branch ${{ steps.vars.outputs.branch }} --mode changes --mock --config_file test_config_github_actions.json + fi + + mv *-test-run.json replicate_test.json + - name: Upload Test Results Files + uses: actions/upload-artifact@v2 + with: + name: testing-results-config + path: | + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/apps/DA-ESS-ContentUpdate-latest.tar.gz + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_0.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_1.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_2.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_3.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_4.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_5.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_6.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_7.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_8.json + bin/automated_detection_testing/ci/detection_testing_batch/prior_config/config_tests_9.json + + - name: Upload File to Enable Replication of the Test at a Different Time or Place + uses: actions/upload-artifact@v2 + with: + name: replicate_test + path: | + bin/automated_detection_testing/ci/detection_testing_batch/replicate_test.json + + docker-detection-testing-execution: + runs-on: ubuntu-latest + needs: [docker-detection-testing-setup] + strategy: + matrix: + manifest_filename: ["config_tests_0.json", + "config_tests_1.json", + "config_tests_2.json", + "config_tests_3.json", + "config_tests_4.json", + "config_tests_5.json", + "config_tests_6.json", + "config_tests_7.json", + "config_tests_8.json", + "config_tests_9.json"] + steps: + - name: Get branch and PR required for detection testing main.py + id: vars + run: | + echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" + + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: testing-results-config + path: bin/automated_detection_testing/ci/detection_testing_batch/prior_config + + + - uses: actions/setup-python@v2 + with: + python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install Python Dependencies + run: | + cd bin/automated_detection_testing/ci/detection_testing_batch + python3 -m venv .venv + source .venv/bin/activate + python3 -m pip install wheel + python3 -m pip install -r requirements.txt + + - name: Run the CI + run: | + cd bin/automated_detection_testing/ci/detection_testing_batch + source .venv/bin/activate + + python3 detection_testing_execution.py run -c prior_config/${{ matrix.manifest_filename}} --splunkbase_username ${{ secrets.SPLUNKBASE_TESTING_USERNAME }} --splunkbase_password ${{ secrets.SPLUNKBASE_TESTING_KEY }} + + + - name: Upload Test Results Files + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.manifest_filename}}.results + path: | + bin/automated_detection_testing/ci/detection_testing_batch/test_results/success.csv + bin/automated_detection_testing/ci/detection_testing_batch/test_results/error.csv + bin/automated_detection_testing/ci/detection_testing_batch/test_results/failure.csv + bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.csv + bin/automated_detection_testing/ci/detection_testing_batch/test_results/success.json + bin/automated_detection_testing/ci/detection_testing_batch/test_results/error.json + bin/automated_detection_testing/ci/detection_testing_batch/test_results/failure.json + bin/automated_detection_testing/ci/detection_testing_batch/test_results/combined.json + + bin/automated_detection_testing/ci/detection_testing_batch/test_results/summary.json - - #Set up credentials in the environment so that boto will be able to find them - - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - #Right now the script is hard coded to EU because of the dev who originally wrote it... - #probably change that arg to None and set here? - aws-region: us-west-1 #assume we will always use this, could make this an environment variable... + docker-detection-testing-execution-merge-results: + runs-on: ubuntu-latest + needs: [docker-detection-testing-setup, docker-detection-testing-execution] + + steps: + - name: Get branch and PR required for detection testing main.py + id: vars + run: | + echo "::set-output name=branch::${GITHUB_REF#refs/heads/}" + + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_0.json.results + path: bin/automated_detection_testing/ci/detection_testing_batch/results_0 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_1.json.results + path: bin/automated_detection_testing/ci/detection_testing_batch/results_1 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_2.json.results + path: bin/automated_detection_testing/ci/detection_testing_batch/results_2 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_3.json.results + path: bin/automated_detection_testing/ci/detection_testing_batch/results_3 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_4.json.results + path: bin/automated_detection_testing/ci/detection_testing_batch/results_4 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_5.json.results + path: bin/automated_detection_testing/ci/detection_testing_batch/results_5 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_6.json.results + path: bin/automated_detection_testing/ci/detection_testing_batch/results_6 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_7.json.results + path: bin/automated_detection_testing/ci/detection_testing_batch/results_7 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_8.json.results + path: bin/automated_detection_testing/ci/detection_testing_batch/results_8 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: config_tests_9.json.results + path: bin/automated_detection_testing/ci/detection_testing_batch/results_9 + + - uses: actions/setup-python@v2 + with: + python-version: '3.9' #Available versions here - https://github.com/actions/python-versions/releases easy to change/make a matrix/use pypy + architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified + + - name: Install Python Dependencies + run: | + cd bin/automated_detection_testing/ci/detection_testing_batch + python3 -m venv .venv + source .venv/bin/activate + python3 -m pip install wheel + python3 -m pip install -r requirements.txt + + - name: Merge Detections into single File + run: | + cd bin/automated_detection_testing/ci/detection_testing_batch + source .venv/bin/activate + python summarize_json.py --files results_*/summary.json --output_filename summary_test_results.json + + + - name: Upload Summary Test Results JSON + uses: actions/upload-artifact@v2 + if: always() + with: + name: SummaryTestResults + path: | + bin/automated_detection_testing/ci/detection_testing_batch/summary_test_results.json + + - name: Upload Failures Manifest on Failure + uses: actions/upload-artifact@v2 + if: failure() + with: + name: DetectionFailureManifest + path: | + bin/automated_detection_testing/ci/detection_testing_batch/detection_failure_manifest.json + + + #Always clean these up, they make the output messy + - name: Clean up intermediate Files + uses: geekyeggo/delete-artifact@v1 + if: always() + with: + name: | + config_tests_0.json.results + config_tests_1.json.results + config_tests_2.json.results + config_tests_3.json.results + config_tests_4.json.results + config_tests_5.json.results + config_tests_6.json.results + config_tests_7.json.results + config_tests_8.json.results + config_tests_9.json.results + + - - name: Run Detection testing - timeout-minutes: 120 - run: | - cd bin/automated_detection_testing/ci/python_ci_code - source venv/bin/activate - - echo "github.event.issue.pull_request : [${{ github.event.issue.pull_request }}]" - echo "github.event.pull_request.number : [${{ github.event.pull_request.number }}]" - echo "steps.vars.outputs.branch : [${{ steps.vars.outputs.branch }}]" - echo "github.event.pull_request.head.ref: [${{ github.event.pull_request.head.ref }}]" - if [[ ! -z "${{ github.event.pull_request.head.ref }}" && ! -z "${{ github.event.pull_request.number }}" ]]; then - echo "Pull request from source branch [${{ github.event.pull_request.head.ref }}] for PR number [${{ github.event.issue.number }}]" - python3 main.py -b ${{ github.event.pull_request.head.ref }} -pr ${{ github.event.pull_request.number }} - else - echo "Push from branch [${{ steps.vars.outputs.branch }}]" - python3 main.py -b ${{ steps.vars.outputs.branch }} - fi From fc189e92ee5382eb66d6774f320f80eec6b94476 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 12 Jan 2022 16:10:21 -0800 Subject: [PATCH 200/203] Removed ls or directory that didn't exist anymore in detection-testing.yml --- .../apps/DA-ESS-ContentUpdate-latest.tar.gz | Bin 0 -> 1305941 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 bin/automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz b/bin/automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7427cb7951514a23df464f13b7c6c380df007536 GIT binary patch literal 1305941 zcmV(}K+wM*iwFq#_1$3t|3pD8MN?BPLvL<$Wo~p;aAaY0Wi2x@zpZji*VUj{(Vj6iHvR#g^|L{?@oGYdd9)#t3& zvSlAzlBM+?Yi&!`!?unevMpJ*k0i_fu(Mw69-ZBtwbtKvKl)erz9KRrGphhJyPF)c zFvG5@%!nJW8#nH~aUbrAyYi!F-qlCGH}I41y_UaK{+so=y1KEMf5+!*tLtm)-*c|M z_XhqZY33!+{P(__f9v<1Q5KB+owcpawRbkQHtub@_qSk4R@ZCaTl{_N{~qox?;Rd4 zKZv8ukFrn3126MeUc>&sclR!TZf)^iUoY%=YyWRLNLFX;c* zL;tr{?{3{)(Esl^{rA%}?sw8GPNtoKpLs#(W>?wE?fqA^q$# z@<6c=uxH?8vEw=E*zX5J0O~2|gh*f($AQ2+%MN!}v0YPPc2FSMpb@)xK}f(zX+M zBVWyc-P79lANpxO3C39vN8kTdm@fTmR)s^~OJKxL0Ot3%9b6O>d`fR&%soGhBS6zr zoMW1LoWN)XIDy2qoi8T7ntmsY1UI~cShcnP$(Xa zlXw)Q{-E~#2Y?Qzv^og8FTbERz%u&6)0pDmnja<-n+YA;Q!WESMM(Pzcy^&)^H-I>M{Wa+3t@Eka%c+L6#vU3z?UTAZ)$W8DWozcr^GV1vWcF%%? z#e~zyyBr3C(;k; zm9FI0YR-CT7EInJFu8Y{)O_)H&V@I^K^K`!&8pb~O#K*!oJk5NDP%j>4Gy$;ez;L=naQG^UGi0>^1|v%1k3+BT zTRbd`6;|ccAE9UlZKfb|MYxmFX`1;XS<3Mw8OM4y&2|Ffj|V~8k74GFJ~Hs^EQu$l zXE2a~@A$(Z3^B!K)G$+*re+tJ=56ON25AO4={QOq5&i}~^lgB1AM}HGg3?XjgVNZM zDGhTH`B#7zAmRag9>geJqIfcn6Z|%gq2iRL6UyRbApUq!7EYnt(4z!L4%p1wN3{+k zjp28KlMB6MY}s`_IeZ@nE1WtEKJ`Jc0u&fc!Yml$!tlKD`e9`*IvIztH%J}-3Z#S- zu*?|-p`Wr8+z;c)06--dAVY9XIAOgWA}|YN1Y7xpvM6WCPPf1`FkIQkY`E= z*>-YDLKSmi4cpUu=yVbw#z#%9YjR8M9me2D>|lPuHaEILgP z4MEvQrA1K=gsI&u(P~;>A=LC;jy!CLFw0}P)<5$jLMe6Lrg5$nC}?5qMRIw|$-5Bf z7HlsJk{#g`<@#)mryYfb`)l*rTVc>@bBJk|{QpQwwVLO=u6VSUa zCa{s|+*e-jdc~wyI+x|1aeK z8_WN9@4d6OkpCC*Kgj=+6qv}4J{Mm?4{)9Qzg4{dUtix`+gQl|Z{qJxz@6HR(lyp1{pkWoP5;luYbPR?O41AmOSW+aU)GlLM1?Fu9rCL?0g zjU$`NBq&`n7cG}=DfA}vmoL0<0z%=gTy=qTje>{?wq1l<0GQ7)&7)hZ?LU6@^x$as z$q_Rc#DStvLwv10@)7J8X3xji1PDCHILEs0P`%?#20=zsa8;{7ncAI)wr(P=LabU% zOF9Q$#3**XvPG5vL_gru{64U{YVo925cR_esutAPCZ!MxSu~uCJ~EJ zCQs#|@W_+nJB`2Oq%a=?dHF8y1OC-PUhO^S&wu@If%F(<9?ZulQ2>0X7UOte6MDD; z*qlKJv%GmV2rZs~pdU|Bq?cjA|B=-MtRP{R(Otvo#}gF(hxT|%S}s6=$1$wy!Q@*r z(J-W4Zo!`EnIn7k?H{UvSGR0dm-h2H)sv={X1AZA9QX-rO+gvlq?c!Ljw0Acq^qbg z;AU1z>o056_d-;qk+k;pFO(mrZK!14*f;KQP1K_m#lLYSu6(E#0 z@j{R6GgUkADj6q1>g)2ZbI6U*Ma-#>mZYb2(>tM_&|TV@AC8gz;TG5|5Br2w=oSj3 zp#C`s+umT1_$i*nr!gt}QBnp9x18c#3USeWSoC-V{4*TjaE^~su^df&FH7ObKVa>B zI;YPL4j-pv)4hu-g;T8SCs6qVbuAV|F#Zvs*p^rsM2Up7FvBp4`hhL{jJQ>4-XcC4}0-mCvjbN(qubvmX$osV6ZmdJ6=*s1J_ z2Ef>z3<5vu`=tfRZTfIFPx2Q7yrqf9$YvY@qcKUPs=W{}BcnLl&smjBWd2oFdI+mm*)%X_7hZq*jLgAaEofQ4Cvis8awEufHyAfScVN7haA-FT-UKt`-+kui=XY|F_`(O8npI z-MjDHU-~Vi`v31V{U1bWb{V9Z zJD$E?`VSblb+@qp?`>|ZE#&_wlm3w z%lGj~?GFFXdBk$uz?ooR2$ovMULQW>P1_M|f&((U)5HRGc~x(1lh?+`n*t>CWMZEm zvbPU?@}n7((?7~IVc>zZ%93xE!*`vZF$gE_p@#`TLYIm0R2djZImgSW!}y0v^zD_E z%gamGqt3ciHPyXfC?x(xgiwv6PFx;B6hn3kcPpio|Zli z#sk3{;01_MH5yQ-Gn}9kU#EkU94DFM_0l+m#q99!HmomR`ovM&87D!ML4}AM(b{PA zhhRHlkok#+uB`$iou=w5;E;Ulrx)rgp4aMooJv<%Qxyh1msMA&kb%*ss$*y=>t+43 zw)3HnZhVNT54cR*`HXZDa0m>8(@ElS|DKNd^ZhsueJ?Vbar&A9iu-_KgxHEMg{4`DWgD9AdUX6lE-wyafaTdUphvCB`} z{38no&JKU=bofmNo;9UvRm~JC9G}>4zPR+0Yzi-O?IHd()*9PRWBrRp8~(+w8<$_K z;g1dcvFTr~7b84`uO8&FuW+%zQ7m# z;b{*`_3+2V=~;w7BK*-i`+S5yM))K8{Jf!Szo~7n0-pO*@&ut{**J{bCW&mD z$a-Qj491y1gJ}?sZ%4kk39u$X)@-=Yz4ca2mkWkY=tqikaCUZ_^=)gEi4UA!Bw&tL zPgGmSYbQCBVj<^k2U>!Eby;0)-5SV+7X~PM%ZO%;rrgW?r|U<^Pc|FDAo3cm7BRmv z{2%D?+l4BJ_yI7ZzJB3h1P>qiti(q~eGEccv)5?;aOcIW)iq#!w-0_p7Ss(bl35eQ3L?G0%y_J3z)t$GT z5*!OmmP~E9f+;uc6eCLEDGiGT??+|mYA#(6nws-_SDa-KzVW`ZIk1a~*#9ZIx9ufK zoRk~IAT&WV@oTgAdewx954|8uznFL#$~#4D00DUtX0|{u!b?|tvmpCGRVFMW{e?7@H5G`zjGebOq?Q3hi!Cy12sX*eC971xp;re#hB zS%%|D<9GfpP#XC7d;IbD`Qsn($A85i|22L5{@DiwMgQQp8S4K)AH9G5pKx2h$xr`A2~MB8{YU?V3jE^V zrjP&o-{(&Jhy3wZxZD4*RCz$1pyvA_30VAZKo$NC1N+nej=S)mGO%(Ne3`lbmYd6Td$|L^;kNA)H<)8e^QgcHY@qfWX{hM6wZG}VDo0swT{$nolk4n%#=ZX2n z-(p1i+dPl|3&Z*kO2yB4Am=m?`Zw%zga4d9{`{Z(mil>8Ar{Lx7*&3sSNnH=qf~T6 zMVZH=e-r*U;qm`7-Y0+dPyZ^<+5f@d{&5LTL~usTrBhpfxl|^mGOOHcUd})KzZmY{ z;gA257m5e=uXwiq>|gv<`TXmQQL^=U;(q6U;~iYyJY&H_MwnmxI#=fQ{^)<_%73R+ z>kI1RDfi>QVLaqr@uy5={^0MH>LlFKA8-?Y{F^dmT>JNB%F5W5akGXIp@{KdZ~edW#id%U-Qw~V_N zg1fx!{*Y^5{Oi9`DtJlrcX7esd8z(Xw)NjGmA(?N+_yjBCB3QuJC!MB6!=3f_zOnP zKlvYdG0QXjTx#)_{9T@i-{tKi5C80+{{6;@A=Fgz6c(Fsncjv^C^Ht#VvXg?wDtB{ z1y^txL`5!RJ9zstH9DmJK8J#kIT(4}T=t7Ic~Z?BzbyO`?EcM| z@3|Nl%a!2EEaU1|M!$Kzk62TYPI}Fx(R5p%t-Xy(hQ?>e*O+Zux}QkNyD|V2cSvnw z)R@=D=$7*bgvnln$sQEmhjbs&CUaKf}dz@so>PwtJ8H_F+$LXuwe5F&UI5Tg< zpnp)*{CvfYh%m3+it9IE)#iIhc#Mt9q>J7Vm;EF8RO6?EoYOc7dRmI`CNu0Oj{uiTy4J(=4POBa00&b)8b zePtcWwVAi<%}1)@tLus(QrxyPdDU0eom@`1WoPzP#aGr9&FbE=Cr_o`E9;2CGv2Z* z2fF5~?2P8vZr>YK^_6ue=X7q_nL}0am375tFmBnMBeU`=>ymN2-?BfSV$Ef&d7I8y zl9jq1mAhNCx6V>D=xsL87PoQR9(f673n+I7pcPocdGqvDn|h;dE#IOsm~wol79U=| zqWPWIzN@V&TF1cPzpAm@P0k*yzN>zX1J(wo^XFa{19rdBk4FuXfZkLm4ZWP|D)zzL zl6QnA6bvPxMD0hG1#r_aP2V|6CVop9@kS|`af|tIvt&@Ljd}?-a?seCPto;&DQ3gs z<{<9xG#a@;v9xqZG55BYmf(9{cV}s7>0PuUes9SrYi1yT3J(rHW%mKHQs!(CcwSP3 zexRuXv|X0K{g)Ut9}|!y-esG#Z%>}R1&@O@>6lDf`Af9QdbL7|wsL!64PTQzm1nQ34+VyeqC*mjgX z%8nS8H?>TqOto%-AcP!Jk%BkQ!I6jB`2XRPLoFo@95qkq{<+_d0dj48-CU=81}IN#dw@n zJ-1M?s(@f;)vId|wsF#GeH#W=*j+TNoDMsWq5n>bIiN0m=W}#q!PsZ$enR?>- zNTUWS`KLFWInsn7-BN?V^RTG#tGn(>9glcpyk-5A1%^#6=k?j4k}4@xKj9OtM{(|y zS5uBD;@CuW0*NY*&pFdxp&jL`M8%7PG1u$|`O-rjS})^u>-J*=_<4~EL%+)HZZ=sf z*!QNLEbb5;uTZ*K;K;Gif?v|ysBqv)Y<*`z}4gEeTU&_pt5MlR6w({v{>=qeH1! z--iWxS;%E*q}Rm2G@V@TgnI77pr0L3SOE=Y#&}=~OaRK9G&e#mF7oVKm10SSJk{_m zavTgPFCS)E&=Pb?-h-I2(Ffj#Xtat>&AFCl&{pF98+JFVG4&>$ufDa+CH)-awR2Uh zuv2{EhRF1fn~kLc;tWt2f%1k6U!iJ6c~`SRt*Vh?^HfZJm#zkKjHDN3p<^a*KUA6OkJobn^rO z4?kS|r`c-HF3s&lXewtkJ*PqkgdeTLDGYy3HQ6~JkuEjfuB`kvyqN<)ElEd1Dok{# z>Wdj3qUO!UWDHcMAeZuOf6LXCP{dVkuoZ=Y2z$xt1%FGk0ePA7*Lae(p>Z5wr_=g2 z1;$v!e_6zTsfhpe&c@wE{MYYv{1-p%Pdb##`zo6Num0SB=}0iw#eZMByIIWtzPY)` z|Nds;zc_;=1}<~p>>fypWIRndWWvvZd=l^&5{7)tklJe;*ivK$Q{NF0ae_iB%dqd~HT4*vR zfFnNfF%`(5?F3ossA!d5h?!Hc#3;U?fT!C|MGQ~A)nD->gGq+~cR2egKv__f#ra=( z{%@4e|Fy;W|3=RLdsXNE#>VEo#b*6ZpZ_|Z@X9OM|F_Hkac^yFZISAxT$AvlR64+?S00SDu4G_4*gHIOcAxD#@5*Wp;(qF? zEM)O$OW*5upugP`(Pn z6bgqIqi?CR+egD{cD_vgQ_9QUcDmgU_l~+*PdcvjfphLz-=f{)Z{Fd%L<2clU$7SM;rSTwE58s~xn(aU3$5*4!^)sLj z?p{c-jgH{ED*4mLkBWKv)GLs2D#RZ3_7G@AbgJ5zBNbx1T_8f}sLW9I@Q1Eqz^s9k1{;ecH1^l8 z?^;`liq+YRtPZOe`Tb1&e87vTe)8_sg+Dqvdd9VDCpDl}g8O|+8;PilN7aPb97zb- zPicywENtNpZs|C|%WmlMr5}cF?cv@ByPrHd>U;!y5k<-{2C8rtr&(RUdiL~yUfo~4 z|4#n&@WDrWkN5C7U6sQQAs;rt_Rc`XSW#YVKOzK!pW4?g@-I8X<`Qgu*!4?G=a=}+ z^m)TLO5`MnUX+5pZWLb{u9g=-Uv``_lsp`j*v)HLf)$9|%yU3~7mmDbxD z$a3DLQW_uVNzM34gR9Ae5b|{T059;*Vm0#NKli80 z7nnE(o&^aLZia@ZwCC^&Gln3V2?8+5CoItIFym1Lbco46UG_y>TH3p!U@}Wf+uMdO zdJbmC`7+ORRTyDoG~FS{4QqskEAo^0k{$bF%zi`%WNL>T$m<;gxW)-4V`(r@?$0)~ z>5ZIxHn*K!nFykXz(e8JIt-ILQ&;1}Jq=t5?j)yv=w~1tAdI?mMmhoxim;tc$G!!< z+l7yA*K9oRBsOl$4y>N+K|S3xy~Rm4+cJT5yZB2Q!?TBi^57&7WR@`iz9Nw>Za+2q z?jdqVK99*jHlBV87r+1jb1aB1^(!?4s2PhOWuX5jn3IQp;h8k(P(6j~6#PP3Jrn16 z?pTiD^mzmYiC01|Z9wSt&H#RA0PpBMxj>Qp(mYn{S3agPHuvM#JAc(7usaH71(K(TWL4883pxk4 zG=Odw0RYEkfZ%dGp9;;LUD+VgS80Oxmq1Psw7oCX;tCb4|EeSE$@*LA4$xBPEvE_H zq!>vPzonv9%WoEu7+LUaJET|zSsd|eB8q+ra?T}8a^y?2uFjL#K3tEGP0iEqDzXYo z!mXgumOo(1xlJ&(yK?AuQMypiirk=k=qDE-67W#DaTT`&r9M1K2(BR9KE_+3F9YO8ydiMmH<}6@5Di48lHAf& zTo>wi-U}A6c}2Zb47^w%mT9W9GJleUd&EEwP)Ba!1WrB`8F?7c1Z0_IX0-=`>#~jZ zfsciyf%)p;Zi-Tn^bm<)r4Ao{ygW{V3#9f$dbPABf|g9kV=tOeY@RIf`sYX&F3)_D zY^5cTg8W>X0^ogsj$zz_AqcVO+9G;yiMfC9q9L@;r)owRmML;s301}}Drl{|U99JkMYa1|$gCzsL z9fjmJ#%RJuM=-0w82bm)N%SQkM1T6RELs5`<0-EcfFsnW{U$_E7ib1iKb(;0-}90C zriu9i<>7!fT#z_QVkcev?l^dhDkbPcn!)kXHadf601Q~Ov<~7J%_1k4IipY(6z2~qoiTFguXH^< z55^sCmclw}k~D(@umw!@)SwxSx6lmut+av17oI;DD#+Y+O_Y{ez#J5tZt0T%(VL^) z=rz&Xo}O7tD6g1eOR#mAI4?|Ny(eUc&L5jO3a{t%8!e2P3F|RzApcQ(O)qk0hO0mg zvmBSXrnVx(9MlA*A(izW5Mc*H4w_RXaR&KUCxuOWCgCWp%&#{T!dX zCe=RkE{KII2Vw*87VG#DBbLG1xe0Xn7|&4y2>|`@1z;|{$@c^7#3g#Pq_{S(u=fmw zrjMsV&j)g8WDDk~bV25tjm^MPYH1Fh%J^;e#H|`y6=|8h@Hc^5F~!`}Y%(UPY_6Gj zdL%)5Z$I&!uXpB?*E{tyCtYGWT{HEgIPV;B@2NfY`}v_BM|_gnbDYWr4Ia|!zY4suArTP-mO<}r~t(>CZ)r|b# zdVO&w&wPu&IrCjvW6V6gx>lepv~U$uf%w>l%5%vQRu&bVjhjswLkHF`$Lfc8r{ZOJ znHtLlBI0z+GlV=qC59_z)PPC!-pjEgW62BfLtpx_gc14vAXQQWBETe4x8wl9R32zW z3-nEF@RT4_7+km8K#c-$CIJRpB>(;t??II4t$3AgSC0-F(3%mm)m-xcq>jW2Cr+d? zF{>z*!Zr@FMw&lrvqHY2XDr6`K=epOCM-5*DV0R)DPq_)8@Ga(z-SBtA|i3V$*d(a z$H7D8Va%FjJ`eEpfORCk(vQ*r1wqmZ=v9TmU|W2!Lm$$Kx_g$^b7E*ONMOxqRS$4m z@|fbtXVQa|$0j^8<~g5Z29P+<{Uj!iLMiv$8GTZ-Lz9K(6>>;rXkrirDfEyR4lO&F zbO1F5X%YH?_mR4zDcY38lhZRH@_QD&d6PEpFMzS=P1!s{uUq!~}OVuTV38Z`SwPt49RaRJX8`=bF+s;W&f$!?O z@HC!e#yuXAwqY^*OWy@1rCDD|S<{#nqWcQNu(__EjzLJtN+fb<3$=2WX%bG&o8T*q z)yYiS?AuM9NkeHhtJSH5JD-)-Navh6^HP27RuY1rh;GG)?7aF)cENP7VFJV55GqI3nxlC6dZZ|at+Q2W%uLXh3+Fwf8*WMd8N z^`a>%q_lS3>VR7T;4yAcsVyVJzPZjJ#-gX+=>#}1^deWbGG!=@5BH8_tE`|ccEhd6 zWIcl&IZ$24^T8i%7cLm;tyy^iC1IY%%o&KNYg^n3_j@1cvTsgc?W;9$9p^KH`^j-n zBk1gusVD!oO z7OTIjcjPQy^t!Dv5ByAuZ?r4ujR=n6-t%k>ay7;L9&%Fk+2A4+J@kAYYRL!hZG1FE zNMa!PuMU^Bj;#`vG|ilYPP2LJ$}Z|{%FDFv9QtHdSiTXg+YI__>LrZ2F#&R-)C}&O z40uEny<=PBKs!LZc1)Wd%&(K=kIZAn}N0|_FZuG>&3Hra-ExtaI2 zS61HDeR+@5BmMAQnC)cx9+w7btRsN8O;gyw&xT|On+*H-9~N-4E6E>vi0r$H?4d24 zw(qa5uC911y_Mb%f#L?~&RGx+JmhQ@6UMd@h2C;!o$VbC7Lx0#^en`yS}kdx%#kHa58|HKW3>zkS=FLfb>wlC(Ut+4I!UrPe&dWA zCD^%nm7t38BG2_5e5cEyVTJ)wS)_LGS+d z{kz`AHhK{7Kli+G0R;XEgHYUH@rc8e{^@fej{(=E`a9hk;)V&~9Nr`4#+%_cuLwb2D!N@C3eu-MT*IHC@bFzvW2p0(86C|5qQ+Xi2bu}K?wIA z9mnz#<}{upK)QQ=7~}mUDP;31v;*}|Qj4&yJ-HNUJtW#7;l`7T-)@(>uMNLp0P-CG zuxY-yB;Z!%ad*l7+IL0Ah-4vUwSoX0k{L-}+Dnkaq40v{S5*?G_Tl4`tYJ6}TK7e*QEm&0YE z7}d4qBC5}GipWUJBK%195I?N5_DxxWVD}`E5?M}oDe4l!sWbAuh?KTiqHWC;Z$&mI zpsIi%DAWvS`nixs8l?fOFH6fHEDiczGT;WqqGggw?Oseb_Os^}AISzBqWucuV#wp* zt4REXDYe?s1(R@y7U@wReSgT}DnSzy*uQ|}NuZKiv6T}0j0`li6bF;U<0Qb4v^r2UIb+3h!&NpAF8>F&9%NVxt678KX*ns735xg@Dj}|>u(AB`dR1;Dl z87Z2v-~#x{j)zT@m~wsDpCk!7;Xwyp@MfxYbBa>Y%$5=s zFwwRMx|`ZMLFonaP4a`NYMHSk+SM|zRdi)dH#KR}^c6Wts%f@LbHZ)XSA7vxY7`GK zyHTl23>(d#2^iXBu<+$JK&f64q@WP$O3OB%=wad>kZVcTG$>~sf$Z7NrJXItx$K>BRXE8##hGl5DuxoQ-v_s#QEvtJ{;wMMQeZ#)PRWwZtlhPm%PX?%!v|01Y}#AK$-xt@sqlnQsg=yU8q(CW7l}bT<2+`-3Og* zJeIb*GK&l_zwwO4z?%bxlkM5EF*W|6qSNdT+?R_!b!xzZiH3>q4g4$g-wiV0;F>xY zCchF^3-N~;Yh~*yXKt~)B0nzr9URp6F%1>LS_3v8H5?Lns> zD@$mD5n3s7E)3C3HHte+kCNt!6zli{Mh}p8+u4iA8n#KI9~KqU8>h+Ejn3iWBZs)c zq1InRDFSV5Nz0W(!R~e?y>wx~GtYbF8J#mmx8eYD3Y_x-FT(+p*t2Fl<_NrP=XEd# zU#-1LzJXh#ZAMOK=9Xlmdd=7~?cwZ=kvP^95wZx7*`k20Zj-P2%tpl%>*ZV3_B+%9 zUR>i;#1W7bu@@IvO?dq+cm3_MYtgI@tBXWl7Xg9lVayw;UMhJ5+MTe)yQN4~WYYBD zR)&6NPx7{A&=+-u$uvfO>3v~$&Z027Vl`ks5{`J`6qpLvd2?TxRjQ$~=M`|LkHqDR z_KpPob00uC-~e^Qi+|q zmz}O}tZ!_td)~(8#`@+B+hL}Xx98kuxQNo_4mx~k6icJ@ldN1@KdrY~fjn-^~51h1Z)MZP?d$bHi+a-giBM+dI zF@+|%R=WIEU8-*0?!GWUcK`Vy48XoeY!%j!b>n75V(#*4c+*&@M0ZN72sv)y`WhfXNU29Yd>LzBsmRUhHA2$H?#0ivv_=h+RcJuBt*R z*Ft%Erg6Veo{WT#DiF^&LaG|dt$OTg`uU6o(afGHeMg-#g>~nrQ2p4>FMf!AwW2!J z!3mhZ7AoK>TP5-=H@8N;FFyECg&QNekiQ-`_-&pq{g^3EHPWBhx9Wx91Oieuc+#%u zo?&zkL)KLb=H@^cKlHP-7+}E&&Y-W*yIrAv<<{8sP=PW)w8_3Aw;HXOm>$Sa^Ct$_0;V}87Qo^0p0mnb1Egp9dh935O5)J0 z6K@nY8APQ%oIlh2C?$&=DN`}EAIav^;kxkZ!{mm&g3&B#L(+6IVwHAcv1K`LfLfm_ z=2RIo=YbY<T!ULES>QMC<^K)p{7^s8{ zqFCoEw||YDZ1rlN%yo|3i_%Hr=Rpw=I&agE;`@%gEb|AICbKN+Q#ha$uVrbu4BPJbEa(NCtFe*{@i2{-GsM^1im-ER-0hvo9l!uPx=d98mpt^Eb&Q?| zm_ZWz%9^|O*=NaTpG8P7>L^XDpo!T^7O#wfONP(-JXjx*W|jy}4yM@`4!h6n^*jK( zeKhl3-jh&(+Y%rln+mwObxpLzUgTZqGrrHO{nKSe$mRWLJjs?HqkA?6mh-(4bmRuj zmx`FD3l_!Q%Qg5zHiWzTL1+KT-ceh9My(yjzO)VF-Ou?uWung-mM*pZ&5p3p1Rv0%;J_dg1XTFI4 zh+Z9u>^RFj$u?nHS|amCoA5mI6Qs7tm^|Ejw0E?J+gt9zy)3`@7UQ1)PJbuzg>q>_Ag7nbrF1)S~X} zFjryHz3m)`b1kaQOEHji&?68z?bEr!oklgIeH?7yUZm{h`(y(n!KctaBu8~^rlS9r z%ni0=w5Igg`CB}_N}I%}A$n}HLP6{N)$VRu#kQ(1YF_@brqn>y&CHGN!EVup1~R)H z!oBTz7_4qLaLY{Cgq&+xi)~`B-3e)-stcw~v(@-=SB4KziWg{jL zN%;qyp(*-Tmi4V-br8rG*a)vAFQx7il45K+MNT>d{*{|`?7%} zXl$d>-^(W>;qY~Gr|!BHdgF!+80sE38xoXh8ASin?5xpt8f*9NZ#Aw_I6KV-$i^V1 zr&!~IBxnO=cb)kcn77Z<_%iF3VKe~)||)Q6yvb3J8N6p zcQ>|Iw{AEmYF!Y85gw9@m8((ss}x!cPO=>leNU>En9&$kxbgJkMpXgEV<@n`y82=U zK1Oh!Uj-=gWW-qmF5Yp9guhU?`wN%QBt^oL9x{Fn1|@;Nh>u5fdP6EVmtP28u*;#+jzX$Y{;ADuh+NMSMM(v?AO6yZ>(-_-2LV=*o1?xkh?D9^sQNI3L?P7 zQkm*ljpU{g$0xO48ipLt-IwFWF`G#~X7%munItN{dGUTNd z*fxKE9Y;_1Gv6SV9*4f*>3?Z?dWt>-qvu1bf$lhiaU2laBVmY$i=a5}NxDK_G``_! z$(|oZ0lFhY=0mJZoQXJ#PmovVBum^oLS-ZtHIpYnn{w!;MU;)9?hD41x9yN*RSZXu`CO*Y9Us= zDG}%E5Z_*_Sj9~+oAFE+kcb?UG^c;K->Dpt3hmZzGeu}!nm41WGR;)mo03}cNvPH+^EXWoIH}Wh((u}gO1yq$;_y7tcl!-* zsc(>|eS6`VIN)!p^h_)FM#N{Cfl3LQ#ikw9Gt`T+GEUV_y&5Ouk^^+f=RlN6 zFUTm|jpec^=Y9qIdPB*X0|cT?r+~!B-d0pC4M;?3mF8-e_`JAbT8KiN?0}Zi@UxY* zm8560IeJy`nSCrjmrL%{aRy#kek{#>K_hH&DD#=UkZ`l2Z=Ddw&g5!sgb! z_4S36@am<6d)w=q+iUN9^RLS^W|m}xB5r<5F3{}l^@^_3uIK+>Dc4>QCf-VmqJ%zp z-%8t#Ay>>8gi7fvrf^x(G`iaoIRwF6XHuuIi2&W~0`kiSw+`qj-MCpjgS44K$_*k!k9j2$svTemcW#`3?%Pml#hw(JE{^9#s=b5GIb0 zh{6QAaQfWQ0dyos7Oxvc4US?Y%mF13@EZx|9>Z{`6s@=bW=47&UhvxN04zAnTV>sO zh0|3C1N4oZte19ezvHk^J0%MtiAOM(a^}RAVndArcMFCbF97n0f|4_-7pB%U-gp?Z zyw{T8H{u{te+ayqV-g(b>S3VlU4ZrS`h z&QBjdVm1I&K&!va9m07)2SMFkk@p|_)1u$98S|;GV*}JFHUQPBOt6fpc=a{q%cWzw zO|l$hvW(n|m1E|7^{8i$jN^^qLuv|zx3>gPh;R7ZzV)!RC{ zdQf@uTnQxcF`?jvF9*~Yy03wlw{bKX%e+fRmN5+7@<{7RktuAXO6Oe>ciY*GC~QYB z7z}*k;V?S7SP2xmi$oIUrB=GSw{vG;v>c4M?`J@PFf=5Lk222aici$dLC>d58z7Bq zb3T>z$SD4DIg92frq!h5Wa-7HXv(k3Zig_lohu<9#K7xDyg)-Mi9%D>CcTkBCjywg zx<*=&A4cx zZu^=gYM8}{x@)TLr+p7EEij*D1)(&+plp$G#$i6?0)vVKb{ke4q?JZ>kwU;}@9kh6RIcHS}dX2XR2xTAaI#2QFy#)4(W7Zo;o|~SR zrG`7^@e2K+sL*H#j+7rdhWNofGZWEJ69$aNazh7MrrRlN>Z8;}P@*JefjV_H)UxKd zA{AFIfiNq4TMUaO?q{AfX;|t6#}iaf4J&A=suEa~homZEey@U}yK)dfc-~6+{}h8M z=8$h5f0$#NdrdKO*oBEifRbEN9Vyr46if0@VRjyak|lzr#j}BMVk#h&m`8`BgrUL$ zPd`yl3KUm`E3W{;_80R!7Z$k-oLl8CxW%>mn+ezdm4fttQ_>+wRR5z{603Rrud~R~ zn^ZD+@Q9QFE1oThouJB0{}TSym41%9cM3cShi|9M7aUUKC`)wWg1NL@KU4-_Ul zt5duu35M3)j>c<08DaiB8xxJDN*PSF_=Qm+1Jw2g&#MlV*PCOY(k8@Em-Z!&wr1xG zaq*p>UPePHB;ZKrgCMJo*EioQPn;}gA%Q)g-MtJ+j7qnkjR?Sq`oz9 z-b#g|v{lM9{-^^^kNjvF8KC`SIn9ozQZuKb#6hxI9#RI)_9#`vt^4aw{nJMhtPkyjIN3D zl)`iC%Nx8Of~(Z6nQd7L!b1itt2% zP&0uiPtI#l!})Tm6@PyUr_cV=Ccma_m!A*1!6M2QfVFeHt=*~J$xU~WX-|g8ITC{* z<|4A<>aYpDsZXj|%GJqt79gl#jA=Z8?l35owv`j6D*XACe3lxDLNp9JPIB)>Igp)M z@8nqs@R-(eeV)}=`}S_rNN_?eV_mgZo5ZQft)~h=-=Z3-=$G^>w?uL%`FmSGm5umA z2hAAq4ZdzIo#Z8OIeutXdr|C^j9vE%k(~@hCAp#Mk(A53BqW70$mb0TEvfG4{C>h) zOdONV5m+beMjsC;CY+JO=<(5wWvw_hK*7ElX;3ahJ&jCaGH5nTNYzBNkSx; zls&|SA2N2TOnKZNBuLNl^+yFTUBp%7f@i%=i)Rt2aR5z(P54iSNUaPytV1rgOkb!l zm6cpPc@>KGjO)*!IO~q_8lTh*tyANN4fpdH7}2I#hztph2jaxU+Ftu9vjc_7Dj^1` zV0t(=ct?wCn~|ny|JlVBMtuOhO;yfS?6{>qK5nqB61{-sk;f;E*0vfqejKlDFRz^_ zC^TZ7QAx&crWdMN>Mq^uS<8fr`ynkUbh|1Wn)v0Y9W4no&3xIUq4o#3AH7i!O8%Az zU{i#yMw5@KF z8`QHY)Q=i6fy+UZJ8eM`IZnBcC?F}rzQiAgbi0`0ajh&qh#f=jizXkRn7Lb(Y-=(l zLvpj$eKK<9mO-Rvl!$<`ve7KyMPbb_g_I?4b^#~R-9cu*L;evhXZbyS#C0T>Pc6@k zK$Q^rmD3h^v7P&t^ElEZcJQLpBAUwiq~d}M6OZp!Qb{=4;zP*DYE;2Z;8AQ0WZ80V z60Sfkz4WAwqZegDxBKDV5&L(bYbAc8S>>pqRs@&jT$hpOieYbjzIB)?b*QBtX&PrC zsvC}*4d`=YTc|xH2t1){T%#p6z1~&+`-RNk#0)64i=Gqh>_lXNYZ@nxV89^HH`i#W zM%jU-u)wSvzvb*R(<9mwQYRNXPm?3O5%Dff#T2ZsuHxixu5Q|s!7P(BGX=zF8(Fo4Yu>Y8&O$qO*9v+G%igRy`3BJaayYUQYYj7fh-_4zTf;aLind`&y`F@;Ejt^f+%=i=A zR;OA!UK|V0B@87GR91GOHm_}9%2LCA&5m1x;yUUJKy=OWAXeJFT3>wOob%;dGT_X4 z(r5vkj#9;T>?9Eb;T;s>#;{?zgt0*|sTB-N?C^r5B1#rA6Ur{GFn4NdO34MyWJ(6% z117Vd1iccS2UO1eYZL`Tq$r4MX|B0w-7>{tg&&&jdu9}rVHM1}Nvtz$B#ldZ*ZGMr zj2&`a(S#VAfe#}}`~sMKx!GD!N!%p4@}v_zwk}*u8%1T(!PS7i_I%>zNQ~v{I239s zY?AQbw@q6E5CGvpNt(A!B`9fqg*y35tA*SZOv1evJk|`KuaaGMr75j;NFxH5tKQ1- z*l$e%3*j#pWENsw+tgrs+z@i>YtU^;|qaeNdG$|Qhx z_#Xwl5P4888Eg@kkxu9c$ua++_FPHJ>veuCgtVGn`I+AHzNB%?SW_#TNKy&xX%%~eV85t@A&WJKQJH^&2`@$Ezo97+-=!PZs}mGjK=!gr2Q#&+;wQmqc}Q z&|>R1ebBygu3aOy0=1Ptj%wt{# z`|1wOvJRxwWq~rY(>D-1@Jzgg&{2#f@ztaeI~tx@Xx34lhp#IJt$X!{xpbvKTMcD0 z5pge7~%wj7pBS|}6t*Ca-WC$;uUR5#-K;_R39;3>IeizadgR#nx569Z

B_>^oFT?&2lOBL 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

yF70! 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

rtaC(Ws!&0egEUDd~Wz#YCyCEuVO? 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Μ=X| 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

XnaLUUu0ZM+SNp72A_s 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�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Ν-alo< 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�aIM6|{bw;5(wq=tC01K9 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 z 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

wHYM$M4U>Nm@e>j_W7eKaqUi;|(6X4)g}8dS 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�ST2(&N8LQ1dna6;T#NC=L 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≤Oex`@ap5`uoLUBfohoizNd3E;Pw{o**AJ&QBM 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%0A=))^&IGi8VhZo$|u;3`@4%Awx7$=C?@pUfnF z5JuH%7sy&UJl^a>zTPZ$Q`)CY<=fPbm|K5MS8Xa6%G0G9DA(61v*z7PYE%VJ&Bh5D z7lby+=LfvQH;&rTZs;j06wC# zEc|lm)T;erDCS}gi(BbfoILwva{UiPjzfQjB(YaJB$;c2ayR$FRP|i3qIhm(1U%~S zXe%{1vqNM}nlU*SN$tNiNvbk-VU);|(CESkUWHufgjp*%hfJi_#q*eHWMH*%G2-*4 z+2cu5qd+ooHwX9&j>j~9jBah;)_iU-T8v8TVO$`n{eS^A6+f4v=HqraSI5kb$UXxF zD`%|+q3Z|Yg58`Q=`^RO-;vz?-W@K-RG_5VdAV;PCdwCbpt(rqp!NBu9n@URtXh?r zk}r~GJa?eOlI85ibbnVH?DMz=0TA8XFU$6QN!~RV#c^M0Tty(>9vP_sEwb$zjTf=Zgul;+*EMPBi`1khT@{!84}S*KX6=EtiYuulqE~Y^1NjCR1;P!pUixD^Yvt(=)~@( z-iplrKeqyDw*ogMNkz1+y8XG(s~mNi*OTfIcC6rDx^>^pxDZguw9oJqb(!Jg4MK4u z{TPqS6R!-WCucK2UEE03w}Zj`7}Zm|(+{d%5@iH}>ZE5%QgGb|Cd+r7e=v=T9{CWt z6t8j+b)C@^0`O5rw3aV5jcU9sMy^6Gh61-5(&}#;j2YSuUGS2Ik3AuPyVeEaC$`$n zekeXH)?U0-!l`e?L5SbfTsi zu%St!-wiyWqHjPvU3K|;x@jT^GV(PVI4X0$NR;V@?7K;HlCpuXX#`KFG*L6!4^C+~ z^K8-SV8}c0z-GSl^bAUR><)pcMna8VQ}LTThYDzS-ca?J%qx#bWv`6VplCrpplLx! zXd`nPN&X#8S$SnP3hMl|&|wutMJth9eZ>Nmq?*wO*VvZ@6>i`8hVV;Bx{Pl z(=FKtk&)}>aFsZN``jE z=vD42t?#`KJ({nG3?G_)HcSNDI4&Z%Il$|59nwsi{ z%uzzn?DymS9MPt^$OU0J9rKhT;}IHQT<|##cf&-@IVJ^0qQ*#rEQzrRh z&I(l}`yckR`rtPeF0c{ihu+qASj@jGbWk=RyQ4osfn)=qfRn4XX^IQUD_T@yRFvHk z=Gak(n^ynhrkoSUC;98xkm^}nI1;`)p^o7~;7|u*+;Rvfkz-op^hDB)GSn%W`X&d7 z_GQh@b?cF=H~r_`xi_xY>|k8b7Oec!Xuapf`1>iQ98hL6ZOtJ*Be@Smwn3O(~mXmzbPu{VS6m1fdN&f+W5^O0eE$9}zw`o*r$Vr}<1G(wRkTC~3^ zvX>*Ri?c~7QLozqSZDg_;Mb-fOK@MnCe4983EHUD$>};aLbK3p(cZ3?w9S^llS$4m zk({-IFUz2 z;paz_WQ`*{^b1_3fjUV^1?sv$libPpg9#d{vlE*EvK*|chfMO&mA*G4)Lo$xtLN9; ze{i>GrleWoCJ4A0iFaE>Jr15Uu6R6Qdrun%Od0?(h$+Bf9b$(BB!;WGTm&WFiNjx) z2JnWViDXd`I%ABPGB*L9eu0lftPeLrEzOdro8dgN5pJ_2zRa?jy1VjYAWq`J@B<7& zY~ISHwh?tv(}HC_sX2riH6|vF;9BwN5IDf8H&v&G_8-V>?uGGByc&afnt#q;}VAlfZj zG{XobJGTltc*$dS>iEA|-uv1wCP;=v=RtWWs>P1wUe=tDllJ`lmAZJE4D@% zXYcv^7m7Ezx21HZ?sL|WI7zz@Ea1s%3e1vTw>vR-=sHBHPAM_8uUt3VEgf96Qgc@( zQw2ZJ)_ML+hu6(77pRUXYL-Aw`Tnx_gfSI!C98F)Z1&u#fhCcUs-&u*gI1 z{(IO!X{);v|A`uP&#ZaLnh<+m_k~%M#BN#(bZm-tw$Ly0Ij0i>Rp{^d6vD2QgJK6x z32l6Y%Cvq7;R4|15}i^Ww~VAUC6G=mwP9W2zXy98H|YMZiFafGz?+DX}w6|~79 zB~P6;j67*gllDH3{n=y2ueu;a*Yf|+9Ho-2wcM8)P`Kh zlm#V(AhfFb6Z45S=t5i7XE$Vzd2aLh@MrzKvl(ZNThjG}wB7AZsv&1Q>=bPnR8LJZ z{{G~8&ua)x_lBe>{xN79<-ii3KT9w~a1-H27hc`EME5iieR z@$GsW61C3VO{+|9M=!->e=Jz;GuS6C#F98uSa%q7sd%P;DH{PbPMZ9blHEqZ6lQyD zZ9h9|*GzN*JGwebG;WNuDo!h?;bD5zdqq2Xqu1i5iV61Ij@k0jGjl+v*w{mjw?n}- zQt@Jl9e$h4MwvV|#<$Iu=?v@7(p;vRj|OF8nI+yzo>24W&`NfrcZ}a18b9jQS~9!) zjx?hj<;lewKKApWelKpK7jATc&vqODl`=R+Z8&fL`^OPIk`S)bYC6R9T;%%VgS6Z6 z98({j#Lm@Uhrd0SlNWnQPXvs+rzl1Qd1k_Wo=r~b+;FUOyVh=RxAp+od0{;FWv$~R%1Zh|*<^UDbp@dSP- zTRRZ>B959GZz7hY(#FZO5-~~u3z^e!o>Qm0rLf6{k=dN zKV3%XWantNYD9?L?yJ?9VQgh+eJ4svi@`X zh}J|Z?b~Q*%pA~%(YyCI>yDD4#!!SM97Kx&#-?EQcf%O&v1+!dR{2RBss**|I^~G* zZl4cEXDw?ks1Nu#t1M+U4Ms$WZPs#tFpSop-KF5<%sWsvW4-;em_5zUmO9!I1??_J zAH!tpg$SJGI_d{}Gi@)-6-OeI#PXqENI&I15%M>j?eiWs&%UO>rP$IstW|ia$p7G2 zql<}m>WSz!+A6qU2%{hC*icj6s9Z<0xy?-<8!UK|vN>N5R%FasAWF{!;ta}u7$X&k zMavLGNS6N_Q_wE@^#^%Qa73-ip9K1;rR!n_O`%?&^Az8ilYT};zs%a;_$F#2c5a77 zf1hVcKWvGKoI)@GIY$?>!lANZwHb{84SHxb_yv0S_(S^y+ykp?Th3j)Uhp({>`BX% znVT|?3wnOYX5|5Vzc`CfDp)4E%I*2QhBDlgPI-XztXvvT_Qi*ScUSCTwe?cR zcx6lKDjWQw(M#$DI6Y{_^{$Wy6SyKs_px1pG#D(@0;RY5mt{jn|d z57S6fZ_WH#q$o*`S&hMyKumB}XO1}O-|et7r^G-Vy>iaBm98v>C`EJHsoakR?qq@y zb{0kaV`??rx_9}DCS7W7-*J#VYL9Btig0Gx1TsfcubuCK0hZ5gomV9_rD$}6C^x5k zcTgQ9Her{eGs#a~pK%UfJr?MtJ|W&SmbhCaHgOlao8Q{hpoj9N+-7LAuZR>0w#Q`! zOsE5-TEHmKt^=F;#|%EtAyrQavHQv@ZzZz864PwqZGx2ots^)lJWcIrbbO;W`9vCG zi7od6!!GVw383DqR2akJ$g{3G&07}JI2w8cPj}*}Mz9<`$tK9q$%1)+LV?W9c_)+V zi9~@yoevi@0zip=mE$pn^JXpsNN6N&$W+oOhz>XY5)Z%96ndxfPh#C^xWR7#Wvnx# z>^q83KGN5~3O`S@5>p~fWlLPo9}D54vQxxD62V`GRW-A+Y2i9ZV z?4OxyDWy}mCRCUsw99LKn`$yQ4fsc*=T(Q1*{$TP~QX))2d`~6lzh9<1S%Ia_He{StK9liM4e&83m(1Yk?fG;R03_a~Y z6SEXX+78sp?k{7`IN5<=C6|b5pbRPs?`~?-QJJVvrz_HyZ)r>Ee~QSmUiv?u$m_xKLqH4_ol+3f7TIUF*@#NLkBu=YMA_#OzJe}|&6WT5^yr^Cu;*2j zI1MLdRX*oP>J8PbP?Ds1)i&X<3M*1;m;c$-TKo-Qa$d(*? zBRU;I;M`@K)H3!e7L-zz1v3(EI4fsW-@{ri~R7>X{W>>u7{q|(Q13Am|5(zGYpd7&v(!`YP^Mnh!*eygGE5g$S`HLfA_O zilp$V7Rz}XO>X{ylxB)2^=nK-_JEzRG8k<j4Ow~0_z26DI@Z#(aZ_zfbLg0;UAl~!k zdtu`{3P_A$?58MCD&MK>ZP)RkX6yfrj%3G)9VvXgKO5AI;R8JIt)`N(EuM?JL_A}1 zoRx;5y)T62fMyZ(YPNs_?o(HHO;Jg3#T-jnwb^z7g+RN9hx1{#&pCCcqd4w>SFl64 zE5OX`7GS6q4IjIG$q(G@@vV2~Q`3HKa_rb1&+H)1 z`P;b&7C^}NU$7j?H{VUP=-_|Zm;vNq%VbjJt)8VpAh(OWVL)Y!-Gw1-*>3!H-O2-m7SNKEY ziGI^P`cgUUS}OtA0kRa~yN7c`O*+5UW&t0RfLq|R9|Uh8cHn%Iz4Tv>UZ&nJ&Cg3Q zu%DdEpNvSYcfb#u_!5KlBT&A3^Ka2@;tDW+O%D&3^H=|>+x^~Ed;{1qv;Rb4-ZQxx zX6!k;|M}IxXYjy6a^?Ph<+6~SI2fkr7qhhg-+*Bv0DkrZEszMn_uvZ)h;{#5Jt+mi z{`1v61_bu+nE?Q$X8`(P?txqT*B^B7Cwh|O4Pds!cZ+-d(~H_W-%Zz@`RCj12(+tr zD<%d#K7i^qVDSE@2LSbV-yym+yw?BRME$*6`vCY)awYON-%2*%^&>Fy@cZYL!2qPr z*Bj_rwz=2!7KAXz?Yzh~$S9Xc(0?=4^f6$E75^5XC49824DfATL0KZ-ic33CY+vr7MvB=%%-bE9 zOQqL-n7uFi83iK1e>$GG%eMpg3H(gpFcQ&snCtgt`sTZO5rG2Sy2iW%WETL1WjH~Q zZ+`}V8F8PRcsy@#ns-xcZ%mwYgZgR+K(86iP3X8siys-!)*cMDAp}?b*q3424CGRH)#8Nve|l-HW zZ9G*Cv#SOL_mEVvk&P#0>0wGz;D<-5{?$}TP%g1A3=OpbrM}b_z@V>@1y)KkBu3p~ z0K8E!N&lQT9)z}M;72#Q|dW>(s+gQ)S9dpZk2yH_6Xjh$$uLuou(*; zUQRq@)>n7nS||G$E=n0{%eG;TO@yY8HO&D;?NV~LA3fFZzW|m%X}@P3G1S}_mu&vt z9nvmn$ZVC=J?q#m>*>-;0JJ7Zu(0iwKEejTw}!HY!|Xn#3GRbS$HCX8@Hyw7))U+< z7*db5)FBBz+>I~Z;v_-8+z8)A7F&*Z7H?>41}$aS4=&#MzyN?*S580Rf{xZr`|txR z$`$9}r12bJk(?}K7gUN~vwgR=Vm6L^L)z?FXqchLd-mp8)9z&BG_`#Af9u%_XqdfK zZ~2ksE`oh~WyW4uo8t>>t>^0rqe)hPyeH!xu@x)`4!xbnOlNaj^b^Q6@#YSx5)IBj zS>#%5HK4dKaQhq0+svlFXtzf&>jJ4R7Cqw+>Y@xmJOUkXlYDJ@IH=iGAQvgxQLj3l z{~YZ<|84C*!_oQRVtCxeNBd7<|DoB#T0hJFGwdGiKS%q|(f)I^{~YZ;E$tjE@(9j`p9pU=!~k%aVW|8u_D%{ioX>^wj&m z{oe5C|NB#ZZi;zrvtXa6B(U43SMe@N!dr{}SD2oDI3172ZTRoQ>GR;SJtpgZ0DlgP zKgY|9xQ+jOI6e15dv)ICzgS^dQv1@2mX;uOd^olInbp30_;?9_I;-|&umIWOI<;3t zCgQX&BYeYb7g5MC1;HjJSDKVhkPF%w_3YC)HKz1bW z{_dS=Yp2OJk&<;y`||MN6uYYh?%2zY_xKlfG;V*iRy1V2fOc4Ma{A4U02pVV*`E=K zz3flho3}r@37-)d;TecsiM2x56n?|N;4_Vo5ntk*E-ln%`6wYWv;hRV5K{RcyjAUw zvGon~Tni=-I@G>`0`Or4_1TWI_b98h=RTLQrTw%*!A1mJ7G?ka3Ur*OV9NT`E23MffRfVHs1 z)E$1{ykI+T9;tKGIs%%%%Ha~A5ZepD7WVoXjme-aR7FGb6xBrC-mJQY+tiq#gN=wU-nvO zty|XtZSRFxfap?}wr`v?+p;-g0a#l7_KkNk3B95XY(?L&Ums4pNJ8=tvJDg0Zr`w9 zMPZ+;)eM*1+zOJ=hfnnzV1(FTNFS-PT8Z-SppbqIH`xf(2{bCv6uCl0NRy!UxnP zvD?463uy;V;J+|%i3}ILWKBK{z{6^%TL#064YIylE^Jv zvfX_v{?10@mvC0n#B!1Ric5rT3AD^6_Fvs#7H;1`>4v1;$Cs-Qr$9y8zq+1B;$k>g zt`8b7E-OgEKi}92%c>GVE10&O)&76`5ekB{>tYdV;bKG ztl0b`blf2Sn=aiX|2tWRasIbOT~d5}!=EBIbz@k~*%#Jw(Pv*5{d{`wfo6p;*&!=$ zb5GX9>kK}e`uMPIn>}v}jYbyoaQA%mG{MPc{eEy`!h4MX;WHbThlgSSf4%vyzqKD= z!Oq#=x1IZ&Y5tv0%_H$spl#S=_+_`BuCL(#kUpEYpXPH6Leq+c{eAy*|8MQ5htK~e z2^k2eLLrf){{z zk9pzG7w4U#jOWYCR<`bt`aEAhw4W`<@?opP*YmI9*X6bRb@_1l_#%MvBCXXjaM`L_ zk)Zf=taugRqoz3^2=Pr+V5vDEWDBSGiaZdT{`&PRTlP6LCRmFK_EBjROmYtP`1|c!bPQC*ciBJVl`nAr{CN_g(h*hgB}BCtYj$n zzR;)Q@5`HMZ#WW>%f8OK!{TF2vneJvn@$h};4dsR1EAPde5}GaCM)=}fZ!*5tde|3 z#01z7X2)L-Yzg5Bod}7;)hca2>z~7{sBmlIFNH z3Mp|kNl_e9kn6*gjz%N3k!b|XG12B@cI(SW!@m>3p|Xs>9@3>3n6a=1XeD)?7(M^=c8$ zQPu_-wKAD(sisT^Gp%ntNYWvA1QZt-FQ81iWOh0L8#au6{w{N69kG=W&tsPa4y~+A zm_<+@{S7gc&n|+_Q_ssNqgsBr0oBTZ>UnxKd4n3LOZ}a$blfjKA01sX^bPig2a6E9 zpr)?L$_m(yQ%emuuu)x>1R{cx`UM*M1;&CTpk6BrU`gy1)V5+RQW9Z$!x+m{*9C4a z)=agutPNFKaTya(*YE#-_Pzox%4T~QB&9>?SU?2n?(XjH1(t>dmX>Z1BqRl;5l}!v zLPA170Rib!32CGe5QJ|RG4A``_vZh5@Av&L&+oUp&zv*0GiT<^IdkR=G@Y_HjFZEJ zxZe^Kbk*^@{{?h*208s4MFU zdoCK9&JMP2e+h%YrW+D01|bf>^Duyo#S6d;6%@}!MUaKXALG2d{ul>c*!~d? zX#U4}0)fCk#QFSH0dB5Pk@Hso zbi#6nSTUXdd~c%jfb(C%pwTsLHJNm5UELwf(%%-17tQk+ zNIOZ|s@X`pN?S7NfuTbIS~M@GEg!G=kDxQRo4uXqkDwY@+?C^J5H?fTLN2-)IuHEJ z2K239*q-kXn2!Y~FF*T_pqHzg6O*2XmI@4W-uVU>U4OAsH?VaycLjcLK?9g<1DirL z+#!&2-Jg%Qy#sVcGC2Q%{zVwQG3f%GoM2=K4gV(S^qU|Q?e+^m7p6ti`URk&4;5^@ z&%4RbV z{(rgu`^)|>%triQvHkxC?Eg8rcz?V9%fZ2ZdH>U&^8B`onE=o~>IRiB!c^-an?-^i7N z%3nVd%c<&`USz{*vaeRQPAv=MDP18l6L7wfJpba$wJkKgVKiYju(THvmA~!2xhy zGXMjNxuf$pXKht z^}LqQPLx$uk^bdR{IzEJf&DwRfc1&8^!JuAmD88f5I2>VGG+Mv|M*ErzciHMFB_t! z-!l7|()4_@!}P*{)D&iE>FRFr?IguN+DzhFTGA@#eW{@(^9^JJ_JkQiT7%pG&PTz+#Rz3&_{T@^Uv|B= zvIKN`_{*-BgK3Yy4}>4k^VvrUYz=G7pHK!dH3tw70y^(VQ)Q4C48`yr2bD{J7a4(F z#bB1R7buz^gsZH7F&EJM?4ZAj{W(bfD*8u_{x4?z>vZzh2L=Q4c^ny4jUVw~QGO|b zfmu^kLqne#8s&m+e#OCh=NtviMoCTW7aUBe`!+&;0m5Xu3*e7RUUcwpN98xc?>ou< zlE;Mz_yhAJ#f32Vd&GC4kXcz=MO$3yC*r$k$b3PgzszCh5+d_&EA?GcWd2U9KT+Q$ zMrIXNt)D3_<-be&-~XNVzude$Y?t@{T*`m0FtOm`6pSelx*GH}g&mkQwFFtgG>ZSI zIQaMc|FZM`*8eXz$L0Nhf6jB!yG%cO7Y*X<;O=D4>jqFoDBcscqm`Tr&V|9_DG^KfwS@?HA>z2yIY!2e-~ z2^{|C{QtB4?)(oIFWaU5_dmt|F9*dX|NoQu|Kr@Z6%@WgY&&%OOVI+;N{@COTV|K;3p$^S3;|NmD0 z&%?>i$A78+zvTbl`Tuw4$p4xF_}}CIoNTspZ`Tr&V{~zQ3Y#cn7_J5cB zAL0&i{^ol8!XM)QmGfV0+}u3BKmT$_WV z*b$50U2yTuLmog9Z0-t#`2aunByQv8<_r;FW%cy*WO0WuTYy~MSggSwtWFj{2rJMD z=->^pg)qBtl}E%e9Y`z{NiXo3bk}_`14BjbaeE9E?EBDLNEFM<^KQwWBi}@ zuloPy=jOO%|Nr&;-`(lk1r(+~F4_5KP5=K9{?GBd^*;v}2N&lh|Nk?d@7A5L`<e}18kKx-#kEAKzQU?-sK zxwFnczhs#6MF*fa1iEgsu=(?g2fCTN!W?-2`6auY-;K=c|NqIOKmU;akDZ(2xA*_> zva?;T|NnFA|MOn{x%&SW{LR|`8}N54|8L;GSofcUE@zWV{(q_e`~O1!$HxPmuGudK z?0+r)cLccsVSde6|L4X(FE{re+yAot#{QR`haDOXz`TtLs|Df|fA0G$b zB?I`cpZ~w__P_xD-uVAp@*fY^Z|y(XxGwEK|D1=01^}@E!fuEccXoELwK&&9GsCWa zcK|qpTpev8=a<8x85*N~(_;gK0k9iv00IC*00Y373E=5!>jpXx0xcbFodCvYAg^=P zvoHYS4RHfGqM;c=fF2-A2ngtEVFQ8~qk%o0K(0{yc>**vXdNVBw^@8sf&(-!;-MK@ z{Dl5Y{CBGX4MK~whBwak~(;(F~n`2L913F8Ti@|Nry&KQ})c&!ztNznA~RT)^8}u>Mbu|9?*YUC#gi?ejm-*;yXC;$?Amvi`Tn|KE`Rc-h&1v;W7=%gcLd z|No~vQEDo(m}n%hv5qM(C#3=Xy#f26B16At;nLEeKg4d*dTyFvD>srDk0d`~o!s4)aIXa)0AtdVM479KZxdF^U&^8vP z-fVb54Y0Korq<a>S1lici`M82KeN?n8eC#dwEvZFC076~@&w;AY`rwqWPv1Mu>*uygbCad0sKIM~>E zSlRel*}0h6*ag`51=!dD7Y{YGG*?S20Szgci?X00VQQF_|AmpiCnpQo)tVJ{cOfeq z2P+2$Gc*P>#M{XY=*8>=q4}PJ)X!s-09Y7k4t94Frl$V>7aW~`Wa|XEXeMZbv3dcW zS=m|GSbvGAto*m5Iy(M{4RO-|S^e$U5G`+K5UU0V0(N(`fOeb}4J@&;{I|fSm!7lCW0e1<)%4Eo_}&z+303l$8bKouC5(DqPD;2~$HMEVj0m z0+JH!JnYcM=I55=W@ne?o^Vb@XL$1tnd>%W4&lzIe4nw!W191t#!VQ2C~e z@7=mEFJc$mCJX+QIKG=$Euh@kS0Em@dO(0hJ*KQ`58f&+Dl>UYu zEZw-{d25faEi^4;JZd?F=o9nY;;QoAn|g17=h|Z+U7ua?N5w%@>PgG%!N`Gw?2~e3dKJ59u0$^=g7yCtY;`+$$a>>-}BH<)SZYu!DtKI6n@k$ z)#c28Z98jW!xjU#>kG|0VR?;n#|t``R~a?8v}9o_**Pz85wk>Jz68WDFu^7Sn z{&k4qte}73YZi%(4lq{gox*E=rZ1|Wyv}V_1M>OJneEeKMNE=15SF&JmB^?EWoX=+ zcx3)Kc>NdZ<%~gZ(i2|2Jf7jMPO3f|%(8s%KAs{Uz z+_iY>5wJ#3o>)Kl`JrNmQK>{*1iXEjnEt(^G6^R^FHzsq!LiO>1^5E&Z3MLFa@`;S zYknrRXD^ZIzbaVYWXNvnX}&RTTD^Zn4$8nX9Rzk~|6IzrTkGaSLu@W5hy6j+%X3 z4{TW{)$SsrF!ZtUe;KlZGKU%6KC$C9>METVg`iV~)JRLwf{&Kdtd1Srj60B1Of;yj zJ1s-9gU^nW34l(_tmu}s_ZHXhJc(f(zoO@WQS*~5t zperZrHH~#|zCXGW>+O?0{LkRFYuRM%$TIo;;e&Gw*#o|HJoi)3C87|SK9M^!2$B*# zs`}VB^tdak^+;TFaWYYa@%ir2N`18LXla6yzf5F_Vc(aPq9vBH80*s(BNm*j*Jqy9 z*bsBPDvwOQ=)7nF86)$Rg`QqUB&6QNUFqJrU`TI+05hk(E{pfgeU+6o;YrF$PW+rc z>Izxui2O|b>)0r!cZ1(X;eHs)Xrl72w$ne&wHe>>CBhX=B3j*FtMh*!;3hEfI>a(Q zGe7esSDM-MKs<-FqkiAR0{cK*Z}`+Mq=pHMhaALQMI&4D;bd($o86=*;&E6H-Q9(% z&19U`Dg*9N9aX>J&DxQoR#iZdc}c637A4LB-?8MHUD*-yT7zEV{mDLhR*JHqsZ*V4 zdcPXW?w995*-2>86%Y3buhtE}sx5CR)tSomR~4?}H(STgWlP3zOHSTW++cauT)3#u za|fZogcntd1Ae&Hf_zp@p3gI-bW8LpE1*k5+73^^h=kuTBP0m!7UeZ6lMs>a$9MhQ z14ab--o54sQuId819m!l&&86=({jB-W5VQDmh*HZVC0)}FWg7!L>En&LVL=S^c3mX ziNbC&5!Jv!A8}gnR+Lq-U4F*2z)O-EM28#r`5cB%t6qtipdYi^$&*UW8|~EIu`ttk zqWYmy210ICf76INewZl{al2Z#r_p`regY(zGoU^ZFWd4F?pa8Z$tj57E`jK z0BnS91$6Cpe76iik3H$UCbybX!dXB@*w=K#AsMC+xP42bb z9pn%H*ul8uThXJ-K6?vwdjS(c)$-}GwMuxD^)10~#UkfKqANaJ9%Zx->kY0?zNXa*MJuaAQezn~?& znozb^;i)&d`LW(NF>U?YoN!83e`6{t^^2F%M+aXvvuebbCc;?XV%)n!E;W@Cre1~r zmFkItHHdAbA@n{bkENf{)GR+k3mH%IJEf(HQ^~*vA(UT)9p>gzDbm%a{0wbA{x&K zyG~Evl&;l~Zno zRxJ9{%)0&4FSf~dq@_^2>z<2|tYrxT7kzf*ZzGYdveHYTUKil$eXoTf`rgL##Yo?r z%8O^8y)b><%5YE90U><7uWo#Z$8^VzQ2_X5#WwTyp0c*UC3D!?IVWA8f=PGs(kfDA z5@x}dx|B=(@1_3te~12;4=Ti8I)J~_|DNlA#U0%KJr(fZ(f@L@bFux-{)h8Y|NEcP z|I)xd=lWlYi7I{Q4?ILeRsyc9k8A}RxausY4{aktJlF@`I%^P`1PuwM$kMy|Ob^pY zOPk=ufnRSU&`btLGZasqxEYA7wQOCyyr`RDE0gf-w9=AWq0~+Bt;ffqVUA}zwT_fl zM@_a)r4!*<#o0Tw(QJYA(P79O*=%5|_qRR!JN%HNZPq;eU+gw)KDgaif5v|>4cQcE@yYRC%)V;1PS7=Q_WF#}vTamP5Bz?d$l#5Ro@ECkzh~Y3%L8T|IdG%%-JJEqP@sr1A_3B2ws-qd5v0Ze$ zjxrYhrz+{}lbg{^+AQjkmCv-TJYVXglWtf&XqYT?wO29&>8u+NBuMneUqedJtdy{_ z_3}JCmc37rXz3cuCw(pbgzL*BByFvwIDB7#IYmFk`$G{et+sy3Fo%8JqDtUKo$^9@ zim07lBZ0+Bc{GEzt-Zd{{)>S7;5?hbS zLUiqsW}~8G>h!7ZpgWK|2nu_UrVkM>@*+}fhSHNkBIn{~!lZkUJ>VpsL=tlk3;}w^ z{1~>fM^? zAbb~|?`%KeJyIql%u~tHlj$!mdN`AKwFwI+wH+Uh1{1E{$S|T1Im+*~HO-fzFI2X4 zpSkZSn^4HMfUaPvIP^P;h6Y0R2Xe0$?){Wr~9yHBI=6bCNt&0>a#Dx zWX~Qm-MxFe>Z$&|a+e`B#LD&wF5V_sC5kN3s0^vZ)!V8!gsF$ZeC7sj@Y&oAU#&A< zv_wkNgCT{n5v$_GSGb882^D9<6>~s8KOy|g#GTl?7Afckz~k3XBHs_IzCfbOAd^xF z-c#T-aUjtCuMlJe5me^L z^vI70UjeP=8Rs!H+(<;*7wNs#Jp|k=SMv_y9?hd3+NsH2K$kdP9pYlj+aGu;??n7* z*gh?|n+#HEN9iQ&(p#K;?O}&}a^`}(_WP0Xt1$`5GE2H#Tx*&;cw*k&kPx+^@*vd& z%RT+NXZfK5MFzrZYaO>J4>-0s0p;)gw(s1}?9qMq#zHsQ8V4zs3vF8cA&^(cQh#t5 zseLHArVV(A474oxTynBlVbQl29d~uI2P;5muGt@6E-1gaM{t_YSTjH17P}eZDdbe$ z&Zzk%$9yxziC{+DStZ|o56SqIBvhqtb4X{kn4#s3hj68-F zOoYq#;^K7EMi=446JnVS{P?e&G4)eb)FWwA3dx0Nh_}Wd7Ivwh-rhl=9O172%sgRy zhSZoh(e9%h=`ZHBSpLCS0jVBA>ToDkX_Wj3GvUKEZjI!rw-MNfHdvNQE47PK?n8aC zpIZ(;a&JlxqLsp-28Dofc5H?Amrp9@ZMqtdh-c_iJwExBbZxu%EoySZ4Vg6R2!rj4 z?eR1V>5#SN33u^f8S|RiLc<99hMG$o>yL& zn+#<~ugM}kJ4!H>D6dx7!)hcy)SNM*Kda;D*+E#3#Gao>WV7*j1}VYj*dtxnb$#_V zqI{{*ew~mt#kgjo$RFNW(ESQz_8p>eM!PqO7-e`vPnA}Pjv<2T=ch~?x1ue5>-NW* zr3m)}Z=>B90;(0zJ&BqeI4xWl2RR`r^Dr}=-0$uKb=!tFx$OuxZMQ(Yh42oq4+{&cyG?#-ax)M_ym)J1 zwpIC+XNGvuW^G^&e)5XCq&}u6oKr%Eft`!Ov}~9YgQz{`HL@7bL={O5!u4jJ zmtQ}w(YN4*+-2$)r$o^mCiQFl9LciK6ffPuyOZ5Zf}e*!ZnUg?%-eA1-jmVKn@p=4 z1gm%$Bf(`t+K*b-a_qroL?_*WeYKVOF2w1EU$CPjqjR&{DgDQ}YWBNYdk%QAR_Y{d zpYyk(Q&Zpih__haLcZBgzCXNV*jFfkTUlfynW5-Sfai&)H6PHP3`r9h6QrI?IHqY& z7#|FtIgT1-y&^VwFLiYwzr4GqcmHELrKN=3l+oZzLHHbxS|mw2Ny6)3ymue5x7fpp z!-e${Y)`**caL9ve`QLtaOE*xXLp(!wxf0pKZb~-36I??7r3Jusiggv6C5m)1_qBx zJa`AurkTT-8M-3`UrBarmp?KKN~I0|+NJfvXEweRc|VRQ)C@g4>vebmKEmA=k1y<7 zM~Lry=!}X?Pz|**Ka}of+}uPBUmeOtYX1_PG_L#{r-N*>UnZc^aXzzI92`oDaFR2- z{nG!@FZDm)^*^Q@UjK#)=x^(PpoGWqTmK*IY}}Xr|Nc|@A350PT>qo}sY>?J z{_oQM@1L^&QEr3rEJq7i{=wP~s*Wmf1v*{z3-rl*A6NN`Doa`o% zsLVQ5`AKwl=k}IfrMw!d&)GJoudm}llecE`hx89JNk{&kHmWYV@;OgNQT+&v;bL2v zgsw$@!74%82MrsXw!|EN1x^eB;|^8WHQw6@-r;InGpKnFD1rL!dQwmtm z52Fr{GG{w-wKw5xHyvuEOCe6!31^qi3_N}?yKQ1p-Js+g9dzoFq$rlhD_Poys3CB4 zb|*+~IS8ErQ>~nnv9>SfbJlqOBf`is(pkFUj{W_~4Tgf@H$D2uGFAHzrymtH-Q!Xq zTLlbD4SU_|Ac@ZT=*m|hCgA%BQHC`Wdot1d6~6~rB^G5kkZNFS0Q>zRi7 zO##|wm&uj!24MmBEjJ<^BgbqZov2g_nXmBsqD9F8ojCV$RAjy)?aK~N)O1p{4%|}b z@9A41Wwwqrps``>$)V;YWZ2ySFjb)RzCXtN7 z$g0M0n&`bCs|r%nehGPcYjx2ZaT4>Pp~v*Wii~^j7AcFo5h1* z!1*8oyN||h&i+(sTqoLtsG2@;>_VZ4mX*zt|=$9x<~e-O=y!N9;O;quyA>+30$>5z~*hQo#ag{?0s zMyQ|FaZzdbXcsdeEQKVy)EV-E zl+eJZf}G8UJwv=uD|qltEKhP~!v<@(wBQ}UuqOO^3H7jiuLU|%YPrPMr6x8UVERyz zi9^Pm<+W9^poS?FvqPW@HeuG0X7Y-L>UwUr*U;XC5V% znz8ANnM2A#6p$v-xV1hK1~*7lFKt>#n7IX`95!_4;Jo$XyepeRcIP?HzGKZM@fUhz z?2VEj3F5?s1>Ir)lMF{`Uv)}JztAAryQ#LTF@QEpCP@5r+xV?Uqpv3b?_-f^w$^^| z&E7Z+&v)uMqm&IgL#U-}TpaNv?zB^do2SvlYh_{MxX4$$`&Zr~&)2c7--~!2%!_q( zmN+?thzz8YN6aflo#Voky|WX1e+R9u(SxRUeGxSQcLT!Vx)!HntAw&W?Vmf!zi#~` ztgUCL2>gy2;S-Po5##*GQ?}%{Vv-F zNQ9=QhpPo+R4oP;UY-h##dUh^2(PIyWPDj)g?#>qKAeg;btV@3d_Eth2o=keQ;k$Jm=OIHh3=?h>QCx}$=&+Qpnn+PWNm$Lxbv zXOENKfFisp1#8HJp)0uBVi(P9h;#lb5uQ(eO{c){=CU5U#1(~Q-&J$u+`%T2eSdL{ zn==AcVaE*vDJX^JIZ1b>ECFBImJp}z8SG+OYdwWeT9GM8bAN+u88tOJ z!$6SWUX5(P>{B}ROv5O8hmEg3zX1%qZd|BAIwG$FU`jkh z)uNp;&+g!Pz2SmS_=|!yEeVz| z@TQ1w5Hi@B7>9Yld<1s@A^PhhL}5@aB`q`e=Hu#{PxS^m5`6_NyfgMJe3%ItKJ-U_ zCVAISH=WNbNcv`UFd8|pSjBp=%vStvf(07jrE^MZw;?CiGe~=5#!aRk?Bo{o42YSb z0#ec#so{Qh1QLNrQIevaq%ir+%VdF#H(#=IZ01@N&aSk&$K?@J?@UmnId_dMEA{(~ zk~UyQ)+JO13zJ!Cr>tbl*w1O;uX@NxsXp6Dr_BBge5aWBF6QN=qm8Cv)Xr>w{eC8p zL&3dPd-1H>aJ*l;nd{ob?jU7Z>r8-2F!*g7xo>jI7adZEHfL+bEWz}BN0IAyq~0y> zx+{k-l4&zI&Dk-1@M4!a#kY^Fui2T9VlTT|vNBCD^^mCYZd%Nv0G9=V`D!bGX=7^; z!3iD906RA2Ov|f+)Y;@xZzGXImS=dYZ;_HYTNQLFpu}SkXdwzM`#gunNM&~w_bArz@7ni!!D*u2@b5;n{R+OFjLR zj#igD%8Pw%MR|gu;Xy(xg=^%-4C2zx8Wxrp9j)_bhh6UV;cUExq_x?MBv;gJS1(O9 z{gh`Cf<+bFu|nZ(oV~K!Utcrsx9*Nv3GeOjdOyC;$0T}^9Q5_cpZef?VdZAc0^LxpNdY}P@;bu#q=oYt;m&7Q?4 zC!5#DjWI^*ri`gmL+TTD01=k8A1F8K7PjWzH$?BQezkYE!oW<>MMq6;S&+5Nq!*=4 z8X?X~J9a#+VSbS$+Ie@MAhTyao15w(mY|3i7ve*bWl|lz+^J&rw0XqW0^#0TkU{Zy zlzkqqi21+@J=!zB{3LYN24tVQjIL5LczyTe=Nuq#S-~TrZSm#Z0kJLYJ^11f1R{5z z0j*p`3Ss1Q(NolZ4{g1%H>*@7Blka3s}RfA6!0pC2`Vb zbQ?qaTOMcX`;kJstCB&haSvDNS&F%CSnN=|iqWzO8FgH^ra0-_I?+mJRr2zq7!aKA zdRP)xqf}LiUh%#tLGeS_VQWZB(O3|CD>JTKg%%o`wKV`N&~TfQEb|3ir<8)(ROW`} zcIlHbZi70~Y&6TJZ6td(j4X)k%%k`_qU((_>(-GWlhcCcfmNFjd4FBq80>rV&(dui z9&(-CQRc4Obk~vFTF|RojXs)Z6~eQYx~-*Y0*{KV(aOol2`60lta*faCnqnWYi*v_ z3GM)^HM_6did-xKF5Ix*@k5aueWNpRGszi7sCTys=AM?n67nkXDq>F-RtVX%yM1|x z`XOVHc~`Xc@kRQ5*LyS<9uajuC(j{`GUCj^7vdd%VegZ$_yjPV$v(@&m*aw=CuWq4 z2LP9jroBvKDIu<;<8_hlAMFg|Z(pRLWpgq1cx-An)kyQP!FxTiW99=t)-ZAUw3fK# zklSo+looPlM{r&$VJ3gP(9@@bPmyQqKP&ko2)*q=XR8l>-p7YZX_;GohfHIaw8nyi zqOIuVC$unIex14`TLfQ4^88$>rne-mGh)xGB);5>xQFqD`8nJp*Hz%8nCL2}KD)2a z?15$(UY^Tc;AzimDLYONZ=a0CuQecl9XWIA(EUy9>-_abe9xBsZG_xauxWqj0jN`6DC(|%7rqlo-!Tk z;9CTWe0ds%!5>uX%wKh-@=xQ0S>jKBOc|W)bQa1#Bu93Y#XRdOqtAbE2gb4(G7<=rEIMB(5?pds>#91vfS!Ln*4`JHc>1In%c7uY)4Q#d;&U>wh_x+Z zPD)a=WbA|oWWyh>x_Z`$AkE&CIgG(ePYPi}jwR5jb(p1&ln;;Gk3o6LgpIM$5Q`OB zQN5}R4xP(Op60+ed~A4|uhrRO=L~%uNjLt^^5!IVM*h@P13dUMSRzG|a zrz4K53O}YdPoy@!jZglCw)WJ`C+e<17=D&slfp1)U9X6N$pLb0z&Tq;kW?p*3`yq> z2)(LZ{Z@uh+4HOEO?W6Fx4lj(IXlPXW1Z-QHKbJ`7XdxVZ6KQ}Yu*=l4b3b8h ztMBlceyWC}%xlK1t05~Ef`G57d@q^=@aY3iRB}{WpS`@R;_R$4&8N$I#N%_#F~miA zaPH2UCOVgKw1#Gb`}!10$X#N3Rk3C$FFcXRPM+3ymQ@Ox+l;&}p(jMSB*@G*)~ z02`cZ)hYpLnO%-O%E%@+7JR3@ly>4$Cq90hf~;JE`Z(O(GS_l(b+Wf-(Q5vAI_Ml> zS0*dDQZ&$c+b3(YHXrbsc9`6z$0@|d4tChNVvpY?-a;$6xy(ZnTXV3WM?|rS^|;G3 z7`Z8(MB&kE%W4It$4b12_ii{mxQ?LM8Rq(?v>3s!HD-zXKJ%t&DF>I@!Bg3yp-pz2 zh_o!Fy(P`9c$2v|B*TVp_D8)?j}Kul=e6;1KQvLWuQGF z>&~ka9R$oMNC<6QMB4~8W@_NJ;O>1fsz+~aJ4iNWYfib*8jUU0^nieNGV4+mpNy}M zxjLUV;xRYIn1pO#Q&C{Wn-(uoz|Ee?+1+!F(oCa!=+rdJ*5F?8kgv|)U8 zgaR6!NgN8z6$U#_4%E%wxd)X_2qGUnt5ej#mCmSIz6i#T5B+g;Lg5h2Kj^F};fO10 zZb69XaxIYb)cZQz)nf1L>qggR)t7?8UR1sgJ9-x(*g}snpX=&}%*N$jhK;&2V*MI<(U)~EnNI`6 zri(^dHq`*P`Jv?iWa;N(JEYsFta~r(N2AC6=i&}0c2VP1Ofry2RZGIIe#KWqLPW$O zMSFL|x-+o5(f5^#NHEa-^-ChLDolUegcng?{pcTN7}9Q2)(pUn`yQhUVpo{3 zVNp|0mKS*ACoedgE(De!4+S<6KAs;XW8UxNAb)L;FGO^b@Qki546j<}ehQP~0BQLM zQRCa5k>EJYwm9ZOp4jJQ37i76r1|^+B*n$M_v#ZqJQx&Di87S@*fxW@Fdp(G)}9bM za_{l61VuA0E+KL)*`u;|{-4jR4FTzQpVas97QDCG1vf}wG8QOdkRKnn-S6j|J$l3c zz~w;NL+|x{qfE6;tAll-S zD0A(uq4Q~U@tG;_K$iVH;Ye*^ZtzK^zO9cTDkPZnQ)gk}o2wnKr7}dGzJs^Ot1qT~ zi%ZG3rgzJCr=9z0{p{L1(GuTVU|Kj@GpkH&#Lfz|7rHFh#f5d0?`Nq?0V*CS@^j}E z!S^)VwwGAv9o~Lc&3*JNJa-wHU}7)n(`%2>dj#ReRci=MTg>>mCXxI_o4M%m6I{wT zHB!ZK7?Ks08<~XI!!~)40lp-u4>*~!$|rV$2a;?1GL@YTw6dii5{W*c?aCm&(^+vq zw>7-6m3yOg%3j69+@!0gWHFIaSs{RVxJ6L#PUxq;jBJ6gWe&U5az)ar*(3WlWE`ir zgEe&mA0Xu_g;JdglgOI}Go8Lk5H~`7FOQIpL}NTftOt?sR;=^)CYV=Iy-Js!6o5EL z>}2vn^SP}8;vs-YDv%!w-?h-}b055ahNI!tTK-eC0vtO8!JOHpSk%Tm+}s%Dho8Bkn~?-E1J5tnF_Lq!6x`S@|mp#Eez3+LZ^24t9Pa6mBtwq)Aw<1NYz0ic*E1j&VHw$JNJvb;#Fr{l(rmO_WE~W@LE10!XGm% zg0+nwKPwa;(lHY8FEP3jS89kUZakO6L=&=Rg2y}8)S*qqzp%n^j2J70O@zX8r+i&5 zU~#04;rSzdr9m5HLPCBe;$=t|rj$gF!XT2@0+)T=yEY&_J04+PGJX~Bl2~eOKe?f2 z$sqGe0U?!#7?@sJb?FQDNm6J$8}QYHA$sD@$QS+!axKA*+?yZYMGL|4vMP(THkKW! zV=*_0r?GRqM<64A={YUdg5&HVXLQ9T+WSKqP8reGMhNFzfns+mM%Z{mbO2g<{>GGZKitaBGT z#Or=6P&(mtzH(7cGVM9sv5#< z2ppeQ%2;=|OMRUvOEs58>=w^R(P`Na%pg_b$k1;S1{Hj0#z8V@njpp8rMnO=D9WejhkS`9*$+-fue&I$!DkRNgqMH1SHb#TPj+_{5!HDv^k9Aoo? zJX)s$-|oEp*2Z{(eHwaLSYpT>4W5GBLKmDtjDk1Tn^rm3T8ny&QyY$|wjRXTL7%n?Y?QG<^$gwTHzioj;>TQUn(lkkC_iW{vS7F;idg^*ck{c>sPGl{6I% zEBvwIr_(*;=MMvKp%ChDX?Sm#W;}3lo5xpeTM)i2wldev+_{6ka9@9su=&>H-f2y6 zj9P%~mP-nxaor@Uy6Hu{HY;`f!ANpS^9$?NsebQ>h}&;>i2d5#O;&i%j)Mmso?+<- zkt3_0PCu975&1&N8y~BNz8|u~sN0!+*IfD8+T-`le8u5OjmYDCv{!tj8`?(jn8zR~ z)$>{1xb01;$T|sDJf5nyW7YA8@4fZvn6Z707jW=rUU?^Ud=a$*7$7f2ItULaJ8dRC zO(}bHx}V*VYPK0>7rCW<<*StxQ*gtnb;D$bSSVOv20=Z=#4~rDH=wULQ-J8mmL$e7 z8Gb363um<;un3Np7k$3Htlkuh>ybHb^{p)Vsdm0u5j3adu_Dk)e5ShnrdCAFd%`#S z@+e((t*=-%w!~r>#|+eSA`F;xZ0=~vC*wJf)jaIqcph|!+fTzd$WQYOP<=nhw0*4b z1&cJ}sN709n;W_g_t(WcJDQ|;NlMg<{`;@|T|v61s)6uujEd1DR=`~G7;2b!! zl)tX=ikW?|I4?4#y=6~7BmlmS^KoLpL+_zG1K}Q5k?Ls!CnZX3 zml;N^@d9dIXo5^$1;l5(a`=d6&=vC(4mf=`Yt4H~Mayy9enhNGjaaDG4m0LVUoSIN z_te7|rQ*%T4SScS>)yMYc+2`PL-VPo;&Jj{lt*Ti^74a~1hXOUN1sh5H~S7~YfHxQ z(MI}UN0C&QZd6rugulWO6*n~sNDwaYmD<)tydRz^Z5PjHNsyaE*vmsWiPy49cm<$# zYunbwWyXojd3+t`ojOYkE$-vHV`_1Yp>}H#XD`C@0kLwabhwdDPsxvP)v0)eSSK?r zeXAy1I4m5B+`sI$Rxwr+m~EBEZsnBKT_ZTSPV1OXhRN+i%C}i}CNhd_m>`kAJCAxT z&Nt*EbuqS4#@!j07N?5%jMafDSB2GH-Rlbcp&px9k3LgGw0;rVMd6&sjtV1t_GWff zaw9B{As^wm331y`D`*FY&R+E4JX>O{5#d%^KsGtMrl%H$pqohpYfDaq1tmBzcLe>Q zvj=eHu-R7T9_QU2V9{5mJq!!EEB0}HpXGfbsbd_mA;+Haa39lA7W*|VWZsL3q(*zG zxlf@rpcf66X>v&Yzx5T;8?mUuARgtipIMkLm?VQ)2S?fTcq(Z65vJX_Y<~q=l*@AE+*b5c!<;yP8F!cz}!f{a~GC!Etd!x;7 ztwKpbLvl|*$iJd$q`tE8t%NG_l^edL@jYDqN6&>Uz|BrL??uv;B?Z4oDWo_)AiGXN zy6#?D-MS+hBQ9Lu`(TJ|%9ty*S5p5YppmNBQ>-omg&(QVrjKY_j#lK| z_&Ok-=)VQ0pWCcp@-6`JS;y4kU56_3z>iq{%&(Mkqbf7Gnn!5UW050aF&8-E0B;&aVsif$P=IBabRQ~F1)wN8{kNLhJmf%b@az|X6q^jvj$(t9AeVJ+A)#18Y)*9rE z=8*(xQyL207{+v)&$W9C<2{hoin zb-X4D#!AL(b>%vQ%HDoFtjd2PNs*^5ox#gpuyyDh7btsDCBdABJW^`n>L zK{Bf!i1jTJ5nNN0qkR%=n9Fg3wn`s}rc6J1^7c^|rZ)v=6)~9=r`$C(o02D?H0T_5 zN+Kq^j)f2QM!-=ez zgSxf|HkmTu*fFx*4QcZYTC*}Se2A)0oQ<=qPnZzcv-fodZMxC%cHVAe>L@ZM5ks`v zYcX9DEW)bV$NM8AtX1k{MEg4%*@;)PN6qq{?U-c>wp$%iPM}Buu5;1lv?>=`+e2_r z6L-XMH-`M?gSroEJ#>8|hnO8`;{(i8m||9#RqIXOrNosOh86?0g;N@M?p!xQeqbxD zG8LAk;K-jw8a*EB$BH!)ka*?X^H&4a>(?nIZzVpJnkp2 zI0c~Vi~Zv7M3((rFv+Hun`mLxWz6h;l?~3zArpq(1rYJRV>2##SYV!w~t>x!Lmen*+e7NRePRyF=?zZwGC=C zoA7r}UAV-fwA_*fE0nKiMSZ^Y?9rBIfyLs>Yq#Ew|9FRk#cFrm^`%w9I2W#~&8GZo313LVN>U%$CGPS`wqn(X>=d!G}J%e*@$>Rf9!;gr%by-5ji zj~rO9d0u8`(Ur2cnDOAdOwA36{$-ywFaP@bxFgS;xu>>H%WJN7-G6!Ik0&qX%WAk6 zdU{GIgeDkR-@5Q>|CjI2dXJflSDQ`s|9YMOi^ibl z-ap2kY@D)3-c>lquc%!R&h++o&bi-r-~4CdVQ|zhE1ITIkv+Q6a}AIEM!_f;1*2dTjDk@x3P!;w7?c12t?;vG04R6>kc>IG literal 0 HcmV?d00001 From 8d669b66f83cb50a2b35176ce4722f6234e19681 Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 12 Jan 2022 16:17:38 -0800 Subject: [PATCH 201/203] Removing previous file that was added accidentally in last commit. Updating the detection-testing.yml file to remove ls of non-existant directory as intended --- .github/workflows/detection-testing.yml | 2 +- .../apps/DA-ESS-ContentUpdate-latest.tar.gz | Bin 1305941 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 bin/automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz diff --git a/.github/workflows/detection-testing.yml b/.github/workflows/detection-testing.yml index eff019ec73..094ac48098 100644 --- a/.github/workflows/detection-testing.yml +++ b/.github/workflows/detection-testing.yml @@ -75,7 +75,7 @@ jobs: echo "steps.vars.outputs.branch : [${{ steps.vars.outputs.branch }}]" echo "github.event.pull_request.head.ref : [${{ github.event.pull_request.head.ref }}]" - ls -lahr prior_config + if [[ ${{ steps.vars.outputs.branch }} == develop ]]; then echo "Running a nightly test on all detections" diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz b/bin/automated_detection_testing/ci/detection_testing_batch/apps/DA-ESS-ContentUpdate-latest.tar.gz deleted file mode 100644 index 7427cb7951514a23df464f13b7c6c380df007536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1305941 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

B_>^oFT?&2lOBL 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

yF70! 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

rtaC(Ws!&0egEUDd~Wz#YCyCEuVO? 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Μ=X| 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

XnaLUUu0ZM+SNp72A_s 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�x!vl32s5Hb(nNbznrr5%alA{DbhOVfyV#P5<|}dwogMN=xCv9rOhUWE z5Oy+&e|D&eLhq?U9%eU5khB@`kgQ7D45J|&>TKi?6(1Ipjvza;7XNLf!p<(5W*I=O*OL@MIPo7TrgFXhG8|$rIIlJU=$6W*MQ6<{u+)SG>bY5bGVy~Oqr{cS3MmY z2lARXxR{nUYk=wVwlxK{mi0QGPU_l4J4fN9BGM*ENOQ4sj@g&7fD?(fbY4)*OID(nBg`AQP1+#K#ORY(`1g09h_-38%ZNVq9X>W zQ;}h9&F{r#*jOc6_mwz3r_A28|NP0{u?r{NybHv>d3S@6G#a%NB)C2`3d4kzDf5-1%x=~mhOtoEX*$|-$1!(LuV$oF*4FxR%W4`^Jr_UJfc}< zVUwTp3%jKfP(jYQHfMs?JS|5ACvx@$oi)|nT9rtCI%nKbhn5nlp!>65!_>oMtNCsw z>-lv_SEUo)i}`P!t@(%o2;6_0>*xCaw6H;MS~@(H6ylR1@#a8Jns><;+(?lk2C@Wu zM^yVEXoD~40(DA2-K2y$a%y9y+3-w6Z$w56kr3>WyntTur!!A!KZd*mfmV(Pcn$Y7;Lt&H63Jc zK8))?g4ujNuQrMhZ-SMWxuObroa9?xnbnd5#W8IP-J;U@rGJW-H!DhT$s3qh@fO84 zT^lv$9p$?wZL|tiJfu*?7&ZF@A((Vh(aW8Ld-0g)H2)gtclkAOA@yoB%uz_EQCyU^ zwxPW_aGOHm*el}xjNkqOX@YHDYLx0$>K;ck7_flK+@E>f`qNx}YlGB;;_)&36p9N9 zBky%E`X93R8o=r&<@=k5ykh9Q^1I>ZXX-zhh1!1W&opVJU7AfJOe2My;3>VLb!(-P zZv5|g&hmKNi|CT<8o}WE`9UO6YC0R3!^q{ozi;tcUH1TErlq<=Z>U!o z9eZ|%dov0QPv5jC55n$H$SY&;T;nVBvsMqMum6a`TcA2=Ln~xusS!Eo!;`#lFy9iBnvO&P=3!gj|pYRjq^!+s<&2oFqe@E zNOT9cycbKSun?aOBfTASRL|Ga%;%0ayBeN$HrPV4pYalop--43Rma}0YF5@ccvZwe zA>CmSn&Gk#GE7_44SqYff1)Oh_J#EJ;-nN0Tj>xB>MsJOZ6=xBdadL1JDDHl+vRTL zT*d+tjQ}`B3~hI267j&QTA72Hh;-FnCBAGUGepsVR+BuWh`v};0*wB~;`=Bs(wat8 zlEx$b-y>njt&=)*IUb$ckL5LVH8V8{7rs2WI znx~5$myb@y8FW%v^?hesXL`+O<8d_}28oC7&`m4~;cSAqcF}z>sDq^Y&Q>^DeHS|V zxXL998vO`heBxoD4;?!cI^Z-nuUhi*7bVNYa~eVcD_cELgN_vMyT~lIzDtAb+d(Js z0)wK{;1oR~@e$7MM(w`oi;1=t>3VB)BRDvB4Z!0AgN^ea23try@XXn3W2d|^$`BKx zmUKw%dnQr0*!S+|e=HTwV;$DBPn7K88Rrd?@UQqj#9e$Tie{VjM%T0vQWK0X_3|Mp z>~e4WIj4P9}~OK-h$uM$CCK4 z(&6?LznD|`+Roj$&B2!SP%lKfl)BouiV7twR7Vm$wKt=e?71t=SWfByZqu5*r#1JE zRaUV}?P6b(b`-;CW5Hf+_8;H)MyD2vXA$IPvC7e6lQDPO3oH&|bfFRD3_;G+dgLoD z*-z+Y=Rh?{@=+;>5#JGIEYuhxze!qr-J=!xZv869^6je_skg5`1nK)vLHhMSL267Z zUx50!yrG%-c)XqBs9Ti>ET%&RS*e(T7o_@0WQ2UQwj|z73Tv|719o^}27!wmCjDod zMHa9AwwNI@TE%1dYC*!w2-AV^IJ_F1={>tsIp%@??h7^TE{;sv&!4u2Rl{b=fC#8Ky=P5F1)jRVIYRfEtgnS2K z_oLPUcn*>r!~R`txn4s164e50SUkZVqilK1`6;M_vf+maS2b@rmQ+e3iFOP^nt2-| zfWhUnCv%VpKL3ru^i})jZE z;)`xUZS`c8YiEIDLLs{}i>0$TIQ8Vimk`uFd6w+ppfOv~!XE z=2SD|V4BwMrVhX$YO&?)a!G-cCKu(~|KNkN7Yy!AeeqDFPqyL)a|^Mzv;kCwX@K=Z zS{YD8hZNUOI&ksy0bYP)^CyW`^b%`%er0KtiWHgkfZ`lUxfsX@hE+J>osw z;1vJ)V3!)Qf++EY(!;w=yJO5KJ?WSZIXITi><3yF-~Qzq$^ZZY(YMG_K8a$@9ArD& z-|pu5JChn*n;^joH@PuSGV22o)1JH8$+wb*IOGV+YqaudWmxJfZUmB0j|{Otg$nCl zk5=Sr_!AM@%cdupy~06Hss?vl#F7}fmOcjKx5>O}&au`Cq!tlLs4~5_X~z=iXn45G z7*?$H)GhJ_v|XkpA;+4tB7&T>!o?mDKKxTbs=b4SG|C@V0bU-JAsjcqP9)0-3+H5h zPl#Sx&6*G!T>r#<|M%f~%V1h&+QM;;uu4s~| zLxiJ~zbaI=z8n%}uE=ZcNh@l}kp{xfGn!xk{IlU9YQHA=iZo6p(!jwx>Y~n5nR}_N z!(aUX-jz^JNg$gtck`4|Gf_KOOF@_@hP8YwNUM5n6geDfy2x5WKXoaEXMJD`4ul3o>yAL}1j z{A?%IO#dF0ZswLBUeOP7ifS+3q znW^60Z-`?Qt!c;i_93^@6Cp8Obf;ozB#-40`&+3%S+A6vdA778_mza=+CfU3IpYnE z6_ob3aOIa42m&?`GpU_ldF^JR`o%ou?J=Vwsr0kYbadodYyNc0AyFOuY~iGmc#@tZ z^R`+q{>KYjuwDTE$09>8{Eu`*<*4#Mj*!_%dLuF?JTS5H4r6S)AsAX`2L<=);uUmm zq~*#$in9UY{c>wRVP-^q)*9%^*(V-odeU_eE@DomHT{pQFmlP$i*ko|6-Z}7(F9F4e(%;4I z&`#mOG#CDcIQ|ekTtHd8@_+*7%}+1{1e8h5P@r(&Id-Sw}pkufvkt9Ej1v}ik)Ohl|Oc&u0m=zYA#UWEXd9;pr5KCwX}H$ z8fQ1v2d4h;KRo4^p{1i@^TA1!M*n%ZN#PXfwAc&z#Mt#$lwE1vh+2us zrv5y7mDcWyVFax4rbBdr@%*JHbAU%7tSa*?qti^Yd{g;t4Tq~e;WA4BN1vSu&i0+V z0IvA}f=2_D_cQQZ#r`O*P(b}$Zgd1{piutO(O&_Q?8bD;mw6{?t9e)}+cu8tz97+t zODHj4YXkI<;^tttDYUO-j>H9tLKo*oq0)IMjW?uibTiIENFUmm-a@OanAsjE-uLBE zzrFD#KD$N$^rV5L#FR9@V2)9*m(DpSrH{oa)s%^h`he$*CFMtj%ZF;&{^2j@SK*5L zj+O!)lV|_%C=^AHH@jSTclOjBmZIk6 zm-`EkpUGk0wR?*6xnAsxaEvk{-XqB*aV_;Eipf2T(WEmkg+G3?yLQ}e2%s^GqFEB> z?$*O6rz(S6j>sK}b^~~zV9SED-beL4vD+stjiF-jli)NfvCUPK47w-~eNVD;H))`x zp5#n*=?s_ZtMzV$uER0@>3`t6Zco(C6Y2?B%0>*)&2#O3r^ANv({q{}%W;gK# z*E$K#*0tIBUVq*n8x8+y19oCT=H)l(Lp>cf>puE3t%6a;*CFIRPVtOw~!{2pi1#MHhB&ho}`Yd~xBgPVZ<4 zN)y`uq=;R%tvWKK@RQw=j8q_H4+zEVq=X7+MX@}P0ng-f7t|DtW-&5mdO6K*@dQ7u zZ_Wj&zQiJ(iLJTCG%FJAc)wONPh!|t^_ykD^GS5u5X^&p@!`UaqI z65>P3(JCJiaY@P(dy(O>iyNGm2FS&Y5_S}V@>M64kB-}qAdxGUFs{}rv5*S@)R}3M zXx7Rc2_lnfB&l?hJ#50w!M})D5MI3OPM%RydXdTROBRwXNDp%*%CmEF9rJMkOy4W9 zQ}~~O5ID1dz%`KK&`mUjbQj!6dxWh=e8!qT!T0om#Ju_~sIO;u=tr<9`u78Wisny4 zqMs2!VLl)!%wH~1u`a_@5d7%u-fX876GMYrrz{VmC(MYvNr_YLQY9)U(7Q_g+G>@A z+XXD|O(H#51OUPAy9T%{9%BAcOVYH|qIKh$Hd-4~-uX-LIzJKX;N!fePyqdDwB`2^ zljL;``;~Z4QWONPo~K)`bF8j3h;Lt9J&o@IMQe=vIkQA#9gy&#BMa63qR zmY(gJSgnijDS0*GqO+!m|M_o zD225HfJ6SKR3qfHOTQCC{XU-Z1&KuJRT*jp`LT@BDQg8rCeao+l%t%_rT_^r!_J0u zZ7l|LbE{QAZa^-!KL;~S?U@1(p_SQwm|@lpx4JGTC}pO@MY?k?=}LJ=)o?`Uv9BXG zR@M46{D+$uAVj2b(RE8GWPwr(Mo9$U_FaDN(OVIY)%?zV&!(1Wbl`GeP14;b+|zZ4 z7ilX!3DI6+s}if_8=S5V8tx{|PSwk!9TO@v?IdxC!ye977GhpZ0IEMHnMG)VO%m}R z$w{+aa#|8>lZ4$gd6K;P>H|`^vm*pGfF{N5dVv(zuaKWXqvh#1t>ZUH*GEM(vob4kgS6?_9XZ&zN)P%G6AiA+n1CV-oL^j z%|M3Pp>i_yDItQl-2UQ~qzj4fXz3sqPwI9O^Q~tvQNSNDHKA+!QAXr9?+7IW=>3b%W*3q_N-W*=zQ*Mc7^MDmepn@8@7*mT zM*3vjEk;}((C_T#ov*#}R>jtSeY{lg2ztqc8HfJsaSKoKFwpHR;y~W%OnBLGp(t*XJ&-1~(Qza} zT6QF*6x63uLW6ZK-egSHjxyf}OOKsqdmwgCg7S$9rZRn(V?N7+O-P!!NB+A(;vweE<0skLEnKEofWczlLXU?MLx zA;Um2ILzH5 zr0z%#4L4MtsLusr1k(1M7t%gBB$gFyFLsTAMcoy3u89GskNu3yKi!(o5S2f&>WvCZ z_h#y z%E`VU!MVO>3W*kBN26PBjmwU5mql2fF)M>eAXX(9;#z$D~YVgzM^5&^k?)LW`Ad z8N}=_YS~|E(aM??D0c4MiWHIdm|ZWYQsIkNJ70jZcgvC2PhPNZr53Y%Hkc7vfCU3s z^4HTp9Wx_`-9#4BkJ9XG@pbPAnC_Szlh`GmUnxUDtjO18g#Q5bIasB{g}bJ(1#@hW zA{6TSmmfJvV!vm#o}ncfM%fkbF4{ zB$~w>=EtuezZ5c%Ok?LRwY{>>F6L>wI*ynB{z-zsxG8ix!a68bHu1Ib4D0v1v->Kp zqrx+FY;2*O6{0vbz8jO2;eH}?*4w(+!^I2Z9rX`Oa!g=Zd&5>8k0=PIWw zSPy4cA*6g@)Yn0aEN!b8xC-aYJw_&miuZE1DftaD9P4EM6|?$m(!6vo!O3(zu6*9y zj50QWidBx?wiGgxBj(B%#>9vLNYm~Dg0FdxDJ+{HH?M*liCt;!Z(~I3Xt=-YEJK!js1yt)%?TTNuYO9g2!oq+6Ix@Jcnos)INmJaf|b~f}S8MD|K>aJTGzkUDb$G<=S z_v^o}Y;VyWYn624#Wuhc5LAC->GE_eo0eAz0r5un_Xu|lk6~F*U(mY9Y{P|It09F% zi_cE(rX^Vse>D7iR#{XVruFFF#K*j-wddnS=hFH`W~=q0vYU;h))-2CN8UUFzgrRR zk@ZocK9Cf2)pj*?13DmX(-q*jS;0g2BMLwvTKEiUk-b80t+9J2hN5tYc-@)aDqtC} zR?$941de)&!PV%cmmB{c5Ftha?as`vp@3tk4aVRHw(U-aw|sq*hdb^zm54m~@MPk0@SR*3?cKFmAl+WfVbkeTc#2}KT+lh~%| zw@Tg%Xm|Z&8IXbWA`TC-*n?qYEfDAsLCMb1fk#xGl==-rSPqv2irO+nVDL}Xs5S*K zjDxu@BQ<5DsS}d;l$x?d8<+xD_q3uY&EkH1+3M%Gl6*fXC%!XTSgaS|CV#xjP4UOrq{Rgd^p)B6Q4Ro${ zFEgIxTZj-rjv%p^I1UmVX;Cypn(Z!ojOagjBeXX!CHa647wP7uSTGB;f%`-t!7hj{ zlNYn7v9&mO^XTq4ls-n&X*8t7D|G7EAC$$KCwH8SlbaXqITH%r)M7~?YG)HILt0m_ z@XVS+`nzMcTcSce!UZPVBeAdwXeQdj@DQB^m-$Ai&&4+3Wcaj%37K=?31#jLo2f1mS9^k{QDFkLNrY)mTQsNxrnv>O%&L?Q41In!wsfbViktl0rBb0H1n6C+7q#0E$%_!(kzk3J%iF)yY*9fmu3#bZ@goagt_8hKH{JSM7xsprjwZ|wG(wF2EAuG8z0ouEy0%j;J z_Gz;$_l`)3_F(4JSo`}IoX~K^N@v#I)&a=NyM8CvFaVx+GYo89>_7{7-w^e*@1d1` zE8126vS&0ft_X~SB@>M~+OoGhs-beE;w7(Z9Sub%2k9goZ+6Csuum)DrL~lvcMguW z++p9e_nGC7EsxW9BPQ%9-bLC-^^-v!jbbxDkRRscWqJ&vD~FfCBg?T!T&Lv-`>qga z*X<7Vz-wvlDCTV5I&DZNm3rKPm{Z;j7#(kq^9<8||k&fkE*I=y%_!Mgd zwG}9BBGm=8=}=Y^f3F2`MqJ-3zym_>v^UaH@0pcyr6KI5aAjMu_JhfOmi`H1IB(vx zn5@;5njw>2<01M!H$VSZpS(mPalIL=hf}wA;zcv6+|K6-jnaHXX>Due9LybQ42yAM z7~dJ6{z7!qtqttCXW_8g&_Y}QTGktah^Xzp*6uE%hIObFrx#6WSBWMUjm^}&nO*sg z23~KIMe79bgqQ7QR@{m>i6e=o9;GII)?!l&v!qiNs1T>ONCwbOZzNYcd5xV7=#*V? zyuCLRnr~_65CMXdWLEl{7mwgH{gS)o2nLwlsN z(II43vX8td-%`kY(fKg8B0ji~o#xCdoEKD%@+{GrFlKAkyOZm|7wC zrkYr=t(9=Qoj+_g_)B)~>8|<-S7y+&KB54^Gw~3p)im@AAg)h!V~&KdqOSn6b}|TK z#iRfXZPgj#Nu~8>cZG5M_$fvM{GYT`Et4Jq;=_;?UG9k|6hSq&82`NprEog^~xC3{$o zlHtyuPn$7@n~`5hS`mrfu5SHa3zsjrJ6sI>-X^K>DSC3429`EnLThbtH6ZI&hh14) zTzU0jg-o8}36sE=xYV>7+(chl1o^5s?ui!S;H}+1s0r)^aEc-di)Cr8sB9;^3TtZ%lv35s{=N?rh)-#_p`~(p45*SU|yL z5>b!9{DnbuGkaDK`M#46& zq`%MNp6~6lKKVt8>1 z6qUx1n%s-=#b-%{X|=>mm|l!pX;3Ae$`|gF1?=vo4Nw|w_?_tz?u;1I6!|{uab-wh zws+#kNG^RD%J`?c(XM7x$&y&BwnXrGc4G0mG|eQFOuuTYI2d7lrJ6|5yuSrRGki{F z2WP(sgZN3SPr5$LO7t}#BTb4~voRAdLgBHmDIRj)|27*u+3-V;G^8VHKG8m$8qTObr zF;YXqJ;(OFI3r@r?ApS$%eBq3#S}_5oWeq_bvCQz7i&oB+wQazl%hF>_arqgc%yTz zY3PU&CZfXP)|Nt??RtDN^Y)&!$J~?hoKat%(YlTV4{Z`$pLtD^LZ*|21~_$D;Vq6f zm_pxBF;1aFg6*90B$R7IJyc5yvFP%PDZi5TtP#NoVBoBER@?f-)3xp%U_BiT&#nv( zY)6YiPv!<3-<=Ni_*?com6Aexq{FMze%%@0J8<>>5FaC^eL0*dyKKH2uTCxkw5vdd zLYz)GGX34&uG(@-i;Y^9#lk}&4(qjFC9|O#tVAX&++D7SblB@|m+#4ob#JcMPQXWd z*+Jy?ezfwidbGh#$YWH`xJMg{sHr~=7Da8WADy>LPzUb=s|JO?n6f(a$p}^++K(=8 zo8E1}zUW=Ev0v4D$Ubhiq$8`{o>38YOCoc-FdLHC)ov_CTe**=>wpfqD4#^EaA@yX z064G)^)1rCUFcty#7VRZr{L8ur2ARv&xU|8bOPD<_^RpkUD z-X-s-Tjr4@2GooG(4Ti=1S^l);~^rc3gZq(_h-B5VM>Jt5e<}Ay4q8F z5>XP)E2)?#cQ>skl|8TCqAp0UHhPbR*M{M5yel|QGTu;rWz@bBJ_Y$1pf)acauI~h zluG5>gV9rC?1;#;F$zw1biR1x72XFcq2y-u&<=M8!?AwhzkMEU}HV|FV5`ng(rOref3 zBa++r*>c>1iWa@%h)~Y1V_wTz79B*6%<=W>w{TdbWjeHybNa z1?rZ)(u29gOwq%3`?fo|iO>MqZKtzN;qFk^KkG?h?lx}H>DxyA z;X|GlLnscV%IYxOgGXs;nMJaW26qBG;Bete=gSD_4EAJFbIcF6>_D50NzoSABJmhv z-%Q-JN0H1Z!A}b3IR%c>19}_IKrv45ApX_L6j4dZw4L51n?BTY=KZqr3$Kzxg5FF> zq;yJG9TNRCufWMmin;9MylQ}X!79ZQB?{!pgq-U-FQVNGcQrRs;y(b4%?P8po31N3&IX$o|mTbPyc{tmOx|Xi#KBen!E!9hD96hok)F$YYSdAi4iR z?d6R>PPF;BsSw130@mx%{3B)^IY)QdD`%JO9}SO`SfO{N0s`(Tb|g5G$#=~ZJCgEW zM520aK^FM-FO&5Ob))-T`$FOS9#K{`Ntg5J=~^<|#zLq;PxdG<2*^2=(f~EsQJ&6_ z1lAprTha;r3vasS1yV=e!s=2q(xyl3^l&Kw=sNL{h{rFbb~NZMEK@}p7OWxAT*#v~ z9$1INV3nVga>qSW^~Q`;_Z`+O?q3}Beoa%5W}XT0#&@xhr*$%7dS0nS_12zfV4vb# znDz-M{(^k4K|};u#{fNvcw+~EGf}wU++PYwtgZzpkQZx#4$E>VlWZpv2w*pB%AX2@ z2Oyj_HferzC60uB&qzzUcJ;X#2yKk!TN?FU3oZf%OzQ3M0dyeIYjO`0GPO?vMTmduGui4YLIUChi*eFrT0&Dq$~?fX|ATNL1xTN~QZDvIk~ z4Yp9C_O!J8(gN<9RMx6^b8{tWu=5M70_aV*rxVYk17n{$h}hC`?g|L9Ir&DfF6cDO-hhN;iXTgvd>9d z8@2?n@pWOZs$|Nev)2x=#ggP3;-S2tWCze>h>-x&dDc4mFeq+T%U?u(I_Yn8NXkTb z#vwUD!a;y)A#?D-53=2zCZ6{pFR`SIu}{gXgRy`=BEN}Ft-SUvA}9`S+Hf2EsQg?` zBKx<{WTi|ZTifGSmB~!2`;zMSr-^zWR8SjYD(ee-j(-=4+nt#X*^}Ljd8ZSxL|bxR zNsQ!=;(kYj$R)0q+=Mhv6lkrih)*FO9NdwpsiPYr14yKPinOKP!eBLj>}>MDvB%e$ zL>w!?JJwk}jOO!FXJbB>VoA09G#_0EijBG{Nw`n;b-pg%y^`4R=2jsmEY>Mn>Y3?b zXAvDii~{4dOGZh>@Z9pTl7#4tNPQ;y=#NcafJCRG0@ayYyDM*TO3({}!QHM=_Yyt0 zSgAx1HrXD4fY zgX8J6qdTH1t+E1D?PjKQyw@*a+<+2v6O4@fi=VQvz`C|}l9ONyrfAZ1th4%V?IT}{ zy@Mvr4MQnbIMv)Rf}iC#+6M3;q$)HI+xJ=}5^9qMbC=0pkZ4T?_*MXz_%T7Wk8 zvz8*;gR4WO$Az{Lv+xt61pv)GkUWGYl4cZ<`i((}w{S|29OPzDLuDKMzY&H_f<-U8MUUEloPF53ULLWL( zC`U~P3f4$%A>8P)u~+_AJ*i=K?jc=Qq+|JGa0<-QT8f6fv9mI)ozxveDe7~IA+^{N zP6swDs&h=8J3VVhAiNYFRM0~xN_6QhfI zr(HC3Gj${lp=9sPcJf_l=4tQ3)h#M5oa_bGZkYg4cxksAQ)EwiUICk={-(Jj&F4x7 z;GeU*g~8FR;m!^-A@9ENV95J7Wv>}nDUc`)AvIey9eiw%U@|asMicSz+iZZ)>o9O~pfQx`o8W*Oh z(1tc~mA+EAj;4?5d2Q}SEX3H(It#_rT zvv~wRG|2&B*=XZC55Q^XqdPOfa(CVgq>QeLr2*BwNCJ9$6O)fzi;3hYVx}O! z2IUK8@t|hOPkWOOA-Rv=8;LhniIQrqvQ-Sudjv=;r6;SYC zl~6wZoYmbB@7d|l>pibp zT<}f;_Vxi}w>IGIXHYQPNk=!uEW)>T2u`d}+L}$g3IMY&%B|CGj@+BXje&WjM?m!{ zk&NO&;5Lf|I{hl6{|Xz(nr1bc=z0FUgjec6RXI|l&$ox74A8aH$*|YFWWbo$!$(AZ zLS~vYQcMuAQ!f%QqN9tzi8>B1-UyVH)M)h_t|k%{cFi00YtoEYd7Df02Z_yxruAf! zfBrk&tDKWmbfdF+9P|3$HNWk>RZio(Md5mw8A!e>MOx}Fxqn$rt^3{s^PD`4-&31O zZ&DLB3!5h7$!FzZ)_xZeg%6`?cWH|r4y|Pn|K7{yXuRiYp z?hWhkF$w|W7_(w2J0|Nl*8Kz0#`mixam66*mo9H5we16kzt&sj3_A+qII~C`G0@Ve zWATq<-;UzW6tc&WCh@Yfp1h!jQsR{V{ybdkPcL4*tvd_Wi(lj@AUTew6y}0yLdWMW z7#4sSdKrlsY_0<=!_eWDt4AtKh8shJn^|T~c|&l|F2RjRaI+7$?;k3G{<{YSy6$Bx!}$tkZ$(s{I*h3WU3ftt}=m=5YCQ<^j? zJSsp#I?}Cx(WCgOi5-=j90A#-%0_EQ(FSJSn|SQmfR@A^Rf17EM)3-6SM5;o*1h;h zR~vIL28vd`+9MbH0(VyLOmG%+b4ac*;;28lD_skI5dNTx>6%iRl2+@)dx=l{fr@49 z1bXorvosqZk<2ID&zXPY0V~cRMBBFkA@$M||K2i|=E6hw-i5~*aml&rPj(?bZ3d;2 z+1A{e)`+a*t?lUQ?19(#4op;yW@nHa3oJc8fn9vTyRk=hNe1a`Jye7hMW)1D+pc+t z18Re(vepTtid8E>2U;ds-g$BG{FJfQ-9tO~uTHb;YDT|RTM5bfxpL%EbgvPV<`7;F8D$be>6j#Y5(8#^fNn;vek(UAe* zis@52`-H(YH(Gw&7Q79qO?lJidOWij1o=0oOeP@=<}^Z9*6wYRxV_sHEx=kHcC1Cd z4dqru?9N7tfh~m)D>Vvau`FDdOOlbTTlPW@+F)JXf2;zlG7-z@_00lF=TWc&YbDDtMF4=_GTeX|0im2blY0d(BH&m=7xq|64%rqf05? z#V_K{u~o}KQ?Ia)6k|3~5m!3!M_7p+tQld<*&ls zo?o|C^z>b;VMcU>pUbYNR{_iVgHqpXh+9ZI>~A$;C}-$U6OlL43-RYg7baHXlxp&| zkg}!is7+%;+O5*xl7Gkq#4Tw%1?bdI%a_C+P{WYFtE7+=O-9g9HPIgG80D@Fv)z~i zv^{Ef+_t@SqGBHrWq>QK5F;z>G(_IbVr1jP#v8PIIo+C}h7>~ffu#!ExnV!kxnrrv zDWbOi(Al`Z)7b@c(w9KWF5O|HRC&?BJ$t%BT2igusQ}A^Rc*%mAY{ns{I~z@(xnbY z3rwq|{GvU2o7}i6EH>kjloGncx+w%N>VRQ$Z#I-mr#>ZOXpyQ{J7{4hFkbuez-KSK zs%h5C?W8kW?7n~f_79(xM7Q{Uyq9`qA4(@lmwP5QCFHKx8?clXQtT|BD{RS*B)zMj znRp(-mK@*l2|&w3(0(ng82gz+&4_#ocae%gXT@o^N{jSDo3;!OV!J~E2lPfI zhx~?E&QF)$zrX(!q<{Ytr2h#Lt>OBn{GALc=F%dpuQ#GU0;vNDRd4Lb!=QgFQ4hbf zX}KMQXvkN&PPS@w607MD@Rl*Al;x43wXc@u8TCE%hnCeSSv}#upgS7P5 zktsNN5yizWx|9-5M*8(XwivTX9W1E^p|+P+Ehd$gOpur+#6ftl=@nRO@I)@c*Sq2JkAVBeMM6f}C-cPuLSH$snqzO4QjEYdbAV`3q%FhH=yo{`qMil|x8S0t#{ zbM5$iIl6I80m}Ckold6u5Nv+uAl?z8`uRmA@Fb%YC%p#VktCd(AflNGkT6fc)=b8NGK)M=L2Sn?3-QH{tB8TRI|;=vsq;~OH4 z`6s_K>e(d5VG?3*puUarcfG5H){q42j&6c*I3!Glw#oY&HtELQVR;x?Zf3Bw#X#Hthz+8&2Mf z@3Sfr(*0IyEbyC2HZSW&qTt#a2 zj3HkP8e8ry=|^L!Ai$m*Bf>)}F(9@jAeb(-Z93SY-qK2|atdO5?27q4mYq=(dgInR zdmcQW-+u6!BC0EeW~wqetVL*nilgkWt}!TOehTPpWq0OGg08nRsFM}Zkn|+Gk`QZs zQwllN3$wGDv5Lqfaa93Kk>=jMhLgWxGOk;JX(7rpfd`?4%_O2()?lXQiD2kC2n++X zSc9lV334pJaeRA%QEOa6dp=MY- z9wGF~gRD%}E6=}n(QfWy(AB}rKPbjSUw{N$vI=|P>Z znXje^ISB|$@X_Asv!s53HurD8e*TahxLd_9|A8U9aCb&|41&Vq{}FaAYON;b`N7xf6@As~E>D1V?u1FES1t0-(*f6(UIKA)@;!Vz7jd{ulQ~^k=PSQb`41ckD@{B$iJxV;(8I=nY*ZL=r5|< z-b_meKCWm?Dvwg%DUL=)sKjyL`rT-^m!x9rb)22nEz-%{)2OVrFn1htSPmgi#?sd^ z#qD>j)JYIuIWUc}f6<$(gp)RhzUP|3SP*j{4Wq zqZzdU^+7Q}?VvRUSg?e;>tO4u^S1opud=Kp$z_0YM1^Sj;ElVSh(Q$gLXn`<6fER# z+weILIkMUHn(agaVGMv(3I0S@mi!A^89(4fyeO_OGE;JGI1Amii{7SgAq7(=OA}|G zJX_tQ^IRoS_~%F+ZEVp+uHjgmdIzpi8OkgDjdgYJG+3f&-@6xBus9U#5elk$yD{9_ z>xCcsrPdHT~or5{3QrWPsYk zLK)+v)nJShYJojPSZpL~$IF{%kT?5YG?&-}XBBO4t$I^sx{ZwA^fj}OLGjC6%=1F# zq2NU+Er7TBMJrO=XrjYg_>Y0y1JJtdR}Io=Yr@bM{D3N(mW=f1%vVi1^;3ZJ1>o|=nbSTg; zG(OWbr~3J;OP?Pulj=2`v>K#wDmDB*Dgl+mqvg9@X?cuMLk}m7!9xopbL+=>;3zzC zwxrW%PIM#LPJ)OlbMFoo?-r~1h@w*b*K4U<*7Sb5qQ^jTWU@y5#+?p%G}sg^YnJ$M zC@gM$=Grt-NfYs+aT}NiECd60wK)1+g`5n+aBxT#R@7Aojn!-w#F0NT7-*xZ#2a&K z5eFC%JgpG)6;9BsRbssG=#(osB-lU=<=@SrHm{V&ZtOkj5t2-sOxn55_E$kW=2dcb z)E2O_EM|@lSudMMS@%gs*0A5^n=Uuol_` z=3b5(5ke#ZW|qsM z1PuL>E1)Qo62zjlMF&zZIFI@f*h0t^wN%XBgG`=>Tp;g~BIMLzs7n&%uszwkKNr_2 z&QAA4&L12`>K1*X(l#658;MmH{Yyh-kGz#_A;X1Lx&V2HHFhZK*g~gOjWJ{bYB4wG zS(zXril{2kChn4508}Se-(rrx`RZG&^w=)5@xm3fyowDlAJgKjjQt}jN<*~R(nP$& z@N7QYa$XO#ubFE3k9Nhph>w;SN*ok5Yypyi`I5}v?O>;kH$Q(U$C4+zT*@C`A#M?j z-Wz^1=Ye=`V ze75Gnmz`QxwGfo<79xTY+mmgz_CgZhmzKUcnMQt+X@S73yh}}Lg$+sSfQwfO91|)e z)w)_~Wi!Bokb7-)xW^mm#L?6`;ySUJS30I5O1Z6OLG6Pm``iXEw2G4|`l18G@G$4N zo);Tz-E~}~t(}POBAUcSh-=t$h8vkZUvWveroO7qi?w85CfqfMn%aWL+>Gl%e*q1& zO_0k;Ou`XvJALF_>%6qDvzdkd!1BpT&)Xj+wXMroq3tqqPT0?E=Dtb9iMVxFs-Iwx zylwIw<3`qBk2HE0HKld4UeSPPy8|kzg-40o6h*3Qtg?f>KT3nQ4lY>mqwKI!TS>fy zHmsBge#E+r>zQk9S|*+TwBp%LMp+)ALTsV%Fs1EjHwD%$h94YgCkB!sGAk(ti-4%? zwCcq%+|1193m8o`61G(tK(@*BAGw>YFa;Za?DpOP5MC!fV`mcpj8NJ&IIoEX65)4? zTwXQ&rUIWOvVvun67k@HF%N}KjOAL0?d?9D3n;V1b%z(3_jHlD_<7O!r$B;Xkewul z3YJGQLO%)|M=T-*j^?grv$*Y_Zz5NsY4JJsLo`dwOAxS5>p7x)hTSX$ZZx*Ycf*dH z-P+SF-7b^ezN5%t)}q+sPAjzC{JU6wNXIkxQ1QW=DMA_|o98`;ONUjctlxi8iWs4B zqX@<#dko*Kw@JfRc&CkES$srQ6@^ADtmtTZYdy?ELR;^d1^9PdhOO$0J_@iO_EILC!s(C#9lvvmu~BQXlf7W%cI8mO=~~1MT!6iPcJ3(n<&Ali56lm{L@8uXZtluy$4A$yLQn?oBM>;=Mxkj zH&U?xedyT{^_lewV*i}{!UP00pR5pWCv`QCQ&)ZiFN%Hm&C+*d8NJfI!E{} zf9D9@e@Mbu1J?xgI0JKAeLz89BAUP)h{>)11D0e|LzxtZ3pgvhc@4%O$nel`YIiCY z=JZT7OD)l-n#sfyC4MT$J^6%I^Qv9NDct#M=dk`@dng^|X1;xA)^DXsngV(hU-`hz ztL5*%*qwF$@$K7B)?@xrYrDS7kCA_lb_qO6J^wlp0b8P}SRSo4kZJf)-b803BaE|g z3qxgyxkC~8&x?(3(Oe<+*hkAo)M5l$0xI|#j{g^Pj|x9xZRP5@KC`bqV-#=i(9&5) z9ZGPtYHaS0Rr6nG;ISI!)yS`4W*kn(m0#CnZlTGh#1!Q7E46oQMBG^|TpHtf23O3T z#N3K`Bnc7C>NJs;$8fj1mB0$0IZPYKws-2)7J|UVJK!YM-pvk0gAa+Q-#65Yit!6J zswwlYM@Pz;f~GxTrJ0UY;NAGys1J0&@~vXS<(A`L36lKHeHpBH#kC^ewkHNr-3Uy6 zw$I2&yaz!%gP6tJ?vs2WL~PdN!gkZxD7_=OJ8!yu>D#vA_Y>-XrtK9i#ozj5$MC92 z#V6q8BkOYxa>Qw<;qQjYQDWGn)SCpOn7i1yq&7em@Cv=UST1uy4DRj#{dJfpZTz>O zERnmr8!??vgf(SNb;~zbV-nvCKPxg(f#Ycu#13N8=Coqh-b$Ss_D)rE=6;ww8#B5c z#eGK!%R*m!c0S8%|2$XCV!M#~e;c}OBLN9|(wL4`XI2c&5J!(?d1@IW?WXsucx#bokZ)-tSZm@`KeX=M} zEOky|);t;MF3sI}SIlQ`>xET7>x|}8UN?gt)EFk>lx0>Kd**srMvY0gR+x(lN2qN& zwArl#UN_(3V0E>q$qC=WelTqz4-pkrB`XVK2gK<5lGWxZ+AGlhjJ;`33a7>0WMAI7 zK2_uRncfv{7nU9q>EX7b>NsDGL?&S{V2b&A2pz4e0O#^rq(T+8)$CtT*-v+f*)FR% zWnk&Q5OLT!wU;z6j)wr{nyIMcOAu33B8@ry64pmf11`pRL#Vq*vXzCjh-pVPobWe; z&s{n_h#{sgA8h#ivvB^`{r|_K@+sHLxlY(JCrY(E3)4!MRf?rDUaZ zT1J^KIlN;eYuG8n_?$h>zItI))|vOi6}1FD+>nD9m&4}|ApT1EZW2te$XOSIIzXFdxKLU8S6e*Z`}=29)h8{?4?Ki_YIC`LKw&y#t7lH@)Lp!4&D8 zX&6kMdR!JGf965fM*HpG-GW%lEbaKi^yU!S;laQ3@ezZ~l!?P^q4!o}B>EI@bS61K zPm3Q&Vh#=@lOIBRJwBC&ZRj_fA|GZz!G|yh8E$igM~!oCzxB~QTu&UO{lkq1)@@Yd zm5yVxk6y-~KXZ3SrJLwkO`!P1+T`Ci{ndV{^!E?uw@T&;W@~7Jh$ID#?OB)-n=~d) za&so&jV-)0%!}7 z#Dp5{m}(RS>56WXQ9qT5r2F!9Z|JtxMg2qyx}h!C7EkW_MMlyQb zc0%PV9?tG5zDgx(0+nnfL!xu^1HBN-ZD0W-2 zn^c2{$ct7HDOtTNVzT>I;vNmEg|v!G!fjpL`B37lIG%{?ER^BWi_(3>TiqtQsp?9o zzFi^BC6}#i`Ym9sAe8kBE{s{?dYAYuTV*?)I2kL>)r*A%Iz{8Z_&ow{NT( z<3)r`F;)|jv&||}l+)aocvQe$l~c>mYK&Yfk8#dWy$43p*fh)tuB$aJIKv_VQxpwQ z>Q5(tM@;`R%Cfm$Y94dF(zZ{#3C>xzR=&vuw-w%=giSgto4vIUH!O*N4R4Ptm5`IWGhjh> zbj;N;t~~N$@R{&LK=?QbR#;@{aGtMMs`=C-HbN{fT5>1NI zVGLVn6EzYkUZUs|5#81Y0S29%=~1XlYBMK;zDrU#B_U?NYKYM)4M-mhs~yNpiQY&F z?98nezV$8fOh;AW%7}~n=7%!=ISdl||2Lg0H*`EMrDtUliMm_~&$6R62;`WAWVM(d z)-JO$)U9`AnB)@Je}b(oQFsBA#b2wnP6j%{Va zHawN=`wnCS$(=*4mnJ18WmdQ7lJ>^5uN=Y&llqRk8E}iTqk?2^ONvP@@4IEQZRkw5 zlLZ;1E$mKc;UJdT9+j4|-)MKaL{B0vU#!At0!Tp&@5&T*IiMf}D=I+$mBW$bI5Hsf zeGB|w$wm1Nbw!44T7tIgNCrHNGNN~x-3F?7pLhBOGZ{cKaIr%^2{&#Xs|HSl67l-n zR0Cb1E;cRE$&szmRNx>#ghSDBUHnK(SGkf%qX#;v_@VUU7aa>mVJu=`D}f!|%MT;>^-TkD+ zKCU`M?1WlGPd_`o?-y>ftw7wY zH}Bq13N-t20g`Z-FKQw3h7x@|kwu3bcmr(kn?h{WZTV783SB=b@Px}{`qhNH-UsOIAYp z@z!2gsg-yjq=)QOM`9N@;itf8LRgXDBvj?oKP!4X%V%F@w8S9N*WSsKxsw8k2r%WO zOQgx$0ho-6+l81(4-83Uyn9O{GFz6j>-bx_m6`?7W8Fp{)Mz+ES_?i3 z*`kTcPB?S$ag)+HB80b~|1zmDBnqXa`kTQ=0^j{pP|NlNRE?SJJ$PAETWQb=Udea= z&ky{+BVZ?aDiLK;WZH7&Jd9L|(&2l%{IN8*%CIN~Huy|iPC||ldBNp8lx0#oZnv85 zImuQrbO76Y$P!s#X7lrZ%nZopokeO^4DxH4jOx9Xj$U5L1Mpa~TA2WRT2(iDVd}Bp zjM4!^L`S0H*Pkk5>GqzRwkPAX%e4VSSp8X3ae?SFx- zpK)yDAGt#wsK^I8~!%TQfuXs7KxeFSQsd zylIkp^wOR3B8wkj&_9SvJqwPC&x9{+X5p2QsmA1?!Bq}JS<}c?00c?UA3T}j zjY&+r%NGtvsuS-UrcLp66J4MgSK?@ui3sO$qjZi-%1u2`z)Y(`UEs8KT6-U+UqviM znwJ}&mlZf_ThXXZl6FNm2EbF?>*pGJ(atWJLOGLp0izwP+;nG(l0E=CJ3iUFV&WoNNg_7e|y3;Ag{ zLlcw7&5d#)ly5)TE7Hs0HjjU!!a@p2e6KAM&x^$Lu<~_=Cusm?tKRvgkP_)l$$E>$ z_Bhlo-{8aFFGRmm!lDV&;MEU-0 z-L6#9(~|JsG?bfEsa(%*;)EK#WkUrKt?EbXXw3^F#h_-QW2zF~S=PPBX z-MHg?obZ&boEZbt@3N(X&wfgmV_U7lKP<+h9wl3<#3Gf1PE9dS)>YgzKI7Iq+nuj2 z@#iZye*cTTT&4c_yVV6xYIhcKWu|n)3!4};xQL(Kt=C@nWLF@XCJHO8^%Y<+F1>wN=quXK(i+9YX3y4fSqhJKkjbFOLka zU0sb{7UfxqW#!3Wgvf&0%4_P)b?x{o9PRZNN!$visluHr14CVt}N8?YA&HFRSjaT zoEnI}8ySHGZtBkekt}3~O8nMLN7ZuOEVL@p?09|XN)oq%dG>Htk!geL?B6lmOb*Yd z57KRec>WA6=}@Ct9;T>w#5Nzo>~apTdc*vILsKwFD9<$|LX_*vwT3ILdZAc3??NA< zmhPI}>D%H@M5DZ*OHVpAo}`G5@XMiu*WAnv2?n4Q-mQW_b}~Q1%r(rX!M#1LuX@+r z*r%E7<#dX4_AR<)Q#7WfQ;Py*I>mSQ-rCnMqHKyR4Kplf-~s!ElU;gXn1&!f-Niqn z3{h2eAW6hsYG@3@fgQD`*K;q5TYe)t8^lY=6q~8HV4S0N#5;NERL!{d(I7O5J%L>_#*uL;v$YUy}^5s)lUMic?BG-85U8pnT~c6 zyHD}(OmjIKkbtttI8eLH=3O63wzN;R+Gi*Ko!NY(9(5;}CsP_dl1gw_dFqXAh90;i zM!f`70Ov%(x=_I+yN2(Onha#FRaqc4JVPPxG2BSju>3M`^g|Mi3YIztsjGWiOVUR` zRA@O~xeDd5JM(;+f2iS;p@-K7ZB5+lYr45yMRiGj7em;FbS6cK2Y#a~2-Y!4U3UFj z`Xnl?HKEqt@?fF7p4xnKO`F#mZOwiehNmGtS4nZmYe+XbxV-7Lsa*F#+%{zy8kINu zm=v>$q|v5JqEL%bD;I#oX`|$Fn7kJ|LYAP*0WmmCV21VOfq30jOOFPfvLvr2C03bO zH-KM=2i(vX?{87K=_+q9tEez_GEgn<6mnvmZnzbh@qaPi<-JqobjUqur6R~M!IU2W zJg(8YS;KY)lrv#=@=CHgOCT>->J@CkmLNEHH;Fr)eBLCCyz_Uq*opKc)h~v7g>e@z zvD5P2CA2YdQj+hixoBvHTUmeU53O+*wl3{<;M9FFES!ptZ$SLEssnT_;gtz$JX;PT zl0S!M1&^+H33B|;FS4|VlgJXqUYoCv`Twxlx88qp%+b7`b-2V&?Vpa*c4_Q3?9%h} z8$zljOB0heF`Qrxat4_d3+_wWUqX;nc!>P~NQD;+1GKJU5R;%G^X!VH*ZNtQ z#|MDnp#zc;YE)Pj2bjBT%FX@Dj?!E!N&0&1H(`c3U!`IIVcJAq5cLCk(1?Dzwptnb;uK3~5^)AQ)Q@P4CZ8%|7y~`Qdp2r#1 z_2paEHlu~}(kt0xR|DuC?;>%WWS!u)OrNg}NyONT{Q<42nvOO$vbx3xPD^oLOrKQbMOJg>BLC_VD| z`O+hTcPwO}ua;xhgP9S*kw~T9HqLb7Hu|JBQ39ne5hd$*f_@pyVR)Crj1rw>D8pIM za$HutCuKk?A{#^1ujyAOX>OdnF3-;11gnU;G-WjPchl4o-{owB`e8XSj@974%Q%U= z>oU$_1nz&|*i_KLb0#V`VZB5KcukWD3{^mLC{%hxA~l451fvaX?YJ0&UGase|^;_)`k7N$hrw~4QUfo9DtS0wYf@<3S`2I zA&A`-4lbtj<&l#=jO{N1+Q7IQGKqVk6IGT=rA@~mYLFsM?<9cDd=2$3~_nLk0$!-;H>E>{E$`{ZCoo`Zd&rc31 zqayXOObG&zBr%YlR86zoOBLYa=~1k(4#128tr*RsK?Kp?r{Ny))lg?emjr{LSQ9;c%f^X^~Fh znM<7r%xac1Tu`30&9NmC52_`S*A`Ipf8_Qj0`4-P+sO+j#%u)#cy8NFHri8vB=IX1 zq>-)ri0rrx!P5$ZG}~2reZb=J4|JlQfY-vcP*P8ZVcDnRME08CvANRla*1dMA!$w` zTW?7D)9{>18Y8TWm2A_kOT{N43@aj1(uOp}YfPN+yY7OJM4ZPTrA@SGYrE#aRt!qs z;b(??2w+>Q)vh|gjY-_^64~3{Zmj`R5dZeD{i|vsAH?p%bsNim137G@(mU<<6KZ!i z{>6eSM}K}3-4k^T6U%q0)qIOe|CpYLGATAq^O>F1(z0$yMY zo4P?U&}{7TAhQi&zS(L`vT+ZyshntSj&5C9B^>c10L9f__{*K1|7)w`xFk_*oI>6H zOYZ7T^zOHTj_oj#sdL>crLVeE8-CI0c_oADM`t0?FPcI2T!rGk_|Z=-#A?x6eDy;G zcWJAczWklf4Zi5)>#r#JUv!bkB6AfZVfwN~(Xcmv^U3^trJv|MT!C=Od?7kt%^c~< zCe|WZ`U|C^Z(ovE9qM$GATj)tgg#_>{#;}s)jVt3aa$5Bc3`D_@<Sg#(r zvy$_(!nBKhu{ST-WCy<3?a5D~GLnhgk!YaRYTMbF`2k)7fcLh4m)71?&_mmyNDY5C z;y;XEwArtR)_GU6S{{L4a_G#Q$--{qyopY~^3K*<4iIs)p_cX%1q?DtdC99vriFD~ zp7T#tnGtEGbT1TzHbOb&Xb>*8?(wZv^qLC2>57n$>af5qp<_4Dx^jf2% ztI^f`m%&ql3o6IL$s`{ry)Yt9a>BXEp+&(9NU`>J<3;^>aB)+24?-g3F!m-{(OX56 z6{xjf0Qp{Cv=Rp;cgW7RJ_Uh@Q`x|}QW<~%-%5tTr_cG#hq1jv!uq_0A&G+3XiW-K zc(esAi9FfOS-#1_h4Oi2o7^qqB42+C@=MT`jYX14j*H>UDE=j1+pRm9M4~mKDE1R0 zIg$o$-$gnAe%);~J87`pRgs?Y7ZGYg)WvyaGhy4hrNfoLY~9KwR3OcT=h79(g`2rU zcxlcI8i23n+sqzvixoSt5?QsV5AstX-n0(*9eM9V)=9lCOXuWxzoMa-DS4aNaoV)yX=>_Rz^V)L)50RLZ=Q_q$-y&AHSoClNWQd58BvE#Zr}x zX1A|0yZ{`RwHJU>&PI(lxjs)0^gO}B| zN3|6B;!g#o(<=6jx&p}*8k3^#Xhm0vobA7|ZJrexjQJEu+m91&53|(Kq%L3lf~rS8 zOLe{gke2sQkne=5+;S1YPVFkdYIQsa5ps8OUz`<=vLVNQs^J%)%Re|NfJM$lOgg09Pb7w6pT3Z)l|7X)YLII26*f z74KO|ue!tLZcP;3}6k|NVdeCOFHeE-NKZnf?Etu@l`Q?@+#fsT_4-nDS*WafHlE}z)Q zbS{%s7!L?_5p{S6paJQM`RNoEUiNpeGcpv|`qi4WvifTB1=7OBO*IcpWn~E!eXr=* zqvaDbz-QNPr%I!ZzSVz`Z#aq)aYR$#*DtElfxIXpA}j4c6xs!%84w?2k5>>blY*qc zC@%Rsl<46^i7ql>6zsHETsUQBlUyvF6X}Ckp}CW`Ld~@r8PLkoFuQ@qz^qvmdq!E9 zCmdwb(R5!VuHb!Pd&6`2QMbkAAZ-nS`xqr$sq!EUfY#w;-<8@9`B0$;bs0e=|a2Cs@{vP(u9=?`}>&+TN24 z;JbI1iPUK7AJoRBamQ7<0QRd?(QOX1OQuU(cw>A0iJ zy#{}}z_G&ammeT?1Ff_{j_Kmgbj*;%ufO?Y&o4pJoKFvHHnJc{p4D3S?Q}CHdqcoY3Sfu_>c}Y; z-ot(rt8UJE&{zBG+b^a4YJWSCRW=XCWB(1O#;vB$JjO`JFn?5i{PhoO^=|%_r2k3Mj>5o`AV+vKCH3C|Krt@?+~3dQoy|e`UX3V`!}?C=oU+;9 zv2s|;vH4PstbDh=NAVNc4>96X&OFgiEhn{gq~5R5w7+cq!`VEC+pQI$#DG(iw>Zfuiy(UXI_4qB=gl1(HBoz|rL?|4jk}X= zxAXf*{|WKZjdbQ*>o+$yy6-NH$A)@`%6$|uyT#>U7KImy<6jkR_!A$eLHogp^UhV8 zclTtw?A;?6cV*YZ@4yaie6{Z_Jofu4;CbIsDdDS})c4SunD4vHi+*qYX79=7(vu$9 zKKL%q?DzM-{}QBs#9n`=v-EUGwu%ZEi8j-U_|JidM7+NTRGQ+lmB{t$tG7_^M;`=9 zpb8xS{NQ6e{`dWVoMdh;&F#(hM`e1`5UZC_=2{-`iz|}iH@$u1-}H8+9A@ikPI|MA zh{{r04?u#=A_IiTS6XU2Y9&YV=t&6-MPv>f&<+L7F|+$Xkk#7LntpdRe;_E)n#Txu zp-BjN(39PSNqX4J2Nxnw|3BbY=*#mNKBCGaXKUoGdt34^u>@@HMVa{HrXt)N6C26Y zof7FP+$7uM&EB{qJ7@`W8{&8~Vh8fFEjT2<`$*`6EY3->UTCj43R+ zO!`9?uVVW)JXDc2*0bHR@~TS5R#QNlGv)|n)0sE9zCP$|mjn{jw47gYN)0O)NqUkk zzSGtqJ&+7N;g>`rcVm1V5ow6ZM@-@G|NY7LW(pe@IY-)2`%_TqyeN0l<)du#=f$@5jc(GC_936&|N7o8g{S#sD>cIIS+5w|KA(^^f8;wOl{fQ; z1#VVs8Gnp#Euk9D?J51NnB%mu=tvSJU7t`+Q!4FbKhLlvHrl84T}_1IyY~6gEH$W? z=SXK^%0{^JpVmHwTz|qtI8+beAlgg!)6)hefa+-x^xZweLo%|0S@0x7dJKw^{&Z_+ z=GBaC5G|1fq2#-t*q2v9X`fC6w?0XaN}ol_b1`k!Rx?A(ll=|=qTBJ%a-&6id&MI( z(Q?n#O~!kacWQLWC-CgVM>>g(X7voV7wv);{`bWBHbf)85E&c5pO@rW>*byX58P^nflZmxu$B^j~N%TuW)_k8@zJ$%piolnuz%+V;` z8e$;e49?Q{idbV0X3-Z4jyEc2|Lxn_Typo{dfewU!|JN-V9j7D@E7fD0b^3FqBiE&n-ZhS*TwZj5UxYYV+;&p5dbCJ6dtS^O3 zW!4x_`4TpDeeh&}Hol#P!FHbM$)X-S61@_ChzzhNu#?(XT6p;$q8;YnV))w~{I3`; zS?8NdEYc+d&R`ajP(>CUsZ3e{Q$=U`FuC~SzVtu;;a~I^k(*X_;B~P5Ld<2BpZdUJ z?|X$_-diC>v=#WuB3TWbZVionR9j0@aHD*7KM~?Qr$Rt|zD_%-74jfyy+EhqBd!r` zVi;sw2wIwHdGP5>4&ZKsi-Q-@K$V|)UHX#>=$XW39|h%Q#h=QlKzRL?LfS~M%0-?9 zf3d^fixH6&l@lfzOGOgMY-d48Hr&A!k7TO~XVd=5FwBmxqJjHIi8SMyIPj|VU|8V5 zFcbyQS71vxg`9)z1b&nD0Hg);qeu2y>Tbw-&0;-JgYgBZ$|qv^aixehhda?p)g~pC z3k0GAd9R(crH7*1uAyOR?rGSM0_@L@vh!OE>ukNhs+_PTHY|uGwVQknsqk^VlsqOL zklHxSxnl*cnv1=UR*fh0l@{3+@d5RW(G|nnE9PVBa6$vjahB{H&Ioz=4tw=3j)((D zTIVE)Ii?55(cNwQvUnF-B;1-cH9{(terN6~biMLpsM>kefWEnwg}`>Z1IbAHvSsha zEy)9OSUQ31Pt@&J+JItc2fagvGGApu`8{n26`D5-lGgB2x>~gejM1*x2z%i_fNGC1PiJarg}3T^kRom972|t@8skp@C*d#GA zf2{3CUTHB5h`$oD3z39k?L=4o*)6T6g0n4xQlXpN1rgUCxf4Y&h}DUsb4)ww>`~+BtWChCfv9h`@p}_3PV76{ zSom{|!<|m}SGjzg0F&2B{;AV~GSD=!#altAhVnu( zR=qKTzd z3M9rxhS%mM;j|#7H6{K7@$zD{b3G?J2sOZwdE><9bG8Pmvb9c&qr=Uack+C^csh%f zYbDY`BBD3qEUgvp_K>ac^f(f^Cwi3?^z6DX%)gT>iN|aXn}qWPoZZ}oqZ*uJBNJ!k z!C1uEeMw@bqD>z~1!K#h1J3N`seELd11RKzga+E9;+JyQrk$~#bMfBH@SH71Xb8kj zG0dyNc}G?&PE7HGi1$K04U^XWCmAZJ*rT*bp+cmpob!2|m$1q<`zGJ?S=c%DW?sGw z<>S2JdI>JiDcO2KCmX!cPcW(QMoXw4B7Uey8TM9|!r(eVr0FFwd<1`9Gq?RLfAe)o+YSLtf~xyf786K& zEJ8XgCY7F>*GrA#4c@bjyU-a+3#{VoYL*{qr+BJb0sP5s>uQhu_btK{h7gt^D7?6=%@$I|T9%4X)x2#-G|KRI$u{92|5AVtYdsI{(I2bCD-j5&Od*z{%$>$%@tM(y2 zmyI|qnLlZP=#=W(vYe0`t#U`yw3s4x(z3V{9K&nrhTw-$E;G-)j!W=Tpweb) z60F_A@np-Yald9JA9cPoCXhKjTdlrUE=GuqVBGB>XAeX^A%h|7&!J$U6Kl_p)tk$a zp}?^J7Nm|CW>m__ z5SI?c?iDOrKe8cz*D7i`+NOuP zYooTX!8u4(U3;zAH5$0|iiOo!bU3QmfR$ZmoE<#ghuoKOJam>F%Wz%|@`dd~x%}Jg zXLgs9I=or}CfsgVpGBFev!oZ_533pMs0x7a_Ud_#8`fp?KFK@{E7vY^0%#+?eModvMDmk=Cpt)!BEeCIEN zYPZ0K667^Rd$Yg*1TK;Ire_0Ew18w2qWngA9r=4_GPYi5Qk?Y+6R)gH{LNxN;IZ8P-L6^pAVvqu!v)Rj@|il2>zxTj8xX_gG&ILgQ;+G7D^M755&uo=17~<5a=rJKUn9_NI%FnY;K8kie+{c zunjf)oNGBRGW$9&GS_cjbn)INnNRZoKUCn6GNc-JqwPrDi6k)j3yj8%lP_{eBZ=6w z1Nc9Q;KIs|gV~c&o+C@lEz*ZYoI4Wu;}oKZf9Qza^~^uIjgmsIvKX^7V`Up})nj^| zFiHM&Ee@}c*)An(21A=$TELZ~e3-};OXLPthq)4OlpIALyiJmvwQ<$%jBIGBNXKmJ}i9cY#WaU85=Ml+i}}8v&)uk z`tj|@H__`vOD)>H^kfU30lDltbelQ|Q28MKPFA|JzzMh|kTx_;84ZJMn-l*uxs)y~u=BEEuo2P9|9X`U7ve*8KWNhXiMnw&Yd*{sTQ zVHsXGM=gi;-9l?X#I+Cymmb;+!8rEHq$iU*Z}`e4@`FSWmZO#m_i6+k-BdAL2fUh;NE^v!&Tub+W)fRVex8 zv-$gf3ek6D%vwaE$#I_tge1>2Glf*{Ug~*Ut{9q31Y}XWmx#x=fB38%1+@X&YvO=E z*3lo<8jQIZ`okG_n`h+hilOgjSxSQ|4O(Wha~HwtW-lzZ>0hkiOoMF`13oeE(c2CG zVs%$NAH_(OP5z^s-$wfX*Fts@p{0g9mu(;?l$00ihd9z~1~G0n$i~AGV2=PL@~ZS9 z+br;W-L?Cw2zMD%Dv&@{VRxlNCVqrWw7VF0_||8FaYfvVp6vK=(PjinVkyg^TKZ$R)4O5e{o8LDseBBQyJP5@L4SCBNt0Nv{{5G77@}DM~fSrksm||r&0q%qJ0(V zZmBoe7C|PZoE-0@p&Bi#rwJ17o;8~zqISDPbp(TSZgsm_#IPXz>5Xsu)A@KOO`Xi) z>V{(tCeq6x;W=FRXO=?W2hFV-C;LV8(0P@Lqe)rG4h7)F6K+(4c~MAmm{D;6D8KTl z%Jr^~>Yj3RYI4_LtQD1SPF~kVce%#dRcLgFjVD@~_|%n!=T_k^if@P-AB86%E?k-+ z7=7TjI#K1#2pKsK)T`u8E0`RA9UrP(E+-Tdf2q}|F(O2NPTkJeZ@0SqyqmeJ1xDnD z*zA`2upo9|Vnzq?Qg=H=zIZB=J~#4pRmmF-jSYFTJog2pgrb}>z$R`$!^*XoXB(`2Z1@ppyJSY(LBFTJZ*%c9*X^g5SN7`l?4em7` z^@hqYZbG^km)Y^7a)|6MLx74GC$SoCYmJ)_-;~5;Mj7Ofay{~Chv_*+jj;}!DJNhv zmu$GI&tb!6{6a30@UcGPUOs7Q58!(^gMBT#?l~`!9gQLqO21!-u9K0v>eF~IcjJp2 z5fO!{$Z8LnjuPb;E17S)i!7#`hCbfIRIgI$-^6FE%82`7$s8TYcbOhU3^E(#28qW? zYp7O>sg+o5(q8M>rgBL8pBNA4Q%(9{f+N-YUKTP*ROK{Fy%oU$QOjco`DPruVvmSJ z7rPcUNNMwvsB7IQF$a_;Rdod%n!N7gNq(XzXgyBk@N;-diIneV>usrtT6_Rc-0>rH z{&a6Dx=g1*DABfKT}w5SafKY?G`o zyT#cXY5Ld&yRoC=3V*We&rNyqMP(l_)vzcfJ}=p=dJbCYn`lsu&1iQQLwL9}%FF=z zx?7$}AEu+G)g;oq)Utu%f$9Znm5VgTf!&>?IoImhZ0_AaTIL|t6JpR0t%?(hI5&Xu z%1`eGmv$*XiH`c%AufDvB9?66KbsmdV4Bx=khnB zE_$I1q&wzB6GKbP&UQC@5Emg8e%Z^$(V5Y{g-H#7tn3?N_W6LoNI(DjQ(268DyCjjv297> zAuMZQ8zawvT&O{8BsoSaFGfNLDS`hX^Nn-B%5Dk_6{$4tIU0nc~bpvMyqLk z(AiWMTJ|I+`@l7!;;qZL66H!@SDk^zM7`Z)fMMCAb*ZC`Inh|9{&MpFANKFZ?f>(<9OYi`lnzGm=Aw6)sc1om`FmM&wn1x?&8o5{^m%pC|sBz0;H@~XS?Y9Suc;TS$= zlC?hV!>ZTNMBWB(O{^M<_^l~yYj{4NdpKdvIDa;4_X%21Xg<{7v51X!I0*`HxE;W_ z;unyghpnC4VWaLMDLqn@9&3=D(C>eh6hc$Ec5k7?P23*SSs~Llk23-CE2!8W0L=SG zE#%f*J!&0LMhbE{W*Ie8Y3=!RAVMnMYcXpvh*Dw6TT-eeN)@H|I0GlxFrKC}1L@tX z^pZUhQj)Eg->c;?N%Dy)e(N(wJ~oqCbyI%J8*i~{9DCppl;^!HLYID8(u-~*!A?Vk@pd71|*XmZi;e0DDovUZI;pPqT=`X7JsQV4zjbLL7% z&B5B5f+L(A1r3X*F5>1!2KqU_H|YEB$G7i)3Mw<{iICFYyaH3-52pL;uhs_c>7+tv z^(?M+K6BcE0rbs`;i}`<24VHXZoHKF{h83wF1UUi{+Rx42w#Aa_O=^lTu|X2tsTGZ zkH-*2%r*veAm_e)$x3{~ecOuiWM+hjVExjP2kh^Q|&00QI!33BM27=cM#~o1+ zrn0+1@yqtxkDr3{^DjaAQH2Rh}DN6dq!dYYLx z;8C-e-ye+dZ}(GZTm8R3d3XPI^iyJz|NVo``{tbJ|1F!(VuK){^Sn`Qj<#Oj1NX6{ zBrf0j^!@vfAA;CTh6&w1op^$5_^EX|^=W+_zfFf({BYN^bo;(WeX^In&m^YX)3}%F zY5(4+UW~^D@9<;i+j97`RoDiz@6otagLPX*Ow2zun3S9PtNqZ=UtgpReY^68VU(KT zFz|YV{V?9RNj!`P8_I3qxA8-V`Zrd|CLX3UX2~cKK!dCP_-HGzM6JjZHy6&XDD5XUFqy}aTh@RgZ*2b+N zKU=>Nl!mSOZ@|3imACtfhTV*A?`tN4AV<=t*`$0FjdLO>X^4N(iOxT@QZlX|l8k&9 z?v7hi!^6@_7E$B_Y&QPehvjoO_7(qx6JuE5CP7*r=K;v&$FElAj)T2QpYq1P>FtY* zK;&)B-frxMZthIS0*J;6_3Z_PdHctq%P3;szVbNUq7sxp+5-6f2cNZZ76EPJx#sBb zv~1IkflidM4BGM;Up32OOO)c7I+$$|i+U`p%h53q!m%j#T;uyNxppqc_xE==8rvQ5 zLDkzfn%xJr{m?IJI}t}06W8hN_wOkbULCQwf3|OA=@=}0lbpnlq)DzcSvuc)J94F^ zlEZl9AAc$j40DORwAaZ9t3vH+89T9V!FnKR!t_S|2-hbqKwtm-{->8wJeBoU-MtkUG>DTSvDSys%Y(+6$y-si@+9wNPvS>vM8LpF z)$%`K9HRV*70@D$xnj*$^QyA2lL1@`r;{!!g2p1#FKqO(%D8Kh9^2BkBuHtr+iaGi?1Y%IEWt(els~iqMt8P7oI&%)iK&~E z_A5K>L5p_Nx=xPlhG?0Z4^E3>Z0lX@J8zb0Kdml{j`IX#QMBIDVy)6TI>3?K-Keuj z-dHC(i|)NMmJC2TBcj56Zn)lhIiQvZZ?QLRU$jswI|v_^9e8bNBK;%IrU7+$ z#M=!6sSVDoC&(MqAc^aE+&R&T78Xrfp>@$byOqx5naha5t!7f{j-oUWiM4Hz$c2Ex zPVX(@18q3*{+BXS|G$iYtt8d~Jt_ocE*IKT;~L~o`-Tbff+kI2Ne9I@9@695d- z*4jkzRKfl4XZhsQ{53HzL!_GL=nfBgI<_W3v>d-SX% za>8DTbvrU6rxN~c2yYAk&yJfLXBPo>CF3b+qYgo_)9i^5(JKBU9aN1&nkeq=M*7z< z3k`WhSQDLi6426)HF}QC_V{%C?#kNl70r|l!+vKwhfc)t4u@~z71w)P#hr%vX6>nm zS&hg)jm42Km9Q6CX}-P5*7mSW7w+s$w7Ojg^6ix}(Qg3U5?ZtErdN1dLtd^z3}4at zR4=t4s8=7*ZuvejcvpVJ1)13BAN1y`fXIqDV-euzZ4m*6q{OT)B?*yCjPAwZ1KPf1 zM6&)wNBqLn+Oq@>PT}1u@DkL3&aBLrUaWAzgSf`Fh`J>eiuBfp*Opc6h8dUto5+;1 zsB?8VtWzjGFOC+ItgTW0B1^lJ3UwepkmOUNy%F_A5WU&BsY8LCwA)B(v79?5* ze#-?f-S%(`(e|{+mK!PUw0*T4qT0xf&bkLO*mB@JJVy&~2qlULVce+A29W&$ssL&P z@NYDkGm|}v*a@&;l!)y&F?X(=TnFGFHr!J_?BtO;)+iGfZfxTgnSf{8>gN+o z3Kj`OL^hP!;!QyP`le61Y>zt#l)U$jT>wvwEn3av!NUj}|;`pi; z)y|aji&gN$tXmx*3Fv>hU~*e8{|A0BpO^dJ`Z2?(kICtrmT7#r&3INARVzQ zWLv>_NIM=$fTq4gWa--SUo8TY-QJLVVR>;DAqn*XFmNc4kAZ?*coWg?xiMaGx;I7D*$m z0zo8ga0}5T6kH|V?Hv60s!zo}xr6O5J%ir)ut=doCoS?8*lKe51?SO9Wnutxf^TtO zgMUe`(xx{39}~Mxvt7kTiR>AL^t4xOefpz+e#sKA@U->f^b_#25Z6dXf7A|00PG_%}mqR!!dZpZ~~CV z%(@QniSRff&~qD508$Yrkk9r#%bzLFr)&x$6F~lWDAj{Ww*%m!kxm|8BX`?%7M9Q- zJ}r*jH6zl7PVYsoj2E3Z|F>u!I1fdB)Gi(TZU-yJ7|qcJJd2$fiNsbDjHMS8wh7wV zkV*yFZa)*97Tet(A-yJA+)V{)Ny#d|5;>%f-MSHO?j){%M5S;jQ>!N0ws8(Q@#q*RohSh)19-vNPMjdI z9f_5>>avYNx#1;h4hy#%PAVtb5f!%EPFeT}>HxhJ{tEUU$WFVp)1XL8(qp>>x07U$ zDbd-QFTK4f&WzfCj#-qnh;E_vPy1SNP1JUDiml4Rn}PrbA!1HR&8g=XYy$WCVFOF-Q^oXAQ`lG591GXH+AFSRx)lboAdQ6!o-mKk{*B$Tn9RK@)8gh?q&;mOCX3Lj}Q zH!H0W0Hzo1)@@5+)#NeB-A*kvMJ!S`WjwR}w3)bQN#~#@A4X+;)|fMPqNg$%>CxHf zgAErVD1VPUxHuFiuLVdFc@-XnHbJ)g?&N*;mQl0xj5C$pg^kSMq%ab&n5>wuT!eFt zbmfh-yQ$b!QJ5YiduHio+q#D$2p$)XLrZ<)GGsF}DU#JfEuh9z^ECVo{mIbj)K$WX+LeTyMb1Br82F*=m1v&Emw`JoPn>JEc4A*VS3~2d98L98 z0LaxmjB}DZZ5X_v^HPMRMY}4bQ0ri^Zwu*fSkGHkAzC>eJBzxJ7Ue1?IhdSHhf6Ua zBzL3y@rLiR;6E4B`Hjae#mOL0kI&$Q>eLV^!;G@g=RFbYapK=%dTA!@Ju2w;ofX~& zRge)kY^O~1da*rLBb}*c z=dUx{wQrMAE#lrDbT-GHH%3;Dcs)44xK10%l$+sq+k~kA79zyR%k-S~o#HlxCFoe)(|P``t+UUkXWRKYSlm5L+r7y8hTD#y!&80((EJv8;Y!781X;<#=KVd>K57>(%(^Y7*Sb0|(<0r2! zlcGRFcEUXyW8yA`7>_^28^z;N`FTDTSlyebFICAt+`01s2)|Z(q=5*(ykMzY298a> zm-A>IavHOKY-QI?F1YHFYn=cw(<^x_ccfKUBm@55IaF-F8sEbh2%Jr;@qP*t;6!O4 z#JXs~x8d2~ZrxD48g2}*;wr!7us0WO?j@t-V>$nKzfeSP(M;G?_DaG9l-?wFIaHA2 zw?|r>lcnEeG*c`InTs)6CvTrqjTG=L>8AO*>8BsajC^5Bwed2^;<7Ubt)2lL!M%Ai z04?t&J{`E0CJ{}(V151MmmEYe%q_*e2~Z-UGHr#H$O6Yudy|}2-rJh^50GT5YoHa| zY4;{?8><>ZWHP`$kT<@_`aN5D^Qg%M@?@#(8k?xy_!5^+l~L*QMdlAwcVD{{(g)T& zLd(U{O6jADJKInxfB*A;qIv%DT_BTy`ctL;sZ#$^sefzKpWpw|h-%XxDpjB%fGFes zLHtt^|NL7eD)XYg>Yx8pTK@h0helL>$kg;)B|(~a9dam*8*SHM=<^0CFXx3fn z1a&9pL!s}~y1f$t!ruwG)~(e8zt-!yc2DKL|JQ8CL(88dW{rttRuz$jTZd@Akk|-$ zMjp2^@IH{zHD4jXT+HRJvYD}hhk#)SM2cDIv5aIlOvNdgn<>}Yk9RX@Wdb=nY5Xmd zw7-)iU;A2jM;vfy6w`&bBN;pL?7ny?eL+VIw#K2bwr1x3 z|1A(a|86w#19cS_HA;X~%Byjn>9Qa$7Acb_x`%kA-g%2>Tw)1dL<{-{4YwWuacM?~ zL(upD5><9@K*T8MI6lqt|fMVshg1fL`6`< zd>~}t`;VW>)_#~{Rs|GQ558Gc}@oPtk5g!-YoID>73D0fw zFGwk|u(IiTf1%*BUm*3w)(8dWSIj`CN3GyBI?GeBvsujcWV!{g(naSY&#YcrMV<`< z2VrJcF&RaUP5?L-Zjx(`g&=mdVkrB(8TbWqTyU;2IhA=eYf#Fje#rfi;S~g#%^U+)Rn+|zK zwO*2p0YH%tBkhMA*54pKlDYMvSExg9TH{Wrd^z&ZkPa4}lYxfX9uYY4`;u^4r_mxo z{Hoj5TDE9581Hd$@2!SjP+QF50+DH}v{dGG$E`euq$=Mdpwx+T9{ih8ag8c(iR_Ny zB4+XXXGHo4RQ)MAsfVJCGVC;0Q-2fm4YN{^%JmaWC%<*+nO zH0NWfioiO`2aa?@r66s_p1>{-YmF*v%&D@}0vq4|VYh$9o4Mj4@U99OD!YY)#mT#G zl8UsI6ih-o+tOZoL?z-_Zlj&==>WLP9ClGT*xsM~LiT}$OA~h8j}( zLg3v9oL~<0Yu~w({yl88CBkY%Y$$QM-z>J5n#UOL7?Iw&i$YG7Atv)c$=ZJ9<2sh` zx?yLpd4z2=!vHrDS%ywtUeyM6l0k}7fJu!+nILT$Dc~NGi{WVxq^=`Kl*_AWXC>XH zs6hNpk>vn0K+M1FPQOJeUs}^$;(AT*?KG2mRyJ1YWkyYCljq4rr83}*JxvRiqF0Y+_#6WcxG6(USyG+**6G!^ueKq^gDlA!5X#hi|7=KMjHdQyE86=`e3+pWD0u(HfAr{{2QG!p zgHkuF5=COhc?kJr?d=gV5BKph^vm|f3h&I8_|Pf)vmeDJlJX+>aqCbaX>JsX1vy`@+F}rE! z9?O0a%{=(^?i59%s1JDcc|D z9?E!VGY2q{E~g{et*{nrpc~CmFUXohgy;*Zl(H}DT{eeViGPc&0IY0sQJ@A-$oxIt zzUSj_PBb7WRtY!Rc)YB>?P5k7tsqCGw~QR5w6nS~AU@zNDjs(MnH?_$>UWAtcC6Z_ zx-5B4B`L@dw;Nj~{|=qSAjX=}PW$27W;ICt6;cX%lf{rEiWTbEF6(^=lQ?leP9KhD zHVR?qgS7`%lfw-)ohX|l+KyMOCf0Ng2=J3eFCdAw+ROci4JmEiYz^0@i9C2%hla2_ z#|HI@y&UeDdh~)<`VVzUcjtNb>G!wq-Wd|EjSAbYU+)4T#z)HxM*fx#$4y$hv~jHZ zm9%A|WKr*QHsOP#bDH+%$iHo=ZrwJ?H-&3;m}@xKkk4B1&jhONk#^QkeNIZ_g!7It z>M`IB58B+Z3(i^56tfF#tf`s5^Nl4%ZvkKcSc7Hnha3$I2BRr8ty&tGW){1`aCJyg$*aYjqxX9>V_4EfMjbq z>5jYt3KzS`!|Gyv&#E4}i)(LA+(ij@c4wTf2&E-@4NhnVcItk~pC&CYYg>BiNv+W7 z_%j{7ky$C}Cwe1Ap{cL6w9*{%Q2*6l9RN=xZHnRy^>wv|qw>a+-l|JPe~LphquQi6 z;SunD+p0iuEQ|7qy*I-$1l)9!kCM|j2%NCQP)~ovJ*0NTKFT}P+WX4{{`~jEjgzZ>HL{w zNRwOS#L{beh38Mtw9S|H4JWmg38#Tr&Lm%qtnuv@osg%D7=*WcrvUhn{hiItNM{2| zIP#wu-NO4ahFV^i&kyO05v62CxmHN@xha-vH(kymxAI7uP^aTLiOTd|f~QxCE?j8V zXg!Q!mp?Ue2UH?ik%1aS1mK)Cbd&Pa6TClWlU0Z>hl#l87;c-A;SZq3{iZ3559bw* z1Gge?l&uJ0kH|uzA!&|o-Njg8cSx5`qKCza#;7yQPW9=mJ**IA5+{_3zfjlJ3l}%> za;Kn>PP+;6n>20{vDENr&NUY#sDI|HZL;&b$wTXm{N>NG^uA>Tt2Naq)>7%mF5w}% zg7IYAkyLEX-L~Koc=wI7^bKE4`!n&a8#3>}jZE~K#u_qe->>5MHWp2ULCsA_&MB2|Bn)w%*DnE1JaQ9@B-0uA^K}-onLed< zKG#p`*3NZ-+sA51QbMAW*0wa=%>LxT{9|apR>vsb+ne=VWuH(%&{=twJ&-gqXXz~G zV2^DD+}Xe1X*J{y`-ctbT(<7bOfoBldou@qGaj1I4{*`AC;>~2R?#0?3aO}{VEfaP zl_R#6;~+Lc64%^twzq1`6I}@9PW%Hw3w*W#?IqS6a*6==R(8Q*-f+j@TvxN8s*r*# z#_z_&{JffBW4@5g^B<u-LFD@WllL7CVCGnz z(i+*E6lrjYX8o^a7m;Nyy+Zw4&>P>ohd7amd@*sAWXYRB`-Iqj*-7IJ(Dx+ynx(za zMV>yM#+)Sc#k*xF51Gt{F!Gk&ss^LJnMIoo?qR+u>q7xmAIxgqGW$I?@5< zYn*E@;fS(gd$h&LiIw$QMF-H~@!qXwG7qKiC%jqs4Bf?#6M9#R(-Ab7b?>dH7XT#m zy<+4-zC3mtMYO5NIrk(srkZk?1F$6_4I<;(9#wx}sf=Q-{TsBRoaMVvqhO!UdKUYv z{21+p^a+(QGNMB7sj10Qz3<6d+z#3)`W$1Amtc+pWXIn#j#6;H^$JJ)J2T^e- zZdU2`F@@9m#}}hNW;ZOWvO)Y~E()=GdN(nk+e|WE8qj^PTqyDRTguv?i3@D!Z-yAA z*et88;o{csqPHt*6>^#xjx!2Xln)|I%O&cNcbE<6YPy??hR$w&>qd-oZ7-CGgv_?v zGr_KSRWDWJwGWyFXZ=&%lSvtC7;P`Z)L-;g(^@l}JzK?RGiQ7{@5zR+1+&sgvD1ic zGNypg1tJQZM&K^MhLliPJVk{KM5zidkV-6?;!3~)k09~(c%a_Mo><1=igd^l%W4Ro zk98DmIvf9j-`|)Tg4;N?SMk9(*xvf70tJ>O37NqVPVTC5$VH7itD+W@J2a!yGp!oCt z;A1%6pq$9ICz-$9GIeGg1e}ddela&rAeY#-AV=L-DcWz zGqZAU^EQ%17Axp?$7OAY9$Q)5eXbdXac~i2A zoHzd(lI?u@AMiax`z$;QXf(ciwK|D8D-N|vEdZOcQ&v)bh|_K>v{n(O!THW%kk<1o z-N)u8m^c2KU^ZmApdFT?S6K0hKloiWk!jr_74t6NNQ2)uYqZ`^zu$igK}ms`aux7e zwE}sCZcce6*XKh|-}!htFSd*^z*&SJzhOXALme7~ycRm#Z}XiM22}r;`F&p{)4Hpr z?>L0C)gLW=oC;=H~Q-r0?kz*FhJ~$|`e9b60v>wXrpsP3c!^jY{z7L`u@%%T>K3vb9d zvoV$ymUHBm&?aL7aF*v_-Smj`l@lX#wYqa2hi#AP%4ZwUS`;%rEe_bYU0Q>TVQNqj z%mg$g;wDyg3gi_Z*z!%NZ^Sp|8;fe&QucTQ+$pMgtgwkApQ z!WZyy+>}xjC$;r~3$GgOOiX}CEp6nWO7^nXcq73acAm=}qyRJZplOK6SZ<=STB;E$ z@eka~w$%DVLTL%n{w_|0nS!1$T%@pNT-Na&6nyIc$zG4Yy06!M+Bhr;oPI4nD8uP&P!wb4%MjsuSU z+D?Mho9eq+*D6U^FqmzV6niUvQ*5#OE~NUs`j)gJ%1+y)NX6kdla`|r{zAmVX8h0K z7B3T`xj4){=@#vD6Y=7tM@K~Abeaifhm3=EeH=%Ujl;sfFV=ka>BRW^$LJJKQWVub zY6$NxU9^FQ3rXC0Ci(pIGi=x#QZNQ-e2m_Vvbd6qwdxR)^dkhRNnTOMu)wK9^f#>i z>&Ax z1Uz;(w^g5EHpAJJ6^S&p;mcrGT-YKiDH1Rxm{GgAO9!iB>+(^3BlUe6q3Oc<{XR@5g^vRi*dwHKqFd(QQqUO_vhSm_HvqDu41R-iRGQ(h=%cbO$cvo}=aI*nD0dX4Zkk4g?73!cyn*#k*a6{UyZyP;Qg*TajJzcCympD*G}xg?emq|DVR) zp=BYJ$oS7@h)?qqDif!|rES+A%7WOv&^&8qOJ(n*_r!-x9L;bnqhp>8@p=8g-kqvb z%uZ^s>`OIfvH+u8?;aB>EJv&u{&BPlck#oHXBa2irha}3n!z*E;Tsp_c+81ZYcJn& zl_vxYxg?FjuO7wcI8j|{SVry;wS@&&wk;M$w8$)i7$>nM#XStb8rc@>}2`1vk zJ>Qf(t}fr7_nCYYA2nYHZ(d?BWkjHUTAcj?H^O$xslkI7W=p)1xF^2<>UQ{_vo zuC_^Hd=Cp&=JgihU9R{CoVZvGxY#zh!r7%Yd_L$88~F$P`IR&9QH{FoJ=3F}Ao8cE zBO56$LZp0*HZ5#JKCDFqgXFspJD~zx%lRIiy()|7(MkUFaO*BZ$sYCE0*72HN`-ouk~GceBwC%fXi66@KbFEo=&I5?1HUVI^vS#o#LZrm0&|b zG&%4{OU4_1$?Ro;)W(p@m$_Xd8Nmf|J=~nQHbrU)+5bmPA1%ocsQ3Z;cpQrp*CTJ; zzuckXP2T&yp^o^3%m6J%`ao~apbzv$A^1RVnDtxFttoGP8Wmc%?=|re>)x>bZrA?X zm~ZSS{uIw^WTdw@6IZ2L$J>J4P@<6f-_~J~GWc7Fq`-+dyLU4Cl2GDin1$huc<@bT zJzu)-Uxm}l^5a*_Zx-_xPdB@mza@$EJ=#2i%wpb`3yaoW=1vKVSl+rHKSbA-2)$lW zE0?A0J_yls@k~};JTcpZ$`Iz6c!oc4{Er6p0>s3c6Z}81mIt+1J7vrElbdXo?bi=M z`bV}BiGY`l*GpLT8XqYJn8{cRBp_k&U#ho;7z7^3w{&H9ncvVYH+lB@zuO=iZ%8XI zwp}AcEVrqqq~oQ;XsI|+8UwK@%&b>Q33XMPjetNoGtzOJRx3=C74&c&Z0D}hkfsDnGWNjeh`kY}T(r0a@im zL1y5s^b(NE)=V*HroQhk#3<`*ZN zJAqY6QEbnem$)}Vp{-aX;jC^V&M=0hs&+bck3o=gtM5LEb%ki(K^SSEySi*^m|km^ zJIULmefA7@+y7cmGwu+IIsh&y%NHK9&mGATx3zIZClOhlAwaK);5}OvbSNM$$!Ue%R{J4!grAiQnxnh*wmaTP5eiENv|8l5q@L0A{%M$*=FK!&Yz6ZN>tMSQV z*U-JTsL4bv$I|C7vkF4ux zYG-t;mAB9bwr5duh1at7NHyKcVMKzv*vz`H%H7D$ zIXf>Wb>_XBrx27@?8_XiBATlpLEEbaVoQ!Al2}8$~5~Z_b35&kO?sd^0&5&j7y`S;putS)tq9(>dm?Wa=A^GA7n;IIkAv zHDQ!%aa$0!oRrqdlU(s1@yvP~F)_z5;*FSSEwCkXj zqih99i%5#J2a<8cNCLyP!HAsMB7V~z}NPJ)z@8HEahyhfvp>G!oH)kVqC=4;)b z3Qx)*Zu5K-SM=T%WE}JIKtm32PMfALu^F4{Zme7&d*nFde7i;^Cc$r=U3oP|e==D~ z;osygET3zoG#8we!Up_F;xCgymNh|U`(cZSTp(JqE89`DKZf9IY6f9G130ohRY~pI zCsGQ<%ZDf2m3&TS>xE95-Xx_DiwrmfHGFaH$djfZ^CFX^ydAV2+HL7lx)hJ0oO7?S z9*0bEe6op_v&hu|S=>gHQDID_(mx@W-7MkCqmrMmdI!@d;Ad~-bokJnCKkrSfK(-s zEr$H4I&jO@-QDovdpw+A7|R%@S2%Awm|m0BS5|Pq%L3}CM`Fx(Zg&NFup*^1$W@Q& z>5C`x89Er4mL8wtGC|=VNGJd2&!x(Ag94`^6!{G#84_#vj5h=vWa4lL(^r1p!o`zo zC7@jqv%#$~;1nf;7LzbN=S+|^6W%YVN@bk>X8xJp$Vt%;6d6TR%= zx*$LKRk}g|@BtIV(U3w?v=kK;9Epk8LkHo!#lCvnL_PyhQFE>6FA4QJbuer1!Y3_O z>tYQA)Zra4_-M{iDYKT=!XV~{nl8fUEpI^-WK@pFK&j6VS5PhmpNK^a^L z0ENfLAfstc?9F`o7y?;(XH_h@F_`!kbTGr!g|C^Z*48DxR9nIXUN^Da5i&ZTNfy}Q zMq{vDWH|W;*JS)hH$$eSaO6c6fu+&~eT?#uR!c^V6wTwf+ z0yYXCsv6UhBWdG`9f^KV|3%BEfV>njtg!jw=MR}26h5m7v!WR{NlR#+MsBcj7RA;XSV%@VM1 zDh6?{Ms=|vNwdh6$BV8LfHb^TnORgARg=_JESi0H+GfSwjQDPK6Bci_;)_!NUpA-F z%S3-G^oQB3*8V}OR?@G=7kQlC%;n;hZF+-ynq+=Qn4BExBZw?NKB(SEJ}i9BSFd^U z`LLPe`!^=ghA@t}`eW7;B3}@QV(ULAkqrsd)`JO@?mfp71JdH+>O^{v3RMd?AAo?g z#3+>n1Lhc|r2{RTa+L#m3^KwBz>$N}elZ)2pY2eEr;BoXkwIhx6OHfXoxGO<8E+%z zTr^s7y_%1RqHM z*>kZ6E{Jt&Sz#rv_V0gwef=r>dGY10yrw)Jy~2WuRouluMcu}5$v2t(s-h%2cR7R` zG3wr^D{$^k{vi0qTyXU)r{YakV|^!!?^#H|uuAjA9v8PMIW7ezw~Tkci&J;;Y9=?x zP9QUcn9LQDo?>k$1Qp_rB&UFY+BYd1RP40o@t+A#HTSx4fCL#o97y2K*R-G zN>SNxFpa=Ld9<8cg{^>JgPp@4teMKayt{9i(2vol#MB?C6A~Hlle~}NVGEUc6B|h_L&c6 z2NBl3y5vN9eScH@aMyoDT*gxcZMw4dt%u~=4>HPh9e#cnFB@oqM;TU6beJ%;N?GgB z%UZ+;hG;$5R%VayYLXu=MXnPqN{6#~lL&YLOlqI9v(-K8*|zhwlJLFr*nA?+MhL4b zq#M%^F3Qh*=tA>D{$f_=x!2&j;+&^>8no19Yq%I?07Eov*%3)`Lt6K6I}3F*R@!yn z=kO&r--en>l`o6g&1O9_O0+hz^B4c{Tle?Rukzu)e|{6hfBq2R@#(g%Z#C?#{}>P7w%+=O zffZ;gJjuc~XbG&g;e!YKssrsDY*u8u+N?-8z16(N&6iEo>AH}mMR=Q!RSZw(#y;Dh zyyV8_P%GRSzN5Bv4q4;^+QN-Q{afNi4!1pv48dEHxrDZAly1br?Ha^A!*+cCN05Gs zm2v#_Ly-RdOOXEg#Yl)^sHL-Z$;eOaW=RW#ZZ6(5&Q&AdR-jEceVlPD+!l z86X-@GJ~1#UENl zV*=tp3ISVcePmo5Madiu5n~0M`hUmjh_N6bmIy$zz zfapgb4k6KoeyCxfvJ1!$bHkm;e;|C?l+>M}=fR<&>*ZG=!`mXLolOJtnF%%Zwy<4> z{!N@}L<_cNZ&fUXp?~GS+}hXsUxL@b2_p*C9Aptj8T#<;`;UKH!I+3uWok+A*-_Nt zaHdG-(-(#i7G*hv(Krz+L*$FB7(moiL|}U8_v_C4ORNdZtdSvz8g6cQi0A9I84U1I zSw<*IVn;c%*L_RVcmBKGRW9fn^0>pE)f;gQOfVvue$GJ}9>PG%O%7>Sd|U{dy`%l$ zXI3H%2nms6;X&L0ZsN*^s3hQq_kcpaC58dTdkIv&O#`&SESwU5&Rr1i}oKdEf2Mw3QZ`%#!}wRb0UMYKp} zI}_BwJ~N3+A=))WNal+jTIytcNDuP}if&ioWG={V)_OiXk?5@c*jDSlva?}C&KKK_ zh-qX(Wf*6dOwL!PGlbD~q&~Gee1L-#$-J)p(U4sg7TfpkmK4{_TrR?RoZ&j`$BwBo zr@5V}V>YW8&ST~Yq>0v@B~#iS94oKz3Yy!->YRUsNzT>LrJ?v8i3Y@z>GaV~@}Yz) z-h>)fCRxRYnVR4r7H_PlGq$1GWynQ9(qGphpXN3_6HPbYXD=7ciWKY=6z9A^;w5MP zDEhRtraF?0vzxe8AJk2Yb^s7jjEC>13(K1iLi_m_Zlntr;>V4QA1=uwod;_-nZVZN zL`;oFo^XQ$^Cdpbn^bchKVKzcJdF~-!o)f`ZFkaw}9 zJ8587CZW#qHZMSXZVa_yw!#EKv=t#ThWPfOo zz9XG#UD0$zB9>uw?Dm9Oti+c#aZyD;8K@|SlApZJWA$BO`T9bsZ^+A~ASRmdN;=2D}ixEWTwg}o* zrB+5f>$=I`2iHAo21x9Fzw@_CZr?338DCi5-el63u%HN@6I9Z8BrVH~24N`*@AT%^ zuYbg(om94c5Ty1>NW!L{RPVE#6BY!6BQmw=IS)_ zg|FAc?KbkxAUp~6AzPN=9Sgq;zSfcVV@KnBd+QD3y^8Ty?zy`=47r5V{h6s|D zY?(hs2Ub89S)&|S9(k7Qe{2tt#FS!SrrqH8(8e(ZAA?v<2|1~!8tU&EP^+nVLAP=s z((LG*TdoK10&-w(%RfK<`RA{1Vo(+5Zz5hoEUWzX?5>hlr;3&#TN0$zbRRDF`6nY} znGGQ7Z*{}$HY0xoSM4ZzZsWx(!WlLAtj;>HvfKD`YOno?{>)h2UUht=^B*b0B0uDa z;mU{nFplr5V`h}~yGUF`0*=(i*4_-Hd$7?0)ncR`jQUL7!v+Bt8_4G-UygcK(4=NY zzO!#y5ur|Ne?nT)O-XY8Y(dB05d5D4fJze;2qcU(K3t^ZvFi3=odPac;Vz+-76|Lg zJ=}>DqI9qdt75wkG8Yy7*1&qTnTs23zRH$xyKg6H(?1ruju8&ht_RfcVBfnv%oI!O3Cdt*2jq2^nsi=GI|>D2{h@a+gE4A{zez(Aa_@Wz)(@ow`h782|L?aO0>* zSKC}KGv{zKQO@36Rw=rpv=<)~#~8@A1W}_bY?~ud=E1Z55nWD6=#j5G#Qo(1$sW<{ zRdg_IvMdderJTBje8`5$IBv-#+97Bq!QK!z5d;G$o4Xi|YrPF>S<6)@ARCHCwXH&b zdiu08PlJP)9U(x2z6P5V;6OYH6D^TRVh=k%Ymj+z`|dtz(QV---5m)C z7r13BD`qdf>_!?$2e61Xw(LFW4D^|4Ql(l+a6Mx#&aX*I2n7ErCjDh+i!kjZ&@r}u zs;^co&RQsGU^7v3Kt0`8*zDD8{v!V%0gr=OkAqAd02=QBEeEL{K*&tFyYgh?0g~LV zt?4zIMRJ7|S*u1(0U@zPB#$TJRR8)e7TV5ER>b_uMVC7K#RQp<7I|s}n%>CWs)#BQ zmJ%(`p=O>L%w|Nk&rq@OP{=EZmqvUE%12}a{ad)=0(`GK*sj+6O<0yf9#QM2Y*{g# zS8!ow$&hD~22Q)Td|>`Uhf7OxD6lrjtAdcbGt{mfsjAwUq;w{gX;Rg}aHo?fw#VQ7 zS$T=C{TID`!C_`nsz$rYJ$wwIYlFF&yjfcyWWk*-WEy;!-sBp3&d`1Dj7Y=~5N^)* z7;<$hc})YVeYHlJh#UKyS|??qiscnYYs$U*Q>cmWg^1fRFp;1gc3dyi9N(km_uwlZGesAZ};;dJ!v)$Z0&deI(j(abtQW|7OddKw7w({We-(JuBOH zv8aZC6hBRYM^IAhQHrP9Te3JkqgmJ%j^G8JHjFf00J;T#Vcd$y9p^RCg;%!QmX$`A zrlM>WqLbjj$9VaIv_$L;OTETzNb1aO-y?!^`O?`;CpQ|Xn~NcI3o7NY!zOMvbgz_0 z0zfsHUCCEU=vgpR()jB;4B^A32T29({Z~Y=jN6p2qXRcQs{rx^MF%YHj8P68}Z1y_!?ni4d9EB#qXurg*MsF^oM(6UUZVf^$YqbkBAl0kCjB zt9M@6Lw1w5P$|7CeMkmCPkav51evcp1?kUsHqb6i=@%g@@}+oQW-)Pw*s&j4LfEuh zNL+~b^0wpyxvd(4Q-2ImwxelyV+)^N8dKZ~ey_BDAh+#@Ux zhtNGCdwp*)fHH!^@Yu0*P0~0)Jhnq~%E~12TD!kxpb(7rabX0P8;9Zyu{;sfk*^-Dz zxzry?E-HW|a3K+$gtljp6kpebXcg*1ftIH~Qz2*jgLJNgediN9FUUUuS2!?|y2_mf z%ZNK%I=A+EUBy6;$_ugP{)FpH`V=oK3CF@j@{V`ZGrJ+viZHFbx7h<+fCOrUvDx?lvAHeV_|vVrH06romrxxJ@MoQPD2_gW%#iaBNWJTx{iY^C#SQGoR zytinW?0dP<^%I1Dce2ldp6m${q~_>kb7#a3EJ!{Y8AVt<=mP>NevBKHTB8K%1=~a6 zML&ySr+pL*`fM@MrV2XLjqY+m>BB)x>iKAZ&s%tkP>c_qP1caSD0TFDeX7N%louz& z(xc>LP~q+xeA%OCztVnwmYdN8>1+BJ>Ce{D zZLBfe4GB9*Sa@!8wQ#a2y}_5vpUX;7CU10#!se$S^er81V?w3{k_?nxa%`>KP5%BvwuNbORrd1>V7ur}a{Uz8d3zs< z$x%?@oxf`A<=#y~I=Z{x8mV0`cPDJL_qUQZ5i=O>VUuU$eHX0aUbA|fP9aAFBqRo2 zweV!Z$_^Ene{j9#Ve0<5f*e-Ge zYR%$z4%D~rcU+IL0jkJ~W3gs3W@B}XJ%Ss=QF3rck7JY$na8ON%Ia%CWF&q#7IPRH z{+Szv56sw5jgiejA8|IgJZ?ttz=c9B!9=2qVoP~^`}d!}_)kB~aJ3}FUq$+!@Sw@m z0&pH~*z6m3D0ytez7N)=#{;=7h4%X*vl)31y*+gH?@yz0`zbqI+YebvaPRsUmiLM; zAA7xjigbHBxcl=0tKE(rku&d|Q>>+X=U@?SSIPdCNJ-iG3A`_zi!2xSzL3yq`XWM$ z-hnr>(6M7gO3pt|@?Uw;6CxzqM^e1D_PuWR5SPRy*?uOPkbcg4cxJ8R5Ae|niB=_V zw9h;DGTzgcd+8ytr!L{cbT{T>9jieHx>O!grXowJkSq#MaQ@6|W{17tH6 zzy18iBlzR@c4fpLldMP_e|{AXm+|N5E&r_e>pOR>kETaddn>6#GgucD|41ardnLXS zFZu&1=5r3~F}d)EUip_GZv-0!Gm>y3{i}#R-a-`i1<((Ku~;u(Uh`&79)ZX5F$T7K z7kG#x3}m>x7AnRQC&f^iiYEpkQx4_m_JFd*4yc2}qv$rhlGxf?@xoYrf^TU%Ms0)$ zTin`5neF!k)9GWce2jN&{hM(Ok+>JWz_fs9nZ1QW<|to_fQa#?cIW1j@(BnX8ey1( z#hw(tJ-6_L@M(mh^Ff;4*(m*T8;XY#Ulr9&&Vcc|^rQtac)4{e zIg}CgOBE>42L_qe8`uax9cBmv-3s3>P%mXz?5F^{lV?BZB$&Z5b{?2xemrd$>;|Dy zJt-KQ=hRyJP@}$#{G7!A-L+XFV5gxMm4|?!sy5?cmH1g{s0zoDSWv|~SudX?U^)8@ zEc@0^nJ$!(D?OhnzxCK1|q+HR7?#Tj0}~ zOdz$^@PjmI3EYT0%Y&fi058mvHKkIapAgA5f~74-DvGyVzj}R%Lk90Be!B z#2{<9R~Y$=1{2kXlaphbQgB^{R+dd?rvq7|Z5H3Aw_*!1B_#M=nvObo8=E zcQG#6Ng)^UM%~);EtFlxXHM;>=WaJo*@C@Anto}~Y{=dt<%cUWbHHzet*C1luUcz+ z-*Hc&rVIvN{dlF0a`Qt?FRtDAaFmbrtp?1=X}*_4Kj^I+?M|nu(bfk^(A$huKTZ|X zAJ&vFY#%&OW+_WH`*6PI7ndD*)bh!^+mAA6`q7h|uOF!-?e_9SBNf^oijwrwJp{eP zfmqfXi!TFRY6C;fCJ@V@rn-x@qIgS5^NoKbNw5%>8;dZA*{;%`jR1r*1)j$u$R*_3{bv6XvEg z7z3|=19jmG>G6Ewk=o=|BVUmxYvZBNz1tV%<8$iWA_QEx0&H5GKODo({UBb23;#Nd zwa_SE&2(zLodpy4V|fZm{644!iU(ug1k8ws-<0>naMKoDe%Le7y>S1C;5B3K(omFI z4}|u1SZIm=@sV%ed?W3^DP6fi(mDMJRVdGO6+8$2f41NZNw(mFeXCc4sP8U0Kk8PJ7}%mY(aU&C^H;`OrJe!WS-g^L|NMv)MYlCT+XjfZkzH|w9%^flt2c% z4(_Uq_OLwj2Wi0ljIC3kvQ<%(?HhL%J?Gm4m5&cPRi6pCwE;w>>p}S;)k_@!GQT=I zno-}810HNyf}@iY>66NS#da%K!ElIU5AuqM$di3prQDYP7tD7W!8Pq!H)CaAc`@|b zUj6- z!~X|Nj6tPi+0#xs{>S4TqQN@&)PFMhz!mGrJC;LCpTGIP9y~tldaOEt{?>?6uR4Uf z5M6J~r(n`{T63>(L-J~lpl-vQo%%o}GkFINW7c zu<~H6$kZ_eQC^3@ zaKF~{WvXe}ZPmv#L3Y?&)MjmaC?q64cMKMR!2BVZl^Vc7I zGa};2tY=)bY;U!|!YADYMq^eOmx(hBid>#un!CQbmCpj8T_rQ@KA*{MTeSC)?vzj$ zF8vf=hg_YzQxwn)0Z5uNiLR5gIq!DeTPSx8cCb%fTwKMLByc-=J>u+%60g~{)rgRg zKFHs@_pphwk5y`*#Kj-NOuFEQn(gJkT$%+2`y#UHN@l#`gt;`UA((2>{gCjlwOBmy zi@VEX5LlG}2S&vuGG5h0*uQ}F7@&zrMIQL6IC6f~m}Y&>TWgw}4;2Rhke5!+@*F_9`ksvz22>x~2%(1Qitq z<+cg*rA;1Sl8{EPEW+?~x#FKNGVcv)cZ@;mq`~HzDyrSlffSc#@`i>y)iuXRaG8q8 zzv4L0fER5wZ1Z88m6=?+q3lksfyL69fB^hf1||9&L~j=4mtT~3APeB>8KgiPQbxCz z>6IQu8j?!C6eUKeA~+>QPR)wsaB!P2G*^*WjHnkQxYYY;$apUMk=IfD@Oqk%*x?@5Q1g;V53I26IcVmSuqsY;i2En?(j{r+CuqhQLc+oBYK-=w zB%eUDFgulu;$@PK6c&6%ZZ6@bqCE`5wg{_q*gm^>30pqIm~Z#qsBQ0vl+Y({BQ<+> z%%?sgwcNL_Nq)}5B9kntR9`sIy<`Cfe5gwd<4#jg2RNJ{A+hRs7~gCRhcTXc*;OQc z0xdX*kGN?<9&%F*VYg?#A=cf1<8XG>Ql$V$R7~7le~cC>iKb^9h>GK;9zHX&RjGGo>8Vu4ae8j0LUw-L7dYcK|U?Ob{dI` z=;|B>_G-^uckWpdZd;X~X3Kq!2^nhfsaEwR^2NZ1Nc_NUL-l4`q;&|8w5lVg zJT{7Sq9i0Jt!e6EA!cjoR()03<+CL2+;K90Po1wm7-HN>dyZDal= z#d#7o$G2KfMsR}SHWGu>oB^@C6>r`OVsQs<4lOIn+zKLGv1lq=dAd}=yH#RNT58*E z)!9t!NTNq8inkFNzRb_AxBRed$aBil?-MmtRbPzq7OEC2e}Hr!IG~&VM%Z!q0aSkI z4oMPUHF^55~Fq%%lNzfx`y5ffIn%*LOk(p!O?=+POA?CY)CP>N4hsxt+# zs%(!QHBUsdU9Qr>?>bFVal!xxy@#Zw94Ty{`wb^vGvBUgq3 zRZmWSG7^1eatD!4aZkSD4W(vzKm8#^CL*t)_^cwtMjr|pK0t#I;R(o|wvE-^l%qY= z@p;~P$afuOT%7i*hq)S&Zn3&e2-;8+&`9b^gLWwNfFuAWDM(vUHXc(E$I9_$`C)c! z-rl7D;;}*AKIF%RZ89}!B_EF4EV%gN^N9V_eQPyX)$5;#&(hXj0Xvhj$c38VULN*u zKmKk7fYh_?SP9~tJt|FY%9TGC5>I`2-_VI#c%WLF*D^ zm6nrMQum=aefuL7RSX$_fErqNNDFdWU2nXTW4Z1vQ%Ygn`Ibvaat9M^bNL8Q2<~T{ zqAAq}a&Cz1ClYpbb5NwzDU0PKwhif|`CV{3~t;64RNW&c?JOlb|;bt861_n zVIRelNya3d?);aA0^%^sd+E9y8&~a9{rp{+E+O?o(k$fL;2vPd8R?Z;IVjKe=}66= zaaR{}5nkEZJxH2uM_{4V!A|CU=8bQagS?8nsJsSY(#~sXvovK<6D*T_IYQiNW(VSS zV(}Wyi)kZeLAzLbz3c?->GuCS>7`k7f^+RMr|;hcNx2@#sY_1y-zwm5X_TMC1J3<6>U4%p~x!%ritBiK!f+ zYoWS0fIPBcy5wa|=dUb*}Vo@nK&}Mu@*@6U~*rOsvKqk@$y{SRSG#0kLav zT;HydLQ;TIa0O&|MtHXd`9Q3`2U|85Z?b%HHl7A!>XIp$C+Z`3<3(zT7JPoRtfLGI z68(KrI~1Y(#2`?3rR8w|4tr)276NoZhIv#UlyL(DZ8BvCQPU-c6>;=Y=8+=!=5YPd z%*T){AF{%}ZIrV^q>Z)NF#%>F5!XJfmtQmXmPYvaP@bSwS<5)${z{hZCSZ2cGpLw9 za$HJHMtY)=(C-a9tcVQvk#z~Y`DF88wyR-@ zXg&gLZU7)hyAs+_L8z$8%PN_@%8{Oaxry<5LnsZ2FJ6pQSd3GG`$}~vOxCrI7ev-v z;L7-*_N>xiu{9o>4I6xaq=0i`T+ld)x@F|rqgc< ziBAOq*R$TW{vZ;Z!r2)qPP%&Qi|l1wU#518>rm>bL?fW^?dvx|-Ogw4eqq{kt90f) zfm*aiMN;q2$WrNs~jcjgJrzeiU2d_vlf6(+_koFNLl-`u*F16+jn^mIEaK*ex z;yOsOgY_=YE{;!CSNR>ajhuejOkAuyn+=2Vsnv5jznpOyxF|L2Kwpo5)VwNE4Mdts zMd+zRcs_CndDu;s@ht@AXC*=LMY(#rkCsFU(ilz~OCzti1RvtlG}m0ulsB`5fhRmI z%P;=xOAWnLsEb*PLZ-b`meJl!GUDa+x`sW$-A&6vqGAUVShz0ocf-|okq)S9XzLjR zK?bv<^?fGtP0HFtbXGCglqFd&miv-6`6(szQuSF1@@y6ayVHVvqcyPq{$i3dZKGVy zApO=fSo|}s7u(+6tnNUOZQch@^NoytVsQdEN-7r#T%o%uI;Wr5^6;dD(q3+g`xd_- z;}kI&#I`6WgI}DzIZ;iF=y4FeU!-eaArTJY(riU|KZXgl>TBgnTsTW6S=*%F!URu% z&D9BIGMZcpm}I!8BP$06f=@OmUP&tB)RP8m6>L&^sFaB)h`>j| zTb_WMfDRJ-Ajk=UMV;<94j5rauc!%W0izZ-+lzF-L_TVv+IAtl?B31pL0x%iYN2Ih zdWSN2^uyxqv>n!-blhI752WRH37O5=%KQVcN8onQs}drRRC7hvfALjYp6L%zXhqWcb}woEv$|d0W)jqtO%pEo6oo(#!yyLB^NPB zPI_;ZHLPV6Z{8E_jotC$U1c+pF>mJKiWx{(V|UU8^$Oc@Ksu0LLV^S}Ai>3`9CfJm zO-I5i!q*A$He9ygl1x)h;88tuCK7!W0fWQb8y*eL`*;2zX_K~Xc`4gfsv)#m&hQjL zmeYm$6&X@`N}SVd(<036L``SZa1Z9u_)cbTinM(WI<24<84?jQd)LWxdy^zKz zsJWF&HH(~~Z~XUY`48swA)>RNVJ`z*ealwPFtbUEYaU7Y4V z9P)`z%J=|De=b?sk=lYvKh6xRZN0hz=crl%T<{E33cYyL`VbG|7$C~`uBRt#6r;;&C znGLMMR^hD#$GL8G2l2K&#|Z6AQK-E&QJWngo0}Cna_RVBwElTBl`j`g?Ld}gY5=XI z=r2;30fPEbyGbP$DHv58*Yf6&$4Rnh<>~4O&%d{DYkEwNd~D%%&~F)jix|}a-GWOD zQtVp~n^K)YTeEGvzC5tl*>%wVGHnvd5+AI$2{kn3M5q3^Sh+mXU?$;QO4KvOyI@Rd zn01MVfE)f|QdL5osIbWQhn4nhEi*5$(M=9}pAM$R{idW@5x0rxU$*{MkWMq)9FS}1 z%!=gS3yZL3xXne&6agfHWT&`A4PgCAmSH{2H0RM}F6M z2JClc7>HwZ?^VqBv^`tF$qObslJ*h~>RC3ba*J0U9zt3JclUUKmU!IG^^+5`_dV8} zbVXQvpA8;R8u&n0i01ZcbNwWxtGFTe-c87BTNkXJ#10Y%1OypLI9*>n8(?41vhR^C}kO zv^GeMKrf-QIFOuQEi%ey{AUk3lKKXHu-~)2XfLe^p7~N=LJ$2=tfHm(HlDwv7@XX4 zmDqS(7pT2WggJcT$7QQt8(hc)yYkN|Y3SXR+Dk@ubT!2=XIWk8Qg<*5Ogh*hkcSx} znh=hNPW)FXgjTYBFEh+|M|MlbDJxDr*j0HhwUX;K`-PLVXqO5+O++m{IG*pkW zS>*Cn9Eo>__MUk>oX~HO?$1Qql7>(N2~n0rzKHZPU!dqNoPP1gy+Nem`4I%vCpmYoby78xro6i5Wb07jq*JK5x`KGQWhDxOD^*gc5(9O zhxD*7Wr*d$82uGV;7DyAA}m|E3eOGOy$7~x@5p$+%XqwUFPidwm@)B9b#(A+ep-&& zEkNQ9vxXjYaDBNS?F$gZvy--vmE2K;I#xIKN#gv9UQOF=cOt!JIR>-ODt$MbC~Z`Z z(Hfs}7)6ve{l*yX$8Zc@Iq~3HuHU%yk&-QiI5ZgMK;Q3WWOqf8ZYa4dvB@M7 zVdb#Rc9r(1qjf?phg)B9qikg#9*0xC;}kFPp-)KMW|A^MXNe)zsp}xgC3Tn~+1)j~ z8JUq2bkw@fx0ZMyp}A~(lKHQal)sz9Bi9_f8R?|gn#gjx<-j4EFK6%%6Y`F|rq(Dh zy~?ac8qC)Ooz8b@2qNWt4{)tsm8}q6-}9PLx?D6<>WpKzxq;36b5%sU#FJ7lA zIyA@P71b-N4?shN_lkD?b6r1pe>QYkO8i3Kh3 zwM3jp$Lf62nZrIdY~$?tmN-zDSt)UO(2gY;VdFB{5#MCqiKCi|6{2!*9}!8{l#oyW z?`f;sGXoG#qg>-|B%DRXoFm(x_>2EWwq{&;T7cvHqBfug#P?!)e39j63H5f0NCcJ3 zBwJaK7uH>?lkL<79@|8{w_M>MCA8tHhb+B(biA*R zZ>@*rCvHHV)K;` zdF&2f|N60U()c6(7&&qM`S;gfKlqRjU$;w1)Vdi6qD~#JYc+i3r}pqQ{@|3O@l_qZ zvHQ2-``7#YozuR}KfZ?V&G!%AC+0FTd{^ZB;m6mn>~I-=^yWy&d_I@>%2)aE%|C|i zn)z#J_&@TV;U^++FCPhC?8guLS&#OQI@Iv9Ee8+>L!Yc|@#M|f$%E=A&KHhU!)>(bh6{r7-5EGW~*-Yq7Os;y_7hhWMhqFcU0paJ{ zz=Cuu>J0n^khPx6xG#9Hkxm8sDjp*`7AGU$OOGV+y56;EDv4xgXJo@l9pNs@tGEHA z&lyOWrDFgx^372x@Blh(hRxtF`Hb_g(s}GxV6a2o<6I5y zd3N%>N|TniolT}0IfQ3d_}l{YwVX(H?2@3OZFCe!ktVreu|&(ER>{eQ^5Zr}7nnZ7>5Eo?I6= z@(0>Qt~p<#>qgs+qDH__gOiAjwW$w>?o+WGPvq)g)lLZ#n$k~P&4N@yt#U{39>dC~ zEZVnM<|W=KnuV|{)NI5uN(jr0qHR){5UG>pev!Gg3F@BbPkSbs{u6TXe8z{tCNaFj zOnPb>a1ZQTI^xAv+1&1PG}?P?v`F#56ITG@wwp@xUir}w>+Q3an2=y+ev;676F)#| z#Z?*2!G(R7yl}`R^*kfXNuH{kawCtPz-ruHcyB*M+w)&Oc7-~cJ@dYgCiP}kDm+%` zi#LoyC(RVg&e+k2qL$tAjfrAr?1m7;9v(*#g#ltTsD5Q85$OO!hM8U|uG&sw+xCI~ zEUg`63r+GpYY@o;K>kplV)rd{jYbR_E3!qDSEw}qDl9Wvn}|mgzv{B~1cEF1?;(4< zT=S!QSkaVtG?JmAM8zhSJt>4Fu(Yga?8NmF5v5g%h+#HPa1vsIMihms6s%vM0MlR!Me86^+{^y9i*H% z@qX9Ng^T_1gRiuURj$!0*#(kU&)V`sP~SEnP1(L1`7mwVv1UP6kQLJ?~FF4mS7@l|w$=-{nYM-R8WyJ1&-#P{e0E7?~J)w&So1!S5aWBw^LF z1)q>Q66&~97sRjUgDKFb8xtExTI`R9$0eOOD8x16U}keb)11ndNYGX$n<^P_V_;oSuu>w6`v_>%B4B)B)~R^Hx+KRsB*x+$3e@-7YvbYlQlx zMT!?ky(7_7&_*N9ZRZl(zYsvKnppw)Au`EMf}`onlGgZO{CE?kEi2?L+hwjUt@gNe zXV!5i$H#@uYQGr`JD(hByz3~Y%w^&&H{;XH$Jv!+-gu}*C3jUsvT5MDwd)RL3g1Xa z>$P!wGi$N3HOU}Ihq(<>`4AvuIg9Os5i;;%yG0o~V#K0W2B;Q`|vICJsqToh0B}CRjiYh=;V!ASkjq7U>oWNM7Cv7)ddq3S31jK%qNW^^CtPJ2g z^a&Z)oeHGVC-dNI%A*v5kWyg`($)vjtDrX0aw|zZWVaBrRhY1cYFzVov?DQ)2!CG5 ztPCi={*t|9B*zIFxM)R3v9B#^Jp3_gv~RY3x6i07&8N}!Dc~wd19l@7Eu!;Tv?HvO zFD7s4d_WgJ=+C z=gv@NQD$6N^t_`@-FYh&NAE5uN8w+z{enBiF8RWuUETfD2TwmPcBrCa{03io@zvW<>((*r zIMG{AWsvq1)M!dz^s7CISbTedt}&My@BK@xL5E82^5qA&J$c`K`}RX_8UJ0Ged0Wb z(Vu3e{ptH5)`IU&K=4cdKj>QE!~6S`-}!|6Y@R-8uh7pFk~H<2MoyyEckO8K7TKOQ zakL?S0J29ii5u?m(OgBf+KN;s7(WJi5PJ_FaxsG|!h^)U66n3LEIUP|m&-+(E#K*! z8@%XziIJjw>24;9Zw_b49Hx1Af0kin+v7>ySl_d`iyh|G>Vq}0S7t5Cn!`BCPpM8% zw=;lEtnMSBrXOl*%dr6_JWd8w-;OlH;Y{D8bgjn5ir0l9?3!$jxJ_-mbI;7oE%tDYYcY|o zbU2M=8>H4&p$p=JZ^UbMvFrd>kIQWD(sJSYH7Hfek)V4*(UJ-fq%>|tk)~9&6QDF z&F^Bw&qVXVfzNYnG%OtPB-<51RVJ!i91S{LWyku^ zVX;}FG$WBzf}kL<+w&5=Cve!6B-iQ;(2CY;j|^nmNA@8rzg`Q2?@|8xUl8=sSMydyBU%o& z8_sIatAuof7T=Js^Qa*cg#DScw;##@fCj|wvhpAjTJ(ns4B?P6L`BAU+>EsUtTn9> z$@D9(Y|Ey|C$$NZ{Wmhj>OA~KOj7w9q2Xbr8nC)8ykf%zFa{JM=G-5M;w60o^P*B8 z8r7Ri!I9232a-?kC@42M-6sGo&bpfNoh9{>9AH07LvKV*E}&`9d5UKO<4V6u>{r=KiwEAfYhHWwbiM0lp2D&jQY~dO@M?ZWP?3xugYCdCxrJjzGAkMZubhVxQb0Z&SHVg)Ww zsJaEoHA~zLnfDnR*>5f(qbX+?@b7%^4@y6iy~{lUE$oN(DFA+I0B+>lewW9?A=STj zTx`ZvyA&Vy4bDF5HP=RC+glrJs8MS_2egpLYlL14gxF$+qsph(ZCkbWo`GBfp`{5| zw6Te=R-4i9kHWOyLfT_UXoqYI?Yx{=zPagwR4=kFG@48#vs_$D^WW9c_P^FazQ7x# z6Hii#BdC{`X;13MY#EjKs(Q-!--e^ZGfHK#&P0jK-<97xiDD_hfKteTR@WfWO+@KF6()_m?uy5I}1#D~nSaHg2J+dL;YB*^_Q&H@9 zLEw;1ofA8)|MX*xYp&mD->P0}jYz z*+W@b2;>P-*XvFD$5e?Y^64WlK=$v6@a_EvVZ5;-#S?OP(cUj^4J19l{<%%%4kC0)(vY^eyD8ERVA0nXh^4< zP0#>^IJgZt>*>p$vD8YFbSPA3YPPTq+1ZRZe4d$#nNtu^`@@bVpi1k6%|&_D0ekhF zJ_qhUIh>QMrQoj=vdo%rP3{^;c9;84nuzhPP; zlNdpg0`E3$QUKrPMGli2txet4)E&n!b~bmR0L4-E$@0YC^kvOhp4EFCp6j}UX+^* zlQ{7%Sv#iA=vR*$a$1gw&kgPZweD{Sh!MfE$jR(BT%?D_s^KAq7 znw42c?28YgFK(f?$u#sQv=&AC1@K#K{w1+4V@IkhHha>B%C`cacDku(RVQgCCgaW-Sf zvou14UWA_n`ol!rKu5oL5;XqksM%Tqt-aQ&8e$1|agtC6%Qe7hkX@tirZeO9PxMZU z4KABORs{J7rKH`J?WXa%VAnyr$x%I-_pTTFe;<%=G-?XaPTO=$@L`dCuPTS9RkGYf zwCf8k@x3l-i;_HHYg&12X%n2&^33VNgs2Y~n?EQ*S@k}sWu7}lj;p|D^zKh~1qFOB zy6UXb;uY3<`UW|xbT)?@4x{Jv@s9*rBlEL{*4QouxWtmxNuNTu+L^KEeMT-{arhzw zx#EzxBm7V&w!3N7-cMYWR}#)&IU6}UK) zHTo2-724So31v@0HmKNaVjoImCqjkjIP6AJu!gL5yCZdcL*&RSC5vp5(kJx%3>{MT zD{w5$1Oszazx0M1tWTcR{8Nb@)V}zDTOEb@Y_kzDMf(yfr zlY{^qVX%+&%D?se!A(4TU`I2`>zNALRIL#gm=Tb|$|MKF7w^}9wrwRA1 zQYT|!Vn42oPrB0k&X8&%)&RcM^H6eP#4u(mdj<$jQsM_&z8EF4QE9>U2U@@f({Lgm zFeJc3bmt{-e)fN)y^FTvsLnO|M6OY{zSQGj8{4ed#?2*J$fl zZV3~NK}bTH3b3^J%fnLHX(ppr1Xw6#zeQ2^;Zs7M&>O=@QtNVv?MQS_e+?CPvS`(^ ziPfDa0muP>U+t~%Cvy#1(D?sU~rxxY0#*Rvip}xj*Rz$gD3x2yC6Z*?NgmM0B_FJ>}kti;EBC zLNiDs#y;Fvc)ND?Mv#qMy@NXQ zbAMhEFl8G|T*{CR9JH*_fZ&BeaoGju3)}$p>eSC2+~eX{m;mzPN#@>^T$=z_Q6y_9 zIVGe6P$5ywQ!;ru@RRsadR}%DRrrX?K#+j+$%m5Lu}ktL++(7%b4*K+*Af95#l$IWcdnlK z*oYGQJl11G9OJ|s-GQj~7hH=KIttZ@IFk)?J`4OP4-z}is|t+(Hk}ZPi?DLSGg_HR z`4yhjhgtv2Zq;Vhlc6FVE1)O;o>nJ0!NRpIM-fXxj%bdr_7V5NLrV5*n2}(IujMU{nI@eQp8LwDS1iXoV&Zi8`9#! zgw7B0Gx*WIu^2cyLd83fh+j%ozsbw%bmGn^11BSaiL;o8#Ka;xz1y5qW`HG?u|mA@ z)loPlS<0*3*@Cby&VH!gU&c2^+bkLWiZu4?wFIyQm3Oz=8{YT7zVXEZDrrySXp|}6 z1;PW-k}!;58Mf!Yuk|&=k6nR0$3NoZAxDo_@@<61W@QNN)hC)md z|D%vg450XqhlyldMiCiEj0~4O8@qNf7mk{7w^_JA7jr0{xu(tSclxo`=H~tQx=DiI zLpFn4Nyh>;m=@XMvf@hk&Gt@ZA5XUWG%#0z@`0c&HSRDRN@*34^C~8{f@d$Sd})gK z@y>%*WvbA_DC9Q|qLfEf4M7E%`B?>+uX)me%v{t&=E$l6D&I5L$U!Gv-K_GU3`CCi z$-j6Z(zl8|tKX9an(7%g04l~cP^6hPBRS7pH=rRh({0MJ4yz@e4tH)Ql7d;>(jTS8 zRCBAg!r}bC+UeR1sqaFB1V3cbx?QiT#3c8MuR{%|2<776+rhnfHXsk&CVeq@Kzk+? zJrm54KEYAT&8mC|76(Xy=cT4>g0jw7ZrxnmZ$bfhHi6UiK#p+PXZBSy>S-sP$-w>g zvPJC1Om@M`-19gA-{AQz1ueiV}3j6B`0CJsV zJ|2)x9UZbHw+os!3+f9Y7q=fCDBg)vrsU^(F?$mCT6Y1o9_&NB# zem*Jj0Rxa13$$lc#0G+0NQSYLtw16hVwaz15fN80eF8n_?5K|5FbwXx(uC#@BA3mv zT#c2IgR*@sXej9=Y*3QxJ@_pB@TuS-mQ0PM*rRMdDj&fJ#&@eH8(p-ZZ_{HF33C`# zhel1XAytJb$G9z75H(Fkh<>i3j8nGjfnwqsQ+0uWezg!hy5vH+SlAkDJrX(ZI)q}7 zX`@8C1uZNq08U=#%$%FHB*8On%H~upxt1A`m zy9&NzwML;f5iBy$U~q7GkvTXm{27ZMQSQ%1z_jS#*QiUXg9Zm+kTS!8HiZR*Ub1GB z6)Z{vKH$5bCWvVET_3{4d?>U2@ZuUSn!mnk=|9ns5Gt;__CO;#jymA*wj)DX+Z8Ga zPSRB|BT54@hfr!%i4rPhaqVd3J#+*v_72F*^gMrBWuF?5aga>RtMW;}6>w3}45N{A zF(ANHwDcRjlaT`kbj;>udy+hxQ^^oWR&Yl1rmB(P#NbDxOcv@Sn5%tA4$hdfI-~lW z4<(KcY3{p8i_v;;fLZAx;I8D0klq1o#kIyti80$9h_3#wbd35TaQHI`6V2pS-2YEb zey7=Nn?glEq-E|h8u>HLm}x%5S^Oka$7tS)w?%YcP=h6IJZ40`)#?UXH@+mIm*Q-u zJAKCONr}wIzP)DA^P8tB`%?R9VsmlUJ4Vn&H*427i&*mLNZ49YsG;pkzi9?S9ZF z&V$B7;*QrlgJV01*N*!O4DU!^_Tuh3=TCbmAHTz<1oKK;UoP4E8{!7`?OnW4FRGMO z8gGaDFRU(Acn|*j*KhpzCF)%3X7ZUDdgz!+C-DR^LVSv(wLyW8-2*qXa zw~LdXZ<(YfNyL@(hW2iYh$W4YXNeF!BV5DsE^f+?k?5LMpm&JZani6OQegt$~0dlSn6 zq)<2eu0tzF5kU~$)tI@|aMm^wDmJtZN+R)~6tdod6?}+OgSPCiZ{L(Hcs${fGA9?* zOEU;nI!2?9@I0@Wmmn6&CcbL4>t^g{aT<;$f#5GfeN80wo)>1PocIA|GCto;;W$A zL13H^@y)BJS}Mka>plnn@y}Z-)OWMr0VL~IVJCp^=^!|GeV4+?!{A=@>eoCvnGj1G zVKyCVG0FD;hZJp;Pch1KWGl)ETy42=Y`rywoaHwp@+R>QKqgfuxu|uI^JMYsSVA^L zhnt_zs-)#srDj{u5^1gN(vGASr&g;$oxtGVEOO?fa{QI7y%)C;VBSr+{FSh`*kv2M zUPG-}%oj{%Srst@w?M)pebCuiL}XxXkeuCFXj0U$v|>h?Mu3>2LbHxOL-$PN;>(+L~d#$E_(Z{hJyyqx!9nO8MMUo*B7h%-|^5CQfVntVqFr z02kP#khF=ZBa~TE8k)tdly7FAn21DM>WLgH}e(fP(p3m;OUFvU>>4a7KI%=>Ru^a z;veQhCQVOMuf&w6o>bs&dy`Tup=ca?#a;#^rk<7>BK$;FVR|O$NXGL0dtQ^>OtAl$fI@F2%dD2{1@OPwsZpL~H#(1ZCP zmjX8R=I=5wjphZfH!R+XQeRJ=4tt2pD(bcS9dKt9cDea!-Ij@r>rJ%ws~b>IY6vDp zKkWth<{~G&G{l{Y^Abdgapki)+JW|+-;_u1WL?Oac080ixfe5uV%pB@kjW*{s*RYT z)0!DWWHpH&dpo2EC5bjmEirW{T@X8D;>d$LZKhat%-&18IbMKZcS%+@Ag$pDMPf>h z1Sv{N=}OW9#yc1AQ9E6`s8w@FaDR<{j-yYfCegC}PAfkd0?9!$7iOl3%Cb{%X z8eq?i_PqlHeqtXikJ;~YPJ?^`jH^&{^Ex@Zjw9j*qvnXo(a;y|t)?2%o+V4=YIhlT zofANjtgKLWG6a<-0rjwGH%c`k*OWd9EtAvpBE9YIikk>H?;d1+v19CNxO4gn{eSas z;&-o;)x3sR$Cmz8Pl~EUNd>0A4edt5GVbSyc=GtqawbcFOn?{A97 zx*t9eXW4j$H{eSkzm6+D{eW&hZ^B-r)8LYF5?XNe{zd_4)(hRTcW-Cq@BR2pzKB@Z ze*f`<*J4b3Yi6FcrL{sppJQZ&l_;6~ z$3j$!mJM*Kv00?;r^EaYL-*^~FG1|Zt;7GXf9P@6)h@apTS?mu$p7T^Z-@Vt6FLmC z)YULl9LHA48-|db4DBC=7?exXVFb3ISr=>8v?w3a{=<*&!T$SGkSY?|=M6SYYgZ%F z+ot6@NB+*t5=V#S{lDX{Z{o)tnb@oNh$UvoB|%Pi<(1!7q52M&tMDldtFrZnmHx+$ zfMJ!1EkwI&u9;!YkHy_dllvTtGmzn=q~s3Upj>kdK$P-XC`QA!vCUEJ;^sIU_D9IG zK#>PPTYJSe_;t~4{?DxWa(1qg-qs2o{K0LX!K0+s${#KX-ts^m5VgD`UbP8=8V(zg zb9L5#YpfsI6Rh)6xv$pkYv|!GuD%Z8A0aZrzkdnRukV6{)OX~s7uB#DTXCTd43cG}>eJxRENY{V9e&s)vuB78gA}O=MKf~tO)=pPk zSV-k!$fF;Sk8h;0JzW10tLQ2WiQzgdImp1^;d<;XH12R)7;M3CpW1~>!mG&{8_8%J z`z#7+j(vwMb>$Lxgh9EAd*892p4CYod>Ds0h5=^u{ z$?W~cfA~2xj{p7=B$hloT3#0$ly*lHEa+C2(UyKY+W!{u=G8Z=-0+SwO2jwoc?9AT z?fdt49(*$vxS69R9nPkp#21ZgSHcoP2Sj;)2i{NTOC&(4>d}#@y}IHE+&dLNgL(j# zTm=_j8isO{G48YVyB|d_yR3RK?y*DDZ>?qUB!Ab*KN#5yz}V48#M-i1^J$W~(<82$ zhK4Y}pykqP45y7I86};n^?Y0+{jz4=Rfac$|xH+ce~(2+CUBoUq~ z2NA56qajpQ@z+0nS?yA&4cfAHpead}AeS89S`8F6O~qMd2jG-$f{IjuFlqsZc8Dl7 ztVk_8M+tfUu6AU@rA?7UA#{>8QeYy~Lt7$5 zUL{PM?WT}7k4RZK8#_Z1e{jHI8oLL|iN)mpzdgd6f^yrDgI!YEX01l!}9`(hMmowEC0CK1n6Av9BaA z%M_HVF}xexh_=T~rD5AHKFF;LF6kLhr-OWyn2T`%iH;?^Y<|(hVsYI}>dFiLMnWnB zF!Lhcv$p68a`@xL^Bu`cC^;HG+IKazsPGh^CD1W_sG1|6I611eWl?&74*Fs&N*+R~ zQDF9_@*M8as~urEuTAc$%?n=rhq=zTH8r{SL5W*JDZQD5qaxx&8y5j<^s8LWfYcGk>`GeY#VTJLY3si;l;sqHkLdf2PRTPO%3Kp+i@!| zRF;Ovyap|kO?Py3vNXk+K-<0B4*SjrKof$9H>R@wCbKco{w*j)8p8@dLm}^8rtlU9 zt~%efk69rKP?=u48MNz_eZB45ccn&|-AvD}%W*Y6J~v_G#IY#0jq-FduL~^1`3N;} zGxzZfC~vKitN)UT=j+L5mAmrGcm1Ob!ckutl&4=vP_h`D3Ugg z!-0R$w5DuNz@XUW^TCLQqpH;IWQB{Bw7XT5Pr?{F7euu)0D;eS;a~4VM z*_te)k`d6s<14(hLJ0~4hWFmTSd*nyiNR{`3@Zx|AApbh62n!j z+QKiDDScGOJ{ANZEoT4Z``|^yTf@>`eTKI_sH_E1s2aoVNSWsH0-V+FquKbQ->Mf%C3M2Qn206R?yMM zqHJqpK2SirH-q6`k;?UsMB0m6o!X?M9X`1izn#2J&;8R6tq$r;e~v0M*#&?LTEEay zC%?PFyjpm_TR_~c@|P1(aCeubU?T3-&F)3l(2b7*1HPh0qxQw@lu=-4lsmCzeGk4v zsne2jAau*UL{}(CQkA1GNm@OBoN4!B)wuVPg|2Y?_kUEX5WK+~eOLJ+zLBqSCKVo* zw+|5F3G=YF?&(FI@$>d3d8-pwYmkxMfR6szy; z4OwOEh)t^9c7S)ADm%PuP+R1KEPNo;ZFP0>4yMWK|LOH3Gp-s0xRN_nDI4NO(Rc}=q zk~Likyix+{3-fRq;}eD(XW3A%h(ww_SYIA~w=JzE9rLD#dpp=sdgR$$aKqi6@WBks zlNrn++H7v%MV2eokR}zA6Zz?t+s$R8^Zs%BJSZ;ZKwI+%vwy;1j1u?Ey^cSN7D;!VI-&bvT-JIW?9mx$e=ih(IyNZuSeu4$H+VUIh z6fTWOmpcwp-y>$b4TF3(;6j3^ckz2Mt}R-RB|XQQyar`N0X5O^C33Y7I)^rOV}KV8FxFHom9v3THO~SOE12hgYZc=NDDF{4$3&9i1^=p@ z7pTxXPd~CK#RA#V>UGf%yq(Vjn~4bTTI@a{Hn4HvE{T7F7BMWrK+#Yr3Vktn&J_w)h@Jv5c%?c zZ#F{OMopVTIY%eHWPTA#LKcQoWXzQgv8teuAL;&HF#So50uA>+NKs`@oKUlU*!?JUCtiSY!dXg=XdZ)wvn9@IXu(({wk z!SSZIkFfMcp_|rCRFa;y8|~qxhEuh=(&RhwEqoYdMfk}pp6uyp;u;#x@%3Bx^_xol zn^6NGZF$D_^d)>Ya;AvV(=PhJm4PYJ(@}heG<2v41$0&^GN*KHMHdL|cAj9$2NGUZ zgepvBSv^rKn|>eN_Tdtqs&ti+%oiSo4VE z2Ng)PYk_(G$sLRH{MRo*5;+<3a@j;B^Vz{M)QbDrbrqbAy{UsG*~Wa%m;PJ3EoVU9 z@D6eJ%ACk^jW}#ck|ISvKIEH>Tb<*JB-A;cux!mAlC2%?jlwdoU9NTU?YsatrM z718#*a+k-PvJ{ZZw;$iW#Lru4>Arvc##1nsAHUieU4F=+5Up`4Eaq#wLl$EWL)y)y zbp;YRTo#Y-$mo6VgweW~!Dyv~Ko155B1}aa2iB^R_4K=4g<0Lxi&l&2Rwtu!iL(jl zgWp6kC|1i0l;YehN|gQxthW8lNBe>c9L+aV0DWFGAce5+&qxP_4=A^NR3~vnjZ8Wo zMHmaQa8ulbqY!OCxJ{I8M?@+6LrI1zOn*A6TRJ2<7IK*;sp;;%R@tP z|9of5*SN_zL0j$q{kt|RZgohe*<0f7(q0oFReCFLe$(4+33>`ysGvkI^`R6x>g9Fw z5&3ojGGv8aZWRr1topTGTJVUu=URi0|I~$5<5+<0sG&0u!zS98D6TfvAV%I7HRuX9 zA*~80`-O;u7)6kAzFLL9=9m>Vi)Y<`2Br80nV2bp~f#H0136lbM9=^1p2?QMu*Wo%|Xp^ccFEb(nf z7aRq-BT;#n7Z0H@Yl;6O(_&^bK+7Rt}C(IsfBHl3M>|)D)K( zI14PKB;^*Uw!lRVetMud^H7987df>ZS+oU7Q|SgM;XYmrS;&zV921*igk+MBkzKLd zUF@?!;;SpQ!}tt?a~9(joxQ9}TX@H+Xd}RR>iu1%k7iWqvkNOXjTQX7lgO0%05q@Q zgIsFm)G37|jAA91JSnK+GeB1P`Ue*Z2&95$q6LyHaI^}nC9rHPI0YA^!YDIAeA43v z8E9X5Z*-1Fl|vsdT0sqc@V8xkAn`nmC;7IIGVtIxv-*EWKRh$H#L}mRHy_gSWhW*( zMhf#;ql|H!?M={obk@%2nB};fU2IQt%??^H;P)EUNAg81_LXMc(n_p_5XCd#J`HO5 z$-ylbq8}FmL1_Vv`ib=|`*?_*x!JM5D>5DT<@1pDq;qNoWXbZ=MEn2zx?+~Mn3NSs znu&J``HnOqMF}tUN^OT4*_ezDmF>uKt>KmnYkHTP3$X*P__YzF#Y}o1^7i{1Kob{v3o%oe07`ds_ETmgPbrwG97t#xF?OBOZ2wvK=X?4BwA%SYlPldEA zS05lFu0fIyx6={NM^H?Ko=UF_6?aFi};qb1JOGET79zpI_aF12-4yIDl zjsL=C9`ZAm7*b_c(!HRv3VIG#J321l(>s?7d75gm>#nE8HOQXwK9J(T7Gl16I(C>! zex>6Eu?fm)bhQrz?Zy|pD~^Z~>DXRUn5$>uCkq1j+PO#mIjW-ZF+QX|{4o0ml4i@W zyA!ugOP@JZrWFcbG%hH8EFM*4N^w3~4OyESM~!x? z%*^VpB_RO$%(L=f%V%qZ_+-N2bdeo*N72&E+L0nZI&H#^V^OHlp?U#I94J4R%sXkG zyY?YToWldcgdP~)Xkk6@YIeidfyt#OwYk&%plpwcf+@)n-7{j8HV|7r-qZPmI4&@n_WQ}mpA>V&| z{rXK~-FvsL-0m(6(sQ%=#MSNhRpIQ9UZEb+(jh8~Zv-hHEYB3gI{;Ud=RuF|T`bM< zd7s&SMSHP|tguJ0EVPh_AtF$X#I~0Xa&XD^@Up9j+_9}7v}sI$vWmiVg)=#U^H=C< z-2iazbC9TJSmkC}e2R-t8ZRisTp~ueq_huQrnGKJJDD}uI4FvOosb75b!j`n?U1An zXs7O3MwM6X^kt==vcKfCXmra)EAmZTog|#iv6j}@fao%@(LsYwBC0oGQ zo0XGDUGnc*Tjht{PW!2=u^>$aJJvib1(}-XlVxb7+ zs@?PutJV)%lbo8}UKQ1Bp9|C-|BZbnRqpLjn#aZX-m{1YD6~*U;0O5#Y-$^h z6?@j^a({Pa2(o#1H@pB2QSTXJyJuw~lI^f4q7JCVtubT|Be2v?BHzq~$mi_8jJtWq z)#@jCYTq!RGPL-$V2>g__^B6g51X|Dzoj_RTz!Wv`C_BH8!p-cbx&rfAOl(7tLr+1 zJFYVCn=-k?E2!2?7J+={m23*R#Q1Uz?t?D72|$!o+E==457)JLw{Ta1FAL{-@fYPg zsG_dkaR zU*Nr%b{*xN4(uZo`>_S&y&JX5yX;``Akwb#u}!gLcK`Ok3rb2snnz&T1zSi~@}%#^)bm~`;Z{>R^6C-s)RaQoGe;USfS$_)NS(p#QF zh5M`#7j-T`NTL=2d9uTfBS673@nbio~v@{WefW6K0Hk;$c|momXU>DG;IMLHfEV*eCl$EeQzZz{UxyMvk7W zy558!^13UFwv-fwP;y|PG%6{R=2(l2h`>rugbMBPr6VMlS;IEyR;Q4*%mi#jJ6 z`;?jVCfZWO&fZdk45n~6vN9@WiP^Ka2Xn={*^H>z%3hyU0bbm4DEg>d67B6a=3MFy?_9nm^F_!dU@Qj<}xvqKyK~%^d1`*`Ea-oJ}L@nYbF| zj(g->AUqG}Wjp%ohzi*w=Twj@{cyKbl zK)Oo$QADFo6+d|Rye5$w1P+OYNtsy$_F82$$%~A4kgswY9UVSVD_{ZMAVcJE0{W{{ z$ou^ECS)NZl-QBIy6&*Yaf&U+$Ae&!w5-x|hf26RNqskG`3*_pbG4<&*;0#Uw1Vyc z-DRU99)P$S`2*9&ZkUMnf!HDDZIzA5s8YsvgCVAj;NFeqCZ*i!d!sBHZ%d|IJ0n|f zgma2^;ga1R&4kDuZRnfx$p&-q%2>qN?$9EX#ktX8*XNW_C3KvesI*mEz|}Zrc_wWU z5j=dLyXj22c1MAL;*ad6M}6Pl@vgD~Fvx+8j0hRNB#G;0?U~h+U@zF63YXL%`z{YM z8tB~p_DN`i#ZBg1cCTQ4agk9_X*DkLE{|9nay5DQ9??bFJ`j)9BrQG#tnHAU9Nuoq zOvPb-49ZyIgjAI=x!$G&%BfSdWt93MBblA^G-FWs5WybqU3D=jzd((wUAs{Wl|U3n zA2ce)GX>I7#%HD|YjLB)=mktpVW;6kGAQ4GR6(I75D{QY1Ma-p+90JC<=E-d$xRL> zmyDow2rH4ub-36{cWq2-y|$ieDLxhs;`TG}kg3W0-sHS)ubE?vg}n;3j*) z?JX0M016OkjSHX$HA&SS$|gQGD_w%9l8*4JkWgq@D-2Fex+AYq9tKA=m*n_|J?i~$ zAhEY==HNlEp^)LAvofa|43|tKfsI>S={t3yXtT5D+cvn>TuF&sg|rU7SCmuWs?A#e zYO>J@B*@&{m1;XOlb0IewQAN3|$I!vUK05NWr!M41I zX|CAb9@&0uxe$%?N#@D+!v#yi)M!fayMrIJ*ifQ(sHH4^p?Cv&pRxU-lJE2M7x?_l z2+$kgEZXGD7T!d!Y~meZ*4lv4q}GZ9q+oo}3GI~v$f$I%$(oQLzkVP>hubyA;%(HB z&WMTQdUU}K>3{H;&FDwfq3_2#SiP|$!2|)g!YwZtt0sleQ+9&01^EX3( z;?6T}W>iUv^!IF9&;)+l&{#(aAj1XThBIdPV!O3NHAf9h9 zJ(<7LiPFb+=V9L;-4?lr%^&pbFJy)HB^`)=2H*hgPpzEGfl#2#E(HQt3<>aPvb!X; zF&}blL3`*+E*UifiWh?~o06a}I!W|IEvv9dcg2&NJWvRPh2t~+eA(OS&abw8ezooM zL(A*|`C^?Gb>MGft*XL5^{s}Q2=akgSuvpdAYSP(y9~}eCS_S2@IZ*G=;KEA8h^oH zEU$|}wDjl=hiLpD-wduJAS<}l8hXE8jPjN!v?HLtmhch%-ICo5>}@vs;A*-kTd!S$GS&yO}f z?1~Le99j;z;!-$oLePM?=3QOk@nU+Mz|6P+13xU@b2Ed|{f4N1r>?{eWqi_Z@9M8_ z!|2NzlJm1c`p?>$+`qtQ!iat``|9;~eDdVL52NMg;zJ*Z%J?FFCit7%l`%zGIHiym zd(dx;$C}ABRlj6Jxw1XVsg8F*-B_dj99grIntNk`Zgn{`Kp>@>>@UfKq+F zN&TcY*gG?58r;dP%&f_rkB6^F`8;bKyy}JyjTc>z33lMR=SBVYXS2~3WOMc2^K1fJ zYWEyB>&cyrlKOq}9POjoD66$FU+&4mO?S=DdvXtRQ@jCBrVZ9muZ3^VFOxix1+^9((YFdE&4W3|Ch_u4InD{m+T&rI=%QPr3FpaEiGEk`9~9E<*WK%WtSx2 zUHgKC{Z>MKNFc`LWf!O|=v4i!^7lF4?dzXNWW<{2_m|HnH@q7EOds#qm1LNc?-8D9 zwYl?8a3^h8U2+v!nqBFFNgJgvAmpp2x}3Gf{#;4TUaV3#8r=7TkDqyl zgCEIG$Tgsk3tXUhm-~7Cv&5K6z>OHD-%ut)hP8u%pcX;iQIH%daBfqST4F!!7v~w# zKVhACYahRURo|o*(Bg+Zkqcf*U_ZbQk;Cw5ByCQ<43IGRH@HW$l8W^Kdc}uO`K9u_ z=#O|n>`5`27n$>6oKEybnolLCT2PHYjTB#OFwKg-!%?0;&s6Q^W z*_tFfIWr8J`RJccH-c&2~0{W3jeQ7RNT;E+wMJchkQNl=$gNQQ%*H)$V2SYr=molld z<05(>9qL>IS(rbJ+b+<;RGz>u2gNZ@ERXU`Y&H=x7W}TY_ogR(O}!WeY?&C3C#yST zEcV@spUJXnlN;&mipU~-mhWS09Q<4?8LM$E`>LY_v{Gz0sY4`Exo2&c=lCqW$U5a~ z(+-|R&^q7%D5XH1os5D~?(D)|+b+snU=v+kNZG7f$|P>W+w^<~C`vPwfS{-Yu+=6& z>0Y0;etXG>k9eaM!x0#O4u^E^&z>b&k zR@9=@zj6q(f5Nk{C50K5sr#6yk z{J_~f;8fasXordoQD7m_42t{#ngu(upCK``G+U4)$bQM<$w3$rpxxz9jCZqZR65A^ zq;!Hf0|k+v7-XuKgNIGyZt1g|2k@9(;0)@A#OG80VtcAQx!Dq!FCP_FL~UPms*pJy zmpH6880diDU~LbSwME5J@g5-q<;|)ijZUX0??yS!>sk4S&*6MAK{zL92?h7AHK$X< zgn|z%e&Q30_qO9Q6i^tUSZhBz)^|0TQuI$p zT*;H+T~#`cMU4^7t4E>{<6Vphk)`oCaaHR)V5VHkN&3$m{KAvC+jPZ`pMrbFb+u+9 zVyeXxBAV142c6*bm!Q*@*f){XT)%YOW{`gd4^%diS=v_l5a zZ0q=Q2P!Wjq99B0Nj#X$CH17HylX8`&vP@Et!#tVG$wsqcu8FtkeXKREwwxmjnBRw zT1=TG(-&&=tA_YmdG|~p~q(*NwBaB)U4H&)# zInGFm`Bj?H$RFK*is+O|r(@wJ-bW@~6`Ig#f-l)fH=`Kup_GN^FCQFCXz_!AHo#$& zA%14C!vQ=pp;x=B)(+}3=22xN>-f0zbsbH|u?>k9Q2XG~(vn$ahL4NA^80a+rNV&# zc$KMV2)2FmmveFVS0Q^M&^*MKiT`E8PURS#Hqv;A(h-Ok=@4{r6|y;I9?tIK z!wAui+LZv@ODq|>)F)nXMP33vgqTdv>f5^|>$6N@!>)V#71PZK-F?BeV+1yvT*S0e z#&=2FveDF)#O}c82&|>9*$0G*J6VmcIaY~00V+pHB_P%| z@w=d_Aj&O|ecj6Y0CLf|J&B01S3I7AtBq;!E5vSv#?~6V(P!J?Jl+0RgY@SHQ5|2c zSgk!4$6bGfw8*PnUp#ellM_$D$R&d)mIQibaTfmUX^S4OxF4=-lql1iyjb~#7mz=m z6s|u61|w-Q<$Nkmw-=oTgQ{Aq)MOG0)dUfuhaByJ#C6ilapLV>mgWQfoottjy(_)F z`)N|LKZxb+-W6CYwl!d`l5rWmIpjk*b|vPJJ#+v5b79UjqTw&T9q<4ABgEjnc1JAiFx%v2mcX_oW^>MNv=2W)*0DT5;+8whz>kbO3OJQTEa$hY0JmbKs|vM`2dE>V z7pD7es)t$p!0v27WdG*lz~Ivg7d}Mske}voLi4oAwS@Pl+*W|WFa3++SSO6N}}H&&yTHF zEOuhT75h1Oz~vqVe;Js)%cB`dFe2EAjzOcyL9~#GOrOb2pn`Ly-#THf|Hu|4#=%Zp zdj^f`qosnqAkxbAk%K`HdGp;Y@SGi~6}0fKE@~G%#Jo9_2#jK9Uft>*Wz+sH_*;q)V!NldK=yWFM;fCj-hh6$4m;vs!Q-UL@l?g z>CJRcJDj!cSv|?O;SQs{l&%X(-yQcYH1{NLq#O;a&wNq7SriXq0{PAMWDu~G@-`{u zRNu~2iuP;2Ew1QI!bkFkjHu7s?v0it2djG9jN(o0-aPy~Y)pPBtB{jCol61{=~OFQ zSM}RbOE$3CI+83d`W8j{;9D$}YfM;wOs`&Sv_ex#S6o;v^NYV2 zT-!HLUY8i}+GrA~QZg3plD~bq(Ks7@mgm&2#vly|@HD?`jJC^^HPJHQOOrvP4~HG= zoqPMM$P_2pJF=4ls-^8osIIK<tJt;Ey7G~F4zZlTU%wEIwQYg%~) zGM(5Za?iB%(bnJxJ|CpZ&f*8>NjV9L?zY2-bCc-XFu)UT<)rSoW!Zu0#>RtClOUUi zlGQItcdR8-MS3AubKp-|XQ`cuBZ*R=YpKKjktp7ZIxx3#t;g0e>bCr=tR%)bXm$bs_EzL4QeGbQnYa_uAMw*DN|#~JSpWXIHLm{ zWy?b;Z^jlq@%_}5?b4OPB<$jtT98^gAXrV2nIF6~PTIUy{yzGbOl3sznQF-072y4W zB?cbtudl5tT!^q!tzZ4@44J`zBQULx1+7HLPa)DK>E6ua@q$M>Y022tE8x9q#h0?) zii=Ra6+7)}qjGaTp2X+19_?(y)i^oR#OhWfOF@Ezphhx=Oi-S3X39_k&Dt9-T)>@6pp7?hhZpei z#hd4Yuaz8EPlxM66?qw%;-`f_vbQTL@%}>7pyj%idz(=PpO8Va8L7G4V9Xk~0(eDg zgLf`1@Ab+-OCuxZ;nPHiq-4aS;<_l$R6pU$h@FB5z5;BeToAcEsyyhU5!oQBAV7;P zlXwv#cVKBf>(G{^BPrMF-xe{PBmNzFQh-mqNZxI2g({z$^!vi-FTff?bM8fKzJcQ*?FqHf-8^RM)VdCg=mr6%)AS zYm9kRK7HlY>kd-m5y{4ND!mc^rhN`sbYF=j=SLx*?`hh?`K|WykK+oWeYk|(`Nu zs5C?-h3(?R6~xY-gjq5O2*wCw?g zpVF-YkT7XZ%!G6_8NW;{pdsz@9qEAk_EV$wtKxjGAo4-ahL~* zD9c6ZfEL{>in$XbRYW2_2b;0)%11uQt!MUwnl&mP%4QaxHwj{}lOXm?S`&rLh1RG+ zCW&~feU8cRno;a_*W&_SXAP!Q42*J~3(pV2LMx2X*5jI_hwm3{-=h^NHV4_Mf#*4% zT&q*BPpmw(%WkD@-r0vg`4&YGMAzWxFJ;r9HljU}?v0_Y)J&d{Dk=+iz+ zCCEX|oj7GSjDjMKv-A-V=jo{6bmnuc=|#>98sN}?if1DAKCJ2?lsxx&sSBjMUm!-++4kQw?wRVIoY0=p% ztKt%a%$B`6CGd=S?bmx0;d zU5)K(5A|(Yt%k|8?)QKBr}O5L7I^8KuS`c2JzWf`!D$KCXd%mLff|^qMI>0sOHn@B z&vmk7h2zhhsP)z+qMU)OeTNV;mzhmID;th~+a+W>{tb8C*yl<{f~ zSu_Kj8e`o0!Re^s*&H3f^)z1@AdW;Kx0QtZJ}0AWAfJ}r%xv5HJpTO2=Z0uPMTrbtk^au8sHjz-@>*@W;fSt2SaKdm zTffcwozKCzXu}yDt{L3Gt zkR@&N9qwJ!J}h(|i3eg(wG}Yz?@SIZJ&0RP6Um4LvN&r_3&CY4ALGj*Aws^VeWR@+ zh#Pw9JADn3NMgqqJodX*)vIu6m!Kpd!@VgiS|r+{iczj9NO2^$%MTdu`=AW!8A8ZA zN`U*(msFRWw$~F9TIFs=-MdN9W?Wr{yBts+^cB_R6_FlH!6Qbwalh-5@rKM;=LI!H z`NQ>UPrmJ~#Pji0f^%Js)MQNA-yQyF39v}4b##g_cozk_;b9MbKy7Dbg%{Tu>c*=q z1Y|);JlDVBe1wL}q22ZxbRl-zp@vh$u3Vh)-;W2dG0kxQD9+BlSnfqOHqk1k?~YWJ z&1>*5)TSe?W?em7_VjFk+ksntbe7uiki?3v!}}i0A&LqWvQ}Jy7^CftC`3@`fWo$7 zjH8_dY+WI*`Q3H`WT3DBbQei|%8FT>axC%2{m&6X^&f~Qag%fA0qW*3m5 z%uuBEaYmXn?Y{zcqjZ>D@NbhkgxPHJwgKc_>1ZD4U^RUnv^!NA-b}i$@*&8y8U&_( zp{unSpPV94X!fID#msiDqwp_$4 zWWVM?Q(CDBom&W=b3yXR=+65kYdF%x^|WA;)@A2w)G2>sUn;4JK|)Pf*h==ti(Pw| zg4~SI^h6tYkLLf>rgh)t9szK>i-Y0}1@m2Otsvee6p^5=)DtF?zi3>7C?x+uCP`In z1i{4>zPpZQ&pmL*UhsEw^`qe->%>of&8J1)>gUA5Wk&kqY)j573PB+VU^kJZvgk6G zs6Vp`#uX{@Ml9SC83fPXJ{o0}b?=+<6~6TC))+43nphrDxQ1$*k}NwUaNL@UV$x>M ztod#5#o%V|@S#76h zLqWB67jM0J7{zl#5-;&!yRBc%8waA?`l@~Nwu8u9-Nvu{-ALFUCdfO`ZJd>09I_ze zd-LDQH{C{_@l)Wh&fuPA^CC~NxkB3P>m*+~87^!#Z4@bV+Z<5=il2SkQd6X!B}dwA zx-GzNfkDUYip@nQYrt%8h`Hb=#)kV#R9sf(ZIcOa+t$4bZP+&W`9`)lnCp{xE*hVyN?t-@`W=*@?;ws!gTkOuvaA_oO@gUvC6%a}B*v(xS8rT-! zs|0TvmMp1u3KFZHy8#|L+y`;pzvalG@3uS186~i6yI(qFpbBGT|MB-j7c!j|bg@V7sU8AxBs%!dBLsv+i&g727uS>rnmH7A96kI zQcDD)sEg`I4>I0KNT_pjplYE$Qj#`hx2nttn7$Vro%(W7M?>#viK`Ai17yYMKSd_X zm-TZb%ig1)x?=0?WZ81HXzz>C_*ro5!$1Fsq{e;tm;Mn%R3TV6K*2s-uJUqd=sFh`!9WdOKQ15+scy3D|@@k>kEEQ;M3?oN#+i`2wNYLGqm}@K>8qg*p zht5b)_H#BLqfvn2NDFD@`95vT?Azx8zlkH94bd&E0a*0tiXiZ zeWLS}A4K~R;*~Y5$Mn(6SR6Li3Rk*;*{~>yG?7TPD*`?E18Hqq_$6hj!VzDGT|V;NUM3OufNs&nS-y&z{Mi9v`yFsV9x47a_yQj{=VF zeJT;`KNQpz)!?0x0u%kb0aSR}}@?iL#?m7S0Fcy@4 zeq+`r3Ux$wz3WkxS4*q&fT|{&o!%y}^d1D%;6l3z&v_D?U}Ykb(JBIVL3aC{B>Q&O zt!Ur=f_$cKwNt9z!}bFs%%2bFJT2NVpF%D;>FgVM(qM%o9{kcv+6EjiK6;PU&=}XC zxH7SeV|31yxF;=KPOmJeAqtcIQ+kmLjCPvxsZYY8YKvXy(5 zb{grlg*`ke#C9=`_J@v215R4#oNLAQXn&5RI?Bd$UdZ!(vfG+n zaAHQT*l4flVs;T=dS^nPsE1{tO7M3r_f^>%M2<3V;S)p5{y{QaKo!*zU8~p?2Ljz4 z`v4V)SXrS#3*-acj^Zl@O#&9OY#A>~pF~w&JM0y^l#`?Q;vhX3iRo=VjaBqE@=|70s@NYst=C# zg$sN@yL6l;+uZC=2tN3z2F{Ci&cSON?l-g5ngGZ$KD}C;!K^Wm$QXOV8GK1zJP-uw z1ztnTYnAKK#m|Td4a?&yt(_>;7{ADXD`L!c(**u~F{{5i0fOMi2Z{FG*~8v;6P@iH zyM6I?$n1c&EHx5@R$sO2;@iw!B5nBQ46?)9Zug<*U>e@GHz3}o2V^0A;=r{vL@k?<-hq1z3uiEw&k(}eKCILy85DjFdAZ<7y69XHKHT{(^APxqij8F@0OBxVz+h-hs;FK*fEG0z%L0fE)* zlg|v-kO-}{PTE+?f z(b0+q9Wa@ga%F>a*J?87JXO zQW85?-Hs}U;gG=%N{?37A^9wL`EhV0}*Vl(ZCn%zVsiN7pvGxv9MAG7r7thk6( z)XYl92IX|Eyd%i$#>20*GU$saTGV?XGrLtLfrY*cv4Tt%Wip72psx= z%CDz76dr})Iy z@LGbnW3meTzh7;SR1D#oM|_yLAo8{7fiLUyYQ$UF*|62WBH{F(uYYNC4A!%FXv%}c zbUvG`h(ay}4OhYJL#?Q+c0T$c`7o_^lS*u90NA5)NhLd8A(=Nf8l8ziA8mbrTaby( zXi*MZ?Hf3Jbl9y0b3_>yDrG9cRiBwJ8KP!rWu7r%%8!waY;ZC42bNeGpLlW!oIHfN zd%aiO*7(Q6z4~s4%_NKLUgycf!d?GIqgSnP8-oZ{`|7u%TVJwvvt+w!-KH9BK}%=; z_FY>8wC(~D#$lf+b8y9?t{`RV3P7^QW{#}U#gjbzs$QM2SgYWu@OH#LA?lfx4Eojo`1-H-ok{&-Gw#bmj>2REVu;~`w8%o;S1Qb-UJ5PRrXgUrrt$>dfq+UaJQdU4|p?F=^ms-M0HGz&3X_SIG+N+qn zlPq4zmIMMMC@Wv-tkQEr_loQC558vQJ(-BeS9GG2OJ^(c82B0hce|$rRVh+bANKpF z><#(L)NhC4TgtO`$1%UK%c;r;cX|0=I16^P6A&n1&K5XvB+g)_%L$%s?|Rzd2tL#n z1T}ywF2|Sy*ToBW!N<7=i(B)gcYt(bHPE-R{Z#S(|1bvJ_n>Yls`}OG)-w zI88evP^5-+4HA>Cn+<~

}Fr*!MS-IeO6P-MSvu-PW24e82nWRU99=uki+>MUI`< zq7JAD%IB(_vE0C^&=t@^XR%NLcZEm-w~Frw){1LH`b+{WjI%XZj?!kR2!&314vD+D z0wXS;3qMy)l=<+F>?M#vu#oh#v_IUgO(|Nu4XgfW#l_PfLTy!p+hH?Cy+yc=^aisw zR5Nq`Er_c1;lp4?t&iaYIZJ!Uj#IC^)RYmh#)Q2OZ@$-FBK~C8f1oY?*lnf__F}j( z1(X133af*j%s#&uEc5#l<;HzuPZ}FyEJ6PJC|(JS!QZ_i6-gPf?}tV%bvu% zLMmp|9^0(l$a-|6gtb5UL8)BqyETn%M5SMo#U9;@R`0G(n2a2Uyik~(j1Y9Q82GJ5 z4F=?FQ8fIh6jG^tI>G4owaY`~hv}Momakusu7(UaC^>g`Gm2=D?caZSkSm!V2a=;; zhJ2ZQ&#Y3C5@QLMZsqc3(ltPN<`)ec?b~`;)1H0hr9W<#*c#Y+znhdr%JU}%f03>a zEc=xj=QyZtB5)E^Bfe=r7+2C=5(ju9_Px7ux8^pWwAD}E6gjszW_w;)l~{gD!kF7o zw&;>Poz3Fq@HI%v@bh>>D0&0OMWiYCZMn$aSI7zex^$R2n6yw5Z48=8eYRQdWAKL; zGg7(kA-;QM6f1wXGsoO`^7nGcnit(Z%++a}7g+ybCWJ?m0d3|WheRicN8Srxi#B=n zl9L#n9w4>R+HDgSiS+*Mt71kG{Q_6nqVc9q`Bu2SBHeHEo0B0AmAfhiLE(^+j5r>z z+9ziVdL=1aH`hngefUq=#JZu|Rr!QKW3~iIy~KL8MdoSIdz-61)CsHZP1UV7U}mz< z2dueQ4(GyDt--?4d>h;LLmS&BYsG+A;2-p%!lhL1w8Y$i0}rtVXkNMg3nD^Wm;SaP zKDa<(X}<;q_;- zki|;-2PLrqxh~eh+2rbG_y`9nQMV5iYcUc;aX6Kn?n4mRRbaijO`+~*0TOK@KbRs# zwJ?#;Lpp+T`3>&u{TTH-&B87fVq0fZal@Pcb4%H2rvR1}#*(3dh-L0^-QBNt(^s3X znZ*U`I56Jf0Tjs>Sl+7}i7AW)79G`Z$vmXbS@V^}FwZu3<%Fob$?Zy@=gF){!a8pS zg7$nmBTU&`=Ks=cFgp}IeKc^!z@w|w`+GK_*-h0oXJUb6c&;X;ZEP!}1f@wA4@bYr z%2(fQe30^tX#n0T$=50RHr!i#kRXt7`au)v?KB7F=k zEm)MY)HXO--itGc_Pe@hymq)8faLh`{zDsC;h6%E;69QcwKk*uUCM{<%f`d80PF#=X;tarc>jRB*^TmnlY{IDDsr^SgvR-{{~*dR3wH z7sk=^%?~nS#iL1y^lZKWjuCY6h+lua2>zvMhW~@l^5ou+HA@+H(Eb?&`Wew3LcCYU zE*-aHB?X$a%bR)~TG?y44qeU52H{zUiZi>_UQ7^!UyHU^7p{DRm8R<~gUlxqtUo>G zM(2|}Wh)O-0#hyH&TE79E}|GJBQC*?IKw|jwGd7z%YQa3yhxr%XZ5S$nH-0Yysj(M~x_4nuikY z&G|J$$H@VYapLZ7HPhn(^nwI>%+ zxD=HsFLqTVMs|DBgiJ1JR|1rwa)4v2AFH|3b8dvgAkJ$wv(z+ zW+-8&w2y*y>26M&YxqZQvUvaykM7N=>@Y0u`hr;;UuNALZSSmpVl-L|DPZq9bEFR` zjN8g7ae#hO*A^;i)dq6j@GNp5qc%IF4ZolIiP|e2ONZ06(Ohb=(K;gac3&k=E75bZ zj#AvW)VMCUfB&md%1&1%U$)bhNTAhtQD^pq23stW$76i;{MqbPHqWzBEoWN*!?gyn zzoTTbeK9wuRz|w*|6ph3TmHt^XSRENmd=L5!WE=}Y*Q71d-@}=^Y)xCUfdG!TOo;v-dxS=}t;JljK?q))8 zKIq)r;vTAsUYL-r5|HB)^L6~r??&%`VoBrcH&30Q%2F2sv0ileE+_QrbR8z&+~XmC znkUYFKDb(-z>)@zb}?7Z#aaU9G#&-ihW_IvnU|oLo@@J=cRj z;61jWJXXqkv*7qj-oNY3)lFMCnP&iiJem<@$&!Qbl#JVV6y;-TQEf)55m}(4mG_yI zZ#x%*A!(IN2jjg$6h7)S99$m7{kv_2E zo-LT1t&RQ=6kZzGceV45$E{bYpE^W|ukwQ7$tfz)Slf-AiR86yX3 zv5#6ALgeDn#8G5-lSScf)PoLW_0aMLuwV{lDQN>L%}x|+xd?Zf&LN3RMUY9}=7b{= z8XfeRWZ=x~dRm46UzJ8ned_Qwg}ZnmuxK;s`fXw7s17ibZN6UJXuT2F3S^h>(T=5x zx(qZ%GL%RvJc(l0jf#(LA6@X9LXB#m=y{J_lLC}5{(=i+)-z96b_?JfWnliJUa<0g zN2E?U{|D9x*-0XmEoh=eY{rOSoX#_RVN&K5;<$9+Ez--GqDHuaqt(nmn3J~ z?(=tc%+dS1K`dJPZaiYf`0Nl}U35f`I=#3z3K;QkpjtlEcdkzClYz}GLl}t>`qc_l zD$tXgp`j!{U1z32?bBdZRrE}Ds7akiDZ#rk<_TKDx9?=@+x(Z2=RBy2DK!G`nIa^P ziIdIZO;55jJspzs>V7+~_$PWcJlXHiyLX-Eu#iJvrlf;Dp?jrM>5&+ zu*AZ6;VTCZ$VsiWL)7hzC*jlM;9|2K{pmTpD{rJWwqt8$O5)3GKu@An?aja#uw6*HxP@N@%g8p$#ygf)ybclN3$;) zx%^2xN2v7$rFrxb`$_eoTE`myvWst{xVUQhccULb0R>=+vmrR9xg;9Zo7X2{VA zrg)tY)fxqM)yX@ey^sCIUs+GHWlX`#yo$=acuj2q$6fX>COIP+Vfps2{s;|kUMilN z!u%f`KJ>pid}mh9X0%fPtXfN=1}pGsUTVUem+q{}`2;@1qO*t{=Rtc4&=MRtVmXfK z({hl4ofhXE^P!XSy%2mjTyaY(-ubIIyKK(9X(2-3k^vHD6E_nWY|#?U*k8m8iRySY<&(-+Nd#Ua z9XDjv^9f4GDL4)>HlAs4FG|Kdc_>>ksPR^0wYVk8)WpwpE-jv{7i5{IPpr3q)DDBt z@}&HhuZ0>A{iz+&oX>aNlb?| z*o$%skZ7*N!+kK4&e>mas@wbzaa({EF^lF}q7!=n{Dyhs4wq!Xj(G99k1Wv@BUhzUS z!^L>y_KZ@8{NUOoHsNp9#b5sPU>j@nndSE(>C5_en+kSv)DeI26MKdB9vtlg0g3c< zp}KEhlfB3}I{m9hezmv#n~-tOCN$5h{aEjMo4f4?QYnO3s{9ZQ{J{}Xj(RT1Bh2P<4KsKABy*=<}azo})JCnsW(sAgv)W zauv}6l}+cj{@i-p5h$EGsKDzoIlNl`b#Ngi(w|y*6ECJ$;b1@7AUyaqZg`7geW-~R za`KCZ>8E^IL8koRuP->8Su_rObSVHxK)1iYPz1ns@g)nDCt5hLXTpLRAn>!C&XbMc z6C@;*X!TAl`Qj3padjn|7q1}|<>KK0)7WcrLwMQs=#6wQR1S3uSBl(SdGMU;uB5&o zDfucdWzR;@^+gZ=d){HgR6MVB<@BOKXOcQDU?DtaElE=&&KAFw5T$=_v-)PNd^a1d zKQ$G9cFW7rL^gi^2j&#hAGkFg;7<)wK_;r&F`N49>n9Zff6_l^1-y7vi%I@qTEsTi z93b@v9Ld1-1uLAvjY2Cq*`(f__d{CG)`+0=jEuY93T~WUEjlc>SKL`3OCH1ucq-Hh za7NmjWQb;+i|D(QcW-MrYgPuaHo^sWEnUOC0G0ncW67KQu3ib%c8Lx-r-iwl>{$E@ zR<{Lp3lmG_kS^KbHjvM2HQAAXW7J63gYR+$f~v)R9#GHa%g;uCYJ+O2s(nkWe8OU~ z7>~-5cLbm!$tv1Q&@bd_i#NayhzYE$I2YR4IuH6Ny_n>vVmhP6Gfjd8XdXOV+Wo^a z`YIS>L`-<>6dCLapj>UkE8P2B%hSV?;61QK}Q&fq@(bcQ~bu+ zT}$8>pD=nn_gv9YM}7QVByS!S_Ltj3P&1cyL@YHYX?aL`NvPPc0hpvM5V62B1h=`( za#4h-i)GgKM}U`kRMsNt#ueW7HAnHb5D!64_BBJyATe@>w6AJXst*G04EWQ`51t|7 z#Bj>g z`({)jdX~)&YCywgb@*a1vNIihKrQ?#t<|H!pZN7U-Dq?~#ESC+HLR?Z3AhXC%HrNT z)r+**ofIj0;aN52|H0=c3N?XlyOfL3jk}|PsyS@%ehNK*bDIog*aCt_)4TPTLVAyM zzoS9b!w;XTymj8f8xOPELQ<5`JLwIlHOKW&Vs#g&P&Gz_amh>@N<bfhQEDHj+8pqhv6f zVOhL0;7SyjUz3~?+;zHTkdNSptvb2KMKAkVZ$=|@$l!b6FVw#-A&eS7@G33DjqO zoIt|y4#3;Q6kF&QxaVA|T)8k7 z>IKN|rkfKJR4)f#*rCLYX0tx!a=HAOiMaljdq<4io4s4FEv|;kKY8vCze;=Lg$mEi zO_~tC`1Y6AZ$Cy0d827bfg~9TI|xuU;`D@8*i3I-RpX;!_T5K|(N=&;vVb1)WIP-3 z6^3Bzi;EHs7@Vu&n0qJn8T})80NvHzRAZc4M@3k#jy6hAA!Nfkk$G!%&tq7-)ej7d zg1!(wGyv;p=LRk1=pJI^a2q`W6-cQ>EN1hlH`2CR|00+Y2GJSNL*tVgs6`}LKUOj{FRWre3!_?j1|{M z+o~c?tq2^M?V>H+#7mg2JK0IhP+s>7(DY=0@VdWY zsq($Q?mk@PxbKHUK?>xxA(ii1`+92^ zqLpi5@4bRe^FbFKI_ZTivmHr9P8rf2MXzq_G%Bo13<{MD35BX5O~p&;>fZ{3tbf0M zxwhYbMLx7>?5cs?o!6esP(c*r0ORaUjl}^QH$!5kXabor@^p@5; z6mNGIfv+t`)f*{EXAa*LXV)I_;tBUh6`=B^;&6~f+;&`$<1T+>v2XmyCz>|UsKT-a zVCOPXuvBg9ZY7u+V{v(dTUk_hslL@+@vg?B9?xss2h_x#0MZ<^hXHrwpP_&)q<0J> zY*Q1>93Hjys^{!9qN=T*wQ$22P;oQ5`EU&SmppNR1sF{zGk!w3iWe^??i!+QL>Zjv zmpB%}CR1r**h8$f%sFmeTsvb{DXqw~a4K<8?t$Vue3**ujILwEq_=gHTbSTlV zi0!q8OZB(3ws2f)kWzr2jZ3zmyzp$0&ys!Z-A?7_3dvuUC%$S9_IMoN?8?4je&n3| zzZ&rwIvTwklV~Km-bp?@K?dba=AHT5jwYx)c*zr-#rms1HxPP*XrXrfa|6C4j|N)^ zvz0Ii5ePZTuU6j}335g9to3quHow&AED5#Zg7T@KIeec*;6cZ2{ATb0|6uTej_LvMK^6VGriv=J)|db$#Yqz%ED71+BK5TB z#v`I}(MJV29c0qDYsuKi;>~0!^|V{r{V*}EW|6J0_^o$-E+b^uj=!XC35FPU&{|hX zrPXNLtiOWw1NFu&K-H1|BMKWKcgY0h5x5HD`T0wRNsmdrbUr@ z+h*Rs_^l;zNO_`UTH9v4+N@k2Rkl2sc0S5v?UN?QX7E8e-kT8_;_-o)o-dc?J8P(B z^F`^4No|W%3&a)la`u_9VmrPSCm@y1DYQgR>oJD+6?azm6zd1Sm{Sb}n3w8WK{a zLbN2xXS(ic{AL#AVbth&0J;~Rd_K;^wSAC>QDvOyQU>) z2pFeeBS`#P z_{cJHIa5X(Ij}_WB+*k>3*7NFK?+)LJlAN-GC2S3$3Ne>#4pGRM|_N1X6u22wP==j zSu#+AxS54whG%8TZ+|ldx$?TR>}0E@eR}LQ=gJj-MKcwYQS8G=!?1 zw5xTc@9B_BDkp3On1fomsMK-;(y3P>ZTbMrf*SCqu(34Cya*f$RC1>y%P$7NAF?m7 zL_4h{ROS3CN10QNSHUf6!k?@IU1E4918O1asM&srmW%#c${knS=VcLs8lzDH_g*)Y zq7QA~YjJ7IO1T#3Xrwcl^+dLuId``TwR^Kkxuqoz3z{bie7SU*wV+@`&jz7W+A^=+ z0{-ePLRiu?;*N%QX`@}U44PoyYz@@B&{4FM1*ysG#Tx+0J#uQz8I>kp4mU=pMu}_? zjiwfPV;2L6r(TtkZ4?~KsL=D-`s|j8KH2TbPgEQ=h}mN zV;;2Dw0rIcStuU<3I$X6LE1V3QWrM+>%Vs=ih!+v4Y*EOkOz|AGNocQHxY+UMmFh( z^_GL5Se5l9O`O!xj`OA0$nw=4$3;hxykCNr`dGp+-&^12TH|k6+diK4W!mfVwI?0- z!7nt|;pf+H{Gxsx>^weXP!i}5qtQFfQ@#q&zjXjSWTP*ybW(_BV|NXLhVrN49)y}^ z`S|@zBWcz+HQm39Pqm$fqO{W9Y}N4fvMYg5>$O%~WE$am#l;QZ@vGB@&J9xq7jMSo zjl|Lg&}nRH{a3yO0Z+tFG14MMjMoYbUHcG9-Ee##&7OhZEszc4yQi*{^h7$)$||?)>{*wfkJH2ALS8U^X~PZe|U!x zZP$2@x(3{{mAIdIYrAZc>i~C9m@r;bhd>tRTYu-86o1N^5eUpXn3sJJwA3o6D@n`t zOMfGsbH*$poz{&^VIbW*iD|j+jPT1uBeS4?^|FNeFA<;fYyQQ)C(io8?JR<^hTNEH^3gom zrSJ<11Q_*ngytI~+Ogja>|r~LcU>}>l5K)7i2hB!W;PetYo3wiB?_qYbMWen@-;iz z(WGzhO7HhcVvAP#4Mpn2jDoSa1NEJYiONOjnn~IVm!LpeRZfBdE-iLaZ9AwUt=>b_ zYaf)Ka92BCO;qR;8JLq+)Cf#x`FOeOTbO{iC%)cYZ&p;ft>mCsyOj~i>`tw41Raz`N$}hk8CD)6(C12?3o9uP2^TlPcvVxn?)vsQ+@^4Sv`F0 zdz&yrEXX-IgxiZZkx`x|8Da?rDQz{@t{#qTvEKb)l%?^gwR43mdhC7JACL21Rd(XB z(=ou;DiOn2r~Ja`0LIVCk4$c@dv*4V;Uaw`KYJego0}^XtnC$!21 z|KZ4Jb*DHWI;$DiA#Xyuj(`9em})aB@xjsl`#ecn%{p2$j)5%^YiQ3*H41{i#vrcX z2df)|DuLlL#IVZt3laicR5cpn^1ykb#lF}jq>qOf7fC^QtNOlJ7Njj-48p`4&k-?` zSr*_ROf9)$mR8(dMS@r$M9~`qeRuUNvxQUnw9>}(;^EOP9B#bQyC9PNEB#~TUfHK* z%?hma<$A?`(|kZ|8p(gj3d^-PKPnx;YPkRous%2`TrqLD0e!|wmLz$7IF5YnxdF9g zmBm?kHAjPKeBeBx^14JZFhJsFk zy7~|0Y=5vsM>d!FjvZ{Ak+Gt6ZG>SRbk64@zk&&TROibqOTch0TTY|PwdhT&xgF$~ zm3LJ&>`i+O^=lGuu{CYmplabmfc(`K$IYyyLlGwFG|Kf1W>l$PlIXx}l$*`tL+0z8 z+0AZcz`zi*3_2;fmLs244$vztGE`)R>B_&)4~>iN?|kLTOIIAS?J-4XMDZ8wPpLQC8HbG~KWTJaQTOF14wI_YDr7T1 z13$zX(MuANhR4`NyQIn7k*GD=HAs0C$*gzn2cQrJEh3R=c5reqw}c4nte;rv#58Oo ziE2T5G1Q5K;c&Z>R)k(2YZj-p^3u%834&CSU|Z{ps1>G?lQT3`6hCPFJ(l#V`nUMO zjjZfwMvR@{-K{_HbJ+5~--04Q?wj$2sbd||3b{aeC&7KfvaH1oM| z;Yp_&DTeM{%NqpqLI!SBFGN1LwW^}VttEKjYS&)f_q|A-CMucugJDGhq8s{vihS+t zlh&;fwKLicycyE=+33x6v+;A#%`g)@Cn4VHB8e!n%WqkTmBP{uQdzAG(#@=@>Z3dr z7j-UlKrEu);YE*;vgyMa(!oA9{r#74oxAi3x}8`T;itk6o>4$z34LOTr)G!yOe3FJ zN$;0^s#Mt)EBjUYBlrPvyilIYrGc9JUO=h-Mo`S{rthBt0 zD*C|5CdK@UDxRcVn{g8}P@6n>2E@sr2mR|e1HHwJf8ryi?(vcjGd}ReRXH(?NN@VX zvt*BihxYK8lrLEf4eq;DIXL$$?SNO`fz(GDK32u)WGyK0^s<{NM_W9{(gzE2{YV4i zbu);2=f#_F?**9hCrE?*v6_{1TEfqo#jX8)G_iJAYxjaIUe+t(7`|zw(gHIQJqc zCC*PE-zqs8Ep@id8AKI7&3u@qKJy};pe9ltCP%kZwK71I2?v8sRE8v@BEu&Z6 z*yics<{w#G)YDV@)TJbIWmo0^BONbBN+Y0RqGU%tZX(6f4=b1R;TMg)l@m`#5b1fX zFUC~M(=u9+cNRcFlr;L9uV4QWy-NuNcllJNba9zXj++r6 zl_#^tKdW6&*L~(glagM=8yp9#TA571KVA_)>y0RX2yXYga5!hphZgm$y2Q6SX;7Cl zYMRe_N;Q%fw-?-FPP`*cK&fU5W(t0EvaC8-chZPkL0^eG8K!DdLS?%XbD;?os+ho$;QxK`{>5&fx)Z1j?9@LLUlo} z`miRG>5*iVYw>WeRW7BK9UfM*%-6sF7QVCt%A>8I5qX$WjKg){p`B5penwLDgs$@? zHba-XZ(qL(lZvQ+iJU5;);hw1D#F-6`|qFsB=z6F{#D-k-&ck9pM1Oyy1b7~6;48_ zN)z+f_bywWen;(^N*h2-G$$gkVw6>GMY9l`aVUKmU@tOxSjHm6M4=7a-lr6o?9XK1 z#e0cPCKa3xRlgB>B^rE`1HiqN@`BOMfvI^QKh>$LCfm{A3`6bCh(+biaVN7ZGkvT+ znkVBl@ls|bNRO!fU~XzmMVVI=_-&`Hz`xzB??QG%rv1pS)Ir|6OAO-Bubjym*+Vc& zQi3caDHV!;r_h0S;fDkfFC+k&8bs71JDhbsO(_h6^g<9LPgZ?VuuUz}KQj4{o?(bg zX)2Fu-J6G5QO`s3;FU)$S*t#57Zp>FIL}a}dur)!sTPE$71iPm%@}ncaS8VRWoaJU z*DNB(K?Hi?(`Uz6ZrH*u0R+H80i{v-*2*d|B3;SxfauCanQ}gtpdT39+E0m+_Xibe zYs|s>LAU(V;Y{C^muIOs?Lb8dj8bCuO2d6%?(Ut`d&4Ql_qL)wYF2pV4-TP>PbH{T zb&dwVyg*oBR{%wNGv{BByDB9mFrb8-762-#o~gua$q8i2t7&agJ(86 zQ~n!Pduw#O^x(8d#$&(oMNEQcztW%fN-7!0qLq@#t9Z8m>wCMlP*tyek;v{z!}srk zqyQn1p2K=D(kdh~bB%^wMW^wzyR-TEvBCqm4MwiO{ZhEB5966_+rG2<7MR3HV_{eO z=@L6vt6KA)y}p#N=^EA`%90RuTiR^?bj@TumUZ{gs?vdyLp&?X6xksRD805mmw4vRd~lS`fT z0}l^Kx4m;2g&11#m^{tGrNT0_hi;m&V%YkfnJ7r4^dFh=@+vVcMqJD#h})*tL^@O7 zYB{q85;raP*6%_`wX7YP$c`5!c>sr!NyoamHoPjW+8dC=!GwJ}^9uPOg3JdHPdCOw z`sHgKKK5)h15^-qaaKU`q@yS#-!uoc(I8XoB;Gd}>V2tj3r7v*Eb>iLIx%_pPo(Z9 z+n$kyY(eB7+#UcJ%eCDhUCO-2x$}8sp2d_GHn}-ez4a=>h%25YLW>5{h1oPc6S(Jq zt@5{cvSI)8XZF8;X3KBS;mZALsf=Q7$`URYGVPDrvMq~;ET;__dznep?Q@}LHjdj- zsza={yD&x5-CfwvZTLGQB_d|8Ofb_y2LjG9M`!j7W>CMv5U_?uf9} zxJQvwg@0Y8qLXd#;-)`OKfklhO4d>S!*5SY=;a5Iz1yWfy{P!9w1qtYMaFyMysyXu zS%mLo*QLp=Y*w>Ub}rA3NAl!ZpnT+c0SI`?3ZPG(Q&eDOawjUo$%G|$u7NzLtL=EP1Yyt5D40MOe<@~HL(CkFEzTxZf=q9BfaL< z+7P8yY==TP2mVdO$#%Koeq=RQ4cn>!X^u|VGTTMxhP0D`Yey@;o%YI5=3byPRLk5^l4JRwTL9rSn@HRF<>Fu|lV)_nZyD^9;eV#%K_ z#sXua4CcM{eU`!U=+`nh()x?|B>Z$1U`J&*VAMtH;vK7`R^bumCZslS_6 z@8n0JPAkWUAgWu%x|(iw?s-U7aeeVa+1zUR9dmKO=)-ZuRM~QKN6kw1s*@~!_~vHg zMC03`bmZnEZ=_<~XlH*`JBo*2pk1ZD-?{UJKEt@UoVkK>6?p{K(I)J?OMPI))($Q& z+f=+49#POzjiwrcnH_iTkSPwBFa|$cT{=u8_#7^2MLc*B^gLOVcbZL-o=Iv@YVhXj zqLLMRvI`=J`d9qcIe9$dYjlWGdQ)S!;Sr*R!d*`#y*%416MzchF+REN) z%%@j^t&dzt>&LaWW7;OJR~m;Bus)4;^by@9D=LIm`3P~>{vr-n%zUk(c4ZreGu!cH zTrRvBTlA*kG67eQe53Sca}fpT|JY-tjqJE=r1f96Qa(dA5?@o;;e$C=(w57-)H)#S zH-Kh7AjpSp^U4sVlMXV#RXb-dS-{PdIhl)LaF;~1Z`6Gw+9JT6e^1H+x~Sk>uc19g zga(vFXjjX13Ipve0Uur#cb#}{Us>QL=>VZwYRs~b)rd`3u-D2`_?<%uvcy6OvATa~ z$+aS2HOKZ2E zSopY*If7%;^9`{UWNV1^dN`jO-*3Ujp)DKUlxqiKW_ZBECW|bV*uT2lEOAWBeX`sG zen@+%;KxZ!MRZVgnj7Jh*6O1Nt(7SUt(ESG_k9*1ZT)K{`t)4@Ux8Y^j)J^b6lawl z!uZ6NYnhrm{k&ameY&V|E_BiuY2A}XaShr~$Nkw)&Pk!-ylNx)nZ*Y5GmDMuXBHdY zla-{|URgMbhZFjZt?J4TSG9{EE8PQG=~_TR4*f05i`Oi#-jiOvD7|`9di^S8tb!;W z@3X?8qhhpk*?q%sQQSI9IX{n%d#TF^2L!kc$KGb z%(7zgK?E*m3d#d>pwm-G|Co;uM$vxL5|)W<|B+2?y(bbEcf{Ed*ty)@#mc8Daz`5s zTaxqEqo`do-Dwu4H7u7|^qPcX*OTdFeK?hF#vNTix$D_Fftd_8kSz* zSzhn~cHsS>vSQ~$sNk0xcem-qgNUP&1}8Y(6~)Yj+76b48v7t$#i*g2#PzuMRA&D( zTdXJICYv>rw(=f!OcPlUNm(F1+)*ciS>WK*t07evtK6{M?5=eM9+&!a+G833(ZN8N ztd0#-`Kga6#4VMK%A7*TFBSvpjkI@>mHfFFD?8rnq#o5Fl{u{pwTrkfpuKi{gvq|j zRi#~xd&CCH5>BJ!AHrn?3FX8+7RaTAPpza(drB!*id=O+v;;us*4es**oU3Y7>hcN z?4z??gHyzEwt(-7lDs+3PQrW%S9bR1NrGd;4N^Rh`X~UZYY*s5ePV8;THOU3f3e6t zEAeWTF6TV~FM|;B+au>{3ysQzsXH4e`wy7OZpfR%8HY3u~^O zx6QnBXW5-rQtH{D-9v99OOGkLnMn880IIO#WT~mR>`r zZI4fR4DH8m-?R|V?fX~u!`lz;i`;&;iDcWqZ6(KzzEIRh*oJ@p7Nmdw5v2eA6(mHJ zA_rLA>e~ou-#EcGi}*_vs~-)^qNzo1vSQ4U65(+(-ej|FpQ<=Cjp@byBh=h#4FpL2 z<`T`p#P{@u8#!dxG`(biqMLWKNrq-OR<+Ybo@KoG{FC2GZu7TxgKhOVxFb`J3$<+p z7LCAl*w)UQa;XJ7+Qq%CB`#qOJt{zx*5sBEIHCf$e2YT)*y6aM`A32GhDS5~CSP(} z9GjYCE;i#vP=Q<7l09yH5gGps*=95J-fr)0S2n}_>yLH>@8ABT_1WyOyGhA-nKXFs zB{s{w?^h<8@59U~V`9^PzkK5_>aP6qu9Dg%S4mAgVt1cRPDsLH8Bh0#8Blj;Z|2MD z8&YbccJDWSpMAdx6(1zlQvt|(S3-jCv#HmmOjo!s;`aT%h}-x3A}(d`%fJ5$lDLq+ zFFfA*u7)7omzB5sC2F$WlXHBd-g7$81X<4Xy@-8s-yX${YX|}t>HS+PaNma)*qQIc zCXBcDQQq{w0|c{O>hBO$7e;87NG1GYgvQ!_U;g1|2a*03B#{a9zWgU2{EtUs?6qW9 zJ2ZR$BVtD;k;t|8I6fP-j7WeGmklemoy@%-ci9p}!ox*bAeE&cBN9D+6-g4HemhTU zg(YI#Ktxt)ySpp30R9Qt6Kvyv*?(6qpur%k^&#Sd>l37j9%bFcaNsE(eqJ95bU^7p z)044ytXuq-+?H7Qo zqJ7DTNe5OOGt?@tX2CRIN%)Q7G|Y&WA$)pojYYPq&& zK8S7{&7ytWo7v4#&PRUtTevy-**7;nf>yHaVAB41S6)W?)iO-#0{7pG&vDG|C=uRRZDC)n9ICDD0zC(xz#O- z2lQZJMiPXI()nzLH*Jbe#_9zfr_8Et0cvmulVUNo5BG(8z$Sxsr zYC*}!u4O7?liJK?YmP~4Sye`{K4^pe=z759iDmjgaX|K)I40yf;LM%?Eq&o+{+%vA z+`A|_wv$PGtt(&UST6-Sk(H0BF~4Gk4jzF&9_UK8d&1SUnjSSd{D7i709gLK4PnBT zIBa}~QmZ~>?jo+00BT(ptGqvTNK|3hv^$(QS5h$WMje3RRTH)coS{rX2Jp8YD3VE5}{tfbL7pI^At_8aqD?zi^xfA^;6UsA`BP3-)-WDxQ8T_mj)dk3vui*%HA)lL&HE$Jvq z#2Jb0p=|i=;+{J#5#lHe(WFs*%`c`EtC(6(!_Q0A#G9Y`dFjIC;(!Xo#^vYbCFA!a{ADj0zaMEeozKs_=Cp(H z`EBfrFRvIR{jMnNQNiunzQx;paBTbMOJ8wv zNA7z+c-CAGLCdn{)wOH;$8c_Y-AD79Epf{_AT_1$bAEq_W6Rl5_m`> z5nb2wb^t0Lop5DT&J={07=u46r8d;qrI}Aqi4|_Qv@^8RAgm1u!A(kMNg#XCDLYzU zW@QxZ=zNjQy)vsPQE`;VV_#7Vyf?#Y6H+^3`%4>ZbTR+_%iO#~9JptNXefffyLf@A znRtQ?=*y*`2=FN8;G!j(5gF-@D2@a}UCv$0S;@GoJYFv4 z7aNr;l=)VWQ&)^@%YhQ{+JZ+B#bpvfzI_`lvQhNsF#gwenO*Os&rV|JTpz51B$*O2 z%z4Afif1SHczD^6L~R2?2a?my*-B<4{_o|%W$_f^$bYjtN-wgOt{0ti!(^8i-uDrZ z;`=x87LQwI`JF_sK=W+{#e4Qg~S)0FlX62D-KREeJ3x`oqQ(H%Hybt5hEJKaiQtLRNpS)kc_n0lDJoW_RIN5hJPy zElP;p08&3d2ozY0_0VN`l$UU&h`E+^UwBC)7RsJZ<>U>K~U0vy^ zJ1$zqL*;57E-3WH;BtgP=o1GRLGLSo1D2Ma%B9o{&q?e6k7yJ%Fl47^7b&9-!6 zrLNJ*$o9%fh%iY^odcb83i)+JKeEP!_V0ZdN>UiULAtKzCbEB#F8sudJX?)`( zvgzz5MPjwGnfl{jkrqMXBNm36{E3wgHN(_pU+OIzn+DSETfyw_B*)6=g0@=sk4n-^ z(<3c>6%pPb$8Ii@$N&O|P6b5Fv&osQR|E-B-Eyxv^%Wl7_u=DTo4jQ+yky?Lg7E~ZwjYKMX>K@5>u`t>Hv zpQQ>^oKCH83=DB50Jfc094*jAzNglMZWsRo2cseDkwnhKV=BQe*CN;S(#P-+#KCkX z=I)3k=3j_H<7;k7R+(a=b_Wvn#K@?l*D94j_~z3<>x>RpXe&U1VISKmpxHS;q0;8NUfE<;qSq4m(K>cl986uoc+L=tX}} zM&&%^_zQy%k{J1szKmJKHGNQ-_^N(SK^vGir{*ZQp-U;s&%BtZEV@hZR;YCgqU4w- zi)j0J1oJT&O^Q^>itW8zt=C#x8Xa!w5>>_SuAI19vy?1)dA&*_rC;2^x-`AJ;~2(cdlt}o~MbGkRzA5M0> zo2>U0Cp<|Ic_+9U1!e1HJ%`op4?_F4O&J>1b+>zz6!7Lc*{BDpXwxV9HVaCLnz zyfu|^6ckl{V=}$#c}Vw@6{GbjEc$a#rcnF9E$S${%qp-R z8EKI)E*Tpm56X=^97MjZ{;q_<_SsGF5QglW~&7N5UXa4FfSMVXm@#H&oK^M zxRy1aj8ktVmW&!`%SX;r%S)O?mG`gz3Szlg?hGo*DN$A%FLqG6y${f}6zv7^=>Y7I z)3MXh_(_Li;-7KZa^8U_gFB0bcl*(YAUy&POXkqSTq26eBdWx;EA`=Kc_9;E^_zZB z={%V6p!P;@+*(^Ft;zR%Qrnq7X+_f7o6&>T-US>qFFVODat|82Mn8#nNlQw*TDVh^ zv+{V6-?v*iXijE36Pe8MUD}KR5Y%6Wp`mF`fpu~-7gCkRgu*(Zv?g0~>ruc+IfhP- zL+yf))CR)ig`047*RJubYTFXM>64^}qe_an?O2nGjx5@~nUqM%KmXK9Yv&{max27P zvTg}xrqdqYZMnsi7VMLi7Q8cqv%QsaCstHCru@gV{#S^nZrw(|G;G1*&UPYgMo~TD z(8WRO7qO}1pfY~7u8so2!r z#zJO(OycV+LY8<-HPrYPxm_G7VCn+6RX4%Nydgx6W?$Ih0BX4MC3pMCj%NZT-j3XO zHds@L$tHj%!acPN%21G{uipm5+Z$~RDMxOdH{&k9n{45SZ0yToZg4zFp>dlHidB-7 zM6pgq1*e~yoh;sPFhW?^IT>%u4-o(ks!i%vIv64}6ZEW19+}ivt&f-v&q<2SbC3mX zb@adYH$%sh_#TuU1Xhc(lf=>`c|CVtr09T^jEf3&GGn+i&4LXeW5qB z8W9mik_L#`#7kLp#yqG`gg7^~NGr80FE-bqkQjx??KdJjv9q8aFkLm?j+8vZiP4Wq z4$_0^fuQhtqm$L5Xr5fAnrANtUsKnGRTKjYq$A6mRPA2Ux?Wfq@mH~`YSS>dl&V%G zlTo1gVt8L7)Cc9-9gOZROv~}9d@m4}Yq_9d9V8`4BhnGMjCQv21~|ro&`J@M6@e4v zA|t87;aE6<(d0JDQ?6B(cn|Wk^x@PFWAVQVi8Rq3#J)doVj9j?ovuu>Z}cI`aesHq z8t#A-Kroqj)w_beOXS`AZlZ;GlgGmYm$(akpS*KUW@q~)4M7Z08Y5TKlf4xl?vm*D zzkdCPca5ybhm}OYl`3j{nn(r6vN;elj3jB#JBH;6VwsjNrWuxcgT;r#`OPFYPwCAF zH9OtTmBIU2qtZMlJ%sqGcvnJ+I)TQRNk~-OOj%}Wq=eXGgR5^5!VFZPg8Ho8TR{~v z1~p9&*9LTKzG6R3L$;@?XJ)0|(3#N&!leEC?VFSc`CpM%lnq&5(YPd2Hc%LE08X%z z`eCl=QuRv8#;o||js~49HS}b?GvN;Z(_}U$l@sE)hg=_sh%vp=xa8{8H7)rF>7MN< zpEy`&aJ<)e8IiS5q-f;@laUEkNcfL{g=mdUlz^J&vbf;@epYO-S|w^Zv$!8dVZ94P zF|a-m2@0oYBgW$d8a`sP_*B@rNveq7_;dB@W3P3L4L1U?dmfZLl&$2l8fI( zm<>F+hxW|w)w7xCC$ywqut>L2^&7?#J%bYy-o4h6CVJ^F?zm?VZ*&hgN$MMEzq=&+ z1JIojOYlaH$9w`cv&A_h6ItHqfu`)bvlvnm@(-+{4nlA@Thf;cn+Tzy=c9B}<|_hN z*Alh?to6vd)0PpbEQ3uIc%84MWHOxn@^w#!7&&4vaf)DgyC@Q^#>kUJCw{cnrN9(= z&bXFn6!HO3$qw#=q5Q1P+&<1nKAuz&zyOwt{G`>~6~WY17^IOGq^eK+DsEJI6E~&f zRW$NdkoJ`A%ns-$IjIf-;NuNb%I~tPxzr^-F-Zh?1|gm{6t)wQ>Dk;Zt*b?h<`7Io zT9|${eikPdQpH-RAadhA>3rzy628gCOB$vaa^}N?Vx6b#;UeCiH+h_nB6RSN(eDpj zM}VjzK_l+-Kp)J-D$Q5Ysdr`$f}X=FCB#YRD+6FkHXf0TeEdQj&8_Ad_>D1~mB}kG zO3s@zHr*ku_G(g5PY?igAm?XRBwn^M?xZN!k8qkUbP~zjxH3c6i>yZlb|9^_l{J%#ve%GMh|(OSiNGwzG!l#0dG?gt>T8zonCGm)Kkn>DoL zQ21Q5wMZtA@xvQJ9wvDZZ-C@?UTNRMCe8VyHoBr8Mu6UN{De@+&crRAdv_GQ}G|Gub4yOtyQ#l!^gSOEk(DSfC5qS9I-DFJh$=&AWHm z%L`LdH&VspO?xL#wjc`0IOQ&Uvp|e%m!o~Ni{hx*>}{fBZU5_Qx)xu`*QAly_#~Z)EufGJn+pOq#N>0lW>;YBqAA+>KMF?q2u>`sNUu8o6$= z@jy~Q<)co<39r7aoOvxt_Rx(-%qSg^iU#6@>VoYX5KjkCc;IYBv1X-r|=)Sc$)_$$^^WtSr&EDuc7!+to?DKV^z(^05AA4)tq*f z?T#QXr_JEog|_AX;z1H;!kGrLi$-dBm65dHsP*BCHVWQti?(5q*RsfEKbu_{{dovc z8^~Es`>C6d4I*9={1mJv7oexfF$mkY?_d9AwPbfQY>em;*WVZb`2hay-buy*ce$NX{?1D6AZg zuz760WM&fCa`wpb@Tjw-Z`r4ndgXf)epid?(d@V-jxRUu+(;-Rf)O*~M^-ny_<1cU z5br89{~Educop;W&Zzg^#X;Zl@ACM2SC-*!Zh;JsN$KaFpktzBEz_Z$eaPnZR2A}; zsC=6*gIykh0~BrAnn)X*Z$0~|`RGuIe;fT2Z zEfL1<{|UD_4O12i;O<6c;oc$YABDq1+!yE}BdkdAo`p;$KaysL8q!f7b@yZu4>;NY zMnJj0P#9F4c`x?enJ~!=xOXyU`55khv0c6!H=C=t!`P2|H0F)kk&bpi<~MiVfOZyh zdJx+&*p)jYKy{Q=bhN^UTA3PpX5as0+RsjU-0#v|@~LnEaM_HstHG9R#2oCa@!iuQ z!Ff3>=D)xG5}gFSw+@TkB9ie{(H@e{;V^g4sdGz?G1yJ>ETar03&fn zJLcLDeo|d+h?IuP|`Urs>BcV5b*2a-TU&i|Aq34?-j9-3>@Y87Nup7ru(7 z?Ay{@ux`jc3DI%!-5=KI(2$S~+;G`~Z8C5S_)U&ve+ zL8tw4dVo1Skb$)c;=&51kO>z;l1fY8h0KFm`g4PpS{kN_aPE_{qm&nY_v~Dw8T7du ziw_$+lKaBYyL$BkrN8qltbS*B1^uJ@hhqYd!`JryXQ-vZKhMNqF5SoVLwk4)W`4*U zf}xjwf?@cZ$G;E5Ka%vXB>g8zA2*XsNgXVr74lPLw&O8ej=G=K)xuwS0ni0(Ze83C z7ypcS{Y4g znRGS7E~w?b#Qhvb&Ya!5q#gdx<}(()!)U@Dtc|jhhV{SiT{bi7oi(VD!`f6+p?|k! zN5>)d)(6KDK885*dzj&gk3^#WLPy|v0nR&;P?DkPZk8J-|0_wuzW*x`djbGG`W36U+M%-{yZmhRVxxGOdNk9l<9R@x3S&q{WHa(;3&MN?IIr{Fv_hOwSa)6yC$cID_2jK$JFFxd{!w&C?&0^9JeRT?kA%C{&NzfrQ@2f{iz{OSVPKhZ|e;&YyXMU zj>Bh8yC5oOyh^PJ3~Mj#*#=@5ceX@8El5*M@@MIs1f3nmzZuO50&=YaB;FG4Np`&T zV-aBr-c<|p($b&!IjxKXV_)67^~$%SW^h>YAQWKmEXo~O<*C(@g!R8e6I&@*8vxZK zr7$>~cWrK0pl4(`1ksZ5wkRVULttA3LzCEWBSJihW~84DwYtbHBD#;L ziWWoEM;nlCpHOWYtyPT=vO>biAjlzVJ99Y!7WrM7tyo_psRZrJR^z+p-}uDihN=@0bd!l^?6xjY{|i^5vB@tJrqqoBr%uSt!^MOpx}*KlXl?v zc_&|)r>@_-IV?B3CxzSZIa+%MIH_c|Cmbk)4@snr*I!8}D<}p#PY^y_WaKFaco=8P z$afK`0awhe+k8b98rg2^O$?f>CHlUF9o0B_R{_U`wDdIb+3pdsf*?hHURBWOO6KNl| z$9->zBydJp+GoYoHlW=0L9E$6&~k5V#Y&ov-~eS3z+8-ri}t1ompe)Njls;pJGsdF zhn-qA@a;NFd*BN_Fq!_?Ik1Vsx`Mxs*_Y} z9=z?K;H(pIM8qmFWQ?s~GVS7IvpqMEj0+!tw(~0%+bU#-6*?_RL#k!k;2=7JTc(Jrhz17H5bjlQ5$4e0R0y(2rYJ2e8$=0f)GW8Ta&-f z!i+tCISE83Mj&2SrK50=)~Xlzh(_g`mLzz2Z#~^0&ea*Bd>V@0Bn7q_521_*>r^U; z@)4g`i^+-3)}nk|>l&h|E1!vET2ZN9dGog@Q5ZzrSBYG6ke!qT$vTzB*AWueTPtzo zH6iRcGUOFIBDs$2dp;HPtuyeqd`p}K@`W9*!aYRO)rWUx@L~#avNMDFBws}$)syqv zXRW>Mb5Yb5Rg`y>i598NYnb~qcm9Nl>xEG&zvpYz(v29ymFziU~$y8?e%99K_7p zD*k6`W_EV!TJIjlYe<(CsK`T+U%Hwb>KMCY##)bL<*wm2#S=JQZ~-ng+XvSX1WTcP5u4HPkq!6>>4c!a?9ii+?^XY z-T}(Xw$Ue!SO&Ooe@4@!Hvb1qVEsrxHaLaUnZb&I%2UY7l#zzJ#_%pQ0uDk;gbUd> zBOuY_YvKx}g{?Gvn`l{yeC#TbZC#tay@-~Zwcq~x_dBy+?WVl+U8dh!`?v@iMk{u3 z?wFg)PO=a6QHwvYHC1pn3t4eB^`PXSE1MUyF%|1V%k!sr9}zoJ^GYJICJjTdE51bH zRFZ#M`%#=s01mTb-XxtAZ@8+G!XX9r`_D-MRjSN+r$u@ubjn9tE?cf>KnghjAiJa! zW|u7raBR3-af2C2@Ly?ezg_lUg;iX%K$v-FTF=F4Deaa_NXLQScTWI zM1^^>{Q{?E>ZJrlA^K!zWzA(in*|dR5oypa&sK!VE*@+a5mT|G-if}GqelaBuU}A1HG7}WB(6bT3-DNNH;;bvYfTwjE+aC^@ zA%P^DbTGJ`G&3uZtVzK{$RP8Cz8L_u_?EOueY}KWn&d`KxnLTlT%s9rc{|WDzntx0PKK;)h^=OiHun0kIBbh0KA3eQ`8bSZ*OFF!5zDdMny9_8tlX~(P_Nww#9X;w~3}r^pfT(-fY&MJf0Cx zpe&JST^8Q$$3iA5YTvdBvNwhV1rG@z@})p&I4igbN0m3XAnR}v*&Fc#IKOy$n?*r9 zT->)`Q)}T(EoHMv6b@uDDn}}HUFy01dF{`HBGF?l{?)z$p42GaCmuJAL9Q-81gO|+ z^+AeoU>lsDi^`tk<>cxXUYCZ_F&`<6Oox+!` zt3_nAZRz16t>s8xGFp-3JJ;K&22#;8z2z{ZAeN|vD|k1UK>;nVj2u1%LI}16MvRSe z%#ezyTq;*O&DH9>iK2V7e-H*$uZ*+8qP`mG@U>}kdqx!H z`*^P>Q7fD7`z$vdh-V-%8~NE#kKi>QZtQzzRG}ZDDCI^B(vFnqqS^3hS|WM(tDrb; zI{~wqJ&hFn*lg#{M;T92wV;^EfD-WYU7=ph(nYv%hFyN+QZA+j295H`=!|}YKjT7K zBpM#%Wm?pDlaqOx`Sx`awRUTD;-ZWUn+dz@CsYg@MoZ?R66-|thZS;-HnFlcXGi+o zO&F}RyC7Xk>!Xu40nr@ph!YJkkeXWFjOa}HyNKjux7Ku23FT#WC0?1seGZ*@XZgoO z9N1d>aP@W5p4m-uH$g^r7^gk@0!NhW=Hpsq z0YuPYRmL8{Q885LU%n7-%Jmk6heC8mB8*1Q3bpG+%~%`=z!GHNbqjaYz$Nt#*yj8r zXoPy3r<)MB;EcvAQR9^pmM|6dAvo!yQ@0**-;D1S`xvZhJ86u?qEHfde1bzdP(g{i z&zNg6Aqm2|Vm)mFe9kW6HaprZ^KnzlA8fgQewI%@S#hWN-6{s%B7GV}It^U@8>C?u z7;N(@pGhTM%*w7!0EtIx_hg@NrF<4LrofcEABezw2UpCPKRCITbULoMys;IRZ3ZKE+PKmcP2QRiq^Zh_b&Kwt*W~i@sM~W z8zSyC0Zf2p+NIP4XxuGixg{zy>TdX@NVp^-CR3H~Vbbof7kGy}E#d`UdOICiD&o!6 zhh+S&0QgpBkIb3Y3l1`wph>ph2L|?I0|YO}@3w(f{E36Z!j=HrAQ1X39d5$u4xhC- zYEv11H7EoSUN^Cb78t`rh_My$xj|?ot0`VYDy%4HO;)ss_F7?*!{Qx+yIcw{ON0O^ z=upo5DsDy$C-zJ`U1;KXv9l*NEVOpxi~@jU=!Yn4I$B^|eO#F_O$Z*;!32cmXs%nZ zlT_c+`_G94;y(>77*fdTvW9k^AotDn2X> z@-SV)Au9QYgd5G6xgCe764tnq_SqxC2*$BIC248(PHGUf?r*A)%U2#Ey@p)7Evp=Y z6#o#nDIyMfT?ev}T36~Ctu1%#8Rju2 z#!SaN(AJcp!>tERb7z)!Bu91#O-)G)RiUO2OpmyCU-LxL_BgY}Lphjnc8fv>s*BgI z)z%{JyM*M4#(6uE)Fde=d@LkQue_5aL~D6*PThZe{rXkBpx;%Pdy=`x&0vc^R?i)O zGl`>sG84Sxh_$jjF)P|zU!>YeWH^`>>0u+z#pMSe`J4>$B<>ZMg;{%}w^krwfj;A& zO?wrIwVFW7{G;H6&1kP8bE76V^W&0Oa0|v<3BPxi*Xt^jVX(#JL5wLt{s3@1#uRRa~RQYb5(@rRAqNB@mq^Bvy1|@bcO$ zx}|rXW>$JHBI&gug`=)KyKkyV_U{5!tkRE67PfRjCvrFV^7ew~Obz+*D({V}j31no zS_s;H_|j9Tn8XFVlKQY?ydt*OoQOhn}>Obd*|`%-a~G7D)_R_GvIZ zDohG)au1vMj!3JsKAOUvcM%YjC zs(Ub*iwnJVsSloh$Uexf6+5#wq7jSMX_3Q~oraq6qdb^KQ(a;+LaSdsj-$2)Jwjnr zTcJ1_opEK6SD^`sjz(0nC3yS+bi*b)Z|m6dD?Hp#77*%tU!+D#z}t0dg+k=ZEk%ow*- zZ2@?Y%uvL(04$O`UsFv66Sbm@`TTsWpp7^E9=UpES7s+HW4$-aI zAeSVaiPn6D(MCO!A5Fd@x`r!aWK|(vaA3Dt2U%Ql9b}k>f-bU(LF+@GD?|ln@RduX zH|O=XH}_WFRQjP1NxJ?Xnhu?@(kQBoM1m-rcO>)9yPT~^XU0w0M3&?QiLqcrkW;!M zL)46FN_d*=7H);C*Y@b>lB+rWwVXwBc97k|tZ_Ije_jf%UA+d%bx1%1Wx69i+FBYf+UN`lK}WM*%x!d`N!|bBTz> z-8nD)j{!m|2<&3{BpFW;Ww^Pc;o!aZ>QrYX@dWhyWUI?W={>YrL_ZbfQnvDyBj44U zO3OY-PPFwl^45g{)pAT5?@8-4wel-6|$-E7@zM-p>Kv?2#PSJVl9|)o^~j z;>_&Fy7SbPKcmxUgPN1FJOyg2xCJ#?X!@n-pMxf~5czP)d~JqHexluSS^8vgvh?dF z+E`I;t*}Uc-a!=4mt^?qv6^85_QL2ceAeJj;Dfs&G)qITz}7amFD@}6S6JYK8wUWP-{l?*Xp8NgI?7fZ`J4hR>4O!kYgO)xC!bDV2c(}x zJLH~?Brsp)1)v{9AZw_>NwvvKRhF3hsx4hGVhspUS@c)*>T@ydWLuuqKLwuevjNJE z)c8oXQ`Ce{VPPr$Y5(UhK9~D~+c7{XUj=Tai9mx9!R9j!-_qcZ1I=w#+A&}t1lTJlGI&S=BQwFXDy_uxAGIyTE8|S77{xr5V>Q>9LiRi8+mSfN zhyOQ^eWd&TP5iLC`7rlJp(pY9f|$!DS zB1%rr;?G6UZ@%;zVpU}--t6t0T&dePC3<-?n5wpTJP`ph;2DY3v3*8)cxA_IWa*c? z{p%--LfL>o;n?!6L`5aoNU72@GB&Lyklo-sc1+Z52;0zTGK*;&g5&vFTSbQ9KScXg zf+TH7_0gOHTNP6*e6FTo+xSg+3+Qc$(W?OxweZ30 z5-G(G8;|10lW4Qrqg8PgNQO07%q-uG07TX<0>m!hl2aM*ilwv|Ad!q(W)!u^@>*(x z(?DCEh!EW5uRMe|Xd`=tR9Uf`x0*R9s9$QS>NW{;n+mQbO5YHjoOv=SW#D`T#&1=e zDo)F~stz(RyC-+#tef(F+yc9Z=${F|dQx^cFOyV=IGep9<6an@gs|w7U!UmuY$BY$ z8*Sp8e+)jzi@{CJ=?Aqe8tB?qOJ}rVrK4Tms@l{lk{`_1#Buc# zkuSHIWFE(W0T%`nU#O;@{^&PUcUy90&+bmLBN-R?B1^LLi_?IPE$M!g<-s&6E?HIa zVD9ED-4dz{*-^8bhY?P|-Kw^Bgzr~HOG#s*@eIzBM0PCii{qh_`L$|o}dhFqkm zidqJ}?U%(`7J?=+St`4*xQQHI)IZI(i>Gy3K|54hO3Bce_yp9hkHmG2EoqJR+*^3>FpLfABtB&z;_9d*FD^I<0wZa+lI37{Yz#l@NwV8bRWwUo)f!j*Y@0G2GjcP3G{{ z=+o(3M5By9-nJhi(rHvfhX}^voe=#{&f}=U*8NjXVy2Cr6H_lxx5u{WHYJGMS{*w9 zfIcE=^U9nre+RXUPpQHNdDMoakPI9d2W+Ooqdpq#r621_EtkMp3tboia1VH9;HehY zz_{ofEW^5frj@}G|i4_a}jJhmD>(~T&mokRth3{niRA{YKsK-PsS?hPqwP$%Z z)7RfCPoSK>bC>P(gA)|MuK05(!C)GFVkQ;?G^quS5@p223G!?J8MaFL%A+VJ1ctP@ zY*eDPUzkrilkRGjeFW+o05>8|F!SgWRIbaRB=*UKB1xMNgd6rcuck^VQSS?~E?Nw4pZqsQQSdPfV z)SSr;JZWWeW?-Y^*s(b|Cri>y9CB^)X@^TlY=Kw@K$#-_km8VcQ(PGC?GzIo+x&o@ zQv0#iOGd?~Kcz7-$iyibmbO2o)$F{HXKuymVHHD8n;zvrn1AzY6^|Kp+BD^a8P(cT z?VLEZJfVn0dT=4!4M{{6WM<$v=D+)NoAdbtXH~s}_;I2i=wF?HIk^~r%0&gJ1Cz7L z7#ToQ34w?}a?dESG9Le*X=W7h%?Be~FtF54u z{`y4)L2E-_ZHu7ymdg_`I7)r zX>vJG{;oH5DB&AI4WC*0LyCemWB>h?F1~mL7?xKu(-XWPR_c0;R>=?Z#&z0PB`L8^ zObmon7XdIAFRj7kP}vW-pyF=uYPKipp^P2MoPeraC@vbhSHB-c>?Wz(B-zzBeimlx z_bL@-fqM6*_%;k1r|eF?=p!f8*ZiWyt9|oB?#qV-GHSgG`0&NVx5|V~62n9%+7;ka z=&Hnv(9lVNX|fuv<-=!}{kSCG7zC*?Oa`Dh);{wdpe4 zFne|eN{!yVlX=dF)j8{H*4B~2-$Xi0tQhB;`b1>_d>|7|xhdDJ% zrl)nTRi)8LBuGp#%WgTnihL4WSSsanOvcPmKHuYU-S^@J{RUX-DzElbTIG^ST;TVB zgIHO_jA?p)VQu=}{Qgxs^oT~PA;0c6{YX0X_pjm#hZsqa%sjF1CD4RR$)NTv+$#kQ z;YqF`4SkIw5uUhF-EL|UU+i{LT%Hw-`OiEmbEBIUmP`5VDA0r?Vc|A9InQDYyem|f zoRDP7ded3JGiY>>8`_eZwzTBDV8Giy!$&H9V|3~Xj46*8;*yy*DZ9%L8tL%2z2}Z= zFiunmS9zqTllzKSlRq^AOtgRT9zb93Up%;~(3y<0z!#`sGHDEcTJ@veZ!XN$a#w_n#w8Cxpu9}g#}n2;5H*^6Mn0)Cf7}7G3z8&A`rQ> z2TWe}x=bZ=O|Bb_1SufaZp1ISG$kXQfJSedZp}EDAdXJ$=?rXC%!+*Z<6dO4(eTmg z_4($44S&$~pZ`SXL_IHqcs~K4y@OG5LD3}oyB_(=kfk*0X4JHpn%xn(<*rH6dQ=Y7 z<|7;dbO6}RQZvXAwKGf0ChB6m7m+bUCq@1-vuFq+Uz!4IoosEcPby!cH1nOUn9us| z?7$Da0Z<93+o^1Y9FGkN2KQ`KvtLIOwz;9!CmRnfW4?eF6GRz2Gi2WZYdU_dQ24}- z98m%k*850jPRH@*i7J=v*!1qczM%5oIjQ`&UK2}0V9WsJUr2W;1=5%y37qHxk@&lA zbEXP^zcG8xf~2=vOX7tvAru1=2&cYS&gPiiw^AJ%;aep|Qnbzy=$zUjfsqqCwVZ*} zvTx)RFki)Ju8=|AP4Bvp!(OE(KAIcob{6?!nGRw01<_1w=@>+=m0khFk;!Z?B3D}G11{@o2z8!&qxD&5rN^T> zDk$@GUf;;TiL*tgHZ7M87|;l-opuIL+Utu?>rQMMre9txz_C^DTm--NO30qt>Vwm( zU00>z#oN@e)_)X*)jE+z@#HN4nAj!>IQMLjgJ!Ec18no^othqYMiw2u^2TPfZc*J) z?G=bgV*6*hd&Xa=u-1O{Qw!#oVW`xMvU;&$i1$a;mtHfxRr|{)YQ4A7r>!<*fMbjka5ZlZFJr4upRGOu zgH)x(VycfKo>;zVUSZ6ZKAS&OcT>%yH4gDUrShFyAkB&17x=)o44%IR=a~mp-I`#Y z$d;0r-kOB`h{_2@{`#WcUdhiK&|P1BnYE@DYY6d>;bpIXW3D8I z`g^X{QC~E97gt2sMjwe!CJ2LfeXob6X! zU*$J*{!XaO{gu-wRPzg;fVt;Kb0I%eUaiRngN!Q~&!7<&Ju#Y(G33j`qg?f7a4mdA zSCn@Q;`f<4lQ{rf7|AenGOEEm1YjeE zRpVT9{y*6pzWk`sN1mqwq6@qn1W`AlOKSM`Q@jd-2dS4M$=?f5+P&!?EDHv#0KiyR z5$y{i1XOjn0Ufrnk){r=&{g(gEv|eSO$%5~C?X_>rLXfc9>4v|_Q*viwZ{xX8GKrt z0tN8NIbmxSTVd%1B@D$>)9MF|sraEk3FVd}Bh2159!5cDX%bZhU?mS#=3F5AK z32BKw1)-@f(Nsjpsw!d4L|sV5Uxi}2;tpE1BtAM)O2%5ft+UMwNUF>{nq_B^;8#gW z-nes};|=@7yc{TrOZx1{Xf70vy0T+hX;#h3R1PrkP)^|m3-x_#(fq)oQL%|yF35G9 z4n)pOhvbNwB}79BHqmfRlIF;=K#9FjV?~K-lKCs^oNi z=9G%kC&tSAV!7C6MUg2TtD)hmYXLPQ&r8%2OgL2v*cgyQu1m_l_etj;yIHvm{wOck z{`oDe*IZ?+0P#RQLE1tyPCdCZqcQ`sT5emFT$+$5(4#+FilrS)s?y2@jq7yKy>1m^ z1~_Dm5hy{%O?Tm6LlnNC0iv`fwcM^mvZf&`($x!^5DS;}V~s3!Dr#VO)lMl~7+$61 zIN6&+tiFETAWo(#c(&_%1a%6j)xCMaysPnwooBp3UNB}_sSRxgkVvZt)5_JJgQRB1 z^)-}i@d4ZoK#8TG->7#ve{`tO!4npfwGTQWUCSo&Pv+;VRg5BV5#(V3ztXa-tdk2puR+SK zcXn3@krtnwLCOs2;`$Zqgqwe&pp;$*+2()o`Hnt*G2IEI1Z-GxDpNAR$bTU(xsH7vD zxPzrS4?MvV^?*pbT4%LvGHTfKva80gTAUI-qHxV~o0S|=db>SV>GFQllU9c)4VlE` zW6-kT8jS&DfC(rD^IgA z%(T+x2&$)vi8-`O{#K>F08w+LV>V?W$2{bkNBl)vXcCq*I|m8RWGrcdo7Ii7wppvF zFjouI{*hCkc|gG{!$d;ofTD8(7zztCWPE@QNPbZ;9<^voBpo3`Oa44fTO_q+_GydV zfuv9V^_3=kR?a5Q<;#@PGCz6G>VHYHbpO$J{q@e<1E9=QgY(Zu4Q)*|dR6Bl(sb2i z@S6+hrSKby(^{vUnSn&j&NTz1CV!tu1)4BtqA)9cUF{mL_l4e8g)CfZRO<bwh9FHua=ZY)NQ+VD__-vs0f9kycYI(7*MD?m*rJ`vI5M98l=;!D4v`UM=RZvVLEX=q)4AO zcb7pBVM^`n7L4I$R@5aEf^bT)xuMQZrBeZOjp~9%NylU`!D=t=V8Yy9`M?F$>bFqw zt%PhOlq%CnE8SHARa|gvVR+936W)=Qpg~nSB><%y?B?Kd$rDkURqoEx!~j+ zMs?onF*^!AqfX0uifYYUYK{k$iO`3;B@-FI9X{Cx2i(ft7X`}dc81$fHD3*&;xu6eMjn(mC*uXN?Q zbhvLXc%yn$IXQp7T8feE?x@5Gfr8RXMmffAdKO!HMQ47Dc;UM}QAU`yh)}7@E9rWv z0TZWIWjQQfU{yQ3cBSGQ*GVNFcNpEWs8CyJWbffLz{SkE8Ww^SV^)p3&$Lul4>bF? zU;M>(UPcHM>&RMNk={3#oDoG3nRjJZwB^-;Y(UZXYSMcC&9a4dL>MTZ*|;l&ynDsK z^T`sdg$C^io{-VtsBiCtw|WPJjrWJGG`|>ZCxVgF8lp0x0_uLhLu)L|a>nKW-D^;_`CPzFxv z0Xtn@B2f$a>}CX_!YY}Y3N>qL&zDtC5Me&AWVq4GcvFKxHHdNLV}M`Tfu02^lFP8y ze$$IG^Jd>=p5eY9t-GXKL4RYbazAPj5&PpEzNZ-KH;_vYe3Zc&@;x-aN`-)zXNLR}}%xqgDMI|Fy?ET2Q(69wzZr?#D)o9`t7C ztQfFIhO=Tv=HqebyA!4bkt0Hv8T|&})yM+IZg2>G$; z-H@JDF%56Zrv?2ohwcqvC!*WfiZk@4QlCM>OJ)706tXc+mt-u0d2_x zw1vP=CwgQf*0hNqySHvarRq{#+&Y_Ic+rKxpIqg>m0ln=0a>Nd+mXr#vf>U z_*4e##Hub>g;=;Dhyr0lNfMXJ#TqmEODH-t(nEYRc6MwyaH}g z-SpjB8To&k?M*~=+~(DcQ~dt(mtZ&-#og^~#_F1lc}ZuZ)yVogH_PwGZ}v2z$|Rcx{EiSv8-dHPJGtzE`ex zR;rOVN6XdlO|>CmOJtPX=m5z8p2a|J&7xznHzw+DG;DNI@<9eVkkQ<($mH^h@aA1h zhtEW|p<;^1Ewn?95i~YazB(U32hP2JUzWroPvPDpy#SU)Q3bJnMSWbY= z6)_93f#4xPA^BRqg}n(dd3z&8i|@D$pa$*K8eMp(@Bc8MAe$c99rju6wY#c-fZ5$0Ja)#uSsdyT*TEjDSzU^460Qq-5Iwb` zD}f%d{QMF>2PrSA&q{mYQd!hl@21pNkloy?$bb5s%zo&JMqDNzE~)}SKtv!7@(#jM z!=pZNRyLzMT?*z!Js!@A*K5mI`K1wM)R(T3Ke137RN{NqE@E%ocTb1D5Ee_{Fedwe z&$mAOqx+Cr2A+>nXhn?n@~lH9ei;s?7LGnurPdp>HyC8e8XAZQxQxN5F8NSP8Ck~9 zbtlAdjg=g`W#TyrNC$c;*PrYy zGx0x}>`#p3cYTzYeM@XQ&k9En4Gxl(WpGLMTI;Bsrrg8)O znZr)S?1Akc+COMhg_-?2m_GHZ)11Ky#;osIIOVufyW#|U;2Q>CY?QN0Q3pV0$l^L7Z|CVgla;>oUF-O_GM7r8X7vC zni(-3#o67EN-GI}%11@K_ZqBeedW?(4HrUU*&dx1=5Vt%fk!B>VHH)Ih{k=A`BBK9 zRDQ8XiQT}Qf*<7KBZ=&mRUZ=F6`Y*KxRx_?C4(2b0lumn_UElxDF}8Y(~?MYWC+ab z{oj9iqq{Jt*86Wkdc+~=F`2a@#T_8Ci=(z=T6vl0TIE$`E4h|zv>+Ob3 zY3`^yBl|0r7uQ-{FBm|aB%`?;ElX5_<4OV14RQ-gDdM_sKRBgt*%~C0CsR7jL7`wS z|G`e1UK`btDzZw!S7Wnb?LG=%%ZJzaQAnAwLgcTGs^(%qy1_D$<+{lkRKnoC_RL6u zd+c0i)_=c>e$7gzTCaBJtl5RzU-FBs;=1NW;t{@Gqit!1x^9Leu`(P_I)A^}%BE*v zf4KHuO!*4QWpJKC^qib#o_4;XKu?jr4X~x+&A@%ArA>#b z@jBhnneP;?6)NRAa+`+!68jAiRyvBy*pq=UufF~FC zp#S!T4q$JctM}bF3oP%sGNxN6yjmxnWL;O8n*hMaZRX^AMvmsDsOwT!!ww^QhBT-3 zm#PBw$v+!Z$0U8E#tPPDSX4N>krUSU2X6LK-%F9&kGe&&4=H7LfD)9K$YA%{MtxJ2 zm?Ut+pCm8)!N}F4c2O+e!LX{hkX_!_Ik9jm$)pRjZJlqAE7Dyz)ofyyeeJk(5rWI;(^@9UFkbjZ>6^(YG= zr!%u<_=2PF9E{uzz|?|p;zR9rl3aVx3m-<$Zn=n(f_sP#GL=p~J&60_=Of4sh~;pF zW=x0hBoTeer)VsvBA69N5@4=0a!Z;1@R?7v$qK%+8QorjBGEL(%4^(_o9M%;?-+cm zYwQ265QdkKP0By}PJ``GW<%DeVNAZF4+ui``LM@JiebQj&X5k@(t-#ktsTi(apIdr zc*q?Y5LT-xNjf5#?iG=0*wrf$deWwj(xXV!BPV*<0SSy1kM5@y|Bql8ccV95jVKcD zZp`{4Lg$_IK@&X#_6cfp`a}e0R&8xw=h1!rEr=XK$IWhOUCYxoK%Sj-L6R5xBT90t zwWd?+mITaPrdzc|x6QgYzRF+dsNom!nSr7R66u0i^bN5qNa-g{9N$B8szsO)xto;8 zF(UHaoDg@V;F@T+97(84<_j03W^Fre?!ik(UmU@O^$6Hr0xoCwEaS>ZsH58;Qj46t}GSI$_u~q*l`Tr zF0DO~$reL(-y|l881mo*=i!!7(!G42Fs-QfOB59x@R_LR%H(p#5bYn99dLFS^PB(4y4%z?mzR+)oDmON;=`Tx;CWQID&U zEGKW9GC8aLr3Yw1e81ye%rtV|@MQ}Z2w$8HEzP-H1(MP%Ml_O?#6o-ceV1EkLLHBu zBdXZ1YZ{&Ai*`*GD0htNdc^E=BIf+O)ZyRja6iaa1JL0rhdGdR*#|k4?A~%=V=+G; zkO$>68Oajah*r-+k~D#)51FzLWr6-Vm2VJW*}%@^%E@O=ao1FE7W<0BMj(Y8lfnlp zg^ui*wO0cC8$4i8i&01ctJ+!lK!dnJ{{4sA*zK`fNhl6R?oOinKgmRWrl1LxY*nba z*YSKgWSNozYFP+Aku_;Th>EIrHVmD7gDL4xacrDxM*1zIHu+Pw4_anooD8>?CBB(H zhH9fmep6JH7l^t!)#1Rjqg+%QzMWOe)Jb1j&2J5*1UX6`!L#897zwrPiyTt3EdH8HpBI@Z!)i2RnU$RHx}VO|9A z5$~aoR9UK%>T$&->9DmbR9B^mIh;hrI-(^ldo()#Q4>AJ=w^d&VU;653i47o&DUAm z9E;dHnU@XjF;({1ObTq0gJKn`7)Iee{$TKLTe@u$NfJahW1_8~xKcz6RP|shgCw`I z&=*BN#KF15HqWZa+>iVsn#h|wqiv<^SQP+SK&HPiGx%q%983|UUVP+=ARB6!aA&r$?_0AAK_GIuEjw7kNiypnvgY3=% z>$}v3E+RYGB3U}}J-@_qs8gJdjhhbZ?nYZVgzn0`2jDUe&V|m!Sii-}sT7|HE*Gm* zCCNySx}&W@|M31?ZvikrnHnR+Nh45#R2N{AHkF%=esQx$=3-A~27nD#BZAN~ zn<=fNf%ZsUwTu{(C?n!3WV=}hYQw3tcp zMHiGB8qyW`;tpzQ)QC%lE~#pskPFDNkU|phljTq7_kiw#JVQaNlON7k7{@Bl)8K-{ zC3At+$+AUu(1)OK1}rLPY3-@eG-R>8t7yZ!9G`2 zIvKpRXOLACD$n%a{`>V`?EwIm4$4>wDVo`&%<$a^@`5XrC~$8xPbMc2Imc#L)L#;k zD|M5011;^lmbVM3SO5ML#8D-L7lSt&(L}t)MBJ%nMT9{^`!V%$-1BE`r)q}{vI1y zkzJWzN;68vZh8F#yUQ9cHTZO*P_b>CqIxs~q8iF`Ddm*tUa2wFG_)tX&fT?_BeLh( z7)`GqD4@ofM#gjQ%}0)2TZqT|=veI39qGlPZr7uer`~ zUrA(7sx~;p0K)H?i=Egfq9F37P-dpmBmD!EHefwTCX&s?+RRkGxiXd;EL({<;jYY! z&!jiKFh%K&)Z*6Jig0-|)>h2rH+diWRtZpkOKO{v>q6zu;Em3-$Uf!x_Z!;^aBX0i z7SrF&ATx{6fOMu+1he1(#*$G74ZS!O9tbxQhs=YaGPsA;^2HyBJ$*0$rR^8bMB5ZI zJ~!2c{@>rFyxUYmf?A?@Y#BfFs$lb(j_YqR9~*GU%lEl%FL^^ceD8+@ej(d5va9yZ z^rIH(^V=M6vf%Hwkj(KkcXLd|+K|nfa=j<1Zf{%ZhuD0774hX*_FEuJ z)*Eq~u~llhZQ*{Pe$r8DZd+6~r@^}=RZNWSv{R;nM27UPku9TpReQvL`%gGSw!4Iq z`IB<4g=5ide-dEy$+Rgn3IBCugXq69Mcp^Qav*g1EB-f=G@dV0B3PO;UBSZhszp&) z+|ZQ6>CY?ojSl&7tW8QNHj+7PIwa$RF;oIxFN! z#R|FCx2vQ8Uz1=~a8gf(SNBS1gIZB8ne8BT<$ZLaHXh(q%%^u=41JYlP3^@-wbaIB zL^Tnp;i}fxC+;*?nJ=HJJTR%ZTJy>DwKw}>J4rH}v~;zh%MKI8shcG&Oa2goV-_wB zM%+@a03(^ah-W$3rAm`&J8HeuUg&Ok`OQpz6US&y{%lcuLW!;D0&US&t*OEhCuF7? z+PZ43G$+Hd)=Lv$HPz@*54A|oGglQ=!cFbDhyxP29W~ZQiiJDvioW{}kv` zMCE5W53e$pNse~18YEF^Cq-c4ieWq!8uP4I%BSl2!EkXo=HK=$i37kAdAFeyknotI zL1dDs%|(XT{kd;Zc9<(WSIn4Lscq^-sFm;j`zAtgh}c}EXxZ)}P6taPBr}3EZMxWhb&(Vf9ob!R}GbsUozZ#g&vv~ zX);BsXQrD~R%y))3uUV|E`iM33M4SGqQA4vLiBrO)h!28 zCO{&s*!E>LSkND}S${M+?^JU9kRFek(S+DNF&aHzgF2T-nhM%Dt{E(YZDKtpp=9c5 zsUh-vz0TCHEonjBI+P0E6|RwxXUfKo=EIU<+98XevWr3>L$0D`5(5zOYLkiVq~d ze5#JcPx=dixaifOjL2HE;0o)Yei%{aHBW zO%DIg#SL2iNuX2`TH)CFUg=f7IMhoWXbyBICt%-qsd$>lBYwFT zzkVaVvSruA{-$ZE4@g>@S|O8eZm40k`B}AUHZ`1CKes&U-_H;Ug}j(8yXo+AgKV)$ zn+4@>`p6FBc_V#K_@Mn9v=%OSZ&gfiMDj_tTAv4OrJxHj~YKhcpG6@_Tc+Uqt}SlMXL z@y0?fHc#IKTu|L?HN!2b!F2ge=MVI>5}f1-C*+n5Z*~}Oh)dxu&+rXeWTQ6>bKR46 zbyF3%VIL+^^hNfV4{2QwD^gp0cx)LOnYmDa)%Go3$6Z2H{9u#R#6>{XrvBnT~X8%4AiQ;%bc@GN?F{Tid(Fpn(W$ND`6zzi!w!1*hy{p(#N2Cg2KD58kN+D!At zE)&8U1$ItoNDGEG$Aj8}n=?+y=isccX%V*_HfFJ(FrqyN0S@6`F^b{WZ$bJkTOBL6 z=K{+7%2$ck0a*$>l$7NoL8Ndu(gS?ns)|}juxd7GH4^!r(R0hb^;TTBt&;9KfjTT)qsgf}C{3^wg-rEFT7~c){4p z(EQl3pn%w%jziHUm0n{6t4Y5C&QKORL)79J^)Afr_+2{qCU5Jffbo@6`OK(B=uIxpVTU|O+0VVtE#LGDpgx{2}SW;jD!SP{sSLW!X78y*lm`x(@8J~n30nWF(DupCtvA$-6(F!7+)8V|!7OXHCp0xw&rgBKEt~{^-W?wvUv?)gUZBIIr zcd7F(1jOo*eqgI;dB~_oy|lXdkh%<1DW9njd-|3KfW3H9DdUt6k$HAVVnsys`t(wi zlDOBj!Y38S)14@Lk~q0Uydym)EC&fHZ$`;KTpBU+(I0UVC@QosT5KUJJVF2_F3*A9 zH1;fh^FZh9Z~Y&BK`(flCO6fNKMX_prd>7vk+&!IkQzP;~m7?jSfn% zIK(+fx>Y`_;>?wi>?{nRggh)@F!vQC?u43D55S(40>LIf{}4xseI!JX`e=ZMAaDiY z#SZ3S9za!rM+3#u#fiGKBuafoRpryTw5S)rgvruw&tTSq+&SE&aUc_UqoDT9R2{XAxAJ0)R) zl}Pw$(^u@#qonq&=vx|Y8|;N00WB4oz2W*P&b0T<;#wot7xC9HAM7;U0C8sqePTlO zh+e7`j>yd(08WdM4^57zE2d^kN9CyVkQb;&q-(hxC0pc25PNN8aWRnlQ%n1Z=@*&) zX!T_zJ0r3eS|iR^o#6*+C0dc)f>~#pRYv*en@jrdQ?4atLvw=7i@s^)%s_gSj5l`f zl7La$c3x(&JWcS%? z0yKPin3B1?to(UeZmF$%MDam<@n?wX5sB%dW>O0I@a+l`ZXvxta$+9qJxrh#?y_KP z&w^2jhR8y8nVrHsX(cvD2+d8cfkT0%0MD>y5-G$EFdOn_hd7#cDH(G@vknM0dzDU; zxr;+=10OYFtomN5IFMN^H8P>H5>9<~aD_&=3dlYYyD{v}isa-J72iNnEu>7V&iPF? zKA{~-VIP%Sw5Y{RLp5p+*bI_<)TeqAOB-u=N-p50(~`c9nXz4l{{O;eP!%vv_tRkcrY= z&$@$_%eKfH_Yb^n;!xhdvPHQ!-@b7)rCqfGl6P-Z;FpnmOTt>OMoVyj9T`6Cms*K9 z`=pg}Z|}cPG9+g2n;(+)yjS8GCVQW+kb;bx+Y!rT)m@N*pX+g9T1cb4M{EagJeKhe z`^ciBcC#&f;&$V$t~h&$&aPT_^WX>FehZTm?|c%AP|}N5F0YHor{2oghuxCSRs@j% zJ%}HeyU^kGW^-JC?0&A@Ozc5=Sx6Tika3pnobomAO1RwbttrD6?)^JrQ7OdlwBK(@ z9>;)_%4qJm&8YZ;k&ZG8sPFsKN^R+G+Kv~Bxg#t}Ati<{g3KAL2nfk^e{)l%bl2Um zoVYt_mp-T{OIKvhp_(p9M)ELUAcpyHqN)jLEhCCG*fUR|l+e_oJe=;P$&>W9GXX-gmQE*S|LY3E1bOt0(L}9>62P6yknU8 zmOCc?>BXR3;J2#IY~Ypixx#5B z5`P)_NQ|9(O*5?!pU0|xaLbrzt;@q7TY~sHx<(fZn7t0@Y zL*gRi#8?o6A-9xK%lF(FFEJ@sj4n7-r{pId}VNxaxD#%4T=d&0KPWW*CiYR8K$8e&&QOZ&dPUwOz_aLad~8Yi=;^T-b7wlV9G@*Ux_qg z-HS}vN3(1{_z$fdV(;NJ&ro|f9_;-fecbYLnflughN+^z4LnLme_M-h(#^MwgvHHv z{jGUHuanPis(sWts6JhPh3X5)pT{laEIO!CYsBwgi)Ep|ch;p6=1zY%oRH0^l7wRA zg(j$fd>tb5B9sasM$Zz{5NR3{qI>q@6urVK>Jml zRl@4bQG6s3k(IX9+mrE|Y6n_o#sj5a;lHd7LfL|cS)j$3O-#0FLKHEVnV8Yr8en*M zDUInp*S1E?;4Omgo$7NaWNmx{9j>!Mncg7Z4a^OIQnersG|2dD?EzqYDG`Z1DXS}F z=aB#3a{Mde9c1u4qyPyApd#Ph7M%46qC`t(NpX<#IP1gLS^v`3GIR+Qkx+dC@mc#<@1U$)C6|3)rMJqY^;Ypik;{Thrpz zBzuBV$kdo{JjIiEe=Fe!GZ|~7u7rbm0c%MmGBfAw-!3jGz_|iW`HMM59wv4{9*catKsx-^xn8s1NF7W)or3N=Tw|{}sdE-`g3b?pB1W*ol^9&z&%szN zht$sWT~DS?~tH`&gXZPLIO^$xf2b*c;x(qr89A?YGExTdN>- z%Qf99vYW~eAd-QRA|GF!LS5j~DwE8~0pLh-e9M5vi6+Zy=(hdmAO39n-+zKs5s&SK zha`^{cqI(kSkWcr2lrw5GMDL|Y?TS+|%7qwph~kkYoGtjZsb z-$iO9mN%_B1@dQE)Xr6DgX92y+GH9VQmZS2WmB#6Ch5K6d}*>GUQQhl$q`Um_UYDR zHM{c_>7UgB6pRqTFqwrQD{0z+v$hptXy{~aGC&k(CO`5LW%?Ztx_Bcxj?H4&NM}5G z(JNw)O&R(?MBTt^c31MfJu2Xwn4IiQa;Bh&!2$j9Ql6?yv0TE0Dlwt-gSCNO(|_hQ zAxVMWhUU&4vu$j)@{aOJV$Ggdd^NqQO+pm4=_a;&vNNanan*O`u4)k!$~-opktQ0N z&o{nP*?^B)io*NarlZtl+w?F8wAf-3zk{iMB6f}HIz*3^^NHA#Pt(Q~tPc6LrIWj( z6HwxV>ZU`)w^g1G+h6IP)3(yCCjz}3{}fuVHBAWid+!zRk`z5IJG-_MP&2ygc&ZxIrj#N?T!LPVY)fZE--I%4hL#B`#*yC5vlI1S7{;1b z*vg+^AlPV6W>ZlPs}zPpq1? z?AYr+30_imI(E}hh7y3XipLMW+Kl# z%ms)vf3b|MykR6-%t%Lt=*gkXbLBRHIFD=pm5ZlA-PdOvSn+<%d1J^{r%i1(%7(J{ z)V3VHPLs(euamk(FVG*#kH+>WTW$0!-}$Sq9bY2io}+W>4<9OrfH64vS5x`Uj`V(Z zZgmbq%mY_ON$fzdClQMds#Z6r8BvkO}uhj{ZBB2~uY@ik1iZ8*ivM z50!;jNs!Fws-?U$t4Bd2)WYz6<-tCK7cCV|qgOgh(te0<*URXw!mW;YXzh1N+?EQ> zJ7l4*UG0|vqC+<4Dtt2Fl6f9-=$X+xx$xwp5PP4Utemw2>PI|6Mga=5l=8!6BYNag z-Pybxu<42`Ug~90R^1KL+~{Ch&j2E}jh1JSC|~x=%O$%k|9$%=UTDeKzp={gKIp?M+ux}RlDmENg2Y6wb zI@E;KU*abm2I=g~rLWAcXMkFAcqUS*E_Nk3g&sw6D*MrFu<+jqXS`HFx@ROd)-bxw zbeq>Bj3{vz*Ck|-crA^KgrHE_U1}LL2$9AlTwdL7wo9xhMrM?ZOGsvi;mD#iQU~eK z@Av>Ru%gm{EyDlBe`vjQ@R1b?ZU2>l=@5lGQ2TG(RPNPp(MbI#Nxc$|_gZOA zd?PZ-R_Q5e`YSK1NX@6#@j98yvF=-xFr2s@2#j==5>B+w@XMvn)VJx_Xdm$D=sRH5 zM@inQyuuVnLIMPGFP~ry+|s-wJ%r^}$7fZfI$ze4emxBi@Eui9F^x zbNm7*9>hTv-ZEnS5v^Utg6;bQ;8&|*x$ICgmF4kRy|y`Ly$Bo!^-d@26MC-f1?b?F zJ7QvtoG;yNdO;CLoOe5U52NyWMX%x{4JtWQ)e zOgn<_#LmlHfGmCc@7I4!!|ri?r&=jTy+S5V~0=nMOw5A(C5({x_aNN=E+U)a;XA>2(t3$ld35Yk+lf#y_6H*M)6B zR2CRY6vTQN0k8rNSyl~7lC~y^k0G90xaD=x&p?`zb90B3D;DU89Qc&TiJg&4&d)ic zaM)T|%omi2`J4|=M2DFAI~}+a``m^4fu_zq3O%lr&#PZ1oyo$~QmDGFqm#y67r<}!M6;FUQK64l zX&|x*lb8S^8dgR4oyfZ-i)Yn+;xBR1MUu)%m-Xu|#(O=(D)%~`r6qB)k!fw~{k}+k zd~!Ee(R)u;-u9B`x|t0R?!B*~ZM-#vOb<}0o~;MOr_m<`vcLptO6KOZ%buyq{Xj1| z3{n+}U-s_vzo$lR8@pWw#&+-M9Xx3`v3ls`7IZ3#pwE-z)#g5`(#a=-Ig=)8yj}f4 zO~8jZNKY;*PY_gmbio@2K{j91OySKlp`4*?NR?uubV5mxWa<{kXl{; z7SD?pKB+onynj5jYr!@`wh$T6Sru|bV6w^zfp>z}srrjyi|eX%i16f6`tBb@>N8BVlZX%1cyefUce~vE?BBL8OiN&C8bO>%+^nL9&<6;)giq zjLk*qN$OK{v7*fo`4C;?Dg?E`h>5qoOvZ*(<=7li)>T>N0;eq3AXsFF z>1uc327iMz&NHvc?k__kvZ3eSkX6S05_gTM29mW%!5qC=_U|oA2LQ{bVAl$02Bt(1P0FK0q`*p#$WnnsSu%ji+$ySyuMc+EPb~ z^snN3tO&Ev+s2~zGzv)vC%*4VE`PkybTl^a$X>-0KD(|K?l#e3ngz+onE#VlYskJo zL_><+P0w6+{LCqCCUnG=pjyS$#CZeW7_T<0aZ#!!xCz%X^aw>c-(xj>!B~vtD{4@0 z<(UhDIEaV###Ota*EbhS6BQYDuC3r$5oh+LvY9F6P!8G})FbjdEDVfuGD|NrpzkX| zsRQ!0NXk6ubUWn-f0>Y~?-;A@l0hfw^&N6H;jWP<-Cd5oLLy~cej06I1){*3ICF{k zCNYlnU^;Qa4CV>yQUC%H9fhfDXz;`$IacTmnNo-E@J^02fsuqqlcV%f$Pc{ehup%XWcqq5li$18H#=R3I^l2PT* zV|Gi2!Ud#s2E$&e7@eHuC9-WnU2vZ;%H)CkMA^Fil40$Oaq7mMKUfXUXwHj;if9_i znwcm1fK(Fe`CsGMIxj}|B$~2eH<2*Pe`xu@r>N{g0*qttzm}EfGREdGmRf$45iN;crHSK*gODN6f_Jf(51gaeF?>qJ8b`NnpcbA2O_WJc$A8W?U_j<_Kx zya`09o!#U1FP9HqZ9z#%KrhtkE8v2?gC{{+*dU;Yz@&F#DRD0{dx=;b_xKL{#y=yG z-HpWVsWKJdy+f@t-o3$9)&udYsRWD%@0P}#^k0zQP8gh;U#b}oB{ZIk$W-F-&?Fz( zdOo)J?dwsoL(=k^NJUU(i3jgTYmZV zq?RLySRgUmInYB)z?lhBZvW{`jcF|-Q{b;C1TuXWQ{zmRbE-OOStLGZJOTk!P2|LP zJ>p<@!e~AdM$5{;+R*m1C<0c7*nmt1cI#E@rr_Zv;hqshy*9bxO*!N_ebxXh zy48mhfF5A4Fqw+MH)ceJvj~(!Ik}1&VSwr+G)7}(+-s&)Fm24Deca*LD<=$h(_(;E z#Xw`sN@_z8zK-)aDwhS(3YZlVQuL*?QF*B#aNJ-JOkFMzlnGkAcqcQ?+LS2mA5`|X zvr0qQyw0T;i%DE*KQ)ueVezVDT-lMO7J1Q2nri^v%6@eF9Mr+4kH$CzjYEOG4!wtN z^IuZ*8xk3gpNuB7n%^`4M+V95Y2nw`Goz+x8ugOvDnjuSzRj7;hovmNMYPp3K%^OUl6=`Hn7i6U zcWEg1_N)%IqBcuJ=!v)xZe~%oOjk+Mm-(|IG3#a}1Df{Q^rh7W1IMTIei2<@u8{$Y z8ZYIz&QnX%dZ;p>c{U4=ZJkN%a^;g~(X=f+e$ZiIteK^ca5fuF9;tV>{DD0O7!+H2 zwj||hDYUaSTjbL}TeqL_#f8n;AeB$p9kWw^67x6AE`xFNY~R`8>UJ^Aw>rD2n?$`% zB3mo2-HDiH7WzKBY>HG8U1mooP3fbYk+@;Ri)|Vq?B%&MyPPsn`c~$Am999^hbgUY z7voS#YM5(D4Mc2S=F<~%s^xPM-H6v~!Y+x?gqhRsNLpua!Q#hf#JsX5CoZ>G1r_m2 zH1_WsV!G%c#X6GneX(=>;|kA5^N{I7GxUb}LXX4L?3z+2JoJ=1qqan4(1 zl@@ovM0IIsaC2z3jj3&r;<8u@$kEVBbGr6vKGzsQjnoXk&jc3n&->U?M$t=8h7U+^ zOUoTl=hs0FtipYfd2gkzY*kD_ZOplDRa(1g0JO9(-|oJSNz5*pACARzSkebW>Cm&S zk+H=eME1e0@#&>bX4{1q&_VLK}zRVv_k95eD?Xs;T4N2 zC)CqClpEZ3ix?*)9-1v#t8-Fh`8FsjARkyN)h<9^5!cVxPEN5?0@}|a)l2nqWHMq8 zdS_pW6lc?&P-l#lHiIDfD}t&#(rpjy0$P(2;+I%HV{}i9*ktI2QnG_?G_xi^q{%us zfIqRJ&A?)38akJ%fIC!^S92$gjr0h z?K6Iih${s>K5NpHZ=2jvT_G9}q@of5=mWeQNzy$MX)12pPb~Hg`YJLrXr3`ntX}W6 z*XkCY`E8L<#@Crfaf($lsYKL6wuD7@q5>qwph>cTZ;_99Lo!Q#Pp;ZK`C5C@fj2#> zkb?Z3%>Af6(P%lmFB+A0$+MY+J-#?i#*qy5-aEBLxZB$Kh?_`qn+Sik~c2^gIS>!bqwfd7z z!=3#MS+}iq53-Urc}!)Mj;-mBdZFbHWL^FXQubQTaJMn3+Dn0zmR26U&qL$ADvW$E zfa`P1da}8OeYF2k`SkR6g&HA+1<$>~<$s{3tA~r(?xRYvQ z1NQ9#1Z8s!)^#JyW_a}Qud#6>6Oi}*W&C_!U?;WoB(5Wi46&2xt1m!m3nD!$9P^7g zSPbsXN;zcOTyH~*AU5LUtCJjxbtuUN;z1Kcm2P4+xt2kB+!~Ey8j(~Arl^`>HkBba zLpm-r3+5U%W3r@0^Y3`q=gX~cZffc*F#W|Z5NFCVqsAcxiFQz_sFET@ag~!EwV)H1%KQlYwaC2wg^rGbY&G(>{*%i9cqW2 zCWb5%vYTqb61Fixen$Xc6j?<7$Jn)K$%*UQFCuI5n3>Gy7%-Wm zR5^E@mC1>=p^P80Bx$G+t^1Q;vUVZz_Cxf!rq#sIf<)9GtJw?aE_QUX+K&PfcK=^3YJHGe^tR2(qLiId#Sab6iZUb$ z`Ea~wLPA#-Q*@EVSTx0PSH5K0*Q_Wkgt)xWBGnLx*dD7)0~dWT7y6o!L`h`4<@pd5 zTz=M>5zgyxhuUVV!mB5FaS&P^xdiV|lB4;UB{UlmIQOKo)0L>Q zUL|$Tmf)|xJ zMiq%x=|(~h0a#$ANN5q>U zecI-KzVtPKZLIYG0pH^pYRsgwMU;j0%_4+znl3FB37XQ%oJtZzHb=-1d%%lIRD$&j zExTTbG)V0OyN)q8SF&noA5t={ot3Q2E1>?Gfs5jWO-(l`UWm5`d0D++7C^i;iDcY8zHbSHgl3Y3gYdgnt6aR+)q?gvdP2;HpJ z?Sm>%GBAojTw2_L_@3Re)3OA6lDx*6;4fLbB0dE>k>-Z9IPNwRjymlJsrg;zTaN?? zqh45T@UmFAYsu!8EqE2AE)C6o6 zN_j2VBvX8kgCHkomBxE#f9+uM+!-g?_j2V@#X0*Fd~@bQHr*Qw^Mvce(ngJ!{t1wI z&3xKibegddMlciX*q{#E_WmV{5XzfoJ2cFVpr10K!@-eN!a zy9s2m2iB9oX*vJ-1viT{eT`|yxN{guCQFD8>#oRwLnK@@Fo89PW#OiH(8SeCsr=M( zYbcBpA`!@wD&DZ8Odou%>YI$l@1%L}f>Z8^6t)IRIY(}049>$D@XYw^Ymk_j;|7yb zr?T7qvj<$lzS*SKlJ(_`QrYVhVc&UkG<+?ar<+4gQtNun98X}UcpM&4Bw_PMvNox? zO8mo+2-2HT*ay^JY2EO(lu0<}PdYm3K+-CjnKThTWxQqF_-qDwhyB?#3bXysr zPco@LYsX1Cj8-`?;=I=v-=Hg#Nr=-w);IT3M( zMo1#3-#f=6zfL&rrI=xzJ>-OtGfm4Hw>*ss^-3q14>b?@XFwDA_Jc2{Qg(K!Y01H< zU~{%Oerdm(C#9=5Ipyz4?^@yJ&`x?9^{O@8^Jn;p%B*4H`IqI4XoxOm6XBddCwYEcTy&cq=Oso;8cbVy@&J!~=Cm z8Qh64wNr`f3fh*mZ{X={sg+Bg(Y3976)x8{COa=YWx!&QM|YP`Zw62h83PwfI#=I% z@D26+JR8)?=t=8JGRJU=hp|2M2Ww7cBl0{Q#zl{N2(~RQw2qm3Qc>m;Qr~ExwT2a-P zp}x@Ks7((7>eItDCW$TYx~KQ1LS^6RP`NS0^E#^@IE41oOigr{Dbn2HY-@AS09=i0 zDMm>N>kSEkTqq?vF6E*V)(s?PGbqMlQn&N&0Sa4aOI)lRuM<}vBK>1={flQ%I&KT^ zu6yvYCNLS4rxx!dJ&M%{0~G-m21R>{hfv2~#=|U68gf2(+}v>tQMDv3h`5nr>`QXs z67dKv%NuOOvyD-#1QNtaq*vyErdmm2upq@=cO|H;?c)oID0;VvpSZl#>bB6LQe%aF zMM%@qiIW(!a&e7Po}8 zmmxz-pd~LREu1B1Rq~rzgm4jV%wVyE=4N@y%4I{?61?SWd1*7nq{92VA*=S$Bc+65 z@mn^nw&Oz5U5HTIiay7->oz$d>TamHARQEb(-{{k^iZ3|3h}zVuIB*&6D2@eL+HIc zZUJq#P5a3dgfH4jZ2$#6L=TO@)IYB5v6SJQhWO!x9xQ(=nsgV!s^I6ui1GQ>3M-O6TdBaL9)@T5K`zTCLUWc>nQ}ClXwc za!rovUJ7y7a@Wy;cd&*J8FWiDS=Vs=`t9e}zZ#x3Z~azk`hBLD4)1s%VF7wMox34`JtCJL5};y03{ODVu># z&Py+=w)cuiS>h8D9OivrwANbBTDuZsz~<|u+P+cp-<%k&>{4F_DI!Ht__IkV{k+t@ zMLei@pF?m`Ee)*Q%tHFs&ePG-EJw2ikz8vE=*{yR%vgNT_T*pRy0T0$L$IQU`>3bON+=24uVMtO}FB?j#Zh;*_*r1P=p* z8OxGB+7)AFYHG9YB!r6c1%%KEU&@0?_SZuwlV5|9#7^oWYac_u@!^lVI2_>XMLPhw z(Vf@8VDGfu7ez{2ZAmi$pD@$k*v{i+XI5dbSf51|_*<6)RiH@~JF{av7)Xarbj7ue zg$AxRFryz98sh%zZ3vo;037GG@|weRdd~>J*|?Zded-DkkOO#>Y++WpR4V9X=;%*n+Bfm& zV%DuB{&%7`3%@-rR5~uLA^BHvkSchRiFH2cAF|BqalIKL$3JCfWE)|5rx; z-9$Sfo#UV0Q2fo2dr@F-Hsb!i9^qu&VA8{kq~6+@SU}Ci22(zUF_Xb|(gz+)e$j4e zN~Ox`yhd=suq)~&AvYt|$auLLS2R2LU8&$jfKOliUX#`l4uL}Uz=6S+E76kD1*_l8 z79ePJVkNW+wUYN2_5wiJj1rh*m21Ce3&fdhP|;pAc$v=X10QiQ(UL0uDpTp7Th{&u zzuTsp_L>xiQ<4&g`RGxAl_?3xG(Y|PPx%=DjY-WBb~=Gbu69{@W138&7HIGShnpR{ zIX{7qx(jS#$`8A)r3c>_n=ja`lw~=Qrx&31#ng|0pE;&mqh-eg7W_;XV}L~w54 z`3bQ6he7KFWO9^Km&24u8OlN-p&oS4QDx_|6UvXH&U`PSAxyji&_N)KEU{!knk%7` zN@x86ebR_$f{!zQPc3PnCT3#pcI#U>ny(^DJjk{UBJ2tD+V=pI;+ZAdy}QkZU5xK+ znOSOuOA41vX6^w-lr@K1)n7dgCMu^C|E8HEBrEJC;8scacsA&a>s7{G(1t`Cccz}< z9|0FNRWtGiZlMTD*MIak%8vl8tZ3~Hd6I98^=ZUsQ>(V+)QxjflC()_sII?O2tR$(vMZN0+BXA7WNi|VO$z>6 zop#0|8x+!l@L_^MU0iq*_1A7kdR0*qqVUGN8k91BjG+`{p_9*eez`=n1*PJ0B1HuZz4C}F zGNOHYV~D3neO4-{eTZjQ06BgY_wZv>5BO(mL|eTS$DWO%Eg=!>sOL|R?Jkb>q8W?| za0KZ;!ZT#UbY?#M10tv3$-|qj{F7~YqP*Mox}{_%+!?E1yIF!b1jW_v6Hwbdk%-?P z0a=T!eCEpW&*zg^H4-l~*?{DTH8jtwuxI>PeQ=dFJDjX8`LW(bsDSo+>Fo@1qiTN4 z(V9&tk{MUN#Y`d@AIIbiN7O`4fjC;?*)aj*4$x}r}>oYjLSa+5zAux-~9C|;%#^$|KBcCo)6^zD;H z(RhCNG@+AABXr2oUtf?kNU*q(Oj_|(mH5$=jovHrQ12XC$yH5^a3v37JtuNUyAHW@ z4*r6`z4Ol+OZCK*8cU?V@VN}6z6h-;Y(+?8Z-_it1M$y$X5ORl8@=u+>myfFXG0=A zjP_!s4TdDMT?LjcFdSy)xuUkeS?Kp>zLis{3L!#ntXd!4=!kXPubGI?vhOTbcq5I( zO8>Ce}MUe?qUNVRyD zU1uDVP~JN+kU1)woxC-`j6yI3XbSqbgy zX>p1jrIqf4w_@!vQoLxYgJxSGV?5Q(+9a?AZ}Z zpsXHS%9`G^#X%l>h%p?L4#nVL%vi;WI2m!`T~O<6Y%vL8Z%gM*^B`zViMS{EzzO%$ zv%&9ZAhx{VHq!>-htd?s_s+1zv3jZlXN->739}J{FM`{6-MtwDoQRxHlV|mrS2BARa}2* z`Wk^*sez2#IiwxS*5^bj0>%>xEpB^Z7rK&!uylaG*FrK$`(fg6NL-8wFh!qcgMkKu zJrQ*?3!J&bxIfhF2&GA!P$5Qp_%|XSvu(-v8{?Haq*WT+iJziq_1oSVz0u^NRX=$9 z!%v49Awx`WEx_v5HzU6!6?>hU%A}yLN{InPAiCQ3o6U;-gqE9J+54VOdmC4!e&Kwo z7*{mNRZtZ$fOJ(!%q1mMwf37*A&fOrD5B)oNvqsD=v^>dvJFETLwJ2*jY^^s@xSc* zh`xjc1zN1~h^(6t&5lU^$1^30Vik{FxlmIwrp69@MRcK);qkGjA7R`cDMAjnnDH=i zrQ-jc zdE86<&Px1Vbbb;chH?7uKS44=S|OTSQ}F_p=QM$02qG%1MV1rg;Xs&C0ad0v!mA}3X4_Q1J^m4-> z=~}hWLbg0cGNL^CUC>6-Y(;%zlo6Vg>o=mm*>#p#4FQa1T!YfZ*~`L0Ag4rIdQyJb zi_&JLO4C_RK>>m+lL)%I+{fyrj}lADv@YEQUkr8ZSL#r-UVgG>ODTnvS`-6UmWgWU z2i@C;QC7p3E5mP1C9!K^X9^LMx)63bQ?yL$lNhx;OJ2@b;3Eh+=cO;jaWIyeqxKM~Qn2->Ws9QLP7}51GlMFRYyznwE zvxmLgL<*|to5XCS(eH2Km5VF&XxXK2T;LYuL^hJRny;*v8Y5rnP#AaQ6kr+xAtjud z*(ynxqaieFfBiq+$rFw-hCholAS?9>gGdmxabK8lCW1p_m;KqSEZ^REJ=&4^5Cpx?g_OoNGv7e|BxEuTqR zZgjf)f!z#%u99U^)tJBW+!HZ>m!!YH3zC!-vy>I-gyWx_-Dr3c&y&a-Dt3jK7gm8K z?)@Q^j6LpkycnqpE4%w8QnnKk=08xp+wb-@Izp>gmG49S|LZ&kdazbD&?h^ zFA6MVr6h~?^XM2{DM}4B@wP$e03`mH{o%xgT5+p6#E@K{RePPKjwKjMT^OB+jU_5l ze<54L(waI*pJB@%o~uOV3k##+gZe?&eg|~zH$u_Mh8Mt#H?1#Um0rFpy?j~v!`ohb z`uYlZ`TH+_{^hT~{BeyQZf>0vPvnAM4B%mgK*J+Oc>n+SguhC(rW71Fi7+Nc8u00!} zN}x&VZ(p(P_!~9#XckvgXL`~0C@fI^1dS^4`A%ke)zikUUCHxoUbP?@A2)Ew?bR8Q zBp$n0d$E+D0srbXiz{Unv|i#SWib$?Bz7e%p=W77j_TvL(DCb_)I(;gDHhd-;!*4M zssG}u4bcbT8k_pKaC>Zm86I&a+&Ljxdvi&3VovsLkG%DY_!jYUM6P)rbXioc)|y>J z`=5wIwF8M{ehq(RY%Z~1i*|GOk<)pre?Iqg3e`fN%{;0;4RDXGMXmvNNF#Pg^;HB*(qy}G;hZ9nvyYa>8np(tZ>-YAGzp3(TtlC7vTR!3{|$r%x*Xom?&gS`&LSdH&`C zzQ*{q^F^#m6Q!`rT2v{#lb)oN#w5WA4z!3jVs?aLo_Xf5u!&@^jF2`qbDtYE33*}E z7Uh<9P>^OIc413SY>B!+Ohd~-a)PaG?JKN((mVQs*hl;-0=WwcS?Lzs*^onc<+W~r z4g&X?T)&qgDArJ z#LvuYwXf|H3(hA!s^n~;gu4-N3IrRYMk}p}M7>Iw)zteKvUK?XKur-B<&-!Tz|oH9 zl^Y+$=Bi`OA6Zs&li&8?c2=LPsC~u4j#7G;1%gxl@k5aQ{#%et>ol81HZa>JZ$vG@ z0tE|mQLjJfiqYsp%VsM*!`lz0Y2v9X&n`eH$;&lM$!0xc=$|$Alvkofv*6^3YQ1zc z(MmvqKC2cNQc1m2>DiJz6G)Zc*(Gku)O=&}m2GQQq(f1E-FA!GTO33lY0$-T1;oyH zl7XC(C7S4){&L-q{x=}#5fNO-87_N6P%g!|1`asnZcw|G2a_gRCGW@qSBt6{x8SDV z;S%zttL`c-_H6!Er*htHVV+U{bOVI=`>HeDa;*(9ib9(k~R!qb^|$ znHSDfN>Y7-zy}z^$tEW@mjj9jiGc{msZ6OWJDT1omB5-4;VTR@<)Su~Qf*f3vy!gr5E4eAZ}LY8 zunr;ntnM-BkXOT-9^rf9NI#n78~5(Aq}Tjw?~y%ZL6CE2f_Mxt9rV_Zu2UyzN6O25 zO~h-2cNFE`{`&jH3&UT1`wIH!?|)vs&y0)wI*_4qxtC8NOMiHYZs{cyM=eL&6Z};| zr)@NUcmaW(vHAgUw#ZhMyiYXK4(wlcy~WcnJBR{FjzrnlKi;&oUaos;q7`0#6H0`?>~OKhwcd8)|7vmbuUpU_fw52hvhMY2==NC=HZN!;R`rLEdb~p5 zy-EU9c#UUVd>{$bK(jORCQ}y4U!K6}rCe1Cj;Z{_uHy@m3TT{1ZFktH++6 zvMToaa|eU0?)vl%CG(DbIfny|)tBEf(D|6s+bei9Z(82=3;gwR#UY1+e#Lb@x!dJ+ zkEdN_c_eVW+$D&Yefbe@dvrbNluN(8YBGmmSYA(!hidgF_+ejzfsTxqn_)3sH#vmd zdH07l(`#&{jybE=Uw$?zB~MSf|dyPK=E(d-8x(UKYUjF*#-e;>V&iID|FD@^6cMN@Wv>P6OSer2vtL=*^isA8i z`7xy7b<=CKGwo{(ab~a2yQ0R2huMsO`Q7PCf8}4VpyXaIkR-FAT)@Nj{&Y##o+F*{ z@%lK;&>w?6FQ9;yQ|)1#iMJxEd8;4&NW08`%Qj{xsR7v(KygBd z8^2He0Pf;V-6TqeW@}jmCr}b6&7#@@3OwS1F3t$}Wm@714*S~I7m+8Oj_UV3y+|+p zs!6@V&Q|WMz@vm|HfIC<<;~4_t0JfCf%cT^uG(ZOoh`c$Iv*9-m)Jb!k=+*N=^I-x z(|1lVYYRVpv4{cSLt?KWONWvdSwRpg$?rEo->i}A5#cD^v@5=5C#2LU%airAzFW77 z0M!CXZ%^1!z6--LsK|7j_=q7mW1YnpSP}7)C)zK@Gm7!u9%CtJS})fL2Qcxtj+f2J z6K+r&CT$(uN)P!TdX`KbE!KvIofrmHS-h(c5j{l zb4E1c9usG#GxGwF1mCyZpqD)@v8|`WPylJ)N{&!QhyO3`RWmAScLIg3Ccb4g9esAG zM5~gk@Pyo~=0@_pECG;Lgrrs1^Er$q<3TkK;i^ATIq0L{SI>^`lg2!l3hg~a&yU_R zO}_N2?l9=j+H##Z4&(SGrus+WNM7@~a_Ly_7izap5a%9MLrJ5C58JMn@k|F;EX^l` zeWMZ_m{TMC9C9iZA%t&f&i{N9q< z9b0faaeq!p=D{5}_NKL{rI>RaFSNI3Nx}MuT9Tv6*YS(bJ2{+XnbH zG2`!Uxu5oK;kP)PMXd(S8DJkmxsa|uakQg3f@Ue$k%SleZGeWXIADKj@EYggx*!rW z5yAlIhoG%Bliw#p9Ek6?C$*kXTrc2~u=3B`--y5R$LH%RlQXd$9$$PqmOJ~Mb>(MH zA+g6+`Edy0UWj;L!(CP#r@TZ6yFa1M1z#)@}oNh zUU8ZeUO{^aF5L_*K4>fua|(gW|Ob>LP`g*IAb{DcJJi07x9~ai@(X&EY`^NL|@`a+;n2- zu8LP1o3BPxohD+qfBPYSZ!>dINO)_Qk^IIhz87G#B$kRQTm{P90UcCJ`{eXIGu`e* zHp;WfO3Kd|^0D-Q;+r za^)#`%?GfucPBd1Vv|Hk06-+`9T|MIlHY;s>$ktYev`}#4jH0P**gDaVoRd%t7fCa zi+}BzNUrpie=<^iHwqU&N~VJPcT*t2q&S0WM@2Sb`8RupDX4zSjTE~|m)zfx#hHt6 zx4-I?vA3_j^?&`#8_jSNxao@77QG|-~eu5y97Z4>!i3Z0ACAm*?R z-oMM{*@&*MIkZL&$NDfMoxidy4xq=Q7A|iF*0M(Dmjo_y!m^d(BT+M7%e!0_dk#f! zjqnsanzcsy`Lo}!5xo&J5Ln?nd6Zx_|NNhqh_d64q3#ly8 zdJ3#RRy7)lev;OeV+q@D@Wx!F(G4*gm@j1OT*6J*7YWbbc1bfhjs*3o)6s_Rro|`; z8qn$^gL!R|2h<}*`}D$`8HAY|_nM~=d2n9+Dkw8ewuaTYK9QTtAEn72<|Uk7?X5p+75_a@Zy97HIke#OTeZ)pI#X2 zCXj~4f1gTezlnkO+OzS73al{nwb87~?~l=jm)=J>X+B{V{|_g9TO@$1BGCh_ZQ(2Cp;usJzRNL9QkTqLG5H-%@^%ir?G#xRLI z<3!BLp%AYiRem7EqhznW{M{H7R@=*rloyi5kh6hyB;T1Q;)U~i3UL}n{Mac2eu7)6 zH5!DW<)cAKu#_|=d^JFp0Qzg+7U#7)%HIu}!3m4rZ}gWCWe{t>^V7dvl<}4$3ErJ{ z&3?nS7RiuruI~>?bG3a9_tacNf?>XqHH2@@|FtsnKG8(=U!ryJ{;gGnTjLtf74YKN z-ir0$yexf8#F9d%`BZ0l0wwHTK3^mpP9@cL z3-2y-!K|U}!$t2GQQtVq#mVGuUtB$sH^<5*+#2r|aWtRAT8ceQDLDwQ`&;lzLS#@w z5>rg%9WfA^f648P>UasPll2LKxV5e6iNf^XJ`227UiH-C_J=~gC;U{8*th}`4MO-?t5xLw+Skn(G@6ZXrw!?srFQ^aOLKj{bw{mXOly`-p zK>8B5Mz`oT9^i3{q~yRVDK#-v$z9w7v9L6Gwb)-{wG11N<`kFMgr`pCm%0@O!JPAN z@atbORL{QK5rSki6b2DP6KNIh! zJ+1?%mX_|O%XRb*C*g#eq?g<BM_UQ*FQf_4Rwrpf2DeBSy`1?kF%f1o4%nAY`Rd7g|Jm zNHJUvMitbp&GhG$UU0{w`Vu}<9oaXt7!(uX1 ze*slhcJ)=iNcBcEp_b6{PWuqT!rCuRm}M?-2q^T?72^ZxF+pyrvmJczP~mr0<{K$B zg&g*Y%(mbYV7%l>t_=`(q{P{-c#g_QbsuQWCkV3qO%w8^(i%;qwumFQfP-1*;KRF7 z(e%e>Q-nYMDk|4sXwl>J)J!+!8h= zXTsefMPYp{QD|o>D{dqph`0m4@+B(L5LguNsJ*i8ZZS={mt_)&TionKUzWvq*~4`U zDvfvTS?Y_AAVStVXGoA*4Ih|%=|lClb6Ju7T!srOYq-nq3M)k+vBf=y+9GsERto*_ zE8bD{x>{hy;HUl)Xb)#(C3tAurMWK}AHl85i=_eR?2=X)`V-8*_Y=ZC8wlv)Hust4 zg6)^pzCYN?3H_eV8cy|81k#GQ36O{|K-Z?Edni@0S;O^!TOjWhkw4fqe*)Yw_Tr0Ux!7fE5e|7IZ7gC2Vt!7J@vTu{()i;U z=D|)XfQ@ak(o3B!13)ze=vHzf3+!52S|+k`87I^S^@${NV_!f*NT}Uk0DO%i?Y&tK z6O~n6V@&KTzK&AGFT=ClI%N>PB=OT%m73bPeZJ##P-==O?8FRRx7n;q@{;MkA*XC% z+)S+7d~o?pm^=tNJuu4FxC-E71bS-PQ3u#@Nkn7>V&CG!vy2t*2yrt}K>>8^%ihGS z3_^c01AWgeS5LhjB~C(?S%K(=Kg z(!#plI<5)>AqgWXN$_fNbs$`eXI85!ezl(To z^4Z3%4a_%2eblZ08)Lc4PcWoSOh4!dPsQcE;-!2wShJ$AoY1oxFW;g75v)t+`|6&# z!uj(Lr@lB}`FLybk9g|F#7s#+VNzmKo3ouwQZ9@^)Q-BNrqsd&okX(xEbq@QdQBr1 z%7-;KBJ$`?=V?!$TT2+(7SZgdYz#rO?$a4^`rDVv2$W?JB-;I1s+k`O*_~x88#Ns? z;N}WtV%sR!H>vmhmKgIPN>kEr8ZU4DILaQ4rZFVpQN zG4|g1$i!22Yd+U)W!t!LKjBIb@=z>|e9og8k40(y47A~TUxDPrL`+EEg}5p2f-ok6 z!2#fAb|s|+KHN3Ac;sci75{b9#2lK0t}n zAAkL*uLkc;p)>KX(3&? z4(kz$_B@T?l=<7!xaO#5(`-@}DltK)VW3ts4!at=h;Y!O6n+=PBJg_gjdi^6LBiq~ zVP4xAnG;fL+C%(Eq8&-90jZldDd0M|AOZ+>dHqHQu}n_4x31>2{B(qtWxr<74R*3j3Ue zCpLI|tB3qiYWR$$@I>_yk2VBoV#+D~X!nEdi$@28auu!qfDf&R)_)+wEbkNY6Vtw` z)QLwarcsafqv=Ug69E|yD|CT}#T-cDyW6a6yRx6Q4IR%yZuubBWBjnc*vO$&q?E)S zq&e|7l3?NmjSi|HEK!f(_6*+~T9eC{_lWN1a{uu_(zqA0^>g z*^^?7N-7B1rO=1<3LdLmW*#KziHMO$(9+>QVC|Oc8{E{3JMBj_hv-{`!L-&m9*VZ~ zfQoN~@BgDoZs{hm%Kk+4NN}1YmZdX8^U!K{Joe&GHcO9|$9{85L#Ln-Jn->u4$Tqa z0rQ2EzOs)ys>3q|b9^iHTv^NG^3%U2WwOBGpi(P}3A zIIh$l_2a+E)nPOsS*-c|@1K=?Fnn$P`;V!p!`CishSM%L=t?{qzFucK=U~Hk|Mkw6 z?C?E)>EAy8`@QBG!;h~~gk%gqI*a3_vRDp3zPR-HpL^Re{xSTxv-52DTeSI`w$`xM z_VeLyT-dROsKH#XTOu)0W-$N$tlwnJ_wW2g=AVBA>EC|^iI;;V5-$f!q~cWdR%gQ? z@_O)oq&n-%VA?hYl+!`Ajt5+oE5=EFr3G3J;k^5HIOhfobKeYros}WjQ}xSljNf6P&6;) zs0DgZVNFI^$sK7R+pbVoldVF2KW(L-bAu6mLJ8s_H}BT@ zCguHR85@RSwm6hd^*13^#`NQ)(9?M&{WZPgRmcb7(AudBW;88Te5y7M)yZ;9WP z++kw;`iX=ZeqlbK*6U}Vaw5E0ad^N-a=>lfnVf-vNZ;0JpJ#_~=hBAt`zqM3MIKNt za>22M4UUaRZ|ol;u&K$NzkCR6qDB~yYSuO)Zn>&IOSCYcoYyQyatw9R&B08ox61cV z(c38^lM4H^DU!1FZgXxCOVqL%n2;N&()$MEPKO5m3$DNNO|j+TJh72JTAUWyWUFvU z=cm2pd($mRki0nMJ=h) zz`K|)vz`E#u%gaQHmi}~<_*lnj9U{ucq>~c#y(wygeUs@j<9$yY585yO3?0T;bTV{ z)+&GUSYb-w-8(XMUHlLAOv}_-` zhw)>eR|o;kJvL+~DD?}(+aJjZ9`t4qPI;E9Rd&@yqx1v?;MRUm zIm(Lz2G;H$17ccb9y0W!5lW;q3uH*Z6#`SDvU?CFQE^{e{WaSS{bh6sYa5a#U z+y#;sNziec3h&MIkTw=?wvS2%ygmHYvEY+@h^+&UBK8WWB^h@;J&*Ytp1|c4slXA* zRa4TSbO?qEGA@o$WqEXKVn>zljv!yvLt)@Avg2wNxQo1*ZV6r(HGVf(0v%OBz>kr% z0FrftV&w-LHCocd01vZ{jCcS*(iWe3+C1!oXQ@s3*;S4XpoH}b_3djq*sNgGetw8F zvIDGH8;Z($DOce3WT**to!5}FxV|VDJNrsBBJMCezncU`8xY4dr!VkW^SmP{eHiKc zYksjbtw>T?s0hW0Y-X1hca_f&M9wdkcBhAg(6XS^S91bZM3vyppQ1z%~74-&VtG2wgyvjJer9nkq)~100Z?O&h2*86OtD)IURP zZ=BF+dX(Krh(+3E58fx2?Te3s7pb$%r|W{6DcDJ@H6UlMEWS8_tg~4k-nynoe2iVi zLPDEJ94CLYP(I%_uy`Q0RsMEDu5?H!%BKR{vsFLleFq!NvO}a*6*U93(EiO;Wu+g^jhej^~C5(g* zqe2iM6^Jy|+Png4=VIrDkpoEoyG~3L81my;WjPVoY_+}QlKM!x-Q86P~mBV>tci@>WoD=Me9vok#l>zRLU~ zXr0pmD@7*Yai3)qw6-R+hJT87YfHp{vTm)diAM)1pZB;s zHc$GkVmKnGIZH^%UnO<6ljL5x*j#%@qLrB>JuEp*E=p}_r9*T!jOh_ExL*F`F;8Y? zCg}CD1&VCpfRYoo24eluHpoQh#3rNjEo3GHujAKm-+%lqUNfe_#UvOOiE&lrAyL+2 zF@is>TgllcNNfwQze@TLwgp!jOQsL5+$KVYSlddI3dqcSxuzn2*M}=&&dOaBe?F6F zYob&j*3;Xtv3>Uf8q5u)Ri(ys;UY-uH&UNU7geSQ`Q3}#rvA!NB=fd-t<4gAs)l^H z0saX))fWxfLMSoqn^C({QuL=QiRT;tLglwGK)<79F(PmE_oGtudyU35p|a*4v{53K#}FNZC5 zV3d-r9daz27ibDYegW<5^CEI_@u`aD@sy(2iioXC5Br{YG65i;?);d6Jht1u&Uufd z@pd!gvGKZ|sI6{9jc=qzil6C74iOU{dvn-i+K2cOdrBbUfgy&aR`HwH(t2|ajX>f(WcGYG?0VJaS z5*8g)RZ0AcbyHqX@ z>v!H@I$H(PJV+)pS&-@*hWHS%Q3LUYzM0wLCE5|j)sfT%e;}@~0fq-=co#^=`kP86 zwfcr8b#5)UrsX=Fk7erCpOO}$6tszNX=w-um}u#K|L3nNjQJvyNL+`dT=dpFOw`^} zEJ*cef6$W#bdVxbYesQ8o*n2WA}>u-Xts_W zRSC7YwNXhnXA-OAOR~8V2{6Wz;9)lG(UJO?&0R`XM1@4(D*$|hHk6h0c3=J%%r|as zBaDks)ksh<^89yR%%H_G0&u4oE`lXkGxN&OFQKT9DYuadN*6A>vif zD=kiMyqkF}S!o|kFD7oaojeTkiVJk6d{A`f|vzE~ul!JlhwK zesLPrEqZgM3NoM)F#dYw;|gY~mKnT;BFeixQ^hU}EjmCaiO(Xk>^BI6W#HXJB3&j_DoH%|t4bmhLB8NZ1So3G#hW>R5( zgWH4n?32nT2JU2b*<9p4@X$zVIa>3g&Lynv=7qzxK zXF+78>7G42}^GIx?%Fo;Zb+x=`;McmtcK1L&hFi%8kYWr%=YM$~<#BkVp z+Og_t2fRJ0ZW16DL8uSxsuc)|r@HZ~;KrZ4chplp^!t4=-6WRA{xH(JZ+|%7n{_4O zI}3^725)LXd*(2$s8GY9a4PGgl>TutUly)1m|l0IgDRt(9h=uexA5=P=nV<8{EDR@ zu4KY?yzpB=N%ByV^EkWv+{ec6pwuY=$4GqD5>< zbng-Te6Vn*2WiBPw7t#Q{%J90%lh$f&-yYI(Eh_dw#8c6Ak|hptR=OZb*0t9y4r5p zeM|Dfai-W{j|fXq+l91P8C=*7yDWJ%w8e`uwR;>nQrEW_+9J``a$8wS6*p)XD}?&? zy!7Ymr44oAsG&V`_jJ*|^EWgx2yd!32KIdFjU1rVx8bf6>%~sQT22F@(%0H-?}(SG z9D>@+Ee2jY>_p2bLa9%o!UE9-Yny-Y23?aVwRu|+M`u=ZjsOyo>qzbX@Z5!g7 z>Fe?iM21rIkv8r#GPdTUyg}84XoU+ypIF3OpM<6d$QITQe( zJjGsJ8&NOKf{%>-~ZDP~ahk$M2SzhsP)SM`Gut6c#llCP3Qi#X}%9l(vrV6_kpJF7$46Y8s7a z104A}ZjDMkZ*J>TxZJtoI%6 zp#%|CTu#KzSyJRbTw=xeq&%4osotw=9BYwBR$K^Ka&K9S+vj38^esQ8ti( zeHHdP(t1dWxCa-I#O07yW$zcs#fvLhQEhYNQ? zF7$Cxh_kmMA4vf=8?j_GD7v7%|BOmuix~hCRS&1t?eXe6-;v~U6>r@UxGI!20`A@E z%JXG?FrcARBAk1TO~kzqWn>H^OFuAB-)O_eV)$|bB4&&WE;zkEYOx(~3|Ku$Ci=h7 zZdL)B>9gt+?{^@C}v$+M96pF-dFVxsc{jylFtj9Vuu7 zBbL08Y>IGUaq;reU{B^x5Z{{7-A4bAUYpjZ-Hsza!aNDj@6IE>OLlR8Bk3!JxmMZj z@{Pyu+U5ICLHhAskp7Vm{wrGvW!)}6ze$q(ML5pY0yRiU7HR^ZorMdtLn0%I!Kq~P znbn?yj*AqaWfomS#E`^!zPJYFUUqOS%bCKKO_Url2`{MiR$Fpt-GlKA z5K)1%{w7-V^jWJlD3d2dT0(b4eOkNPc0uZZSgflhW+UE5yfE!wmQX)El1NmvJ^pp; zI3r$tA-$qo6(E)CU4|soT4#&_)ZKmkM;L|(X#f#(?1M<%g>rDDZHWC_$R$k|(w2mz z;D`r-SX(av0veLM`t{9xnIc1qQso)(vxg;fz_cYB_cQ2AaL!e(;1ywD0qJ6Tr|H}) z{80Ea*{HsJ1RTkfgwJd->@q2q4Ihd+TN2wTHPkk#LZy|RKkg+3o~?A$v*4O5QXI&< zUr@p{qme}tdX)FW6Q9fb4K`}|VQ|w)XJr*Le9_pKMFbcpTun-ioiO6fw*9U6nLop< z&p7>g-AW=4dvCcgLqZZVBzvozx^di7SVhh4CqNR->_m!+3yetZye1)nkWBgQ8#5%F zwAx5=(SAu-ovz#s#0QbJb%G_6T2&VBXnA#9i8I>GW@?`a=`s5 z`=-TkXHHvuxRDw%8qwO~{?QKd^A~3`3NQ+CnXc-By@-n6v^jwYNxILt+Zcq5bPAZs z4kU>~UNilTF@m$j{neXE-0q_j_U$Lw1+|>%2j0*RM;Wj5Ngk-^@#?}5$fa3 zyMH>{X$?Zt2GsRt{zVKFtD~U*A5iP_$7?wk`23)XT@N;i*w3aU;duKUuWgC4v5q zR@%W%5HiXUUcMHI0oTWC{N{>&E(brqU3cA}AGUlo7RuJi+K4V^r60B$ z4ySk^Rd>yWj*`=xY zIw5re~grU5&)wCdT z3=sr7d^K$Pbo$i~M*UuHf@N_GNT0zAR}E7(#y2N)wL!@rW?8zc8tPT>ka{UI)YSY4A;gp?Lz$;8Z9mH1p#nCW$Xgf znZF^!v8p-^N>C{mmR$D?H1#!gPiMCJnmnl~kX=Uy?z@v0gRVn;ClP~kaRTER?Ph%# zT_@kN7Z0)$=Tbe>_udYo0NP2PEOIIrnbM&CG;d;&V9uq09NU@%PAxpvmUzy)M{#;k zA4#bSUbLD2^t%qA=m2-2@X>_jce#~Qwj zq2;fn2F+%Qi)p>BPs9srMF9@d47icU*)!v}XrGf^5q|j|AZ)zxJ`N?VW+y~g0?v)| zy*BF+{ar|mt~qnT^H*d#B!;lZe8?1*CyIQM92k33^0(B#J5IUS)~i^FCv}CNnRw5X zdsJJs3P9_vI`S`CWrYOIt;kb8N&Z@}@kcVN%sl|Gly(+J@RID+LrZZpWMQDhVM|lVXsKUc@b{GCWXi@NMcD} zYS{}~_Pt-8mP4EhDQMXa}UJ@O=`X=whfROx-FvxE|BsL?~iOtep>q zT#DcFmn71tQF}}FC8L;bsd0$p)n1B4e%Zav_Qk-w+a6_-#gaJE5=a)vm*T?uvl?XX zN%bZOYS9g%_gEVuG@AhMA!QT8uoxxJ33pm8sgxoTSTY0c+&A;ioZksKXlxe#eaNfe zVrwA>iI)**`x5VBr3M69ogEl?I?hb0T}?*D%RL4yxv5(W?L_XSjv#Ec2_3Nj7G(@J95CF_3 z<+4D`|B9T&8i!23jP*ICwyn8FrwS~QE*}+pP8iu zUFLEkA`UY{;>>;)(h{a>YSMI}S9;akHe>yE3TETK!c7w7J3RpJ>vg}^R{;fV_x3H2 zm^LpZ6hUn;I}bBIw85Lwq7Qv*+i_o);Pn=R?Xi6No7RKDBjh8)o+m+^8{N8}pP=9? zyi$f~f188f_E+BkuNa%}uV6Ss+LtI2$c_6%C*i9WG=pPU-(HVlba7v44EAZIl`8RU z$D8f*i~cwGkDS>5v4GE`mSt2WI{a5^wHvf;(~cMj7v2q4>;j@+vU*3VnNilS%Zko=q9^=J7%KZuvR-2(*C65WCh{y5`f|8Up&#u&CXJ3d z>RZi5`$Vg0vR-))3E^jPYzZNfr<4uSXOm!<7&PwNXQgl(F3Ls6FlA@S&NND7GcbS| z383()hGI}C1dbJl&)O9IBSYOOs_03EnlWfx( z6r50UNf5XNIY7l3Qtm5zW;3bpb)a6olRUJUP2tw|o&KOKFlmdkv}6Cq%V!CgSR+yg zDr6ke>_jE17DQP9uUp^&B~%A{i1P_f1ALHOn(~>UxxN(xlHr$7t_YO@b;NMMEZ9nM zCCI$CcCGF%X9+Z=8Dmx;326^R@ohxo-v&Ox-scT%ZtoQ-#M^^DIZ5uew#>}Cu6((m z=0I%snb-i<_q+qf$QPbK& zEYTUPQ$*cRgw3kDX^24tZMl$oOMFpdeWWyQ;UmKq$BNGlLSq$lLsjGILrdCA_L*BM zf+3rQO?pYXUv7HlpsMN7OrsC2@wGR)iwI0KN6}E~)dz!Pl^TjDabL{T?nyemxZ>9S zFwhhEPn?K%;urcwN(m8;Sr8x;15d#;IXGIB)~td%KnpBAaG~9slJ$`H#kPoaNX$Y) zC-c)Eq9!+|$|r$7nh~j=-Whq{NNd@1GJ`!Ye%QK?_PR`hBfawF1IjXeX&*K93n}=u zmlqL=&&plo7Rb7%sESb;*Ha(&S0YHu!;#L@71 z6=f$%qf_{h5v~Atk|oFDPnZ+mp#{Aw3-`S!Jj&LkStA9d`MqY@ZY?Q9|AdCArX_AXIO-N=oDi_v-z)4F_)B_ZSOGL;f0UdJ5%FC8S;?O8%(lpsf$8m2} zVC}t=OA(O0$q4QO2)7y#A>C}OJ2sh&)J9KNXtvX+!C@EIiEsx(E}f1YlSB`(q>GH< zoo_$_izPIPxf$;A2e774E|6pp15+i+V+U}g3=J_c8+Y1NERvGw zv&nW|-7JRRg~h%F?f&`n-Ku*uD||i8^Z_f$QjMYI?U;C)@R}=oxpsyXymzcSF zZZOnjoUXFmD!mpoGZ>`cLm6&e*9F=C!q_^=S$bIJ2mE39dmb?9`+h`;5;15ONHbdC z7tiv=a*>;}zOHy@498iFkT$Vb`hG*|KWUh{**_3K?IJU7bT_NLyHwUhm;<}N!3CO|LqXy7&d`qZM1Ni! zr7;P#m=;pG`>dD2T{zI+5l><7z2W7W3Gvj)^MWhg#gACct^028)U)O4c#uy`ByR^_ z&|eY-ycw)gBjJKgR% zl*7G#JnyaTufZwt4{9|`En|(?Y=}VrEF{BvTah3nKzb~cSg~rEDon9`Qd55(eZr?LdBTx z|B0N--q0W$omg*XZ~C5D3s4rWn^=gsH)AcQ5+O<#A#YqHL2)q1o+_~UQZfDr)EnKK zrnnThoBQ-SON5mwUEd&`Kox^c~=<&BflfV{8}&O{G-&F;V;i^IFh8= z6|M{|olS=V9(7VeBKeY;Td8$>VXusmjVp@i1bgcRqbhOpPqLWb;RZ8O_1O6-c2mu zswY-dZi(4av!|7*nrxd8fmhEF0@lx`*~nc$b%?`>I(0~spp{uE=&|g5ajxXQ%`U&Z zy+dHicG1cg6WYSXg&3w7g}Woogm!7a!&Tx`Wc5Z(Z{ff$LVz!Lv@-QRpbmBL>diyc zad$>*U2a2OkolaDe$)8e%jV&%EZ{k{c;&{Ok+WnW_Ffjj#@+ziyW%b5ok0w;8?{(e zq^vX_8Da#sg=96L<)#KA!5qlOz#)IL8g5WQ{8gVI{z5v4v5BlKuvswrk!DG=c;f}d z{RN@}>HiqJ5-qoJT>C}J$=2P;=TH(Yv9wU(Vq5q~6JS^yph;sdt~p#Qt@P*I5V_{rA!>;!41P~wa0~0HNIZ!ME7BZ z!B*Q$VC>#*xqrz>uW9*3LnC)IQ*Y#C{lCSx96?W^%Q9y(w~? zm+=L?zODh~IOf=7`_?Q{`uR6pCsdvEMOe0u*YX6Tx0w#uvG{HUvxI&KYN-|~s97k5 z{+R<;AE18Kwh)<}3ov2?HaT%f6=Y+FFr}flopR}MGMmNDEomR(!Ug=zA;~LB&W*bg ziT2oQN7?L4)k^-`V7`6-!K676b^Qp8l8=9!j$1u$p-##`>);G+y?~3hTEHBf;Lv~nGhl|E5d;>4*4baw@-oIeHPGq$vr5D%{93YQcJpg#6M2Mr)K$#q%+`SG{rO8O>Mu8VZv+bwP^_ZSPThx}~!N3;AIZO(EXQEFyi5TgyoMHI06;Iycdl zL8WVxsZo&m_%ECB{rsXCJNb`h#nxG!otR|`>TY7EljU2EQgxg02<(DZeewqdZ#?hm+Gdw@Fg4pm>%dy$~SFf9fkaI zG*IxqATZO556P#rIkDI1Z+@0OHpIb@-MldGk0;HmKJY!zv_9;<`e^rw+bllw7%d{H z!P_WisV=&c%mnZ4$c8zJ6tb_qwQjB8_AjXn3J8Z^T9Tn`R(dTG2W^8v_va8Yi z5qsMHnl1p|k&#vh>Kz>Ix|BGZ$I7i0pBsQF$NF=2+mq@fEYEEe&jje_B#xj^7oM3z zgF@@gC9hEC_|A>KBa@oUYN?3CKUuo2lCbs9GU#kOH!Cj^uGRwSc5-M(Z9( z@?sZ>bG}>-`2AXaBl2EgA>`!IqU9zY9%gIoU%_-4E_SD+u(LMGptLnPmwCe=W0&MPa0 z>7i;3s~D7f7MAjUAa_(GvjGrrGa`?SSYrF{?N8CF{h8Y=0r2O&X~ih-2*avH$KKnU z6(V~_te4181NpewqoZFUkx4dNN;`OPtlgxJ_wN|s0d?oR%xE-6y2H0x4$VS2JC@a z#K`iQ4ZJw@+TAtMisi}22ZwLxl8g>NQ|dX<5tAMqQGa=uQKSZ~Uw`rx?A3@8H>>$iw)!PWopKDUW)N9QtGOx-wW`Kz zf8{>hbz!&cs}D+^DZ&mn$29Pj^cD6vj~es1M5xSIj}l|`4)d)`d17!EM3h&_q|n4) zzpcEy_bqc@c!U>hqGqD+kb}Z7!+e(`6zTN|F<-A9u-i_qO3-a5UXUY{B+~h`(&1na z%&Z1&+_$wz0?FUjyOWL!Yc?BOoE{;b_`=Um&7fnC8zTqb!2K*$%fS*JS zD?j~~KXmJttzHsSmeKWvSUGt>DM^Sq3|#s5%z@+Q-rUTN1b^rRM^qjA1(}n-BoSBp zFhhT4xt@vpkiR(ds>h0IcjR=#t08^>9D1_o|76mIg46Ed{5+c8UJuy+6TgTp)!8w> zwV$Wfk)&GdBb3MpSKia8Z0&g(MeZLFp|~KGY_N-rAwj^OS-CJJD(&9hYCWA1Yj)uz zi%1l}=CIXw@CF>u0{Zb}0&H6US^ODfe?R$iO;9*vxmW3rziGc-FcI!er8s6wPD}?L~fB z?iaW2ljs@Nxlo&*)cS2e#VG-5g5DSxf^5B}eGxarU_kIUT|R*YM#g;rMY#=Tn4RI= zMoA%ui?6o`#bzUn;vGgwjVO$qve)2_z>F^#o9}5YzDhQibLDUW>9qlJ>3hXQ{?~uW3$!y_1bE0>?G#_g! zBA?;a*V0*teK~L1*ser9+@JE*&YqW5m8El5&#lF<@5{|wt-tzS*&)6^FjHh7fV+I! zh@#^xy8@KF#scuNGHZ@_<>G>!N4~!q>9_#drO|}5^egM@TZTo?M7}5O%gVOXkpPDD zGm-IrawQ%cF*d2op+4kzF;2=_KP$bQ@d>LRrH|_5`JBvOxipX}pY)}>T*T2ZJ=w>x zYtu!WxzyHom!Oz=ZiEtd&qeo*OnS*Tc7Eba;!QUXJ z#m&vk^6ZFSDoLj#$EU<92;zQVQ?rxLf4P}kedF)9Q$n+Kwo^%?IlS68({;9~XE~^JBgGa5&07+l7o%TFG+2Xw$lGHm&#?yFS#7Vx#MAH)a&m z;2&yBkXPR_v3Jss>!*4PqiQIubtpKZ2S8`IikqQ>K?l+4TVdiWl={hZbY5~;j|AeV zw@UJjWQjH3zsf-Zy&J<(;%O8-B|Z7cNH{qr{L-y@ljC1n7m4gwT&sHZmzzz+?awwh zSOA?BX$=SKCh`707-^HNyXnaIT6W>5Ej%tmfaw^bNuuBsSe@VYW+6TGp)e6}T_RiA zZm{>Va1@;YEct#KFPWYK1|kVd;q%ASNHTedDY84ON~7yJ<(ln~Ax9q7N9g zg-it02FyZ1rcO<-M)>n-svVnLzf(?{gyX6Jd;WXIARc1P_i2Gf15W04_cwS$;=ovs@jt^?U!k@twNt6RppInJM9XP`45aOc_#&Ft zRLcRF&ZD0lSv3#MASvYrz9nn2?Ckve|~J=$jtuCQR7B|3>L(tX{;IA#JG@GXiA;(z=M7OJ8Tka1)&*s*i_+0oLNjq zUJU^I?Cj(vAGo$@ZPFQ03j`^=$#Dxd9XSm(Jf_EzzIiV3^YU|)CsbZqv%VRmO|oww zj$3n7eu40fj?*O47|6X@hdw8bV^R3kUHSUX%Ud=x9fD4ry?MbVoLyYxk5+pltw{L^ zoqZ;jlS19zdD;9%XJH@%$7J=AlG-%eQL9t=^}%3vV_t$)Zqxz86x1OFfH3=}8}-S! z@PWu6tgD-Q@E3!`wgm0%`(B^f4=e19c=7VmBTh7QvgyKVy!jX>I{ihNVUP0yWwihj zL=!|ZC?Z*yO;Q2hHUdqhczgk1Jm)tyHsA#N05V`Y@QfJ0qn9H1*&cObtIj4j&m5SH zzP&LMTn+9`cu12!GJ?CB*qKEl^oOAsG{Q% zuQxZ5Jl>!LQms=UIE$uId|PmeGrdqb>4aKh)&66u%&l0FYeJ3d*Vm@aY93R?gS z8ueynz-A7OTKSt8`60o$i44znEctLSb~URiA9sAQ*cnoZ%5f6Y1m`@>hbVFDVbJqW zz0G7pBiT&Ds4Lt-L`;D?z8A}szc|Ym2q6fb1RVAEw&MuK{@#;O#B7DT#TQje=6)$^ zRGm^p)ENp>)vvott)E=$2Bq4NzawX#{oqwd={=Fw>StL*g*dq1pz*{}CgW@FH$Pum zq(w8gD(2qG*-gcse5^k<#l?R|r1L@byc5v5yJX6J#asXDebzyA5fYsYTQ z@2|hV3ZfB^o15ta@*@}m+t#!>u&}C4AvN8=W5l-J!w1T#7suaFoP#Lbe)tcI`;h-? z*l@up-Gf{6o{UxtjIHFE)GvB_6TepS*SDsW8tw&|4y}iqxE`^+AO{imu%$X>Vaqnm ztQy^REy--`Syzo#8nScy4;{)}aD}gr9}JKn7_t+^g(yAGK)WQPb#@8od#M2z5f|7B zs1a&S3UG-mySkXm-BvZ;M}zv#=b-T`T2RZZUy%PSXCxdI==yDRvyUG6xq5>`_==~K zok{2R#)y+sLbZb#Oeq_=;iiOt(6i92_|0JHV91w?=-1%p)BRe_6EUCynXt=A82m#i z+Cua%rN&iFJK$&d%nS?*Iw0SHY~oiHVQ{O+`iClGr0s6<&;T#?R`{Smzd5BhMD}5N zqS4k4s3-SCbkLavhsZA)9~XEgrT4gB)=|eo%ZZd6O_f=NmkNanzWx6Fvo^U)`2vzo zBI=?rNTD_;2q(nSlbcU&ZzZ$TrgcYLs`lege3uw|WZ1EV<`AAq7EP}}YoLJ}kS0N@ zSX{iuUUC2Iw5mjfO`p@wXYCX9@ziC2M&J?V0qjlx@=1OHT&WQ|^t?A@XlWjbn<{{&4 zc9tF4HZR5BA6VU?9yQeP9gToYEQ}kS05`b%`A{ZOFP&=;Wx_0AU`LQ;5#hQ}mpMto zl>|T^m)^eQCv}UXp5B4n;kdv_i8Qb6NEznKCHEImrIM(YjMlkt2Kbo7G=N)Nu{WDY zck-gaEy{`5dy?m773=?DYug)?@a9K3K_7JX5!Os5J{=)RvLua6fKD!fQqhL*T-&-< z(7NeG(GX(gf{B9|g)n4o7H!`dlv-!K>ifO-w==bme<3kz?UP8jYwdiJT_~I>Y`);y zaArZM;UCmHwgGLA;qa^S^x!6BH+N63^BO;h<) zi2c2jfR*p$TDA~%XypS^*c~%Gi2Sq7(UtH3wta}z7Z7nK??Lwi|91PcAd>Ny{#urDtCmB*z8=t-vCGLHH?)qB>VN*7%`i>}HaM58snTCrzI!7oUF!UjcAFx&|7 z&VQ6(P<{c<2~4cq3_M$iiFy`q5Ogv=4v-A(6KMuMD$Daux<&0FDMC-3M!J^ldvVZM z2M&O8d#R zFLjlekRVpw8MC$$@eLnEfd=}WE{f^zp| z){!=%Rb=D=9au+gfE)^}Zm*77-mqA<5%Dq#H!botB{PgKh^x;?y;f@GVIf_&RS1r& za!#S_-RaWhixKq=91qm_pvxutC|W%e2;++EL^w-EL61!f+>Ta)cbt4qbZ{&3?{fG@ zv}^`ifonfP?c}^+OeIrTnQ`z=y@{JXu9<*>Kmu-o&t1NePJ22Ccgc8nnlr}T^-?pK zrKBx2jA}DT5(y&1XV;B zDs!5}xaD;cB8n`&nLEd0ax9DiFlq9Hk)}7vL0oZ}%SF8C&eFibm=~m0302vd&~&X5 zFN+k7AoVGvg3QwK2@KH!OXU!cUSC=>D}Y3L zw`GO;VJ|bWeDGEg(+0*ymWlGLQi5QtiKOps8*>m9stlhhbnIa!C=T*r(=!a{!mATV z4wBjs&;+aYQlQe((b)Ph0u6`^PZyLrs7L*FfH(;O;?Q_?=dv`U~`HlqN$E znCbj%)Q6Jkjz}^&Nri{Kd%9S(pT7A>hA){0Ux5Z>eRjSnAisI@iPmtR_Kcifkm`rk0dDZoTyyPx?ynZo0kg! z&>px#tX&pvP(TP#L(8ZUDa07y!}${Gec+nIk;I=fxexp>CcF@($-ijf@vLNgim1fm z*O8TZVW-;n;@j+;b#%mu$Dn)SAtWMu+=PqP#2Ed|?`_TY@Dg%@&ZSoCTi_vBiN7V0WZQnQL&~KG>>|Fn@9Y$G4`g9BEuAf? zoQUix#Ez3Y@>+iL&tCi$X9AtCC4FWaQia8t_DNsV6A z1MN|R4>QpfR10pYePSa7e@3h$Z_%`Y6iuja>)!5wR4`VQ*k} z8Gc!c4yHMT{c-}laxy!q{DPRo?=Y5R+dVV&mDI-b;)qXfVX&%lPpVXpan-p>s{v%h zo+YI{N$aKnO>_B9yxkmVQn51|fbt5~4Sz(0av1=Zq0AAO7tx)Vx_3M{-k$XL3roKN z`8^PAQ5ke_Bka#;Jpg#V2u1P9oavhE$nbf3vrC?54n`UL!>)9u%T5!$w^uvE%N#Xs z*`6vV=4H`*n&34hC58Q{*f+K8>6-Bkm!jYly*){$}^&_go$shGINtzknmZB(#5H5nI|C%l$$u=+-74m-Iz8NXCnjQ;#>!5#6>{9$K{tK z(INcu_WS_7uGg2Zu@s|^v$Z|nUvY~fdqNqTQ1kl2|&BZl~dN2|qtED^7K z!PAlRIw*j&%0TiPRi3oHl_Ty#4iNh4O^-k9HL3Z^U75)=YqQ8|!XNZ%wIvhWMG+FI z;nAk46R7^F6H}bJUy?*RQ7v(l(&wOjDx%JMW8J;v6tK^irJ>W8`SXF2W->!ql~dqa ziJt*F|DnWMCR~n)#wV?Id_2kZS~{pqcS=a$cJLsvV!~+~xk8=}tU*(ezQnQm@0;1g z&w%B`g;;_G&w}<)xJtM~(@n;)rRIn;uO}fJ1y(hqay45(pnX7B)UU%06pFo?AWJV0 zFB)Z0O@e z9W=dD1{CLiC5;bSZ*CIO`(Tm1f0oH&+X?fDcX|0?L3ApiVh`^dyBP(#Dnle+a_#ZU zq^#A*7DP$>Ii+$r_f%&hCb8*;d2eYhqC!8FMTMatJ%IG?zGHMBRwKrQeRB@Jg`==i zu@7tRlsPzMo-(N^3cw!OcXb*t+2Ch*K6~jrHz*p%o;%O2HNp=B^6YQx3BG zK-AtodktnMeJw|P{--z0gDC&!C8UpfHR|2 zXn{l+-fLEQ1NP+4d1-;jh*rv2mF!#P?4IYN#E6{axm*HoxfRprjvMj|qb`Fu9s$p% zzO=*>GdXrrE47%2#cL~?E@u7l?H~D_K%P5d{j}FE+mB8bJtl^S1-WU1Tk;VuZq`;e zloa(n5%>FKq<#dMGrnD;RR_Ic-jefBZcD z&)=_F@7_OEUD-`?bNYGzDLF9qu5N|_EEnB-!j1UZPU>UWHx|F2XXHvI5fGN=?Svjp z^)x}H5U1D-{?wqi^Q$IDpe|Fj))GPW?@#&4lg{R7?SJvF>4D}JP;iU7KGqQ(h3no-W3EG{ z1wWA*5Z+jMhNBUEKxcy4vN@3Pg4SXvktBap8k1b20m;5`oS*FCYluy0xur_ zxrLa1(L(RW?BRvidC@Hg*qYwKNJIBGHmal)#3*g{vN?vmasfV>P*`yJa&C~TWo?dy z)$+F@n5CEG&X^J8ZgPz*_yDbIKK4GVu`Wm4y1otQRtB9**WnZ2b7QoIB19So1GzmUs>yS zN^tcI%n95|i>^#QY+kGEj7U0;Z%?$n3x{RPyZOQ4Up4KM>mLfa*(^SJRh~t&UTWkH z3NKFhli3!Z=&ybtJ8&}iq9anwf^uh+l18B(rHhjm?7Hq9+*@q9!d{peWpf3CDf0PP z_vQ~$-BsI$xVTJ*tE%3TewI7ON0Vg^R$faWy`meh&%~x$&s?FPBT|g_bR!!}*mrBx z)V!6 zRhE5Ha5A|*hf?^seg(uwLyCv2hJ->%o#6r=fFl_}?JagJEx*jKzR~32!)%vT{ML&u zQNK;(pY$h-wfm&8bsmBZB@~w5Y-gYWMg-kOd*5ruj*!d2UBp#?;W-U$9vnoy*IS2( zwETFgMGlGd_%Aj&wuD0}1sW@v5oGF24*LPmQd>;XD$dGSQlkVFMMca!pmNM8E!S9d zv{@@yar{&X5h)CsykmLSizt@tIO<&O|0@W85Cq zS|Qac3faQ;D6-1N0p1@^2e))2;(n{M{IWf#Xl4zSAg7OXxtdNp-fZ+RGA`oB)>pbh z4O@f^G500tWZVum$)a+F*$ftHQ`vd-ssIEuWp&kgPOaPWI-9%V#p>IAa>KKeU16QO|ck5?161HJmX_Mkn?#nLz z#Urq=X64KU4|QIQ2!tpsDUMQpW)`w1ky>4k_*FddE~jPBgLuWBS?&~3f^>L49?k+@ zBy8{!1&uAV#K+@C|Hxa%$744u8Epc`4VScG(K0jpm+Ox$oeEV8&*w0TLzVY*M_;#rd*x{Rx8;WaHn_&3#ApzYi>2&N=WL zs@S(DvF_KeA1<}^Bn-cx!c;vq-~QoYV}mjO{1&9{s5xr*!Aqrtwsm88tl2G zZ+#YFpfqr+JN{GBgXt6=0s8;Bl6bYs&Q`1J4CrmPip6me`8() zydKFKS7lY6?2G~kd?pLa4%xkYref%$dO%0r{q%u`s!Pl6l(tfo-*uQ zCp?*`Ap5EVWEb_M=Ic-W66MS_r~xzU?XT`sZRF^Zp$XSwt)GG8uhy*Md++>|CYthj zy|vYebQoN%-`_+_qBmWET;o?_2h)}+EK&Pig(`TE9(+~zu67X=3R2%EwyTLe<;qq( zeoS`Qo2iLSGP}{b`)0-ko31`R!H}IT0s99E75g+>oHN!ni*>VOqU170*6~Xc?;GrZ zG{#&7z=Pb(C_HY(UK(V5!J&Z9v-zjTiiZ-3-sd@)l=L{xB^!ke)3Cze5q%~px7F>q z7#;G&q{omqO=>t(-y@nH15rgaROO&Ot=2FLsadVs&7H<)n2h?E z0_4sH!5SXe0%Av_&sLl5;w~O)oi^nN%~t7Tj`b+1Om?5=0{~`mHOj9ltku4qdXL~G zWZngO^5R$Rxpp**Ev|Tz1n)L-Wye`kOJUH-zMECaXo02+|gP(gKq_|Z|{@Jw>dIIDsq6>rzO37bp+W7tJSJ@9YDYNfp z>v5}M`x7&c3Ch_aL@}vr*NPZ$Y1I-lQf9vKfs zsrlwbSyCSdS{t+S3s?b`Z>>UJqaZi7zshIODlv-81D*5}tN#Mn8bJH2O~1mrSvv_Y zPT?gJi)Y{Qtuh0MYv-ePNN;fh(C~X&Ex^o|IXU3_-~arh&Ab9aP^dSvzsK4t2O2d% z334lcnY+#b-6`s<=#X)0))!4~x~?|QdlkS(6p}8z=d-EVHgluY%|zQ|>PQNrZ60|n zev^_d0Xc(BY@X!zUx~cfW=qRklux)&FU-VH7pvBDP`K(dGG6M=|3 zptbl`S8R zh05SX58A#N#h4?`l@F!uN*pn7c+?@A84=eTk$FRiT*~?J#|E3^=UQAm07F=wPPBsU z8KNY8L5sc6JLY=&>|iYmyeL!znFwH`@`58hMj4k8)k$`~KI}V~`v7UF{H`fU0~b+_ z54`h+wmx1LyBO-iXlJE=t5;}ZWPMwxY!ZM-g!?&&NS-%Y_|I@yK|d2CqQ(;=;@9Cw zD`3(Y^2c0Pi>YlB8V(1OLlg=WZ3X+P&a zYtQ#U8ySo)X8?V93VAO6h?OUp$;f1bPprn6( zpX6KP_pNBOF^X}IKS_*4`5DFhI_^3D#(lvH-u2RIUQjNrX9WmPvXzGdkwezRTWsvi zqf82YWavPJNMGOrTjT#?%L&+h?hHcO_5!T6a-=*oO2$o! zXdtb{hn*~@sPT%T%D*{{`RZ`j%7jw#Tk|nHT*wvWHfWnZk;o~4MNCXId1Fd^N!}3R z1hi%5w5@_r2kmCG#fJIdoBZLuZ1_l;)OVMi`t)r$|Klcz3i&TGk- zk&KqKK50L!!vXNRoaldSz0&>*zkkUe&B(iAV?L~Axw=g@=GF<~hH#d#MWG0kLaPmr z)ioQbohkFXZnM6bD&oFSq8B*$pj#)W!cWbc1vWH49#O_NcxINaJWY@9hXm9J!{uio z58?$VB_8WR;`bZtPHUe(t$7?bi+lw=Zq}un<^FnqC)KLYol=HkFq@g=w%^ErfRex9 z%GAPd%GdlR^6ZH=db_%NYovE&n=QA;WUa{o8ClApZcW^Ru)Virr>5H#T{nD9U%5aH zrp4XLs_ZIU@&5yt%*d$?d>extXz&n0Iiuu^@;k^T)Cr6lF9RGfW{ubMxj|ln6<7Gj zFKNUQ*~}UfxN#9c63SDNcB;N^(WonF_9i-wbAwyeB=HwWoqy8*jjYlx1QI z{aKuszkWaQj>Rt?E04GcZ5i~L(Nf~OHNZ7<1~36xNPBTt?jT4W#G}Q`xdWD%LXWv* ze<+XaNzsr8edz7lx+I~A4i@s#50_-E{()!1x8J}2(;iq*?CXm`kfE)Sox!~6;527k zGW(wXfD`7^NMwIOnds=0lLhQ({$w|!$gC7#p^q0&rfRHvp~*Vr1g1fR2Lv)v7Hd!k zRT(ufB|7lINCxuQMB)1gq)hZj*cRsua?cLYNM$&Td6i3>M=yi)5QlsKZjQOyHPfO) zCgQHPXcXO+p(GlvBxD;pfmi9jB3=O8wUM!J#48HstkC3KJ|hjd z1VLJm&?3W1-`ZPoo~$a>qn@TP(`hy@B-!FH(-HG!sNcGgIqUc+HzxdnWsf8`vFQU2 z6pp$DI+@-*QZ%!2V*zd=OEHn5?S=dX6R9Ci{aF|fcZb5dF>B}`j@~OP`)I$+3XyHA zAXj<-kOIx+qte3yX&ZcaX!SG~o`+WGcev1tW06lXHlzgT0%Ng`rEY<`azF_X6})dE zlc?3zA!3wRR6Z9(e=|F&8{;a&fWVzHE0}SRMP0swycuOyiT)7j5k$WN%ajTDeabh* zFbwb`2j?G{JXJ4<;IAqPPCu6Zx0ufIpTQ^QZn8t~O!&Ml$afWw| ziR)O3f=JD$+>Um()zr2~27yn>$v149cF!H78lDs5R<1c}KWHSC1X<^(&7jO5>Zq{2 z88I@oIsi114%jw^hCZvIk7%+iFBq{x=00dC&QTCX_=Yt`hq#2jj`Hc3fr}~PNRz&eQCKIlqLRcU|RQJzq^MZE&Pv`>oU*9F^ zA4w8f828_jl-bt5XQc@jP()($zc=50u^q9~K=fq%$VQ%NYB4K~lS~NA)%dn)qK`Gm+EHDv~R3(cU zp>^B^F4 zLDLUAJGmoKLPb7{jG5Nq%qE#69;5ka9;o!`W;eBd&Wl)(k0C#VEPX6lxN080C6jFZ z!B^&kl%1Z_9_B7b=Rsd2-6-w%pKA?oF_1mNj)>MIRvTbwo6hs}zCz>$jzJV|gVw^D z7sO8d7I=}9c;F?A-wx{BwvG$()@|ouQXLqrOGjz+r6yL0x&!QJImhj?h+j5q%cr$n z?Ty`Yw5zn3>8IlUx}|+kiGS+r7JQ#O1yN>bw~IfJp@h$)VzGhQc%t^umKwtR5g}{2 zNNrrVFVmx<1QzJm3gC1ikpXPP7vy-E9Us*0`?fB>`JU{4T|e*_YGtis8P7x4HqbLG zQiJL*GF*@7a}f&lcIo~?tp~4bPUlmtCwD{Cj)3EOoA<$eml|O=we=S?B^C0sut1U1 zO$H#--rVHGbw0MaTMg=H)N|8qM~X=m%Gy24jf;5*W_>$Cv+J$Zh0hVGRfl5N2~zXX znhofCxo1uCS#h`b5`>>*v0ch&4lRpD}0kl=dj#C)xt#Q7p0Ek`Zyas1La+->Qhe9xJ!l;h!ZG z)M}QFMtiiFbIz2E^6IM{aILsq+rMR{3#64^xoqv{4@0pcZ|psbNvNjArh27iC2mpr zm3zT@--*g9Pa-oHdN04G*}h3q6twW;-+u&6lp`7X_`Ia~z%OAF6Bn1pnS*N6Tchj= z{7%*G?~_c(MfEiP!k`d@wfX8)5tw`SQ8ZeI6@s2LXqGAjJw zY}c;NT(suHZssolEFs&UAg(qHH9*~Ga`in#A5G}fLT@)EFx?09X}xHs#L%*VANc8cx-YBU<% zJ_Hi=P{3MB+_YfW2b)rRS=^hY} zNkoLeD)&^xI*{}D80}<XBmuc9LzdiR_+Y`U#MjrYHtI>Xyd(5~CgV==;sSHw+TkA|orY}-@E9kn zoHB!uwZs1H>sKBcWyc1$#dP+J*0H-xOL|>>`)D1B^48?0R64)d+45h^_Pq!?BO?m$wi{hy37%=N5- zo>zAz8w58W>`AQ+O%SyPi9t_4G9D|%)y{nj2obi*=6<$!H+lJ0XPO4vPcx#>mJo)}jSwC|S;gWWa+F46fM3UD247>b(GigR2zFJ1m!`u`I}GmZ^1iLAcR?swGAIXv_&%h)Isq{GQ8Ets2r0Cfo-LyNNh1 z1d*I(7r0sYidx8u>6!~E75p>7kex~Po*chKwd;>gMCO#zW;E7G@#B(0W)PO!nYmv@ zp8%-|o9g@5Z$DYDz?wyMo|E2^#azq3LVgFBP|M7`H^Tie;_c!lEXSkCki(>NJlVtB z#!i5PBXDw0Myz3)PU0T54|wK8D6A6sn6x)Yy|e(l>yeCw7o7kLctPi9O}Wh}W@=`_O;E*|YovDsvH z{K-n?_*Qw>l3%G@@Ez=jzmhb&D{u5t5Un=0`3m;i(jkH}KX+6$5aMvXnBgck!8Xk>y1HghF-A2>yB6FNwkL>| z1kK7-;OrUb#I(cJd3fn&gatVLt$y`M8b~W#*u5`h2Kf7vZx%RrYvpKlIUW(68zn-d3&w{t`Yb#k&i<3)9#9K;k&ipAUs+S32g_H}Z9_-v=yqEHJT=X7L} zupf9-*~k%;$)f|Kv1xUWe)sk*SmCXtdEfoEKvs0 zrard)_g0xGq9P5k1hmxyU2|Ulj18kV>*}#}>#gq3h&%oq6UHxNO=`_RPq=w`kqsX7 zPH`Oh&XBpQC7*&7j=;VzTiv713Lle~)kZ-CUbG151zm}rB64m$e*{YJ33=d~UTSmx zLOQZg#Qo($GS%)1y@!bNfB-^7+Y>6585PtnSU4$-pdv0r4)o=cq#xE_TnU@D?AfFW zOokmt9su8>yMra`A0ak!3ZMQ5Ws!_Nl{LhtRV1xo%+#{i!>h-a|044H-f4XOfXv5jL&}wu1b*`~6BtA)idF4&@uh^QXnNqw zGb+s0KS#e;oSjvsSE*WD#KFmN1ZJn{H7=IFTh(fm0 z#T1O%ujwr4qzVGggi|V>AaF9r2H(% z80LeHcpdFM(M($VIPT`^(nIbpVkSgNJDKhTrZbm$mp~f_YsjneG6#^kZd5s>uat5p zlgizIK6opE^@G+xf{hgNWcpyQ3g^pQX|0~V^LgjPrB5tH21#(4d5_W^;^QSygI-~b z=7^)`14~aK!(TH)d~@17HLQsYfIh9``Bma@d2?=-g`qn4^QXi;U ze3U+M#mhVk02aug5R|#hQ4?9A)gp}-`csH%(Wn|SZtsRkEzCm z7V36-`G))Th?~$w3EsE2IiK^$&w;A8y|xH`6p1;V4`E^$l*8Ν-alo< z&5RN@PCK(d>L5uQH4sc7yaW*+j_kxaeZlv1uoAOLYnC$9J4!X%^|+!G3xni|MHMF|lmVyE`lY3(zrd8%f)U<^?6=~f`8q&ScrRmfQP?C$4weOj6d&?AJ%cfLx7F2Ji7q$M77r z$t81#n_MUmEat$U{E z$d0;@bzAp3t};%NRL9O)X*eaQ^D?q7#k`eLspnCy4Z<@-g#WZjqitI6g)y5xW9IO2 zOSpt*y91__zsPAJ%Sb!M(;nL#h6Q*4{4=wWq-j93{J;k~Z_C6l^b;MOW&iSr>^=un zpjP%fSV5wie`1IaYlsCGL~|v!l!lKQAj)1*i;3-vE59PTN@vs!fa2`>^#;eq6*iIU z##Mw>-iVswVd3H`w3)3#@e11n_qMVK#g~o$A8r5tP5;)?dt^#H$O36B3P4Ks!Bv=d zl=PybsNQS4Wvb-vrddw{{GG3PS2{?mfv1o zP_y|&m#vob#g%1SohKL9D0K}k=Sj&PJby`_H|6E1;?8~=Otxh1&pmheT%OgKKht72 zdl4mdq2q!lRLPXz%ZyBmTD7x07kMAa5uEHV~$3_ z7kO{60Wd{v5bCIeLike?fDphs9_=zYfcSBGG|Xd4v^4L*DCvWvfr4TL^(K>SMzdRf zi!~Yul!b*cjCE~m`ftw_o$&*chYx5MNk0t&hidFeoL%^1aMf8UT|}w1!m&8-m1uM@ zc;?P%BlFsiIOA~^j-o>s79=#f&LwYxHO=BiLp!e7X7AvS(HaIp?SK6HRnR(=M5D%5 zaB_4Cjg#I)zukgje>Cd~a?R)-J-&cnjh0ESj+^dl#!mQ5%b&G$x-NSX(Yw-eX;V>EA~jKFx8ldwObnm!So=}ZA{&AXMn zrgv~s_4QfqfS@p*M^?BslRs~%qIvJe34;MD|ZM#d97uWXB zdVis&)2ZcTC#tgb^xvc~35YY-VNgpgF2ULA+cnq2PgK9TSH`RF_fF(B!5)?C0>s&5 z0eI~CagW-gwfX7agzpg*z%^`bXIDfPv6YSM+6YifF$8d!(aa}=B@kIxfA6HL$rSH8{MJEq(m89`b<%6Onr@En?0oo?M1@>{Od*+%_+^&{?w73-F zs=;Wv;lVfLKx)FJw))60TakL;qcN=!;FHcNq_T`Tk;TrEMFEIPTdJ}!!F5)$s!5#$ zuO#Y_>w7XHmFxiaVY8X&0mzTtYw}8~4LLsNl?XdvkWt!GFSBqc7uMMP46KA!p@&HJ zkg1mp=n{F+&8^gK3#}H)$g~EU^AOykG!LW%En@8!1}OuP$37jL#TwiYNl)*=rZeVh z6~B=~0N!w!ffgX%Xk!zBZ7(6Kz+*?x?3&JxR@N;hPDv(FMtw#lP`Eg=N{*J1SFUiA zVjEi@W8V4E2+nLTw!H?q(1^FW7X=cDOA2L!G;D=qargFLbA@|Ei2(^A^!Wu+ zPh<_cB~6o9aI5eOgQR-Y$d+l|d=C8?fK+eT6?FneiRnlTB&)6xupJzwNGQm3;Luw- zqiupB6TCd@Ry&mlo;TCLlNaiIn-eVVb+u z`J1yHI~&(kE}M1b^>T@%Db%a)X18i%g;+wjUQsxpJ_Bgo3^{lfYv+*c0|*^ifWslq zoQ5~g9ITEwtKs<-4$-!lO7WOuC-c@Ma)dd*jj3RXa2Uo?a-uiAhGpiq=+ad@ zDeiSjpbNN^X44Rih^++eD37w#)X*18e=T)`xYWVbaOW}?#s$85I(py4o3%^_?8sr*~)w(YSp|u-{#!btZ^6ls2|ii4CYB^V;$z%`zgYO zXIdrpi5e93+AE9*WN>Dt5VaIIj&&)8Lci}?Re7*b;YD-|j!5YWCC2`zY1=>IF&>_r z#b2${N0e0kNngMBRp*u^hr z)91Of+M8(6!%@k1LzJZ_TvWkxQF(>56!8F*v^=Bw*mIIGp(LNyN@>Db&1NmNyHtWm zpM~feb`dS^(y+0_XP4l{mQwdg<}W*6SC<&>Cm3z)4M#0dYnb74}p$1S|hbL5uB)6c{J2qcR5H(Gd3t!CPyJue9C+ zL}oQKKq?_Z{Et1eh01Auqc?QqtiLuW@{RJUO!^dzjs#5-*O z_T7wG8HvP8zNII+65m`OuVi>5ADDG}A-gfiStLe}kgHX^9hVLOG!TQTl28ewCFX%X%D7PIES02(gm;3TQ%1nlnb0fV=`_>o{ zCsQsyL>?=+eeNb@K;u(!7Avao${bW!(jcE;F(ZG}QYy1xIAqtGqXtoIN~y#%_^aO1 zrP-&mRQBhIqgx9ra0*PyrJgiqBoG0?t+-`c#q^{{Bjf64lL70$_L}H@PClrtaUuZ_ zAd{c9$vK}-ur(s~2bX`L|LhX0C)?T;8Q`{4Jc=_y?V`B5o{&2#tNlqwr|{7 zhC)JG-7C=N<-E2LtQOG?yhB7Kh5t~Mle@lZ(2Ze_QmK7sKf_E&wY!S1JKDTiyS@1N z;-;$^{!Zo$z~8Gzjzm~#m{C8HO$kd@tH z*8;62s0ZAfB-1&=jwK?tW=l>WxqvfTh$A6Ni4#R}u0jR=W^dIAj9y94A^Oc+EuENq zH_{M}A|`2eolM;$y|k(hLHdPoQIM>f3_D6;Y1)EE#oH3&z`Ee{hftH|naak5)Q!S9nudsE-ET&4tV;TqEw<(>Lq4SvrRf z9`1zH_4CY3Nmq?adR#X)?;|Wk^U|KUHRt@@LtOT8AoZGSM68 zSnG+UqdXxQ8s^liJXE{emAwj7Y%aD7-FB<%6e)q3JTCv0*L*OQk@;XMb4}m2Z0aLv zA27)3Cw-0PC@b`IAn8A+&3PdFv4{u3mkP&63&17yMh4TACRbi1_$Oc4isif$mE#VUD;9lMQbd&p-m%4u%4z6$HLBRYtDJ^RO4-`3 zTG=r$B3XM%(H*ev_!J48MJ(6yjM^FK5m0C|J3na*5z2rfqduti0<~Gr01Cli_NH%x zxvMQp{+t~89Jj6ZWEA52sZn2x!U9m}wP!lwf^dJ# zJe6w(j-F@~oN4pJWG*U*zF-(v?HAD?kS&N!K&%4>*(wK7*!y6W?GfW1ISv$2^BW6? zntdj%I3f1$P%-&~@}k&JUa0o|hGV8qogyM_zRlg0&3TI>sWC!tE!a`jF4*!cmCN_i zP!)FGj6%jn!N{58Ht`Gcf__}<^<)c2OGXo7#pN?{w~G*{IiuX)*vz(IK8tfZU#RbE z^+9?z5M!FU*9c8*zt=Q`4z@u+_&1Xx|oFoKZ3)|14t2EULf1Y&zB&c zy-G_Q$TFQ$zNk^bu84@WE5Z!{JT5OtmLqYn(hHUr61+;lTRH~TvvfZ=;R(OO-_RXM zfq?ttoHO{Jk0$pySD)7(5W(UMUr@}U^58B=h3)D^yfA}k`KUf9x>o|->W@@BUkfq_ z*e_kEMc7i1xZX%d4Fzz%7Lm)_PcFU|2AH@kKRA{Wk$wu&FWKrBFQSB7g&@ldE}McN zx%>rHZHYb^0g%4LZO%)p-WM!1tKyn@X_Cw&Tv8^5{839kGFfOknR2&&6|qt)(yQ!z z#hLS2GOaDHCS-QP+66yrh@{vCm4kJ?JfllkL)R~!U4X4_Mpkuo1A~$>b))7ehF0qa ztMA41tlse?;T5P(vOqJD{n~i88CHKF@YTjsp&rI7kZ_`Sl!!qgQFQE1vvyoZUZp*> z2G4@F0O&?`3Y{<95GOUiR_WGA#}=wGRa^<8D4H0zdOnCccm&zXFGvyhy}jsbigvf}#vx{xec0(=ym1TXNSYP0V&f2b66&aL$r@}fGD7~qVyI6v zU$Ql7K|wSdR&VgHc(MzqWVzsM4U1;BewvfOio z6A)QpV&ARUy25($9a8BkY3%z(Ko*iH7KJW}*7tiXm#Iuz5G#^2A~pZ2#KUuLy|Cby zy`Y968`a+2F37@nR{i%PN;{Cj{-2P)#ROjD<%>tom79r8XKgC(NHP5=Kukh2?2=>m zVi&MY&;!x0j|d7OaawP$o<7aE2)GKlMSI-g1{sb82E?Y6%(infXvEvTnY`bchhJA) z4rdNzK}}X?Gkk3W=iusKuHS+?6#kVK=_%C$wcEvV;8lMV_NYlw303emjrQB`|CHjd z{$f@&ewi3)E*ROR%t^gBE|;^m8-LhAW(q@d@uAUj===rx_u3Ssh5A8xey@b2yoT(W zH*bz8^OQW3$TW2}_`vP8!zotIj< z_08Z*R+VhtL`jQ0fDP@E4DTdz($ZV~5UgFz^Il56A(wasMO=?$FttWf!^6lzfFE?W z??*qeGj6<^j(-z!h0W6!TdN3;?Q<1XDZI_jd zDolWtR=G`2Dza>o7f?QhO{c0ei_=)=4Y0}!2m0)V)1$RLD@a)AWQCf`MHvNL+tS1? z!;-Z3kV(%ZR-wKJ6ez=8aw$8McQxu4-$rY-vBibPhaxO~IP5&4i->=(T#EXgR`EZV zx}F0{Ce`7IpdaYqweXyK_u}a>W-A}Q00ZN7^zqT6xAO~0<5vKiSp^{&%u?=9`~=rC zg1XJxjSU#w;RHbvfzc;F29CpKoD>GHTm{;qVIL5KMq;A5%8T@3f*ahX{){Z$k^~_| zH&)9-Jjt3~*8C*$1oY3^o|s9Q&TB!rl>+Z#R_O*KY5?f>OL}b%%ol{vSoygZl+W&E zpf_y>w*-KC`x5@(ry%IAZ~m&zp-RFg#+ zwq&g$PcNsus8!$DQAd`#djAw*g4L4^8>j0o=(i{CFz?=GTjTCtn;Fyxkp8`y_8OKhAFbTF z6escK+@h+Gw#jx&8WOU~xO>cOhVan!j+5IZIjGOJEL@K$4>Lc^ zprkE;*8vHTCZ>u=1Y__k{m?%2pFLmC$a_a?QUg-=i@USab~%$b`BP3Zo0cb;kMK>p zEXZR1snCQ3CUtFw#a608c*!LrtW-0u$Md8Ma_?o10-U8{rLNYngcBkmCGo`2Cz; zH(&-Ui*#-N{1MNNB~!ja8YNM z$&?i^PEG>|&WFx}h812iZ3JpFul{&)BcLLkf7#o;<4Wu&`mEFIWBe2Sk4|4+JV)#A z!)%a)dUrisjJtoyefaQ-w*V4Z`y?L?MpmN(?L>c`PKF~%xeE234i>oyQNmOb`|n?+ z>x!tm&#aRkWyDJnc16SV{l&O6o~T^naTofhgO#AG$MC~nPtaB-kchQr?emF2|1cCO zP(yA>eaIqr2E4pSz>9>NKnWu*t!laTi2Qg+;#;XKq|kkP;Ohtu3U#-nyJeS@2q>D2FM4Vl{GxRV_6pPsRsPaZH>YP<4tXb{t!4Egz z!*gNwI7ozGIOPR?7#_6I@wCXs&7W*$A z+>{w3jZS9afu8J*lZP{3-miPI zom#{ZwN{%?WZgEyRsQN$E(>NsJPI?jr<~}Wqo5|zw0rRpJCogoQqSiFh@=V_wD-d| zR`$aKt{K@Z+&Bas_MS$MO)2V_Tqj>Z+>#;C3P@Bir|m1kQGHy#>=m-@>{@U`}nV1@qvZY(Nc}*1Y8)g;{_CHd-lO zLQg8Z0b)8PuO4OaraVeh6pRI!QG=0{@(MS~Tfl$_n+h$#7vyF6blZkp%ya%=i;KU7 z=UxzQ7@LLv*``~)Hvc1^K9OaVcu02b1TlJ z;K($q-L%0yvg|U_`)gqk5Rb`!>*F|izGM(CDbSmIpu>V^_50X-`^FnagaRWa5mw8gmD z`GRZHIC1g)#w9}d`Og^qo&J!}`2R=~=d+^PE6W%7E zxN8+3z_{FuoBofnYf*RH)YVVq`DUim+v8vx+r$^VxFm6&{^-ZanuVlvpWRNoD-nz_ z2uVo4oCpo~>1Ue{k6tvcc9RR6aMKD7mLmt<|iguRzjRy?@I~^*P^kyb2 zFGA^Kh$`nqJQU3>p>l(h(Kw*P`yDj~*|bOmRe4#7+b@g)itvukK3$rcj%1%CThg#e ztrDrLUk~EibCL5k#X6J>}NBV~tKt@9U2~=%r`dWfo*zIB= zzuW|Z2lYfgAaMVF=0RLJw)|~#+GL#5^)KG+O4jTIH2ySQgs8e&CAEd91>>gP7S~c# zse>0|Q-L~43q`WsjgYUua5cZ{25@`43OPQ6gbYF)k?B2B|JTI-PYumkqN7dyn_Ta2g=Jya0DNSNj z7Gm9Fn|XBqeoE+iG7wYytP54W+?Uv)T4mVdC?YVamk~RTcU_9vFyiVSEic$aBdY@M z_eh$f*B0Xr-`0B`2~XBBS&c;juf^GZVmoobt0&o&%d47^deb%yvLlhs_=Uj z>23Q}W*vMelm2n9ua(2!+^Zh``9~~*@DHF4Dk(|}uBx3H3{6jYwMtnbvPi%VrsY{O zL^7Yj2aG;Rn(e$o)Brt+?gr-Gd(x`!NVMx7MW>xLT~eqgDh`U8(gscRFD5V11|TQv z4mW}Dz=OStS?R1O8UW%eiv3HdzU(d7em#*T>ZJl+bas%Rlo%zAS;F`fRuISmAZL_0 zXX~It^$vL4I_*B~#YckV8*a1Mn^Rs29G|6K6HtLpOjKWd$~mEoo3;*m1Y;?sS_@c= zOQ!d2@Uo29i*45<>Kq_DBhE|bHmmFMLZ+zWC&Q}+*$xZJIX&Q%lugJkyU3T_F3d|4 zaJNe0_n4VNK#W{t$OU7`B9q(7uC^76av0v?nK7pPrQK+?_D$;$GB&+o2BbUaOyzmc zUyUIb2!=PEk{S;DBT~eN6iGO*E~O=Jh^u?|lR$eRz2iQa??ywL1vRpI`SWHlxw9!M zzkSd7{E?i|_Z%{GR>OQ6pa-jnwZU~}*Fp%Mto*E_pfD#gUx&e?SeDcJrCla=5RoCe zl<wkH|2Me%NcAk#$309%}Gj={y=Mp<$8ky8Xd(~beAbB9Z4qn5!aaDeD0-yD%%P-?@ z5fDK~QdEBo@cTE8%+kQM&XW}LLb@kVuEH@oD7jYSs2`g^tOOp4Q^RAU^Hrg?gxlVnX?=4ydR66G30w%>05eVy9f;HeIk%JuNJb3;iT-i1`gLd)#RG zbR~e(C=YVG>Hn;AH444)p>O@HbW`Bt+^qDKPQ6{5QsQP=43g-{jCO4=T%=zAkjwo_ zyRkQ+-N;hma)3@!5xfT~LV=ND41cQ9qZ1sPRoJ2=4B>B*%Ca2G|bkiKbCYQb3{4%^h<{!>>u=gZ`j2+MC=kX8?o7MnM zp<2(K^+CCd0npWn4{zhX$4Zbh62;BlsG#D{4Y zo?A~e>e&nN1}mYtIx~)};8J+Ts57+#Io~Mog{pF6;G8q*Kz=lf5N+kEhB)(k-zzZ( zCo@E!bbq&-GYXH?rM&ETS3bbGxti|Oa%yi)#o}MUZr?X`bX!9TkF>UbGh|P+^t3uF zg|%Dd5sIc-4KUdTyCu!9_Go6i!kzmJysI4Vtw zbFaGX2fZ`fL39C~kNDd{ZUKx3n)<-bz2uv!WC4 z@zQ44c}}eUdr}5Ue}z(OT|B!ftV1#oR4mt4?Wh#{X+ueiUK;?Af{@zNpbDc^TbvEv z@f&++;~$(|dXlQQL)QE)e86feSUxB3-uw=25?w#tSt9bG@Zf!uA7-MTlrTBb*@WBe ziFt_dS|r%LCS?i`1wg}f;Z(Eb?g4wlZNi(Mo;>|``vQQm|KPnF?vwfUmk;y)hY$1a zcR9WLRZeey6D4e5#d`Cr-M@QOVZHfP(vI}6ytlvmk5BvJD!(Po=K3>hzw^6I4{h(b zPJIxh=nIXD?_?+{Z(wN(+nS*?K}iW^-<5-gHeZ_~4qt6i6ad?e5m$K1)l+;sQ#0h& zf|E~f#b#@ESx5vNzn7U6{hXmH@?=1yQz?a{$cTdUBx$mpH9%hEVq|w#pWfp7QUSRN zcR3R@g!nDR7tef1Wfc^z`n2GO6A52AQ9kk+ZK+1kpaIH21#Nc(*N?W;HqhlSVEfuq zy*#J`j%Fo0+;xl5CLvlI^bwx{Ls5Pi6dR<|LfR`R)6~t{B8C2|OY~=biA9p%sU;Cp zY1Iss@_i7vFA{8C9A1sRbeObPNzXbOvY#YMV4u`GbFzVme`G|%Y)Shzc@E01Kf@g* zTvXvbCq^j7+s#b4OZ==RCVzV~N2HlMx<&O#paq?;y)q(zK$Zm#Z@1Pn@psg(I)HAZ zm7IHdwIJ+rH?PX+kz%K~+3ncM3Mnrt?*r7$DogXl;IH1)6{ zBK3KbX2M7!w)P&`ak6JoQ8Dl1te>%@O_xAC5Bh zn*@?Oxh)+5HYIM0d}Z;hrzba<{!qIlkt2#epPa$unAG1Oq5(by<})t5_wzx_*;!ce z+W6Owl+d7$@pokt&Wy!A*Sv1TQ^pV#lvj|G8-_)3lZ-dB#7QAzwxwhn9}WTAD=F}j z>75*&68{>Ow|3$W_ z;=b4$c{_R%`P}UM?2i|O*4Fzh-T;U8`x20KEZBTaBSB(QjHhHq?VuzRdBicv%w&*v zXkg49O^?R)ZL+^aV5Pn89#Igepm*@CT|o275zc>g0B`eONj_z%k;K)N8xCzwg9>lEpsBY!+W+wvt`{>u=e^C2#W~$;s;vY*GMRPkhI@OU4a0JwMt=>=nW8IwwOw z9O^(;d)E!HuMuJ>IvNHdeQs-Zd>3x;txqyXw=mOm{`P62^TCfKGdC&oKk0ntUv&PY zQ4O^~m2h)kmHgP?X3uIGBHh^bWVqW%ropDv3qXsJ43%245K#*~D&+dKa%-t-ctTdx zOVuHu4%vHAFzVXwg;1~EwcPbFnnkpKaiKxIdShz3btI*^cZg5qk6o?yx!3h3Z=>8w z=A9-v+`1!QqrT>JYs4Lo(m1w9+ZG9tXTjM!D2ede`9%}Z)M&AGR~%KuIl~U+Be&5{ z+Pc}0>1AYdeDCDWG#uQ5N*?Iw_Qq>1o zCE_i(Gt^zhz1}Hi_)8w9)$YIDV|5IKiD-}ID4;V+^M{vGoh2HDQV6FuW=dc*drtwc z8n$QAP(ddXM}kBK)K*OMHeo>ZN%01WLl%lD>Z2@4uCGvDHrJAFLo?Na7nff8b8|I zq+CMVqOuziX+PA;m72UuTGVoX=>_#-%qTayYtfBg zS?mZetf^=w%5MsTPxB{3>uT}R)&RryySYV;Lx*KhM|?7rr=JX^tJT<;6k+p)rT(fI zxy-Ek!g>3fsEzK$QhpUOFg)1~0&MqOj!@>KAbr_%k$dTg+QGD~!zkn)k(&t>|GS9<{NUOds3@`OwtwW z!d7-K$N(CMe6nt(=mV*S)95bBjhnx%rL-+-#<1b-t2%(MDk}@p^tUw8$`)lf3gc>) ztohoBhcaqYxwRM+PB9hX`-hi>ec4-+Spsj^8*!5D8*9_-dQe;V=6wC%Rk5WIcm!KE zq%wzxUo<0!n9XVzO)br>MI_fUPL|AuTF&QQK%LRQHnI6LU;z2*&Fg;9h~&N3C*v#x zCAdt>15)_d6wI`GPZowwr%&G}rrG3e%Az0|QPb*CDL`A}B-1XIX-#>bNX61FKJxDW z`0G#cfZfyS9sww_W`yQMtp)s@wzF@#RZ`yzc{IyvmF^ldYRz%cvvu~(GnV}g13HiF z>?10~&_(m6mv@Y&ee>LsEp5E=dUT|i!5R7d7Xu% zU&+c3ylsV?1z7S2e z6lm^E<>2PP1|Uv6tKW!qu!pNYh;XcO+M==BLvJ5VxyoIQK4+-ZQ6z!>V>{-OKS?T` zTeUsGThu9CXrPDx7f$TnERO=nVWGTf2zRB$qkBA|EG08Jlw3i%I=8%OA!B4C~?W8_;6PdHObnZFI2AIoK$8xO$)Z znG(+SrsNpbTOvM=jRdI}NqVfsj2DcDzq)zjI_EJ*!<|ycGMlC#DL-glOv)Rdn`8C! zx4wF#gGbU5p|0E<9=3hBZ#Q$RZNO-jYmwikXP*{%wGIxt3>eT_F2zp49gTey$c<0L znri;z;E_98Pf;BAaN$38(1&LuDjr5B;fA6M6Gxznvlb)~mp}gHP&B~Pv~((0PRzKr z{(jy-RjVVeB#(B{1G0fDQ!B2k>4WP$pcM9!)2fPjU3udpb6czyIaIBIzF!=l%ZS(qHqi{9P~OWPUa48DCZp zEtx;xF)1eZ4daX%TtBO|qsQLz9|8#BZg+*EV^YPze}G zdP`n6$JS;^fN4*>WoB2V6I+rm#5A)vSpVX8#cBOVl7LNHeV{e;TqLE0%Hbe+@C7GUF|NPMEmpEOn}c3B+WVpL9*RAZwbC>vF$-#* z3ycugvT|3SgSqS6_kaK35-QX88a3R7!f1`MLcwTSl1>~hu5ge`p0%HxjC%hS#)@c- zi9It{C(<`6w$^)9fY$l(hWtV4QoH6q92f>Oct8CL0k#~$-BTYrg z_A0JL@?h>ZF?G09MylqSv;r2rnn&Xl7f2pQ7f<{3EsI{Zn;zDs2;^**sGXfb6{(I4 zzQJ@tYb)&YdIdL0mC``Gw>}Kw4e~OBs4EE;vgPf6bJ#?pI&W)R?MI|^#k2aXm)w0< zM+Trczo^dvl1kLz8yT+_p}%>RmHLIwM3L((sm=(Ct&gPwI#(dR*sJvRmy$;edgvrb ze4#7K3DE)E8xvmxz5iCS3v@|m8aBsk`hebdzxlA)^|a(Je{@Oe768sb$LUyu$%r%U_p}ZlmCnRTxu%Yw^oYqCyO|=^&jtl z8|~7$|6sfI={i>UcYXs+)O2*Yb=_j+0$6!Dne31(Y^Wo%sd5>4vwU56lyPI4s!Im= zI#P-y#8IEok{Yk~7yoS#)AlKH_m)b-*njS@d#EcN<4TBB| zoO|M|Udi0ze$BjY=HbMy*#IKlJJORKie}vvu*|GQNfR*&M;#GKHI;fH$XoM(6cf*< ziKsQktwl@`tMH2utPo2rEcXd_{GNYEHqQA$km^(SBz*`{<)b1}elV%Ai4bfe#W~nj z4CFj(_$*9x9!;p0!SuhaAR^|q#xwg(=Dj1v6g3zD|8ty(-QroB3C$c#=3%ILlc5tC zl|}?sBT;ENPHhk|MfuE1tKR_ujq@x&S<1@2VId!W)M8-rmSMS}Hm_3_-(jZPB%$mw zt_-VB@96{`7paqn)-ik>nm~h(>kmcrf#)AITp=xM4*yv%OAZiG?(fiFkcTGYvogZ5 z>s>=ns=~!{pd*i$YRe&Hluj}~|M>o|vZqN^yl}A*65b!F()E%LWNb#%4pd9ngAMna zaxjweS}VsP>mFRRjP>wyoPwyQkt3NVi{qiWIX0-a=X$ouV{62iqEcIsp0zsB5H(q~ zGP0SJ`>V$tmaNWv^4M`yXtVMW3S)`bM^(5|VE|}u>x-SonKu0KlgS_uSvX_{vc?n? zQ<)gW&sZ;`m^>!;iZn9b5h}!saMc{I93m#C0v$7QgP%s{ySW9dHcxGN@}yV=0{2oA zP;~v#+Yd6ctvtM-mXMMowrI+{=SLRVpgFVbjC>_4Qz$d2f0Gwfs@$CA6MhVfyYm@2 zinD?fm#3qkzGlcrByrNAHfJqZ0Z-P`?h!)xAVVRzi;!=R$^H0F{}XhlEyM@C&S#Pq z{{``Mn*p4|0Oa_rd@gL{$73l;HD6!l`tw&UUaroLnq0Y(BKvujSwH!@T>OONhY$9O zBp_3->nE)ikJo1Rw4%B4a5KZ;ZD=k9{iqt|&A>tlh&=8T1A{C~3B!$`+Y{)nx}&{y zCQdh*vwrJElE-Zt>I{mTlNGOTq{-E5mnbFknzu_rqTVhNQu6j~`MOwTe$(M zezd0}9cuv`{{#Z8f6|;4;U%2SvGy+5 zE_ngvb*yJVMEwq{iVt;=IT2k}>PZz&%3Xfu{&Mc?hA1=Yl6yWK5qBQUIeTn&#$9l0 zEFy!eeejznSw0NIQG$=FVq(W0kHJPn{j(Pg92o7OZ%Kz?Y_4W8Jg4V4H&!j{K&%Nl zKG^wiFr*J$M23dyV zYx<5$lCSeSeGekE~w{`0|zNe|{oC)m`{f-EEpBEsm1*wbC5XnrMV~g~-1jRVm@b$*HeOn=;^7kc{jgU#8mZm!I)>DT>x5JUQPztc*tfBEP3LmXMtzY>Ig z`q%Mj7$Q9*@c7P}{>4GfG|I{Rtf$ocVhQJy`G*q_?{9fOFJe6!V|svRwC8NhxsGol?TER?SAomd^D0=IRikt(I4DhV;gK@6g0qs$|~UZ!6Ktj`9Uzk zhgZn85B4NQEjqcd7UasZC0HtCN$Nzj2~nW#=AzUwEw!+3&==EI_$E(Utg2CfxGl;O z+ZOo&wnaXD^9l{w(zARC3Csy9P_5ECGG8^}As-iieE*@mK{U4n;F>fAuT5zzdEH*w z<>iXvt0%P(OBgxV6Y(`ksdXE}J}t3feQ)}2HaT_@_r2fb+w~B4D@oi}4!r2CY%E3ru3eXurid;(L0`>Q1HKfZy(mwjk8Mt57Fr)S zAB5N&X*~tQR}V1Lq={*8K_)sla1(H_4L?5EBAs{|4Uy=tA3vF{@+8(9ZlYx$qx}6! zZ_U&w5GBb8(%1T9?Bypn<;hN-zrpFOtX7))`TfT)zAD|HIPutEkucd>Mp>0Z+zn>q zOTmp+l%D*gve7@Od`u&50;B9AyX!8@RQIftd94nCeJjaAp_*Oo>LkKiTsGpjP7@xpm;MLPxRp9X?8$~ZJ5}c5$7D0T{Ci%i3fdP3 zE;F~6hWJ1DyDsJ;w)tX~p}@!2--5_HopDhSC%7Y(FTLRML+L#+JAUZ^2OWUWppCmb zfNh2gPce8}LPkE;mUOG?N*mOJEY{$KatX%Udjw(+txGEIJ$Oy;H?a+t;R4%+4|Z5Y ztuauO*cyv#<)i3Gx&w3Sya+M>!Bc)1ydSh5k>S~&z=DjoD!Le`DMxl9FYZG&{17j{ zpe$c6LkCL*wNziB5DD59yY>W`c2G)O(;QRFm-ZC@EkiKjF&w307w*ZT3=XDzXfY4DGw7;+h~hBKBTY}h+wYIdVn{JnW!?i`l`Aw2@Kw67^<*lrh zqigN_9K?oLn|=*d3>P#^lbIY@iw|E@u-9*6C8Af?o3{6~DksO*9C2EZ3u&2bQ3h_&Qu@~0FcJEYcF z@aV)cgWsvXI#~~t6K_n{v2C@P&a<|g*>+r)C}%$6IhcIg$X>5*!Rax|Z7cA)&YHbU zfNnk6UID(`+bj5U75vx(IfvAAJ_BWA1Sfwq_(juA!SFqkPo%JKa6vlhpCJ}$x{5Nn z^)vU9ZT(`{Sp$gAfE2qgS^tBMwovI+!tQ3-~7!nHSoon>|&*McXFp$r$@KU z7kjgdlrLNF2ig^*(&Juq1e5`qBs2Qq#B3*78A(0m3mPp}%j}tx_+}maW=(8PNDGao zAe-~w0D5;u24|Aj-&4!@fVr4VEs&>n9 z9a%`;jdWThJnX?lBtl6x&B~2$C))CIU0sZ&gT~2?eR1=cc_b3i=grwAT5&dRGjb$u zjj|<{>y2LIhr9%Ras+uZQ-57G^6bcnI^B5rTyfexo^p5PRIzosGfyv1G%;zy(@U!aO)N?zn1~ z_Ujg-&?~o;xubkT@Fe}THDq9!^^||E{#7m;rJl>1rp0f!$u!+6SL2J$$8*F<2*@KV z_q#+*xP9_s7x=&Ee_{rGTmELQTrIA{(@}VF!U^xuy4F*@i}L9gZ~pj4P-mDId`KYH znvgHK$c*;kF8}-^yNr`V-2kI7vS}4E-xNMJPZLIRlJfg(QxJ07CmC1e;Uw&24=Mj6 zCxPVKDto<|jZHS-3R&=Cp&>42W?B#;VT2Ug_p|gQzIZK)o}301#Krx?lj*kgK&cfO zny~N3cX_xH6#-m;7FT}o$*N6R;&jD0`J*`XCc%Re$F>LP!QbStNo6}))F+?(t_*>= zQFhh$v)0z#%u;SwZZ1xidw$TuZ)5M}Nky#2A{&4|=u3f~T4aES8hZMuQNUNmkb(ol zfXVAZ4Sk19-8#$#95N2o8WMslXSM`t{L1?8=vZ=h`nl8QqGWj2x0OUb%fWZPx7zAj zpBFI9)d~(xlrp@PR;;R&RXn~EE9QT7%7g`Yd9li~_Kvv|iB^h8v7HU7mg`ekk=BV~ zMqo0ZRmW>BVvkn%@dGJ?e6a_!^s%Juu=fchR<=`vkK!8^CR_fbW12Q7FsQ_85q)J! z#YoXr>&}vqm#6ym|C(S;^cVzxidMxJ+1= zpm8zN`lR`wk>g>ef)poS%Bg1hnb6L*I1#rs$u2Iw6))<~VsVVRd*J15>@}YofWLk7 z{_ZFAFWjf8CZnqDuhyl`yG?mnu+QKnu@r9Rki>(w*C4vFmkN0Rl=UloPwk%!Bci~e z);Q_Yg{232j1t z6#~U2vn_tLAPdwL<|i}}=O}RNAiD>~3Z}SYL1b6c6_V5-K6OWSHhnVmCH1uHvO)=bS&49R(Y#3$;^Zg z>c}rj>oYrVKh%%1TmHz%`EZg2Zp_f{p|p2_tU%d` z4W;y2#*JapcF>MU)5+~C5CK>TYOqm#R1PjY?;#GP^OCA_By$h;87!x@-Y#NlgZr#o zU+d$Avzbuf+QqUi%+}kKI!z1}c4rV$rOi`e+p|=?HlXe0w*Fl>Ng3N&r?TX2&~a2d zM$Q&dxxouaw7R9CrsaJ%PgE4%{Am4c)qLc{>QTp9nQAg&6-_A|u#kiD&d1zohe9|O zYfGU}%8+d&OzG8sR!4tzwmWK_b(-gn*35>=wf>?B`Wx z=k;H|x#?uT)n7BY-i>s!3I7IhBG($pSUxRnvXPWGp=G0en)L9a6bgCb;i#d&`5a`` z9kLVR`K=eZwZyndNqNQ9W^c5U`3m*Dlno(MYQ{CZRer7!v8P7+K7*yS=sKs<3oes> zT`e1MVT=Ygd}7e>f!IK_x3*5I|dIW|Y{ zx5Q~aaaNTU4YBT+u(wOJJ#CQgM~-w1%HNKe2RZB_}8i4(2iQ?u)o^yI=0 z%Ic33Exul{Yon7nozX3bN0hK~U{MG3n~FAz1s@lbC>yZVCfiT6;U<){5=Ujk)jI#} zW(>cukDJ4tjefx&z5n_B#}6^oXr5Yy_gEz}EfS(mKv{Fbzh+Ef%F7I` zCbAHVceu9HlA8hut35r= zgb8j!UZgzLbYReIJ+dXvIyOK>P-0lG#6|_O0)Nh4hY2fV>rC`*XLl zAKRFQ4s_cfSG*Q!R||kyHgx)Eo9ra4a#NAk;YIQiDFHi%A0Wrl?+}?%k61%KGklvA#Zcj2dCVZ-DcatQ8?mDD$K)bNVs5; zt`+1#f18&AC@9F0C6wLLgu9J5(Yd$8?D+e4vUQopb64)d?lP_9?!$R~!oLVH$Yipc zR6B_CZL8cUcT@;AcVW%l@61}gKTc#T({)x_Pj`_CbC{*KL%~So99-M_#I8j^owFeN zE`@x^GY{YIkl%yIlU>B=dI*#4Sj=N~LFUwwv3j($i59i{)spy8uHFwg0&dF1!r_}X zpY;{{+<%$_(wB)@LA_K(Be>WOX5AAhh8Tl4EL zN%~ii{**ubOa3sg-vzPl_{V75m0fML-D+kl!Z6#8j)Q?;CAENP*pfrtb|Eg?W~^uC zS*EKJzkS4xTSzPjGB%ikV* z;p>d`#S{MoIH(@8?_Iod-(VkJCV%}k`>6;E1TDQUz?NtnR53vy3m^b zXYvBxfyj2t<3o~%V0ra}lkC?t*~u+Sl-vd}tTIf=nls0sTYT>2qki*ZEla>l^{p%( z!l5P3W*Ui)&#^4KlT^iVoFsNaSb%iIxO<602$u7k7PU_-I8|}a<8vC2Bp8&R(}qvo zB9#6or#7WQoE`2!BoYdEJUxJDfIuTzp?O(}dwaSwD(YEvtAs$+lZtz<&Y{-FE3bif z_`Ai1T0dqv(;(D#C3&Gf2~P%~_FM1e@}r)9{u1*<)HA@QO71E2h91$-%$H!xQLvE_ zb26b@uejIijrLS(h}%#sf=xPVUrk~<_?1CnkvbLCmm#w*D;}Q01CkR1t|@efu)R`g zRrW`x9}vpZBw#!Xy9E5P^#SrxN+yXlPb}Oq|NKLHREdJI5_0$C7Jz_uo^{@}grHgR z$`Qb9o#o3B99V$r2ytA>G=`Iv_X3<-$;QG-ZjY}WG5iN}6a%@P^SmYPfroIkoaEM; zoQ_u|VZDiO{Ts%;wl7a|PkZ`MT;eCU1hhIEpV$a$ny_x4 zlSd|}+pUVj{A__;)=h8L`*8yd67i8&wTYCeXB)TlXJI1oWsZjp{A+F!?~I606cDbi zLM>T@(u{`Qb2Iy57QWY?f_ ztVSNl{%27bAWvuA8}Y*Bq6{FWzpuYVm!$gGyNT1JF@c(Om0ye)$)8f5eXmr+I}=5z zX;a6~1DZ|+(S+z^-ib_%LKcBRpmsjl6N5d%y?JK(@lSy0R{Ds6SJy2pK$~diHw4CF zudQUP$L{^|md*!xwcB&9CPBws)}dox=xhrUy;<+#u~#6Lo^Xn+{jmZU=vjwa{;b)a zP_0}d0GX;p1{G!C=61Mf%>QgrKcEeMYvxw;oy8k;CeWd`n%<83D=upYEUJkB*&NA!R^{!dOodU?aHJzl>Ng3eO2=?@9 zRND@PB*p8v*|Xyjlv=|fr9qrOZrOvGlbazMn}P-?OqIF~8A-*JU$3yb4a)XzK;00n zg7@N+xph2mk{b0!3D}mi1qO!r;bxndCNbWP)S_wLyiE@Ym`UtdDm~QC5J@z)IGYwm zDQ~456fPN=PfWvJ=ut{of|W^@g_J6*elaZyiq|K@g0czp1+u>?Fa{?(1w+d5qVsu< zlwE);&PM})B;Jm!J_F>?OO<;eU2nz6 z;EzF(?m>*o9_3P4zQ_5+BLk!YW9CZ=9t__sI3Hy6Be5G9Jww!a!w;BtwJZRu6ccd< zz%scw9mEz#?kPf$uZNJME!4($N1^qoks?z>nez5$T;W>(3$xght_ z5^<>+HLL z(`7%MdW%A=?b?$V>{*P!mg3x-+b*VVG|EVRqS7WF0x%SoLq84n;tpYJXJ6#E+M5+t z>{~j2z19Bs`3JjO{v_AFMNngguT2W!nk7EMdd&7v2DKg}C6xJiI_7Td`OnJAeCO_P z>vqUmkUfD_@)uGLTT~Vgl2{#-%BurJD-_qs^CcaDd|NAuwBI~3W+i^U1=boL`_(4b zJx}LJa-@!Rl0!E+;VU?KFE5VP=~^mplz3s80B~~qsgyz1*e(0;q*?sUFW4=aH+<)> z3UVWe9J8g+*rr_JmY0e%%x7lrp{~YAf;l!4bn!AUDqi z$T^|-OiA=AD``cwRztP(N6eBh`| z)%i@8yNvxU%-(Kt97Iogdsl+Y7jqk2Soco(oy{POSxxv$# z0OY28%<;?t6Z;6Pt97GMe$#nmq!Hcrhr-@hc2a}pz4DSrjmH8?f+N$2(xNBNNuZHJ z4`dAO^0+1W>OSH86rSS406Ca#*67W%1UlkA_^MBiuR=O~#-Sd}nSg5_ZdZ@y1qE zVI@JTmsb_IT(cZM zi2&qrUXZa~P9afmg3!rKFCr?@uta@S1w)Af&XP7wFf)mg6~jxAs4Bx zaN;bZhYCH>%S)FHIB%%xpd#v}yRDS*OWMeiNy&SSpI?~L`NDB9_hXCozn8EDoue<->Z{#b~Ry>Q{fCR ztV1+-ME#jDBd?7Bi!j=ogWvS5C9G`T*~TSrzzv(Df+GbigY9dzTPAx*S2q`-q=D=h z#6lr1u3$F~I-R{8=($ri84Lv91D{6#?-J8S6H%(uYVHZJ8$IEYcuwTnfVi14D2pA8 z$;TZjx~gBZv{~^<0>m~!o!q)$XGXCN!9B)b{|3HeFB8|Pp75EKF_Mwj&8=u821LFD@>EZ}} z^on{Dyz6=&6=CaXYu%7pFK=IiS3KRpZy#CaNfZ6HDcfu3TEeaty+cD`5`h^C|A0`^yPPo1IfwK@=G6u0w;Nk|?|#tV>{jRi1fmeJ$8NVxBD$ZhT{b^QoZTi+H!PXi zWFD>pD#t!7of>z(j~4!=V_YP4OCfSIVOp9xar7(Cqdtijxdzkz=bwV~_uqmfpo*vcUr7qA zlFk(DU^)c7iIqNG8S>9`n|S#o_d{avx<9|IvHtJsAa~8b-~Z*y7e)q(c0X~iw~FO+ zyI2nU>bjr5IH~DKP4S{(m-pXDOpJ%jTE$=T$zW9IlPrbb^(dgl%D00!dW}Z%4Q5X7 zqu_>8hQ`&(ngc|Us4L<6-fm}-NhLx~I&ytEs=!wc`-tFd@HkbUyO86KV=jiP_WTsA zdE~$`q&ScL(5^HECH{>M@Z=!yDRPX)!bI>UVt2JJzw&DR@MO~hKgxZi_$?gPY{mhx zUw<20;9%X>`kUwhbcMJ+&&EoaI%pLo#DRbP;DN)#mlmyD3(O0Kn&J>|TBkiZ7RBYP z78gO9n;)DlfRW1^y7)n)Wz##va)@8;B(_TFipeX_N^YKcjX^g!QX_lkl{`A)bt3M? z;Wq24yh?-2|7q|x^kf4Nze=BSqdA1e;YO>_#=rml^;1$w0GyaDf)gYueg>4+!fTvJ zoj!86OOMesY5=g|BD8 z7F?5<@S;`LI}tG!r@>y;qzGS9T3S0swmpJ~Cc>GO$z-LD)mz~3x3pIF zmv%i(DC$Lz+6YP#Or0)3Q~H1a3lUpDB=7mVE4(@haH_=NhUh0XzIZC*e150-J&-jw!6%3(7E)>k=TCC^ScIQ zf3N;c=ZQL>N%+5e`IHY5#aj;RU2kx=*Og@Jn}^>s5Pw(BB&+mIgg5bKV-S_t%g@P# z(3UvtgFBVAA&YBY*C4LH@|wXr@~7~^xDy4B9XY!xX6R{}vmcNEb9a*z^2LwhhVD0= z%b*>Fjr-bL=}L8iL+Rs5Wr`AnDGDAQ${`N`OG8@zA$8S#a0N55HnnyV6{01bIEL2< zDb$kokgl9uN;fic1B4jaG+pJKxX!;R2jg~9x|P^lw{OfF=62ut4gb=5@m&z`mqguj z5=Fj{{%MhSJ*%AQsfe-R{N{+?_*S;ouHrzxIdQW`AX z_L{n}^fx*}8`GdtAMZ0*K!}n`y^6%d7th)MWH4O`AtD-Cde-DZahLqmH6|c=~4SxnvcNS$z7F zT04wWJU!_ZEz^cvEQi~3=|S>z=JGD5*(|KrtKkp7nul;WU2W4A&o5gMr3?&rnOu=W zW1tN3o>3)1E-NB?k-l*{_V>CWeGGBe|Dv)*a8m-++|74a26yBdB!7+EHvx}u| zQgrEw@z{f=+_c`_!%gH9rQ)=8{ivgwT* zeP*x6?waR5)QkF|QQ5`QViL9YCqy z;4JH96RoGNglLFIN45-H;vcn8*sl`*$c6I3DQtL&e_JPjapz`6!F6s(&vWB*>b;1T zo)H;VzroUF(Fm|N-L$%%fuznw&0&ISHHduX$NdcPC9hA2yzt35Ngsk#Psb_>Kh3Kz zXk3G&u?L*A4@qN>D71Rc*CaHclg7sa=;N~{^1)`97L@^Q9{ z3`?Gy9g)cwQD$r2eH0OJAc`1a5c#d{{OQ&jG-^HDpVSYHTF>~4TF?0jkRUc+u$z}o zBajQ)^PmvxF+7R&5S~Onf{m3rI7#(SV+r>@6`iW^)Eq58FCr2l>M<5l{g9LNAxP}G zASKrQ7Uga~wWL9i*h35HLy*`*cm76X5~8XE5NU#6_zZkxFQUojWbb@w;d+uUtdmxc z@=5!Uw0fK;t)86}a!j<+>la8@M#yWcVM@)-RjxXzo)85mGL%ihzjo;skvLt z{W2dsKx{z?6gDQ{TU!y^yPS~xRflWyoy)PJDObk#YW%moQnA-p`keIes~13PtI-b9 z(<^In?Y{Mw>c7vR=K98HCDUG9=C3wQ9$~H(B-Bd!Y!|XiN{NDXs?7!<`z8~VfkFeV zF2_MRxW%-7)Rm3b@EaSPbr{%_V<%(7o|WAhO`tri@auM7_>G#C-vzCRtF71bnnZ1n zHHm2NHHowC90vO=i8&$HB=d*X+?(22w_bnpQ8A3Sjk%1se(z?!VM@fy#t0%da2q0z z<=>{AM|N+n@9G`30pf&%R&I@qy4ZH^i)glnp~-CNFFwUv`kPPjc5Aww3s2wt`2PKu zApZO=vgG|QKCRv$c58Iz5R4_8$?Q{>rj|EroMq;iM-Z+PQSu-!)X58ZOL76{K7H#R z6&b}IO+`r<%JmQ(yy$E+ZF`si-*vUEKt2mLo#LWS>i`#3jScUKbp019K(%zi`>YpT zZOg)ONUWA=|KK&J;AMkz1$dX|h7f(uB012vp5+qzZgk#_XYz6V#E#CX-fnFPBa=*2 z5pC#TUdz>3{rV>tjy{vOezajSp%-1uNQJVa8B2}xiSyznJ$xqvu;8qDDOYftM{DFz z!PH9S`ED`pZgG^>9tYp|HufbC&B_F+7Z<=iv%+o8gSejN-Y?((7MrWTnzoh@-u7hV z)drro!)UFj1L*BDt|1CWKwk4A$!(^-t4x0)KE%zYCr$s4?|=NwW_kD$56w6OR>-|3 zkyWrYrep8&q?d@V)2JqqJ)@|^e6ZxkseeB6fcVCB-< z)AsW`ki}ojBAn6wLTk(3lcFIZiCZeYes(pgrJqTLvs6E#Wf5Ckh-@0>a&=Q3_4Pi5F4e8_ z*`Vo)?Nm~;>y=d4Zri%nXmkJM(q6f_Zhi&2^2t71=}?`|0f-CECkiP^kLJIA82`K9 z|KL4P^aUkElmlZaRU#Xb(9mT@_RjHEuJ$W&v(Of5OXxQ5>XX5i$SmzZ5CaRi_GA*% zi`;Oq^0kLuak~4NMR&5MW8Zvq@p*&K2llmz%8bgs0sVGXXy7{>z_|!n-1E9C9hO=% zj{U;LZBojOdZ4a0P9BBJf^2J9D-n!ldQOu#suz@KfqL+A5y~HzBo{fsr99+bW*EV- z^0ijPVKbZ;P!~m1kjD4pk3YZ5uf7&Uk6@3D1VPkx&^iWHjGgovMU1E%Ny{%D%Ba?J zOn?5##T25|P;;f#Hw2qczgwse&)=^eJyl`w{4*#^zs|egDozr%tX#vHBOo}N75lxOJS!%w^ zapG7{#*vZWN+0r8XjsL!(FVp*{O^ydfe7nrChf^QNq}gca0U^+`--Q5Fd&8F*bls?GBMrMx8PG!u{=b`;wVG zc-|t(mws8Ke5MLS0+(=pNGQ{T1bJ;46!xZg99I0qDuQH34$-dyJT-C7>;PRQlaIl) zVX$X>zgQk$c;aREMO<0o1Adm66|+t@U~gLmU;V{<7VXs7c}YSblhGPUNPJ|YL~?>} zyC3|3BjSqNH>Q=XfB_JT@iZ}#X;lx@CtrE=$;s~-Vy2(_hzrLUJEj1AaZQS4TWV|K zSdL<~#e72l7U`{t7QjU|3cfz^z>1@!=gr;4=yGTa02tc>%~g5m%^+^H-NZS9U34Qo zOUB9i)mbe?3UoRs`EY1}Y)Xp*quw8WCX3);o@~<7?LB`p^?U3j!p&Kpm=9nx2)gE9 zc56lEZ=;~b_^mg^698c;-kF%KIkHA}vqiEL>3k?xv`BOLZ6kKpQM(gwPo$H9wW4z4 z|ErT`wWC2yG>=y;-5`$S|25|SXepmrH-0xR1`7z{<^%WT6V>O`;wIyN4)T3N`TVNw zn<4I|*T4RMF#g97W9L2mZ$>eYw_fh{t@lbwG?8;KQFDQP;qawjII9olf%Fq2PSLG@ zh~8|Uua7$D0cjkG%q|H53}~L#mi&7h8~pk9c*a{w2D|hj3cQ_cCD`M%Gi&MyR9dDO zqb~eraS^6ToUreE^bbVHB~U^JlMYmm0b$s~#Uk!_L_TygmNmY3z27A|ir;mNHu-(G+GNH3%``p3h3E|2lokLu6N_wdb{my7 zK!1~QyFD+F8P|=tg|VaWoG0740Ngk_f|Rp~zFEOA;R|>^68)o_N(EAh#t36n3I-Wv z;OU5f0@wvJC=!%L2iO88B4T#(LzY5#uKtKw^JQ#@m-p@4gWr#mO;O`NG3I$+#S~!Q zpVmHKq<%7nOtRMJuxYMHKbHxpv0I61d$Rb=Fjyy$ct5!tfYqbqx}E!G{o=-gW?w(0 zcv9`g8w15V%BSw-Bi6>knIj%s6K9(gY+g@_*DNmOc9x7)QowX{ZaV&q3#F2JE$(-V za-b~rl&C{qCRxs$7_@TOhb}a^Om-LJl z-JG1dliHAg6P(GcukaB*5~QAJaH4*9r@NnR%^j$U?=dh>{;8P%4%HG3%0(?MNSuh| zMFTS3>l?a#(QagSUodw02vLV@^1T_wTHp6_S0Ts2l2 z&ujPA!OUkhwR*JB7u&#+f;?~p#YF~At;~EHp%Wc;LHLM5Z{V%Jw&LO)LCm5k22tmR z{&Cj4t+!qnO?=>(16)J1j$gG{eaOt?kx`fv&g!EoD^)J?eP7pqMR1nh5|8AmmlkB+o_ROeaiz#3U*S#)TIBvoj z{#K`_6V<~3YmiH^0+UfZ9Fa*&2_gY3{?-2P27Jy%13t2i*Dxc}*t8z1 zxc~)CoB_muwIgRe<@mh4sJ-OjM)Day*>KsSxJJVRSjub}MO(slYV|7G-G5&Ggqjn7 z!5_}Lj)Prz*i)SH>^W^Fo0_b3{yaKL&Bc-$Wjgu@XW-gWw?H|L&a6A&4aMUNx7W!o z9VfVCr(Dl|Hc6$bo!$dkTL5YbRtv;d+K7N(-sbWD=;!fY{T%v0eYv%A<{PlNjq*z} zLo7V^b--i9ooR6ei8VuKKtI<6lzXku(L!@}0$2>9i~{R{`HW-w{+%6CG5z=@R%ZI~ z*WYY|5>05}F`=xg`0<}S`;BO38BOx$feYUzjP)VlJ~D_xomAFltC(ZmYecO;_VqXe*h-iL{=w0)L=g2oB32A znfKe`6e6FBQ*RezqiJV_L{B2CBmm-KpTM)4Vp9$dl(&^asBnIL6a5vcSe8Wo`9ofM zKN;-gIjKLnX;jD!seiNhjs-M#>&Z%VoB9kJN&`PL^ZX|Rb zIH(8v)Ed~amDb}Uh})bdHc8n=4M<`MHMm-q4=s6Z{5?^vu4rjSr;B+{rG%{P{YjT= zFc*LTKE`|zT6jz{kT#~Hl*h%z@8umUU>Bj=6EcFCp z$)fhillwJ`g3loTLyCWwa;x5(62CEP0|-EPVBxOJv`%Z~;yf1sZ>2o7B&^V0Xs+F^ zKcF1JI;*v0BARzR(vpG_)mC^fRZsbyw{uw`3uBac8nZOlKFL|?5HG}bc_Awmc);il zEGiZ^3cBqqj8V}O%@9eu-aoWSwDAj1zLJf=Ufc6?zWZ#DK%)LL7;em@nu*0sjD^%n+nGJ6KSQkZrZVWoU6iwlyaTI!FswFGh9zSK zaB{udiHhpDTgq?V(|42qU%SUI2c3#6U$gu;IF8N+@_tqVxY3NzpyWc_UF_VO@$8Fv zm;@shAkBPJ(AiAtu?cUM2`!*bnU`Qkx0$Y0WPaf;=H4D=(Uu6kAU%yfxik8&Bg)0o zY2B7wAdQJ_y!IdZh+(d8DC6SfK8u^#E{YismLJk}QyE{KT5_~!K~ot`1>OyzZ-?d% zBW^}Wo6$35a{QEAg^}1LXL>@~#vJ8B2p&k^q$Cfrt7niFn@G6VdJKD9DWYU)fACul}z@xLR89!<35xb zv^gZNJ}kac3FIX*@n~l*)OSF3bG%H_9udF3TyF)NW6rk!E8q5;jnV? zzgTh<0YNRIoc33a*ssL9(X_$ycqqU7&2#Kw^eqaUApZ$Wc)OR6%N#wKOzJ}`0YMzv z;N9Yp6*t;@huT?IZDc>POGkf(fhznlxM6TIfut}ud(ZmMnjIBii&I|IV0^YXQ@9lN z)x?Jh7g-P+8Gt8Pkk_t{NZOJS7!`67D2M)v+sise;P$gc9{BFMjrI)UIK%*um3Bt7 z$nx5S`Ng}=pLi?rd=Ax(M|q5b+mt*E?T40(=RRoV$^6a2Az;(9>X6?Pf^gv%GuIZ`&@-x!HRJ;hc`PeKcOZvmT7`|VHGYDU+cNsHpqP4W#jY3M^WerQa$*#>KU zJIj=bf!0{_pp@(lIV99g@EciwQRxMl8Zt}#2K=s>4y--*bf74mg58;95Sy>{3;ruV zBj)yuAb!`dR9PH?UyDS2*J?Mr4K$jl4hL?&k-tPq^iy(D!I}h&D990z8Oj5&O6hM) z+hi|y)zUXktrAI*&IBdr3d~|$DZaA9aKq#1d`C7ZX3d1Bg21exgR4u2eWvHLL*;0s zf^kGyX4D_4z!^MEQu=51XH1WOR{X3hLhmd^ zXz#L%=Q{f8G}wD_*6*+CaZiUhAEwUj=uK?x2* zqe^&v&1tohO5V^!- zHo`RU__pALdoG-44=pJ|zFcj7-S**<|BtdS(Q@3@wf!RX>M2R*b0~?HXbn_xuuJ~> zhfT>bvNo6esRCuR z(<#xA8Niq)v`lrlgCU)X8A-LPBqAfe3pO!N#mR|eXH+2onZ~i+;b>FJG1q&E1huP8 z@odQ`JD>`!5*rUTz#Io7yzXCF@?t4lEh{u%F0!m>9_+<24*}7xzHLR}N1_7=j|W&i z$!xit)LNM!szA9TEn&Y16a!Q)CN0vgM{Pm2&4%#`Kj2(oAJ|K}=1Rt(VYU;|S7loa zzB43$6cvV8lMv~HUxK8C96Ohi(>ke@t~^8>v0mK5W_L9|e@h~bS8UGgvMREQwz8k1 zP;U!)7jbIY#aNtEa#Fu=s%yfp4EE%c!O1WY#pJrZK=kr3^Nfobwl=P2MXAI^k-d|Q zZ_ZP+Os&iFzr4|G%N=j!B+0WY)ox{%^Td+6i1IovInN7&*vWG$8=qh2WwJxeDpu2+ zYh)ZW!ezQx9C$jMRHuw!0*JWHM`Z5&H^Zi7-wv(vty&RNuW7~G^?KbYw`SUUwg()+F3u>KNKwoA=_g+LQ3z4Crd2uC_ z*8z7kt6Gtpm|gyHGqcoh*WqGzCtZ`o2z$xTQ%*+kg6-Uzd^^`5@%Q8eRE(J~pIBwWdHU@E;K8fD))@81xJFrQR8E!dCwDOf%N-)AUzJO?J#Cq+eBN3erBK1wkG?6gW z+5i0hgBOu2#J>eG(aQYhD%vI>B{I+G$Xi|XgpB+}tew!$R`pqgi<#{`78C_0eZnFX z%CKY(rksO6AuDR%`6rz}@k!@u&If}(G{~kgkrj*T2o?eSNn#A4$!UXeMlxh!+Go@{ zdssw#gCRQ`R~q&FBMPeyY($(D+Ym*e3N;1lTb|<)-cdUi4=(Dgi^C+2CFtN4nZGwK z^%g0xBW?4$M9v`k-U7Ez(APY-hJM7bmI`Au^WAWIGzv~@M!KW8FefT4L*PlXwSq9D zbGF$2CH0&RmYZW~Lz!M3kg{wP@IgGZr4U)3PfjV*6mL1xo*NCqnc1pFEN~@?=tCVl zEAKmNvqyRi$6P$AB|69$MMCUpVo9n*3c0)6zE`xc$6^`e)$IqrrMMZg?4Y67TGY*S z+vqLu|9Jb*neZ$;SF_rY>-aZR6)n}&>*2pS)A`vmI7FJed*aDMxA{{07jEoA{8n2BuKvzkmhvW`B|sOxvzAuY>{RT@MgeNM46G3Q9Xi+QReG<ZCpqa?V0v;eA_hVlQ= zz^$vlX)t6TEr6t$)HM2M6Fi{#GTSdY`rj>zg8aXlO-&!{*dwy~LW+DK_0_Jgnm)h( zb&H6SN|}_rd_kyqRv2!c7et+l5@mS)`5;E ztG@dL@oH|$>s+;WoQ0>WP+b~b=9+ZjkTEV^f|~vNuZ-e5SqML2OQbNeC@=$h?9BR$ z6^;kJz{$LZW-7CEt91g_@z zf%f69=q^m!AXx~5XX@m=s>$XxP~?3>COfK7cjDWlm)hGNOC5S~=%?S@8@|iZk~^JU zPv>~OT8OcAXT<>in>#!DiBO-vAiOa`EeeTHk8oal(pihXQQvj#C74_&!zsRQHn}*>XG0{cQb4_86zq<`}O0 z0-=zR0TLx+cAF5x?k6cToFqH-UErjxzX+1Nasjb}o+aC^;$Fo4jGHx+AOh3878^v| zm)6g`se-Fa#GO0M+^;`>R}vhA$V@=@i}`xpFTXI|+x`Cj>xV|Fduo3FT~G9HZdc$^*L2EUl1YYw2^z<~P&q12 z{Wj*(aRb)Trp^3K+>x8e9_ZFP@6QG0#as!zWbZVQfht~S$|yvtZ_>4rFj< zft#nBBzQhpSN^1hR8-zWvzTVJtdWIO{%oq-*oVzcjwJL3z~|z`|M@Qle}4lx_8b*!-tg=SIe{GK+bHF`Ib!( zokC$Kc9c;>%4R#E;1+6k6P(q-cN8=3@P4I&Z~hcz0}cTl39ymE+4HDQ+7*2i|oBZMhzX)--c| z7wuO2C<#)E-w9k1*Gp}4h7SSI$;*?WUApL$r!Pz5 zBe2vZc3iu*mG^}RejW|*>Ri>=nwyKc2FKRYn&14sb0k^Uq7)*>{Qz}kPYcE^?2Uq* z2d|vxq*>kg4cL>&hAwt9kD?_a@B-G+2vjhzp2XrVB_+xbAq39sb)U!MQIgEI5CRmB^mdQ{#NTD-LJlR;goRQ?~oM%+!@426(quX z;_%GMKn8(FpAm6M$i=EQW{3SZR4yFQhAiF*aX}2*6~x$iVWh&8##zrEbQjA2L|2yy z1WdA7+PZ!~!A|~}xsF&6m52I;LKV&jf+uZ4ehm<&5k7~TQ}%;Y-Ozvnz~vj8KTrX# zhH0wyOjA?|e(t;=rf-+}z0!pt{=1G2YveH>5N_4GwoRKCSAw|f*l%KWbH3Iu)^(pD z>h*3W^On1%iB{ZVtcL|halmzdF5vl0CGXC3Us?c>&3})Akw&QMojt>X>-|VCL=xa@ z%-2ccpd@2t6QE%RAO}n!f--)lg(9W?ktPz~N>|%oLx4EnSd!Bu*v2=DZ z4wdG4e?&$WG@r`z;N%mu76cCVO@8Es;6Pk?wIw2c#58{O{DPkQUX-VC9j_Szia!bx z*IM6a;h|cZ9@Y7HuQ#8>BD-+(4I&-Z+{GytP=`9=;s^QZ=40!Uzt*r!{0x6W*^GiF zqUk|T-(t03#@4~ayyFLf_X6~lu@R#?I-a5lTJYZ=eBMUKHpZC796!?GS--A79q1Kt zkOS;oo!?LLR;+Bdk!Gnrs9}o(OaxP7wNF0Tv71 zFUo;F(=X_xJn;GzE%*sq#7^BJn5(I54q83lGsmuQ-NH|h18AmJSBNO0l8C4%WFXdr z)!ylZNV8SGcKyuTuF(~UB@vxm3B=}a;d^@#BkbuIUYLH~dB??oN7SGZN(5%6{^c@G z;t|VY5fW|X$}L$`C%(nkA|PKl6&X)V_Pxrea47$bLgDoc5;3!cdi;ECzSgg*&mU{?|=A!DXGiIb6@`;L@6?wjpWRUMtZRoV(RHvh@DBXoBI-+~lXsb9q6(8}3N%4U;lGGEGLI>k)a}Tqp%9>M}QA z#dhTbu<>rg#BZ!YOdRZwh))QjT1*rDX6CE#456kxf7XqkyuI0By0UL?S(GACfC+vz z!XWC~wX096E7pAuShnaINNA-27IW#~+mYEHEH6B*go0HZHIQ>s~O#-@I zVO(gxXr9GF^hZ6}FSyLlDqE-@e3zl?pdaovQxoB!-)oJPsHkBcMcd}Uy;TZN}h17ob+$a_B0xU2jD+Or2X6fI+AI@jbb@W*-C z6)~ELop6P`*FL&JO#6CQdw&SgX33nm$gPHgYZ`Hu1BhEm8-p zuWh8>DJ1ziZr}kTy_?0jf>fU)pw!FP`NhP~QiV0kC*^H?YD`K>j$Pq>Yv*iv`|kUp z<}muj10>t>xYNQzWzk+h3%UO4g-5Z!3fFz#Otj7Hme}r_&5-%SW?PO5-ouPY*8W?6 zt%)S`gA=#mbUNYYte)Y8fuj+n$d7tTR#Uv^tiQG6{;Gb3ub4MG3oy`UddlaGSEwS;eg^>N!)CW^dzocS|P26ebk z%ZVu%%?34Eh=?r!5S-0NFn2Z_@QnIPixQ7Qw+K$Ii9ly@GVk2i(?>qhw0h;uD5$9a zSie;h&qB4edEG~6hog>r-7~ZfCEd^U$!rO}xccC0kiSs;Kw^s|zy;H&R`*za{x(+~ z)&g$msExNHLS?!B+>zr zSqo{~*`7zc+3qN40ke7CD#lR+q%Pk~|Pp!b)Qf}nyDz{rFL8pi+ zuA=F%GV7d`QaBFot{T|F*(Lx58Cp4?d72-ZMt&z}V|O}q>!FKoEmmPYdl5I9GpZNy zj9cQ}P!>Y{S?btqoe`wSpvH5aMd-R)_8v>as^WU+R+<^x9UqSf;&^;y3b$8QKr>gD*pY$7YM; z;uiR`%Karn3x-aet@q3!VPsab9uZcbUD9 zyH2bJtaz`gkMJ`xe}!1Tcz7>wZhfl#T(mZq0}hhCJHoCKM^CIhcqsgM;5>fK8*s0v zdF_AmzM-glqzC3duWeR1Lp>vh6(>MZXy! zjl_co!>yO0J5sjlu^iYZ4KOzcxs(Q*cx34S|AiFD!?0`FFK%c?miz0PfuohXVan%n zuQb(RR?IshMudlkylU@3TY?|vWN``nEFuDMe|Sl)cgCpcoL#^6600m$H*v1 zMOf-zhZ3OgZwKr}B@+jB!9V?2>2v^!eH*?!++u|#;y}!L?cJJXe zvjx-<0=}~_QzR^GJa6$3J`o zotu^axw-xaMCBj;RL6Xd^f+#>yTy!sQ!?YltAHhmz0a;xV5oI7w5ww;Pyq z0>^S!=Xc>by!sAlPxWfP@)V9MfLPcMx1}4 zM8FcKACZH#!-^ET;V4O759nmp)~u(!QTH>M@Z;|v_5PboJhB&R+G5rp-?u6M`$zOa zdvLNd9WetxOr}Ob8gLV$13WO$7t*||V{WqJw;|W>Ga_qHfx00MiJ?$xPBI2;-^zDb zDD~V4{Nz zPiE*%6WPGrQk>0}{02=>h_Kn**MSsfx6{d6eazgVMy-^hbJON}lx74UvY5Cd+_0y| z21JhY5T?R@!U1dPPkMv;d{^2C9pH4BRQD9KB^^~@okJ$H_EcZlz*^6w<&0x`7w=q% zp?-cG_z5##n#7%fB-h&(xz?pruVEN$#BM~;_&m7B&5+0^i{r+gIskwS{$S_pyV7~c zGP`dck+*#lfm`#a3@C13_)eHh)CRj{z&%kkBIOzxX{(5AE$Q+KE+sL@-n;tA-xStl zOBxiPNTM&ha#ae(DqV6QmurApgn^tq9eG)P!p!e?kCS)gl>vD=V&w!=3wGm4pU7RUl8$l zyS%vdk5a+oWWja+8j0%J2(|ta!&vxWMHG6y8wC>iqm64cXu(hRI;0UvWnzb&4QR@R z<@Mxc7BfinaxcPGLU$MqvB-dFuZ-0;?;Op8Ojb!MafLZam5 znLAUNUdL7!jZwHWi#>g8X_2Q(k~bp@hU_7mReJ7Ua!3W35FYncEH`s=Q(hH*6PhE` zsy|TdwB@-2Aj?m3(wFabkwCZnyl^max0o)^ruUtP+W@HI1yn%f`J$M18eKd!^=fI8 zHuYoWMe;zkzpVt{0i7)Q)rwAR2N><8B#kIPy3k&rC89;6gFWIRRT=;X>u{lyuw2qiMY7wBudUnDU79Beh0_@L<{GY?2YMmBSM!s?weo)4WKB zA%PGXdOy*Qz{lG9KdcKTq*A2E$|dsNvJ+-8yC?IUA%84wfxW2Sr?sK2vBiP=VrttW z39*4roGP|&8O=O%447qHAM8^=sVX!O$tSx#tIAaYhs&7T+AYwOB!T+V>1T)WSosWz zEN*;>#$E@mBpQc@Xc%J_v_#v2G{&u<>eY**BvG*ey?W*iS*D&7Xl7mWK!Uufemi+_ zoXsW&2c)fgt#&TF(uZ3XfXr~e=ThWJlqp3A<0XnwVYAnx6&Xu@&w;ndzx-sgF<9g-8R}uO^A2$S^ytTK9X;Kh*`REqXBvw4~ST{Uv(1jvYFQJ%JHz7f`L`P6cH1kBPF$Ea2)OQ9F>yV*3appy&te=uor zme5Lx)%)zbv`8;o{LcnZVf@3(j+_UUoZ}3_amn`D@}rQta8?W{7`dDFH9#oh-8EcXg#oy!T(^iU0H+& zRSwq9b->NS`J~V!B-6412-t0~kXNp4Z!@j91YA7vtJxzzP|E~fHj?gg{gElaJQ`n8 zHc(zK*hdXWax|c&Pp0au*jj~+e5nVg+V}G3%Pj6MjhG4rlEASk)R4PLkYfaHC>hlMQVF@N?Y$C{BwlL!YjN4Gds&MLBnRP~99JJMWhg zyUgYY*B8pU7E8o?{a#UEQ7liak~8VGX02N2#}e}q-Jxl{26lc+@Zk7c>rb*e`dT8aKeuOL#QIa$pGO^H{$cCS6Oc>(;+Op3 z_1}6PSJV9X{{1)alc+y`N#f6+KLzpd4OiZ@LX29=SUXx)Gnl*4io6nQHkU@!NCZ7) z=9X&UT|BCXb6e;Oht;L{8_!uIp%0af#g4njtc(R8_1|YAgQEw7JykcP;D?r?eW@Qu(m41AX!F3wWc+6 zBO-s{q;ie^lb7*WI}gY%HjiGr)+F+4RB z5@XgDfpJh%kJMeU<>6N4P3eG-UYt3--Qe#=eL3k)`{c%>$TokB-7LR@gk4dr3kGpZ zl&D?MgMLPB);FQVc>nc_Z4ILRD@w6}dgQ^-BAS({v+ra^$_zR%5UB^BX5}JZd%z0F za~<_Sjte>VR?hUeLl;zJNQj4`7))doT=+!!ds0Zq>WKhTk*4a=fCTPa)_+@o6k4(t zLf%qAN8wF6vddH0OJ;`r)F(ULv?rrDs)X_`EZEfD`%`4d64`NqU#?<`;)&eMuNs3h5bK;bDXzz%(OjQ;2FXDRAvD7-d1lEsNvC-2l^N>eb>~bA_^KTC+=GN!)cH z4OaxA9xQpG06MS%@oG-t9q76Bp7b4=o6^fr7+caF(fPOlmb#$&3vO>*gb>pp@xjJe z@?rKDvtC@M(PJw3k8Feciw&Y8CCExl!UtI!M#$9Jt%|7kxI;MV_lO@s%VT2dAj12` z$w^7WBL=2Iyl8K{}-$tU%pQET<~No7aHNv#rsKB(KQQrQkT z$We^k(K_?Dn0-$8m-69W!LbB=55RU4qY6~Ax%c;#ltx+Q6%9xqVd-w5=6Mo<@kDPR z-6ydm%kAA6yDrARVlv6Zm~a2VWG7(FR9~nVc49;dt0^TlY)abdFD(id)eGLIxQ6=R zQcka0E~X7RXdCHxjm5@N0W7@u{o1hG| zG{BiA_u|pfUQKeZn0Y#`j}+cbmpO%ZchMv>p$OUfYEbNofTx*z;0kk6PLig?uZTsN zv=KWCxwHLGwxSHLA^PUDnZ;=;F#J&;$xe1P3lgoAzM^uz6A=;=2*iAWtFFL8f0y29 z48jp_ExH*!eHfQNaf!;xkdetCmUZ;Pb3|;?P_?nRnK&kO^lq(eeW&5qRs-lzUARzr zSBCOkIdUF$RaDieCdIG)w^;u?qh3}wA-s0bOwD`+8Z8@J6i!}p8uOr;h$LKB?z8NX zy5P9>RETD7=>_t}BC#Y_Jf^U_F}FFXuYNRW$~bIE<1J1(o=)Dmk6yjj%^)9wWY?zM z0-UW1B-pAO@ufv$Ry&zsqIuCnM669`;{SoIJz#H6z2EjtNgJkVZazUy8go&~Dg1x^ zl*=DLT;#SQ?QPz*7u;7RuV+Oz&d%b7S8MxA7V14w$D?-R!pI*Xw2}oERaUb}hiU2%hw-u&Ch9cEb~5D|RO3+t40$`(Km z;#0w~3Y2hRlq+;Cf|a;$2X=2|i(jnPkqxVFwwn;a#MmM~fi9TA*`*!Di*5WNel%DX ztwF{Tt#aOt!&8f{tL&Bwd zfz0%li-^)7Rj)Ba@O7v*QOzu{9zcbsXN^bPvt+mZp!g_=K1QXnTUr)!SE#Afx~rA< zLYI&fpl9yKzMyFFe8&2583Nu80metmALVzs?)#*3x5$(JqMKUTqNk#0sJQ(jy6eS! zJW-X{p#xatWl5ts!raAh_7ZU8N#&c~_btlzvbEt0()Gy3vUfp#BpecmVpE=%ac4Fd zP7TUpvcL+Uzi|0m7@yj^WWRH12=~~c?0ny-SGN~Gp!Ul|pP($_Z^MN(M*Y*6L?!xz zwT-1rWE8_WdfI_vZ9YTw`1%H2_TknQDP&>-uUU%gLgXL10Fq%7{Vv6Ipq*vJ+E_qt zAwor)mF{DwZnMRtXL(HdBioDn>jTQ${I&cgzl%8KicX9Ig1GMH&ZQ(A0Oe>O1=$OL z?LxoFhi=7p;#Q-uY;gLeEqF0$KXC;|P7KACj>}<2&2uzrOeHbj)IIT*T{nsDX?1#0 zmKgLw={S@mNR$dwzpRwhGKaM_8~LcC;?}_z`}5=?Ti_D%VCPwXKDD{ok}Uf2708lOYr5VV6D5{w_{xuSm^O_1t;=CAQh@ z$}1GIWxF?^P`zqS*$M+v9ofMlWW|!znJ{`pGXAqp2 z%y_XuUun^oUU0(?0n4u+`Mx}9g7e> zS!4)Hx2$m0I*5{j>)>Yh=xoYi>MV*J1SJWGT0#9|TMWL$EQ~lnAa^zZg||~2&83V+ z5fvIjRbkKe>f@_lA9W{~vtpR(_&8kD@)tgp0!<2Q0T{2QS`Mq@s{p2fK0|)p&0@@@ zlV&6kKw>>TTX>3ricI1Y5ERR5_jtEfUO)^8l|-=1i^$#&KA$CILeYvZvDxEGj(Avn z$-C1Evka({s9Eg#hc>bgZ6}Q|9DQh3^Dr}sLeej47fC6GH=FxTOS3kb3rAKbT}Rv+ zX+;WF5)imjFto&O?&it?&t}`bj0P@MzXh?xVepMW)G_5zz?ZCKg|sAO^PIVjLY!l* zTFHU$rOw`Pi`(Gp$mOs62VNj6uC9S`?RdmU!I(gWtz1*j!?qTqE)^8*kU5deAE8r! zK;QGOZz4{@K~gd=@by=hzRS3`gZ%A5wq!*%NeuPXcEA?301$)5!AGg^yZH%UU4Lp} z@*s+<-;ZcLCP%M1n&v5J>W56fk0c$jn5Mr4#e_j96BDBTgW@O!gAdMx(r-c#P316B zcHZPx@8%2XeqskrbM8g&w5o1yEJZ_Vb#tP_TfbnR5EH>Pv57@`PjRzG+^kKwWGdO{ za_Dx_$pv*bC>IpG=jH{xc!-B#jzx)KQAjW9bglmt>k9{(p>04fRbdzv27-yka``)Q z7NQB1U&P5s(6+VI8LB@lt4sF@Y&W`L{LB!mTaY24hP=ZwadUoFYXE@D=59e<;Ud3< zVEjbvpu^n%2RG!06_&;)f6G9hU0a@M{@KJ!&H`P2Rh~*V4NuZQ^!zi8iVw$=#eT7u z3N6aO?q^C{Eh1Ob!qN`z1znIy#-P*;>wWE@zP7>KggQgL@U2I?M-<%z(Y~W@@`;X7 zOA1^Xhd;`1J}LzRW+B1BYW$RwzWfHY`sHF+~$zbi_7XL&*s>hD>%@(mOxTa?x zMyw9tNeOjV*t#h^gmsyoL<615nl1F%$|5AEXhZ+kW=fN+jm3==r3>4XpfE#NaF%jyA)bL~V&Oh0j3@FuH=DpL3XkaP$d|hTutm{^pDm6s51D?o9xz4B4ZeD^ z&y=!T>-to>*xTJmTNInmb3@vK3WIAYY9JR#~`1-V@#*>dmhtSVLi zC}L-lf;S;^tAE8IJxFr(Cw&BhupuZM_YhKm=)hryk}XAHEX7fCP0Asdx!0~-BODp5 zK*<{M6#*%R!WyE_3hqK@FbnM`^H#h*u)1pVIoe^>ykVruFSxem4F?uaVo z!@SuO1L{lU27A&bv>A{}Q8Q(oZAZ+SapFXYn+rV47c^*wq_ZYLN4Bh2!d(j!BNLG$ zh}STJjdy5Bz+5glaDU}T11BKfY93otAN_vKN&FuzYVYGmga5_<>|mSK25+yQT`Z;l z#g^UL{u;`mF@)v6Ym;#><&@XLA!d@8+V$D{B6Bb6fOFd>e%NV)Rq`0TGPRX*K&0Y}I zi-o%LJ&8umM;IJG*=w%$09s#=>F}V?@I|G~R$$U4J>->(FFNPlTSiE)g@CP7`t%0NBxDOo_E@_@YXCdzvl?^+RZE zuRdDejo#pPyIa25PHA@|Zg76i?jhHCX>mt6yzu&6_B>>pUcW2=sY?kEJ|(5X0h9W) z=i2>+*ui$3O)D36$Szp1%|f0!)E8TYh$q%UHlcQX5YvtVn|{w+H?Re9ktuH?3g42T-2C&{(~RcQY&N-f$KvL%1g;)$^TAVNRt|0h&7z+E!dQIE zq-Y_Bucff`E}Q6Hvpf)))PYF9bh6NnkDf3^2ZX8w1~`A%x7p3TS_k8!Nizfi&Hcd~ zyWth$65uOXlJ=VMO$X4PIB*fC4n{(t0b-n_kmo}rM|ARLp zyh*-1@|{kosRAOc{L&+_Q5`~Dg_9uzgQcPKhb+J19vmmN9j*(-jwIg3&?!I+-r@d} z&3$OPJOln)-7lfbyMLjZl&D~p0c}h9>XMf-kWnt?5bXB64Aph9uY@m!_|p1i_9twjQik(gVmWaoXI4)uBXq43wDW>P@||T7$-_+q$ODOPO0!5bL(RCfHB0b#8QDx z>|XTZ)@jVG_G|=FnODC$;81lYoh&pu%G^FV%#tab!JVms%+dxkKa|cE^Cph&@Lwk% zG1Gxx{xF=QM8X$xWEXEBBKKFdqyni{&$LW=Oo7{|=I~Kd#kMG1e1aP&`~r~CS~uAL z;3NG2)dTE(L}j2e*;9L$qy1>fzNSCsG%B<5Y~|u?7T2K|#D6@S4ED*U|7bvp_Uh#} zUG1RY8yALCyR%zK*x))iN|T)#?sByN4C1Kd`Kof)*{Tf43zojDh(luJD3hQqF5(09 zb1m1bEUNls2Ww3UJl7vQniiq1I z;Le}S*eOZJC+o#VqR)!18*Lb^sQUHMfCOj3Srg(89VeQ{ydkdS#iurT?Te<2D!twK z;weDtUmOhB_+nK+&2sA9)WLt0iss61X@hFpX)~JMu+3_?BshLmk0|&)TNBiyv{Z!& zgFc-bN(w8ZK`WeoWDRN0q-+Jbko+QN4IUy@fJq~6yhVc zMKES)HbKu8M}s)am!?%j0wKl%5Q9*ionIwTqx7pAj}$UFW@pwOAAbbw*iX-)Dx$GX zAvPDQK@Z6W%C==KR4N9m)LZIX(hZYws zENSte9>$qA^)*wB*n?hh6tu)?qrK3{IBIKu1Z11_7e$PZNBLfoC(7wS%p(2y@Ho?& zUV4xaa>`s#&Y)Pb{Al;Bt(UmFn0}P2!I3sC!Bmo4Y-4YlRRqpOb5MXWdi@7lIqQQH zNyj%2C#qu=Zi%|k&~?Ck*Q8pZ3z~LWN945UGcB-YXvo9KA-OtbBPY>)_+q)vN1AD= zK+Wm%6T2XO7JjT6$kemsN2lS%rVl(LzVJNKRuH^G28#T8Bw8!JK9bxR zVtowmKW~bT^zSlgHkb~01&P|$KFVET?A_> zXGyS|>%SINWCKhFiCMVbg2VX;h~sBW@T*CxL!YJs!6?NOFW&8N&+~IVJ8I4V#a0mS zWblj5WS$Kn<;N@4)A>RupFSIHG+Awcrx3D#GiqvbsLHYY)& zDPw9{Aw%DkZ&WyJJ%adoe81+fQvpnV{ubJKH9Shj-gzU#@=6%>EJ5i|ZO46IRkB~j zlM9vP1@KndAg;$h8fZ{BA56E!mp{CYzH?e){$~qsUcMK`5!+kTA^2>ukFS2bIR!NI zgBvVx5dHG%)kt%Yp_w-z#@RK?eA=6h&-$}$9|En{MAs~&Tq)C7n0{%c!4DoV8EsTo zc7zp2-(ZypF>rA^Od^Bnhv2}!!dG*oBb(H0-v+I(lB4`tCzZ47+Um#C&ns$Y)ej}_#14rHD;c}oe5aWuH!?hBZ`V9K zE5bK#o)nR8wu+inSiSF(EN6A|T6lA#r8d25*FyWdvWy;P2%?56QrcFsdTfVuEKS2N z(bUyyB}sKF7Lr*r=fpwD3iZ9|MKT{QFO8t#`CsolyuJ8Cg|Dk0c>7L@B-e-ir4&-C z&ou9Vkj&lYsOC`WvNI}~mP*lBFG|WC!H3Mc^Qfzu{N>`rCZ$n)mjct5l=2^c|554j z732LC;~^OhalFXJC6nMyXkA1^MNmH72!a)BlvYYdR+m-i)Rq^*;mTh8zJLJpl@wWGr;i0@oBuYMP?T;?KL@*VHTq;4y)cGPxK@y&&gUQX5#Tex z4cM36?I2$4olo>e+FKS5lg;$K5?;3%4f=00^$p-==9ad+#7;dJ5hgYtS7J?_BS9#X z>WwU(xjw>)H2wLz9szoZD)4bLVQNym*0Xiwm~Z!r^iC3glXmrH_R)y?d0U$q!fvy* zN_gB>U`^^7A(|+txOLr8)`|ZdPR9ac1z%K!tFUP|cw3KOT52Sl*LqNi8pD} zZb~6SqD^)-Cd8=pv3%e$RByj@joB7?>AfvYZ*OeVEr%1jL?XDjkaX3OF&NT;fLzx zB_h2($b!Gvcoc@Hzca8U5x7HS<5y7I3Gq@-YJ6sOX*g)awH!TT15_j%g1DRDE^Il+ zT?x3@Z~`?BVOjM|!oSQWL6cU0&Bm#@@xz)3RT(4@IJ^PT1jsqj z%Dt!v(AaMOunD^z0Jwv1*#zHL?(*N>fk$RlxVATQ;d}B8<*3^}&x@H$wm;_~+VZjs zbOZ1@Q_9{+x|b^n^vzsJqu;U{6=ta+Bo+9##SHZaz6H|;+)|L_u42mH$TrE(E5X_e z^wxYvVN@|pZ;7EWyyX@}E5-HZ2ffm8-x|J#gCP~&hsP^&72z9YT57kN!f zM2U1C46;>^#1!8Alfyb+#U%x3BO(_|c|zX&LZ>084NkwPBG$;kuZZT(ax^t{G2v$A zM3r*9Ky^-q&N+6T1$tEId8hRFbr6HneZW)JC(n~nY33(!;$0t28FBq3hKip3w^Yju zot-=fjbWx0;&BblKX{eSl9R~Zs-X2x{0010pFlL)n-w>ap$lAyQNt(pHJg=hv2GW` zjkRe)$KOs7HC-X`r-I05^5N!LzVbm89UNr6i+XSy1kNm^+{;=Oq&m_MluGh}%s1g4 z4tDa0rKpQ$g@Ra69|8w$_XB?yV({w}QuJ+Wf(V@mR=Z9Fl}uu#EvRfbPAY$eO$7P| zd(`@=rG-st5`{*>g-(bVGL5qkabP{%V}k@+yuzgeo!?6bc}!d^X=tp3Vz`I`2Vo$k zl|HWmgb1UF00!r6QQ(aageyQ~ayvVq%mU=CR_KGP6QW5CM%MdKyo}6!M`}x{)0ZVV zD0jP|)IhB@yx=0Pxc4YR>xqLaj3mkBK9W5#j!hrTAd*eM8S*Yf5s^23TL>bux6Z5; zz9dMlzluzH@=mvs6b~+jql%Kodi9+#DWkQcNPsv4Cs|r9Oihd1t9sU_QjUy^@!56d zKCND%xTLNDc7h1BDaq7Tsz6ws7;XROZ}uT%hZg4+yV(GpJ-~MlW%YWXSc}Ju;&ky2 z5Mivx^~cZO{C!C8OEJ+b4RUsgNvCq>X1=R^sZ1z8LTK{^V@SL%?Wf54o1HH~8RF-3 zc>jL?ZThq1csC+&WgX-PueA00GnQ77tbVXnXU{+Q} z;P7#QR#~e=afdfH6$J|hg_iR}c_`4<*qG7bTQ5?S3foXwkvmGmA-PaPY}@8taKEk9 z8^;on#woSb%_tgRl+uxbbk+&+f)@@k2aa%yfq1()ZbF7zN7lU)W}SuMK`uI z)InUY#O^1F%dN!5Yw+82paLDpU4Z+pMBBw~9Ol)mtCR2Ejlm~o+7j_@TK4JP(?3(W zZerI6b31Cyj#7x82j75^42u7;FA_2*_BO7fEMY8FNGcC_w6-p#8m;R+M+b^_4M(0$ z{pr>}L`&FRpKd4?Mi51{uXr&MwVa3~QBA zlNVh8DuDgoZ!haSMW&ID21Vn#PQ)7W>W|3x>!x4_?GS~86#z02Vat~)~N!AHhn z#UaJM3%Mv;RRjvzb~K)lX>0vy35&z_yU_TFwV2^TQWHG3Pp|gg`kgd#vfH%ZPJh@( zHj}vqv5$ zpAjVk^0U_S@{%WBfOtT>v1u=G^KdyTZDOgWEjnKNAHOteQ{p~qd#Ny9(T^YSgY4rM zk`cm=^V!T!d#{t*%ezn9nqBBP1KO%ML!O9#>?E7d(rQ&~Q=H3D%{IhhWbi~ph+J=m zqZVy_*<5(gPe$1j9j;pvavt=>CQ%QfFuVX_Au{PW!uE|z#~0SZ{E0+JyP2Z;)^4($ zS0bq5(i{<;C^K)iO|Tsd#Y!?Qe&YJt(o_k;)iGZm@ykwHC@oDf&C7mbL7~cT�aIM6|{bw;5(wq=tC01K9 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 z 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

wHYM$M4U>Nm@e>j_W7eKaqUi;|(6X4)g}8dS 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�ST2(&N8LQ1dna6;T#NC=L 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≤Oex`@ap5`uoLUBfohoizNd3E;Pw{o**AJ&QBM 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%0A=))^&IGi8VhZo$|u;3`@4%Awx7$=C?@pUfnF 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 From cdc902e05285b57268af54e723a9d71031f5f4df Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 12 Jan 2022 16:35:11 -0800 Subject: [PATCH 202/203] Removed ansible from requirements and boto3 from requirements. Neither are used anymore --- .../modules/aws_service.py | 96 ------------------- .../modules/testing_service.py | 38 +------- .../detection_testing_batch/requirements.txt | 4 +- 3 files changed, 2 insertions(+), 136 deletions(-) delete mode 100644 bin/automated_detection_testing/ci/detection_testing_batch/modules/aws_service.py diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/aws_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/aws_service.py deleted file mode 100644 index eaf2750597..0000000000 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/aws_service.py +++ /dev/null @@ -1,96 +0,0 @@ -import boto3 -import uuid - - - -def get_ar_information_from_dynamo_db(region, db_name): - resource = boto3.resource('dynamodb', region_name=region) - table = resource.Table(db_name) - response = table.get_item( - Key={ - 'name': 'detection-testing-attack-range' - } - ) - if 'Item' in response: - return response['Item'] - else: - return {} - - -def get_splunk_instance(region, key_name): - client = boto3.client('ec2', region_name=region) - response = client.describe_instances( - Filters=[ - { - 'Name': "key-name", - 'Values': [key_name] - } - ] - ) - instances = [] - for reservation in response['Reservations']: - for instance in reservation['Instances']: - if instance['State']['Name']!='terminated': - if len(instance['Tags']) > 0: - tag = instance['Tags'][0]['Value'] - if key_name in tag: - return instance - - return {} - - -def dynamo_db_nothing_to_test(region, uuid_test, time): - uuid_var = str(uuid.uuid4()) - resource = boto3.resource('dynamodb', region_name=region) - table = resource.Table("dt-results") - response = table.put_item(Item= { - 'uuid': uuid_var, - 'uuid_test': uuid_test, - 'time': time, - 'status': 'nothing to test' - }) - - -def add_detection_results_in_dynamo_db(region, uuid, uuid_test, detection, detection_path, time): - resource = boto3.resource('dynamodb', region_name=region) - table = resource.Table("dt-results") - response = table.put_item(Item= { - 'uuid': uuid, - 'uuid_test': uuid_test, - 'detection': detection, - 'detection_path': detection_path, - 'time': time, - 'status': 'running' - }) - - -def update_detection_results_in_dynamo_db(region, uuid, result): - resource = boto3.resource('dynamodb', region_name=region) - table = resource.Table("dt-results") - response = table.update_item( - Key={ - 'uuid': uuid - }, - UpdateExpression="set #ts=:s", - ExpressionAttributeValues={ - ':s': 'done' - }, - ExpressionAttributeNames={ - "#ts": "status" - }, - ReturnValues="UPDATED_NEW" - ) - - response = table.update_item( - Key={ - 'uuid': uuid - }, - UpdateExpression="set #ts=:s", - ExpressionAttributeValues={ - ':s': result - }, - ExpressionAttributeNames={ - "#ts": "result" - }, - ReturnValues="UPDATED_NEW" - ) \ No newline at end of file diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py b/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py index 036ef3d2b2..50119f22f5 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/modules/testing_service.py @@ -81,7 +81,7 @@ def test_detection(splunk_ip:str, splunk_port:int, container_name:str, splunk_pa abs_folder_path = mkdtemp(prefix="DATA_", dir=attack_data_root_folder) - #The ansible playbook wants the relative path, so we convert it as required + #We want the relative path, so we convert it as required folder_name = relpath(abs_folder_path, os.getcwd()) @@ -182,40 +182,4 @@ def load_file(file_path): return file -# def update_ESCU_app(container_name, splunk_password): -# print("Update ESCU App. This can take some time") -# ansible_vars = {} -# ansible_vars['ansible_user'] = 'ansible_user' -# ansible_vars['splunk_password'] = splunk_password -# ansible_vars['security_content_path'] = 'security_content' - -# cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) - -# runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), -# cmdline=cmdline, -# roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), -# playbook=os.path.join(os.path.dirname(__file__), '../ansible/update_escu.yml'), -# extravars=ansible_vars) -# print("Successfully updated the ESCU App!") - - -# def replay_attack_dataset(container_name, splunk_password, folder_name, index, sourcetype, source, out): -# ansible_vars = {} -# ansible_vars['folder_name'] = folder_name -# ansible_vars['ansible_user'] = 'ansible' - -# ansible_vars['splunk_password'] = splunk_password -# ansible_vars['out'] = out -# ansible_vars['sourcetype'] = sourcetype -# ansible_vars['source'] = source -# ansible_vars['index'] = index - - -# cmdline = "--connection docker -i %s, -u %s" % (container_name, ansible_vars['ansible_user']) - -# runner = ansible_runner.run(private_data_dir=os.path.join(os.path.dirname(__file__), '../'), -# cmdline=cmdline, -# roles_path=os.path.join(os.path.dirname(__file__), '../ansible/roles'), -# playbook=os.path.join(os.path.dirname(__file__), '../ansible/attack_replay.yml'), -# extravars=ansible_vars) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt b/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt index d8419b7d63..f85641d6e3 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt +++ b/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt @@ -1,7 +1,5 @@ -ansible==4.2.0 -ansible-runner==1.4.4 attackcti==0.3.4.3 -boto3==1.11.0 + GitPython==3.1.14 Jinja2==3.0.0 PyYAML==5.4 From 6a7f9177074b73db6d74e66557875a8876349b0b Mon Sep 17 00:00:00 2001 From: pyth0n1c <87383215+pyth0n1c@users.noreply.github.com> Date: Wed, 12 Jan 2022 16:40:56 -0800 Subject: [PATCH 203/203] Fix to requirements to include psutil. Removed import of deleted modules/aws_service.py --- .../ci/detection_testing_batch/detection_testing_execution.py | 2 +- .../ci/detection_testing_batch/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py index e88cce0acd..ae4ae4ef2b 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py +++ b/bin/automated_detection_testing/ci/detection_testing_batch/detection_testing_execution.py @@ -27,7 +27,7 @@ from docker.client import DockerClient from requests import get import modules.new_arguments2 -from modules import (aws_service, container_manager, new_arguments2, +from modules import (container_manager, new_arguments2, testing_service, validate_args) from modules.github_service import GithubService from modules.validate_args import validate, validate_and_write diff --git a/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt b/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt index f85641d6e3..6986ae3ee8 100644 --- a/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt +++ b/bin/automated_detection_testing/ci/detection_testing_batch/requirements.txt @@ -1,5 +1,5 @@ +psutil==5.8.0 attackcti==0.3.4.3 - GitPython==3.1.14 Jinja2==3.0.0 PyYAML==5.4