From 4e7192f7352ae339e88a18a77e0e359d9cb53e1b Mon Sep 17 00:00:00 2001 From: GlennHD Date: Wed, 12 Feb 2020 21:21:39 -0600 Subject: [PATCH 1/6] Added GeoIP City and GeoIP ASN Info --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index af78ca5..03adc27 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,8 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [EUPI](misp_modules/modules/expansion/eupi.py) - a hover and expansion module to get information about an URL from the [Phishing Initiative project](https://phishing-initiative.eu/?lang=en). * [Farsight DNSDB Passive DNS](misp_modules/modules/expansion/farsight_passivedns.py) - a hover and expansion module to expand hostname and IP addresses with passive DNS information. * [GeoIP](misp_modules/modules/expansion/geoip_country.py) - a hover and expansion module to get GeoIP information from geolite/maxmind. +* [GeoIP_City](misp_modules/modules/expansion/geoip_city.py) - a hover and expansion module to get GeoIP City information from geolite/maxmind. +* [GeoIP_ASN](misp_modules/modules/expansion/geoip_asn.py) - a hover and expansion module to get GeoIP ASN information from geolite/maxmind. * [Greynoise](misp_modules/modules/expansion/greynoise.py) - a hover to get information from greynoise. * [hashdd](misp_modules/modules/expansion/hashdd.py) - a hover module to check file hashes against [hashdd.com](http://www.hashdd.com) including NSLR dataset. * [hibp](misp_modules/modules/expansion/hibp.py) - a hover module to lookup against Have I Been Pwned? From 7a3f9a422d9fd5767634be95a4e0443b8ea5bf9d Mon Sep 17 00:00:00 2001 From: GlennHD Date: Wed, 12 Feb 2020 21:28:41 -0600 Subject: [PATCH 2/6] Added GeoIP_City Enrichment module --- misp_modules/modules/expansion/geoip_city.py | 64 ++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 misp_modules/modules/expansion/geoip_city.py diff --git a/misp_modules/modules/expansion/geoip_city.py b/misp_modules/modules/expansion/geoip_city.py new file mode 100644 index 0000000..9c9f847 --- /dev/null +++ b/misp_modules/modules/expansion/geoip_city.py @@ -0,0 +1,64 @@ +import json +import geoip2.database +import sys +import logging + +log = logging.getLogger('geoip_city') +log.setLevel(logging.DEBUG) +ch = logging.StreamHandler(sys.stdout) +ch.setLevel(logging.DEBUG) +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch.setFormatter(formatter) +log.addHandler(ch) + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['ip-src', 'ip-dst', 'domain|ip'], 'output': ['freetext']} +moduleconfig = ['local_geolite_db'] +# possible module-types: 'expansion', 'hover' or both +moduleinfo = {'version': '0.1', 'author': 'GlennHD', + 'description': 'Query a local copy of the Maxmind Geolite City database (MMDB format)', + 'module-type': ['expansion', 'hover']} + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + + if not request.get('config') or not request['config'].get('local_geolite_db'): + return {'error': 'Please specify the path of your local copy of Maxminds Geolite database'} + path_to_geolite = request['config']['local_geolite_db'] + + if request.get('ip-dst'): + toquery = request['ip-dst'] + elif request.get('ip-src'): + toquery = request['ip-src'] + elif request.get('domain|ip'): + toquery = request['domain|ip'].split('|')[1] + else: + return False + + try: + reader = geoip2.database.Reader(path_to_geolite) + except FileNotFoundError: + return {'error': f'Unable to locate the GeoLite database you specified ({path_to_geolite}).'} + log.debug(toquery) + try: + answer = reader.city(toquery) + stringmap = 'Continent=' + str(answer.continent.name) + ', Country=' + str(answer.country.name) + ', Subdivision=' + str(answer.subdivisions.most_specific.name) + ', City=' + str(answer.city.name) + + except Exception as e: + misperrors['error'] = f"GeoIP resolving error: {e}" + return misperrors + + r = {'results': [{'types': mispattributes['output'], 'values': stringmap}]} + + return r + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From 0b9b6c4f4164b306cbe2d986a2829857e4b307d3 Mon Sep 17 00:00:00 2001 From: GlennHD Date: Wed, 12 Feb 2020 21:29:40 -0600 Subject: [PATCH 3/6] Added GeoIP_ASN Enrichment module --- misp_modules/modules/expansion/geoip_asn.py | 63 +++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 misp_modules/modules/expansion/geoip_asn.py diff --git a/misp_modules/modules/expansion/geoip_asn.py b/misp_modules/modules/expansion/geoip_asn.py new file mode 100644 index 0000000..b7fa973 --- /dev/null +++ b/misp_modules/modules/expansion/geoip_asn.py @@ -0,0 +1,63 @@ +import json +import geoip2.database +import sys +import logging + +log = logging.getLogger('geoip_asn') +log.setLevel(logging.DEBUG) +ch = logging.StreamHandler(sys.stdout) +ch.setLevel(logging.DEBUG) +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch.setFormatter(formatter) +log.addHandler(ch) + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['ip-src', 'ip-dst', 'domain|ip'], 'output': ['freetext']} +moduleconfig = ['local_geolite_db'] +# possible module-types: 'expansion', 'hover' or both +moduleinfo = {'version': '0.1', 'author': 'GlennHD', + 'description': 'Query a local copy of the Maxmind Geolite ASN database (MMDB format)', + 'module-type': ['expansion', 'hover']} + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + + if not request.get('config') or not request['config'].get('local_geolite_db'): + return {'error': 'Please specify the path of your local copy of the Maxmind Geolite ASN database'} + path_to_geolite = request['config']['local_geolite_db'] + + if request.get('ip-dst'): + toquery = request['ip-dst'] + elif request.get('ip-src'): + toquery = request['ip-src'] + elif request.get('domain|ip'): + toquery = request['domain|ip'].split('|')[1] + else: + return False + + try: + reader = geoip2.database.Reader(path_to_geolite) + except FileNotFoundError: + return {'error': f'Unable to locate the GeoLite database you specified ({path_to_geolite}).'} + log.debug(toquery) + try: + answer = reader.asn(toquery) + stringmap = 'ASN=' + str(answer.autonomous_system_number) + ', AS Org=' + str(answer.autonomous_system_organization) + except Exception as e: + misperrors['error'] = f"GeoIP resolving error: {e}" + return misperrors + + r = {'results': [{'types': mispattributes['output'], 'values': stringmap}]} + + return r + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo From 46f0f410e79be952bce3e58f289fdda5c83f7e80 Mon Sep 17 00:00:00 2001 From: GlennHD Date: Wed, 12 Feb 2020 21:31:41 -0600 Subject: [PATCH 4/6] Added geoip_asn and geoip_city to load --- misp_modules/modules/expansion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index 12c2ab6..458611f 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -6,7 +6,7 @@ sys.path.append('{}/lib'.format('/'.join((os.path.realpath(__file__)).split('/') __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'circl_passivessl', 'countrycode', 'cve', 'cve_advanced', 'dns', 'btc_steroids', 'domaintools', 'eupi', 'eql', 'farsight_passivedns', 'ipasn', 'passivetotal', 'sourcecache', 'virustotal', - 'whois', 'shodan', 'reversedns', 'geoip_country', 'wiki', 'iprep', + 'whois', 'shodan', 'reversedns', 'geoip_asn', 'geoip_city', 'geoip_country', 'wiki', 'iprep', 'threatminer', 'otx', 'threatcrowd', 'vulndb', 'crowdstrike_falcon', 'yara_syntax_validator', 'hashdd', 'onyphe', 'onyphe_full', 'rbl', 'xforceexchange', 'sigma_syntax_validator', 'stix2_pattern_syntax_validator', From bdb4185a0ada4c815ea11b29d1e4a5d08e381694 Mon Sep 17 00:00:00 2001 From: GlennHD Date: Wed, 12 Feb 2020 23:48:20 -0600 Subject: [PATCH 5/6] Update geoip_city.py --- misp_modules/modules/expansion/geoip_city.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/geoip_city.py b/misp_modules/modules/expansion/geoip_city.py index 9c9f847..01c0627 100644 --- a/misp_modules/modules/expansion/geoip_city.py +++ b/misp_modules/modules/expansion/geoip_city.py @@ -19,6 +19,7 @@ moduleinfo = {'version': '0.1', 'author': 'GlennHD', 'description': 'Query a local copy of the Maxmind Geolite City database (MMDB format)', 'module-type': ['expansion', 'hover']} + def handler(q=False): if q is False: return False From 0ed0ceab9d55835c78b51ee68b2c41f6f4e5dde3 Mon Sep 17 00:00:00 2001 From: GlennHD Date: Wed, 12 Feb 2020 23:48:38 -0600 Subject: [PATCH 6/6] Update geoip_asn.py --- misp_modules/modules/expansion/geoip_asn.py | 1 + 1 file changed, 1 insertion(+) diff --git a/misp_modules/modules/expansion/geoip_asn.py b/misp_modules/modules/expansion/geoip_asn.py index b7fa973..95d7ee7 100644 --- a/misp_modules/modules/expansion/geoip_asn.py +++ b/misp_modules/modules/expansion/geoip_asn.py @@ -19,6 +19,7 @@ moduleinfo = {'version': '0.1', 'author': 'GlennHD', 'description': 'Query a local copy of the Maxmind Geolite ASN database (MMDB format)', 'module-type': ['expansion', 'hover']} + def handler(q=False): if q is False: return False