elkserver/docker/redelk-base/redelkinstalldata/scripts/modules/alarm_useragent/module.py (57 lines of code) (raw):

#!/usr/bin/python3 # -*- coding: utf-8 -*- """ Part of RedELK This check queries for UA\'s that are listed in any blacklist_useragents.conf and do talk to c2* paths on redirectors Authors: - Outflank B.V. / Mark Bergman (@xychix) - Lorenzo Bernardi (@fastlorenzo) """ import logging from modules.helpers import get_initial_alarm_result, get_query info = { "version": 0.1, "name": "User-agent module", "alarmmsg": "VISIT FROM BLACKLISTED USERAGENT TO C2_*", "description": "This check queries for UA's that are listed in any blacklist_useragents.conf and do talk to c2* paths on redirectors", "type": "redelk_alarm", # Could also contain redelk_enrich if it was an enrichment module "submodule": "alarm_useragent", } class Module: """User-agent module""" def __init__(self): self.logger = logging.getLogger(info["submodule"]) def run(self): """Run the alarm module""" ret = get_initial_alarm_result() ret["info"] = info ret["fields"] = [ "agent.hostname", "@timestamp", "source.ip", "http.headers.useragent", "source.cdn.ip", "redir.frontend.name", "redir.backend.name", "infra.attack_scenario", ] ret["groupby"] = ["source.ip", "http.headers.useragent"] report = self.alarm_check() ret["hits"]["hits"] = report["hits"] ret["hits"]["total"] = len(report["hits"]) self.logger.info( "finished running module. result: %s hits", ret["hits"]["total"] ) return ret def alarm_check(self): # pylint: disable=no-self-use """This check queries for UA's that are listed in any blacklist_useragents.conf and do talk to c2* paths on redirectors We will dig trough ALL data finding specific IP related lines and tag them reading the useragents we trigger on.""" file_name = "/etc/redelk/rogue_useragents.conf" with open(file_name, encoding="utf-8") as file: content = file.readlines() ua_list = [] for line in content: if not line.startswith("#"): ua_list.append(line.strip()) keywords = ua_list es_subquery = "" # add keywords (UA's) to query for keyword in keywords: if es_subquery == "": es_subquery = f"(http.headers.useragent:{keyword}" else: es_subquery = es_subquery + f" OR http.headers.useragent:{keyword}" es_subquery = es_subquery + ") " # q = "%s AND redir.backendname:c2* AND tags:enrich_* AND NOT tags:alarm_* "%qSub es_query = ( f"{es_subquery} AND redir.backend.name:c2* AND NOT tags:alarm_useragent" ) es_results = get_query(es_query, 10000) report = {} report["hits"] = es_results return report