forked from MISP/misp-modules
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
80 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
# -*- coding: utf-8 -*- | ||
"""Backscatter.io Module.""" | ||
import json | ||
try: | ||
from backscatter import Backscatter | ||
except ImportError: | ||
print("Backscatter.io library not installed.") | ||
|
||
misperrors = {'error': 'Error'} | ||
mispattributes = {'input': ['ip-src', 'ip-dst'], 'output': ['freetext']} | ||
moduleinfo = {'version': '1', 'author': '[email protected]', | ||
'description': 'Backscatter.io module to bring mass-scanning observations into MISP.', | ||
'module-type': ['expansion', 'hover']} | ||
moduleconfig = ['api_key'] | ||
query_playbook = [ | ||
{'inputs': ['ip-src', 'ip-dst'], | ||
'services': ['observations', 'enrichment'], | ||
'name': 'generic'} | ||
] | ||
|
||
|
||
def check_query(request): | ||
"""Check the incoming request for a valid configuration.""" | ||
output = {'success': False} | ||
config = request.get('config', None) | ||
if not config: | ||
misperrors['error'] = "Configuration is missing from the request." | ||
return output | ||
for item in moduleconfig: | ||
if config.get(item, None): | ||
continue | ||
misperrors['error'] = "Backscatter.io authentication is missing." | ||
return output | ||
if not request.get('ip-src') and request.get('ip-dst'): | ||
misperrors['error'] = "Unsupported attributes type." | ||
return output | ||
profile = {'success': True, 'config': config, 'playbook': 'generic'} | ||
if 'ip-src' in request: | ||
profile.update({'value': request.get('ip-src')}) | ||
else: | ||
profile.update({'value': request.get('ip-dst')}) | ||
return profile | ||
|
||
|
||
def handler(q=False): | ||
"""Handle gathering data.""" | ||
if not q: | ||
return q | ||
request = json.loads(q) | ||
checks = check_query(request) | ||
if not checks['success']: | ||
return misperrors | ||
|
||
output = {'results': list()} | ||
|
||
try: | ||
bs = Backscatter(checks['config']['api_key']) | ||
response = bs.get_observations(query=output['value'], query_type='ip') | ||
if not response['success']: | ||
misperrors['error'] = '%s: %s' % (response['error'], response['message']) | ||
return misperrors | ||
r = {'results': [{'types': mispattributes['output'], 'values': [str(response)]}]} | ||
except Exception, e: | ||
misperrors['error'] = str(e) | ||
return misperrors | ||
|
||
return output | ||
|
||
|
||
def introspection(): | ||
return mispattributes | ||
|
||
|
||
def version(): | ||
moduleinfo['config'] = moduleconfig | ||
return moduleinfo | ||
|