diff --git a/.gitchangelog.rc b/.gitchangelog.rc new file mode 100644 index 0000000..19d9b85 --- /dev/null +++ b/.gitchangelog.rc @@ -0,0 +1,289 @@ +# -*- coding: utf-8; mode: python -*- +## +## Format +## +## ACTION: [AUDIENCE:] COMMIT_MSG [!TAG ...] +## +## Description +## +## ACTION is one of 'chg', 'fix', 'new' +## +## Is WHAT the change is about. +## +## 'chg' is for refactor, small improvement, cosmetic changes... +## 'fix' is for bug fixes +## 'new' is for new features, big improvement +## +## AUDIENCE is optional and one of 'dev', 'usr', 'pkg', 'test', 'doc'|'docs' +## +## Is WHO is concerned by the change. +## +## 'dev' is for developpers (API changes, refactors...) +## 'usr' is for final users (UI changes) +## 'pkg' is for packagers (packaging changes) +## 'test' is for testers (test only related changes) +## 'doc' is for doc guys (doc only changes) +## +## COMMIT_MSG is ... well ... the commit message itself. +## +## TAGs are additionnal adjective as 'refactor' 'minor' 'cosmetic' +## +## They are preceded with a '!' or a '@' (prefer the former, as the +## latter is wrongly interpreted in github.) Commonly used tags are: +## +## 'refactor' is obviously for refactoring code only +## 'minor' is for a very meaningless change (a typo, adding a comment) +## 'cosmetic' is for cosmetic driven change (re-indentation, 80-col...) +## 'wip' is for partial functionality but complete subfunctionality. +## +## Example: +## +## new: usr: support of bazaar implemented +## chg: re-indentend some lines !cosmetic +## new: dev: updated code to be compatible with last version of killer lib. +## fix: pkg: updated year of licence coverage. +## new: test: added a bunch of test around user usability of feature X. +## fix: typo in spelling my name in comment. !minor +## +## Please note that multi-line commit message are supported, and only the +## first line will be considered as the "summary" of the commit message. So +## tags, and other rules only applies to the summary. The body of the commit +## message will be displayed in the changelog without reformatting. + + +## +## ``ignore_regexps`` is a line of regexps +## +## Any commit having its full commit message matching any regexp listed here +## will be ignored and won't be reported in the changelog. +## +ignore_regexps = [ + r'@minor', r'!minor', + r'@cosmetic', r'!cosmetic', + r'@refactor', r'!refactor', + r'@wip', r'!wip', + r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*[p|P]kg:', + r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*[d|D]ev:', + r'^(.{3,3}\s*:)?\s*[fF]irst commit.?\s*$', + ] + + +## ``section_regexps`` is a list of 2-tuples associating a string label and a +## list of regexp +## +## Commit messages will be classified in sections thanks to this. Section +## titles are the label, and a commit is classified under this section if any +## of the regexps associated is matching. +## +## Please note that ``section_regexps`` will only classify commits and won't +## make any changes to the contents. So you'll probably want to go check +## ``subject_process`` (or ``body_process``) to do some changes to the subject, +## whenever you are tweaking this variable. +## +section_regexps = [ + ('New', [ + r'^[nN]ew\s*:\s*((dev|use?r|pkg|test|doc|docs)\s*:\s*)?([^\n]*)$', + ]), + ('Changes', [ + r'^[cC]hg\s*:\s*((dev|use?r|pkg|test|doc|docs)\s*:\s*)?([^\n]*)$', + ]), + ('Fix', [ + r'^[fF]ix\s*:\s*((dev|use?r|pkg|test|doc|docs)\s*:\s*)?([^\n]*)$', + ]), + + ('Other', None ## Match all lines + ), + +] + + +## ``body_process`` is a callable +## +## This callable will be given the original body and result will +## be used in the changelog. +## +## Available constructs are: +## +## - any python callable that take one txt argument and return txt argument. +## +## - ReSub(pattern, replacement): will apply regexp substitution. +## +## - Indent(chars=" "): will indent the text with the prefix +## Please remember that template engines gets also to modify the text and +## will usually indent themselves the text if needed. +## +## - Wrap(regexp=r"\n\n"): re-wrap text in separate paragraph to fill 80-Columns +## +## - noop: do nothing +## +## - ucfirst: ensure the first letter is uppercase. +## (usually used in the ``subject_process`` pipeline) +## +## - final_dot: ensure text finishes with a dot +## (usually used in the ``subject_process`` pipeline) +## +## - strip: remove any spaces before or after the content of the string +## +## - SetIfEmpty(msg="No commit message."): will set the text to +## whatever given ``msg`` if the current text is empty. +## +## Additionally, you can `pipe` the provided filters, for instance: +#body_process = Wrap(regexp=r'\n(?=\w+\s*:)') | Indent(chars=" ") +#body_process = Wrap(regexp=r'\n(?=\w+\s*:)') +#body_process = noop +body_process = ReSub(r'((^|\n)[A-Z]\w+(-\w+)*: .*(\n\s+.*)*)+$', r'') | strip + + +## ``subject_process`` is a callable +## +## This callable will be given the original subject and result will +## be used in the changelog. +## +## Available constructs are those listed in ``body_process`` doc. +subject_process = (strip | + ReSub(r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*((dev|use?r|pkg|test|doc|docs)\s*:\s*)?([^\n@]*)(@[a-z]+\s+)*$', r'\4') | + SetIfEmpty("No commit message.") | ucfirst | final_dot) + + +## ``tag_filter_regexp`` is a regexp +## +## Tags that will be used for the changelog must match this regexp. +## +tag_filter_regexp = r'^v[0-9]+\.[0-9]+\.[0-9]+$' + + + +## ``unreleased_version_label`` is a string or a callable that outputs a string +## +## This label will be used as the changelog Title of the last set of changes +## between last valid tag and HEAD if any. +unreleased_version_label = "%%version%% (unreleased)" + + +## ``output_engine`` is a callable +## +## This will change the output format of the generated changelog file +## +## Available choices are: +## +## - rest_py +## +## Legacy pure python engine, outputs ReSTructured text. +## This is the default. +## +## - mustache() +## +## Template name could be any of the available templates in +## ``templates/mustache/*.tpl``. +## Requires python package ``pystache``. +## Examples: +## - mustache("markdown") +## - mustache("restructuredtext") +## +## - makotemplate() +## +## Template name could be any of the available templates in +## ``templates/mako/*.tpl``. +## Requires python package ``mako``. +## Examples: +## - makotemplate("restructuredtext") +## +#output_engine = rest_py +#output_engine = mustache("restructuredtext") +output_engine = mustache("markdown") +#output_engine = makotemplate("restructuredtext") + + +## ``include_merge`` is a boolean +## +## This option tells git-log whether to include merge commits in the log. +## The default is to include them. +include_merge = True + + +## ``log_encoding`` is a string identifier +## +## This option tells gitchangelog what encoding is outputed by ``git log``. +## The default is to be clever about it: it checks ``git config`` for +## ``i18n.logOutputEncoding``, and if not found will default to git's own +## default: ``utf-8``. +#log_encoding = 'utf-8' + + +## ``publish`` is a callable +## +## Sets what ``gitchangelog`` should do with the output generated by +## the output engine. ``publish`` is a callable taking one argument +## that is an interator on lines from the output engine. +## +## Some helper callable are provided: +## +## Available choices are: +## +## - stdout +## +## Outputs directly to standard output +## (This is the default) +## +## - FileInsertAtFirstRegexMatch(file, pattern, idx=lamda m: m.start()) +## +## Creates a callable that will parse given file for the given +## regex pattern and will insert the output in the file. +## ``idx`` is a callable that receive the matching object and +## must return a integer index point where to insert the +## the output in the file. Default is to return the position of +## the start of the matched string. +## +## - FileRegexSubst(file, pattern, replace, flags) +## +## Apply a replace inplace in the given file. Your regex pattern must +## take care of everything and might be more complex. Check the README +## for a complete copy-pastable example. +## +# publish = FileInsertIntoFirstRegexMatch( +# "CHANGELOG.rst", +# r'/(?P[0-9]+\.[0-9]+(\.[0-9]+)?)\s+\([0-9]+-[0-9]{2}-[0-9]{2}\)\n--+\n/', +# idx=lambda m: m.start(1) +# ) +#publish = stdout + + +## ``revs`` is a list of callable or a list of string +## +## callable will be called to resolve as strings and allow dynamical +## computation of these. The result will be used as revisions for +## gitchangelog (as if directly stated on the command line). This allows +## to filter exaclty which commits will be read by gitchangelog. +## +## To get a full documentation on the format of these strings, please +## refer to the ``git rev-list`` arguments. There are many examples. +## +## Using callables is especially useful, for instance, if you +## are using gitchangelog to generate incrementally your changelog. +## +## Some helpers are provided, you can use them:: +## +## - FileFirstRegexMatch(file, pattern): will return a callable that will +## return the first string match for the given pattern in the given file. +## If you use named sub-patterns in your regex pattern, it'll output only +## the string matching the regex pattern named "rev". +## +## - Caret(rev): will return the rev prefixed by a "^", which is a +## way to remove the given revision and all its ancestor. +## +## Please note that if you provide a rev-list on the command line, it'll +## replace this value (which will then be ignored). +## +## If empty, then ``gitchangelog`` will act as it had to generate a full +## changelog. +## +## The default is to use all commits to make the changelog. +#revs = ["^1.0.3", ] +#revs = [ +# Caret( +# FileFirstRegexMatch( +# "CHANGELOG.rst", +# r"(?P[0-9]+\.[0-9]+(\.[0-9]+)?)\s+\([0-9]+-[0-9]{2}-[0-9]{2}\)\n--+\n")), +# "HEAD" +#] +revs = [] diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml new file mode 100644 index 0000000..cf717e5 --- /dev/null +++ b/.github/workflows/python-package.yml @@ -0,0 +1,53 @@ +name: Python package + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.7", "3.8", "3.9", "3.10"] + + steps: + - name: Install packages + run: | + sudo apt-get install libpoppler-cpp-dev libzbar0 tesseract-ocr + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Cache Python dependencies + uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('REQUIREMENTS') }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install flake8 pytest + # pyfaul must be installed manually (?) + pip install -r REQUIREMENTS pyfaup + pip install . + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + # Run server in background + misp-modules -l 127.0.0.1 -s & + sleep 5 + # Check if modules are running + curl -sS localhost:6666/modules + # Run tests + pytest tests diff --git a/.gitignore b/.gitignore index 3d994af..4c3db86 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,13 @@ misp_modules.egg-info/ docs/expansion* docs/import_mod* docs/export_mod* -site* \ No newline at end of file +site* + +#pycharm env +.idea/* + +#venv +venv* + +#vscode +.vscode* \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e9f78ac --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "misp_modules/lib/misp-objects"] + path = misp_modules/lib/misp-objects + url = https://github.com/MISP/misp-objects.git + branch = main diff --git a/.travis.yml b/.travis.yml index 4d551b2..9332806 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,13 +11,11 @@ python: - "3.7-dev" - "3.8-dev" -before_install: - - docker build -t misp-modules --build-arg BUILD_DATE=$(date -u +"%Y-%m-%d") docker/ - install: - sudo apt-get install libzbar0 libzbar-dev libpoppler-cpp-dev tesseract-ocr libfuzzy-dev libcaca-dev liblua5.3-dev - pip install pipenv - - pipenv install --dev + - pip install -r REQUIREMENTS + # - pipenv install --dev # install gtcaca - git clone git://github.com/stricaud/gtcaca.git - mkdir -p gtcaca/build @@ -37,20 +35,22 @@ install: - popd script: - - pipenv run coverage run -m --parallel-mode --source=misp_modules misp_modules.__init__ -l 127.0.0.1 & + - pip install coverage + - coverage run -m --parallel-mode --source=misp_modules misp_modules.__init__ -l 127.0.0.1 & - pid=$! - sleep 5 - - pipenv run nosetests --with-coverage --cover-package=misp_modules + - nosetests --with-coverage --cover-package=misp_modules - kill -s KILL $pid - pushd ~/ - - pipenv run coverage run -m --parallel-mode --source=misp_modules misp_modules.__init__ -s -l 127.0.0.1 & + - coverage run -m --parallel-mode --source=misp_modules misp_modules.__init__ -s -l 127.0.0.1 & - pid=$! - popd - sleep 5 - - pipenv run nosetests --with-coverage --cover-package=misp_modules + - nosetests --with-coverage --cover-package=misp_modules - kill -s KILL $pid - - pipenv run flake8 --ignore=E501,W503,E226 misp_modules + - pip install flake8 + - flake8 --ignore=E501,W503,E226,E126 misp_modules after_success: - - pipenv run coverage combine .coverage* - - pipenv run codecov + - coverage combine .coverage* + - codecov diff --git a/ChangeLog.md b/ChangeLog.md new file mode 100644 index 0000000..010d2a7 --- /dev/null +++ b/ChangeLog.md @@ -0,0 +1,4602 @@ +# Changelog + + +## v2.4.141 (2021-04-19) + +### Changes + +* [tests] LiveCI set for RBL tests (network connectivity issues in the CI) [Alexandre Dulaunoy] + +* [rbl] Added a timeout parameter to change the resolver timeout & lifetime if needed. [chrisr3d] + +* [rbl] Small changes on the rbl list and the results handling. [chrisr3d] + +* [test] skip some tests if running in the CI (API limitation or specific host issues) [Alexandre Dulaunoy] + +* [tests] historical records in threatcrowd. [Alexandre Dulaunoy] + +* [test] fixing IP addresses. [Alexandre Dulaunoy] + +* [passivetotal] new test IP address. [Alexandre Dulaunoy] + +* [farsight] make PEP happy. [Alexandre Dulaunoy] + +* [requirements] openpyxl added. [Alexandre Dulaunoy] + +* [travis] missing dep. [Alexandre Dulaunoy] + +* [test expansion] IPv4 address of CIRCL updated. [Alexandre Dulaunoy] + +* [coverage] install. [Alexandre Dulaunoy] + +* [pipenv] removed. [Alexandre Dulaunoy] + +* [travis] get rid of pipenv. [Alexandre Dulaunoy] + +* [Pipfile.lock] updated. [Alexandre Dulaunoy] + +* [doc] fix index of mkdocs. [Alexandre Dulaunoy] + +* [documentation] updated. [Alexandre Dulaunoy] + +* [farsight_passivedns] Making first_time and last_time results human readable. [chrisr3d] + + - We get the datetime format instead of the raw + timestamp + +* Bump deps. [Raphaël Vinot] + +* [farsight_passivedns] Making first_time and last_time results human readable. [chrisr3d] + + - We get the datetime format instead of the raw + timestamp + +* [farsight_passivedns] Added input types for more flex queries. [chrisr3d] + + - Standard types still supported as before + - Name or ip lookup, with optional flex queries + - New attribute types added will only send flex + queries to the DNSDB API + +* [doc] fix #460 - rh install. [Alexandre Dulaunoy] + +* [requirements] fix 463. [Alexandre Dulaunoy] + +### Fix + +* [tests] Fixed btc_steroids test assertion. [chrisr3d] + +* [ocr_enrich] Making Pep8 happy. [chrisr3d] + +* [tests] Fixed variable names that have been changed with the latest commit. [chrisr3d] + +* [ocr_enrich] Fixed tesseract input format. [chrisr3d] + + - It looks like the `image_to_string` method now + assumes RGB format and the `imdecode` method + seems to give BGR format, so we convert the + image array before + +* [tests] Fixed tests for some modules waiting for standard MISP Attribute format as input. [chrisr3d] + +* [tests] Fixed hibp test which requires an API key. [chrisr3d] + +* [hibp] Fixed config handling to avoir KeyError exceptions. [chrisr3d] + +* [test] dns module. [Alexandre Dulaunoy] + +* [main] Disable duplicate JSON decoding. [Jakub Onderka] + +* [cve_advanced] Some CVEs are not in CWE format but in NVD-CWE-Other. [Alexandre Dulaunoy] + +* [farsight_passivedns] Fixed lookup_rdata_name results desclaration. [chrisr3d] + + - Getting generator as a list as it is already the + case for all the other results, so it avoids + issues to read the results by accidently looping + through the generator before it is actually + needed, which would lose the content of the + generator + - Also removed print that was accidently introduced + with the last commit + +* [farsight_passivedns] Excluding last_seen value for now, in order to get the available results. [chrisr3d] + + - With last_seen set we can easily get results + included in a certain time frame (between first + seen and last seen), but we do not get the + latest results. In order to get those ones, we + skip filtering on the time_last_before value + +* [farsight_passivedns] Fixed lookup_rdata_name results desclaration. [chrisr3d] + + - Getting generator as a list as it is already the + case for all the other results, so it avoids + issues to read the results by accidently looping + through the generator before it is actually + needed, which would lose the content of the + generator + - Also removed print that was accidently introduced + with the last commit + +* Making pep8 happy. [chrisr3d] + +* [farsight_passivedns] Fixed queries to the API. [chrisr3d] + + - Since flex queries input may be email addresses, + we nake sure we replace '@' by '.' in the flex + queries input. + - We also run the flex queries with the input as + is first, before runnning them as second time + with '.' characters escaped: '\\.' + +* Google.py module. [Jürgen Löhel] + + The search result does not include always 3 elements. It's better to + enumerate here. + The googleapi fails sometimes. Retry it 3 times. + +* Google.py module. [Jürgen Löhel] + + Corrects import for gh.com/abenassi/Google-Search-API. + +* Consider mail body as UTF-8 encoded. [Jakub Onderka] + +### Other + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [Alexandre Dulaunoy] + +* Fix; [tests] Changes on assertion statements that should fix the passivetotal, rbl & shodan tests. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [Alexandre Dulaunoy] + +* Merge pull request #435 from JakubOnderka/remove-duplicate-decoding. [Alexandre Dulaunoy] + + fix: [main] Remove duplicate JSON decoding + +* Add: [farsight_passivedns] Adding first_seen & last_seen (when available) in passivedns objects. [chrisr3d] + + - The object_relation `time_first` is added as the + `first_seen` value of the object + - Same with `time_last` -> `last_seen` + +* Merge branch 'main' of github.com:MISP/misp-modules into new_features. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into new_features. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into new_features. [chrisr3d] + +* Merge pull request #484 from GreyNoise-Intelligence/main. [Alexandre Dulaunoy] + + Update to GreyNoise expansion module + +* Update community api to released ver. [Brad Chiappetta] + +* Fix ver info. [Brad Chiappetta] + +* Updates for greynoise community api. [Brad Chiappetta] + +* Merge pull request #485 from jgwilson42/patch-1. [Alexandre Dulaunoy] + + Update README.md + +* Update README.md. [James Wilson] + + Ensure that the clone of misp-modules is owned by www-data + +* Merge pull request #482 from MISP/new_features. [Alexandre Dulaunoy] + + Farsight_passivedns module updated with new input types compatible with flex queries + +* Add: [farsight_passivedns] New lookup argument based on the first_seen & last_seen fields. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into new_features. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into new_features. [chrisr3d] + +* Merge pull request #481 from cocaman/main. [Alexandre Dulaunoy] + + Adding ThreatFox enrichment module + +* Adding additional tags. [Corsin Camichel] + +* First version of ThreatFox enrichment module. [Corsin Camichel] + +* Merge pull request #480 from cocaman/patch-1. [Alexandre Dulaunoy] + + updating "hibp" for API version 3 + +* Updating "hibp" for API version 3. [Corsin Camichel] + +* Merge pull request #477 from jloehel/fix/google-module. [Alexandre Dulaunoy] + + Fix/google module + +* Merge pull request #476 from digihash/patch-1. [Alexandre Dulaunoy] + + Update README.md + +* Update README.md. [Kevin Holvoet] + + Added fix based on https://github.com/MISP/MISP/issues/4045 + +* Merge pull request #475 from adammchugh/patch-3. [Alexandre Dulaunoy] + + Fixed the censys version + +* Fixed the censys version. [adammchugh] + + Unsure how I managed to get the version so wrong, but I have updated it to the current version and confirmed as working. + +* Merge pull request #474 from JakubOnderka/patch-4. [Alexandre Dulaunoy] + + fix: Consider mail body as UTF-8 encoded + +* Merge pull request #473 from adammchugh/patch-2. [Alexandre Dulaunoy] + + Change to pandas version requirement to address pip install failure + +* Included missing dependencies for censys and pyfaup. [adammchugh] + + Added censys dependency + Added pyfaup dependency + +* Change to pandas version requirement to address pip install failure. [adammchugh] + + Updated pandas version to 1.1.5 to allow pip install as defined at https://github.com/MISP/misp-modules to complete successfully. + +* Merge pull request #470 from adammchugh/patch-1. [Alexandre Dulaunoy] + + Update assemblyline_submit.py - Add verify SSL option + +* Update assemblyline_submit.py. [adammchugh] + +* Update assemblyline_query.py. [adammchugh] + +* Update assemblyline_submit.py. [adammchugh] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [Alexandre Dulaunoy] + +* Update README long hyphen is not standard ASCII hyphen. [Alexandre Dulaunoy] + + Fix #464 + + +## v2.4.137 (2021-01-25) + +### Changes + +* Bump deps. [Raphaël Vinot] + +* Bump requirements. [Raphaël Vinot] + +* [pipenv] Enable email extras for PyMISP. [Jakub Onderka] + +### Fix + +* Bump PyMISP dep to latest. [Raphaël Vinot] + +* Use PyMISP from PyPi. [Raphaël Vinot] + +* Use pymisp from pypi. [Raphaël Vinot] + +* [pipenv] Missing clamd. [Jakub Onderka] + +### Other + +* Merge pull request #466 from NoDataFound/main. [Alexandre Dulaunoy] + + Corrected VMray rest API import + +* Corrected VMray rest API import. [Cory Kennedy] + + When loading misp-modules, the VMray module ```modules/expansion/vmray_submit.py ``` incorrectly imports the library. VMray's documentation and examples here: https://pypi.org/project/vmray-rest-api/#history also reflect this change as the correct import. + +* Merge pull request #457 from trustar/main. [Alexandre Dulaunoy] + + added more explicit error messages for indicators that return no enri… + +* Added more explicit error messages for indicators that return no enrichment data. [Jesse Hedden] + +* Merge pull request #452 from kuselfu/main. [Alexandre Dulaunoy] + + update vmray_import, add vmray_summary_json_import + +* Fix imports and unused variables. [Jens Thom] + +* Resolve merge conflict. [Jens Thom] + +* Merge remote-tracking branch 'upstream/main' into main. [Jens Thom] + +* Merge pull request #451 from JakubOnderka/versions-update. [Alexandre Dulaunoy] + + fix: [pipenv] Missing clamd + +* Merge pull request #450 from JakubOnderka/versions-update. [Alexandre Dulaunoy] + + chg: [pipenv] Enable email extras for PyMISP + +* Merge pull request #448 from HacknowledgeCH/export_defender_endpoint. [Alexandre Dulaunoy] + + Export defender endpoint + +* Fixed error reported by LGTM analysis. [milkmix] + +* Added documentation. [milkmix] + +* Added missing quotes. [milkmix] + +* Added URL support. [milkmix] + +* Typo in python src name. [milkmix] + +* Initial work on Defender for Endpoint export module. [milkmix] + +* * add parser for report version v1 and v2 * add summary JSON import module. [Jens Thom] + + +## v2.4.134 (2020-11-18) + +### New + +* [expansion] Added html_to_markdown module. [mokaddem] + + It fetches the HTML from the provided URL, performs a bit of DOM + clean-up then convert it into markdown + +* [clamav] Module for malware scan by ClamAV. [Jakub Onderka] + +* [passivedns, passivessl] Add support for ip-src|port and ip-dst|port. [Jakub Onderka] + +* Censys Expansion module. [Golbark] + +* Expansion module to query MALWAREbazaar API with some hash attribute. [chrisr3d] + +### Changes + +* [pipenv] Updated lock Pipfile again. [chrisr3d] + +* [pipenv] Updated lock Pipfile. [chrisr3d] + +* Added socialscan library in Pipfile and updated the lock file. [chrisr3d] + +* [documentation] Cleaner documentation directories & auto-generation. [chrisr3d] + + Including: + - A move of the previous `doc` and `docs` directories to `documentation` + - `documentation` is now the default directory + - The documentation previously under `doc` is now in `documentation/website` + - The mkdocs previously under `docs` is now in `documentation/mkdocs` + - All single JSON documentation files have been JQed + - Some small improvements to list fields displaying + +* [pipenv] Updated Pipfile. [chrisr3d] + +* [documentation] Updated the farsight-passivedns documentation. [chrisr3d] + +* [cpe] Added default limit to the results. [chrisr3d] + + - Results returned by CVE-search are sorted by + cvss score and limited in number to avoid + potential massive amount of data retuned back + to MISP. + - Users can overwrite the default limit with the + configuration already present as optional, and + can also set the limit to 0 to get the full list + of results + +* [farsight_passivedns] Now using the dnsdb2 python library. [chrisr3d] + + - Also updated the results parsing to check in + each returned result for every field if they are + included, to avoid key errors if any field is + missing + +* [cpe] Support of the new CVE-Search API. [chrisr3d] + +* [doc] Updated the farsight_passivedns module documentation. [chrisr3d] + +* [farsight_passivedns] More context added to the results. [chrisr3d] + + - References between the passive-dns objects and + the initial attribute + - Comment on object attributes mentioning whether + the results come from an rrset or an rdata + lookup + +* [farsight_passivedns] Rework of the module to return MISP objects. [chrisr3d] + + - All the results are parsed as passive-dns MISP + objects + - More love to give to the parsing to add + references between the passive-dns objects and + the input attribute, depending on the type of + the query (rrset or rdata), or the rrtype + (to be determined) + +* [cpe] Changed CVE-Search API default url. [chrisr3d] + +* [clamav] Add reference to original attribute. [Jakub Onderka] + +* [clamav] TCP port connection must be an integer. [Alexandre Dulaunoy] + +* Bump deps. [Raphaël Vinot] + +* Updated expansion modules documentation. [chrisr3d] + + - Added documentation for the missing modules + - Renamed some of the documentation files to match + with the module names and avoid issues within + the documentation file (README.md) with the link + of the miss-spelled module names + +* Updated the bgpranking expansion module test. [chrisr3d] + +* Updated documentation for the recently updated bgpranking module. [chrisr3d] + +* Updated the bgpranking expansion module to return MISP objects. [chrisr3d] + + - The module no longer returns freetext, since the + result returned to the freetext import as text + only allowed MISP to parse the same AS number as + the input attribute. + - The new result returned with the updated module + is an asn object describing more precisely the + AS number, and its ranking for a given day + +* Turned the Shodan expansion module into a misp_standard format module. [chrisr3d] + + - As expected with the misp_standard modules, the + input is a full attribute and the module is able + to return attributes and objects + - There was a lot of data that was parsed as regkey + attributes by the freetext import, the module now + parses properly the different field of the result + of the query returned by Shodan + +* Updated documentation about the greynoise module. [chrisr3d] + +* Updated Greynoise tests following the latest changes on the expansion module. [chrisr3d] + +* Making use of the Greynoise v2 API. [chrisr3d] + +* Bump deps. [Raphaël Vinot] + +* [doc] Added details about faup. [Steve Clement] + +* [doc] in case btc expansion fails, give another hint at why it fails. [Steve Clement] + +* [travis] Added gtcaca and liblua to faup. [Steve Clement] + +* [travis] Added py3.8. [Steve Clement] + +* Bump dependencies. [Raphaël Vinot] + + Should fix https://github.com/MISP/MISP/issues/5739 + +* Quick ransomdncoin test just to make sure the module loads. [chrisr3d] + + - I do not have any api key right now, so the test + should just reach the error + +* Catching missing config issue. [chrisr3d] + +### Fix + +* [pipenv] Removed duplicated dnsdb2 entry that I missed while merging conflict. [chrisr3d] + +* Removed debugging print command. [chrisr3d] + +* [tests] Less specific assertion for the rbl module test. [chrisr3d] + +* [farsight_passivedns] Fixed pep8 backslash issue. [chrisr3d] + +* [farsight_passivedns] Fixed issue with variable name. [chrisr3d] + +* [documentation] Added missing cpe module documentation. [chrisr3d] + +* [cpe] Fixed typo in vulnerable-configuration object relation fields. [chrisr3d] + +* [farsight_passivedns] Fixed typo in the lookup fields. [chrisr3d] + +* [farsight_passivedns] Uncommented mandatory field that was commented for tests. [chrisr3d] + +* [tests] Small fixes on the expansion tests. [chrisr3d] + +* [dnsdb] Avoiding AttributeError with the sys library, probably depending on the python version. [chrisr3d] + +* [documentation] Updated links to the scripts, with the default branch no longer being master, but main. [chrisr3d] + +* Typo. [chrisr3d] + +* Updated Pipfile. [chrisr3d] + +* [cpe] Typos and variable name issues fixed + Making the module available in MISP. [chrisr3d] + +* [cve-advanced] Using the cpe and weakness attribute types. [chrisr3d] + +* [cve_advanced] Avoiding potential MISP object references issues. [chrisr3d] + + - Adding objects as dictionaries in an event may + cause issues in some cases. It is better to pass + the MISP object as is, as it is already a valid + object since the MISPObject class is used + +* [virustotal_public] Resolve key error when user enrich hostname. [chrisr3d] + + - Same as #424 + +* [virustotal] Resolve key error when user enrich hostname. [Jakub Onderka] + +* Typo in EMailObject. [Raphaël Vinot] + + Fix #427 + +* Making pep8 happy. [chrisr3d] + +* Fixed pep8. [chrisr3d] + +* Fixed pep8 + some copy paste issues introduced with the latest commits. [chrisr3d] + +* Avoid issues with the attribute value field name. [chrisr3d] + + - The module setup allows 'value1' as attribute + value field name, but we want to make sure that + users passing standard misp format with 'value' + instead, will not have issues, as well as + keeping the current setup + +* [virustotal] Subdomains is optional in VT response. [Jakub Onderka] + +* Fixed list of sigma backends. [chrisr3d] + +* Fixed validators dependency issues. [chrisr3d] + + - Possible rollback if we get issues with virustotal + +* Removed multiple spaces to comply with pep8. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Removed trustar_import module name in init to avoid validation issues. [chrisr3d] + + (until it is submitted via PR?) + +* [circl_passivessl] Return proper error for IPv6 addresses. [Jakub Onderka] + +* [circl_passivessl] Return not found error. [Jakub Onderka] + + If passivessl returns empty response, return Not found error instead of error in log + +* [circl_passivedns] Return not found error. [Jakub Onderka] + + If passivedns returns empty response, return Not found error instead of error in log + +* [pep] Comply to PEP E261. [Steve Clement] + +* [travis] gtcaca has no build directory. [Steve Clement] + +* [pip] pyfaup required. [Steve Clement] + +* [doc] corrected filenames for 2 docs. [Christophe Vandeplas] + +* Making pep8 happy. [chrisr3d] + +* Catching errors in the reponse of the query to URLhaus. [chrisr3d] + +* Making pep8 happy with indentation. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Removed unused import. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Making the module config available so the module works. [chrisr3d] + +* [VT] Disable SHA512 query for VT. [Jakub Onderka] + +### Other + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge pull request #429 from MISP/new_module. [Christian Studer] + + New module using socialscan to check the availability of an email address or username on some online platforms + +* Merge branch 'main' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Add: Added documentation for the socialscan new module. [chrisr3d] + + - Also quick fix of the message for an invalid + result or response concerning the queried email + address or username + +* Merge branch 'main' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Add: New module using socialscan library to check email addresses and usernames linked to accounts on online platforms. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge pull request #445 from chrisr3d/main. [Christian Studer] + + Added missing cpe module documentation + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Add: [farsight-passivedns] Optional feature to submit flex queries. [chrisr3d] + + - The rrset and rdata queries remain the same but + with the parameter `flex_queries`, users can + also get the results of the flex rrnames & flex + rdata regex queries about their domain, hostname + or ip address + - Results can thus include passive-dns objects + containing the `raw_rdata` object_relation added + with 0a3e948 + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge branch 'chrisr3d_patch' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge pull request #443 from trustar/main. [Alexandre Dulaunoy] + + fixed typo causing firstSeen and lastSeen to not be pulled from enric… + +* Fixed typo causing firstSeen and lastSeen to not be pulled from enrichment data. [Jesse Hedden] + +* Merge pull request #440 from MISP/chrisr3d_patch. [Alexandre Dulaunoy] + + Farsight passivedns module update + +* Merge pull request #437 from chrisr3d/main. [Alexandre Dulaunoy] + + New expansion module to get the vulnerabilities related to a CPE + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge pull request #436 from MISP/new-html-to-markdown. [Christian Studer] + + new: [expansion] Added html_to_markdown module + +* Add: Documentation for the html_to_markdown expansion module. [chrisr3d] + +* Add: Added documentation for the cpe module. [chrisr3d] + +* Add: First shot of an expansio module to query cve-search with a cpe to get the related vulnerabilities. [chrisr3d] + +* Merge pull request #432 from JakubOnderka/clamav. [Alexandre Dulaunoy] + + chg: [clamav] Add reference to original attribute + +* Merge pull request #431 from JakubOnderka/clamav. [Alexandre Dulaunoy] + + new: [clamav] Module for malware scan by ClamAV + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [Raphaël Vinot] + +* Merge pull request #424 from JakubOnderka/vt-subdomains-fix. [Christian Studer] + + fix: [virustotal] Resolve key error when user enrich hostname + +* Merge pull request #426 from hildenjohannes/main. [Alexandre Dulaunoy] + + Recorded Future module: Add proxy support and User-Agent header + +* Add proxy support and User-Agent header. [johannesh] + +* Merge pull request #425 from elhoim/elhoim-patch-1. [Alexandre Dulaunoy] + + Disable correlation for detection-ratio attribute in virustotal.py + +* Disable correlation for detection-ratio in virustotal.py. [David André] + +* Merge pull request #422 from trustar/feat/EN-5047/MISP-manual-update. [Alexandre Dulaunoy] + + Feat/en 5047/misp manual update + +* Merge branch 'main' into feat/EN-5047/MISP-manual-update. [Jesse Hedden] + +* Merge pull request #420 from hildenjohannes/main. [Alexandre Dulaunoy] + + Fix typo error introduced in commit: 3b7a5c4dc2541f3b07baee69a7e8b969… + +* Fix typo error introduced in commit: 3b7a5c4dc2541f3b07baee69a7e8b9694a1627fc. [johannesh] + +* Merge pull request #417 from trustar/feat/EN-4664/trustar-misp. [Alexandre Dulaunoy] + + Feat/en 4664/trustar misp + +* Added description to readme. [Jesse Hedden] + +* Merge branch 'master' of github.com:trustar/misp-modules into feat/EN-4664/trustar-misp. [Jesse Hedden] + +* Removed obsoleted module name. [Jesse Hedden] + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge pull request #416 from hildenjohannes/main. [Alexandre Dulaunoy] + + Add Recorded Future module documentation + +* Improve wording. [johannesh] + +* Add Recorded Future module documentation. [johannesh] + +* Add: Specific error message for misp_standard format expansion modules. [chrisr3d] + + - Checking if the input format is respected and + displaying an error message if it is not + +* Merge pull request #415 from hildenjohannes/main. [Alexandre Dulaunoy] + + Add Recorded Future expansion module + +* Add Recorded Future expansion module. [johannesh] + +* Added comments. [Jesse Hedden] + +* Added comments. [Jesse Hedden] + +* Added comments. [Jesse Hedden] + +* Added error checking. [Jesse Hedden] + +* Updating to include metadata and alter type of trustar link generated. [Jesse Hedden] + +* Merge pull request #1 from trustar/feat/EN-4664/trustar-misp. [Jesse Hedden] + + Feat/en 4664/trustar misp + +* Merge branch 'main' of github.com:MISP/misp-modules into main. [chrisr3d] + +* Merge pull request #411 from JakubOnderka/vt-subdomains-fix. [Alexandre Dulaunoy] + + fix: [virustotal] Subdomains is optional in VT response + +* Merge remote-tracking branch 'origin' into main. [chrisr3d] + +* Add: Trustar python library added to Pipfile. [chrisr3d] + +* Merge branch 'trustar-feat/EN-4664/trustar-misp' [chrisr3d] + +* Merge branch 'feat/EN-4664/trustar-misp' of https://github.com/trustar/misp-modules into trustar-feat/EN-4664/trustar-misp. [chrisr3d] + +* Removed obsolete file. [Jesse Hedden] + +* Corrected variable name. [Jesse Hedden] + +* Fixed indent. [Jesse Hedden] + +* Fixed incorrect attribute name. [Jesse Hedden] + +* Fixed metatag; convert summaries generator to list for error handling. [Jesse Hedden] + +* Added strip to remove potential whitespace. [Jesse Hedden] + +* Removed extra parameter. [Jesse Hedden] + +* Added try/except for TruSTAR API errors and additional comments. [Jesse Hedden] + +* Added comments and increased page size to max for get_indicator_summaries. [Jesse Hedden] + +* Uploaded TruSTAR logo. [Jesse Hedden] + +* Updated client metatag and version. [Jesse Hedden] + +* Added module documentation. [Jesse Hedden] + +* Added client metatag to trustar client. [Jesse Hedden] + +* Ready for code review. [Jesse Hedden] + +* WIP: initial push. [Jesse Hedden] + +* Initial commit. not a working product. need to create a class to manage the MISP event and TruStar client. [Jesse Hedden] + +* Merge pull request #381 from MISP/new_module. [Christian Studer] + + New module for MALWAREbazaar + +* Merge branch 'main' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #407 from JakubOnderka/patch-3. [Alexandre Dulaunoy] + + fix: [circl_passivessl] Return proper error for IPv6 addresses + +* Merge pull request #406 from JakubOnderka/ip-port. [Alexandre Dulaunoy] + + new: [passivedns, passivessl] Add support for ip-src|port and ip-dst|port + +* Merge pull request #405 from JakubOnderka/patch-2. [Alexandre Dulaunoy] + + fix: [circl_passivedns] Return not found error + +* Merge pull request #402 from MISP/dependabot/pip/httplib2-0.18.0. [Alexandre Dulaunoy] + + build(deps): bump httplib2 from 0.17.0 to 0.18.0 + +* Build(deps): bump httplib2 from 0.17.0 to 0.18.0. [dependabot[bot]] + + Bumps [httplib2](https://github.com/httplib2/httplib2) from 0.17.0 to 0.18.0. + - [Release notes](https://github.com/httplib2/httplib2/releases) + - [Changelog](https://github.com/httplib2/httplib2/blob/master/CHANGELOG) + - [Commits](https://github.com/httplib2/httplib2/compare/v0.17.0...v0.18.0) + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #395 from SteveClement/master. [Steve Clement] + + chg: [deps] pyfaup seems to be required but not installed + +* Merge pull request #393 from vmray-labs/update-vmray-module. [Alexandre Dulaunoy] + + Update vmray_submit module + +* Update vmray_submit. [Matthias Meidinger] + + The submit module hat some smaller issues with the reanalyze flag. + The source for the enrichment object has been changed and the robustness + of user supplied config parsing improved. + +* Merge pull request #388 from Golbark/censys_expansion. [Christophe Vandeplas] + + new: usr: Censys Expansion module + +* Fix variable issue in the loop. [Golbark] + +* Adding support for more input types, including multi-types. [Golbark] + +* Add: Added documentation for the latest new modules. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #380 from JakubOnderka/patch-1. [Christian Studer] + + csvimport: Return error if input is not valid UTF-8 + +* Csvimport: Return error if input is not valid UTF-8. [Jakub Onderka] + +* Merge pull request #379 from cudeso/master. [Alexandre Dulaunoy] + + Cytomic Orion MISP Module + +* Documentation for Cytomic Orion. [Koen Van Impe] + +* Update __init__ [Koen Van Impe] + +* Make Travis (a little bit) happy. [Koen Van Impe] + +* Cytomic Orion MISP Module. [Koen Van Impe] + + An expansion module to enrich attributes in MISP and share indicators + of compromise with Cytomic Orion + +* Merge pull request #377 from 0xbennyv/master. [Alexandre Dulaunoy] + + Added SophosLabs Intelix as expansion module + +* Removed Unused Import. [bennyv] + +* Fixed handler error handling for missing config. [bennyv] + +* Fixed formatting in README.md. [bennyv] + +* Updated the README.md for SOPHOSLabs Intelix. [bennyv] + +* Initial Build of SOPHOSLabs Intelix Product. [bennyv] + +* Merge pull request #374 from M0un/projet-m2-oun-gindt. [Christian Studer] + + Rendu projet master2 sécurité par Mathilde OUN et Vincent GINDT // No… + +* Rendu projet master2 sécurité par Mathilde OUN et Vincent GINDT // Nouveau module misp de recherche google sur les urls. [Mathilde Oun et Vincent Gindt] + +* Merge pull request #373 from seanthegeek/patch-1. [Christian Studer] + + Create missing __init__.py for _ransomcoindb + +* Revert change inteded for other patch. [Sean Whalen] + +* Install cmake to build faup. [Sean Whalen] + +* Create __init__.py. [Sean Whalen] + +* Merge pull request #371 from GlennHD/master. [Christian Studer] + + Added GeoIP_City and GeoIP_ASN Database Modules + +* Update geoip_asn.py. [GlennHD] + +* Update geoip_city.py. [GlennHD] + +* Added geoip_asn and geoip_city to load. [GlennHD] + +* Added GeoIP_ASN Enrichment module. [GlennHD] + +* Added GeoIP_City Enrichment module. [GlennHD] + +* Added GeoIP City and GeoIP ASN Info. [GlennHD] + +* Merge pull request #370 from JakubOnderka/vt-query-sha512. [Alexandre Dulaunoy] + + fix: [VT] Disable SHA512 query for VT + +* Merge pull request #368 from andurin/lastline_verifyssl. [Christian Studer] + + Lastline verify_ssl option + +* Lastline verify_ssl option. [Hendrik] + + Helps people with on-prem boxes + + +## v2.4.121 (2020-02-06) + +### Fix + +* Making pep8 happy. [chrisr3d] + +* [tests] Fixed BGP raking module test. [chrisr3d] + +### Other + +* Merge pull request #367 from joesecurity/master. [Christian Studer] + + joe: (1) allow users to disable PE object import (2) set 'to_ids' to False + +* Joe: (1) allow users to disable PE object import (2) set 'to_ids' to False. [Georg Schölly] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #365 from ostefano/analysis. [Alexandre Dulaunoy] + + change: migrate to analysis API when submitting files to Lastline + +* Change: migrate to analysis API when submitting tasks to Lastline. [Stefano Ortolani] + +* Merge pull request #364 from cudeso/master. [Christian Studer] + + 2nd fix for VT Public module + +* 2nd fix for VT Public module. [Koen Van Impe] + +* Fix error message in Public VT module. [Koen Van Impe] + + +## v2.4.120 (2020-01-21) + +### New + +* Updated ipasn and added vt_graph documentation. [chrisr3d] + +* Enrichment module for querying APIVoid with domain attributes. [chrisr3d] + +### Changes + +* Making ipasn module return asn object(s) [chrisr3d] + + - Latest changes on the returned value as string + broke the freetext parser, because no asn number + could be parsed when we return the full json + blob as a freetext attribute + - Now returning asn object(s) with a reference to + the initial attribute + +* Bumped pipfile.lock with up-to-date libraries and new vt_graph_api library requirement. [chrisr3d] + +* Checking attributes category. [chrisr3d] + + - We check the category before adding the + attribute to the event + - Checking if the category is correct and if not, + doing a case insensitive check + - If the category is not correct after the 2 first + tests, we simply delete it from the attribute + and pymisp will give the attribute a default + category value based on the atttribute type, at + the creation of the attribute + +* Regenerated the modules documentation following the latest changes. [chrisr3d] + +* Updated documentation following the latest changes on the passive dns module. [chrisr3d] + +* Made circl_passivedns module able to return MISP objects. [chrisr3d] + +* Updated documentation following the latest changes on the passive ssl module. [chrisr3d] + +* Made circl_passivessl module able to return MISP objects. [chrisr3d] + +* Bump dependencies. [Raphaël Vinot] + +* Install faup in travis. [Raphaël Vinot] + +* Deactive emails tests, need update. [Raphaël Vinot] + +* Update email import module, support objects. [Raphaël Vinot] + +* Bump dependencies. [Raphaël Vinot] + +### Fix + +* Fixed ipasn test input format + module version updated. [chrisr3d] + +* Updated ipasn test following the latest changes on the module. [chrisr3d] + +* Typo. [chrisr3d] + +* Fixed vt_graph imports. [chrisr3d] + +* Fixed pep8 in the new module and related libraries. [chrisr3d] + +* Fixed typo on function import. [chrisr3d] + +* [doc] Added APIVoid logo. [chrisr3d] + +* Making pep8 happy with whitespace after ':' [chrisr3d] + +* [tests] With values, tests are always better ... [chrisr3d] + +* [tests] Fixed copy paste issue. [chrisr3d] + +* [tests] Fixed error catching in passive dns and ssl modules. [chrisr3d] + +* [tests] Avoiding issues with btc addresses. [chrisr3d] + +* Making pep8 happy by having spaces around '+' operators. [chrisr3d] + +* [tests] Added missing variable. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Missing dependency in travis. [Raphaël Vinot] + +* Properly install pymisp with file object dependencies. [Raphaël Vinot] + +* Quick variable name fix. [chrisr3d] + +* OTX tests were failing, new entry. [Raphaël Vinot] + +* Somewhat broken emails needed some love. [Raphaël Vinot] + +* MIssing parameter in skip. [Raphaël Vinot] + +* Missing pushd. [Raphaël Vinot] + +* Missing sudo. [Raphaël Vinot] + +### Other + +* Merge pull request #361 from VirusTotal/master. [Christian Studer] + + add vt_graph export module + +* Add vt-graph-api to the requirements. [Alvaro Garcia] + +* Add vt_graph export module. [Alvaro Garcia] + +* Merge pull request #360 from ec4n6/patch-1. [Alexandre Dulaunoy] + + Fix ipasn.py bug + +* Update ipasn.py. [Erick Cheng] + +* Add: Documentation for the new API Void module. [chrisr3d] + +* Add: [tests] Test case for the APIVoid module. [chrisr3d] + +* Revert "fix: [tests] Fixed copy paste issue" [chrisr3d] + + This reverts commit fd711475dd84749063f9ff15961453f90c804101. + +* Add: Test cases for reworked passive dns and ssl modules. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + + +## v2.4.119 (2019-12-03) + +### Changes + +* Bump dependencies. [Raphaël Vinot] + +* Use MISPObject in ransomcoindb. [Raphaël Vinot] + +* Reintroducing the limit to reduce the number of recursive calls to the API when querying for a domain. [chrisr3d] + +### Fix + +* Making pep8 happy. [chrisr3d] + +* Fixed AssemblyLine input description. [chrisr3d] + +* Fixed input types list since domain should not be submitted to AssemblyLine. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Added missing AssemblyLine logo. [chrisr3d] + +* Avoiding KeyError exception when no result is found. [chrisr3d] + +### Other + +* Merge pull request #356 from ostefano/lastline. [Alexandre Dulaunoy] + + add: Modules to query/import/submit data from/to Lastline + +* Add: Modules to query/import/submit data from/to Lastline. [Stefano Ortolani] + +* Revert "Merge pull request #341 from StefanKelm/master" [Raphaël Vinot] + + This reverts commit 1df0d9152ed3346a9432393177c89e137bfc0c64, reversing + changes made to 6042619c6b7fb40fd77b5328f933e67e839e1e83. + + This PR was a fixing a typo in a test case. The typo is in a 3rd party + service. + +* Merge pull request #341 from StefanKelm/master. [Raphaël Vinot] + + Update test_expansions.py + +* Update test_expansions.py. [StefanKelm] + + Tiniest of typos + +* Merge branch 'aaronkaplan-master' [Raphaël Vinot] + +* Oops , use relative import. [aaronkaplan] + +* Use a helpful user-agent string. [aaronkaplan] + +* Final url fix. [aaronkaplan] + +* Revert "fix url" [aaronkaplan] + + This reverts commit 44130e2bf9842c03fb80245b90a873917b56df74. + +* Revert "fix url again" [aaronkaplan] + + This reverts commit c5924aee2543b268b296a57096e636261676b63c. + +* Fix url again. [aaronkaplan] + +* Fix url. [aaronkaplan] + +* Mention the ransomcoindb in the README file as a new module. [aaronkaplan] + +* Remove pprint. [aaronkaplan] + +* Initial version of the ransomcoindb expansion module. [aaronkaplan] + +* Merge pull request #352 from aaronkaplan/patch-1. [Alexandre Dulaunoy] + + Update README.md + +* Update README.md. [AaronK] + + fixes #351 + +* Add: Added documentation for the AssemblyLine query module. [chrisr3d] + +* Add: Module to query AssemblyLine and parse the results. [chrisr3d] + + - Takes an AssemblyLine submission link to query + the API and get the full submission report + - Parses the potentially malicious files and the + IPs, domains or URLs they are connecting to + - Possible improvement of the parsing filters in + order to include more data in the MISP event + +* Add: Added documentation and description in readme for the AssemblyLine submit module. [chrisr3d] + +* Add: Updated python dependencies to include the assemblyline_client library. [chrisr3d] + +* Add: New expansion module to submit samples and urls to AssemblyLine. [chrisr3d] + + +## v2.4.118 (2019-11-08) + +### Changes + +* Using EQL module description from blaverick62. [chrisr3d] + +* [test expansion] Enhanced results parsing. [chrisr3d] + +* [travis] skip E226 as it's more a question of style. [Alexandre Dulaunoy] + +* [apiosintds] make flake8 happy. [Alexandre Dulaunoy] + +* [Pipfile] apiosintDS added as required by new module. [Alexandre Dulaunoy] + +* [env] Pipfile updated. [Alexandre Dulaunoy] + +* [pipenv] updated. [Alexandre Dulaunoy] + +* Avoids returning empty values + easier results parsing. [chrisr3d] + +* Taking into consideration if a user agent is specified in the module configuration. [chrisr3d] + +* Updated csv import documentation. [chrisr3d] + +### Fix + +* Fixed csv file parsing. [chrisr3d] + +* Fixed Xforce Exchange authentication + rework. [chrisr3d] + + - Now able to return MISP objects + - Support of the xforce exchange authentication + with apikey & apipassword + +* Added urlscan & secuirtytrails modules in __init__ list. [chrisr3d] + +* Avoiding empty config error on passivetotal module. [chrisr3d] + +* More clarity on the exception raised on the securitytrails module. [chrisr3d] + +* Better exceptions handling on the passivetotal module. [chrisr3d] + +* Fixed results parsing for various module tests. [chrisr3d] + +* Fixed variable name. [chrisr3d] + +* Bumped Pipfile.lock with the latest libraries versions. [chrisr3d] + +* Fixed config parsing and the associated error message. [chrisr3d] + +* Fixed config parsing + results parsing. [chrisr3d] + + - Avoiding errors with config field when it is + empty or the apikey is not set + - Parsing all the results instead of only the + first one + +* Fixed VT results. [chrisr3d] + +* Making urlscan module available in MISP for ip attributes. [chrisr3d] + + - As expected in the the handler function + +* Avoiding various modules to fail with uncritical issues. [chrisr3d] + + - Avoiding securitytrails to fail with an unavailable + feature for free accounts + - Avoiding urlhaus to fail with input attribute + fields that are not critical for the query and + results + - Avoiding VT modules to fail when a certain + resource does not exist in the dataset + +* Fixed config field parsing for various modules. [chrisr3d] + + - Same as previous commit + +* [expansion] Better config field handling for various modules. [chrisr3d] + + - Testing if config is present before trying to + look whithin the config field + - The config field should be there when the module + is called form MISP, but it is not always the + case when the module is queried from somewhere else + +* [test expansion] Using CVE with lighter results. [chrisr3d] + +* Avoid issues when some config fields are not set. [chrisr3d] + +* Updated pipfile.lock with the correct geoip2 library info. [chrisr3d] + +* Fixed requirements for pymisp and geoip python libraries. [chrisr3d] + +* Fixed Geoip with the supported python library + fixed Geolite db path management. [chrisr3d] + +* Removed unused self param turning the associated functions into static methods. [chrisr3d] + +* Updates following the latest CVE-search version. [chrisr3d] + + - Support of the new vulnerable configuration + field for CPE version > 2.2 + - Support of different 'unknown CWE' message + +* Fixed module names with - to avoid errors with python paths. [chrisr3d] + +* Fixed tesseract python library issues. [Christian Studer] + + - Avoiding 'tesseract is not installed or it's not in your path' issues + +* Using absolute path to open files instead of relative path. [chrisr3d] + +* Removed unused import\ [chrisr3d] + +* Handling issues when the otx api is queried too often in a short time. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Avoiding empty values + Fixed empty types error + Fixed filename KeyError. [chrisr3d] + +* Fixed ThreatMiner results parsing. [chrisr3d] + +* Catching wikidata errors properly + fixed errors parsing. [chrisr3d] + +* Grouped two if conditions to avoid issues with variable unassigned if the second condition is not true. [chrisr3d] + +* Handling errors and exceptions for expansion modules tests that could fail due to a connection error. [chrisr3d] + +* Considering the case of empty results. [chrisr3d] + +* Catching results exceptions properly. [chrisr3d] + +* Catching exceptions and results properly depending on the cases. [chrisr3d] + +* Handling cases where there is no result from the query. [chrisr3d] + +* DBL spamhaus test. [chrisr3d] + +* Quick typo & dbl spamhaus test fixes. [chrisr3d] + +* Fixed pattern parsing + made the module hover only. [chrisr3d] + +* Travis tests should be happy now. [chrisr3d] + +* Copy paste syntax error. [chrisr3d] + +* Fixed greynoise test following the latest changes on the module. [chrisr3d] + +* Returning results in text format. [chrisr3d] + + - Makes the hover functionality display the full + result instead of skipping the records list + +* Making pep8 happy. [chrisr3d] + +* Avoiding errors with uncommon lines. [chrisr3d] + + - Excluding first from data parsed all lines that + are comments or empty + - Skipping lines with failing indexes + +* Fixed unassigned variable name. [chrisr3d] + +* Removed no longer used variables. [chrisr3d] + +* Csv import rework & improvement. [chrisr3d] + + - More efficient parsing + - Support of multiple csv formats + - Possibility to customise headers + - More improvement to come for external csv file + +* Making pep8 happy. [chrisr3d] + +* [tests] Fixed tests to avoid config issues with the cve module. [chrisr3d] + + - Config currently empty in the module, but being + updated soon with a pending pull request + +### Other + +* Add: Updated documentation with the EQL export module. [chrisr3d] + +* Merge branch 'master' of github.com:blaverick62/misp-modules. [chrisr3d] + +* Added documentation json for new modules. [Braden Laverick] + +* Updated README to include EQL modules. [Braden Laverick] + +* Add: Xforce Exchange module tests. [chrisr3d] + +* Merge pull request #347 from MISP/tests. [Christian Studer] + + More advanced expansion tests + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Add: Updated documentation with the latest modules info. [chrisr3d] + +* Updated README with new modules and fixed some links. [chrisr3d] + +* Add: Added test for vulners module. [chrisr3d] + +* Add: Added qrcode module test with its test image. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge pull request #346 from blaverick62/master. [Alexandre Dulaunoy] + + EQL Query Generation Modules + +* Removed extraneous comments and unused imports. [Braden Laverick] + +* Fixed python links. [Braden Laverick] + +* Changed file name to mass eql export. [Braden Laverick] + +* Fixed comments. [Braden Laverick] + +* Added ors for compound queries. [Braden Laverick] + +* Fixed syntax error. [Braden Laverick] + +* Changed to single attribute EQL. [Braden Laverick] + +* Added EQL enrichment module. [Braden Laverick] + +* Fixed string formatting. [Braden Laverick] + +* Fixed type error in JSON parsing. [Braden Laverick] + +* Attempting to import endgame module. [Braden Laverick] + +* Added endgame export to __all__ [Braden Laverick] + +* Added EQL export test module. [Braden Laverick] + +* Add: [test expansion] Added various tests for modules with api authentication. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Add: [test expansion] New modules tests. [chrisr3d] + + - Starting testing some modules with api keys + - Testing new apiosintDS module + +* Merge pull request #344 from davidonzo/master. [Alexandre Dulaunoy] + + Added apiosintDS module to query OSINT.digitalside.it services + +* Added apiosintDS module to query OSINT.digitalside.it services. [Davide] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #345 from 0xmilkmix/fix_geoip2. [Alexandre Dulaunoy] + + updated to geoip2 to support mmdb format + +* Updated to geoip2 to support mmdb format. [milkmix] + +* Add: cve_advanced module test + functions to test attributes and objects results. [chrisr3d] + +* Merge pull request #342 from MISP/tests. [Christian Studer] + + More expansion tests + +* Merge branch 'tests' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Add: Tests for all the office, libreoffice, pdf & OCR enrich modules. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Add: threatminer module test. [chrisr3d] + +* Add: Tests for expansion modules with different input types. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #339 from MISP/tests. [Christian Studer] + + Expansion modules tests update + +* Add: Added tests for the rest of the easily testable expansion modules. [chrisr3d] + + - More tests for more complex modules to come soon + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge branch 'tests' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: Tests for sigma queries and syntax validator modules. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into tests. [chrisr3d] + +* Add: More modules tested. [chrisr3d] + +* Add: Added tests for some expansion modules without API key required. [chrisr3d] + + - More tests to come + +* Merge pull request #338 from MISP/features_csvimport. [Christian Studer] + + Fixed the CSV import module + +* Merge pull request #335 from FafnerKeyZee/patch-2. [Christian Studer] + + Travis should not be complaining with the tests after the latest update on "test_cve" + +* Adding custom API. [Fafner [_KeyZee_]] + + Adding the possibility to have our own API server. + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #334 from FafnerKeyZee/patch-1. [Alexandre Dulaunoy] + + Cleaning the error message + +* Cleaning the error message. [Fafner [_KeyZee_]] + + The original message can be confusing is the user change to is own API. + + +## v2.4.116 (2019-09-17) + +### Other + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #329 from 8ear/8ear-add-mkdocs-documentation. [Alexandre Dulaunoy] + + Update mkdocs documentation + +* Fixing Install.md. [8ear] + +* Fix Install.md. [8ear] + +* Change Install documentation. [8ear] + +* Merge pull request #328 from 8ear/8ear-add-docker-capabilitites. [Alexandre Dulaunoy] + + Add Docker Capabilitites + +* Add .travis.yml command for docker build. [8ear] + +* Merge github.com:MISP/misp-modules into 8ear-add-docker-capabilitites. [8ear] + +* Disable not required package virtualenv for final stage. [8ear] + +* Fix entrypoint bug. [8ear] + +* Improve the Dockerfile. [8ear] + +* Add Dockerfile, Entrypoint and Healthcheck script. [8ear] + +* Update install doc. [8ear] + +* Bugfixing for MISP-modules. [8ear] + +* Add: New parameter to specify a custom CVE API to query. [chrisr3d] + + - Any API specified here must return the same + format as the CIRCL CVE search one in order to + be supported by the parsing functions, and + ideally provide response to the same kind of + requests (so the CWE search works as well) + + +## v2.4.114 (2019-08-30) + +### Changes + +* [cuckooimport] Handle archives downloaded from both the WebUI and the API. [Pierre-Jean Grenier] + +### Fix + +* Prevent symlink attacks. [Pierre-Jean Grenier] + +* Have I been pwned API changed again. [Raphaël Vinot] + +### Other + +* Merge pull request #327 from zaphodef/cuckooimport. [Alexandre Dulaunoy] + + fix: prevent symlink attacks + +* Merge pull request #326 from zaphodef/cuckooimport. [Alexandre Dulaunoy] + + chg: [cuckooimport] Handle archives downloaded from both the WebUI and the API + + +## v2.4.113 (2019-08-19) + +### New + +* Rewrite cuckooimport. [Pierre-Jean Grenier] + +### Changes + +* Update PyMISP version. [Pierre-Jean Grenier] + +### Fix + +* Avoiding issues when no CWE id is provided. [chrisr3d] + +* Fixed unnecessary dictionary field call. [chrisr3d] + + - No longer necessary to go under 'Event' field + since PyMISP does not contain it since the + latest update + +### Other + +* Merge pull request #322 from zaphodef/cuckooimport. [Alexandre Dulaunoy] + + Rewrite cuckooimport + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: Added initial event to reference it from the vulnerability object created out of it. [chrisr3d] + + +## v2.4.112 (2019-08-02) + +### New + +* First version of an advanced CVE parser module. [chrisr3d] + + - Using cve.circl.lu as well as the initial module + - Going deeper into the CVE parsing + - More parsing to come with the CWE, CAPEC and so on + +### Changes + +* [docs] add additional references. [Alexandre Dulaunoy] + +* [travis] revert. [Alexandre Dulaunoy] + +* [travis] github token. [Alexandre Dulaunoy] + +* [travis] mkdocs disabled for the time being. [Alexandre Dulaunoy] + +* [doc] Fix #317 - update the link to the latest version of the training. [Alexandre Dulaunoy] + +* [doc] README updated to the latest version. [Alexandre Dulaunoy] + +* [docs] symbolic link removed. [Alexandre Dulaunoy] + +* [docs] add logos symbolic link. [Alexandre Dulaunoy] + +* Add print to figure out what's going on on travis. [Raphaël Vinot] + +* Bump dependencies. [Raphaël Vinot] + +* Updated the module to work with the updated VirusTotal API. [chrisr3d] + + - Parsing functions updated to support the updated + format of the VirusTotal API responses + - The module can now return objects + - /!\ This module requires a high number of + requests limit rate to work as expected /!\ + +* Adding references between a domain and their siblings. [chrisr3d] + +* Getting domain siblings attributes uuid for further references. [chrisr3d] + +### Fix + +* Using the attack-pattern object template (copy-paste typo) [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Fixed cvss-score object relation name. [chrisr3d] + +* Avoid issues when there is no pe field in a windows file sample analysis. [chrisr3d] + + - For instance: doc file + +* Avoid adding file object twice if a KeyError exception comes for some unexpected reasons. [chrisr3d] + +* Testing if file & registry activities fields exist before trying to parse it. [chrisr3d] + +* Testing if there is some screenshot data before trying to fetch it. [chrisr3d] + +* Fixed direction of the relationship between files, PEs and their sections. [chrisr3d] + + - The file object includes a PE, and the PE + includes sections, not the other way round + +* Fixed variable names. [chrisr3d] + +* Wrong change in last commit. [Raphaël Vinot] + +* Skip tests on haveibeenpwned.com if 403. Make pep8 happy. [Raphaël Vinot] + +* Changed the way references added at the end are saved. [chrisr3d] + + - Some references are saved until they are added + at the end, to make it easier when needed + - Here we changed the way they are saved, from a + dictionary with some keys to identify each part + to the actual dictionary with the keys the + function add_reference needs, so we can directly + use this dictionary as is when the references are + added to the different objects + +* Fixed link in documentation. [chrisr3d] + +* Avoiding issues with non existing sample types. [chrisr3d] + +* Undetected urls are represented in lists. [chrisr3d] + +* Changed function name to avoid confusion with the same variable name. [chrisr3d] + +* Quick fix on siblings & url parsing. [chrisr3d] + +* Typo. [chrisr3d] + +* Parsing detected & undetected urls. [chrisr3d] + +* Various fixes about typo, variable names, data types and so on. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +### Other + +* Merge pull request #319 from 8ear/8ear-add-mkdocs-documentation. [Alexandre Dulaunoy] + + Add `make deploy` to Makefile + +* Added docker and non-docker make commands. [8ear] + +* Add `make deploy` [8ear] + +* Merge pull request #318 from chrisr3d/master. [Christian Studer] + + Updated cve_advanced module to parse CWE and CAPEC data related to the CVE + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: Making vulnerability object reference to its related capec & cwe objects. [chrisr3d] + +* Add: Parsing CAPEC information related to the CVE. [chrisr3d] + +* Add: Parsing CWE related to the CVE. [chrisr3d] + +* Merge pull request #316 from 8ear/8ear-add-mkdocs-documentation. [Alexandre Dulaunoy] + + Add web documentation via mkdocs + +* Fix Bugs. [8ear] + +* Fix Fossa in index.md. [8ear] + +* Delete unused file. [8ear] + +* Change mkdocs deploy method. [8ear] + +* Change index.md. [8ear] + +* Merge branch 'master' into 8ear-add-mkdocs-documentation. [Max H] + +* Add: Parsing linux samples and their elf data. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: Parsing apk samples and their permissions. [chrisr3d] + +* Add: Added virustotal_public to the list of available modules. [chrisr3d] + +* Add: TODO comment for the next improvement. [chrisr3d] + +* Add: [documentation] Updated README and documentation with the virustotal modules changes. [chrisr3d] + +* Add: Parsing communicating samples returned by domain reports. [chrisr3d] + +* Add: Parsing downloaded samples as well as the referrer ones. [chrisr3d] + +* Add: Object for VirusTotal public API queries. [chrisr3d] + + - Lighter analysis of the report to avoid reaching + the limit of queries per minute while recursing + on the different elements + +* Add: Updated README file with the new module description. [chrisr3d] + +* Change contribute.md. [8ear] + +* Update index.md. [8ear] + +* Add mkdocs as a great web documentation. [8ear] + +* Merge pull request #1 from fossabot/master. [Max H] + + Add license scan report and status + +* Add license scan report and status. [fossabot] + + +## v2.4.110 (2019-07-08) + +### New + +* [doc] Joe Sandbox added in the list. [Alexandre Dulaunoy] + +* Expansion module to query urlhaus API. [chrisr3d] + + - Using the next version of modules, taking a + MISP attribute as input and able to return + attributes and objects + - Work still in process in the core part + +### Changes + +* [documentation] Making URLhaus visible from the github page. [chrisr3d] + + - Because of the white color, the logo was not + visible at all + +* Moved JoeParser class to make it reachable from expansion & import modules. [chrisr3d] + +* [install] REQUIREMENTS file updated. [Alexandre Dulaunoy] + +* [install] Pipfile.lock updated. [Alexandre Dulaunoy] + +* [requirements] Python API wrapper for the Joe Sandbox API added. [Alexandre Dulaunoy] + +* Bump dependencies. [Raphaël Vinot] + +* [pep8] try/except # noqa. [Steve Clement] + + Not sure how to make flake happy on this one. + +* Updated csvimport to support files from csv export + import MISP objects. [chrisr3d] + +### Fix + +* Added missing add_attribute function. [chrisr3d] + +* [documentation] Fixed json file name. [chrisr3d] + +* [documentation] Fixed some description & logo. [chrisr3d] + +* Testing if an object is not empty before adding it the the event. [chrisr3d] + +* Making travis happy. [chrisr3d] + +* Support of the latest version of sigmatools. [chrisr3d] + +* We will display galaxies with tags. [chrisr3d] + +* Returning tags & galaxies with results. [chrisr3d] + + - Tags may exist with the current version of the + parser + - Galaxies are not yet expected from the parser, + nevertheless the principle is we want to return + them as well if ever we have some galaxies from + parsing a JoeSandbox report. Can be removed if + we never galaxies at all + +* Removed duplicate finalize_results function call. [chrisr3d] + +* Making pep8 happy + added joe_import module in the init list. [chrisr3d] + +* Fixed variable name typo. [chrisr3d] + +* Fixed references between domaininfo/ipinfo & their targets. [chrisr3d] + + - Fixed references when no target id is set + - Fixed domaininfo parsing when no ip is defined + +* Some quick fixes. [chrisr3d] + + - Fixed strptime matching because months are + expressed in abbreviated format + - Made data loaded while the parsing function is + called, in case it has to be called multiple + times at some point + +* Making pep8 & travis happy. [chrisr3d] + +* Added references between processes and the files they drop. [chrisr3d] + +* Avoiding network connection object duplicates. [chrisr3d] + +* Avoid creating a signer info object when the pe is not signed. [chrisr3d] + +* Avoiding dictionary indexes issues. [chrisr3d] + + - Using tuples as a dictionary indexes is better + than using generators... + +* Avoiding attribute & reference duplicates. [chrisr3d] + +* Handling case of multiple processes in behavior field. [chrisr3d] + + - Also starting parsing file activities + +* Testing if some fields exist before trying to import them. [chrisr3d] + + - Testing for pe itself, pe versions and pe signature + +* Removed test print. [chrisr3d] + +* Fixed output format to match with the recent changes on modules. [chrisr3d] + +* Making pep8 happy. [chrisr3d] + +* Checking not MISP header fields. [chrisr3d] + + - Rejecting fields not recognizable by MISP + +* Using pymisp classes & methods to parse the module results. [chrisr3d] + +* Clearer user config messages displayed in the import view. [chrisr3d] + +* Removed unused library. [chrisr3d] + +* Make pep8 happy. [chrisr3d] + +* [pep8] More fixes. [Steve Clement] + +* [pep8] More pep8 happiness. [Steve Clement] + +* [pep8] Fixes. [Steve Clement] + +* Fixed standard MISP csv format header. [root] + + - The csv header we can find in data produced from + MISP restSearch csv format is the one to use to + recognize a csv file produced by MISP + +* Fixed introspection fields for csvimport & goamlimport. [root] + + - Added format field for goaml so the module is + known as returning MISP attributes & objects + - Fixed introspection to make the format, user + config and input source fields visible from + MISP (format also added at the same time) + +* Fixed libraries import that changed with the latest merge. [root] + +* Fixed fields parsing to support files from csv export with additional context. [chrisr3d] + +* Handling the case of Context included in the csv file exported from MISP. [chrisr3d] + +* Fixed changes omissions in handler function. [chrisr3d] + +* Fixed object_id variable name typo. [root] + +* Making json_decode even happier with full json format. [chrisr3d] + + - Using MISPEvent because it is cleaner & easier + - Also cleaner implementation globally + +* Using to_dict on attributes & objects instead of to_json to make json_decode happy in the core part. [chrisr3d] + +### Other + +* Add: [documentation] Added some missing documentation for the most recently added modules. [chrisr3d] + +* Add: [documentation] Added documentation for Joe Sandbox & URLhaus. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #309 from Kortho/patch-2. [Steve Clement] + + changed service pointer + +* Changed service pointer. [Kortho] + + Changed so the service starts the modules in the venv where they are installed + +* Merge pull request #308 from Kortho/patch-1. [Steve Clement] + + Fixed missing dependencies for RHEL install + +* Fixed missing dependencies for RHEL install. [Kortho] + + Added dependencies needed for installing the python library pdftotext + +* Add: Added screenshot of the behavior of the analyzed sample. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #307 from ninoseki/fix-missing-links. [Alexandre Dulaunoy] + + Fix missing links in README.md + +* Fix missing links in README.md. [Manabu Niseki] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #306 from MISP/new_module. [Alexandre Dulaunoy] + + New modules able to return MISP objects + +* Add: Added new modules to the list. [chrisr3d] + +* Merge branch 'new_module' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #305 from joesecurity/new_module. [Alexandre Dulaunoy] + + joesandbox_query.py: improve behavior in unexpected circumstances + +* Joesandbox_query.py: improve behavior in unexpected circumstances. [Georg Schölly] + +* Add: New expansion module to query Joe Sandbox API with a report link. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'joesecurity-joesandbox_submit' [Alexandre Dulaunoy] + +* Merge branch 'joesandbox_submit' of https://github.com/joesecurity/misp-modules into joesecurity-joesandbox_submit. [Alexandre Dulaunoy] + +* Add expansion for joe sandbox. [Georg Schölly] + +* Merge pull request #304 from joesecurity/new_module. [Alexandre Dulaunoy] + + add support for url analyses + +* Support url analyses. [Georg Schölly] + +* Improve forwards-compatibility. [Georg Schölly] + +* Add: Parsing MITRE ATT&CK tactic matrix related to the Joe report. [chrisr3d] + +* Add: Parsing domains, urls & ips contacted by processes. [chrisr3d] + +* Add: Starting parsing dropped files. [chrisr3d] + +* Add: Starting parsing network behavior fields. [chrisr3d] + +* Add: Parsing registry activities under processes. [chrisr3d] + +* Add: Parsing processes called by the file analyzed in the joe sandbox report. [chrisr3d] + +* Add: Parsing some object references at the end of the process. [chrisr3d] + +* Add: [new_module] Module to import data from Joe sandbox reports. [chrisr3d] + + - Parsing file, pe and pe-section objects from the + report file info field + - Deeper file info parsing to come + - Other fields parsing to come as well + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #300 from cudeso/master. [Alexandre Dulaunoy] + + Bugfix for "sources" ; do not include as IDS for "access" registry keys + +* Bugfix for "sources" ; do not include as IDS for "access" registry keys. [Koen Van Impe] + + - Bugfix to query "operations" in files, mutex, registry + - Do not set IDS flag for registry 'access' operations + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* New VMRay modules (#299) [Steve Clement] + + New VMRay modules + +* New VMRay modules. [Koen Van Impe] + + New JSON output format of VMRay + Prepare for automation (via PyMISP) with workflow taxonomy tags + +* Merge pull request #1 from MISP/master. [Koen Van Impe] + + Sync + +* Add: Added urlhaus in the expansion modules init list. [root] + +* Merge branch 'new_module' of https://github.com/MISP/misp-modules into new_module. [root] + +* Merge branch 'features_csvimport' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into features_csvimport. [chrisr3d] + +* Merge branch 'features_csvimport' of github.com:MISP/misp-modules into features_csvimport. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into features_csvimport. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into features_csvimport. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'new_module' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge branch 'master' of https://github.com/MISP/misp-modules into new_module. [root] + +* Merge branch 'master' of https://github.com/MISP/misp-modules into new_module. [root] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + + +## v2.4.106 (2019-04-27) + +### New + +* Devel mode. [Raphaël Vinot] + + Fix #293 + +* Modules for greynoise, haveibeenpwned and macvendors. [Raphaël Vinot] + +* Add missing dependency (backscatter) [Raphaël Vinot] + +* Add systemd launcher. [Raphaël Vinot] + +* Intel471 module. [Raphaël Vinot] + +* [btc] Very simple BTC expansion chg: [req] yara-python is preferred. [Steve Clement] + +* First version of a yara rule creation expansion module. [chrisr3d] + +* Documentation concerning modules explained in markdown file. [chrisr3d] + +* Expansion hover module to check spamhaus DBL for a domain name. [chrisr3d] + +### Changes + +* [doc] install of deps updated. [Alexandre Dulaunoy] + +* Bump REQUIREMENTS. [Raphaël Vinot] + +* Bump dependencies. [Raphaël Vinot] + +* [doc] new MISP expansion modules added for PDF, OCR, DOCX, XLSX, PPTX , ODS and ODT. [Alexandre Dulaunoy] + +* [init] cleanup for pep. [Alexandre Dulaunoy] + +* [pdf-enrich] updated. [Alexandre Dulaunoy] + +* [Pipfile] collection removed. [Alexandre Dulaunoy] + +* Bump dependencies. [Raphaël Vinot] + +* [doc] Added new dependencies and updated RHEL/CentOS howto. (#295) [Steve Clement] + + chg: [doc] Added new dependencies and updated RHEL/CentOS howto. + +* [doc] Added new dependencies and updated RHEL/CentOS howto. [Steve Clement] + +* [init] removed trailing whitespace. [Alexandre Dulaunoy] + +* [ocr] re module not used - removed. [Alexandre Dulaunoy] + +* Bump dependencies, update REQUIREMENTS file. [Raphaël Vinot] + +* [doc] cuckoo_submit module added. [Alexandre Dulaunoy] + +* Require python3 instead of python 3.6. [Raphaël Vinot] + +* [travis] because we all need sudo. [Alexandre Dulaunoy] + +* [travis] because everyone need a bar. [Alexandre Dulaunoy] + +* [doc] qrcode and Cisco FireSight added. [Alexandre Dulaunoy] + +* [qrcode] add requirements. [Alexandre Dulaunoy] + +* [qrcode] added to the __init__ [Alexandre Dulaunoy] + +* [qrcode] flake8 needs some drugs. [Alexandre Dulaunoy] + +* [qrcode] various fixes to make it PEP compliant. [Alexandre Dulaunoy] + +* Bump dependencies. [Raphaël Vinot] + + Fix CVE-2019-11324 (urllib3) + +* Bump Dependencies. [Raphaël Vinot] + +* [doc] Updated README to reflect current virtualenv efforts. TODO: pipenv. [Steve Clement] + +* [doc] new modules added. [Alexandre Dulaunoy] + +* Bump dependencies. [Raphaël Vinot] + +* Bump dependencies. [Raphaël Vinot] + +* Bump Requirements. [Raphaël Vinot] + +* [doc] asciidoctor requirement removed (new PDF module use reportlab) [Alexandre Dulaunoy] + +* Bump dependencies, add update script. [Raphaël Vinot] + +* [doc] PDF export. [Alexandre Dulaunoy] + +* [pdfexport] make flake8 happy. [Alexandre Dulaunoy] + +* [pipenv] fix the temporary issue that python-yara is not officially released. [Alexandre Dulaunoy] + +* [requirements] reportlab added. [Alexandre Dulaunoy] + +* [pipenv] Pipfile.lock updated. [Alexandre Dulaunoy] + +* [requirements] updated. [Alexandre Dulaunoy] + +* [PyMISP] dep updated to the latest version. [Alexandre Dulaunoy] + +* PyMISP requirement. [Alexandre Dulaunoy] + +* [pypi] Made sure url-normalize installs less stric. [Steve Clement] + +* [btc_scam_check] fix spacing for making flake 8 happy. [Alexandre Dulaunoy] + +* [backscatter.io] blind fix regarding undefined value. [Alexandre Dulaunoy] + +* [doc] backscatter.io updated. [Alexandre Dulaunoy] + +* [doc] backscatter.io documentation added. [Alexandre Dulaunoy] + +* [backscatter.io] remove blank line at the end of the file. [Alexandre Dulaunoy] + +* [backscatter.io] Exception handler fixed for recent version of Python. [Alexandre Dulaunoy] + +* Bump dependencies. [Raphaël Vinot] + +* Use pipenv, update bgpranking/ipasn modules. [Raphaël Vinot] + +* [doc] Nexthink module added. [Alexandre Dulaunoy] + +* [doc] osquery export module added. [Alexandre Dulaunoy] + +* [doc] Nexthink export format added. [Alexandre Dulaunoy] + +* [doc] cannot type today. [Alexandre Dulaunoy] + +* [intel471] module added. [Alexandre Dulaunoy] + +* Regenerated documentation markdown file. [chrisr3d] + +* [onyphe] fix #252. [Alexandre Dulaunoy] + +* [btc] Removed simple PoC for btc expansion. [Steve Clement] + +* [doc] btc module added. [Alexandre Dulaunoy] + +* [doc] generated documentation updated. [Alexandre Dulaunoy] + +* [doc] btc module added to documentation. [Alexandre Dulaunoy] + +* [tools] Added psutil as a dependency to detect misp-modules PID. [Steve Clement] + +* [init] Added try/catch in case misp-modules is already running on a port, or port is in use... [Steve Clement] + +* Validating yara rules after their creation. [chrisr3d] + +* [documentation] osquery logo added. [Alexandre Dulaunoy] + +* [documentation] generated. [Alexandre Dulaunoy] + +* [docs] Added some missing dependencies and instructions for virtualenv deployment. [Steve Clement] + +* [doc] documentation generator updated to include links to source code. [Alexandre Dulaunoy] + +* Changed documentation markdown file name. [chrisr3d] + +* Structurded data. [chrisr3d] + +* Modified the mapping dictionary to support misp-objects updates. [chrisr3d] + +* Modified output format. [chrisr3d] + +* Add new dependency (oauth2) [Raphaël Vinot] + +* Dnspython3 has been superseded by the regular dnspython kit. [Raphaël Vinot] + +* Wikidata module added. [Alexandre Dulaunoy] + +* SPARQLWrapper added (for wikidata module) [Alexandre Dulaunoy] + +### Fix + +* Re-enable python 3.6 support. [Raphaël Vinot] + +* CTRL+C is working again. [Raphaël Vinot] + + Fix #292 + +* Make flake8 happy. [Raphaël Vinot] + +* [doc] Small typo fix. [Steve Clement] + +* Pep8 foobar. [Raphaël Vinot] + +* Add the new module sin the list of modules availables. [Raphaël Vinot] + +* Typos in variable names. [Raphaël Vinot] + +* Remove unused import. [Raphaël Vinot] + +* Tornado expects a KILL now. [Raphaël Vinot] + +* [exportpdf] update documentation. [Falconieri] + +* [exportpdf] custom path parameter. [Falconieri] + +* [exportpdf] add parameters. [Falconieri] + +* [exportpdf] mising whitespace. [Falconieri] + +* [exportpdf] problem on one line. [Falconieri] + +* [exportpdf] add configmodule parameter for galaxy. [Falconieri] + +* [reportlab] Textual description parameter. [Falconieri] + +* [pdfexport] Bugfix on PyMisp exportpdf call. [Falconieri] + +* Systemd service. [Raphaël Vinot] + +* Regenerated documentation. [chrisr3d] + +* Description fixed. [chrisr3d] + +* Pep8 related fixes. [Raphaël Vinot] + +* Make flake8 happy. [Raphaël Vinot] + +* Change in the imports in other sigma module. [Raphaël Vinot] + +* Change in the imports. [Raphaël Vinot] + +* Change module name. [Raphaël Vinot] + +* Allow redis details to be retrieved from environment variables. [Ruiwen Chua] + +* Remove tests on python 3.5. [Raphaël Vinot] + +* Make pep8 happy. [Raphaël Vinot] + +* Removed not valid input type. [chrisr3d] + +* Cleaned up not used variables. [chrisr3d] + +* Updated rbl module result format. [chrisr3d] + + - More readable as str than dumped json + +* Added Macaddress.io module in the init list. [chrisr3d] + +* Typo on input type. [chrisr3d] + +* Fixed type of the result in case of exception. [chrisr3d] + + - Set as str since some exception types are not + jsonable + +* Added hostname attribute support as it is intended. [chrisr3d] + +* Threatanalyzer_import - bugfix for TA6.1 behavior. [Christophe Vandeplas] + +* Displaying documentation items of each module by alphabetic order. [chrisr3d] + + - Also regenerated updated documentation markdown + +* Updated yara import error message. [chrisr3d] + + - Better to 'pip install -I -r REQUIREMENTS' to + have the correct yara-python version working + for all the modules, than having another one + failing with yara hash & pe modules + +* Specifying a yara-python version that works for hash & pe yara modules. [chrisr3d] + +* Making yara query an expansion module for single attributes atm. [chrisr3d] + +* Catching errors while parsing additional info in requests. [chrisr3d] + +* Reduced logos size. [chrisr3d] + +* Typo for separator between each explained module. [chrisr3d] + +* Making python 3.5 happy with the exception type ImportError. [chrisr3d] + +* Fixed exception type for python 3.5. [chrisr3d] + +* Fixed exception type. [chrisr3d] + +* Fixed syntax error. [chrisr3d] + +* Fixed indentation error. [chrisr3d] + +* Fixed 1 variable misuse + cleaned up variable names. [chrisr3d] + + - Fixed use of 'domain' variable instead of 'email' + - Cleaned up variable names to avoid redefinition + of built-in variables + +* Avoiding adding attributes that are already in the event. [chrisr3d] + +* Fixed quick variable issue. [chrisr3d] + +* Cleaned up test function not used anymore. [chrisr3d] + +* Multiple attributes parsing support. [chrisr3d] + + - Fixing one of my previous changes not processing + multiple attributes parsing + +* Removed print. [chrisr3d] + +* Some cleanup and output types fixed. [chrisr3d] + + - hashes types specified in output + +* Quick cleanup. [chrisr3d] + +* Quick cleanup. [chrisr3d] + +* Ta_import - bugfixes. [Christophe Vandeplas] + +* [cleanup] Quick clean up on exception type. [chrisr3d] + +* [cleanup] Quick clean up on yaml load function. [chrisr3d] + +* [cleanup] Quick clean up on exception type. [chrisr3d] + +* Put the report location parsing in a try/catch statement as it is an optional field. [chrisr3d] + +* Put the stix2-pattern library import in a try statement. [chrisr3d] + + --> Error more easily caught + +* Removed STIX related libraries, files, documentation, etc. [chrisr3d] + +* Avoid trying to build attributes with not intended fields. [chrisr3d] + + - Previously: if the header field is not an attribute type, then + it was added as an attribute field. + PyMISP then used to skip it if needed + + - Now: Those fields are discarded before they are put in an attribute + +* Using userConfig to define the header instead of moduleconfig. [chrisr3d] + +* Fixed input & output of the module. [chrisr3d] + +* Added an object checking. [Christian Studer] + + - Checking if there are objects in the event, and then if there is at least 1 transaction object + - This prevents the module from crashing, but does not guaranty having a valid GoAML file (depending on objects and their relations) + +* Fixed input & output of the module. [chrisr3d] + + Also updated some functions + +* Fixed typo of the aml type for country codes. [chrisr3d] + +* Typo in references mapping dictionary. [chrisr3d] + +* Added an object checking. [chrisr3d] + + - Checking if there are objects in the event, and then + if there is at least 1 transaction object + - This prevents the module from crashing, but does not + guaranty having a valid GoAML file (depending on + objects and their relations) + +* Added the moduleinfo field need to have MISP event in standard format. [chrisr3d] + +* Missing cve module test. [Alexandre Dulaunoy] + +* Goamlexport added. [Alexandre Dulaunoy] + +* Python version in Travis. [Alexandre Dulaunoy] + +* Solved reading problems for some files. [chrisr3d] + +* Skipping empty lines. [chrisr3d] + +* Make travis happy. [Raphaël Vinot] + +* OpenIOC importer. [Raphaël Vinot] + +* #137 when a CVE is not found, a return message is given. [Alexandre Dulaunoy] + +* Use the proper formatting method and not the horrible % one. [Hannah Ward] + +* Misp-modules are by default installed in /bin. [Alexandre Dulaunoy] + +* Module_config should be set as introspection relies on it. [Alexandre Dulaunoy] + +* Types array. [Alexandre Dulaunoy] + +* Run the server as "python3 misp-modules" [Raphaël Vinot] + +* Stupid off-by-n line... [Alexandre Dulaunoy] + +### Other + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Removed trailing whitespaces. [Sascha Rommelfangen] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Sascha Rommelfangen] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* New modules added. [Sascha Rommelfangen] + +* New requirements for new modules. [Sascha Rommelfangen] + +* Introduction of new modules. [Sascha Rommelfangen] + +* Merge remote-tracking branch 'upstream/master' [Steve Clement] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Sascha Rommelfangen] + +* Renamed file. [Sascha Rommelfangen] + +* Renamed module. [Sascha Rommelfangen] + +* Initial version of OCR expansion module. [Sascha Rommelfangen] + +* Merge pull request #291 from Evert0x/submitcuckoo. [Alexandre Dulaunoy] + + Expansion module - File/URL submission to Cuckoo Sandbox + +* Generate latest version of documentation. [Ricardo van Zutphen] + +* Document Cuckoo expansion module. [Ricardo van Zutphen] + +* Use double quotes and provide headers correctly. [Ricardo van Zutphen] + +* Update Cuckoo module to support files and URLs. [Ricardo van Zutphen] + +* Update __init__.py. [Evert0x] + +* Create cuckoo_submit.py. [Evert0x] + +* Brackets are difficult... [Sascha Rommelfangen] + +* Merge branch 'qr-code-module' of https://github.com/rommelfs/misp-modules into rommelfs-qr-code-module. [Alexandre Dulaunoy] + +* Initial version of QR code reader. [Sascha Rommelfangen] + + Module accepts attachments and processes pictures. It tries to identify and analyze an existing QR code. + Identified values can be inserted into the event. + +* Merge branch 'iceone23-patch-1' [Raphaël Vinot] + +* Create cisco_firesight_manager_ACL_rule_export.py. [iceone23] + + Cisco Firesight Manager ACL Rule Export module + +* Merge pull request #289 from SteveClement/master. [Steve Clement] + + fix: [doc] Small typo fix + +* Merge remote-tracking branch 'upstream/master' [Steve Clement] + +* Merge pull request #285 from wesinator/patch-1. [Alexandre Dulaunoy] + + Fix command highlighting + +* Fix command highlighting. [Ԝеѕ] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Sascha Rommelfangen] + +* Merge pull request #284 from Vincent-CIRCL/master. [Alexandre Dulaunoy] + + fix: [exportpdf] custom path parameter + +* Merge pull request #283 from Vincent-CIRCL/master. [Alexandre Dulaunoy] + + fix: [exportpdf] add parameters + +* Merge pull request #281 from Vincent-CIRCL/master. [Alexandre Dulaunoy] + + fix: [exportpdf] add configmodule parameter for galaxy + +* Merge pull request #282 from cgi1/patch-1. [Alexandre Dulaunoy] + + Adding virtualenv to apt-get install + +* Adding virtualenv to apt-get install. [cgi1] + +* Merge pull request #279 from Vincent-CIRCL/master. [Alexandre Dulaunoy] + + fix: [reportlab] Textual description parameter + +* Chr: Restart the modules after update. [Raphaël Vinot] + +* Fixed a bug when checking malformed BTC addresses. [Sascha Rommelfangen] + +* Merge remote-tracking branch 'upstream/master' [Steve Clement] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #278 from Vincent-CIRCL/master. [Alexandre Dulaunoy] + + chg: [pdfexport] Fix pdf export, by calling new PyMISP tool for Misp Event export + +* Fix [exportpdf] update parameters for links generation. [Falconieri] + +* Tidy: Remove old dead export code. [Falconieri] + +* Test 1 - PDF call. [Falconieri] + +* Print values. [Vincent-CIRCL] + +* Test update. [Vincent-CIRCL] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #276 from iwitz/patch-1. [Alexandre Dulaunoy] + + Add RHEL installation instructions + +* Add: rhel installation instructions. [iwitz] + +* Add: [doc] Added backscatter.io logo + regenerated documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into new_module. [chrisr3d] + +* Merge pull request #274 from 9b/master. [Alexandre Dulaunoy] + + Backscatter.io expansion module + +* Use the write var on return. [9b] + +* Stubbed module. [9b] + +* Add: New module to check if a bitcoin address has been abused. [chrisr3d] + + - Also related update of documentation + +* Sometimes server doesn't return expected values. fixed. [Sascha Rommelfangen] + +* Merge pull request #266 from MISP/pipenv. [Raphaël Vinot] + + chg: Use pipenv, update bgpranking/ipasn modules, fix imports for sigma + +* Merge pull request #259 from ruiwen/fix_redis. [Alexandre Dulaunoy] + + fix: allow redis details to be retrieved from environment variables + +* Add: [doc] link documentation to README. [Alexandre Dulaunoy] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #258 from HacknowledgeCH/export_nexthink. [Alexandre Dulaunoy] + + Export nexthink + +* Added 2 blank lines to comply w/ pep8. [milkmix] + +* Removed unused re module. [milkmix] + +* Added documentation. [milkmix] + +* Added domain attributes support. [milkmix] + +* Support for md5 and sha1 hashes. [milkmix] + +* First export feature: sha1 attributes nxql query. [milkmix] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Sascha Rommelfangen] + +* Add: Added missing expansion modules in readme. [chrisr3d] + +* Add: Completed documentation for expansion modules. [chrisr3d] + +* Add: Updated more expansion documentation files. [chrisr3d] + +* Add: Added new documentation for hashdd module. [chrisr3d] + +* Add: Update to support sha1 & sha256 attributes. [chrisr3d] + +* Add: More documentation on expansion modules. [chrisr3d] + +* Add: Started filling some expansion modules documentation. [chrisr3d] + +* Add: Added yara_query module documentation, update yara_syntax_validator documentation & generated updated documentation markdown. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Add: Added test files for yara to test yara library & potentially yara syntax. [chrisr3d] + +* Add: Added imphash to input attribute types. [chrisr3d] + +* Cosmetic output change. [Sascha Rommelfangen] + +* Debug removed. [Sascha Rommelfangen] + +* API changes reflected. [Sascha Rommelfangen] + +* Merge pull request #253 from MISP/chrisr3d_patch. [Alexandre Dulaunoy] + + Validation of yara rules + +* Merge branch 'master' of github.com:MISP/misp-modules into chrisr3d_patch. [chrisr3d] + +* Merge pull request #251 from MISP/rommelfs-patch-4. [Raphaël Vinot] + + bug fix regarding leftovers between runs + +* Bug fix regarding leftovers between runs. [Sascha Rommelfangen] + +* Merge pull request #250 from SteveClement/btc. [Steve Clement] + + chg: [btc] Removed simple PoC for btc expansion. + +* Merge pull request #249 from MISP/rommelfs-patch-3. [Steve Clement] + + added btc_steroids + +* Added btc_steroids. [Sascha Rommelfangen] + +* Merge pull request #248 from rommelfs/master. [Sascha Rommelfangen] + + Pull request for master + +* Added btc_steroids to the list. [Sascha Rommelfangen] + +* Initial version of a Bitcoin module. [Sascha Rommelfangen] + +* Merge pull request #247 from SteveClement/btc. [Alexandre Dulaunoy] + + new: [module] Added very simple BitCoin expansion/hover module + +* Merge pull request #245 from chrisr3d/master. [Alexandre Dulaunoy] + + YARA rules from hashes expansion module + +* Updated list of modules in readme. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: [documentation] osquery logo. [Alexandre Dulaunoy] + +* Merge pull request #241 from 0xmilkmix/doc_osqueryexport. [Alexandre Dulaunoy] + + Added basic documentation for OS query + +* Merge branch 'master' into doc_osqueryexport. [Alexandre Dulaunoy] + +* Merge pull request #240 from 0xmilkmix/support_osquery_win_named_obj. [Alexandre Dulaunoy] + + super simple support for mutexes through winbaseobj in osquery 3.3 + +* Merge branch 'master' into support_osquery_win_named_obj. [Alexandre Dulaunoy] + +* Merge pull request #242 from 0xmilkmix/module_writting. [Steve Clement] + + chg: [doc] Additional documentation for export module + +* Documentation for export module. [milkmix] + +* Super simple support for mutexes through winbaseobj in osquery 3.3. [milkmix] + +* Added basic documentation. [milkmix] + +* Merge pull request #239 from SteveClement/master. [Steve Clement] + + chg: [docs] Added some missing dependencies and instructions for virtualenv deployment + +* Merge pull request #237 from 0xmilkmix/export_osquery. [Alexandre Dulaunoy] + + Export osquery + +* Merge branch 'master' into export_osquery. [Julien Bachmann] + +* Merge pull request #232 from CodeLineFi/master. [Alexandre Dulaunoy] + + macaddres.io module - Date conversion bug fixed + +* Merge branch 'master' into master. [Alexandre Dulaunoy] + +* Merge pull request #233 from chrisr3d/documentation. [Christian Studer] + + Modules documentation + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Updated documentation result file. [chrisr3d] + +* Add: Added documentation for expansion modules. [chrisr3d] + +* Add: Started adding logos on documentation for each module. [chrisr3d] + +* Renamed directory to have consistency in names. [chrisr3d] + +* Removed documentation about a module deleted from the repository. [chrisr3d] + +* Merging readme. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into documentation. [chrisr3d] + +* First try of documentation for import & export modules. [chrisr3d] + + - Providing information about the general purpose of + the modules, their requirements, how to use them + (if there are special features), some references + about the format concerned or the vendors, and their + input and output. + - Documentation to be completed by additional fields + of documentation and / or more detailed descriptions + +* Added Documentation explanations on readme file. [chrisr3d] + +* CSV import documentation first try. [chrisr3d] + +* GoAML modules documentation first try. [chrisr3d] + +* Updated README. Added a link to the integration tutorial. [Codelinefi-admin] + +* Fixed a bug with wrong dates conversion. [Codelinefi-admin] + +* Merge branch 'vulnersCom-master' [Alexandre Dulaunoy] + +* Merge branch 'master' of https://github.com/vulnersCom/misp-modules into vulnersCom-master. [Alexandre Dulaunoy] + +* Fixed getting of the Vulners AI score. [isox] + +* Merge pull request #230 from lctrcl/master. [Alexandre Dulaunoy] + +* Merge branch 'master' into master. [lctrcl] + +* Merge pull request #229 from lctrcl/master. [Alexandre Dulaunoy] + + New vulners module added + +* HotFix: Vulners AI score. [Igor Ivanov] + +* Code cleanup and formatting. [Igor Ivanov] + +* Added exploit information. [Igor Ivanov] + +* Initial Vulners module PoC. [Igor Ivanov] + +* Merge pull request #226 from CodeLineFi/master. [Alexandre Dulaunoy] + + New macaddress.io hover module added + +* Macaddress.io hover module added. [Codelinefi-admin] + +* Merge pull request #223 from chrisr3d/master. [Christian Studer] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #222 from chrisr3d/master. [Christian Studer] + + Clean up + fix of some modules + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #221 from MISP/rommelfs-patch-2. [Alexandre Dulaunoy] + + fixed typo + +* Fixed typo. [Sascha Rommelfangen] + + via #220 + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #218 from surbo/patch-1. [Alexandre Dulaunoy] + + Update urlscan.py + +* Update urlscan.py. [SuRb0] + + Added hash to the search so you can take advantage of the new file down load function on urlscan.io. You can use this to pivot on file hashes and find out domains that hosting the same malicious file. + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #217 from threatsmyth/master. [Alexandre Dulaunoy] + + Add error handling for DNS failures, reduce imports, and simplify attribute comments + +* Merge branch 'master' into master. [David J] + +* Merge pull request #215 from threatsmyth/master. [Alexandre Dulaunoy] + + Create urlscan.py + +* Add error handling for DNS failures, reduce imports, and simplify misp_comments. [David J] + +* Create urlscan.py. [David J] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #214 from chrisr3d/chrisr3d_patch. [Alexandre Dulaunoy] + + New module to check DBL Spamhaus + +* Merge branch 'chrisr3d_patch' of github.com:chrisr3d/misp-modules. [chrisr3d] + +* Add: Added DBL spamhaus module documentation and in expansion init file. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Ta_import - bugfixes for TA 6.1. [Christophe Vandeplas] + +* Merge pull request #210 from chrisr3d/master. [Christian Studer] + + Put the report location parsing in a try/catch statement as it is an optional field + +* Merge pull request #209 from cvandeplas/master. [Christophe Vandeplas] + + ta_import - support for TheatAnalyzer 6.1 + +* Ta_import - support for TheatAnalyzer 6.1. [Christophe Vandeplas] + +* Securitytrails.com expansion module added. [Alexandre Dulaunoy] + +* Merge pull request #208 from sebdraven/dnstrails. [Alexandre Dulaunoy] + + module securitytrails + +* Merge branch 'master' into dnstrails. [sebdraven] + +* Merge pull request #206 from chrisr3d/master. [Alexandre Dulaunoy] + + Expansion module displaying SIEM signatures from a sigma rule + +* Merge branch 'master' into master. [Alexandre Dulaunoy] + +* Remove the never release Python code in Travis. [Alexandre Dulaunoy] + +* Remove Python 3.4 and Python 3.7 added. [Alexandre Dulaunoy] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #202 from SteveClement/master. [Alexandre Dulaunoy] + + Removed test modules from view + +* - Removed test modules from view - Moved skeleton expansion module to it's proper place. [Steve Clement] + +* Merge pull request #201 from chrisr3d/master. [Alexandre Dulaunoy] + + add: STIX2 pattern syntax validator + +* Add: Experimental expansion module to display the SIEM signatures from a sigma rule. [chrisr3d] + +* Add: stix2 pattern validator requirements. [chrisr3d] + +* Add: STIX2 pattern syntax validator. [chrisr3d] + +* Merge pull request #199 from SteveClement/master. [Alexandre Dulaunoy] + + Added (Multipage) PDF support to OCR Module, minor refactor + +* - Reverted to <3.6 compatibility. [Steve Clement] + +* - Fixed log output. [Steve Clement] + +* - Forgot to import sys. [Steve Clement] + +* - Added logger functionality for debug sessions. [Steve Clement] + +* - content was already a wand.obj. [Steve Clement] + +* Merge remote-tracking branch 'upstream/master' [Steve Clement] + +* Threatanalyzer_import - order of category tuned. [Christophe Vandeplas] + +* Merge branch 'master' of github.com:SteveClement/misp-modules. [Steve Clement] + +* Merge branch 'master' into master. [Alexandre Dulaunoy] + +* - Some more comments - Removed libmagic, wand can handle it better. [Steve Clement] + +* - Set tornado timeout to 300 seconds. [Steve Clement] + +* - Quick comment ToDo: Avoid using Magic in future releases. [Steve Clement] + +* - added wand requirement - fixed missing return png byte-stream - move module import to handler to catch and report errorz. [Steve Clement] + +* - fixed typo move image back in scope. [Steve Clement] + +* - Added initial PDF support, nothing is processed yet - Test to replace PIL with wand. [Steve Clement] + +* Change type of status. [Sebdraven] + +* Remove print. [Sebdraven] + +* Last commit for release. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add searching_stats. [Sebdraven] + +* Add searching_stats. [Sebdraven] + +* Correct key. [Sebdraven] + +* Correct key. [Sebdraven] + +* Correct param. [Sebdraven] + +* Add searching domains. [Sebdraven] + +* Add searching domains. [Sebdraven] + +* Add return. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add whois expand to test. [Sebdraven] + +* Add whois expand to test. [Sebdraven] + +* Correct index error. [Sebdraven] + +* Error call functions. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add status_ok to true. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Correct out of bound returns. [Sebdraven] + +* Correct key and return of functions. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Correct typo. [Sebdraven] + +* Test whois history. [Sebdraven] + +* History whois dns. [Sebdraven] + +* Correct typo. [Sebdraven] + +* Rename misp modules. [Sebdraven] + +* Add a test to check if the list is not empty. [Sebdraven] + +* Add a test to check if the list is not empty. [Sebdraven] + +* Add logs. [Sebdraven] + +* Debug whois. [Sebdraven] + +* Debug ipv4 or ipv6. [Sebdraven] + +* Add debug. [Sebdraven] + +* Debug. [Sebdraven] + +* Change status. [Sebdraven] + +* Change history dns. [Sebdraven] + +* Add logs to debug. [Sebdraven] + +* Correct call function. [Sebdraven] + +* Add history mx and soa. [Sebdraven] + +* Add history dns and handler exception. [Sebdraven] + +* Add history dns. [Sebdraven] + +* Switch type ip. [Sebdraven] + +* Refactoring expand_whois. [Sebdraven] + +* Correct typo. [Sebdraven] + +* Add ipv6 and ipv4. [Sebdraven] + +* Change type. [Sebdraven] + +* Change type. [Sebdraven] + +* Change loop. [Sebdraven] + +* Add time sleep in each request. [Sebdraven] + +* Control return of records. [Sebdraven] + +* Add history ipv4. [Sebdraven] + +* Add logs. [Sebdraven] + +* Change categories. [Sebdraven] + +* Concat results. [Sebdraven] + +* Change name keys. [Sebdraven] + +* Change return value. [Sebdraven] + +* Add logs. [Sebdraven] + +* Change errors. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add expand whois. [Sebdraven] + +* Typo. [Sebdraven] + +* Add categories and comments. [Sebdraven] + +* Add expand subdomains. [Sebdraven] + +* Add expand subdomains. [Sebdraven] + +* Change categories. [Sebdraven] + +* Changes keys. [Sebdraven] + +* Add status ! [Sebdraven] + +* Add methods. [Sebdraven] + +* Add expand domains. [Sebdraven] + +* Add link pydnstrain in requirements. [Sebdraven] + +* Add new module dnstrails. [Sebdraven] + +* Merge pull request #198 from chrisr3d/master. [Alexandre Dulaunoy] + + Sigma syntax validator expansion module + some updates + +* Updated README to add sigma & some other missing modules. [chrisr3d] + +* Updated the list of modules (removed stiximport) [chrisr3d] + +* Add: Sigma syntax validator expansion module. [chrisr3d] + + --> Checks sigma rules syntax + - Updated the expansion modules list as well + - Updated the requirements list + +* Updated the list of expansion modules. [chrisr3d] + +* Corrected typos and unused imports. [milkmix] + +* Added support for scheduledtasks. [milkmix] + +* Added support for service-displayname, regkey|value. [milkmix] + +* Initial implementation supporting regkey. mutexes support waiting osquery table. [milkmix] + +* Merge pull request #197 from sebdraven/onyphe_full_module. [Alexandre Dulaunoy] + + Onyphe full module + +* Add return handle domains. [Sebdraven] + +* Add search. [Sebdraven] + +* Add domain to expand. [Sebdraven] + +* Correct bugs. [Sebdraven] + +* Add domain expansion. [Sebdraven] + +* Add comment. [Sebdraven] + +* Correct bugs. [Sebdraven] + +* Correct comments. [Sebdraven] + +* Add threat list expansion. [Sebdraven] + +* Change method to concat methods. [Sebdraven] + +* Set status after requests. [Sebdraven] + +* Set status after requests. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Add logs. [Sebdraven] + +* Pep 8. [Sebdraven] + +* Correct bug. [Sebdraven] + +* Add datascan expansion. [Sebdraven] + +* Add reverse infos. [Sebdraven] + +* Add reverse infos. [Sebdraven] + +* Add reverse infos. [Sebdraven] + +* Add reverse infos. [Sebdraven] + +* Add forward infos. [Sebdraven] + +* Add comment of attributes. [Sebdraven] + +* Add comment of attributes. [Sebdraven] + +* Error loops. [Sebdraven] + +* Error method. [Sebdraven] + +* Error type. [Sebdraven] + +* Error keys. [Sebdraven] + +* Add expansion synscan. [Sebdraven] + +* Change key access domains. [Sebdraven] + +* Change add in results. [Sebdraven] + +* Add logs. [Sebdraven] + +* Correct error keys. [Sebdraven] + +* Test patries expansion. [Sebdraven] + +* Add onyphe full module. [Sebdraven] + +* Add onyphe full module and code the stub. [Sebdraven] + +* Merge pull request #194 from chrisr3d/master. [Alexandre Dulaunoy] + + Removed STIX1 related requirements to avoid version issues + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #193 from sebdraven/onyphe_module. [Alexandre Dulaunoy] + + Onyphe module + +* Delete vcs.xml. [sebdraven] + +* Correct codecov. [Sebdraven] + +* Pep 8 compliant. [Sebdraven] + +* Correct type of comments. [Sebdraven] + +* Correct typo. [Sebdraven] + +* Correct typo. [Sebdraven] + +* Add domains forward. [Sebdraven] + +* Add domains. [Sebdraven] + +* Add targeting os. [Sebdraven] + +* Add category for AS number. [Sebdraven] + +* Change keys. [Sebdraven] + +* Change type. [Sebdraven] + +* Add category. [Sebdraven] + +* Add as number with onyphe. [Sebdraven] + +* Add as number with onyphe. [Sebdraven] + +* Error indentation. [Sebdraven] + +* Correct key in map result. [Sebdraven] + +* Correct a bug. [Sebdraven] + +* Add pastebin url imports. [Sebdraven] + +* Add onyphe module. [Sebdraven] + +* Updated requirements to avoid version issues in the MISP packer installation script. [chrisr3d] + +* Update countrycode.py. [Andras Iklody] + +* Add: mixing modules. [Alexandre Dulaunoy] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #190 from chrisr3d/master. [Alexandre Dulaunoy] + + Updated csv import following our recent discussions + +* Updated delimiter finder function. [chrisr3d] + +* Add: Added user config to specify if there is a header in the csv to import. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #189 from chrisr3d/master. [Andras Iklody] + + Using userConfig to define the header instead of moduleconfig + +* Merge pull request #188 from cvandeplas/master. [Christophe Vandeplas] + + ta import - noise removal + +* Merge branch 'master' into master. [Christophe Vandeplas] + +* Merge pull request #187 from cvandeplas/master. [Christophe Vandeplas] + + threatanalyzer_import - minor generic noise removal + +* Threatanalyzer_import - minor generic noise removal. [Christophe Vandeplas] + +* Ta import - more filter for pollution. [Christophe Vandeplas] + +* Threatanalyzer_import - minor generic noise removal. [Christophe Vandeplas] + +* Merge pull request #185 from cvandeplas/master. [Christophe Vandeplas] + + threatanalyzer_import - loads sample info + pollution fix + +* Threatanalyzer_import - loads sample info + pollution fix. [Christophe Vandeplas] + +* Merge pull request #184 from cvandeplas/master. [Christophe Vandeplas] + + threatanalyzer_import - fix regkey issue + +* Threatanalyzer_import - fix regkey issue. [Christophe Vandeplas] + +* Merge pull request #177 from TheDr1ver/patch-1. [Alexandre Dulaunoy] + + fix missing comma + +* Fix missing comma. [Nick Driver] + + fix ip-dst and vulnerability input + +* Merge pull request #176 from cudeso/master. [Alexandre Dulaunoy] + + Fix VMRay API access error + +* Fix VMRay API access error. [Koen Van Impe] + + hotfix for the "Unable to access VMRay API" error + +* Merge remote-tracking branch 'MISP/master' [Koen Van Impe] + +* Merge pull request #173 from m3047/master. [Alexandre Dulaunoy] + + Add exception blocks for query errors. + +* Add exception blocks for query errors. [Fred Morris] + +* Merge pull request #170 from P4rs3R/patch-1. [Alexandre Dulaunoy] + + Improving regex (validating e-mail) + +* Improving regex (validating e-mail) [x41\x43] + + Line 48: + The previous regex ` ^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$ ` matched only a small subset of valid e-mail address (e.g.: didn't match domain names longer than 3 chars or user@this-domain.de or user@multiple.level.dom) and needed to be with start (^) and end ($). + This ` [a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])? ` is not perfect (e.g: can't match oriental chars), but imho is much more complete. + + Regex tested with several e-mail addresses with Python 3.6.4 and Python 2.7.14 on Linux 4.14. + +* Merge pull request #169 from chrisr3d/master. [Alexandre Dulaunoy] + + Updated GoAML import including Object References + +* Clarified functions arguments using a class. [chrisr3d] + +* Add: Added Object References in the objects imported. [chrisr3d] + +* Merge pull request #168 from chrisr3d/goaml. [Alexandre Dulaunoy] + + GoAML import module & GoAML export updates + +* Merge branch 'master' of github.com:MISP/misp-modules into goaml. [chrisr3d] + +* Merge pull request #167 from chrisr3d/csvimport. [Alexandre Dulaunoy] + + Updated csvimport + +* Merge branch 'csvimport' of github.com:chrisr3d/misp-modules into goaml. [chrisr3d] + +* Removed print. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into csvimport. [chrisr3d] + +* Merge pull request #165 from chrisr3d/goaml. [Alexandre Dulaunoy] + + fix: Added an object checking + +* Add: added goamlimport. [chrisr3d] + +* Fixed some details about the module output. [chrisr3d] + +* Converting GoAML into MISPEvent. [chrisr3d] + +* Now parsing all the transaction attributes. [chrisr3d] + +* Add: Added dictionary to map aml types into MISP types. [chrisr3d] + +* Typo. [chrisr3d] + +* Merge branch 'master' of github.com:chrisr3d/misp-modules into aml_import. [chrisr3d] + +* Merge pull request #164 from chrisr3d/master. [Alexandre Dulaunoy] + + Latest fixes to make GoAML export module work + +* Add: Added an example file generated by GoAML export module. [chrisr3d] + +* Added GoAML export module in description. [chrisr3d] + +* Reading the entire document, to create a big dictionary containing the data, as a beginning. [chrisr3d] + +* Add: new expansion module to check hashes against hashdd.com including NSLR dataset. [Alexandre Dulaunoy] + +* Merge pull request #163 from chrisr3d/master. [Alexandre Dulaunoy] + + GoAML export + +* Typo. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Quick fix to the invalid hash types offered on all returned hashes, hopefully fixes #162. [Andras Iklody] + +* Explicit name. [chrisr3d] + + Avoiding confusion with the coming import module for goaml + +* Added "t_to" and "t_from" required fields: funds code & country. [chrisr3d] + +* Added a required field & the latest attributes in transaction. [chrisr3d] + +* Added report expected information fields. [chrisr3d] + +* Simplified ObjectReference dictionary reading. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* Add: YARA syntax validator. [Alexandre Dulaunoy] + +* Merge pull request #161 from eCrimeLabs/ecrimelabs_dev. [Alexandre Dulaunoy] + + Added Yara syntax validation expansion module + +* Added Yara syntax validation expansion module. [Dennis Rand] + +* Added some report information. [chrisr3d] + + Also changed the ObjectReference parser to replace + all the if conditions by a dictionary reading + +* Suporting the recent objects added to misp-objects. [chrisr3d] + + - Matching the aml documents structure + - Some parts of the document still need to be added + +* Wip: added location & signatory information. [chrisr3d] + +* Merge branch 'master' of github.com:MISP/misp-modules into test. [chrisr3d] + +* Merge pull request #157 from CenturyLinkCIRT/master. [Alexandre Dulaunoy] + + added csvimport to __init__.py + +* Added csvimport to __init__.py. [Thomas Gardner] + +* Add: CSV import module added. [Alexandre Dulaunoy] + +* Outputting xml format. [chrisr3d] + + Also mapping MISP and GoAML types + +* First tests for the GoAML export module. [chrisr3d] + +* Merge pull request #156 from chrisr3d/master. [Alexandre Dulaunoy] + + CSV import + +* Merge branch 'master' of github.com:MISP/misp-modules. [chrisr3d] + +* 3.7-alpha removed. [Alexandre Dulaunoy] + +* Updated delimiter finder method. [chrisr3d] + +* Fixed data treatment & other updates. [chrisr3d] + +* Updated delimiter parsing & data reading functions. [chrisr3d] + +* First version of csv import module. [chrisr3d] + + - If more than 1 misp type is recognized, for each one an + attribute is created + + - Needs to have header set by user as parameters of the module atm + + - Review needed to see the feasibility with fields that can create + confusion and be interpreted both as misp type or attribute field + (for instance comment is a misp type and an attribute field) + +* Merge pull request #154 from cvandeplas/master. [Raphaël Vinot] + + added CrowdStrike Falcon Intel Indicators expansion module + +* Added CrowdStrike Falcon Intel Indicators expansion module. [Christophe Vandeplas] + +* Add: RBL added. [Alexandre Dulaunoy] + +* Merge pull request #150 from chrisr3d/master. [Alexandre Dulaunoy] + + RBL check module + +* Merge github.com:MISP/misp-modules. [chrisr3d] + +* Merge pull request #149 from cvandeplas/master. [Alexandre Dulaunoy] + + Added ThreatAnalyzer sandbox import + +* Added ThreatAnalyzer sandbox import. [Christophe Vandeplas] + + Experimental module - some parts should be migrated to + +* Check an IPv4 address against known RBLs. [chrisr3d] + +* Fix farsight_passivedns - rdata 404 not found. [Christophe Vandeplas] + +* Added ThreatStream and PDF export. [Alexandre Dulaunoy] + +* Merge branch 'robertnixon2003-master' + a small fix. [Alexandre Dulaunoy] + +* Fix the __init__ import. [Alexandre Dulaunoy] + +* Update threatStream_misp_export.py. [Robert Nixon] + +* Updated __init__.py. [Robert Nixon] + + Added reference to new ThreatStream export module + +* Added threatStream_misp_export.py. [Robert Nixon] + +* Merge branch 'cvandeplas-master' [Alexandre Dulaunoy] + +* Fixes missing init file in dnsdb library folder. [Christophe Vandeplas] + +* New Farsight DNSDB Passive DNS expansion module. [Christophe Vandeplas] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* Merge pull request #144 from attritionorg/patch-1. [Andras Iklody] + + minor touch-ups on error messages for user friendliness + +* Minor touch-ups on error messages for user friendliness. [Jericho] + +* Merge pull request #140 from cudeso/master. [Alexandre Dulaunoy] + + VulnDB Queries + +* VulnDB Queries. [Koen Van Impe] + + Search on CVE at https://vulndb.cyberriskanalytics.com/ + https://www.riskbasedsecurity.com/ + Get extended CVE info, links + CPE + +* Merge remote-tracking branch 'MISP/master' [Koen Van Impe] + +* Add quick and dirty pdf export. [Raphaël Vinot] + +* Merge pull request #139 from Rafiot/master. [Raphaël Vinot] + + fix: OpenIOC importer + +* Merge pull request #135 from DomainTools/domaintools-patch-1. [Raphaël Vinot] + + Added code to allow 3rd party modules + +* Added default parameter for new -m flag. [Viktor von Drakk] + +* Added code to allow 3rd party modules. [Viktor von Drakk] + + The new '-m pip.module.name' feature allows a pip-installed module to be specified on the command line and then loaded into the available modules without having to copy-paste files into the appropriate directories of this package. + +* Broken links fixed. [Alexandre Dulaunoy] + +* ThreatConnect export module added. [Alexandre Dulaunoy] + +* Merge pull request #133 from CenturyLinkCIRT/master. [Alexandre Dulaunoy] + + ThreatConnect export module + +* Added threat_connect_export to export_mod.__init__ [Thomas Gardner] + +* Added test files for threat_connect_export. [Thomas Gardner] + +* Added threat_connect_export.py. [Thomas Gardner] + +* Merge pull request #129 from seamustuohy/utf_hate. [Raphaël Vinot] + + Added support for malformed internationalized email headers + +* Added support for malformed internationalized email headers. [seamus tuohy] + + When an emails contains headers that use Unicode without properly crafing + them to comform to RFC-6323 the email import module would crash. + (See issue #119 & issue #93) + + To address this I have added additional layers of encoding/decoding to + any possibly internationalized email headers. This decodes properly + formed and malformed UTF-8, UTF-16, and UTF-32 headers appropriately. + When an unknown encoding is encountered it is returned as an 'encoded-word' + per RFC2047. + + This commit also adds unit-tests that tests properly formed and malformed + UTF-8, UTF-16, UTF-32, and CJK encoded strings in all header fields; UTF-8, + UTF-16, and UTF-32 encoded message bodies; and emoji testing for headers + and attachment file names. + +* Merge branch 'master' into utf_hate. [seamus tuohy] + +* Added unit tests for UTF emails. [seamus tuohy] + +* OTX and ThreatCrowd added. [Alexandre Dulaunoy] + +* Merge pull request #130 from chrisdoman/master. [Alexandre Dulaunoy] + + Add AlienVault OTX and ThreatCrowd Expansions + +* Add AlienVault OTX and ThreatCrowd Expansions. [Chris Doman] + +* Use proper version of PyMISP. [Raphaël Vinot] + +* Update travis, fix open ioc import. [Raphaël Vinot] + +* Merge pull request #122 from truckydev/master. [Alexandre Dulaunoy] + + Add tags on import with ioc import module + +* Replace tab by space. [Tristan METAYER] + +* Add a field for user to add tag for this import. [Tristan METAYER] + +* Merge pull request #121 from truckydev/master. [Andras Iklody] + + If filename add iocfilename as attachment + +* Typo correction. [Tristan METAYER] + +* Add user config to not add file as attachement in a box. [Tristan METAYER] + +* If filename add iocfilename as attachment. [Tristan METAYER] + +* Merge pull request #118 from truckydev/master. [Alexandre Dulaunoy] + + Add indent field for export + +* Add indent field for export. [Tristan METAYER] + +* Merge pull request #115 from FloatingGhost/master. [Alexandre Dulaunoy] + + fix: Use the proper formatting method and not the horrible % one + +* Missing expansion modules added in README. [Alexandre Dulaunoy] + +* ThreatMiner added. [Alexandre Dulaunoy] + +* Merge pull request #114 from kx499/master. [Alexandre Dulaunoy] + + ThreatMiner Expansion module + +* Bug fixes. [kx499] + +* Threatminer initial commit. [kx499] + +* Cosmetic changes. [Raphaël Vinot] + +* Merge pull request #111 from kx499/master. [Raphaël Vinot] + + Handful of changes to VirusTotal module + +* Bug fixes, tweaks, and python3 learning curve :) [kx499] + +* Initial commit of IPRep module. [kx499] + +* Fixed spacing, addressed error handling for public api, added subdomains, and added context comment. [kx499] + +* OpenIOC import module added. [Alexandre Dulaunoy] + +* Add OpenIOC import module. [Raphaël Vinot] + +* Merge pull request #109 from truckydev/master. [Alexandre Dulaunoy] + + add information about offline installation + +* Add information about offline installation. [truckydev] + +* Merge pull request #106 from truckydev/master. [Alexandre Dulaunoy] + + Lite export of an event + +* Exclude internal reference. [Tristan METAYER] + +* Add lite Export module. [Tristan METAYER] + +* Merge pull request #100 from rmarsollier/master. [Alexandre Dulaunoy] + + Some improvements of virustotal plugin + +* Some improvements of virustotal plugin. [rmarsollier] + +* Merge pull request #96 from johestephan/master. [Raphaël Vinot] + + XForce Exchange v1 (alpha) + +* Passed local run check. [Joerg Stephan] + +* V1. [Joerg Stephan] + +* Removed urrlib2. [Joerg Stephan] + +* Python3 changes. [Joerg Stephan] + +* Merged xforce exchange. [Joerg Stephan] + +* XForce Exchange v1 (alpha) [Joerg Stephan] + +* Merge pull request #56 from RichieB2B/ncsc-nl/mispjson. [Alexandre Dulaunoy] + + Simple import module to import MISP JSON format + +* Updated description to reflect merging use case. [Richard van den Berg] + +* Simple import module to import MISP JSON format. [Richard van den Berg] + +* Merge pull request #92 from seamustuohy/duck_typing_failure. [Alexandre Dulaunoy] + + Email import no longer unzips major compressed text document formats. + +* Email import no longer unzips major compressed text document formats. [seamus tuohy] + + Let this commit serve as a warning about the perils of duck typing. + Word documents (docx,odt,etc) were being uncompressed when they were + attached to emails. The email importer now checks a list of well known + extensions and will not attempt to unzip them. + + It is stuck using a list of extensions instead of using file magic because + many of these formats produce an application/zip mimetype when scanned. + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* Merge pull request #91 from Rafiot/master. [Raphaël Vinot] + + Improve email import module + +* Keep zip content as binary. [Raphaël Vinot] + +* Fix tests, cleanup. [Raphaël Vinot] + +* Improve support of email attachments. [Raphaël Vinot] + + Related to #90 + +* Merge pull request #89 from Rafiot/fix_87. [Raphaël Vinot] + + Improve VT support. + +* Standardised key checking. [Hannah Ward] + +* Fixed checking for submission_names in VT JSON. [Hannah Ward] + +* Update virustotal.py. [CheYenBzh] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* Training materials updated + Cuckoo JSON import module was missing. [Alexandre Dulaunoy] + +* Improve support of email importer if headers are missing. [Raphaël Vinot] + + Fix #88 + +* Remove python 3.3 support. [Raphaël Vinot] + +* Fix python 3.6 support. [Raphaël Vinot] + +* Make PEP8 happy. [Raphaël Vinot] + +* Add email_import in the modules loaded by default. [Raphaël Vinot] + +* Make PEP8 happy. [Raphaël Vinot] + +* Fix failing test (bug in the mail parser?) [Raphaël Vinot] + +* Add additional email parsing and tests. [seamus tuohy] + + Added additional attribute parsing and corresponding unit-tests. + E-mail attachment and url extraction added in this commit. This includes + unpacking zipfiles and simple password cracking of encrypted zipfiles. + +* Fixed basic errors. [seamus tuohy] + +* Merged with current master. [seamus tuohy] + +* Merge pull request #85 from rmarsollier/master. [Raphaël Vinot] + + add libjpeg-dev as a dep to allow pillow to be installed succesfully + +* Add libjpeg-dev as a dep to allow pillow to be installed succesfully. [robin.marsollier@conix.fr] + +* GeoIP module added. [Alexandre Dulaunoy] + +* Merge pull request #84 from MISP/amuehlem-master. [Raphaël Vinot] + + Fix PR + +* Do not crash if the dat file is not available. [Raphaël Vinot] + +* Fix path to config file. [Raphaël Vinot] + +* Merge branch 'master' of https://github.com/amuehlem/misp-modules into amuehlem-master. [Raphaël Vinot] + +* Added empty line to end of config file. [Andreas Muehlemann] + +* Removed DEFAULT section from configfile. [Andreas Muehlemann] + +* Fixed more typos. [Andreas Muehlemann] + +* Fixed typo. [Andreas Muehlemann] + +* Changed configparser from python2 to python3. [Andreas Muehlemann] + +* Updated missing parenthesis. [Andreas Muehlemann] + +* Merge branch 'geoip_country' [Andreas Muehlemann] + +* Removed unneeded config option for misp. [Andreas Muehlemann] + +* Removed debug message. [Andreas Muehlemann] + +* Added config option to geoip_country.py. [Andreas Muehlemann] + +* Added pygeoip to the REQUIREMENTS list. [Andreas Muehlemann] + +* Updated geoip_country to __init__.py. [Andreas Muehlemann] + +* Added geoip_country.py. [Andreas Muehlemann] + +* Better error reporting. [Raphaël Vinot] + +* Catch exception. [Raphaël Vinot] + +* Add reverse lookup. [Raphaël Vinot] + +* Refactoring of domaintools expansion module. [Raphaël Vinot] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* Merge pull request #83 from stoep/master. [Alexandre Dulaunoy] + + Added cuckooimport.py + +* Added cuckooimport.py. [Ubuntu] + +* DomainTools module added. [Alexandre Dulaunoy] + +* Remove domaintools tests. [Raphaël Vinot] + +* Add test for domaintools. [Raphaël Vinot] + +* Merge pull request #78 from deralexxx/patch-2. [Alexandre Dulaunoy] + + Update README.md + +* Update README.md. [Alexander J] + + mentioning import / export modules + +* Merge pull request #76 from deralexxx/patch-1. [Alexandre Dulaunoy] + + Update README.md + +* Update README.md. [Alexander J] + +* Merge pull request #75 from Rafiot/domtools. [Raphaël Vinot] + + Add Domain Tools module + +* Update requirements list. [Raphaël Vinot] + +* Add domaintools to the import list. [Raphaël Vinot] + +* Fix Typo. [Raphaël Vinot] + +* Add domain profile and reputation. [Raphaël Vinot] + +* Add more comments. [Raphaël Vinot] + +* Fix typo. [Raphaël Vinot] + +* Remove json.dumps. [Raphaël Vinot] + +* Avoid passing None in comments. [Raphaël Vinot] + +* Add comments to fields when possible. [Raphaël Vinot] + +* Add initial Domain Tools module. [Raphaël Vinot] + +* Merge pull request #74 from cudeso/master. [Raphaël Vinot] + + Extra VTI detections + +* Merge remote-tracking branch 'MISP/master' [Koen Van Impe] + +* Update README.md. [Raphaël Vinot] + +* Merge pull request #73 from FloatingGhost/master. [Raphaël Vinot] + + Use SpooledTemp, not NamedTemp file + +* Use git for everything we can. [Hannah Ward] + +* Ok we'll use the dep from misp-stix-converter. Surely this'll work? [Hannah Ward] + +* Use the CIRCL pymisp. Silly @rafiot ;) [Hannah Ward] + +* Travis should now use the master branch. [Hannah Ward] + +* Maybe it'll take the git repo now? [Hannah Ward] + +* Added pymisp to reqs. [Hannah Ward] + +* Don't cache anything pls travis. [Hannah Ward] + +* Removed unneeded modules. [Hannah Ward] + +* Use SpooledTemp, not NamedTemp file. [Hannah Ward] + +* VMRay import module added. [Alexandre Dulaunoy] + +* Merge pull request #72 from FloatingGhost/master. [Raphaël Vinot] + + Migrated stiximport to use misp-stix-converter + +* Moved to misp_stix_converter. [Hannah Ward] + +* Merge pull request #70 from cudeso/master. [Raphaël Vinot] + + Submit malware samples + +* Extra VTI detections. [Koen Van Impe] + +* Submit malware samples. [Koen Van Impe] + + _submit now includes malware samples (zipped content from misp) + _import checks when no vti_results are returned + bugfix + +* Fix STIX import module. [Raphaël Vinot] + +* Multiple clanges in the vmray modules. [Raphaël Vinot] + + * Generic fix to load modules requiring a local library + * Fix python3 support + * PEP8 related cleanups + +* Merge pull request #68 from cudeso/master. [Andras Iklody] + + VMRay Import & Submit module + +* VMRay Import & Submit module. [Koen Van Impe] + + * First commit + * No support for archives (yet) submit + +* Merge pull request #59 from rgraf/master. [Alexandre Dulaunoy] + + label replaced by text, which is existing attribute + +* Label replaced by text, which is existing attribute. [Roman Graf] + +* Adding basic test mockup. [seamus tuohy] + +* Adding more steps to module testing. [seamus tuohy] + +* Added attachment and url support. [seamus tuohy] + +* Added email meta-data import module. [seamus tuohy] + + This email meta-data import module collects basic meta-data from an e-mail + and populates an event with it. It populates the email subject, source + addresses, destination addresses, subject, and any attachment file names. + This commit also contains unit-tests for this module as well as updates to + the readme. Readme updates are additions aimed to make it easier for + outsiders to build modules. + +* Merge pull request #58 from rgraf/master. [Alexandre Dulaunoy] + + Added expansion for Wikidata. + +* Added expansion for Wikidata. Analyst can query Wikidata by label to get additional information for particular term. [Roman Graf] + +* Merge pull request #55 from amuehlem/reversedns. [Raphaël Vinot] + + added new module reversedns.py, added reversedns to __init__.py + +* Added new module reversedns.py, added reversedns to __init__.py. [Andreas Muehlemann] + +* Merge pull request #53 from MISP/Rafiot-patch-1. [Alexandre Dulaunoy] + + Dump host info as text + +* Dump host info as text. [Raphaël Vinot] + +* Fix typo. [Raphaël Vinot] + +* Merge pull request #52 from Rafiot/master. [Alexandre Dulaunoy] + + Add simple Shodan module + +* Add simple Shodan module. [Raphaël Vinot] + +* Merge pull request #49 from FloatingGhost/master. [Alexandre Dulaunoy] + + Removed useless pickle storage of stiximport + +* Removed useless pickle storage of stiximport. [Hannah Ward] + +* Create LICENSE. [Alexandre Dulaunoy] + +* Update README.md. [Andras Iklody] + +* Typo fixed. [Alexandre Dulaunoy] + +* CEF export module added. [Alexandre Dulaunoy] + +* Cef_export module added. [Alexandre Dulaunoy] + +* Merge pull request #47 from FloatingGhost/CEF_Export. [Alexandre Dulaunoy] + + CEF export, fixes in CountryCode, virustotal + +* Removed silly subdomain module. [Hannah Ward] + +* Added CEF export module. [Hannah Ward] + +* Now searches within observable_compositions. [Hannah Ward] + +* Removed calls to print. [Hannah Ward] + +* Added body.json to gitignore. [Hannah Ward] + +* Added virustotal tests. [Hannah Ward] + +* CountryCode JSON now is only grabbed once per server run. [Hannah Ward] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Raphaël Vinot] + +* Merge pull request #46 from Rafiot/master. [Raphaël Vinot] + + Make misp-modules really asynchronous + +* Add timeout for the modules, cleanup. [Raphaël Vinot] + +* Fix python 3.3 and 3.4. [Raphaël Vinot] + +* Make misp-modules really asynchronous. [Raphaël Vinot] + +* Improve tornado parallel. [Raphaël Vinot] + +* Coroutine decorator added to post handler. [Alexandre Dulaunoy] + +* -d option added - enabling debug on queried modules. [Alexandre Dulaunoy] + +* New modules added to __init__ [Alexandre Dulaunoy] + +* README updated for the new modules. [Alexandre Dulaunoy] + +* Merge pull request #45 from FloatingGhost/master. [Alexandre Dulaunoy] + + 2 new modules -- VirusTotal and CountryCode + +* Modified readme with virustotal/countrycode. [Hannah Ward] + +* Added virustotal module. [Hannah Ward] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Hannah Ward] + +* Merge pull request #44 from Rafiot/travis. [Alexandre Dulaunoy] + + Add coverage, update logging + +* Add coverage, update logging. [Raphaël Vinot] + +* Merge pull request #43 from FloatingGhost/master. [Alexandre Dulaunoy] + + StixImport now uses TemporaryFile rather than a named file in /tmp + +* Improved virustotal module. [Hannah Ward] + +* Added countrycode, working on virustotal. [Hannah Ward] + +* Added lookup by country code. [Hannah Ward] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Hannah Ward] + +* Fix a link to the STIX import module reference. [Alexandre Dulaunoy] + +* Stiximport now uses temporary files to store stix data. [Hannah Ward] + + Set max size in config, in bytes + +* Merge pull request #42 from MISP/pr/41. [Alexandre Dulaunoy] + + Cleanup on the stix import module + +* Merge remote-tracking branch 'origin/master' into pr/41. [Raphaël Vinot] + +* Add info about the import modules. [Alexandre Dulaunoy] + +* Make PEP8 happy \o/ [Raphaël Vinot] + +* Move stiximport.py to misp_modules/modules/import_mod/ [Raphaël Vinot] + +* There was a missing comma. [Hannah Ward] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Hannah Ward] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #40 from Rafiot/master. [Alexandre Dulaunoy] + + Remove bin script, use cleaner way. Fix last commit. + +* Remove bin script, use cleaner way. Fix last commit. [Raphaël Vinot] + +* Merge pull request #39 from Rafiot/master. [Alexandre Dulaunoy] + + Use entry_points instead of scripts in the install. + +* Use entry_points instead of scripts. [Raphaël Vinot] + +* Pip --upgrade must be always called (to have modules updated) [Alexandre Dulaunoy] + +* Added STIX to setup.py. [Hannah Ward] + +* Added STIX to reqs. [Hannah Ward] + +* Merge branch 'stix_import' [Hannah Ward] + +* Added tests, also disregards related_observables. Because they're useless. [Hannah Ward] + +* Fixed observables within an indicator not being added. [Hannah Ward] + +* Stiximport will now consume campaigns. [Hannah Ward] + +* Stiximport will now identify file hashes. [Hannah Ward] + +* I can't spell. [Hannah Ward] + +* Added STIXImport to readme. [Hannah Ward] + +* Threat actors now get imported by stix. [Hannah Ward] + +* Added docs to stiximport. [Hannah Ward] + +* Added stix import -- works for IPs/Domains. [Hannah Ward] + +* Update to the DNS module to support domain|ip. [iglocska] + +* Small change to the skeleton export. [iglocska] + +* Merge remote-tracking branch 'origin/import-test' [iglocska] + +* Added test export module. [Iglocska] + +* Merge branch 'master' of github.com:MISP/misp-modules. [Alexandre Dulaunoy] + +* Merge pull request #37 from Rafiot/master. [Raphaël Vinot] + + Update documentation. + +* Update documentation. [Raphaël Vinot] + + Fix https://github.com/MISP/MISP/issues/1424 + +* Merge branch 'import-test' of github.com:MISP/misp-modules into import-test. [Alexandre Dulaunoy] + +* Merge pull request #36 from Rafiot/import-test. [Alexandre Dulaunoy] + + Pass the server port as integer to the uwhois client + +* Pass the server port as integer to the uwhois client. [Raphaël Vinot] + +* Merge pull request #35 from Rafiot/import-test. [Alexandre Dulaunoy] + + Add whois module + +* Add whois module. [Raphaël Vinot] + +* First version of an Optical Character Recognition (OCR) module for MISP. [Alexandre Dulaunoy] + +* First version of the import skeleton. [Iglocska] + +* Added simple import skeleton. [Iglocska] + +* Merge pull request #33 from Rafiot/master. [Raphaël Vinot] + + fix: run the server as "python3 misp-modules" + +* Added category to the return format description. [Iglocska] + +* Merge pull request #31 from treyka/patch-1. [Alexandre Dulaunoy] + + Refine the installation procedure + +* Refine the installation procedure. [Trey Darley] + + Tweak this to make it more inline with the MISP installation docs, start misp-modules at startup via /etc/rc.local + +* Install documentation updated. [Alexandre Dulaunoy] + +* Merge pull request #28 from Rafiot/pip. [Alexandre Dulaunoy] + + Make it a package + +* Also run travis tests on the system-wide instance. [Raphaël Vinot] + +* Fix typos in the readme. [Raphaël Vinot] + +* Fix travis. [Raphaël Vinot] + +* Make sure misp-modules can be launched from anywhere. [Raphaël Vinot] + +* Proper testcases. [Raphaël Vinot] + +* Make it a package. [Raphaël Vinot] + +* Merge pull request #29 from iglocska/master. [Alexandre Dulaunoy] + + Added skeleton structure for new modules + +* Added skeleton structure for new modules. [Iglocska] + +* Fixed a bug introduced by previous commit if started from the current directory. [Alexandre Dulaunoy] + +* Merge pull request #26 from Rafiot/master. [Alexandre Dulaunoy] + + Automatic chdir when the modules are started + +* Automatic chdir when the modules are started. [Raphaël Vinot] + +* Merge pull request #25 from eu-pi/eupi_expansion_fix. [Alexandre Dulaunoy] + + [EUPI] Fix expansion for empty EUPI response + +* [EUPI] Fix expansion for empty EUPI response. [Rogdham] + + Offer no enrichment instead of displaying an error message + +* Merge pull request #24 from eu-pi/eupi_hover. [Alexandre Dulaunoy] + + [EUPI] Change module for a simple hover status + +* [EUPI] Simplify hover. [Rogdham] + +* Merge pull request #23 from Rafiot/master. [Raphaël Vinot] + + [EUPI] Return error message if unknown + +* [EUPI] Return error message is unknown. [Raphaël Vinot] + +* Merge pull request #22 from Rafiot/master. [Raphaël Vinot] + + [EUPI] Do not return empty results + +* [EUPI] Do not return empty results. [Raphaël Vinot] + +* ASN History added. [Alexandre Dulaunoy] + +* Merge pull request #21 from Rafiot/master. [Raphaël Vinot] + + [ASN description] Fix input type + +* [ASN description] Fix input type. [Raphaël Vinot] + +* Merge pull request #20 from Rafiot/master. [Raphaël Vinot] + + Add ASN Description expansion module + +* Add ASN Description expansion module. [Raphaël Vinot] + +* Merge pull request #19 from Rafiot/master. [Raphaël Vinot] + + Fix last commit + +* Fix last commit. [Raphaël Vinot] + +* Merge pull request #18 from Rafiot/master. [Raphaël Vinot] + + Improve rendering of IP ASN + +* Improve rendering of IP ASN. [Raphaël Vinot] + +* Merge pull request #17 from Rafiot/master. [Raphaël Vinot] + + Fix again IPASN module + +* Fix again IPASN module. [Raphaël Vinot] + +* Merge pull request #16 from Rafiot/master. [Raphaël Vinot] + + Fix IPASN module + +* Fix IPASN module. [Raphaël Vinot] + +* Ipasn module added. [Alexandre Dulaunoy] + +* Merge pull request #15 from Rafiot/master. [Alexandre Dulaunoy] + + Add IPASN history module + +* Add IPASN history module. [Raphaël Vinot] + +* Merge pull request #14 from eu-pi/listen-addr. [Alexandre Dulaunoy] + + Add option to specify listen address + +* Add option to specify listen address. [Rogdham] + +* EUPI module added. [Alexandre Dulaunoy] + +* Merge pull request #13 from Rafiot/master. [Raphaël Vinot] + + Fix eupi module + +* Fix eupi module. [Raphaël Vinot] + +* Merge pull request #12 from Rafiot/master. [Raphaël Vinot] + + Add EUPI module + +* Add redis server. [Raphaël Vinot] + +* Add EUPI module. [Raphaël Vinot] + +* Skip modules that cannot import. [Alexandre Dulaunoy] + +* Skip dot files. [Alexandre Dulaunoy] + +* Value is not required. [Alexandre Dulaunoy] + +* Cache helper added. [Alexandre Dulaunoy] + + The cache helper is a simple helper to cache data + in Redis back-end. The format in the cache is the following: + m::sha1(key) -> value. Default expiration is 86400 seconds. + +* Skeleton for misp-modules helpers added. [Alexandre Dulaunoy] + + Helpers will support modules with basic functionalities + like caching or alike. + +* Option -p added to specify the TCP port of the misp-modules server. [Alexandre Dulaunoy] + +* Intelmq req. removed. [Alexandre Dulaunoy] + +* Argparse used for the test mode. [Alexandre Dulaunoy] + +* Deleted. [Alexandre Dulaunoy] + +* Intelmq is an experimental module (not production ready) [Alexandre Dulaunoy] + +* Merge pull request #11 from Rafiot/master. [Raphaël Vinot] + + Fix test mode + +* Fix test mode. [Raphaël Vinot] + +* Fix install commands. [Raphaël Vinot] + +* Add Travis logo. [Raphaël Vinot] + +* Merge pull request #10 from Rafiot/travis. [Raphaël Vinot] + + Add basic travis file + +* Add basic travis file. [Raphaël Vinot] + +* Merge pull request #9 from Rafiot/master. [Alexandre Dulaunoy] + + Please PEP8 on all expansions + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Raphaël Vinot] + +* Merge pull request #8 from aaronkaplan/master. [Alexandre Dulaunoy] + + initial example of intelmq connector/enrichtment. Need to change to u… + +* Initial example of intelmq connector/enrichtment. Need to change to use the eventDB RESTful API, not the postgresql DB. [aaronkaplan] + +* Update README.md. [Raphaël Vinot] + +* Dns module test with option added. [Alexandre Dulaunoy] + +* New modules added. [Alexandre Dulaunoy] + +* Dns MISP module - option to specify nameserver added. [Alexandre Dulaunoy] + +* Slides reference added. [Alexandre Dulaunoy] + +* Add missing requirements. [Alexandre Dulaunoy] + +* Merge pull request #7 from Rafiot/master. [Alexandre Dulaunoy] + + Make loader more flexible + +* Make PEP8 happy. [Raphaël Vinot] + +* Add CIRCL pssl module. [Raphaël Vinot] + +* Make loader more flexible. [Raphaël Vinot] + +* First module to test the freetext import functionality. [Alexandre Dulaunoy] + +* CIRCL Passive DNS output attributes updated. [Alexandre Dulaunoy] + +* PyPDNS requirement added. [Alexandre Dulaunoy] + +* CIRCL Passive DNS added. [Alexandre Dulaunoy] + +* Tests updated to include CIRCL passive dns. [Alexandre Dulaunoy] + +* Test file for passivetotal updated. [Alexandre Dulaunoy] + +* Merge pull request #5 from passivetotal/master. [Alexandre Dulaunoy] + + Rewrote the entire PassiveTotal extension + +* Rewrote the entire PassiveTotal extension. [Brandon Dixon] + +* Return a text attribute for an hover only module. [Alexandre Dulaunoy] + +* How to start MISP modules. [Alexandre Dulaunoy] + +* 2.4.28 includes misp modules by default. [Alexandre Dulaunoy] + +* Types are now described. [Alexandre Dulaunoy] + +* Debug removed. [Alexandre Dulaunoy] + +* Convert the base64 to ascii. [Iglocska] + +* Module-type added as default. [Alexandre Dulaunoy] + +* Return base64 value of the archived data. [Alexandre Dulaunoy] + +* Merge pull request #2 from iglocska/master. [Alexandre Dulaunoy] + + Some changes to the sourcecache expansion + +* Merge branch 'alternate_response' [Iglocska] + +* Some changes to the sourcecache expansion. [Iglocska] + + - return attachment or malware sample + +* Cve module tests added. [Alexandre Dulaunoy] + +* CVE hover expansion module. [Alexandre Dulaunoy] + + An hover module is a module returning a JSON that can be used + as hover element in the MISP UI. + +* Sourcecache module includes the metadata config. [Alexandre Dulaunoy] + +* README updated to reflect config parameters changes. [Alexandre Dulaunoy] + +* Removed unused attributes. [Alexandre Dulaunoy] + +* Sample JSON files reflecting config changes. [Alexandre Dulaunoy] + +* Config parameters are now exposed via the meta information. [Alexandre Dulaunoy] + + config uses a specific list of values exposed via the + introspection of the module. config is now passed as an additional + dictionary to the request. MISP attributes include only MISP attributes. + +* Sourcecache module added. [Alexandre Dulaunoy] + +* A minimal caching module added to cache link or url from MISP. [Alexandre Dulaunoy] + +* Typo fixed + meta output. [Alexandre Dulaunoy] + +* Minimal functions requirements updated + PR request. [Alexandre Dulaunoy] + +* Exclude dot files from modules list to be loaded. [Alexandre Dulaunoy] + +* Example of module introspection including meta information. [Alexandre Dulaunoy] + +* Module meta added to return version, description and author per module. [Alexandre Dulaunoy] + +* Authentication notes added. [Alexandre Dulaunoy] + +* Passivetotal module added. [Alexandre Dulaunoy] + +* First version of a passivetotal MISP expansion module. [Alexandre Dulaunoy] + +* Default DNS updated. [Alexandre Dulaunoy] + +* Add a note regarding error codes. [Alexandre Dulaunoy] + +* Handling of error added. [Alexandre Dulaunoy] + +* Merge pull request #1 from Rafiot/master. [Alexandre Dulaunoy] + + Make PEP8 happy. + +* Make PEP8 happy. [Raphaël Vinot] + +* Output updated (type of module added) [Alexandre Dulaunoy] + +* Add a version per default. [Alexandre Dulaunoy] + +* Add type per module. [Alexandre Dulaunoy] + +* Format updated following Andras updates. [Alexandre Dulaunoy] + +* Default var directory added. [Alexandre Dulaunoy] + +* Python pip REQUIREMENTS file added. [Alexandre Dulaunoy] + +* Merge branch 'master' of https://github.com/MISP/misp-modules. [Iglocska] + +* Minimal logging added to the server. [Alexandre Dulaunoy] + +* Debug messages removed. [Alexandre Dulaunoy] + +* Minimal documentation added. [Alexandre Dulaunoy] + +* Curl is now silent. [Alexandre Dulaunoy] + +* Changed the output format to include all matching attribute types. [Iglocska] + + - changed the output format to give us a bit more flexibility + - return an array of results + - return the valid misp attribute types for each result + +* Basic test cases added. [Alexandre Dulaunoy] + +* MISP dns expansion module. [Alexandre Dulaunoy] + +* First version of a web services to provide ReST API to MISP expansion services. [Alexandre Dulaunoy] + + diff --git a/DOC-REQUIREMENTS b/DOC-REQUIREMENTS new file mode 100644 index 0000000..8373cb7 --- /dev/null +++ b/DOC-REQUIREMENTS @@ -0,0 +1,3 @@ +mkdocs +pymdown-extensions +mkdocs-material diff --git a/Makefile b/Makefile index 1cff13f..b37670e 100644 --- a/Makefile +++ b/Makefile @@ -3,12 +3,15 @@ .PHONY: prepare_docs generate_docs ci_generate_docs test_docs prepare_docs: - cd doc; python generate_documentation.py + cd documentation; python3 generate_documentation.py mkdir -p docs/expansion/logos docs/export_mod/logos docs/import_mod/logos - cp -R doc/logos/* docs/expansion/logos - cp -R doc/logos/* docs/export_mod/logos - cp -R doc/logos/* docs/import_mod/logos - cp LICENSE docs/license.md + mkdir -p docs/logos + cd documentation; cp -R ./logos/* ../docs/logos + cd documentation; cp -R ./logos/* ../docs/expansion/logos + cd documentation; cp -R ./logos/* ../docs/export_mod/logos + cd documentation; cp -R ./logos/* ../docs/import_mod/logos + cp ./documentation/mkdocs/*.md ./docs + cp LICENSE ./docs/license.md install_requirements: pip install -r docs/REQUIREMENTS.txt diff --git a/Pipfile b/Pipfile index 6a8fb80..ddc0201 100644 --- a/Pipfile +++ b/Pipfile @@ -11,58 +11,70 @@ flake8 = "*" [packages] dnspython = "*" -requests = {extras = ["security"],version = "*"} +requests = { extras = ["security"], version = "*" } urlarchiver = "*" passivetotal = "*" pypdns = "*" pypssl = "*" pyeupi = "*" -uwhois = {editable = true,git = "https://github.com/Rafiot/uwhoisd.git",ref = "testing",subdirectory = "client"} -pymisp = {editable = true,extras = ["fileobjects,openioc,pdfexport"],git = "https://github.com/MISP/PyMISP.git"} -pyonyphe = {editable = true,git = "https://github.com/sebdraven/pyonyphe"} -pydnstrails = {editable = true,git = "https://github.com/sebdraven/pydnstrails"} +pymisp = { extras = ["fileobjects,openioc,pdfexport,email,url"], version = "*" } +pyonyphe = { git = "https://github.com/sebdraven/pyonyphe" } +pydnstrails = { git = "https://github.com/sebdraven/pydnstrails" } pytesseract = "*" pygeoip = "*" beautifulsoup4 = "*" oauth2 = "*" yara-python = "==3.8.1" sigmatools = "*" +stix2 = "*" stix2-patterns = "*" +taxii2-client = "*" maclookup = "*" vulners = "*" blockchain = "*" reportlab = "*" -pyintel471 = {editable = true,git = "https://github.com/MISP/PyIntel471.git"} +pyintel471 = { git = "https://github.com/MISP/PyIntel471.git" } shodan = "*" -Pillow = "*" +Pillow = ">=8.2.0" Wand = "*" SPARQLWrapper = "*" domaintools_api = "*" -misp-modules = {editable = true,path = "."} -pybgpranking = {editable = true,git = "https://github.com/D4-project/BGP-Ranking.git/",subdirectory = "client"} -pyipasnhistory = {editable = true,git = "https://github.com/D4-project/IPASN-History.git/",subdirectory = "client"} +misp-modules = { path = "." } +pybgpranking = { git = "https://github.com/D4-project/BGP-Ranking.git/", subdirectory = "client", ref = "68de39f6c5196f796055c1ac34504054d688aa59" } +pyipasnhistory = { git = "https://github.com/D4-project/IPASN-History.git/", subdirectory = "client", ref = "a2853c39265cecdd0c0d16850bd34621c0551b87" } backscatter = "*" pyzbar = "*" opencv-python = "*" np = "*" -ODTReader = {editable = true,git = "https://github.com/cartertemm/ODTReader.git/"} +ODTReader = { git = "https://github.com/cartertemm/ODTReader.git/" } python-pptx = "*" python-docx = "*" ezodf = "*" -pandas = "*" -pandas_ods_reader = "*" +pandas = "==1.3.5" +pandas_ods_reader = "==0.1.2" pdftotext = "*" lxml = "*" xlrd = "*" -idna-ssl = {markers = "python_version < '3.7'"} jbxapi = "*" geoip2 = "*" apiosintDS = "*" assemblyline_client = "*" vt-graph-api = "*" -trustar = "*" +trustar = { git = "https://github.com/SteveClement/trustar-python.git" } markdownify = "==0.5.3" socialscan = "*" +dnsdb2 = "*" +clamd = "*" +aiohttp = ">=3.7.4" +tau-clients = "*" +vt-py = ">=0.7.1" +crowdstrike-falconpy = "0.9.0" +censys = "2.0.9" +mwdblib = "3.4.1" +ndjson = "0.3.1" +Jinja2 = "3.1.2" +mattermostdriver = "7.3.2" +openpyxl = "*" [requires] -python_version = "3" +python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index dbca0ce..0000000 --- a/Pipfile.lock +++ /dev/null @@ -1,1597 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "1500257feb23545cff1594b4e16711ddb190a202858fcb95b469aa951a4b6b8c" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "aiohttp": { - "hashes": [ - "sha256:027be45c4b37e21be81d07ae5242361d73eebad1562c033f80032f955f34df82", - "sha256:06efdb01ab71ec20786b592d510d1d354fbe0b2e4449ee47067b9ca65d45a006", - "sha256:0989ff15834a4503056d103077ec3652f9ea5699835e1ceaee46b91cf59830bf", - "sha256:11e087c316e933f1f52f3d4a09ce13f15ad966fc43df47f44ca4e8067b6a2e0d", - "sha256:184ead67248274f0e20b0cd6bb5f25209b2fad56e5373101cc0137c32c825c87", - "sha256:1c36b7ef47cfbc150314c2204cd73613d96d6d0982d41c7679b7cdcf43c0e979", - "sha256:2aea79734ac5ceeac1ec22b4af4efb4efd6a5ca3d73d77ec74ed782cf318f238", - "sha256:2e886611b100c8c93b753b457e645c5e4b8008ec443434d2a480e5a2bb3e6514", - "sha256:476b1f8216e59a3c2ffb71b8d7e1da60304da19f6000d422bacc371abb0fc43d", - "sha256:48104c883099c0e614c5c38f98c1d174a2c68f52f58b2a6e5a07b59df78262ab", - "sha256:4afd8002d9238e5e93acf1a8baa38b3ddf1f7f0ebef174374131ff0c6c2d7973", - "sha256:547b196a7177511da4f475fc81d0bb88a51a8d535c7444bbf2338b6dc82cb996", - "sha256:67f8564c534d75c1d613186939cee45a124d7d37e7aece83b17d18af665b0d7a", - "sha256:6e0d1231a626d07b23f6fe904caa44efb249da4222d8a16ab039fb2348722292", - "sha256:7e26712871ebaf55497a60f55483dc5e74326d1fb0bfceab86ebaeaa3a266733", - "sha256:7f1aeb72f14b9254296cdefa029c00d3c4550a26e1059084f2ee10d22086c2d0", - "sha256:8319a55de469d5af3517dfe1f6a77f248f6668c5a552396635ef900f058882ef", - "sha256:835bd35e14e4f36414e47c195e6645449a0a1c3fd5eeae4b7f22cb4c5e4f503a", - "sha256:89c1aa729953b5ac6ca3c82dcbd83e7cdecfa5cf9792c78c154a642e6e29303d", - "sha256:8a8addd41320637c1445fea0bae1fd9fe4888acc2cd79217ee33e5d1c83cfe01", - "sha256:8fbeeb2296bb9fe16071a674eadade7391be785ae0049610e64b60ead6abcdd7", - "sha256:a1f1cc11c9856bfa7f1ca55002c39070bde2a97ce48ef631468e99e2ac8e3fe6", - "sha256:ad5c3559e3cd64f746df43fa498038c91aa14f5d7615941ea5b106e435f3b892", - "sha256:b822bf7b764283b5015e3c49b7bb93f37fc03545f4abe26383771c6b1c813436", - "sha256:b84cef790cb93cec82a468b7d2447bf16e3056d2237b652e80f57d653b61da88", - "sha256:be9fa3fe94fc95e9bf84e84117a577c892906dd3cb0a95a7ae21e12a84777567", - "sha256:c53f1d2bd48f5f407b534732f5b3c6b800a58e70b53808637848d8a9ee127fe7", - "sha256:c588a0f824dc7158be9eec1ff465d1c868ad69a4dc518cd098cc11e4f7da09d9", - "sha256:c6da1af59841e6d43255d386a2c4bfb59c0a3b262bdb24325cc969d211be6070", - "sha256:c9a415f4f2764ab6c7d63ee6b86f02a46b4df9bc11b0de7ffef206908b7bf0b4", - "sha256:cdbb65c361ff790c424365a83a496fc8dd1983689a5fb7c6852a9a3ff1710c61", - "sha256:f04dcbf6af1868048a9b4754b1684c669252aa2419aa67266efbcaaead42ced7", - "sha256:f8c583c31c6e790dc003d9d574e3ed2c5b337947722965096c4d684e4f183570" - ], - "markers": "python_version >= '3.6'", - "version": "==3.7.2" - }, - "antlr4-python3-runtime": { - "hashes": [ - "sha256:15793f5d0512a372b4e7d2284058ad32ce7dd27126b105fb0b2245130445db33" - ], - "markers": "python_version >= '3'", - "version": "==4.8" - }, - "apiosintds": { - "hashes": [ - "sha256:d8ab4dcf75a9989572cd6808773b56fdf535b6080d6041d98e911e6c5eb31f3c" - ], - "index": "pypi", - "version": "==1.8.3" - }, - "argparse": { - "hashes": [ - "sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4", - "sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314" - ], - "version": "==1.4.0" - }, - "assemblyline-client": { - "hashes": [ - "sha256:6a36a654185ba40d10bdd0213a1926aacb4351290824e406cbff6b6b5b251f5f" - ], - "index": "pypi", - "version": "==4.0.1" - }, - "async-timeout": { - "hashes": [ - "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f", - "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3" - ], - "markers": "python_full_version >= '3.5.3'", - "version": "==3.0.1" - }, - "attrs": { - "hashes": [ - "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", - "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.3.0" - }, - "backscatter": { - "hashes": [ - "sha256:7a0d1aa3661635de81e2a09b15d53e35cbe399a111cc58a70925f80e6874abd3", - "sha256:afb0efcf5d2551dac953ec4c38fb710b274b8e811775650e02c1ef42cafb14c8" - ], - "index": "pypi", - "version": "==0.2.4" - }, - "beautifulsoup4": { - "hashes": [ - "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35", - "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25", - "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666" - ], - "index": "pypi", - "version": "==4.9.3" - }, - "blockchain": { - "hashes": [ - "sha256:dbaa3eebb6f81b4245005739da802c571b09f98d97eb66520afd95d9ccafebe2" - ], - "index": "pypi", - "version": "==1.4.4" - }, - "certifi": { - "hashes": [ - "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd", - "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4" - ], - "version": "==2020.11.8" - }, - "cffi": { - "hashes": [ - "sha256:005f2bfe11b6745d726dbb07ace4d53f057de66e336ff92d61b8c7e9c8f4777d", - "sha256:09e96138280241bd355cd585148dec04dbbedb4f46128f340d696eaafc82dd7b", - "sha256:0b1ad452cc824665ddc682400b62c9e4f5b64736a2ba99110712fdee5f2505c4", - "sha256:0ef488305fdce2580c8b2708f22d7785ae222d9825d3094ab073e22e93dfe51f", - "sha256:15f351bed09897fbda218e4db5a3d5c06328862f6198d4fb385f3e14e19decb3", - "sha256:22399ff4870fb4c7ef19fff6eeb20a8bbf15571913c181c78cb361024d574579", - "sha256:23e5d2040367322824605bc29ae8ee9175200b92cb5483ac7d466927a9b3d537", - "sha256:2791f68edc5749024b4722500e86303a10d342527e1e3bcac47f35fbd25b764e", - "sha256:2f9674623ca39c9ebe38afa3da402e9326c245f0f5ceff0623dccdac15023e05", - "sha256:3363e77a6176afb8823b6e06db78c46dbc4c7813b00a41300a4873b6ba63b171", - "sha256:33c6cdc071ba5cd6d96769c8969a0531be2d08c2628a0143a10a7dcffa9719ca", - "sha256:3b8eaf915ddc0709779889c472e553f0d3e8b7bdf62dab764c8921b09bf94522", - "sha256:3cb3e1b9ec43256c4e0f8d2837267a70b0e1ca8c4f456685508ae6106b1f504c", - "sha256:3eeeb0405fd145e714f7633a5173318bd88d8bbfc3dd0a5751f8c4f70ae629bc", - "sha256:44f60519595eaca110f248e5017363d751b12782a6f2bd6a7041cba275215f5d", - "sha256:4d7c26bfc1ea9f92084a1d75e11999e97b62d63128bcc90c3624d07813c52808", - "sha256:529c4ed2e10437c205f38f3691a68be66c39197d01062618c55f74294a4a4828", - "sha256:6642f15ad963b5092d65aed022d033c77763515fdc07095208f15d3563003869", - "sha256:85ba797e1de5b48aa5a8427b6ba62cf69607c18c5d4eb747604b7302f1ec382d", - "sha256:8f0f1e499e4000c4c347a124fa6a27d37608ced4fe9f7d45070563b7c4c370c9", - "sha256:a624fae282e81ad2e4871bdb767e2c914d0539708c0f078b5b355258293c98b0", - "sha256:b0358e6fefc74a16f745afa366acc89f979040e0cbc4eec55ab26ad1f6a9bfbc", - "sha256:bbd2f4dfee1079f76943767fce837ade3087b578aeb9f69aec7857d5bf25db15", - "sha256:bf39a9e19ce7298f1bd6a9758fa99707e9e5b1ebe5e90f2c3913a47bc548747c", - "sha256:c11579638288e53fc94ad60022ff1b67865363e730ee41ad5e6f0a17188b327a", - "sha256:c150eaa3dadbb2b5339675b88d4573c1be3cb6f2c33a6c83387e10cc0bf05bd3", - "sha256:c53af463f4a40de78c58b8b2710ade243c81cbca641e34debf3396a9640d6ec1", - "sha256:cb763ceceae04803adcc4e2d80d611ef201c73da32d8f2722e9d0ab0c7f10768", - "sha256:cc75f58cdaf043fe6a7a6c04b3b5a0e694c6a9e24050967747251fb80d7bce0d", - "sha256:d80998ed59176e8cba74028762fbd9b9153b9afc71ea118e63bbf5d4d0f9552b", - "sha256:de31b5164d44ef4943db155b3e8e17929707cac1e5bd2f363e67a56e3af4af6e", - "sha256:e66399cf0fc07de4dce4f588fc25bfe84a6d1285cc544e67987d22663393926d", - "sha256:f0620511387790860b249b9241c2f13c3a80e21a73e0b861a2df24e9d6f56730", - "sha256:f4eae045e6ab2bb54ca279733fe4eb85f1effda392666308250714e01907f394", - "sha256:f92cdecb618e5fa4658aeb97d5eb3d2f47aa94ac6477c6daf0f306c5a3b9e6b1", - "sha256:f92f789e4f9241cd262ad7a555ca2c648a98178a953af117ef7fad46aa1d5591" - ], - "version": "==1.14.3" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "click": { - "hashes": [ - "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", - "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==7.1.2" - }, - "click-plugins": { - "hashes": [ - "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b", - "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8" - ], - "version": "==1.1.1" - }, - "colorama": { - "hashes": [ - "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", - "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.4.4" - }, - "configparser": { - "hashes": [ - "sha256:005c3b102c96f4be9b8f40dafbd4997db003d07d1caa19f37808be8031475f2a", - "sha256:08e8a59ef1817ac4ed810bb8e17d049566dd6e024e7566f6285c756db2bb4ff8" - ], - "markers": "python_version >= '3.6'", - "version": "==5.0.1" - }, - "cryptography": { - "hashes": [ - "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538", - "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f", - "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77", - "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b", - "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33", - "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e", - "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb", - "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e", - "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7", - "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297", - "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d", - "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7", - "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b", - "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7", - "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4", - "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8", - "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b", - "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851", - "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13", - "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b", - "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3", - "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df" - ], - "version": "==3.2.1" - }, - "decorator": { - "hashes": [ - "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", - "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" - ], - "version": "==4.4.2" - }, - "deprecated": { - "hashes": [ - "sha256:525ba66fb5f90b07169fdd48b6373c18f1ee12728ca277ca44567a367d9d7f74", - "sha256:a766c1dccb30c5f6eb2b203f87edd1d8588847709c78589e1521d769addc8218" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.2.10" - }, - "dnspython": { - "hashes": [ - "sha256:044af09374469c3a39eeea1a146e8cac27daec951f1f1f157b1962fc7cb9d1b7", - "sha256:40bb3c24b9d4ec12500f0124288a65df232a3aa749bb0c39734b782873a2544d" - ], - "index": "pypi", - "version": "==2.0.0" - }, - "domaintools-api": { - "hashes": [ - "sha256:62e2e688d14dbd7ca51a44bd0a8490aa69c712895475598afbdbb1e1e15bf2f2", - "sha256:fe75e3cc86e7e2904b06d8e94b1986e721fdce85d695c87d1140403957e4c989" - ], - "index": "pypi", - "version": "==0.5.2" - }, - "enum-compat": { - "hashes": [ - "sha256:3677daabed56a6f724451d585662253d8fb4e5569845aafa8bb0da36b1a8751e", - "sha256:88091b617c7fc3bbbceae50db5958023c48dc40b50520005aa3bf27f8f7ea157" - ], - "version": "==0.0.3" - }, - "ez-setup": { - "hashes": [ - "sha256:303c5b17d552d1e3fb0505d80549f8579f557e13d8dc90e5ecef3c07d7f58642" - ], - "version": "==0.9" - }, - "ezodf": { - "hashes": [ - "sha256:000da534f689c6d55297a08f9e2ed7eada9810d194d31d164388162fb391122d" - ], - "index": "pypi", - "version": "==0.3.2" - }, - "future": { - "hashes": [ - "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.18.2" - }, - "futures": { - "hashes": [ - "sha256:3a44f286998ae64f0cc083682fcfec16c406134a81a589a5de445d7bb7c2751b", - "sha256:51ecb45f0add83c806c68e4b06106f90db260585b25ef2abfcda0bd95c0132fd", - "sha256:c4884a65654a7c45435063e14ae85280eb1f111d94e542396717ba9828c4337f" - ], - "version": "==3.1.1" - }, - "geoip2": { - "hashes": [ - "sha256:57d8d15de2527e0697bbef44fc16812bba709f03a07ef99297bd56c1df3b1efd", - "sha256:707025542ef076bd8fd80e97138bebdb7812527b2a007d141a27ad98b0370fff" - ], - "index": "pypi", - "version": "==4.1.0" - }, - "httplib2": { - "hashes": [ - "sha256:8af66c1c52c7ffe1aa5dc4bcd7c769885254b0756e6e69f953c7f0ab49a70ba3", - "sha256:ca2914b015b6247791c4866782fa6042f495b94401a0f0bd3e1d6e0ba2236782" - ], - "version": "==0.18.1" - }, - "idna": { - "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.10" - }, - "idna-ssl": { - "hashes": [ - "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c" - ], - "markers": "python_version < '3.7'", - "version": "==1.1.0" - }, - "isodate": { - "hashes": [ - "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8", - "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81" - ], - "version": "==0.6.0" - }, - "jbxapi": { - "hashes": [ - "sha256:0605208a072ff5752754df0798f0de5acd8630e37237e04f816f1393c2c08b80" - ], - "index": "pypi", - "version": "==3.13.0" - }, - "json-log-formatter": { - "hashes": [ - "sha256:ee187c9a80936cbf1259f73573973450fc24b84a4fb54e53eb0dcff86ea1e759" - ], - "version": "==0.3.0" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "lief": { - "hashes": [ - "sha256:276cc63ec12a21bdf01b8d30962692c17499788234f0765247ca7a35872097ec", - "sha256:3e6baaeb52bdc339b5f19688b58fd8d5778b92e50221f920cedfa2bec1f4d5c2", - "sha256:45e5c592b57168c447698381d927eb2386ffdd52afe0c48245f848d4cc7ee05a", - "sha256:6547752b5db105cd41c9fa65d0d7452a4d7541b77ffee716b46246c6d81e172f", - "sha256:83b51e01627b5982662f9550ac1230758aa56945ed86829e4291932d98417da3", - "sha256:895599194ea7495bf304e39317b04df20cccf799fc2751867cc1aa4997cfcdae", - "sha256:8a91cee2568306fe1d2bf84341b459c85368317d01d7105fa49e4f4ede837076", - "sha256:913b36a67707dc2afa72f117bab9856ea3f434f332b04a002a0f9723c8779320", - "sha256:9f604a361a3b1b3ed5fdafed0321c5956cb3b265b5efe2250d1bf8911a80c65b", - "sha256:a487fe7234c04bccd58223dbb79214421176e2629814c7a4a887764cceb5be7c", - "sha256:bc8488fb0661cb436fe4bb4fe947d0f9aa020e9acaed233ccf01ab04d888c68a", - "sha256:bddbf333af62310a10cb738a1df1dc2b140dd9c663b55ba3500c10c249d416d2", - "sha256:cce48d7c97cef85e01e6cfeff55f2068956b5c0257eb9c2d2c6d15e33dd1e4fc", - "sha256:f8b3f66956c56b582b3adc573bf2a938c25fb21c8894b373a113e24c494fc982" - ], - "version": "==0.10.1" - }, - "lxml": { - "hashes": [ - "sha256:24e811118aab6abe3ce23ff0d7d38932329c513f9cef849d3ee88b0f848f2aa9", - "sha256:302160eb6e9764168e01d8c9ec6becddeb87776e81d3fcb0d97954dd51d48e0a", - "sha256:bb252f802f91f59767dcc559744e91efa9df532240a502befd874b54571417bd", - "sha256:2e311a10f3e85250910a615fe194839a04a0f6bc4e8e5bb5cac221344e3a7891", - "sha256:098fb713b31050463751dcc694878e1d39f316b86366fb9fe3fbbe5396ac9fab", - "sha256:211b3bcf5da70c2d4b84d09232534ad1d78320762e2c59dedc73bf01cb1fc45b", - "sha256:4fff34721b628cce9eb4538cf9a73d02e0f3da4f35a515773cce6f5fe413b360", - "sha256:3d9b2b72eb0dbbdb0e276403873ecfae870599c83ba22cadff2db58541e72856", - "sha256:475325e037fdf068e0c2140b818518cf6bc4aa72435c407a798b2db9f8e90810", - "sha256:c152b2e93b639d1f36ec5a8ca24cde4a8eefb2b6b83668fcd8e83a67badcb367", - "sha256:803a80d72d1f693aa448566be46ffd70882d1ad8fc689a2e22afe63035eb998a", - "sha256:1d87936cb5801c557f3e981c9c193861264c01209cb3ad0964a16310ca1b3301", - "sha256:be1ebf9cc25ab5399501c9046a7dcdaa9e911802ed0e12b7d620cd4bbf0518b3", - "sha256:9b06690224258db5cd39a84e993882a6874676f5de582da57f3df3a82ead9174", - "sha256:f98b6f256be6cec8dd308a8563976ddaff0bdc18b730720f6f4bee927ffe926f", - "sha256:23c83112b4dada0b75789d73f949dbb4e8f29a0a3511647024a398ebd023347b", - "sha256:be7c65e34d1b50ab7093b90427cbc488260e4b3a38ef2435d65b62e9fa3d798a", - "sha256:d182eada8ea0de61a45a526aa0ae4bcd222f9673424e65315c35820291ff299c", - "sha256:8862d1c2c020cb7a03b421a9a7b4fe046a208db30994fc8ff68c627a7915987f", - "sha256:d20d32cbb31d731def4b1502294ca2ee99f9249b63bc80e03e67e8f8e126dea8", - "sha256:d18331ea905a41ae71596502bd4c9a2998902328bbabd29e3d0f5f8569fabad1", - "sha256:c0dac835c1a22621ffa5e5f999d57359c790c52bbd1c687fe514ae6924f65ef5", - "sha256:d6f8c23f65a4bfe4300b85f1f40f6c32569822d08901db3b6454ab785d9117cc", - "sha256:573b2f5496c7e9f4985de70b9bbb4719ffd293d5565513e04ac20e42e6e5583f", - "sha256:4b7572145054330c8e324a72d808c8c8fbe12be33368db28c39a255ad5f7fb51", - "sha256:e65c221b2115a91035b55a593b6eb94aa1206fa3ab374f47c6dc10d364583ff9", - "sha256:3a7a380bfecc551cfd67d6e8ad9faa91289173bdf12e9cfafbd2bdec0d7b1ec1", - "sha256:56eff8c6fb7bc4bcca395fdff494c52712b7a57486e4fbde34c31bb9da4c6cc4", - "sha256:2358809cc64394617f2719147a58ae26dac9e21bae772b45cfb80baa26bfca5d", - "sha256:2d5896ddf5389560257bbe89317ca7bcb4e54a02b53a3e572e1ce4226512b51b", - "sha256:a71400b90b3599eb7bf241f947932e18a066907bf84617d80817998cee81e4bf", - "sha256:189ad47203e846a7a4951c17694d845b6ade7917c47c64b29b86526eefc3adf5", - "sha256:d4ad7fd3269281cb471ad6c7bafca372e69789540d16e3755dd717e9e5c9d82f", - "sha256:7ecaef52fd9b9535ae5f01a1dd2651f6608e4ec9dc136fc4dfe7ebe3c3ddb230", - "sha256:d84d741c6e35c9f3e7406cb7c4c2e08474c2a6441d59322a00dcae65aac6315d", - "sha256:0e89f5d422988c65e6936e4ec0fe54d6f73f3128c80eb7ecc3b87f595523607b", - "sha256:2d6571c48328be4304aee031d2d5046cbc8aed5740c654575613c5a4f5a11311" - ], - "index": "pypi", - "version": "==4.6.1" - }, - "maclookup": { - "hashes": [ - "sha256:33bf8eaebe3b1e4ab4ae9277dd93c78024e0ebf6b3c42f76c37695bc26ce287a", - "sha256:795e792cd3e03c9bdad77e52904d43ff71d3ac03b360443f99d4bae08a6bffef" - ], - "index": "pypi", - "version": "==1.0.3" - }, - "markdownify": { - "hashes": [ - "sha256:30be8340724e706c9e811c27fe8c1542cf74a15b46827924fff5c54b40dd9b0d", - "sha256:a69588194fd76634f0139d6801b820fd652dc5eeba9530e90d323dfdc0155252" - ], - "index": "pypi", - "version": "==0.5.3" - }, - "maxminddb": { - "hashes": [ - "sha256:47e86a084dd814fac88c99ea34ba3278a74bc9de5a25f4b815b608798747c7dc" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.3" - }, - "misp-modules": { - "editable": true, - "path": "." - }, - "multidict": { - "hashes": [ - "sha256:060d68ae3e674c913ec41a464916f12c4d7ff17a3a9ebbf37ba7f2c681c2b33e", - "sha256:06f39f0ddc308dab4e5fa282d145f90cd38d7ed75390fc83335636909a9ec191", - "sha256:17847fede1aafdb7e74e01bb34ab47a1a1ea726e8184c623c45d7e428d2d5d34", - "sha256:1cd102057b09223b919f9447c669cf2efabeefb42a42ae6233f25ffd7ee31a79", - "sha256:20cc9b2dd31761990abff7d0e63cd14dbfca4ebb52a77afc917b603473951a38", - "sha256:2576e30bbec004e863d87216bc34abe24962cc2e964613241a1c01c7681092ab", - "sha256:2ab9cad4c5ef5c41e1123ed1f89f555aabefb9391d4e01fd6182de970b7267ed", - "sha256:359ea00e1b53ceef282232308da9d9a3f60d645868a97f64df19485c7f9ef628", - "sha256:3e61cc244fd30bd9fdfae13bdd0c5ec65da51a86575ff1191255cae677045ffe", - "sha256:43c7a87d8c31913311a1ab24b138254a0ee89142983b327a2c2eab7a7d10fea9", - "sha256:4a3f19da871befa53b48dd81ee48542f519beffa13090dc135fffc18d8fe36db", - "sha256:4df708ef412fd9b59b7e6c77857e64c1f6b4c0116b751cb399384ec9a28baa66", - "sha256:59182e975b8c197d0146a003d0f0d5dc5487ce4899502061d8df585b0f51fba2", - "sha256:6128d2c0956fd60e39ec7d1c8f79426f0c915d36458df59ddd1f0cff0340305f", - "sha256:6168839491a533fa75f3f5d48acbb829475e6c7d9fa5c6e245153b5f79b986a3", - "sha256:62abab8088704121297d39c8f47156cb8fab1da731f513e59ba73946b22cf3d0", - "sha256:653b2bbb0bbf282c37279dd04f429947ac92713049e1efc615f68d4e64b1dbc2", - "sha256:6566749cd78cb37cbf8e8171b5cd2cbfc03c99f0891de12255cf17a11c07b1a3", - "sha256:76cbdb22f48de64811f9ce1dd4dee09665f84f32d6a26de249a50c1e90e244e0", - "sha256:8efcf070d60fd497db771429b1c769a3783e3a0dd96c78c027e676990176adc5", - "sha256:8fa4549f341a057feec4c3139056ba73e17ed03a506469f447797a51f85081b5", - "sha256:9380b3f2b00b23a4106ba9dd022df3e6e2e84e1788acdbdd27603b621b3288df", - "sha256:9ed9b280f7778ad6f71826b38a73c2fdca4077817c64bc1102fdada58e75c03c", - "sha256:a7b8b5bd16376c8ac2977748bd978a200326af5145d8d0e7f799e2b355d425b6", - "sha256:af271c2540d1cd2a137bef8d95a8052230aa1cda26dd3b2c73d858d89993d518", - "sha256:b561e76c9e21402d9a446cdae13398f9942388b9bff529f32dfa46220af54d00", - "sha256:b82400ef848bbac6b9035a105ac6acaa1fb3eea0d164e35bbb21619b88e49fed", - "sha256:b98af08d7bb37d3456a22f689819ea793e8d6961b9629322d7728c4039071641", - "sha256:c58e53e1c73109fdf4b759db9f2939325f510a8a5215135330fe6755921e4886", - "sha256:cbabfc12b401d074298bfda099c58dfa5348415ae2e4ec841290627cb7cb6b2e", - "sha256:d4a6fb98e9e9be3f7d70fd3e852369c00a027bd5ed0f3e8ade3821bcad257408", - "sha256:d99da85d6890267292065e654a329e1d2f483a5d2485e347383800e616a8c0b1", - "sha256:e58db0e0d60029915f7fc95a8683fa815e204f2e1990f1fb46a7778d57ca8c35", - "sha256:e5bf89fe57f702a046c7ec718fe330ed50efd4bcf74722940db2eb0919cddb1c", - "sha256:f612e8ef8408391a4a3366e3508bab8ef97b063b4918a317cb6e6de4415f01af", - "sha256:f65a2442c113afde52fb09f9a6276bbc31da71add99dc76c3adf6083234e07c6", - "sha256:fa0503947a99a1be94f799fac89d67a5e20c333e78ddae16e8534b151cdc588a" - ], - "markers": "python_version >= '3.5'", - "version": "==5.0.2" - }, - "np": { - "hashes": [ - "sha256:781265283f3823663ad8fb48741aae62abcf4c78bc19f908f8aa7c1d3eb132f8" - ], - "index": "pypi", - "version": "==1.0.2" - }, - "numpy": { - "hashes": [ - "sha256:08308c38e44cc926bdfce99498b21eec1f848d24c302519e64203a8da99a97db", - "sha256:09c12096d843b90eafd01ea1b3307e78ddd47a55855ad402b157b6c4862197ce", - "sha256:13d166f77d6dc02c0a73c1101dd87fdf01339febec1030bd810dcd53fff3b0f1", - "sha256:141ec3a3300ab89c7f2b0775289954d193cc8edb621ea05f99db9cb181530512", - "sha256:16c1b388cc31a9baa06d91a19366fb99ddbe1c7b205293ed072211ee5bac1ed2", - "sha256:18bed2bcb39e3f758296584337966e68d2d5ba6aab7e038688ad53c8f889f757", - "sha256:1aeef46a13e51931c0b1cf8ae1168b4a55ecd282e6688fdb0a948cc5a1d5afb9", - "sha256:27d3f3b9e3406579a8af3a9f262f5339005dd25e0ecf3cf1559ff8a49ed5cbf2", - "sha256:2a2740aa9733d2e5b2dfb33639d98a64c3b0f24765fed86b0fd2aec07f6a0a08", - "sha256:4377e10b874e653fe96985c05feed2225c912e328c8a26541f7fc600fb9c637b", - "sha256:448ebb1b3bf64c0267d6b09a7cba26b5ae61b6d2dbabff7c91b660c7eccf2bdb", - "sha256:50e86c076611212ca62e5a59f518edafe0c0730f7d9195fec718da1a5c2bb1fc", - "sha256:5734bdc0342aba9dfc6f04920988140fb41234db42381cf7ccba64169f9fe7ac", - "sha256:64324f64f90a9e4ef732be0928be853eee378fd6a01be21a0a8469c4f2682c83", - "sha256:6ae6c680f3ebf1cf7ad1d7748868b39d9f900836df774c453c11c5440bc15b36", - "sha256:6d7593a705d662be5bfe24111af14763016765f43cb6923ed86223f965f52387", - "sha256:8cac8790a6b1ddf88640a9267ee67b1aee7a57dfa2d2dd33999d080bc8ee3a0f", - "sha256:8ece138c3a16db8c1ad38f52eb32be6086cc72f403150a79336eb2045723a1ad", - "sha256:9eeb7d1d04b117ac0d38719915ae169aa6b61fca227b0b7d198d43728f0c879c", - "sha256:a09f98011236a419ee3f49cedc9ef27d7a1651df07810ae430a6b06576e0b414", - "sha256:a5d897c14513590a85774180be713f692df6fa8ecf6483e561a6d47309566f37", - "sha256:ad6f2ff5b1989a4899bf89800a671d71b1612e5ff40866d1f4d8bcf48d4e5764", - "sha256:c42c4b73121caf0ed6cd795512c9c09c52a7287b04d105d112068c1736d7c753", - "sha256:cb1017eec5257e9ac6209ac172058c430e834d5d2bc21961dceeb79d111e5909", - "sha256:d6c7bb82883680e168b55b49c70af29b84b84abb161cbac2800e8fcb6f2109b6", - "sha256:e452dc66e08a4ce642a961f134814258a082832c78c90351b75c41ad16f79f63", - "sha256:e5b6ed0f0b42317050c88022349d994fe72bfe35f5908617512cd8c8ef9da2a9", - "sha256:e9b30d4bd69498fc0c3fe9db5f62fffbb06b8eb9321f92cc970f2969be5e3949", - "sha256:ec149b90019852266fec2341ce1db513b843e496d5a8e8cdb5ced1923a92faab", - "sha256:edb01671b3caae1ca00881686003d16c2209e07b7ef8b7639f1867852b948f7c", - "sha256:f0d3929fe88ee1c155129ecd82f981b8856c5d97bcb0d5f23e9b4242e79d1de3", - "sha256:f29454410db6ef8126c83bd3c968d143304633d45dc57b51252afbd79d700893", - "sha256:fe45becb4c2f72a0907c1d0246ea6449fe7a9e2293bb0e11c4e9a32bb0930a15", - "sha256:fedbd128668ead37f33917820b704784aff695e0019309ad446a6d0b065b57e4" - ], - "markers": "python_version >= '3.6'", - "version": "==1.19.4" - }, - "oauth2": { - "hashes": [ - "sha256:15b5c42301f46dd63113f1214b0d81a8b16254f65a86d3c32a1b52297f3266e6", - "sha256:c006a85e7c60107c7cc6da1b184b5c719f6dd7202098196dfa6e55df669b59bf" - ], - "index": "pypi", - "version": "==1.9.0.post1" - }, - "odtreader": { - "editable": true, - "git": "https://github.com/cartertemm/ODTReader.git/", - "ref": "49d6938693f6faa3ff09998f86dba551ae3a996b" - }, - "opencv-python": { - "hashes": [ - "sha256:0548981fe189e0d57b9cc65066b66fd70d4bc84ea906f349a63d9098e1b911c6", - "sha256:117dbb2fd184de28d831f14c1da17864efcee7bb7895e43adf40f5e1da9137fb", - "sha256:135e05b69ab9665cbe2589f56e60895219bc2443a632bdc4bde72fb95eda1582", - "sha256:14df77490c8aedceae74e660564d48c04761658aecc93895ac5e974006a89606", - "sha256:17581c68400f828700e5c6b3b082f50c781bf74cb9a7b972a04f05d26c8e894a", - "sha256:4af0053c6a70f127a52c26b112341826d3dbfce6955beb9044d3eabd7e14d1cd", - "sha256:51baebb0f8f3cae4cccd30daf018a5bb75cb759d5658aea29100d34cd5cac106", - "sha256:6022609b67f9c0f14e6807e782660d1d1be94d4f0c7bc1794d7d8f600014acb2", - "sha256:68a9ec7e32f82cab267b6f757d9862a9a930371062739f9d00472e7c850c5854", - "sha256:6b1d85cbb64ce20ac5f79ad8e3e76a3dbff53d258c65f2fc0b9411321147a0be", - "sha256:6b6d23de6d5ddc55e865ac8532bf8062b26ba70305fa1c87c671717027dcd370", - "sha256:744e9ae2fb4c8574e6d4a762146b4d0984bdec60b98480fc54a363c03a07a1ac", - "sha256:7fe81d08df4eb5dc4c6aa5f09888b6fd390fce5fa7d5624a98cac890b9aa6181", - "sha256:8a8ebd7ceebc0be9c14ca3e25a1c4ae086016b469848258e998247f2fc855314", - "sha256:8aeda9b2c37bf91fa88d67f09b85f2250661eec43d72184ec544783de204e96a", - "sha256:9659e80059c9f39728c7dcc22032dff0d1d467f07b6cd8e036613393e4b7c71a", - "sha256:c1382209a771ca8a25fe89d4a2377875538c6ed3cf8745280e65636cbd0988f2", - "sha256:d80db278a07f51811dbf0f9c31ff7cd5b2501822fb7a7587e71f9ff27d5c04bd", - "sha256:db874c65654465ef71d6e8618bed8c725722bc90624132b9512bf061abb4eec0", - "sha256:e4c072cf4260063ebadc70e34d622fa1127a88e364475ed757709e249ebe990f", - "sha256:f69a56e958ecb549ba84e0497a438080932b4d52ded441cec04d80afde71dc0a" - ], - "index": "pypi", - "version": "==4.4.0.46" - }, - "pandas": { - "hashes": [ - "sha256:09e0503758ad61afe81c9069505f8cb8c1e36ea8cc1e6826a95823ef5b327daf", - "sha256:0a11a6290ef3667575cbd4785a1b62d658c25a2fd70a5adedba32e156a8f1773", - "sha256:0d9a38a59242a2f6298fff45d09768b78b6eb0c52af5919ea9e45965d7ba56d9", - "sha256:112c5ba0f9ea0f60b2cc38c25f87ca1d5ca10f71efbee8e0f1bee9cf584ed5d5", - "sha256:185cf8c8f38b169dbf7001e1a88c511f653fbb9dfa3e048f5e19c38049e991dc", - "sha256:3aa8e10768c730cc1b610aca688f588831fa70b65a26cb549fbb9f35049a05e0", - "sha256:41746d520f2b50409dffdba29a15c42caa7babae15616bcf80800d8cfcae3d3e", - "sha256:43cea38cbcadb900829858884f49745eb1f42f92609d368cabcc674b03e90efc", - "sha256:5378f58172bd63d8c16dd5d008d7dcdd55bf803fcdbe7da2dcb65dbbf322f05b", - "sha256:54404abb1cd3f89d01f1fb5350607815326790efb4789be60508f458cdd5ccbf", - "sha256:5dac3aeaac5feb1016e94bde851eb2012d1733a222b8afa788202b836c97dad5", - "sha256:5fdb2a61e477ce58d3f1fdf2470ee142d9f0dde4969032edaf0b8f1a9dafeaa2", - "sha256:6613c7815ee0b20222178ad32ec144061cb07e6a746970c9160af1ebe3ad43b4", - "sha256:6d2b5b58e7df46b2c010ec78d7fb9ab20abf1d306d0614d3432e7478993fbdb0", - "sha256:8a5d7e57b9df2c0a9a202840b2881bb1f7a648eba12dd2d919ac07a33a36a97f", - "sha256:8b4c2055ebd6e497e5ecc06efa5b8aa76f59d15233356eb10dad22a03b757805", - "sha256:a15653480e5b92ee376f8458197a58cca89a6e95d12cccb4c2d933df5cecc63f", - "sha256:a7d2547b601ecc9a53fd41561de49a43d2231728ad65c7713d6b616cd02ddbed", - "sha256:a979d0404b135c63954dea79e6246c45dd45371a88631cdbb4877d844e6de3b6", - "sha256:b1f8111635700de7ac350b639e7e452b06fc541a328cf6193cf8fc638804bab8", - "sha256:c5a3597880a7a29a31ebd39b73b2c824316ae63a05c3c8a5ce2aea3fc68afe35", - "sha256:c681e8fcc47a767bf868341d8f0d76923733cbdcabd6ec3a3560695c69f14a1e", - "sha256:cf135a08f306ebbcfea6da8bf775217613917be23e5074c69215b91e180caab4", - "sha256:e2b8557fe6d0a18db4d61c028c6af61bfed44ef90e419ed6fadbdc079eba141e" - ], - "index": "pypi", - "version": "==1.1.4" - }, - "pandas-ods-reader": { - "hashes": [ - "sha256:d2d6e4f9cd2850da32808bbc68d433a337911058387992026d3987ead1f4a7c8", - "sha256:d4d6781cc46e782e265b48681416f636e7659343dec948c6fccc4236af6fa1e6" - ], - "index": "pypi", - "version": "==0.0.7" - }, - "passivetotal": { - "hashes": [ - "sha256:2944974d380a41f19f8fbb3d7cbfc8285479eb81092940b57bf0346d66706a05", - "sha256:a0cbea84b0bd6e9f3694ddeb447472b3d6f09e28940a7a0388456b8cf6a8e478", - "sha256:e35bf2cbccb385795a67d66f180d14ce9136cf1611b1c3da8a1055a1aced6264" - ], - "index": "pypi", - "version": "==1.0.31" - }, - "pdftotext": { - "hashes": [ - "sha256:98aeb8b07a4127e1a30223bd933ef080bbd29aa88f801717ca6c5618380b8aa6" - ], - "index": "pypi", - "version": "==2.1.5" - }, - "pillow": { - "hashes": [ - "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e", - "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38", - "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4", - "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039", - "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233", - "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3", - "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3", - "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5", - "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8", - "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0", - "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41", - "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f", - "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6", - "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271", - "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b", - "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021", - "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9", - "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727", - "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f", - "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626", - "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e", - "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7", - "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad", - "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae", - "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce", - "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11", - "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8", - "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6", - "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8", - "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c", - "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8", - "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63", - "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d", - "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae", - "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3", - "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d", - "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302", - "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11", - "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6", - "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6", - "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140", - "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d", - "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5", - "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117", - "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015", - "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544", - "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a", - "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09", - "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72", - "sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb", - "sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce", - "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1", - "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a", - "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f", - "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792" - ], - "index": "pypi", - "version": "==8.0.1" - }, - "progressbar2": { - "hashes": [ - "sha256:ef72be284e7f2b61ac0894b44165926f13f5d995b2bf3cd8a8dedc6224b255a7", - "sha256:fe2738e7ecb7df52ad76307fe610c460c52b50f5335fd26c3ab80ff7655ba1e0" - ], - "version": "==3.53.1" - }, - "psutil": { - "hashes": [ - "sha256:01bc82813fbc3ea304914581954979e637bcc7084e59ac904d870d6eb8bb2bc7", - "sha256:1cd6a0c9fb35ece2ccf2d1dd733c1e165b342604c67454fd56a4c12e0a106787", - "sha256:2cb55ef9591b03ef0104bedf67cc4edb38a3edf015cf8cf24007b99cb8497542", - "sha256:56c85120fa173a5d2ad1d15a0c6e0ae62b388bfb956bb036ac231fbdaf9e4c22", - "sha256:5d9106ff5ec2712e2f659ebbd112967f44e7d33f40ba40530c485cc5904360b8", - "sha256:6a3e1fd2800ca45083d976b5478a2402dd62afdfb719b30ca46cd28bb25a2eb4", - "sha256:ade6af32eb80a536eff162d799e31b7ef92ddcda707c27bbd077238065018df4", - "sha256:af73f7bcebdc538eda9cc81d19db1db7bf26f103f91081d780bbacfcb620dee2", - "sha256:e02c31b2990dcd2431f4524b93491941df39f99619b0d312dfe1d4d530b08b4b", - "sha256:fa38ac15dbf161ab1e941ff4ce39abd64b53fec5ddf60c23290daed2bc7d1157", - "sha256:fbcac492cb082fa38d88587d75feb90785d05d7e12d4565cbf1ecc727aff71b7" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==5.7.3" - }, - "pybgpranking": { - "editable": true, - "git": "https://github.com/D4-project/BGP-Ranking.git/", - "ref": "fd9c0e03af9b61d4bf0b67ac73c7208a55178a54", - "subdirectory": "client" - }, - "pycparser": { - "hashes": [ - "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", - "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.20" - }, - "pycryptodome": { - "hashes": [ - "sha256:19cb674df6c74a14b8b408aa30ba8a89bd1c01e23505100fb45f930fbf0ed0d9", - "sha256:1cfdb92dca388e27e732caa72a1cc624520fe93752a665c3b6cd8f1a91b34916", - "sha256:27397aee992af69d07502126561d851ba3845aa808f0e55c71ad0efa264dd7d4", - "sha256:28f75e58d02019a7edc7d4135203d2501dfc47256d175c72c9798f9a129a49a7", - "sha256:2a68df525b387201a43b27b879ce8c08948a430e883a756d6c9e3acdaa7d7bd8", - "sha256:411745c6dce4eff918906eebcde78771d44795d747e194462abb120d2e537cd9", - "sha256:46e96aeb8a9ca8b1edf9b1fd0af4bf6afcf3f1ca7fa35529f5d60b98f3e4e959", - "sha256:4ed27951b0a17afd287299e2206a339b5b6d12de9321e1a1575261ef9c4a851b", - "sha256:50826b49fbca348a61529693b0031cdb782c39060fb9dca5ac5dff858159dc5a", - "sha256:5598dc6c9dbfe882904e54584322893eff185b98960bbe2cdaaa20e8a437b6e5", - "sha256:5c3c4865730dfb0263f822b966d6d58429d8b1e560d1ddae37685fd9e7c63161", - "sha256:5f19e6ef750f677d924d9c7141f54bade3cd56695bbfd8a9ef15d0378557dfe4", - "sha256:60febcf5baf70c566d9d9351c47fbd8321da9a4edf2eff45c4c31c86164ca794", - "sha256:62c488a21c253dadc9f731a32f0ac61e4e436d81a1ea6f7d1d9146ed4d20d6bd", - "sha256:6d3baaf82681cfb1a842f1c8f77beac791ceedd99af911e4f5fabec32bae2259", - "sha256:6e4227849e4231a3f5b35ea5bdedf9a82b3883500e5624f00a19156e9a9ef861", - "sha256:6e89bb3826e6f84501e8e3b205c22595d0c5492c2f271cbb9ee1c48eb1866645", - "sha256:70d807d11d508433daf96244ec1c64e55039e8a35931fc5ea9eee94dbe3cb6b5", - "sha256:76b1a34d74bb2c91bce460cdc74d1347592045627a955e9a252554481c17c52f", - "sha256:7798e73225a699651888489fbb1dbc565e03a509942a8ce6194bbe6fb582a41f", - "sha256:834b790bbb6bd18956f625af4004d9c15eed12d5186d8e57851454ae76d52215", - "sha256:843e5f10ecdf9d307032b8b91afe9da1d6ed5bb89d0bbec5c8dcb4ba44008e11", - "sha256:8f9f84059039b672a5a705b3c5aa21747867bacc30a72e28bf0d147cc8ef85ed", - "sha256:9000877383e2189dafd1b2fc68c6c726eca9a3cfb6d68148fbb72ccf651959b6", - "sha256:910e202a557e1131b1c1b3f17a63914d57aac55cf9fb9b51644962841c3995c4", - "sha256:946399d15eccebafc8ce0257fc4caffe383c75e6b0633509bd011e357368306c", - "sha256:a199e9ca46fc6e999e5f47fce342af4b56c7de85fae893c69ab6aa17531fb1e1", - "sha256:a3d8a9efa213be8232c59cdc6b65600276508e375e0a119d710826248fd18d37", - "sha256:a4599c0ca0fc027c780c1c45ed996d5bef03e571470b7b1c7171ec1e1a90914c", - "sha256:b4e6b269a8ddaede774e5c3adbef6bf452ee144e6db8a716d23694953348cd86", - "sha256:b68794fba45bdb367eeb71249c26d23e61167510a1d0c3d6cf0f2f14636e62ee", - "sha256:d7ec2bd8f57c559dd24e71891c51c25266a8deb66fc5f02cc97c7fb593d1780a", - "sha256:e15bde67ccb7d4417f627dd16ffe2f5a4c2941ce5278444e884cb26d73ecbc61", - "sha256:eb01f9997e4d6a8ec8a1ad1f676ba5a362781ff64e8189fe2985258ba9cb9706", - "sha256:faa682c404c218e8788c3126c9a4b8fbcc54dc245b5b6e8ea5b46f3b63bd0c84" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.9.9" - }, - "pycryptodomex": { - "hashes": [ - "sha256:15c03ffdac17731b126880622823d30d0a3cc7203cd219e6b9814140a44e7fab", - "sha256:20fb7f4efc494016eab1bc2f555bc0a12dd5ca61f35c95df8061818ffb2c20a3", - "sha256:28ee3bcb4d609aea3040cad995a8e2c9c6dc57c12183dadd69e53880c35333b9", - "sha256:305e3c46f20d019cd57543c255e7ba49e432e275d7c0de8913b6dbe57a851bc8", - "sha256:3547b87b16aad6afb28c9b3a9cd870e11b5e7b5ac649b74265258d96d8de1130", - "sha256:3642252d7bfc4403a42050e18ba748bedebd5a998a8cba89665a4f42aea4c380", - "sha256:404faa3e518f8bea516aae2aac47d4d960397199a15b4bd6f66cad97825469a0", - "sha256:42669638e4f7937b7141044a2fbd1019caca62bd2cdd8b535f731426ab07bde1", - "sha256:4632d55a140b28e20be3cd7a3057af52fb747298ff0fd3290d4e9f245b5004ba", - "sha256:4a88c9383d273bdce3afc216020282c9c5c39ec0bd9462b1a206af6afa377cf0", - "sha256:4ce1fc1e6d2fd2d6dc197607153327989a128c093e0e94dca63408f506622c3e", - "sha256:55cf4e99b3ba0122dee570dc7661b97bf35c16aab3e2ccb5070709d282a1c7ab", - "sha256:5e486cab2dfcfaec934dd4f5d5837f4a9428b690f4d92a3b020fd31d1497ca64", - "sha256:65ec88c8271448d2ea109d35c1f297b09b872c57214ab7e832e413090d3469a9", - "sha256:6c95a3361ce70068cf69526a58751f73ddac5ba27a3c2379b057efa2f5338c8c", - "sha256:73240335f4a1baf12880ebac6df66ab4d3a9212db9f3efe809c36a27280d16f8", - "sha256:7651211e15109ac0058a49159265d9f6e6423c8a81c65434d3c56d708417a05b", - "sha256:7b5b7c5896f8172ea0beb283f7f9428e0ab88ec248ce0a5b8c98d73e26267d51", - "sha256:836fe39282e75311ce4c38468be148f7fac0df3d461c5de58c5ff1ddb8966bac", - "sha256:871852044f55295449fbf225538c2c4118525093c32f0a6c43c91bed0452d7e3", - "sha256:892e93f3e7e10c751d6c17fa0dc422f7984cfd5eb6690011f9264dc73e2775fc", - "sha256:934e460c5058346c6f1d62fdf3db5680fbdfbfd212722d24d8277bf47cd9ebdc", - "sha256:9736f3f3e1761024200637a080a4f922f5298ad5d780e10dbb5634fe8c65b34c", - "sha256:a1d38a96da57e6103423a446079ead600b450cf0f8ebf56a231895abf77e7ffc", - "sha256:a385fceaa0cdb97f0098f1c1e9ec0b46cc09186ddf60ec23538e871b1dddb6dc", - "sha256:a7cf1c14e47027d9fb9d26aa62e5d603994227bd635e58a8df4b1d2d1b6a8ed7", - "sha256:a9aac1a30b00b5038d3d8e48248f3b58ea15c827b67325c0d18a447552e30fc8", - "sha256:b696876ee583d15310be57311e90e153a84b7913ac93e6b99675c0c9867926d0", - "sha256:bef9e9d39393dc7baec39ba4bac6c73826a4db02114cdeade2552a9d6afa16e2", - "sha256:c885fe4d5f26ce8ca20c97d02e88f5fdd92c01e1cc771ad0951b21e1641faf6d", - "sha256:d2d1388595cb5d27d9220d5cbaff4f37c6ec696a25882eb06d224d241e6e93fb", - "sha256:d2e853e0f9535e693fade97768cf7293f3febabecc5feb1e9b2ffdfe1044ab96", - "sha256:d62fbab185a6b01c5469eda9f0795f3d1a5bba24f5a5813f362e4b73a3c4dc70", - "sha256:f20a62397e09704049ce9007bea4f6bad965ba9336a760c6f4ef1b4192e12d6d", - "sha256:f81f7311250d9480e36dec819127897ae772e7e8de07abfabe931b8566770b8e" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.9.9" - }, - "pydeep": { - "hashes": [ - "sha256:22866eb422d1d5907f8076ee792da65caecb172425d27576274e2a8eacf6afc1" - ], - "version": "==0.4" - }, - "pydnstrails": { - "editable": true, - "git": "https://github.com/sebdraven/pydnstrails", - "ref": "48c1f740025c51289f43a24863d1845ff12fd21a" - }, - "pyeupi": { - "hashes": [ - "sha256:2309c61ac2ef0eafabd6e9f32a0078069ffbba0e113ebc6b51cffc1869094472", - "sha256:a0798a4a52601b0840339449a1bbf2aa2bc180d8f82a979022954e05fcb5bfba" - ], - "index": "pypi", - "version": "==1.1" - }, - "pygeoip": { - "hashes": [ - "sha256:1938b9dac7b00d77f94d040b9465ea52c938f3fcdcd318b5537994f3c16aef96", - "sha256:f22c4e00ddf1213e0fae36dc60b46ee7c25a6339941ec1a975539014c1f9a96d" - ], - "index": "pypi", - "version": "==0.3.2" - }, - "pyintel471": { - "editable": true, - "git": "https://github.com/MISP/PyIntel471.git", - "ref": "0df8d51f1c1425de66714b3a5a45edb69b8cc2fc" - }, - "pyipasnhistory": { - "editable": true, - "git": "https://github.com/D4-project/IPASN-History.git/", - "ref": "fc5e48608afc113e101ca6421bf693b7b9753f9e", - "subdirectory": "client" - }, - "pymisp": { - "editable": true, - "extras": [ - "fileobjects", - "openioc", - "pdfexport" - ], - "git": "https://github.com/MISP/PyMISP.git", - "ref": "02eff91c1efaf9406164cd4d2ba0bc2036a9e67e" - }, - "pyonyphe": { - "editable": true, - "git": "https://github.com/sebdraven/pyonyphe", - "ref": "1ce15581beebb13e841193a08a2eb6f967855fcb" - }, - "pyopenssl": { - "hashes": [ - "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504", - "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507" - ], - "version": "==19.1.0" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" - }, - "pypdns": { - "hashes": [ - "sha256:640a7e08c3e1e6d6cf378bc7bf48225d847a9c86583c196994fb15acc20ec6f4", - "sha256:9cd2d42ed5e9e4ff7ea29b3947b133a74b0fe0f548ca4c9fac26c0b8f8b750d5" - ], - "index": "pypi", - "version": "==1.5.1" - }, - "pypssl": { - "hashes": [ - "sha256:4dbe772aefdf4ab18934d83cde79e2fc5d5ba9d2b4153dc419a63faab3432643" - ], - "index": "pypi", - "version": "==2.1" - }, - "pyrsistent": { - "hashes": [ - "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e" - ], - "markers": "python_version >= '3.5'", - "version": "==0.17.3" - }, - "pytesseract": { - "hashes": [ - "sha256:b79641b7915ff039da22d5591cb2f5ca6cb0ed7c65194c9c750360dc6a1cc87f" - ], - "index": "pypi", - "version": "==0.3.6" - }, - "python-baseconv": { - "hashes": [ - "sha256:0539f8bd0464013b05ad62e0a1673f0ac9086c76b43ebf9f833053527cd9931b" - ], - "version": "==1.2.2" - }, - "python-dateutil": { - "hashes": [ - "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", - "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.1" - }, - "python-docx": { - "hashes": [ - "sha256:bc76ecac6b2d00ce6442a69d03a6f35c71cd72293cd8405a7472dfe317920024" - ], - "index": "pypi", - "version": "==0.8.10" - }, - "python-engineio": { - "hashes": [ - "sha256:36b33c6aa702d9b6a7f527eec6387a2da1a9a24484ec2f086d76576413cef04b", - "sha256:cfded18156862f94544a9f8ef37f56727df731c8552d7023f5afee8369be2db6" - ], - "version": "==3.13.2" - }, - "python-magic": { - "hashes": [ - "sha256:356efa93c8899047d1eb7d3eb91e871ba2f5b1376edbaf4cc305e3c872207355", - "sha256:b757db2a5289ea3f1ced9e60f072965243ea43a2221430048fd8cacab17be0ce" - ], - "version": "==0.4.18" - }, - "python-pptx": { - "hashes": [ - "sha256:a857d69e52d7e8a8fb32fca8182fdd4a3c68c689de8d4e4460e9b4a95efa7bc4" - ], - "index": "pypi", - "version": "==0.6.18" - }, - "python-socketio": { - "extras": [ - "client" - ], - "hashes": [ - "sha256:358d8fbbc029c4538ea25bcaa283e47f375be0017fcba829de8a3a731c9df25a", - "sha256:d437f797c44b6efba2f201867cf02b8c96b97dff26d4e4281ac08b45817cd522" - ], - "version": "==4.6.0" - }, - "python-utils": { - "hashes": [ - "sha256:ebaadab29d0cb9dca0a82eab9c405f5be5125dbbff35b8f32cc433fa498dbaa7", - "sha256:f21fc09ff58ea5ebd1fd2e8ef7f63e39d456336900f26bdc9334a03a3f7d8089" - ], - "version": "==2.4.0" - }, - "pytz": { - "hashes": [ - "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d", - "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be" - ], - "version": "==2019.3" - }, - "pyyaml": { - "hashes": [ - "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", - "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", - "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", - "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", - "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", - "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", - "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", - "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", - "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", - "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", - "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" - ], - "version": "==5.3.1" - }, - "pyzbar": { - "hashes": [ - "sha256:0e204b904e093e5e75aa85e0203bb0e02888105732a509b51f31cff400f34265", - "sha256:496249b546be70ec98c0ff0ad9151e73daaffff129266df86150a15dcd8dac4c", - "sha256:7d6c01d2c0a352fa994aa91b5540d1caeaeaac466656eb41468ca5df33be9f2e" - ], - "index": "pypi", - "version": "==0.1.8" - }, - "pyzipper": { - "hashes": [ - "sha256:49813f1d415bdd7c87064009b9270c6dd0a96da770cfe57df2c6d2d84a6c085a", - "sha256:bfdc65f616278b38ef03c6ea5a1aca7499caf98cbfcd47fc44f73e68f4307145" - ], - "markers": "python_version >= '3.5'", - "version": "==0.3.3" - }, - "rdflib": { - "hashes": [ - "sha256:78149dd49d385efec3b3adfbd61c87afaf1281c30d3fcaf1b323b34f603fb155", - "sha256:88208ea971a87886d60ae2b1a4b2cdc263527af0454c422118d43fe64b357877" - ], - "version": "==5.0.0" - }, - "redis": { - "hashes": [ - "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2", - "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.5.3" - }, - "reportlab": { - "hashes": [ - "sha256:06be7f04a631f02cd0202f7dee0d3e61dc265223f4ff861525ed7784b5552540", - "sha256:0a788a537c48915eda083485b59ac40ac012fa7c43070069bde6eb5ea588313c", - "sha256:1a7a38810e79653d0ea8e61db4f0517ac2a0e76edd2497cf6d4969dd3be30030", - "sha256:22301773db730545b44d4c77d8f29baf5683ccabec9883d978e8b8eda6d2175f", - "sha256:2906321b3d2779faafe47e2c13f9c69e1fb4ddb907f5a49cab3f9b0ea95df1f5", - "sha256:2d65f9cc5c0d3f63b5d024e6cf92234f1ab1f267cc9e5a847ab5d3efe1c3cf3e", - "sha256:2e012f7b845ef9f1f5bd63461d5201fa624b019a65ff5a93d0002b4f915bbc89", - "sha256:31ccfdbf5bb5ec85f0397661085ce4c9e52537ca0d2bf4220259666a4dcc55c2", - "sha256:3e10bd20c8ada9f7e1113157aa73b8e0048f2624e74794b73799c3deb13d7a3f", - "sha256:440d5f86c2b822abdb7981d691a78bdcf56f4710174830283034235ab2af2969", - "sha256:4f307accda32c9f17015ed77c7424f904514e349dff063f78d2462d715963e53", - "sha256:59659ee8897950fd1acd41a9cc61f4afdfda52dc2bb69a1924ce68089491849d", - "sha256:6216b11313467989ac9d9578ea3756d0af46e97184ee4e11a6b7ef652458f70d", - "sha256:6268a9a3d75e714b22beeb7687270956b06b232ccfdf37b1c6462961eab04457", - "sha256:6b226830f80df066d5986a3fdb3eb4d1b6320048f3d9ade539a6c03a5bc8b3ec", - "sha256:6e10eba6a0e330096f4200b18824b3194c399329b7830e34baee1c04ea07f99f", - "sha256:6e224c16c3d6fafdb2fb67b33c4b84d984ec34869834b3a137809f2fe5b84778", - "sha256:7da162fa677b90bd14f19b20ff80fec18c24a31ac44e5342ba49e198b13c4f92", - "sha256:8406e960a974a65b765c9ff74b269aa64718b4af1e8c511ebdbd9a5b44b0c7e6", - "sha256:8999bb075102d1b8ca4aada6ca14653d52bf02e37fd064e477eb180741f75077", - "sha256:8f6163729612e815b89649aed2e237505362a78014199f819fd92f9e5c96769b", - "sha256:9699fa8f0911ad56b46cc60bbaebe1557fd1c9e8da98185a7a1c0c40193eba48", - "sha256:9a53d76eec33abda11617aad1c9f5f4a2d906dd2f92a03a3f1ea370efbb52c95", - "sha256:9ed4d761b726ff411565eddb10cb37a6bca0ec873d9a18a83cf078f4502a2d94", - "sha256:a020d308e7c2de284d5407e3c6c13e3977a62b314f7bfe19bcc69677931da589", - "sha256:a2e6c15aecbe631245aab639751a58671312cced7e17de1ed9c45fb37036f6c9", - "sha256:b10cb48606d97b70edb094576e3d493d40467395e4fc267655135a2c92defbe8", - "sha256:b8d6e9df5181ed07b7ae145258eb69e686133afc97930af51a3c0c9d784d834d", - "sha256:bbb297754f5cf25eb8fcb817752984252a7feb0ca83e383718e4eec2fb67ea32", - "sha256:be90599e5e78c1ddfcfee8c752108def58b4c672ebcc4d3d9aa7fe65e7d3f16b", - "sha256:bfdfad9b8ae00bd0752b77f954c7405327fd99b2cc6d5e4273e65be61429d56a", - "sha256:c1e5ef5089e16b249388f65d8c8f8b74989e72eb8332060dc580a2ecb967cfc2", - "sha256:c5ed342e29a5fd7eeb0f2ccf7e5b946b5f750f05633b2d6a94b1c02094a77967", - "sha256:c7087a26b26aa82a3ba27e13e66f507cc697f9ceb4c046c0f758876b55f040a5", - "sha256:cf589e980d92b0bf343fa512b9d3ae9ed0469cbffd99cb270b6c83da143cb437", - "sha256:e6fb762e524a4fb118be9f44dbd9456cf80e42253ee8f1bdb0ea5c1f882d4ba8", - "sha256:f2fde5abb6f21c1eff5430f380cdbbee7fdeda6af935a83730ddce9f0c4e504e", - "sha256:f585b3bf7062c228306acd7f40b2ad915b32603228c19bb225952cc98fd2015a", - "sha256:f955a6366cf8e6729776c96e281bede468acd74f6eb49a5bbb048646adaa43d8", - "sha256:fe882fd348d8429debbdac4518d6a42888a7f4ad613dc596ce94788169caeb08" - ], - "index": "pypi", - "version": "==3.5.55" - }, - "requests": { - "extras": [ - "security" - ], - "hashes": [ - "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8", - "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998" - ], - "index": "pypi", - "version": "==2.25.0" - }, - "requests-cache": { - "hashes": [ - "sha256:813023269686045f8e01e2289cc1e7e9ae5ab22ddd1e2849a9093ab3ab7270eb", - "sha256:81e13559baee64677a7d73b85498a5a8f0639e204517b5d05ff378e44a57831a" - ], - "version": "==0.5.2" - }, - "shodan": { - "hashes": [ - "sha256:0b5ec40c954cd48c4e3234e81ad92afdc68438f82ad392fed35b7097eb77b6dd" - ], - "index": "pypi", - "version": "==1.24.0" - }, - "sigmatools": { - "hashes": [ - "sha256:5cca698e11f9f3f2f80b92cb4873f9958898ad23d26ce78ee4a573777f4f2035", - "sha256:719c6c19ff60177f3a155d0dd2b054a4ad7e906dec3e88dae668c2b2d200f82c" - ], - "index": "pypi", - "version": "==0.18.1" - }, - "six": { - "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.15.0" - }, - "socialscan": { - "hashes": [ - "sha256:3d0ca2b27d53fa4552312e07f60d3a3f513f7791a5f2bce16d3e0e3f295cd037", - "sha256:871cbc50f577b29f5f55d9c3ec5798d3abef31663f7cbe4d5c47bd5c380f6bae" - ], - "index": "pypi", - "version": "==1.4.1" - }, - "socketio-client": { - "hashes": [ - "sha256:ef2e362a85ef2816fb224d727319c4b743d63b4dd9e1da99c622c9643fc4e2a0" - ], - "version": "==0.5.7.4" - }, - "soupsieve": { - "hashes": [ - "sha256:1634eea42ab371d3d346309b93df7870a88610f0725d47528be902a0d95ecc55", - "sha256:a59dc181727e95d25f781f0eb4fd1825ff45590ec8ff49eadfd7f1a537cc0232" - ], - "markers": "python_version >= '3.0'", - "version": "==2.0.1" - }, - "sparqlwrapper": { - "hashes": [ - "sha256:17ec44b08b8ae2888c801066249f74fe328eec25d90203ce7eadaf82e64484c7", - "sha256:357ee8a27bc910ea13d77836dbddd0b914991495b8cc1bf70676578155e962a8", - "sha256:8cf6c21126ed76edc85c5c232fd6f77b9f61f8ad1db90a7147cdde2104aff145", - "sha256:c7f9c9d8ebb13428771bc3b6dee54197422507dcc3dea34e30d5dcfc53478dec", - "sha256:d6a66b5b8cda141660e07aeb00472db077a98d22cb588c973209c7336850fb3c" - ], - "index": "pypi", - "version": "==1.8.5" - }, - "stix2-patterns": { - "hashes": [ - "sha256:373a3de163e1b146499c6e5a7908e1f0987173139480897728fcbbba6a806f95", - "sha256:5a38f634adc856b7d03e13dd140d38e184ac1ef11077c1ffca28a262fa6d8c41" - ], - "index": "pypi", - "version": "==1.3.1" - }, - "tabulate": { - "hashes": [ - "sha256:ac64cb76d53b1231d364babcd72abbb16855adac7de6665122f97b593f1eb2ba", - "sha256:db2723a20d04bcda8522165c73eea7c300eda74e0ce852d9022e0159d7895007" - ], - "version": "==0.8.7" - }, - "tornado": { - "hashes": [ - "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb", - "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c", - "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288", - "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95", - "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558", - "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe", - "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791", - "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d", - "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326", - "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b", - "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4", - "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c", - "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910", - "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5", - "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c", - "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0", - "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675", - "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd", - "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f", - "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c", - "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea", - "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6", - "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05", - "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd", - "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575", - "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a", - "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37", - "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795", - "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f", - "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32", - "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c", - "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01", - "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4", - "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2", - "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921", - "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085", - "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df", - "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102", - "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5", - "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68", - "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5" - ], - "markers": "python_version >= '3.5'", - "version": "==6.1" - }, - "tqdm": { - "hashes": [ - "sha256:18d6a615aedd09ec8456d9524489dab330af4bd5c2a14a76eb3f9a0e14471afe", - "sha256:80d9d5165d678dbd027dd102dfb99f71bf05f333b61fb761dbba13b4ab719ead" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==4.52.0" - }, - "trustar": { - "hashes": [ - "sha256:2618a377e3c000a41a47eb34b31ea694215eed4a1d2e3cfca1801ac6baebd958" - ], - "index": "pypi", - "version": "==0.3.34" - }, - "typing-extensions": { - "hashes": [ - "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918", - "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", - "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" - ], - "version": "==3.7.4.3" - }, - "tzlocal": { - "hashes": [ - "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44", - "sha256:e2cb6c6b5b604af38597403e9852872d7f534962ae2954c7f35efcb1ccacf4a4" - ], - "version": "==2.1" - }, - "unicodecsv": { - "hashes": [ - "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc" - ], - "version": "==0.14.1" - }, - "url-normalize": { - "hashes": [ - "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2", - "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.4.3" - }, - "urlarchiver": { - "hashes": [ - "sha256:652e0890dab58bf62a759656671dcfb9a40eb4a77aac8a8d93154f00360238b5" - ], - "index": "pypi", - "version": "==0.2" - }, - "urllib3": { - "hashes": [ - "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", - "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.26.2" - }, - "uwhois": { - "editable": true, - "git": "https://github.com/Rafiot/uwhoisd.git", - "ref": "783bba09b5a6964f25566089826a1be4b13f2a22", - "subdirectory": "client" - }, - "validators": { - "hashes": [ - "sha256:f0ac832212e3ee2e9b10e156f19b106888cf1429c291fbc5297aae87685014ae" - ], - "version": "==0.14.0" - }, - "vt-graph-api": { - "hashes": [ - "sha256:200c4f5a7c0a518502e890c4f4508a5ea042af9407d2889ef16a17ef11b7d25c", - "sha256:223c1cf32d69e10b5d3e178ec315589c7dfa7d43ccff6630a11ed5c5f498715c" - ], - "index": "pypi", - "version": "==1.0.1" - }, - "vulners": { - "hashes": [ - "sha256:065aa63d5626d51cf45260bc6cc3a6ea682977689c036a6daba695905e881ba7", - "sha256:0e1356040f456f87841ccfe9f2f6ed36a256370606d530679d5d9993fe91386c", - "sha256:ab9ed8fbf1d3c80f0d066b13ac9d70d11dc9cb0b77568be65396117a4245e916" - ], - "index": "pypi", - "version": "==1.5.9" - }, - "wand": { - "hashes": [ - "sha256:566b3d049858efa879096a7ab2e0516d67a240e6c3ffd7a267298c41e81c14b7", - "sha256:d21429288fe0de63d829dbbfb26736ebaed9fd0792c2a0dc5943c5cab803a708" - ], - "index": "pypi", - "version": "==0.6.3" - }, - "websocket-client": { - "hashes": [ - "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549", - "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010" - ], - "version": "==0.57.0" - }, - "wrapt": { - "hashes": [ - "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" - ], - "version": "==1.12.1" - }, - "xlrd": { - "hashes": [ - "sha256:546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2", - "sha256:e551fb498759fa3a5384a94ccd4c3c02eb7c00ea424426e212ac0c57be9dfbde" - ], - "index": "pypi", - "version": "==1.2.0" - }, - "xlsxwriter": { - "hashes": [ - "sha256:9b1ade2d1ba5d9b40a6d1de1d55ded4394ab8002718092ae80a08532c2add2e6", - "sha256:b807c2d3e379bf6a925f472955beef3e07495c1bac708640696876e68675b49b" - ], - "version": "==1.3.7" - }, - "yara-python": { - "hashes": [ - "sha256:03e5c5e333c8572e7994b0b11964d515d61a393f23c5e272f8d0e4229f368c58", - "sha256:0423e08bd618752a028ac0405ff8e0103f3a8fd607dde7618a64a4c010c3757b", - "sha256:0a0dd632dcdb347d1a9a8b1f6a83b3a77d5e63f691357ea4021fb1cf1d7ff0a4", - "sha256:728b99627a8072a877eaaa4dafb4eff39d1b14ff4fd70d39f18899ce81e29625", - "sha256:7cb0d5724eccfa52e1bcd352a56cb4dc422aa51f5f6d0945d4f830783927513b", - "sha256:8c76531e89806c0309586dd4863a972d12f1d5d63261c6d4b9331a99859fd1d8", - "sha256:9472676583e212bc4e17c2236634e02273d53c872b350f0571b48e06183de233", - "sha256:9735b680a7d95c1d3f255c351bb067edc62cdb3c0999f7064278cb2c85245405", - "sha256:997f104590167220a9af5564c042ec4d6534261e7b8a5b49655d8dffecc6b8a2", - "sha256:a48e071d02a3699363e628ac899b5b7237803bcb4b512c92ebcb4fb9b1488497", - "sha256:b67c0d75a6519ca357b4b85ede9768c96a81fff20fbc169bd805ff009ddee561" - ], - "index": "pypi", - "version": "==3.8.1" - }, - "yarl": { - "hashes": [ - "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e", - "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434", - "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366", - "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3", - "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec", - "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959", - "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e", - "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c", - "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6", - "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a", - "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6", - "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424", - "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e", - "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f", - "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50", - "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2", - "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc", - "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4", - "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970", - "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10", - "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0", - "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406", - "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896", - "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643", - "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721", - "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478", - "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724", - "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e", - "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8", - "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96", - "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25", - "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76", - "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2", - "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2", - "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c", - "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a", - "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71" - ], - "markers": "python_version >= '3.6'", - "version": "==1.6.3" - } - }, - "develop": { - "attrs": { - "hashes": [ - "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", - "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.3.0" - }, - "certifi": { - "hashes": [ - "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd", - "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4" - ], - "version": "==2020.11.8" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "codecov": { - "hashes": [ - "sha256:61bc71b5f58be8000bf9235aa9d0112f8fd3acca00aa02191bb81426d22a8584", - "sha256:a333626e6ff882db760ce71a1d84baf80ddff2cd459a3cc49b41fdac47d77ca5", - "sha256:d30ad6084501224b1ba699cbf018a340bb9553eb2701301c14133995fdd84f33" - ], - "index": "pypi", - "version": "==2.1.10" - }, - "coverage": { - "hashes": [ - "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516", - "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259", - "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9", - "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097", - "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0", - "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f", - "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7", - "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c", - "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5", - "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7", - "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729", - "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978", - "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9", - "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f", - "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9", - "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822", - "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418", - "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82", - "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f", - "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d", - "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221", - "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4", - "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21", - "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709", - "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54", - "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d", - "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270", - "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24", - "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751", - "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a", - "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237", - "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7", - "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636", - "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==5.3" - }, - "flake8": { - "hashes": [ - "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839", - "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b" - ], - "index": "pypi", - "version": "==3.8.4" - }, - "idna": { - "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.10" - }, - "iniconfig": { - "hashes": [ - "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", - "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" - ], - "version": "==1.1.1" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "nose": { - "hashes": [ - "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac", - "sha256:dadcddc0aefbf99eea214e0f1232b94f2fa9bd98fa8353711dacb112bfcbbb2a", - "sha256:f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98" - ], - "index": "pypi", - "version": "==1.3.7" - }, - "packaging": { - "hashes": [ - "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8", - "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.4" - }, - "pluggy": { - "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.13.1" - }, - "py": { - "hashes": [ - "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2", - "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.9.0" - }, - "pycodestyle": { - "hashes": [ - "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367", - "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.6.0" - }, - "pyflakes": { - "hashes": [ - "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92", - "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.2.0" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" - }, - "pytest": { - "hashes": [ - "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe", - "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e" - ], - "index": "pypi", - "version": "==6.1.2" - }, - "requests": { - "extras": [ - "security" - ], - "hashes": [ - "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8", - "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998" - ], - "index": "pypi", - "version": "==2.25.0" - }, - "six": { - "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.15.0" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" - }, - "urllib3": { - "hashes": [ - "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08", - "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.26.2" - } - } -} diff --git a/README.md b/README.md index b1d80a3..a9184b5 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,14 @@ # MISP modules -[![Build Status](https://travis-ci.org/MISP/misp-modules.svg?branch=master)](https://travis-ci.org/MISP/misp-modules) -[![Coverage Status](https://coveralls.io/repos/github/MISP/misp-modules/badge.svg?branch=master)](https://coveralls.io/github/MISP/misp-modules?branch=master) -[![codecov](https://codecov.io/gh/MISP/misp-modules/branch/master/graph/badge.svg)](https://codecov.io/gh/MISP/misp-modules) +[![Python package](https://github.com/MISP/misp-modules/actions/workflows/python-package.yml/badge.svg)](https://github.com/MISP/misp-modules/actions/workflows/python-package.yml)[![Coverage Status](https://coveralls.io/repos/github/MISP/misp-modules/badge.svg?branch=main)](https://coveralls.io/github/MISP/misp-modules?branch=main) +[![codecov](https://codecov.io/gh/MISP/misp-modules/branch/main/graph/badge.svg)](https://codecov.io/gh/MISP/misp-modules) -MISP modules are autonomous modules that can be used for expansion and other services in [MISP](https://github.com/MISP/MISP). +MISP modules are autonomous modules that can be used to extend [MISP](https://github.com/MISP/MISP) for new services such as expansion, import and export. The modules are written in Python 3 following a simple API interface. The objective is to ease the extensions of MISP functionalities without modifying core components. The API is available via a simple REST API which is independent from MISP installation or configuration. -MISP modules support is included in MISP starting from version 2.4.28. - -For more information: [Extending MISP with Python modules](https://www.misp-project.org/misp-training/3.1-misp-modules.pdf) slides from MISP training. +For more information: [Extending MISP with Python modules](https://www.misp-project.org/misp-training/3.1-misp-modules.pdf) slides from [MISP training](https://github.com/MISP/misp-training). ## Existing MISP modules @@ -50,6 +47,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [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? * [html_to_markdown](misp_modules/modules/expansion/html_to_markdown.py) - Simple HTML to markdown converter +* [HYAS Insight](misp_modules/modules/expansion/hyasinsight.py) - a hover and expansion module to get information from [HYAS Insight](https://www.hyas.com/hyas-insight). * [intel471](misp_modules/modules/expansion/intel471.py) - an expansion module to get info from [Intel471](https://intel471.com). * [IPASN](misp_modules/modules/expansion/ipasn.py) - a hover and expansion to get the BGP ASN of an IP address. * [iprep](misp_modules/modules/expansion/iprep.py) - an expansion module to get IP reputation from packetmail.net. @@ -60,6 +58,8 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [macaddress.io](misp_modules/modules/expansion/macaddress_io.py) - a hover module to retrieve vendor details and other information regarding a given MAC address or an OUI from [MAC address Vendor Lookup](https://macaddress.io). See [integration tutorial here](https://macaddress.io/integrations/MISP-module). * [macvendors](misp_modules/modules/expansion/macvendors.py) - a hover module to retrieve mac vendor information. * [MALWAREbazaar](misp_modules/modules/expansion/malwarebazaar.py) - an expansion module to query MALWAREbazaar with some payload. +* [McAfee MVISION Insights](misp_modules/modules/expansion/mcafee_insights_enrich.py) - an expansion module enrich IOCs with McAfee MVISION Insights. +* [Mmdb server lookup](misp_modules/modules/expansion/mmdb_lookup.py) - an expansion module to enrich an ip with geolocation information from an mmdb server such as ip.circl.lu. * [ocr-enrich](misp_modules/modules/expansion/ocr_enrich.py) - an enrichment module to get OCRized data from images into MISP. * [ods-enrich](misp_modules/modules/expansion/ods_enrich.py) - an enrichment module to get text out of OpenOffice spreadsheet document into MISP (using free-text parser). * [odt-enrich](misp_modules/modules/expansion/odt_enrich.py) - an enrichment module to get text out of OpenOffice document into MISP (using free-text parser). @@ -89,6 +89,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [virustotal](misp_modules/modules/expansion/virustotal.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a high request rate limit required. (More details about the API: [here](https://developers.virustotal.com/reference)) * [virustotal_public](misp_modules/modules/expansion/virustotal_public.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a public key and a low request rate limit. (More details about the API: [here](https://developers.virustotal.com/reference)) * [VMray](misp_modules/modules/expansion/vmray_submit.py) - a module to submit a sample to VMray. +* [VMware NSX](misp_modules/modules/expansion/vmware_nsx.py) - a module to enrich a file or URL with VMware NSX Defender. * [VulnDB](misp_modules/modules/expansion/vulndb.py) - a module to query [VulnDB](https://www.riskbasedsecurity.com/). * [Vulners](misp_modules/modules/expansion/vulners.py) - an expansion module to expand information about CVEs using Vulners API. * [whois](misp_modules/modules/expansion/whois.py) - a module to query a local instance of [uwhois](https://github.com/rafiot/uwhoisd). @@ -127,12 +128,14 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj ## How to install and start MISP modules in a Python virtualenv? (recommended) +***Be sure to run the latest version of `pip`***. To install the latest version of pip, `pip install --upgrade pip` will do the job. + ~~~~bash sudo apt-get install python3-dev python3-pip libpq5 libjpeg-dev tesseract-ocr libpoppler-cpp-dev imagemagick virtualenv libopencv-dev zbar-tools libzbar0 libzbar-dev libfuzzy-dev build-essential -y sudo -u www-data virtualenv -p python3 /var/www/MISP/venv cd /usr/local/src/ -chown -R www-data . -sudo git clone https://github.com/MISP/misp-modules.git +sudo chown -R www-data: . +sudo -u www-data git clone https://github.com/MISP/misp-modules.git cd misp-modules sudo -u www-data /var/www/MISP/venv/bin/pip install -I -r REQUIREMENTS sudo -u www-data /var/www/MISP/venv/bin/pip install . @@ -140,14 +143,15 @@ sudo -u www-data /var/www/MISP/venv/bin/pip install . sudo cp etc/systemd/system/misp-modules.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now misp-modules -/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 -s & #to start the modules +sudo service misp-modules start #or +/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 & #to start the modules ~~~~ ## How to install and start MISP modules on RHEL-based distributions ? As of this writing, the official RHEL repositories only contain Ruby 2.0.0 and Ruby 2.1 or higher is required. As such, this guide installs Ruby 2.2 from the [SCL](https://access.redhat.com/documentation/en-us/red_hat_software_collections/3/html/3.2_release_notes/chap-installation#sect-Installation-Subscribe) repository. ~~~~bash -sudo yum install rh-ruby22 +sudo yum install rh-python36 rh-ruby22 sudo yum install openjpeg-devel sudo yum install rubygem-rouge rubygem-asciidoctor zbar-devel opencv-devel gcc-c++ pkgconfig poppler-cpp-devel python-devel redhat-rpm-config cd /var/www/MISP @@ -168,7 +172,7 @@ After=misp-workers.service Type=simple User=apache Group=apache -ExecStart=/usr/bin/scl enable rh-python36 rh-ruby22 '/var/www/MISP/venv/bin/misp-modules –l 127.0.0.1 –s' +ExecStart=/usr/bin/scl enable rh-python36 rh-ruby22 '/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1' Restart=always RestartSec=10 diff --git a/REQUIREMENTS b/REQUIREMENTS index f6362b5..fcdb0a5 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -1,117 +1,181 @@ -i https://pypi.org/simple --e . --e git+https://github.com/D4-project/BGP-Ranking.git/@fd9c0e03af9b61d4bf0b67ac73c7208a55178a54#egg=pybgpranking&subdirectory=client --e git+https://github.com/D4-project/IPASN-History.git/@fc5e48608afc113e101ca6421bf693b7b9753f9e#egg=pyipasnhistory&subdirectory=client --e git+https://github.com/MISP/PyIntel471.git@0df8d51f1c1425de66714b3a5a45edb69b8cc2fc#egg=pyintel471 --e git+https://github.com/MISP/PyMISP.git@bacd4c78cd83d3bf45dcf55cd9ad3514747ac985#egg=pymisp[fileobjects,openioc,pdfexport] --e git+https://github.com/Rafiot/uwhoisd.git@783bba09b5a6964f25566089826a1be4b13f2a22#egg=uwhois&subdirectory=client --e git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader --e git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails --e git+https://github.com/sebdraven/pyonyphe@1ce15581beebb13e841193a08a2eb6f967855fcb#egg=pyonyphe -aiohttp==3.6.2; python_full_version >= '3.5.3' -antlr4-python3-runtime==4.8; python_version >= '3' +aiohttp==3.8.3 +aiosignal==1.2.0 ; python_version >= '3.6' +antlr4-python3-runtime==4.9.3 +anyio==3.6.1 ; python_full_version >= '3.6.2' apiosintds==1.8.3 +appdirs==1.4.4 argparse==1.4.0 -assemblyline-client==4.0.1 -async-timeout==3.0.1; python_full_version >= '3.5.3' -attrs==20.2.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +assemblyline-client==4.5.0 +async-timeout==4.0.2 ; python_version >= '3.6' +asynctest==0.13.0 ; python_version < '3.8' +attrs==22.1.0 ; python_version >= '3.5' +backoff==2.1.2 ; python_version >= '3.7' and python_version < '4.0' +backports.zoneinfo==0.2.1 ; python_version < '3.9' backscatter==0.2.4 -beautifulsoup4==4.9.3 +beautifulsoup4==4.11.1 +bidict==0.22.0 ; python_version >= '3.7' blockchain==1.4.4 -certifi==2020.6.20 -cffi==1.14.3 -chardet==3.0.4 -click-plugins==1.1.1 -click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -colorama==0.4.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -configparser==5.0.1; python_version >= '3.6' -cryptography==3.1.1 +censys==2.1.8 +certifi==2022.9.24 ; python_version >= '3.6' +cffi==1.15.1 +chardet==5.0.0 +charset-normalizer==2.1.1 ; python_full_version >= '3.6.0' clamd==1.0.2 -decorator==4.4.2 -deprecated==1.2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -dnspython==2.0.0 -domaintools-api==0.5.2 +click==8.1.3 ; python_version >= '3.7' +click-plugins==1.1.1 +colorama==0.4.5 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +colorclass==2.2.2 ; python_version >= '2.6' +commonmark==0.9.1 +compressed-rtf==1.0.6 +configparser==5.3.0 ; python_version >= '3.7' +crowdstrike-falconpy==1.2.2 +cryptography==38.0.1 ; python_version >= '3.6' +dateparser==1.1.1 ; python_version >= '3.5' +decorator==5.1.1 ; python_version >= '3.5' +deprecated==1.2.13 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +dnsdb2==1.1.4 +dnspython==2.2.1 +domaintools-api==1.0.1 +easygui==0.98.3 +ebcdic==1.1.1 enum-compat==0.0.3 -ez-setup==0.9 +et-xmlfile==1.1.0 ; python_version >= '3.6' +extract-msg==0.36.3 ezodf==0.3.2 -future==0.18.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -futures==3.1.1 -geoip2==4.1.0 -httplib2==0.18.1 -idna-ssl==1.1.0; python_version < '3.7' -idna==2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -isodate==0.6.0 -jbxapi==3.11.0 -json-log-formatter==0.3.0 -jsonschema==3.2.0 -lief==0.10.1 -lxml==4.5.2 +filelock==3.8.0 ; python_version >= '3.7' +frozenlist==1.3.1 ; python_version >= '3.7' +future==0.18.2 ; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +geoip2==4.6.0 +h11==0.12.0 ; python_version >= '3.6' +httpcore==0.15.0 ; python_version >= '3.7' +httplib2==0.20.4 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +httpx==0.23.0 ; python_version >= '3.7' +idna==3.4 ; python_version >= '3.5' +imapclient==2.3.1 +importlib-metadata==4.12.0 ; python_version < '3.8' +importlib-resources==5.9.0 ; python_version < '3.9' +isodate==0.6.1 +itsdangerous==2.1.2 ; python_version >= '3.7' +jaraco.classes==3.2.3 ; python_version >= '3.7' +jbxapi==3.18.0 +jeepney==0.8.0 ; sys_platform == 'linux' +jinja2==3.1.2 +json-log-formatter==0.5.1 +jsonschema==4.16.0 ; python_version >= '3.7' +keyring==23.9.3 ; python_version >= '3.7' +lark-parser==0.12.0 +lief==0.12.1 +lxml==4.9.1 maclookup==1.0.3 markdownify==0.5.3 -maxminddb==2.0.2; python_version >= '3.6' -multidict==4.7.6; python_version >= '3.5' +markupsafe==2.1.1 ; python_version >= '3.7' +mattermostdriver==7.3.2 +maxminddb==2.2.0 ; python_version >= '3.6' +. +more-itertools==8.14.0 ; python_version >= '3.5' +msoffcrypto-tool==5.0.0 ; python_version >= '3' and platform_python_implementation != 'PyPy' or (platform_system != 'Windows' and platform_system != 'Darwin') +multidict==6.0.2 ; python_version >= '3.7' +mwdblib==4.3.1 +ndjson==0.3.1 np==1.0.2 -numpy==1.19.2; python_version >= '3.6' +numpy==1.21.6 ; python_version < '3.10' and platform_machine == 'aarch64' oauth2==1.9.0.post1 -opencv-python==4.4.0.44 -pandas-ods-reader==0.0.7 -pandas==1.1.3 -passivetotal==1.0.31 -pdftotext==2.1.5 -pillow==7.2.0 -progressbar2==3.53.1 -psutil==5.7.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -pycryptodome==3.9.8; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -pycryptodomex==3.9.8; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -pydeep==0.4 +git+https://github.com/cartertemm/ODTReader.git/@49d6938693f6faa3ff09998f86dba551ae3a996b#egg=odtreader +olefile==0.46 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +oletools==0.60.1 +opencv-python==4.6.0.66 +openpyxl==3.0.10 +packaging==21.3 ; python_version >= '3.6' +pandas==1.3.5 +pandas-ods-reader==0.1.2 +passivetotal==2.5.9 +pcodedmp==1.2.6 +pdftotext==2.2.2 +pillow==9.2.0 +pkgutil-resolve-name==1.3.10 ; python_version < '3.9' +progressbar2==4.0.0 ; python_full_version >= '3.7.0' +psutil==5.9.2 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +publicsuffixlist==0.8.0 ; python_version >= '2.6' +git+https://github.com/D4-project/BGP-Ranking.git/@68de39f6c5196f796055c1ac34504054d688aa59#egg=pybgpranking&subdirectory=client +pycparser==2.21 +pycryptodome==3.15.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +pycryptodomex==3.15.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +pydeep2==0.5.1 +git+https://github.com/sebdraven/pydnstrails@48c1f740025c51289f43a24863d1845ff12fd21a#egg=pydnstrails pyeupi==1.1 +pyfaup==1.2 pygeoip==0.3.2 -pyopenssl==19.1.0 -pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' -pypdns==1.5.1 -pypssl==2.1 -pyrsistent==0.17.3; python_version >= '3.5' -pytesseract==0.3.6 +pygments==2.13.0 ; python_version >= '3.6' +git+https://github.com/MISP/PyIntel471.git@917272fafa8e12102329faca52173e90c5256968#egg=pyintel471 +git+https://github.com/D4-project/IPASN-History.git/@a2853c39265cecdd0c0d16850bd34621c0551b87#egg=pyipasnhistory&subdirectory=client +pymisp[email,fileobjects,openioc,pdfexport,url]==2.4.162 +git+https://github.com/sebdraven/pyonyphe@d1d6741f8ea4475f3bb77ff20c876f08839cabd1#egg=pyonyphe +pyparsing==2.4.7 ; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' +pypdns==1.5.2 +pypssl==2.2 +pyrsistent==0.18.1 ; python_version >= '3.7' +pytesseract==0.3.10 python-baseconv==1.2.2 -python-dateutil==2.8.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -python-docx==0.8.10 -python-engineio==3.13.2 -python-magic==0.4.18 -python-pptx==0.6.18 -python-socketio[client]==4.6.0 -python-utils==2.4.0 +python-dateutil==2.8.2 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +python-docx==0.8.11 +python-engineio==4.3.4 ; python_version >= '3.6' +python-magic==0.4.27 +python-pptx==0.6.21 +python-socketio[client]==5.7.1 ; python_version >= '3.6' +python-utils==3.3.3 ; python_version >= '3.7' pytz==2019.3 -pyyaml==5.3.1 -pyzbar==0.1.8 -pyzipper==0.3.3; python_version >= '3.5' -rdflib==5.0.0 -redis==3.5.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' -reportlab==3.5.53 -requests-cache==0.5.2 -requests[security]==2.24.0 -shodan==1.23.1 -sigmatools==0.18.1 -six==1.15.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +pytz-deprecation-shim==0.1.0.post0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' +pyyaml==6.0 ; python_version >= '3.6' +pyzbar==0.1.9 +pyzipper==0.3.6 ; python_version >= '3.5' +rdflib==6.2.0 ; python_version >= '3.7' +redis==4.3.4 ; python_version >= '3.6' +regex==2022.3.2 ; python_version >= '3.6' +reportlab==3.6.11 +requests==2.28.1 +requests-cache==0.6.4 ; python_version >= '3.6' +requests-file==1.5.1 +rfc3986[idna2008]==1.5.0 +rich==12.5.1 ; python_full_version >= '3.6.3' and python_full_version < '4.0.0' +rtfde==0.0.2 +secretstorage==3.3.3 ; sys_platform == 'linux' +setuptools==65.4.0 ; python_version >= '3.7' +shodan==1.28.0 +sigmatools==0.19.1 +simplejson==3.17.6 ; python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3' +six==1.16.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +sniffio==1.3.0 ; python_version >= '3.7' +socialscan==1.4.2 socketio-client==0.5.7.4 -soupsieve==2.0.1; python_version >= '3.0' -sparqlwrapper==1.8.5 -stix2-patterns==1.3.1 -tabulate==0.8.7 -tornado==6.0.4; python_version >= '3.5' -trustar==0.3.33 -tzlocal==2.1 +soupsieve==2.3.2.post1 ; python_version >= '3.6' +sparqlwrapper==2.0.0 +stix2==3.0.1 +stix2-patterns==2.0.0 +tabulate==0.8.10 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +tau-clients==0.2.9 +taxii2-client==2.3.0 +tldextract==3.3.1 ; python_version >= '3.7' +tornado==6.2 ; python_version >= '3.7' +tqdm==4.64.1 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +git+https://github.com/SteveClement/trustar-python.git@6954eae38e0c77eaeef26084b6c5fd033925c1c7#egg=trustar +typing-extensions==4.3.0 ; python_version < '3.8' +tzdata==2022.4 ; python_version >= '3.6' +tzlocal==4.2 ; python_version >= '3.6' unicodecsv==0.14.1 -url-normalize==1.4.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' +url-normalize==1.4.3 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' urlarchiver==0.2 -urllib3==1.25.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4' +urllib3==1.26.12 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4' validators==0.14.0 -vt-graph-api==1.0.1 -vulners==1.5.8 -wand==0.6.3 -websocket-client==0.57.0 -wrapt==1.12.1 -xlrd==1.2.0 -xlsxwriter==1.3.6 +vt-graph-api==2.2.0 +vt-py==0.17.1 +vulners==2.0.4 +wand==0.6.10 +websocket-client==1.4.1 ; python_version >= '3.7' +websockets==10.3 ; python_version >= '3.7' +wrapt==1.14.1 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' +xlrd==2.0.1 +xlsxwriter==3.0.3 ; python_version >= '3.4' yara-python==3.8.1 -yarl==1.6.0; python_version >= '3.5' +yarl==1.8.1 ; python_version >= '3.7' +zipp==3.8.1 ; python_version >= '3.7' diff --git a/docs/img/favicon.ico b/docs/img/favicon.ico new file mode 100644 index 0000000..dca12d1 Binary files /dev/null and b/docs/img/favicon.ico differ diff --git a/docs/img/misp.png b/docs/img/misp.png new file mode 100644 index 0000000..5f2d4dd Binary files /dev/null and b/docs/img/misp.png differ diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..1297a3b --- /dev/null +++ b/docs/index.md @@ -0,0 +1,120 @@ +# Home + +[![Build Status](https://travis-ci.org/MISP/misp-modules.svg?branch=master)](https://travis-ci.org/MISP/misp-modules) +[![Coverage Status](https://coveralls.io/repos/github/MISP/misp-modules/badge.svg?branch=master)](https://coveralls.io/github/MISP/misp-modules?branch=master) +[![codecov](https://codecov.io/gh/MISP/misp-modules/branch/master/graph/badge.svg)](https://codecov.io/gh/MISP/misp-modules) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%MISP%2Fmisp-modules.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2FMISP%2Fmisp-modules?ref=badge_shield) + +MISP modules are autonomous modules that can be used for expansion and other services in [MISP](https://github.com/MISP/MISP). + +The modules are written in Python 3 following a simple API interface. The objective is to ease the extensions of MISP functionalities +without modifying core components. The API is available via a simple REST API which is independent from MISP installation or configuration. + +MISP modules support is included in MISP starting from version `2.4.28`. + +For more information: [Extending MISP with Python modules](https://www.circl.lu/assets/files/misp-training/switch2016/2-misp-modules.pdf) slides from MISP training. + + +## Existing MISP modules + +### Expansion modules + +* [Backscatter.io](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/backscatter_io.py) - a hover and expansion module to expand an IP address with mass-scanning observations. +* [BGP Ranking](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/bgpranking.py) - a hover and expansion module to expand an AS number with the ASN description, its history, and position in BGP Ranking. +* [BTC scam check](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/btc_scam_check.py) - An expansion hover module to instantly check if a BTC address has been abused. +* [BTC transactions](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/btc_steroids.py) - An expansion hover module to get a blockchain balance and the transactions from a BTC address in MISP. +* [CIRCL Passive DNS](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/circl_passivedns.py) - a hover and expansion module to expand hostname and IP addresses with passive DNS information. +* [CIRCL Passive SSL](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/circl_passivessl.py) - a hover and expansion module to expand IP addresses with the X.509 certificate seen. +* [countrycode](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/countrycode.py) - a hover module to tell you what country a URL belongs to. +* [CrowdStrike Falcon](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/crowdstrike_falcon.py) - an expansion module to expand using CrowdStrike Falcon Intel Indicator API. +* [CVE](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cve.py) - a hover module to give more information about a vulnerability (CVE). +* [CVE advanced](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cve_advanced.py) - An expansion module to query the CIRCL CVE search API for more information about a vulnerability (CVE). +* [Cuckoo submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/cuckoo_submit.py) - A hover module to submit malware sample, url, attachment, domain to Cuckoo Sandbox. +* [DBL Spamhaus](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/dbl_spamhaus.py) - a hover module to check Spamhaus DBL for a domain name. +* [DNS](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/dns.py) - a simple module to resolve MISP attributes like hostname and domain to expand IP addresses attributes. +* [docx-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/docx-enrich.py) - an enrichment module to get text out of Word document into MISP (using free-text parser). +* [DomainTools](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/domaintools.py) - a hover and expansion module to get information from [DomainTools](http://www.domaintools.com/) whois. +* [EUPI](https://github.com/MISP/misp-modules/tree/master/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). +* [EQL](misp_modules/modules/expansion/eql.py) - an expansion module to generate event query language (EQL) from an attribute. [Event Query Language](https://eql.readthedocs.io/en/latest/) +* [Farsight DNSDB Passive DNS](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/farsight_passivedns.py) - a hover and expansion module to expand hostname and IP addresses with passive DNS information. +* [GeoIP](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/geoip_country.py) - a hover and expansion module to get GeoIP information from geolite/maxmind. +* [Greynoise](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/greynoise.py) - a hover to get information from greynoise. +* [hashdd](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/hashdd.py) - a hover module to check file hashes against [hashdd.com](http://www.hashdd.com) including NSLR dataset. +* [hibp](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/hibp.py) - a hover module to lookup against Have I Been Pwned? +* [intel471](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/intel471.py) - an expansion module to get info from [Intel471](https://intel471.com). +* [IPASN](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ipasn.py) - a hover and expansion to get the BGP ASN of an IP address. +* [iprep](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/iprep.py) - an expansion module to get IP reputation from packetmail.net. +* [Joe Sandbox submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_submit.py) - Submit files and URLs to Joe Sandbox. +* [Joe Sandbox query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/joesandbox_query.py) - Query Joe Sandbox with the link of an analysis and get the parsed data. +* [macaddress.io](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/macaddress_io.py) - a hover module to retrieve vendor details and other information regarding a given MAC address or an OUI from [MAC address Vendor Lookup](https://macaddress.io). See [integration tutorial here](https://macaddress.io/integrations/MISP-module). +* [macvendors](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/macvendors.py) - a hover module to retrieve mac vendor information. +* [ocr-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ocr-enrich.py) - an enrichment module to get OCRized data from images into MISP. +* [ods-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/ods-enrich.py) - an enrichment module to get text out of OpenOffice spreadsheet document into MISP (using free-text parser). +* [odt-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/odt-enrich.py) - an enrichment module to get text out of OpenOffice document into MISP (using free-text parser). +* [onyphe](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/onyphe.py) - a modules to process queries on Onyphe. +* [onyphe_full](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/onyphe_full.py) - a modules to process full queries on Onyphe. +* [OTX](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/otx.py) - an expansion module for [OTX](https://otx.alienvault.com/). +* [passivetotal](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/passivetotal.py) - a [passivetotal](https://www.passivetotal.org/) module that queries a number of different PassiveTotal datasets. +* [pdf-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/pdf-enrich.py) - an enrichment module to extract text from PDF into MISP (using free-text parser). +* [pptx-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/pptx-enrich.py) - an enrichment module to get text out of PowerPoint document into MISP (using free-text parser). +* [qrcode](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/qrcode.py) - a module decode QR code, barcode and similar codes from an image and enrich with the decoded values. +* [rbl](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/rbl.py) - a module to get RBL (Real-Time Blackhost List) values from an attribute. +* [reversedns](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/reversedns.py) - Simple Reverse DNS expansion service to resolve reverse DNS from MISP attributes. +* [securitytrails](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/securitytrails.py) - an expansion module for [securitytrails](https://securitytrails.com/). +* [shodan](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/shodan.py) - a minimal [shodan](https://www.shodan.io/) expansion module. +* [Sigma queries](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sigma_queries.py) - Experimental expansion module querying a sigma rule to convert it into all the available SIEM signatures. +* [Sigma syntax validator](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sigma_syntax_validator.py) - Sigma syntax validator. +* [sourcecache](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/sourcecache.py) - a module to cache a specific link from a MISP instance. +* [STIX2 pattern syntax validator](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/stix2_pattern_syntax_validator.py) - a module to check a STIX2 pattern syntax. +* [ThreatCrowd](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/threatcrowd.py) - an expansion module for [ThreatCrowd](https://www.threatcrowd.org/). +* [threatminer](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/threatminer.py) - an expansion module to expand from [ThreatMiner](https://www.threatminer.org/). +* [urlhaus](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/urlhaus.py) - Query urlhaus to get additional data about a domain, hash, hostname, ip or url. +* [urlscan](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/urlscan.py) - an expansion module to query [urlscan.io](https://urlscan.io). +* [virustotal](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/virustotal.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a high request rate limit required. (More details about the API: [here](https://developers.virustotal.com/reference)) +* [virustotal_public](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/virustotal_public.py) - an expansion module to query the [VirusTotal](https://www.virustotal.com/gui/home) API with a public key and a low request rate limit. (More details about the API: [here](https://developers.virustotal.com/reference)) +* [VMray](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/vmray_submit.py) - a module to submit a sample to VMray. +* [VulnDB](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/vulndb.py) - a module to query [VulnDB](https://www.riskbasedsecurity.com/). +* [Vulners](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/vulners.py) - an expansion module to expand information about CVEs using Vulners API. +* [whois](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/whois.py) - a module to query a local instance of [uwhois](https://github.com/rafiot/uwhoisd). +* [wikidata](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/wiki.py) - a [wikidata](https://www.wikidata.org) expansion module. +* [xforce](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/xforceexchange.py) - an IBM X-Force Exchange expansion module. +* [xlsx-enrich](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/xlsx-enrich.py) - an enrichment module to get text out of an Excel document into MISP (using free-text parser). +* [YARA query](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/yara_query.py) - a module to create YARA rules from single hash attributes. +* [YARA syntax validator](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/yara_syntax_validator.py) - YARA syntax validator. + +### Export modules + +* [CEF](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/cef_export.py) module to export Common Event Format (CEF). +* [Cisco FireSight Manager ACL rule](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/cisco_firesight_manager_ACL_rule_export.py) module to export as rule for the Cisco FireSight manager ACL. +* [GoAML export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/goamlexport.py) module to export in [GoAML format](http://goaml.unodc.org/goaml/en/index.html). +* [Lite Export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/liteexport.py) module to export a lite event. +* [Mass EQL Export](misp_modules/modules/export_mod/mass_eql_export.py) module to export applicable attributes from an event to a mass EQL query. +* [PDF export](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/pdfexport.py) module to export an event in PDF. +* [Nexthink query format](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/nexthinkexport.py) module to export in Nexthink query format. +* [osquery](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/osqueryexport.py) module to export in [osquery](https://osquery.io/) query format. +* [ThreatConnect](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/threat_connect_export.py) module to export in ThreatConnect CSV format. +* [ThreatStream](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/export_mod/threatStream_misp_export.py) module to export in ThreatStream format. + +### Import modules + +* [CSV import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/csvimport.py) Customizable CSV import module. +* [Cuckoo JSON](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/cuckooimport.py) Cuckoo JSON import. +* [Email Import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/email_import.py) Email import module for MISP to import basic metadata. +* [GoAML import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/goamlimport.py) Module to import [GoAML](http://goaml.unodc.org/goaml/en/index.html) XML format. +* [Joe Sandbox import](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/joe_import.py) Parse data from a Joe Sandbox json report. +* [OCR](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/ocr.py) Optical Character Recognition (OCR) module for MISP to import attributes from images, scan or faxes. +* [OpenIOC](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/openiocimport.py) OpenIOC import based on PyMISP library. +* [ThreatAnalyzer](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/threatanalyzer_import.py) - An import module to process ThreatAnalyzer archive.zip/analysis.json sandbox exports. +* [VMRay](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/import_mod/vmray_import.py) - An import module to process VMRay export. + + +## How to contribute your own module? + +Fork the project, add your module, test it and make a pull-request. Modules can be also private as you can add a module in your own MISP installation. +For further information please see [Contribute](contribute/). + + +## Licenses +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%MISP%2Fmisp-modules.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FMISP%2Fmisp-modules?ref=badge_large) + +For further Information see also the [license file](license/). \ No newline at end of file diff --git a/docs/logos/misp-modules-full-small.png b/docs/logos/misp-modules-full-small.png new file mode 100644 index 0000000..dbbc084 Binary files /dev/null and b/docs/logos/misp-modules-full-small.png differ diff --git a/docs/logos/misp-modules-full.png b/docs/logos/misp-modules-full.png new file mode 100644 index 0000000..2b432e3 Binary files /dev/null and b/docs/logos/misp-modules-full.png differ diff --git a/docs/logos/misp-modules-full.svg b/docs/logos/misp-modules-full.svg new file mode 100644 index 0000000..eba9571 --- /dev/null +++ b/docs/logos/misp-modules-full.svg @@ -0,0 +1,125 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + misp-modules + + diff --git a/docs/logos/misp-modules-small.png b/docs/logos/misp-modules-small.png new file mode 100644 index 0000000..dbe9d19 Binary files /dev/null and b/docs/logos/misp-modules-small.png differ diff --git a/docs/logos/misp-modules.svg b/docs/logos/misp-modules.svg new file mode 100644 index 0000000..023daf4 --- /dev/null +++ b/docs/logos/misp-modules.svg @@ -0,0 +1,114 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/documentation/README.md b/documentation/README.md index 0c51ad4..a455c79 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -606,18 +606,19 @@ Module to query a local copy of Maxmind's Geolite database. -Module to access GreyNoise.io API +Module to query IP and CVE information from GreyNoise - **features**: ->The module takes an IP address as input and queries Greynoise for some additional information about it: basically it checks whether a given IP address is “Internet background noise”, or has been observed scanning or attacking devices across the Internet. The result is returned as text. +>This module supports: 1) Query an IP from GreyNoise to see if it is internet background noise or a common business service 2) Query a CVE from GreyNoise to see the total number of internet scanners looking for the CVE in the last 7 days. - **input**: ->An IP address. +>An IP address or CVE ID - **output**: ->Additional information about the IP fetched from Greynoise API. +>IP Lookup information or CVE scanning profile for past 7 days - **references**: > - https://greynoise.io/ -> - https://github.com/GreyNoise-Intelligence/api.greynoise.io +> - https://docs.greyniose.io/ +> - https://www.greynoise.io/viz/account/ - **requirements**: ->A Greynoise API key. +>A Greynoise API key. Both Enterprise (Paid) and Community (Free) API keys are supported, however Community API users will only be able to perform IP lookups. ----- @@ -635,6 +636,25 @@ A hover module to check hashes against hashdd.com including NSLR dataset. ----- +#### [hashlookup](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hashlookup.py) + + + +An expansion module to query the CIRCL hashlookup services to find it if a hash is part of a known set such as NSRL. +- **features**: +>The module takes file hashes as input such as a MD5 or SHA1. +> It queries the public CIRCL.lu hashlookup service and return all the hits if the hashes are known in an existing dataset. The module can be configured with a custom hashlookup url if required. +> The module can be used an hover module but also an expansion model to add related MISP objects. +> +- **input**: +>File hashes (MD5, SHA1) +- **output**: +>Object with the filename associated hashes if the hash is part of a known set. +- **references**: +>https://www.circl.lu/services/hashlookup/ + +----- + #### [hibp](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/hibp.py) @@ -734,6 +754,26 @@ Module to query an IP ASN history service (https://github.com/D4-project/IPASN-H ----- +#### [ipqs_fraud_and_risk_scoring](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py) + + + +IPQualityScore MISP Expansion Module for IP reputation, Email Validation, Phone Number Validation, Malicious Domain and Malicious URL Scanner. +- **features**: +>This Module takes the IP Address, Domain, URL, Email and Phone Number MISP Attributes as input to query the IPQualityScore API. +> The results of the IPQualityScore API are than returned as IPQS Fraud and Risk Scoring Object. +> The object contains a copy of the enriched attribute with added tags presenting the verdict based on fraud score,risk score and other attributes from IPQualityScore. +- **input**: +>A MISP attribute of type IP Address(ip-src, ip-dst), Domain(hostname, domain), URL(url, uri), Email Address(email, email-src, email-dst, target-email, whois-registrant-email) and Phone Number(phone-number, whois-registrant-phone). +- **output**: +>IPQualityScore object, resulting from the query on the IPQualityScore API. +- **references**: +>https://www.ipqualityscore.com/ +- **requirements**: +>A IPQualityScore API Key. + +----- + #### [iprep](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/iprep.py) Module to query IPRep data for IP addresses. @@ -802,6 +842,8 @@ A module to submit files or URLs to Joe Sandbox for an advanced analysis, and re +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + Query Lastline with an analysis link and parse the report into MISP attributes and objects. The analysis link can also be retrieved from the output of the [lastline_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_submit.py) expansion module. - **features**: @@ -821,6 +863,8 @@ The analysis link can also be retrieved from the output of the [lastline_submit] +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + Module to submit a file or URL to Lastline. - **features**: >The module requires a Lastline Analysis `api_token` and `key`. @@ -892,6 +936,39 @@ Query the MALWAREbazaar API to get additional information about the input hash a ----- +#### [mmdb_lookup](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/mmdb_lookup.py) + + + +A hover and expansion module to enrich an ip with geolocation and ASN information from an mmdb server instance, such as CIRCL's ip.circl.lu. +- **features**: +>The module takes an IP address related attribute as input. +> It queries the public CIRCL.lu mmdb-server instance, available at ip.circl.lu, by default. The module can be configured with a custom mmdb server url if required. +> It is also possible to filter results on 1 db_source by configuring db_source_filter. +- **input**: +>An IP address attribute (for example ip-src or ip-src|port). +- **output**: +>Geolocation and asn objects. +- **references**: +> - https://data.public.lu/fr/datasets/geo-open-ip-address-geolocation-per-country-in-mmdb-format/ +> - https://github.com/adulau/mmdb-server + +----- + +#### [mwdb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/mwdb.py) + +Module to push malware samples to a MWDB instance +- **features**: +>An expansion module to push malware samples to a MWDB (https://github.com/CERT-Polska/mwdb-core) instance. This module does not push samples to a sandbox. This can be achieved via Karton (connected to the MWDB). Does: * Upload of attachment or malware sample to MWDB * Tags of events and/or attributes are added to MWDB. * Comment of the MISP attribute is added to MWDB. * A link back to the MISP event is added to MWDB via the MWDB attribute. * A link to the MWDB attribute is added as an enrichted attribute to the MISP event. +- **input**: +>Attachment or malware sample +- **output**: +>Link attribute that points to the sample at the MWDB instane +- **requirements**: +>* mwdblib installed (pip install mwdblib) ; * (optional) keys.py file to add tags of events/attributes to MWDB * (optional) MWDB attribute created for the link back to MISP (defined in mwdb_misp_attribute) + +----- + #### [ocr_enrich](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ocr_enrich.py) Module to process some optical character recognition on pictures. @@ -1016,6 +1093,25 @@ Module to get information from AlienVault OTX. ----- +#### [passivessh](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/passivessh.py) + + + +An expansion module to query the CIRCL Passive SSH. +- **features**: +>The module queries the Passive SSH service from CIRCL. +> +> The module can be used an hover module but also an expansion model to add related MISP objects. +> +- **input**: +>IP addresses or SSH fingerprints +- **output**: +>SSH key materials, complementary IP addresses with similar SSH key materials +- **references**: +>https://github.com/D4-project/passive-ssh + +----- + #### [passivetotal](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/passivetotal.py) @@ -1099,6 +1195,24 @@ Module to extract freetext from a .pptx document. ----- +#### [qintel_qsentry](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/qintel_qsentry.py) + + + +A hover and expansion module which queries Qintel QSentry for ip reputation data +- **features**: +>This module takes an ip-address (ip-src or ip-dst) attribute as input, and queries the Qintel QSentry API to retrieve ip reputation data +- **input**: +>ip address attribute +- **ouput**: +>Objects containing the enriched IP, threat tags, last seen attributes and associated Autonomous System information +- **references**: +>https://www.qintel.com/products/qsentry/ +- **requirements**: +>A Qintel API token + +----- + #### [qrcode](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/qrcode.py) Module to decode QR codes. @@ -1567,6 +1681,26 @@ Module to submit a sample to VMRay. ----- +#### [vmware_nsx](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vmware_nsx.py) + + + +Module to enrich a file or URL with VMware NSX Defender. +- **features**: +>This module takes an IoC such as file hash, file attachment, malware-sample or url as input to query VMware NSX Defender. +> +>The IoC is then enriched with data from VMware NSX Defender. +- **input**: +>File hash, attachment or URL to be enriched with VMware NSX Defender. +- **output**: +>Objects and tags generated by VMware NSX Defender. +- **references**: +>https://www.vmware.com +- **requirements**: +>The module requires a VMware NSX Defender Analysis `api_token` and `key`. + +----- + #### [vulndb](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/vulndb.py) @@ -1720,6 +1854,26 @@ An expansion hover module to perform a syntax check on if yara rules are valid o ----- +#### [yeti](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/yeti.py) + + + +Module to process a query on Yeti. +- **features**: +>This module add context and links between observables using yeti +- **input**: +>A domain, hostname,IP, sha256,sha1, md5, url of MISP attribute. +- **output**: +>MISP attributes and objects fetched from the Yeti instances. +- **references**: +> - https://github.com/yeti-platform/yeti +> - https://github.com/sebdraven/pyeti +- **requirements**: +> - pyeti +> - API key + +----- + ## Export Modules #### [cef_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/cef_export.py) @@ -1753,6 +1907,22 @@ Module to export malicious network activity attributes to Cisco fireSIGHT manage ----- +#### [defender_endpoint_export](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/defender_endpoint_export.py) + + + +Defender for Endpoint KQL hunting query export module +- **features**: +>This module export an event as Defender for Endpoint KQL queries that can then be used in your own python3 or Powershell tool. If you are using Microsoft Sentinel, you can directly connect your MISP instance to Sentinel and then create queries using the `ThreatIntelligenceIndicator` table to match events against imported IOC. +- **input**: +>MISP Event attributes +- **output**: +>Defender for Endpoint KQL queries +- **references**: +>https://docs.microsoft.com/en-us/windows/security/threat-protection/microsoft-defender-atp/advanced-hunting-schema-reference + +----- + #### [goamlexport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/goamlexport.py) @@ -1857,7 +2027,7 @@ Simple export of a MISP event to PDF. > 'Activate_galaxy_description' is a boolean (True or void) to activate the description of event related galaxies. > 'Activate_related_events' is a boolean (True or void) to activate the description of related event. Be aware this might leak information on confidential events linked to the current event ! > 'Activate_internationalization_fonts' is a boolean (True or void) to activate Noto fonts instead of default fonts (Helvetica). This allows the support of CJK alphabet. Be sure to have followed the procedure to download Noto fonts (~70Mo) in the right place (/tools/pdf_fonts/Noto_TTF), to allow PyMisp to find and use them during PDF generation. -> 'Custom_fonts_path' is a text (path or void) to the TTF file of your choice, to create the PDF with it. Be aware the PDF won't support bold/italic/special style anymore with this option +> 'Custom_fonts_path' is a text (path or void) to the TTF file of your choice, to create the PDF with it. Be aware the PDF won't support bold/italic/special style anymore with this option - **input**: >MISP Event - **output**: @@ -1914,6 +2084,25 @@ Module to export a structured CSV file for uploading to ThreatConnect. ----- +#### [virustotal_collections](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/virustotal_collections.py) + + + +Creates a VT Collection from an event iocs. +- **features**: +>This export module which takes advantage of a new endpoint in VT APIv3 to create VT Collections from IOCs contained in a MISP event. With this module users will be able to create a collection just using the Download as... button. +- **input**: +>A domain, hash (md5, sha1, sha256 or sha512), hostname, url or IP address attribute. +- **output**: +>A VirusTotal collection in VT. +- **references**: +> - https://www.virustotal.com/ +> - https://blog.virustotal.com/2021/11/introducing-virustotal-collections.html +- **requirements**: +>An access to the VirusTotal API (apikey). + +----- + #### [vt_graph](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/export_mod/vt_graph.py) @@ -1936,6 +2125,22 @@ This module is used to create a VirusTotal Graph from a MISP event. ## Import Modules +#### [cof2misp](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/cof2misp.py) + +Passive DNS Common Output Format (COF) MISP importer +- **features**: +>Takes as input a valid COF file or the output of the dnsdbflex utility and creates MISP objects for the input. +- **input**: +>Passive DNS output in Common Output Format (COF) +- **output**: +>MISP objects +- **references**: +>https://tools.ietf.org/id/draft-dulaunoy-dnsop-passive-dns-cof-08.html +- **requirements**: +>PyMISP + +----- + #### [csvimport](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/import_mod/csvimport.py) Module to import MISP attributes from a csv file. @@ -2028,6 +2233,8 @@ A module to import data from a Joe Sandbox analysis json report. +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + Module to import and parse reports from Lastline analysis links. - **features**: >The module requires a Lastline Portal `username` and `password`. diff --git a/documentation/generate_documentation.py b/documentation/generate_documentation.py index 4081e50..8d9116e 100644 --- a/documentation/generate_documentation.py +++ b/documentation/generate_documentation.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import os import json +import sys module_types = ['expansion', 'export_mod', 'import_mod'] titles = ['Expansion Modules', 'Export Modules', 'Import Modules'] @@ -17,6 +18,7 @@ def generate_doc(module_type, root_path, logo_path='logos'): githubref = f'{githubpath}/{modulename}.py' markdown.append(f'\n#### [{modulename}]({githubref})\n') filename = os.path.join(current_path, filename) + print(f'Processing {filename}') with open(filename, 'rt') as f: definition = json.loads(f.read()) if 'logo' in definition: diff --git a/documentation/logos/circl.png b/documentation/logos/circl.png new file mode 100644 index 0000000..516678d Binary files /dev/null and b/documentation/logos/circl.png differ diff --git a/documentation/logos/defender_endpoing.png b/documentation/logos/defender_endpoing.png new file mode 100644 index 0000000..efc7ace Binary files /dev/null and b/documentation/logos/defender_endpoing.png differ diff --git a/documentation/logos/greynoise.png b/documentation/logos/greynoise.png index b4d4f91..0c57e64 100644 Binary files a/documentation/logos/greynoise.png and b/documentation/logos/greynoise.png differ diff --git a/documentation/logos/hyas.png b/documentation/logos/hyas.png new file mode 100644 index 0000000..42acf22 Binary files /dev/null and b/documentation/logos/hyas.png differ diff --git a/documentation/logos/ipqualityscore.png b/documentation/logos/ipqualityscore.png new file mode 100644 index 0000000..da52d96 Binary files /dev/null and b/documentation/logos/ipqualityscore.png differ diff --git a/documentation/logos/passivessh.png b/documentation/logos/passivessh.png new file mode 100644 index 0000000..42c8190 Binary files /dev/null and b/documentation/logos/passivessh.png differ diff --git a/documentation/logos/qintel.png b/documentation/logos/qintel.png new file mode 100644 index 0000000..fa3af76 Binary files /dev/null and b/documentation/logos/qintel.png differ diff --git a/documentation/logos/vmware_nsx.png b/documentation/logos/vmware_nsx.png new file mode 100644 index 0000000..4d4ba96 Binary files /dev/null and b/documentation/logos/vmware_nsx.png differ diff --git a/documentation/logos/yeti.png b/documentation/logos/yeti.png new file mode 100644 index 0000000..46b77da Binary files /dev/null and b/documentation/logos/yeti.png differ diff --git a/documentation/mkdocs/install.md b/documentation/mkdocs/install.md index 662e675..3eed0f4 100644 --- a/documentation/mkdocs/install.md +++ b/documentation/mkdocs/install.md @@ -14,7 +14,8 @@ sudo apt-get install -y \ zbar-tools \ libzbar0 \ libzbar-dev \ - libfuzzy-dev + libfuzzy-dev \ + libcaca-dev # BEGIN with virtualenv: $SUDO_WWW virtualenv -p python3 /var/www/MISP/venv diff --git a/documentation/website/expansion/farsight_passivedns.json b/documentation/website/expansion/farsight_passivedns.json index ec33026..93183ce 100644 --- a/documentation/website/expansion/farsight_passivedns.json +++ b/documentation/website/expansion/farsight_passivedns.json @@ -11,4 +11,4 @@ "https://docs.dnsdb.info/dnsdb-api/" ], "features": "This module takes a domain, hostname or IP address MISP attribute as input to query the Farsight Passive DNS API.\n The results of rdata and rrset lookups are then returned and parsed into passive-dns objects.\n\nAn API key is required to submit queries to the API.\n It is also possible to define a custom server URL, and to set a limit of results to get.\n This limit is set for each lookup, which means we can have an up to the limit number of passive-dns objects resulting from an rdata query about an IP address, but an up to the limit number of passive-dns objects for each lookup queries about a domain or a hostname (== twice the limit)." -} \ No newline at end of file +} diff --git a/documentation/website/expansion/greynoise.json b/documentation/website/expansion/greynoise.json index 4c61727..4988537 100644 --- a/documentation/website/expansion/greynoise.json +++ b/documentation/website/expansion/greynoise.json @@ -1,14 +1,15 @@ { - "description": "Module to access GreyNoise.io API", + "description": "Module to query IP and CVE information from GreyNoise", "logo": "greynoise.png", "requirements": [ - "A Greynoise API key." + "A Greynoise API key. Both Enterprise (Paid) and Community (Free) API keys are supported, however Community API users will only be able to perform IP lookups." ], - "input": "An IP address.", - "output": "Additional information about the IP fetched from Greynoise API.", + "input": "An IP address or CVE ID", + "output": "IP Lookup information or CVE scanning profile for past 7 days", "references": [ "https://greynoise.io/", - "https://github.com/GreyNoise-Intelligence/api.greynoise.io" + "https://docs.greyniose.io/", + "https://www.greynoise.io/viz/account/" ], - "features": "The module takes an IP address as input and queries Greynoise for some additional information about it: basically it checks whether a given IP address is \u201cInternet background noise\u201d, or has been observed scanning or attacking devices across the Internet. The result is returned as text." + "features": "This module supports: 1) Query an IP from GreyNoise to see if it is internet background noise or a common business service 2) Query a CVE from GreyNoise to see the total number of internet scanners looking for the CVE in the last 7 days." } \ No newline at end of file diff --git a/documentation/website/expansion/hashlookup.json b/documentation/website/expansion/hashlookup.json new file mode 100644 index 0000000..713be83 --- /dev/null +++ b/documentation/website/expansion/hashlookup.json @@ -0,0 +1,10 @@ +{ + "description": "An expansion module to query the CIRCL hashlookup services to find it if a hash is part of a known set such as NSRL.", + "logo": "circl.png", + "input": "File hashes (MD5, SHA1)", + "output": "Object with the filename associated hashes if the hash is part of a known set.", + "references": [ + "https://www.circl.lu/services/hashlookup/" + ], + "features": "The module takes file hashes as input such as a MD5 or SHA1.\n It queries the public CIRCL.lu hashlookup service and return all the hits if the hashes are known in an existing dataset. The module can be configured with a custom hashlookup url if required.\n The module can be used an hover module but also an expansion model to add related MISP objects.\n" +} diff --git a/documentation/website/expansion/hyasinsight.json b/documentation/website/expansion/hyasinsight.json new file mode 100644 index 0000000..2762a08 --- /dev/null +++ b/documentation/website/expansion/hyasinsight.json @@ -0,0 +1,13 @@ +{ + "description": "HYAS Insight integration to MISP provides direct, high volume access to HYAS Insight data. It enables investigators and analysts to understand and defend against cyber adversaries and their infrastructure.", + "logo": "hyas.png", + "requirements": [ + "A HYAS Insight API Key." + ], + "input": "A MISP attribute of type IP Address(ip-src, ip-dst), Domain(hostname, domain), Email Address(email, email-src, email-dst, target-email, whois-registrant-email), Phone Number(phone-number, whois-registrant-phone), MDS(md5, x509-fingerprint-md5, ja3-fingerprint-md5, hassh-md5, hasshserver-md5), SHA1(sha1, x509-fingerprint-sha1), SHA256(sha256, x509-fingerprint-sha256), SHA512(sha512)", + "output": "Hyas Insight objects, resulting from the query on the HYAS Insight API.", + "references": [ + "https://www.hyas.com/hyas-insight/" + ], + "features": "This Module takes the IP Address, Domain, URL, Email, Phone Number, MD5, SHA1, Sha256, SHA512 MISP Attributes as input to query the HYAS Insight API.\n The results of the HYAS Insight API are than are then returned and parsed into Hyas Insight Objects. \n\nAn API key is required to submit queries to the HYAS Insight API.\n" +} diff --git a/documentation/website/expansion/ipqs_fraud_and_risk_scoring.json b/documentation/website/expansion/ipqs_fraud_and_risk_scoring.json new file mode 100644 index 0000000..d0d4665 --- /dev/null +++ b/documentation/website/expansion/ipqs_fraud_and_risk_scoring.json @@ -0,0 +1,13 @@ +{ + "description": "IPQualityScore MISP Expansion Module for IP reputation, Email Validation, Phone Number Validation, Malicious Domain and Malicious URL Scanner.", + "logo": "ipqualityscore.png", + "requirements": [ + "A IPQualityScore API Key." + ], + "input": "A MISP attribute of type IP Address(ip-src, ip-dst), Domain(hostname, domain), URL(url, uri), Email Address(email, email-src, email-dst, target-email, whois-registrant-email) and Phone Number(phone-number, whois-registrant-phone).", + "output": "IPQualityScore object, resulting from the query on the IPQualityScore API.", + "references": [ + "https://www.ipqualityscore.com/" + ], + "features": "This Module takes the IP Address, Domain, URL, Email and Phone Number MISP Attributes as input to query the IPQualityScore API.\n The results of the IPQualityScore API are than returned as IPQS Fraud and Risk Scoring Object. \n The object contains a copy of the enriched attribute with added tags presenting the verdict based on fraud score,risk score and other attributes from IPQualityScore." +} diff --git a/documentation/website/expansion/lastline_query.json b/documentation/website/expansion/lastline_query.json index 611b514..4b925b5 100644 --- a/documentation/website/expansion/lastline_query.json +++ b/documentation/website/expansion/lastline_query.json @@ -1,5 +1,5 @@ { - "description": "Query Lastline with an analysis link and parse the report into MISP attributes and objects.\nThe analysis link can also be retrieved from the output of the [lastline_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_submit.py) expansion module.", + "description": "Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module.\n\nQuery Lastline with an analysis link and parse the report into MISP attributes and objects.\nThe analysis link can also be retrieved from the output of the [lastline_submit](https://github.com/MISP/misp-modules/tree/master/misp_modules/modules/expansion/lastline_submit.py) expansion module.", "logo": "lastline.png", "requirements": [], "input": "Link to a Lastline analysis.", diff --git a/documentation/website/expansion/lastline_submit.json b/documentation/website/expansion/lastline_submit.json index 7c4387f..3050481 100644 --- a/documentation/website/expansion/lastline_submit.json +++ b/documentation/website/expansion/lastline_submit.json @@ -1,5 +1,5 @@ { - "description": "Module to submit a file or URL to Lastline.", + "description": "Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module.\n\nModule to submit a file or URL to Lastline.", "logo": "lastline.png", "requirements": [], "input": "File or URL to submit to Lastline.", diff --git a/documentation/website/expansion/mmdb_lookup.json b/documentation/website/expansion/mmdb_lookup.json new file mode 100644 index 0000000..ebfbf49 --- /dev/null +++ b/documentation/website/expansion/mmdb_lookup.json @@ -0,0 +1,11 @@ +{ + "description": "A hover and expansion module to enrich an ip with geolocation and ASN information from an mmdb server instance, such as CIRCL's ip.circl.lu.", + "logo": "circl.png", + "input": "An IP address attribute (for example ip-src or ip-src|port).", + "output": "Geolocation and asn objects.", + "references": [ + "https://data.public.lu/fr/datasets/geo-open-ip-address-geolocation-per-country-in-mmdb-format/", + "https://github.com/adulau/mmdb-server" + ], + "features": "The module takes an IP address related attribute as input.\n It queries the public CIRCL.lu mmdb-server instance, available at ip.circl.lu, by default. The module can be configured with a custom mmdb server url if required.\n It is also possible to filter results on 1 db_source by configuring db_source_filter." +} \ No newline at end of file diff --git a/documentation/website/expansion/mwdb.json b/documentation/website/expansion/mwdb.json new file mode 100644 index 0000000..456a160 --- /dev/null +++ b/documentation/website/expansion/mwdb.json @@ -0,0 +1,11 @@ +{ + "description": "Module to push malware samples to a MWDB instance", + "requirements": [ + "* mwdblib installed (pip install mwdblib) ; * (optional) keys.py file to add tags of events/attributes to MWDB * (optional) MWDB attribute created for the link back to MISP (defined in mwdb_misp_attribute)" + ], + "input": "Attachment or malware sample", + "output": "Link attribute that points to the sample at the MWDB instane", + "references": [ + ], + "features": "An expansion module to push malware samples to a MWDB (https://github.com/CERT-Polska/mwdb-core) instance. This module does not push samples to a sandbox. This can be achieved via Karton (connected to the MWDB). Does: * Upload of attachment or malware sample to MWDB * Tags of events and/or attributes are added to MWDB. * Comment of the MISP attribute is added to MWDB. * A link back to the MISP event is added to MWDB via the MWDB attribute. * A link to the MWDB attribute is added as an enrichted attribute to the MISP event." +} \ No newline at end of file diff --git a/documentation/website/expansion/passivessh.json b/documentation/website/expansion/passivessh.json new file mode 100644 index 0000000..68f7eb7 --- /dev/null +++ b/documentation/website/expansion/passivessh.json @@ -0,0 +1,10 @@ +{ + "description": "An expansion module to query the CIRCL Passive SSH.", + "logo": "passivessh.png", + "input": "IP addresses or SSH fingerprints", + "output": "SSH key materials, complementary IP addresses with similar SSH key materials", + "references": [ + "https://github.com/D4-project/passive-ssh" + ], + "features": "The module queries the Passive SSH service from CIRCL.\n \n The module can be used an hover module but also an expansion model to add related MISP objects.\n" +} diff --git a/documentation/website/expansion/qintel_qsentry.json b/documentation/website/expansion/qintel_qsentry.json new file mode 100644 index 0000000..4994a62 --- /dev/null +++ b/documentation/website/expansion/qintel_qsentry.json @@ -0,0 +1,13 @@ +{ + "description": "A hover and expansion module which queries Qintel QSentry for ip reputation data", + "logo": "qintel.png", + "requirements": [ + "A Qintel API token" + ], + "input": "ip address attribute", + "ouput": "Objects containing the enriched IP, threat tags, last seen attributes and associated Autonomous System information", + "features": "This module takes an ip-address (ip-src or ip-dst) attribute as input, and queries the Qintel QSentry API to retrieve ip reputation data", + "references": [ + "https://www.qintel.com/products/qsentry/" + ] +} \ No newline at end of file diff --git a/documentation/website/expansion/vmware_nsx.json b/documentation/website/expansion/vmware_nsx.json new file mode 100644 index 0000000..c7e5b02 --- /dev/null +++ b/documentation/website/expansion/vmware_nsx.json @@ -0,0 +1,14 @@ +{ + "description": "Module to enrich a file or URL with VMware NSX Defender.", + "logo": "vmware_nsx.png", + "requirements": [ + "The module requires a VMware NSX Defender Analysis `api_token` and `key`." + ], + "input": "File hash, attachment or URL to be enriched with VMware NSX Defender.", + "output": "Objects and tags generated by VMware NSX Defender.", + "references": [ + "https://www.vmware.com" + ], + "features": "This module takes an IoC such as file hash, file attachment, malware-sample or url as input to query VMware NSX Defender.\n\nThe IoC is then enriched with data from VMware NSX Defender." +} + diff --git a/documentation/website/expansion/yeti.json b/documentation/website/expansion/yeti.json new file mode 100644 index 0000000..93341dc --- /dev/null +++ b/documentation/website/expansion/yeti.json @@ -0,0 +1,9 @@ +{ + "description": "Module to process a query on Yeti.", + "logo": "yeti.png", + "requirements": ["pyeti", "API key "], + "input": "A domain, hostname,IP, sha256,sha1, md5, url of MISP attribute.", + "output": "MISP attributes and objects fetched from the Yeti instances.", + "references": ["https://github.com/yeti-platform/yeti", "https://github.com/sebdraven/pyeti"], + "features": "This module add context and links between observables using yeti" +} diff --git a/documentation/website/export_mod/defender_endpoint_export.json b/documentation/website/export_mod/defender_endpoint_export.json new file mode 100644 index 0000000..ee45766 --- /dev/null +++ b/documentation/website/export_mod/defender_endpoint_export.json @@ -0,0 +1,11 @@ +{ + "description": "Defender for Endpoint KQL hunting query export module", + "requirements": [], + "features": "This module export an event as Defender for Endpoint KQL queries that can then be used in your own python3 or Powershell tool. If you are using Microsoft Sentinel, you can directly connect your MISP instance to Sentinel and then create queries using the `ThreatIntelligenceIndicator` table to match events against imported IOC.", + "references": [ + "https://docs.microsoft.com/en-us/windows/security/threat-protection/microsoft-defender-atp/advanced-hunting-schema-reference" + ], + "input": "MISP Event attributes", + "output": "Defender for Endpoint KQL queries", + "logo": "defender_endpoint.png" +} \ No newline at end of file diff --git a/documentation/website/export_mod/virustotal_collections.json b/documentation/website/export_mod/virustotal_collections.json new file mode 100644 index 0000000..1ecdbe9 --- /dev/null +++ b/documentation/website/export_mod/virustotal_collections.json @@ -0,0 +1,14 @@ +{ + "description": "Creates a VT Collection from an event iocs.", + "logo": "virustotal.png", + "requirements": [ + "An access to the VirusTotal API (apikey)." + ], + "input": "A domain, hash (md5, sha1, sha256 or sha512), hostname, url or IP address attribute.", + "output": "A VirusTotal collection in VT.", + "references": [ + "https://www.virustotal.com/", + "https://blog.virustotal.com/2021/11/introducing-virustotal-collections.html" + ], + "features": "This export module which takes advantage of a new endpoint in VT APIv3 to create VT Collections from IOCs contained in a MISP event. With this module users will be able to create a collection just using the Download as... button." +} diff --git a/documentation/website/import_mod/cof2misp.json b/documentation/website/import_mod/cof2misp.json new file mode 100644 index 0000000..cbbb0cc --- /dev/null +++ b/documentation/website/import_mod/cof2misp.json @@ -0,0 +1,12 @@ +{ + "description": "Passive DNS Common Output Format (COF) MISP importer", + "requirements": [ + "PyMISP" + ], + "features": "Takes as input a valid COF file or the output of the dnsdbflex utility and creates MISP objects for the input.", + "references": [ + "https://tools.ietf.org/id/draft-dulaunoy-dnsop-passive-dns-cof-08.html" + ], + "input": "Passive DNS output in Common Output Format (COF)", + "output": "MISP objects" +} diff --git a/documentation/website/import_mod/lastline_import.json b/documentation/website/import_mod/lastline_import.json index d89a433..775b9ce 100644 --- a/documentation/website/import_mod/lastline_import.json +++ b/documentation/website/import_mod/lastline_import.json @@ -1,5 +1,5 @@ { - "description": "Module to import and parse reports from Lastline analysis links.", + "description": "Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module.\n\nModule to import and parse reports from Lastline analysis links.", "logo": "lastline.png", "requirements": [], "input": "Link to a Lastline analysis.", diff --git a/etc/systemd/system/misp-modules.service b/etc/systemd/system/misp-modules.service index 99cd102..078ebec 100644 --- a/etc/systemd/system/misp-modules.service +++ b/etc/systemd/system/misp-modules.service @@ -7,7 +7,7 @@ User=www-data Group=www-data WorkingDirectory=/usr/local/src/misp-modules Environment="PATH=/var/www/MISP/venv/bin" -ExecStart=/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 -s +ExecStart=/var/www/MISP/venv/bin/misp-modules -l 127.0.0.1 [Install] WantedBy=multi-user.target diff --git a/misp_modules/__init__.py b/misp_modules/__init__.py index 440ad3f..b068d8a 100644 --- a/misp_modules/__init__.py +++ b/misp_modules/__init__.py @@ -41,14 +41,14 @@ try: from .modules import * # noqa HAS_PACKAGE_MODULES = True except Exception as e: - print(e) + logging.exception(e) HAS_PACKAGE_MODULES = False try: from .helpers import * # noqa HAS_PACKAGE_HELPERS = True except Exception as e: - print(e) + logging.exception(e) HAS_PACKAGE_HELPERS = False log = logging.getLogger('misp-modules') @@ -183,10 +183,9 @@ class QueryModule(tornado.web.RequestHandler): executor = ThreadPoolExecutor(nb_threads) @run_on_executor - def run_request(self, jsonpayload): - x = json.loads(jsonpayload) + def run_request(self, module, jsonpayload): log.debug('MISP QueryModule request {0}'.format(jsonpayload)) - response = mhandlers[x['module']].handler(q=jsonpayload) + response = mhandlers[module].handler(q=jsonpayload) return json.dumps(response) @tornado.gen.coroutine @@ -198,7 +197,7 @@ class QueryModule(tornado.web.RequestHandler): timeout = datetime.timedelta(seconds=int(dict_payload.get('timeout'))) else: timeout = datetime.timedelta(seconds=300) - response = yield tornado.gen.with_timeout(timeout, self.run_request(jsonpayload)) + response = yield tornado.gen.with_timeout(timeout, self.run_request(dict_payload['module'], jsonpayload)) self.write(response) except tornado.gen.TimeoutError: log.warning('Timeout on {} '.format(dict_payload['module'])) diff --git a/misp_modules/lib/__init__.py b/misp_modules/lib/__init__.py index c078cf7..dffa255 100644 --- a/misp_modules/lib/__init__.py +++ b/misp_modules/lib/__init__.py @@ -1,3 +1,4 @@ +import joe_mapping from .vt_graph_parser import * # noqa -all = ['joe_parser', 'lastline_api'] +all = ['joe_parser', 'lastline_api', 'cof2misp', 'qintel_helper'] diff --git a/misp_modules/modules/expansion/_vmray/__init__.py b/misp_modules/lib/_vmray/__init__.py similarity index 100% rename from misp_modules/modules/expansion/_vmray/__init__.py rename to misp_modules/lib/_vmray/__init__.py diff --git a/misp_modules/lib/_vmray/parser.py b/misp_modules/lib/_vmray/parser.py new file mode 100644 index 0000000..6e8d375 --- /dev/null +++ b/misp_modules/lib/_vmray/parser.py @@ -0,0 +1,1411 @@ +import base64 +import json +import re + +from abc import ABC, abstractmethod +from dataclasses import asdict, dataclass, field +from enum import Enum +from pathlib import PureWindowsPath +from typing import Any, Dict, Iterator, List, Optional, Tuple, Union + +from pymisp import MISPAttribute, MISPEvent, MISPObject + +from .rest_api import VMRayRESTAPI, VMRayRESTAPIError + + +USER_RE = re.compile(r".:.Users\\(.*?)\\", re.IGNORECASE) +DOC_RE = re.compile(r".:.DOCUME~1.\\(.*?)\\", re.IGNORECASE) +DOC_AND_SETTINGS_RE = re.compile(r".:.Documents and Settings\\(.*?)\\", re.IGNORECASE) +USERPROFILES = [USER_RE, DOC_RE, DOC_AND_SETTINGS_RE] + + +def classifications_to_str(classifications: List[str]) -> Optional[str]: + if classifications: + return "Classifications: " + ", ".join(classifications) + return None + + +def merge_lists(target: List[Any], source: List[Any]): + return list({*target, *source}) + + +@dataclass +class Attribute: + type: str + value: str + category: Optional[str] = None + comment: Optional[str] = None + to_ids: bool = False + + def __eq__(self, other: Dict[str, Any]) -> bool: + return asdict(self) == other + + +@dataclass +class Artifact: + is_ioc: bool + verdict: Optional[str] + + @abstractmethod + def to_attributes(self) -> Iterator[Attribute]: + raise NotImplementedError() + + @abstractmethod + def to_misp_object(self, tag: bool) -> MISPObject: + raise NotImplementedError() + + @abstractmethod + def merge(self, other: "Artifact") -> None: + raise NotImplementedError() + + @abstractmethod + def __eq__(self, other: "Artifact") -> bool: + raise NotImplementedError() + + def tag_artifact_attribute(self, attribute: MISPAttribute) -> None: + if self.is_ioc: + attribute.add_tag('vmray:artifact="IOC"') + + if self.verdict: + attribute.add_tag(f'vmray:verdict="{self.verdict}"') + + +@dataclass +class DomainArtifact(Artifact): + domain: str + sources: List[str] + ips: List[str] = field(default_factory=list) + classifications: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + value = self.domain + comment = ", ".join(self.sources) if self.sources else None + + attr = Attribute(type="domain", value=value, comment=comment) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="domain-ip") + + classifications = classifications_to_str(self.classifications) + attr = obj.add_attribute( + "domain", value=self.domain, to_ids=self.is_ioc, comment=classifications + ) + if tag: + self.tag_artifact_attribute(attr) + + for ip in self.ips: + obj.add_attribute("ip", value=ip, to_ids=self.is_ioc) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, DomainArtifact): + return + + self.ips = merge_lists(self.ips, other.ips) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, DomainArtifact): + return NotImplemented + + return self.domain == other.domain + + +@dataclass +class EmailArtifact(Artifact): + sender: Optional[str] + subject: Optional[str] + recipients: List[str] = field(default_factory=list) + classifications: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + if self.sender: + classifications = classifications_to_str(self.classifications) + yield Attribute( + type="email-src", value=self.sender, comment=classifications + ) + + if self.subject: + yield Attribute(type="email-subject", value=self.subject, to_ids=False) + + for recipient in self.recipients: + yield Attribute(type="email-dst", value=recipient, to_ids=False) + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="email") + + if self.sender: + classifications = classifications_to_str(self.classifications) + attr = obj.add_attribute( + "from", value=self.sender, to_ids=self.is_ioc, comment=classifications + ) + if tag: + self.tag_artifact_attribute(attr) + + if self.subject: + obj.add_attribute("subject", value=self.subject, to_ids=False) + + for recipient in self.recipients: + obj.add_attribute("to", value=recipient, to_ids=False) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, EmailArtifact): + return + + self.recipients = merge_lists(self.recipients, other.recipients) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, EmailArtifact): + return NotImplemented + + return self.sender == other.sender and self.subject == other.subject + + +@dataclass +class FileArtifact(Artifact): + filenames: List[str] + operations: List[str] + md5: str + sha1: str + sha256: str + ssdeep: str + imphash: Optional[str] + classifications: List[str] + size: Optional[int] + mimetype: Optional[str] = None + + def to_attributes(self) -> Iterator[Attribute]: + operations = ", ".join(self.operations) + comment = f"File operations: {operations}" + + for filename in self.filenames: + attr = Attribute(type="filename", value=filename, comment=comment) + yield attr + + for hash_type in ("md5", "sha1", "sha256", "ssdeep", "imphash"): + for filename in self.filenames: + value = getattr(self, hash_type) + if value is not None: + attr = Attribute( + type=f"filename|{hash_type}", + value=f"{filename}|{value}", + category="Payload delivery", + to_ids=True, + ) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="file") + + if self.size: + obj.add_attribute("size-in-bytes", value=self.size) + + classifications = classifications_to_str(self.classifications) + hashes = [ + ("md5", self.md5), + ("sha1", self.sha1), + ("sha256", self.sha256), + ("ssdeep", self.ssdeep), + ] + for (key, value) in hashes: + if not value: + continue + + attr = obj.add_attribute( + key, value=value, to_ids=self.is_ioc, comment=classifications + ) + + if tag: + self.tag_artifact_attribute(attr) + + if self.mimetype: + obj.add_attribute("mimetype", value=self.mimetype, to_ids=False) + + operations = None + if self.operations: + operations = "Operations: " + ", ".join(self.operations) + + for filename in self.filenames: + filename = PureWindowsPath(filename) + obj.add_attribute("filename", value=filename.name, comment=operations) + + fullpath = str(filename) + for regex in USERPROFILES: + fullpath = regex.sub(r"%USERPROFILE%\\", fullpath) + + obj.add_attribute("fullpath", fullpath) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, FileArtifact): + return + + self.filenames = merge_lists(self.filenames, other.filenames) + self.operations = merge_lists(self.operations, other.operations) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, FileArtifact): + return NotImplemented + + return self.sha256 == other.sha256 + + +@dataclass +class IpArtifact(Artifact): + ip: str + sources: List[str] + classifications: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + sources = ", ".join(self.sources) + comment = f"Found in: {sources}" + + attr = Attribute(type="ip-dst", value=self.ip, comment=comment) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="ip-port") + + classifications = classifications_to_str(self.classifications) + attr = obj.add_attribute( + "ip", value=self.ip, comment=classifications, to_ids=self.is_ioc + ) + if tag: + self.tag_artifact_attribute(attr) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, IpArtifact): + return + + self.sources = merge_lists(self.sources, other.sources) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, IpArtifact): + return NotImplemented + + return self.ip == other.ip + + +@dataclass +class MutexArtifact(Artifact): + name: str + operations: List[str] + classifications: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + operations = ", ".join(self.operations) + comment = f"Operations: {operations}" + + attr = Attribute(type="mutex", value=self.name, comment=comment) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="mutex") + + classifications = classifications_to_str(self.classifications) + attr = obj.add_attribute( + "name", + value=self.name, + category="External analysis", + to_ids=False, + comment=classifications, + ) + if tag: + self.tag_artifact_attribute(attr) + + operations = None + if self.operations: + operations = "Operations: " + ", ".join(self.operations) + obj.add_attribute("description", value=operations, to_ids=False) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, MutexArtifact): + return + + self.operations = merge_lists(self.operations, other.operations) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, MutexArtifact): + return NotImplemented + + return self.name == other.name + + +@dataclass +class ProcessArtifact(Artifact): + filename: str + pid: Optional[int] = None + parent_pid: Optional[int] = None + cmd_line: Optional[str] = None + operations: List[str] = field(default_factory=list) + classifications: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + process_desc = f"Process created: {self.filename}\nPID: {self.pid}" + classifications = classifications_to_str(self.classifications) + yield Attribute(type="text", value=process_desc, comment=classifications) + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="process") + + if self.pid: + obj.add_attribute("pid", value=self.pid, category="External analysis") + + if self.parent_pid: + obj.add_attribute( + "parent-pid", value=self.parent_pid, category="External analysis" + ) + + classifications = classifications_to_str(self.classifications) + name_attr = obj.add_attribute( + "name", self.filename, category="External analysis", comment=classifications + ) + + cmd_attr = obj.add_attribute("command-line", value=self.cmd_line) + + if tag: + self.tag_artifact_attribute(name_attr) + self.tag_artifact_attribute(cmd_attr) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, ProcessArtifact): + return + + self.operations = merge_lists(self.operations, other.operations) + self.classifications = merge_lists(self.classifications, other.classifications) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, ProcessArtifact): + return NotImplemented + + return self.filename == other.filename and self.cmd_line == other.cmd_line + + +@dataclass +class RegistryArtifact(Artifact): + key: str + operations: List[str] + + def to_attributes(self) -> Iterator[Attribute]: + operations = ", ".join(self.operations) + comment = f"Operations: {operations}" + + attr = Attribute(type="regkey", value=self.key, comment=comment) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="registry-key") + + operations = None + if self.operations: + operations = "Operations: " + ", ".join(self.operations) + + attr = obj.add_attribute( + "key", value=self.key, to_ids=self.is_ioc, comment=operations + ) + if tag: + self.tag_artifact_attribute(attr) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, RegistryArtifact): + return + + self.operations = merge_lists(self.operations, other.operations) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, RegistryArtifact): + return NotImplemented + + return self.key == other.key + + +@dataclass +class UrlArtifact(Artifact): + url: str + operations: List[str] + domain: Optional[str] = None + ips: List[str] = field(default_factory=list) + + def to_attributes(self) -> Iterator[Attribute]: + operations = ", ".join(self.operations) + comment = f"Operations: {operations}" + + attr = Attribute(type="url", value=self.url, comment=comment) + yield attr + + def to_misp_object(self, tag: bool) -> MISPObject: + obj = MISPObject(name="url") + + operations = None + if self.operations: + operations = "Operations: " + ", ".join(self.operations) + + attr = obj.add_attribute( + "url", + value=self.url, + comment=operations, + category="External analysis", + to_ids=False, + ) + if tag: + self.tag_artifact_attribute(attr) + + if self.domain: + obj.add_attribute( + "domain", self.domain, category="External analysis", to_ids=False + ) + + for ip in self.ips: + obj.add_attribute("ip", ip, category="External analysis", to_ids=False) + + return obj + + def merge(self, other: Artifact) -> None: + if not isinstance(other, UrlArtifact): + return + + self.ips = merge_lists(self.ips, other.ips) + self.operations = merge_lists(self.operations, other.operations) + + def __eq__(self, other: Artifact) -> bool: + if not isinstance(other, UrlArtifact): + return NotImplemented + + return self.url == other.url and self.domain == other.domain + + +@dataclass +class MitreAttack: + description: str + id: str + + def to_misp_galaxy(self) -> str: + return f'misp-galaxy:mitre-attack-pattern="{self.description} - {self.id}"' + + +@dataclass +class VTI: + category: str + operation: str + technique: str + score: int + + +class ReportVersion(Enum): + v1 = "v1" + v2 = "v2" + + +class VMRayParseError(Exception): + pass + + +class ReportParser(ABC): + @abstractmethod + def __init__(self, api: VMRayRESTAPI, analysis_id: int): + raise NotImplementedError() + + @abstractmethod + def is_static_report(self) -> bool: + raise NotImplementedError() + + @abstractmethod + def artifacts(self) -> Iterator[Artifact]: + raise NotImplementedError() + + @abstractmethod + def classifications(self) -> Optional[str]: + raise NotImplementedError() + + @abstractmethod + def details(self) -> Iterator[str]: + raise NotImplementedError() + + @abstractmethod + def mitre_attacks(self) -> Iterator[MitreAttack]: + raise NotImplementedError() + + @abstractmethod + def sandbox_type(self) -> str: + raise NotImplementedError() + + @abstractmethod + def score(self) -> str: + raise NotImplementedError() + + @abstractmethod + def vtis(self) -> Iterator[VTI]: + raise NotImplementedError() + + +class Summary(ReportParser): + def __init__( + self, analysis_id: int, api: VMRayRESTAPI = None, report: Dict[str, Any] = None + ): + self.analysis_id = analysis_id + + if report: + self.report = report + else: + data = api.call( + "GET", + f"/rest/analysis/{analysis_id}/archive/logs/summary.json", + raw_data=True, + ) + self.report = json.load(data) + + @staticmethod + def to_verdict(score: Union[int, str]) -> Optional[str]: + if isinstance(score, int): + if 0 <= score <= 24: + return "clean" + if 25 <= score <= 74: + return "suspicious" + if 75 <= score <= 100: + return "malicious" + return "n/a" + if isinstance(score, str): + score = score.lower() + if score in ("not_suspicious", "whitelisted"): + return "clean" + if score == "blacklisted": + return "malicious" + if score in ("not_available", "unknown"): + return "n/a" + return score + return None + + def is_static_report(self) -> bool: + return self.report["vti"]["vti_rule_type"] == "Static" + + def artifacts(self) -> Iterator[Artifact]: + artifacts = self.report["artifacts"] + domains = artifacts.get("domains", []) + for domain in domains: + classifications = domain.get("classifications", []) + is_ioc = domain.get("ioc", False) + verdict = self.to_verdict(domain.get("severity")) + ips = domain.get("ip_addresses", []) + artifact = DomainArtifact( + domain=domain["domain"], + sources=domain["sources"], + ips=ips, + classifications=classifications, + is_ioc=is_ioc, + verdict=verdict, + ) + yield artifact + + emails = artifacts.get("emails", []) + for email in emails: + sender = email.get("sender") + subject = email.get("subject") + verdict = self.to_verdict(email.get("severity")) + recipients = email.get("recipients", []) + classifications = email.get("classifications", []) + is_ioc = email.get("ioc", False) + + artifact = EmailArtifact( + sender=sender, + subject=subject, + verdict=verdict, + recipients=recipients, + classifications=classifications, + is_ioc=is_ioc, + ) + yield artifact + + files = artifacts.get("files", []) + for file_ in files: + if file_["filename"] is None: + continue + + filenames = [file_["filename"]] + if "filenames" in file_: + filenames += file_["filenames"] + + hashes = file_["hashes"] + classifications = file_.get("classifications", []) + operations = file_.get("operations", []) + is_ioc = file_.get("ioc", False) + mimetype = file_.get("mime_type") + verdict = self.to_verdict(file_.get("severity")) + + for hash_dict in hashes: + imp = hash_dict.get("imp_hash") + + artifact = FileArtifact( + filenames=filenames, + imphash=imp, + md5=hash_dict["md5_hash"], + ssdeep=hash_dict["ssdeep_hash"], + sha256=hash_dict["sha256_hash"], + sha1=hash_dict["sha1_hash"], + operations=operations, + classifications=classifications, + size=file_.get("file_size"), + is_ioc=is_ioc, + mimetype=mimetype, + verdict=verdict, + ) + yield artifact + + ips = artifacts.get("ips", []) + for ip in ips: + is_ioc = ip.get("ioc", False) + verdict = self.to_verdict(ip.get("severity")) + classifications = ip.get("classifications", []) + artifact = IpArtifact( + ip=ip["ip_address"], + sources=ip["sources"], + classifications=classifications, + verdict=verdict, + is_ioc=is_ioc, + ) + yield artifact + + mutexes = artifacts.get("mutexes", []) + for mutex in mutexes: + verdict = self.to_verdict(mutex.get("severity")) + is_ioc = mutex.get("ioc", False) + artifact = MutexArtifact( + name=mutex["mutex_name"], + operations=mutex["operations"], + classifications=[], + verdict=verdict, + is_ioc=is_ioc, + ) + yield artifact + + processes = artifacts.get("processes", []) + for process in processes: + classifications = process.get("classifications", []) + cmd_line = process.get("cmd_line") + name = process["image_name"] + verdict = self.to_verdict(process.get("severity")) + is_ioc = process.get("ioc", False) + + artifact = ProcessArtifact( + filename=name, + classifications=classifications, + cmd_line=cmd_line, + verdict=verdict, + is_ioc=is_ioc, + ) + yield artifact + + registry = artifacts.get("registry", []) + for reg in registry: + is_ioc = reg.get("ioc", False) + verdict = self.to_verdict(reg.get("severity")) + artifact = RegistryArtifact( + key=reg["reg_key_name"], + operations=reg["operations"], + verdict=verdict, + is_ioc=is_ioc, + ) + yield artifact + + urls = artifacts.get("urls", []) + for url in urls: + ips = url.get("ip_addresses", []) + is_ioc = url.get("ioc", False) + verdict = self.to_verdict(url.get("severity")) + + artifact = UrlArtifact( + url=url["url"], + operations=url["operations"], + ips=ips, + is_ioc=is_ioc, + verdict=verdict, + ) + yield artifact + + def classifications(self) -> Optional[str]: + classifications = self.report["classifications"] + if classifications: + str_classifications = ", ".join(classifications) + return f"Classifications: {str_classifications}" + return None + + def details(self) -> Iterator[str]: + details = self.report["analysis_details"] + execution_successful = details["execution_successful"] + termination_reason = details["termination_reason"] + result = details["result_str"] + + if self.analysis_id == 0: + analysis = "" + else: + analysis = f" {self.analysis_id}" + + yield f"Analysis{analysis}: execution_successful: {execution_successful}" + yield f"Analysis{analysis}: termination_reason: {termination_reason}" + yield f"Analysis{analysis}: result: {result}" + + def mitre_attacks(self) -> Iterator[MitreAttack]: + mitre_attack = self.report["mitre_attack"] + techniques = mitre_attack.get("techniques", []) + + for technique in techniques: + mitre_attack = MitreAttack( + description=technique["description"], id=technique["id"] + ) + yield mitre_attack + + def sandbox_type(self) -> str: + vm_name = self.report["vm_and_analyzer_details"]["vm_name"] + sample_type = self.report["sample_details"]["sample_type"] + return f"{vm_name} | {sample_type}" + + def score(self) -> str: + vti_score = self.report["vti"]["vti_score"] + return self.to_verdict(vti_score) + + def vtis(self) -> Iterator[VTI]: + try: + vtis = self.report["vti"]["vti_rule_matches"] + except KeyError: + vtis = [] + + for vti in vtis: + new_vti = VTI( + category=vti["category_desc"], + operation=vti["operation_desc"], + technique=vti["technique_desc"], + score=vti["rule_score"], + ) + + yield new_vti + + +class SummaryV2(ReportParser): + def __init__( + self, analysis_id: int, api: VMRayRESTAPI = None, report: Dict[str, Any] = None + ): + self.analysis_id = analysis_id + + if report: + self.report = report + else: + self.api = api + data = api.call( + "GET", + f"/rest/analysis/{analysis_id}/archive/logs/summary_v2.json", + raw_data=True, + ) + self.report = json.load(data) + + def _resolve_refs( + self, data: Union[List[Dict[str, Any]], Dict[str, Any]] + ) -> Iterator[Dict[str, Any]]: + if not data: + return [] + + if isinstance(data, dict): + data = [data] + + for ref in data: + yield self._resolve_ref(ref) + + def _resolve_ref(self, data: Dict[str, Any]) -> Dict[str, Any]: + if data == {}: + return {} + + if data["_type"] != "reference" or data["source"] != "logs/summary_v2.json": + return {} + + resolved_ref = self.report + paths = data["path"] + for path_part in paths: + try: + resolved_ref = resolved_ref[path_part] + except KeyError: + return {} + + return resolved_ref + + @staticmethod + def convert_verdict(verdict: Optional[str]) -> str: + if verdict == "not_available" or not verdict: + return "n/a" + + return verdict + + def is_static_report(self) -> bool: + return self.report["vti"]["score_type"] == "static" + + def artifacts(self) -> Iterator[Artifact]: + artifacts = self.report["artifacts"] + + ref_domains = artifacts.get("ref_domains", []) + for domain in self._resolve_refs(ref_domains): + classifications = domain.get("classifications", []) + artifact = DomainArtifact( + domain=domain["domain"], + sources=domain["sources"], + classifications=classifications, + is_ioc=domain["is_ioc"], + verdict=domain["verdict"], + ) + + ref_ip_addresses = domain.get("ref_ip_addresses", []) + if not ref_ip_addresses: + continue + + for ip_address in self._resolve_refs(ref_ip_addresses): + artifact.ips.append(ip_address["ip_address"]) + + yield artifact + + ref_emails = artifacts.get("ref_emails", []) + for email in self._resolve_refs(ref_emails): + sender = email.get("sender") + subject = email.get("subject") + recipients = email.get("recipients", []) + verdict = email["verdict"] + is_ioc = email["is_ioc"] + classifications = email.get("classifications", []) + + artifact = EmailArtifact( + sender=sender, + subject=subject, + recipients=recipients, + classifications=classifications, + verdict=verdict, + is_ioc=is_ioc, + ) + + yield artifact + + ref_files = artifacts.get("ref_files", []) + for file_ in self._resolve_refs(ref_files): + filenames = [] + + if "ref_filenames" in file_: + for filename in self._resolve_refs(file_["ref_filenames"]): + if not filename: + continue + filenames.append(filename["filename"]) + + artifact = FileArtifact( + operations=file_.get("operations", []), + md5=file_["hash_values"]["md5"], + sha1=file_["hash_values"]["sha1"], + sha256=file_["hash_values"]["sha256"], + ssdeep=file_["hash_values"]["ssdeep"], + imphash=None, + mimetype=file_.get("mime_type"), + filenames=filenames, + is_ioc=file_["is_ioc"], + classifications=file_.get("classifications", []), + size=file_["size"], + verdict=file_["verdict"], + ) + yield artifact + + ref_ip_addresses = artifacts.get("ref_ip_addresses", []) + for ip in self._resolve_refs(ref_ip_addresses): + classifications = ip.get("classifications", []) + verdict = ip["verdict"] + is_ioc = ip["is_ioc"] + artifact = IpArtifact( + ip=ip["ip_address"], + sources=ip["sources"], + classifications=classifications, + verdict=verdict, + is_ioc=is_ioc, + ) + yield artifact + + ref_mutexes = artifacts.get("ref_mutexes", []) + for mutex in self._resolve_refs(ref_mutexes): + is_ioc = mutex["is_ioc"] + classifications = mutex.get("classifications", []) + artifact = MutexArtifact( + name=mutex["name"], + operations=mutex["operations"], + verdict=mutex["verdict"], + classifications=classifications, + is_ioc=is_ioc, + ) + yield artifact + + ref_processes = artifacts.get("ref_processes", []) + for process in self._resolve_refs(ref_processes): + cmd_line = process.get("cmd_line") + classifications = process.get("classifications", []) + verdict = process.get("verdict") + artifact = ProcessArtifact( + pid=process["os_pid"], + parent_pid=process["origin_monitor_id"], + filename=process["filename"], + is_ioc=process["is_ioc"], + cmd_line=cmd_line, + classifications=classifications, + verdict=verdict, + ) + yield artifact + + ref_registry_records = artifacts.get("ref_registry_records", []) + for reg in self._resolve_refs(ref_registry_records): + artifact = RegistryArtifact( + key=reg["reg_key_name"], + operations=reg["operations"], + is_ioc=reg["is_ioc"], + verdict=reg["verdict"], + ) + yield artifact + + url_refs = artifacts.get("ref_urls", []) + for url in self._resolve_refs(url_refs): + domain = None + ref_domain = url.get("ref_domain", {}) + if ref_domain: + domain = self._resolve_ref(ref_domain)["domain"] + + ips = [] + ref_ip_addresses = url.get("ref_ip_addresses", []) + for ip_address in self._resolve_refs(ref_ip_addresses): + ips.append(ip_address["ip_address"]) + + artifact = UrlArtifact( + url=url["url"], + operations=url["operations"], + is_ioc=url["is_ioc"], + domain=domain, + ips=ips, + verdict=url["verdict"], + ) + yield artifact + + def classifications(self) -> Optional[str]: + try: + classifications = ", ".join(self.report["classifications"]) + return f"Classifications: {classifications}" + except KeyError: + return None + + def details(self) -> Iterator[str]: + details = self.report["analysis_metadata"] + is_execution_successful = details["is_execution_successful"] + termination_reason = details["termination_reason"] + result = details["result_str"] + + yield f"Analysis {self.analysis_id}: execution_successful: {is_execution_successful}" + yield f"Analysis {self.analysis_id}: termination_reason: {termination_reason}" + yield f"Analysis {self.analysis_id}: result: {result}" + + def mitre_attacks(self) -> Iterator[MitreAttack]: + mitre_attack = self.report["mitre_attack"] + techniques = mitre_attack["v4"]["techniques"] + + for technique_id, technique in techniques.items(): + mitre_attack = MitreAttack( + description=technique["description"], + id=technique_id.replace("technique_", ""), + ) + yield mitre_attack + + def sandbox_type(self) -> str: + vm_information = self.report["virtual_machine"]["description"] + sample_type = self.report["analysis_metadata"]["sample_type"] + return f"{vm_information} | {sample_type}" + + def score(self) -> str: + verdict = self.report["analysis_metadata"]["verdict"] + return self.convert_verdict(verdict) + + def vtis(self) -> Iterator[VTI]: + if "matches" not in self.report["vti"]: + return + + vti_matches = self.report["vti"]["matches"] + for vti in vti_matches.values(): + new_vti = VTI( + category=vti["category_desc"], + operation=vti["operation_desc"], + technique=vti["technique_desc"], + score=vti["analysis_score"], + ) + + yield new_vti + + +class VMRayParser: + def __init__(self) -> None: + # required for api import + self.api: Optional[VMRayRESTAPI] = None + self.sample_id: Optional[int] = None + + # required for file import + self.report: Optional[Dict[str, Any]] = None + self.report_name: Optional[str] = None + self.include_report = False + + # required by API import and file import + self.report_version = ReportVersion.v2 + + self.use_misp_object = True + self.ignore_analysis_finished = False + self.tag_objects = True + + self.include_analysis_id = True + self.include_vti_details = True + self.include_iocs = True + self.include_all_artifacts = False + self.include_analysis_details = True + + # a new event if we use misp objects + self.event = MISPEvent() + + # new attributes if we don't use misp objects + self.attributes: List[Attribute] = [] + + def from_api(self, config: Dict[str, Any]) -> None: + url = self._read_config_key(config, "url") + api_key = self._read_config_key(config, "apikey") + + try: + self.sample_id = int(self._read_config_key(config, "Sample ID")) + except ValueError: + raise VMRayParseError("Could not convert sample id to integer.") + + self.api = VMRayRESTAPI(url, api_key, False) + + self.ignore_analysis_finished = self._config_from_string(config.get("ignore_analysis_finished")) + self._setup_optional_config(config) + self.report_version = self._get_report_version() + + def from_base64_string( + self, config: Dict[str, Any], data: str, filename: str + ) -> None: + """ read base64 encoded summary json """ + + buffer = base64.b64decode(data) + self.report = json.loads(buffer) + self.report_name = filename + + if "analysis_details" in self.report: + self.report_version = ReportVersion.v1 + elif "analysis_metadata" in self.report: + self.report_version = ReportVersion.v2 + else: + raise VMRayParseError("Uploaded file is not a summary.json") + + self._setup_optional_config(config) + self.include_report = bool(int(config.get("Attach Report", "0"))) + + def _setup_optional_config(self, config: Dict[str, Any]) -> None: + self.include_analysis_id = bool(int(config.get("Analysis ID", "1"))) + self.include_vti_details = bool(int(config.get("VTI", "1"))) + self.include_iocs = bool(int(config.get("IOCs", "1"))) + self.include_all_artifacts = bool(int(config.get("Artifacts", "0"))) + self.include_analysis_details = bool(int(config.get("Analysis Details", "1"))) + + self.use_misp_object = not self._config_from_string( + config.get("disable_misp_objects") + ) + self.tag_objects = not self._config_from_string(config.get("disable_tags")) + + @staticmethod + def _config_from_string(text: Optional[str]) -> bool: + if not text: + return False + + text = text.lower() + return text in ("yes", "true") + + @staticmethod + def _read_config_key(config: Dict[str, Any], key: str) -> str: + try: + value = config[key] + return value + except KeyError: + raise VMRayParseError(f"VMRay config is missing a value for `{key}`.") + + @staticmethod + def _analysis_score_to_taxonomies(analysis_score: int) -> Optional[str]: + mapping = { + -1: "-1", + 1: "1/5", + 2: "2/5", + 3: "3/5", + 4: "4/5", + 5: "5/5", + } + + try: + return mapping[analysis_score] + except KeyError: + return None + + def _get_report_version(self) -> ReportVersion: + info = self._vmary_api_call("/rest/system_info") + if info["version_major"] >= 4: + return ReportVersion.v2 + + # version 3.2 an less do not tag artifacts as ICOs + # so we extract all artifacts + if info["version_major"] == 3 and info["version_minor"] < 3: + self.include_all_artifacts = True + return ReportVersion.v1 + + def _vmary_api_call( + self, api_path: str, params: Dict[str, Any] = None, raw_data: bool = False + ) -> Union[Dict[str, Any], bytes]: + try: + return self.api.call("GET", api_path, params=params, raw_data=raw_data) + except (VMRayRESTAPIError, ValueError) as exc: + raise VMRayParseError(str(exc)) + + def _get_analysis(self) -> Dict[str, Any]: + return self._vmary_api_call(f"/rest/analysis/sample/{self.sample_id}") + + def _analysis_finished(self) -> bool: + result = self._vmary_api_call(f"/rest/submission/sample/{self.sample_id}") + + all_finished = [] + for submission in result: + finished = submission["submission_finished"] + all_finished.append(finished) + + return all(all_finished) + + def _online_reports(self) -> Iterator[Tuple[ReportParser, str]]: + # check if sample id exists + try: + self._vmary_api_call(f"/rest/sample/{self.sample_id}") + except VMRayRESTAPIError: + raise VMRayParseError( + f"Could not find sample id `{self.sample_id}` on server." + ) + + # check if all submission are finished + if not self.ignore_analysis_finished and not self._analysis_finished(): + raise VMRayParseError( + f"Not all analysis for `{self.sample_id}` are finished. " + "Try it again in a few minutes." + ) + + analysis_results = self._get_analysis() + for analysis in analysis_results: + analysis_id = analysis["analysis_id"] + permalink = analysis["analysis_webif_url"] + + # the summary json could not exist, due to a VM error + try: + if self.report_version == ReportVersion.v1: + report_parser = Summary(api=self.api, analysis_id=analysis_id) + else: + report_parser = SummaryV2(api=self.api, analysis_id=analysis_id) + except VMRayRESTAPIError: + continue + + yield report_parser, permalink + + def _offline_report(self) -> ReportParser: + if self.report_version == ReportVersion.v1: + analysis_id = 0 + return Summary(report=self.report, analysis_id=analysis_id) + else: + analysis_id = self.report["analysis_metadata"]["analysis_id"] + return SummaryV2(report=self.report, analysis_id=analysis_id) + + def _reports(self) -> Iterator[Tuple[ReportParser, Optional[str]]]: + if self.report: + yield self._offline_report(), None + else: + yield from self._online_reports() + + def _get_sample_verdict(self) -> Optional[str]: + if self.report: + if self.report_version == ReportVersion.v2: + verdict = SummaryV2.convert_verdict( + self.report["analysis_metadata"]["verdict"] + ) + return verdict + return None + + data = self._vmary_api_call(f"/rest/sample/{self.sample_id}") + if "sample_verdict" in data: + verdict = SummaryV2.convert_verdict(data["sample_verdict"]) + return verdict + + if "sample_severity" in data: + verdict = Summary.to_verdict(data["sample_severity"]) + return verdict + + return None + + def parse(self) -> None: + """ Convert analysis results to MISP Objects """ + + if self.use_misp_object: + self.parse_as_misp_object() + else: + self.parse_as_attributes() + + def parse_as_attributes(self) -> None: + """ + Parse report as attributes + This method is compatible with the implementation provided + by Koen Van Impe + """ + + for report, permalink in self._reports(): + if report.is_static_report(): + continue + + if self.include_analysis_details: + for detail in report.details(): + attr = Attribute(type="text", value=detail) + self.attributes.append(attr) + + classifications = report.classifications() + if classifications: + attr = Attribute(type="text", value=classifications) + self.attributes.append(attr) + + if self.include_vti_details: + for vti in report.vtis(): + attr = Attribute(type="text", value=vti.operation) + self.attributes.append(attr) + + for artifact in report.artifacts(): + if self.include_all_artifacts or ( + self.include_iocs and artifact.is_ioc + ): + for attr in artifact.to_attributes(): + self.attributes.append(attr) + + if self.include_analysis_id and permalink: + attr = Attribute(type="link", value=permalink) + self.attributes.append(attr) + + def parse_as_misp_object(self): + mitre_attacks = [] + vtis = [] + artifacts = [] + + # add sandbox signature + sb_sig = MISPObject(name="sb-signature") + sb_sig.add_attribute("software", "VMRay Platform") + + for report, permalink in self._reports(): + if report.is_static_report(): + continue + + # create sandbox object + obj = MISPObject(name="sandbox-report") + obj.add_attribute("on-premise-sandbox", "vmray") + + if permalink: + obj.add_attribute("permalink", permalink) + + if self.include_report and self.report: + report_data = base64.b64encode( + json.dumps(self.report, indent=2).encode("utf-8") + ).decode("utf-8") + obj.add_attribute( + "sandbox-file", value=self.report_name, data=report_data + ) + + score = report.score() + attr_score = obj.add_attribute("score", score) + + if self.tag_objects: + attr_score.add_tag(f'vmray:verdict="{score}"') + + sandbox_type = report.sandbox_type() + obj.add_attribute("sandbox-type", sandbox_type) + + classifications = report.classifications() + if classifications: + obj.add_attribute("results", classifications) + + self.event.add_object(obj) + + if self.include_vti_details: + for vti in report.vtis(): + if vti not in vtis: + vtis.append(vti) + + for artifact in report.artifacts(): + if self.include_all_artifacts or ( + self.include_iocs and artifact.is_ioc + ): + if artifact not in artifacts: + artifacts.append(artifact) + else: + idx = artifacts.index(artifact) + dup = artifacts[idx] + dup.merge(artifact) + + for mitre_attack in report.mitre_attacks(): + if mitre_attack not in mitre_attacks: + mitre_attacks.append(mitre_attack) + + # process VTI's + for vti in vtis: + vti_text = f"{vti.category}: {vti.operation}. {vti.technique}" + vti_attr = sb_sig.add_attribute("signature", value=vti_text) + + if self.tag_objects: + value = self._analysis_score_to_taxonomies(vti.score) + if value: + vti_attr.add_tag(f'vmray:vti_analysis_score="{value}"') + + self.event.add_object(sb_sig) + + # process artifacts + for artifact in artifacts: + artifact_obj = artifact.to_misp_object(self.tag_objects) + self.event.add_object(artifact_obj) + + # tag event with Mitre Att&ck + for mitre_attack in mitre_attacks: + self.event.add_tag(mitre_attack.to_misp_galaxy()) + + # tag event + if self.tag_objects: + verdict = self._get_sample_verdict() + if verdict: + self.event.add_tag(f'vmray:verdict="{verdict}"') + + def to_json(self) -> Dict[str, Any]: + """ Convert parsed results into JSON """ + + if not self.use_misp_object: + results = [] + + # remove duplicates + for attribute in self.attributes: + if attribute not in results: + results.append(asdict(attribute)) + + # add attributes to event + for attribute in results: + self.event.add_attribute(**attribute) + + self.event.run_expansions() + event = json.loads(self.event.to_json()) + + return {"results": event} diff --git a/misp_modules/modules/import_mod/_vmray/vmray_rest_api.py b/misp_modules/lib/_vmray/rest_api.py similarity index 100% rename from misp_modules/modules/import_mod/_vmray/vmray_rest_api.py rename to misp_modules/lib/_vmray/rest_api.py diff --git a/misp_modules/lib/cof2misp/LICENSE-2.0.txt b/misp_modules/lib/cof2misp/LICENSE-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/misp_modules/lib/cof2misp/LICENSE-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/misp_modules/modules/import_mod/_vmray/__init__.py b/misp_modules/lib/cof2misp/__init__.py similarity index 100% rename from misp_modules/modules/import_mod/_vmray/__init__.py rename to misp_modules/lib/cof2misp/__init__.py diff --git a/misp_modules/lib/cof2misp/cof.py b/misp_modules/lib/cof2misp/cof.py new file mode 100644 index 0000000..d7420a0 --- /dev/null +++ b/misp_modules/lib/cof2misp/cof.py @@ -0,0 +1,165 @@ +""" +Common Output Format for passive DNS library. + +Copyright 2021: Farsight Security (https://www.farsightsecurity.com/) + +Author: Aaron Kaplan + +Released under the Apache 2.0 license. +See: https://www.apache.org/licenses/LICENSE-2.0.txt + +""" + +import ipaddress +import sys +import ndjson + + +def is_valid_ip(ip: str) -> bool: + """Check if an IP address given as string would be convertible to + an ipaddress object (and thus if it is a valid IP). + + Returns + -------- + True on success, False on validation failure. + """ + + try: + ipaddress.ip_address(ip) + except Exception as ex: + print("is_valid_ip(%s) returned False. Reason: %s" % (ip, str(ex)), file = sys.stderr) + return False + return True + + +def is_cof_valid_strict(d: dict) -> bool: + """Check the COF - do the full JSON schema validation. + + Returns + -------- + True on success, False on validation failure. + """ + return True # FIXME + + +def is_cof_valid_simple(d: dict) -> bool: + """Check MANDATORY fields according to COF - simple check, do not do the full JSON schema validation. + + Returns + -------- + True on success, False on validation failure. + """ + + if "rrname" not in d: + print("Missing MANDATORY field 'rrname'", file = sys.stderr) + return False + if not isinstance(d['rrname'], str): + print("Type error: 'rrname' is not a JSON string", file = sys.stderr) + return False + if "rrtype" not in d: + print("Missing MANDATORY field 'rrtype'", file = sys.stderr) + return False + if not isinstance(d['rrtype'], str): + print("Type error: 'rrtype' is not a JSON string", file = sys.stderr) + return False + if "rdata" not in d: + print("Missing MANDATORY field 'rdata'", file = sys.stderr) + return False + if "rdata" not in d: + print("Missing MANDATORY field 'rdata'", file = sys.stderr) + return False + if not isinstance(d['rdata'], str) and not isinstance(d['rdata'], list): + print("'rdata' is not a list and not a string.", file = sys.stderr) + return False + if not ("time_first" in d and "time_last" in d) or ("zone_time_first" in d and "zone_time_last" in d): + print("We are missing EITHER ('first_seen' and 'last_seen') OR ('zone_time_first' and zone_time_last') fields", + file = sys.stderr) + return False + # currently we don't check the OPTIONAL fields. Sorry... to be done later. + return True + + +def validate_cof(d: dict, strict=True) -> bool: + """Validate an input passive DNS COF (given as dict). + strict might be set to False in order to loosen the checking. + With strict==True, a full JSON Schema validation will happen. + + + Returns + -------- + True on success, False on validation failure. + """ + if not strict: + return is_cof_valid_simple(d) + else: + return is_cof_valid_strict(d) + + +def validate_dnsdbflex(d: dict, strict=True) -> bool: + """ + Validate if dict d is valid dnsdbflex. It should looks like this: + { "rrtype": , "rrname": } + """ + if "rrname" not in d: + print("Missing MANDATORY field 'rrname'", file = sys.stderr) + return False + if not isinstance(d['rrname'], str): + print("Type error: 'rrname' is not a JSON string", file = sys.stderr) + return False + if "rrtype" not in d: + print("Missing MANDATORY field 'rrtype'", file = sys.stderr) + return False + if not isinstance(d['rrtype'], str): + print("Type error: 'rrtype' is not a JSON string", file = sys.stderr) + return False + return True + + +if __name__ == "__main__": + # simple, poor man's unit tests. + + print(80 * "=", file = sys.stderr) + print("Unit Tests:", file = sys.stderr) + assert not is_valid_ip("a.2.3.4") + assert is_valid_ip("99.88.77.6") + assert is_valid_ip("2a0c:88:77:6::1") + + # COF validation + print(80 * "=", file = sys.stderr) + print("COF unit tests....", file = sys.stderr) + + mock_input = """{"count":1909,"rdata":["cpa.circl.lu"],"rrname":"www.circl.lu","rrtype":"CNAME","time_first":"1315586409","time_last":"1449566799"} +{"count":2560,"rdata":["cpab.circl.lu"],"rrname":"www.circl.lu","rrtype":"CNAME","time_first":"1449584660","time_last":"1617676151"}""" + + i = 0 + for entry in ndjson.loads(mock_input): + retval = validate_cof(entry, strict = False) + assert retval + print("line %d is valid: %s" % (i, retval)) + i += 1 + + test2 = '{"count": 2, "time_first": 1619556027, "time_last": 1619556034, "rrname": "westernunion.com.ph.unblock-all.com.beta.opera-mini.net.", "rrtype": "A", "bailiwick": "beta.opera-mini.net.", "rdata": ["185.26.181.253"]}' + for entry in ndjson.loads(test2): + assert validate_cof(entry) + + # dnsdbflex validation + print(80 * "=", file = sys.stderr) + print("dnsdbflex unit tests....", file = sys.stderr) + + mock_input = """{"rrname":"labs.deep-insights.ai.","rrtype":"A"} +{"rrname":"www.deep-insights.ca.","rrtype":"CNAME"} +{"rrname":"mail.deep-insights.ca.","rrtype":"CNAME"} +{"rrname":"cpanel.deep-insights.ca.","rrtype":"A"} +{"rrname":"webdisk.deep-insights.ca.","rrtype":"A"} +{"rrname":"webmail.deep-insights.ca.","rrtype":"A"}""" + + i = 0 + for entry in ndjson.loads(mock_input): + retval = validate_dnsdbflex(entry, strict = False) + assert retval + print("dnsdbflex line %d is valid: %s" % (i, retval)) + i += 1 + + + print(80 * "=", file = sys.stderr) + print("Unit Tests DONE", file = sys.stderr) diff --git a/misp_modules/lib/joe_mapping.py b/misp_modules/lib/joe_mapping.py new file mode 100644 index 0000000..eda961e --- /dev/null +++ b/misp_modules/lib/joe_mapping.py @@ -0,0 +1,114 @@ +arch_type_mapping = { + 'ANDROID': 'parse_apk', + 'LINUX': 'parse_elf', + 'WINDOWS': 'parse_pe' +} +domain_object_mapping = { + '@ip': {'type': 'ip-dst', 'object_relation': 'ip'}, + '@name': {'type': 'domain', 'object_relation': 'domain'} +} +dropped_file_mapping = { + '@entropy': {'type': 'float', 'object_relation': 'entropy'}, + '@file': {'type': 'filename', 'object_relation': 'filename'}, + '@size': {'type': 'size-in-bytes', 'object_relation': 'size-in-bytes'}, + '@type': {'type': 'mime-type', 'object_relation': 'mimetype'} +} +dropped_hash_mapping = { + 'MD5': 'md5', + 'SHA': 'sha1', + 'SHA-256': 'sha256', + 'SHA-512': 'sha512' +} +elf_object_mapping = { + 'epaddr': 'entrypoint-address', + 'machine': 'arch', + 'osabi': 'os_abi' +} +elf_section_flags_mapping = { + 'A': 'ALLOC', + 'I': 'INFO_LINK', + 'M': 'MERGE', + 'S': 'STRINGS', + 'T': 'TLS', + 'W': 'WRITE', + 'X': 'EXECINSTR' +} +file_object_fields = ( + 'filename', + 'md5', + 'sha1', + 'sha256', + 'sha512', + 'ssdeep' +) +file_object_mapping = { + 'entropy': {'type': 'float', 'object_relation': 'entropy'}, + 'filesize': {'type': 'size-in-bytes', 'object_relation': 'size-in-bytes'}, + 'filetype': {'type': 'mime-type', 'object_relation': 'mimetype'} +} +file_references_mapping = { + 'fileCreated': 'creates', + 'fileDeleted': 'deletes', + 'fileMoved': 'moves', + 'fileRead': 'reads', + 'fileWritten': 'writes' +} +network_behavior_fields = ('srcip', 'dstip', 'srcport', 'dstport') +network_connection_object_mapping = { + 'srcip': {'type': 'ip-src', 'object_relation': 'ip-src'}, + 'dstip': {'type': 'ip-dst', 'object_relation': 'ip-dst'}, + 'srcport': {'type': 'port', 'object_relation': 'src-port'}, + 'dstport': {'type': 'port', 'object_relation': 'dst-port'} +} +pe_object_fields = { + 'entrypoint': {'type': 'text', 'object_relation': 'entrypoint-address'}, + 'imphash': {'type': 'imphash', 'object_relation': 'imphash'} +} +pe_object_mapping = { + 'CompanyName': 'company-name', + 'FileDescription': 'file-description', + 'FileVersion': 'file-version', + 'InternalName': 'internal-filename', + 'LegalCopyright': 'legal-copyright', + 'OriginalFilename': 'original-filename', + 'ProductName': 'product-filename', + 'ProductVersion': 'product-version', + 'Translation': 'lang-id' +} +pe_section_object_mapping = { + 'characteristics': {'type': 'text', 'object_relation': 'characteristic'}, + 'entropy': {'type': 'float', 'object_relation': 'entropy'}, + 'name': {'type': 'text', 'object_relation': 'name'}, + 'rawaddr': {'type': 'hex', 'object_relation': 'offset'}, + 'rawsize': {'type': 'size-in-bytes', 'object_relation': 'size-in-bytes'}, + 'virtaddr': {'type': 'hex', 'object_relation': 'virtual_address'}, + 'virtsize': {'type': 'size-in-bytes', 'object_relation': 'virtual_size'} +} +process_object_fields = { + 'cmdline': 'command-line', + 'name': 'name', + 'parentpid': 'parent-pid', + 'pid': 'pid', + 'path': 'current-directory' +} +protocols = { + 'tcp': 4, + 'udp': 4, + 'icmp': 3, + 'http': 7, + 'https': 7, + 'ftp': 7 +} +registry_references_mapping = { + 'keyValueCreated': 'creates', + 'keyValueModified': 'modifies' +} +regkey_object_mapping = { + 'name': {'type': 'text', 'object_relation': 'name'}, + 'newdata': {'type': 'text', 'object_relation': 'data'}, + 'path': {'type': 'regkey', 'object_relation': 'key'} +} +signerinfo_object_mapping = { + 'sigissuer': {'type': 'text', 'object_relation': 'issuer'}, + 'version': {'type': 'text', 'object_relation': 'version'} +} diff --git a/misp_modules/lib/joe_parser.py b/misp_modules/lib/joe_parser.py index 22a4918..e701ff3 100644 --- a/misp_modules/lib/joe_parser.py +++ b/misp_modules/lib/joe_parser.py @@ -1,53 +1,15 @@ # -*- coding: utf-8 -*- +import json from collections import defaultdict from datetime import datetime from pymisp import MISPAttribute, MISPEvent, MISPObject -import json - - -arch_type_mapping = {'ANDROID': 'parse_apk', 'LINUX': 'parse_elf', 'WINDOWS': 'parse_pe'} -domain_object_mapping = {'@ip': ('ip-dst', 'ip'), '@name': ('domain', 'domain')} -dropped_file_mapping = {'@entropy': ('float', 'entropy'), - '@file': ('filename', 'filename'), - '@size': ('size-in-bytes', 'size-in-bytes'), - '@type': ('mime-type', 'mimetype')} -dropped_hash_mapping = {'MD5': 'md5', 'SHA': 'sha1', 'SHA-256': 'sha256', 'SHA-512': 'sha512'} -elf_object_mapping = {'epaddr': 'entrypoint-address', 'machine': 'arch', 'osabi': 'os_abi'} -elf_section_flags_mapping = {'A': 'ALLOC', 'I': 'INFO_LINK', 'M': 'MERGE', - 'S': 'STRINGS', 'T': 'TLS', 'W': 'WRITE', - 'X': 'EXECINSTR'} -file_object_fields = ['filename', 'md5', 'sha1', 'sha256', 'sha512', 'ssdeep'] -file_object_mapping = {'entropy': ('float', 'entropy'), - 'filesize': ('size-in-bytes', 'size-in-bytes'), - 'filetype': ('mime-type', 'mimetype')} -file_references_mapping = {'fileCreated': 'creates', 'fileDeleted': 'deletes', - 'fileMoved': 'moves', 'fileRead': 'reads', 'fileWritten': 'writes'} -network_behavior_fields = ('srcip', 'dstip', 'srcport', 'dstport') -network_connection_object_mapping = {'srcip': ('ip-src', 'ip-src'), 'dstip': ('ip-dst', 'ip-dst'), - 'srcport': ('port', 'src-port'), 'dstport': ('port', 'dst-port')} -pe_object_fields = {'entrypoint': ('text', 'entrypoint-address'), - 'imphash': ('imphash', 'imphash')} -pe_object_mapping = {'CompanyName': 'company-name', 'FileDescription': 'file-description', - 'FileVersion': 'file-version', 'InternalName': 'internal-filename', - 'LegalCopyright': 'legal-copyright', 'OriginalFilename': 'original-filename', - 'ProductName': 'product-filename', 'ProductVersion': 'product-version', - 'Translation': 'lang-id'} -pe_section_object_mapping = {'characteristics': ('text', 'characteristic'), - 'entropy': ('float', 'entropy'), - 'name': ('text', 'name'), 'rawaddr': ('hex', 'offset'), - 'rawsize': ('size-in-bytes', 'size-in-bytes'), - 'virtaddr': ('hex', 'virtual_address'), - 'virtsize': ('size-in-bytes', 'virtual_size')} -process_object_fields = {'cmdline': 'command-line', 'name': 'name', - 'parentpid': 'parent-pid', 'pid': 'pid', - 'path': 'current-directory'} -protocols = {'tcp': 4, 'udp': 4, 'icmp': 3, - 'http': 7, 'https': 7, 'ftp': 7} -registry_references_mapping = {'keyValueCreated': 'creates', 'keyValueModified': 'modifies'} -regkey_object_mapping = {'name': ('text', 'name'), 'newdata': ('text', 'data'), - 'path': ('regkey', 'key')} -signerinfo_object_mapping = {'sigissuer': ('text', 'issuer'), - 'version': ('text', 'version')} +from joe_mapping import (arch_type_mapping, domain_object_mapping, + dropped_file_mapping, dropped_hash_mapping, elf_object_mapping, + elf_section_flags_mapping, file_object_fields, file_object_mapping, + file_references_mapping, network_behavior_fields, + network_connection_object_mapping, pe_object_fields, pe_object_mapping, + pe_section_object_mapping, process_object_fields, protocols, + registry_references_mapping, regkey_object_mapping, signerinfo_object_mapping) class JoeParser(): @@ -57,7 +19,7 @@ class JoeParser(): self.attributes = defaultdict(lambda: defaultdict(set)) self.process_references = {} - self.import_pe = config["import_pe"] + self.import_executable = config["import_executable"] self.create_mitre_attack = config["mitre_attack"] def parse_data(self, data): @@ -101,26 +63,46 @@ class JoeParser(): for droppedfile in droppedinfo['hash']: file_object = MISPObject('file') for key, mapping in dropped_file_mapping.items(): - attribute_type, object_relation = mapping - file_object.add_attribute(object_relation, **{'type': attribute_type, 'value': droppedfile[key], 'to_ids': False}) + if droppedfile.get(key) is not None: + attribute = {'value': droppedfile[key], 'to_ids': False} + attribute.update(mapping) + file_object.add_attribute(**attribute) if droppedfile['@malicious'] == 'true': - file_object.add_attribute('state', **{'type': 'text', 'value': 'Malicious', 'to_ids': False}) + file_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': 'state', + 'value': 'Malicious', + 'to_ids': False + } + ) for h in droppedfile['value']: hash_type = dropped_hash_mapping[h['@algo']] - file_object.add_attribute(hash_type, **{'type': hash_type, 'value': h['$'], 'to_ids': False}) - self.misp_event.add_object(**file_object) - self.references[self.process_references[(int(droppedfile['@targetid']), droppedfile['@process'])]].append({ - 'referenced_uuid': file_object.uuid, - 'relationship_type': 'drops' - }) + file_object.add_attribute( + **{ + 'type': hash_type, + 'object_relation': hash_type, + 'value': h['$'], + 'to_ids': False + } + ) + self.misp_event.add_object(file_object) + reference_key = (int(droppedfile['@targetid']), droppedfile['@process']) + if reference_key in self.process_references: + self.references[self.process_references[reference_key]].append( + { + 'referenced_uuid': file_object.uuid, + 'relationship_type': 'drops' + } + ) def parse_mitre_attack(self): - mitreattack = self.data['mitreattack'] + mitreattack = self.data.get('mitreattack', {}) if mitreattack: for tactic in mitreattack['tactic']: if tactic.get('technique'): for technique in tactic['technique']: - self.misp_event.add_tag('misp-galaxy:mitre-attack-pattern="{} - {}"'.format(technique['name'], technique['id'])) + self.misp_event.add_tag(f'misp-galaxy:mitre-attack-pattern="{technique["name"]} - {technique["id"]}"') def parse_network_behavior(self): network = self.data['behavior']['network'] @@ -129,44 +111,74 @@ class JoeParser(): if network.get(protocol): for packet in network[protocol]['packet']: timestamp = datetime.strptime(self.parse_timestamp(packet['timestamp']), '%b %d, %Y %H:%M:%S.%f') - connections[tuple(packet[field] for field in network_behavior_fields)][protocol].add(timestamp) + connections[tuple(packet.get(field) for field in network_behavior_fields)][protocol].add(timestamp) for connection, data in connections.items(): attributes = self.prefetch_attributes_data(connection) if len(data.keys()) == len(set(protocols[protocol] for protocol in data.keys())): network_connection_object = MISPObject('network-connection') - for object_relation, attribute in attributes.items(): - network_connection_object.add_attribute(object_relation, **attribute) - network_connection_object.add_attribute('first-packet-seen', - **{'type': 'datetime', - 'value': min(tuple(min(timestamp) for timestamp in data.values())), - 'to_ids': False}) + for attribute in attributes: + network_connection_object.add_attribute(**attribute) + network_connection_object.add_attribute( + **{ + 'type': 'datetime', + 'object_relation': 'first-packet-seen', + 'value': min(tuple(min(timestamp) for timestamp in data.values())), + 'to_ids': False + } + ) for protocol in data.keys(): - network_connection_object.add_attribute('layer{}-protocol'.format(protocols[protocol]), - **{'type': 'text', 'value': protocol, 'to_ids': False}) - self.misp_event.add_object(**network_connection_object) + network_connection_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': f'layer{protocols[protocol]}-protocol', + 'value': protocol, + 'to_ids': False + } + ) + self.misp_event.add_object(network_connection_object) self.references[self.analysisinfo_uuid].append(dict(referenced_uuid=network_connection_object.uuid, relationship_type='initiates')) else: for protocol, timestamps in data.items(): network_connection_object = MISPObject('network-connection') - for object_relation, attribute in attributes.items(): - network_connection_object.add_attribute(object_relation, **attribute) - network_connection_object.add_attribute('first-packet-seen', **{'type': 'datetime', 'value': min(timestamps), 'to_ids': False}) - network_connection_object.add_attribute('layer{}-protocol'.format(protocols[protocol]), **{'type': 'text', 'value': protocol, 'to_ids': False}) - self.misp_event.add_object(**network_connection_object) + for attribute in attributes: + network_connection_object.add_attribute(**attribute) + network_connection_object.add_attribute( + **{ + 'type': 'datetime', + 'object_relation': 'first-packet-seen', + 'value': min(timestamps), + 'to_ids': False + } + ) + network_connection_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': f'layer{protocols[protocol]}-protocol', + 'value': protocol, + 'to_ids': False + } + ) + self.misp_event.add_object(network_connection_object) self.references[self.analysisinfo_uuid].append(dict(referenced_uuid=network_connection_object.uuid, relationship_type='initiates')) def parse_screenshot(self): - screenshotdata = self.data['behavior']['screenshotdata'] - if screenshotdata: - screenshotdata = screenshotdata['interesting']['$'] - attribute = {'type': 'attachment', 'value': 'screenshot.jpg', - 'data': screenshotdata, 'disable_correlation': True, - 'to_ids': False} - self.misp_event.add_attribute(**attribute) + if self.data['behavior'].get('screenshotdata', {}).get('interesting') is not None: + screenshotdata = self.data['behavior']['screenshotdata']['interesting']['$'] + self.misp_event.add_attribute( + **{ + 'type': 'attachment', + 'value': 'screenshot.jpg', + 'data': screenshotdata, + 'disable_correlation': True, + 'to_ids': False + } + ) def parse_system_behavior(self): + if not 'system' in self.data['behavior']: + return system = self.data['behavior']['system'] if system.get('processes'): process_activities = {'fileactivities': self.parse_fileactivities, @@ -175,10 +187,24 @@ class JoeParser(): general = process['general'] process_object = MISPObject('process') for feature, relation in process_object_fields.items(): - process_object.add_attribute(relation, **{'type': 'text', 'value': general[feature], 'to_ids': False}) - start_time = datetime.strptime('{} {}'.format(general['date'], general['time']), '%d/%m/%Y %H:%M:%S') - process_object.add_attribute('start-time', **{'type': 'datetime', 'value': start_time, 'to_ids': False}) - self.misp_event.add_object(**process_object) + process_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': relation, + 'value': general[feature], + 'to_ids': False + } + ) + start_time = datetime.strptime(f"{general['date']} {general['time']}", '%d/%m/%Y %H:%M:%S') + process_object.add_attribute( + **{ + 'type': 'datetime', + 'object_relation': 'start-time', + 'value': start_time, + 'to_ids': False + } + ) + self.misp_event.add_object(process_object) for field, to_call in process_activities.items(): if process.get(field): to_call(process_object.uuid, process[field]) @@ -211,9 +237,15 @@ class JoeParser(): url_object = MISPObject("url") self.analysisinfo_uuid = url_object.uuid - - url_object.add_attribute("url", generalinfo["target"]["url"], to_ids=False) - self.misp_event.add_object(**url_object) + url_object.add_attribute( + **{ + 'type': 'url', + 'object_relation': 'url', + 'value': generalinfo["target"]["url"], + 'to_ids': False + } + ) + self.misp_event.add_object(url_object) def parse_fileinfo(self): fileinfo = self.data['fileinfo'] @@ -222,20 +254,29 @@ class JoeParser(): self.analysisinfo_uuid = file_object.uuid for field in file_object_fields: - file_object.add_attribute(field, **{'type': field, 'value': fileinfo[field], 'to_ids': False}) + file_object.add_attribute( + **{ + 'type': field, + 'object_relation': field, + 'value': fileinfo[field], + 'to_ids': False + } + ) for field, mapping in file_object_mapping.items(): - attribute_type, object_relation = mapping - file_object.add_attribute(object_relation, **{'type': attribute_type, 'value': fileinfo[field], 'to_ids': False}) + if fileinfo.get(field) is not None: + attribute = {'value': fileinfo[field], 'to_ids': False} + attribute.update(mapping) + file_object.add_attribute(**attribute) arch = self.data['generalinfo']['arch'] - if arch in arch_type_mapping: + if self.import_executable and arch in arch_type_mapping: to_call = arch_type_mapping[arch] getattr(self, to_call)(fileinfo, file_object) else: - self.misp_event.add_object(**file_object) + self.misp_event.add_object(file_object) def parse_apk(self, fileinfo, file_object): apkinfo = fileinfo['apk'] - self.misp_event.add_object(**file_object) + self.misp_event.add_object(file_object) permission_lists = defaultdict(list) for permission in apkinfo['requiredpermissions']['permission']: permission = permission['@name'].split('.') @@ -243,16 +284,30 @@ class JoeParser(): attribute_type = 'text' for comment, permissions in permission_lists.items(): permission_object = MISPObject('android-permission') - permission_object.add_attribute('comment', **dict(type=attribute_type, value=comment, to_ids=False)) + permission_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': 'comment', + 'value': comment, + 'to_ids': False + } + ) for permission in permissions: - permission_object.add_attribute('permission', **dict(type=attribute_type, value=permission, to_ids=False)) - self.misp_event.add_object(**permission_object) + permission_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': 'permission', + 'value': permission, + 'to_ids': False + } + ) + self.misp_event.add_object(permission_object) self.references[file_object.uuid].append(dict(referenced_uuid=permission_object.uuid, relationship_type='grants')) def parse_elf(self, fileinfo, file_object): elfinfo = fileinfo['elf'] - self.misp_event.add_object(**file_object) + self.misp_event.add_object(file_object) attribute_type = 'text' relationship = 'includes' size = 'size-in-bytes' @@ -264,47 +319,96 @@ class JoeParser(): if elf.get('type'): # Haven't seen anything but EXEC yet in the files I tested attribute_value = "EXECUTABLE" if elf['type'] == "EXEC (Executable file)" else elf['type'] - elf_object.add_attribute('type', **dict(type=attribute_type, value=attribute_value, to_ids=False)) + elf_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': 'type', + 'value': attribute_value, + 'to_ids': False + } + ) for feature, relation in elf_object_mapping.items(): if elf.get(feature): - elf_object.add_attribute(relation, **dict(type=attribute_type, value=elf[feature], to_ids=False)) + elf_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': relation, + 'value': elf[feature], + 'to_ids': False + } + ) sections_number = len(fileinfo['sections']['section']) - elf_object.add_attribute('number-sections', **{'type': 'counter', 'value': sections_number, 'to_ids': False}) - self.misp_event.add_object(**elf_object) + elf_object.add_attribute( + **{ + 'type': 'counter', + 'object_relation': 'number-sections', + 'value': sections_number, + 'to_ids': False + } + ) + self.misp_event.add_object(elf_object) for section in fileinfo['sections']['section']: section_object = MISPObject('elf-section') for feature in ('name', 'type'): if section.get(feature): - section_object.add_attribute(feature, **dict(type=attribute_type, value=section[feature], to_ids=False)) + section_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': feature, + 'value': section[feature], + 'to_ids': False + } + ) if section.get('size'): - section_object.add_attribute(size, **dict(type=size, value=int(section['size'], 16), to_ids=False)) + section_object.add_attribute( + **{ + 'type': size, + 'object_relation': size, + 'value': int(section['size'], 16), + 'to_ids': False + } + ) for flag in section['flagsdesc']: try: attribute_value = elf_section_flags_mapping[flag] - section_object.add_attribute('flag', **dict(type=attribute_type, value=attribute_value, to_ids=False)) + section_object.add_attribute( + **{ + 'type': attribute_type, + 'object_relation': 'flag', + 'value': attribute_value, + 'to_ids': False + } + ) except KeyError: print(f'Unknown elf section flag: {flag}') continue - self.misp_event.add_object(**section_object) + self.misp_event.add_object(section_object) self.references[elf_object.uuid].append(dict(referenced_uuid=section_object.uuid, relationship_type=relationship)) def parse_pe(self, fileinfo, file_object): - if not self.import_pe: - return try: peinfo = fileinfo['pe'] except KeyError: - self.misp_event.add_object(**file_object) + self.misp_event.add_object(file_object) return pe_object = MISPObject('pe') relationship = 'includes' file_object.add_reference(pe_object.uuid, relationship) - self.misp_event.add_object(**file_object) + self.misp_event.add_object(file_object) for field, mapping in pe_object_fields.items(): - attribute_type, object_relation = mapping - pe_object.add_attribute(object_relation, **{'type': attribute_type, 'value': peinfo[field], 'to_ids': False}) - pe_object.add_attribute('compilation-timestamp', **{'type': 'datetime', 'value': int(peinfo['timestamp'].split()[0], 16), 'to_ids': False}) + if peinfo.get(field) is not None: + attribute = {'value': peinfo[field], 'to_ids': False} + attribute.update(mapping) + pe_object.add_attribute(**attribute) + pe_object.add_attribute( + **{ + 'type': 'datetime', + 'object_relation': 'compilation-timestamp', + 'value': int(peinfo['timestamp'].split()[0], 16), + 'to_ids': False + } + ) program_name = fileinfo['filename'] if peinfo['versions']: for feature in peinfo['versions']['version']: @@ -312,33 +416,57 @@ class JoeParser(): if name == 'InternalName': program_name = feature['value'] if name in pe_object_mapping: - pe_object.add_attribute(pe_object_mapping[name], **{'type': 'text', 'value': feature['value'], 'to_ids': False}) + pe_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': pe_object_mapping[name], + 'value': feature['value'], + 'to_ids': False + } + ) sections_number = len(peinfo['sections']['section']) - pe_object.add_attribute('number-sections', **{'type': 'counter', 'value': sections_number, 'to_ids': False}) + pe_object.add_attribute( + **{ + 'type': 'counter', + 'object_relation': 'number-sections', + 'value': sections_number, + 'to_ids': False + } + ) signatureinfo = peinfo['signature'] if signatureinfo['signed']: signerinfo_object = MISPObject('authenticode-signerinfo') pe_object.add_reference(signerinfo_object.uuid, 'signed-by') - self.misp_event.add_object(**pe_object) - signerinfo_object.add_attribute('program-name', **{'type': 'text', 'value': program_name, 'to_ids': False}) + self.misp_event.add_object(pe_object) + signerinfo_object.add_attribute( + **{ + 'type': 'text', + 'object_relation': 'program-name', + 'value': program_name, + 'to_ids': False + } + ) for feature, mapping in signerinfo_object_mapping.items(): - attribute_type, object_relation = mapping - signerinfo_object.add_attribute(object_relation, **{'type': attribute_type, 'value': signatureinfo[feature], 'to_ids': False}) - self.misp_event.add_object(**signerinfo_object) + if signatureinfo.get(feature) is not None: + attribute = {'value': signatureinfo[feature], 'to_ids': False} + attribute.update(mapping) + signerinfo_object.add_attribute(**attribute) + self.misp_event.add_object(signerinfo_object) else: - self.misp_event.add_object(**pe_object) + self.misp_event.add_object(pe_object) for section in peinfo['sections']['section']: section_object = self.parse_pe_section(section) self.references[pe_object.uuid].append(dict(referenced_uuid=section_object.uuid, relationship_type=relationship)) - self.misp_event.add_object(**section_object) + self.misp_event.add_object(section_object) def parse_pe_section(self, section): section_object = MISPObject('pe-section') for feature, mapping in pe_section_object_mapping.items(): - if section.get(feature): - attribute_type, object_relation = mapping - section_object.add_attribute(object_relation, **{'type': attribute_type, 'value': section[feature], 'to_ids': False}) + if section.get(feature) is not None: + attribute = {'value': section[feature], 'to_ids': False} + attribute.update(mapping) + section_object.add_attribute(**attribute) return section_object def parse_network_interactions(self): @@ -348,10 +476,11 @@ class JoeParser(): if domain['@ip'] != 'unknown': domain_object = MISPObject('domain-ip') for key, mapping in domain_object_mapping.items(): - attribute_type, object_relation = mapping - domain_object.add_attribute(object_relation, - **{'type': attribute_type, 'value': domain[key], 'to_ids': False}) - self.misp_event.add_object(**domain_object) + if domain.get(key) is not None: + attribute = {'value': domain[key], 'to_ids': False} + attribute.update(mapping) + domain_object.add_attribute(**attribute) + self.misp_event.add_object(domain_object) reference = dict(referenced_uuid=domain_object.uuid, relationship_type='contacts') self.add_process_reference(domain['@targetid'], domain['@currentpath'], reference) else: @@ -394,10 +523,19 @@ class JoeParser(): for call in registryactivities[feature]['call']: registry_key = MISPObject('registry-key') for field, mapping in regkey_object_mapping.items(): - attribute_type, object_relation = mapping - registry_key.add_attribute(object_relation, **{'type': attribute_type, 'value': call[field], 'to_ids': False}) - registry_key.add_attribute('data-type', **{'type': 'text', 'value': 'REG_{}'.format(call['type'].upper()), 'to_ids': False}) - self.misp_event.add_object(**registry_key) + if call.get(field) is not None: + attribute = {'value': call[field], 'to_ids': False} + attribute.update(mapping) + registry_key.add_attribute(**attribute) + registry_key.add_attribute( + **{ + 'type': 'text', + 'object_relation': 'data-type', + 'value': f"REG_{call['type'].upper()}", + 'to_ids': False + } + ) + self.misp_event.add_object(registry_key) self.references[process_uuid].append(dict(referenced_uuid=registry_key.uuid, relationship_type=relationship)) @@ -427,8 +565,9 @@ class JoeParser(): @staticmethod def prefetch_attributes_data(connection): - attributes = {} + attributes = [] for field, value in zip(network_behavior_fields, connection): - attribute_type, object_relation = network_connection_object_mapping[field] - attributes[object_relation] = {'type': attribute_type, 'value': value, 'to_ids': False} + attribute = {'value': value, 'to_ids': False} + attribute.update(network_connection_object_mapping[field]) + attributes.append(attribute) return attributes diff --git a/misp_modules/lib/misp-objects b/misp_modules/lib/misp-objects new file mode 160000 index 0000000..9dc7e35 --- /dev/null +++ b/misp_modules/lib/misp-objects @@ -0,0 +1 @@ +Subproject commit 9dc7e3578f2165e32a3b7cdd09e9e552f2d98d36 diff --git a/misp_modules/lib/qintel_helper.py b/misp_modules/lib/qintel_helper.py new file mode 100644 index 0000000..47106f7 --- /dev/null +++ b/misp_modules/lib/qintel_helper.py @@ -0,0 +1,263 @@ +# Copyright (c) 2009-2021 Qintel, LLC +# Licensed under Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) + +from urllib.request import Request, urlopen +from urllib.parse import urlencode +from urllib.error import HTTPError +from time import sleep +from json import loads +import os +from copy import deepcopy +from datetime import datetime, timedelta +from gzip import GzipFile + +VERSION = '1.0.1' +USER_AGENT = 'integrations-helper' +MAX_RETRY_ATTEMPTS = 5 + +DEFAULT_HEADERS = { + 'User-Agent': f'{USER_AGENT}/{VERSION}' +} + +REMOTE_MAP = { + 'pmi': 'https://api.pmi.qintel.com', + 'qwatch': 'https://api.qwatch.qintel.com', + 'qauth': 'https://api.qauth.qintel.com', + 'qsentry_feed': 'https://qsentry.qintel.com', + 'qsentry': 'https://api.qsentry.qintel.com' +} + +ENDPOINT_MAP = { + 'pmi': { + 'ping': '/users/me', + 'cve': 'cves' + }, + 'qsentry_feed': { + 'anon': '/files/anonymization', + 'mal_hosting': '/files/malicious_hosting' + }, + 'qsentry': {}, + 'qwatch': { + 'ping': '/users/me', + 'exposures': 'exposures' + }, + 'qauth': {} +} + + +def _get_request_wait_time(attempts): + """ Use Fibonacci numbers for determining the time to wait when rate limits + have been encountered. + """ + + n = attempts + 3 + a, b = 1, 0 + for _ in range(n): + a, b = a + b, a + + return a + + +def _search(**kwargs): + remote = kwargs.get('remote') + max_retries = int(kwargs.get('max_retries', MAX_RETRY_ATTEMPTS)) + params = kwargs.get('params', {}) + headers = _set_headers(**kwargs) + + logger = kwargs.get('logger') + + params = urlencode(params) + url = remote + "?" + params + req = Request(url, headers=headers) + + request_attempts = 1 + while request_attempts < max_retries: + try: + return urlopen(req) + + except HTTPError as e: + response = e + + except Exception as e: + raise Exception('API connection error') from e + + if response.code not in [429, 504]: + raise Exception(f'API connection error: {response}') + + if request_attempts < max_retries: + wait_time = _get_request_wait_time(request_attempts) + + if response.code == 429: + msg = 'rate limit reached on attempt {request_attempts}, ' \ + 'waiting {wait_time} seconds' + + if logger: + logger(msg) + + else: + msg = f'connection timed out, retrying in {wait_time} seconds' + if logger: + logger(msg) + + sleep(wait_time) + + else: + raise Exception('Max API retries exceeded') + + request_attempts += 1 + + +def _set_headers(**kwargs): + headers = deepcopy(DEFAULT_HEADERS) + + if kwargs.get('user_agent'): + headers['User-Agent'] = \ + f"{kwargs['user_agent']}/{USER_AGENT}/{VERSION}" + + # TODO: deprecate + if kwargs.get('client_id') or kwargs.get('client_secret'): + try: + headers['Cf-Access-Client-Id'] = kwargs['client_id'] + headers['Cf-Access-Client-Secret'] = kwargs['client_secret'] + except KeyError: + raise Exception('missing client_id or client_secret') + + if kwargs.get('token'): + headers['x-api-key'] = kwargs['token'] + + return headers + + +def _set_remote(product, query_type, **kwargs): + remote = kwargs.get('remote') + endpoint = kwargs.get('endpoint', ENDPOINT_MAP[product].get(query_type)) + + if not remote: + remote = REMOTE_MAP[product] + + if not endpoint: + raise Exception('invalid search type') + + remote = remote.rstrip('/') + endpoint = endpoint.lstrip('/') + + return f'{remote}/{endpoint}' + + +def _process_qsentry(resp): + if resp.getheader('Content-Encoding', '') == 'gzip': + with GzipFile(fileobj=resp) as file: + for line in file.readlines(): + yield loads(line) + + +def search_pmi(search_term, query_type, **kwargs): + """ + Search PMI + + :param str search_term: Search term + :param str query_type: Query type [cve|ping] + :param dict kwargs: extra client args [remote|token|params] + :return: API JSON response object + :rtype: dict + """ + + kwargs['remote'] = _set_remote('pmi', query_type, **kwargs) + kwargs['token'] = kwargs.get('token', os.getenv('PMI_TOKEN')) + + params = kwargs.get('params', {}) + params.update({'identifier': search_term}) + kwargs['params'] = params + + return loads(_search(**kwargs).read()) + + +def search_qwatch(search_term, search_type, query_type, **kwargs): + """ + Search QWatch for exposed credentials + + :param str search_term: Search term + :param str search_type: Search term type [domain|email] + :param str query_type: Query type [exposures] + :param dict kwargs: extra client args [remote|token|params] + :return: API JSON response object + :rtype: dict + """ + + kwargs['remote'] = _set_remote('qwatch', query_type, **kwargs) + kwargs['token'] = kwargs.get('token', os.getenv('QWATCH_TOKEN')) + + params = kwargs.get('params', {}) + if search_type: + params.update({search_type: search_term}) + kwargs['params'] = params + + return loads(_search(**kwargs).read()) + + +def search_qauth(search_term, **kwargs): + """ + Search QAuth + + :param str search_term: Search term + :param dict kwargs: extra client args [remote|token|params] + :return: API JSON response object + :rtype: dict + """ + + if not kwargs.get('endpoint'): + kwargs['endpoint'] = '/' + + kwargs['remote'] = _set_remote('qauth', None, **kwargs) + kwargs['token'] = kwargs.get('token', os.getenv('QAUTH_TOKEN')) + + params = kwargs.get('params', {}) + params.update({'q': search_term}) + kwargs['params'] = params + + return loads(_search(**kwargs).read()) + + +def search_qsentry(search_term, **kwargs): + """ + Search QSentry + + :param str search_term: Search term + :param dict kwargs: extra client args [remote|token|params] + :return: API JSON response object + :rtype: dict + """ + + if not kwargs.get('endpoint'): + kwargs['endpoint'] = '/' + + kwargs['remote'] = _set_remote('qsentry', None, **kwargs) + kwargs['token'] = kwargs.get('token', os.getenv('QSENTRY_TOKEN')) + + params = kwargs.get('params', {}) + params.update({'q': search_term}) + kwargs['params'] = params + + return loads(_search(**kwargs).read()) + + +def qsentry_feed(query_type='anon', feed_date=datetime.today(), **kwargs): + """ + Fetch the most recent QSentry Feed + + :param str query_type: Feed type [anon|mal_hosting] + :param dict kwargs: extra client args [remote|token|params] + :param datetime feed_date: feed date to fetch + :return: API JSON response object + :rtype: Iterator[dict] + """ + + remote = _set_remote('qsentry_feed', query_type, **kwargs) + kwargs['token'] = kwargs.get('token', os.getenv('QSENTRY_TOKEN')) + + feed_date = (feed_date - timedelta(days=1)).strftime('%Y%m%d') + kwargs['remote'] = f'{remote}/{feed_date}' + + resp = _search(**kwargs) + for r in _process_qsentry(resp): + yield r diff --git a/misp_modules/lib/stix2misp.py b/misp_modules/lib/stix2misp.py new file mode 100644 index 0000000..0e92aed --- /dev/null +++ b/misp_modules/lib/stix2misp.py @@ -0,0 +1,2080 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright (C) 2017-2018 CIRCL Computer Incident Response Center Luxembourg (smile gie) +# Copyright (C) 2017-2018 Christian Studer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import sys +import json +import os +import time +import io +import pymisp +import stix2misp_mapping +from collections import defaultdict +from copy import deepcopy +from pathlib import Path +_misp_dir = Path(os.path.realpath(__file__)).parents[4] +_misp_objects_path = _misp_dir / 'app' / 'files' / 'misp-objects' / 'objects' +_misp_types = pymisp.AbstractMISP().describe_types.get('types') +from pymisp import MISPEvent, MISPObject, MISPAttribute + +_scripts_path = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(_scripts_path / 'cti-python-stix2')) +import stix2 + + +class StixParser(): + _galaxy_types = ('intrusion-set', 'malware', 'threat-actor', 'tool') + _stix2misp_mapping = {'marking-definition': '_load_marking', + 'relationship': '_load_relationship', + 'report': '_load_report', + 'indicator': '_parse_indicator', + 'observed-data': '_parse_observable', + 'identity': '_load_identity'} + _stix2misp_mapping.update({galaxy_type: '_load_galaxy' for galaxy_type in _galaxy_types}) + _special_mapping = {'attack-pattern': 'parse_attack_pattern', + 'course-of-action': 'parse_course_of_action', + 'vulnerability': 'parse_vulnerability'} + _timeline_mapping = {'indicator': ('valid_from', 'valid_until'), + 'observed-data': ('first_observed', 'last_observed')} + + def __init__(self): + super().__init__() + self.misp_event = MISPEvent() + self.relationship = defaultdict(list) + self.tags = set() + self.galaxy = {} + self.marking_definition = {} + + def handler(self, event, filename, args): + self.filename = filename + self.stix_version = f"STIX {event['spec_version'] if event.get('spec_version') else '2.1'}" + try: + event_distribution = args[0] + if not isinstance(event_distribution, int): + event_distribution = int(event_distribution) if event_distribution.isdigit() else 0 + except IndexError: + event_distribution = 0 + try: + attribute_distribution = args[1] + if attribute_distribution == 'event': + attribute_distribution = 5 + if not isinstance(attribute_distribution, int): + attribute_distribution = int(attribute_distribution) if attribute_distribution.isdigit() else 5 + except IndexError: + attribute_distribution = 5 + synonyms_to_tag_names = args[2] if len(args) > 2 else '/var/www/MISP/app/files/scripts/synonymsToTagNames.json' + with open(synonyms_to_tag_names, 'rt', encoding='utf-8') as f: + self._synonyms_to_tag_names = json.loads(f.read()) + self.parse_event(event) + + def _load_galaxy(self, galaxy): + self.galaxy[galaxy['id'].split('--')[1]] = {'tag_names': self.parse_galaxy(galaxy), 'used': False} + + def _load_identity(self, identity): + try: + self.identity[identity['id'].split('--')[1]] = identity['name'] + except AttributeError: + self.identity = {identity['id'].split('--')[1]: identity['name']} + + def _load_marking(self, marking): + tag = self.parse_marking(marking) + self.marking_definition[marking['id'].split('--')[1]] = {'object': tag, 'used': False} + + def _load_relationship(self, relationship): + target_uuid = relationship.target_ref.split('--')[1] + reference = (target_uuid, relationship.relationship_type) + source_uuid = relationship.source_ref.split('--')[1] + self.relationship[source_uuid].append(reference) + + def _load_report(self, report): + try: + self.report[report['id'].split('--')[1]] = report + except AttributeError: + self.report = {report['id'].split('--')[1]: report} + + def save_file(self): + event = self.misp_event.to_json() + with open(f'{self.filename}.stix2', 'wt', encoding='utf-8') as f: + f.write(event) + + ################################################################################ + ## PARSING FUNCTIONS USED BY BOTH SUBCLASSES. ## + ################################################################################ + + def handle_markings(self): + if hasattr(self, 'marking_refs'): + for attribute in self.misp_event.attributes: + if attribute.uuid in self.marking_refs: + for marking_uuid in self.marking_refs[attribute.uuid]: + attribute.add_tag(self.marking_definition[marking_uuid]['object']) + self.marking_definition[marking_uuid]['used'] = True + if self.marking_definition: + for marking_definition in self.marking_definition.values(): + if not marking_definition['used']: + self.tags.add(marking_definition['object']) + if self.tags: + for tag in self.tags: + self.misp_event.add_tag(tag) + + @staticmethod + def _parse_email_body(body, references): + attributes = [] + for body_multipart in body: + reference = references.pop(body_multipart['body_raw_ref']) + feature = body_multipart['content_disposition'].split(';')[0] + if feature in stix2misp_mapping.email_references_mapping: + attribute = deepcopy(stix2misp_mapping.email_references_mapping[feature]) + else: + print(f'Unknown content disposition in the following email body: {body_multipart}', file=sys.stderr) + continue + if isinstance(reference, stix2.v20.observables.Artifact): + attribute.update({ + 'value': body_multipart['content_disposition'].split('=')[-1].strip("'"), + 'data': reference.payload_bin, + 'to_ids': False + }) + else: + attribute.update({ + 'value': reference.name, + 'to_ids': False + }) + attributes.append(attribute) + return attributes + + @staticmethod + def _parse_email_references(email_message, references): + attributes = [] + if hasattr(email_message, 'from_ref'): + reference = references.pop(email_message.from_ref) + attribute = { + 'value': reference.value, + 'to_ids': False + } + attribute.update(stix2misp_mapping.email_references_mapping['from_ref']) + attributes.append(attribute) + for feature in ('to_refs', 'cc_refs'): + if hasattr(email_message, feature): + for ref_id in getattr(email_message, feature): + reference = references.pop(ref_id) + attribute = { + 'value': reference.value, + 'to_ids': False + } + attribute.update(stix2misp_mapping.email_references_mapping[feature]) + attributes.append(attribute) + return attributes + + def parse_galaxies(self): + for galaxy in self.galaxy.values(): + if not galaxy['used']: + for tag_name in galaxy['tag_names']: + self.tags.add(tag_name) + + @staticmethod + def _parse_network_connection_reference(feature_type, feature, value): + if feature == 'type': + return {type: value.format(feature_type) for type, value in stix2misp_mapping.network_traffic_references_mapping[value].items()} + return {feature: value} + + @staticmethod + def _parse_network_traffic_protocol(protocol): + return {'type': 'text', 'value': protocol, 'to_ids': False, + 'object_relation': f'layer{stix2misp_mapping.connection_protocols[protocol]}-protocol'} + + @staticmethod + def _parse_observable_reference(reference, mapping, feature=None): + attribute = { + 'value': reference.value, + 'to_ids': False + } + if feature is not None: + attribute.update({key: value.format(feature) for key, value in getattr(stix2misp_mapping, mapping)[reference._type].items()}) + return attribute + attribute.update({key: value for key, value in getattr(stix2misp_mapping, mapping)[reference._type].items()}) + return attribute + + def parse_pe(self, extension): + pe_object = MISPObject('pe', misp_objects_path_custom=_misp_objects_path) + self.fill_misp_object(pe_object, extension, 'pe_mapping') + for section in extension['sections']: + section_object = MISPObject('pe-section', misp_objects_path_custom=_misp_objects_path) + self.fill_misp_object(section_object, section, 'pe_section_mapping') + if hasattr(section, 'hashes'): + self.fill_misp_object(section_object, section.hashes, 'pe_section_mapping') + self.misp_event.add_object(section_object) + pe_object.add_reference(section_object.uuid, 'includes') + self.misp_event.add_object(pe_object) + return pe_object.uuid + + def parse_relationships(self): + attribute_uuids = tuple(attribute.uuid for attribute in self.misp_event.attributes) + object_uuids = tuple(object.uuid for object in self.misp_event.objects) + for source, references in self.relationship.items(): + if source in object_uuids: + source_object = self.misp_event.get_object_by_uuid(source) + for reference in references: + target, reference = reference + if target in attribute_uuids or target in object_uuids: + source_object.add_reference(target, reference) + elif source in attribute_uuids: + for attribute in self.misp_event.attributes: + if attribute.uuid == source: + for reference in references: + target, reference = reference + if target in self.galaxy: + for tag_name in self.galaxy[target]['tag_names']: + attribute.add_tag(tag_name) + self.galaxy[target]['used'] = True + break + + def parse_report(self, event_uuid=None): + event_infos = set() + self.misp_event.uuid = event_uuid if event_uuid and len(self.report) > 1 else tuple(self.report.keys())[0] + for report in self.report.values(): + if hasattr(report, 'name') and report.name: + event_infos.add(report.name) + if hasattr(report, 'labels') and report.labels: + for label in report.labels: + self.tags.add(label) + if hasattr(report, 'object_marking_refs') and report.object_marking_refs: + for marking_ref in report.object_marking_refs: + marking_ref = marking_ref.split('--')[1] + try: + self.tags.add(self.marking_definition[marking_ref]['object']) + self.marking_definition[marking_ref]['used'] = True + except KeyError: + continue + if hasattr(report, 'external_references'): + for reference in report.external_references: + self.misp_event.add_attribute(**{'type': 'link', 'value': reference['url']}) + if len(event_infos) == 1: + self.misp_event.info = event_infos.pop() + else: + self.misp_event.info = f'Imported with MISP import script for {self.stix_version}' + + @staticmethod + def _parse_user_account_groups(groups): + attributes = [{'type': 'text', 'object_relation': 'group', 'to_ids': False, + 'disable_correlation': True, 'value': group} for group in groups] + return attributes + + ################################################################################ + ## UTILITY FUNCTIONS. ## + ################################################################################ + + @staticmethod + def _choose_with_priority(container, first_choice, second_choice): + return first_choice if first_choice in container else second_choice + + def filter_main_object(self, observable, main_type, test_function='_standard_test_filter'): + references = {} + main_objects = [] + for key, value in observable.items(): + if getattr(self, test_function)(value, main_type): + main_objects.append(value) + else: + references[key] = value + if len(main_objects) > 1: + print(f'More than one {main_type} objects in this observable: {observable}', file=sys.stderr) + return main_objects[0] if main_objects else None, references + + @staticmethod + def getTimestampfromDate(date): + try: + return int(date.timestamp()) + except AttributeError: + return int(time.mktime(time.strptime(date.split('+')[0], "%Y-%m-%dT%H:%M:%S.%fZ"))) + + @staticmethod + def _handle_data(data): + return io.BytesIO(data.encode()) + + @staticmethod + def parse_marking(marking): + marking_type = marking.definition_type + tag = getattr(marking.definition, marking_type) + return "{}:{}".format(marking_type, tag) + + def parse_timeline(self, stix_object): + misp_object = {'timestamp': self.getTimestampfromDate(stix_object.modified)} + try: + first, last = self._timeline_mapping[stix_object._type] + first_seen = getattr(stix_object, first) + if stix_object.created != first_seen and stix_object.modified != first_seen: + misp_object['first_seen'] = first_seen + if hasattr(stix_object, last): + misp_object['last_seen'] = getattr(stix_object, last) + elif hasattr(stix_object, last): + misp_object.update({'first_seen': first_seen, 'last_seen': getattr(stix_object, last)}) + except KeyError: + pass + return misp_object + + @staticmethod + def _process_test_filter(value, main_type): + _is_main_process = any(feature in value for feature in ('parent_ref', 'child_refs')) + return isinstance(value, getattr(stix2.v20.observables, main_type)) and _is_main_process + + @staticmethod + def _standard_test_filter(value, main_type): + return isinstance(value, getattr(stix2.v20.observables, main_type)) + + def update_marking_refs(self, attribute_uuid, marking_refs): + try: + self.marking_refs[attribute_uuid] = tuple(marking.split('--')[1] for marking in marking_refs) + except AttributeError: + self.marking_refs = {attribute_uuid: tuple(marking.split('--')[1] for marking in marking_refs)} + + +class StixFromMISPParser(StixParser): + def __init__(self): + super().__init__() + self._stix2misp_mapping.update({'custom_object': '_parse_custom'}) + self._stix2misp_mapping.update({special_type: '_parse_undefined' for special_type in ('attack-pattern', 'course-of-action', 'vulnerability')}) + self._custom_objects = tuple(filename.name.replace('_', '-') for filename in _misp_objects_path.glob('*') if '_' in filename.name) + + def parse_event(self, stix_event): + for stix_object in stix_event.objects: + object_type = stix_object['type'] + if object_type.startswith('x-misp-object'): + object_type = 'custom_object' + if object_type in self._stix2misp_mapping: + getattr(self, self._stix2misp_mapping[object_type])(stix_object) + else: + print(f'not found: {object_type}', file=sys.stderr) + if self.relationship: + self.parse_relationships() + if self.galaxy: + self.parse_galaxies() + if hasattr(self, 'report'): + self.parse_report() + self.handle_markings() + + def _parse_custom(self, custom): + if 'from_object' in custom['labels']: + self.parse_custom_object(custom) + else: + self.parse_custom_attribute(custom) + + def _parse_indicator(self, indicator): + if 'from_object' in indicator['labels']: + self.parse_indicator_object(indicator) + else: + self.parse_indicator_attribute(indicator) + + def _parse_observable(self, observable): + if 'from_object' in observable['labels']: + self.parse_observable_object(observable) + else: + self.parse_observable_attribute(observable) + + def _parse_undefined(self, stix_object): + if any(label.startswith('misp-galaxy:') for label in stix_object.get('labels', [])): + self._load_galaxy(stix_object) + else: + getattr(self, self._special_mapping[stix_object._type])(stix_object) + + ################################################################################ + ## PARSING FUNCTIONS. ## + ################################################################################ + + def fill_misp_object(self, misp_object, stix_object, mapping, + to_call='_fill_observable_object_attribute'): + for feature, value in stix_object.items(): + if feature not in getattr(stix2misp_mapping, mapping): + if feature.startswith('x_misp_'): + attribute = self.parse_custom_property(feature) + if isinstance(value, list): + self._fill_misp_object_from_list(misp_object, attribute, value) + continue + else: + continue + else: + attribute = deepcopy(getattr(stix2misp_mapping, mapping)[feature]) + attribute.update(getattr(self, to_call)(feature, value)) + misp_object.add_attribute(**attribute) + + @staticmethod + def _fill_misp_object_from_list(misp_object, mapping, values): + for value in values: + attribute = {'value': value} + attribute.update(mapping) + misp_object.add_attribute(**attribute) + + def parse_attack_pattern(self, attack_pattern): + misp_object, _ = self.create_misp_object(attack_pattern) + if hasattr(attack_pattern, 'external_references'): + for reference in attack_pattern.external_references: + value = reference['external_id'].split('-')[1] if reference['source_name'] == 'capec' else reference['url'] + misp_object.add_attribute(**{ + 'type': 'text', 'object_relation': 'id', + 'value': value + }) + self.fill_misp_object(misp_object, attack_pattern, 'attack_pattern_mapping', + '_fill_observable_object_attribute') + self.misp_event.add_object(**misp_object) + + def parse_course_of_action(self, course_of_action): + misp_object, _ = self.create_misp_object(course_of_action) + self.fill_misp_object(misp_object, course_of_action, 'course_of_action_mapping', + '_fill_observable_object_attribute') + self.misp_event.add_object(**misp_object) + + def parse_custom_attribute(self, custom): + attribute_type = custom['type'].split('x-misp-object-')[1] + if attribute_type not in _misp_types: + replacement = ' ' if attribute_type == 'named-pipe' else '|' + attribute_type = attribute_type.replace('-', replacement) + attribute = {'type': attribute_type, + 'timestamp': self.getTimestampfromDate(custom['modified']), + 'to_ids': bool(custom['labels'][1].split('=')[1]), + 'value': custom['x_misp_value'], + 'category': self.get_misp_category(custom['labels']), + 'uuid': custom['id'].split('--')[1]} + if custom.get('object_marking_refs'): + self.update_marking_refs(attribute['uuid'], custom['object_marking_refs']) + self.misp_event.add_attribute(**attribute) + + def parse_custom_object(self, custom): + name = custom['type'].split('x-misp-object-')[1] + if name in self._custom_objects: + name = name.replace('-', '_') + misp_object = MISPObject(name, misp_objects_path_custom=_misp_objects_path) + misp_object.timestamp = self.getTimestampfromDate(custom['modified']) + misp_object.uuid = custom['id'].split('--')[1] + try: + misp_object.category = custom['category'] + except KeyError: + misp_object.category = self.get_misp_category(custom['labels']) + for key, value in custom['x_misp_values'].items(): + attribute_type, object_relation = key.replace('_DOT_', '.').split('_') + if isinstance(value, list): + for single_value in value: + misp_object.add_attribute(**{'type': attribute_type, 'value': single_value, + 'object_relation': object_relation}) + else: + misp_object.add_attribute(**{'type': attribute_type, 'value': value, + 'object_relation': object_relation}) + self.misp_event.add_object(**misp_object) + + def parse_galaxy(self, galaxy): + if hasattr(galaxy, 'labels'): + return [label for label in galaxy.labels if label.startswith('misp-galaxy:')] + try: + return self._synonyms_to_tag_names[galaxy.name] + except KeyError: + print(f'Unknown {galaxy._type} name: {galaxy.name}', file=sys.stderr) + return [f'misp-galaxy:{galaxy._type}="{galaxy.name}"'] + + def parse_indicator_attribute(self, indicator): + attribute = self.create_attribute_dict(indicator) + attribute['to_ids'] = True + pattern = indicator.pattern.replace('\\\\', '\\') + if attribute['type'] in ('malware-sample', 'attachment'): + value, data = self.parse_attribute_pattern_with_data(pattern) + attribute.update({feature: value for feature, value in zip(('value', 'data'), (value, io.BytesIO(data.encode())))}) + else: + attribute['value'] = self.parse_attribute_pattern(pattern) + self.misp_event.add_attribute(**attribute) + + def parse_indicator_object(self, indicator): + misp_object, object_type = self.create_misp_object(indicator) + pattern = self._handle_pattern(indicator.pattern).replace('\\\\', '\\').split(' AND ') + try: + attributes = getattr(self, stix2misp_mapping.objects_mapping[object_type]['pattern'])(pattern) + except KeyError: + print(f"Unable to map {object_type} object:\n{indicator}", file=sys.stderr) + return + if isinstance(attributes, tuple): + attributes, target_uuid = attributes + misp_object.add_reference(target_uuid, 'includes') + for attribute in attributes: + misp_object.add_attribute(**attribute) + self.misp_event.add_object(misp_object) + + def parse_observable_attribute(self, observable): + attribute = self.create_attribute_dict(observable) + attribute['to_ids'] = False + objects = observable.objects + value = self.parse_single_attribute_observable(objects, attribute['type']) + if isinstance(value, tuple): + value, data = value + attribute['data'] = data + attribute['value'] = value + self.misp_event.add_attribute(**attribute) + + def parse_observable_object(self, observable): + misp_object, object_type = self.create_misp_object(observable) + observable_object = observable.objects + try: + attributes = getattr(self, stix2misp_mapping.objects_mapping[object_type]['observable'])(observable_object) + except KeyError: + print(f"Unable to map {object_type} object:\n{observable}", file=sys.stderr) + return + if isinstance(attributes, tuple): + attributes, target_uuid = attributes + misp_object.add_reference(target_uuid, 'includes') + for attribute in attributes: + misp_object.add_attribute(**attribute) + self.misp_event.add_object(misp_object) + + def parse_vulnerability(self, vulnerability): + attributes = self.fill_observable_attributes(vulnerability, 'vulnerability_mapping') + if hasattr(vulnerability, 'external_references'): + for reference in vulnerability.external_references: + if reference['source_name'] == 'url': + attributes.append({'type': 'link', 'object_relation': 'references', 'value': reference['url']}) + if len(attributes) > 1: + vulnerability_object, _ = self.create_misp_object(vulnerability) + for attribute in attributes: + vulnerability_object.add_attribute(**attribute) + self.misp_event.add_object(**vulnerability_object) + else: + attribute = self.create_attribute_dict(vulnerability) + attribute['value'] = attributes[0]['value'] + self.misp_event.add_attribute(**attribute) + + ################################################################################ + ## OBSERVABLE PARSING FUNCTIONS ## + ################################################################################ + + @staticmethod + def _define_hash_type(hash_type): + if 'sha' in hash_type: + return f'SHA-{hash_type.split("sha")[1]}' + return hash_type.upper() if hash_type == 'md5' else hash_type + + @staticmethod + def _fetch_file_observable(observable_objects): + for key, observable in observable_objects.items(): + if observable['type'] == 'file': + return key + return '0' + + @staticmethod + def _fill_observable_attribute(attribute_type, object_relation, value): + return {'type': attribute_type, + 'object_relation': object_relation, + 'value': value, + 'to_ids': False} + + def fill_observable_attributes(self, observable, object_mapping): + attributes = [] + for key, value in observable.items(): + if key in getattr(stix2misp_mapping, object_mapping): + attribute = deepcopy(getattr(stix2misp_mapping, object_mapping)[key]) + elif key.startswith('x_misp_'): + attribute = self.parse_custom_property(key) + if isinstance(value, list): + for single_value in value: + single_attribute = {'value': single_value, 'to_ids': False} + single_attribute.update(attribute) + attributes.append(single_attribute) + continue + else: + continue + attribute.update({'value': value, 'to_ids': False}) + attributes.append(attribute) + return attributes + + def _handle_multiple_file_fields(self, file): + attributes = [] + for feature, attribute_type in zip(('filename', 'path', 'fullpath'), ('filename', 'text', 'text')): + key = f'x_misp_multiple_{feature}' + if key in file: + attributes.append(self._fill_observable_attribute(attribute_type, feature, file.pop(key))) + elif f'{key}s' in file: + attributes.extend(self._fill_observable_attribute(attribute_type, feature, value) for value in file.pop(key)) + attributes.extend(self.fill_observable_attributes(file, 'file_mapping')) + return attributes + + def parse_asn_observable(self, observable): + attributes = [] + mapping = 'asn_mapping' + for observable_object in observable.values(): + if isinstance(observable_object, stix2.v20.observables.AutonomousSystem): + attributes.extend(self.fill_observable_attributes(observable_object, mapping)) + else: + attributes.append(self._parse_observable_reference(observable_object, mapping)) + return attributes + + def _parse_attachment(self, observable): + if len(observable) > 1: + return self._parse_name(observable, index='1'), self._parse_payload(observable) + return self._parse_name(observable) + + def parse_credential_observable(self, observable): + return self.fill_observable_attributes(observable['0'], 'credential_mapping') + + def _parse_domain_ip_attribute(self, observable): + return f'{self._parse_value(observable)}|{self._parse_value(observable, index="1")}' + + @staticmethod + def parse_domain_ip_observable(observable): + attributes = [] + for observable_object in observable.values(): + attribute = deepcopy(stix2misp_mapping.domain_ip_mapping[observable_object._type]) + attribute.update({'value': observable_object.value, 'to_ids': False}) + attributes.append(attribute) + return attributes + + @staticmethod + def _parse_email_message(observable, attribute_type): + return observable['0'].get(attribute_type.split('-')[1]) + + def parse_email_observable(self, observable): + email, references = self.filter_main_object(observable, 'EmailMessage') + attributes = self.fill_observable_attributes(email, 'email_mapping') + if hasattr(email, 'additional_header_fields'): + attributes.extend(self.fill_observable_attributes(email.additional_header_fields, 'email_mapping')) + attributes.extend(self._parse_email_references(email, references)) + if hasattr(email, 'body_multipart') and email.body_multipart: + attributes.extend(self._parse_email_body(email.body_multipart, references)) + return attributes + + @staticmethod + def _parse_email_reply_to(observable): + return observable['0'].additional_header_fields.get('Reply-To') + + def parse_file_observable(self, observable): + file, references = self.filter_main_object(observable, 'File') + references = {key: {'object': value, 'used': False} for key, value in references.items()} + file = {key: value for key, value in file.items()} + multiple_fields = any(f'x_misp_multiple_{feature}' in file for feature in ('filename', 'path', 'fullpath')) + attributes = self._handle_multiple_file_fields(file) if multiple_fields else self.fill_observable_attributes(file, 'file_mapping') + if 'hashes' in file: + attributes.extend(self.fill_observable_attributes(file['hashes'], 'file_mapping')) + if 'content_ref' in file: + reference = references[file['content_ref']] + value = f'{reference["object"].name}|{reference["object"].hashes["MD5"]}' + attributes.append({'type': 'malware-sample', 'object_relation': 'malware-sample', 'value': value, + 'to_ids': False, 'data': reference['object'].payload_bin}) + reference['used'] = True + if 'parent_directory_ref' in file: + reference = references[file['parent_directory_ref']] + attributes.append({'type': 'text', 'object_relation': 'path', + 'value': reference['object'].path, 'to_ids': False}) + reference['used'] = True + for reference in references.values(): + if not reference['used']: + attributes.append({ + 'type': 'attachment', + 'object_relation': 'attachment', + 'value': reference['object'].name, + 'data': reference['object'].payload_bin, + 'to_ids': False + }) + return attributes + + def _parse_filename_hash(self, observable, attribute_type, index='0'): + hash_type = attribute_type.split('|')[1] + filename = self._parse_name(observable, index=index) + hash_value = self._parse_hash(observable, hash_type, index=index) + return f'{filename}|{hash_value}' + + def _parse_hash(self, observable, attribute_type, index='0'): + hash_type = self._define_hash_type(attribute_type) + return observable[index]['hashes'].get(hash_type) + + def parse_ip_port_observable(self, observable): + network_traffic, references = self.filter_main_object(observable, 'NetworkTraffic') + attributes = [] + for feature in ('src', 'dst'): + port = f'{feature}_port' + if hasattr(network_traffic, port): + attribute = deepcopy(stix2misp_mapping.ip_port_mapping[port]) + attribute.update({'value': getattr(network_traffic, port), 'to_ids': False}) + attributes.append(attribute) + ref = f'{feature}_ref' + if hasattr(network_traffic, ref): + attributes.append(self._parse_observable_reference(references.pop(getattr(network_traffic, ref)), 'ip_port_references_mapping', feature)) + for reference in references.values(): + attribute = deepcopy(stix2misp_mapping.ip_port_references_mapping[reference._type]) + attribute.update({'value': reference.value, 'to_ids': False}) + attributes.append(attribute) + return attributes + + def _parse_malware_sample(self, observable): + if len(observable) > 1: + value = self._parse_filename_hash(observable, 'filename|md5', '1') + return value, self._parse_payload(observable) + return self._parse_filename_hash(observable, 'filename|md5') + + @staticmethod + def _parse_name(observable, index='0'): + return observable[index].get('name') + + def _parse_network_attribute(self, observable): + port = self._parse_port(observable, index='1') + return f'{self._parse_value(observable)}|{port}' + + def parse_network_connection_observable(self, observable): + network_traffic, references = self.filter_main_object(observable, 'NetworkTraffic') + attributes = self._parse_network_traffic(network_traffic, references) + if hasattr(network_traffic, 'protocols'): + attributes.extend(self._parse_network_traffic_protocol(protocol) for protocol in network_traffic.protocols if protocol in stix2misp_mapping.connection_protocols) + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, 'domain_ip_mapping')) + return attributes + + def parse_network_socket_observable(self, observable): + network_traffic, references = self.filter_main_object(observable, 'NetworkTraffic') + attributes = self._parse_network_traffic(network_traffic, references) + if hasattr(network_traffic, 'protocols'): + attributes.append({'type': 'text', 'object_relation': 'protocol', 'to_ids': False, + 'value': network_traffic.protocols[0].strip("'")}) + if hasattr(network_traffic, 'extensions') and network_traffic.extensions: + attributes.extend(self._parse_socket_extension(network_traffic.extensions['socket-ext'])) + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, 'domain_ip_mapping')) + return attributes + + def _parse_network_traffic(self, network_traffic, references): + attributes = [] + mapping = 'network_traffic_references_mapping' + for feature in ('src', 'dst'): + port = f'{feature}_port' + if hasattr(network_traffic, port): + attribute = deepcopy(stix2misp_mapping.network_traffic_mapping[port]) + attribute.update({'value': getattr(network_traffic, port), 'to_ids': False}) + attributes.append(attribute) + ref = f'{feature}_ref' + if hasattr(network_traffic, ref): + attributes.append(self._parse_observable_reference(references.pop(getattr(network_traffic, ref)), mapping, feature)) + if hasattr(network_traffic, f'{ref}s'): + for ref in getattr(network_traffic, f'{ref}s'): + attributes.append(self._parse_observable_reference(references.pop(ref), mapping, feature)) + return attributes + + @staticmethod + def _parse_number(observable): + return observable['0'].get('number') + + @staticmethod + def _parse_payload(observable): + return observable['0'].payload_bin + + def parse_pe_observable(self, observable): + key = self._fetch_file_observable(observable) + extension = observable[key]['extensions']['windows-pebinary-ext'] + pe_uuid = self.parse_pe(extension) + return self.parse_file_observable(observable), pe_uuid + + @staticmethod + def _parse_port(observable, index='0'): + port_observable = observable[index] + return port_observable['src_port'] if 'src_port' in port_observable else port_observable['dst_port'] + + def parse_process_observable(self, observable): + process, references = self.filter_main_object(observable, 'Process', test_function='_process_test_filter') + attributes = self.fill_observable_attributes(process, 'process_mapping') + if hasattr(process, 'parent_ref'): + attributes.extend(self.fill_observable_attributes(references[process.parent_ref], 'parent_process_reference_mapping')) + if hasattr(process, 'child_refs'): + for reference in process.child_refs: + attributes.extend(self.fill_observable_attributes(references[reference], 'child_process_reference_mapping')) + if hasattr(process, 'binary_ref'): + reference = references[process.binary_ref] + attribute = deepcopy(stix2misp_mapping.process_image_mapping) + attribute.update({'value': reference.name, 'to_ids': False}) + attributes.append(attribute) + return attributes + + @staticmethod + def _parse_regkey_attribute(observable): + return observable['0'].get('key') + + def parse_regkey_observable(self, observable): + attributes = [] + for key, value in observable['0'].items(): + if key in stix2misp_mapping.regkey_mapping: + attribute = deepcopy(stix2misp_mapping.regkey_mapping[key]) + attribute.update({'value': value.replace('\\\\', '\\'), 'to_ids': False}) + attributes.append(attribute) + if 'values' in observable['0']: + attributes.extend(self.fill_observable_attributes(observable['0']['values'][0], 'regkey_mapping')) + return attributes + + def _parse_regkey_value(self, observable): + regkey = self._parse_regkey_attribute(observable) + return f'{regkey}|{observable["0"]["values"][0].get("data")}' + + def parse_single_attribute_observable(self, observable, attribute_type): + if attribute_type in stix2misp_mapping.attributes_type_mapping: + return getattr(self, stix2misp_mapping.attributes_type_mapping[attribute_type])(observable, attribute_type) + return getattr(self, stix2misp_mapping.attributes_mapping[attribute_type])(observable) + + def _parse_socket_extension(self, extension): + attributes = [] + extension = {key: value for key, value in extension.items()} + if 'x_misp_text_address_family' in extension: + extension.pop('address_family') + for element, value in extension.items(): + if element in stix2misp_mapping.network_socket_extension_mapping: + attribute = deepcopy(stix2misp_mapping.network_socket_extension_mapping[element]) + if element in ('is_listening', 'is_blocking'): + if value is False: + continue + value = element.split('_')[1] + elif element.startswith('x_misp_'): + attribute = self.parse_custom_property(element) + else: + continue + attribute.update({'value': value, 'to_ids': False}) + attributes.append(attribute) + return attributes + + @staticmethod + def parse_url_observable(observable): + attributes = [] + for object in observable.values(): + feature = 'dst_port' if isinstance(object, stix2.v20.observables.NetworkTraffic) else 'value' + attribute = deepcopy(stix2misp_mapping.url_mapping[object._type]) + attribute.update({'value': getattr(object, feature), 'to_ids': False}) + attributes.append(attribute) + return attributes + + def parse_user_account_observable(self, observable): + observable = observable['0'] + attributes = self.fill_observable_attributes(observable, 'user_account_mapping') + if 'extensions' in observable and 'unix-account-ext' in observable['extensions']: + extension = observable['extensions']['unix-account-ext'] + if 'groups' in extension: + attributes.extend(self._parse_user_account_groups(extension['groups'])) + attributes.extend(self.fill_observable_attributes(extension, 'user_account_mapping')) + return attributes + + @staticmethod + def _parse_value(observable, index='0'): + return observable[index].get('value') + + def _parse_x509_attribute(self, observable, attribute_type): + hash_type = attribute_type.split('-')[-1] + return self._parse_hash(observable, hash_type) + + def parse_x509_observable(self, observable): + attributes = self.fill_observable_attributes(observable['0'], 'x509_mapping') + if hasattr(observable['0'], 'hashes') and observable['0'].hashes: + attributes.extend(self.fill_observable_attributes(observable['0'].hashes, 'x509_mapping')) + return attributes + + ################################################################################ + ## PATTERN PARSING FUNCTIONS. ## + ################################################################################ + + def fill_pattern_attributes(self, pattern, object_mapping): + attributes = [] + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + if pattern_type not in getattr(stix2misp_mapping, object_mapping): + if 'x_misp_' in pattern_type: + attribute = self.parse_custom_property(pattern_type) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + continue + attribute = deepcopy(getattr(stix2misp_mapping, object_mapping)[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + return attributes + + def parse_asn_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'asn_mapping') + + def parse_credential_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'credential_mapping') + + def parse_domain_ip_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'domain_ip_mapping') + + def parse_email_pattern(self, pattern): + attributes = [] + attachments = defaultdict(dict) + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + if 'body_multipart' in pattern_type: + pattern_type = pattern_type.split('.') + feature = 'data' if pattern_type[-1] == 'payload_bin' else 'value' + attachments[pattern_type[0][-2]][feature] = pattern_value.strip("'") + continue + if pattern_type not in stix2misp_mapping.email_mapping: + if 'x_misp_' in pattern_type: + attribute = self.parse_custom_property(pattern_type) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + continue + attribute = deepcopy(stix2misp_mapping.email_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + for attachment in attachments.values(): + if 'data' in attachment: + attribute = {'type': 'attachment', 'object_relation': 'screenshot', 'data': attachment['data']} + else: + attribute = {'type': 'email-attachment', 'object_relation': 'attachment'} + attribute['value'] = attachment['value'] + attributes.append(attribute) + return attributes + + def parse_file_pattern(self, pattern): + attributes = [] + attachment = {} + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + if pattern_type in stix2misp_mapping.attachment_types: + attachment[pattern_type] = pattern_value.strip("'") + if pattern_type not in stix2misp_mapping.file_mapping: + continue + attribute = deepcopy(stix2misp_mapping.file_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + if 'file:content_ref.payload_bin' in attachment: + filename = self._choose_with_priority(attachment, 'file:content_ref.name', 'file:name') + md5 = self._choose_with_priority(attachment, "file:content_ref.hashes.'MD5'", "file:hashes.'MD5'") + attributes.append({ + 'type': 'malware-sample', + 'object_relation': 'malware-sample', + 'value': f'{attachment[filename]}|{attachment[md5]}', + 'data': attachment['file:content_ref.payload_bin'] + }) + if 'artifact:payload_bin' in attachment: + attributes.append({ + 'type': 'attachment', + 'object_relation': 'attachment', + 'value': attachment['artifact:x_misp_text_name'] if 'artifact:x_misp_text_name' in attachment else attachment['file:name'], + 'data': attachment['artifact:payload_bin'] + }) + return attributes + + def parse_ip_port_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'ip_port_mapping') + + def parse_network_connection_pattern(self, pattern): + attributes = [] + references = defaultdict(dict) + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + if pattern_type not in stix2misp_mapping.network_traffic_mapping: + pattern_value = pattern_value.strip("'") + if pattern_type.startswith('network-traffic:protocols['): + attributes.append({ + 'type': 'text', 'value': pattern_value, + 'object_relation': f'layer{stix2misp_mapping.connection_protocols[pattern_value]}-protocol' + }) + elif any(pattern_type.startswith(f'network-traffic:{feature}_ref') for feature in ('src', 'dst')): + feature_type, ref = pattern_type.split(':')[1].split('_') + ref, feature = ref.split('.') + ref = f"{feature_type}_{'0' if ref == 'ref' else ref.strip('ref[]')}" + references[ref].update(self._parse_network_connection_reference(feature_type, feature, pattern_value)) + continue + attribute = deepcopy(stix2misp_mapping.network_traffic_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + attributes.extend(attribute for attribute in references.values()) + return attributes + + def parse_network_socket_pattern(self, pattern): + attributes = [] + references = defaultdict(dict) + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + pattern_value = pattern_value.strip("'") + if pattern_type not in stix2misp_mapping.network_traffic_mapping: + if pattern_type in stix2misp_mapping.network_socket_extension_mapping: + attribute = deepcopy(stix2misp_mapping.network_socket_extension_mapping[pattern_type]) + if pattern_type.startswith("network-traffic:extensions.'socket-ext'.is_"): + if pattern_value != 'True': + continue + pattern_value = pattern_type.split('_')[1] + else: + if pattern_type.startswith('network-traffic:protocols['): + attributes.append({'type': 'text', 'object_relation': 'protocol', 'value': pattern_value}) + elif any(pattern_type.startswith(f'network-traffic:{feature}_ref') for feature in ('src', 'dst')): + feature_type, ref = pattern_type.split(':')[1].split('_') + ref, feature = ref.split('.') + ref = f"{feature_type}_{'0' if ref == 'ref' else ref.strip('ref[]')}" + references[ref].update(self._parse_network_connection_reference(feature_type, feature, pattern_value)) + continue + else: + attribute = deepcopy(stix2misp_mapping.network_traffic_mapping[pattern_type]) + attribute['value'] = pattern_value + attributes.append(attribute) + attributes.extend(attribute for attribute in references.values()) + return attributes + + def parse_pe_pattern(self, pattern): + attributes = [] + sections = defaultdict(dict) + pe = MISPObject('pe', misp_objects_path_custom=_misp_objects_path) + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + if ':extensions.' in pattern_type: + if '.sections[' in pattern_type: + pattern_type = pattern_type.split('.') + relation = pattern_type[-1].strip("'") + if relation in stix2misp_mapping.pe_section_mapping: + sections[pattern_type[2][-2]][relation] = pattern_value.strip("'") + else: + pattern_type = pattern_type.split('.')[-1] + if pattern_type not in stix2misp_mapping.pe_mapping: + if pattern_type.startswith('x_misp_'): + attribute = self.parse_custom_property(pattern_type) + attribute['value'] = pattern_value.strip("'") + pe.add_attribute(**attribute) + continue + attribute = deepcopy(stix2misp_mapping.pe_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + pe.add_attribute(**attribute) + else: + if pattern_type not in stix2misp_mapping.file_mapping: + if pattern_type.startswith('x_misp_'): + attribute = self.parse_custom_property(pattern_type) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + continue + attribute = deepcopy(stix2misp_mapping.file_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + for section in sections.values(): + pe_section = MISPObject('pe-section', misp_objects_path_custom=_misp_objects_path) + for feature, value in section.items(): + attribute = deepcopy(stix2misp_mapping.pe_section_mapping[feature]) + attribute['value'] = value + pe_section.add_attribute(**attribute) + self.misp_event.add_object(pe_section) + pe.add_reference(pe_section.uuid, 'includes') + self.misp_event.add_object(pe) + return attributes, pe.uuid + + def parse_process_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'process_mapping') + + def parse_regkey_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'regkey_mapping') + + def parse_url_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'url_mapping') + + @staticmethod + def parse_user_account_pattern(pattern): + attributes = [] + for pattern_part in pattern: + pattern_type, pattern_value = pattern_part.split(' = ') + pattern_type = pattern_type.split('.')[-1].split('[')[0] if "extensions.'unix-account-ext'" in pattern_type else pattern_type.split(':')[-1] + if pattern_type not in stix2misp_mapping.user_account_mapping: + if pattern_type.startswith('group'): + attributes.append({'type': 'text', 'object_relation': 'group', 'value': pattern_value.strip("'")}) + continue + attribute = deepcopy(stix2misp_mapping.user_account_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + return attributes + + def parse_x509_pattern(self, pattern): + return self.fill_pattern_attributes(pattern, 'x509_mapping') + + ################################################################################ + ## UTILITY FUNCTIONS. ## + ################################################################################ + + def create_attribute_dict(self, stix_object): + labels = stix_object['labels'] + attribute_uuid = stix_object.id.split('--')[1] + attribute = {'uuid': attribute_uuid, + 'type': self.get_misp_type(labels), + 'category': self.get_misp_category(labels)} + tags = [{'name': label} for label in labels[3:]] + if tags: + attribute['Tag'] = tags + attribute.update(self.parse_timeline(stix_object)) + if hasattr(stix_object, 'description') and stix_object.description: + attribute['comment'] = stix_object.description + if hasattr(stix_object, 'object_marking_refs'): + self.update_marking_refs(attribute_uuid, stix_object.object_marking_refs) + return attribute + + def create_misp_object(self, stix_object): + labels = stix_object['labels'] + object_type = self.get_misp_type(labels) + misp_object = MISPObject('file' if object_type == 'WindowsPEBinaryFile' else object_type, + misp_objects_path_custom=_misp_objects_path) + misp_object.uuid = stix_object.id.split('--')[1] + if hasattr(stix_object, 'description') and stix_object.description: + misp_object.comment = stix_object.description + misp_object.update(self.parse_timeline(stix_object)) + return misp_object, object_type + + @staticmethod + def _fill_object_attribute(feature, value): + return {'value': str(value) if feature in ('entropy', 'size') else value} + + @staticmethod + def _fill_observable_object_attribute(feature, value): + return {'value': str(value) if feature in ('entropy', 'size') else value, + 'to_ids': False} + + @staticmethod + def get_misp_category(labels): + return labels[1].split('=')[1].strip('"') + + @staticmethod + def get_misp_type(labels): + return labels[0].split('=')[1].strip('"') + + @staticmethod + def parse_attribute_pattern(pattern): + if ' AND ' in pattern: + pattern_parts = pattern.strip('[]').split(' AND ') + if len(pattern_parts) == 3: + _, value1 = pattern_parts[2].split(' = ') + _, value2 = pattern_parts[0].split(' = ') + return '{}|{}'.format(value1.strip("'"), value2.strip("'")) + else: + _, value1 = pattern_parts[0].split(' = ') + _, value2 = pattern_parts[1].split(' = ') + if value1 in ("'ipv4-addr'", "'ipv6-addr'"): + return value2.strip("'") + return '{}|{}'.format(value1.strip("'"), value2.strip("'")) + else: + return pattern.split(' = ')[1].strip("]'") + + def parse_attribute_pattern_with_data(self, pattern): + if 'file:content_ref.payload_bin' not in pattern: + return self.parse_attribute_pattern(pattern) + pattern_parts = pattern.strip('[]').split(' AND ') + if len(pattern_parts) == 3: + filename = pattern_parts[0].split(' = ')[1] + md5 = pattern_parts[1].split(' = ')[1] + return "{}|{}".format(filename.strip("'"), md5.strip("'")), pattern_parts[2].split(' = ')[1].strip("'") + return pattern_parts[0].split(' = ')[1].strip("'"), pattern_parts[1].split(' = ')[1].strip("'") + + @staticmethod + def parse_custom_property(custom_property): + properties = custom_property.split('_') + return {'type': properties[2], 'object_relation': '-'.join(properties[3:])} + + +class ExternalStixParser(StixParser): + def __init__(self): + super().__init__() + self._stix2misp_mapping.update({'attack-pattern': 'parse_attack_pattern', + 'course-of-action': 'parse_course_of_action', + 'vulnerability': 'parse_vulnerability'}) + + ################################################################################ + ## PARSING FUNCTIONS. ## + ################################################################################ + + def parse_event(self, stix_event): + for stix_object in stix_event.objects: + object_type = stix_object['type'] + if object_type in self._stix2misp_mapping: + getattr(self, self._stix2misp_mapping[object_type])(stix_object) + else: + print(f'not found: {object_type}', file=sys.stderr) + if self.relationship: + self.parse_relationships() + if self.galaxy: + self.parse_galaxies() + event_uuid = stix_event.id.split('--')[1] + if hasattr(self, 'report'): + self.parse_report(event_uuid=event_uuid) + else: + self.misp_event.uuid = event_uuid + self.misp_event.info = 'Imported with the STIX to MISP import script.' + self.handle_markings() + + def parse_galaxy(self, galaxy): + galaxy_names = self._check_existing_galaxy_name(galaxy.name) + if galaxy_names is not None: + return galaxy_names + return [f'misp-galaxy:{galaxy._type}="{galaxy.name}"'] + + def _parse_indicator(self, indicator): + pattern = indicator.pattern + if any(relation in pattern for relation in stix2misp_mapping.pattern_forbidden_relations) or all(relation in pattern for relation in (' OR ', ' AND ')): + self.add_stix2_pattern_object(indicator) + separator = ' OR ' if ' OR ' in pattern else ' AND ' + self.parse_usual_indicator(indicator, separator) + + def _parse_observable(self, observable): + types = self._parse_observable_types(observable.objects) + try: + getattr(self, stix2misp_mapping.observable_mapping[types])(observable) + except KeyError: + print(f'Type(s) not supported at the moment: {types}\n', file=sys.stderr) + + def _parse_undefined(self, stix_object): + try: + self.objects_to_parse[stix_object['id'].split('--')[1]] = stix_object + except AttributeError: + self.objects_to_parse = {stix_object['id'].split('--')[1]: stix_object} + + def add_stix2_pattern_object(self, indicator): + misp_object = MISPObject('stix2-pattern', misp_objects_path_custom=_misp_objects_path) + misp_object.uuid = indicator.id.split('--')[1] + misp_object.update(self.parse_timeline(indicator)) + version = f'STIX {indicator.pattern_version}' if hasattr(indicator, 'pattern_version') else 'STIX 2.0' + misp_object.add_attribute(**{'type': 'text', 'object_relation': 'version', 'value': version}) + misp_object.add_attribute(**{'type': 'stix2-pattern', 'object_relation': 'stix2-pattern', + 'value': indicator.pattern}) + self.misp_event.add_object(**misp_object) + + @staticmethod + def fill_misp_object(misp_object, stix_object, mapping): + for key, feature in getattr(stix2misp_mapping, mapping).items(): + if hasattr(stix_object, key): + attribute = deepcopy(feature) + attribute['value'] = getattr(stix_object, key) + misp_object.add_attribute(**attribute) + + @staticmethod + def fill_misp_object_from_dict(misp_object, stix_object, mapping): + for key, feature in getattr(stix2misp_mapping, mapping).items(): + if key in stix_object: + attribute = deepcopy(feature) + attribute['value'] = stix_object[key] + misp_object.add_attribute(**attribute) + + def parse_attack_pattern(self, attack_pattern): + galaxy_names = self._check_existing_galaxy_name(attack_pattern.name) + if galaxy_names is not None: + self.galaxy[attack_pattern['id'].split('--')[1]] = {'tag_names': galaxy_names, 'used': False} + else: + misp_object = self.create_misp_object(attack_pattern) + if hasattr(attack_pattern, 'external_references'): + for reference in attack_pattern.external_references: + source_name = reference['source_name'] + value = reference['external_id'].split('-')[1] if source_name == 'capec' else reference['url'] + attribute = deepcopy(stix2misp_mapping.attack_pattern_references_mapping[source_name]) if source_name in stix2misp_mapping.attack_pattern_references_mapping else stix2misp_mapping.references_attribute_mapping + attribute['value'] = value + misp_object.add_attribute(**attribute) + self.fill_misp_object(misp_object, attack_pattern, 'attack_pattern_mapping') + self.misp_event.add_object(**misp_object) + + def parse_course_of_action(self, course_of_action): + galaxy_names = self._check_existing_galaxy_name(course_of_action.name) + if galaxy_names is not None: + self.galaxy[course_of_action['id'].split('--')[1]] = {'tag_names': galaxy_names, 'used': False} + else: + misp_object = self.create_misp_object(course_of_action) + self.fill_misp_object(misp_object, course_of_action, 'course_of_action_mapping') + self.misp_event.add_object(**misp_object) + + def parse_usual_indicator(self, indicator, separator): + pattern = tuple(part.strip() for part in self._handle_pattern(indicator.pattern).split(separator)) + types = self._parse_pattern_types(pattern) + try: + getattr(self, stix2misp_mapping.pattern_mapping[types])(indicator, separator) + except KeyError: + print(f'Type(s) not supported at the moment: {types}\n', file=sys.stderr) + self.add_stix2_pattern_object(indicator) + + def parse_vulnerability(self, vulnerability): + galaxy_names = self._check_existing_galaxy_name(vulnerability.name) + if galaxy_names is not None: + self.galaxy[vulnerability['id'].split('--')[1]] = {'tag_names': galaxy_names, 'used': False} + else: + attributes = self._get_attributes_from_observable(vulnerability, 'vulnerability_mapping') + if hasattr(vulnerability, 'external_references'): + for reference in vulnerability.external_references: + if reference['source_name'] == 'url': + attribute = deepcopy(stix2misp_mapping.references_attribute_mapping) + attribute['value'] = reference['url'] + attributes.append(attribute) + if len(attributes) == 1 and attributes[0]['object_relation'] == 'id': + attributes[0]['type'] = 'vulnerability' + self.handle_import_case(vulnerability, attributes, 'vulnerability') + + ################################################################################ + ## OBSERVABLE PARSING FUNCTIONS ## + ################################################################################ + + @staticmethod + def _fetch_reference_type(references, object_type): + for key, reference in references.items(): + if isinstance(reference, getattr(stix2.v20.observables, object_type)): + return key + return None + + @staticmethod + def _fetch_user_account_type_observable(observable_objects): + for observable_object in observable_objects.values(): + if hasattr(observable_object, 'extensions') or any(key not in ('user_id', 'credential', 'type') for key in observable_object): + return 'user-account', 'user_account_mapping' + return 'credential', 'credential_mapping' + + @staticmethod + def _get_attributes_from_observable(stix_object, mapping): + attributes = [] + for key, value in stix_object.items(): + if key in getattr(stix2misp_mapping, mapping) and value: + attribute = deepcopy(getattr(stix2misp_mapping, mapping)[key]) + attribute.update({'value': value, 'to_ids': False}) + attributes.append(attribute) + return attributes + + def get_network_traffic_attributes(self, network_traffic, references): + attributes = self._get_attributes_from_observable(network_traffic, 'network_traffic_mapping') + mapping = 'network_traffic_references_mapping' + attributes.extend(self.parse_network_traffic_references(network_traffic, references, mapping)) + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, mapping, 'dst')) + return attributes + + @staticmethod + def _handle_attachment_type(stix_object, is_reference, filename): + _has_md5 = hasattr(stix_object, 'hashes') and 'MD5' in stix_object.hashes + if is_reference and _has_md5: + return 'malware-sample', f'{filename}|{stix_object.hashes["MD5"]}' + return 'attachment', filename + + def handle_pe_observable(self, attributes, extension, observable): + pe_uuid = self.parse_pe(extension) + file = self.create_misp_object(observable, 'file') + file.add_reference(pe_uuid, 'includes') + for attribute in attributes: + file.add_attribute(**attribute) + self.misp_event.add_object(file) + + @staticmethod + def _is_reference(network_traffic, reference): + for feature in ('src', 'dst'): + for reference_type in (f'{feature}_{ref}' for ref in ('ref', 'refs')): + if reference in network_traffic.get(reference_type, []): + return True + return False + + @staticmethod + def _network_traffic_has_extension(network_traffic): + if not hasattr(network_traffic, 'extensions'): + return None + if 'socket-ext' in network_traffic.extensions: + return 'parse_socket_extension_observable' + return None + + def parse_asn_observable(self, observable): + autonomous_system, references = self.filter_main_object(observable.objects, 'AutonomousSystem') + mapping = 'asn_mapping' + attributes = self._get_attributes_from_observable(autonomous_system, mapping) + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, mapping)) + self.handle_import_case(observable, attributes, 'asn') + + def parse_domain_ip_observable(self, observable): + domain, references = self.filter_main_object(observable.objects, 'DomainName') + mapping = 'domain_ip_mapping' + attributes = [self._parse_observable_reference(domain, mapping)] + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, mapping)) + self.handle_import_case(observable, attributes, 'domain-ip') + + def parse_domain_ip_network_traffic_observable(self, observable): + network_traffic, references = self.filter_main_object(observable.objects, 'NetworkTraffic') + extension = self._network_traffic_has_extension(network_traffic) + if extension: + attributes, object_name = getattr(self, extension)(network_traffic, references) + return self.handle_import_case(observable, attributes, object_name) + if self._required_protocols(network_traffic.protocols): + attributes = self.parse_network_connection_object(network_traffic, references) + return self.handle_import_case(observable, attributes, 'network-connection') + attributes, object_name = self.parse_network_traffic_objects(network_traffic, references) + self.handle_import_case(observable, attributes, object_name) + + def parse_domain_network_traffic_observable(self, observable): + network_traffic, references = self.filter_main_object(observable.objects, 'NetworkTraffic') + extension = self._network_traffic_has_extension(network_traffic) + if extension: + attributes, object_name = getattr(self, extension)(network_traffic, references) + return self.handle_import_case(observable, attributes, object_name) + attributes = self.parse_network_connection_object(network_traffic, references) + self.handle_import_case(observable, attributes, 'network-connection') + + def parse_email_address_observable(self, observable): + self.add_attributes_from_observable(observable, 'email-src', 'value') + + def parse_email_observable(self, observable): + email_message, references = self.filter_main_object(observable.objects, 'EmailMessage') + attributes = self._get_attributes_from_observable(email_message, 'email_mapping') + if hasattr(email_message, 'additional_header_fields'): + attributes.extend(self._get_attributes_from_observable(email_message.additional_header_fields, 'email_mapping')) + attributes.extend(self._parse_email_references(email_message, references)) + if hasattr(email_message, 'body_multipart') and email_message.body_multipart: + attributes.extend(self._parse_email_body(email_message.body_multipart, references)) + if references: + print(f'Unable to parse the following observable objects: {references}', file=sys.stderr) + self.handle_import_case(observable, attributes, 'email') + + def parse_file_observable(self, observable): + file_object, references = self.filter_main_object(observable.objects, 'File') + attributes = self._get_attributes_from_observable(file_object, 'file_mapping') + if 'hashes' in file_object: + attributes.extend(self._get_attributes_from_observable(file_object.hashes, 'file_mapping')) + if references: + filename = file_object.name if hasattr(file_object, 'name') else 'unknown_filename' + for key, reference in references.items(): + if isinstance(reference, stix2.v20.observables.Artifact): + _is_content_ref = 'content_ref' in file_object and file_object.content_ref == key + attribute_type, value = self._handle_attachment_type(reference, _is_content_ref, filename) + attribute = { + 'type': attribute_type, + 'object_relation': attribute_type, + 'value': value, + 'to_ids': False + } + if hasattr(reference, 'payload_bin'): + attribute['data'] = reference.payload_bin + attributes.append(attribute) + elif isinstance(reference, stix2.v20.observables.Directory): + attribute = { + 'type': 'text', + 'object_relation': 'path', + 'value': reference.path, + 'to_ids': False + } + attributes.append(attribute) + if hasattr(file_object, 'extensions'): + # Support of more extension types probably in the future + if 'windows-pebinary-ext' in file_object.extensions: + # Here we do not go to the standard route of "handle_import_case" + # because we want to make sure a file object is created + return self.handle_pe_observable(attributes, file_object.extensions['windows-pebinary-ext'], observable) + extension_types = (extension_type for extension_type in file_object.extensions.keys()) + print(f'File extension type(s) not supported at the moment: {", ".join(extension_types)}', file=sys.stderr) + self.handle_import_case(observable, attributes, 'file', _force_object=('file-encoding', 'path')) + + def parse_ip_address_observable(self, observable): + attributes = [] + for observable_object in observable.objects.values(): + attribute = { + 'value': observable_object.value, + 'to_ids': False + } + attribute.update(stix2misp_mapping.ip_attribute_mapping) + attributes.append(attribute) + self.handle_import_case(observable, attributes, 'ip-port') + + def parse_ip_network_traffic_observable(self, observable): + network_traffic, references = self.filter_main_object(observable.objects, 'NetworkTraffic') + extension = self._network_traffic_has_extension(network_traffic) + if extension: + attributes, object_name = getattr(self, extension)(network_traffic, references) + return self.handle_import_case(observable, attributes, object_name) + attributes = self.parse_ip_port_object(network_traffic, references) + self.handle_import_case(observable, attributes, 'ip-port') + + def parse_ip_port_object(self, network_traffic, references): + attributes = self._get_attributes_from_observable(network_traffic, 'network_traffic_mapping') + attributes.extend(self.parse_network_traffic_references(network_traffic, references, 'ip_port_references_mapping')) + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, 'domain_ip_mapping')) + return attributes + + def parse_mac_address_observable(self, observable): + self.add_attributes_from_observable(observable, 'mac-address', 'value') + + def parse_network_connection_object(self, network_traffic, references): + attributes = self.get_network_traffic_attributes(network_traffic, references) + attributes.extend(self.parse_protocols(network_traffic.protocols, 'observable object')) + return attributes + + def parse_network_traffic_objects(self, network_traffic, references): + _has_domain = self._fetch_reference_type(references.values(), 'DomainName') + if _has_domain and self._is_reference(network_traffic, _has_domain): + return self.parse_network_connection_object(network_traffic, references), 'network-connection' + return self.parse_ip_port_object(network_traffic, references), 'ip-port' + + def parse_network_traffic_references(self, network_traffic, references, mapping): + attributes = [] + for feature in ('src', 'dst'): + ref = f'{feature}_ref' + if hasattr(network_traffic, ref): + reference = getattr(network_traffic, ref) + attributes.append(self._parse_observable_reference(references.pop(reference), mapping, feature)) + if hasattr(network_traffic, f'{ref}s'): + for reference in getattr(network_traffic, f'{ref}s'): + attributes.append(self._parse_observable_reference(references.pop(reference), mapping, feature)) + return attributes + + def parse_mutex_observable(self, observable): + self.add_attributes_from_observable(observable, 'mutex', 'name') + + def parse_process_observable(self, observable): + process, references = self.filter_main_object(observable.objects, 'Process', test_function='_process_test_filter') + attributes = self._get_attributes_from_observable(process, 'process_mapping') + if hasattr(process, 'parent_ref'): + attributes.extend(self._get_attributes_from_observable(references.pop(process.parent_ref), 'parent_process_reference_mapping')) + if hasattr(process, 'child_refs'): + for reference in process.child_refs: + attributes.extend(self._get_attributes_from_observable(references.pop(reference), 'child_process_reference_mapping')) + if hasattr(process, 'binary_ref'): + reference = references.pop(process.binary_ref) + attribute = { + 'value': reference.name, + 'to_ids': False + } + attribute.update(stix2misp_mapping.process_image_mapping) + attributes.append(attribute) + if references: + print(f'Unable to parse the following observable objects: {references}', file=sys.stderr) + self.handle_import_case(observable, attributes, 'process', _force_object=True) + + def parse_protocols(self, protocols, object_type): + attributes = [] + protocols = (protocol.upper() for protocol in protocols) + for protocol in protocols: + try: + attributes.append(self._parse_network_traffic_protocol(protocol)) + except KeyError: + print(f'Unknown protocol in network-traffic {object_type}: {protocol}', file=sys.stderr) + return attributes + + def parse_regkey_observable(self, observable): + attributes = [] + for observable_object in observable.objects.values(): + attributes.extend(self._get_attributes_from_observable(observable_object, 'regkey_mapping')) + if 'values' in observable_object: + for registry_value in observable_object['values']: + attributes.extend(self._get_attributes_from_observable(registry_value, 'regkey_mapping')) + self.handle_import_case(observable, attributes, 'registry-key') + + def parse_socket_extension_observable(self, network_traffic, references): + attributes = self.get_network_traffic_attributes(network_traffic, references) + for key, value in network_traffic.extensions['socket-ext'].items(): + if key not in stix2misp_mapping.network_socket_extension_mapping: + print(f'Unknown socket extension field in observable object: {key}', file=sys.stderr) + continue + if key.startswith('is_') and not value: + continue + attribute = { + 'value': key.split('_')[1] if key.startswith('is_') else value, + 'to_ids': False + } + attribute.update(stix2misp_mapping.network_socket_extension_mapping[key]) + attributes.append(attribute) + return attributes, 'network-socket' + + def parse_url_observable(self, observable): + network_traffic, references = self.filter_main_object(observable.objects, 'NetworkTraffic') + attributes = self._get_attributes_from_observable(network_traffic, 'network_traffic_mapping') if network_traffic else [] + if references: + for reference in references.values(): + attributes.append(self._parse_observable_reference(reference, 'url_mapping')) + self.handle_import_case(observable, attributes, 'url') + + def parse_user_account_extension(self, extension): + attributes = self._parse_user_account_groups(extension['groups']) if 'groups' in extension else [] + attributes.extend(self._get_attributes_from_observable(extension, 'user_account_mapping')) + return attributes + + def parse_user_account_observable(self, observable): + attributes = [] + object_name, mapping = self._fetch_user_account_type_observable(observable.objects) + for observable_object in observable.objects.values(): + attributes.extend(self._get_attributes_from_observable(observable_object, mapping)) + if hasattr(observable_object, 'extensions') and observable_object.extensions.get('unix-account-ext'): + attributes.extend(self.parse_user_account_extension(observable_object.extensions['unix-account-ext'])) + self.handle_import_case(observable, attributes, object_name) + + def parse_x509_observable(self, observable): + attributes = [] + for observable_object in observable.objects.values(): + attributes.extend(self._get_attributes_from_observable(observable_object, 'x509_mapping')) + if hasattr(observable_object, 'hashes'): + attributes.extend(self._get_attributes_from_observable(observable_object.hashes, 'x509_mapping')) + self.handle_import_case(observable, attributes, 'x509') + + ################################################################################ + ## PATTERN PARSING FUNCTIONS. ## + ################################################################################ + + @staticmethod + def _fetch_user_account_type_pattern(pattern): + for stix_object in pattern: + if 'extensions' in stix_object or all(key not in stix_object for key in ('user_id', 'credential', 'type')): + return 'user-account', 'user_account_mapping' + return 'credential', 'credential_mapping' + + def get_attachment(self, attachment, filename): + attribute = { + 'type': 'attachment', + 'object_relation': 'attachment', + 'value': attachment.pop(filename) + } + data_feature = self._choose_with_priority(attachment, 'file:content_ref.payload_bin', 'artifact:payload_bin') + attribute['data'] = attachment.pop(data_feature) + return attribute + + def get_attributes_from_pattern(self, pattern, mapping, separator): + attributes = [] + for pattern_part in pattern.strip('[]').split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + try: + attribute = deepcopy(getattr(stix2misp_mapping, mapping)[pattern_type]) + except KeyError: + print(f'Pattern type not supported at the moment: {pattern_type}', file=sys.stderr) + continue + attribute['value'] = pattern_value + attributes.append(attribute) + return attributes + + def get_malware_sample(self, attachment, filename): + md5_feature = self._choose_with_priority(attachment, "file:content_ref.hashes.'MD5'", "file:hashes.'MD5'") + attribute = { + 'type': 'malware-sample', + 'object_relation': 'malware-sample', + 'value': f'{attachment.pop(filename)}|{attachment.pop(md5_feature)}' + } + data_feature = self._choose_with_priority(attachment, 'file:content_ref.payload_bin', 'artifact:payload_bin') + attribute['data'] = attachment.pop(data_feature) + return attribute + + def _handle_file_attachments(self, attachment): + attributes = [] + if any('content_ref' in feature for feature in attachment.keys()): + attribute_type = 'attachment' + value = attachment['file:name'] if 'file:name' in attachment else 'unknown_filename' + if "file:content_ref.hashes.'MD5'" in attachment: + attribute_type = 'malware-sample' + md5 = attachment.pop("file:content_ref.hashes.'MD5'") + value = f'{value}|{md5}' + data = self._choose_with_priority(attachment, 'file:content_ref.payload_bin', 'artifact:payload_bin') + attribute = { + 'type': attribute_type, + 'object_relation': attribute_type, + 'value': value, + 'data': attachment.pop(data) + } + attributes.append(attribute) + if 'artifact:payload_bin' in attachment: + attribute = { + 'type': 'attachment', + 'object_relation': 'attachment', + 'value': attachment['file:name'], + 'data': attachment.pop('artifact:payload_bin') + } + attributes.append(attribute) + return attributes + + def parse_as_pattern(self, indicator, separator): + attributes = self.get_attributes_from_pattern(indicator.pattern, 'asn_mapping', separator) + self.handle_import_case(indicator, attributes, 'asn') + + def parse_domain_ip_port_pattern(self, indicator, separator): + attributes = [] + references = defaultdict(dict) + for pattern_part in self._handle_pattern(indicator.pattern).split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + if pattern_type not in stix2misp_mapping.domain_ip_mapping: + if any(pattern_type.startswith(f'network-traffic:{feature}_ref') for feature in ('src', 'dst')): + feature_type, ref = pattern_type.split(':')[1].split('_') + ref, feature = ref.split('.') + ref = f"{feature_type}_{'0' if ref == 'ref' else ref.strip('ref[]')}" + references[ref].update(self._parse_network_connection_reference(feature_type, feature, pattern_value)) + else: + print(f'Pattern type not currently mapped: {pattern_type}', file=sys.stderr) + continue + attribute = deepcopy(stix2misp_mapping.domain_ip_mapping[pattern_type]) + attribute['value'] = pattern_value + attributes.append(attribute) + if references: + attributes.extend(references.values()) + object_name = 'ip-port' if 'network-traffic' in indicator.pattern else 'domain-ip' + self.handle_import_case(indicator, attributes, object_name) + + def parse_email_address_pattern(self, indicator, separator): + self.add_attributes_from_indicator(indicator, 'email-src', separator) + + def parse_email_message_pattern(self, indicator, separator): + attributes = [] + attachments = defaultdict(dict) + for pattern_part in self._handle_pattern(indicator.pattern).split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + if pattern_type not in stix2misp_mapping.email_mapping: + if pattern_type.startswith('email-message:body_multipart'): + features = pattern_type.split('.') + if len(features) == 3 and features[1] == 'body_raw_ref': + index = features[0].split('[')[1].strip(']') if '[' in features[0] else '0' + key = 'data' if features[2] == 'payload_bin' else 'value' + attachments[index][key] = pattern_value + continue + print(f'Pattern type not supported at the moment: {pattern_type}', file=sys.stderr) + continue + attribute = deepcopy(stix2misp_mapping.email_mapping[pattern_type]) + attribute['value'] = pattern_value + attributes.append(attribute) + if attachments: + for attachment in attachments.values(): + attribute = { + 'type': 'attachment', + 'object_relation': 'screenshot' + } if 'data' in attachment else { + 'type': 'email-attachment', + 'object_relation': 'attachment' + } + attribute.update(attachment) + attributes.append(attribute) + self.handle_import_case(indicator, attributes, 'email') + + def parse_file_pattern(self, indicator, separator): + attributes = [] + attachment = {} + extensions = defaultdict(lambda: defaultdict(dict)) + for pattern_part in self._handle_pattern(indicator.pattern).split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + if pattern_type in stix2misp_mapping.attachment_types: + attachment[pattern_type] = pattern_value.strip("'") + continue + if pattern_type not in stix2misp_mapping.file_mapping: + if 'extensions' in pattern_type: + features = pattern_type.split('.')[1:] + extension_type = features.pop(0).strip("'") + if 'section' in features[0] and features[0] != 'number_of_sections': + index = features[0].split('[')[1].strip(']') if '[' in features[0] else '0' + extensions[extension_type][f'section_{index}'][features[-1].strip("'")] = pattern_value + else: + extensions[extension_type]['.'.join(features)] = pattern_value + continue + attribute = deepcopy(stix2misp_mapping.file_mapping[pattern_type]) + attribute['value'] = pattern_value + attributes.append(attribute) + if any(key.endswith('payload_bin') for key in attachment.keys()): + attributes.extend(self._handle_file_attachments(attachment)) + if attachment: + for pattern_type, value in attachment.items(): + if pattern_type in stix2misp_mapping.file_mapping: + attribute = deepcopy(stix2misp_mapping.file_mapping[pattern_type]) + attribute['value'] = value + attributes.append(attribute) + if extensions: + file_object = self.create_misp_object(indicator, 'file') + self.parse_file_extension(file_object, attributes, extensions) + else: + self.handle_import_case(indicator, attributes, 'file', _force_object=('file-encoding', 'path')) + + def parse_file_extension(self, file_object, attributes, extensions): + for attribute in attributes: + file_object.add_attribute(**attribute) + if 'windows-pebinary-ext' in extensions: + pe_extension = extensions['windows-pebinary-ext'] + pe_object = MISPObject('pe', misp_objects_path_custom=_misp_objects_path) + sections = self._get_sections(pe_extension) + self.fill_misp_object_from_dict(pe_object, pe_extension, 'pe_mapping') + if sections: + for section in sections: + section_object = MISPObject('pe-section') + self.fill_misp_object_from_dict(section_object, section, 'pe_section_mapping') + self.misp_event.add_object(section_object) + pe_object.add_reference(section_object.uuid, 'includes') + self.misp_event.add_object(pe_object) + file_object.add_reference(pe_object.uuid, 'includes') + self.misp_event.add_object(file_object) + + def parse_ip_address_pattern(self, indicator, separator): + self.add_attributes_from_indicator(indicator, 'ip-dst', separator) + + def parse_mac_address_pattern(self, indicator, separator): + self.add_attributes_from_indicator(indicator, 'mac-address', separator) + + def parse_mutex_pattern(self, indicator, separator): + self.add_attributes_from_indicator(indicator, 'mutex', separator) + + def parse_network_connection_pattern(self, indicator, attributes, references): + attributes.extend(self._parse_network_pattern_references(references, 'network_traffic_references_mapping')) + self.handle_import_case(indicator, attributes, 'network-connection') + + @staticmethod + def _parse_network_pattern_references(references, mapping): + attributes = [] + for feature, reference in references.items(): + feature = feature.split('_')[0] + attribute = {key: value.format(feature) for key, value in getattr(stix2misp_mapping, mapping)[reference['type']].items()} + attribute['value'] = reference['value'] + attributes.append(attribute) + return attributes + + def parse_network_socket_pattern(self, indicator, attributes, references, extension): + attributes.extend(self._parse_network_pattern_references(references, 'network_traffic_references_mapping')) + for key, value in extension.items(): + if key not in stix2misp_mapping.network_socket_extension_mapping: + print(f'Unknown socket extension field in pattern: {key}', file=sys.stderr) + continue + if key.startswith('is_') and not json.loads(value.lower()): + continue + attribute = deepcopy(stix2misp_mapping.network_socket_extension_mapping[key]) + attribute['value'] = key.split('_')[1] if key.startswith('is_') else value + attributes.append(attribute) + self.handle_import_case(indicator, attributes, 'network-socket') + + def parse_network_traffic_pattern(self, indicator, separator): + attributes = [] + protocols = [] + references = defaultdict(dict) + extensions = defaultdict(dict) + for pattern_part in self._handle_pattern(indicator.pattern).split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + if pattern_type in stix2misp_mapping.network_traffic_mapping: + attribute = deepcopy(stix2misp_mapping.network_traffic_mapping[pattern_type]) + attribute['value'] = pattern_value.strip("'") + attributes.append(attribute) + continue + if pattern_type.startswith('network-traffic:protocols['): + protocols.append(pattern_value) + elif any(pattern_type.startswith(f'network-traffic:{feature}_ref') for feature in ('src', 'dst')): + feature_type, ref = pattern_type.split(':')[1].split('_') + ref, feature = ref.split('.') + ref = f"{feature_type}_{'0' if ref == 'ref' else ref.strip('ref[]')}" + references[ref].update({feature: pattern_value}) + elif pattern_type.startswith('network-traffic:extensions.'): + _, extension_type, feature = pattern_type.split('.') + extensions[extension_type.strip("'")][feature] = pattern_value + else: + print(f'Pattern type not supported at the moment: {pattern_type}', file=sys.stderr) + if extensions: + if 'socket-ext' in extensions: + return self.parse_network_socket_pattern(indicator, attributes, references, extensions['socket-ext']) + print(f'Unknown network extension(s) in pattern: {", ".join(extensions.keys())}', file=sys.stderr) + if protocols and self._required_protocols(protocols): + attributes.extend(self.parse_protocols(protocols, 'pattern')) + return self.parse_network_connection_pattern(indicator, attributes, references) + attributes.extend(self._parse_network_pattern_references(references, 'ip_port_references_mapping')) + self.handle_import_case(indicator, attributes, 'ip-port') + + def parse_process_pattern(self, indicator, separator): + attributes = [] + parent = {} + child = defaultdict(set) + for pattern_part in self._handle_pattern(indicator.pattern).split(separator): + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + if 'parent_' in pattern_type: + child[pattern_type.split('.')[-1]].add(pattern_value) + elif 'child_' in pattern_type: + parent[pattern_type.split('.')[-1]] = pattern_value + else: + try: + attribute = deepcopy(stix2misp_mapping.process_mapping[pattern_type]) + except KeyError: + print(f'Pattern type not supported at the moment: {pattern_type}', file=sys.stderr) + continue + attribute['value'] = pattern_value + attributes.append(attribute) + if parent: + for key, value in parent.items(): + if key not in stix2misp_mapping.parent_process_reference_mapping: + print(f'Parent process key from pattern not supported at the moment: {key}', file=sys.stderr) + continue + attribute = {'value': value} + attribute.update(stix2misp_mapping.parent_process_reference_mapping[key]) + attributes.append(attribute) + if child: + for key, values in child.items(): + if key not in stix2misp_mapping.child_process_reference_mapping: + print(f'Child process key from pattern not supported at the moment: {key}', file=sys.stderr) + continue + for value in values: + attribute = {'value': value} + attribute.update(stix2misp_mapping.child_process_reference_mapping[key]) + attributes.append(attribute) + self.handle_import_case(indicator, attributes, 'process', _force_object=True) + + def parse_regkey_pattern(self, indicator, separator): + attributes = self.get_attributes_from_pattern(indicator.pattern, 'regkey_mapping', separator) + self.handle_import_case(indicator, attributes, 'registry-key') + + def parse_url_pattern(self, indicator, separator): + attributes = self.get_attributes_from_pattern(indicator.pattern, 'url_mapping', separator) + self.handle_import_case(indicator, attributes, 'url') + + def parse_user_account_pattern(self, indicator, separator): + attributes = [] + pattern = self._handle_pattern(indicator.pattern).split(separator) + object_name, mapping = self._fetch_user_account_type_pattern(pattern) + for pattern_part in pattern: + pattern_type, pattern_value = self.get_type_and_value_from_pattern(pattern_part) + pattern_type = pattern_type.split(':')[1] + if pattern_type.startswith('extensions.'): + pattern_type = pattern_type.split('.')[-1] + if '[' in pattern_type: + pattern_type = pattern_type.split('[')[0] + if pattern_type in ('group', 'groups'): + attributes.append({'type': 'text', 'object_relation': 'group', 'value': pattern_value}) + continue + if pattern_type in getattr(stix2misp_mapping, mapping): + attribute = deepcopy(getattr(stix2misp_mapping, mapping)[pattern_type]) + attribute['value'] = pattern_value + attributes.append(attribute) + self.handle_import_case(indicator, attributes, object_name) + + def parse_x509_pattern(self, indicator, separator): + attributes = self.get_attributes_from_pattern(indicator.pattern, 'x509_mapping', separator) + self.handle_import_case(indicator, attributes, 'x509') + + ################################################################################ + ## UTILITY FUNCTIONS. ## + ################################################################################ + + def add_attributes_from_indicator(self, indicator, attribute_type, separator): + patterns = self._handle_pattern(indicator.pattern).split(separator) + if len(patterns) == 1: + _, value = self.get_type_and_value_from_pattern(patterns[0]) + attribute = MISPAttribute() + attribute.from_dict(**{ + 'uuid': indicator.id.split('--')[1], + 'type': attribute_type, + 'value': value, + 'to_ids': True + }) + attribute.update(self.parse_timeline(indicator)) + self.misp_event.add_attribute(**attribute) + else: + tmp_attribute = self.parse_timeline(indicator) + for pattern in patterns: + _, value = self.get_type_and_value_from_pattern(pattern) + attribute = MISPAttribute() + attribute.from_dict(**{ + 'type': attribute_type, + 'value': value, + 'to_ids': True + }) + attribute.update(tmp_attribute) + self.misp_event.add_attribute(**attribute) + + def add_attributes_from_observable(self, observable, attribute_type, feature): + if len(observable.objects) == 1: + attribute = MISPAttribute() + attribute.from_dict(**{ + 'uuid': observable.id.split('--')[1], + 'type': attribute_type, + 'value': getattr(observable.objects['0'], feature), + 'to_ids': False + }) + attribute.update(self.parse_timeline(observable)) + self.misp_event.add_attribute(**attribute) + else: + tmp_attribute = self.parse_timeline(observable) + for observable_object in observable.objects.values(): + attribute = MISPAttribute() + attribute.from_dict(**{ + 'type': attribute_type, + 'value': getattr(observable_object, feature), + 'to_ids': False + }) + attribute.update(tmp_attribute) + self.misp_event.add_attribute(**attribute) + + def _check_existing_galaxy_name(self, galaxy_name): + if galaxy_name in self._synonyms_to_tag_names: + return self._synonyms_to_tag_names[galaxy_name] + for name, tag_names in self._synonyms_to_tag_names.items(): + if galaxy_name in name: + return tag_names + return None + + def create_misp_object(self, stix_object, name=None): + misp_object = MISPObject(name if name is not None else stix_object.type, + misp_objects_path_custom=_misp_objects_path) + misp_object.uuid = stix_object.id.split('--')[1] + if hasattr(stix_object, 'description') and stix_object.description: + misp_object.comment = stix_object.description + misp_object.update(self.parse_timeline(stix_object)) + return misp_object + + @staticmethod + def _get_sections(pe_extension): + sections = [feature for feature in pe_extension.keys() if feature.startswith('section_')] + return (pe_extension.pop(feature) for feature in sections) + + @staticmethod + def get_type_and_value_from_pattern(pattern): + pattern = pattern.strip('[]') + try: + pattern_type, pattern_value = pattern.split(' = \'') + except ValueError: + pattern_type, pattern_value = pattern.split('=') + return pattern_type.strip(), pattern_value.strip("'") + + def handle_import_case(self, stix_object, attributes, name, _force_object=False): + try: + if len(attributes) > 1 or (_force_object and self._handle_object_forcing(_force_object, attributes[0])): + misp_object = self.create_misp_object(stix_object, name) + for attribute in attributes: + misp_object.add_attribute(**attribute) + self.misp_event.add_object(**misp_object) + else: + attribute = {field: attributes[0][field] for field in stix2misp_mapping.single_attribute_fields if attributes[0].get(field) is not None} + attribute['uuid'] = stix_object.id.split('--')[1] + attribute.update(self.parse_timeline(stix_object)) + if isinstance(stix_object, stix2.v20.Indicator): + attribute['to_ids'] = True + if hasattr(stix_object, 'object_marking_refs'): + self.update_marking_refs(attribute['uuid'], stix_object.object_marking_refs) + self.misp_event.add_attribute(**attribute) + except IndexError: + object_type = 'indicator' if isinstance(stix_object, stix2.Indicator) else 'observable objects' + print(f'No attribute or object could be imported from the following {object_type}: {stix_object}', file=sys.stderr) + + @staticmethod + def _handle_object_forcing(_force_object, attribute): + if isinstance(_force_object, (list, tuple)): + return attribute['object_relation'] in _force_object + return _force_object + + @staticmethod + def _handle_pattern(pattern): + return pattern.strip().strip('[]') + + @staticmethod + def _parse_observable_types(observable_objects): + types = {observable_object._type for observable_object in observable_objects.values()} + return tuple(sorted(types)) + + @staticmethod + def _parse_pattern_types(pattern): + types = {part.split('=')[0].split(':')[0].strip('[') for part in pattern} + return tuple(sorted(types)) + + @staticmethod + def _required_protocols(protocols): + protocols = tuple(protocol.upper() for protocol in protocols) + if any(protocol not in ('TCP', 'IP') for protocol in protocols): + return True + return False + + +def from_misp(stix_objects): + for stix_object in stix_objects: + if stix_object['type'] == "report" and 'misp:tool="misp2stix2"' in stix_object.get('labels', []): + return True + return False + + +def main(args): + filename = args[1] if args[1][0] == '/' else Path(os.path.dirname(args[0]), args[1]) + with open(filename, 'rt', encoding='utf-8') as f: + event = stix2.parse(f.read(), allow_custom=True, interoperability=True) + stix_parser = StixFromMISPParser() if from_misp(event.objects) else ExternalStixParser() + stix_parser.handler(event, filename, args[2:]) + stix_parser.save_file() + print(1) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/misp_modules/lib/stix2misp_mapping.py b/misp_modules/lib/stix2misp_mapping.py new file mode 100644 index 0000000..706d990 --- /dev/null +++ b/misp_modules/lib/stix2misp_mapping.py @@ -0,0 +1,460 @@ +################################################################################ +# ATTRIBUTES AND OBJECTS MAPPING # +################################################################################ + +attributes_mapping = { + 'filename': '_parse_name', + 'ip-src': '_parse_value', + 'ip-dst': '_parse_value', + 'hostname': '_parse_value', + 'domain': '_parse_value', + 'domain|ip': '_parse_domain_ip_attribute', + 'email-src': '_parse_value', + 'email-dst': '_parse_value', + 'email-attachment': '_parse_name', + 'url': '_parse_value', + 'regkey': '_parse_regkey_attribute', + 'regkey|value': '_parse_regkey_value', + 'malware-sample': '_parse_malware_sample', + 'mutex': '_parse_name', + 'uri': '_parse_value', + 'port': '_parse_port', + 'ip-dst|port': '_parse_network_attribute', + 'ip-src|port': '_parse_network_attribute', + 'hostname|port': '_parse_network_attribute', + 'email-reply-to': '_parse_email_reply_to', + 'attachment': '_parse_attachment', + 'mac-address': '_parse_value', + 'AS': '_parse_number' +} + +attributes_type_mapping = { + 'md5': '_parse_hash', + 'sha1': '_parse_hash', + 'sha256': '_parse_hash', + 'filename|md5': '_parse_filename_hash', + 'filename|sha1': '_parse_filename_hash', + 'filename|sha256': '_parse_filename_hash', + 'email-subject': '_parse_email_message', + 'email-body': '_parse_email_message', + 'authentihash': '_parse_hash', + 'ssdeep': '_parse_hash', + 'imphash': '_parse_hash', + 'pehash': '_parse_hash', + 'impfuzzy': '_parse_hash', + 'sha224': '_parse_hash', + 'sha384': '_parse_hash', + 'sha512': '_parse_hash', + 'sha512/224': '_parse_hash', + 'sha512/256': '_parse_hash', + 'tlsh': '_parse_hash', + 'cdhash': '_parse_hash', + 'filename|authentihash': '_parse_filename_hash', + 'filename|ssdeep': '_parse_filename_hash', + 'filename|imphash': '_parse_filename_hash', + 'filename|impfuzzy': '_parse_filename_hash', + 'filename|pehash': '_parse_filename_hash', + 'filename|sha224': '_parse_filename_hash', + 'filename|sha384': '_parse_filename_hash', + 'filename|sha512': '_parse_filename_hash', + 'filename|sha512/224': '_parse_filename_hash', + 'filename|sha512/256': '_parse_filename_hash', + 'filename|tlsh': '_parse_filename_hash', + 'x509-fingerprint-md5': '_parse_x509_attribute', + 'x509-fingerprint-sha1': '_parse_x509_attribute', + 'x509-fingerprint-sha256': '_parse_x509_attribute' +} + +objects_mapping = { + 'asn': { + 'observable': 'parse_asn_observable', + 'pattern': 'parse_asn_pattern'}, + 'credential': { + 'observable': 'parse_credential_observable', + 'pattern': 'parse_credential_pattern'}, + 'domain-ip': { + 'observable': 'parse_domain_ip_observable', + 'pattern': 'parse_domain_ip_pattern'}, + 'email': { + 'observable': 'parse_email_observable', + 'pattern': 'parse_email_pattern'}, + 'file': { + 'observable': 'parse_file_observable', + 'pattern': 'parse_file_pattern'}, + 'ip-port': { + 'observable': 'parse_ip_port_observable', + 'pattern': 'parse_ip_port_pattern'}, + 'network-connection': { + 'observable': 'parse_network_connection_observable', + 'pattern': 'parse_network_connection_pattern'}, + 'network-socket': { + 'observable': 'parse_network_socket_observable', + 'pattern': 'parse_network_socket_pattern'}, + 'process': { + 'observable': 'parse_process_observable', + 'pattern': 'parse_process_pattern'}, + 'registry-key': { + 'observable': 'parse_regkey_observable', + 'pattern': 'parse_regkey_pattern'}, + 'url': { + 'observable': 'parse_url_observable', + 'pattern': 'parse_url_pattern'}, + 'user-account': { + 'observable': 'parse_user_account_observable', + 'pattern': 'parse_user_account_pattern'}, + 'WindowsPEBinaryFile': { + 'observable': 'parse_pe_observable', + 'pattern': 'parse_pe_pattern'}, + 'x509': { + 'observable': 'parse_x509_observable', + 'pattern': 'parse_x509_pattern'} +} + +observable_mapping = { + ('artifact', 'file'): 'parse_file_observable', + ('artifact', 'directory', 'file'): 'parse_file_observable', + ('artifact', 'email-addr', 'email-message', 'file'): 'parse_email_observable', + ('autonomous-system',): 'parse_asn_observable', + ('autonomous-system', 'ipv4-addr'): 'parse_asn_observable', + ('autonomous-system', 'ipv6-addr'): 'parse_asn_observable', + ('autonomous-system', 'ipv4-addr', 'ipv6-addr'): 'parse_asn_observable', + ('directory', 'file'): 'parse_file_observable', + ('domain-name',): 'parse_domain_ip_observable', + ('domain-name', 'ipv4-addr'): 'parse_domain_ip_observable', + ('domain-name', 'ipv6-addr'): 'parse_domain_ip_observable', + ('domain-name', 'ipv4-addr', 'ipv6-addr'): 'parse_domain_ip_observable', + ('domain-name', 'ipv4-addr', 'network-traffic'): 'parse_domain_ip_network_traffic_observable', + ('domain-name', 'ipv6-addr', 'network-traffic'): 'parse_domain_ip_network_traffic_observable', + ('domain-name', 'ipv4-addr', 'ipv6-addr', 'network-traffic'): 'parse_domain_ip_network_traffic_observable', + ('domain-name', 'network-traffic'): 'parse_domain_network_traffic_observable', + ('domain-name', 'network-traffic', 'url'): 'parse_url_observable', + ('email-addr',): 'parse_email_address_observable', + ('email-addr', 'email-message'): 'parse_email_observable', + ('email-addr', 'email-message', 'file'): 'parse_email_observable', + ('email-message',): 'parse_email_observable', + ('file',): 'parse_file_observable', + ('file', 'process'): 'parse_process_observable', + ('ipv4-addr',): 'parse_ip_address_observable', + ('ipv6-addr',): 'parse_ip_address_observable', + ('ipv4-addr', 'network-traffic'): 'parse_ip_network_traffic_observable', + ('ipv6-addr', 'network-traffic'): 'parse_ip_network_traffic_observable', + ('ipv4-addr', 'ipv6-addr', 'network-traffic'): 'parse_ip_network_traffic_observable', + ('mac-addr',): 'parse_mac_address_observable', + ('mutex',): 'parse_mutex_observable', + ('process',): 'parse_process_observable', + ('x509-certificate',): 'parse_x509_observable', + ('url',): 'parse_url_observable', + ('user-account',): 'parse_user_account_observable', + ('windows-registry-key',): 'parse_regkey_observable' +} + +pattern_mapping = { + ('artifact', 'file'): 'parse_file_pattern', + ('artifact', 'directory', 'file'): 'parse_file_pattern', + ('autonomous-system', ): 'parse_as_pattern', + ('autonomous-system', 'ipv4-addr'): 'parse_as_pattern', + ('autonomous-system', 'ipv6-addr'): 'parse_as_pattern', + ('autonomous-system', 'ipv4-addr', 'ipv6-addr'): 'parse_as_pattern', + ('directory',): 'parse_file_pattern', + ('directory', 'file'): 'parse_file_pattern', + ('domain-name',): 'parse_domain_ip_port_pattern', + ('domain-name', 'ipv4-addr'): 'parse_domain_ip_port_pattern', + ('domain-name', 'ipv6-addr'): 'parse_domain_ip_port_pattern', + ('domain-name', 'ipv4-addr', 'ipv6-addr'): 'parse_domain_ip_port_pattern', + ('domain-name', 'ipv4-addr', 'url'): 'parse_url_pattern', + ('domain-name', 'ipv6-addr', 'url'): 'parse_url_pattern', + ('domain-name', 'ipv4-addr', 'ipv6-addr', 'url'): 'parse_url_pattern', + ('domain-name', 'network-traffic'): 'parse_domain_ip_port_pattern', + ('domain-name', 'network-traffic', 'url'): 'parse_url_pattern', + ('email-addr',): 'parse_email_address_pattern', + ('email-message',): 'parse_email_message_pattern', + ('file',): 'parse_file_pattern', + ('ipv4-addr',): 'parse_ip_address_pattern', + ('ipv6-addr',): 'parse_ip_address_pattern', + ('ipv4-addr', 'ipv6-addr'): 'parse_ip_address_pattern', + ('mac-addr',): 'parse_mac_address_pattern', + ('mutex',): 'parse_mutex_pattern', + ('network-traffic',): 'parse_network_traffic_pattern', + ('process',): 'parse_process_pattern', + ('url',): 'parse_url_pattern', + ('user-account',): 'parse_user_account_pattern', + ('windows-registry-key',): 'parse_regkey_pattern', + ('x509-certificate',): 'parse_x509_pattern' +} + +pattern_forbidden_relations = (' LIKE ', ' FOLLOWEDBY ', ' MATCHES ', ' ISSUBSET ', ' ISSUPERSET ', ' REPEATS ') +single_attribute_fields = ('type', 'value', 'to_ids') + + +################################################################################ +# OBSERVABLE OBJECTS AND PATTERNS MAPPING. # +################################################################################ + +address_family_attribute_mapping = {'type': 'text','object_relation': 'address-family'} +as_number_attribute_mapping = {'type': 'AS', 'object_relation': 'asn'} +description_attribute_mapping = {'type': 'text', 'object_relation': 'description'} +asn_subnet_attribute_mapping = {'type': 'ip-src', 'object_relation': 'subnet-announced'} +cc_attribute_mapping = {'type': 'email-dst', 'object_relation': 'cc'} +credential_attribute_mapping = {'type': 'text', 'object_relation': 'password'} +data_attribute_mapping = {'type': 'text', 'object_relation': 'data'} +data_type_attribute_mapping = {'type': 'text', 'object_relation': 'data-type'} +domain_attribute_mapping = {'type': 'domain', 'object_relation': 'domain'} +domain_family_attribute_mapping = {'type': 'text', 'object_relation': 'domain-family'} +dst_port_attribute_mapping = {'type': 'port', 'object_relation': 'dst-port'} +email_attachment_attribute_mapping = {'type': 'email-attachment', 'object_relation': 'attachment'} +email_date_attribute_mapping = {'type': 'datetime', 'object_relation': 'send-date'} +email_subject_attribute_mapping = {'type': 'email-subject', 'object_relation': 'subject'} +encoding_attribute_mapping = {'type': 'text', 'object_relation': 'file-encoding'} +end_datetime_attribute_mapping = {'type': 'datetime', 'object_relation': 'last-seen'} +entropy_mapping = {'type': 'float', 'object_relation': 'entropy'} +filename_attribute_mapping = {'type': 'filename', 'object_relation': 'filename'} +from_attribute_mapping = {'type': 'email-src', 'object_relation': 'from'} +imphash_mapping = {'type': 'imphash', 'object_relation': 'imphash'} +id_attribute_mapping = {'type': 'text', 'object_relation': 'id'} +ip_attribute_mapping = {'type': 'ip-dst', 'object_relation': 'ip'} +issuer_attribute_mapping = {'type': 'text', 'object_relation': 'issuer'} +key_attribute_mapping = {'type': 'regkey', 'object_relation': 'key'} +malware_sample_attribute_mapping = {'type': 'malware-sample', 'object_relation': 'malware-sample'} +mime_type_attribute_mapping = {'type': 'mime-type', 'object_relation': 'mimetype'} +modified_attribute_mapping = {'type': 'datetime', 'object_relation': 'last-modified'} +name_attribute_mapping = {'type': 'text', 'object_relation': 'name'} +network_traffic_ip = {'type': 'ip-{}', 'object_relation': 'ip-{}'} +number_sections_mapping = {'type': 'counter', 'object_relation': 'number-sections'} +password_mapping = {'type': 'text', 'object_relation': 'password'} +path_attribute_mapping = {'type': 'text', 'object_relation': 'path'} +pe_type_mapping = {'type': 'text', 'object_relation': 'type'} +pid_attribute_mapping = {'type': 'text', 'object_relation': 'pid'} +process_command_line_mapping = {'type': 'text', 'object_relation': 'command-line'} +process_creation_time_mapping = {'type': 'datetime', 'object_relation': 'creation-time'} +process_image_mapping = {'type': 'filename', 'object_relation': 'image'} +process_name_mapping = {'type': 'text', 'object_relation': 'name'} +regkey_name_attribute_mapping = {'type': 'text', 'object_relation': 'name'} +references_attribute_mapping = {'type': 'link', 'object_relation': 'references'} +reply_to_attribute_mapping = {'type': 'email-reply-to', 'object_relation': 'reply-to'} +screenshot_attribute_mapping = {'type': 'attachment', 'object_relation': 'screenshot'} +section_name_mapping = {'type': 'text', 'object_relation': 'name'} +serial_number_attribute_mapping = {'type': 'text', 'object_relation': 'serial-number'} +size_attribute_mapping = {'type': 'size-in-bytes', 'object_relation': 'size-in-bytes'} +src_port_attribute_mapping = {'type': 'port', 'object_relation': 'src-port'} +start_datetime_attribute_mapping = {'type': 'datetime', 'object_relation': 'first-seen'} +state_attribute_mapping = {'type': 'text', 'object_relation': 'state'} +summary_attribute_mapping = {'type': 'text', 'object_relation': 'summary'} +to_attribute_mapping = {'type': 'email-dst', 'object_relation': 'to'} +url_attribute_mapping = {'type': 'url', 'object_relation': 'url'} +url_port_attribute_mapping = {'type': 'port', 'object_relation': 'port'} +user_id_mapping = {'type': 'text', 'object_relation': 'username'} +x_mailer_attribute_mapping = {'type': 'email-x-mailer', 'object_relation': 'x-mailer'} +x509_md5_attribute_mapping = {'type': 'x509-fingerprint-md5', 'object_relation': 'x509-fingerprint-md5'} +x509_sha1_attribute_mapping = {'type': 'x509-fingerprint-sha1', 'object_relation': 'x509-fingerprint-sha1'} +x509_sha256_attribute_mapping = {'type': 'x509-fingerprint-sha256', 'object_relation': 'x509-fingerprint-sha256'} +x509_spka_attribute_mapping = {'type': 'text', 'object_relation': 'pubkey-info-algorithm'} # x509 subject public key algorithm +x509_spke_attribute_mapping = {'type': 'text', 'object_relation': 'pubkey-info-exponent'} # x509 subject public key exponent +x509_spkm_attribute_mapping = {'type': 'text', 'object_relation': 'pubkey-info-modulus'} # x509 subject public key modulus +x509_subject_attribute_mapping = {'type': 'text', 'object_relation': 'subject'} +x509_version_attribute_mapping = {'type': 'text', 'object_relation': 'version'} +x509_vna_attribute_mapping = {'type': 'datetime', 'object_relation': 'validity-not-after'} # x509 validity not after +x509_vnb_attribute_mapping = {'type': 'datetime', 'object_relation': 'validity-not-before'} # x509 validity not before + +asn_mapping = {'number': as_number_attribute_mapping, + 'autonomous-system:number': as_number_attribute_mapping, + 'name': description_attribute_mapping, + 'autonomous-system:name': description_attribute_mapping, + 'ipv4-addr': asn_subnet_attribute_mapping, + 'ipv6-addr': asn_subnet_attribute_mapping, + 'ipv4-addr:value': asn_subnet_attribute_mapping, + 'ipv6-addr:value': asn_subnet_attribute_mapping} + +attack_pattern_mapping = {'name': name_attribute_mapping, + 'description': summary_attribute_mapping} + +attack_pattern_references_mapping = {'mitre-attack': references_attribute_mapping, + 'capec': id_attribute_mapping} + +course_of_action_mapping = {'description': description_attribute_mapping, + 'name': name_attribute_mapping} + +credential_mapping = {'credential': credential_attribute_mapping, + 'user-account:credential': credential_attribute_mapping, + 'user_id': user_id_mapping, + 'user-account:user_id': user_id_mapping} + +domain_ip_mapping = {'domain-name': domain_attribute_mapping, + 'domain-name:value': domain_attribute_mapping, + 'ipv4-addr': ip_attribute_mapping, + 'ipv6-addr': ip_attribute_mapping, + 'ipv4-addr:value': ip_attribute_mapping, + 'ipv6-addr:value': ip_attribute_mapping, + 'domain-name:resolves_to_refs[*].value': ip_attribute_mapping, + 'network-traffic:dst_port': dst_port_attribute_mapping, + 'network-traffic:src_port': src_port_attribute_mapping} + +email_mapping = {'date': email_date_attribute_mapping, + 'email-message:date': email_date_attribute_mapping, + 'email-message:to_refs[*].value': to_attribute_mapping, + 'email-message:cc_refs[*].value': cc_attribute_mapping, + 'subject': email_subject_attribute_mapping, + 'email-message:subject': email_subject_attribute_mapping, + 'X-Mailer': x_mailer_attribute_mapping, + 'email-message:additional_header_fields.x_mailer': x_mailer_attribute_mapping, + 'Reply-To': reply_to_attribute_mapping, + 'email-message:additional_header_fields.reply_to': reply_to_attribute_mapping, + 'email-message:from_ref.value': from_attribute_mapping, + 'email-addr:value': to_attribute_mapping} + +email_references_mapping = {'attachment': email_attachment_attribute_mapping, + 'cc_refs': cc_attribute_mapping, + 'from_ref': from_attribute_mapping, + 'screenshot': screenshot_attribute_mapping, + 'to_refs': to_attribute_mapping} + +file_mapping = {'artifact:mime_type': mime_type_attribute_mapping, + 'file:content_ref.mime_type': mime_type_attribute_mapping, + 'mime_type': mime_type_attribute_mapping, + 'file:mime_type': mime_type_attribute_mapping, + 'name': filename_attribute_mapping, + 'file:name': filename_attribute_mapping, + 'name_enc': encoding_attribute_mapping, + 'file:name_enc': encoding_attribute_mapping, + 'file:parent_directory_ref.path': path_attribute_mapping, + 'directory:path': path_attribute_mapping, + 'size': size_attribute_mapping, + 'file:size': size_attribute_mapping} + +network_traffic_mapping = {'dst_port':dst_port_attribute_mapping, + 'src_port': src_port_attribute_mapping, + 'network-traffic:dst_port': dst_port_attribute_mapping, + 'network-traffic:src_port': src_port_attribute_mapping} + +ip_port_mapping = {'value': domain_attribute_mapping, + 'domain-name:value': domain_attribute_mapping, + 'network-traffic:dst_ref.value': {'type': 'ip-dst', 'object_relation': 'ip-dst'}, + 'network-traffic:src_ref.value': {'type': 'ip-src', 'object_relation': 'ip-src'}} +ip_port_mapping.update(network_traffic_mapping) + +ip_port_references_mapping = {'domain-name': domain_attribute_mapping, + 'ipv4-addr': network_traffic_ip, + 'ipv6-addr': network_traffic_ip} + +network_socket_extension_mapping = {'address_family': address_family_attribute_mapping, + "network-traffic:extensions.'socket-ext'.address_family": address_family_attribute_mapping, + 'protocol_family': domain_family_attribute_mapping, + "network-traffic:extensions.'socket-ext'.protocol_family": domain_family_attribute_mapping, + 'is_blocking': state_attribute_mapping, + "network-traffic:extensions.'socket-ext'.is_blocking": state_attribute_mapping, + 'is_listening': state_attribute_mapping, + "network-traffic:extensions.'socket-ext'.is_listening": state_attribute_mapping} + +network_traffic_references_mapping = {'domain-name': {'type': 'hostname', 'object_relation': 'hostname-{}'}, + 'ipv4-addr': network_traffic_ip, + 'ipv6-addr': network_traffic_ip} + +pe_mapping = {'pe_type': pe_type_mapping, 'number_of_sections': number_sections_mapping, 'imphash': imphash_mapping} + +pe_section_mapping = {'name': section_name_mapping, 'size': size_attribute_mapping, 'entropy': entropy_mapping} + +hash_types = ('MD5', 'SHA-1', 'SHA-256', 'SHA-224', 'SHA-384', 'SHA-512', 'ssdeep', 'tlsh') +for hash_type in hash_types: + misp_hash_type = hash_type.replace('-', '').lower() + attribute = {'type': misp_hash_type, 'object_relation': misp_hash_type} + file_mapping[hash_type] = attribute + file_mapping.update({f"file:hashes.'{feature}'": attribute for feature in (hash_type, misp_hash_type)}) + file_mapping.update({f"file:hashes.{feature}": attribute for feature in (hash_type, misp_hash_type)}) + pe_section_mapping[hash_type] = attribute + pe_section_mapping[misp_hash_type] = attribute + +process_mapping = {'name': process_name_mapping, + 'process:name': process_name_mapping, + 'pid': pid_attribute_mapping, + 'process:pid': pid_attribute_mapping, + 'created': process_creation_time_mapping, + 'process:created': process_creation_time_mapping, + 'command_line': process_command_line_mapping, + 'process:command_line': process_command_line_mapping, + 'process:parent_ref.pid': {'type': 'text', 'object_relation': 'parent-pid'}, + 'process:child_refs[*].pid': {'type': 'text', 'object_relation': 'child-pid'}, + 'process:binary_ref.name': process_image_mapping} + +child_process_reference_mapping = {'pid': {'type': 'text', 'object_relation': 'child-pid'}} + +parent_process_reference_mapping = {'command_line': {'type': 'text', 'object_relation': 'parent-command-line'}, + 'pid': {'type': 'text', 'object_relation': 'parent-pid'}, + 'process-name': {'type': 'text', 'object_relation': 'parent-process-name'}} + +regkey_mapping = {'data': data_attribute_mapping, + 'windows-registry-key:values.data': data_attribute_mapping, + 'data_type': data_type_attribute_mapping, + 'windows-registry-key:values.data_type': data_type_attribute_mapping, + 'modified': modified_attribute_mapping, + 'windows-registry-key:modified': modified_attribute_mapping, + 'name': regkey_name_attribute_mapping, + 'windows-registry-key:values.name': regkey_name_attribute_mapping, + 'key': key_attribute_mapping, + 'windows-registry-key:key': key_attribute_mapping, + 'windows-registry-key:value': {'type': 'text', 'object_relation': 'hive'} + } + +url_mapping = {'url': url_attribute_mapping, + 'url:value': url_attribute_mapping, + 'domain-name': domain_attribute_mapping, + 'domain-name:value': domain_attribute_mapping, + 'network-traffic': url_port_attribute_mapping, + 'network-traffic:dst_port': url_port_attribute_mapping, + 'ipv4-addr:value': ip_attribute_mapping, + 'ipv6-addr:value': ip_attribute_mapping + } + +user_account_mapping = {'account_created': {'type': 'datetime', 'object_relation': 'created'}, + 'account_expires': {'type': 'datetime', 'object_relation': 'expires'}, + 'account_first_login': {'type': 'datetime', 'object_relation': 'first_login'}, + 'account_last_login': {'type': 'datetime', 'object_relation': 'last_login'}, + 'account_login': user_id_mapping, + 'account_type': {'type': 'text', 'object_relation': 'account-type'}, + 'can_escalate_privs': {'type': 'boolean', 'object_relation': 'can_escalate_privs'}, + 'credential': credential_attribute_mapping, + 'credential_last_changed': {'type': 'datetime', 'object_relation': 'password_last_changed'}, + 'display_name': {'type': 'text', 'object_relation': 'display-name'}, + 'gid': {'type': 'text', 'object_relation': 'group-id'}, + 'home_dir': {'type': 'text', 'object_relation': 'home_dir'}, + 'is_disabled': {'type': 'boolean', 'object_relation': 'disabled'}, + 'is_privileged': {'type': 'boolean', 'object_relation': 'privileged'}, + 'is_service_account': {'type': 'boolean', 'object_relation': 'is_service_account'}, + 'shell': {'type': 'text', 'object_relation': 'shell'}, + 'user_id': {'type': 'text', 'object_relation': 'user-id'}} + +vulnerability_mapping = {'name': id_attribute_mapping, + 'description': summary_attribute_mapping} + +x509_mapping = {'issuer': issuer_attribute_mapping, + 'x509-certificate:issuer': issuer_attribute_mapping, + 'serial_number': serial_number_attribute_mapping, + 'x509-certificate:serial_number': serial_number_attribute_mapping, + 'subject': x509_subject_attribute_mapping, + 'x509-certificate:subject': x509_subject_attribute_mapping, + 'subject_public_key_algorithm': x509_spka_attribute_mapping, + 'x509-certificate:subject_public_key_algorithm': x509_spka_attribute_mapping, + 'subject_public_key_exponent': x509_spke_attribute_mapping, + 'x509-certificate:subject_public_key_exponent': x509_spke_attribute_mapping, + 'subject_public_key_modulus': x509_spkm_attribute_mapping, + 'x509-certificate:subject_public_key_modulus': x509_spkm_attribute_mapping, + 'validity_not_before': x509_vnb_attribute_mapping, + 'x509-certificate:validity_not_before': x509_vnb_attribute_mapping, + 'validity_not_after': x509_vna_attribute_mapping, + 'x509-certificate:validity_not_after': x509_vna_attribute_mapping, + 'version': x509_version_attribute_mapping, + 'x509-certificate:version': x509_version_attribute_mapping, + 'SHA-1': x509_sha1_attribute_mapping, + "x509-certificate:hashes.'sha1'": x509_sha1_attribute_mapping, + 'SHA-256': x509_sha256_attribute_mapping, + "x509-certificate:hashes.'sha256'": x509_sha256_attribute_mapping, + 'MD5': x509_md5_attribute_mapping, + "x509-certificate:hashes.'md5'": x509_md5_attribute_mapping, + } + +attachment_types = ('file:content_ref.name', 'file:content_ref.payload_bin', + 'artifact:x_misp_text_name', 'artifact:payload_bin', + "file:hashes.'MD5'", "file:content_ref.hashes.'MD5'", + 'file:name') + +connection_protocols = {"IP": "3", "ICMP": "3", "ARP": "3", + "TCP": "4", "UDP": "4", + "HTTP": "7", "HTTPS": "7", "FTP": "7"} diff --git a/misp_modules/lib/synonymsToTagNames.json b/misp_modules/lib/synonymsToTagNames.json new file mode 100644 index 0000000..c3013f3 --- /dev/null +++ b/misp_modules/lib/synonymsToTagNames.json @@ -0,0 +1 @@ +{"Accstealer":["misp-galaxy:android=\"Accstealer\""],"Ackposts":["misp-galaxy:android=\"Ackposts\""],"Acnetdoor":["misp-galaxy:android=\"Acnetdoor\""],"Acnetsteal":["misp-galaxy:android=\"Acnetsteal\""],"Actech":["misp-galaxy:android=\"Actech\""],"AdChina":["misp-galaxy:android=\"AdChina\""],"AdInfo":["misp-galaxy:android=\"AdInfo\""],"AdMarvel":["misp-galaxy:android=\"AdMarvel\""],"AdMob":["misp-galaxy:android=\"AdMob\""],"AdSms":["misp-galaxy:android=\"AdSms\""],"Adfonic":["misp-galaxy:android=\"Adfonic\""],"Adknowledge":["misp-galaxy:android=\"Adknowledge\""],"Adrd":["misp-galaxy:android=\"Adrd\""],"Aduru":["misp-galaxy:android=\"Aduru\""],"Adwhirl":["misp-galaxy:android=\"Adwhirl\""],"Adwind":["misp-galaxy:android=\"Adwind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:tool=\"Adwind\""],"AlienSpy":["misp-galaxy:android=\"Adwind\"","misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:rat=\"Adwind RAT\"","misp-galaxy:tool=\"Adwind\""],"Frutas":["misp-galaxy:android=\"Adwind\"","misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:rat=\"Adwind RAT\"","misp-galaxy:tool=\"Adwind\""],"Unrecom":["misp-galaxy:android=\"Adwind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:rat=\"Adwind RAT\"","misp-galaxy:tool=\"Adwind\""],"Sockrat":["misp-galaxy:android=\"Adwind\"","misp-galaxy:android=\"Sockrat\"","misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:tool=\"Adwind\""],"Jsocket":["misp-galaxy:android=\"Adwind\"","misp-galaxy:rat=\"Adwind RAT\""],"jRat":["misp-galaxy:android=\"Adwind\"","misp-galaxy:tool=\"Adwind\""],"Backdoor:Java\/Adwind":["misp-galaxy:android=\"Adwind\"","misp-galaxy:tool=\"Adwind\""],"Adwlauncher":["misp-galaxy:android=\"Adwlauncher\""],"Adwo":["misp-galaxy:android=\"Adwo\""],"Airad":["misp-galaxy:android=\"Airad\""],"Airpush":["misp-galaxy:android=\"Airpush\""],"StopSMS":["misp-galaxy:android=\"Airpush\""],"Alienspy":["misp-galaxy:android=\"Alienspy\""],"AmazonAds":["misp-galaxy:android=\"AmazonAds\""],"Andr\/Dropr-FH":["misp-galaxy:android=\"Andr\/Dropr-FH\""],"GhostCtrl":["misp-galaxy:android=\"Andr\/Dropr-FH\"","misp-galaxy:malpedia=\"GhostCtrl\""],"AndroidOS_HidenAd":["misp-galaxy:android=\"AndroidOS_HidenAd\""],"AndroidOS_HiddenAd":["misp-galaxy:android=\"AndroidOS_HidenAd\""],"Answerbot":["misp-galaxy:android=\"Answerbot\""],"Antammi":["misp-galaxy:android=\"Antammi\""],"Apkmore":["misp-galaxy:android=\"Apkmore\""],"Aplog":["misp-galaxy:android=\"Aplog\""],"AppLovin":["misp-galaxy:android=\"AppLovin\""],"Appenda":["misp-galaxy:android=\"Appenda\""],"Apperhand":["misp-galaxy:android=\"Apperhand\""],"Appleservice":["misp-galaxy:android=\"Appleservice\""],"Arspam":["misp-galaxy:android=\"Arspam\""],"Aurecord":["misp-galaxy:android=\"Aurecord\""],"Backapp":["misp-galaxy:android=\"Backapp\""],"Backdexer":["misp-galaxy:android=\"Backdexer\""],"Backflash":["misp-galaxy:android=\"Backflash\""],"Backscript":["misp-galaxy:android=\"Backscript\""],"Badaccents":["misp-galaxy:android=\"Badaccents\""],"Badpush":["misp-galaxy:android=\"Badpush\""],"Ballonpop":["misp-galaxy:android=\"Ballonpop\""],"BambaPurple":["misp-galaxy:android=\"BambaPurple\""],"BankBot":["misp-galaxy:android=\"BankBot\"","misp-galaxy:malpedia=\"Anubis\"","misp-galaxy:malpedia=\"BankBot\""],"Bankosy":["misp-galaxy:android=\"Bankosy\"","misp-galaxy:android=\"GM Bot\"","misp-galaxy:tool=\"Slempo\""],"Bankun":["misp-galaxy:android=\"Bankun\""],"Basebridge":["misp-galaxy:android=\"Basebridge\""],"Basedao":["misp-galaxy:android=\"Basedao\""],"Batterydoctor":["misp-galaxy:android=\"Batterydoctor\""],"BeNews":["misp-galaxy:android=\"BeNews\""],"Beaglespy":["misp-galaxy:android=\"Beaglespy\""],"BeanBot":["misp-galaxy:android=\"BeanBot\""],"Becuro":["misp-galaxy:android=\"Becuro\""],"Beita":["misp-galaxy:android=\"Beita\""],"Bgserv":["misp-galaxy:android=\"Bgserv\""],"Biigespy":["misp-galaxy:android=\"Biigespy\""],"Bmaster":["misp-galaxy:android=\"Bmaster\""],"Bossefiv":["misp-galaxy:android=\"Bossefiv\""],"Boxpush":["misp-galaxy:android=\"Boxpush\""],"BreadSMS":["misp-galaxy:android=\"BreadSMS\""],"Burstly":["misp-galaxy:android=\"Burstly\""],"BusyGasper":["misp-galaxy:android=\"BusyGasper\"","misp-galaxy:malpedia=\"BusyGasper\""],"Buzzcity":["misp-galaxy:android=\"Buzzcity\""],"ByPush":["misp-galaxy:android=\"ByPush\""],"Cajino":["misp-galaxy:android=\"Cajino\""],"Casee":["misp-galaxy:android=\"Casee\""],"Catchtoken":["misp-galaxy:android=\"Catchtoken\""],"Cauly":["misp-galaxy:android=\"Cauly\""],"Cellshark":["misp-galaxy:android=\"Cellshark\""],"Centero":["misp-galaxy:android=\"Centero\""],"Cepsohord":["misp-galaxy:android=\"Cepsohord\""],"Chamois":["misp-galaxy:android=\"Chamois\"","misp-galaxy:malpedia=\"Chamois\""],"Chuli":["misp-galaxy:android=\"Chuli\""],"Citmo":["misp-galaxy:android=\"Citmo\""],"Claco":["misp-galaxy:android=\"Claco\""],"Clevernet":["misp-galaxy:android=\"Clevernet\""],"Cnappbox":["misp-galaxy:android=\"Cnappbox\""],"Cobblerone":["misp-galaxy:android=\"Cobblerone\""],"Coolpaperleak":["misp-galaxy:android=\"Coolpaperleak\""],"Coolreaper":["misp-galaxy:android=\"Coolreaper\""],"CopyCat":["misp-galaxy:android=\"CopyCat\""],"Cosha":["misp-galaxy:android=\"Cosha\""],"Counterclank":["misp-galaxy:android=\"Counterclank\""],"Crazymedia":["misp-galaxy:android=\"Crazymedia\""],"Crisis":["misp-galaxy:android=\"Crisis\"","misp-galaxy:malpedia=\"RCS\""],"Crusewind":["misp-galaxy:android=\"Crusewind\""],"Dandro":["misp-galaxy:android=\"Dandro\""],"Daoyoudao":["misp-galaxy:android=\"Daoyoudao\""],"Deathring":["misp-galaxy:android=\"Deathring\""],"Deeveemap":["misp-galaxy:android=\"Deeveemap\""],"Dendoroid":["misp-galaxy:android=\"Dendoroid\""],"Dengaru":["misp-galaxy:android=\"Dengaru\""],"Diandong":["misp-galaxy:android=\"Diandong\""],"Dianjin":["misp-galaxy:android=\"Dianjin\""],"Dogowar":["misp-galaxy:android=\"Dogowar\""],"Domob":["misp-galaxy:android=\"Domob\""],"DoubleLocker":["misp-galaxy:android=\"DoubleLocker\"","misp-galaxy:malpedia=\"DoubleLocker\""],"Dougalek":["misp-galaxy:android=\"Dougalek\""],"Dowgin":["misp-galaxy:android=\"Dowgin\""],"Droidsheep":["misp-galaxy:android=\"Droidsheep\""],"Dropdialer":["misp-galaxy:android=\"Dropdialer\""],"Dupvert":["misp-galaxy:android=\"Dupvert\""],"Dynamicit":["misp-galaxy:android=\"Dynamicit\""],"Ecardgrabber":["misp-galaxy:android=\"Ecardgrabber\""],"Ecobatry":["misp-galaxy:android=\"Ecobatry\""],"Enesoluty":["misp-galaxy:android=\"Enesoluty\""],"Everbadge":["misp-galaxy:android=\"Everbadge\""],"Ewalls":["misp-galaxy:android=\"Ewalls\""],"Expensive Wall":["misp-galaxy:android=\"Expensive Wall\""],"ExpensiveWall":["misp-galaxy:android=\"ExpensiveWall\""],"Exprespam":["misp-galaxy:android=\"Exprespam\""],"FakeLookout":["misp-galaxy:android=\"FakeLookout\""],"FakeMart":["misp-galaxy:android=\"FakeMart\""],"Fakealbums":["misp-galaxy:android=\"Fakealbums\""],"Fakeangry":["misp-galaxy:android=\"Fakeangry\""],"Fakeapp":["misp-galaxy:android=\"Fakeapp\""],"Fakebanco":["misp-galaxy:android=\"Fakebanco\""],"Fakebank":["misp-galaxy:android=\"Fakebank\""],"Fakebank.B":["misp-galaxy:android=\"Fakebank.B\""],"Fakebok":["misp-galaxy:android=\"Fakebok\""],"Fakedaum":["misp-galaxy:android=\"Fakedaum\""],"Fakedefender":["misp-galaxy:android=\"Fakedefender\""],"Fakedefender.B":["misp-galaxy:android=\"Fakedefender.B\""],"Fakedown":["misp-galaxy:android=\"Fakedown\""],"Fakeflash":["misp-galaxy:android=\"Fakeflash\""],"Fakegame":["misp-galaxy:android=\"Fakegame\""],"Fakeguard":["misp-galaxy:android=\"Fakeguard\""],"Fakejob":["misp-galaxy:android=\"Fakejob\""],"Fakekakao":["misp-galaxy:android=\"Fakekakao\""],"Fakelemon":["misp-galaxy:android=\"Fakelemon\""],"Fakelicense":["misp-galaxy:android=\"Fakelicense\""],"Fakelogin":["misp-galaxy:android=\"Fakelogin\""],"Fakem Rat":["misp-galaxy:android=\"Fakem Rat\""],"Fakemini":["misp-galaxy:android=\"Fakemini\""],"Fakemrat":["misp-galaxy:android=\"Fakemrat\""],"Fakeneflic":["misp-galaxy:android=\"Fakeneflic\""],"Fakenotify":["misp-galaxy:android=\"Fakenotify\""],"Fakepatch":["misp-galaxy:android=\"Fakepatch\""],"Fakeplay":["misp-galaxy:android=\"Fakeplay\""],"Fakescarav":["misp-galaxy:android=\"Fakescarav\""],"Fakesecsuit":["misp-galaxy:android=\"Fakesecsuit\""],"Fakesucon":["misp-galaxy:android=\"Fakesucon\""],"Faketaobao":["misp-galaxy:android=\"Faketaobao\""],"Faketaobao.B":["misp-galaxy:android=\"Faketaobao.B\""],"Faketoken":["misp-galaxy:android=\"Faketoken\""],"Fakeupdate":["misp-galaxy:android=\"Fakeupdate\""],"Fakevoice":["misp-galaxy:android=\"Fakevoice\""],"Farmbaby":["misp-galaxy:android=\"Farmbaby\""],"Fauxtocopy":["misp-galaxy:android=\"Fauxtocopy\""],"Feiwo":["misp-galaxy:android=\"Feiwo\""],"FindAndCall":["misp-galaxy:android=\"FindAndCall\""],"Finfish":["misp-galaxy:android=\"Finfish\""],"Fireleaker":["misp-galaxy:android=\"Fireleaker\""],"Fitikser":["misp-galaxy:android=\"Fitikser\""],"Flexispy":["misp-galaxy:android=\"Flexispy\""],"Fokonge":["misp-galaxy:android=\"Fokonge\""],"FoncySMS":["misp-galaxy:android=\"FoncySMS\""],"Frogonal":["misp-galaxy:android=\"Frogonal\""],"Ftad":["misp-galaxy:android=\"Ftad\""],"Funtasy":["misp-galaxy:android=\"Funtasy\""],"GM Bot":["misp-galaxy:android=\"GM Bot\""],"Acecard":["misp-galaxy:android=\"GM Bot\"","misp-galaxy:tool=\"Slempo\""],"SlemBunk":["misp-galaxy:android=\"GM Bot\"","misp-galaxy:malpedia=\"Slempo\"","misp-galaxy:tool=\"Slempo\""],"Gaiaphish":["misp-galaxy:android=\"Gaiaphish\""],"GallMe":["misp-galaxy:android=\"GallMe\""],"Gamex":["misp-galaxy:android=\"Gamex\""],"Gappusin":["misp-galaxy:android=\"Gappusin\""],"Gazon":["misp-galaxy:android=\"Gazon\""],"Geinimi":["misp-galaxy:android=\"Geinimi\""],"Generisk":["misp-galaxy:android=\"Generisk\""],"Genheur":["misp-galaxy:android=\"Genheur\""],"Genpush":["misp-galaxy:android=\"Genpush\""],"GeoFake":["misp-galaxy:android=\"GeoFake\""],"Geplook":["misp-galaxy:android=\"Geplook\""],"Getadpush":["misp-galaxy:android=\"Getadpush\""],"Ggtracker":["misp-galaxy:android=\"Ggtracker\""],"Ghost Push":["misp-galaxy:android=\"Ghost Push\"","misp-galaxy:mitre-malware=\"Gooligan - S0290\""],"Ghostpush":["misp-galaxy:android=\"Ghostpush\""],"Gmaster":["misp-galaxy:android=\"Gmaster\""],"Godwon":["misp-galaxy:android=\"Godwon\""],"Golddream":["misp-galaxy:android=\"Golddream\""],"Goldeneagle":["misp-galaxy:android=\"Goldeneagle\""],"Golocker":["misp-galaxy:android=\"Golocker\""],"Gomal":["misp-galaxy:android=\"Gomal\""],"Gonesixty":["misp-galaxy:android=\"Gonesixty\""],"Gonfu":["misp-galaxy:android=\"Gonfu\""],"Gonfu.B":["misp-galaxy:android=\"Gonfu.B\""],"Gonfu.C":["misp-galaxy:android=\"Gonfu.C\""],"Gonfu.D":["misp-galaxy:android=\"Gonfu.D\""],"Gooboot":["misp-galaxy:android=\"Gooboot\""],"Goodadpush":["misp-galaxy:android=\"Goodadpush\""],"Greystripe":["misp-galaxy:android=\"Greystripe\""],"Gugespy":["misp-galaxy:android=\"Gugespy\""],"Gugespy.B":["misp-galaxy:android=\"Gugespy.B\""],"Gupno":["misp-galaxy:android=\"Gupno\""],"Habey":["misp-galaxy:android=\"Habey\""],"Handyclient":["misp-galaxy:android=\"Handyclient\""],"Hehe":["misp-galaxy:android=\"Hehe\""],"HenBox":["misp-galaxy:android=\"HenBox\"","misp-galaxy:threat-actor=\"HenBox\""],"Hesperbot":["misp-galaxy:android=\"Hesperbot\""],"Hippo":["misp-galaxy:android=\"Hippo\""],"Hippo.B":["misp-galaxy:android=\"Hippo.B\""],"HummingBad":["misp-galaxy:android=\"HummingBad\"","misp-galaxy:mitre-malware=\"HummingBad - S0322\"","misp-galaxy:mitre-mobile-attack-malware=\"HummingBad - MOB-S0038\"","misp-galaxy:threat-actor=\"HummingBad\""],"IadPush":["misp-galaxy:android=\"IadPush\""],"IcicleGum":["misp-galaxy:android=\"IcicleGum\"","misp-galaxy:android=\"Igexin\""],"Iconosis":["misp-galaxy:android=\"Iconosis\""],"Iconosys":["misp-galaxy:android=\"Iconosys\""],"Igexin":["misp-galaxy:android=\"Igexin\""],"ImAdPush":["misp-galaxy:android=\"ImAdPush\""],"InMobi":["misp-galaxy:android=\"InMobi\""],"JamSkunk":["misp-galaxy:android=\"JamSkunk\""],"Jifake":["misp-galaxy:android=\"Jifake\""],"Jollyserv":["misp-galaxy:android=\"Jollyserv\""],"Jsmshider":["misp-galaxy:android=\"Jsmshider\""],"Ju6":["misp-galaxy:android=\"Ju6\""],"Judy":["misp-galaxy:android=\"Judy\"","misp-galaxy:mitre-malware=\"Judy - S0325\""],"Jumptap":["misp-galaxy:android=\"Jumptap\""],"Jzmob":["misp-galaxy:android=\"Jzmob\""],"Kabstamper":["misp-galaxy:android=\"Kabstamper\""],"Kemoge":["misp-galaxy:android=\"Kemoge\"","misp-galaxy:mitre-mobile-attack-malware=\"Shedun - MOB-S0010\""],"Kidlogger":["misp-galaxy:android=\"Kidlogger\""],"Kielog":["misp-galaxy:android=\"Kielog\""],"Kituri":["misp-galaxy:android=\"Kituri\""],"KoreFrog":["misp-galaxy:android=\"KoreFrog\""],"Kranxpay":["misp-galaxy:android=\"Kranxpay\""],"Krysanec":["misp-galaxy:android=\"Krysanec\""],"Kuaidian360":["misp-galaxy:android=\"Kuaidian360\""],"Kuguo":["misp-galaxy:android=\"Kuguo\""],"Lastacloud":["misp-galaxy:android=\"Lastacloud\""],"Laucassspy":["misp-galaxy:android=\"Laucassspy\""],"Lifemonspy":["misp-galaxy:android=\"Lifemonspy\""],"Lightdd":["misp-galaxy:android=\"Lightdd\""],"Loaderpush":["misp-galaxy:android=\"Loaderpush\""],"Loapi":["misp-galaxy:android=\"Loapi\""],"Locaspy":["misp-galaxy:android=\"Locaspy\""],"Lockdroid.E":["misp-galaxy:android=\"Lockdroid.E\""],"Lockdroid.F":["misp-galaxy:android=\"Lockdroid.F\""],"Lockdroid.G":["misp-galaxy:android=\"Lockdroid.G\""],"Lockdroid.H":["misp-galaxy:android=\"Lockdroid.H\""],"Lockscreen":["misp-galaxy:android=\"Lockscreen\""],"LogiaAd":["misp-galaxy:android=\"LogiaAd\""],"Loicdos":["misp-galaxy:android=\"Loicdos\""],"LokiBot":["misp-galaxy:android=\"LokiBot\"","misp-galaxy:malpedia=\"Loki Password Stealer (PWS)\"","misp-galaxy:malpedia=\"LokiBot\""],"Loozfon":["misp-galaxy:android=\"Loozfon\""],"Lotoor":["misp-galaxy:android=\"Lotoor\""],"Lovespy":["misp-galaxy:android=\"Lovespy\""],"Lovetrap":["misp-galaxy:android=\"Lovetrap\""],"Luckycat":["misp-galaxy:android=\"Luckycat\""],"Machinleak":["misp-galaxy:android=\"Machinleak\""],"Maistealer":["misp-galaxy:android=\"Maistealer\""],"Malapp":["misp-galaxy:android=\"Malapp\""],"Malebook":["misp-galaxy:android=\"Malebook\""],"Malhome":["misp-galaxy:android=\"Malhome\""],"Malminer":["misp-galaxy:android=\"Malminer\""],"Mania":["misp-galaxy:android=\"Mania\""],"Maxit":["misp-galaxy:android=\"Maxit\""],"MdotM":["misp-galaxy:android=\"MdotM\""],"Medialets":["misp-galaxy:android=\"Medialets\""],"Meshidden":["misp-galaxy:android=\"Meshidden\""],"Mesploit":["misp-galaxy:android=\"Mesploit\""],"Mesprank":["misp-galaxy:android=\"Mesprank\""],"Meswatcherbox":["misp-galaxy:android=\"Meswatcherbox\""],"Miji":["misp-galaxy:android=\"Miji\""],"Milipnot":["misp-galaxy:android=\"Milipnot\""],"MillennialMedia":["misp-galaxy:android=\"MillennialMedia\""],"Mitcad":["misp-galaxy:android=\"Mitcad\""],"MoPub":["misp-galaxy:android=\"MoPub\""],"MobClix":["misp-galaxy:android=\"MobClix\""],"MobFox":["misp-galaxy:android=\"MobFox\""],"MobWin":["misp-galaxy:android=\"MobWin\""],"Mobidisplay":["misp-galaxy:android=\"Mobidisplay\""],"Mobigapp":["misp-galaxy:android=\"Mobigapp\""],"MobileBackup":["misp-galaxy:android=\"MobileBackup\""],"Mobilespy":["misp-galaxy:android=\"Mobilespy\""],"Mobiletx":["misp-galaxy:android=\"Mobiletx\""],"Mobinaspy":["misp-galaxy:android=\"Mobinaspy\""],"Mobus":["misp-galaxy:android=\"Mobus\""],"Mocore":["misp-galaxy:android=\"Mocore\""],"Moghava":["misp-galaxy:android=\"Moghava\""],"Momark":["misp-galaxy:android=\"Momark\""],"Monitorello":["misp-galaxy:android=\"Monitorello\""],"Moolah":["misp-galaxy:android=\"Moolah\""],"Moplus":["misp-galaxy:android=\"Moplus\""],"Morepaks":["misp-galaxy:android=\"Morepaks\""],"MysteryBot":["misp-galaxy:android=\"MysteryBot\"","misp-galaxy:malpedia=\"MysteryBot\""],"Nandrobox":["misp-galaxy:android=\"Nandrobox\""],"Netisend":["misp-galaxy:android=\"Netisend\""],"Nickispy":["misp-galaxy:android=\"Nickispy\""],"Notcompatible":["misp-galaxy:android=\"Notcompatible\""],"Nuhaz":["misp-galaxy:android=\"Nuhaz\""],"Nyearleaker":["misp-galaxy:android=\"Nyearleaker\""],"Obad":["misp-galaxy:android=\"Obad\""],"Oneclickfraud":["misp-galaxy:android=\"Oneclickfraud\""],"Opfake":["misp-galaxy:android=\"Opfake\""],"Opfake.B":["misp-galaxy:android=\"Opfake.B\""],"Ozotshielder":["misp-galaxy:android=\"Ozotshielder\""],"Pafloat":["misp-galaxy:android=\"Pafloat\""],"PandaAds":["misp-galaxy:android=\"PandaAds\""],"Pandbot":["misp-galaxy:android=\"Pandbot\""],"Pdaspy":["misp-galaxy:android=\"Pdaspy\""],"Penetho":["misp-galaxy:android=\"Penetho\""],"Perkel":["misp-galaxy:android=\"Perkel\""],"Phimdropper":["misp-galaxy:android=\"Phimdropper\""],"Phospy":["misp-galaxy:android=\"Phospy\""],"Piddialer":["misp-galaxy:android=\"Piddialer\""],"Pikspam":["misp-galaxy:android=\"Pikspam\""],"Pincer":["misp-galaxy:android=\"Pincer\""],"Pirator":["misp-galaxy:android=\"Pirator\""],"Pjapps":["misp-galaxy:android=\"Pjapps\""],"Pjapps.B":["misp-galaxy:android=\"Pjapps.B\""],"Pletora":["misp-galaxy:android=\"Pletora\""],"Podec":["misp-galaxy:android=\"Podec\"","misp-galaxy:malpedia=\"Podec\""],"Poisoncake":["misp-galaxy:android=\"Poisoncake\""],"Pontiflex":["misp-galaxy:android=\"Pontiflex\""],"Positmob":["misp-galaxy:android=\"Positmob\""],"Premiumtext":["misp-galaxy:android=\"Premiumtext\""],"Pris":["misp-galaxy:android=\"Pris\""],"Qdplugin":["misp-galaxy:android=\"Qdplugin\""],"Qicsomos":["misp-galaxy:android=\"Qicsomos\""],"Qitmo":["misp-galaxy:android=\"Qitmo\""],"Rabbhome":["misp-galaxy:android=\"Rabbhome\""],"Razdel":["misp-galaxy:android=\"Razdel\""],"RedAlert2":["misp-galaxy:android=\"RedAlert2\"","misp-galaxy:malpedia=\"RedAlert2\""],"RedDrop":["misp-galaxy:android=\"RedDrop\"","misp-galaxy:mitre-malware=\"RedDrop - S0326\""],"Repane":["misp-galaxy:android=\"Repane\""],"Reputation.1":["misp-galaxy:android=\"Reputation.1\""],"Reputation.2":["misp-galaxy:android=\"Reputation.2\""],"Reputation.3":["misp-galaxy:android=\"Reputation.3\""],"RevMob":["misp-galaxy:android=\"RevMob\""],"Roidsec":["misp-galaxy:android=\"Roidsec\""],"Rootcager":["misp-galaxy:android=\"Rootcager\""],"Rootnik":["misp-galaxy:android=\"Rootnik\"","misp-galaxy:malpedia=\"Rootnik\""],"Rufraud":["misp-galaxy:android=\"Rufraud\""],"Rusms":["misp-galaxy:android=\"Rusms\""],"SLocker":["misp-galaxy:android=\"SLocker\""],"SMSLocker":["misp-galaxy:android=\"SLocker\""],"SMSReplicator":["misp-galaxy:android=\"SMSReplicator\""],"Samsapo":["misp-galaxy:android=\"Samsapo\""],"Sandorat":["misp-galaxy:android=\"Sandorat\""],"Sberick":["misp-galaxy:android=\"Sberick\""],"Scartibro":["misp-galaxy:android=\"Scartibro\""],"Scipiex":["misp-galaxy:android=\"Scipiex\""],"Selfmite":["misp-galaxy:android=\"Selfmite\""],"Selfmite.B":["misp-galaxy:android=\"Selfmite.B\""],"SellARing":["misp-galaxy:android=\"SellARing\""],"SendDroid":["misp-galaxy:android=\"SendDroid\""],"Simhosy":["misp-galaxy:android=\"Simhosy\""],"Simplocker":["misp-galaxy:android=\"Simplocker\""],"Simplocker.B":["misp-galaxy:android=\"Simplocker.B\""],"Skullkey":["misp-galaxy:android=\"Skullkey\""],"Skygofree":["misp-galaxy:android=\"Skygofree\"","misp-galaxy:malpedia=\"Skygofree\"","misp-galaxy:mitre-malware=\"Skygofree - S0327\""],"Smaato":["misp-galaxy:android=\"Smaato\""],"Smbcheck":["misp-galaxy:android=\"Smbcheck\""],"Smsblocker":["misp-galaxy:android=\"Smsblocker\""],"Smsbomber":["misp-galaxy:android=\"Smsbomber\""],"Smslink":["misp-galaxy:android=\"Smslink\""],"Smspacem":["misp-galaxy:android=\"Smspacem\""],"Smssniffer":["misp-galaxy:android=\"Smssniffer\""],"Smsstealer":["misp-galaxy:android=\"Smsstealer\""],"Smstibook":["misp-galaxy:android=\"Smstibook\""],"Smszombie":["misp-galaxy:android=\"Smszombie\""],"Snadapps":["misp-galaxy:android=\"Snadapps\""],"Sockbot":["misp-galaxy:android=\"Sockbot\""],"Sofacy":["misp-galaxy:android=\"Sofacy\"","misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-malware=\"CORESHELL - S0137\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\"","misp-galaxy:tool=\"CORESHELL\"","misp-galaxy:tool=\"GAMEFISH\"","misp-galaxy:tool=\"SOURFACE\""],"Sosceo":["misp-galaxy:android=\"Sosceo\""],"Spitmo":["misp-galaxy:android=\"Spitmo\""],"Spitmo.B":["misp-galaxy:android=\"Spitmo.B\""],"Spyagent":["misp-galaxy:android=\"Spyagent\""],"Spybubble":["misp-galaxy:android=\"Spybubble\""],"Spydafon":["misp-galaxy:android=\"Spydafon\""],"Spymple":["misp-galaxy:android=\"Spymple\""],"Spyoo":["misp-galaxy:android=\"Spyoo\""],"Spytekcell":["misp-galaxy:android=\"Spytekcell\""],"Spytrack":["misp-galaxy:android=\"Spytrack\""],"Spywaller":["misp-galaxy:android=\"Spywaller\""],"Stealthgenie":["misp-galaxy:android=\"Stealthgenie\""],"Steek":["misp-galaxy:android=\"Steek\""],"Stels":["misp-galaxy:android=\"Stels\""],"Stiniter":["misp-galaxy:android=\"Stiniter\""],"Sumzand":["misp-galaxy:android=\"Sumzand\""],"Svpeng":["misp-galaxy:android=\"Svpeng\"","misp-galaxy:malpedia=\"Svpeng\"","misp-galaxy:tool=\"Svpeng\""],"Invisble Man":["misp-galaxy:android=\"Svpeng\""],"Switcher":["misp-galaxy:android=\"Switcher\"","misp-galaxy:malpedia=\"Switcher\""],"Sysecsms":["misp-galaxy:android=\"Sysecsms\""],"Tanci":["misp-galaxy:android=\"Tanci\""],"Tapjoy":["misp-galaxy:android=\"Tapjoy\""],"Tapsnake":["misp-galaxy:android=\"Tapsnake\""],"Tascudap":["misp-galaxy:android=\"Tascudap\""],"Teelog":["misp-galaxy:android=\"Teelog\""],"Temai":["misp-galaxy:android=\"Temai\""],"Tetus":["misp-galaxy:android=\"Tetus\""],"Tgpush":["misp-galaxy:android=\"Tgpush\""],"Tigerbot":["misp-galaxy:android=\"Tigerbot\""],"Tizi":["misp-galaxy:android=\"Tizi\""],"Tonclank":["misp-galaxy:android=\"Tonclank\""],"Triout":["misp-galaxy:android=\"Triout\"","misp-galaxy:malpedia=\"Triout\""],"Trogle":["misp-galaxy:android=\"Trogle\""],"Twikabot":["misp-galaxy:android=\"Twikabot\""],"Uapush":["misp-galaxy:android=\"Uapush\""],"Umeng":["misp-galaxy:android=\"Umeng\""],"Updtbot":["misp-galaxy:android=\"Updtbot\""],"Upush":["misp-galaxy:android=\"Upush\""],"Uracto":["misp-galaxy:android=\"Uracto\""],"Uranico":["misp-galaxy:android=\"Uranico\""],"Usbcleaver":["misp-galaxy:android=\"Usbcleaver\""],"Utchi":["misp-galaxy:android=\"Utchi\""],"Uten":["misp-galaxy:android=\"Uten\""],"Uupay":["misp-galaxy:android=\"Uupay\""],"Uxipp":["misp-galaxy:android=\"Uxipp\""],"VDopia":["misp-galaxy:android=\"VDopia\""],"VServ":["misp-galaxy:android=\"VServ\""],"Vdloader":["misp-galaxy:android=\"Vdloader\""],"Vibleaker":["misp-galaxy:android=\"Vibleaker\""],"Viking Horde":["misp-galaxy:android=\"Viking Horde\""],"Virusshield":["misp-galaxy:android=\"Virusshield\""],"Walkinwat":["misp-galaxy:android=\"Walkinwat\""],"WannaLocker":["misp-galaxy:android=\"WannaLocker\""],"Waps":["misp-galaxy:android=\"Waps\""],"Waren":["misp-galaxy:android=\"Waren\""],"Windseeker":["misp-galaxy:android=\"Windseeker\""],"Wirex":["misp-galaxy:android=\"Wirex\""],"Wiyun":["misp-galaxy:android=\"Wiyun\""],"Wooboo":["misp-galaxy:android=\"Wooboo\""],"Wqmobile":["misp-galaxy:android=\"Wqmobile\""],"YahooAds":["misp-galaxy:android=\"YahooAds\""],"Yatoot":["misp-galaxy:android=\"Yatoot\""],"Yinhan":["misp-galaxy:android=\"Yinhan\""],"Youmi":["misp-galaxy:android=\"Youmi\""],"YuMe":["misp-galaxy:android=\"YuMe\""],"Zeahache":["misp-galaxy:android=\"Zeahache\""],"ZertSecurity":["misp-galaxy:android=\"ZertSecurity\""],"ZestAdz":["misp-galaxy:android=\"ZestAdz\""],"Zeusmitmo":["misp-galaxy:android=\"Zeusmitmo\""],"iBanking":["misp-galaxy:android=\"iBanking\""],"Rising Sun":["misp-galaxy:backdoor=\"Rising Sun\"","misp-galaxy:malpedia=\"Rising Sun\""],"Rosenbridge":["misp-galaxy:backdoor=\"Rosenbridge\""],"SLUB":["misp-galaxy:backdoor=\"SLUB\"","misp-galaxy:malpedia=\"SLUB\""],"ServHelper":["misp-galaxy:backdoor=\"ServHelper\"","misp-galaxy:malpedia=\"ServHelper\""],"WellMess":["misp-galaxy:backdoor=\"WellMess\"","misp-galaxy:malpedia=\"WellMess\""],"Atmos":["misp-galaxy:banker=\"Atmos\""],"Backswap":["misp-galaxy:banker=\"Backswap\""],"Banjori":["misp-galaxy:banker=\"Banjori\"","misp-galaxy:malpedia=\"Banjori\""],"MultiBanker 2":["misp-galaxy:banker=\"Banjori\"","misp-galaxy:malpedia=\"Banjori\""],"BankPatch":["misp-galaxy:banker=\"Banjori\"","misp-galaxy:malpedia=\"Banjori\""],"BackPatcher":["misp-galaxy:banker=\"Banjori\"","misp-galaxy:malpedia=\"Banjori\""],"Bebloh":["misp-galaxy:banker=\"Bebloh\"","misp-galaxy:malpedia=\"UrlZone\""],"URLZone":["misp-galaxy:banker=\"Bebloh\""],"Shiotob":["misp-galaxy:banker=\"Bebloh\"","misp-galaxy:malpedia=\"UrlZone\""],"CamuBot":["misp-galaxy:banker=\"CamuBot\"","misp-galaxy:malpedia=\"CamuBot\""],"Chthonic":["misp-galaxy:banker=\"Chthonic\"","misp-galaxy:malpedia=\"Chthonic\""],"Chtonic":["misp-galaxy:banker=\"Chthonic\""],"Citadel":["misp-galaxy:banker=\"Citadel\"","misp-galaxy:malpedia=\"Citadel\""],"Corebot":["misp-galaxy:banker=\"Corebot\"","misp-galaxy:malpedia=\"Corebot\""],"DanaBot":["misp-galaxy:banker=\"DanaBot\"","misp-galaxy:malpedia=\"DanaBot\""],"Dok":["misp-galaxy:banker=\"Dok\"","misp-galaxy:malpedia=\"Dok\"","misp-galaxy:mitre-malware=\"Dok - S0281\""],"Dreambot":["misp-galaxy:banker=\"Dreambot\""],"Dridex":["misp-galaxy:banker=\"Dridex\"","misp-galaxy:malpedia=\"Dridex\"","misp-galaxy:tool=\"Dridex\""],"Feodo Version D":["misp-galaxy:banker=\"Dridex\""],"Dyre":["misp-galaxy:banker=\"Dyre\"","misp-galaxy:malpedia=\"Dyre\"","misp-galaxy:mitre-enterprise-attack-malware=\"Dyre - S0024\"","misp-galaxy:mitre-malware=\"Dyre - S0024\""],"Dyreza":["misp-galaxy:banker=\"Dyre\"","misp-galaxy:malpedia=\"Dyre\""],"Feodo":["misp-galaxy:banker=\"Feodo\"","misp-galaxy:malpedia=\"Feodo\""],"Bugat":["misp-galaxy:banker=\"Feodo\"","misp-galaxy:malpedia=\"Bugat\"","misp-galaxy:malpedia=\"Feodo\""],"Cridex":["misp-galaxy:banker=\"Feodo\"","misp-galaxy:malpedia=\"Feodo\"","misp-galaxy:tool=\"Dridex\""],"Fobber":["misp-galaxy:banker=\"Fobber\"","misp-galaxy:malpedia=\"Fobber\""],"Geodo":["misp-galaxy:banker=\"Geodo\"","misp-galaxy:malpedia=\"Emotet\"","misp-galaxy:malpedia=\"Geodo\"","misp-galaxy:mitre-malware=\"Emotet - S0367\"","misp-galaxy:tool=\"Emotet\""],"Feodo Version C":["misp-galaxy:banker=\"Geodo\""],"Emotet":["misp-galaxy:banker=\"Geodo\"","misp-galaxy:malpedia=\"Emotet\"","misp-galaxy:malpedia=\"Geodo\"","misp-galaxy:mitre-malware=\"Emotet - S0367\"","misp-galaxy:tool=\"Emotet\""],"GozNym":["misp-galaxy:banker=\"GozNym\"","misp-galaxy:threat-actor=\"GozNym\""],"Gozi ISFB":["misp-galaxy:banker=\"Gozi ISFB\"","misp-galaxy:malpedia=\"ISFB\""],"Gozi":["misp-galaxy:banker=\"Gozi\"","misp-galaxy:malpedia=\"Gozi\""],"Ursnif":["misp-galaxy:banker=\"Gozi\"","misp-galaxy:malpedia=\"Gozi\"","misp-galaxy:malpedia=\"Snifula\"","misp-galaxy:tool=\"Snifula\""],"CRM":["misp-galaxy:banker=\"Gozi\"","misp-galaxy:malpedia=\"Gozi\""],"Snifula":["misp-galaxy:banker=\"Gozi\"","misp-galaxy:malpedia=\"Gozi\"","misp-galaxy:malpedia=\"Snifula\"","misp-galaxy:tool=\"Snifula\""],"Papras":["misp-galaxy:banker=\"Gozi\"","misp-galaxy:malpedia=\"Gozi\""],"Goziv2":["misp-galaxy:banker=\"Goziv2\""],"Prinimalka":["misp-galaxy:banker=\"Goziv2\""],"GratefulPOS":["misp-galaxy:banker=\"GratefulPOS\"","misp-galaxy:tool=\"GratefulPOS\""],"IAP":["misp-galaxy:banker=\"IAP\"","misp-galaxy:malpedia=\"ISFB\""],"Ice IX":["misp-galaxy:banker=\"Ice IX\"","misp-galaxy:malpedia=\"Ice IX\""],"IcedID":["misp-galaxy:banker=\"IcedID\"","misp-galaxy:malpedia=\"IcedID\""],"Karius":["misp-galaxy:banker=\"Karius\"","misp-galaxy:malpedia=\"Karius\""],"Kronos":["misp-galaxy:banker=\"Kronos\"","misp-galaxy:malpedia=\"Kronos\""],"Licat":["misp-galaxy:banker=\"Licat\""],"Murofet":["misp-galaxy:banker=\"Licat\"","misp-galaxy:malpedia=\"Murofet\""],"Matrix Banker":["misp-galaxy:banker=\"Matrix Banker\"","misp-galaxy:malpedia=\"Matrix Banker\""],"Panda Banker":["misp-galaxy:banker=\"Panda Banker\""],"Zeus Panda":["misp-galaxy:banker=\"Panda Banker\"","misp-galaxy:mitre-malware=\"Zeus Panda - S0330\""],"Qadars":["misp-galaxy:banker=\"Qadars\"","misp-galaxy:malpedia=\"Qadars\""],"Qakbot":["misp-galaxy:banker=\"Qakbot\"","misp-galaxy:tool=\"Akbot\""],"Qbot ":["misp-galaxy:banker=\"Qakbot\""],"Pinkslipbot":["misp-galaxy:banker=\"Qakbot\"","misp-galaxy:malpedia=\"QakBot\""],"Ramnit":["misp-galaxy:banker=\"Ramnit\"","misp-galaxy:botnet=\"Ramnit\"","misp-galaxy:malpedia=\"Ramnit\""],"Nimnul":["misp-galaxy:banker=\"Ramnit\"","misp-galaxy:malpedia=\"Ramnit\""],"Ranbyus":["misp-galaxy:banker=\"Ranbyus\"","misp-galaxy:malpedia=\"Ranbyus\""],"ReactorBot":["misp-galaxy:banker=\"ReactorBot\"","misp-galaxy:malpedia=\"ReactorBot\""],"Retefe":["misp-galaxy:banker=\"Retefe\"","misp-galaxy:malpedia=\"Dok\"","misp-galaxy:mitre-malware=\"Dok - S0281\""],"Tsukuba":["misp-galaxy:banker=\"Retefe\"","misp-galaxy:malpedia=\"Retefe (Windows)\""],"Werdlod":["misp-galaxy:banker=\"Retefe\"","misp-galaxy:malpedia=\"Retefe (Windows)\""],"Sisron":["misp-galaxy:banker=\"Sisron\""],"Skynet":["misp-galaxy:banker=\"Skynet\""],"Smominru":["misp-galaxy:banker=\"Smominru\"","misp-galaxy:malpedia=\"Smominru\""],"Ismo":["misp-galaxy:banker=\"Smominru\"","misp-galaxy:malpedia=\"Smominru\""],"lsmo":["misp-galaxy:banker=\"Smominru\""],"SpyEye":["misp-galaxy:banker=\"SpyEye\""],"Tinba":["misp-galaxy:banker=\"Tinba\"","misp-galaxy:malpedia=\"Tinba\"","misp-galaxy:tool=\"Tinba\""],"Zusy":["misp-galaxy:banker=\"Tinba\"","misp-galaxy:malpedia=\"Tinba\"","misp-galaxy:tool=\"Tinba\""],"TinyBanker":["misp-galaxy:banker=\"Tinba\"","misp-galaxy:malpedia=\"Tinba\"","misp-galaxy:tool=\"Tinba\""],"illi":["misp-galaxy:banker=\"Tinba\""],"TinyNuke":["misp-galaxy:banker=\"TinyNuke\"","misp-galaxy:malpedia=\"TinyNuke\""],"NukeBot":["misp-galaxy:banker=\"TinyNuke\"","misp-galaxy:malpedia=\"TinyNuke\""],"Nuclear Bot":["misp-galaxy:banker=\"TinyNuke\"","misp-galaxy:malpedia=\"TinyNuke\""],"MicroBankingTrojan":["misp-galaxy:banker=\"TinyNuke\"","misp-galaxy:malpedia=\"TinyNuke\""],"Xbot":["misp-galaxy:banker=\"TinyNuke\"","misp-galaxy:malpedia=\"TinyNuke\"","misp-galaxy:malpedia=\"Xbot\"","misp-galaxy:mitre-mobile-attack-tool=\"Xbot - MOB-S0014\"","misp-galaxy:mitre-tool=\"Xbot - S0298\""],"Trickbot":["misp-galaxy:banker=\"Trickbot\""],"Trickster":["misp-galaxy:banker=\"Trickbot\"","misp-galaxy:malpedia=\"TrickBot\""],"Trickloader":["misp-galaxy:banker=\"Trickbot\""],"Vawtrak":["misp-galaxy:banker=\"Vawtrak\"","misp-galaxy:malpedia=\"Vawtrak\"","misp-galaxy:tool=\"Vawtrak\""],"Neverquest":["misp-galaxy:banker=\"Vawtrak\""],"Zeus Gameover":["misp-galaxy:banker=\"Zeus Gameover\""],"Zeus KINS":["misp-galaxy:banker=\"Zeus KINS\""],"Kasper Internet Non-Security":["misp-galaxy:banker=\"Zeus KINS\"","misp-galaxy:malpedia=\"KINS\""],"Maple":["misp-galaxy:banker=\"Zeus KINS\"","misp-galaxy:malpedia=\"KINS\""],"Zeus Sphinx":["misp-galaxy:banker=\"Zeus Sphinx\"","misp-galaxy:malpedia=\"Zeus Sphinx\""],"Zeus VM":["misp-galaxy:banker=\"Zeus VM\""],"VM Zeus":["misp-galaxy:banker=\"Zeus VM\"","misp-galaxy:malpedia=\"VM Zeus\""],"Zeus":["misp-galaxy:banker=\"Zeus\"","misp-galaxy:botnet=\"Zeus\"","misp-galaxy:malpedia=\"Zeus\"","misp-galaxy:tool=\"Zeus\""],"Zbot":["misp-galaxy:banker=\"Zeus\"","misp-galaxy:botnet=\"Zeus\"","misp-galaxy:malpedia=\"Zeus\"","misp-galaxy:tool=\"Zeus\""],"Zitmo":["misp-galaxy:banker=\"Zitmo\""],"Zloader Zeus":["misp-galaxy:banker=\"Zloader Zeus\""],"Zeus Terdot":["misp-galaxy:banker=\"Zloader Zeus\""],"downAndExec":["misp-galaxy:banker=\"downAndExec\""],"ADB.miner":["misp-galaxy:botnet=\"ADB.miner\""],"AESDDoS":["misp-galaxy:botnet=\"AESDDoS\""],"Akbot":["misp-galaxy:botnet=\"Akbot\"","misp-galaxy:tool=\"Akbot\""],"Asprox":["misp-galaxy:botnet=\"Asprox\"","misp-galaxy:malpedia=\"Asprox\""],"Badsrc":["misp-galaxy:botnet=\"Asprox\""],"Aseljo":["misp-galaxy:botnet=\"Asprox\"","misp-galaxy:malpedia=\"Asprox\""],"Danmec":["misp-galaxy:botnet=\"Asprox\""],"Hydraflux":["misp-galaxy:botnet=\"Asprox\""],"Bagle":["misp-galaxy:botnet=\"Bagle\"","misp-galaxy:malpedia=\"Bagle\""],"Beagle":["misp-galaxy:botnet=\"Bagle\""],"Mitglieder":["misp-galaxy:botnet=\"Bagle\""],"Lodeight":["misp-galaxy:botnet=\"Bagle\""],"Bamital":["misp-galaxy:botnet=\"Bamital\""],"Mdrop-CSK":["misp-galaxy:botnet=\"Bamital\""],"Agent-OCF":["misp-galaxy:botnet=\"Bamital\""],"Beebone":["misp-galaxy:botnet=\"Beebone\""],"BetaBot":["misp-galaxy:botnet=\"BetaBot\"","misp-galaxy:malpedia=\"BetaBot\""],"Brain Food":["misp-galaxy:botnet=\"Brain Food\""],"BredoLab":["misp-galaxy:botnet=\"BredoLab\""],"Oficla":["misp-galaxy:botnet=\"BredoLab\"","misp-galaxy:malpedia=\"Sasfis\"","misp-galaxy:tool=\"Oficla\""],"Chalubo":["misp-galaxy:botnet=\"Chalubo\""],"Chameleon":["misp-galaxy:botnet=\"Chameleon\""],"Conficker":["misp-galaxy:botnet=\"Conficker\"","misp-galaxy:malpedia=\"Conficker\""],"DownUp":["misp-galaxy:botnet=\"Conficker\""],"DownAndUp":["misp-galaxy:botnet=\"Conficker\""],"DownAdUp":["misp-galaxy:botnet=\"Conficker\""],"Kido":["misp-galaxy:botnet=\"Conficker\"","misp-galaxy:malpedia=\"Conficker\""],"Cutwail":["misp-galaxy:botnet=\"Cutwail\"","misp-galaxy:malpedia=\"Cutwail\""],"Pandex":["misp-galaxy:botnet=\"Cutwail\""],"Mutant":["misp-galaxy:botnet=\"Cutwail\""],"Donbot":["misp-galaxy:botnet=\"Donbot\""],"Buzus":["misp-galaxy:botnet=\"Donbot\"","misp-galaxy:malpedia=\"Buzus\""],"Bachsoy":["misp-galaxy:botnet=\"Donbot\""],"Festi":["misp-galaxy:botnet=\"Festi\""],"Spamnost":["misp-galaxy:botnet=\"Festi\""],"Gafgyt":["misp-galaxy:botnet=\"Gafgyt\"","misp-galaxy:malpedia=\"Bashlite\"","misp-galaxy:tool=\"Gafgyt\""],"Bashlite":["misp-galaxy:botnet=\"Gafgyt\"","misp-galaxy:malpedia=\"Bashlite\""],"Gheg":["misp-galaxy:botnet=\"Gheg\"","misp-galaxy:malpedia=\"Tofsee\""],"Tofsee":["misp-galaxy:botnet=\"Gheg\"","misp-galaxy:malpedia=\"Tofsee\""],"Mondera":["misp-galaxy:botnet=\"Gheg\""],"Grum":["misp-galaxy:botnet=\"Grum\""],"Tedroo":["misp-galaxy:botnet=\"Grum\""],"Reddyb":["misp-galaxy:botnet=\"Grum\""],"Gumblar":["misp-galaxy:botnet=\"Gumblar\""],"Hajime":["misp-galaxy:botnet=\"Hajime\"","misp-galaxy:malpedia=\"Hajime\""],"Hide and Seek":["misp-galaxy:botnet=\"Hide and Seek\"","misp-galaxy:malpedia=\"Hide and Seek\""],"HNS":["misp-galaxy:botnet=\"Hide and Seek\"","misp-galaxy:malpedia=\"Hide and Seek\""],"Hide 'N Seek":["misp-galaxy:botnet=\"Hide and Seek\""],"Kelihos":["misp-galaxy:botnet=\"Kelihos\"","misp-galaxy:malpedia=\"Kelihos\""],"Hlux":["misp-galaxy:botnet=\"Kelihos\""],"Kraken":["misp-galaxy:botnet=\"Kraken\"","misp-galaxy:botnet=\"Marina Botnet\"","misp-galaxy:malpedia=\"Kraken\""],"Kracken":["misp-galaxy:botnet=\"Kraken\""],"Lethic":["misp-galaxy:botnet=\"Lethic\"","misp-galaxy:malpedia=\"Lethic\""],"LowSec":["misp-galaxy:botnet=\"LowSec\""],"LowSecurity":["misp-galaxy:botnet=\"LowSec\""],"FreeMoney":["misp-galaxy:botnet=\"LowSec\""],"Ring0.Tools":["misp-galaxy:botnet=\"LowSec\""],"Maazben":["misp-galaxy:botnet=\"Maazben\""],"Madmax":["misp-galaxy:botnet=\"Madmax\""],"Mad Max":["misp-galaxy:botnet=\"Madmax\"","misp-galaxy:tool=\"Mad Max\""],"Marina Botnet":["misp-galaxy:botnet=\"Marina Botnet\""],"Damon Briant":["misp-galaxy:botnet=\"Marina Botnet\""],"BOB.dc":["misp-galaxy:botnet=\"Marina Botnet\""],"Cotmonger":["misp-galaxy:botnet=\"Marina Botnet\""],"Hacktool.Spammer":["misp-galaxy:botnet=\"Marina Botnet\""],"Mariposa":["misp-galaxy:botnet=\"Mariposa\""],"Mega-D":["misp-galaxy:botnet=\"Mega-D\""],"Ozdok":["misp-galaxy:botnet=\"Mega-D\""],"Mettle":["misp-galaxy:botnet=\"Mettle\""],"Mirai":["misp-galaxy:botnet=\"Mirai\"","misp-galaxy:tool=\"Mirai\""],"Muhstik":["misp-galaxy:botnet=\"Muhstik\"","misp-galaxy:malpedia=\"Tsunami (ELF)\""],"Nucrypt":["misp-galaxy:botnet=\"Nucrypt\""],"Onewordsub":["misp-galaxy:botnet=\"Onewordsub\""],"Owari":["misp-galaxy:botnet=\"Owari\"","misp-galaxy:malpedia=\"Owari\""],"Persirai":["misp-galaxy:botnet=\"Persirai\"","misp-galaxy:malpedia=\"Persirai\""],"Pontoeb":["misp-galaxy:botnet=\"Pontoeb\""],"N0ise":["misp-galaxy:botnet=\"Pontoeb\""],"Pushdo":["misp-galaxy:botnet=\"Pushdo\"","misp-galaxy:malpedia=\"Pushdo\""],"Rustock":["misp-galaxy:botnet=\"Rustock\"","misp-galaxy:malpedia=\"Rustock\""],"RKRustok":["misp-galaxy:botnet=\"Rustock\""],"Costrat":["misp-galaxy:botnet=\"Rustock\""],"Sality":["misp-galaxy:botnet=\"Sality\"","misp-galaxy:botnet=\"Sality\"","misp-galaxy:malpedia=\"Sality\""],"Sector":["misp-galaxy:botnet=\"Sality\""],"Kuku":["misp-galaxy:botnet=\"Sality\""],"SalLoad":["misp-galaxy:botnet=\"Sality\""],"Kookoo":["misp-galaxy:botnet=\"Sality\""],"SaliCode":["misp-galaxy:botnet=\"Sality\""],"Kukacka":["misp-galaxy:botnet=\"Sality\""],"Satori":["misp-galaxy:botnet=\"Satori\"","misp-galaxy:malpedia=\"Satori\"","misp-galaxy:tool=\"Satori\""],"Okiru":["misp-galaxy:botnet=\"Satori\"","misp-galaxy:tool=\"Satori\""],"Simda":["misp-galaxy:botnet=\"Simda\"","misp-galaxy:malpedia=\"Simda\""],"Sora":["misp-galaxy:botnet=\"Sora\""],"Mirai Sora":["misp-galaxy:botnet=\"Sora\""],"Spamthru":["misp-galaxy:botnet=\"Spamthru\""],"Spam-DComServ":["misp-galaxy:botnet=\"Spamthru\""],"Covesmer":["misp-galaxy:botnet=\"Spamthru\""],"Xmiler":["misp-galaxy:botnet=\"Spamthru\""],"Srizbi":["misp-galaxy:botnet=\"Srizbi\""],"Cbeplay":["misp-galaxy:botnet=\"Srizbi\""],"Exchanger":["misp-galaxy:botnet=\"Srizbi\""],"Storm":["misp-galaxy:botnet=\"Storm\""],"Nuwar":["misp-galaxy:botnet=\"Storm\""],"Peacomm":["misp-galaxy:botnet=\"Storm\""],"Zhelatin":["misp-galaxy:botnet=\"Storm\""],"Dorf":["misp-galaxy:botnet=\"Storm\""],"Ecard":["misp-galaxy:botnet=\"Storm\""],"TDL4":["misp-galaxy:botnet=\"TDL4\""],"TDSS":["misp-galaxy:botnet=\"TDL4\"","misp-galaxy:malpedia=\"Alureon\""],"Alureon":["misp-galaxy:botnet=\"TDL4\"","misp-galaxy:malpedia=\"Alureon\""],"Torii":["misp-galaxy:botnet=\"Torii\"","misp-galaxy:malpedia=\"Torii\""],"Torpig":["misp-galaxy:botnet=\"Torpig\"","misp-galaxy:malpedia=\"Sinowal\""],"Sinowal":["misp-galaxy:botnet=\"Torpig\"","misp-galaxy:malpedia=\"Sinowal\""],"Anserin":["misp-galaxy:botnet=\"Torpig\"","misp-galaxy:malpedia=\"Sinowal\""],"Trik Spam Botnet":["misp-galaxy:botnet=\"Trik Spam Botnet\""],"Trik Trojan":["misp-galaxy:botnet=\"Trik Spam Botnet\""],"Virut":["misp-galaxy:botnet=\"Virut\"","misp-galaxy:malpedia=\"Virut\""],"Vulcanbot":["misp-galaxy:botnet=\"Vulcanbot\""],"Waledac":["misp-galaxy:botnet=\"Waledac\""],"Waled":["misp-galaxy:botnet=\"Waledac\""],"Waledpak":["misp-galaxy:botnet=\"Waledac\""],"Wopla":["misp-galaxy:botnet=\"Wopla\""],"Xarvester":["misp-galaxy:botnet=\"Xarvester\""],"Rlsloup":["misp-galaxy:botnet=\"Xarvester\""],"Pixoliz":["misp-galaxy:botnet=\"Xarvester\""],"XorDDoS":["misp-galaxy:botnet=\"XorDDoS\""],"Zer0n3t":["misp-galaxy:botnet=\"Zer0n3t\"","misp-galaxy:botnet=\"Zer0n3t\""],"Fib3rl0g1c":["misp-galaxy:botnet=\"Zer0n3t\""],"Zer0Log1x":["misp-galaxy:botnet=\"Zer0n3t\""],"ZeuS":["misp-galaxy:botnet=\"Zeus\""],"PRG":["misp-galaxy:botnet=\"Zeus\""],"Wsnpoem":["misp-galaxy:botnet=\"Zeus\""],"Gorhax":["misp-galaxy:botnet=\"Zeus\""],"Kneber":["misp-galaxy:botnet=\"Zeus\""],"BadUSB":["misp-galaxy:branded-vulnerability=\"BadUSB\""],"Badlock":["misp-galaxy:branded-vulnerability=\"Badlock\""],"Blacknurse":["misp-galaxy:branded-vulnerability=\"Blacknurse\""],"BlueKeep":["misp-galaxy:branded-vulnerability=\"BlueKeep\""],"Dirty COW":["misp-galaxy:branded-vulnerability=\"Dirty COW\""],"Ghost":["misp-galaxy:branded-vulnerability=\"Ghost\"","misp-galaxy:rat=\"Ghost\""],"Heartbleed":["misp-galaxy:branded-vulnerability=\"Heartbleed\""],"ImageTragick":["misp-galaxy:branded-vulnerability=\"ImageTragick\""],"Meltdown":["misp-galaxy:branded-vulnerability=\"Meltdown\""],"POODLE":["misp-galaxy:branded-vulnerability=\"POODLE\""],"SPOILER":["misp-galaxy:branded-vulnerability=\"SPOILER\""],"Shellshock":["misp-galaxy:branded-vulnerability=\"Shellshock\""],"Spectre":["misp-galaxy:branded-vulnerability=\"Spectre\""],"Stagefright":["misp-galaxy:branded-vulnerability=\"Stagefright\""],"Constituency":["misp-galaxy:cert-eu-govsector=\"Constituency\""],"EU-Centric":["misp-galaxy:cert-eu-govsector=\"EU-Centric\""],"EU-nearby":["misp-galaxy:cert-eu-govsector=\"EU-nearby\""],"Outside World":["misp-galaxy:cert-eu-govsector=\"Outside World\""],"Unknown":["misp-galaxy:cert-eu-govsector=\"Unknown\"","misp-galaxy:exploit-kit=\"Unknown\"","misp-galaxy:sector=\"Unknown\""],"World-class":["misp-galaxy:cert-eu-govsector=\"World-class\""],"AAD - Dump users and groups with Azure AD":["misp-galaxy:cloud-security=\"AAD - Dump users and groups with Azure AD\""],"AAD - Password Spray: CredKing":["misp-galaxy:cloud-security=\"AAD - Password Spray: CredKing\""],"AAD - Password Spray: MailSniper":["misp-galaxy:cloud-security=\"AAD - Password Spray: MailSniper\""],"End Point - Create Hidden Mailbox Rule":["misp-galaxy:cloud-security=\"End Point - Create Hidden Mailbox Rule\""],"End Point - Persistence throught Outlook Home Page: SensePost Ruler":["misp-galaxy:cloud-security=\"End Point - Persistence throught Outlook Home Page: SensePost Ruler\""],"End Point - Persistence throught custom Outlook form":["misp-galaxy:cloud-security=\"End Point - Persistence throught custom Outlook form\""],"End Point - Search host for Azure Credentials: SharpCloud":["misp-galaxy:cloud-security=\"End Point - Search host for Azure Credentials: SharpCloud\""],"O365 - 2FA MITM Phishing: evilginx2":["misp-galaxy:cloud-security=\"O365 - 2FA MITM Phishing: evilginx2\""],"O365 - Account Takeover: Add-MailboxPermission":["misp-galaxy:cloud-security=\"O365 - Account Takeover: Add-MailboxPermission\""],"O365 - Add Global admin account":["misp-galaxy:cloud-security=\"O365 - Add Global admin account\""],"O365 - Add Mail forwarding rule":["misp-galaxy:cloud-security=\"O365 - Add Mail forwarding rule\""],"O365 - Bruteforce of Autodiscover: SensePost Ruler":["misp-galaxy:cloud-security=\"O365 - Bruteforce of Autodiscover: SensePost Ruler\""],"O365 - Delegate Tenant Admin":["misp-galaxy:cloud-security=\"O365 - Delegate Tenant Admin\""],"O365 - Download documents and email":["misp-galaxy:cloud-security=\"O365 - Download documents and email\""],"O365 - Exchange Tasks for C2: MWR":["misp-galaxy:cloud-security=\"O365 - Exchange Tasks for C2: MWR\""],"O365 - Exfiltration email using EWS APIs with PowerShell":["misp-galaxy:cloud-security=\"O365 - Exfiltration email using EWS APIs with PowerShell\""],"O365 - Find Open Mailboxes: MailSniper":["misp-galaxy:cloud-security=\"O365 - Find Open Mailboxes: MailSniper\""],"O365 - Get Global Address List: MailSniper":["misp-galaxy:cloud-security=\"O365 - Get Global Address List: MailSniper\""],"O365 - MailSniper: Search Mailbox for content":["misp-galaxy:cloud-security=\"O365 - MailSniper: Search Mailbox for content\""],"O365 - MailSniper: Search Mailbox for credentials":["misp-galaxy:cloud-security=\"O365 - MailSniper: Search Mailbox for credentials\""],"O365 - Phishing for credentials":["misp-galaxy:cloud-security=\"O365 - Phishing for credentials\""],"O365 - Phishing using OAuth app":["misp-galaxy:cloud-security=\"O365 - Phishing using OAuth app\""],"O365 - Pivot to On-Prem host: SensePost Ruler":["misp-galaxy:cloud-security=\"O365 - Pivot to On-Prem host: SensePost Ruler\""],"O365 - Search for Content with eDiscovery":["misp-galaxy:cloud-security=\"O365 - Search for Content with eDiscovery\""],"O365 - Send Internal Email":["misp-galaxy:cloud-security=\"O365 - Send Internal Email\""],"O365 - User account enumeration with ActiveSync":["misp-galaxy:cloud-security=\"O365 - User account enumeration with ActiveSync\""],"On-Prem Exchange - Bruteforce of Autodiscover: SensePost Ruler":["misp-galaxy:cloud-security=\"On-Prem Exchange - Bruteforce of Autodiscover: SensePost Ruler\""],"On-Prem Exchange - Delegation":["misp-galaxy:cloud-security=\"On-Prem Exchange - Delegation\""],"On-Prem Exchange - Enumerate domain accounts: FindPeople":["misp-galaxy:cloud-security=\"On-Prem Exchange - Enumerate domain accounts: FindPeople\""],"On-Prem Exchange - Enumerate domain accounts: OWA & Exchange":["misp-galaxy:cloud-security=\"On-Prem Exchange - Enumerate domain accounts: OWA & Exchange\""],"On-Prem Exchange - Enumerate domain accounts: using Skype4B":["misp-galaxy:cloud-security=\"On-Prem Exchange - Enumerate domain accounts: using Skype4B\""],"On-Prem Exchange - OWA version discovery":["misp-galaxy:cloud-security=\"On-Prem Exchange - OWA version discovery\""],"On-Prem Exchange - Password Spray using Invoke-PasswordSprayOWA, EWS":["misp-galaxy:cloud-security=\"On-Prem Exchange - Password Spray using Invoke-PasswordSprayOWA, EWS\""],"On-Prem Exchange - Portal Recon":["misp-galaxy:cloud-security=\"On-Prem Exchange - Portal Recon\""],"On-Prem Exchange - Search Mailboxes with eDiscovery searches (EXO, Teams, SPO, OD4B, Skype4B)":["misp-galaxy:cloud-security=\"On-Prem Exchange - Search Mailboxes with eDiscovery searches (EXO, Teams, SPO, OD4B, Skype4B)\""],"Angler":["misp-galaxy:exploit-kit=\"Angler\""],"XXX":["misp-galaxy:exploit-kit=\"Angler\""],"AEK":["misp-galaxy:exploit-kit=\"Angler\""],"Axpergle":["misp-galaxy:exploit-kit=\"Angler\""],"Archie":["misp-galaxy:exploit-kit=\"Archie\""],"Astrum":["misp-galaxy:exploit-kit=\"Astrum\""],"Stegano EK":["misp-galaxy:exploit-kit=\"Astrum\""],"Bingo":["misp-galaxy:exploit-kit=\"Bingo\""],"Bizarro Sundown":["misp-galaxy:exploit-kit=\"Bizarro Sundown\""],"Sundown-b":["misp-galaxy:exploit-kit=\"Bizarro Sundown\""],"BlackHole":["misp-galaxy:exploit-kit=\"BlackHole\"","misp-galaxy:rat=\"BlackHole\""],"BHEK":["misp-galaxy:exploit-kit=\"BlackHole\""],"Bleeding Life":["misp-galaxy:exploit-kit=\"Bleeding Life\""],"BL":["misp-galaxy:exploit-kit=\"Bleeding Life\""],"BL2":["misp-galaxy:exploit-kit=\"Bleeding Life\""],"Cool":["misp-galaxy:exploit-kit=\"Cool\""],"CEK":["misp-galaxy:exploit-kit=\"Cool\""],"Styxy Cool":["misp-galaxy:exploit-kit=\"Cool\""],"DNSChanger":["misp-galaxy:exploit-kit=\"DNSChanger\""],"RouterEK":["misp-galaxy:exploit-kit=\"DNSChanger\""],"DealersChoice":["misp-galaxy:exploit-kit=\"DealersChoice\"","misp-galaxy:mitre-malware=\"DealersChoice - S0243\""],"Sednit RTF EK":["misp-galaxy:exploit-kit=\"DealersChoice\""],"Disdain":["misp-galaxy:exploit-kit=\"Disdain\""],"Empire":["misp-galaxy:exploit-kit=\"Empire\"","misp-galaxy:mitre-tool=\"Empire - S0363\"","misp-galaxy:tool=\"Empire\""],"RIG-E":["misp-galaxy:exploit-kit=\"Empire\""],"Fallout":["misp-galaxy:exploit-kit=\"Fallout\"","misp-galaxy:exploit-kit=\"Fallout\""],"Fiesta":["misp-galaxy:exploit-kit=\"Fiesta\""],"NeoSploit":["misp-galaxy:exploit-kit=\"Fiesta\""],"Fiexp":["misp-galaxy:exploit-kit=\"Fiesta\""],"FlashPack":["misp-galaxy:exploit-kit=\"FlashPack\""],"FlashEK":["misp-galaxy:exploit-kit=\"FlashPack\""],"SafePack":["misp-galaxy:exploit-kit=\"FlashPack\""],"CritXPack":["misp-galaxy:exploit-kit=\"FlashPack\""],"Vintage Pack":["misp-galaxy:exploit-kit=\"FlashPack\""],"Glazunov":["misp-galaxy:exploit-kit=\"Glazunov\""],"GrandSoft":["misp-galaxy:exploit-kit=\"GrandSoft\""],"StampEK":["misp-galaxy:exploit-kit=\"GrandSoft\""],"SofosFO":["misp-galaxy:exploit-kit=\"GrandSoft\""],"GreenFlash Sundown":["misp-galaxy:exploit-kit=\"GreenFlash Sundown\""],"Sundown-GF":["misp-galaxy:exploit-kit=\"GreenFlash Sundown\""],"HanJuan":["misp-galaxy:exploit-kit=\"HanJuan\""],"Himan":["misp-galaxy:exploit-kit=\"Himan\""],"High Load":["misp-galaxy:exploit-kit=\"Himan\""],"Hunter":["misp-galaxy:exploit-kit=\"Hunter\"","misp-galaxy:tool=\"Tinba\""],"3ROS Exploit Kit":["misp-galaxy:exploit-kit=\"Hunter\""],"Impact":["misp-galaxy:exploit-kit=\"Impact\""],"Infinity":["misp-galaxy:exploit-kit=\"Infinity\""],"Redkit v2.0":["misp-galaxy:exploit-kit=\"Infinity\""],"Goon":["misp-galaxy:exploit-kit=\"Infinity\""],"Kaixin":["misp-galaxy:exploit-kit=\"Kaixin\""],"CK vip":["misp-galaxy:exploit-kit=\"Kaixin\""],"Lightsout":["misp-galaxy:exploit-kit=\"Lightsout\""],"MWI":["misp-galaxy:exploit-kit=\"MWI\""],"Magnitude":["misp-galaxy:exploit-kit=\"Magnitude\""],"Popads EK":["misp-galaxy:exploit-kit=\"Magnitude\""],"TopExp":["misp-galaxy:exploit-kit=\"Magnitude\""],"Nebula":["misp-galaxy:exploit-kit=\"Nebula\""],"Neutrino":["misp-galaxy:exploit-kit=\"Neutrino\"","misp-galaxy:malpedia=\"Neutrino\""],"Job314":["misp-galaxy:exploit-kit=\"Neutrino\""],"Neutrino Rebooted":["misp-galaxy:exploit-kit=\"Neutrino\""],"Neutrino-v":["misp-galaxy:exploit-kit=\"Neutrino\""],"Niteris":["misp-galaxy:exploit-kit=\"Niteris\""],"CottonCastle":["misp-galaxy:exploit-kit=\"Niteris\""],"Novidade":["misp-galaxy:exploit-kit=\"Novidade\""],"DNSGhost":["misp-galaxy:exploit-kit=\"Novidade\""],"Nuclear":["misp-galaxy:exploit-kit=\"Nuclear\""],"NEK":["misp-galaxy:exploit-kit=\"Nuclear\""],"Nuclear Pack":["misp-galaxy:exploit-kit=\"Nuclear\""],"Spartan":["misp-galaxy:exploit-kit=\"Nuclear\""],"Neclu":["misp-galaxy:exploit-kit=\"Nuclear\""],"Phoenix":["misp-galaxy:exploit-kit=\"Phoenix\""],"PEK":["misp-galaxy:exploit-kit=\"Phoenix\""],"Private Exploit Pack":["misp-galaxy:exploit-kit=\"Private Exploit Pack\""],"PEP":["misp-galaxy:exploit-kit=\"Private Exploit Pack\""],"RIG":["misp-galaxy:exploit-kit=\"RIG\""],"RIG 3":["misp-galaxy:exploit-kit=\"RIG\""],"RIG-v":["misp-galaxy:exploit-kit=\"RIG\""],"RIG 4":["misp-galaxy:exploit-kit=\"RIG\""],"Meadgive":["misp-galaxy:exploit-kit=\"RIG\""],"Redkit":["misp-galaxy:exploit-kit=\"Redkit\""],"SPL":["misp-galaxy:exploit-kit=\"SPL\""],"SPL_Data":["misp-galaxy:exploit-kit=\"SPL\""],"SPLNet":["misp-galaxy:exploit-kit=\"SPL\""],"SPL2":["misp-galaxy:exploit-kit=\"SPL\""],"Sakura":["misp-galaxy:exploit-kit=\"Sakura\""],"Sednit EK":["misp-galaxy:exploit-kit=\"Sednit EK\""],"SedKit":["misp-galaxy:exploit-kit=\"Sednit EK\""],"Spelevo":["misp-galaxy:exploit-kit=\"Spelevo\""],"SpelevoEK":["misp-galaxy:exploit-kit=\"SpelevoEK\""],"Styx":["misp-galaxy:exploit-kit=\"Styx\""],"Sundown":["misp-galaxy:exploit-kit=\"Sundown\""],"Beps":["misp-galaxy:exploit-kit=\"Sundown\""],"Xer":["misp-galaxy:exploit-kit=\"Sundown\""],"Beta":["misp-galaxy:exploit-kit=\"Sundown\""],"Sundown-P":["misp-galaxy:exploit-kit=\"Sundown-P\""],"Sundown-Pirate":["misp-galaxy:exploit-kit=\"Sundown-P\""],"CaptainBlack":["misp-galaxy:exploit-kit=\"Sundown-P\""],"Sweet-Orange":["misp-galaxy:exploit-kit=\"Sweet-Orange\""],"SWO":["misp-galaxy:exploit-kit=\"Sweet-Orange\""],"Anogre":["misp-galaxy:exploit-kit=\"Sweet-Orange\""],"Taurus Builder":["misp-galaxy:exploit-kit=\"Taurus Builder\""],"Terror EK":["misp-galaxy:exploit-kit=\"Terror EK\""],"Blaze EK":["misp-galaxy:exploit-kit=\"Terror EK\""],"Neptune EK":["misp-galaxy:exploit-kit=\"Terror EK\""],"ThreadKit":["misp-galaxy:exploit-kit=\"ThreadKit\""],"Underminer":["misp-galaxy:exploit-kit=\"Underminer\""],"Underminer EK":["misp-galaxy:exploit-kit=\"Underminer\""],"VenomKit":["misp-galaxy:exploit-kit=\"VenomKit\""],"Venom":["misp-galaxy:exploit-kit=\"VenomKit\""],"WhiteHole":["misp-galaxy:exploit-kit=\"WhiteHole\""],"ATM Black Box Attack":["misp-galaxy:financial-fraud=\"ATM Black Box Attack\""],"ATM Explosive Attack":["misp-galaxy:financial-fraud=\"ATM Explosive Attack\""],"ATM Jackpotting":["misp-galaxy:financial-fraud=\"ATM Jackpotting\""],"ATM Shimming":["misp-galaxy:financial-fraud=\"ATM Shimming\""],"ATM skimming":["misp-galaxy:financial-fraud=\"ATM skimming\""],"Account-Checking Services":["misp-galaxy:financial-fraud=\"Account-Checking Services\""],"Business Email Compromise":["misp-galaxy:financial-fraud=\"Business Email Compromise\""],"Compromised Account Credentials":["misp-galaxy:financial-fraud=\"Compromised Account Credentials\""],"Compromised Intellectual Property (IP)":["misp-galaxy:financial-fraud=\"Compromised Intellectual Property (IP)\""],"Compromised Payment Cards":["misp-galaxy:financial-fraud=\"Compromised Payment Cards\""],"Compromised Personally Identifiable Information (PII)":["misp-galaxy:financial-fraud=\"Compromised Personally Identifiable Information (PII)\""],"Cryptocurrency Exchange":["misp-galaxy:financial-fraud=\"Cryptocurrency Exchange\""],"CxO Fraud":["misp-galaxy:financial-fraud=\"CxO Fraud\""],"Fund Transfer":["misp-galaxy:financial-fraud=\"Fund Transfer\""],"Insider Trading":["misp-galaxy:financial-fraud=\"Insider Trading\""],"Malware":["misp-galaxy:financial-fraud=\"Malware\""],"Money Mules":["misp-galaxy:financial-fraud=\"Money Mules\""],"POS Skimming":["misp-galaxy:financial-fraud=\"POS Skimming\""],"Phishing":["misp-galaxy:financial-fraud=\"Phishing\""],"Prepaid Cards":["misp-galaxy:financial-fraud=\"Prepaid Cards\""],"Resell Stolen Data":["misp-galaxy:financial-fraud=\"Resell Stolen Data\""],"SWIFT Transaction":["misp-galaxy:financial-fraud=\"SWIFT Transaction\""],"Scam":["misp-galaxy:financial-fraud=\"Scam\""],"Social Media Scams":["misp-galaxy:financial-fraud=\"Social Media Scams\""],"Spear phishing":["misp-galaxy:financial-fraud=\"Spear phishing\""],"Vishing":["misp-galaxy:financial-fraud=\"Vishing\""],"Breach of voters privacy during the casting of votes":["misp-galaxy:guidelines=\"Breach of voters privacy during the casting of votes\""],"Defacement, DoS or overload of websites or other systems used for publication of the results":["misp-galaxy:guidelines=\"Defacement, DoS or overload of websites or other systems used for publication of the results\""],"Deleting or tampering with voter data":["misp-galaxy:guidelines=\"Deleting or tampering with voter data\""],"DoS or overload of government websites":["misp-galaxy:guidelines=\"DoS or overload of government websites\""],"DoS or overload of party\/campaign registration, causing them to miss the deadline":["misp-galaxy:guidelines=\"DoS or overload of party\/campaign registration, causing them to miss the deadline\""],"DoS or overload of voter registration system, suppressing voters":["misp-galaxy:guidelines=\"DoS or overload of voter registration system, suppressing voters\""],"Fabricated signatures from sponsor":["misp-galaxy:guidelines=\"Fabricated signatures from sponsor\""],"Hacking campaign websites (defacement, DoS)":["misp-galaxy:guidelines=\"Hacking campaign websites (defacement, DoS)\""],"Hacking campaign websites, spreading misinformation on the election process, registered parties\/candidates, or results":["misp-galaxy:guidelines=\"Hacking campaign websites, spreading misinformation on the election process, registered parties\/candidates, or results\""],"Hacking candidate laptops or email accounts":["misp-galaxy:guidelines=\"Hacking candidate laptops or email accounts\""],"Hacking of internal systems used by media or press":["misp-galaxy:guidelines=\"Hacking of internal systems used by media or press\""],"Hacking\/misconfiguration of government servers, communication networks, or endpoints":["misp-galaxy:guidelines=\"Hacking\/misconfiguration of government servers, communication networks, or endpoints\""],"Identity fraud during voter registration":["misp-galaxy:guidelines=\"Identity fraud during voter registration\""],"Leak of confidential information":["misp-galaxy:guidelines=\"Leak of confidential information\""],"Misconfiguration of a website":["misp-galaxy:guidelines=\"Misconfiguration of a website\""],"Software bug altering results":["misp-galaxy:guidelines=\"Software bug altering results\""],"Tampering or DoS of communication links uesd to transfer (interim) results":["misp-galaxy:guidelines=\"Tampering or DoS of communication links uesd to transfer (interim) results\""],"Tampering or DoS of voting and\/or vote confidentiality during or after the elections":["misp-galaxy:guidelines=\"Tampering or DoS of voting and\/or vote confidentiality during or after the elections\""],"Tampering with logs\/journals":["misp-galaxy:guidelines=\"Tampering with logs\/journals\""],"Tampering with registrations":["misp-galaxy:guidelines=\"Tampering with registrations\""],"Tampering with supply chain involved in the movement or transfer data":["misp-galaxy:guidelines=\"Tampering with supply chain involved in the movement or transfer data\""],"Tampering, DoS or overload of the systems used for counting or aggregating results":["misp-galaxy:guidelines=\"Tampering, DoS or overload of the systems used for counting or aggregating results\""],"Tampering, DoS, or overload of media communication links":["misp-galaxy:guidelines=\"Tampering, DoS, or overload of media communication links\""],"7ev3n":["misp-galaxy:malpedia=\"7ev3n\"","misp-galaxy:ransomware=\"7ev3n\""],"9002 RAT":["misp-galaxy:malpedia=\"9002 RAT\"","misp-galaxy:mitre-enterprise-attack-malware=\"Hydraq - S0203\"","misp-galaxy:mitre-malware=\"Hydraq - S0203\""],"Hydraq":["misp-galaxy:malpedia=\"9002 RAT\"","misp-galaxy:mitre-enterprise-attack-malware=\"Hydraq - S0203\"","misp-galaxy:mitre-malware=\"Hydraq - S0203\"","misp-galaxy:tool=\"Aurora\""],"McRAT":["misp-galaxy:malpedia=\"9002 RAT\""],"AIRBREAK":["misp-galaxy:malpedia=\"AIRBREAK\"","misp-galaxy:mitre-enterprise-attack-malware=\"Orz - S0229\"","misp-galaxy:mitre-malware=\"Orz - S0229\""],"Orz":["misp-galaxy:malpedia=\"AIRBREAK\"","misp-galaxy:mitre-enterprise-attack-malware=\"Orz - S0229\"","misp-galaxy:mitre-malware=\"Orz - S0229\""],"ALPC Local PrivEsc":["misp-galaxy:malpedia=\"ALPC Local PrivEsc\""],"AMTsol":["misp-galaxy:malpedia=\"AMTsol\""],"Adupihan":["misp-galaxy:malpedia=\"AMTsol\""],"ANTAK":["misp-galaxy:malpedia=\"ANTAK\""],"APT3 Keylogger":["misp-galaxy:malpedia=\"APT3 Keylogger\""],"ARS VBS Loader":["misp-galaxy:malpedia=\"ARS VBS Loader\"","misp-galaxy:rat=\"ARS VBS Loader\""],"ASPC":["misp-galaxy:malpedia=\"ASPC\""],"ATI-Agent":["misp-galaxy:malpedia=\"ATI-Agent\""],"ATMSpitter":["misp-galaxy:malpedia=\"ATMSpitter\""],"ATMii":["misp-galaxy:malpedia=\"ATMii\""],"ATMitch":["misp-galaxy:malpedia=\"ATMitch\""],"AVCrypt":["misp-galaxy:malpedia=\"AVCrypt\""],"AbaddonPOS":["misp-galaxy:malpedia=\"AbaddonPOS\""],"PinkKite":["misp-galaxy:malpedia=\"AbaddonPOS\""],"Abbath Banker":["misp-galaxy:malpedia=\"Abbath Banker\""],"AcridRain":["misp-galaxy:malpedia=\"AcridRain\""],"Acronym":["misp-galaxy:malpedia=\"Acronym\""],"AdKoob":["misp-galaxy:malpedia=\"AdKoob\""],"AdWind":["misp-galaxy:malpedia=\"AdWind\""],"JBifrost":["misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:rat=\"Adwind RAT\""],"JSocket":["misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:tool=\"Adwind\""],"UNRECOM":["misp-galaxy:malpedia=\"AdWind\"","misp-galaxy:rat=\"Adwind RAT\""],"AdamLocker":["misp-galaxy:malpedia=\"AdamLocker\""],"AdultSwine":["misp-galaxy:malpedia=\"AdultSwine\""],"AdvisorsBot":["misp-galaxy:malpedia=\"AdvisorsBot\""],"Adylkuzz":["misp-galaxy:malpedia=\"Adylkuzz\""],"Agent Tesla":["misp-galaxy:malpedia=\"Agent Tesla\"","misp-galaxy:mitre-malware=\"Agent Tesla - S0331\"","misp-galaxy:tool=\"Agent Tesla\""],"Agent.BTZ":["misp-galaxy:malpedia=\"Agent.BTZ\"","misp-galaxy:tool=\"Agent.BTZ\""],"ComRAT":["misp-galaxy:malpedia=\"Agent.BTZ\"","misp-galaxy:mitre-enterprise-attack-malware=\"ComRAT - S0126\"","misp-galaxy:mitre-malware=\"ComRAT - S0126\"","misp-galaxy:rat=\"ComRAT\""],"Sun rootkit":["misp-galaxy:malpedia=\"Agent.BTZ\""],"Aldibot":["misp-galaxy:malpedia=\"Aldibot\""],"Alina POS":["misp-galaxy:malpedia=\"Alina POS\""],"alina_eagle":["misp-galaxy:malpedia=\"Alina POS\""],"alina_spark":["misp-galaxy:malpedia=\"Alina POS\""],"katrina":["misp-galaxy:malpedia=\"Alina POS\""],"Allaple":["misp-galaxy:malpedia=\"Allaple\""],"Starman":["misp-galaxy:malpedia=\"Allaple\""],"Alma Communicator":["misp-galaxy:malpedia=\"Alma Communicator\""],"AlmaLocker":["misp-galaxy:malpedia=\"AlmaLocker\""],"AlphaLocker":["misp-galaxy:malpedia=\"AlphaLocker\"","misp-galaxy:ransomware=\"Alpha Ransomware\""],"AlphaNC":["misp-galaxy:malpedia=\"AlphaNC\""],"Alphabet Ransomware":["misp-galaxy:malpedia=\"Alphabet Ransomware\"","misp-galaxy:ransomware=\"Alphabet Ransomware\""],"Alreay":["misp-galaxy:malpedia=\"Alreay\""],"Olmarik":["misp-galaxy:malpedia=\"Alureon\""],"Pihar":["misp-galaxy:malpedia=\"Alureon\""],"TDL":["misp-galaxy:malpedia=\"Alureon\""],"Amadey":["misp-galaxy:malpedia=\"Amadey\""],"Anatova Ransomware":["misp-galaxy:malpedia=\"Anatova Ransomware\""],"AndroRAT":["misp-galaxy:malpedia=\"AndroRAT\"","misp-galaxy:mitre-malware=\"AndroRAT - S0292\"","misp-galaxy:mitre-mobile-attack-malware=\"AndroRAT - MOB-S0008\""],"Andromeda":["misp-galaxy:malpedia=\"Andromeda\"","misp-galaxy:tool=\"Gamarue\""],"B106-Gamarue":["misp-galaxy:malpedia=\"Andromeda\""],"B67-SS-Gamarue":["misp-galaxy:malpedia=\"Andromeda\""],"Gamarue":["misp-galaxy:malpedia=\"Andromeda\"","misp-galaxy:tool=\"Gamarue\""],"b66":["misp-galaxy:malpedia=\"Andromeda\""],"Anel":["misp-galaxy:malpedia=\"Anel\""],"Antilam":["misp-galaxy:malpedia=\"Antilam\""],"Latinus":["misp-galaxy:malpedia=\"Antilam\""],"Anubis":["misp-galaxy:malpedia=\"Anubis\""],"AnubisSpy":["misp-galaxy:malpedia=\"AnubisSpy\""],"Apocalipto":["misp-galaxy:malpedia=\"Apocalipto\""],"Apocalypse":["misp-galaxy:malpedia=\"Apocalypse\"","misp-galaxy:ransomware=\"Apocalypse\"","misp-galaxy:rat=\"Apocalypse\""],"AppleJeus":["misp-galaxy:malpedia=\"AppleJeus\""],"ArdaMax":["misp-galaxy:malpedia=\"ArdaMax\""],"Arefty":["misp-galaxy:malpedia=\"Arefty\""],"Arik Keylogger":["misp-galaxy:malpedia=\"Arik Keylogger\""],"Aaron Keylogger":["misp-galaxy:malpedia=\"Arik Keylogger\""],"Arkei Stealer":["misp-galaxy:malpedia=\"Arkei Stealer\""],"Artra Downloader":["misp-galaxy:malpedia=\"Artra Downloader\""],"Asacub":["misp-galaxy:malpedia=\"Asacub\""],"AscentLoader":["misp-galaxy:malpedia=\"AscentLoader\""],"BadSrc":["misp-galaxy:malpedia=\"Asprox\""],"AthenaGo RAT":["misp-galaxy:malpedia=\"AthenaGo RAT\""],"Atmosphere":["misp-galaxy:malpedia=\"Atmosphere\""],"August Stealer":["misp-galaxy:malpedia=\"August Stealer\"","misp-galaxy:tool=\"August\""],"Auriga":["misp-galaxy:malpedia=\"Auriga\""],"Riodrv":["misp-galaxy:malpedia=\"Auriga\""],"Aurora":["misp-galaxy:malpedia=\"Aurora\"","misp-galaxy:mitre-enterprise-attack-malware=\"Hydraq - S0203\"","misp-galaxy:mitre-malware=\"Hydraq - S0203\"","misp-galaxy:tool=\"Aurora\""],"AutoCAD Downloader":["misp-galaxy:malpedia=\"AutoCAD Downloader\""],"Acad.Bursted":["misp-galaxy:malpedia=\"AutoCAD Downloader\""],"Duxfas":["misp-galaxy:malpedia=\"AutoCAD Downloader\""],"AvastDisabler":["misp-galaxy:malpedia=\"AvastDisabler\""],"Ave Maria":["misp-galaxy:malpedia=\"Ave Maria\"","misp-galaxy:stealer=\"Ave Maria\""],"AVE_MARIA":["misp-galaxy:malpedia=\"Ave Maria\""],"Aveo":["misp-galaxy:malpedia=\"Aveo\""],"Avzhan":["misp-galaxy:malpedia=\"Avzhan\""],"Ayegent":["misp-galaxy:malpedia=\"Ayegent\""],"Azorult":["misp-galaxy:malpedia=\"Azorult\"","misp-galaxy:mitre-malware=\"Azorult - S0344\""],"PuffStealer":["misp-galaxy:malpedia=\"Azorult\""],"Rultazo":["misp-galaxy:malpedia=\"Azorult\""],"BABYMETAL":["misp-galaxy:malpedia=\"BABYMETAL\""],"BACKBEND":["misp-galaxy:malpedia=\"BACKBEND\""],"BBSRAT":["misp-galaxy:malpedia=\"BBSRAT\"","misp-galaxy:mitre-enterprise-attack-malware=\"BBSRAT - S0127\"","misp-galaxy:mitre-malware=\"BBSRAT - S0127\""],"BCMPUPnP_Hunter":["misp-galaxy:malpedia=\"BCMPUPnP_Hunter\""],"BELLHOP":["misp-galaxy:malpedia=\"BELLHOP\""],"BKA Trojaner":["misp-galaxy:malpedia=\"BKA Trojaner\""],"bwin3_bka":["misp-galaxy:malpedia=\"BKA Trojaner\""],"BLACKCOFFEE":["misp-galaxy:malpedia=\"BLACKCOFFEE\"","misp-galaxy:mitre-enterprise-attack-malware=\"BLACKCOFFEE - S0069\"","misp-galaxy:mitre-malware=\"BLACKCOFFEE - S0069\""],"BONDUPDATER":["misp-galaxy:malpedia=\"BONDUPDATER\"","misp-galaxy:mitre-malware=\"BONDUPDATER - S0360\"","misp-galaxy:rat=\"BONDUPDATER\""],"Glimpse":["misp-galaxy:malpedia=\"BONDUPDATER\""],"BRAIN":["misp-galaxy:malpedia=\"BRAIN\""],"BS2005":["misp-galaxy:malpedia=\"BS2005\"","misp-galaxy:mitre-enterprise-attack-malware=\"BS2005 - S0014\"","misp-galaxy:mitre-malware=\"BS2005 - S0014\"","misp-galaxy:tool=\"Hoardy\""],"BTCWare":["misp-galaxy:malpedia=\"BTCWare\""],"BUBBLEWRAP":["misp-galaxy:malpedia=\"BUBBLEWRAP\"","misp-galaxy:mitre-enterprise-attack-malware=\"BUBBLEWRAP - S0043\"","misp-galaxy:mitre-malware=\"BUBBLEWRAP - S0043\""],"BYEBY":["misp-galaxy:malpedia=\"BYEBY\""],"Babar":["misp-galaxy:malpedia=\"Babar\"","misp-galaxy:tool=\"Babar\""],"SNOWBALL":["misp-galaxy:malpedia=\"Babar\""],"BabyLon RAT":["misp-galaxy:malpedia=\"BabyLon RAT\""],"BackNet":["misp-galaxy:malpedia=\"BackNet\""],"BackSwap":["misp-galaxy:malpedia=\"BackSwap\""],"BadEncript":["misp-galaxy:malpedia=\"BadEncript\""],"BadNews":["misp-galaxy:malpedia=\"BadNews\""],"Bahamut (Android)":["misp-galaxy:malpedia=\"Bahamut (Android)\""],"Bahamut (Windows)":["misp-galaxy:malpedia=\"Bahamut (Windows)\""],"Baldir":["misp-galaxy:malpedia=\"Baldir\""],"Baldr":["misp-galaxy:malpedia=\"Baldir\""],"Banatrix":["misp-galaxy:malpedia=\"Banatrix\""],"Bankshot":["misp-galaxy:malpedia=\"Bankshot\"","misp-galaxy:mitre-malware=\"Bankshot - S0239\"","misp-galaxy:tool=\"Bankshot\""],"Banload":["misp-galaxy:malpedia=\"Banload\"","misp-galaxy:tool=\"Banload\""],"Bart":["misp-galaxy:malpedia=\"Bart\"","misp-galaxy:ransomware=\"Bart\""],"gayfgt":["misp-galaxy:malpedia=\"Bashlite\""],"lizkebab":["misp-galaxy:malpedia=\"Bashlite\""],"qbot":["misp-galaxy:malpedia=\"Bashlite\""],"torlus":["misp-galaxy:malpedia=\"Bashlite\""],"BatchWiper":["misp-galaxy:malpedia=\"BatchWiper\""],"Batel":["misp-galaxy:malpedia=\"Batel\""],"Bateleur":["misp-galaxy:malpedia=\"Bateleur\"","misp-galaxy:tool=\"Bateleur\""],"Beapy":["misp-galaxy:malpedia=\"Beapy\""],"Bedep":["misp-galaxy:malpedia=\"Bedep\"","misp-galaxy:tool=\"Bedep\""],"Bella":["misp-galaxy:malpedia=\"Bella\""],"Belonard":["misp-galaxy:malpedia=\"Belonard\""],"Berbomthum":["misp-galaxy:malpedia=\"Berbomthum\""],"BernhardPOS":["misp-galaxy:malpedia=\"BernhardPOS\""],"Neurevt":["misp-galaxy:malpedia=\"BetaBot\""],"Bezigate":["misp-galaxy:malpedia=\"Bezigate\""],"BfBot":["misp-galaxy:malpedia=\"BfBot\""],"BianLian":["misp-galaxy:malpedia=\"BianLian\""],"BillGates":["misp-galaxy:malpedia=\"BillGates\""],"BioData":["misp-galaxy:malpedia=\"BioData\""],"Biscuit":["misp-galaxy:malpedia=\"Biscuit\""],"zxdosml":["misp-galaxy:malpedia=\"Biscuit\""],"Bitsran":["misp-galaxy:malpedia=\"Bitsran\""],"Bitter RAT":["misp-galaxy:malpedia=\"Bitter RAT\""],"BlackEnergy":["misp-galaxy:malpedia=\"BlackEnergy\"","misp-galaxy:mitre-enterprise-attack-malware=\"BlackEnergy - S0089\"","misp-galaxy:mitre-malware=\"BlackEnergy - S0089\"","misp-galaxy:threat-actor=\"Sandworm\"","misp-galaxy:tool=\"BlackEnergy\""],"BlackPOS":["misp-galaxy:malpedia=\"BlackPOS\""],"Kaptoxa":["misp-galaxy:malpedia=\"BlackPOS\""],"POSWDS":["misp-galaxy:malpedia=\"BlackPOS\""],"Reedum":["misp-galaxy:malpedia=\"BlackPOS\""],"BlackRevolution":["misp-galaxy:malpedia=\"BlackRevolution\""],"BlackRouter":["misp-galaxy:malpedia=\"BlackRouter\""],"BLACKHEART":["misp-galaxy:malpedia=\"BlackRouter\""],"BlackShades":["misp-galaxy:malpedia=\"BlackShades\""],"Boaxxe":["misp-galaxy:malpedia=\"Boaxxe\""],"Bohmini":["misp-galaxy:malpedia=\"Bohmini\""],"Bolek":["misp-galaxy:malpedia=\"Bolek\""],"KBOT":["misp-galaxy:malpedia=\"Bolek\""],"Bouncer":["misp-galaxy:malpedia=\"Bouncer\""],"Bozok":["misp-galaxy:malpedia=\"Bozok\"","misp-galaxy:rat=\"Bozok\""],"Brambul":["misp-galaxy:malpedia=\"Brambul\"","misp-galaxy:tool=\"Brambul\""],"BravoNC":["misp-galaxy:malpedia=\"BravoNC\""],"BreachRAT":["misp-galaxy:malpedia=\"BreachRAT\""],"Breakthrough":["misp-galaxy:malpedia=\"Breakthrough\""],"Bredolab":["misp-galaxy:malpedia=\"Bredolab\""],"BrickerBot":["misp-galaxy:malpedia=\"BrickerBot\""],"BrushaLoader":["misp-galaxy:malpedia=\"BrushaLoader\""],"BrutPOS":["misp-galaxy:malpedia=\"BrutPOS\""],"Buhtrap":["misp-galaxy:malpedia=\"Buhtrap\""],"Ratopak":["misp-galaxy:malpedia=\"Buhtrap\""],"Bundestrojaner":["misp-galaxy:malpedia=\"Bundestrojaner\""],"0zapftis":["misp-galaxy:malpedia=\"Bundestrojaner\""],"R2D2":["misp-galaxy:malpedia=\"Bundestrojaner\""],"Bunitu":["misp-galaxy:malpedia=\"Bunitu\""],"Buterat":["misp-galaxy:malpedia=\"Buterat\""],"spyvoltar":["misp-galaxy:malpedia=\"Buterat\""],"Yimfoca":["misp-galaxy:malpedia=\"Buzus\""],"CACTUSTORCH":["misp-galaxy:malpedia=\"CACTUSTORCH\""],"CCleaner Backdoor":["misp-galaxy:malpedia=\"CCleaner Backdoor\""],"CDorked":["misp-galaxy:malpedia=\"CDorked\""],"CDorked.A":["misp-galaxy:malpedia=\"CDorked\""],"CHINACHOPPER":["misp-galaxy:malpedia=\"CHINACHOPPER\""],"CMSBrute":["misp-galaxy:malpedia=\"CMSBrute\""],"CMSTAR":["misp-galaxy:malpedia=\"CMSTAR\""],"meciv":["misp-galaxy:malpedia=\"CMSTAR\""],"CREAMSICLE":["misp-galaxy:malpedia=\"CREAMSICLE\""],"CabArt":["misp-galaxy:malpedia=\"CabArt\""],"CadelSpy":["misp-galaxy:malpedia=\"CadelSpy\""],"Cadelle":["misp-galaxy:malpedia=\"CadelSpy\"","misp-galaxy:threat-actor=\"Cadelle\""],"Cannibal Rat":["misp-galaxy:malpedia=\"Cannibal Rat\""],"Cannon":["misp-galaxy:malpedia=\"Cannon\"","misp-galaxy:mitre-malware=\"Cannon - S0351\""],"Carbanak":["misp-galaxy:malpedia=\"Carbanak\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-enterprise-attack-malware=\"Carbanak - S0030\"","misp-galaxy:mitre-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-malware=\"Carbanak - S0030\"","misp-galaxy:threat-actor=\"Anunak\""],"Anunak":["misp-galaxy:malpedia=\"Carbanak\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-enterprise-attack-malware=\"Carbanak - S0030\"","misp-galaxy:mitre-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-malware=\"Carbanak - S0030\"","misp-galaxy:threat-actor=\"Anunak\""],"Carberp":["misp-galaxy:malpedia=\"Carberp\""],"Cardinal RAT":["misp-galaxy:malpedia=\"Cardinal RAT\"","misp-galaxy:mitre-malware=\"Cardinal RAT - S0348\"","misp-galaxy:tool=\"Cardinal RAT\""],"Careto":["misp-galaxy:malpedia=\"Careto\"","misp-galaxy:threat-actor=\"Careto\""],"Appetite":["misp-galaxy:malpedia=\"Careto\""],"Mask":["misp-galaxy:malpedia=\"Careto\"","misp-galaxy:threat-actor=\"Careto\""],"CarrotBat":["misp-galaxy:malpedia=\"CarrotBat\""],"Casper":["misp-galaxy:malpedia=\"Casper\"","misp-galaxy:tool=\"Casper\""],"Catchamas":["misp-galaxy:malpedia=\"Catchamas\"","misp-galaxy:mitre-malware=\"Catchamas - S0261\""],"Catelites":["misp-galaxy:malpedia=\"Catelites\""],"CenterPOS":["misp-galaxy:malpedia=\"CenterPOS\""],"cerebrus":["misp-galaxy:malpedia=\"CenterPOS\""],"Cerber":["misp-galaxy:malpedia=\"Cerber\"","misp-galaxy:ransomware=\"Cerber\""],"Cerbu":["misp-galaxy:malpedia=\"Cerbu\""],"ChChes":["misp-galaxy:malpedia=\"ChChes\"","misp-galaxy:mitre-enterprise-attack-malware=\"ChChes - S0144\"","misp-galaxy:mitre-malware=\"ChChes - S0144\""],"Ham Backdoor":["misp-galaxy:malpedia=\"ChChes\""],"Chainshot":["misp-galaxy:malpedia=\"Chainshot\"","misp-galaxy:tool=\"Chainshot\""],"Chapro":["misp-galaxy:malpedia=\"Chapro\""],"Charger":["misp-galaxy:malpedia=\"Charger\"","misp-galaxy:mitre-malware=\"Charger - S0323\"","misp-galaxy:mitre-mobile-attack-malware=\"Charger - MOB-S0039\""],"CherryPicker POS":["misp-galaxy:malpedia=\"CherryPicker POS\""],"cherry_picker":["misp-galaxy:malpedia=\"CherryPicker POS\""],"cherrypicker":["misp-galaxy:malpedia=\"CherryPicker POS\""],"cherrypickerpos":["misp-galaxy:malpedia=\"CherryPicker POS\""],"ChewBacca":["misp-galaxy:malpedia=\"ChewBacca\""],"Chinad":["misp-galaxy:malpedia=\"Chinad\""],"Chir":["misp-galaxy:malpedia=\"Chir\""],"Chrysaor":["misp-galaxy:malpedia=\"Chrysaor\"","misp-galaxy:mitre-malware=\"Pegasus for Android - S0316\"","misp-galaxy:mitre-mobile-attack-malware=\"Pegasus for Android - MOB-S0032\"","misp-galaxy:tool=\"Chrysaor\""],"JigglyPuff":["misp-galaxy:malpedia=\"Chrysaor\""],"Pegasus":["misp-galaxy:malpedia=\"Chrysaor\"","misp-galaxy:mitre-mobile-attack-malware=\"Pegasus - MOB-S0005\"","misp-galaxy:tool=\"Chrysaor\""],"AndroKINS":["misp-galaxy:malpedia=\"Chthonic\""],"Client Maximus":["misp-galaxy:malpedia=\"Client Maximus\"","misp-galaxy:rat=\"Client Maximus\""],"Clientor":["misp-galaxy:malpedia=\"Clientor\""],"Clipper":["misp-galaxy:malpedia=\"Clipper\""],"Cloud Duke":["misp-galaxy:malpedia=\"Cloud Duke\""],"CoalaBot":["misp-galaxy:malpedia=\"CoalaBot\"","misp-galaxy:tool=\"CoalaBot\""],"CobInt":["misp-galaxy:malpedia=\"CobInt\""],"COOLPANTS":["misp-galaxy:malpedia=\"CobInt\""],"Cobalt Strike":["misp-galaxy:malpedia=\"Cobalt Strike\"","misp-galaxy:mitre-enterprise-attack-tool=\"Cobalt Strike - S0154\"","misp-galaxy:mitre-tool=\"Cobalt Strike - S0154\"","misp-galaxy:rat=\"Cobalt Strike\""],"Cobian RAT":["misp-galaxy:malpedia=\"Cobian RAT\"","misp-galaxy:mitre-malware=\"Cobian RAT - S0338\"","misp-galaxy:rat=\"Cobian RAT\""],"Cobra Carbon System":["misp-galaxy:malpedia=\"Cobra Carbon System\""],"Carbon":["misp-galaxy:malpedia=\"Cobra Carbon System\"","misp-galaxy:mitre-malware=\"Carbon - S0335\""],"CockBlocker":["misp-galaxy:malpedia=\"CockBlocker\""],"CodeKey":["misp-galaxy:malpedia=\"CodeKey\""],"Cohhoc":["misp-galaxy:malpedia=\"Cohhoc\""],"CoinThief":["misp-galaxy:malpedia=\"CoinThief\""],"Coinminer":["misp-galaxy:malpedia=\"Coinminer\""],"Coldroot RAT":["misp-galaxy:malpedia=\"Coldroot RAT\""],"Colony":["misp-galaxy:malpedia=\"Colony\""],"Bandios":["misp-galaxy:malpedia=\"Colony\""],"GrayBird":["misp-galaxy:malpedia=\"Colony\""],"Combojack":["misp-galaxy:malpedia=\"Combojack\""],"Combos":["misp-galaxy:malpedia=\"Combos\""],"CometBot":["misp-galaxy:malpedia=\"CometBot\""],"ComodoSec":["misp-galaxy:malpedia=\"ComodoSec\""],"Computrace":["misp-galaxy:malpedia=\"Computrace\""],"lojack":["misp-galaxy:malpedia=\"Computrace\""],"ComradeCircle":["misp-galaxy:malpedia=\"ComradeCircle\""],"downadup":["misp-galaxy:malpedia=\"Conficker\""],"traffic converter":["misp-galaxy:malpedia=\"Conficker\""],"Confucius":["misp-galaxy:malpedia=\"Confucius\""],"Connic":["misp-galaxy:malpedia=\"Connic\""],"SpyBanker":["misp-galaxy:malpedia=\"Connic\"","misp-galaxy:malpedia=\"SpyBanker\""],"Contopee":["misp-galaxy:malpedia=\"Contopee\""],"CookieBag":["misp-galaxy:malpedia=\"CookieBag\""],"CoreDN":["misp-galaxy:malpedia=\"CoreDN\""],"Coreshell":["misp-galaxy:malpedia=\"Coreshell\""],"CpuMeaner":["misp-galaxy:malpedia=\"CpuMeaner\"","misp-galaxy:tool=\"CpuMeaner\""],"Cpuminer (Android)":["misp-galaxy:malpedia=\"Cpuminer (Android)\""],"Cpuminer (ELF)":["misp-galaxy:malpedia=\"Cpuminer (ELF)\""],"Cr1ptT0r":["misp-galaxy:malpedia=\"Cr1ptT0r\"","misp-galaxy:ransomware=\"Cr1ptT0r\""],"CriptTor":["misp-galaxy:malpedia=\"Cr1ptT0r\""],"CradleCore":["misp-galaxy:malpedia=\"CradleCore\""],"CrashOverride":["misp-galaxy:malpedia=\"CrashOverride\""],"Crash":["misp-galaxy:malpedia=\"CrashOverride\""],"Industroyer":["misp-galaxy:malpedia=\"CrashOverride\""],"CreativeUpdater":["misp-galaxy:malpedia=\"CreativeUpdater\""],"Credraptor":["misp-galaxy:malpedia=\"Credraptor\""],"Crenufs":["misp-galaxy:malpedia=\"Crenufs\""],"Crimson RAT":["misp-galaxy:malpedia=\"Crimson RAT\""],"SEEDOOR":["misp-galaxy:malpedia=\"Crimson RAT\""],"Crimson":["misp-galaxy:malpedia=\"Crimson\"","misp-galaxy:mitre-enterprise-attack-malware=\"Crimson - S0115\"","misp-galaxy:mitre-malware=\"Crimson - S0115\"","misp-galaxy:rat=\"Crimson\"","misp-galaxy:tool=\"Crimson\""],"Crisis (OS X)":["misp-galaxy:malpedia=\"Crisis (OS X)\""],"Crisis (Windows)":["misp-galaxy:malpedia=\"Crisis (Windows)\""],"CrossRAT":["misp-galaxy:malpedia=\"CrossRAT\"","misp-galaxy:mitre-malware=\"CrossRAT - S0235\""],"Trupto":["misp-galaxy:malpedia=\"CrossRAT\""],"Crossrider":["misp-galaxy:malpedia=\"Crossrider\""],"CryLocker":["misp-galaxy:malpedia=\"CryLocker\"","misp-galaxy:ransomware=\"CryLocker\""],"Cryakl":["misp-galaxy:malpedia=\"Cryakl\"","misp-galaxy:ransomware=\"Cryakl\"","misp-galaxy:ransomware=\"Offline ransomware\""],"CrypMic":["misp-galaxy:malpedia=\"CrypMic\""],"Crypt0l0cker":["misp-galaxy:malpedia=\"Crypt0l0cker\""],"CryptXXXX":["misp-galaxy:malpedia=\"CryptXXXX\""],"CryptoFortress":["misp-galaxy:malpedia=\"CryptoFortress\"","misp-galaxy:ransomware=\"CryptoFortress\"","misp-galaxy:ransomware=\"TorrentLocker\""],"CryptoLocker":["misp-galaxy:malpedia=\"CryptoLocker\"","misp-galaxy:ransomware=\"CryptoLocker\""],"CryptoLuck":["misp-galaxy:malpedia=\"CryptoLuck\""],"CryptoMix":["misp-galaxy:malpedia=\"CryptoMix\"","misp-galaxy:ransomware=\"CryptoMix\""],"CryptFile2":["misp-galaxy:malpedia=\"CryptoMix\""],"CryptoNight":["misp-galaxy:malpedia=\"CryptoNight\""],"CryptoRansomeware":["misp-galaxy:malpedia=\"CryptoRansomeware\"","misp-galaxy:ransomware=\"CryptoRansomeware\""],"CryptoShield":["misp-galaxy:malpedia=\"CryptoShield\""],"CryptoShuffler":["misp-galaxy:malpedia=\"CryptoShuffler\""],"CryptoWire":["misp-galaxy:malpedia=\"CryptoWire\"","misp-galaxy:ransomware=\"Owl\""],"Cryptorium":["misp-galaxy:malpedia=\"Cryptorium\""],"Cryptowall":["misp-galaxy:malpedia=\"Cryptowall\""],"CsExt":["misp-galaxy:malpedia=\"CsExt\""],"Cuegoe":["misp-galaxy:malpedia=\"Cuegoe\""],"Windshield?":["misp-galaxy:malpedia=\"Cuegoe\""],"Cueisfry":["misp-galaxy:malpedia=\"Cueisfry\""],"CukieGrab":["misp-galaxy:malpedia=\"CukieGrab\""],"Roblox Trade Assist":["misp-galaxy:malpedia=\"CukieGrab\""],"Cutlet":["misp-galaxy:malpedia=\"Cutlet\""],"CyberGate":["misp-galaxy:malpedia=\"CyberGate\"","misp-galaxy:rat=\"CyberGate\""],"Rebhip":["misp-galaxy:malpedia=\"CyberGate\""],"CyberSplitter":["misp-galaxy:malpedia=\"CyberSplitter\"","misp-galaxy:ransomware=\"Cyber SpLiTTer Vbs\""],"CycBot":["misp-galaxy:malpedia=\"CycBot\""],"DDKONG":["misp-galaxy:malpedia=\"DDKONG\"","misp-galaxy:mitre-malware=\"DDKONG - S0255\"","misp-galaxy:tool=\"DDKONG\""],"DMA Locker":["misp-galaxy:malpedia=\"DMA Locker\""],"DMSniff":["misp-galaxy:malpedia=\"DMSniff\""],"DNSMessenger":["misp-galaxy:malpedia=\"DNSMessenger\"","misp-galaxy:mitre-enterprise-attack-malware=\"POWERSOURCE - S0145\"","misp-galaxy:mitre-enterprise-attack-malware=\"TEXTMATE - S0146\"","misp-galaxy:mitre-malware=\"POWERSOURCE - S0145\"","misp-galaxy:mitre-malware=\"TEXTMATE - S0146\"","misp-galaxy:rat=\"DNSMessenger\""],"TEXTMATE":["misp-galaxy:malpedia=\"DNSMessenger\"","misp-galaxy:mitre-enterprise-attack-malware=\"TEXTMATE - S0146\"","misp-galaxy:mitre-malware=\"TEXTMATE - S0146\""],"DNSRat":["misp-galaxy:malpedia=\"DNSRat\""],"DNSbot":["misp-galaxy:malpedia=\"DNSRat\""],"DNSpionage":["misp-galaxy:malpedia=\"DNSpionage\"","misp-galaxy:threat-actor=\"DNSpionage\""],"Agent Drable":["misp-galaxy:malpedia=\"DNSpionage\""],"Webmask":["misp-galaxy:malpedia=\"DNSpionage\""],"DRIFTPIN":["misp-galaxy:malpedia=\"DRIFTPIN\"","misp-galaxy:tool=\"Agent ORM\""],"Spy.Agent.ORM":["misp-galaxy:malpedia=\"DRIFTPIN\""],"Toshliph":["misp-galaxy:malpedia=\"DRIFTPIN\""],"DROPSHOT":["misp-galaxy:malpedia=\"DROPSHOT\""],"DUBrute":["misp-galaxy:malpedia=\"DUBrute\""],"Dairy":["misp-galaxy:malpedia=\"Dairy\""],"DarkComet":["misp-galaxy:malpedia=\"DarkComet\"","misp-galaxy:mitre-malware=\"DarkComet - S0334\"","misp-galaxy:rat=\"DarkComet\""],"Fynloski":["misp-galaxy:malpedia=\"DarkComet\"","misp-galaxy:mitre-malware=\"DarkComet - S0334\""],"klovbot":["misp-galaxy:malpedia=\"DarkComet\""],"DarkHotel":["misp-galaxy:malpedia=\"DarkHotel\"","misp-galaxy:threat-actor=\"DarkHotel\""],"DarkMegi":["misp-galaxy:malpedia=\"DarkMegi\""],"DarkPulsar":["misp-galaxy:malpedia=\"DarkPulsar\"","misp-galaxy:tool=\"DarkPulsar\""],"DarkShell":["misp-galaxy:malpedia=\"DarkShell\""],"DarkStRat":["misp-galaxy:malpedia=\"DarkStRat\""],"DarkTequila":["misp-galaxy:malpedia=\"DarkTequila\""],"Darkmoon":["misp-galaxy:malpedia=\"Darkmoon\"","misp-galaxy:mitre-enterprise-attack-malware=\"Darkmoon - S0209\"","misp-galaxy:mitre-malware=\"PoisonIvy - S0012\""],"Chymine":["misp-galaxy:malpedia=\"Darkmoon\""],"Darksky":["misp-galaxy:malpedia=\"Darksky\""],"Darktrack RAT":["misp-galaxy:malpedia=\"Darktrack RAT\""],"DarthMiner":["misp-galaxy:malpedia=\"DarthMiner\"","misp-galaxy:tool=\"DarthMiner\""],"Daserf":["misp-galaxy:malpedia=\"Daserf\"","misp-galaxy:mitre-enterprise-attack-malware=\"Daserf - S0187\"","misp-galaxy:mitre-malware=\"Daserf - S0187\""],"Muirim":["misp-galaxy:malpedia=\"Daserf\"","misp-galaxy:mitre-enterprise-attack-malware=\"Daserf - S0187\"","misp-galaxy:mitre-malware=\"Daserf - S0187\""],"Nioupale":["misp-galaxy:malpedia=\"Daserf\"","misp-galaxy:mitre-enterprise-attack-malware=\"Daserf - S0187\"","misp-galaxy:mitre-malware=\"Daserf - S0187\""],"Datper":["misp-galaxy:malpedia=\"Datper\""],"Decebal":["misp-galaxy:malpedia=\"Decebal\""],"Delta(Alfa,Bravo, ...)":["misp-galaxy:malpedia=\"Delta(Alfa,Bravo, ...)\""],"Dented":["misp-galaxy:malpedia=\"Dented\""],"DeputyDog":["misp-galaxy:malpedia=\"DeputyDog\""],"DeriaLock":["misp-galaxy:malpedia=\"DeriaLock\""],"Derusbi":["misp-galaxy:malpedia=\"Derusbi\"","misp-galaxy:mitre-enterprise-attack-malware=\"Derusbi - S0021\"","misp-galaxy:mitre-malware=\"Derusbi - S0021\"","misp-galaxy:tool=\"Derusbi\""],"PHOTO":["misp-galaxy:malpedia=\"Derusbi\"","misp-galaxy:mitre-enterprise-attack-malware=\"Derusbi - S0021\"","misp-galaxy:mitre-malware=\"Derusbi - S0021\""],"Devil's Rat":["misp-galaxy:malpedia=\"Devil's Rat\""],"Dexter":["misp-galaxy:malpedia=\"Dexter\""],"LusyPOS":["misp-galaxy:malpedia=\"Dexter\""],"Dharma":["misp-galaxy:malpedia=\"Dharma\""],"Arena":["misp-galaxy:malpedia=\"Dharma\""],"Crysis":["misp-galaxy:malpedia=\"Dharma\""],"DiamondFox":["misp-galaxy:malpedia=\"DiamondFox\""],"Crystal":["misp-galaxy:malpedia=\"DiamondFox\""],"Gorynch":["misp-galaxy:malpedia=\"DiamondFox\""],"Gorynych":["misp-galaxy:malpedia=\"DiamondFox\""],"Dimnie":["misp-galaxy:malpedia=\"Dimnie\"","misp-galaxy:tool=\"Dimnie\""],"DirCrypt":["misp-galaxy:malpedia=\"DirCrypt\"","misp-galaxy:ransomware=\"DirCrypt\""],"DispenserXFS":["misp-galaxy:malpedia=\"DispenserXFS\""],"DistTrack":["misp-galaxy:malpedia=\"DistTrack\"","misp-galaxy:tool=\"Shamoon\""],"Dockster":["misp-galaxy:malpedia=\"Dockster\""],"DogHousePower":["misp-galaxy:malpedia=\"DogHousePower\""],"Shelma":["misp-galaxy:malpedia=\"DogHousePower\""],"Dorshel":["misp-galaxy:malpedia=\"Dorshel\""],"DoublePulsar":["misp-galaxy:malpedia=\"DoublePulsar\""],"DownPaper":["misp-galaxy:malpedia=\"DownPaper\"","misp-galaxy:mitre-enterprise-attack-malware=\"DownPaper - S0186\"","misp-galaxy:mitre-malware=\"DownPaper - S0186\""],"Downdelph":["misp-galaxy:malpedia=\"Downdelph\"","misp-galaxy:mitre-enterprise-attack-malware=\"Downdelph - S0134\"","misp-galaxy:mitre-malware=\"Downdelph - S0134\"","misp-galaxy:tool=\"Downdelph\""],"DELPHACY":["misp-galaxy:malpedia=\"Downdelph\""],"Downeks":["misp-galaxy:malpedia=\"Downeks\""],"DramNudge":["misp-galaxy:malpedia=\"DramNudge\""],"DreamBot":["misp-galaxy:malpedia=\"DreamBot\""],"DtBackdoor":["misp-galaxy:malpedia=\"DtBackdoor\""],"DuQu":["misp-galaxy:malpedia=\"DuQu\""],"DualToy (Android)":["misp-galaxy:malpedia=\"DualToy (Android)\""],"DualToy (Windows)":["misp-galaxy:malpedia=\"DualToy (Windows)\""],"DualToy (iOS)":["misp-galaxy:malpedia=\"DualToy (iOS)\""],"Dumador":["misp-galaxy:malpedia=\"Dumador\""],"Dummy":["misp-galaxy:malpedia=\"Dummy\""],"Duuzer":["misp-galaxy:malpedia=\"Duuzer\""],"Dvmap":["misp-galaxy:malpedia=\"Dvmap\""],"EDA2":["misp-galaxy:malpedia=\"EDA2\"","misp-galaxy:ransomware=\"HiddenTear\""],"EHDevel":["misp-galaxy:malpedia=\"EHDevel\""],"ELMER":["misp-galaxy:malpedia=\"ELMER\"","misp-galaxy:mitre-enterprise-attack-malware=\"ELMER - S0064\"","misp-galaxy:mitre-malware=\"ELMER - S0064\""],"Elmost":["misp-galaxy:malpedia=\"ELMER\""],"EVILNUM (Javascript)":["misp-galaxy:malpedia=\"EVILNUM (Javascript)\""],"EVILNUM (Windows)":["misp-galaxy:malpedia=\"EVILNUM (Windows)\""],"Ebury":["misp-galaxy:malpedia=\"Ebury\"","misp-galaxy:mitre-malware=\"Ebury - S0377\""],"Eleanor":["misp-galaxy:malpedia=\"Eleanor\""],"ElectricPowder":["misp-galaxy:malpedia=\"ElectricPowder\""],"Elirks":["misp-galaxy:malpedia=\"Elirks\"","misp-galaxy:tool=\"Elirks\""],"Elise":["misp-galaxy:malpedia=\"Elise\"","misp-galaxy:mitre-enterprise-attack-malware=\"Elise - S0081\"","misp-galaxy:mitre-malware=\"Elise - S0081\"","misp-galaxy:threat-actor=\"Lotus Panda\"","misp-galaxy:tool=\"Elise Backdoor\""],"Emdivi":["misp-galaxy:malpedia=\"Emdivi\"","misp-galaxy:threat-actor=\"Blue Termite\"","misp-galaxy:tool=\"Emdivi\""],"Heodo":["misp-galaxy:malpedia=\"Emotet\"","misp-galaxy:malpedia=\"Geodo\""],"Empire Downloader":["misp-galaxy:malpedia=\"Empire Downloader\""],"Enfal":["misp-galaxy:malpedia=\"Enfal\"","misp-galaxy:mitre-enterprise-attack-malware=\"Lurid - S0010\"","misp-galaxy:mitre-malware=\"Lurid - S0010\""],"Lurid":["misp-galaxy:malpedia=\"Enfal\"","misp-galaxy:mitre-enterprise-attack-malware=\"Lurid - S0010\"","misp-galaxy:mitre-malware=\"Lurid - S0010\"","misp-galaxy:threat-actor=\"Mirage\""],"EquationDrug":["misp-galaxy:malpedia=\"EquationDrug\"","misp-galaxy:tool=\"EquationDrug\""],"Equationgroup (Sorting)":["misp-galaxy:malpedia=\"Equationgroup (Sorting)\""],"Erebus (ELF)":["misp-galaxy:malpedia=\"Erebus (ELF)\""],"Erebus (Windows)":["misp-galaxy:malpedia=\"Erebus (Windows)\""],"Eredel":["misp-galaxy:malpedia=\"Eredel\""],"EternalPetya":["misp-galaxy:malpedia=\"EternalPetya\""],"BadRabbit":["misp-galaxy:malpedia=\"EternalPetya\"","misp-galaxy:ransomware=\"Bad Rabbit\""],"Diskcoder.C":["misp-galaxy:malpedia=\"EternalPetya\""],"ExPetr":["misp-galaxy:malpedia=\"EternalPetya\""],"NonPetya":["misp-galaxy:malpedia=\"EternalPetya\""],"NotPetya":["misp-galaxy:malpedia=\"EternalPetya\"","misp-galaxy:mitre-malware=\"NotPetya - S0368\"","misp-galaxy:tool=\"NotPetya\""],"Nyetya":["misp-galaxy:malpedia=\"EternalPetya\"","misp-galaxy:mitre-malware=\"NotPetya - S0368\""],"Petna":["misp-galaxy:malpedia=\"EternalPetya\""],"Pnyetya":["misp-galaxy:malpedia=\"EternalPetya\""],"nPetya":["misp-galaxy:malpedia=\"EternalPetya\""],"EtumBot":["misp-galaxy:malpedia=\"EtumBot\""],"HighTide":["misp-galaxy:malpedia=\"EtumBot\""],"EvilGrab":["misp-galaxy:malpedia=\"EvilGrab\"","misp-galaxy:mitre-enterprise-attack-malware=\"EvilGrab - S0152\"","misp-galaxy:mitre-malware=\"EvilGrab - S0152\"","misp-galaxy:tool=\"EvilGrab\""],"Vidgrab":["misp-galaxy:malpedia=\"EvilGrab\""],"EvilOSX":["misp-galaxy:malpedia=\"EvilOSX\""],"EvilPony":["misp-galaxy:malpedia=\"EvilPony\""],"CREstealer":["misp-galaxy:malpedia=\"EvilPony\""],"Evilbunny":["misp-galaxy:malpedia=\"Evilbunny\""],"Evrial":["misp-galaxy:malpedia=\"Evrial\""],"Excalibur":["misp-galaxy:malpedia=\"Excalibur\""],"Saber":["misp-galaxy:malpedia=\"Excalibur\""],"Sabresac":["misp-galaxy:malpedia=\"Excalibur\""],"Exile RAT":["misp-galaxy:malpedia=\"Exile RAT\""],"ExoBot":["misp-galaxy:malpedia=\"ExoBot\"","misp-galaxy:malpedia=\"Marcher\""],"Exodus":["misp-galaxy:malpedia=\"Exodus\""],"Eye Pyramid":["misp-galaxy:malpedia=\"Eye Pyramid\""],"FBot":["misp-galaxy:malpedia=\"FBot\""],"FEimea RAT":["misp-galaxy:malpedia=\"FEimea RAT\""],"FF RAT":["misp-galaxy:malpedia=\"FF RAT\""],"FLASHFLOOD":["misp-galaxy:malpedia=\"FLASHFLOOD\"","misp-galaxy:mitre-enterprise-attack-malware=\"FLASHFLOOD - S0036\"","misp-galaxy:mitre-malware=\"FLASHFLOOD - S0036\""],"FailyTale":["misp-galaxy:malpedia=\"FailyTale\""],"Fake Pornhub":["misp-galaxy:malpedia=\"Fake Pornhub\""],"FakeDGA":["misp-galaxy:malpedia=\"FakeDGA\""],"WillExec":["misp-galaxy:malpedia=\"FakeDGA\""],"FakeGram":["misp-galaxy:malpedia=\"FakeGram\""],"FakeTGram":["misp-galaxy:malpedia=\"FakeGram\""],"FakeRean":["misp-galaxy:malpedia=\"FakeRean\""],"Braviax":["misp-galaxy:malpedia=\"FakeRean\""],"FakeSpy":["misp-galaxy:malpedia=\"FakeSpy\""],"FakeTC":["misp-galaxy:malpedia=\"FakeTC\""],"Fanny":["misp-galaxy:malpedia=\"Fanny\"","misp-galaxy:tool=\"Fanny\""],"FantomCrypt":["misp-galaxy:malpedia=\"FantomCrypt\""],"Farseer":["misp-galaxy:malpedia=\"Farseer\""],"FastCash":["misp-galaxy:malpedia=\"FastCash\""],"FastPOS":["misp-galaxy:malpedia=\"FastPOS\""],"Felismus":["misp-galaxy:malpedia=\"Felismus\"","misp-galaxy:mitre-enterprise-attack-malware=\"Felismus - S0171\"","misp-galaxy:mitre-malware=\"Felismus - S0171\""],"Felixroot":["misp-galaxy:malpedia=\"Felixroot\""],"FileIce":["misp-galaxy:malpedia=\"FileIce\""],"Filecoder":["misp-galaxy:malpedia=\"Filecoder\""],"FinFisher RAT":["misp-galaxy:malpedia=\"FinFisher RAT\""],"FinSpy":["misp-galaxy:malpedia=\"FinFisher RAT\"","misp-galaxy:mitre-enterprise-attack-malware=\"FinFisher - S0182\"","misp-galaxy:mitre-malware=\"FinFisher - S0182\""],"Final1stSpy":["misp-galaxy:malpedia=\"Final1stSpy\""],"FindPOS":["misp-galaxy:malpedia=\"FindPOS\""],"Poseidon":["misp-galaxy:malpedia=\"FindPOS\""],"FireCrypt":["misp-galaxy:malpedia=\"FireCrypt\"","misp-galaxy:ransomware=\"FireCrypt\""],"FireMalv":["misp-galaxy:malpedia=\"FireMalv\"","misp-galaxy:tool=\"FireMalv\""],"Fireball":["misp-galaxy:malpedia=\"Fireball\"","misp-galaxy:tool=\"Fireball\""],"FirstRansom":["misp-galaxy:malpedia=\"FirstRansom\""],"Flame":["misp-galaxy:malpedia=\"Flame\"","misp-galaxy:mitre-enterprise-attack-malware=\"Flame - S0143\"","misp-galaxy:mitre-malware=\"Flame - S0143\"","misp-galaxy:tool=\"Flame\""],"FlashBack":["misp-galaxy:malpedia=\"FlashBack\""],"FlawedAmmyy":["misp-galaxy:malpedia=\"FlawedAmmyy\"","misp-galaxy:rat=\"FlawedAmmyy\""],"FlawedGrace":["misp-galaxy:malpedia=\"FlawedGrace\"","misp-galaxy:rat=\"FlawedGrace\""],"FlexNet":["misp-galaxy:malpedia=\"FlexNet\""],"gugi":["misp-galaxy:malpedia=\"FlexNet\""],"FlexiSpy (Android)":["misp-galaxy:malpedia=\"FlexiSpy (Android)\""],"FlexiSpy (Windows)":["misp-galaxy:malpedia=\"FlexiSpy (Windows)\""],"FlexiSpy (symbian)":["misp-galaxy:malpedia=\"FlexiSpy (symbian)\""],"FlokiBot":["misp-galaxy:malpedia=\"FlokiBot\""],"FlowerShop":["misp-galaxy:malpedia=\"FlowerShop\""],"Floxif":["misp-galaxy:malpedia=\"Floxif\""],"Flusihoc":["misp-galaxy:malpedia=\"Flusihoc\""],"Formbook":["misp-galaxy:malpedia=\"Formbook\""],"FormerFirstRAT":["misp-galaxy:malpedia=\"FormerFirstRAT\""],"ffrat":["misp-galaxy:malpedia=\"FormerFirstRAT\""],"Freenki Loader":["misp-galaxy:malpedia=\"Freenki Loader\""],"FriedEx":["misp-galaxy:malpedia=\"FriedEx\""],"BitPaymer":["misp-galaxy:malpedia=\"FriedEx\"","misp-galaxy:ransomware=\"BitPaymer\""],"FruitFly":["misp-galaxy:malpedia=\"FruitFly\"","misp-galaxy:mitre-malware=\"FruitFly - S0277\"","misp-galaxy:tool=\"FruitFly\""],"Quimitchin":["misp-galaxy:malpedia=\"FruitFly\""],"Furtim":["misp-galaxy:malpedia=\"Furtim\""],"GEMCUTTER":["misp-galaxy:malpedia=\"GEMCUTTER\""],"GPCode":["misp-galaxy:malpedia=\"GPCode\"","misp-galaxy:ransomware=\"OMG! Ransomware\""],"GPlayed":["misp-galaxy:malpedia=\"GPlayed\""],"GREASE":["misp-galaxy:malpedia=\"GREASE\""],"GROK":["misp-galaxy:malpedia=\"GROK\""],"GalaxyLoader":["misp-galaxy:malpedia=\"GalaxyLoader\""],"Gameover DGA":["misp-galaxy:malpedia=\"Gameover DGA\""],"Gameover P2P":["misp-galaxy:malpedia=\"Gameover P2P\""],"GOZ":["misp-galaxy:malpedia=\"Gameover P2P\""],"ZeuS P2P":["misp-galaxy:malpedia=\"Gameover P2P\""],"Gamotrol":["misp-galaxy:malpedia=\"Gamotrol\""],"Gandcrab":["misp-galaxy:malpedia=\"Gandcrab\""],"GrandCrab":["misp-galaxy:malpedia=\"Gandcrab\""],"Gaudox":["misp-galaxy:malpedia=\"Gaudox\""],"Gauss":["misp-galaxy:malpedia=\"Gauss\""],"Gazer":["misp-galaxy:malpedia=\"Gazer\"","misp-galaxy:mitre-enterprise-attack-malware=\"Gazer - S0168\"","misp-galaxy:mitre-malware=\"Gazer - S0168\""],"WhiteBear":["misp-galaxy:malpedia=\"Gazer\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Turla - G0010\"","misp-galaxy:mitre-enterprise-attack-malware=\"Gazer - S0168\"","misp-galaxy:mitre-intrusion-set=\"Turla - G0010\"","misp-galaxy:mitre-malware=\"Gazer - S0168\""],"GearInformer":["misp-galaxy:malpedia=\"GearInformer\""],"GetMail":["misp-galaxy:malpedia=\"GetMail\""],"GetMyPass":["misp-galaxy:malpedia=\"GetMyPass\""],"getmypos":["misp-galaxy:malpedia=\"GetMyPass\""],"Gh0stnet":["misp-galaxy:malpedia=\"Gh0stnet\""],"Remosh":["misp-galaxy:malpedia=\"Gh0stnet\""],"Ghole":["misp-galaxy:malpedia=\"Ghole\""],"CoreImpact (Modified)":["misp-galaxy:malpedia=\"Ghole\""],"Gholee":["misp-galaxy:malpedia=\"Ghole\""],"Ghost RAT":["misp-galaxy:malpedia=\"Ghost RAT\""],"Gh0st RAT":["misp-galaxy:malpedia=\"Ghost RAT\"","misp-galaxy:rat=\"Gh0st RAT\""],"PCRat":["misp-galaxy:malpedia=\"Ghost RAT\""],"GhostAdmin":["misp-galaxy:malpedia=\"GhostAdmin\"","misp-galaxy:tool=\"GhostAdmin\""],"Ghost iBot":["misp-galaxy:malpedia=\"GhostAdmin\""],"GhostMiner":["misp-galaxy:malpedia=\"GhostMiner\"","misp-galaxy:tool=\"GhostMiner\""],"GlanceLove":["misp-galaxy:malpedia=\"GlanceLove\""],"GlassRAT":["misp-galaxy:malpedia=\"GlassRAT\""],"Glasses":["misp-galaxy:malpedia=\"Glasses\""],"Wordpress Bruteforcer":["misp-galaxy:malpedia=\"Glasses\""],"GlitchPOS":["misp-galaxy:malpedia=\"GlitchPOS\""],"Globe":["misp-galaxy:malpedia=\"Globe\""],"GlobeImposter":["misp-galaxy:malpedia=\"GlobeImposter\"","misp-galaxy:ransomware=\"Fake Globe Ransomware\"","misp-galaxy:ransomware=\"GlobeImposter\""],"GlooxMail":["misp-galaxy:malpedia=\"GlooxMail\""],"Glupteba":["misp-galaxy:malpedia=\"Glupteba\""],"Godzilla Loader":["misp-galaxy:malpedia=\"Godzilla Loader\""],"Goggles":["misp-galaxy:malpedia=\"Goggles\""],"GoldDragon":["misp-galaxy:malpedia=\"GoldDragon\""],"GoldenEye":["misp-galaxy:malpedia=\"GoldenEye\"","misp-galaxy:mitre-malware=\"NotPetya - S0368\""],"Petya\/Mischa":["misp-galaxy:malpedia=\"GoldenEye\""],"GoldenRAT":["misp-galaxy:malpedia=\"GoldenRAT\""],"Golroted":["misp-galaxy:malpedia=\"Golroted\""],"GooPic Drooper":["misp-galaxy:malpedia=\"GooPic Drooper\""],"Goodor":["misp-galaxy:malpedia=\"Goodor\""],"Fuerboos":["misp-galaxy:malpedia=\"Goodor\""],"GoogleDrive RAT":["misp-galaxy:malpedia=\"GoogleDrive RAT\""],"GootKit":["misp-galaxy:malpedia=\"GootKit\"","misp-galaxy:tool=\"GootKit\""],"Xswkit":["misp-galaxy:malpedia=\"GootKit\""],"talalpek":["misp-galaxy:malpedia=\"GootKit\""],"GovRAT":["misp-galaxy:malpedia=\"GovRAT\"","misp-galaxy:rat=\"GovRAT\""],"Gozi CRM":["misp-galaxy:malpedia=\"Gozi\""],"GrabBot":["misp-galaxy:malpedia=\"GrabBot\""],"Graftor":["misp-galaxy:malpedia=\"Graftor\"","misp-galaxy:tool=\"Aumlib\""],"Grateful POS":["misp-galaxy:malpedia=\"Grateful POS\""],"FrameworkPOS":["misp-galaxy:malpedia=\"Grateful POS\""],"trinity":["misp-galaxy:malpedia=\"Grateful POS\""],"Gratem":["misp-galaxy:malpedia=\"Gratem\""],"Gravity RAT":["misp-galaxy:malpedia=\"Gravity RAT\""],"GreenShaitan":["misp-galaxy:malpedia=\"GreenShaitan\""],"eoehttp":["misp-galaxy:malpedia=\"GreenShaitan\""],"GreyEnergy":["misp-galaxy:malpedia=\"GreyEnergy\"","misp-galaxy:mitre-malware=\"GreyEnergy - S0342\"","misp-galaxy:threat-actor=\"GreyEnergy\""],"Griffon":["misp-galaxy:malpedia=\"Griffon\""],"GuiInject":["misp-galaxy:malpedia=\"GuiInject\""],"Gustuff":["misp-galaxy:malpedia=\"Gustuff\""],"H1N1 Loader":["misp-galaxy:malpedia=\"H1N1 Loader\""],"HALFBAKED":["misp-galaxy:malpedia=\"HALFBAKED\"","misp-galaxy:mitre-enterprise-attack-malware=\"HALFBAKED - S0151\"","misp-galaxy:mitre-malware=\"HALFBAKED - S0151\"","misp-galaxy:tool=\"VB Flash\""],"HLUX":["misp-galaxy:malpedia=\"HLUX\""],"HOPLIGHT":["misp-galaxy:malpedia=\"HOPLIGHT\"","misp-galaxy:mitre-malware=\"HOPLIGHT - S0376\""],"HTML5 Encoding":["misp-galaxy:malpedia=\"HTML5 Encoding\""],"HTran":["misp-galaxy:malpedia=\"HTran\"","misp-galaxy:tool=\"Htran\""],"HUC Packet Transmit Tool":["misp-galaxy:malpedia=\"HTran\"","misp-galaxy:mitre-enterprise-attack-tool=\"HTRAN - S0040\"","misp-galaxy:mitre-tool=\"HTRAN - S0040\""],"HackSpy":["misp-galaxy:malpedia=\"HackSpy\""],"Hacksfase":["misp-galaxy:malpedia=\"Hacksfase\""],"Haiduc":["misp-galaxy:malpedia=\"Haiduc\""],"Hakai":["misp-galaxy:malpedia=\"Hakai\""],"Hamweq":["misp-galaxy:malpedia=\"Hamweq\""],"Hancitor":["misp-galaxy:malpedia=\"Hancitor\"","misp-galaxy:tool=\"Hancitor\""],"Chanitor":["misp-galaxy:malpedia=\"Hancitor\"","misp-galaxy:tool=\"Hancitor\""],"HappyLocker (HiddenTear?)":["misp-galaxy:malpedia=\"HappyLocker (HiddenTear?)\""],"Harnig":["misp-galaxy:malpedia=\"Harnig\""],"Piptea":["misp-galaxy:malpedia=\"Harnig\""],"Havex RAT":["misp-galaxy:malpedia=\"Havex RAT\"","misp-galaxy:tool=\"Havex RAT\""],"HawkEye Keylogger":["misp-galaxy:malpedia=\"HawkEye Keylogger\""],"HawkEye Reborn":["misp-galaxy:malpedia=\"HawkEye Keylogger\""],"Predator Pain":["misp-galaxy:malpedia=\"HawkEye Keylogger\"","misp-galaxy:rat=\"Predator Pain\""],"Helauto":["misp-galaxy:malpedia=\"Helauto\""],"Helminth":["misp-galaxy:malpedia=\"Helminth\"","misp-galaxy:mitre-enterprise-attack-malware=\"Helminth - S0170\"","misp-galaxy:mitre-malware=\"Helminth - S0170\""],"Heloag":["misp-galaxy:malpedia=\"Heloag\""],"Herbst":["misp-galaxy:malpedia=\"Herbst\"","misp-galaxy:ransomware=\"Herbst\""],"Heriplor":["misp-galaxy:malpedia=\"Heriplor\""],"Hermes Ransomware":["misp-galaxy:malpedia=\"Hermes Ransomware\"","misp-galaxy:ransomware=\"Hermes Ransomware\""],"Hermes":["misp-galaxy:malpedia=\"Hermes\""],"HeroRAT":["misp-galaxy:malpedia=\"HeroRAT\""],"HerpesBot":["misp-galaxy:malpedia=\"HerpesBot\""],"HesperBot":["misp-galaxy:malpedia=\"HesperBot\""],"Hi-Zor RAT":["misp-galaxy:malpedia=\"Hi-Zor RAT\""],"HiKit":["misp-galaxy:malpedia=\"HiKit\""],"HiddenLotus":["misp-galaxy:malpedia=\"HiddenLotus\""],"HiddenTear":["misp-galaxy:malpedia=\"HiddenTear\"","misp-galaxy:ransomware=\"HiddenTear\""],"HideDRV":["misp-galaxy:malpedia=\"HideDRV\""],"HtBot":["misp-galaxy:malpedia=\"HtBot\""],"HttpBrowser":["misp-galaxy:malpedia=\"HttpBrowser\""],"Hworm":["misp-galaxy:malpedia=\"Hworm\"","misp-galaxy:tool=\"Hworm\""],"houdini":["misp-galaxy:malpedia=\"Hworm\""],"HyperBro":["misp-galaxy:malpedia=\"HyperBro\""],"IDKEY":["misp-galaxy:malpedia=\"IDKEY\""],"IISniff":["misp-galaxy:malpedia=\"IISniff\""],"IRONHALO":["misp-galaxy:malpedia=\"IRONHALO\""],"IRRat":["misp-galaxy:malpedia=\"IRRat\""],"ISFB":["misp-galaxy:malpedia=\"ISFB\""],"Pandemyia":["misp-galaxy:malpedia=\"ISFB\""],"ISMAgent":["misp-galaxy:malpedia=\"ISMAgent\""],"ISMDoor":["misp-galaxy:malpedia=\"ISMDoor\""],"ISR Stealer":["misp-galaxy:malpedia=\"ISR Stealer\""],"IcedID Downloader":["misp-galaxy:malpedia=\"IcedID Downloader\""],"BokBot":["misp-galaxy:malpedia=\"IcedID\""],"Icefog":["misp-galaxy:malpedia=\"Icefog\""],"Imecab":["misp-galaxy:malpedia=\"Imecab\""],"Imminent Monitor RAT":["misp-galaxy:malpedia=\"Imminent Monitor RAT\""],"Infy":["misp-galaxy:malpedia=\"Infy\"","misp-galaxy:threat-actor=\"Infy\""],"Foudre":["misp-galaxy:malpedia=\"Infy\""],"InnaputRAT":["misp-galaxy:malpedia=\"InnaputRAT\"","misp-galaxy:mitre-malware=\"InnaputRAT - S0259\""],"InvisiMole":["misp-galaxy:malpedia=\"InvisiMole\"","misp-galaxy:mitre-malware=\"InvisiMole - S0260\"","misp-galaxy:tool=\"InvisiMole\""],"IoT Reaper":["misp-galaxy:malpedia=\"IoT Reaper\""],"IoTroop":["misp-galaxy:malpedia=\"IoT Reaper\""],"Reaper":["misp-galaxy:malpedia=\"IoT Reaper\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\"","misp-galaxy:threat-actor=\"APT37\""],"Irc16":["misp-galaxy:malpedia=\"Irc16\""],"IsSpace":["misp-galaxy:malpedia=\"IsSpace\"","misp-galaxy:tool=\"IsSpace\""],"IsraBye":["misp-galaxy:malpedia=\"IsraBye\"","misp-galaxy:ransomware=\"IsraBye\""],"JCry":["misp-galaxy:malpedia=\"JCry\""],"JQJSNICKER":["misp-galaxy:malpedia=\"JQJSNICKER\""],"JackPOS":["misp-galaxy:malpedia=\"JackPOS\""],"JadeRAT":["misp-galaxy:malpedia=\"JadeRAT\"","misp-galaxy:rat=\"JadeRAT\""],"Jaff":["misp-galaxy:malpedia=\"Jaff\"","misp-galaxy:ransomware=\"Jaff\""],"Jager Decryptor":["misp-galaxy:malpedia=\"Jager Decryptor\""],"Jaku":["misp-galaxy:malpedia=\"Jaku\""],"C3PRO-RACOON":["misp-galaxy:malpedia=\"Jaku\""],"KCNA Infostealer":["misp-galaxy:malpedia=\"Jaku\""],"Reconcyc":["misp-galaxy:malpedia=\"Jaku\""],"Jasus":["misp-galaxy:malpedia=\"Jasus\""],"JavaDispCash":["misp-galaxy:malpedia=\"JavaDispCash\""],"JenX":["misp-galaxy:malpedia=\"JenX\""],"Jigsaw":["misp-galaxy:malpedia=\"Jigsaw\"","misp-galaxy:ransomware=\"Jigsaw\""],"Jimmy":["misp-galaxy:malpedia=\"Jimmy\"","misp-galaxy:malpedia=\"Neutrino POS\""],"Joanap":["misp-galaxy:malpedia=\"Joanap\""],"Joao":["misp-galaxy:malpedia=\"Joao\"","misp-galaxy:tool=\"Joao\""],"Jolob":["misp-galaxy:malpedia=\"Jolob\"","misp-galaxy:tool=\"Jolob\""],"JripBot":["misp-galaxy:malpedia=\"JripBot\""],"KAgent":["misp-galaxy:malpedia=\"KAgent\""],"KEYMARBLE":["misp-galaxy:malpedia=\"KEYMARBLE\"","misp-galaxy:mitre-malware=\"KEYMARBLE - S0271\"","misp-galaxy:tool=\"KEYMARBLE\""],"KHRAT":["misp-galaxy:malpedia=\"KHRAT\"","misp-galaxy:tool=\"KHRAT\""],"KINS":["misp-galaxy:malpedia=\"KINS\""],"KLRD":["misp-galaxy:malpedia=\"KLRD\""],"KOMPROGO":["misp-galaxy:malpedia=\"KOMPROGO\"","misp-galaxy:mitre-enterprise-attack-malware=\"KOMPROGO - S0156\"","misp-galaxy:mitre-malware=\"KOMPROGO - S0156\""],"KPOT Stealer":["misp-galaxy:malpedia=\"KPOT Stealer\""],"KSL0T":["misp-galaxy:malpedia=\"KSL0T\""],"Kaiten":["misp-galaxy:malpedia=\"Kaiten\""],"STD":["misp-galaxy:malpedia=\"Kaiten\""],"Karagany":["misp-galaxy:malpedia=\"Karagany\""],"Kardon Loader":["misp-galaxy:malpedia=\"Kardon Loader\""],"Karkoff":["misp-galaxy:malpedia=\"Karkoff\"","misp-galaxy:tool=\"Karkoff\""],"KasperAgent":["misp-galaxy:malpedia=\"KasperAgent\""],"Kazuar":["misp-galaxy:malpedia=\"Kazuar\"","misp-galaxy:mitre-malware=\"Kazuar - S0265\"","misp-galaxy:tool=\"Kazuar\""],"KeRanger":["misp-galaxy:malpedia=\"KeRanger\"","misp-galaxy:ransomware=\"KeRanger\""],"Kegotip":["misp-galaxy:malpedia=\"Kegotip\""],"KerrDown":["misp-galaxy:malpedia=\"KerrDown\""],"KevDroid":["misp-galaxy:malpedia=\"KevDroid\""],"KeyBase":["misp-galaxy:malpedia=\"KeyBase\""],"Kibex":["misp-galaxy:malpedia=\"KeyBase\""],"KeyBoy":["misp-galaxy:malpedia=\"KeyBoy\"","misp-galaxy:malpedia=\"Yahoyah\"","misp-galaxy:mitre-intrusion-set=\"Tropic Trooper - G0081\"","misp-galaxy:threat-actor=\"Pirate Panda\"","misp-galaxy:tool=\"KeyBoy\""],"TSSL":["misp-galaxy:malpedia=\"KeyBoy\""],"KeyPass":["misp-galaxy:malpedia=\"KeyPass\"","misp-galaxy:malpedia=\"STOP Ransomware\"","misp-galaxy:ransomware=\"KEYPASS\""],"Keydnap":["misp-galaxy:malpedia=\"Keydnap\"","misp-galaxy:mitre-malware=\"Keydnap - S0276\""],"Kikothac":["misp-galaxy:malpedia=\"Kikothac\""],"KillDisk":["misp-galaxy:malpedia=\"KillDisk\"","misp-galaxy:tool=\"KillDisk Wiper\""],"Kitmos":["misp-galaxy:malpedia=\"Kitmos\""],"KitM":["misp-galaxy:malpedia=\"Kitmos\""],"KleptoParasite Stealer":["misp-galaxy:malpedia=\"KleptoParasite Stealer\""],"Joglog":["misp-galaxy:malpedia=\"KleptoParasite Stealer\""],"Koadic":["misp-galaxy:malpedia=\"Koadic\"","misp-galaxy:mitre-tool=\"Koadic - S0250\"","misp-galaxy:tool=\"Koadic\""],"KokoKrypt":["misp-galaxy:malpedia=\"KokoKrypt\""],"Koler":["misp-galaxy:malpedia=\"Koler\""],"Komplex":["misp-galaxy:malpedia=\"Komplex\"","misp-galaxy:mitre-enterprise-attack-malware=\"Komplex - S0162\"","misp-galaxy:mitre-malware=\"Komplex - S0162\""],"JHUHUGIT":["misp-galaxy:malpedia=\"Komplex\"","misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\"","misp-galaxy:tool=\"GAMEFISH\""],"JKEYSKW":["misp-galaxy:malpedia=\"Komplex\"","misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\""],"SedUploader":["misp-galaxy:malpedia=\"Komplex\""],"Konni":["misp-galaxy:malpedia=\"Konni\"","misp-galaxy:rat=\"Konni\""],"KoobFace":["misp-galaxy:malpedia=\"KoobFace\""],"KopiLuwak":["misp-galaxy:malpedia=\"KopiLuwak\""],"Korlia":["misp-galaxy:malpedia=\"Korlia\""],"Bisonal":["misp-galaxy:malpedia=\"Korlia\"","misp-galaxy:mitre-malware=\"Bisonal - S0268\"","misp-galaxy:tool=\"Bisonal\""],"Kovter":["misp-galaxy:malpedia=\"Kovter\""],"KrBanker":["misp-galaxy:malpedia=\"KrBanker\""],"BlackMoon":["misp-galaxy:malpedia=\"KrBanker\""],"KrDownloader":["misp-galaxy:malpedia=\"KrDownloader\""],"Osiris":["misp-galaxy:malpedia=\"Kronos\""],"Kuaibu":["misp-galaxy:malpedia=\"Kuaibu\""],"Barys":["misp-galaxy:malpedia=\"Kuaibu\""],"Gofot":["misp-galaxy:malpedia=\"Kuaibu\""],"Kuaibpy":["misp-galaxy:malpedia=\"Kuaibu\""],"Kuluoz":["misp-galaxy:malpedia=\"Kuluoz\""],"Kurton":["misp-galaxy:malpedia=\"Kurton\""],"Kutaki":["misp-galaxy:malpedia=\"Kutaki\""],"Kwampirs":["misp-galaxy:malpedia=\"Kwampirs\"","misp-galaxy:mitre-malware=\"Kwampirs - S0236\"","misp-galaxy:tool=\"Kwampirs\""],"LOWBALL":["misp-galaxy:malpedia=\"LOWBALL\"","misp-galaxy:mitre-enterprise-attack-malware=\"LOWBALL - S0042\"","misp-galaxy:mitre-malware=\"LOWBALL - S0042\""],"Lady":["misp-galaxy:malpedia=\"Lady\""],"Lambert":["misp-galaxy:malpedia=\"Lambert\""],"Lamdelin":["misp-galaxy:malpedia=\"Lamdelin\""],"Laoshu":["misp-galaxy:malpedia=\"Laoshu\""],"LatentBot":["misp-galaxy:malpedia=\"LatentBot\""],"Lazarus (Android)":["misp-galaxy:malpedia=\"Lazarus (Android)\""],"Lazarus (Windows)":["misp-galaxy:malpedia=\"Lazarus (Windows)\""],"Lazarus ELF Backdoor":["misp-galaxy:malpedia=\"Lazarus ELF Backdoor\""],"Laziok":["misp-galaxy:malpedia=\"Laziok\"","misp-galaxy:tool=\"Trojan.Laziok\""],"LazyCat":["misp-galaxy:malpedia=\"LazyCat\""],"Leash":["misp-galaxy:malpedia=\"Leash\""],"Leouncia":["misp-galaxy:malpedia=\"Leouncia\""],"shoco":["misp-galaxy:malpedia=\"Leouncia\""],"Leverage":["misp-galaxy:malpedia=\"Leverage\""],"LimeRAT":["misp-galaxy:malpedia=\"LimeRAT\""],"Limitail":["misp-galaxy:malpedia=\"Limitail\""],"Listrix":["misp-galaxy:malpedia=\"Listrix\""],"LiteHTTP":["misp-galaxy:malpedia=\"LiteHTTP\""],"LoJax":["misp-galaxy:malpedia=\"LoJax\"","misp-galaxy:tool=\"LoJax\""],"LockPOS":["misp-galaxy:malpedia=\"LockPOS\""],"LockerGoga":["misp-galaxy:malpedia=\"LockerGoga\"","misp-galaxy:ransomware=\"LockerGoga\""],"Locky (Decryptor)":["misp-galaxy:malpedia=\"Locky (Decryptor)\""],"Locky Loader":["misp-galaxy:malpedia=\"Locky Loader\""],"Locky":["misp-galaxy:malpedia=\"Locky\"","misp-galaxy:ransomware=\"Locky\""],"Loda":["misp-galaxy:malpedia=\"Loda\""],"Nymeria":["misp-galaxy:malpedia=\"Loda\""],"LogPOS":["misp-galaxy:malpedia=\"LogPOS\""],"Logedrut":["misp-galaxy:malpedia=\"Logedrut\""],"Loki Password Stealer (PWS)":["misp-galaxy:malpedia=\"Loki Password Stealer (PWS)\""],"Loki":["misp-galaxy:malpedia=\"Loki Password Stealer (PWS)\"","misp-galaxy:malpedia=\"Loki\""],"LokiPWS":["misp-galaxy:malpedia=\"Loki Password Stealer (PWS)\""],"Lordix":["misp-galaxy:malpedia=\"Lordix\""],"LuckyCat":["misp-galaxy:malpedia=\"LuckyCat\""],"Luminosity RAT":["misp-galaxy:malpedia=\"Luminosity RAT\""],"LunchMoney":["misp-galaxy:malpedia=\"LunchMoney\""],"Lurk":["misp-galaxy:malpedia=\"Lurk\""],"Luzo":["misp-galaxy:malpedia=\"Luzo\""],"Lyposit":["misp-galaxy:malpedia=\"Lyposit\""],"Adneukine":["misp-galaxy:malpedia=\"Lyposit\""],"Bomba Locker":["misp-galaxy:malpedia=\"Lyposit\""],"Lucky Locker":["misp-galaxy:malpedia=\"Lyposit\""],"MAPIget":["misp-galaxy:malpedia=\"MAPIget\""],"MBRlock":["misp-galaxy:malpedia=\"MBRlock\""],"DexLocker":["misp-galaxy:malpedia=\"MBRlock\""],"MECHANICAL":["misp-galaxy:malpedia=\"MECHANICAL\""],"MILKMAID":["misp-galaxy:malpedia=\"MILKMAID\""],"MM Core":["misp-galaxy:malpedia=\"MM Core\"","misp-galaxy:tool=\"MM Core\""],"MPKBot":["misp-galaxy:malpedia=\"MPKBot\""],"MPK":["misp-galaxy:malpedia=\"MPKBot\""],"MS Exchange Tool":["misp-galaxy:malpedia=\"MS Exchange Tool\""],"MaMi":["misp-galaxy:malpedia=\"MaMi\""],"MacDownloader":["misp-galaxy:malpedia=\"MacDownloader\"","misp-galaxy:tool=\"MacDownloader\""],"MacInstaller":["misp-galaxy:malpedia=\"MacInstaller\""],"MacRansom":["misp-galaxy:malpedia=\"MacRansom\"","misp-galaxy:ransomware=\"MacRansom\""],"MacSpy":["misp-galaxy:malpedia=\"MacSpy\"","misp-galaxy:mitre-malware=\"MacSpy - S0282\"","misp-galaxy:rat=\"MacSpy\""],"MacVX":["misp-galaxy:malpedia=\"MacVX\""],"Machete":["misp-galaxy:malpedia=\"Machete\"","misp-galaxy:threat-actor=\"El Machete\""],"El Machete":["misp-galaxy:malpedia=\"Machete\"","misp-galaxy:threat-actor=\"El Machete\""],"MadMax":["misp-galaxy:malpedia=\"MadMax\""],"Magala":["misp-galaxy:malpedia=\"Magala\""],"Magniber":["misp-galaxy:malpedia=\"Magniber\""],"Maintools.js":["misp-galaxy:malpedia=\"Maintools.js\""],"MajikPos":["misp-galaxy:malpedia=\"MajikPos\""],"MakLoader":["misp-galaxy:malpedia=\"MakLoader\""],"Makadocs":["misp-galaxy:malpedia=\"Makadocs\""],"Maktub":["misp-galaxy:malpedia=\"Maktub\""],"MalumPOS":["misp-galaxy:malpedia=\"MalumPOS\""],"Mamba":["misp-galaxy:malpedia=\"Mamba\"","misp-galaxy:ransomware=\"HDDCryptor\""],"DiskCryptor":["misp-galaxy:malpedia=\"Mamba\""],"HDDCryptor":["misp-galaxy:malpedia=\"Mamba\"","misp-galaxy:ransomware=\"HDDCryptor\""],"ManItsMe":["misp-galaxy:malpedia=\"ManItsMe\""],"ManameCrypt":["misp-galaxy:malpedia=\"ManameCrypt\""],"CryptoHost":["misp-galaxy:malpedia=\"ManameCrypt\"","misp-galaxy:ransomware=\"CryptoHost\""],"Mangzamel":["misp-galaxy:malpedia=\"Mangzamel\""],"junidor":["misp-galaxy:malpedia=\"Mangzamel\""],"mengkite":["misp-galaxy:malpedia=\"Mangzamel\""],"vedratve":["misp-galaxy:malpedia=\"Mangzamel\""],"Manifestus":["misp-galaxy:malpedia=\"Manifestus\"","misp-galaxy:ransomware=\"EnkripsiPC Ransomware\""],"Marap":["misp-galaxy:malpedia=\"Marap\""],"Marcher":["misp-galaxy:malpedia=\"Marcher\"","misp-galaxy:mitre-malware=\"Marcher - S0317\""],"Masuta":["misp-galaxy:malpedia=\"Masuta\"","misp-galaxy:tool=\"Masuta\""],"PureMasuta":["misp-galaxy:malpedia=\"Masuta\"","misp-galaxy:tool=\"Masuta\""],"Matrix Ransom":["misp-galaxy:malpedia=\"Matrix Ransom\""],"Matryoshka RAT":["misp-galaxy:malpedia=\"Matryoshka RAT\""],"Matsnu":["misp-galaxy:malpedia=\"Matsnu\""],"MazarBot":["misp-galaxy:malpedia=\"MazarBot\""],"Mebromi":["misp-galaxy:malpedia=\"Mebromi\""],"MyBios":["misp-galaxy:malpedia=\"Mebromi\""],"Medre":["misp-galaxy:malpedia=\"Medre\""],"Medusa":["misp-galaxy:malpedia=\"Medusa\""],"Merlin":["misp-galaxy:malpedia=\"Merlin\""],"Metamorfo":["misp-galaxy:malpedia=\"Metamorfo\""],"Casbaneiro":["misp-galaxy:malpedia=\"Metamorfo\""],"Mewsei":["misp-galaxy:malpedia=\"Mewsei\""],"MiKey":["misp-galaxy:malpedia=\"MiKey\""],"Miancha":["misp-galaxy:malpedia=\"Miancha\""],"Micrass":["misp-galaxy:malpedia=\"Micrass\""],"Microcin":["misp-galaxy:malpedia=\"Microcin\"","misp-galaxy:threat-actor=\"Microcin\""],"Micropsia":["misp-galaxy:malpedia=\"Micropsia\"","misp-galaxy:mitre-malware=\"Micropsia - S0339\""],"Mikoponi":["misp-galaxy:malpedia=\"Mikoponi\""],"MimiKatz":["misp-galaxy:malpedia=\"MimiKatz\""],"MiniASP":["misp-galaxy:malpedia=\"MiniASP\""],"Mirage":["misp-galaxy:malpedia=\"Mirage\"","misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:threat-actor=\"Mirage\""],"MirageFox":["misp-galaxy:malpedia=\"MirageFox\"","misp-galaxy:mitre-malware=\"MirageFox - S0280\""],"Mirai (ELF)":["misp-galaxy:malpedia=\"Mirai (ELF)\""],"Mirai (Windows)":["misp-galaxy:malpedia=\"Mirai (Windows)\""],"Misdat":["misp-galaxy:malpedia=\"Misdat\"","misp-galaxy:mitre-enterprise-attack-malware=\"Misdat - S0083\"","misp-galaxy:mitre-malware=\"Misdat - S0083\""],"Misfox":["misp-galaxy:malpedia=\"Misfox\""],"MixFox":["misp-galaxy:malpedia=\"Misfox\""],"ModPack":["misp-galaxy:malpedia=\"Misfox\""],"Miuref":["misp-galaxy:malpedia=\"Miuref\""],"MobiRAT":["misp-galaxy:malpedia=\"MobiRAT\""],"Mocton":["misp-galaxy:malpedia=\"Mocton\""],"ModPOS":["misp-galaxy:malpedia=\"ModPOS\""],"straxbot":["misp-galaxy:malpedia=\"ModPOS\""],"Moker":["misp-galaxy:malpedia=\"Moker\""],"Mokes (ELF)":["misp-galaxy:malpedia=\"Mokes (ELF)\""],"Mokes (OS X)":["misp-galaxy:malpedia=\"Mokes (OS X)\""],"Mokes (Windows)":["misp-galaxy:malpedia=\"Mokes (Windows)\""],"Mole":["misp-galaxy:malpedia=\"Mole\""],"Molerat Loader":["misp-galaxy:malpedia=\"Molerat Loader\""],"Monero Miner":["misp-galaxy:malpedia=\"Monero Miner\""],"CoinMiner":["misp-galaxy:malpedia=\"Monero Miner\"","misp-galaxy:tool=\"CoinMiner\""],"MoonWind":["misp-galaxy:malpedia=\"MoonWind\"","misp-galaxy:mitre-enterprise-attack-malware=\"MoonWind - S0149\"","misp-galaxy:mitre-malware=\"MoonWind - S0149\"","misp-galaxy:rat=\"MoonWind\"","misp-galaxy:tool=\"MoonWind\""],"Moose":["misp-galaxy:malpedia=\"Moose\""],"More_eggs":["misp-galaxy:malpedia=\"More_eggs\"","misp-galaxy:mitre-malware=\"More_eggs - S0284\""],"SpicyOmelette":["misp-galaxy:malpedia=\"More_eggs\"","misp-galaxy:tool=\"SpicyOmelette\""],"Morphine":["misp-galaxy:malpedia=\"Morphine\""],"Morto":["misp-galaxy:malpedia=\"Morto\""],"Mosquito":["misp-galaxy:malpedia=\"Mosquito\"","misp-galaxy:mitre-malware=\"Mosquito - S0256\""],"Moure":["misp-galaxy:malpedia=\"Moure\""],"MrBlack":["misp-galaxy:malpedia=\"MrBlack\""],"Mughthesec":["misp-galaxy:malpedia=\"Mughthesec\"","misp-galaxy:tool=\"Mughthesec\""],"Multigrain POS":["misp-galaxy:malpedia=\"Multigrain POS\""],"Mutabaha":["misp-galaxy:malpedia=\"Mutabaha\""],"MyKings Spreader":["misp-galaxy:malpedia=\"MyKings Spreader\""],"MyloBot":["misp-galaxy:malpedia=\"MyloBot\""],"N40":["misp-galaxy:malpedia=\"N40\""],"NETEAGLE":["misp-galaxy:malpedia=\"NETEAGLE\"","misp-galaxy:mitre-enterprise-attack-malware=\"NETEAGLE - S0034\"","misp-galaxy:mitre-malware=\"NETEAGLE - S0034\""],"ScoutEagle":["misp-galaxy:malpedia=\"NETEAGLE\""],"Nabucur":["misp-galaxy:malpedia=\"Nabucur\""],"Nagini":["misp-galaxy:malpedia=\"Nagini\""],"Naikon":["misp-galaxy:malpedia=\"Naikon\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Naikon - G0019\"","misp-galaxy:mitre-intrusion-set=\"Naikon - G0019\"","misp-galaxy:threat-actor=\"Naikon\""],"NanHaiShu":["misp-galaxy:malpedia=\"NanHaiShu\"","misp-galaxy:mitre-enterprise-attack-malware=\"NanHaiShu - S0228\"","misp-galaxy:mitre-malware=\"NanHaiShu - S0228\"","misp-galaxy:tool=\"NanHaiShu\""],"NanoLocker":["misp-galaxy:malpedia=\"NanoLocker\"","misp-galaxy:ransomware=\"NanoLocker\""],"Nanocore RAT":["misp-galaxy:malpedia=\"Nanocore RAT\""],"Narilam":["misp-galaxy:malpedia=\"Narilam\""],"Nautilus":["misp-galaxy:malpedia=\"Nautilus\"","misp-galaxy:tool=\"Nautilus\""],"NavRAT":["misp-galaxy:malpedia=\"NavRAT\"","misp-galaxy:mitre-malware=\"NavRAT - S0247\"","misp-galaxy:rat=\"NavRAT\""],"Necurs":["misp-galaxy:malpedia=\"Necurs\"","misp-galaxy:tool=\"Necurs\""],"nucurs":["misp-galaxy:malpedia=\"Necurs\""],"Nemim":["misp-galaxy:malpedia=\"Nemim\"","misp-galaxy:threat-actor=\"DarkHotel\""],"Nemain":["misp-galaxy:malpedia=\"Nemim\""],"NetC":["misp-galaxy:malpedia=\"NetC\"","misp-galaxy:mitre-enterprise-attack-malware=\"Net Crawler - S0056\"","misp-galaxy:mitre-malware=\"Net Crawler - S0056\""],"NetSupportManager RAT":["misp-galaxy:malpedia=\"NetSupportManager RAT\""],"NetTraveler":["misp-galaxy:malpedia=\"NetTraveler\"","misp-galaxy:mitre-enterprise-attack-malware=\"NetTraveler - S0033\"","misp-galaxy:mitre-malware=\"NetTraveler - S0033\"","misp-galaxy:threat-actor=\"NetTraveler\"","misp-galaxy:tool=\"NetTraveler\""],"TravNet":["misp-galaxy:malpedia=\"NetTraveler\"","misp-galaxy:threat-actor=\"NetTraveler\"","misp-galaxy:tool=\"NetTraveler\""],"NetWire RC":["misp-galaxy:malpedia=\"NetWire RC\""],"Recam":["misp-galaxy:malpedia=\"NetWire RC\""],"Netrepser":["misp-galaxy:malpedia=\"Netrepser\""],"Neuron":["misp-galaxy:malpedia=\"Neuron\"","misp-galaxy:tool=\"Neuron\""],"Neutrino POS":["misp-galaxy:malpedia=\"Neutrino POS\""],"Kasidet":["misp-galaxy:malpedia=\"Neutrino\"","misp-galaxy:mitre-enterprise-attack-malware=\"Kasidet - S0088\"","misp-galaxy:mitre-malware=\"Kasidet - S0088\""],"NewCT":["misp-galaxy:malpedia=\"NewCT\"","misp-galaxy:tool=\"NewCT\""],"CT":["misp-galaxy:malpedia=\"NewCT\""],"NewCore RAT":["misp-galaxy:malpedia=\"NewCore RAT\""],"NewPosThings":["misp-galaxy:malpedia=\"NewPosThings\""],"NewsReels":["misp-galaxy:malpedia=\"NewsReels\""],"Nexster Bot":["misp-galaxy:malpedia=\"Nexster Bot\""],"NexusLogger":["misp-galaxy:malpedia=\"NexusLogger\""],"Ngioweb":["misp-galaxy:malpedia=\"Ngioweb\""],"NgrBot":["misp-galaxy:malpedia=\"NgrBot\""],"Nitol":["misp-galaxy:malpedia=\"Nitol\""],"NjRAT":["misp-galaxy:malpedia=\"NjRAT\""],"Bladabindi":["misp-galaxy:malpedia=\"NjRAT\"","misp-galaxy:tool=\"njRAT\""],"Nocturnal Stealer":["misp-galaxy:malpedia=\"Nocturnal Stealer\"","misp-galaxy:stealer=\"Nocturnal Stealer\""],"Nokki":["misp-galaxy:malpedia=\"Nokki\""],"Nozelesn (Decryptor)":["misp-galaxy:malpedia=\"Nozelesn (Decryptor)\""],"Nymaim":["misp-galaxy:malpedia=\"Nymaim\"","misp-galaxy:tool=\"Nymaim\""],"nymain":["misp-galaxy:malpedia=\"Nymaim\""],"Nymaim2":["misp-galaxy:malpedia=\"Nymaim2\""],"OLDBAIT":["misp-galaxy:malpedia=\"OLDBAIT\"","misp-galaxy:mitre-enterprise-attack-malware=\"OLDBAIT - S0138\"","misp-galaxy:mitre-malware=\"OLDBAIT - S0138\"","misp-galaxy:tool=\"OLDBAIT\""],"Sasfis":["misp-galaxy:malpedia=\"OLDBAIT\"","misp-galaxy:malpedia=\"Sasfis\"","misp-galaxy:mitre-enterprise-attack-malware=\"OLDBAIT - S0138\"","misp-galaxy:mitre-malware=\"OLDBAIT - S0138\"","misp-galaxy:tool=\"OLDBAIT\""],"ONHAT":["misp-galaxy:malpedia=\"ONHAT\""],"ORANGEADE":["misp-galaxy:malpedia=\"ORANGEADE\""],"OceanLotus":["misp-galaxy:malpedia=\"OceanLotus\"","misp-galaxy:mitre-intrusion-set=\"APT32 - G0050\"","misp-galaxy:threat-actor=\"APT32\""],"Oceansalt":["misp-galaxy:malpedia=\"Oceansalt\""],"Octopus":["misp-galaxy:malpedia=\"Octopus\"","misp-galaxy:mitre-malware=\"Octopus - S0340\""],"OddJob":["misp-galaxy:malpedia=\"OddJob\""],"Odinaff":["misp-galaxy:malpedia=\"Odinaff\"","misp-galaxy:tool=\"Odinaff\""],"OilRig":["misp-galaxy:malpedia=\"OilRig\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"OilRig - G0049\"","misp-galaxy:mitre-intrusion-set=\"OilRig - G0049\"","misp-galaxy:threat-actor=\"CHRYSENE\"","misp-galaxy:threat-actor=\"OilRig\""],"Olympic Destroyer":["misp-galaxy:malpedia=\"Olympic Destroyer\"","misp-galaxy:mitre-malware=\"Olympic Destroyer - S0365\"","misp-galaxy:tool=\"Olympic Destroyer\""],"Olyx":["misp-galaxy:malpedia=\"Olyx\""],"OmniRAT":["misp-galaxy:malpedia=\"OmniRAT\"","misp-galaxy:rat=\"OmniRAT\""],"OneKeyLocker":["misp-galaxy:malpedia=\"OneKeyLocker\""],"OnionDuke":["misp-galaxy:malpedia=\"OnionDuke\"","misp-galaxy:mitre-enterprise-attack-malware=\"OnionDuke - S0052\"","misp-galaxy:mitre-malware=\"OnionDuke - S0052\""],"OnlinerSpambot":["misp-galaxy:malpedia=\"OnlinerSpambot\""],"Onliner":["misp-galaxy:malpedia=\"OnlinerSpambot\""],"SBot":["misp-galaxy:malpedia=\"OnlinerSpambot\""],"OopsIE":["misp-galaxy:malpedia=\"OopsIE\"","misp-galaxy:mitre-malware=\"OopsIE - S0264\""],"OpBlockBuster":["misp-galaxy:malpedia=\"OpBlockBuster\""],"OpGhoul":["misp-galaxy:malpedia=\"OpGhoul\""],"Opachki":["misp-galaxy:malpedia=\"Opachki\""],"OrcaRAT":["misp-galaxy:malpedia=\"OrcaRAT\""],"Orcus RAT":["misp-galaxy:malpedia=\"Orcus RAT\""],"Ordinypt":["misp-galaxy:malpedia=\"Ordinypt\"","misp-galaxy:tool=\"Ordinypt\""],"Outlook Backdoor":["misp-galaxy:malpedia=\"Outlook Backdoor\""],"Overlay RAT":["misp-galaxy:malpedia=\"Overlay RAT\""],"OvidiyStealer":["misp-galaxy:malpedia=\"OvidiyStealer\""],"PAS":["misp-galaxy:malpedia=\"PAS\""],"PC Surveillance System":["misp-galaxy:malpedia=\"PC Surveillance System\""],"PSS":["misp-galaxy:malpedia=\"PC Surveillance System\""],"PHOREAL":["misp-galaxy:malpedia=\"PHOREAL\"","misp-galaxy:mitre-enterprise-attack-malware=\"PHOREAL - S0158\"","misp-galaxy:mitre-malware=\"PHOREAL - S0158\""],"Rizzo":["misp-galaxy:malpedia=\"PHOREAL\""],"PLAINTEE":["misp-galaxy:malpedia=\"PLAINTEE\"","misp-galaxy:mitre-malware=\"PLAINTEE - S0254\"","misp-galaxy:tool=\"PLAINTEE\""],"PLEAD":["misp-galaxy:malpedia=\"PLEAD\"","misp-galaxy:tool=\"PLEAD\""],"TSCookie":["misp-galaxy:malpedia=\"PLEAD\"","misp-galaxy:tool=\"TSCookie\""],"POSHSPY":["misp-galaxy:malpedia=\"POSHSPY\"","misp-galaxy:mitre-enterprise-attack-malware=\"POSHSPY - S0150\"","misp-galaxy:mitre-malware=\"POSHSPY - S0150\""],"POWERPIPE":["misp-galaxy:malpedia=\"POWERPIPE\""],"POWERSOURCE":["misp-galaxy:malpedia=\"POWERSOURCE\"","misp-galaxy:mitre-enterprise-attack-malware=\"POWERSOURCE - S0145\"","misp-galaxy:mitre-malware=\"POWERSOURCE - S0145\""],"POWERSTATS":["misp-galaxy:malpedia=\"POWERSTATS\"","misp-galaxy:mitre-enterprise-attack-malware=\"POWERSTATS - S0223\"","misp-galaxy:mitre-malware=\"POWERSTATS - S0223\""],"Valyria":["misp-galaxy:malpedia=\"POWERSTATS\""],"POWRUNER":["misp-galaxy:malpedia=\"POWRUNER\"","misp-galaxy:mitre-enterprise-attack-malware=\"POWRUNER - S0184\"","misp-galaxy:mitre-malware=\"POWRUNER - S0184\""],"PadCrypt":["misp-galaxy:malpedia=\"PadCrypt\"","misp-galaxy:ransomware=\"PadCrypt\""],"PandaBanker":["misp-galaxy:malpedia=\"PandaBanker\""],"ZeusPanda":["misp-galaxy:malpedia=\"PandaBanker\""],"Patcher":["misp-galaxy:malpedia=\"Patcher\"","misp-galaxy:ransomware=\"FileCoder\"","misp-galaxy:ransomware=\"Patcher\""],"FileCoder":["misp-galaxy:malpedia=\"Patcher\"","misp-galaxy:ransomware=\"FileCoder\""],"Findzip":["misp-galaxy:malpedia=\"Patcher\""],"Peepy RAT":["misp-galaxy:malpedia=\"Peepy RAT\""],"Penco":["misp-galaxy:malpedia=\"Penco\""],"Penquin Turla":["misp-galaxy:malpedia=\"Penquin Turla\""],"PerlBot":["misp-galaxy:malpedia=\"PerlBot\""],"DDoS Perl IrcBot":["misp-galaxy:malpedia=\"PerlBot\""],"ShellBot":["misp-galaxy:malpedia=\"PerlBot\""],"PetrWrap":["misp-galaxy:malpedia=\"PetrWrap\""],"Petya":["misp-galaxy:malpedia=\"Petya\"","misp-galaxy:ransomware=\"Petya\""],"PhanDoor":["misp-galaxy:malpedia=\"PhanDoor\""],"Philadephia Ransom":["misp-galaxy:malpedia=\"Philadephia Ransom\""],"Phorpiex":["misp-galaxy:malpedia=\"Phorpiex\""],"Trik":["misp-galaxy:malpedia=\"Phorpiex\""],"PintSized":["misp-galaxy:malpedia=\"PintSized\""],"Pirrit":["misp-galaxy:malpedia=\"Pirrit\""],"Pitou":["misp-galaxy:malpedia=\"Pitou\""],"PittyTiger RAT":["misp-galaxy:malpedia=\"PittyTiger RAT\""],"Pkybot":["misp-galaxy:malpedia=\"Pkybot\""],"Bublik":["misp-galaxy:malpedia=\"Pkybot\""],"Pykbot":["misp-galaxy:malpedia=\"Pkybot\""],"TBag":["misp-galaxy:malpedia=\"Pkybot\""],"Plexor":["misp-galaxy:malpedia=\"Plexor\"","misp-galaxy:tool=\"Plexor\""],"Ploutus ATM":["misp-galaxy:malpedia=\"Ploutus ATM\""],"PlugX":["misp-galaxy:malpedia=\"PlugX\"","misp-galaxy:mitre-enterprise-attack-malware=\"PlugX - S0013\"","misp-galaxy:mitre-malware=\"PlugX - S0013\"","misp-galaxy:rat=\"PlugX\"","misp-galaxy:tool=\"PlugX\""],"Korplug":["misp-galaxy:malpedia=\"PlugX\"","misp-galaxy:mitre-enterprise-attack-malware=\"PlugX - S0013\"","misp-galaxy:mitre-malware=\"PlugX - S0013\"","misp-galaxy:rat=\"PlugX\"","misp-galaxy:tool=\"PlugX\""],"Poison Ivy":["misp-galaxy:malpedia=\"Poison Ivy\"","misp-galaxy:mitre-enterprise-attack-malware=\"PoisonIvy - S0012\"","misp-galaxy:mitre-malware=\"PoisonIvy - S0012\"","misp-galaxy:rat=\"PoisonIvy\"","misp-galaxy:tool=\"Poison Ivy\""],"pivy":["misp-galaxy:malpedia=\"Poison Ivy\""],"poisonivy":["misp-galaxy:malpedia=\"Poison Ivy\"","misp-galaxy:tool=\"poisonivy\""],"Polyglot":["misp-galaxy:malpedia=\"Polyglot\"","misp-galaxy:ransomware=\"Polyglot\""],"Pony":["misp-galaxy:malpedia=\"Pony\"","misp-galaxy:tool=\"Hancitor\""],"Fareit":["misp-galaxy:malpedia=\"Pony\"","misp-galaxy:tool=\"Fareit\""],"Siplog":["misp-galaxy:malpedia=\"Pony\""],"PoohMilk Loader":["misp-galaxy:malpedia=\"PoohMilk Loader\""],"Popcorn Time":["misp-galaxy:malpedia=\"Popcorn Time\""],"PoshC2":["misp-galaxy:malpedia=\"PoshC2\"","misp-galaxy:mitre-tool=\"PoshC2 - S0378\""],"Poweliks Dropper":["misp-galaxy:malpedia=\"Poweliks Dropper\""],"PowerDuke":["misp-galaxy:malpedia=\"PowerDuke\"","misp-galaxy:mitre-enterprise-attack-malware=\"PowerDuke - S0139\"","misp-galaxy:mitre-malware=\"PowerDuke - S0139\""],"PowerPool":["misp-galaxy:malpedia=\"PowerPool\"","misp-galaxy:threat-actor=\"PowerPool\""],"PowerRatankba":["misp-galaxy:malpedia=\"PowerRatankba\"","misp-galaxy:tool=\"PowerRatankba\""],"PowerSpritz":["misp-galaxy:malpedia=\"PowerSpritz\"","misp-galaxy:tool=\"PowerSpritz\""],"PowerWare":["misp-galaxy:malpedia=\"PowerWare\"","misp-galaxy:ransomware=\"PowerWare\""],"Powersniff":["misp-galaxy:malpedia=\"Powersniff\""],"Powmet":["misp-galaxy:malpedia=\"Powmet\""],"Predator The Thief":["misp-galaxy:malpedia=\"Predator The Thief\""],"Premier RAT":["misp-galaxy:malpedia=\"Premier RAT\""],"PresFox":["misp-galaxy:malpedia=\"PresFox\""],"Prikorma":["misp-galaxy:malpedia=\"Prikorma\""],"Prilex":["misp-galaxy:malpedia=\"Prilex\""],"PrincessLocker":["misp-galaxy:malpedia=\"PrincessLocker\""],"Project Alice":["misp-galaxy:malpedia=\"Project Alice\""],"AliceATM":["misp-galaxy:malpedia=\"Project Alice\""],"PrAlice":["misp-galaxy:malpedia=\"Project Alice\""],"Proton RAT":["misp-galaxy:malpedia=\"Proton RAT\""],"Calisto":["misp-galaxy:malpedia=\"Proton RAT\"","misp-galaxy:mitre-malware=\"Calisto - S0274\""],"PsiX":["misp-galaxy:malpedia=\"PsiX\""],"Pteranodon":["misp-galaxy:malpedia=\"Pteranodon\"","misp-galaxy:mitre-enterprise-attack-malware=\"Pteranodon - S0147\"","misp-galaxy:mitre-malware=\"Pteranodon - S0147\""],"PubNubRAT":["misp-galaxy:malpedia=\"PubNubRAT\""],"Punkey POS":["misp-galaxy:malpedia=\"Punkey POS\""],"Putabmow":["misp-galaxy:malpedia=\"Putabmow\""],"PvzOut":["misp-galaxy:malpedia=\"PvzOut\""],"Pwnet":["misp-galaxy:malpedia=\"Pwnet\"","misp-galaxy:tool=\"Pwnet\""],"PyLocky":["misp-galaxy:malpedia=\"PyLocky\""],"Locky Locker":["misp-galaxy:malpedia=\"PyLocky\""],"Pykspa":["misp-galaxy:malpedia=\"Pykspa\""],"QHost":["misp-galaxy:malpedia=\"QHost\""],"Tolouge":["misp-galaxy:malpedia=\"QHost\""],"QRat":["misp-galaxy:malpedia=\"QRat\""],"Quaverse RAT":["misp-galaxy:malpedia=\"QRat\""],"QUADAGENT":["misp-galaxy:malpedia=\"QUADAGENT\"","misp-galaxy:mitre-malware=\"QUADAGENT - S0269\""],"Qaccel":["misp-galaxy:malpedia=\"Qaccel\""],"QakBot":["misp-galaxy:malpedia=\"QakBot\""],"Qbot":["misp-galaxy:malpedia=\"QakBot\"","misp-galaxy:tool=\"Akbot\""],"Qarallax RAT":["misp-galaxy:malpedia=\"Qarallax RAT\""],"Qealler":["misp-galaxy:malpedia=\"Qealler\""],"QtBot":["misp-galaxy:malpedia=\"QtBot\""],"qtproject":["misp-galaxy:malpedia=\"QtBot\""],"Quant Loader":["misp-galaxy:malpedia=\"Quant Loader\"","misp-galaxy:tool=\"Quant Loader\""],"Quasar RAT":["misp-galaxy:malpedia=\"Quasar RAT\"","misp-galaxy:rat=\"Quasar RAT\""],"Qulab":["misp-galaxy:malpedia=\"Qulab\""],"RCS":["misp-galaxy:malpedia=\"RCS\""],"Remote Control System":["misp-galaxy:malpedia=\"RCS\""],"RGDoor":["misp-galaxy:malpedia=\"RGDoor\"","misp-galaxy:mitre-malware=\"RGDoor - S0258\""],"RMS":["misp-galaxy:malpedia=\"RMS\""],"Remote Manipulator System":["misp-galaxy:malpedia=\"RMS\""],"RTM":["misp-galaxy:malpedia=\"RTM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"RTM - G0048\"","misp-galaxy:mitre-enterprise-attack-malware=\"RTM - S0148\"","misp-galaxy:mitre-intrusion-set=\"RTM - G0048\"","misp-galaxy:mitre-malware=\"RTM - S0148\"","misp-galaxy:threat-actor=\"RTM\""],"RadRAT":["misp-galaxy:malpedia=\"RadRAT\"","misp-galaxy:rat=\"RadRAT\""],"Radamant":["misp-galaxy:malpedia=\"Radamant\"","misp-galaxy:ransomware=\"Radamant\""],"Rakhni":["misp-galaxy:malpedia=\"Rakhni\"","misp-galaxy:ransomware=\"Bandarchor\"","misp-galaxy:ransomware=\"Rakhni\""],"Rakos":["misp-galaxy:malpedia=\"Rakos\""],"Rambo":["misp-galaxy:malpedia=\"Rambo\""],"brebsd":["misp-galaxy:malpedia=\"Rambo\""],"Ramdo":["misp-galaxy:malpedia=\"Ramdo\""],"Ranscam":["misp-galaxy:malpedia=\"Ranscam\"","misp-galaxy:ransomware=\"CryptoFinancial\""],"Ransoc":["misp-galaxy:malpedia=\"Ransoc\"","misp-galaxy:ransomware=\"Ransoc\""],"Ransomlock":["misp-galaxy:malpedia=\"Ransomlock\""],"WinLock":["misp-galaxy:malpedia=\"Ransomlock\""],"Rapid Ransom":["misp-galaxy:malpedia=\"Rapid Ransom\""],"RapidStealer":["misp-galaxy:malpedia=\"RapidStealer\""],"Rarog":["misp-galaxy:malpedia=\"Rarog\""],"RatabankaPOS":["misp-galaxy:malpedia=\"RatabankaPOS\""],"Ratty":["misp-galaxy:malpedia=\"Ratty\"","misp-galaxy:rat=\"Ratty\""],"RawPOS":["misp-galaxy:malpedia=\"RawPOS\"","misp-galaxy:mitre-enterprise-attack-malware=\"RawPOS - S0169\"","misp-galaxy:mitre-malware=\"RawPOS - S0169\""],"Raxir":["misp-galaxy:malpedia=\"Raxir\""],"Reaver":["misp-galaxy:malpedia=\"Reaver\"","misp-galaxy:mitre-enterprise-attack-malware=\"Reaver - S0172\"","misp-galaxy:mitre-malware=\"Reaver - S0172\"","misp-galaxy:tool=\"Reaver\""],"Red Alert":["misp-galaxy:malpedia=\"Red Alert\"","misp-galaxy:ransomware=\"Red Alert\""],"Red Gambler":["misp-galaxy:malpedia=\"Red Gambler\""],"RedAlpha":["misp-galaxy:malpedia=\"RedAlpha\"","misp-galaxy:threat-actor=\"RedAlpha\""],"RedLeaves":["misp-galaxy:malpedia=\"RedLeaves\"","misp-galaxy:mitre-enterprise-attack-malware=\"RedLeaves - S0153\"","misp-galaxy:mitre-malware=\"RedLeaves - S0153\"","misp-galaxy:rat=\"RedLeaves\""],"Redaman":["misp-galaxy:malpedia=\"Redaman\""],"Redyms":["misp-galaxy:malpedia=\"Redyms\""],"Regin":["misp-galaxy:malpedia=\"Regin\"","misp-galaxy:mitre-enterprise-attack-malware=\"Regin - S0019\"","misp-galaxy:mitre-malware=\"Regin - S0019\"","misp-galaxy:tool=\"Regin\""],"Remcos":["misp-galaxy:malpedia=\"Remcos\"","misp-galaxy:mitre-tool=\"Remcos - S0332\"","misp-galaxy:rat=\"Remcos\""],"Remexi":["misp-galaxy:malpedia=\"Remexi\"","misp-galaxy:mitre-malware=\"Remexi - S0375\""],"Remsec":["misp-galaxy:malpedia=\"Remsec\"","misp-galaxy:mitre-enterprise-attack-malware=\"Remsec - S0125\"","misp-galaxy:mitre-malware=\"Remsec - S0125\""],"Remy":["misp-galaxy:malpedia=\"Remy\""],"Rerdom":["misp-galaxy:malpedia=\"Rerdom\""],"Retadup":["misp-galaxy:malpedia=\"Retadup\""],"Retefe (Android)":["misp-galaxy:malpedia=\"Retefe (Android)\""],"Retefe (Windows)":["misp-galaxy:malpedia=\"Retefe (Windows)\""],"Revenge RAT":["misp-galaxy:malpedia=\"Revenge RAT\""],"Revetrat":["misp-galaxy:malpedia=\"Revenge RAT\""],"Rex":["misp-galaxy:malpedia=\"Rex\""],"Rietspoof":["misp-galaxy:malpedia=\"Rietspoof\""],"Rifdoor":["misp-galaxy:malpedia=\"Rifdoor\""],"Rikamanu":["misp-galaxy:malpedia=\"Rikamanu\""],"Rincux":["misp-galaxy:malpedia=\"Rincux\""],"Ripper ATM":["misp-galaxy:malpedia=\"Ripper ATM\""],"Roaming Mantis":["misp-galaxy:malpedia=\"Roaming Mantis\"","misp-galaxy:threat-actor=\"Roaming Mantis\"","misp-galaxy:tool=\"Roaming Mantis\""],"Rockloader":["misp-galaxy:malpedia=\"Rockloader\""],"Rofin":["misp-galaxy:malpedia=\"Rofin\""],"RogueRobin":["misp-galaxy:malpedia=\"RogueRobin\"","misp-galaxy:mitre-malware=\"RogueRobin - S0270\""],"RogueRobinNET":["misp-galaxy:malpedia=\"RogueRobinNET\""],"RokRAT":["misp-galaxy:malpedia=\"RokRAT\""],"Rokku":["misp-galaxy:malpedia=\"Rokku\"","misp-galaxy:ransomware=\"Rokku\""],"Rombertik":["misp-galaxy:malpedia=\"Rombertik\""],"CarbonGrabber":["misp-galaxy:malpedia=\"Rombertik\""],"Romeo(Alfa,Bravo, ...)":["misp-galaxy:malpedia=\"Romeo(Alfa,Bravo, ...)\""],"Roopirs":["misp-galaxy:malpedia=\"Roopirs\""],"Roseam":["misp-galaxy:malpedia=\"Roseam\""],"RotorCrypt":["misp-galaxy:malpedia=\"RotorCrypt\"","misp-galaxy:ransomware=\"RotorCrypt(RotoCrypt, Tar) Ransomware\""],"RotoCrypt":["misp-galaxy:malpedia=\"RotorCrypt\"","misp-galaxy:ransomware=\"RotorCrypt(RotoCrypt, Tar) Ransomware\""],"Rotor":["misp-galaxy:malpedia=\"RotorCrypt\"","misp-galaxy:ransomware=\"Rakhni\""],"Rover":["misp-galaxy:malpedia=\"Rover\"","misp-galaxy:mitre-enterprise-attack-malware=\"Rover - S0090\"","misp-galaxy:mitre-malware=\"Rover - S0090\""],"Rovnix":["misp-galaxy:malpedia=\"Rovnix\"","misp-galaxy:tool=\"Rovnix\""],"BkLoader":["misp-galaxy:malpedia=\"Rovnix\""],"Cidox":["misp-galaxy:malpedia=\"Rovnix\""],"Mayachok":["misp-galaxy:malpedia=\"Rovnix\""],"Royal DNS":["misp-galaxy:malpedia=\"Royal DNS\""],"RoyalCli":["misp-galaxy:malpedia=\"RoyalCli\"","misp-galaxy:tool=\"RoyalCli\""],"Rozena":["misp-galaxy:malpedia=\"Rozena\""],"Ruckguv":["misp-galaxy:malpedia=\"Ruckguv\"","misp-galaxy:tool=\"Ruckguv\""],"Rumish":["misp-galaxy:malpedia=\"Rumish\""],"Rurktar":["misp-galaxy:malpedia=\"Rurktar\"","misp-galaxy:rat=\"Rurktar\""],"RCSU":["misp-galaxy:malpedia=\"Rurktar\""],"Ryuk":["misp-galaxy:malpedia=\"Ryuk\""],"SAGE":["misp-galaxy:malpedia=\"SAGE\""],"Saga":["misp-galaxy:malpedia=\"SAGE\""],"SHAPESHIFT":["misp-galaxy:malpedia=\"SHAPESHIFT\""],"SHARPKNOT":["misp-galaxy:malpedia=\"SHARPKNOT\"","misp-galaxy:tool=\"SHARPKNOT\""],"Bitrep":["misp-galaxy:malpedia=\"SHARPKNOT\""],"SHIPSHAPE":["misp-galaxy:malpedia=\"SHIPSHAPE\"","misp-galaxy:mitre-enterprise-attack-malware=\"SHIPSHAPE - S0028\"","misp-galaxy:mitre-malware=\"SHIPSHAPE - S0028\""],"SMSspy":["misp-galaxy:malpedia=\"SMSspy\""],"SNEEPY":["misp-galaxy:malpedia=\"SNEEPY\""],"ByeByeShell":["misp-galaxy:malpedia=\"SNEEPY\""],"SNS Locker":["misp-galaxy:malpedia=\"SNS Locker\""],"SOUNDBITE":["misp-galaxy:malpedia=\"SOUNDBITE\"","misp-galaxy:mitre-enterprise-attack-malware=\"SOUNDBITE - S0157\"","misp-galaxy:mitre-malware=\"SOUNDBITE - S0157\""],"denis":["misp-galaxy:malpedia=\"SOUNDBITE\""],"SPACESHIP":["misp-galaxy:malpedia=\"SPACESHIP\"","misp-galaxy:mitre-enterprise-attack-malware=\"SPACESHIP - S0035\"","misp-galaxy:mitre-malware=\"SPACESHIP - S0035\""],"SQLRat":["misp-galaxy:malpedia=\"SQLRat\""],"SSHDoor":["misp-galaxy:malpedia=\"SSHDoor\"","misp-galaxy:tool=\"SSHDoor\""],"STOP Ransomware":["misp-galaxy:malpedia=\"STOP Ransomware\"","misp-galaxy:ransomware=\"STOP Ransomware\""],"Djvu":["misp-galaxy:malpedia=\"STOP Ransomware\"","misp-galaxy:ransomware=\"Djvu\""],"Sakula RAT":["misp-galaxy:malpedia=\"Sakula RAT\""],"Sakurel":["misp-galaxy:malpedia=\"Sakula RAT\"","misp-galaxy:mitre-enterprise-attack-malware=\"Sakula - S0074\"","misp-galaxy:mitre-malware=\"Sakula - S0074\"","misp-galaxy:rat=\"Sakula\"","misp-galaxy:tool=\"Sakula\""],"Salgorea":["misp-galaxy:malpedia=\"Salgorea\""],"SamSam":["misp-galaxy:malpedia=\"SamSam\"","misp-galaxy:mitre-malware=\"SamSam - S0370\"","misp-galaxy:ransomware=\"Samas-Samsam\""],"Sanny":["misp-galaxy:malpedia=\"Sanny\""],"Daws":["misp-galaxy:malpedia=\"Sanny\""],"Saphyra":["misp-galaxy:malpedia=\"Saphyra\""],"SappyCache":["misp-galaxy:malpedia=\"SappyCache\""],"Sarhust":["misp-galaxy:malpedia=\"Sarhust\""],"Hussarini":["misp-galaxy:malpedia=\"Sarhust\""],"Satan Ransomware":["misp-galaxy:malpedia=\"Satan Ransomware\"","misp-galaxy:ransomware=\"Satan Ransomware\""],"DBGer":["misp-galaxy:malpedia=\"Satan Ransomware\""],"Lucky Ransomware":["misp-galaxy:malpedia=\"Satan Ransomware\"","misp-galaxy:ransomware=\"Lucky Ransomware\""],"Satana":["misp-galaxy:malpedia=\"Satana\"","misp-galaxy:ransomware=\"Satana\""],"Sathurbot":["misp-galaxy:malpedia=\"Sathurbot\"","misp-galaxy:tool=\"Sathurbot\""],"Sauron Locker":["misp-galaxy:malpedia=\"Sauron Locker\""],"ScanPOS":["misp-galaxy:malpedia=\"ScanPOS\""],"Schneiken":["misp-galaxy:malpedia=\"Schneiken\""],"Scote":["misp-galaxy:malpedia=\"Scote\""],"ScreenLocker":["misp-galaxy:malpedia=\"ScreenLocker\""],"SeDll":["misp-galaxy:malpedia=\"SeDll\""],"SeaDaddy":["misp-galaxy:malpedia=\"SeaDaddy\"","misp-galaxy:mitre-enterprise-attack-malware=\"SeaDuke - S0053\"","misp-galaxy:mitre-malware=\"SeaDuke - S0053\""],"SeaSalt":["misp-galaxy:malpedia=\"SeaSalt\""],"Sedreco":["misp-galaxy:malpedia=\"Sedreco\"","misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:tool=\"EVILTOSS\""],"azzy":["misp-galaxy:malpedia=\"Sedreco\""],"eviltoss":["misp-galaxy:malpedia=\"Sedreco\""],"Seduploader":["misp-galaxy:malpedia=\"Seduploader\"","misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\"","misp-galaxy:tool=\"GAMEFISH\""],"carberplike":["misp-galaxy:malpedia=\"Seduploader\""],"downrage":["misp-galaxy:malpedia=\"Seduploader\""],"jhuhugit":["misp-galaxy:malpedia=\"Seduploader\""],"jkeyskw":["misp-galaxy:malpedia=\"Seduploader\""],"SendSafe":["misp-galaxy:malpedia=\"SendSafe\""],"Serpico":["misp-galaxy:malpedia=\"Serpico\"","misp-galaxy:ransomware=\"Serpico\""],"ShadowPad":["misp-galaxy:malpedia=\"ShadowPad\"","misp-galaxy:tool=\"ShadowPad\""],"XShellGhost":["misp-galaxy:malpedia=\"ShadowPad\""],"Shakti":["misp-galaxy:malpedia=\"Shakti\""],"ShellBind":["misp-galaxy:malpedia=\"ShellBind\""],"ShellLocker":["misp-galaxy:malpedia=\"ShellLocker\""],"Shifu":["misp-galaxy:malpedia=\"Shifu\"","misp-galaxy:tool=\"Shifu\""],"Shim RAT":["misp-galaxy:malpedia=\"Shim RAT\""],"Shishiga":["misp-galaxy:malpedia=\"Shishiga\""],"Shujin":["misp-galaxy:malpedia=\"Shujin\"","misp-galaxy:ransomware=\"Shujin\""],"Shurl0ckr":["misp-galaxy:malpedia=\"Shurl0ckr\""],"Shylock":["misp-galaxy:malpedia=\"Shylock\""],"Caphaw":["misp-galaxy:malpedia=\"Shylock\""],"SideWinder":["misp-galaxy:malpedia=\"SideWinder\""],"Sierra(Alfa,Bravo, ...)":["misp-galaxy:malpedia=\"Sierra(Alfa,Bravo, ...)\""],"Destover":["misp-galaxy:malpedia=\"Sierra(Alfa,Bravo, ...)\""],"Siggen6":["misp-galaxy:malpedia=\"Siggen6\""],"Silence DDoS":["misp-galaxy:malpedia=\"Silence DDoS\""],"Silence":["misp-galaxy:malpedia=\"Silence\"","misp-galaxy:threat-actor=\"Silence group\"","misp-galaxy:tool=\"Silence\""],"TrueBot":["misp-galaxy:malpedia=\"Silence\""],"Silon":["misp-galaxy:malpedia=\"Silon\""],"Siluhdur":["misp-galaxy:malpedia=\"Siluhdur\""],"iBank":["misp-galaxy:malpedia=\"Simda\""],"Mebroot":["misp-galaxy:malpedia=\"Sinowal\""],"Quarian":["misp-galaxy:malpedia=\"Sinowal\""],"Theola":["misp-galaxy:malpedia=\"Sinowal\""],"Sisfader":["misp-galaxy:malpedia=\"Sisfader\"","misp-galaxy:rat=\"Sisfader\""],"Skarab Ransom":["misp-galaxy:malpedia=\"Skarab Ransom\""],"Skyplex":["misp-galaxy:malpedia=\"Skyplex\""],"Slave":["misp-galaxy:malpedia=\"Slave\""],"Slempo":["misp-galaxy:malpedia=\"Slempo\"","misp-galaxy:tool=\"Slempo\""],"Slingshot":["misp-galaxy:malpedia=\"Slingshot\"","misp-galaxy:threat-actor=\"Slingshot\""],"Slocker":["misp-galaxy:malpedia=\"Slocker\""],"SmokeLoader":["misp-galaxy:malpedia=\"SmokeLoader\"","misp-galaxy:tool=\"Smoke Loader\""],"Dofoil":["misp-galaxy:malpedia=\"SmokeLoader\"","misp-galaxy:mitre-enterprise-attack-malware=\"Smoke Loader - S0226\"","misp-galaxy:mitre-malware=\"Smoke Loader - S0226\""],"Smrss32 Ransomware":["misp-galaxy:malpedia=\"Smrss32 Ransomware\""],"SnatchLoader":["misp-galaxy:malpedia=\"SnatchLoader\""],"Snojan":["misp-galaxy:malpedia=\"Snojan\""],"Sobaken":["misp-galaxy:malpedia=\"Sobaken\""],"Socks5 Systemz":["misp-galaxy:malpedia=\"Socks5 Systemz\""],"SocksBot":["misp-galaxy:malpedia=\"SocksBot\""],"BIRDDOG":["misp-galaxy:malpedia=\"SocksBot\""],"Nadrac":["misp-galaxy:malpedia=\"SocksBot\""],"Solarbot":["misp-galaxy:malpedia=\"Solarbot\""],"Napolar":["misp-galaxy:malpedia=\"Solarbot\""],"Sorgu":["misp-galaxy:malpedia=\"Sorgu\""],"Spamtorte":["misp-galaxy:malpedia=\"Spamtorte\""],"SpeakUp":["misp-galaxy:malpedia=\"SpeakUp\"","misp-galaxy:mitre-malware=\"SpeakUp - S0374\""],"Spedear":["misp-galaxy:malpedia=\"Spedear\""],"Spora":["misp-galaxy:malpedia=\"Spora\""],"SpyBot":["misp-galaxy:malpedia=\"SpyBot\""],"SpyNote":["misp-galaxy:malpedia=\"SpyNote\"","misp-galaxy:rat=\"SpyNote\""],"SquirtDanger":["misp-galaxy:malpedia=\"SquirtDanger\""],"SslMM":["misp-galaxy:malpedia=\"SslMM\"","misp-galaxy:mitre-enterprise-attack-malware=\"SslMM - S0058\"","misp-galaxy:mitre-malware=\"SslMM - S0058\""],"Stabuniq":["misp-galaxy:malpedia=\"Stabuniq\""],"Stampedo":["misp-galaxy:malpedia=\"Stampedo\""],"Stantinko":["misp-galaxy:malpedia=\"Stantinko\""],"StarCruft":["misp-galaxy:malpedia=\"StarCruft\"","misp-galaxy:threat-actor=\"APT37\""],"StarLoader":["misp-galaxy:malpedia=\"StarLoader\""],"StarsyPound":["misp-galaxy:malpedia=\"StarsyPound\""],"StartPage":["misp-galaxy:malpedia=\"StartPage\""],"Easy Television Access Now":["misp-galaxy:malpedia=\"StartPage\""],"Stealth Mango":["misp-galaxy:malpedia=\"Stealth Mango\"","misp-galaxy:mitre-malware=\"Stealth Mango - S0328\""],"StealthAgent":["misp-galaxy:malpedia=\"StealthAgent\""],"StealthWorker Go":["misp-galaxy:malpedia=\"StealthWorker Go\""],"StegoLoader":["misp-galaxy:malpedia=\"StegoLoader\""],"Stinger":["misp-galaxy:malpedia=\"Stinger\""],"Stration":["misp-galaxy:malpedia=\"Stration\""],"Stresspaint":["misp-galaxy:malpedia=\"Stresspaint\""],"StrongPity":["misp-galaxy:malpedia=\"StrongPity\"","misp-galaxy:threat-actor=\"PROMETHIUM\""],"Stuxnet":["misp-galaxy:malpedia=\"Stuxnet\"","misp-galaxy:tool=\"Stuxnet\""],"SunOrcal":["misp-galaxy:malpedia=\"SunOrcal\"","misp-galaxy:tool=\"SunOrcal\""],"Sunless":["misp-galaxy:malpedia=\"Sunless\""],"SuppoBox":["misp-galaxy:malpedia=\"SuppoBox\""],"Bayrob":["misp-galaxy:malpedia=\"SuppoBox\""],"Nivdort":["misp-galaxy:malpedia=\"SuppoBox\""],"SupremeBot":["misp-galaxy:malpedia=\"SupremeBot\""],"BlazeBot":["misp-galaxy:malpedia=\"SupremeBot\""],"Swift?":["misp-galaxy:malpedia=\"Swift?\""],"Sword":["misp-galaxy:malpedia=\"Sword\""],"SynAck":["misp-galaxy:malpedia=\"SynAck\"","misp-galaxy:mitre-malware=\"SynAck - S0242\"","misp-galaxy:ransomware=\"SynAck\""],"SynFlooder":["misp-galaxy:malpedia=\"SynFlooder\""],"SyncCrypt":["misp-galaxy:malpedia=\"SyncCrypt\"","misp-galaxy:ransomware=\"SyncCrypt\""],"Synth Loader":["misp-galaxy:malpedia=\"Synth Loader\""],"Sys10":["misp-galaxy:malpedia=\"Sys10\"","misp-galaxy:mitre-enterprise-attack-malware=\"Sys10 - S0060\"","misp-galaxy:mitre-malware=\"Sys10 - S0060\""],"SysGet":["misp-galaxy:malpedia=\"SysGet\""],"SysScan":["misp-galaxy:malpedia=\"SysScan\""],"Syscon":["misp-galaxy:malpedia=\"Syscon\""],"Sysraw Stealer":["misp-galaxy:malpedia=\"Sysraw Stealer\""],"Clipsa":["misp-galaxy:malpedia=\"Sysraw Stealer\""],"Szribi":["misp-galaxy:malpedia=\"Szribi\""],"TDTESS":["misp-galaxy:malpedia=\"TDTESS\"","misp-galaxy:mitre-enterprise-attack-malware=\"TDTESS - S0164\"","misp-galaxy:mitre-malware=\"TDTESS - S0164\""],"TURNEDUP":["misp-galaxy:malpedia=\"TURNEDUP\"","misp-galaxy:mitre-enterprise-attack-malware=\"TURNEDUP - S0199\"","misp-galaxy:mitre-malware=\"TURNEDUP - S0199\""],"TabMsgSQL":["misp-galaxy:malpedia=\"TabMsgSQL\""],"TalentRAT":["misp-galaxy:malpedia=\"TalentRAT\""],"Assassin RAT":["misp-galaxy:malpedia=\"TalentRAT\""],"Taleret":["misp-galaxy:malpedia=\"Taleret\""],"Tandfuy":["misp-galaxy:malpedia=\"Tandfuy\""],"Tapaoux":["misp-galaxy:malpedia=\"Tapaoux\"","misp-galaxy:threat-actor=\"DarkHotel\""],"Tarsip":["misp-galaxy:malpedia=\"Tarsip\""],"Tater PrivEsc":["misp-galaxy:malpedia=\"Tater PrivEsc\""],"TeamBot":["misp-galaxy:malpedia=\"TeamBot\""],"FINTEAM":["misp-galaxy:malpedia=\"TeamBot\""],"TefoSteal":["misp-galaxy:malpedia=\"TefoSteal\""],"TeleBot":["misp-galaxy:malpedia=\"TeleBot\""],"TeleDoor":["misp-galaxy:malpedia=\"TeleDoor\""],"TeleRAT":["misp-galaxy:malpedia=\"TeleRAT\""],"Tempedreve":["misp-galaxy:malpedia=\"Tempedreve\""],"TemptingCedar Spyware":["misp-galaxy:malpedia=\"TemptingCedar Spyware\""],"Terminator RAT":["misp-galaxy:malpedia=\"Terminator RAT\""],"Fakem RAT":["misp-galaxy:malpedia=\"Terminator RAT\"","misp-galaxy:tool=\"Fakem RAT\""],"Termite":["misp-galaxy:malpedia=\"Termite\""],"TeslaCrypt":["misp-galaxy:malpedia=\"TeslaCrypt\""],"cryptesla":["misp-galaxy:malpedia=\"TeslaCrypt\""],"Thanatos Ransomware":["misp-galaxy:malpedia=\"Thanatos Ransomware\""],"Thanatos":["misp-galaxy:malpedia=\"Thanatos\"","misp-galaxy:ransomware=\"Thanatos\""],"Alphabot":["misp-galaxy:malpedia=\"Thanatos\""],"ThreeByte":["misp-galaxy:malpedia=\"ThreeByte\""],"ThumbThief":["misp-galaxy:malpedia=\"ThumbThief\""],"ThunderShell":["misp-galaxy:malpedia=\"ThunderShell\""],"Thunker":["misp-galaxy:malpedia=\"Thunker\""],"Tidepool":["misp-galaxy:malpedia=\"Tidepool\""],"Illi":["misp-galaxy:malpedia=\"Tinba\""],"TinyLoader":["misp-galaxy:malpedia=\"TinyLoader\""],"TinyMet":["misp-galaxy:malpedia=\"TinyMet\""],"TiniMet":["misp-galaxy:malpedia=\"TinyMet\""],"TinyTyphon":["misp-galaxy:malpedia=\"TinyTyphon\"","misp-galaxy:tool=\"TinyTyphon\""],"TinyZ":["misp-galaxy:malpedia=\"TinyZ\""],"Catelites Android Bot":["misp-galaxy:malpedia=\"TinyZ\""],"MarsElite Android Bot":["misp-galaxy:malpedia=\"TinyZ\""],"TinyZbot":["misp-galaxy:malpedia=\"TinyZbot\""],"Tiop":["misp-galaxy:malpedia=\"Tiop\""],"Titan":["misp-galaxy:malpedia=\"Titan\""],"TorrentLocker":["misp-galaxy:malpedia=\"TorrentLocker\"","misp-galaxy:ransomware=\"TorrentLocker\""],"TreasureHunter":["misp-galaxy:malpedia=\"TreasureHunter\""],"huntpos":["misp-galaxy:malpedia=\"TreasureHunter\""],"Triada":["misp-galaxy:malpedia=\"Triada\""],"TrickBot":["misp-galaxy:malpedia=\"TrickBot\"","misp-galaxy:mitre-malware=\"TrickBot - S0266\"","misp-galaxy:tool=\"Trick Bot\""],"TheTrick":["misp-galaxy:malpedia=\"TrickBot\""],"TrickLoader":["misp-galaxy:malpedia=\"TrickBot\"","misp-galaxy:tool=\"Trick Bot\""],"Triton":["misp-galaxy:malpedia=\"Triton\""],"HatMan":["misp-galaxy:malpedia=\"Triton\""],"Trisis":["misp-galaxy:malpedia=\"Triton\""],"Trochilus RAT":["misp-galaxy:malpedia=\"Trochilus RAT\""],"Troldesh":["misp-galaxy:malpedia=\"Troldesh\""],"Shade":["misp-galaxy:malpedia=\"Troldesh\""],"Trump Bot":["misp-galaxy:malpedia=\"Trump Bot\""],"Trump Ransom":["misp-galaxy:malpedia=\"Trump Ransom\""],"Tsifiri":["misp-galaxy:malpedia=\"Tsifiri\""],"Tsunami (ELF)":["misp-galaxy:malpedia=\"Tsunami (ELF)\""],"Amnesia":["misp-galaxy:malpedia=\"Tsunami (ELF)\"","misp-galaxy:malpedia=\"Tsunami\""],"Radiation":["misp-galaxy:malpedia=\"Tsunami (ELF)\"","misp-galaxy:malpedia=\"Tsunami\""],"Tsunami (OS X)":["misp-galaxy:malpedia=\"Tsunami (OS X)\""],"Tsunami":["misp-galaxy:malpedia=\"Tsunami\""],"Turla RAT":["misp-galaxy:malpedia=\"Turla RAT\""],"TwoFace":["misp-galaxy:malpedia=\"TwoFace\"","misp-galaxy:tool=\"TwoFace\""],"HyperShell":["misp-galaxy:malpedia=\"TwoFace\""],"Tyupkin":["misp-galaxy:malpedia=\"Tyupkin\""],"UACMe":["misp-galaxy:malpedia=\"UACMe\"","misp-galaxy:mitre-enterprise-attack-tool=\"UACMe - S0116\"","misp-galaxy:mitre-tool=\"UACMe - S0116\""],"Akagi":["misp-galaxy:malpedia=\"UACMe\""],"UDPoS":["misp-galaxy:malpedia=\"UDPoS\""],"UFR Stealer":["misp-galaxy:malpedia=\"UFR Stealer\""],"Usteal":["misp-galaxy:malpedia=\"UFR Stealer\""],"UPAS":["misp-galaxy:malpedia=\"UPAS\""],"Rombrast":["misp-galaxy:malpedia=\"UPAS\""],"Uiwix":["misp-galaxy:malpedia=\"Uiwix\""],"Umbreon":["misp-galaxy:malpedia=\"Umbreon\"","misp-galaxy:mitre-enterprise-attack-malware=\"Umbreon - S0221\"","misp-galaxy:mitre-malware=\"Umbreon - S0221\"","misp-galaxy:tool=\"Umbreon\""],"Espeon":["misp-galaxy:malpedia=\"Umbreon\""],"Unidentified 001":["misp-galaxy:malpedia=\"Unidentified 001\""],"Unidentified 003":["misp-galaxy:malpedia=\"Unidentified 003\""],"Unidentified 006":["misp-galaxy:malpedia=\"Unidentified 006\""],"Unidentified 013 (Korean)":["misp-galaxy:malpedia=\"Unidentified 013 (Korean)\""],"Unidentified 020 (Vault7)":["misp-galaxy:malpedia=\"Unidentified 020 (Vault7)\""],"Unidentified 022 (Ransom)":["misp-galaxy:malpedia=\"Unidentified 022 (Ransom)\""],"Unidentified 023":["misp-galaxy:malpedia=\"Unidentified 023\""],"Unidentified 024 (Ransomware)":["misp-galaxy:malpedia=\"Unidentified 024 (Ransomware)\""],"Unidentified 025 (Clickfraud)":["misp-galaxy:malpedia=\"Unidentified 025 (Clickfraud)\""],"Unidentified 028":["misp-galaxy:malpedia=\"Unidentified 028\""],"Unidentified 029":["misp-galaxy:malpedia=\"Unidentified 029\""],"Unidentified 031":["misp-galaxy:malpedia=\"Unidentified 031\""],"Unidentified 032":["misp-galaxy:malpedia=\"Unidentified 032\""],"Unidentified 033":["misp-galaxy:malpedia=\"Unidentified 033\""],"Unidentified 035":["misp-galaxy:malpedia=\"Unidentified 035\""],"Unidentified 037":["misp-galaxy:malpedia=\"Unidentified 037\""],"Unidentified 038":["misp-galaxy:malpedia=\"Unidentified 038\""],"Unidentified 039":["misp-galaxy:malpedia=\"Unidentified 039\""],"Unidentified 041":["misp-galaxy:malpedia=\"Unidentified 041\""],"Unidentified 042":["misp-galaxy:malpedia=\"Unidentified 042\""],"Unidentified 044":["misp-galaxy:malpedia=\"Unidentified 044\""],"Unidentified 045":["misp-galaxy:malpedia=\"Unidentified 045\""],"Unidentified 046":["misp-galaxy:malpedia=\"Unidentified 046\""],"Unidentified 047":["misp-galaxy:malpedia=\"Unidentified 047\""],"Unidentified 048 (Lazarus?)":["misp-galaxy:malpedia=\"Unidentified 048 (Lazarus?)\""],"Unidentified 049 (Lazarus\/RAT)":["misp-galaxy:malpedia=\"Unidentified 049 (Lazarus\/RAT)\""],"Unidentified 050 (APT32 Profiler)":["misp-galaxy:malpedia=\"Unidentified 050 (APT32 Profiler)\""],"Unidentified 051":["misp-galaxy:malpedia=\"Unidentified 051\""],"Unidentified 052":["misp-galaxy:malpedia=\"Unidentified 052\""],"Unidentified 053 (Wonknu?)":["misp-galaxy:malpedia=\"Unidentified 053 (Wonknu?)\""],"Unidentified 055":["misp-galaxy:malpedia=\"Unidentified 055\""],"Unidentified 057":["misp-galaxy:malpedia=\"Unidentified 057\""],"Unidentified 058":["misp-galaxy:malpedia=\"Unidentified 058\""],"Unidentified APK 001":["misp-galaxy:malpedia=\"Unidentified APK 001\""],"Unidentified APK 002":["misp-galaxy:malpedia=\"Unidentified APK 002\""],"Unidentified ASP 001 (Webshell)":["misp-galaxy:malpedia=\"Unidentified ASP 001 (Webshell)\""],"Unlock92":["misp-galaxy:malpedia=\"Unlock92\""],"Upatre":["misp-galaxy:malpedia=\"Upatre\"","misp-galaxy:tool=\"Upatre\""],"Urausy":["misp-galaxy:malpedia=\"Urausy\""],"UrlZone":["misp-galaxy:malpedia=\"UrlZone\""],"Uroburos (OS X)":["misp-galaxy:malpedia=\"Uroburos (OS X)\""],"Uroburos (Windows)":["misp-galaxy:malpedia=\"Uroburos (Windows)\""],"Snake":["misp-galaxy:malpedia=\"Uroburos (Windows)\"","misp-galaxy:mitre-intrusion-set=\"Turla - G0010\"","misp-galaxy:threat-actor=\"Turla Group\"","misp-galaxy:tool=\"Turla\""],"VMzeus":["misp-galaxy:malpedia=\"VM Zeus\""],"Zberp":["misp-galaxy:malpedia=\"VM Zeus\""],"ZeusVM":["misp-galaxy:malpedia=\"VM Zeus\""],"Catch":["misp-galaxy:malpedia=\"Vawtrak\""],"NeverQuest":["misp-galaxy:malpedia=\"Vawtrak\""],"grabnew":["misp-galaxy:malpedia=\"Vawtrak\""],"VegaLocker":["misp-galaxy:malpedia=\"VegaLocker\""],"Vega":["misp-galaxy:malpedia=\"VegaLocker\""],"Velso Ransomware":["misp-galaxy:malpedia=\"Velso Ransomware\""],"Venus Locker":["misp-galaxy:malpedia=\"Venus Locker\""],"Vermin":["misp-galaxy:malpedia=\"Vermin\""],"Vflooder":["misp-galaxy:malpedia=\"Vflooder\""],"Viper RAT":["misp-galaxy:malpedia=\"Viper RAT\""],"Vobfus":["misp-galaxy:malpedia=\"Vobfus\""],"Volgmer":["misp-galaxy:malpedia=\"Volgmer\"","misp-galaxy:mitre-enterprise-attack-malware=\"Volgmer - S0180\"","misp-galaxy:mitre-malware=\"Volgmer - S0180\"","misp-galaxy:tool=\"Volgmer\""],"FALLCHILL":["misp-galaxy:malpedia=\"Volgmer\"","misp-galaxy:mitre-enterprise-attack-malware=\"FALLCHILL - S0181\"","misp-galaxy:mitre-malware=\"FALLCHILL - S0181\"","misp-galaxy:rat=\"FALLCHILL\""],"Manuscrypt":["misp-galaxy:malpedia=\"Volgmer\""],"Vreikstadi":["misp-galaxy:malpedia=\"Vreikstadi\""],"WMI Ghost":["misp-galaxy:malpedia=\"WMI Ghost\""],"Syndicasec":["misp-galaxy:malpedia=\"WMI Ghost\""],"Wimmie":["misp-galaxy:malpedia=\"WMI Ghost\""],"WMImplant":["misp-galaxy:malpedia=\"WMImplant\""],"WSCSPL":["misp-galaxy:malpedia=\"WSCSPL\""],"WSO":["misp-galaxy:malpedia=\"WSO\""],"Webshell by Orb":["misp-galaxy:malpedia=\"WSO\""],"WallyShack":["misp-galaxy:malpedia=\"WallyShack\""],"WannaCryptor":["misp-galaxy:malpedia=\"WannaCryptor\""],"Wana Decrypt0r":["misp-galaxy:malpedia=\"WannaCryptor\""],"WannaCry":["misp-galaxy:malpedia=\"WannaCryptor\"","misp-galaxy:mitre-malware=\"WannaCry - S0366\"","misp-galaxy:ransomware=\"WannaCry\"","misp-galaxy:ransomware=\"WannaCry\""],"Wcry":["misp-galaxy:malpedia=\"WannaCryptor\""],"WaterMiner":["misp-galaxy:malpedia=\"WaterMiner\""],"WaterSpout":["misp-galaxy:malpedia=\"WaterSpout\""],"WebC2-AdSpace":["misp-galaxy:malpedia=\"WebC2-AdSpace\""],"WebC2-Ausov":["misp-galaxy:malpedia=\"WebC2-Ausov\""],"WebC2-Bolid":["misp-galaxy:malpedia=\"WebC2-Bolid\""],"WebC2-Cson":["misp-galaxy:malpedia=\"WebC2-Cson\""],"WebC2-DIV":["misp-galaxy:malpedia=\"WebC2-DIV\""],"WebC2-GreenCat":["misp-galaxy:malpedia=\"WebC2-GreenCat\""],"WebC2-Head":["misp-galaxy:malpedia=\"WebC2-Head\""],"WebC2-Kt3":["misp-galaxy:malpedia=\"WebC2-Kt3\""],"WebC2-Qbp":["misp-galaxy:malpedia=\"WebC2-Qbp\""],"WebC2-Rave":["misp-galaxy:malpedia=\"WebC2-Rave\""],"WebC2-Table":["misp-galaxy:malpedia=\"WebC2-Table\""],"WebC2-UGX":["misp-galaxy:malpedia=\"WebC2-UGX\""],"WebC2-Yahoo":["misp-galaxy:malpedia=\"WebC2-Yahoo\""],"WebMonitor RAT":["misp-galaxy:malpedia=\"WebMonitor RAT\""],"WildFire":["misp-galaxy:malpedia=\"WildFire\""],"WinMM":["misp-galaxy:malpedia=\"WinMM\"","misp-galaxy:mitre-enterprise-attack-malware=\"WinMM - S0059\"","misp-galaxy:mitre-malware=\"WinMM - S0059\""],"WinPot":["misp-galaxy:malpedia=\"WinPot\""],"ATMPot":["misp-galaxy:malpedia=\"WinPot\""],"WindTail":["misp-galaxy:malpedia=\"WindTail\""],"Winnti (OS X)":["misp-galaxy:malpedia=\"Winnti (OS X)\""],"Winnti (Windows)":["misp-galaxy:malpedia=\"Winnti (Windows)\""],"Winsloader":["misp-galaxy:malpedia=\"Winsloader\""],"Wipbot":["misp-galaxy:malpedia=\"Wipbot\"","misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\"","misp-galaxy:tool=\"Wipbot\""],"WireLurker (OS X)":["misp-galaxy:malpedia=\"WireLurker (OS X)\""],"WireLurker (iOS)":["misp-galaxy:malpedia=\"WireLurker (iOS)\""],"WireX":["misp-galaxy:malpedia=\"WireX\""],"Wirenet (ELF)":["misp-galaxy:malpedia=\"Wirenet (ELF)\""],"Wirenet (OS X)":["misp-galaxy:malpedia=\"Wirenet (OS X)\""],"WndTest":["misp-galaxy:malpedia=\"WndTest\""],"Wonknu":["misp-galaxy:malpedia=\"Wonknu\""],"Woolger":["misp-galaxy:malpedia=\"Woolger\""],"WoolenLogger":["misp-galaxy:malpedia=\"Woolger\""],"X-Agent (Android)":["misp-galaxy:malpedia=\"X-Agent (Android)\""],"Popr-d30":["misp-galaxy:malpedia=\"X-Agent (Android)\""],"X-Agent (ELF)":["misp-galaxy:malpedia=\"X-Agent (ELF)\""],"chopstick":["misp-galaxy:malpedia=\"X-Agent (ELF)\"","misp-galaxy:malpedia=\"X-Agent (Windows)\""],"fysbis":["misp-galaxy:malpedia=\"X-Agent (ELF)\""],"splm":["misp-galaxy:malpedia=\"X-Agent (ELF)\"","misp-galaxy:malpedia=\"X-Agent (Windows)\""],"X-Agent (OS X)":["misp-galaxy:malpedia=\"X-Agent (OS X)\""],"X-Agent (Windows)":["misp-galaxy:malpedia=\"X-Agent (Windows)\""],"X-Tunnel (.NET)":["misp-galaxy:malpedia=\"X-Tunnel (.NET)\""],"X-Tunnel":["misp-galaxy:malpedia=\"X-Tunnel\"","misp-galaxy:mitre-enterprise-attack-malware=\"XTunnel - S0117\"","misp-galaxy:mitre-malware=\"XTunnel - S0117\"","misp-galaxy:tool=\"X-Tunnel\""],"xaps":["misp-galaxy:malpedia=\"X-Tunnel\""],"XBTL":["misp-galaxy:malpedia=\"XBTL\""],"XBot POS":["misp-galaxy:malpedia=\"XBot POS\""],"XLoader":["misp-galaxy:malpedia=\"XLoader\"","misp-galaxy:mitre-malware=\"XLoader - S0318\""],"XOR DDoS":["misp-galaxy:malpedia=\"XOR DDoS\""],"XP PrivEsc (CVE-2014-4076)":["misp-galaxy:malpedia=\"XP PrivEsc (CVE-2014-4076)\""],"XPCTRA":["misp-galaxy:malpedia=\"XPCTRA\""],"Expectra":["misp-galaxy:malpedia=\"XPCTRA\""],"XRat":["misp-galaxy:malpedia=\"XRat\""],"XSLCmd":["misp-galaxy:malpedia=\"XSLCmd\""],"Xaynnalc":["misp-galaxy:malpedia=\"Xaynnalc\""],"Xbash":["misp-galaxy:malpedia=\"Xbash\"","misp-galaxy:mitre-malware=\"Xbash - S0341\"","misp-galaxy:tool=\"Xbash\""],"Xpan":["misp-galaxy:malpedia=\"Xpan\""],"Xtreme RAT":["misp-galaxy:malpedia=\"Xtreme RAT\""],"ExtRat":["misp-galaxy:malpedia=\"Xtreme RAT\""],"Xwo":["misp-galaxy:malpedia=\"Xwo\""],"Yahoyah":["misp-galaxy:malpedia=\"Yahoyah\"","misp-galaxy:tool=\"Yahoyah\""],"YellYouth":["misp-galaxy:malpedia=\"YellYouth\""],"Yort":["misp-galaxy:malpedia=\"Yort\""],"YoungLotus":["misp-galaxy:malpedia=\"YoungLotus\""],"DarkShare":["misp-galaxy:malpedia=\"YoungLotus\""],"ZXShell":["misp-galaxy:malpedia=\"ZXShell\"","misp-galaxy:tool=\"ZXShell\""],"Sensocode":["misp-galaxy:malpedia=\"ZXShell\""],"Zebrocy (AutoIT)":["misp-galaxy:malpedia=\"Zebrocy (AutoIT)\""],"Zebrocy":["misp-galaxy:malpedia=\"Zebrocy\"","misp-galaxy:mitre-malware=\"Zebrocy - S0251\"","misp-galaxy:tool=\"Zebrocy\""],"Zekapab":["misp-galaxy:malpedia=\"Zebrocy\"","misp-galaxy:tool=\"Zebrocy\""],"Zedhou":["misp-galaxy:malpedia=\"Zedhou\""],"Zen":["misp-galaxy:malpedia=\"Zen\""],"ZeroAccess":["misp-galaxy:malpedia=\"ZeroAccess\""],"Max++":["misp-galaxy:malpedia=\"ZeroAccess\""],"Sirefef":["misp-galaxy:malpedia=\"ZeroAccess\"","misp-galaxy:tool=\"Sirefef\""],"Smiscer":["misp-galaxy:malpedia=\"ZeroAccess\""],"ZeroEvil":["misp-galaxy:malpedia=\"ZeroEvil\""],"ZeroT":["misp-galaxy:malpedia=\"ZeroT\"","misp-galaxy:mitre-enterprise-attack-malware=\"ZeroT - S0230\"","misp-galaxy:mitre-malware=\"ZeroT - S0230\"","misp-galaxy:tool=\"ZeroT\""],"Zeus MailSniffer":["misp-galaxy:malpedia=\"Zeus MailSniffer\""],"Zeus OpenSSL":["misp-galaxy:malpedia=\"Zeus OpenSSL\""],"XSphinx":["misp-galaxy:malpedia=\"Zeus OpenSSL\""],"Zezin":["misp-galaxy:malpedia=\"Zezin\""],"ZhCat":["misp-galaxy:malpedia=\"ZhCat\""],"ZhMimikatz":["misp-galaxy:malpedia=\"ZhMimikatz\""],"Zloader":["misp-galaxy:malpedia=\"Zloader\""],"DELoader":["misp-galaxy:malpedia=\"Zloader\""],"Terdot":["misp-galaxy:malpedia=\"Zloader\""],"Zollard":["misp-galaxy:malpedia=\"Zollard\""],"darlloz":["misp-galaxy:malpedia=\"Zollard\""],"ZooPark":["misp-galaxy:malpedia=\"ZooPark\"","misp-galaxy:threat-actor=\"ZooPark\""],"ZoxPNG":["misp-galaxy:malpedia=\"ZoxPNG\""],"gresim":["misp-galaxy:malpedia=\"ZoxPNG\""],"Ztorg":["misp-galaxy:malpedia=\"Ztorg\""],"Qysly":["misp-galaxy:malpedia=\"Ztorg\""],"Zyklon":["misp-galaxy:malpedia=\"Zyklon\"","misp-galaxy:ransomware=\"Zyklon\""],"abantes":["misp-galaxy:malpedia=\"abantes\""],"backspace":["misp-galaxy:malpedia=\"backspace\""],"badflick":["misp-galaxy:malpedia=\"badflick\""],"bangat":["misp-galaxy:malpedia=\"bangat\""],"beendoor":["misp-galaxy:malpedia=\"beendoor\""],"c0d0so0":["misp-galaxy:malpedia=\"c0d0so0\""],"concealment_troy":["misp-galaxy:malpedia=\"concealment_troy\""],"elf.vpnfilter":["misp-galaxy:malpedia=\"elf.vpnfilter\""],"elf.wellmess":["misp-galaxy:malpedia=\"elf.wellmess\""],"ext4":["misp-galaxy:malpedia=\"ext4\""],"gamapos":["misp-galaxy:malpedia=\"gamapos\""],"pios":["misp-galaxy:malpedia=\"gamapos\""],"gcman":["misp-galaxy:malpedia=\"gcman\""],"gsecdump":["misp-galaxy:malpedia=\"gsecdump\"","misp-galaxy:mitre-enterprise-attack-tool=\"gsecdump - S0008\"","misp-galaxy:mitre-tool=\"gsecdump - S0008\""],"himan":["misp-galaxy:malpedia=\"himan\""],"homefry":["misp-galaxy:malpedia=\"homefry\""],"htpRAT":["misp-galaxy:malpedia=\"htpRAT\"","misp-galaxy:rat=\"htpRAT\""],"http_troy":["misp-galaxy:malpedia=\"http_troy\""],"httpdropper":["misp-galaxy:malpedia=\"httpdropper\""],"httpdr0pper":["misp-galaxy:malpedia=\"httpdropper\""],"iMuler":["misp-galaxy:malpedia=\"iMuler\""],"Revir":["misp-galaxy:malpedia=\"iMuler\""],"iSpy Keylogger":["misp-galaxy:malpedia=\"iSpy Keylogger\""],"jRAT":["misp-galaxy:malpedia=\"jRAT\"","misp-galaxy:mitre-malware=\"jRAT - S0283\"","misp-galaxy:rat=\"jRAT\""],"Jacksbot":["misp-galaxy:malpedia=\"jRAT\""],"jSpy":["misp-galaxy:malpedia=\"jSpy\"","misp-galaxy:rat=\"jSpy\""],"magecart":["misp-galaxy:malpedia=\"magecart\""],"mozart":["misp-galaxy:malpedia=\"mozart\""],"murkytop":["misp-galaxy:malpedia=\"murkytop\""],"nRansom":["misp-galaxy:malpedia=\"nRansom\""],"nitlove":["misp-galaxy:malpedia=\"nitlove\""],"owaauth":["misp-galaxy:malpedia=\"owaauth\""],"luckyowa":["misp-galaxy:malpedia=\"owaauth\""],"paladin":["misp-galaxy:malpedia=\"paladin\""],"parasite_http":["misp-galaxy:malpedia=\"parasite_http\""],"pgift":["misp-galaxy:malpedia=\"pgift\""],"ReRol":["misp-galaxy:malpedia=\"pgift\""],"pipcreat":["misp-galaxy:malpedia=\"pipcreat\""],"pirpi":["misp-galaxy:malpedia=\"pirpi\""],"playwork":["misp-galaxy:malpedia=\"playwork\""],"ployx":["misp-galaxy:malpedia=\"ployx\""],"pngdowner":["misp-galaxy:malpedia=\"pngdowner\"","misp-galaxy:mitre-enterprise-attack-malware=\"pngdowner - S0067\"","misp-galaxy:mitre-malware=\"pngdowner - S0067\""],"portless":["misp-galaxy:malpedia=\"portless\""],"poscardstealer":["misp-galaxy:malpedia=\"poscardstealer\""],"powerkatz":["misp-galaxy:malpedia=\"powerkatz\""],"prb_backdoor":["misp-galaxy:malpedia=\"prb_backdoor\""],"pupy (ELF)":["misp-galaxy:malpedia=\"pupy (ELF)\""],"pupy (Python)":["misp-galaxy:malpedia=\"pupy (Python)\""],"pupy (Windows)":["misp-galaxy:malpedia=\"pupy (Windows)\""],"pupy":["misp-galaxy:malpedia=\"pupy\""],"pwnpos":["misp-galaxy:malpedia=\"pwnpos\""],"r2r2":["misp-galaxy:malpedia=\"r2r2\""],"r980":["misp-galaxy:malpedia=\"r980\""],"rarstar":["misp-galaxy:malpedia=\"rarstar\""],"rdasrv":["misp-galaxy:malpedia=\"rdasrv\""],"reGeorg":["misp-galaxy:malpedia=\"reGeorg\"","misp-galaxy:tool=\"reGeorg\""],"rock":["misp-galaxy:malpedia=\"rock\""],"yellowalbatross":["misp-galaxy:malpedia=\"rock\""],"rtpos":["misp-galaxy:malpedia=\"rtpos\""],"running_rat":["misp-galaxy:malpedia=\"running_rat\""],"sLoad":["misp-galaxy:malpedia=\"sLoad\""],"scanbox":["misp-galaxy:malpedia=\"scanbox\""],"shadowhammer":["misp-galaxy:malpedia=\"shadowhammer\""],"shareip":["misp-galaxy:malpedia=\"shareip\""],"remotecmd":["misp-galaxy:malpedia=\"shareip\""],"smac":["misp-galaxy:malpedia=\"smac\""],"speccom":["misp-galaxy:malpedia=\"smac\""],"soraya":["misp-galaxy:malpedia=\"soraya\""],"sykipot":["misp-galaxy:malpedia=\"sykipot\""],"getkys":["misp-galaxy:malpedia=\"sykipot\""],"systemd":["misp-galaxy:malpedia=\"systemd\""],"tDiscoverer":["misp-galaxy:malpedia=\"tDiscoverer\""],"tRat":["misp-galaxy:malpedia=\"tRat\""],"taidoor":["misp-galaxy:malpedia=\"taidoor\""],"simbot":["misp-galaxy:malpedia=\"taidoor\""],"vSkimmer":["misp-galaxy:malpedia=\"vSkimmer\""],"vidar":["misp-galaxy:malpedia=\"vidar\""],"virdetdoor":["misp-galaxy:malpedia=\"virdetdoor\""],"w32times":["misp-galaxy:malpedia=\"w32times\""],"win.spynet_rat":["misp-galaxy:malpedia=\"win.spynet_rat\""],"win.unidentified_005":["misp-galaxy:malpedia=\"win.unidentified_005\""],"witchcoven":["misp-galaxy:malpedia=\"witchcoven\""],"woody":["misp-galaxy:malpedia=\"woody\""],"xsPlus":["misp-galaxy:malpedia=\"xsPlus\""],"nokian":["misp-galaxy:malpedia=\"xsPlus\""],"xxmm":["misp-galaxy:malpedia=\"xxmm\""],"ShadowWalker":["misp-galaxy:malpedia=\"xxmm\""],"yayih":["misp-galaxy:malpedia=\"yayih\""],"aumlib":["misp-galaxy:malpedia=\"yayih\""],"bbsinfo":["misp-galaxy:malpedia=\"yayih\""],"yty":["misp-galaxy:malpedia=\"yty\"","misp-galaxy:mitre-malware=\"yty - S0248\""],"BARIUM":["misp-galaxy:microsoft-activity-group=\"BARIUM\""],"DUBNIUM":["misp-galaxy:microsoft-activity-group=\"DUBNIUM\"","misp-galaxy:threat-actor=\"DarkHotel\""],"darkhotel":["misp-galaxy:microsoft-activity-group=\"DUBNIUM\""],"LEAD":["misp-galaxy:microsoft-activity-group=\"LEAD\""],"NEODYMIUM":["misp-galaxy:microsoft-activity-group=\"NEODYMIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"NEODYMIUM - G0055\"","misp-galaxy:mitre-intrusion-set=\"NEODYMIUM - G0055\"","misp-galaxy:threat-actor=\"NEODYMIUM\""],"PLATINUM":["misp-galaxy:microsoft-activity-group=\"PLATINUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PLATINUM - G0068\"","misp-galaxy:mitre-intrusion-set=\"PLATINUM - G0068\"","misp-galaxy:threat-actor=\"PLATINUM\""],"PROMETHIUM":["misp-galaxy:microsoft-activity-group=\"PROMETHIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PROMETHIUM - G0056\"","misp-galaxy:mitre-intrusion-set=\"PROMETHIUM - G0056\"","misp-galaxy:threat-actor=\"PROMETHIUM\""],"STRONTIUM":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"APT 28":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:threat-actor=\"Sofacy\""],"APT28":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Pawn Storm":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Fancy Bear":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Sednit":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\"","misp-galaxy:tool=\"GAMEFISH\""],"TsarTeam":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:threat-actor=\"Sofacy\""],"TG-4127":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Group-4127":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\"","misp-galaxy:threat-actor=\"Sofacy\""],"Grey-Cloud":["misp-galaxy:microsoft-activity-group=\"STRONTIUM\""],"TERBIUM":["misp-galaxy:microsoft-activity-group=\"TERBIUM\"","misp-galaxy:threat-actor=\"TERBIUM\""],"ZIRCONIUM":["misp-galaxy:microsoft-activity-group=\"ZIRCONIUM\"","misp-galaxy:threat-actor=\"APT31\""],"https:\/\/www.cfr.org\/interactive\/cyber-operations\/mythic-leopard":["misp-galaxy:microsoft-activity-group=\"https:\/\/www.cfr.org\/interactive\/cyber-operations\/mythic-leopard\""],"C-Major":["misp-galaxy:microsoft-activity-group=\"https:\/\/www.cfr.org\/interactive\/cyber-operations\/mythic-leopard\"","misp-galaxy:threat-actor=\"Operation C-Major\""],"Transparent Tribe":["misp-galaxy:microsoft-activity-group=\"https:\/\/www.cfr.org\/interactive\/cyber-operations\/mythic-leopard\"","misp-galaxy:threat-actor=\"Operation C-Major\""],".bash_profile and .bashrc - T1156":["misp-galaxy:mitre-attack-pattern=\".bash_profile and .bashrc - T1156\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\".bash_profile and .bashrc - T1156\""],"Abuse Accessibility Features - T1453":["misp-galaxy:mitre-attack-pattern=\"Abuse Accessibility Features - T1453\""],"Abuse Device Administrator Access to Prevent Removal - T1401":["misp-galaxy:mitre-attack-pattern=\"Abuse Device Administrator Access to Prevent Removal - T1401\""],"Abuse of iOS Enterprise App Signing Key - T1445":["misp-galaxy:mitre-attack-pattern=\"Abuse of iOS Enterprise App Signing Key - T1445\""],"Access Calendar Entries - T1435":["misp-galaxy:mitre-attack-pattern=\"Access Calendar Entries - T1435\""],"Access Call Log - T1433":["misp-galaxy:mitre-attack-pattern=\"Access Call Log - T1433\""],"Access Contact List - T1432":["misp-galaxy:mitre-attack-pattern=\"Access Contact List - T1432\""],"Access Sensitive Data in Device Logs - T1413":["misp-galaxy:mitre-attack-pattern=\"Access Sensitive Data in Device Logs - T1413\""],"Access Sensitive Data or Credentials in Files - T1409":["misp-galaxy:mitre-attack-pattern=\"Access Sensitive Data or Credentials in Files - T1409\""],"Access Token Manipulation - T1134":["misp-galaxy:mitre-attack-pattern=\"Access Token Manipulation - T1134\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Access Token Manipulation - T1134\""],"Accessibility Features - T1015":["misp-galaxy:mitre-attack-pattern=\"Accessibility Features - T1015\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Accessibility Features - T1015\""],"Account Discovery - T1087":["misp-galaxy:mitre-attack-pattern=\"Account Discovery - T1087\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Account Discovery - T1087\""],"Account Manipulation - T1098":["misp-galaxy:mitre-attack-pattern=\"Account Manipulation - T1098\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Account Manipulation - T1098\""],"Acquire OSINT data sets and information - T1247":["misp-galaxy:mitre-attack-pattern=\"Acquire OSINT data sets and information - T1247\""],"Acquire OSINT data sets and information - T1266":["misp-galaxy:mitre-attack-pattern=\"Acquire OSINT data sets and information - T1266\""],"Acquire OSINT data sets and information - T1277":["misp-galaxy:mitre-attack-pattern=\"Acquire OSINT data sets and information - T1277\""],"Acquire and\/or use 3rd party infrastructure services - T1307":["misp-galaxy:mitre-attack-pattern=\"Acquire and\/or use 3rd party infrastructure services - T1307\""],"Acquire and\/or use 3rd party infrastructure services - T1329":["misp-galaxy:mitre-attack-pattern=\"Acquire and\/or use 3rd party infrastructure services - T1329\""],"Acquire and\/or use 3rd party software services - T1308":["misp-galaxy:mitre-attack-pattern=\"Acquire and\/or use 3rd party software services - T1308\""],"Acquire and\/or use 3rd party software services - T1330":["misp-galaxy:mitre-attack-pattern=\"Acquire and\/or use 3rd party software services - T1330\""],"Acquire or compromise 3rd party signing certificates - T1310":["misp-galaxy:mitre-attack-pattern=\"Acquire or compromise 3rd party signing certificates - T1310\""],"Acquire or compromise 3rd party signing certificates - T1332":["misp-galaxy:mitre-attack-pattern=\"Acquire or compromise 3rd party signing certificates - T1332\""],"Aggregate individual's digital footprint - T1275":["misp-galaxy:mitre-attack-pattern=\"Aggregate individual's digital footprint - T1275\""],"Alternate Network Mediums - T1438":["misp-galaxy:mitre-attack-pattern=\"Alternate Network Mediums - T1438\""],"Analyze application security posture - T1293":["misp-galaxy:mitre-attack-pattern=\"Analyze application security posture - T1293\""],"Analyze architecture and configuration posture - T1288":["misp-galaxy:mitre-attack-pattern=\"Analyze architecture and configuration posture - T1288\""],"Analyze business processes - T1301":["misp-galaxy:mitre-attack-pattern=\"Analyze business processes - T1301\""],"Analyze data collected - T1287":["misp-galaxy:mitre-attack-pattern=\"Analyze data collected - T1287\""],"Analyze hardware\/software security defensive capabilities - T1294":["misp-galaxy:mitre-attack-pattern=\"Analyze hardware\/software security defensive capabilities - T1294\""],"Analyze organizational skillsets and deficiencies - T1289":["misp-galaxy:mitre-attack-pattern=\"Analyze organizational skillsets and deficiencies - T1289\""],"Analyze organizational skillsets and deficiencies - T1297":["misp-galaxy:mitre-attack-pattern=\"Analyze organizational skillsets and deficiencies - T1297\""],"Analyze organizational skillsets and deficiencies - T1300":["misp-galaxy:mitre-attack-pattern=\"Analyze organizational skillsets and deficiencies - T1300\""],"Analyze presence of outsourced capabilities - T1303":["misp-galaxy:mitre-attack-pattern=\"Analyze presence of outsourced capabilities - T1303\""],"Analyze social and business relationships, interests, and affiliations - T1295":["misp-galaxy:mitre-attack-pattern=\"Analyze social and business relationships, interests, and affiliations - T1295\""],"Android Intent Hijacking - T1416":["misp-galaxy:mitre-attack-pattern=\"Android Intent Hijacking - T1416\""],"Anonymity services - T1306":["misp-galaxy:mitre-attack-pattern=\"Anonymity services - T1306\""],"App Auto-Start at Device Boot - T1402":["misp-galaxy:mitre-attack-pattern=\"App Auto-Start at Device Boot - T1402\""],"App Delivered via Email Attachment - T1434":["misp-galaxy:mitre-attack-pattern=\"App Delivered via Email Attachment - T1434\""],"App Delivered via Web Download - T1431":["misp-galaxy:mitre-attack-pattern=\"App Delivered via Web Download - T1431\""],"AppCert DLLs - T1182":["misp-galaxy:mitre-attack-pattern=\"AppCert DLLs - T1182\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"AppCert DLLs - T1182\""],"AppInit DLLs - T1103":["misp-galaxy:mitre-attack-pattern=\"AppInit DLLs - T1103\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"AppInit DLLs - T1103\""],"AppleScript - T1155":["misp-galaxy:mitre-attack-pattern=\"AppleScript - T1155\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"AppleScript - T1155\""],"Application Deployment Software - T1017":["misp-galaxy:mitre-attack-pattern=\"Application Deployment Software - T1017\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Application Deployment Software - T1017\""],"Application Discovery - T1418":["misp-galaxy:mitre-attack-pattern=\"Application Discovery - T1418\""],"Application Shimming - T1138":["misp-galaxy:mitre-attack-pattern=\"Application Shimming - T1138\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Application Shimming - T1138\""],"Application Window Discovery - T1010":["misp-galaxy:mitre-attack-pattern=\"Application Window Discovery - T1010\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Application Window Discovery - T1010\""],"Assess KITs\/KIQs benefits - T1229":["misp-galaxy:mitre-attack-pattern=\"Assess KITs\/KIQs benefits - T1229\""],"Assess current holdings, needs, and wants - T1236":["misp-galaxy:mitre-attack-pattern=\"Assess current holdings, needs, and wants - T1236\""],"Assess leadership areas of interest - T1224":["misp-galaxy:mitre-attack-pattern=\"Assess leadership areas of interest - T1224\""],"Assess opportunities created by business deals - T1299":["misp-galaxy:mitre-attack-pattern=\"Assess opportunities created by business deals - T1299\""],"Assess security posture of physical locations - T1302":["misp-galaxy:mitre-attack-pattern=\"Assess security posture of physical locations - T1302\""],"Assess targeting options - T1296":["misp-galaxy:mitre-attack-pattern=\"Assess targeting options - T1296\""],"Assess vulnerability of 3rd party vendors - T1298":["misp-galaxy:mitre-attack-pattern=\"Assess vulnerability of 3rd party vendors - T1298\""],"Assign KITs, KIQs, and\/or intelligence requirements - T1238":["misp-galaxy:mitre-attack-pattern=\"Assign KITs, KIQs, and\/or intelligence requirements - T1238\""],"Assign KITs\/KIQs into categories - T1228":["misp-galaxy:mitre-attack-pattern=\"Assign KITs\/KIQs into categories - T1228\""],"Attack PC via USB Connection - T1427":["misp-galaxy:mitre-attack-pattern=\"Attack PC via USB Connection - T1427\""],"Audio Capture - T1123":["misp-galaxy:mitre-attack-pattern=\"Audio Capture - T1123\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Audio Capture - T1123\""],"Authentication Package - T1131":["misp-galaxy:mitre-attack-pattern=\"Authentication Package - T1131\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Authentication Package - T1131\""],"Authentication attempt - T1381":["misp-galaxy:mitre-attack-pattern=\"Authentication attempt - T1381\""],"Authorized user performs requested cyber action - T1386":["misp-galaxy:mitre-attack-pattern=\"Authorized user performs requested cyber action - T1386\""],"Automated Collection - T1119":["misp-galaxy:mitre-attack-pattern=\"Automated Collection - T1119\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Automated Collection - T1119\""],"Automated Exfiltration - T1020":["misp-galaxy:mitre-attack-pattern=\"Automated Exfiltration - T1020\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Automated Exfiltration - T1020\""],"Automated system performs requested action - T1384":["misp-galaxy:mitre-attack-pattern=\"Automated system performs requested action - T1384\""],"BITS Jobs - T1197":["misp-galaxy:mitre-attack-pattern=\"BITS Jobs - T1197\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"BITS Jobs - T1197\""],"Bash History - T1139":["misp-galaxy:mitre-attack-pattern=\"Bash History - T1139\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Bash History - T1139\""],"Binary Padding - T1009":["misp-galaxy:mitre-attack-pattern=\"Binary Padding - T1009\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Binary Padding - T1009\""],"Biometric Spoofing - T1460":["misp-galaxy:mitre-attack-pattern=\"Biometric Spoofing - T1460\""],"Bootkit - T1067":["misp-galaxy:mitre-attack-pattern=\"Bootkit - T1067\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Bootkit - T1067\""],"Browser Bookmark Discovery - T1217":["misp-galaxy:mitre-attack-pattern=\"Browser Bookmark Discovery - T1217\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Browser Bookmark Discovery - T1217\""],"Browser Extensions - T1176":["misp-galaxy:mitre-attack-pattern=\"Browser Extensions - T1176\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Browser Extensions - T1176\""],"Brute Force - T1110":["misp-galaxy:mitre-attack-pattern=\"Brute Force - T1110\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Brute Force - T1110\""],"Build and configure delivery systems - T1347":["misp-galaxy:mitre-attack-pattern=\"Build and configure delivery systems - T1347\""],"Build or acquire exploits - T1349":["misp-galaxy:mitre-attack-pattern=\"Build or acquire exploits - T1349\""],"Build social network persona - T1341":["misp-galaxy:mitre-attack-pattern=\"Build social network persona - T1341\""],"Buy domain name - T1328":["misp-galaxy:mitre-attack-pattern=\"Buy domain name - T1328\""],"Bypass User Account Control - T1088":["misp-galaxy:mitre-attack-pattern=\"Bypass User Account Control - T1088\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Bypass User Account Control - T1088\""],"C2 protocol development - T1352":["misp-galaxy:mitre-attack-pattern=\"C2 protocol development - T1352\""],"CMSTP - T1191":["misp-galaxy:mitre-attack-pattern=\"CMSTP - T1191\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"CMSTP - T1191\""],"Capture Clipboard Data - T1414":["misp-galaxy:mitre-attack-pattern=\"Capture Clipboard Data - T1414\""],"Capture SMS Messages - T1412":["misp-galaxy:mitre-attack-pattern=\"Capture SMS Messages - T1412\""],"Change Default File Association - T1042":["misp-galaxy:mitre-attack-pattern=\"Change Default File Association - T1042\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Change Default File Association - T1042\""],"Choose pre-compromised mobile app developer account credentials or signing keys - T1391":["misp-galaxy:mitre-attack-pattern=\"Choose pre-compromised mobile app developer account credentials or signing keys - T1391\""],"Choose pre-compromised persona and affiliated accounts - T1343":["misp-galaxy:mitre-attack-pattern=\"Choose pre-compromised persona and affiliated accounts - T1343\""],"Clear Command History - T1146":["misp-galaxy:mitre-attack-pattern=\"Clear Command History - T1146\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Clear Command History - T1146\""],"Clipboard Data - T1115":["misp-galaxy:mitre-attack-pattern=\"Clipboard Data - T1115\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Clipboard Data - T1115\""],"Code Signing - T1116":["misp-galaxy:mitre-attack-pattern=\"Code Signing - T1116\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Code Signing - T1116\""],"Command-Line Interface - T1059":["misp-galaxy:mitre-attack-pattern=\"Command-Line Interface - T1059\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Command-Line Interface - T1059\""],"Common, high volume protocols and software - T1321":["misp-galaxy:mitre-attack-pattern=\"Common, high volume protocols and software - T1321\""],"Commonly Used Port - T1043":["misp-galaxy:mitre-attack-pattern=\"Commonly Used Port - T1043\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Commonly Used Port - T1043\""],"Commonly Used Port - T1436":["misp-galaxy:mitre-attack-pattern=\"Commonly Used Port - T1436\""],"Communication Through Removable Media - T1092":["misp-galaxy:mitre-attack-pattern=\"Communication Through Removable Media - T1092\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Communication Through Removable Media - T1092\""],"Compile After Delivery - T1500":["misp-galaxy:mitre-attack-pattern=\"Compile After Delivery - T1500\""],"Compiled HTML File - T1223":["misp-galaxy:mitre-attack-pattern=\"Compiled HTML File - T1223\""],"Component Firmware - T1109":["misp-galaxy:mitre-attack-pattern=\"Component Firmware - T1109\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Component Firmware - T1109\""],"Component Object Model Hijacking - T1122":["misp-galaxy:mitre-attack-pattern=\"Component Object Model Hijacking - T1122\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Component Object Model Hijacking - T1122\""],"Compromise 3rd party infrastructure to support delivery - T1312":["misp-galaxy:mitre-attack-pattern=\"Compromise 3rd party infrastructure to support delivery - T1312\""],"Compromise 3rd party infrastructure to support delivery - T1334":["misp-galaxy:mitre-attack-pattern=\"Compromise 3rd party infrastructure to support delivery - T1334\""],"Compromise 3rd party or closed-source vulnerability\/exploit information - T1354":["misp-galaxy:mitre-attack-pattern=\"Compromise 3rd party or closed-source vulnerability\/exploit information - T1354\""],"Compromise of externally facing system - T1388":["misp-galaxy:mitre-attack-pattern=\"Compromise of externally facing system - T1388\""],"Conduct active scanning - T1254":["misp-galaxy:mitre-attack-pattern=\"Conduct active scanning - T1254\""],"Conduct cost\/benefit analysis - T1226":["misp-galaxy:mitre-attack-pattern=\"Conduct cost\/benefit analysis - T1226\""],"Conduct passive scanning - T1253":["misp-galaxy:mitre-attack-pattern=\"Conduct passive scanning - T1253\""],"Conduct social engineering - T1249":["misp-galaxy:mitre-attack-pattern=\"Conduct social engineering - T1249\""],"Conduct social engineering - T1268":["misp-galaxy:mitre-attack-pattern=\"Conduct social engineering - T1268\""],"Conduct social engineering - T1279":["misp-galaxy:mitre-attack-pattern=\"Conduct social engineering - T1279\""],"Conduct social engineering or HUMINT operation - T1376":["misp-galaxy:mitre-attack-pattern=\"Conduct social engineering or HUMINT operation - T1376\""],"Confirmation of launched compromise achieved - T1383":["misp-galaxy:mitre-attack-pattern=\"Confirmation of launched compromise achieved - T1383\""],"Connection Proxy - T1090":["misp-galaxy:mitre-attack-pattern=\"Connection Proxy - T1090\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Connection Proxy - T1090\""],"Control Panel Items - T1196":["misp-galaxy:mitre-attack-pattern=\"Control Panel Items - T1196\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Control Panel Items - T1196\""],"Create Account - T1136":["misp-galaxy:mitre-attack-pattern=\"Create Account - T1136\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Create Account - T1136\""],"Create backup infrastructure - T1339":["misp-galaxy:mitre-attack-pattern=\"Create backup infrastructure - T1339\""],"Create custom payloads - T1345":["misp-galaxy:mitre-attack-pattern=\"Create custom payloads - T1345\""],"Create implementation plan - T1232":["misp-galaxy:mitre-attack-pattern=\"Create implementation plan - T1232\""],"Create infected removable media - T1355":["misp-galaxy:mitre-attack-pattern=\"Create infected removable media - T1355\""],"Create strategic plan - T1231":["misp-galaxy:mitre-attack-pattern=\"Create strategic plan - T1231\""],"Credential Dumping - T1003":["misp-galaxy:mitre-attack-pattern=\"Credential Dumping - T1003\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Credential Dumping - T1003\""],"Credential pharming - T1374":["misp-galaxy:mitre-attack-pattern=\"Credential pharming - T1374\""],"Credentials in Files - T1081":["misp-galaxy:mitre-attack-pattern=\"Credentials in Files - T1081\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Credentials in Files - T1081\""],"Credentials in Registry - T1214":["misp-galaxy:mitre-attack-pattern=\"Credentials in Registry - T1214\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Credentials in Registry - T1214\""],"Custom Command and Control Protocol - T1094":["misp-galaxy:mitre-attack-pattern=\"Custom Command and Control Protocol - T1094\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Custom Command and Control Protocol - T1094\""],"Custom Cryptographic Protocol - T1024":["misp-galaxy:mitre-attack-pattern=\"Custom Cryptographic Protocol - T1024\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Custom Cryptographic Protocol - T1024\""],"DCShadow - T1207":["misp-galaxy:mitre-attack-pattern=\"DCShadow - T1207\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"DCShadow - T1207\""],"DLL Search Order Hijacking - T1038":["misp-galaxy:mitre-attack-pattern=\"DLL Search Order Hijacking - T1038\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"DLL Search Order Hijacking - T1038\""],"DLL Side-Loading - T1073":["misp-galaxy:mitre-attack-pattern=\"DLL Side-Loading - T1073\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"DLL Side-Loading - T1073\""],"DNS poisoning - T1382":["misp-galaxy:mitre-attack-pattern=\"DNS poisoning - T1382\""],"DNSCalc - T1324":["misp-galaxy:mitre-attack-pattern=\"DNSCalc - T1324\""],"Data Compressed - T1002":["misp-galaxy:mitre-attack-pattern=\"Data Compressed - T1002\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Compressed - T1002\""],"Data Destruction - T1485":["misp-galaxy:mitre-attack-pattern=\"Data Destruction - T1485\""],"Data Encoding - T1132":["misp-galaxy:mitre-attack-pattern=\"Data Encoding - T1132\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Encoding - T1132\""],"Data Encrypted - T1022":["misp-galaxy:mitre-attack-pattern=\"Data Encrypted - T1022\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Encrypted - T1022\""],"Data Encrypted for Impact - T1486":["misp-galaxy:mitre-attack-pattern=\"Data Encrypted for Impact - T1486\""],"Data Hiding - T1320":["misp-galaxy:mitre-attack-pattern=\"Data Hiding - T1320\""],"Data Obfuscation - T1001":["misp-galaxy:mitre-attack-pattern=\"Data Obfuscation - T1001\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Obfuscation - T1001\""],"Data Staged - T1074":["misp-galaxy:mitre-attack-pattern=\"Data Staged - T1074\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Staged - T1074\""],"Data Transfer Size Limits - T1030":["misp-galaxy:mitre-attack-pattern=\"Data Transfer Size Limits - T1030\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data Transfer Size Limits - T1030\""],"Data from Information Repositories - T1213":["misp-galaxy:mitre-attack-pattern=\"Data from Information Repositories - T1213\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data from Information Repositories - T1213\""],"Data from Local System - T1005":["misp-galaxy:mitre-attack-pattern=\"Data from Local System - T1005\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data from Local System - T1005\""],"Data from Network Shared Drive - T1039":["misp-galaxy:mitre-attack-pattern=\"Data from Network Shared Drive - T1039\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data from Network Shared Drive - T1039\""],"Data from Removable Media - T1025":["misp-galaxy:mitre-attack-pattern=\"Data from Removable Media - T1025\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Data from Removable Media - T1025\""],"Defacement - T1491":["misp-galaxy:mitre-attack-pattern=\"Defacement - T1491\""],"Deliver Malicious App via Authorized App Store - T1475":["misp-galaxy:mitre-attack-pattern=\"Deliver Malicious App via Authorized App Store - T1475\""],"Deliver Malicious App via Other Means - T1476":["misp-galaxy:mitre-attack-pattern=\"Deliver Malicious App via Other Means - T1476\""],"Deobfuscate\/Decode Files or Information - T1140":["misp-galaxy:mitre-attack-pattern=\"Deobfuscate\/Decode Files or Information - T1140\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Deobfuscate\/Decode Files or Information - T1140\""],"Deploy exploit using advertising - T1380":["misp-galaxy:mitre-attack-pattern=\"Deploy exploit using advertising - T1380\""],"Derive intelligence requirements - T1230":["misp-galaxy:mitre-attack-pattern=\"Derive intelligence requirements - T1230\""],"Detect App Analysis Environment - T1440":["misp-galaxy:mitre-attack-pattern=\"Detect App Analysis Environment - T1440\""],"Determine 3rd party infrastructure services - T1260":["misp-galaxy:mitre-attack-pattern=\"Determine 3rd party infrastructure services - T1260\""],"Determine 3rd party infrastructure services - T1284":["misp-galaxy:mitre-attack-pattern=\"Determine 3rd party infrastructure services - T1284\""],"Determine approach\/attack vector - T1245":["misp-galaxy:mitre-attack-pattern=\"Determine approach\/attack vector - T1245\""],"Determine centralization of IT management - T1285":["misp-galaxy:mitre-attack-pattern=\"Determine centralization of IT management - T1285\""],"Determine domain and IP address space - T1250":["misp-galaxy:mitre-attack-pattern=\"Determine domain and IP address space - T1250\""],"Determine external network trust dependencies - T1259":["misp-galaxy:mitre-attack-pattern=\"Determine external network trust dependencies - T1259\""],"Determine firmware version - T1258":["misp-galaxy:mitre-attack-pattern=\"Determine firmware version - T1258\""],"Determine highest level tactical element - T1243":["misp-galaxy:mitre-attack-pattern=\"Determine highest level tactical element - T1243\""],"Determine operational element - T1242":["misp-galaxy:mitre-attack-pattern=\"Determine operational element - T1242\""],"Determine physical locations - T1282":["misp-galaxy:mitre-attack-pattern=\"Determine physical locations - T1282\""],"Determine secondary level tactical element - T1244":["misp-galaxy:mitre-attack-pattern=\"Determine secondary level tactical element - T1244\""],"Determine strategic target - T1241":["misp-galaxy:mitre-attack-pattern=\"Determine strategic target - T1241\""],"Develop KITs\/KIQs - T1227":["misp-galaxy:mitre-attack-pattern=\"Develop KITs\/KIQs - T1227\""],"Develop social network persona digital footprint - T1342":["misp-galaxy:mitre-attack-pattern=\"Develop social network persona digital footprint - T1342\""],"Device Type Discovery - T1419":["misp-galaxy:mitre-attack-pattern=\"Device Type Discovery - T1419\""],"Device Unlock Code Guessing or Brute Force - T1459":["misp-galaxy:mitre-attack-pattern=\"Device Unlock Code Guessing or Brute Force - T1459\""],"Disabling Security Tools - T1089":["misp-galaxy:mitre-attack-pattern=\"Disabling Security Tools - T1089\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Disabling Security Tools - T1089\""],"Discover new exploits and monitor exploit-provider forums - T1350":["misp-galaxy:mitre-attack-pattern=\"Discover new exploits and monitor exploit-provider forums - T1350\""],"Discover target logon\/email address format - T1255":["misp-galaxy:mitre-attack-pattern=\"Discover target logon\/email address format - T1255\""],"Disguise Root\/Jailbreak Indicators - T1408":["misp-galaxy:mitre-attack-pattern=\"Disguise Root\/Jailbreak Indicators - T1408\""],"Disk Content Wipe - T1488":["misp-galaxy:mitre-attack-pattern=\"Disk Content Wipe - T1488\""],"Disk Structure Wipe - T1487":["misp-galaxy:mitre-attack-pattern=\"Disk Structure Wipe - T1487\""],"Disseminate removable media - T1379":["misp-galaxy:mitre-attack-pattern=\"Disseminate removable media - T1379\""],"Distribute malicious software development tools - T1394":["misp-galaxy:mitre-attack-pattern=\"Distribute malicious software development tools - T1394\""],"Distributed Component Object Model - T1175":["misp-galaxy:mitre-attack-pattern=\"Distributed Component Object Model - T1175\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Distributed Component Object Model - T1175\""],"Domain Fronting - T1172":["misp-galaxy:mitre-attack-pattern=\"Domain Fronting - T1172\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Domain Fronting - T1172\""],"Domain Generation Algorithms (DGA) - T1323":["misp-galaxy:mitre-attack-pattern=\"Domain Generation Algorithms (DGA) - T1323\""],"Domain Generation Algorithms - T1483":["misp-galaxy:mitre-attack-pattern=\"Domain Generation Algorithms - T1483\""],"Domain Trust Discovery - T1482":["misp-galaxy:mitre-attack-pattern=\"Domain Trust Discovery - T1482\""],"Domain registration hijacking - T1326":["misp-galaxy:mitre-attack-pattern=\"Domain registration hijacking - T1326\""],"Downgrade to Insecure Protocols - T1466":["misp-galaxy:mitre-attack-pattern=\"Downgrade to Insecure Protocols - T1466\""],"Download New Code at Runtime - T1407":["misp-galaxy:mitre-attack-pattern=\"Download New Code at Runtime - T1407\""],"Drive-by Compromise - T1189":["misp-galaxy:mitre-attack-pattern=\"Drive-by Compromise - T1189\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Drive-by Compromise - T1189\""],"Drive-by Compromise - T1456":["misp-galaxy:mitre-attack-pattern=\"Drive-by Compromise - T1456\""],"Dumpster dive - T1286":["misp-galaxy:mitre-attack-pattern=\"Dumpster dive - T1286\""],"Dylib Hijacking - T1157":["misp-galaxy:mitre-attack-pattern=\"Dylib Hijacking - T1157\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Dylib Hijacking - T1157\""],"Dynamic DNS - T1311":["misp-galaxy:mitre-attack-pattern=\"Dynamic DNS - T1311\""],"Dynamic DNS - T1333":["misp-galaxy:mitre-attack-pattern=\"Dynamic DNS - T1333\""],"Dynamic Data Exchange - T1173":["misp-galaxy:mitre-attack-pattern=\"Dynamic Data Exchange - T1173\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Dynamic Data Exchange - T1173\""],"Eavesdrop on Insecure Network Communication - T1439":["misp-galaxy:mitre-attack-pattern=\"Eavesdrop on Insecure Network Communication - T1439\""],"Email Collection - T1114":["misp-galaxy:mitre-attack-pattern=\"Email Collection - T1114\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Email Collection - T1114\""],"Encrypt Files - T1471":["misp-galaxy:mitre-attack-pattern=\"Encrypt Files - T1471\""],"Encrypt Files for Ransom - T1471":["misp-galaxy:mitre-attack-pattern=\"Encrypt Files for Ransom - T1471\""],"Endpoint Denial of Service - T1499":["misp-galaxy:mitre-attack-pattern=\"Endpoint Denial of Service - T1499\""],"Enumerate client configurations - T1262":["misp-galaxy:mitre-attack-pattern=\"Enumerate client configurations - T1262\""],"Enumerate externally facing software applications technologies, languages, and dependencies - T1261":["misp-galaxy:mitre-attack-pattern=\"Enumerate externally facing software applications technologies, languages, and dependencies - T1261\""],"Execution Guardrails - T1480":["misp-galaxy:mitre-attack-pattern=\"Execution Guardrails - T1480\""],"Execution through API - T1106":["misp-galaxy:mitre-attack-pattern=\"Execution through API - T1106\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Execution through API - T1106\""],"Execution through Module Load - T1129":["misp-galaxy:mitre-attack-pattern=\"Execution through Module Load - T1129\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Execution through Module Load - T1129\""],"Exfiltration Over Alternative Protocol - T1048":["misp-galaxy:mitre-attack-pattern=\"Exfiltration Over Alternative Protocol - T1048\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exfiltration Over Alternative Protocol - T1048\""],"Exfiltration Over Command and Control Channel - T1041":["misp-galaxy:mitre-attack-pattern=\"Exfiltration Over Command and Control Channel - T1041\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exfiltration Over Command and Control Channel - T1041\""],"Exfiltration Over Other Network Medium - T1011":["misp-galaxy:mitre-attack-pattern=\"Exfiltration Over Other Network Medium - T1011\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exfiltration Over Other Network Medium - T1011\""],"Exfiltration Over Physical Medium - T1052":["misp-galaxy:mitre-attack-pattern=\"Exfiltration Over Physical Medium - T1052\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exfiltration Over Physical Medium - T1052\""],"Exploit Baseband Vulnerability - T1455":["misp-galaxy:mitre-attack-pattern=\"Exploit Baseband Vulnerability - T1455\""],"Exploit Enterprise Resources - T1428":["misp-galaxy:mitre-attack-pattern=\"Exploit Enterprise Resources - T1428\""],"Exploit OS Vulnerability - T1404":["misp-galaxy:mitre-attack-pattern=\"Exploit OS Vulnerability - T1404\""],"Exploit Public-Facing Application - T1190":["misp-galaxy:mitre-attack-pattern=\"Exploit Public-Facing Application - T1190\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploit Public-Facing Application - T1190\""],"Exploit SS7 to Redirect Phone Calls\/SMS - T1449":["misp-galaxy:mitre-attack-pattern=\"Exploit SS7 to Redirect Phone Calls\/SMS - T1449\""],"Exploit SS7 to Track Device Location - T1450":["misp-galaxy:mitre-attack-pattern=\"Exploit SS7 to Track Device Location - T1450\""],"Exploit TEE Vulnerability - T1405":["misp-galaxy:mitre-attack-pattern=\"Exploit TEE Vulnerability - T1405\""],"Exploit public-facing application - T1377":["misp-galaxy:mitre-attack-pattern=\"Exploit public-facing application - T1377\""],"Exploit via Charging Station or PC - T1458":["misp-galaxy:mitre-attack-pattern=\"Exploit via Charging Station or PC - T1458\""],"Exploit via Radio Interfaces - T1477":["misp-galaxy:mitre-attack-pattern=\"Exploit via Radio Interfaces - T1477\""],"Exploitation for Client Execution - T1203":["misp-galaxy:mitre-attack-pattern=\"Exploitation for Client Execution - T1203\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploitation for Client Execution - T1203\""],"Exploitation for Credential Access - T1212":["misp-galaxy:mitre-attack-pattern=\"Exploitation for Credential Access - T1212\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploitation for Credential Access - T1212\""],"Exploitation for Defense Evasion - T1211":["misp-galaxy:mitre-attack-pattern=\"Exploitation for Defense Evasion - T1211\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploitation for Defense Evasion - T1211\""],"Exploitation for Privilege Escalation - T1068":["misp-galaxy:mitre-attack-pattern=\"Exploitation for Privilege Escalation - T1068\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploitation for Privilege Escalation - T1068\""],"Exploitation of Remote Services - T1210":["misp-galaxy:mitre-attack-pattern=\"Exploitation of Remote Services - T1210\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Exploitation of Remote Services - T1210\""],"External Remote Services - T1133":["misp-galaxy:mitre-attack-pattern=\"External Remote Services - T1133\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"External Remote Services - T1133\""],"Extra Window Memory Injection - T1181":["misp-galaxy:mitre-attack-pattern=\"Extra Window Memory Injection - T1181\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Extra Window Memory Injection - T1181\""],"Fake Developer Accounts - T1442":["misp-galaxy:mitre-attack-pattern=\"Fake Developer Accounts - T1442\""],"Fallback Channels - T1008":["misp-galaxy:mitre-attack-pattern=\"Fallback Channels - T1008\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Fallback Channels - T1008\""],"Fast Flux DNS - T1325":["misp-galaxy:mitre-attack-pattern=\"Fast Flux DNS - T1325\""],"File Deletion - T1107":["misp-galaxy:mitre-attack-pattern=\"File Deletion - T1107\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"File Deletion - T1107\""],"File Permissions Modification - T1222":["misp-galaxy:mitre-attack-pattern=\"File Permissions Modification - T1222\""],"File System Logical Offsets - T1006":["misp-galaxy:mitre-attack-pattern=\"File System Logical Offsets - T1006\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"File System Logical Offsets - T1006\""],"File System Permissions Weakness - T1044":["misp-galaxy:mitre-attack-pattern=\"File System Permissions Weakness - T1044\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"File System Permissions Weakness - T1044\""],"File and Directory Discovery - T1083":["misp-galaxy:mitre-attack-pattern=\"File and Directory Discovery - T1083\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"File and Directory Discovery - T1083\""],"File and Directory Discovery - T1420":["misp-galaxy:mitre-attack-pattern=\"File and Directory Discovery - T1420\""],"Firmware Corruption - T1495":["misp-galaxy:mitre-attack-pattern=\"Firmware Corruption - T1495\""],"Forced Authentication - T1187":["misp-galaxy:mitre-attack-pattern=\"Forced Authentication - T1187\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Forced Authentication - T1187\""],"Friend\/Follow\/Connect to targets of interest - T1344":["misp-galaxy:mitre-attack-pattern=\"Friend\/Follow\/Connect to targets of interest - T1344\""],"Friend\/Follow\/Connect to targets of interest - T1364":["misp-galaxy:mitre-attack-pattern=\"Friend\/Follow\/Connect to targets of interest - T1364\""],"Gatekeeper Bypass - T1144":["misp-galaxy:mitre-attack-pattern=\"Gatekeeper Bypass - T1144\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Gatekeeper Bypass - T1144\""],"Generate Fraudulent Advertising Revenue - T1472":["misp-galaxy:mitre-attack-pattern=\"Generate Fraudulent Advertising Revenue - T1472\""],"Generate analyst intelligence requirements - T1234":["misp-galaxy:mitre-attack-pattern=\"Generate analyst intelligence requirements - T1234\""],"Graphical User Interface - T1061":["misp-galaxy:mitre-attack-pattern=\"Graphical User Interface - T1061\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Graphical User Interface - T1061\""],"Group Policy Modification - T1484":["misp-galaxy:mitre-attack-pattern=\"Group Policy Modification - T1484\""],"HISTCONTROL - T1148":["misp-galaxy:mitre-attack-pattern=\"HISTCONTROL - T1148\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"HISTCONTROL - T1148\""],"Hardware Additions - T1200":["misp-galaxy:mitre-attack-pattern=\"Hardware Additions - T1200\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hardware Additions - T1200\""],"Hardware or software supply chain implant - T1365":["misp-galaxy:mitre-attack-pattern=\"Hardware or software supply chain implant - T1365\""],"Hidden Files and Directories - T1158":["misp-galaxy:mitre-attack-pattern=\"Hidden Files and Directories - T1158\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hidden Files and Directories - T1158\""],"Hidden Users - T1147":["misp-galaxy:mitre-attack-pattern=\"Hidden Users - T1147\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hidden Users - T1147\""],"Hidden Window - T1143":["misp-galaxy:mitre-attack-pattern=\"Hidden Window - T1143\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hidden Window - T1143\""],"Hooking - T1179":["misp-galaxy:mitre-attack-pattern=\"Hooking - T1179\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hooking - T1179\""],"Host-based hiding techniques - T1314":["misp-galaxy:mitre-attack-pattern=\"Host-based hiding techniques - T1314\""],"Human performs requested action of physical nature - T1385":["misp-galaxy:mitre-attack-pattern=\"Human performs requested action of physical nature - T1385\""],"Hypervisor - T1062":["misp-galaxy:mitre-attack-pattern=\"Hypervisor - T1062\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Hypervisor - T1062\""],"Identify analyst level gaps - T1233":["misp-galaxy:mitre-attack-pattern=\"Identify analyst level gaps - T1233\""],"Identify business processes\/tempo - T1280":["misp-galaxy:mitre-attack-pattern=\"Identify business processes\/tempo - T1280\""],"Identify business relationships - T1272":["misp-galaxy:mitre-attack-pattern=\"Identify business relationships - T1272\""],"Identify business relationships - T1283":["misp-galaxy:mitre-attack-pattern=\"Identify business relationships - T1283\""],"Identify gap areas - T1225":["misp-galaxy:mitre-attack-pattern=\"Identify gap areas - T1225\""],"Identify groups\/roles - T1270":["misp-galaxy:mitre-attack-pattern=\"Identify groups\/roles - T1270\""],"Identify job postings and needs\/gaps - T1248":["misp-galaxy:mitre-attack-pattern=\"Identify job postings and needs\/gaps - T1248\""],"Identify job postings and needs\/gaps - T1267":["misp-galaxy:mitre-attack-pattern=\"Identify job postings and needs\/gaps - T1267\""],"Identify job postings and needs\/gaps - T1278":["misp-galaxy:mitre-attack-pattern=\"Identify job postings and needs\/gaps - T1278\""],"Identify people of interest - T1269":["misp-galaxy:mitre-attack-pattern=\"Identify people of interest - T1269\""],"Identify personnel with an authority\/privilege - T1271":["misp-galaxy:mitre-attack-pattern=\"Identify personnel with an authority\/privilege - T1271\""],"Identify resources required to build capabilities - T1348":["misp-galaxy:mitre-attack-pattern=\"Identify resources required to build capabilities - T1348\""],"Identify security defensive capabilities - T1263":["misp-galaxy:mitre-attack-pattern=\"Identify security defensive capabilities - T1263\""],"Identify sensitive personnel information - T1274":["misp-galaxy:mitre-attack-pattern=\"Identify sensitive personnel information - T1274\""],"Identify supply chains - T1246":["misp-galaxy:mitre-attack-pattern=\"Identify supply chains - T1246\""],"Identify supply chains - T1265":["misp-galaxy:mitre-attack-pattern=\"Identify supply chains - T1265\""],"Identify supply chains - T1276":["misp-galaxy:mitre-attack-pattern=\"Identify supply chains - T1276\""],"Identify technology usage patterns - T1264":["misp-galaxy:mitre-attack-pattern=\"Identify technology usage patterns - T1264\""],"Identify vulnerabilities in third-party software libraries - T1389":["misp-galaxy:mitre-attack-pattern=\"Identify vulnerabilities in third-party software libraries - T1389\""],"Identify web defensive services - T1256":["misp-galaxy:mitre-attack-pattern=\"Identify web defensive services - T1256\""],"Image File Execution Options Injection - T1183":["misp-galaxy:mitre-attack-pattern=\"Image File Execution Options Injection - T1183\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Image File Execution Options Injection - T1183\""],"Indicator Blocking - T1054":["misp-galaxy:mitre-attack-pattern=\"Indicator Blocking - T1054\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Indicator Blocking - T1054\""],"Indicator Removal from Tools - T1066":["misp-galaxy:mitre-attack-pattern=\"Indicator Removal from Tools - T1066\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Indicator Removal from Tools - T1066\""],"Indicator Removal on Host - T1070":["misp-galaxy:mitre-attack-pattern=\"Indicator Removal on Host - T1070\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Indicator Removal on Host - T1070\""],"Indirect Command Execution - T1202":["misp-galaxy:mitre-attack-pattern=\"Indirect Command Execution - T1202\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Indirect Command Execution - T1202\""],"Inhibit System Recovery - T1490":["misp-galaxy:mitre-attack-pattern=\"Inhibit System Recovery - T1490\""],"Input Capture - T1056":["misp-galaxy:mitre-attack-pattern=\"Input Capture - T1056\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Input Capture - T1056\""],"Input Prompt - T1141":["misp-galaxy:mitre-attack-pattern=\"Input Prompt - T1141\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Input Prompt - T1141\""],"Insecure Third-Party Libraries - T1425":["misp-galaxy:mitre-attack-pattern=\"Insecure Third-Party Libraries - T1425\""],"Install Insecure or Malicious Configuration - T1478":["misp-galaxy:mitre-attack-pattern=\"Install Insecure or Malicious Configuration - T1478\""],"Install Root Certificate - T1130":["misp-galaxy:mitre-attack-pattern=\"Install Root Certificate - T1130\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Install Root Certificate - T1130\""],"Install and configure hardware, network, and systems - T1336":["misp-galaxy:mitre-attack-pattern=\"Install and configure hardware, network, and systems - T1336\""],"InstallUtil - T1118":["misp-galaxy:mitre-attack-pattern=\"InstallUtil - T1118\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"InstallUtil - T1118\""],"Jamming or Denial of Service - T1464":["misp-galaxy:mitre-attack-pattern=\"Jamming or Denial of Service - T1464\""],"Kerberoasting - T1208":["misp-galaxy:mitre-attack-pattern=\"Kerberoasting - T1208\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Kerberoasting - T1208\""],"Kernel Modules and Extensions - T1215":["misp-galaxy:mitre-attack-pattern=\"Kernel Modules and Extensions - T1215\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Kernel Modules and Extensions - T1215\""],"Keychain - T1142":["misp-galaxy:mitre-attack-pattern=\"Keychain - T1142\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Keychain - T1142\""],"LC_LOAD_DYLIB Addition - T1161":["misp-galaxy:mitre-attack-pattern=\"LC_LOAD_DYLIB Addition - T1161\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"LC_LOAD_DYLIB Addition - T1161\""],"LC_MAIN Hijacking - T1149":["misp-galaxy:mitre-attack-pattern=\"LC_MAIN Hijacking - T1149\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"LC_MAIN Hijacking - T1149\""],"LLMNR\/NBT-NS Poisoning - T1171":["misp-galaxy:mitre-attack-pattern=\"LLMNR\/NBT-NS Poisoning - T1171\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"LLMNR\/NBT-NS Poisoning - T1171\""],"LLMNR\/NBT-NS Poisoning and Relay - T1171":["misp-galaxy:mitre-attack-pattern=\"LLMNR\/NBT-NS Poisoning and Relay - T1171\""],"LSASS Driver - T1177":["misp-galaxy:mitre-attack-pattern=\"LSASS Driver - T1177\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"LSASS Driver - T1177\""],"Launch Agent - T1159":["misp-galaxy:mitre-attack-pattern=\"Launch Agent - T1159\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Launch Agent - T1159\""],"Launch Daemon - T1160":["misp-galaxy:mitre-attack-pattern=\"Launch Daemon - T1160\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Launch Daemon - T1160\""],"Launchctl - T1152":["misp-galaxy:mitre-attack-pattern=\"Launchctl - T1152\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Launchctl - T1152\""],"Leverage compromised 3rd party resources - T1375":["misp-galaxy:mitre-attack-pattern=\"Leverage compromised 3rd party resources - T1375\""],"Local Job Scheduling - T1168":["misp-galaxy:mitre-attack-pattern=\"Local Job Scheduling - T1168\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Local Job Scheduling - T1168\""],"Local Network Configuration Discovery - T1422":["misp-galaxy:mitre-attack-pattern=\"Local Network Configuration Discovery - T1422\""],"Local Network Connections Discovery - T1421":["misp-galaxy:mitre-attack-pattern=\"Local Network Connections Discovery - T1421\""],"Location Tracking - T1430":["misp-galaxy:mitre-attack-pattern=\"Location Tracking - T1430\""],"Lock User Out of Device - T1446":["misp-galaxy:mitre-attack-pattern=\"Lock User Out of Device - T1446\""],"Lockscreen Bypass - T1461":["misp-galaxy:mitre-attack-pattern=\"Lockscreen Bypass - T1461\""],"Login Item - T1162":["misp-galaxy:mitre-attack-pattern=\"Login Item - T1162\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Login Item - T1162\""],"Logon Scripts - T1037":["misp-galaxy:mitre-attack-pattern=\"Logon Scripts - T1037\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Logon Scripts - T1037\""],"Malicious Media Content - T1457":["misp-galaxy:mitre-attack-pattern=\"Malicious Media Content - T1457\""],"Malicious SMS Message - T1454":["misp-galaxy:mitre-attack-pattern=\"Malicious SMS Message - T1454\""],"Malicious Software Development Tools - T1462":["misp-galaxy:mitre-attack-pattern=\"Malicious Software Development Tools - T1462\""],"Malicious Third Party Keyboard App - T1417":["misp-galaxy:mitre-attack-pattern=\"Malicious Third Party Keyboard App - T1417\""],"Malicious or Vulnerable Built-in Device Functionality - T1473":["misp-galaxy:mitre-attack-pattern=\"Malicious or Vulnerable Built-in Device Functionality - T1473\""],"Man in the Browser - T1185":["misp-galaxy:mitre-attack-pattern=\"Man in the Browser - T1185\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Man in the Browser - T1185\""],"Manipulate App Store Rankings or Ratings - T1452":["misp-galaxy:mitre-attack-pattern=\"Manipulate App Store Rankings or Ratings - T1452\""],"Manipulate Device Communication - T1463":["misp-galaxy:mitre-attack-pattern=\"Manipulate Device Communication - T1463\""],"Map network topology - T1252":["misp-galaxy:mitre-attack-pattern=\"Map network topology - T1252\""],"Masquerading - T1036":["misp-galaxy:mitre-attack-pattern=\"Masquerading - T1036\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Masquerading - T1036\""],"Microphone or Camera Recordings - T1429":["misp-galaxy:mitre-attack-pattern=\"Microphone or Camera Recordings - T1429\""],"Mine social media - T1273":["misp-galaxy:mitre-attack-pattern=\"Mine social media - T1273\""],"Mine technical blogs\/forums - T1257":["misp-galaxy:mitre-attack-pattern=\"Mine technical blogs\/forums - T1257\""],"Misattributable credentials - T1322":["misp-galaxy:mitre-attack-pattern=\"Misattributable credentials - T1322\""],"Modify Existing Service - T1031":["misp-galaxy:mitre-attack-pattern=\"Modify Existing Service - T1031\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Modify Existing Service - T1031\""],"Modify OS Kernel or Boot Partition - T1398":["misp-galaxy:mitre-attack-pattern=\"Modify OS Kernel or Boot Partition - T1398\""],"Modify Registry - T1112":["misp-galaxy:mitre-attack-pattern=\"Modify Registry - T1112\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Modify Registry - T1112\""],"Modify System Partition - T1400":["misp-galaxy:mitre-attack-pattern=\"Modify System Partition - T1400\""],"Modify Trusted Execution Environment - T1399":["misp-galaxy:mitre-attack-pattern=\"Modify Trusted Execution Environment - T1399\""],"Modify cached executable code - T1403":["misp-galaxy:mitre-attack-pattern=\"Modify cached executable code - T1403\""],"Mshta - T1170":["misp-galaxy:mitre-attack-pattern=\"Mshta - T1170\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Mshta - T1170\""],"Multi-Stage Channels - T1104":["misp-galaxy:mitre-attack-pattern=\"Multi-Stage Channels - T1104\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Multi-Stage Channels - T1104\""],"Multi-hop Proxy - T1188":["misp-galaxy:mitre-attack-pattern=\"Multi-hop Proxy - T1188\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Multi-hop Proxy - T1188\""],"Multiband Communication - T1026":["misp-galaxy:mitre-attack-pattern=\"Multiband Communication - T1026\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Multiband Communication - T1026\""],"Multilayer Encryption - T1079":["misp-galaxy:mitre-attack-pattern=\"Multilayer Encryption - T1079\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Multilayer Encryption - T1079\""],"NTFS File Attributes - T1096":["misp-galaxy:mitre-attack-pattern=\"NTFS File Attributes - T1096\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"NTFS File Attributes - T1096\""],"Netsh Helper DLL - T1128":["misp-galaxy:mitre-attack-pattern=\"Netsh Helper DLL - T1128\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Netsh Helper DLL - T1128\""],"Network Denial of Service - T1498":["misp-galaxy:mitre-attack-pattern=\"Network Denial of Service - T1498\""],"Network Service Scanning - T1046":["misp-galaxy:mitre-attack-pattern=\"Network Service Scanning - T1046\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Network Service Scanning - T1046\""],"Network Service Scanning - T1423":["misp-galaxy:mitre-attack-pattern=\"Network Service Scanning - T1423\""],"Network Share Connection Removal - T1126":["misp-galaxy:mitre-attack-pattern=\"Network Share Connection Removal - T1126\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Network Share Connection Removal - T1126\""],"Network Share Discovery - T1135":["misp-galaxy:mitre-attack-pattern=\"Network Share Discovery - T1135\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Network Share Discovery - T1135\""],"Network Sniffing - T1040":["misp-galaxy:mitre-attack-pattern=\"Network Sniffing - T1040\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Network Sniffing - T1040\""],"Network Traffic Capture or Redirection - T1410":["misp-galaxy:mitre-attack-pattern=\"Network Traffic Capture or Redirection - T1410\""],"Network-based hiding techniques - T1315":["misp-galaxy:mitre-attack-pattern=\"Network-based hiding techniques - T1315\""],"New Service - T1050":["misp-galaxy:mitre-attack-pattern=\"New Service - T1050\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"New Service - T1050\""],"Non-traditional or less attributable payment options - T1316":["misp-galaxy:mitre-attack-pattern=\"Non-traditional or less attributable payment options - T1316\""],"OS-vendor provided communication channels - T1390":["misp-galaxy:mitre-attack-pattern=\"OS-vendor provided communication channels - T1390\""],"Obfuscate infrastructure - T1309":["misp-galaxy:mitre-attack-pattern=\"Obfuscate infrastructure - T1309\""],"Obfuscate infrastructure - T1331":["misp-galaxy:mitre-attack-pattern=\"Obfuscate infrastructure - T1331\""],"Obfuscate operational infrastructure - T1318":["misp-galaxy:mitre-attack-pattern=\"Obfuscate operational infrastructure - T1318\""],"Obfuscate or encrypt code - T1319":["misp-galaxy:mitre-attack-pattern=\"Obfuscate or encrypt code - T1319\""],"Obfuscated Files or Information - T1027":["misp-galaxy:mitre-attack-pattern=\"Obfuscated Files or Information - T1027\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Obfuscated Files or Information - T1027\""],"Obfuscated Files or Information - T1406":["misp-galaxy:mitre-attack-pattern=\"Obfuscated Files or Information - T1406\""],"Obfuscated or Encrypted Payload - T1406":["misp-galaxy:mitre-attack-pattern=\"Obfuscated or Encrypted Payload - T1406\""],"Obfuscation or cryptography - T1313":["misp-galaxy:mitre-attack-pattern=\"Obfuscation or cryptography - T1313\""],"Obtain Apple iOS enterprise distribution key pair and certificate - T1392":["misp-galaxy:mitre-attack-pattern=\"Obtain Apple iOS enterprise distribution key pair and certificate - T1392\""],"Obtain Device Cloud Backups - T1470":["misp-galaxy:mitre-attack-pattern=\"Obtain Device Cloud Backups - T1470\""],"Obtain booter\/stressor subscription - T1396":["misp-galaxy:mitre-attack-pattern=\"Obtain booter\/stressor subscription - T1396\""],"Obtain domain\/IP registration information - T1251":["misp-galaxy:mitre-attack-pattern=\"Obtain domain\/IP registration information - T1251\""],"Obtain templates\/branding materials - T1281":["misp-galaxy:mitre-attack-pattern=\"Obtain templates\/branding materials - T1281\""],"Obtain\/re-use payloads - T1346":["misp-galaxy:mitre-attack-pattern=\"Obtain\/re-use payloads - T1346\""],"Office Application Startup - T1137":["misp-galaxy:mitre-attack-pattern=\"Office Application Startup - T1137\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Office Application Startup - T1137\""],"Pass the Hash - T1075":["misp-galaxy:mitre-attack-pattern=\"Pass the Hash - T1075\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Pass the Hash - T1075\""],"Pass the Ticket - T1097":["misp-galaxy:mitre-attack-pattern=\"Pass the Ticket - T1097\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Pass the Ticket - T1097\""],"Password Filter DLL - T1174":["misp-galaxy:mitre-attack-pattern=\"Password Filter DLL - T1174\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Password Filter DLL - T1174\""],"Password Policy Discovery - T1201":["misp-galaxy:mitre-attack-pattern=\"Password Policy Discovery - T1201\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Password Policy Discovery - T1201\""],"Path Interception - T1034":["misp-galaxy:mitre-attack-pattern=\"Path Interception - T1034\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Path Interception - T1034\""],"Peripheral Device Discovery - T1120":["misp-galaxy:mitre-attack-pattern=\"Peripheral Device Discovery - T1120\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Peripheral Device Discovery - T1120\""],"Permission Groups Discovery - T1069":["misp-galaxy:mitre-attack-pattern=\"Permission Groups Discovery - T1069\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Permission Groups Discovery - T1069\""],"Plist Modification - T1150":["misp-galaxy:mitre-attack-pattern=\"Plist Modification - T1150\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Plist Modification - T1150\""],"Port Knocking - T1205":["misp-galaxy:mitre-attack-pattern=\"Port Knocking - T1205\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Port Knocking - T1205\""],"Port Monitors - T1013":["misp-galaxy:mitre-attack-pattern=\"Port Monitors - T1013\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Port Monitors - T1013\""],"Port redirector - T1363":["misp-galaxy:mitre-attack-pattern=\"Port redirector - T1363\""],"Post compromise tool development - T1353":["misp-galaxy:mitre-attack-pattern=\"Post compromise tool development - T1353\""],"PowerShell - T1086":["misp-galaxy:mitre-attack-pattern=\"PowerShell - T1086\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"PowerShell - T1086\""],"Premium SMS Toll Fraud - T1448":["misp-galaxy:mitre-attack-pattern=\"Premium SMS Toll Fraud - T1448\""],"Private Keys - T1145":["misp-galaxy:mitre-attack-pattern=\"Private Keys - T1145\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Private Keys - T1145\""],"Private whois services - T1305":["misp-galaxy:mitre-attack-pattern=\"Private whois services - T1305\""],"Process Discovery - T1057":["misp-galaxy:mitre-attack-pattern=\"Process Discovery - T1057\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Process Discovery - T1057\""],"Process Discovery - T1424":["misp-galaxy:mitre-attack-pattern=\"Process Discovery - T1424\""],"Process Doppelg\u00e4nging - T1186":["misp-galaxy:mitre-attack-pattern=\"Process Doppelg\u00e4nging - T1186\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Process Doppelg\u00e4nging - T1186\""],"Process Hollowing - T1093":["misp-galaxy:mitre-attack-pattern=\"Process Hollowing - T1093\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Process Hollowing - T1093\""],"Process Injection - T1055":["misp-galaxy:mitre-attack-pattern=\"Process Injection - T1055\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Process Injection - T1055\""],"Procure required equipment and software - T1335":["misp-galaxy:mitre-attack-pattern=\"Procure required equipment and software - T1335\""],"Proxy\/protocol relays - T1304":["misp-galaxy:mitre-attack-pattern=\"Proxy\/protocol relays - T1304\""],"Push-notification client-side exploit - T1373":["misp-galaxy:mitre-attack-pattern=\"Push-notification client-side exploit - T1373\""],"Query Registry - T1012":["misp-galaxy:mitre-attack-pattern=\"Query Registry - T1012\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Query Registry - T1012\""],"Rc.common - T1163":["misp-galaxy:mitre-attack-pattern=\"Rc.common - T1163\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Rc.common - T1163\""],"Re-opened Applications - T1164":["misp-galaxy:mitre-attack-pattern=\"Re-opened Applications - T1164\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Re-opened Applications - T1164\""],"Receive KITs\/KIQs and determine requirements - T1239":["misp-galaxy:mitre-attack-pattern=\"Receive KITs\/KIQs and determine requirements - T1239\""],"Receive operator KITs\/KIQs tasking - T1235":["misp-galaxy:mitre-attack-pattern=\"Receive operator KITs\/KIQs tasking - T1235\""],"Redundant Access - T1108":["misp-galaxy:mitre-attack-pattern=\"Redundant Access - T1108\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Redundant Access - T1108\""],"Registry Run Keys \/ Startup Folder - T1060":["misp-galaxy:mitre-attack-pattern=\"Registry Run Keys \/ Startup Folder - T1060\""],"Regsvcs\/Regasm - T1121":["misp-galaxy:mitre-attack-pattern=\"Regsvcs\/Regasm - T1121\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Regsvcs\/Regasm - T1121\""],"Regsvr32 - T1117":["misp-galaxy:mitre-attack-pattern=\"Regsvr32 - T1117\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Regsvr32 - T1117\""],"Remote Access Tools - T1219":["misp-galaxy:mitre-attack-pattern=\"Remote Access Tools - T1219\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote Access Tools - T1219\""],"Remote Desktop Protocol - T1076":["misp-galaxy:mitre-attack-pattern=\"Remote Desktop Protocol - T1076\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote Desktop Protocol - T1076\""],"Remote File Copy - T1105":["misp-galaxy:mitre-attack-pattern=\"Remote File Copy - T1105\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote File Copy - T1105\""],"Remote Services - T1021":["misp-galaxy:mitre-attack-pattern=\"Remote Services - T1021\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote Services - T1021\""],"Remote System Discovery - T1018":["misp-galaxy:mitre-attack-pattern=\"Remote System Discovery - T1018\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Remote System Discovery - T1018\""],"Remote access tool development - T1351":["misp-galaxy:mitre-attack-pattern=\"Remote access tool development - T1351\""],"Remotely Install Application - T1443":["misp-galaxy:mitre-attack-pattern=\"Remotely Install Application - T1443\""],"Remotely Track Device Without Authorization - T1468":["misp-galaxy:mitre-attack-pattern=\"Remotely Track Device Without Authorization - T1468\""],"Remotely Wipe Data Without Authorization - T1469":["misp-galaxy:mitre-attack-pattern=\"Remotely Wipe Data Without Authorization - T1469\""],"Repackaged Application - T1444":["misp-galaxy:mitre-attack-pattern=\"Repackaged Application - T1444\""],"Replace legitimate binary with malware - T1378":["misp-galaxy:mitre-attack-pattern=\"Replace legitimate binary with malware - T1378\""],"Replication Through Removable Media - T1091":["misp-galaxy:mitre-attack-pattern=\"Replication Through Removable Media - T1091\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Replication Through Removable Media - T1091\""],"Research relevant vulnerabilities\/CVEs - T1291":["misp-galaxy:mitre-attack-pattern=\"Research relevant vulnerabilities\/CVEs - T1291\""],"Research visibility gap of security vendors - T1290":["misp-galaxy:mitre-attack-pattern=\"Research visibility gap of security vendors - T1290\""],"Resource Hijacking - T1496":["misp-galaxy:mitre-attack-pattern=\"Resource Hijacking - T1496\""],"Review logs and residual traces - T1358":["misp-galaxy:mitre-attack-pattern=\"Review logs and residual traces - T1358\""],"Rogue Cellular Base Station - T1467":["misp-galaxy:mitre-attack-pattern=\"Rogue Cellular Base Station - T1467\""],"Rogue Wi-Fi Access Points - T1465":["misp-galaxy:mitre-attack-pattern=\"Rogue Wi-Fi Access Points - T1465\""],"Rootkit - T1014":["misp-galaxy:mitre-attack-pattern=\"Rootkit - T1014\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Rootkit - T1014\""],"Rundll32 - T1085":["misp-galaxy:mitre-attack-pattern=\"Rundll32 - T1085\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Rundll32 - T1085\""],"Runtime Data Manipulation - T1494":["misp-galaxy:mitre-attack-pattern=\"Runtime Data Manipulation - T1494\""],"Runtime code download and execution - T1395":["misp-galaxy:mitre-attack-pattern=\"Runtime code download and execution - T1395\""],"SID-History Injection - T1178":["misp-galaxy:mitre-attack-pattern=\"SID-History Injection - T1178\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"SID-History Injection - T1178\""],"SIM Card Swap - T1451":["misp-galaxy:mitre-attack-pattern=\"SIM Card Swap - T1451\""],"SIP and Trust Provider Hijacking - T1198":["misp-galaxy:mitre-attack-pattern=\"SIP and Trust Provider Hijacking - T1198\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"SIP and Trust Provider Hijacking - T1198\""],"SSH Hijacking - T1184":["misp-galaxy:mitre-attack-pattern=\"SSH Hijacking - T1184\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"SSH Hijacking - T1184\""],"SSL certificate acquisition for domain - T1337":["misp-galaxy:mitre-attack-pattern=\"SSL certificate acquisition for domain - T1337\""],"SSL certificate acquisition for trust breaking - T1338":["misp-galaxy:mitre-attack-pattern=\"SSL certificate acquisition for trust breaking - T1338\""],"Scheduled Task - T1053":["misp-galaxy:mitre-attack-pattern=\"Scheduled Task - T1053\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Scheduled Task - T1053\""],"Scheduled Transfer - T1029":["misp-galaxy:mitre-attack-pattern=\"Scheduled Transfer - T1029\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Scheduled Transfer - T1029\""],"Screen Capture - T1113":["misp-galaxy:mitre-attack-pattern=\"Screen Capture - T1113\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Screen Capture - T1113\""],"Screensaver - T1180":["misp-galaxy:mitre-attack-pattern=\"Screensaver - T1180\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Screensaver - T1180\""],"Scripting - T1064":["misp-galaxy:mitre-attack-pattern=\"Scripting - T1064\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Scripting - T1064\""],"Secure and protect infrastructure - T1317":["misp-galaxy:mitre-attack-pattern=\"Secure and protect infrastructure - T1317\""],"Security Software Discovery - T1063":["misp-galaxy:mitre-attack-pattern=\"Security Software Discovery - T1063\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Security Software Discovery - T1063\""],"Security Support Provider - T1101":["misp-galaxy:mitre-attack-pattern=\"Security Support Provider - T1101\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Security Support Provider - T1101\""],"Securityd Memory - T1167":["misp-galaxy:mitre-attack-pattern=\"Securityd Memory - T1167\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Securityd Memory - T1167\""],"Service Execution - T1035":["misp-galaxy:mitre-attack-pattern=\"Service Execution - T1035\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Service Execution - T1035\""],"Service Registry Permissions Weakness - T1058":["misp-galaxy:mitre-attack-pattern=\"Service Registry Permissions Weakness - T1058\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Service Registry Permissions Weakness - T1058\""],"Service Stop - T1489":["misp-galaxy:mitre-attack-pattern=\"Service Stop - T1489\""],"Setuid and Setgid - T1166":["misp-galaxy:mitre-attack-pattern=\"Setuid and Setgid - T1166\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Setuid and Setgid - T1166\""],"Shadow DNS - T1340":["misp-galaxy:mitre-attack-pattern=\"Shadow DNS - T1340\""],"Shared Webroot - T1051":["misp-galaxy:mitre-attack-pattern=\"Shared Webroot - T1051\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Shared Webroot - T1051\""],"Shortcut Modification - T1023":["misp-galaxy:mitre-attack-pattern=\"Shortcut Modification - T1023\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Shortcut Modification - T1023\""],"Signed Binary Proxy Execution - T1218":["misp-galaxy:mitre-attack-pattern=\"Signed Binary Proxy Execution - T1218\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Signed Binary Proxy Execution - T1218\""],"Signed Script Proxy Execution - T1216":["misp-galaxy:mitre-attack-pattern=\"Signed Script Proxy Execution - T1216\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Signed Script Proxy Execution - T1216\""],"Software Packing - T1045":["misp-galaxy:mitre-attack-pattern=\"Software Packing - T1045\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Software Packing - T1045\""],"Source - T1153":["misp-galaxy:mitre-attack-pattern=\"Source - T1153\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Source - T1153\""],"Space after Filename - T1151":["misp-galaxy:mitre-attack-pattern=\"Space after Filename - T1151\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Space after Filename - T1151\""],"Spear phishing messages with malicious attachments - T1367":["misp-galaxy:mitre-attack-pattern=\"Spear phishing messages with malicious attachments - T1367\""],"Spear phishing messages with malicious links - T1369":["misp-galaxy:mitre-attack-pattern=\"Spear phishing messages with malicious links - T1369\""],"Spear phishing messages with text only - T1368":["misp-galaxy:mitre-attack-pattern=\"Spear phishing messages with text only - T1368\""],"Spearphishing Attachment - T1193":["misp-galaxy:mitre-attack-pattern=\"Spearphishing Attachment - T1193\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Spearphishing Attachment - T1193\""],"Spearphishing Link - T1192":["misp-galaxy:mitre-attack-pattern=\"Spearphishing Link - T1192\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Spearphishing Link - T1192\""],"Spearphishing for Information - T1397":["misp-galaxy:mitre-attack-pattern=\"Spearphishing for Information - T1397\""],"Spearphishing via Service - T1194":["misp-galaxy:mitre-attack-pattern=\"Spearphishing via Service - T1194\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Spearphishing via Service - T1194\""],"Standard Application Layer Protocol - T1071":["misp-galaxy:mitre-attack-pattern=\"Standard Application Layer Protocol - T1071\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Standard Application Layer Protocol - T1071\""],"Standard Application Layer Protocol - T1437":["misp-galaxy:mitre-attack-pattern=\"Standard Application Layer Protocol - T1437\""],"Standard Cryptographic Protocol - T1032":["misp-galaxy:mitre-attack-pattern=\"Standard Cryptographic Protocol - T1032\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Standard Cryptographic Protocol - T1032\""],"Standard Non-Application Layer Protocol - T1095":["misp-galaxy:mitre-attack-pattern=\"Standard Non-Application Layer Protocol - T1095\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Standard Non-Application Layer Protocol - T1095\""],"Startup Items - T1165":["misp-galaxy:mitre-attack-pattern=\"Startup Items - T1165\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Startup Items - T1165\""],"Stolen Developer Credentials or Signing Keys - T1441":["misp-galaxy:mitre-attack-pattern=\"Stolen Developer Credentials or Signing Keys - T1441\""],"Stored Data Manipulation - T1492":["misp-galaxy:mitre-attack-pattern=\"Stored Data Manipulation - T1492\""],"Submit KITs, KIQs, and intelligence requirements - T1237":["misp-galaxy:mitre-attack-pattern=\"Submit KITs, KIQs, and intelligence requirements - T1237\""],"Sudo - T1169":["misp-galaxy:mitre-attack-pattern=\"Sudo - T1169\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Sudo - T1169\""],"Sudo Caching - T1206":["misp-galaxy:mitre-attack-pattern=\"Sudo Caching - T1206\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Sudo Caching - T1206\""],"Supply Chain Compromise - T1195":["misp-galaxy:mitre-attack-pattern=\"Supply Chain Compromise - T1195\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Supply Chain Compromise - T1195\""],"Supply Chain Compromise - T1474":["misp-galaxy:mitre-attack-pattern=\"Supply Chain Compromise - T1474\""],"System Firmware - T1019":["misp-galaxy:mitre-attack-pattern=\"System Firmware - T1019\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Firmware - T1019\""],"System Information Discovery - T1082":["misp-galaxy:mitre-attack-pattern=\"System Information Discovery - T1082\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Information Discovery - T1082\""],"System Information Discovery - T1426":["misp-galaxy:mitre-attack-pattern=\"System Information Discovery - T1426\""],"System Network Configuration Discovery - T1016":["misp-galaxy:mitre-attack-pattern=\"System Network Configuration Discovery - T1016\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Network Configuration Discovery - T1016\""],"System Network Configuration Discovery - T1422":["misp-galaxy:mitre-attack-pattern=\"System Network Configuration Discovery - T1422\""],"System Network Connections Discovery - T1049":["misp-galaxy:mitre-attack-pattern=\"System Network Connections Discovery - T1049\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Network Connections Discovery - T1049\""],"System Network Connections Discovery - T1421":["misp-galaxy:mitre-attack-pattern=\"System Network Connections Discovery - T1421\""],"System Owner\/User Discovery - T1033":["misp-galaxy:mitre-attack-pattern=\"System Owner\/User Discovery - T1033\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Owner\/User Discovery - T1033\""],"System Service Discovery - T1007":["misp-galaxy:mitre-attack-pattern=\"System Service Discovery - T1007\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Service Discovery - T1007\""],"System Time Discovery - T1124":["misp-galaxy:mitre-attack-pattern=\"System Time Discovery - T1124\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"System Time Discovery - T1124\""],"Systemd Service - T1501":["misp-galaxy:mitre-attack-pattern=\"Systemd Service - T1501\""],"Taint Shared Content - T1080":["misp-galaxy:mitre-attack-pattern=\"Taint Shared Content - T1080\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Taint Shared Content - T1080\""],"Targeted client-side exploitation - T1371":["misp-galaxy:mitre-attack-pattern=\"Targeted client-side exploitation - T1371\""],"Targeted social media phishing - T1366":["misp-galaxy:mitre-attack-pattern=\"Targeted social media phishing - T1366\""],"Task requirements - T1240":["misp-galaxy:mitre-attack-pattern=\"Task requirements - T1240\""],"Template Injection - T1221":["misp-galaxy:mitre-attack-pattern=\"Template Injection - T1221\""],"Test ability to evade automated mobile application security analysis performed by app stores - T1393":["misp-galaxy:mitre-attack-pattern=\"Test ability to evade automated mobile application security analysis performed by app stores - T1393\""],"Test callback functionality - T1356":["misp-galaxy:mitre-attack-pattern=\"Test callback functionality - T1356\""],"Test malware in various execution environments - T1357":["misp-galaxy:mitre-attack-pattern=\"Test malware in various execution environments - T1357\""],"Test malware to evade detection - T1359":["misp-galaxy:mitre-attack-pattern=\"Test malware to evade detection - T1359\""],"Test physical access - T1360":["misp-galaxy:mitre-attack-pattern=\"Test physical access - T1360\""],"Test signature detection - T1292":["misp-galaxy:mitre-attack-pattern=\"Test signature detection - T1292\""],"Test signature detection for file upload\/email filters - T1361":["misp-galaxy:mitre-attack-pattern=\"Test signature detection for file upload\/email filters - T1361\""],"Third-party Software - T1072":["misp-galaxy:mitre-attack-pattern=\"Third-party Software - T1072\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Third-party Software - T1072\""],"Time Providers - T1209":["misp-galaxy:mitre-attack-pattern=\"Time Providers - T1209\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Time Providers - T1209\""],"Timestomp - T1099":["misp-galaxy:mitre-attack-pattern=\"Timestomp - T1099\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Timestomp - T1099\""],"Transmitted Data Manipulation - T1493":["misp-galaxy:mitre-attack-pattern=\"Transmitted Data Manipulation - T1493\""],"Trap - T1154":["misp-galaxy:mitre-attack-pattern=\"Trap - T1154\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Trap - T1154\""],"Trusted Developer Utilities - T1127":["misp-galaxy:mitre-attack-pattern=\"Trusted Developer Utilities - T1127\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Trusted Developer Utilities - T1127\""],"Trusted Relationship - T1199":["misp-galaxy:mitre-attack-pattern=\"Trusted Relationship - T1199\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Trusted Relationship - T1199\""],"Two-Factor Authentication Interception - T1111":["misp-galaxy:mitre-attack-pattern=\"Two-Factor Authentication Interception - T1111\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Two-Factor Authentication Interception - T1111\""],"URL Scheme Hijacking - T1415":["misp-galaxy:mitre-attack-pattern=\"URL Scheme Hijacking - T1415\""],"Unauthorized user introduces compromise delivery mechanism - T1387":["misp-galaxy:mitre-attack-pattern=\"Unauthorized user introduces compromise delivery mechanism - T1387\""],"Uncommonly Used Port - T1065":["misp-galaxy:mitre-attack-pattern=\"Uncommonly Used Port - T1065\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Uncommonly Used Port - T1065\""],"Unconditional client-side exploitation\/Injected Website\/Driveby - T1372":["misp-galaxy:mitre-attack-pattern=\"Unconditional client-side exploitation\/Injected Website\/Driveby - T1372\""],"Untargeted client-side exploitation - T1370":["misp-galaxy:mitre-attack-pattern=\"Untargeted client-side exploitation - T1370\""],"Upload, install, and configure software\/tools - T1362":["misp-galaxy:mitre-attack-pattern=\"Upload, install, and configure software\/tools - T1362\""],"Use multiple DNS infrastructures - T1327":["misp-galaxy:mitre-attack-pattern=\"Use multiple DNS infrastructures - T1327\""],"User Execution - T1204":["misp-galaxy:mitre-attack-pattern=\"User Execution - T1204\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"User Execution - T1204\""],"User Interface Spoofing - T1411":["misp-galaxy:mitre-attack-pattern=\"User Interface Spoofing - T1411\""],"Valid Accounts - T1078":["misp-galaxy:mitre-attack-pattern=\"Valid Accounts - T1078\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Valid Accounts - T1078\""],"Video Capture - T1125":["misp-galaxy:mitre-attack-pattern=\"Video Capture - T1125\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Video Capture - T1125\""],"Virtualization\/Sandbox Evasion - T1497":["misp-galaxy:mitre-attack-pattern=\"Virtualization\/Sandbox Evasion - T1497\""],"Web Service - T1102":["misp-galaxy:mitre-attack-pattern=\"Web Service - T1102\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Web Service - T1102\""],"Web Service - T1481":["misp-galaxy:mitre-attack-pattern=\"Web Service - T1481\""],"Web Shell - T1100":["misp-galaxy:mitre-attack-pattern=\"Web Shell - T1100\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Web Shell - T1100\""],"Windows Admin Shares - T1077":["misp-galaxy:mitre-attack-pattern=\"Windows Admin Shares - T1077\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Windows Admin Shares - T1077\""],"Windows Management Instrumentation - T1047":["misp-galaxy:mitre-attack-pattern=\"Windows Management Instrumentation - T1047\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Windows Management Instrumentation - T1047\""],"Windows Management Instrumentation Event Subscription - T1084":["misp-galaxy:mitre-attack-pattern=\"Windows Management Instrumentation Event Subscription - T1084\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Windows Management Instrumentation Event Subscription - T1084\""],"Windows Remote Management - T1028":["misp-galaxy:mitre-attack-pattern=\"Windows Remote Management - T1028\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Windows Remote Management - T1028\""],"Winlogon Helper DLL - T1004":["misp-galaxy:mitre-attack-pattern=\"Winlogon Helper DLL - T1004\"","misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Winlogon Helper DLL - T1004\""],"Wipe Device Data - T1447":["misp-galaxy:mitre-attack-pattern=\"Wipe Device Data - T1447\""],"XSL Script Processing - T1220":["misp-galaxy:mitre-attack-pattern=\"XSL Script Processing - T1220\""],".bash_profile and .bashrc Mitigation - T1156":["misp-galaxy:mitre-course-of-action=\".bash_profile and .bashrc Mitigation - T1156\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\".bash_profile and .bashrc Mitigation - T1156\""],"Access Token Manipulation Mitigation - T1134":["misp-galaxy:mitre-course-of-action=\"Access Token Manipulation Mitigation - T1134\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Access Token Manipulation Mitigation - T1134\""],"Accessibility Features Mitigation - T1015":["misp-galaxy:mitre-course-of-action=\"Accessibility Features Mitigation - T1015\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Accessibility Features Mitigation - T1015\""],"Account Discovery Mitigation - T1087":["misp-galaxy:mitre-course-of-action=\"Account Discovery Mitigation - T1087\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Account Discovery Mitigation - T1087\""],"Account Manipulation Mitigation - T1098":["misp-galaxy:mitre-course-of-action=\"Account Manipulation Mitigation - T1098\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Account Manipulation Mitigation - T1098\""],"AppCert DLLs Mitigation - T1182":["misp-galaxy:mitre-course-of-action=\"AppCert DLLs Mitigation - T1182\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"AppCert DLLs Mitigation - T1182\""],"AppInit DLLs Mitigation - T1103":["misp-galaxy:mitre-course-of-action=\"AppInit DLLs Mitigation - T1103\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"AppInit DLLs Mitigation - T1103\""],"AppleScript Mitigation - T1155":["misp-galaxy:mitre-course-of-action=\"AppleScript Mitigation - T1155\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"AppleScript Mitigation - T1155\""],"Application Deployment Software Mitigation - T1017":["misp-galaxy:mitre-course-of-action=\"Application Deployment Software Mitigation - T1017\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Application Deployment Software Mitigation - T1017\""],"Application Developer Guidance - M1013":["misp-galaxy:mitre-course-of-action=\"Application Developer Guidance - M1013\""],"Application Shimming Mitigation - T1138":["misp-galaxy:mitre-course-of-action=\"Application Shimming Mitigation - T1138\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Application Shimming Mitigation - T1138\""],"Application Vetting - M1005":["misp-galaxy:mitre-course-of-action=\"Application Vetting - M1005\""],"Application Window Discovery Mitigation - T1010":["misp-galaxy:mitre-course-of-action=\"Application Window Discovery Mitigation - T1010\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Application Window Discovery Mitigation - T1010\""],"Attestation - M1002":["misp-galaxy:mitre-course-of-action=\"Attestation - M1002\""],"Audio Capture Mitigation - T1123":["misp-galaxy:mitre-course-of-action=\"Audio Capture Mitigation - T1123\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Audio Capture Mitigation - T1123\""],"Authentication Package Mitigation - T1131":["misp-galaxy:mitre-course-of-action=\"Authentication Package Mitigation - T1131\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Authentication Package Mitigation - T1131\""],"Automated Collection Mitigation - T1119":["misp-galaxy:mitre-course-of-action=\"Automated Collection Mitigation - T1119\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Automated Collection Mitigation - T1119\""],"Automated Exfiltration Mitigation - T1020":["misp-galaxy:mitre-course-of-action=\"Automated Exfiltration Mitigation - T1020\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Automated Exfiltration Mitigation - T1020\""],"BITS Jobs Mitigation - T1197":["misp-galaxy:mitre-course-of-action=\"BITS Jobs Mitigation - T1197\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"BITS Jobs Mitigation - T1197\""],"Bash History Mitigation - T1139":["misp-galaxy:mitre-course-of-action=\"Bash History Mitigation - T1139\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Bash History Mitigation - T1139\""],"Binary Padding Mitigation - T1009":["misp-galaxy:mitre-course-of-action=\"Binary Padding Mitigation - T1009\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Binary Padding Mitigation - T1009\""],"Bootkit Mitigation - T1067":["misp-galaxy:mitre-course-of-action=\"Bootkit Mitigation - T1067\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Bootkit Mitigation - T1067\""],"Browser Bookmark Discovery Mitigation - T1217":["misp-galaxy:mitre-course-of-action=\"Browser Bookmark Discovery Mitigation - T1217\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Browser Bookmark Discovery Mitigation - T1217\""],"Browser Extensions Mitigation - T1176":["misp-galaxy:mitre-course-of-action=\"Browser Extensions Mitigation - T1176\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Browser Extensions Mitigation - T1176\""],"Brute Force Mitigation - T1110":["misp-galaxy:mitre-course-of-action=\"Brute Force Mitigation - T1110\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Brute Force Mitigation - T1110\""],"Bypass User Account Control Mitigation - T1088":["misp-galaxy:mitre-course-of-action=\"Bypass User Account Control Mitigation - T1088\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Bypass User Account Control Mitigation - T1088\""],"CMSTP Mitigation - T1191":["misp-galaxy:mitre-course-of-action=\"CMSTP Mitigation - T1191\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"CMSTP Mitigation - T1191\""],"Caution with Device Administrator Access - M1007":["misp-galaxy:mitre-course-of-action=\"Caution with Device Administrator Access - M1007\""],"Change Default File Association Mitigation - T1042":["misp-galaxy:mitre-course-of-action=\"Change Default File Association Mitigation - T1042\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Change Default File Association Mitigation - T1042\""],"Clear Command History Mitigation - T1146":["misp-galaxy:mitre-course-of-action=\"Clear Command History Mitigation - T1146\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Clear Command History Mitigation - T1146\""],"Clipboard Data Mitigation - T1115":["misp-galaxy:mitre-course-of-action=\"Clipboard Data Mitigation - T1115\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Clipboard Data Mitigation - T1115\""],"Code Signing Mitigation - T1116":["misp-galaxy:mitre-course-of-action=\"Code Signing Mitigation - T1116\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Code Signing Mitigation - T1116\""],"Command-Line Interface Mitigation - T1059":["misp-galaxy:mitre-course-of-action=\"Command-Line Interface Mitigation - T1059\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Command-Line Interface Mitigation - T1059\""],"Commonly Used Port Mitigation - T1043":["misp-galaxy:mitre-course-of-action=\"Commonly Used Port Mitigation - T1043\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Commonly Used Port Mitigation - T1043\""],"Communication Through Removable Media Mitigation - T1092":["misp-galaxy:mitre-course-of-action=\"Communication Through Removable Media Mitigation - T1092\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Communication Through Removable Media Mitigation - T1092\""],"Compile After Delivery Mitigation - T1502":["misp-galaxy:mitre-course-of-action=\"Compile After Delivery Mitigation - T1502\""],"Compiled HTML File Mitigation - T1223":["misp-galaxy:mitre-course-of-action=\"Compiled HTML File Mitigation - T1223\""],"Component Firmware Mitigation - T1109":["misp-galaxy:mitre-course-of-action=\"Component Firmware Mitigation - T1109\""],"Component Object Model Hijacking Mitigation - T1122":["misp-galaxy:mitre-course-of-action=\"Component Object Model Hijacking Mitigation - T1122\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Component Object Model Hijacking Mitigation - T1122\""],"Connection Proxy Mitigation - T1090":["misp-galaxy:mitre-course-of-action=\"Connection Proxy Mitigation - T1090\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Connection Proxy Mitigation - T1090\""],"Control Panel Items Mitigation - T1196":["misp-galaxy:mitre-course-of-action=\"Control Panel Items Mitigation - T1196\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Control Panel Items Mitigation - T1196\""],"Create Account Mitigation - T1136":["misp-galaxy:mitre-course-of-action=\"Create Account Mitigation - T1136\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Create Account Mitigation - T1136\""],"Credential Dumping Mitigation - T1003":["misp-galaxy:mitre-course-of-action=\"Credential Dumping Mitigation - T1003\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Credential Dumping Mitigation - T1003\""],"Credentials in Files Mitigation - T1081":["misp-galaxy:mitre-course-of-action=\"Credentials in Files Mitigation - T1081\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Credentials in Files Mitigation - T1081\""],"Credentials in Registry Mitigation - T1214":["misp-galaxy:mitre-course-of-action=\"Credentials in Registry Mitigation - T1214\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Credentials in Registry Mitigation - T1214\""],"Custom Command and Control Protocol Mitigation - T1094":["misp-galaxy:mitre-course-of-action=\"Custom Command and Control Protocol Mitigation - T1094\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Custom Command and Control Protocol Mitigation - T1094\""],"Custom Cryptographic Protocol Mitigation - T1024":["misp-galaxy:mitre-course-of-action=\"Custom Cryptographic Protocol Mitigation - T1024\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Custom Cryptographic Protocol Mitigation - T1024\""],"DCShadow Mitigation - T1207":["misp-galaxy:mitre-course-of-action=\"DCShadow Mitigation - T1207\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"DCShadow Mitigation - T1207\""],"DLL Search Order Hijacking Mitigation - T1038":["misp-galaxy:mitre-course-of-action=\"DLL Search Order Hijacking Mitigation - T1038\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"DLL Search Order Hijacking Mitigation - T1038\""],"DLL Side-Loading Mitigation - T1073":["misp-galaxy:mitre-course-of-action=\"DLL Side-Loading Mitigation - T1073\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"DLL Side-Loading Mitigation - T1073\""],"Data Compressed Mitigation - T1002":["misp-galaxy:mitre-course-of-action=\"Data Compressed Mitigation - T1002\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Compressed Mitigation - T1002\""],"Data Destruction Mitigation - T1488":["misp-galaxy:mitre-course-of-action=\"Data Destruction Mitigation - T1488\""],"Data Encoding Mitigation - T1132":["misp-galaxy:mitre-course-of-action=\"Data Encoding Mitigation - T1132\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Encoding Mitigation - T1132\""],"Data Encrypted Mitigation - T1022":["misp-galaxy:mitre-course-of-action=\"Data Encrypted Mitigation - T1022\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Encrypted Mitigation - T1022\""],"Data Encrypted for Impact Mitigation - T1486":["misp-galaxy:mitre-course-of-action=\"Data Encrypted for Impact Mitigation - T1486\""],"Data Obfuscation Mitigation - T1001":["misp-galaxy:mitre-course-of-action=\"Data Obfuscation Mitigation - T1001\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Obfuscation Mitigation - T1001\""],"Data Staged Mitigation - T1074":["misp-galaxy:mitre-course-of-action=\"Data Staged Mitigation - T1074\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Staged Mitigation - T1074\""],"Data Transfer Size Limits Mitigation - T1030":["misp-galaxy:mitre-course-of-action=\"Data Transfer Size Limits Mitigation - T1030\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data Transfer Size Limits Mitigation - T1030\""],"Data from Information Repositories Mitigation - T1213":["misp-galaxy:mitre-course-of-action=\"Data from Information Repositories Mitigation - T1213\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data from Information Repositories Mitigation - T1213\""],"Data from Local System Mitigation - T1005":["misp-galaxy:mitre-course-of-action=\"Data from Local System Mitigation - T1005\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data from Local System Mitigation - T1005\""],"Data from Network Shared Drive Mitigation - T1039":["misp-galaxy:mitre-course-of-action=\"Data from Network Shared Drive Mitigation - T1039\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data from Network Shared Drive Mitigation - T1039\""],"Data from Removable Media Mitigation - T1025":["misp-galaxy:mitre-course-of-action=\"Data from Removable Media Mitigation - T1025\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Data from Removable Media Mitigation - T1025\""],"Defacement Mitigation - T1491":["misp-galaxy:mitre-course-of-action=\"Defacement Mitigation - T1491\""],"Deobfuscate\/Decode Files or Information Mitigation - T1140":["misp-galaxy:mitre-course-of-action=\"Deobfuscate\/Decode Files or Information Mitigation - T1140\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Deobfuscate\/Decode Files or Information Mitigation - T1140\""],"Deploy Compromised Device Detection Method - M1010":["misp-galaxy:mitre-course-of-action=\"Deploy Compromised Device Detection Method - M1010\""],"Disabling Security Tools Mitigation - T1089":["misp-galaxy:mitre-course-of-action=\"Disabling Security Tools Mitigation - T1089\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Disabling Security Tools Mitigation - T1089\""],"Distributed Component Object Model Mitigation - T1175":["misp-galaxy:mitre-course-of-action=\"Distributed Component Object Model Mitigation - T1175\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Distributed Component Object Model Mitigation - T1175\""],"Domain Fronting Mitigation - T1172":["misp-galaxy:mitre-course-of-action=\"Domain Fronting Mitigation - T1172\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Domain Fronting Mitigation - T1172\""],"Domain Generation Algorithms Mitigation - T1483":["misp-galaxy:mitre-course-of-action=\"Domain Generation Algorithms Mitigation - T1483\""],"Domain Trust Discovery Mitigation - T1482":["misp-galaxy:mitre-course-of-action=\"Domain Trust Discovery Mitigation - T1482\""],"Drive-by Compromise Mitigation - T1189":["misp-galaxy:mitre-course-of-action=\"Drive-by Compromise Mitigation - T1189\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Drive-by Compromise Mitigation - T1189\""],"Dylib Hijacking Mitigation - T1157":["misp-galaxy:mitre-course-of-action=\"Dylib Hijacking Mitigation - T1157\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Dylib Hijacking Mitigation - T1157\""],"Dynamic Data Exchange Mitigation - T1173":["misp-galaxy:mitre-course-of-action=\"Dynamic Data Exchange Mitigation - T1173\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Dynamic Data Exchange Mitigation - T1173\""],"Email Collection Mitigation - T1114":["misp-galaxy:mitre-course-of-action=\"Email Collection Mitigation - T1114\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Email Collection Mitigation - T1114\""],"Encrypt Network Traffic - M1009":["misp-galaxy:mitre-course-of-action=\"Encrypt Network Traffic - M1009\""],"Endpoint Denial of Service Mitigation - T1499":["misp-galaxy:mitre-course-of-action=\"Endpoint Denial of Service Mitigation - T1499\""],"Enterprise Policy - M1012":["misp-galaxy:mitre-course-of-action=\"Enterprise Policy - M1012\""],"Environmental Keying Mitigation - T1480":["misp-galaxy:mitre-course-of-action=\"Environmental Keying Mitigation - T1480\""],"Execution through API Mitigation - T1106":["misp-galaxy:mitre-course-of-action=\"Execution through API Mitigation - T1106\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Execution through API Mitigation - T1106\""],"Execution through Module Load Mitigation - T1129":["misp-galaxy:mitre-course-of-action=\"Execution through Module Load Mitigation - T1129\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Execution through Module Load Mitigation - T1129\""],"Exfiltration Over Alternative Protocol Mitigation - T1048":["misp-galaxy:mitre-course-of-action=\"Exfiltration Over Alternative Protocol Mitigation - T1048\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exfiltration Over Alternative Protocol Mitigation - T1048\""],"Exfiltration Over Command and Control Channel Mitigation - T1041":["misp-galaxy:mitre-course-of-action=\"Exfiltration Over Command and Control Channel Mitigation - T1041\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exfiltration Over Command and Control Channel Mitigation - T1041\""],"Exfiltration Over Other Network Medium Mitigation - T1011":["misp-galaxy:mitre-course-of-action=\"Exfiltration Over Other Network Medium Mitigation - T1011\""],"Exfiltration Over Physical Medium Mitigation - T1052":["misp-galaxy:mitre-course-of-action=\"Exfiltration Over Physical Medium Mitigation - T1052\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exfiltration Over Physical Medium Mitigation - T1052\""],"Exploit Public-Facing Application Mitigation - T1190":["misp-galaxy:mitre-course-of-action=\"Exploit Public-Facing Application Mitigation - T1190\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploit Public-Facing Application Mitigation - T1190\""],"Exploitation for Client Execution Mitigation - T1203":["misp-galaxy:mitre-course-of-action=\"Exploitation for Client Execution Mitigation - T1203\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploitation for Client Execution Mitigation - T1203\""],"Exploitation for Credential Access Mitigation - T1212":["misp-galaxy:mitre-course-of-action=\"Exploitation for Credential Access Mitigation - T1212\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploitation for Credential Access Mitigation - T1212\""],"Exploitation for Defense Evasion Mitigation - T1211":["misp-galaxy:mitre-course-of-action=\"Exploitation for Defense Evasion Mitigation - T1211\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploitation for Defense Evasion Mitigation - T1211\""],"Exploitation for Privilege Escalation Mitigation - T1068":["misp-galaxy:mitre-course-of-action=\"Exploitation for Privilege Escalation Mitigation - T1068\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploitation for Privilege Escalation Mitigation - T1068\""],"Exploitation of Remote Services Mitigation - T1210":["misp-galaxy:mitre-course-of-action=\"Exploitation of Remote Services Mitigation - T1210\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Exploitation of Remote Services Mitigation - T1210\""],"External Remote Services Mitigation - T1133":["misp-galaxy:mitre-course-of-action=\"External Remote Services Mitigation - T1133\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"External Remote Services Mitigation - T1133\""],"Extra Window Memory Injection Mitigation - T1181":["misp-galaxy:mitre-course-of-action=\"Extra Window Memory Injection Mitigation - T1181\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Extra Window Memory Injection Mitigation - T1181\""],"Fallback Channels Mitigation - T1008":["misp-galaxy:mitre-course-of-action=\"Fallback Channels Mitigation - T1008\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Fallback Channels Mitigation - T1008\""],"File Deletion Mitigation - T1107":["misp-galaxy:mitre-course-of-action=\"File Deletion Mitigation - T1107\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"File Deletion Mitigation - T1107\""],"File Permissions Modification Mitigation - T1222":["misp-galaxy:mitre-course-of-action=\"File Permissions Modification Mitigation - T1222\""],"File System Logical Offsets Mitigation - T1006":["misp-galaxy:mitre-course-of-action=\"File System Logical Offsets Mitigation - T1006\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"File System Logical Offsets Mitigation - T1006\""],"File System Permissions Weakness Mitigation - T1044":["misp-galaxy:mitre-course-of-action=\"File System Permissions Weakness Mitigation - T1044\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"File System Permissions Weakness Mitigation - T1044\""],"File and Directory Discovery Mitigation - T1083":["misp-galaxy:mitre-course-of-action=\"File and Directory Discovery Mitigation - T1083\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"File and Directory Discovery Mitigation - T1083\""],"Firmware Corruption Mitigation - T1495":["misp-galaxy:mitre-course-of-action=\"Firmware Corruption Mitigation - T1495\""],"Forced Authentication Mitigation - T1187":["misp-galaxy:mitre-course-of-action=\"Forced Authentication Mitigation - T1187\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Forced Authentication Mitigation - T1187\""],"Gatekeeper Bypass Mitigation - T1144":["misp-galaxy:mitre-course-of-action=\"Gatekeeper Bypass Mitigation - T1144\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Gatekeeper Bypass Mitigation - T1144\""],"Graphical User Interface Mitigation - T1061":["misp-galaxy:mitre-course-of-action=\"Graphical User Interface Mitigation - T1061\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Graphical User Interface Mitigation - T1061\""],"Group Policy Modification Mitigation - T1484":["misp-galaxy:mitre-course-of-action=\"Group Policy Modification Mitigation - T1484\""],"HISTCONTROL Mitigation - T1148":["misp-galaxy:mitre-course-of-action=\"HISTCONTROL Mitigation - T1148\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"HISTCONTROL Mitigation - T1148\""],"Hardware Additions Mitigation - T1200":["misp-galaxy:mitre-course-of-action=\"Hardware Additions Mitigation - T1200\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hardware Additions Mitigation - T1200\""],"Hidden Files and Directories Mitigation - T1158":["misp-galaxy:mitre-course-of-action=\"Hidden Files and Directories Mitigation - T1158\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hidden Files and Directories Mitigation - T1158\""],"Hidden Users Mitigation - T1147":["misp-galaxy:mitre-course-of-action=\"Hidden Users Mitigation - T1147\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hidden Users Mitigation - T1147\""],"Hidden Window Mitigation - T1143":["misp-galaxy:mitre-course-of-action=\"Hidden Window Mitigation - T1143\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hidden Window Mitigation - T1143\""],"Hooking Mitigation - T1179":["misp-galaxy:mitre-course-of-action=\"Hooking Mitigation - T1179\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hooking Mitigation - T1179\""],"Hypervisor Mitigation - T1062":["misp-galaxy:mitre-course-of-action=\"Hypervisor Mitigation - T1062\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Hypervisor Mitigation - T1062\""],"Image File Execution Options Injection Mitigation - T1183":["misp-galaxy:mitre-course-of-action=\"Image File Execution Options Injection Mitigation - T1183\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Image File Execution Options Injection Mitigation - T1183\""],"Indicator Blocking Mitigation - T1054":["misp-galaxy:mitre-course-of-action=\"Indicator Blocking Mitigation - T1054\""],"Indicator Removal from Tools Mitigation - T1066":["misp-galaxy:mitre-course-of-action=\"Indicator Removal from Tools Mitigation - T1066\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Indicator Removal from Tools Mitigation - T1066\""],"Indicator Removal on Host Mitigation - T1070":["misp-galaxy:mitre-course-of-action=\"Indicator Removal on Host Mitigation - T1070\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Indicator Removal on Host Mitigation - T1070\""],"Indirect Command Execution Mitigation - T1202":["misp-galaxy:mitre-course-of-action=\"Indirect Command Execution Mitigation - T1202\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Indirect Command Execution Mitigation - T1202\""],"Inhibit System Recovery Mitigation - T1490":["misp-galaxy:mitre-course-of-action=\"Inhibit System Recovery Mitigation - T1490\""],"Input Capture Mitigation - T1056":["misp-galaxy:mitre-course-of-action=\"Input Capture Mitigation - T1056\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Input Capture Mitigation - T1056\""],"Input Prompt Mitigation - T1141":["misp-galaxy:mitre-course-of-action=\"Input Prompt Mitigation - T1141\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Input Prompt Mitigation - T1141\""],"Install Root Certificate Mitigation - T1130":["misp-galaxy:mitre-course-of-action=\"Install Root Certificate Mitigation - T1130\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Install Root Certificate Mitigation - T1130\""],"InstallUtil Mitigation - T1118":["misp-galaxy:mitre-course-of-action=\"InstallUtil Mitigation - T1118\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"InstallUtil Mitigation - T1118\""],"Interconnection Filtering - M1014":["misp-galaxy:mitre-course-of-action=\"Interconnection Filtering - M1014\""],"Kerberoasting Mitigation - T1208":["misp-galaxy:mitre-course-of-action=\"Kerberoasting Mitigation - T1208\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Kerberoasting Mitigation - T1208\""],"Kernel Modules and Extensions Mitigation - T1215":["misp-galaxy:mitre-course-of-action=\"Kernel Modules and Extensions Mitigation - T1215\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Kernel Modules and Extensions Mitigation - T1215\""],"Keychain Mitigation - T1142":["misp-galaxy:mitre-course-of-action=\"Keychain Mitigation - T1142\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Keychain Mitigation - T1142\""],"LC_LOAD_DYLIB Addition Mitigation - T1161":["misp-galaxy:mitre-course-of-action=\"LC_LOAD_DYLIB Addition Mitigation - T1161\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"LC_LOAD_DYLIB Addition Mitigation - T1161\""],"LC_MAIN Hijacking Mitigation - T1149":["misp-galaxy:mitre-course-of-action=\"LC_MAIN Hijacking Mitigation - T1149\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"LC_MAIN Hijacking Mitigation - T1149\""],"LLMNR\/NBT-NS Poisoning Mitigation - T1171":["misp-galaxy:mitre-course-of-action=\"LLMNR\/NBT-NS Poisoning Mitigation - T1171\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"LLMNR\/NBT-NS Poisoning Mitigation - T1171\""],"LSASS Driver Mitigation - T1177":["misp-galaxy:mitre-course-of-action=\"LSASS Driver Mitigation - T1177\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"LSASS Driver Mitigation - T1177\""],"Launch Agent Mitigation - T1159":["misp-galaxy:mitre-course-of-action=\"Launch Agent Mitigation - T1159\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Launch Agent Mitigation - T1159\""],"Launch Daemon Mitigation - T1160":["misp-galaxy:mitre-course-of-action=\"Launch Daemon Mitigation - T1160\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Launch Daemon Mitigation - T1160\""],"Launchctl Mitigation - T1152":["misp-galaxy:mitre-course-of-action=\"Launchctl Mitigation - T1152\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Launchctl Mitigation - T1152\""],"Local Job Scheduling Mitigation - T1168":["misp-galaxy:mitre-course-of-action=\"Local Job Scheduling Mitigation - T1168\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Local Job Scheduling Mitigation - T1168\""],"Lock Bootloader - M1003":["misp-galaxy:mitre-course-of-action=\"Lock Bootloader - M1003\""],"Login Item Mitigation - T1162":["misp-galaxy:mitre-course-of-action=\"Login Item Mitigation - T1162\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Login Item Mitigation - T1162\""],"Logon Scripts Mitigation - T1037":["misp-galaxy:mitre-course-of-action=\"Logon Scripts Mitigation - T1037\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Logon Scripts Mitigation - T1037\""],"Man in the Browser Mitigation - T1185":["misp-galaxy:mitre-course-of-action=\"Man in the Browser Mitigation - T1185\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Man in the Browser Mitigation - T1185\""],"Masquerading Mitigation - T1036":["misp-galaxy:mitre-course-of-action=\"Masquerading Mitigation - T1036\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Masquerading Mitigation - T1036\""],"Modify Existing Service Mitigation - T1031":["misp-galaxy:mitre-course-of-action=\"Modify Existing Service Mitigation - T1031\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Modify Existing Service Mitigation - T1031\""],"Modify Registry Mitigation - T1112":["misp-galaxy:mitre-course-of-action=\"Modify Registry Mitigation - T1112\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Modify Registry Mitigation - T1112\""],"Mshta Mitigation - T1170":["misp-galaxy:mitre-course-of-action=\"Mshta Mitigation - T1170\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Mshta Mitigation - T1170\""],"Multi-Stage Channels Mitigation - T1104":["misp-galaxy:mitre-course-of-action=\"Multi-Stage Channels Mitigation - T1104\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Multi-Stage Channels Mitigation - T1104\""],"Multi-hop Proxy Mitigation - T1188":["misp-galaxy:mitre-course-of-action=\"Multi-hop Proxy Mitigation - T1188\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Multi-hop Proxy Mitigation - T1188\""],"Multiband Communication Mitigation - T1026":["misp-galaxy:mitre-course-of-action=\"Multiband Communication Mitigation - T1026\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Multiband Communication Mitigation - T1026\""],"Multilayer Encryption Mitigation - T1079":["misp-galaxy:mitre-course-of-action=\"Multilayer Encryption Mitigation - T1079\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Multilayer Encryption Mitigation - T1079\""],"NTFS File Attributes Mitigation - T1096":["misp-galaxy:mitre-course-of-action=\"NTFS File Attributes Mitigation - T1096\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"NTFS File Attributes Mitigation - T1096\""],"Netsh Helper DLL Mitigation - T1128":["misp-galaxy:mitre-course-of-action=\"Netsh Helper DLL Mitigation - T1128\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Netsh Helper DLL Mitigation - T1128\""],"Network Denial of Service Mitigation - T1498":["misp-galaxy:mitre-course-of-action=\"Network Denial of Service Mitigation - T1498\""],"Network Service Scanning Mitigation - T1046":["misp-galaxy:mitre-course-of-action=\"Network Service Scanning Mitigation - T1046\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Network Service Scanning Mitigation - T1046\""],"Network Share Connection Removal Mitigation - T1126":["misp-galaxy:mitre-course-of-action=\"Network Share Connection Removal Mitigation - T1126\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Network Share Connection Removal Mitigation - T1126\""],"Network Share Discovery Mitigation - T1135":["misp-galaxy:mitre-course-of-action=\"Network Share Discovery Mitigation - T1135\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Network Share Discovery Mitigation - T1135\""],"Network Sniffing Mitigation - T1040":["misp-galaxy:mitre-course-of-action=\"Network Sniffing Mitigation - T1040\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Network Sniffing Mitigation - T1040\""],"New Service Mitigation - T1050":["misp-galaxy:mitre-course-of-action=\"New Service Mitigation - T1050\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"New Service Mitigation - T1050\""],"Obfuscated Files or Information Mitigation - T1027":["misp-galaxy:mitre-course-of-action=\"Obfuscated Files or Information Mitigation - T1027\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Obfuscated Files or Information Mitigation - T1027\""],"Office Application Startup Mitigation - T1137":["misp-galaxy:mitre-course-of-action=\"Office Application Startup Mitigation - T1137\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Office Application Startup Mitigation - T1137\""],"Pass the Hash Mitigation - T1075":["misp-galaxy:mitre-course-of-action=\"Pass the Hash Mitigation - T1075\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Pass the Hash Mitigation - T1075\""],"Pass the Ticket Mitigation - T1097":["misp-galaxy:mitre-course-of-action=\"Pass the Ticket Mitigation - T1097\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Pass the Ticket Mitigation - T1097\""],"Password Filter DLL Mitigation - T1174":["misp-galaxy:mitre-course-of-action=\"Password Filter DLL Mitigation - T1174\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Password Filter DLL Mitigation - T1174\""],"Password Policy Discovery Mitigation - T1201":["misp-galaxy:mitre-course-of-action=\"Password Policy Discovery Mitigation - T1201\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Password Policy Discovery Mitigation - T1201\""],"Path Interception Mitigation - T1034":["misp-galaxy:mitre-course-of-action=\"Path Interception Mitigation - T1034\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Path Interception Mitigation - T1034\""],"Peripheral Device Discovery Mitigation - T1120":["misp-galaxy:mitre-course-of-action=\"Peripheral Device Discovery Mitigation - T1120\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Peripheral Device Discovery Mitigation - T1120\""],"Permission Groups Discovery Mitigation - T1069":["misp-galaxy:mitre-course-of-action=\"Permission Groups Discovery Mitigation - T1069\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Permission Groups Discovery Mitigation - T1069\""],"Plist Modification Mitigation - T1150":["misp-galaxy:mitre-course-of-action=\"Plist Modification Mitigation - T1150\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Plist Modification Mitigation - T1150\""],"Port Knocking Mitigation - T1205":["misp-galaxy:mitre-course-of-action=\"Port Knocking Mitigation - T1205\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Port Knocking Mitigation - T1205\""],"Port Monitors Mitigation - T1013":["misp-galaxy:mitre-course-of-action=\"Port Monitors Mitigation - T1013\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Port Monitors Mitigation - T1013\""],"PowerShell Mitigation - T1086":["misp-galaxy:mitre-course-of-action=\"PowerShell Mitigation - T1086\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"PowerShell Mitigation - T1086\""],"Private Keys Mitigation - T1145":["misp-galaxy:mitre-course-of-action=\"Private Keys Mitigation - T1145\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Private Keys Mitigation - T1145\""],"Process Discovery Mitigation - T1057":["misp-galaxy:mitre-course-of-action=\"Process Discovery Mitigation - T1057\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Process Discovery Mitigation - T1057\""],"Process Doppelg\u00e4nging Mitigation - T1186":["misp-galaxy:mitre-course-of-action=\"Process Doppelg\u00e4nging Mitigation - T1186\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Process Doppelg\u00e4nging Mitigation - T1186\""],"Process Hollowing Mitigation - T1093":["misp-galaxy:mitre-course-of-action=\"Process Hollowing Mitigation - T1093\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Process Hollowing Mitigation - T1093\""],"Process Injection Mitigation - T1055":["misp-galaxy:mitre-course-of-action=\"Process Injection Mitigation - T1055\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Process Injection Mitigation - T1055\""],"Query Registry Mitigation - T1012":["misp-galaxy:mitre-course-of-action=\"Query Registry Mitigation - T1012\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Query Registry Mitigation - T1012\""],"Rc.common Mitigation - T1163":["misp-galaxy:mitre-course-of-action=\"Rc.common Mitigation - T1163\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Rc.common Mitigation - T1163\""],"Re-opened Applications Mitigation - T1164":["misp-galaxy:mitre-course-of-action=\"Re-opened Applications Mitigation - T1164\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Re-opened Applications Mitigation - T1164\""],"Redundant Access Mitigation - T1108":["misp-galaxy:mitre-course-of-action=\"Redundant Access Mitigation - T1108\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Redundant Access Mitigation - T1108\""],"Registry Run Keys \/ Startup Folder Mitigation - T1060":["misp-galaxy:mitre-course-of-action=\"Registry Run Keys \/ Startup Folder Mitigation - T1060\""],"Regsvcs\/Regasm Mitigation - T1121":["misp-galaxy:mitre-course-of-action=\"Regsvcs\/Regasm Mitigation - T1121\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Regsvcs\/Regasm Mitigation - T1121\""],"Regsvr32 Mitigation - T1117":["misp-galaxy:mitre-course-of-action=\"Regsvr32 Mitigation - T1117\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Regsvr32 Mitigation - T1117\""],"Remote Access Tools Mitigation - T1219":["misp-galaxy:mitre-course-of-action=\"Remote Access Tools Mitigation - T1219\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Remote Access Tools Mitigation - T1219\""],"Remote Desktop Protocol Mitigation - T1076":["misp-galaxy:mitre-course-of-action=\"Remote Desktop Protocol Mitigation - T1076\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Remote Desktop Protocol Mitigation - T1076\""],"Remote File Copy Mitigation - T1105":["misp-galaxy:mitre-course-of-action=\"Remote File Copy Mitigation - T1105\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Remote File Copy Mitigation - T1105\""],"Remote Services Mitigation - T1021":["misp-galaxy:mitre-course-of-action=\"Remote Services Mitigation - T1021\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Remote Services Mitigation - T1021\""],"Remote System Discovery Mitigation - T1018":["misp-galaxy:mitre-course-of-action=\"Remote System Discovery Mitigation - T1018\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Remote System Discovery Mitigation - T1018\""],"Replication Through Removable Media Mitigation - T1091":["misp-galaxy:mitre-course-of-action=\"Replication Through Removable Media Mitigation - T1091\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Replication Through Removable Media Mitigation - T1091\""],"Resource Hijacking Mitigation - T1496":["misp-galaxy:mitre-course-of-action=\"Resource Hijacking Mitigation - T1496\""],"Rootkit Mitigation - T1014":["misp-galaxy:mitre-course-of-action=\"Rootkit Mitigation - T1014\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Rootkit Mitigation - T1014\""],"Rundll32 Mitigation - T1085":["misp-galaxy:mitre-course-of-action=\"Rundll32 Mitigation - T1085\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Rundll32 Mitigation - T1085\""],"Runtime Data Manipulation Mitigation - T1494":["misp-galaxy:mitre-course-of-action=\"Runtime Data Manipulation Mitigation - T1494\""],"SID-History Injection Mitigation - T1178":["misp-galaxy:mitre-course-of-action=\"SID-History Injection Mitigation - T1178\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"SID-History Injection Mitigation - T1178\""],"SIP and Trust Provider Hijacking Mitigation - T1198":["misp-galaxy:mitre-course-of-action=\"SIP and Trust Provider Hijacking Mitigation - T1198\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"SIP and Trust Provider Hijacking Mitigation - T1198\""],"SSH Hijacking Mitigation - T1184":["misp-galaxy:mitre-course-of-action=\"SSH Hijacking Mitigation - T1184\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"SSH Hijacking Mitigation - T1184\""],"Scheduled Task Mitigation - T1053":["misp-galaxy:mitre-course-of-action=\"Scheduled Task Mitigation - T1053\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Scheduled Task Mitigation - T1053\""],"Scheduled Transfer Mitigation - T1029":["misp-galaxy:mitre-course-of-action=\"Scheduled Transfer Mitigation - T1029\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Scheduled Transfer Mitigation - T1029\""],"Screen Capture Mitigation - T1113":["misp-galaxy:mitre-course-of-action=\"Screen Capture Mitigation - T1113\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Screen Capture Mitigation - T1113\""],"Screensaver Mitigation - T1180":["misp-galaxy:mitre-course-of-action=\"Screensaver Mitigation - T1180\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Screensaver Mitigation - T1180\""],"Scripting Mitigation - T1064":["misp-galaxy:mitre-course-of-action=\"Scripting Mitigation - T1064\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Scripting Mitigation - T1064\""],"Security Software Discovery Mitigation - T1063":["misp-galaxy:mitre-course-of-action=\"Security Software Discovery Mitigation - T1063\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Security Software Discovery Mitigation - T1063\""],"Security Support Provider Mitigation - T1101":["misp-galaxy:mitre-course-of-action=\"Security Support Provider Mitigation - T1101\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Security Support Provider Mitigation - T1101\""],"Security Updates - M1001":["misp-galaxy:mitre-course-of-action=\"Security Updates - M1001\""],"Service Execution Mitigation - T1035":["misp-galaxy:mitre-course-of-action=\"Service Execution Mitigation - T1035\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Service Execution Mitigation - T1035\""],"Service Registry Permissions Weakness Mitigation - T1058":["misp-galaxy:mitre-course-of-action=\"Service Registry Permissions Weakness Mitigation - T1058\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Service Registry Permissions Weakness Mitigation - T1058\""],"Service Stop Mitigation - T1489":["misp-galaxy:mitre-course-of-action=\"Service Stop Mitigation - T1489\""],"Setuid and Setgid Mitigation - T1166":["misp-galaxy:mitre-course-of-action=\"Setuid and Setgid Mitigation - T1166\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Setuid and Setgid Mitigation - T1166\""],"Shared Webroot Mitigation - T1051":["misp-galaxy:mitre-course-of-action=\"Shared Webroot Mitigation - T1051\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Shared Webroot Mitigation - T1051\""],"Shortcut Modification Mitigation - T1023":["misp-galaxy:mitre-course-of-action=\"Shortcut Modification Mitigation - T1023\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Shortcut Modification Mitigation - T1023\""],"Signed Binary Proxy Execution Mitigation - T1218":["misp-galaxy:mitre-course-of-action=\"Signed Binary Proxy Execution Mitigation - T1218\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Signed Binary Proxy Execution Mitigation - T1218\""],"Signed Script Proxy Execution Mitigation - T1216":["misp-galaxy:mitre-course-of-action=\"Signed Script Proxy Execution Mitigation - T1216\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Signed Script Proxy Execution Mitigation - T1216\""],"Software Packing Mitigation - T1045":["misp-galaxy:mitre-course-of-action=\"Software Packing Mitigation - T1045\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Software Packing Mitigation - T1045\""],"Source Mitigation - T1153":["misp-galaxy:mitre-course-of-action=\"Source Mitigation - T1153\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Source Mitigation - T1153\""],"Space after Filename Mitigation - T1151":["misp-galaxy:mitre-course-of-action=\"Space after Filename Mitigation - T1151\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Space after Filename Mitigation - T1151\""],"Spearphishing Attachment Mitigation - T1193":["misp-galaxy:mitre-course-of-action=\"Spearphishing Attachment Mitigation - T1193\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Spearphishing Attachment Mitigation - T1193\""],"Spearphishing Link Mitigation - T1192":["misp-galaxy:mitre-course-of-action=\"Spearphishing Link Mitigation - T1192\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Spearphishing Link Mitigation - T1192\""],"Spearphishing via Service Mitigation - T1194":["misp-galaxy:mitre-course-of-action=\"Spearphishing via Service Mitigation - T1194\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Spearphishing via Service Mitigation - T1194\""],"Standard Application Layer Protocol Mitigation - T1071":["misp-galaxy:mitre-course-of-action=\"Standard Application Layer Protocol Mitigation - T1071\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Standard Application Layer Protocol Mitigation - T1071\""],"Standard Cryptographic Protocol Mitigation - T1032":["misp-galaxy:mitre-course-of-action=\"Standard Cryptographic Protocol Mitigation - T1032\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Standard Cryptographic Protocol Mitigation - T1032\""],"Standard Non-Application Layer Protocol Mitigation - T1095":["misp-galaxy:mitre-course-of-action=\"Standard Non-Application Layer Protocol Mitigation - T1095\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Standard Non-Application Layer Protocol Mitigation - T1095\""],"Startup Items Mitigation - T1165":["misp-galaxy:mitre-course-of-action=\"Startup Items Mitigation - T1165\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Startup Items Mitigation - T1165\""],"Stored Data Manipulation Mitigation - T1492":["misp-galaxy:mitre-course-of-action=\"Stored Data Manipulation Mitigation - T1492\""],"Sudo Caching Mitigation - T1206":["misp-galaxy:mitre-course-of-action=\"Sudo Caching Mitigation - T1206\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Sudo Caching Mitigation - T1206\""],"Sudo Mitigation - T1169":["misp-galaxy:mitre-course-of-action=\"Sudo Mitigation - T1169\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Sudo Mitigation - T1169\""],"Supply Chain Compromise Mitigation - T1195":["misp-galaxy:mitre-course-of-action=\"Supply Chain Compromise Mitigation - T1195\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Supply Chain Compromise Mitigation - T1195\""],"System Firmware Mitigation - T1019":["misp-galaxy:mitre-course-of-action=\"System Firmware Mitigation - T1019\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Firmware Mitigation - T1019\""],"System Information Discovery Mitigation - T1082":["misp-galaxy:mitre-course-of-action=\"System Information Discovery Mitigation - T1082\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Information Discovery Mitigation - T1082\""],"System Network Configuration Discovery Mitigation - T1016":["misp-galaxy:mitre-course-of-action=\"System Network Configuration Discovery Mitigation - T1016\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Network Configuration Discovery Mitigation - T1016\""],"System Network Connections Discovery Mitigation - T1049":["misp-galaxy:mitre-course-of-action=\"System Network Connections Discovery Mitigation - T1049\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Network Connections Discovery Mitigation - T1049\""],"System Owner\/User Discovery Mitigation - T1033":["misp-galaxy:mitre-course-of-action=\"System Owner\/User Discovery Mitigation - T1033\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Owner\/User Discovery Mitigation - T1033\""],"System Owner\/User Discovery Mitigation - T1482":["misp-galaxy:mitre-course-of-action=\"System Owner\/User Discovery Mitigation - T1482\""],"System Partition Integrity - M1004":["misp-galaxy:mitre-course-of-action=\"System Partition Integrity - M1004\""],"System Service Discovery Mitigation - T1007":["misp-galaxy:mitre-course-of-action=\"System Service Discovery Mitigation - T1007\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Service Discovery Mitigation - T1007\""],"System Time Discovery Mitigation - T1124":["misp-galaxy:mitre-course-of-action=\"System Time Discovery Mitigation - T1124\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"System Time Discovery Mitigation - T1124\""],"Systemd Service Mitigation - T1501":["misp-galaxy:mitre-course-of-action=\"Systemd Service Mitigation - T1501\""],"Taint Shared Content Mitigation - T1080":["misp-galaxy:mitre-course-of-action=\"Taint Shared Content Mitigation - T1080\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Taint Shared Content Mitigation - T1080\""],"Template Injection Mitigation - T1221":["misp-galaxy:mitre-course-of-action=\"Template Injection Mitigation - T1221\""],"Third-party Software Mitigation - T1072":["misp-galaxy:mitre-course-of-action=\"Third-party Software Mitigation - T1072\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Third-party Software Mitigation - T1072\""],"Time Providers Mitigation - T1209":["misp-galaxy:mitre-course-of-action=\"Time Providers Mitigation - T1209\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Time Providers Mitigation - T1209\""],"Timestomp Mitigation - T1099":["misp-galaxy:mitre-course-of-action=\"Timestomp Mitigation - T1099\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Timestomp Mitigation - T1099\""],"Transmitted Data Manipulation Mitigation - T1493":["misp-galaxy:mitre-course-of-action=\"Transmitted Data Manipulation Mitigation - T1493\""],"Trap Mitigation - T1154":["misp-galaxy:mitre-course-of-action=\"Trap Mitigation - T1154\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Trap Mitigation - T1154\""],"Trusted Developer Utilities Mitigation - T1127":["misp-galaxy:mitre-course-of-action=\"Trusted Developer Utilities Mitigation - T1127\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Trusted Developer Utilities Mitigation - T1127\""],"Trusted Relationship Mitigation - T1199":["misp-galaxy:mitre-course-of-action=\"Trusted Relationship Mitigation - T1199\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Trusted Relationship Mitigation - T1199\""],"Two-Factor Authentication Interception Mitigation - T1111":["misp-galaxy:mitre-course-of-action=\"Two-Factor Authentication Interception Mitigation - T1111\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Two-Factor Authentication Interception Mitigation - T1111\""],"Uncommonly Used Port Mitigation - T1065":["misp-galaxy:mitre-course-of-action=\"Uncommonly Used Port Mitigation - T1065\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Uncommonly Used Port Mitigation - T1065\""],"Use Device-Provided Credential Storage - M1008":["misp-galaxy:mitre-course-of-action=\"Use Device-Provided Credential Storage - M1008\""],"Use Recent OS Version - M1006":["misp-galaxy:mitre-course-of-action=\"Use Recent OS Version - M1006\""],"User Execution Mitigation - T1204":["misp-galaxy:mitre-course-of-action=\"User Execution Mitigation - T1204\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"User Execution Mitigation - T1204\""],"User Guidance - M1011":["misp-galaxy:mitre-course-of-action=\"User Guidance - M1011\""],"Valid Accounts Mitigation - T1078":["misp-galaxy:mitre-course-of-action=\"Valid Accounts Mitigation - T1078\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Valid Accounts Mitigation - T1078\""],"Video Capture Mitigation - T1125":["misp-galaxy:mitre-course-of-action=\"Video Capture Mitigation - T1125\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Video Capture Mitigation - T1125\""],"Virtualization\/Sandbox Evasion Mitigation - T1497":["misp-galaxy:mitre-course-of-action=\"Virtualization\/Sandbox Evasion Mitigation - T1497\""],"Web Service Mitigation - T1102":["misp-galaxy:mitre-course-of-action=\"Web Service Mitigation - T1102\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Web Service Mitigation - T1102\""],"Web Shell Mitigation - T1100":["misp-galaxy:mitre-course-of-action=\"Web Shell Mitigation - T1100\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Web Shell Mitigation - T1100\""],"Windows Admin Shares Mitigation - T1077":["misp-galaxy:mitre-course-of-action=\"Windows Admin Shares Mitigation - T1077\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Windows Admin Shares Mitigation - T1077\""],"Windows Management Instrumentation Event Subscription Mitigation - T1084":["misp-galaxy:mitre-course-of-action=\"Windows Management Instrumentation Event Subscription Mitigation - T1084\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Windows Management Instrumentation Event Subscription Mitigation - T1084\""],"Windows Management Instrumentation Mitigation - T1047":["misp-galaxy:mitre-course-of-action=\"Windows Management Instrumentation Mitigation - T1047\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Windows Management Instrumentation Mitigation - T1047\""],"Windows Remote Management Mitigation - T1028":["misp-galaxy:mitre-course-of-action=\"Windows Remote Management Mitigation - T1028\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Windows Remote Management Mitigation - T1028\""],"Winlogon Helper DLL Mitigation - T1004":["misp-galaxy:mitre-course-of-action=\"Winlogon Helper DLL Mitigation - T1004\"","misp-galaxy:mitre-enterprise-attack-course-of-action=\"Winlogon Helper DLL Mitigation - T1004\""],"XSL Script Processing Mitigation - T1220":["misp-galaxy:mitre-course-of-action=\"XSL Script Processing Mitigation - T1220\""],"Registry Run Keys \/ Start Folder - T1060":["misp-galaxy:mitre-enterprise-attack-attack-pattern=\"Registry Run Keys \/ Start Folder - T1060\""],"Registry Run Keys \/ Start Folder Mitigation - T1060":["misp-galaxy:mitre-enterprise-attack-course-of-action=\"Registry Run Keys \/ Start Folder Mitigation - T1060\""],"APT1 - G0006":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT1 - G0006\""],"APT1":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:threat-actor=\"Comment Crew\""],"Comment Crew":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:threat-actor=\"Comment Crew\""],"Comment Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:threat-actor=\"Comment Crew\""],"Comment Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-intrusion-set=\"APT1 - G0006\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT1 - G0006\"","misp-galaxy:threat-actor=\"Comment Crew\""],"APT12 - G0005":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\""],"APT12":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:threat-actor=\"IXESHE\""],"IXESHE":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:threat-actor=\"IXESHE\""],"DynCalc":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:threat-actor=\"IXESHE\""],"Numbered Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:threat-actor=\"IXESHE\""],"DNSCALC":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-intrusion-set=\"APT12 - G0005\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT12 - G0005\""],"APT16 - G0023":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT16 - G0023\"","misp-galaxy:mitre-intrusion-set=\"APT16 - G0023\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT16 - G0023\""],"APT16":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT16 - G0023\"","misp-galaxy:mitre-intrusion-set=\"APT16 - G0023\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT16 - G0023\"","misp-galaxy:threat-actor=\"APT 16\""],"APT17 - G0025":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT17 - G0025\""],"APT17":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT17 - G0025\"","misp-galaxy:threat-actor=\"Aurora Panda\"","misp-galaxy:threat-actor=\"Axiom\""],"Deputy Dog":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-intrusion-set=\"APT17 - G0025\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT17 - G0025\"","misp-galaxy:threat-actor=\"Aurora Panda\"","misp-galaxy:threat-actor=\"Axiom\""],"APT18 - G0026":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT18 - G0026\"","misp-galaxy:mitre-intrusion-set=\"APT18 - G0026\""],"APT18":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT18 - G0026\"","misp-galaxy:mitre-intrusion-set=\"APT18 - G0026\"","misp-galaxy:threat-actor=\"Wekby\""],"Threat Group-0416":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT18 - G0026\"","misp-galaxy:mitre-intrusion-set=\"APT18 - G0026\""],"TG-0416":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT18 - G0026\"","misp-galaxy:mitre-intrusion-set=\"APT18 - G0026\"","misp-galaxy:threat-actor=\"Wekby\""],"Dynamite Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT18 - G0026\"","misp-galaxy:mitre-intrusion-set=\"APT18 - G0026\"","misp-galaxy:threat-actor=\"Wekby\""],"APT28 - G0007":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\""],"Tsar Team":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Threat Group-4127":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-mobile-attack-intrusion-set=\"APT28 - G0007\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"APT28 - G0007\""],"APT29 - G0016":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\""],"APT29":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\"","misp-galaxy:threat-actor=\"APT 29\""],"The Dukes":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\"","misp-galaxy:threat-actor=\"APT 29\""],"Cozy Bear":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\"","misp-galaxy:threat-actor=\"APT 29\""],"CozyDuke":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\"","misp-galaxy:threat-actor=\"APT 29\""],"APT3 - G0022":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\""],"APT3":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:threat-actor=\"UPS\""],"Gothic Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:threat-actor=\"UPS\""],"Pirpi":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-enterprise-attack-malware=\"SHOTPUT - S0063\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-malware=\"SHOTPUT - S0063\"","misp-galaxy:tool=\"Pirpi\""],"UPS Team":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:threat-actor=\"UPS\""],"Buckeye":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:threat-actor=\"UPS\""],"Threat Group-0110":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\""],"TG-0110":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT3 - G0022\"","misp-galaxy:mitre-intrusion-set=\"APT3 - G0022\"","misp-galaxy:threat-actor=\"UPS\""],"APT30 - G0013":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT30 - G0013\"","misp-galaxy:mitre-intrusion-set=\"APT30 - G0013\""],"APT30":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT30 - G0013\"","misp-galaxy:mitre-intrusion-set=\"APT30 - G0013\"","misp-galaxy:threat-actor=\"APT 30\"","misp-galaxy:threat-actor=\"Naikon\""],"APT32 - G0050":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT32 - G0050\"","misp-galaxy:mitre-intrusion-set=\"APT32 - G0050\""],"APT32":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT32 - G0050\"","misp-galaxy:mitre-intrusion-set=\"APT32 - G0050\"","misp-galaxy:threat-actor=\"APT32\""],"OceanLotus Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT32 - G0050\"","misp-galaxy:threat-actor=\"APT32\""],"APT33 - G0064":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT33 - G0064\"","misp-galaxy:mitre-intrusion-set=\"APT33 - G0064\""],"APT33":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT33 - G0064\"","misp-galaxy:mitre-intrusion-set=\"APT33 - G0064\"","misp-galaxy:threat-actor=\"APT33\"","misp-galaxy:threat-actor=\"MAGNALLIUM\""],"APT34 - G0057":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT34 - G0057\"","misp-galaxy:mitre-intrusion-set=\"APT34 - G0057\""],"APT34":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT34 - G0057\"","misp-galaxy:mitre-intrusion-set=\"OilRig - G0049\"","misp-galaxy:threat-actor=\"APT34\"","misp-galaxy:threat-actor=\"OilRig\""],"APT37 - G0067":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\""],"APT37":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\"","misp-galaxy:threat-actor=\"APT37\""],"ScarCruft":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\"","misp-galaxy:threat-actor=\"ScarCruft\""],"Group123":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\"","misp-galaxy:threat-actor=\"APT37\""],"TEMP.Reaper":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"APT37 - G0067\"","misp-galaxy:mitre-intrusion-set=\"APT37 - G0067\""],"Axiom - G0001":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Axiom - G0001\"","misp-galaxy:mitre-intrusion-set=\"Axiom - G0001\""],"Axiom":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Axiom - G0001\"","misp-galaxy:mitre-intrusion-set=\"Axiom - G0001\"","misp-galaxy:threat-actor=\"Axiom\""],"Group 72":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Axiom - G0001\"","misp-galaxy:mitre-intrusion-set=\"Axiom - G0001\"","misp-galaxy:threat-actor=\"Axiom\""],"BRONZE BUTLER - G0060":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BRONZE BUTLER - G0060\"","misp-galaxy:mitre-intrusion-set=\"BRONZE BUTLER - G0060\""],"BRONZE BUTLER":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BRONZE BUTLER - G0060\"","misp-galaxy:mitre-intrusion-set=\"BRONZE BUTLER - G0060\""],"REDBALDKNIGHT":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BRONZE BUTLER - G0060\"","misp-galaxy:mitre-intrusion-set=\"BRONZE BUTLER - G0060\""],"Tick":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BRONZE BUTLER - G0060\"","misp-galaxy:mitre-intrusion-set=\"BRONZE BUTLER - G0060\"","misp-galaxy:threat-actor=\"Tick\""],"BlackOasis - G0063":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BlackOasis - G0063\"","misp-galaxy:mitre-intrusion-set=\"BlackOasis - G0063\""],"BlackOasis":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"BlackOasis - G0063\"","misp-galaxy:mitre-intrusion-set=\"BlackOasis - G0063\"","misp-galaxy:threat-actor=\"BlackOasis\"","misp-galaxy:tool=\"FINSPY\""],"Carbanak - G0008":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-intrusion-set=\"Carbanak - G0008\""],"Carbon Spider":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:mitre-intrusion-set=\"Carbanak - G0008\"","misp-galaxy:threat-actor=\"Anunak\""],"Charming Kitten - G0058":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Charming Kitten - G0058\"","misp-galaxy:mitre-intrusion-set=\"Charming Kitten - G0058\""],"Charming Kitten":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Charming Kitten - G0058\"","misp-galaxy:mitre-intrusion-set=\"Charming Kitten - G0058\"","misp-galaxy:threat-actor=\"Charming Kitten\""],"Cleaver - G0003":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Cleaver - G0003\""],"Cleaver":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:threat-actor=\"Cleaver\""],"TG-2889":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"Cutting Kitten\""],"Threat Group 2889":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Cleaver - G0003\"","misp-galaxy:threat-actor=\"Cutting Kitten\""],"CopyKittens - G0052":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"CopyKittens - G0052\"","misp-galaxy:mitre-intrusion-set=\"CopyKittens - G0052\""],"CopyKittens":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"CopyKittens - G0052\"","misp-galaxy:mitre-intrusion-set=\"CopyKittens - G0052\"","misp-galaxy:threat-actor=\"CopyKittens\""],"Darkhotel - G0012":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Darkhotel - G0012\"","misp-galaxy:mitre-intrusion-set=\"Darkhotel - G0012\""],"Darkhotel":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Darkhotel - G0012\"","misp-galaxy:mitre-intrusion-set=\"Darkhotel - G0012\""],"Deep Panda - G0009":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\""],"Deep Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Shell Crew\""],"Shell Crew":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Shell Crew\""],"WebMasters":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Shell Crew\""],"KungFu Kittens":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Shell Crew\""],"PinkPanther":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Shell Crew\""],"Black Vine":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:mitre-intrusion-set=\"Deep Panda - G0009\"","misp-galaxy:threat-actor=\"Hurricane Panda\"","misp-galaxy:threat-actor=\"Shell Crew\""],"DragonOK - G0017":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"DragonOK - G0017\"","misp-galaxy:mitre-intrusion-set=\"DragonOK - G0017\""],"DragonOK":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"DragonOK - G0017\"","misp-galaxy:mitre-intrusion-set=\"DragonOK - G0017\"","misp-galaxy:threat-actor=\"DragonOK\""],"Dragonfly - G0035":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Dragonfly - G0035\"","misp-galaxy:mitre-intrusion-set=\"Dragonfly - G0035\""],"Dragonfly":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Dragonfly - G0035\"","misp-galaxy:mitre-intrusion-set=\"Dragonfly - G0035\"","misp-galaxy:threat-actor=\"Energetic Bear\""],"Energetic Bear":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Dragonfly - G0035\"","misp-galaxy:mitre-intrusion-set=\"Dragonfly - G0035\"","misp-galaxy:threat-actor=\"Energetic Bear\""],"Dust Storm - G0031":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Dust Storm - G0031\"","misp-galaxy:mitre-intrusion-set=\"Dust Storm - G0031\""],"Dust Storm":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Dust Storm - G0031\"","misp-galaxy:mitre-intrusion-set=\"Dust Storm - G0031\"","misp-galaxy:threat-actor=\"Dust Storm\""],"Elderwood - G0066":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:mitre-intrusion-set=\"Elderwood - G0066\""],"Elderwood":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:mitre-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:threat-actor=\"Beijing Group\""],"Elderwood Gang":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:mitre-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:threat-actor=\"Beijing Group\""],"Beijing Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:mitre-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:threat-actor=\"Beijing Group\""],"Sneaky Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:mitre-intrusion-set=\"Elderwood - G0066\"","misp-galaxy:threat-actor=\"Beijing Group\""],"Equation - G0020":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Equation - G0020\"","misp-galaxy:mitre-intrusion-set=\"Equation - G0020\""],"Equation":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Equation - G0020\"","misp-galaxy:mitre-intrusion-set=\"Equation - G0020\""],"FIN10 - G0051":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN10 - G0051\"","misp-galaxy:mitre-intrusion-set=\"FIN10 - G0051\""],"FIN10":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN10 - G0051\"","misp-galaxy:mitre-intrusion-set=\"FIN10 - G0051\"","misp-galaxy:threat-actor=\"FIN10\""],"FIN5 - G0053":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN5 - G0053\"","misp-galaxy:mitre-intrusion-set=\"FIN5 - G0053\""],"FIN5":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN5 - G0053\"","misp-galaxy:mitre-intrusion-set=\"FIN5 - G0053\"","misp-galaxy:threat-actor=\"FIN5\""],"FIN6 - G0037":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN6 - G0037\"","misp-galaxy:mitre-intrusion-set=\"FIN6 - G0037\""],"FIN6":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN6 - G0037\"","misp-galaxy:mitre-intrusion-set=\"FIN6 - G0037\"","misp-galaxy:threat-actor=\"FIN6\""],"FIN7 - G0046":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN7 - G0046\"","misp-galaxy:mitre-intrusion-set=\"FIN7 - G0046\""],"FIN7":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN7 - G0046\"","misp-galaxy:mitre-intrusion-set=\"FIN7 - G0046\"","misp-galaxy:threat-actor=\"Anunak\""],"FIN8 - G0061":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN8 - G0061\"","misp-galaxy:mitre-intrusion-set=\"FIN8 - G0061\""],"FIN8":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"FIN8 - G0061\"","misp-galaxy:mitre-intrusion-set=\"FIN8 - G0061\"","misp-galaxy:threat-actor=\"FIN8\""],"GCMAN - G0036":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"GCMAN - G0036\"","misp-galaxy:mitre-intrusion-set=\"GCMAN - G0036\""],"GCMAN":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"GCMAN - G0036\"","misp-galaxy:mitre-intrusion-set=\"GCMAN - G0036\"","misp-galaxy:threat-actor=\"GCMAN\""],"Gamaredon Group - G0047":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Gamaredon Group - G0047\"","misp-galaxy:mitre-intrusion-set=\"Gamaredon Group - G0047\""],"Gamaredon Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Gamaredon Group - G0047\"","misp-galaxy:mitre-intrusion-set=\"Gamaredon Group - G0047\"","misp-galaxy:threat-actor=\"Gamaredon Group\""],"Group5 - G0043":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Group5 - G0043\"","misp-galaxy:mitre-intrusion-set=\"Group5 - G0043\""],"Group5":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Group5 - G0043\"","misp-galaxy:mitre-intrusion-set=\"Group5 - G0043\"","misp-galaxy:threat-actor=\"Group5\""],"Ke3chang - G0004":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\""],"Ke3chang":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\""],"Lazarus Group - G0032":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\""],"Lazarus Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:threat-actor=\"Lazarus Group\""],"HIDDEN COBRA":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\""],"Guardians of Peace":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\""],"ZINC":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\""],"NICKEL ACADEMY":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lazarus Group - G0032\"","misp-galaxy:mitre-intrusion-set=\"Lazarus Group - G0032\""],"Leviathan - G0065":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:mitre-intrusion-set=\"Leviathan - G0065\""],"Leviathan":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:mitre-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:threat-actor=\"Leviathan\""],"TEMP.Periscope":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:mitre-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:threat-actor=\"Leviathan\""],"Lotus Blossom - G0030":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:mitre-intrusion-set=\"Lotus Blossom - G0030\""],"Lotus Blossom":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:mitre-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:threat-actor=\"Lotus Blossom\""],"Spring Dragon":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:mitre-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:threat-actor=\"Lotus Blossom\""],"MONSOON - G0042":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"MONSOON - G0042\"","misp-galaxy:mitre-intrusion-set=\"MONSOON - G0042\""],"Magic Hound - G0059":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\""],"Magic Hound":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Cleaver\""],"Rocket Kitten":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Rocket Kitten\""],"Operation Saffron Rose":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\""],"Ajax Security Team":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Flying Kitten\""],"Operation Woolen-Goldfish":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Rocket Kitten\""],"Newscaster":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Charming Kitten\""],"Cobalt Gypsy":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"OilRig\""],"Moafee - G0002":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Moafee - G0002\"","misp-galaxy:mitre-intrusion-set=\"Moafee - G0002\""],"Moafee":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Moafee - G0002\"","misp-galaxy:mitre-intrusion-set=\"Moafee - G0002\"","misp-galaxy:threat-actor=\"DragonOK\""],"Molerats - G0021":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Molerats - G0021\"","misp-galaxy:mitre-intrusion-set=\"Molerats - G0021\""],"Molerats":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Molerats - G0021\"","misp-galaxy:mitre-intrusion-set=\"Molerats - G0021\"","misp-galaxy:threat-actor=\"Molerats\""],"Operation Molerats":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Molerats - G0021\"","misp-galaxy:mitre-intrusion-set=\"Molerats - G0021\"","misp-galaxy:threat-actor=\"Molerats\""],"Gaza Cybergang":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Molerats - G0021\"","misp-galaxy:mitre-intrusion-set=\"Molerats - G0021\"","misp-galaxy:threat-actor=\"Molerats\""],"MuddyWater - G0069":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:mitre-intrusion-set=\"MuddyWater - G0069\""],"MuddyWater":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:mitre-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:threat-actor=\"MuddyWater\""],"TEMP.Zagros":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:mitre-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:threat-actor=\"MuddyWater\""],"NEODYMIUM - G0055":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"NEODYMIUM - G0055\"","misp-galaxy:mitre-intrusion-set=\"NEODYMIUM - G0055\""],"Naikon - G0019":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Naikon - G0019\"","misp-galaxy:mitre-intrusion-set=\"Naikon - G0019\""],"Night Dragon - G0014":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:mitre-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Night Dragon - G0014\""],"Night Dragon":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:mitre-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:threat-actor=\"Night Dragon\""],"Musical Chairs":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Night Dragon - G0014\"","misp-galaxy:mitre-pre-attack-intrusion-set=\"Night Dragon - G0014\""],"OilRig - G0049":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"OilRig - G0049\"","misp-galaxy:mitre-intrusion-set=\"OilRig - G0049\""],"PLATINUM - G0068":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PLATINUM - G0068\"","misp-galaxy:mitre-intrusion-set=\"PLATINUM - G0068\""],"PROMETHIUM - G0056":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PROMETHIUM - G0056\"","misp-galaxy:mitre-intrusion-set=\"PROMETHIUM - G0056\""],"Patchwork - G0040":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\""],"Patchwork":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:threat-actor=\"Dropping Elephant\""],"Dropping Elephant":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:threat-actor=\"Dropping Elephant\""],"Chinastrats":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:threat-actor=\"Dropping Elephant\""],"MONSOON":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\""],"Operation Hangover":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Patchwork - G0040\"","misp-galaxy:mitre-intrusion-set=\"Patchwork - G0040\""],"PittyTiger - G0011":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PittyTiger - G0011\"","misp-galaxy:mitre-intrusion-set=\"PittyTiger - G0011\""],"PittyTiger":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"PittyTiger - G0011\"","misp-galaxy:mitre-intrusion-set=\"PittyTiger - G0011\"","misp-galaxy:threat-actor=\"Pitty Panda\""],"Poseidon Group - G0033":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Poseidon Group - G0033\"","misp-galaxy:mitre-intrusion-set=\"Poseidon Group - G0033\""],"Poseidon Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Poseidon Group - G0033\"","misp-galaxy:mitre-intrusion-set=\"Poseidon Group - G0033\"","misp-galaxy:threat-actor=\"Poseidon Group\""],"Putter Panda - G0024":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:mitre-intrusion-set=\"Putter Panda - G0024\""],"Putter Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:mitre-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:threat-actor=\"Putter Panda\""],"APT2":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:mitre-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:threat-actor=\"Putter Panda\""],"MSUpdater":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:mitre-intrusion-set=\"Putter Panda - G0024\"","misp-galaxy:threat-actor=\"Putter Panda\"","misp-galaxy:tool=\"MSUpdater\""],"RTM - G0048":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"RTM - G0048\"","misp-galaxy:mitre-intrusion-set=\"RTM - G0048\""],"Sandworm Team - G0034":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Sandworm Team - G0034\"","misp-galaxy:mitre-intrusion-set=\"Sandworm Team - G0034\""],"Sandworm Team":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Sandworm Team - G0034\"","misp-galaxy:mitre-intrusion-set=\"Sandworm Team - G0034\"","misp-galaxy:threat-actor=\"Sandworm\""],"Quedagh":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Sandworm Team - G0034\"","misp-galaxy:mitre-intrusion-set=\"Sandworm Team - G0034\"","misp-galaxy:threat-actor=\"Sandworm\""],"Scarlet Mimic - G0029":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Scarlet Mimic - G0029\"","misp-galaxy:mitre-intrusion-set=\"Scarlet Mimic - G0029\""],"Scarlet Mimic":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Scarlet Mimic - G0029\"","misp-galaxy:mitre-intrusion-set=\"Scarlet Mimic - G0029\"","misp-galaxy:threat-actor=\"Scarlet Mimic\""],"Sowbug - G0054":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Sowbug - G0054\"","misp-galaxy:mitre-intrusion-set=\"Sowbug - G0054\""],"Sowbug":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Sowbug - G0054\"","misp-galaxy:mitre-intrusion-set=\"Sowbug - G0054\"","misp-galaxy:threat-actor=\"Sowbug\""],"Stealth Falcon - G0038":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Stealth Falcon - G0038\"","misp-galaxy:mitre-intrusion-set=\"Stealth Falcon - G0038\""],"Stealth Falcon":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Stealth Falcon - G0038\"","misp-galaxy:mitre-intrusion-set=\"Stealth Falcon - G0038\"","misp-galaxy:threat-actor=\"Stealth Falcon\""],"Strider - G0041":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Strider - G0041\"","misp-galaxy:mitre-intrusion-set=\"Strider - G0041\""],"Strider":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Strider - G0041\"","misp-galaxy:mitre-intrusion-set=\"Strider - G0041\"","misp-galaxy:threat-actor=\"ProjectSauron\""],"ProjectSauron":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Strider - G0041\"","misp-galaxy:mitre-enterprise-attack-malware=\"Remsec - S0125\"","misp-galaxy:mitre-intrusion-set=\"Strider - G0041\"","misp-galaxy:mitre-malware=\"Remsec - S0125\"","misp-galaxy:threat-actor=\"ProjectSauron\""],"Suckfly - G0039":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Suckfly - G0039\"","misp-galaxy:mitre-intrusion-set=\"Suckfly - G0039\""],"Suckfly":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Suckfly - G0039\"","misp-galaxy:mitre-intrusion-set=\"Suckfly - G0039\"","misp-galaxy:threat-actor=\"Suckfly\""],"TA459 - G0062":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"TA459 - G0062\"","misp-galaxy:mitre-intrusion-set=\"TA459 - G0062\""],"TA459":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"TA459 - G0062\"","misp-galaxy:mitre-intrusion-set=\"TA459 - G0062\"","misp-galaxy:threat-actor=\"TA459\""],"Taidoor - G0015":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Taidoor - G0015\"","misp-galaxy:mitre-intrusion-set=\"Taidoor - G0015\""],"Taidoor":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Taidoor - G0015\"","misp-galaxy:mitre-enterprise-attack-malware=\"Taidoor - S0011\"","misp-galaxy:mitre-intrusion-set=\"Taidoor - G0015\"","misp-galaxy:mitre-malware=\"Taidoor - S0011\"","misp-galaxy:threat-actor=\"Taidoor\"","misp-galaxy:tool=\"Taidoor\""],"Threat Group-1314 - G0028":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-1314 - G0028\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-1314 - G0028\""],"Threat Group-1314":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-1314 - G0028\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-1314 - G0028\""],"TG-1314":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-1314 - G0028\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-1314 - G0028\""],"Threat Group-3390 - G0027":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\""],"Threat Group-3390":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"Threat Group-3390\""],"TG-3390":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\"","misp-galaxy:threat-actor=\"Threat Group-3390\""],"Emissary Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\"","misp-galaxy:threat-actor=\"Threat Group-3390\""],"BRONZE UNION":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"Emissary Panda\""],"Turla - G0010":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Turla - G0010\"","misp-galaxy:mitre-intrusion-set=\"Turla - G0010\""],"Turla":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Turla - G0010\"","misp-galaxy:mitre-intrusion-set=\"Turla - G0010\"","misp-galaxy:threat-actor=\"Turla Group\"","misp-galaxy:tool=\"Turla\""],"Waterbug":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Turla - G0010\"","misp-galaxy:mitre-intrusion-set=\"Turla - G0010\"","misp-galaxy:threat-actor=\"Turla Group\""],"Winnti Group - G0044":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Winnti Group - G0044\"","misp-galaxy:mitre-intrusion-set=\"Winnti Group - G0044\""],"Winnti Group":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Winnti Group - G0044\"","misp-galaxy:mitre-intrusion-set=\"Winnti Group - G0044\"","misp-galaxy:threat-actor=\"Axiom\""],"Blackfly":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"Winnti Group - G0044\"","misp-galaxy:mitre-intrusion-set=\"Winnti Group - G0044\"","misp-galaxy:threat-actor=\"Axiom\""],"admin@338 - G0018":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"admin@338 - G0018\"","misp-galaxy:mitre-intrusion-set=\"admin@338 - G0018\""],"admin@338":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"admin@338 - G0018\"","misp-galaxy:mitre-intrusion-set=\"admin@338 - G0018\"","misp-galaxy:threat-actor=\"Temper Panda\""],"menuPass - G0045":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\""],"menuPass":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"Stone Panda":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"APT10":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"Red Apollo":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"CVNX":["misp-galaxy:mitre-enterprise-attack-intrusion-set=\"menuPass - G0045\"","misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"3PARA RAT - S0066":["misp-galaxy:mitre-enterprise-attack-malware=\"3PARA RAT - S0066\"","misp-galaxy:mitre-malware=\"3PARA RAT - S0066\""],"3PARA RAT":["misp-galaxy:mitre-enterprise-attack-malware=\"3PARA RAT - S0066\"","misp-galaxy:mitre-malware=\"3PARA RAT - S0066\"","misp-galaxy:rat=\"3PARA RAT\""],"4H RAT - S0065":["misp-galaxy:mitre-enterprise-attack-malware=\"4H RAT - S0065\"","misp-galaxy:mitre-malware=\"4H RAT - S0065\""],"4H RAT":["misp-galaxy:mitre-enterprise-attack-malware=\"4H RAT - S0065\"","misp-galaxy:mitre-malware=\"4H RAT - S0065\"","misp-galaxy:rat=\"4H RAT\""],"ADVSTORESHELL - S0045":["misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\""],"ADVSTORESHELL":["misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:tool=\"EVILTOSS\""],"NETUI":["misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:tool=\"EVILTOSS\""],"EVILTOSS":["misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:tool=\"EVILTOSS\""],"AZZY":["misp-galaxy:mitre-enterprise-attack-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:mitre-malware=\"ADVSTORESHELL - S0045\"","misp-galaxy:tool=\"EVILTOSS\""],"ASPXSpy - S0073":["misp-galaxy:mitre-enterprise-attack-malware=\"ASPXSpy - S0073\"","misp-galaxy:mitre-malware=\"ASPXSpy - S0073\""],"ASPXSpy":["misp-galaxy:mitre-enterprise-attack-malware=\"ASPXSpy - S0073\"","misp-galaxy:mitre-malware=\"ASPXSpy - S0073\""],"ASPXTool":["misp-galaxy:mitre-enterprise-attack-malware=\"ASPXSpy - S0073\"","misp-galaxy:mitre-malware=\"ASPXSpy - S0073\""],"Agent.btz - S0092":["misp-galaxy:mitre-enterprise-attack-malware=\"Agent.btz - S0092\"","misp-galaxy:mitre-malware=\"Agent.btz - S0092\""],"Agent.btz":["misp-galaxy:mitre-enterprise-attack-malware=\"Agent.btz - S0092\"","misp-galaxy:mitre-malware=\"Agent.btz - S0092\""],"AutoIt backdoor - S0129":["misp-galaxy:mitre-enterprise-attack-malware=\"AutoIt backdoor - S0129\"","misp-galaxy:mitre-malware=\"AutoIt backdoor - S0129\""],"AutoIt backdoor":["misp-galaxy:mitre-enterprise-attack-malware=\"AutoIt backdoor - S0129\"","misp-galaxy:mitre-malware=\"AutoIt backdoor - S0129\""],"BACKSPACE - S0031":["misp-galaxy:mitre-enterprise-attack-malware=\"BACKSPACE - S0031\"","misp-galaxy:mitre-malware=\"BACKSPACE - S0031\""],"BACKSPACE":["misp-galaxy:mitre-enterprise-attack-malware=\"BACKSPACE - S0031\"","misp-galaxy:mitre-malware=\"BACKSPACE - S0031\""],"Lecna":["misp-galaxy:mitre-enterprise-attack-malware=\"BACKSPACE - S0031\"","misp-galaxy:mitre-malware=\"BACKSPACE - S0031\"","misp-galaxy:tool=\"Backspace\""],"BADNEWS - S0128":["misp-galaxy:mitre-enterprise-attack-malware=\"BADNEWS - S0128\"","misp-galaxy:mitre-malware=\"BADNEWS - S0128\""],"BADNEWS":["misp-galaxy:mitre-enterprise-attack-malware=\"BADNEWS - S0128\"","misp-galaxy:mitre-malware=\"BADNEWS - S0128\""],"BBSRAT - S0127":["misp-galaxy:mitre-enterprise-attack-malware=\"BBSRAT - S0127\"","misp-galaxy:mitre-malware=\"BBSRAT - S0127\""],"BISCUIT - S0017":["misp-galaxy:mitre-enterprise-attack-malware=\"BISCUIT - S0017\"","misp-galaxy:mitre-malware=\"BISCUIT - S0017\""],"BISCUIT":["misp-galaxy:mitre-enterprise-attack-malware=\"BISCUIT - S0017\"","misp-galaxy:mitre-malware=\"BISCUIT - S0017\"","misp-galaxy:tool=\"BISCUIT\""],"BLACKCOFFEE - S0069":["misp-galaxy:mitre-enterprise-attack-malware=\"BLACKCOFFEE - S0069\"","misp-galaxy:mitre-malware=\"BLACKCOFFEE - S0069\""],"BOOTRASH - S0114":["misp-galaxy:mitre-enterprise-attack-malware=\"BOOTRASH - S0114\"","misp-galaxy:mitre-malware=\"BOOTRASH - S0114\""],"BOOTRASH":["misp-galaxy:mitre-enterprise-attack-malware=\"BOOTRASH - S0114\"","misp-galaxy:mitre-malware=\"BOOTRASH - S0114\""],"BS2005 - S0014":["misp-galaxy:mitre-enterprise-attack-malware=\"BS2005 - S0014\"","misp-galaxy:mitre-malware=\"BS2005 - S0014\""],"BUBBLEWRAP - S0043":["misp-galaxy:mitre-enterprise-attack-malware=\"BUBBLEWRAP - S0043\"","misp-galaxy:mitre-malware=\"BUBBLEWRAP - S0043\""],"Backdoor.APT.FakeWinHTTPHelper":["misp-galaxy:mitre-enterprise-attack-malware=\"BUBBLEWRAP - S0043\"","misp-galaxy:mitre-malware=\"BUBBLEWRAP - S0043\""],"Backdoor.Oldrea - S0093":["misp-galaxy:mitre-enterprise-attack-malware=\"Backdoor.Oldrea - S0093\"","misp-galaxy:mitre-malware=\"Backdoor.Oldrea - S0093\""],"Backdoor.Oldrea":["misp-galaxy:mitre-enterprise-attack-malware=\"Backdoor.Oldrea - S0093\"","misp-galaxy:mitre-malware=\"Backdoor.Oldrea - S0093\""],"Havex":["misp-galaxy:mitre-enterprise-attack-malware=\"Backdoor.Oldrea - S0093\"","misp-galaxy:mitre-malware=\"Backdoor.Oldrea - S0093\"","misp-galaxy:threat-actor=\"Energetic Bear\"","misp-galaxy:tool=\"Havex RAT\""],"BlackEnergy - S0089":["misp-galaxy:mitre-enterprise-attack-malware=\"BlackEnergy - S0089\"","misp-galaxy:mitre-malware=\"BlackEnergy - S0089\""],"Black Energy":["misp-galaxy:mitre-enterprise-attack-malware=\"BlackEnergy - S0089\"","misp-galaxy:mitre-malware=\"BlackEnergy - S0089\"","misp-galaxy:threat-actor=\"Sandworm\""],"Briba - S0204":["misp-galaxy:mitre-enterprise-attack-malware=\"Briba - S0204\"","misp-galaxy:mitre-malware=\"Briba - S0204\""],"Briba":["misp-galaxy:mitre-enterprise-attack-malware=\"Briba - S0204\"","misp-galaxy:mitre-malware=\"Briba - S0204\""],"CALENDAR - S0025":["misp-galaxy:mitre-enterprise-attack-malware=\"CALENDAR - S0025\"","misp-galaxy:mitre-malware=\"CALENDAR - S0025\""],"CALENDAR":["misp-galaxy:mitre-enterprise-attack-malware=\"CALENDAR - S0025\"","misp-galaxy:mitre-malware=\"CALENDAR - S0025\"","misp-galaxy:tool=\"CALENDAR\""],"CCBkdr - S0222":["misp-galaxy:mitre-enterprise-attack-malware=\"CCBkdr - S0222\"","misp-galaxy:mitre-malware=\"CCBkdr - S0222\""],"CCBkdr":["misp-galaxy:mitre-enterprise-attack-malware=\"CCBkdr - S0222\"","misp-galaxy:mitre-malware=\"CCBkdr - S0222\""],"CHOPSTICK - S0023":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\""],"CHOPSTICK":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\"","misp-galaxy:tool=\"CHOPSTICK\""],"SPLM":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\"","misp-galaxy:tool=\"CHOPSTICK\""],"Xagent":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\""],"X-Agent":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-mobile-attack-malware=\"X-Agent - MOB-S0030\"","misp-galaxy:tool=\"X-Agent\""],"webhp":["misp-galaxy:mitre-enterprise-attack-malware=\"CHOPSTICK - S0023\"","misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\"","misp-galaxy:tool=\"CHOPSTICK\""],"CORALDECK - S0212":["misp-galaxy:mitre-enterprise-attack-malware=\"CORALDECK - S0212\"","misp-galaxy:mitre-malware=\"CORALDECK - S0212\""],"CORALDECK":["misp-galaxy:mitre-enterprise-attack-malware=\"CORALDECK - S0212\"","misp-galaxy:mitre-malware=\"CORALDECK - S0212\"","misp-galaxy:tool=\"CORALDECK\""],"CORESHELL - S0137":["misp-galaxy:mitre-enterprise-attack-malware=\"CORESHELL - S0137\"","misp-galaxy:mitre-malware=\"CORESHELL - S0137\""],"CORESHELL":["misp-galaxy:mitre-enterprise-attack-malware=\"CORESHELL - S0137\"","misp-galaxy:mitre-malware=\"CORESHELL - S0137\"","misp-galaxy:tool=\"CORESHELL\""],"SOURFACE":["misp-galaxy:mitre-enterprise-attack-malware=\"CORESHELL - S0137\"","misp-galaxy:mitre-malware=\"CORESHELL - S0137\"","misp-galaxy:tool=\"SOURFACE\""],"CallMe - S0077":["misp-galaxy:mitre-enterprise-attack-malware=\"CallMe - S0077\"","misp-galaxy:mitre-malware=\"CallMe - S0077\""],"CallMe":["misp-galaxy:mitre-enterprise-attack-malware=\"CallMe - S0077\"","misp-galaxy:mitre-malware=\"CallMe - S0077\""],"Carbanak - S0030":["misp-galaxy:mitre-enterprise-attack-malware=\"Carbanak - S0030\"","misp-galaxy:mitre-malware=\"Carbanak - S0030\""],"ChChes - S0144":["misp-galaxy:mitre-enterprise-attack-malware=\"ChChes - S0144\"","misp-galaxy:mitre-malware=\"ChChes - S0144\""],"Scorpion":["misp-galaxy:mitre-enterprise-attack-malware=\"ChChes - S0144\"","misp-galaxy:mitre-malware=\"ChChes - S0144\""],"HAYMAKER":["misp-galaxy:mitre-enterprise-attack-malware=\"ChChes - S0144\"","misp-galaxy:mitre-malware=\"ChChes - S0144\"","misp-galaxy:tool=\"HAYMAKER\""],"Chaos - S0220":["misp-galaxy:mitre-enterprise-attack-malware=\"Chaos - S0220\"","misp-galaxy:mitre-malware=\"Chaos - S0220\""],"Chaos":["misp-galaxy:mitre-enterprise-attack-malware=\"Chaos - S0220\"","misp-galaxy:mitre-malware=\"Chaos - S0220\""],"Cherry Picker - S0107":["misp-galaxy:mitre-enterprise-attack-malware=\"Cherry Picker - S0107\"","misp-galaxy:mitre-malware=\"Cherry Picker - S0107\""],"Cherry Picker":["misp-galaxy:mitre-enterprise-attack-malware=\"Cherry Picker - S0107\"","misp-galaxy:mitre-malware=\"Cherry Picker - S0107\""],"China Chopper - S0020":["misp-galaxy:mitre-enterprise-attack-malware=\"China Chopper - S0020\"","misp-galaxy:mitre-malware=\"China Chopper - S0020\""],"China Chopper":["misp-galaxy:mitre-enterprise-attack-malware=\"China Chopper - S0020\"","misp-galaxy:mitre-malware=\"China Chopper - S0020\"","misp-galaxy:tool=\"China Chopper\""],"CloudDuke - S0054":["misp-galaxy:mitre-enterprise-attack-malware=\"CloudDuke - S0054\"","misp-galaxy:mitre-malware=\"CloudDuke - S0054\""],"CloudDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"CloudDuke - S0054\"","misp-galaxy:mitre-malware=\"CloudDuke - S0054\""],"MiniDionis":["misp-galaxy:mitre-enterprise-attack-malware=\"CloudDuke - S0054\"","misp-galaxy:mitre-malware=\"CloudDuke - S0054\""],"CloudLook":["misp-galaxy:mitre-enterprise-attack-malware=\"CloudDuke - S0054\"","misp-galaxy:mitre-malware=\"CloudDuke - S0054\""],"ComRAT - S0126":["misp-galaxy:mitre-enterprise-attack-malware=\"ComRAT - S0126\"","misp-galaxy:mitre-malware=\"ComRAT - S0126\""],"CosmicDuke - S0050":["misp-galaxy:mitre-enterprise-attack-malware=\"CosmicDuke - S0050\"","misp-galaxy:mitre-malware=\"CosmicDuke - S0050\""],"CosmicDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"CosmicDuke - S0050\"","misp-galaxy:mitre-malware=\"CosmicDuke - S0050\""],"TinyBaron":["misp-galaxy:mitre-enterprise-attack-malware=\"CosmicDuke - S0050\"","misp-galaxy:mitre-malware=\"CosmicDuke - S0050\""],"BotgenStudios":["misp-galaxy:mitre-enterprise-attack-malware=\"CosmicDuke - S0050\"","misp-galaxy:mitre-malware=\"CosmicDuke - S0050\""],"NemesisGemina":["misp-galaxy:mitre-enterprise-attack-malware=\"CosmicDuke - S0050\"","misp-galaxy:mitre-malware=\"CosmicDuke - S0050\""],"CozyCar - S0046":["misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\""],"CozyCar":["misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\"","misp-galaxy:threat-actor=\"APT 29\""],"CozyBear":["misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\"","misp-galaxy:threat-actor=\"APT 29\""],"Cozer":["misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\"","misp-galaxy:threat-actor=\"APT 29\""],"EuroAPT":["misp-galaxy:mitre-enterprise-attack-malware=\"CozyCar - S0046\"","misp-galaxy:mitre-malware=\"CozyCar - S0046\"","misp-galaxy:threat-actor=\"APT 29\""],"Crimson - S0115":["misp-galaxy:mitre-enterprise-attack-malware=\"Crimson - S0115\"","misp-galaxy:mitre-malware=\"Crimson - S0115\""],"MSIL\/Crimson":["misp-galaxy:mitre-enterprise-attack-malware=\"Crimson - S0115\"","misp-galaxy:mitre-malware=\"Crimson - S0115\""],"DOGCALL - S0213":["misp-galaxy:mitre-enterprise-attack-malware=\"DOGCALL - S0213\"","misp-galaxy:mitre-malware=\"DOGCALL - S0213\""],"DOGCALL":["misp-galaxy:mitre-enterprise-attack-malware=\"DOGCALL - S0213\"","misp-galaxy:mitre-malware=\"DOGCALL - S0213\"","misp-galaxy:tool=\"DOGCALL\""],"Darkmoon - S0209":["misp-galaxy:mitre-enterprise-attack-malware=\"Darkmoon - S0209\"","misp-galaxy:mitre-malware=\"Darkmoon - S0209\""],"Daserf - S0187":["misp-galaxy:mitre-enterprise-attack-malware=\"Daserf - S0187\"","misp-galaxy:mitre-malware=\"Daserf - S0187\""],"Derusbi - S0021":["misp-galaxy:mitre-enterprise-attack-malware=\"Derusbi - S0021\"","misp-galaxy:mitre-malware=\"Derusbi - S0021\""],"Dipsind - S0200":["misp-galaxy:mitre-enterprise-attack-malware=\"Dipsind - S0200\"","misp-galaxy:mitre-malware=\"Dipsind - S0200\""],"Dipsind":["misp-galaxy:mitre-enterprise-attack-malware=\"Dipsind - S0200\"","misp-galaxy:mitre-malware=\"Dipsind - S0200\""],"DownPaper - S0186":["misp-galaxy:mitre-enterprise-attack-malware=\"DownPaper - S0186\"","misp-galaxy:mitre-malware=\"DownPaper - S0186\""],"Downdelph - S0134":["misp-galaxy:mitre-enterprise-attack-malware=\"Downdelph - S0134\"","misp-galaxy:mitre-malware=\"Downdelph - S0134\""],"Delphacy":["misp-galaxy:mitre-enterprise-attack-malware=\"Downdelph - S0134\"","misp-galaxy:mitre-malware=\"Downdelph - S0134\""],"Duqu - S0038":["misp-galaxy:mitre-enterprise-attack-malware=\"Duqu - S0038\"","misp-galaxy:mitre-malware=\"Duqu - S0038\""],"Duqu":["misp-galaxy:mitre-enterprise-attack-malware=\"Duqu - S0038\"","misp-galaxy:mitre-malware=\"Duqu - S0038\"","misp-galaxy:tool=\"Duqu\""],"DustySky - S0062":["misp-galaxy:mitre-enterprise-attack-malware=\"DustySky - S0062\"","misp-galaxy:mitre-malware=\"DustySky - S0062\""],"DustySky":["misp-galaxy:mitre-enterprise-attack-malware=\"DustySky - S0062\"","misp-galaxy:mitre-malware=\"DustySky - S0062\""],"NeD Worm":["misp-galaxy:mitre-enterprise-attack-malware=\"DustySky - S0062\"","misp-galaxy:mitre-malware=\"DustySky - S0062\"","misp-galaxy:tool=\"NeD Worm\""],"Dyre - S0024":["misp-galaxy:mitre-enterprise-attack-malware=\"Dyre - S0024\"","misp-galaxy:mitre-malware=\"Dyre - S0024\""],"ELMER - S0064":["misp-galaxy:mitre-enterprise-attack-malware=\"ELMER - S0064\"","misp-galaxy:mitre-malware=\"ELMER - S0064\""],"Elise - S0081":["misp-galaxy:mitre-enterprise-attack-malware=\"Elise - S0081\"","misp-galaxy:mitre-malware=\"Elise - S0081\""],"BKDR_ESILE":["misp-galaxy:mitre-enterprise-attack-malware=\"Elise - S0081\"","misp-galaxy:mitre-malware=\"Elise - S0081\""],"Page":["misp-galaxy:mitre-enterprise-attack-malware=\"Elise - S0081\"","misp-galaxy:mitre-malware=\"Elise - S0081\""],"Emissary - S0082":["misp-galaxy:mitre-enterprise-attack-malware=\"Emissary - S0082\"","misp-galaxy:mitre-malware=\"Emissary - S0082\""],"Emissary":["misp-galaxy:mitre-enterprise-attack-malware=\"Emissary - S0082\"","misp-galaxy:mitre-malware=\"Emissary - S0082\""],"Epic - S0091":["misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\""],"Epic":["misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\""],"Tavdig":["misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\"","misp-galaxy:tool=\"Wipbot\""],"WorldCupSec":["misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\"","misp-galaxy:tool=\"Wipbot\""],"TadjMakhal":["misp-galaxy:mitre-enterprise-attack-malware=\"Epic - S0091\"","misp-galaxy:mitre-malware=\"Epic - S0091\"","misp-galaxy:tool=\"Wipbot\""],"EvilGrab - S0152":["misp-galaxy:mitre-enterprise-attack-malware=\"EvilGrab - S0152\"","misp-galaxy:mitre-malware=\"EvilGrab - S0152\""],"FALLCHILL - S0181":["misp-galaxy:mitre-enterprise-attack-malware=\"FALLCHILL - S0181\"","misp-galaxy:mitre-malware=\"FALLCHILL - S0181\""],"FLASHFLOOD - S0036":["misp-galaxy:mitre-enterprise-attack-malware=\"FLASHFLOOD - S0036\"","misp-galaxy:mitre-malware=\"FLASHFLOOD - S0036\""],"FLIPSIDE - S0173":["misp-galaxy:mitre-enterprise-attack-malware=\"FLIPSIDE - S0173\"","misp-galaxy:mitre-malware=\"FLIPSIDE - S0173\""],"FLIPSIDE":["misp-galaxy:mitre-enterprise-attack-malware=\"FLIPSIDE - S0173\"","misp-galaxy:mitre-malware=\"FLIPSIDE - S0173\""],"FakeM - S0076":["misp-galaxy:mitre-enterprise-attack-malware=\"FakeM - S0076\"","misp-galaxy:mitre-malware=\"FakeM - S0076\""],"FakeM":["misp-galaxy:mitre-enterprise-attack-malware=\"FakeM - S0076\"","misp-galaxy:mitre-malware=\"FakeM - S0076\""],"Felismus - S0171":["misp-galaxy:mitre-enterprise-attack-malware=\"Felismus - S0171\"","misp-galaxy:mitre-malware=\"Felismus - S0171\""],"FinFisher - S0182":["misp-galaxy:mitre-enterprise-attack-malware=\"FinFisher - S0182\"","misp-galaxy:mitre-malware=\"FinFisher - S0182\""],"FinFisher":["misp-galaxy:mitre-enterprise-attack-malware=\"FinFisher - S0182\"","misp-galaxy:mitre-malware=\"FinFisher - S0182\""],"Flame - S0143":["misp-galaxy:mitre-enterprise-attack-malware=\"Flame - S0143\"","misp-galaxy:mitre-malware=\"Flame - S0143\""],"Flamer":["misp-galaxy:mitre-enterprise-attack-malware=\"Flame - S0143\"","misp-galaxy:mitre-malware=\"Flame - S0143\""],"sKyWIper":["misp-galaxy:mitre-enterprise-attack-malware=\"Flame - S0143\"","misp-galaxy:mitre-malware=\"Flame - S0143\""],"GLOOXMAIL - S0026":["misp-galaxy:mitre-enterprise-attack-malware=\"GLOOXMAIL - S0026\"","misp-galaxy:mitre-malware=\"GLOOXMAIL - S0026\""],"GLOOXMAIL":["misp-galaxy:mitre-enterprise-attack-malware=\"GLOOXMAIL - S0026\"","misp-galaxy:mitre-malware=\"GLOOXMAIL - S0026\"","misp-galaxy:tool=\"GLOOXMAIL\""],"Trojan.GTALK":["misp-galaxy:mitre-enterprise-attack-malware=\"GLOOXMAIL - S0026\"","misp-galaxy:mitre-malware=\"GLOOXMAIL - S0026\""],"Gazer - S0168":["misp-galaxy:mitre-enterprise-attack-malware=\"Gazer - S0168\"","misp-galaxy:mitre-malware=\"Gazer - S0168\""],"GeminiDuke - S0049":["misp-galaxy:mitre-enterprise-attack-malware=\"GeminiDuke - S0049\"","misp-galaxy:mitre-malware=\"GeminiDuke - S0049\""],"GeminiDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"GeminiDuke - S0049\"","misp-galaxy:mitre-malware=\"GeminiDuke - S0049\"","misp-galaxy:tool=\"GeminiDuke\""],"H1N1 - S0132":["misp-galaxy:mitre-enterprise-attack-malware=\"H1N1 - S0132\"","misp-galaxy:mitre-malware=\"H1N1 - S0132\""],"H1N1":["misp-galaxy:mitre-enterprise-attack-malware=\"H1N1 - S0132\"","misp-galaxy:mitre-malware=\"H1N1 - S0132\""],"HALFBAKED - S0151":["misp-galaxy:mitre-enterprise-attack-malware=\"HALFBAKED - S0151\"","misp-galaxy:mitre-malware=\"HALFBAKED - S0151\""],"HAMMERTOSS - S0037":["misp-galaxy:mitre-enterprise-attack-malware=\"HAMMERTOSS - S0037\"","misp-galaxy:mitre-malware=\"HAMMERTOSS - S0037\""],"HAMMERTOSS":["misp-galaxy:mitre-enterprise-attack-malware=\"HAMMERTOSS - S0037\"","misp-galaxy:mitre-malware=\"HAMMERTOSS - S0037\""],"HammerDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"HAMMERTOSS - S0037\"","misp-galaxy:mitre-malware=\"HAMMERTOSS - S0037\""],"NetDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"HAMMERTOSS - S0037\"","misp-galaxy:mitre-malware=\"HAMMERTOSS - S0037\""],"HAPPYWORK - S0214":["misp-galaxy:mitre-enterprise-attack-malware=\"HAPPYWORK - S0214\"","misp-galaxy:mitre-malware=\"HAPPYWORK - S0214\""],"HAPPYWORK":["misp-galaxy:mitre-enterprise-attack-malware=\"HAPPYWORK - S0214\"","misp-galaxy:mitre-malware=\"HAPPYWORK - S0214\"","misp-galaxy:tool=\"HAPPYWORK\""],"HDoor - S0061":["misp-galaxy:mitre-enterprise-attack-malware=\"HDoor - S0061\"","misp-galaxy:mitre-malware=\"HDoor - S0061\""],"HDoor":["misp-galaxy:mitre-enterprise-attack-malware=\"HDoor - S0061\"","misp-galaxy:mitre-malware=\"HDoor - S0061\""],"Custom HDoor":["misp-galaxy:mitre-enterprise-attack-malware=\"HDoor - S0061\"","misp-galaxy:mitre-malware=\"HDoor - S0061\""],"HIDEDRV - S0135":["misp-galaxy:mitre-enterprise-attack-malware=\"HIDEDRV - S0135\"","misp-galaxy:mitre-malware=\"HIDEDRV - S0135\""],"HIDEDRV":["misp-galaxy:mitre-enterprise-attack-malware=\"HIDEDRV - S0135\"","misp-galaxy:mitre-malware=\"HIDEDRV - S0135\""],"HOMEFRY - S0232":["misp-galaxy:mitre-enterprise-attack-malware=\"HOMEFRY - S0232\"","misp-galaxy:mitre-malware=\"HOMEFRY - S0232\""],"HOMEFRY":["misp-galaxy:mitre-enterprise-attack-malware=\"HOMEFRY - S0232\"","misp-galaxy:mitre-malware=\"HOMEFRY - S0232\""],"HTTPBrowser - S0070":["misp-galaxy:mitre-enterprise-attack-malware=\"HTTPBrowser - S0070\"","misp-galaxy:mitre-malware=\"HTTPBrowser - S0070\""],"HTTPBrowser":["misp-galaxy:mitre-enterprise-attack-malware=\"HTTPBrowser - S0070\"","misp-galaxy:mitre-malware=\"HTTPBrowser - S0070\"","misp-galaxy:tool=\"HTTPBrowser\""],"Token Control":["misp-galaxy:mitre-enterprise-attack-malware=\"HTTPBrowser - S0070\"","misp-galaxy:mitre-malware=\"HTTPBrowser - S0070\""],"HttpDump":["misp-galaxy:mitre-enterprise-attack-malware=\"HTTPBrowser - S0070\"","misp-galaxy:mitre-malware=\"HTTPBrowser - S0070\""],"Hacking Team UEFI Rootkit - S0047":["misp-galaxy:mitre-enterprise-attack-malware=\"Hacking Team UEFI Rootkit - S0047\"","misp-galaxy:mitre-malware=\"Hacking Team UEFI Rootkit - S0047\""],"Hacking Team UEFI Rootkit":["misp-galaxy:mitre-enterprise-attack-malware=\"Hacking Team UEFI Rootkit - S0047\"","misp-galaxy:mitre-malware=\"Hacking Team UEFI Rootkit - S0047\""],"Helminth - S0170":["misp-galaxy:mitre-enterprise-attack-malware=\"Helminth - S0170\"","misp-galaxy:mitre-malware=\"Helminth - S0170\""],"Hi-Zor - S0087":["misp-galaxy:mitre-enterprise-attack-malware=\"Hi-Zor - S0087\"","misp-galaxy:mitre-malware=\"Hi-Zor - S0087\""],"Hi-Zor":["misp-galaxy:mitre-enterprise-attack-malware=\"Hi-Zor - S0087\"","misp-galaxy:mitre-malware=\"Hi-Zor - S0087\"","misp-galaxy:rat=\"Hi-Zor\""],"Hikit - S0009":["misp-galaxy:mitre-enterprise-attack-malware=\"Hikit - S0009\"","misp-galaxy:mitre-malware=\"Hikit - S0009\""],"Hikit":["misp-galaxy:mitre-enterprise-attack-malware=\"Hikit - S0009\"","misp-galaxy:mitre-malware=\"Hikit - S0009\"","misp-galaxy:tool=\"Hikit\""],"Hydraq - S0203":["misp-galaxy:mitre-enterprise-attack-malware=\"Hydraq - S0203\"","misp-galaxy:mitre-malware=\"Hydraq - S0203\""],"ISMInjector - S0189":["misp-galaxy:mitre-enterprise-attack-malware=\"ISMInjector - S0189\"","misp-galaxy:mitre-malware=\"ISMInjector - S0189\""],"ISMInjector":["misp-galaxy:mitre-enterprise-attack-malware=\"ISMInjector - S0189\"","misp-galaxy:mitre-malware=\"ISMInjector - S0189\""],"Ixeshe - S0015":["misp-galaxy:mitre-enterprise-attack-malware=\"Ixeshe - S0015\"","misp-galaxy:mitre-malware=\"Ixeshe - S0015\""],"Ixeshe":["misp-galaxy:mitre-enterprise-attack-malware=\"Ixeshe - S0015\"","misp-galaxy:mitre-malware=\"Ixeshe - S0015\""],"JHUHUGIT - S0044":["misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\""],"GAMEFISH":["misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\"","misp-galaxy:tool=\"GAMEFISH\""],"SofacyCarberp":["misp-galaxy:mitre-enterprise-attack-malware=\"JHUHUGIT - S0044\"","misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\""],"JPIN - S0201":["misp-galaxy:mitre-enterprise-attack-malware=\"JPIN - S0201\"","misp-galaxy:mitre-malware=\"JPIN - S0201\""],"JPIN":["misp-galaxy:mitre-enterprise-attack-malware=\"JPIN - S0201\"","misp-galaxy:mitre-malware=\"JPIN - S0201\""],"Janicab - S0163":["misp-galaxy:mitre-enterprise-attack-malware=\"Janicab - S0163\"","misp-galaxy:mitre-malware=\"Janicab - S0163\""],"Janicab":["misp-galaxy:mitre-enterprise-attack-malware=\"Janicab - S0163\"","misp-galaxy:mitre-malware=\"Janicab - S0163\"","misp-galaxy:tool=\"Janicab\""],"KARAE - S0215":["misp-galaxy:mitre-enterprise-attack-malware=\"KARAE - S0215\"","misp-galaxy:mitre-malware=\"KARAE - S0215\""],"KARAE":["misp-galaxy:mitre-enterprise-attack-malware=\"KARAE - S0215\"","misp-galaxy:mitre-malware=\"KARAE - S0215\"","misp-galaxy:tool=\"KARAE\""],"KOMPROGO - S0156":["misp-galaxy:mitre-enterprise-attack-malware=\"KOMPROGO - S0156\"","misp-galaxy:mitre-malware=\"KOMPROGO - S0156\""],"Kasidet - S0088":["misp-galaxy:mitre-enterprise-attack-malware=\"Kasidet - S0088\"","misp-galaxy:mitre-malware=\"Kasidet - S0088\""],"Komplex - S0162":["misp-galaxy:mitre-enterprise-attack-malware=\"Komplex - S0162\"","misp-galaxy:mitre-malware=\"Komplex - S0162\""],"LOWBALL - S0042":["misp-galaxy:mitre-enterprise-attack-malware=\"LOWBALL - S0042\"","misp-galaxy:mitre-malware=\"LOWBALL - S0042\""],"Linfo - S0211":["misp-galaxy:mitre-enterprise-attack-malware=\"Linfo - S0211\"","misp-galaxy:mitre-malware=\"Linfo - S0211\""],"Linfo":["misp-galaxy:mitre-enterprise-attack-malware=\"Linfo - S0211\"","misp-galaxy:mitre-malware=\"Linfo - S0211\""],"Lurid - S0010":["misp-galaxy:mitre-enterprise-attack-malware=\"Lurid - S0010\"","misp-galaxy:mitre-malware=\"Lurid - S0010\""],"MURKYTOP - S0233":["misp-galaxy:mitre-enterprise-attack-malware=\"MURKYTOP - S0233\"","misp-galaxy:mitre-malware=\"MURKYTOP - S0233\""],"MURKYTOP":["misp-galaxy:mitre-enterprise-attack-malware=\"MURKYTOP - S0233\"","misp-galaxy:mitre-malware=\"MURKYTOP - S0233\""],"Matroyshka - S0167":["misp-galaxy:mitre-enterprise-attack-malware=\"Matroyshka - S0167\"","misp-galaxy:mitre-malware=\"Matroyshka - S0167\""],"Matroyshka":["misp-galaxy:mitre-enterprise-attack-malware=\"Matroyshka - S0167\"","misp-galaxy:mitre-malware=\"Matroyshka - S0167\""],"Miner-C - S0133":["misp-galaxy:mitre-enterprise-attack-malware=\"Miner-C - S0133\"","misp-galaxy:mitre-malware=\"Miner-C - S0133\""],"Miner-C":["misp-galaxy:mitre-enterprise-attack-malware=\"Miner-C - S0133\"","misp-galaxy:mitre-malware=\"Miner-C - S0133\""],"Mal\/Miner-C":["misp-galaxy:mitre-enterprise-attack-malware=\"Miner-C - S0133\"","misp-galaxy:mitre-malware=\"Miner-C - S0133\""],"PhotoMiner":["misp-galaxy:mitre-enterprise-attack-malware=\"Miner-C - S0133\"","misp-galaxy:mitre-malware=\"Miner-C - S0133\""],"MiniDuke - S0051":["misp-galaxy:mitre-enterprise-attack-malware=\"MiniDuke - S0051\"","misp-galaxy:mitre-malware=\"MiniDuke - S0051\""],"MiniDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"MiniDuke - S0051\"","misp-galaxy:mitre-malware=\"MiniDuke - S0051\""],"Mis-Type - S0084":["misp-galaxy:mitre-enterprise-attack-malware=\"Mis-Type - S0084\"","misp-galaxy:mitre-malware=\"Mis-Type - S0084\""],"Mis-Type":["misp-galaxy:mitre-enterprise-attack-malware=\"Mis-Type - S0084\"","misp-galaxy:mitre-malware=\"Mis-Type - S0084\""],"Misdat - S0083":["misp-galaxy:mitre-enterprise-attack-malware=\"Misdat - S0083\"","misp-galaxy:mitre-malware=\"Misdat - S0083\""],"Mivast - S0080":["misp-galaxy:mitre-enterprise-attack-malware=\"Mivast - S0080\"","misp-galaxy:mitre-malware=\"Mivast - S0080\""],"Mivast":["misp-galaxy:mitre-enterprise-attack-malware=\"Mivast - S0080\"","misp-galaxy:mitre-malware=\"Mivast - S0080\""],"MobileOrder - S0079":["misp-galaxy:mitre-enterprise-attack-malware=\"MobileOrder - S0079\"","misp-galaxy:mitre-malware=\"MobileOrder - S0079\""],"MobileOrder":["misp-galaxy:mitre-enterprise-attack-malware=\"MobileOrder - S0079\"","misp-galaxy:mitre-malware=\"MobileOrder - S0079\""],"MoonWind - S0149":["misp-galaxy:mitre-enterprise-attack-malware=\"MoonWind - S0149\"","misp-galaxy:mitre-malware=\"MoonWind - S0149\""],"NETEAGLE - S0034":["misp-galaxy:mitre-enterprise-attack-malware=\"NETEAGLE - S0034\"","misp-galaxy:mitre-malware=\"NETEAGLE - S0034\""],"NETWIRE - S0198":["misp-galaxy:mitre-enterprise-attack-malware=\"NETWIRE - S0198\"","misp-galaxy:mitre-malware=\"NETWIRE - S0198\""],"NETWIRE":["misp-galaxy:mitre-enterprise-attack-malware=\"NETWIRE - S0198\"","misp-galaxy:mitre-malware=\"NETWIRE - S0198\""],"Naid - S0205":["misp-galaxy:mitre-enterprise-attack-malware=\"Naid - S0205\"","misp-galaxy:mitre-malware=\"Naid - S0205\""],"Naid":["misp-galaxy:mitre-enterprise-attack-malware=\"Naid - S0205\"","misp-galaxy:mitre-malware=\"Naid - S0205\"","misp-galaxy:tool=\"Trojan.Naid\""],"NanHaiShu - S0228":["misp-galaxy:mitre-enterprise-attack-malware=\"NanHaiShu - S0228\"","misp-galaxy:mitre-malware=\"NanHaiShu - S0228\""],"Nerex - S0210":["misp-galaxy:mitre-enterprise-attack-malware=\"Nerex - S0210\"","misp-galaxy:mitre-malware=\"Nerex - S0210\""],"Nerex":["misp-galaxy:mitre-enterprise-attack-malware=\"Nerex - S0210\"","misp-galaxy:mitre-malware=\"Nerex - S0210\""],"Net Crawler - S0056":["misp-galaxy:mitre-enterprise-attack-malware=\"Net Crawler - S0056\"","misp-galaxy:mitre-malware=\"Net Crawler - S0056\""],"Net Crawler":["misp-galaxy:mitre-enterprise-attack-malware=\"Net Crawler - S0056\"","misp-galaxy:mitre-malware=\"Net Crawler - S0056\""],"NetTraveler - S0033":["misp-galaxy:mitre-enterprise-attack-malware=\"NetTraveler - S0033\"","misp-galaxy:mitre-malware=\"NetTraveler - S0033\""],"Nidiran - S0118":["misp-galaxy:mitre-enterprise-attack-malware=\"Nidiran - S0118\"","misp-galaxy:mitre-malware=\"Nidiran - S0118\""],"Nidiran":["misp-galaxy:mitre-enterprise-attack-malware=\"Nidiran - S0118\"","misp-galaxy:mitre-malware=\"Nidiran - S0118\""],"Backdoor.Nidiran":["misp-galaxy:mitre-enterprise-attack-malware=\"Nidiran - S0118\"","misp-galaxy:mitre-malware=\"Nidiran - S0118\""],"OLDBAIT - S0138":["misp-galaxy:mitre-enterprise-attack-malware=\"OLDBAIT - S0138\"","misp-galaxy:mitre-malware=\"OLDBAIT - S0138\""],"OSInfo - S0165":["misp-galaxy:mitre-enterprise-attack-malware=\"OSInfo - S0165\"","misp-galaxy:mitre-malware=\"OSInfo - S0165\""],"OSInfo":["misp-galaxy:mitre-enterprise-attack-malware=\"OSInfo - S0165\"","misp-galaxy:mitre-malware=\"OSInfo - S0165\""],"OnionDuke - S0052":["misp-galaxy:mitre-enterprise-attack-malware=\"OnionDuke - S0052\"","misp-galaxy:mitre-malware=\"OnionDuke - S0052\""],"Orz - S0229":["misp-galaxy:mitre-enterprise-attack-malware=\"Orz - S0229\"","misp-galaxy:mitre-malware=\"Orz - S0229\""],"OwaAuth - S0072":["misp-galaxy:mitre-enterprise-attack-malware=\"OwaAuth - S0072\"","misp-galaxy:mitre-malware=\"OwaAuth - S0072\""],"OwaAuth":["misp-galaxy:mitre-enterprise-attack-malware=\"OwaAuth - S0072\"","misp-galaxy:mitre-malware=\"OwaAuth - S0072\""],"P2P ZeuS - S0016":["misp-galaxy:mitre-enterprise-attack-malware=\"P2P ZeuS - S0016\"","misp-galaxy:mitre-malware=\"P2P ZeuS - S0016\""],"P2P ZeuS":["misp-galaxy:mitre-enterprise-attack-malware=\"P2P ZeuS - S0016\"","misp-galaxy:mitre-malware=\"P2P ZeuS - S0016\""],"Peer-to-Peer ZeuS":["misp-galaxy:mitre-enterprise-attack-malware=\"P2P ZeuS - S0016\"","misp-galaxy:mitre-malware=\"P2P ZeuS - S0016\""],"Gameover ZeuS":["misp-galaxy:mitre-enterprise-attack-malware=\"P2P ZeuS - S0016\"","misp-galaxy:mitre-malware=\"P2P ZeuS - S0016\""],"PHOREAL - S0158":["misp-galaxy:mitre-enterprise-attack-malware=\"PHOREAL - S0158\"","misp-galaxy:mitre-malware=\"PHOREAL - S0158\""],"POORAIM - S0216":["misp-galaxy:mitre-enterprise-attack-malware=\"POORAIM - S0216\"","misp-galaxy:mitre-malware=\"POORAIM - S0216\""],"POORAIM":["misp-galaxy:mitre-enterprise-attack-malware=\"POORAIM - S0216\"","misp-galaxy:mitre-malware=\"POORAIM - S0216\"","misp-galaxy:tool=\"POORAIM\""],"POSHSPY - S0150":["misp-galaxy:mitre-enterprise-attack-malware=\"POSHSPY - S0150\"","misp-galaxy:mitre-malware=\"POSHSPY - S0150\""],"POWERSOURCE - S0145":["misp-galaxy:mitre-enterprise-attack-malware=\"POWERSOURCE - S0145\"","misp-galaxy:mitre-malware=\"POWERSOURCE - S0145\""],"POWERSTATS - S0223":["misp-galaxy:mitre-enterprise-attack-malware=\"POWERSTATS - S0223\"","misp-galaxy:mitre-malware=\"POWERSTATS - S0223\""],"POWRUNER - S0184":["misp-galaxy:mitre-enterprise-attack-malware=\"POWRUNER - S0184\"","misp-galaxy:mitre-malware=\"POWRUNER - S0184\""],"PUNCHBUGGY - S0196":["misp-galaxy:mitre-enterprise-attack-malware=\"PUNCHBUGGY - S0196\"","misp-galaxy:mitre-malware=\"PUNCHBUGGY - S0196\""],"PUNCHBUGGY":["misp-galaxy:mitre-enterprise-attack-malware=\"PUNCHBUGGY - S0196\"","misp-galaxy:mitre-malware=\"PUNCHBUGGY - S0196\""],"PUNCHTRACK - S0197":["misp-galaxy:mitre-enterprise-attack-malware=\"PUNCHTRACK - S0197\"","misp-galaxy:mitre-malware=\"PUNCHTRACK - S0197\""],"PUNCHTRACK":["misp-galaxy:mitre-enterprise-attack-malware=\"PUNCHTRACK - S0197\"","misp-galaxy:mitre-malware=\"PUNCHTRACK - S0197\""],"PSVC":["misp-galaxy:mitre-enterprise-attack-malware=\"PUNCHTRACK - S0197\"","misp-galaxy:mitre-malware=\"PUNCHTRACK - S0197\""],"Pasam - S0208":["misp-galaxy:mitre-enterprise-attack-malware=\"Pasam - S0208\"","misp-galaxy:mitre-malware=\"Pasam - S0208\""],"Pasam":["misp-galaxy:mitre-enterprise-attack-malware=\"Pasam - S0208\"","misp-galaxy:mitre-malware=\"Pasam - S0208\""],"PinchDuke - S0048":["misp-galaxy:mitre-enterprise-attack-malware=\"PinchDuke - S0048\"","misp-galaxy:mitre-malware=\"PinchDuke - S0048\""],"PinchDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"PinchDuke - S0048\"","misp-galaxy:mitre-malware=\"PinchDuke - S0048\""],"Pisloader - S0124":["misp-galaxy:mitre-enterprise-attack-malware=\"Pisloader - S0124\"","misp-galaxy:mitre-malware=\"Pisloader - S0124\""],"Pisloader":["misp-galaxy:mitre-enterprise-attack-malware=\"Pisloader - S0124\"","misp-galaxy:mitre-malware=\"Pisloader - S0124\""],"PlugX - S0013":["misp-galaxy:mitre-enterprise-attack-malware=\"PlugX - S0013\"","misp-galaxy:mitre-malware=\"PlugX - S0013\""],"Sogu":["misp-galaxy:mitre-enterprise-attack-malware=\"PlugX - S0013\"","misp-galaxy:mitre-malware=\"PlugX - S0013\""],"Kaba":["misp-galaxy:mitre-enterprise-attack-malware=\"PlugX - S0013\"","misp-galaxy:mitre-malware=\"PlugX - S0013\""],"PoisonIvy - S0012":["misp-galaxy:mitre-enterprise-attack-malware=\"PoisonIvy - S0012\"","misp-galaxy:mitre-malware=\"PoisonIvy - S0012\""],"PoisonIvy":["misp-galaxy:mitre-enterprise-attack-malware=\"PoisonIvy - S0012\"","misp-galaxy:mitre-malware=\"PoisonIvy - S0012\"","misp-galaxy:rat=\"PoisonIvy\""],"Power Loader - S0177":["misp-galaxy:mitre-enterprise-attack-malware=\"Power Loader - S0177\"","misp-galaxy:mitre-malware=\"Power Loader - S0177\""],"Power Loader":["misp-galaxy:mitre-enterprise-attack-malware=\"Power Loader - S0177\"","misp-galaxy:mitre-malware=\"Power Loader - S0177\""],"Win32\/Agent.UAW":["misp-galaxy:mitre-enterprise-attack-malware=\"Power Loader - S0177\"","misp-galaxy:mitre-malware=\"Power Loader - S0177\""],"PowerDuke - S0139":["misp-galaxy:mitre-enterprise-attack-malware=\"PowerDuke - S0139\"","misp-galaxy:mitre-malware=\"PowerDuke - S0139\""],"Prikormka - S0113":["misp-galaxy:mitre-enterprise-attack-malware=\"Prikormka - S0113\"","misp-galaxy:mitre-malware=\"Prikormka - S0113\""],"Prikormka":["misp-galaxy:mitre-enterprise-attack-malware=\"Prikormka - S0113\"","misp-galaxy:mitre-malware=\"Prikormka - S0113\"","misp-galaxy:tool=\"Prikormka\""],"Psylo - S0078":["misp-galaxy:mitre-enterprise-attack-malware=\"Psylo - S0078\"","misp-galaxy:mitre-malware=\"Psylo - S0078\""],"Psylo":["misp-galaxy:mitre-enterprise-attack-malware=\"Psylo - S0078\"","misp-galaxy:mitre-malware=\"Psylo - S0078\""],"Pteranodon - S0147":["misp-galaxy:mitre-enterprise-attack-malware=\"Pteranodon - S0147\"","misp-galaxy:mitre-malware=\"Pteranodon - S0147\""],"RARSTONE - S0055":["misp-galaxy:mitre-enterprise-attack-malware=\"RARSTONE - S0055\"","misp-galaxy:mitre-malware=\"RARSTONE - S0055\""],"RARSTONE":["misp-galaxy:mitre-enterprise-attack-malware=\"RARSTONE - S0055\"","misp-galaxy:mitre-malware=\"RARSTONE - S0055\"","misp-galaxy:tool=\"RARSTONE\""],"RIPTIDE - S0003":["misp-galaxy:mitre-enterprise-attack-malware=\"RIPTIDE - S0003\"","misp-galaxy:mitre-malware=\"RIPTIDE - S0003\""],"RIPTIDE":["misp-galaxy:mitre-enterprise-attack-malware=\"RIPTIDE - S0003\"","misp-galaxy:mitre-malware=\"RIPTIDE - S0003\"","misp-galaxy:tool=\"Etumbot\""],"ROCKBOOT - S0112":["misp-galaxy:mitre-enterprise-attack-malware=\"ROCKBOOT - S0112\"","misp-galaxy:mitre-malware=\"ROCKBOOT - S0112\""],"ROCKBOOT":["misp-galaxy:mitre-enterprise-attack-malware=\"ROCKBOOT - S0112\"","misp-galaxy:mitre-malware=\"ROCKBOOT - S0112\""],"RTM - S0148":["misp-galaxy:mitre-enterprise-attack-malware=\"RTM - S0148\"","misp-galaxy:mitre-malware=\"RTM - S0148\""],"RawPOS - S0169":["misp-galaxy:mitre-enterprise-attack-malware=\"RawPOS - S0169\"","misp-galaxy:mitre-malware=\"RawPOS - S0169\""],"FIENDCRY":["misp-galaxy:mitre-enterprise-attack-malware=\"RawPOS - S0169\"","misp-galaxy:mitre-malware=\"RawPOS - S0169\""],"DUEBREW":["misp-galaxy:mitre-enterprise-attack-malware=\"RawPOS - S0169\"","misp-galaxy:mitre-malware=\"RawPOS - S0169\""],"DRIFTWOOD":["misp-galaxy:mitre-enterprise-attack-malware=\"RawPOS - S0169\"","misp-galaxy:mitre-malware=\"RawPOS - S0169\""],"Reaver - S0172":["misp-galaxy:mitre-enterprise-attack-malware=\"Reaver - S0172\"","misp-galaxy:mitre-malware=\"Reaver - S0172\""],"RedLeaves - S0153":["misp-galaxy:mitre-enterprise-attack-malware=\"RedLeaves - S0153\"","misp-galaxy:mitre-malware=\"RedLeaves - S0153\""],"BUGJUICE":["misp-galaxy:mitre-enterprise-attack-malware=\"RedLeaves - S0153\"","misp-galaxy:mitre-malware=\"RedLeaves - S0153\"","misp-galaxy:tool=\"BUGJUICE\""],"Regin - S0019":["misp-galaxy:mitre-enterprise-attack-malware=\"Regin - S0019\"","misp-galaxy:mitre-malware=\"Regin - S0019\""],"RemoteCMD - S0166":["misp-galaxy:mitre-enterprise-attack-malware=\"RemoteCMD - S0166\"","misp-galaxy:mitre-malware=\"RemoteCMD - S0166\""],"RemoteCMD":["misp-galaxy:mitre-enterprise-attack-malware=\"RemoteCMD - S0166\"","misp-galaxy:mitre-malware=\"RemoteCMD - S0166\""],"Remsec - S0125":["misp-galaxy:mitre-enterprise-attack-malware=\"Remsec - S0125\"","misp-galaxy:mitre-malware=\"Remsec - S0125\""],"Backdoor.Remsec":["misp-galaxy:mitre-enterprise-attack-malware=\"Remsec - S0125\"","misp-galaxy:mitre-malware=\"Remsec - S0125\""],"Rover - S0090":["misp-galaxy:mitre-enterprise-attack-malware=\"Rover - S0090\"","misp-galaxy:mitre-malware=\"Rover - S0090\""],"S-Type - S0085":["misp-galaxy:mitre-enterprise-attack-malware=\"S-Type - S0085\"","misp-galaxy:mitre-malware=\"S-Type - S0085\""],"S-Type":["misp-galaxy:mitre-enterprise-attack-malware=\"S-Type - S0085\"","misp-galaxy:mitre-malware=\"S-Type - S0085\""],"SEASHARPEE - S0185":["misp-galaxy:mitre-enterprise-attack-malware=\"SEASHARPEE - S0185\"","misp-galaxy:mitre-malware=\"SEASHARPEE - S0185\""],"SEASHARPEE":["misp-galaxy:mitre-enterprise-attack-malware=\"SEASHARPEE - S0185\"","misp-galaxy:mitre-malware=\"SEASHARPEE - S0185\""],"SHIPSHAPE - S0028":["misp-galaxy:mitre-enterprise-attack-malware=\"SHIPSHAPE - S0028\"","misp-galaxy:mitre-malware=\"SHIPSHAPE - S0028\""],"SHOTPUT - S0063":["misp-galaxy:mitre-enterprise-attack-malware=\"SHOTPUT - S0063\"","misp-galaxy:mitre-malware=\"SHOTPUT - S0063\""],"SHOTPUT":["misp-galaxy:mitre-enterprise-attack-malware=\"SHOTPUT - S0063\"","misp-galaxy:mitre-malware=\"SHOTPUT - S0063\""],"Backdoor.APT.CookieCutter":["misp-galaxy:mitre-enterprise-attack-malware=\"SHOTPUT - S0063\"","misp-galaxy:mitre-malware=\"SHOTPUT - S0063\""],"SHUTTERSPEED - S0217":["misp-galaxy:mitre-enterprise-attack-malware=\"SHUTTERSPEED - S0217\"","misp-galaxy:mitre-malware=\"SHUTTERSPEED - S0217\""],"SHUTTERSPEED":["misp-galaxy:mitre-enterprise-attack-malware=\"SHUTTERSPEED - S0217\"","misp-galaxy:mitre-malware=\"SHUTTERSPEED - S0217\"","misp-galaxy:tool=\"SHUTTERSPEED\""],"SLOWDRIFT - S0218":["misp-galaxy:mitre-enterprise-attack-malware=\"SLOWDRIFT - S0218\"","misp-galaxy:mitre-malware=\"SLOWDRIFT - S0218\""],"SLOWDRIFT":["misp-galaxy:mitre-enterprise-attack-malware=\"SLOWDRIFT - S0218\"","misp-galaxy:mitre-malware=\"SLOWDRIFT - S0218\"","misp-galaxy:tool=\"SLOWDRIFT\""],"SNUGRIDE - S0159":["misp-galaxy:mitre-enterprise-attack-malware=\"SNUGRIDE - S0159\"","misp-galaxy:mitre-malware=\"SNUGRIDE - S0159\""],"SNUGRIDE":["misp-galaxy:mitre-enterprise-attack-malware=\"SNUGRIDE - S0159\"","misp-galaxy:mitre-malware=\"SNUGRIDE - S0159\"","misp-galaxy:tool=\"SNUGRIDE\""],"SOUNDBITE - S0157":["misp-galaxy:mitre-enterprise-attack-malware=\"SOUNDBITE - S0157\"","misp-galaxy:mitre-malware=\"SOUNDBITE - S0157\""],"SPACESHIP - S0035":["misp-galaxy:mitre-enterprise-attack-malware=\"SPACESHIP - S0035\"","misp-galaxy:mitre-malware=\"SPACESHIP - S0035\""],"Sakula - S0074":["misp-galaxy:mitre-enterprise-attack-malware=\"Sakula - S0074\"","misp-galaxy:mitre-malware=\"Sakula - S0074\""],"Sakula":["misp-galaxy:mitre-enterprise-attack-malware=\"Sakula - S0074\"","misp-galaxy:mitre-malware=\"Sakula - S0074\"","misp-galaxy:rat=\"Sakula\"","misp-galaxy:tool=\"Sakula\""],"VIPER":["misp-galaxy:mitre-enterprise-attack-malware=\"Sakula - S0074\"","misp-galaxy:mitre-malware=\"Sakula - S0074\"","misp-galaxy:rat=\"Sakula\""],"SeaDuke - S0053":["misp-galaxy:mitre-enterprise-attack-malware=\"SeaDuke - S0053\"","misp-galaxy:mitre-malware=\"SeaDuke - S0053\""],"SeaDuke":["misp-galaxy:mitre-enterprise-attack-malware=\"SeaDuke - S0053\"","misp-galaxy:mitre-malware=\"SeaDuke - S0053\"","misp-galaxy:threat-actor=\"APT 29\""],"SeaDesk":["misp-galaxy:mitre-enterprise-attack-malware=\"SeaDuke - S0053\"","misp-galaxy:mitre-malware=\"SeaDuke - S0053\""],"Shamoon - S0140":["misp-galaxy:mitre-enterprise-attack-malware=\"Shamoon - S0140\"","misp-galaxy:mitre-malware=\"Shamoon - S0140\""],"Shamoon":["misp-galaxy:mitre-enterprise-attack-malware=\"Shamoon - S0140\"","misp-galaxy:mitre-malware=\"Shamoon - S0140\"","misp-galaxy:tool=\"Shamoon\""],"Disttrack":["misp-galaxy:mitre-enterprise-attack-malware=\"Shamoon - S0140\"","misp-galaxy:mitre-malware=\"Shamoon - S0140\""],"Skeleton Key - S0007":["misp-galaxy:mitre-enterprise-attack-malware=\"Skeleton Key - S0007\"","misp-galaxy:mitre-malware=\"Skeleton Key - S0007\""],"Skeleton Key":["misp-galaxy:mitre-enterprise-attack-malware=\"Skeleton Key - S0007\"","misp-galaxy:mitre-malware=\"Skeleton Key - S0007\""],"Smoke Loader - S0226":["misp-galaxy:mitre-enterprise-attack-malware=\"Smoke Loader - S0226\"","misp-galaxy:mitre-malware=\"Smoke Loader - S0226\""],"Smoke Loader":["misp-galaxy:mitre-enterprise-attack-malware=\"Smoke Loader - S0226\"","misp-galaxy:mitre-malware=\"Smoke Loader - S0226\"","misp-galaxy:tool=\"Smoke Loader\""],"SslMM - S0058":["misp-galaxy:mitre-enterprise-attack-malware=\"SslMM - S0058\"","misp-galaxy:mitre-malware=\"SslMM - S0058\""],"Starloader - S0188":["misp-galaxy:mitre-enterprise-attack-malware=\"Starloader - S0188\"","misp-galaxy:mitre-malware=\"Starloader - S0188\""],"Starloader":["misp-galaxy:mitre-enterprise-attack-malware=\"Starloader - S0188\"","misp-galaxy:mitre-malware=\"Starloader - S0188\""],"StreamEx - S0142":["misp-galaxy:mitre-enterprise-attack-malware=\"StreamEx - S0142\"","misp-galaxy:mitre-malware=\"StreamEx - S0142\""],"StreamEx":["misp-galaxy:mitre-enterprise-attack-malware=\"StreamEx - S0142\"","misp-galaxy:mitre-malware=\"StreamEx - S0142\"","misp-galaxy:tool=\"StreamEx\""],"Sykipot - S0018":["misp-galaxy:mitre-enterprise-attack-malware=\"Sykipot - S0018\"","misp-galaxy:mitre-malware=\"Sykipot - S0018\""],"Sykipot":["misp-galaxy:mitre-enterprise-attack-malware=\"Sykipot - S0018\"","misp-galaxy:mitre-malware=\"Sykipot - S0018\"","misp-galaxy:threat-actor=\"Maverick Panda\""],"Sys10 - S0060":["misp-galaxy:mitre-enterprise-attack-malware=\"Sys10 - S0060\"","misp-galaxy:mitre-malware=\"Sys10 - S0060\""],"T9000 - S0098":["misp-galaxy:mitre-enterprise-attack-malware=\"T9000 - S0098\"","misp-galaxy:mitre-malware=\"T9000 - S0098\""],"T9000":["misp-galaxy:mitre-enterprise-attack-malware=\"T9000 - S0098\"","misp-galaxy:mitre-malware=\"T9000 - S0098\"","misp-galaxy:tool=\"T9000\""],"TDTESS - S0164":["misp-galaxy:mitre-enterprise-attack-malware=\"TDTESS - S0164\"","misp-galaxy:mitre-malware=\"TDTESS - S0164\""],"TEXTMATE - S0146":["misp-galaxy:mitre-enterprise-attack-malware=\"TEXTMATE - S0146\"","misp-galaxy:mitre-malware=\"TEXTMATE - S0146\""],"TINYTYPHON - S0131":["misp-galaxy:mitre-enterprise-attack-malware=\"TINYTYPHON - S0131\"","misp-galaxy:mitre-malware=\"TINYTYPHON - S0131\""],"TINYTYPHON":["misp-galaxy:mitre-enterprise-attack-malware=\"TINYTYPHON - S0131\"","misp-galaxy:mitre-malware=\"TINYTYPHON - S0131\""],"TURNEDUP - S0199":["misp-galaxy:mitre-enterprise-attack-malware=\"TURNEDUP - S0199\"","misp-galaxy:mitre-malware=\"TURNEDUP - S0199\""],"Taidoor - S0011":["misp-galaxy:mitre-enterprise-attack-malware=\"Taidoor - S0011\"","misp-galaxy:mitre-malware=\"Taidoor - S0011\""],"TinyZBot - S0004":["misp-galaxy:mitre-enterprise-attack-malware=\"TinyZBot - S0004\"","misp-galaxy:mitre-malware=\"TinyZBot - S0004\""],"TinyZBot":["misp-galaxy:mitre-enterprise-attack-malware=\"TinyZBot - S0004\"","misp-galaxy:mitre-malware=\"TinyZBot - S0004\"","misp-galaxy:tool=\"TinyZBot\""],"Trojan.Karagany - S0094":["misp-galaxy:mitre-enterprise-attack-malware=\"Trojan.Karagany - S0094\"","misp-galaxy:mitre-malware=\"Trojan.Karagany - S0094\""],"Trojan.Karagany":["misp-galaxy:mitre-enterprise-attack-malware=\"Trojan.Karagany - S0094\"","misp-galaxy:mitre-malware=\"Trojan.Karagany - S0094\""],"Trojan.Mebromi - S0001":["misp-galaxy:mitre-enterprise-attack-malware=\"Trojan.Mebromi - S0001\"","misp-galaxy:mitre-malware=\"Trojan.Mebromi - S0001\""],"Trojan.Mebromi":["misp-galaxy:mitre-enterprise-attack-malware=\"Trojan.Mebromi - S0001\"","misp-galaxy:mitre-malware=\"Trojan.Mebromi - S0001\""],"Truvasys - S0178":["misp-galaxy:mitre-enterprise-attack-malware=\"Truvasys - S0178\"","misp-galaxy:mitre-malware=\"Truvasys - S0178\""],"Truvasys":["misp-galaxy:mitre-enterprise-attack-malware=\"Truvasys - S0178\"","misp-galaxy:mitre-malware=\"Truvasys - S0178\""],"USBStealer - S0136":["misp-galaxy:mitre-enterprise-attack-malware=\"USBStealer - S0136\"","misp-galaxy:mitre-malware=\"USBStealer - S0136\""],"USBStealer":["misp-galaxy:mitre-enterprise-attack-malware=\"USBStealer - S0136\"","misp-galaxy:mitre-malware=\"USBStealer - S0136\"","misp-galaxy:tool=\"USBStealer\""],"USB Stealer":["misp-galaxy:mitre-enterprise-attack-malware=\"USBStealer - S0136\"","misp-galaxy:mitre-malware=\"USBStealer - S0136\""],"Win32\/USBStealer":["misp-galaxy:mitre-enterprise-attack-malware=\"USBStealer - S0136\"","misp-galaxy:mitre-malware=\"USBStealer - S0136\""],"Umbreon - S0221":["misp-galaxy:mitre-enterprise-attack-malware=\"Umbreon - S0221\"","misp-galaxy:mitre-malware=\"Umbreon - S0221\""],"Unknown Logger - S0130":["misp-galaxy:mitre-enterprise-attack-malware=\"Unknown Logger - S0130\"","misp-galaxy:mitre-malware=\"Unknown Logger - S0130\""],"Unknown Logger":["misp-galaxy:mitre-enterprise-attack-malware=\"Unknown Logger - S0130\"","misp-galaxy:mitre-malware=\"Unknown Logger - S0130\""],"Uroburos - S0022":["misp-galaxy:mitre-enterprise-attack-malware=\"Uroburos - S0022\"","misp-galaxy:mitre-malware=\"Uroburos - S0022\""],"Uroburos":["misp-galaxy:mitre-enterprise-attack-malware=\"Uroburos - S0022\"","misp-galaxy:mitre-malware=\"Uroburos - S0022\"","misp-galaxy:threat-actor=\"Turla Group\"","misp-galaxy:tool=\"Turla\""],"Vasport - S0207":["misp-galaxy:mitre-enterprise-attack-malware=\"Vasport - S0207\"","misp-galaxy:mitre-malware=\"Vasport - S0207\""],"Vasport":["misp-galaxy:mitre-enterprise-attack-malware=\"Vasport - S0207\"","misp-galaxy:mitre-malware=\"Vasport - S0207\""],"Volgmer - S0180":["misp-galaxy:mitre-enterprise-attack-malware=\"Volgmer - S0180\"","misp-galaxy:mitre-malware=\"Volgmer - S0180\""],"WEBC2 - S0109":["misp-galaxy:mitre-enterprise-attack-malware=\"WEBC2 - S0109\"","misp-galaxy:mitre-malware=\"WEBC2 - S0109\""],"WEBC2":["misp-galaxy:mitre-enterprise-attack-malware=\"WEBC2 - S0109\"","misp-galaxy:mitre-malware=\"WEBC2 - S0109\"","misp-galaxy:tool=\"WEBC2\""],"WINDSHIELD - S0155":["misp-galaxy:mitre-enterprise-attack-malware=\"WINDSHIELD - S0155\"","misp-galaxy:mitre-malware=\"WINDSHIELD - S0155\""],"WINDSHIELD":["misp-galaxy:mitre-enterprise-attack-malware=\"WINDSHIELD - S0155\"","misp-galaxy:mitre-malware=\"WINDSHIELD - S0155\""],"WINERACK - S0219":["misp-galaxy:mitre-enterprise-attack-malware=\"WINERACK - S0219\"","misp-galaxy:mitre-malware=\"WINERACK - S0219\""],"WINERACK":["misp-galaxy:mitre-enterprise-attack-malware=\"WINERACK - S0219\"","misp-galaxy:mitre-malware=\"WINERACK - S0219\"","misp-galaxy:tool=\"WINERACK\""],"Wiarp - S0206":["misp-galaxy:mitre-enterprise-attack-malware=\"Wiarp - S0206\"","misp-galaxy:mitre-malware=\"Wiarp - S0206\""],"Wiarp":["misp-galaxy:mitre-enterprise-attack-malware=\"Wiarp - S0206\"","misp-galaxy:mitre-malware=\"Wiarp - S0206\""],"WinMM - S0059":["misp-galaxy:mitre-enterprise-attack-malware=\"WinMM - S0059\"","misp-galaxy:mitre-malware=\"WinMM - S0059\""],"Wingbird - S0176":["misp-galaxy:mitre-enterprise-attack-malware=\"Wingbird - S0176\"","misp-galaxy:mitre-malware=\"Wingbird - S0176\""],"Wingbird":["misp-galaxy:mitre-enterprise-attack-malware=\"Wingbird - S0176\"","misp-galaxy:mitre-malware=\"Wingbird - S0176\""],"Winnti - S0141":["misp-galaxy:mitre-enterprise-attack-malware=\"Winnti - S0141\"","misp-galaxy:mitre-malware=\"Winnti - S0141\""],"Winnti":["misp-galaxy:mitre-enterprise-attack-malware=\"Winnti - S0141\"","misp-galaxy:mitre-malware=\"Winnti - S0141\"","misp-galaxy:tool=\"Winnti\""],"Wiper - S0041":["misp-galaxy:mitre-enterprise-attack-malware=\"Wiper - S0041\"","misp-galaxy:mitre-malware=\"Wiper - S0041\""],"Wiper":["misp-galaxy:mitre-enterprise-attack-malware=\"Wiper - S0041\"","misp-galaxy:mitre-malware=\"Wiper - S0041\""],"XAgentOSX - S0161":["misp-galaxy:mitre-enterprise-attack-malware=\"XAgentOSX - S0161\"","misp-galaxy:mitre-malware=\"XAgentOSX - S0161\""],"XAgentOSX":["misp-galaxy:mitre-enterprise-attack-malware=\"XAgentOSX - S0161\"","misp-galaxy:mitre-malware=\"XAgentOSX - S0161\""],"XTunnel - S0117":["misp-galaxy:mitre-enterprise-attack-malware=\"XTunnel - S0117\"","misp-galaxy:mitre-malware=\"XTunnel - S0117\""],"XTunnel":["misp-galaxy:mitre-enterprise-attack-malware=\"XTunnel - S0117\"","misp-galaxy:mitre-malware=\"XTunnel - S0117\"","misp-galaxy:tool=\"X-Tunnel\""],"XAPS":["misp-galaxy:mitre-enterprise-attack-malware=\"XTunnel - S0117\"","misp-galaxy:mitre-malware=\"XTunnel - S0117\""],"ZLib - S0086":["misp-galaxy:mitre-enterprise-attack-malware=\"ZLib - S0086\"","misp-galaxy:mitre-malware=\"ZLib - S0086\""],"ZLib":["misp-galaxy:mitre-enterprise-attack-malware=\"ZLib - S0086\"","misp-galaxy:mitre-malware=\"ZLib - S0086\""],"ZeroT - S0230":["misp-galaxy:mitre-enterprise-attack-malware=\"ZeroT - S0230\"","misp-galaxy:mitre-malware=\"ZeroT - S0230\""],"Zeroaccess - S0027":["misp-galaxy:mitre-enterprise-attack-malware=\"Zeroaccess - S0027\"","misp-galaxy:mitre-malware=\"Zeroaccess - S0027\""],"Zeroaccess":["misp-galaxy:mitre-enterprise-attack-malware=\"Zeroaccess - S0027\"","misp-galaxy:mitre-malware=\"Zeroaccess - S0027\""],"Trojan.Zeroaccess":["misp-galaxy:mitre-enterprise-attack-malware=\"Zeroaccess - S0027\"","misp-galaxy:mitre-malware=\"Zeroaccess - S0027\""],"adbupd - S0202":["misp-galaxy:mitre-enterprise-attack-malware=\"adbupd - S0202\"","misp-galaxy:mitre-malware=\"adbupd - S0202\""],"adbupd":["misp-galaxy:mitre-enterprise-attack-malware=\"adbupd - S0202\"","misp-galaxy:mitre-malware=\"adbupd - S0202\""],"gh0st - S0032":["misp-galaxy:mitre-enterprise-attack-malware=\"gh0st - S0032\"","misp-galaxy:mitre-malware=\"gh0st - S0032\""],"gh0st":["misp-galaxy:mitre-enterprise-attack-malware=\"gh0st - S0032\"","misp-galaxy:mitre-malware=\"gh0st - S0032\"","misp-galaxy:tool=\"gh0st\""],"hcdLoader - S0071":["misp-galaxy:mitre-enterprise-attack-malware=\"hcdLoader - S0071\"","misp-galaxy:mitre-malware=\"hcdLoader - S0071\""],"hcdLoader":["misp-galaxy:mitre-enterprise-attack-malware=\"hcdLoader - S0071\"","misp-galaxy:mitre-malware=\"hcdLoader - S0071\"","misp-galaxy:rat=\"hcdLoader\""],"httpclient - S0068":["misp-galaxy:mitre-enterprise-attack-malware=\"httpclient - S0068\"","misp-galaxy:mitre-malware=\"httpclient - S0068\""],"httpclient":["misp-galaxy:mitre-enterprise-attack-malware=\"httpclient - S0068\"","misp-galaxy:mitre-malware=\"httpclient - S0068\""],"pngdowner - S0067":["misp-galaxy:mitre-enterprise-attack-malware=\"pngdowner - S0067\"","misp-galaxy:mitre-malware=\"pngdowner - S0067\""],"Arp - S0099":["misp-galaxy:mitre-enterprise-attack-tool=\"Arp - S0099\"","misp-galaxy:mitre-tool=\"Arp - S0099\""],"Arp":["misp-galaxy:mitre-enterprise-attack-tool=\"Arp - S0099\"","misp-galaxy:mitre-tool=\"Arp - S0099\""],"arp.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"Arp - S0099\"","misp-galaxy:mitre-tool=\"Arp - S0099\""],"BITSAdmin - S0190":["misp-galaxy:mitre-enterprise-attack-tool=\"BITSAdmin - S0190\"","misp-galaxy:mitre-tool=\"BITSAdmin - S0190\""],"BITSAdmin":["misp-galaxy:mitre-enterprise-attack-tool=\"BITSAdmin - S0190\"","misp-galaxy:mitre-tool=\"BITSAdmin - S0190\""],"Cachedump - S0119":["misp-galaxy:mitre-enterprise-attack-tool=\"Cachedump - S0119\"","misp-galaxy:mitre-tool=\"Cachedump - S0119\""],"Cachedump":["misp-galaxy:mitre-enterprise-attack-tool=\"Cachedump - S0119\"","misp-galaxy:mitre-tool=\"Cachedump - S0119\""],"Cobalt Strike - S0154":["misp-galaxy:mitre-enterprise-attack-tool=\"Cobalt Strike - S0154\"","misp-galaxy:mitre-tool=\"Cobalt Strike - S0154\""],"FTP - S0095":["misp-galaxy:mitre-enterprise-attack-tool=\"FTP - S0095\"","misp-galaxy:mitre-tool=\"FTP - S0095\""],"FTP":["misp-galaxy:mitre-enterprise-attack-tool=\"FTP - S0095\"","misp-galaxy:mitre-tool=\"FTP - S0095\""],"ftp.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"FTP - S0095\"","misp-galaxy:mitre-tool=\"FTP - S0095\""],"Fgdump - S0120":["misp-galaxy:mitre-enterprise-attack-tool=\"Fgdump - S0120\"","misp-galaxy:mitre-tool=\"Fgdump - S0120\""],"Fgdump":["misp-galaxy:mitre-enterprise-attack-tool=\"Fgdump - S0120\"","misp-galaxy:mitre-tool=\"Fgdump - S0120\""],"Forfiles - S0193":["misp-galaxy:mitre-enterprise-attack-tool=\"Forfiles - S0193\"","misp-galaxy:mitre-tool=\"Forfiles - S0193\""],"Forfiles":["misp-galaxy:mitre-enterprise-attack-tool=\"Forfiles - S0193\"","misp-galaxy:mitre-tool=\"Forfiles - S0193\""],"HTRAN - S0040":["misp-galaxy:mitre-enterprise-attack-tool=\"HTRAN - S0040\"","misp-galaxy:mitre-tool=\"HTRAN - S0040\""],"HTRAN":["misp-galaxy:mitre-enterprise-attack-tool=\"HTRAN - S0040\"","misp-galaxy:mitre-tool=\"HTRAN - S0040\""],"Havij - S0224":["misp-galaxy:mitre-enterprise-attack-tool=\"Havij - S0224\"","misp-galaxy:mitre-tool=\"Havij - S0224\""],"Havij":["misp-galaxy:mitre-enterprise-attack-tool=\"Havij - S0224\"","misp-galaxy:mitre-tool=\"Havij - S0224\""],"Invoke-PSImage - S0231":["misp-galaxy:mitre-enterprise-attack-tool=\"Invoke-PSImage - S0231\"","misp-galaxy:mitre-tool=\"Invoke-PSImage - S0231\""],"Invoke-PSImage":["misp-galaxy:mitre-enterprise-attack-tool=\"Invoke-PSImage - S0231\"","misp-galaxy:mitre-tool=\"Invoke-PSImage - S0231\""],"Lslsass - S0121":["misp-galaxy:mitre-enterprise-attack-tool=\"Lslsass - S0121\"","misp-galaxy:mitre-tool=\"Lslsass - S0121\""],"Lslsass":["misp-galaxy:mitre-enterprise-attack-tool=\"Lslsass - S0121\"","misp-galaxy:mitre-tool=\"Lslsass - S0121\""],"MimiPenguin - S0179":["misp-galaxy:mitre-enterprise-attack-tool=\"MimiPenguin - S0179\"","misp-galaxy:mitre-tool=\"MimiPenguin - S0179\""],"MimiPenguin":["misp-galaxy:mitre-enterprise-attack-tool=\"MimiPenguin - S0179\"","misp-galaxy:mitre-tool=\"MimiPenguin - S0179\""],"Mimikatz - S0002":["misp-galaxy:mitre-enterprise-attack-tool=\"Mimikatz - S0002\"","misp-galaxy:mitre-tool=\"Mimikatz - S0002\""],"Mimikatz":["misp-galaxy:mitre-enterprise-attack-tool=\"Mimikatz - S0002\"","misp-galaxy:mitre-tool=\"Mimikatz - S0002\"","misp-galaxy:tool=\"Mimikatz\""],"Net - S0039":["misp-galaxy:mitre-enterprise-attack-tool=\"Net - S0039\"","misp-galaxy:mitre-tool=\"Net - S0039\""],"Net":["misp-galaxy:mitre-enterprise-attack-tool=\"Net - S0039\"","misp-galaxy:mitre-tool=\"Net - S0039\""],"net.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"Net - S0039\"","misp-galaxy:mitre-tool=\"Net - S0039\""],"Pass-The-Hash Toolkit - S0122":["misp-galaxy:mitre-enterprise-attack-tool=\"Pass-The-Hash Toolkit - S0122\"","misp-galaxy:mitre-tool=\"Pass-The-Hash Toolkit - S0122\""],"Pass-The-Hash Toolkit":["misp-galaxy:mitre-enterprise-attack-tool=\"Pass-The-Hash Toolkit - S0122\"","misp-galaxy:mitre-tool=\"Pass-The-Hash Toolkit - S0122\""],"Ping - S0097":["misp-galaxy:mitre-enterprise-attack-tool=\"Ping - S0097\"","misp-galaxy:mitre-tool=\"Ping - S0097\""],"Ping":["misp-galaxy:mitre-enterprise-attack-tool=\"Ping - S0097\"","misp-galaxy:mitre-tool=\"Ping - S0097\""],"ping.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"Ping - S0097\"","misp-galaxy:mitre-tool=\"Ping - S0097\""],"PowerSploit - S0194":["misp-galaxy:mitre-enterprise-attack-tool=\"PowerSploit - S0194\"","misp-galaxy:mitre-tool=\"PowerSploit - S0194\""],"PowerSploit":["misp-galaxy:mitre-enterprise-attack-tool=\"PowerSploit - S0194\"","misp-galaxy:mitre-tool=\"PowerSploit - S0194\""],"PsExec - S0029":["misp-galaxy:mitre-enterprise-attack-tool=\"PsExec - S0029\"","misp-galaxy:mitre-tool=\"PsExec - S0029\""],"PsExec":["misp-galaxy:mitre-enterprise-attack-tool=\"PsExec - S0029\"","misp-galaxy:mitre-tool=\"PsExec - S0029\"","misp-galaxy:tool=\"PsExec\""],"Pupy - S0192":["misp-galaxy:mitre-enterprise-attack-tool=\"Pupy - S0192\"","misp-galaxy:mitre-tool=\"Pupy - S0192\""],"Pupy":["misp-galaxy:mitre-enterprise-attack-tool=\"Pupy - S0192\"","misp-galaxy:mitre-tool=\"Pupy - S0192\"","misp-galaxy:rat=\"Pupy\""],"Reg - S0075":["misp-galaxy:mitre-enterprise-attack-tool=\"Reg - S0075\"","misp-galaxy:mitre-tool=\"Reg - S0075\""],"Reg":["misp-galaxy:mitre-enterprise-attack-tool=\"Reg - S0075\"","misp-galaxy:mitre-tool=\"Reg - S0075\""],"reg.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"Reg - S0075\"","misp-galaxy:mitre-tool=\"Reg - S0075\""],"Responder - S0174":["misp-galaxy:mitre-enterprise-attack-tool=\"Responder - S0174\"","misp-galaxy:mitre-tool=\"Responder - S0174\""],"Responder":["misp-galaxy:mitre-enterprise-attack-tool=\"Responder - S0174\"","misp-galaxy:mitre-tool=\"Responder - S0174\""],"SDelete - S0195":["misp-galaxy:mitre-enterprise-attack-tool=\"SDelete - S0195\"","misp-galaxy:mitre-tool=\"SDelete - S0195\""],"SDelete":["misp-galaxy:mitre-enterprise-attack-tool=\"SDelete - S0195\"","misp-galaxy:mitre-tool=\"SDelete - S0195\""],"Systeminfo - S0096":["misp-galaxy:mitre-enterprise-attack-tool=\"Systeminfo - S0096\"","misp-galaxy:mitre-tool=\"Systeminfo - S0096\""],"Systeminfo":["misp-galaxy:mitre-enterprise-attack-tool=\"Systeminfo - S0096\"","misp-galaxy:mitre-tool=\"Systeminfo - S0096\""],"systeminfo.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"Systeminfo - S0096\"","misp-galaxy:mitre-tool=\"Systeminfo - S0096\""],"Tasklist - S0057":["misp-galaxy:mitre-enterprise-attack-tool=\"Tasklist - S0057\"","misp-galaxy:mitre-tool=\"Tasklist - S0057\""],"Tasklist":["misp-galaxy:mitre-enterprise-attack-tool=\"Tasklist - S0057\"","misp-galaxy:mitre-tool=\"Tasklist - S0057\""],"Tor - S0183":["misp-galaxy:mitre-enterprise-attack-tool=\"Tor - S0183\"","misp-galaxy:mitre-tool=\"Tor - S0183\""],"Tor":["misp-galaxy:mitre-enterprise-attack-tool=\"Tor - S0183\"","misp-galaxy:mitre-tool=\"Tor - S0183\""],"UACMe - S0116":["misp-galaxy:mitre-enterprise-attack-tool=\"UACMe - S0116\"","misp-galaxy:mitre-tool=\"UACMe - S0116\""],"Windows Credential Editor - S0005":["misp-galaxy:mitre-enterprise-attack-tool=\"Windows Credential Editor - S0005\"","misp-galaxy:mitre-tool=\"Windows Credential Editor - S0005\""],"Windows Credential Editor":["misp-galaxy:mitre-enterprise-attack-tool=\"Windows Credential Editor - S0005\"","misp-galaxy:mitre-tool=\"Windows Credential Editor - S0005\""],"WCE":["misp-galaxy:mitre-enterprise-attack-tool=\"Windows Credential Editor - S0005\"","misp-galaxy:mitre-tool=\"Windows Credential Editor - S0005\""],"Winexe - S0191":["misp-galaxy:mitre-enterprise-attack-tool=\"Winexe - S0191\"","misp-galaxy:mitre-tool=\"Winexe - S0191\""],"Winexe":["misp-galaxy:mitre-enterprise-attack-tool=\"Winexe - S0191\"","misp-galaxy:mitre-tool=\"Winexe - S0191\"","misp-galaxy:tool=\"Winexe\""],"at - S0110":["misp-galaxy:mitre-enterprise-attack-tool=\"at - S0110\"","misp-galaxy:mitre-tool=\"at - S0110\""],"at":["misp-galaxy:mitre-enterprise-attack-tool=\"at - S0110\"","misp-galaxy:mitre-tool=\"at - S0110\""],"at.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"at - S0110\"","misp-galaxy:mitre-tool=\"at - S0110\""],"certutil - S0160":["misp-galaxy:mitre-enterprise-attack-tool=\"certutil - S0160\"","misp-galaxy:mitre-tool=\"certutil - S0160\""],"certutil":["misp-galaxy:mitre-enterprise-attack-tool=\"certutil - S0160\"","misp-galaxy:mitre-tool=\"certutil - S0160\""],"certutil.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"certutil - S0160\"","misp-galaxy:mitre-tool=\"certutil - S0160\""],"cmd - S0106":["misp-galaxy:mitre-enterprise-attack-tool=\"cmd - S0106\"","misp-galaxy:mitre-tool=\"cmd - S0106\""],"cmd":["misp-galaxy:mitre-enterprise-attack-tool=\"cmd - S0106\"","misp-galaxy:mitre-tool=\"cmd - S0106\""],"cmd.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"cmd - S0106\"","misp-galaxy:mitre-tool=\"cmd - S0106\""],"dsquery - S0105":["misp-galaxy:mitre-enterprise-attack-tool=\"dsquery - S0105\"","misp-galaxy:mitre-tool=\"dsquery - S0105\""],"dsquery":["misp-galaxy:mitre-enterprise-attack-tool=\"dsquery - S0105\"","misp-galaxy:mitre-tool=\"dsquery - S0105\""],"dsquery.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"dsquery - S0105\"","misp-galaxy:mitre-tool=\"dsquery - S0105\""],"gsecdump - S0008":["misp-galaxy:mitre-enterprise-attack-tool=\"gsecdump - S0008\"","misp-galaxy:mitre-tool=\"gsecdump - S0008\""],"ifconfig - S0101":["misp-galaxy:mitre-enterprise-attack-tool=\"ifconfig - S0101\"","misp-galaxy:mitre-tool=\"ifconfig - S0101\""],"ifconfig":["misp-galaxy:mitre-enterprise-attack-tool=\"ifconfig - S0101\"","misp-galaxy:mitre-tool=\"ifconfig - S0101\""],"ipconfig - S0100":["misp-galaxy:mitre-enterprise-attack-tool=\"ipconfig - S0100\"","misp-galaxy:mitre-tool=\"ipconfig - S0100\""],"ipconfig":["misp-galaxy:mitre-enterprise-attack-tool=\"ipconfig - S0100\"","misp-galaxy:mitre-tool=\"ipconfig - S0100\""],"ipconfig.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"ipconfig - S0100\"","misp-galaxy:mitre-tool=\"ipconfig - S0100\""],"meek - S0175":["misp-galaxy:mitre-enterprise-attack-tool=\"meek - S0175\"","misp-galaxy:mitre-tool=\"meek - S0175\""],"meek":["misp-galaxy:mitre-enterprise-attack-tool=\"meek - S0175\"","misp-galaxy:mitre-tool=\"meek - S0175\""],"nbtstat - S0102":["misp-galaxy:mitre-enterprise-attack-tool=\"nbtstat - S0102\"","misp-galaxy:mitre-tool=\"nbtstat - S0102\""],"nbtstat":["misp-galaxy:mitre-enterprise-attack-tool=\"nbtstat - S0102\"","misp-galaxy:mitre-tool=\"nbtstat - S0102\""],"nbtstat.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"nbtstat - S0102\"","misp-galaxy:mitre-tool=\"nbtstat - S0102\""],"netsh - S0108":["misp-galaxy:mitre-enterprise-attack-tool=\"netsh - S0108\"","misp-galaxy:mitre-tool=\"netsh - S0108\""],"netsh":["misp-galaxy:mitre-enterprise-attack-tool=\"netsh - S0108\"","misp-galaxy:mitre-tool=\"netsh - S0108\""],"netsh.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"netsh - S0108\"","misp-galaxy:mitre-tool=\"netsh - S0108\""],"netstat - S0104":["misp-galaxy:mitre-enterprise-attack-tool=\"netstat - S0104\"","misp-galaxy:mitre-tool=\"netstat - S0104\""],"netstat":["misp-galaxy:mitre-enterprise-attack-tool=\"netstat - S0104\"","misp-galaxy:mitre-tool=\"netstat - S0104\""],"netstat.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"netstat - S0104\"","misp-galaxy:mitre-tool=\"netstat - S0104\""],"pwdump - S0006":["misp-galaxy:mitre-enterprise-attack-tool=\"pwdump - S0006\"","misp-galaxy:mitre-tool=\"pwdump - S0006\""],"pwdump":["misp-galaxy:mitre-enterprise-attack-tool=\"pwdump - S0006\"","misp-galaxy:mitre-tool=\"pwdump - S0006\""],"route - S0103":["misp-galaxy:mitre-enterprise-attack-tool=\"route - S0103\"","misp-galaxy:mitre-tool=\"route - S0103\""],"route":["misp-galaxy:mitre-enterprise-attack-tool=\"route - S0103\"","misp-galaxy:mitre-tool=\"route - S0103\""],"route.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"route - S0103\"","misp-galaxy:mitre-tool=\"route - S0103\""],"schtasks - S0111":["misp-galaxy:mitre-enterprise-attack-tool=\"schtasks - S0111\"","misp-galaxy:mitre-tool=\"schtasks - S0111\""],"schtasks":["misp-galaxy:mitre-enterprise-attack-tool=\"schtasks - S0111\"","misp-galaxy:mitre-tool=\"schtasks - S0111\""],"schtasks.exe":["misp-galaxy:mitre-enterprise-attack-tool=\"schtasks - S0111\"","misp-galaxy:mitre-tool=\"schtasks - S0111\""],"spwebmember - S0227":["misp-galaxy:mitre-enterprise-attack-tool=\"spwebmember - S0227\"","misp-galaxy:mitre-tool=\"spwebmember - S0227\""],"spwebmember":["misp-galaxy:mitre-enterprise-attack-tool=\"spwebmember - S0227\"","misp-galaxy:mitre-tool=\"spwebmember - S0227\""],"sqlmap - S0225":["misp-galaxy:mitre-enterprise-attack-tool=\"sqlmap - S0225\"","misp-galaxy:mitre-tool=\"sqlmap - S0225\""],"sqlmap":["misp-galaxy:mitre-enterprise-attack-tool=\"sqlmap - S0225\"","misp-galaxy:mitre-tool=\"sqlmap - S0225\""],"xCmd - S0123":["misp-galaxy:mitre-enterprise-attack-tool=\"xCmd - S0123\"","misp-galaxy:mitre-tool=\"xCmd - S0123\""],"xCmd":["misp-galaxy:mitre-enterprise-attack-tool=\"xCmd - S0123\"","misp-galaxy:mitre-tool=\"xCmd - S0123\""],"APT19 - G0073":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\""],"APT19":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\"","misp-galaxy:threat-actor=\"Codoso\""],"Codoso":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\"","misp-galaxy:threat-actor=\"Codoso\""],"C0d0so0":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\""],"Codoso Team":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\""],"Sunshop Group":["misp-galaxy:mitre-intrusion-set=\"APT19 - G0073\"","misp-galaxy:threat-actor=\"Codoso\""],"SNAKEMACKEREL":["misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Swallowtail":["misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"Group 74":["misp-galaxy:mitre-intrusion-set=\"APT28 - G0007\"","misp-galaxy:threat-actor=\"Sofacy\""],"YTTRIUM":["misp-galaxy:mitre-intrusion-set=\"APT29 - G0016\"","misp-galaxy:threat-actor=\"APT 29\""],"SeaLotus":["misp-galaxy:mitre-intrusion-set=\"APT32 - G0050\"","misp-galaxy:threat-actor=\"APT32\""],"APT-C-00":["misp-galaxy:mitre-intrusion-set=\"APT32 - G0050\"","misp-galaxy:threat-actor=\"APT32\""],"Elfin":["misp-galaxy:mitre-intrusion-set=\"APT33 - G0064\"","misp-galaxy:threat-actor=\"APT33\""],"APT38 - G0082":["misp-galaxy:mitre-intrusion-set=\"APT38 - G0082\""],"APT38":["misp-galaxy:mitre-intrusion-set=\"APT38 - G0082\"","misp-galaxy:threat-actor=\"Lazarus Group\""],"APT39 - G0087":["misp-galaxy:mitre-intrusion-set=\"APT39 - G0087\""],"APT39":["misp-galaxy:mitre-intrusion-set=\"APT39 - G0087\"","misp-galaxy:threat-actor=\"APT39\""],"Chafer":["misp-galaxy:mitre-intrusion-set=\"APT39 - G0087\"","misp-galaxy:threat-actor=\"APT39\"","misp-galaxy:threat-actor=\"Chafer\""],"Cobalt Group - G0080":["misp-galaxy:mitre-intrusion-set=\"Cobalt Group - G0080\""],"Cobalt Group":["misp-galaxy:mitre-intrusion-set=\"Cobalt Group - G0080\"","misp-galaxy:threat-actor=\"Cobalt\""],"Cobalt Gang":["misp-galaxy:mitre-intrusion-set=\"Cobalt Group - G0080\"","misp-galaxy:threat-actor=\"Cobalt\""],"Cobalt Spider":["misp-galaxy:mitre-intrusion-set=\"Cobalt Group - G0080\"","misp-galaxy:threat-actor=\"Cobalt\""],"Dark Caracal - G0070":["misp-galaxy:mitre-intrusion-set=\"Dark Caracal - G0070\""],"Dark Caracal":["misp-galaxy:mitre-intrusion-set=\"Dark Caracal - G0070\"","misp-galaxy:threat-actor=\"Dark Caracal\""],"DarkHydrus - G0079":["misp-galaxy:mitre-intrusion-set=\"DarkHydrus - G0079\""],"DarkHydrus":["misp-galaxy:mitre-intrusion-set=\"DarkHydrus - G0079\"","misp-galaxy:threat-actor=\"DarkHydrus\""],"Dragonfly 2.0 - G0074":["misp-galaxy:mitre-intrusion-set=\"Dragonfly 2.0 - G0074\""],"Dragonfly 2.0":["misp-galaxy:mitre-intrusion-set=\"Dragonfly 2.0 - G0074\"","misp-galaxy:threat-actor=\"DYMALLOY\""],"Berserk Bear":["misp-galaxy:mitre-intrusion-set=\"Dragonfly 2.0 - G0074\"","misp-galaxy:threat-actor=\"Berserk Bear\"","misp-galaxy:threat-actor=\"TeamSpy Crew\""],"FIN4 - G0085":["misp-galaxy:mitre-intrusion-set=\"FIN4 - G0085\""],"FIN4":["misp-galaxy:mitre-intrusion-set=\"FIN4 - G0085\"","misp-galaxy:threat-actor=\"Wolf Spider\""],"Gallmaker - G0084":["misp-galaxy:mitre-intrusion-set=\"Gallmaker - G0084\""],"Gallmaker":["misp-galaxy:mitre-intrusion-set=\"Gallmaker - G0084\"","misp-galaxy:threat-actor=\"Gallmaker\""],"Gorgon Group - G0078":["misp-galaxy:mitre-intrusion-set=\"Gorgon Group - G0078\""],"Gorgon Group":["misp-galaxy:mitre-intrusion-set=\"Gorgon Group - G0078\"","misp-galaxy:threat-actor=\"The Gorgon Group\""],"Honeybee - G0072":["misp-galaxy:mitre-intrusion-set=\"Honeybee - G0072\""],"Honeybee":["misp-galaxy:mitre-intrusion-set=\"Honeybee - G0072\"","misp-galaxy:threat-actor=\"Honeybee\""],"APT15":["misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:threat-actor=\"Mirage\""],"Vixen Panda":["misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:threat-actor=\"Mirage\""],"GREF":["misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:threat-actor=\"Mirage\""],"Playful Dragon":["misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\"","misp-galaxy:threat-actor=\"Mirage\""],"RoyalAPT":["misp-galaxy:mitre-intrusion-set=\"Ke3chang - G0004\""],"Leafminer - G0077":["misp-galaxy:mitre-intrusion-set=\"Leafminer - G0077\""],"Leafminer":["misp-galaxy:mitre-intrusion-set=\"Leafminer - G0077\""],"Raspite":["misp-galaxy:mitre-intrusion-set=\"Leafminer - G0077\"","misp-galaxy:threat-actor=\"RASPITE\""],"TEMP.Jumper":["misp-galaxy:mitre-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:threat-actor=\"Leviathan\""],"APT40":["misp-galaxy:mitre-intrusion-set=\"Leviathan - G0065\"","misp-galaxy:threat-actor=\"Leviathan\""],"DRAGONFISH":["misp-galaxy:mitre-intrusion-set=\"Lotus Blossom - G0030\"","misp-galaxy:threat-actor=\"Lotus Blossom\""],"APT35":["misp-galaxy:mitre-intrusion-set=\"Magic Hound - G0059\"","misp-galaxy:threat-actor=\"APT35\"","misp-galaxy:threat-actor=\"Cleaver\""],"Seedworm":["misp-galaxy:mitre-intrusion-set=\"MuddyWater - G0069\"","misp-galaxy:threat-actor=\"MuddyWater\""],"IRN2":["misp-galaxy:mitre-intrusion-set=\"OilRig - G0049\"","misp-galaxy:threat-actor=\"OilRig\""],"HELIX KITTEN":["misp-galaxy:mitre-intrusion-set=\"OilRig - G0049\""],"Orangeworm - G0071":["misp-galaxy:mitre-intrusion-set=\"Orangeworm - G0071\""],"Orangeworm":["misp-galaxy:mitre-intrusion-set=\"Orangeworm - G0071\"","misp-galaxy:threat-actor=\"Orangeworm\""],"Rancor - G0075":["misp-galaxy:mitre-intrusion-set=\"Rancor - G0075\""],"Rancor":["misp-galaxy:mitre-intrusion-set=\"Rancor - G0075\"","misp-galaxy:threat-actor=\"RANCOR\""],"VOODOO BEAR":["misp-galaxy:mitre-intrusion-set=\"Sandworm Team - G0034\""],"SilverTerrier - G0083":["misp-galaxy:mitre-intrusion-set=\"SilverTerrier - G0083\""],"SilverTerrier":["misp-galaxy:mitre-intrusion-set=\"SilverTerrier - G0083\"","misp-galaxy:threat-actor=\"SilverTerrier\""],"Stolen Pencil - G0086":["misp-galaxy:mitre-intrusion-set=\"Stolen Pencil - G0086\""],"Stolen Pencil":["misp-galaxy:mitre-intrusion-set=\"Stolen Pencil - G0086\""],"TEMP.Veles - G0088":["misp-galaxy:mitre-intrusion-set=\"TEMP.Veles - G0088\""],"TEMP.Veles":["misp-galaxy:mitre-intrusion-set=\"TEMP.Veles - G0088\"","misp-galaxy:threat-actor=\"TEMP.Veles\""],"XENOTIME":["misp-galaxy:mitre-intrusion-set=\"TEMP.Veles - G0088\"","misp-galaxy:threat-actor=\"XENOTIME\""],"APT27":["misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"Iron Tiger":["misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"LuckyMouse":["misp-galaxy:mitre-intrusion-set=\"Threat Group-3390 - G0027\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"Thrip - G0076":["misp-galaxy:mitre-intrusion-set=\"Thrip - G0076\""],"Thrip":["misp-galaxy:mitre-intrusion-set=\"Thrip - G0076\"","misp-galaxy:threat-actor=\"Thrip\""],"Tropic Trooper - G0081":["misp-galaxy:mitre-intrusion-set=\"Tropic Trooper - G0081\""],"Tropic Trooper":["misp-galaxy:mitre-intrusion-set=\"Tropic Trooper - G0081\"","misp-galaxy:threat-actor=\"Tropic Trooper\""],"VENOMOUS BEAR":["misp-galaxy:mitre-intrusion-set=\"Turla - G0010\""],"Krypton":["misp-galaxy:mitre-intrusion-set=\"Turla - G0010\""],"HOGFISH":["misp-galaxy:mitre-intrusion-set=\"menuPass - G0045\"","misp-galaxy:threat-actor=\"Stone Panda\""],"ANDROIDOS_ANSERVER.A - S0310":["misp-galaxy:mitre-malware=\"ANDROIDOS_ANSERVER.A - S0310\""],"ANDROIDOS_ANSERVER.A":["misp-galaxy:mitre-malware=\"ANDROIDOS_ANSERVER.A - S0310\"","misp-galaxy:mitre-mobile-attack-malware=\"ANDROIDOS_ANSERVER.A - MOB-S0026\""],"Adups - S0309":["misp-galaxy:mitre-malware=\"Adups - S0309\""],"Adups":["misp-galaxy:mitre-malware=\"Adups - S0309\"","misp-galaxy:mitre-mobile-attack-malware=\"Adups - MOB-S0025\""],"Agent Tesla - S0331":["misp-galaxy:mitre-malware=\"Agent Tesla - S0331\""],"Allwinner - S0319":["misp-galaxy:mitre-malware=\"Allwinner - S0319\""],"Allwinner":["misp-galaxy:mitre-malware=\"Allwinner - S0319\""],"AndroRAT - S0292":["misp-galaxy:mitre-malware=\"AndroRAT - S0292\""],"Android Overlay Malware - S0296":["misp-galaxy:mitre-malware=\"Android Overlay Malware - S0296\""],"Android Overlay Malware":["misp-galaxy:mitre-malware=\"Android Overlay Malware - S0296\""],"Android\/Chuli.A - S0304":["misp-galaxy:mitre-malware=\"Android\/Chuli.A - S0304\""],"Android\/Chuli.A":["misp-galaxy:mitre-malware=\"Android\/Chuli.A - S0304\"","misp-galaxy:mitre-mobile-attack-malware=\"Android\/Chuli.A - MOB-S0020\""],"Astaroth - S0373":["misp-galaxy:mitre-malware=\"Astaroth - S0373\""],"Astaroth":["misp-galaxy:mitre-malware=\"Astaroth - S0373\""],"AuditCred - S0347":["misp-galaxy:mitre-malware=\"AuditCred - S0347\""],"AuditCred":["misp-galaxy:mitre-malware=\"AuditCred - S0347\""],"Roptimizer":["misp-galaxy:mitre-malware=\"AuditCred - S0347\""],"Azorult - S0344":["misp-galaxy:mitre-malware=\"Azorult - S0344\""],"BADCALL - S0245":["misp-galaxy:mitre-malware=\"BADCALL - S0245\""],"BADCALL":["misp-galaxy:mitre-malware=\"BADCALL - S0245\""],"BONDUPDATER - S0360":["misp-galaxy:mitre-malware=\"BONDUPDATER - S0360\""],"BadPatch - S0337":["misp-galaxy:mitre-malware=\"BadPatch - S0337\""],"BadPatch":["misp-galaxy:mitre-malware=\"BadPatch - S0337\""],"Bandook - S0234":["misp-galaxy:mitre-malware=\"Bandook - S0234\""],"Bandook":["misp-galaxy:mitre-malware=\"Bandook - S0234\""],"Bankshot - S0239":["misp-galaxy:mitre-malware=\"Bankshot - S0239\""],"Trojan Manuscript":["misp-galaxy:mitre-malware=\"Bankshot - S0239\""],"Bisonal - S0268":["misp-galaxy:mitre-malware=\"Bisonal - S0268\""],"BrainTest - S0293":["misp-galaxy:mitre-malware=\"BrainTest - S0293\""],"BrainTest":["misp-galaxy:mitre-malware=\"BrainTest - S0293\"","misp-galaxy:mitre-mobile-attack-malware=\"BrainTest - MOB-S0009\""],"Brave Prince - S0252":["misp-galaxy:mitre-malware=\"Brave Prince - S0252\""],"Brave Prince":["misp-galaxy:mitre-malware=\"Brave Prince - S0252\""],"Backdoor.SofacyX":["misp-galaxy:mitre-malware=\"CHOPSTICK - S0023\""],"Calisto - S0274":["misp-galaxy:mitre-malware=\"Calisto - S0274\""],"Cannon - S0351":["misp-galaxy:mitre-malware=\"Cannon - S0351\""],"Carbon - S0335":["misp-galaxy:mitre-malware=\"Carbon - S0335\""],"Cardinal RAT - S0348":["misp-galaxy:mitre-malware=\"Cardinal RAT - S0348\""],"Catchamas - S0261":["misp-galaxy:mitre-malware=\"Catchamas - S0261\""],"Charger - S0323":["misp-galaxy:mitre-malware=\"Charger - S0323\""],"Cobian RAT - S0338":["misp-galaxy:mitre-malware=\"Cobian RAT - S0338\""],"CoinTicker - S0369":["misp-galaxy:mitre-malware=\"CoinTicker - S0369\""],"CoinTicker":["misp-galaxy:mitre-malware=\"CoinTicker - S0369\""],"Comnie - S0244":["misp-galaxy:mitre-malware=\"Comnie - S0244\""],"Comnie":["misp-galaxy:mitre-malware=\"Comnie - S0244\"","misp-galaxy:rat=\"Comnie\"","misp-galaxy:threat-actor=\"Blackgear\""],"CrossRAT - S0235":["misp-galaxy:mitre-malware=\"CrossRAT - S0235\""],"DDKONG - S0255":["misp-galaxy:mitre-malware=\"DDKONG - S0255\""],"DarkComet - S0334":["misp-galaxy:mitre-malware=\"DarkComet - S0334\""],"DarkKomet":["misp-galaxy:mitre-malware=\"DarkComet - S0334\""],"Krademok":["misp-galaxy:mitre-malware=\"DarkComet - S0334\""],"FYNLOS":["misp-galaxy:mitre-malware=\"DarkComet - S0334\""],"DealersChoice - S0243":["misp-galaxy:mitre-malware=\"DealersChoice - S0243\""],"Dendroid - S0301":["misp-galaxy:mitre-malware=\"Dendroid - S0301\""],"Dendroid":["misp-galaxy:mitre-malware=\"Dendroid - S0301\"","misp-galaxy:mitre-mobile-attack-malware=\"Dendroid - MOB-S0017\"","misp-galaxy:rat=\"Dendroid\""],"Denis - S0354":["misp-galaxy:mitre-malware=\"Denis - S0354\""],"Denis":["misp-galaxy:mitre-malware=\"Denis - S0354\""],"Dok - S0281":["misp-galaxy:mitre-malware=\"Dok - S0281\""],"DressCode - S0300":["misp-galaxy:mitre-malware=\"DressCode - S0300\""],"DressCode":["misp-galaxy:mitre-malware=\"DressCode - S0300\"","misp-galaxy:mitre-mobile-attack-malware=\"DressCode - MOB-S0016\""],"DroidJack - S0320":["misp-galaxy:mitre-malware=\"DroidJack - S0320\""],"DroidJack":["misp-galaxy:mitre-malware=\"DroidJack - S0320\"","misp-galaxy:rat=\"DroidJack\""],"DualToy - S0315":["misp-galaxy:mitre-malware=\"DualToy - S0315\""],"DualToy":["misp-galaxy:mitre-malware=\"DualToy - S0315\"","misp-galaxy:mitre-mobile-attack-malware=\"DualToy - MOB-S0031\""],"Ebury - S0377":["misp-galaxy:mitre-malware=\"Ebury - S0377\""],"Emotet - S0367":["misp-galaxy:mitre-malware=\"Emotet - S0367\""],"Exaramel - S0343":["misp-galaxy:mitre-malware=\"Exaramel - S0343\""],"Exaramel":["misp-galaxy:mitre-malware=\"Exaramel - S0343\""],"FELIXROOT - S0267":["misp-galaxy:mitre-malware=\"FELIXROOT - S0267\""],"FELIXROOT":["misp-galaxy:mitre-malware=\"FELIXROOT - S0267\""],"GreyEnergy mini":["misp-galaxy:mitre-malware=\"FELIXROOT - S0267\""],"Final1stspy - S0355":["misp-galaxy:mitre-malware=\"Final1stspy - S0355\""],"Final1stspy":["misp-galaxy:mitre-malware=\"Final1stspy - S0355\""],"FruitFly - S0277":["misp-galaxy:mitre-malware=\"FruitFly - S0277\""],"Gold Dragon - S0249":["misp-galaxy:mitre-malware=\"Gold Dragon - S0249\""],"Gold Dragon":["misp-galaxy:mitre-malware=\"Gold Dragon - S0249\""],"Gooligan - S0290":["misp-galaxy:mitre-malware=\"Gooligan - S0290\""],"Gooligan":["misp-galaxy:mitre-malware=\"Gooligan - S0290\"","misp-galaxy:mitre-mobile-attack-malware=\"Gooligan - MOB-S0006\""],"GravityRAT - S0237":["misp-galaxy:mitre-malware=\"GravityRAT - S0237\""],"GravityRAT":["misp-galaxy:mitre-malware=\"GravityRAT - S0237\"","misp-galaxy:rat=\"GravityRAT\""],"GreyEnergy - S0342":["misp-galaxy:mitre-malware=\"GreyEnergy - S0342\""],"HARDRAIN - S0246":["misp-galaxy:mitre-malware=\"HARDRAIN - S0246\""],"HARDRAIN":["misp-galaxy:mitre-malware=\"HARDRAIN - S0246\""],"HOPLIGHT - S0376":["misp-galaxy:mitre-malware=\"HOPLIGHT - S0376\""],"HummingBad - S0322":["misp-galaxy:mitre-malware=\"HummingBad - S0322\""],"HummingWhale - S0321":["misp-galaxy:mitre-malware=\"HummingWhale - S0321\""],"HummingWhale":["misp-galaxy:mitre-malware=\"HummingWhale - S0321\"","misp-galaxy:mitre-mobile-attack-malware=\"HummingWhale - MOB-S0037\""],"InnaputRAT - S0259":["misp-galaxy:mitre-malware=\"InnaputRAT - S0259\""],"InvisiMole - S0260":["misp-galaxy:mitre-malware=\"InvisiMole - S0260\""],"Trojan.Sofacy":["misp-galaxy:mitre-malware=\"JHUHUGIT - S0044\""],"Judy - S0325":["misp-galaxy:mitre-malware=\"Judy - S0325\""],"KEYMARBLE - S0271":["misp-galaxy:mitre-malware=\"KEYMARBLE - S0271\""],"KONNI - S0356":["misp-galaxy:mitre-malware=\"KONNI - S0356\""],"KONNI":["misp-galaxy:mitre-malware=\"KONNI - S0356\"","misp-galaxy:rat=\"Konni\"","misp-galaxy:tool=\"KONNI\""],"Kazuar - S0265":["misp-galaxy:mitre-malware=\"Kazuar - S0265\""],"KeyRaider - S0288":["misp-galaxy:mitre-malware=\"KeyRaider - S0288\""],"KeyRaider":["misp-galaxy:mitre-malware=\"KeyRaider - S0288\"","misp-galaxy:mitre-mobile-attack-malware=\"KeyRaider - MOB-S0004\""],"Keydnap - S0276":["misp-galaxy:mitre-malware=\"Keydnap - S0276\""],"OSX\/Keydnap":["misp-galaxy:mitre-malware=\"Keydnap - S0276\""],"Kwampirs - S0236":["misp-galaxy:mitre-malware=\"Kwampirs - S0236\""],"Linux Rabbit - S0362":["misp-galaxy:mitre-malware=\"Linux Rabbit - S0362\""],"Linux Rabbit":["misp-galaxy:mitre-malware=\"Linux Rabbit - S0362\""],"LockerGoga - S0372":["misp-galaxy:mitre-malware=\"LockerGoga - S0372\""],"LockerGoga ":["misp-galaxy:mitre-malware=\"LockerGoga - S0372\""],"MacSpy - S0282":["misp-galaxy:mitre-malware=\"MacSpy - S0282\""],"Marcher - S0317":["misp-galaxy:mitre-malware=\"Marcher - S0317\""],"MazarBOT - S0303":["misp-galaxy:mitre-malware=\"MazarBOT - S0303\""],"MazarBOT":["misp-galaxy:mitre-malware=\"MazarBOT - S0303\"","misp-galaxy:mitre-mobile-attack-malware=\"MazarBOT - MOB-S0019\""],"Micropsia - S0339":["misp-galaxy:mitre-malware=\"Micropsia - S0339\""],"MirageFox - S0280":["misp-galaxy:mitre-malware=\"MirageFox - S0280\""],"More_eggs - S0284":["misp-galaxy:mitre-malware=\"More_eggs - S0284\""],"Mosquito - S0256":["misp-galaxy:mitre-malware=\"Mosquito - S0256\""],"NDiskMonitor - S0272":["misp-galaxy:mitre-malware=\"NDiskMonitor - S0272\""],"NDiskMonitor":["misp-galaxy:mitre-malware=\"NDiskMonitor - S0272\""],"NOKKI - S0353":["misp-galaxy:mitre-malware=\"NOKKI - S0353\""],"NOKKI":["misp-galaxy:mitre-malware=\"NOKKI - S0353\"","misp-galaxy:tool=\"NOKKI\""],"NanoCore - S0336":["misp-galaxy:mitre-malware=\"NanoCore - S0336\""],"NanoCore":["misp-galaxy:mitre-malware=\"NanoCore - S0336\"","misp-galaxy:rat=\"NanoCore\"","misp-galaxy:tool=\"NanoCoreRAT\""],"NavRAT - S0247":["misp-galaxy:mitre-malware=\"NavRAT - S0247\""],"NotCompatible - S0299":["misp-galaxy:mitre-malware=\"NotCompatible - S0299\""],"NotCompatible":["misp-galaxy:mitre-malware=\"NotCompatible - S0299\"","misp-galaxy:mitre-mobile-attack-malware=\"NotCompatible - MOB-S0015\""],"NotPetya - S0368":["misp-galaxy:mitre-malware=\"NotPetya - S0368\""],"Petrwrap":["misp-galaxy:mitre-malware=\"NotPetya - S0368\""],"OBAD - S0286":["misp-galaxy:mitre-malware=\"OBAD - S0286\""],"OBAD":["misp-galaxy:mitre-malware=\"OBAD - S0286\"","misp-galaxy:mitre-mobile-attack-malware=\"OBAD - MOB-S0002\""],"OSX_OCEANLOTUS.D - S0352":["misp-galaxy:mitre-malware=\"OSX_OCEANLOTUS.D - S0352\""],"OSX_OCEANLOTUS.D":["misp-galaxy:mitre-malware=\"OSX_OCEANLOTUS.D - S0352\""],"OceanSalt - S0346":["misp-galaxy:mitre-malware=\"OceanSalt - S0346\""],"OceanSalt":["misp-galaxy:mitre-malware=\"OceanSalt - S0346\""],"Octopus - S0340":["misp-galaxy:mitre-malware=\"Octopus - S0340\""],"OldBoot - S0285":["misp-galaxy:mitre-malware=\"OldBoot - S0285\""],"OldBoot":["misp-galaxy:mitre-malware=\"OldBoot - S0285\"","misp-galaxy:mitre-mobile-attack-malware=\"OldBoot - MOB-S0001\""],"Olympic Destroyer - S0365":["misp-galaxy:mitre-malware=\"Olympic Destroyer - S0365\""],"OopsIE - S0264":["misp-galaxy:mitre-malware=\"OopsIE - S0264\""],"PJApps - S0291":["misp-galaxy:mitre-malware=\"PJApps - S0291\""],"PJApps":["misp-galaxy:mitre-malware=\"PJApps - S0291\"","misp-galaxy:mitre-mobile-attack-malware=\"PJApps - MOB-S0007\""],"PLAINTEE - S0254":["misp-galaxy:mitre-malware=\"PLAINTEE - S0254\""],"Powermud":["misp-galaxy:mitre-malware=\"POWERSTATS - S0223\""],"POWERTON - S0371":["misp-galaxy:mitre-malware=\"POWERTON - S0371\""],"POWERTON":["misp-galaxy:mitre-malware=\"POWERTON - S0371\""],"Pegasus for Android - S0316":["misp-galaxy:mitre-malware=\"Pegasus for Android - S0316\""],"Pegasus for Android":["misp-galaxy:mitre-malware=\"Pegasus for Android - S0316\"","misp-galaxy:mitre-mobile-attack-malware=\"Pegasus for Android - MOB-S0032\""],"Pegasus for iOS - S0289":["misp-galaxy:mitre-malware=\"Pegasus for iOS - S0289\""],"Pegasus for iOS":["misp-galaxy:mitre-malware=\"Pegasus for iOS - S0289\""],"DestroyRAT":["misp-galaxy:mitre-malware=\"PlugX - S0013\""],"Proton - S0279":["misp-galaxy:mitre-malware=\"Proton - S0279\""],"Proton":["misp-galaxy:mitre-malware=\"Proton - S0279\"","misp-galaxy:tool=\"Proton\""],"Proxysvc - S0238":["misp-galaxy:mitre-malware=\"Proxysvc - S0238\""],"Proxysvc":["misp-galaxy:mitre-malware=\"Proxysvc - S0238\"","misp-galaxy:tool=\"Proxysvc\""],"QUADAGENT - S0269":["misp-galaxy:mitre-malware=\"QUADAGENT - S0269\""],"RATANKBA - S0241":["misp-galaxy:mitre-malware=\"RATANKBA - S0241\""],"RATANKBA":["misp-galaxy:mitre-malware=\"RATANKBA - S0241\""],"RCSAndroid - S0295":["misp-galaxy:mitre-malware=\"RCSAndroid - S0295\""],"RCSAndroid":["misp-galaxy:mitre-malware=\"RCSAndroid - S0295\"","misp-galaxy:mitre-mobile-attack-malware=\"RCSAndroid - MOB-S0011\""],"RGDoor - S0258":["misp-galaxy:mitre-malware=\"RGDoor - S0258\""],"ROKRAT - S0240":["misp-galaxy:mitre-malware=\"ROKRAT - S0240\""],"ROKRAT":["misp-galaxy:mitre-malware=\"ROKRAT - S0240\"","misp-galaxy:rat=\"rokrat\""],"RedDrop - S0326":["misp-galaxy:mitre-malware=\"RedDrop - S0326\""],"Remexi - S0375":["misp-galaxy:mitre-malware=\"Remexi - S0375\""],"RogueRobin - S0270":["misp-galaxy:mitre-malware=\"RogueRobin - S0270\""],"RuMMS - S0313":["misp-galaxy:mitre-malware=\"RuMMS - S0313\""],"RuMMS":["misp-galaxy:mitre-malware=\"RuMMS - S0313\"","misp-galaxy:mitre-mobile-attack-malware=\"RuMMS - MOB-S0029\""],"RunningRAT - S0253":["misp-galaxy:mitre-malware=\"RunningRAT - S0253\""],"RunningRAT":["misp-galaxy:mitre-malware=\"RunningRAT - S0253\""],"SamSam - S0370":["misp-galaxy:mitre-malware=\"SamSam - S0370\""],"Samas":["misp-galaxy:mitre-malware=\"SamSam - S0370\""],"Seasalt - S0345":["misp-galaxy:mitre-malware=\"Seasalt - S0345\""],"Seasalt":["misp-galaxy:mitre-malware=\"Seasalt - S0345\""],"ShiftyBug - S0294":["misp-galaxy:mitre-malware=\"ShiftyBug - S0294\""],"ShiftyBug":["misp-galaxy:mitre-malware=\"ShiftyBug - S0294\"","misp-galaxy:mitre-mobile-attack-malware=\"Shedun - MOB-S0010\""],"Skygofree - S0327":["misp-galaxy:mitre-malware=\"Skygofree - S0327\""],"Socksbot - S0273":["misp-galaxy:mitre-malware=\"Socksbot - S0273\""],"Socksbot":["misp-galaxy:mitre-malware=\"Socksbot - S0273\""],"SpeakUp - S0374":["misp-galaxy:mitre-malware=\"SpeakUp - S0374\""],"SpyDealer - S0324":["misp-galaxy:mitre-malware=\"SpyDealer - S0324\""],"SpyDealer":["misp-galaxy:mitre-malware=\"SpyDealer - S0324\"","misp-galaxy:tool=\"SpyDealer\""],"SpyNote RAT - S0305":["misp-galaxy:mitre-malware=\"SpyNote RAT - S0305\""],"SpyNote RAT":["misp-galaxy:mitre-malware=\"SpyNote RAT - S0305\"","misp-galaxy:mitre-mobile-attack-malware=\"SpyNote RAT - MOB-S0021\""],"Stealth Mango - S0328":["misp-galaxy:mitre-malware=\"Stealth Mango - S0328\""],"SynAck - S0242":["misp-galaxy:mitre-malware=\"SynAck - S0242\""],"TYPEFRAME - S0263":["misp-galaxy:mitre-malware=\"TYPEFRAME - S0263\""],"TYPEFRAME":["misp-galaxy:mitre-malware=\"TYPEFRAME - S0263\"","misp-galaxy:tool=\"TYPEFRAME\""],"Tangelo - S0329":["misp-galaxy:mitre-malware=\"Tangelo - S0329\""],"Tangelo":["misp-galaxy:mitre-malware=\"Tangelo - S0329\""],"TrickBot - S0266":["misp-galaxy:mitre-malware=\"TrickBot - S0266\""],"Totbrick":["misp-galaxy:mitre-malware=\"TrickBot - S0266\""],"TSPY_TRICKLOAD":["misp-galaxy:mitre-malware=\"TrickBot - S0266\""],"Trojan-SMS.AndroidOS.Agent.ao - S0307":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.Agent.ao - S0307\""],"Trojan-SMS.AndroidOS.Agent.ao":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.Agent.ao - S0307\"","misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.Agent.ao - MOB-S0023\""],"Trojan-SMS.AndroidOS.FakeInst.a - S0306":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.FakeInst.a - S0306\""],"Trojan-SMS.AndroidOS.FakeInst.a":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.FakeInst.a - S0306\"","misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.FakeInst.a - MOB-S0022\""],"Trojan-SMS.AndroidOS.OpFake.a - S0308":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.OpFake.a - S0308\""],"Trojan-SMS.AndroidOS.OpFake.a":["misp-galaxy:mitre-malware=\"Trojan-SMS.AndroidOS.OpFake.a - S0308\"","misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.OpFake.a - MOB-S0024\""],"Twitoor - S0302":["misp-galaxy:mitre-malware=\"Twitoor - S0302\""],"Twitoor":["misp-galaxy:mitre-malware=\"Twitoor - S0302\"","misp-galaxy:mitre-mobile-attack-malware=\"Twitoor - MOB-S0018\""],"UBoatRAT - S0333":["misp-galaxy:mitre-malware=\"UBoatRAT - S0333\""],"UBoatRAT":["misp-galaxy:mitre-malware=\"UBoatRAT - S0333\"","misp-galaxy:rat=\"UBoatRAT\""],"UPPERCUT - S0275":["misp-galaxy:mitre-malware=\"UPPERCUT - S0275\""],"UPPERCUT":["misp-galaxy:mitre-malware=\"UPPERCUT - S0275\"","misp-galaxy:tool=\"ANEL\""],"ANEL":["misp-galaxy:mitre-malware=\"UPPERCUT - S0275\"","misp-galaxy:tool=\"ANEL\""],"VERMIN - S0257":["misp-galaxy:mitre-malware=\"VERMIN - S0257\""],"VERMIN":["misp-galaxy:mitre-malware=\"VERMIN - S0257\""],"WannaCry - S0366":["misp-galaxy:mitre-malware=\"WannaCry - S0366\""],"WanaCry":["misp-galaxy:mitre-malware=\"WannaCry - S0366\""],"WanaCrypt":["misp-galaxy:mitre-malware=\"WannaCry - S0366\""],"WanaCrypt0r":["misp-galaxy:mitre-malware=\"WannaCry - S0366\"","misp-galaxy:ransomware=\"WannaCry\""],"WCry":["misp-galaxy:mitre-malware=\"WannaCry - S0366\""],"WireLurker - S0312":["misp-galaxy:mitre-malware=\"WireLurker - S0312\""],"WireLurker":["misp-galaxy:mitre-malware=\"WireLurker - S0312\"","misp-galaxy:mitre-mobile-attack-malware=\"WireLurker - MOB-S0028\""],"X-Agent for Android - S0314":["misp-galaxy:mitre-malware=\"X-Agent for Android - S0314\""],"X-Agent for Android":["misp-galaxy:mitre-malware=\"X-Agent for Android - S0314\""],"OSX.Sofacy":["misp-galaxy:mitre-malware=\"XAgentOSX - S0161\""],"XLoader - S0318":["misp-galaxy:mitre-malware=\"XLoader - S0318\""],"Trojan.Shunnael":["misp-galaxy:mitre-malware=\"XTunnel - S0117\""],"Xbash - S0341":["misp-galaxy:mitre-malware=\"Xbash - S0341\""],"XcodeGhost - S0297":["misp-galaxy:mitre-malware=\"XcodeGhost - S0297\""],"XcodeGhost":["misp-galaxy:mitre-malware=\"XcodeGhost - S0297\"","misp-galaxy:mitre-mobile-attack-malware=\"XcodeGhost - MOB-S0013\""],"YiSpecter - S0311":["misp-galaxy:mitre-malware=\"YiSpecter - S0311\""],"YiSpecter":["misp-galaxy:mitre-malware=\"YiSpecter - S0311\"","misp-galaxy:mitre-mobile-attack-malware=\"YiSpecter - MOB-S0027\""],"Zebrocy - S0251":["misp-galaxy:mitre-malware=\"Zebrocy - S0251\""],"ZergHelper - S0287":["misp-galaxy:mitre-malware=\"ZergHelper - S0287\""],"ZergHelper":["misp-galaxy:mitre-malware=\"ZergHelper - S0287\"","misp-galaxy:mitre-mobile-attack-malware=\"ZergHelper - MOB-S0003\""],"Zeus Panda - S0330":["misp-galaxy:mitre-malware=\"Zeus Panda - S0330\""],"gh0st RAT - S0032":["misp-galaxy:mitre-malware=\"gh0st RAT - S0032\""],"gh0st RAT":["misp-galaxy:mitre-malware=\"gh0st RAT - S0032\""],"iKitten - S0278":["misp-galaxy:mitre-malware=\"iKitten - S0278\""],"iKitten":["misp-galaxy:mitre-malware=\"iKitten - S0278\"","misp-galaxy:tool=\"MacDownloader\""],"OSX\/MacDownloader":["misp-galaxy:mitre-malware=\"iKitten - S0278\""],"jRAT - S0283":["misp-galaxy:mitre-malware=\"jRAT - S0283\""],"jFrutas":["misp-galaxy:mitre-malware=\"jRAT - S0283\""],"jBiFrost":["misp-galaxy:mitre-malware=\"jRAT - S0283\""],"Trojan.Maljava":["misp-galaxy:mitre-malware=\"jRAT - S0283\""],"yty - S0248":["misp-galaxy:mitre-malware=\"yty - S0248\""],"zwShell - S0350":["misp-galaxy:mitre-malware=\"zwShell - S0350\""],"zwShell":["misp-galaxy:mitre-malware=\"zwShell - S0350\""],"Abuse Accessibility Features - MOB-T1056":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Abuse Accessibility Features - MOB-T1056\""],"Abuse Device Administrator Access to Prevent Removal - MOB-T1004":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Abuse Device Administrator Access to Prevent Removal - MOB-T1004\""],"Abuse of iOS Enterprise App Signing Key - MOB-T1048":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Abuse of iOS Enterprise App Signing Key - MOB-T1048\""],"Access Calendar Entries - MOB-T1038":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Access Calendar Entries - MOB-T1038\""],"Access Call Log - MOB-T1036":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Access Call Log - MOB-T1036\""],"Access Contact List - MOB-T1035":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Access Contact List - MOB-T1035\""],"Access Sensitive Data in Device Logs - MOB-T1016":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Access Sensitive Data in Device Logs - MOB-T1016\""],"Access Sensitive Data or Credentials in Files - MOB-T1012":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Access Sensitive Data or Credentials in Files - MOB-T1012\""],"Alternate Network Mediums - MOB-T1041":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Alternate Network Mediums - MOB-T1041\""],"Android Intent Hijacking - MOB-T1019":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Android Intent Hijacking - MOB-T1019\""],"App Auto-Start at Device Boot - MOB-T1005":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"App Auto-Start at Device Boot - MOB-T1005\""],"App Delivered via Email Attachment - MOB-T1037":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"App Delivered via Email Attachment - MOB-T1037\""],"App Delivered via Web Download - MOB-T1034":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"App Delivered via Web Download - MOB-T1034\""],"Application Discovery - MOB-T1021":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Application Discovery - MOB-T1021\""],"Attack PC via USB Connection - MOB-T1030":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Attack PC via USB Connection - MOB-T1030\""],"Biometric Spoofing - MOB-T1063":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Biometric Spoofing - MOB-T1063\""],"Capture Clipboard Data - MOB-T1017":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Capture Clipboard Data - MOB-T1017\""],"Capture SMS Messages - MOB-T1015":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Capture SMS Messages - MOB-T1015\""],"Commonly Used Port - MOB-T1039":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Commonly Used Port - MOB-T1039\""],"Detect App Analysis Environment - MOB-T1043":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Detect App Analysis Environment - MOB-T1043\""],"Device Type Discovery - MOB-T1022":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Device Type Discovery - MOB-T1022\""],"Device Unlock Code Guessing or Brute Force - MOB-T1062":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Device Unlock Code Guessing or Brute Force - MOB-T1062\""],"Disguise Root\/Jailbreak Indicators - MOB-T1011":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Disguise Root\/Jailbreak Indicators - MOB-T1011\""],"Downgrade to Insecure Protocols - MOB-T1069":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Downgrade to Insecure Protocols - MOB-T1069\""],"Download New Code at Runtime - MOB-T1010":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Download New Code at Runtime - MOB-T1010\""],"Eavesdrop on Insecure Network Communication - MOB-T1042":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Eavesdrop on Insecure Network Communication - MOB-T1042\""],"Encrypt Files for Ransom - MOB-T1074":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Encrypt Files for Ransom - MOB-T1074\""],"Exploit Baseband Vulnerability - MOB-T1058":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit Baseband Vulnerability - MOB-T1058\""],"Exploit Enterprise Resources - MOB-T1031":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit Enterprise Resources - MOB-T1031\""],"Exploit OS Vulnerability - MOB-T1007":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit OS Vulnerability - MOB-T1007\""],"Exploit SS7 to Redirect Phone Calls\/SMS - MOB-T1052":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit SS7 to Redirect Phone Calls\/SMS - MOB-T1052\""],"Exploit SS7 to Track Device Location - MOB-T1053":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit SS7 to Track Device Location - MOB-T1053\""],"Exploit TEE Vulnerability - MOB-T1008":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit TEE Vulnerability - MOB-T1008\""],"Exploit via Charging Station or PC - MOB-T1061":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Exploit via Charging Station or PC - MOB-T1061\""],"Fake Developer Accounts - MOB-T1045":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Fake Developer Accounts - MOB-T1045\""],"File and Directory Discovery - MOB-T1023":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"File and Directory Discovery - MOB-T1023\""],"Generate Fraudulent Advertising Revenue - MOB-T1075":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Generate Fraudulent Advertising Revenue - MOB-T1075\""],"Insecure Third-Party Libraries - MOB-T1028":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Insecure Third-Party Libraries - MOB-T1028\""],"Jamming or Denial of Service - MOB-T1067":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Jamming or Denial of Service - MOB-T1067\""],"Local Network Configuration Discovery - MOB-T1025":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Local Network Configuration Discovery - MOB-T1025\""],"Local Network Connections Discovery - MOB-T1024":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Local Network Connections Discovery - MOB-T1024\""],"Location Tracking - MOB-T1033":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Location Tracking - MOB-T1033\""],"Lock User Out of Device - MOB-T1049":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Lock User Out of Device - MOB-T1049\""],"Lockscreen Bypass - MOB-T1064":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Lockscreen Bypass - MOB-T1064\""],"Malicious Media Content - MOB-T1060":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious Media Content - MOB-T1060\""],"Malicious SMS Message - MOB-T1057":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious SMS Message - MOB-T1057\""],"Malicious Software Development Tools - MOB-T1065":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious Software Development Tools - MOB-T1065\""],"Malicious Third Party Keyboard App - MOB-T1020":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious Third Party Keyboard App - MOB-T1020\""],"Malicious Web Content - MOB-T1059":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious Web Content - MOB-T1059\""],"Malicious or Vulnerable Built-in Device Functionality - MOB-T1076":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Malicious or Vulnerable Built-in Device Functionality - MOB-T1076\""],"Manipulate App Store Rankings or Ratings - MOB-T1055":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Manipulate App Store Rankings or Ratings - MOB-T1055\""],"Manipulate Device Communication - MOB-T1066":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Manipulate Device Communication - MOB-T1066\""],"Microphone or Camera Recordings - MOB-T1032":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Microphone or Camera Recordings - MOB-T1032\""],"Modify OS Kernel or Boot Partition - MOB-T1001":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Modify OS Kernel or Boot Partition - MOB-T1001\""],"Modify System Partition - MOB-T1003":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Modify System Partition - MOB-T1003\""],"Modify Trusted Execution Environment - MOB-T1002":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Modify Trusted Execution Environment - MOB-T1002\""],"Modify cached executable code - MOB-T1006":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Modify cached executable code - MOB-T1006\""],"Network Service Scanning - MOB-T1026":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Network Service Scanning - MOB-T1026\""],"Network Traffic Capture or Redirection - MOB-T1013":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Network Traffic Capture or Redirection - MOB-T1013\""],"Obfuscated or Encrypted Payload - MOB-T1009":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Obfuscated or Encrypted Payload - MOB-T1009\""],"Obtain Device Cloud Backups - MOB-T1073":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Obtain Device Cloud Backups - MOB-T1073\""],"Premium SMS Toll Fraud - MOB-T1051":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Premium SMS Toll Fraud - MOB-T1051\""],"Process Discovery - MOB-T1027":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Process Discovery - MOB-T1027\""],"Remotely Install Application - MOB-T1046":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Remotely Install Application - MOB-T1046\""],"Remotely Track Device Without Authorization - MOB-T1071":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Remotely Track Device Without Authorization - MOB-T1071\""],"Remotely Wipe Data Without Authorization - MOB-T1072":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Remotely Wipe Data Without Authorization - MOB-T1072\""],"Repackaged Application - MOB-T1047":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Repackaged Application - MOB-T1047\""],"Rogue Cellular Base Station - MOB-T1070":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Rogue Cellular Base Station - MOB-T1070\""],"Rogue Wi-Fi Access Points - MOB-T1068":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Rogue Wi-Fi Access Points - MOB-T1068\""],"SIM Card Swap - MOB-T1054":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"SIM Card Swap - MOB-T1054\""],"Standard Application Layer Protocol - MOB-T1040":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Standard Application Layer Protocol - MOB-T1040\""],"Stolen Developer Credentials or Signing Keys - MOB-T1044":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Stolen Developer Credentials or Signing Keys - MOB-T1044\""],"System Information Discovery - MOB-T1029":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"System Information Discovery - MOB-T1029\""],"URL Scheme Hijacking - MOB-T1018":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"URL Scheme Hijacking - MOB-T1018\""],"User Interface Spoofing - MOB-T1014":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"User Interface Spoofing - MOB-T1014\""],"Wipe Device Data - MOB-T1050":["misp-galaxy:mitre-mobile-attack-attack-pattern=\"Wipe Device Data - MOB-T1050\""],"Application Developer Guidance - MOB-M1013":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Application Developer Guidance - MOB-M1013\""],"Application Vetting - MOB-M1005":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Application Vetting - MOB-M1005\""],"Attestation - MOB-M1002":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Attestation - MOB-M1002\""],"Caution with Device Administrator Access - MOB-M1007":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Caution with Device Administrator Access - MOB-M1007\""],"Deploy Compromised Device Detection Method - MOB-M1010":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Deploy Compromised Device Detection Method - MOB-M1010\""],"Encrypt Network Traffic - MOB-M1009":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Encrypt Network Traffic - MOB-M1009\""],"Enterprise Policy - MOB-M1012":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Enterprise Policy - MOB-M1012\""],"Interconnection Filtering - MOB-M1014":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Interconnection Filtering - MOB-M1014\""],"Lock Bootloader - MOB-M1003":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Lock Bootloader - MOB-M1003\""],"Security Updates - MOB-M1001":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Security Updates - MOB-M1001\""],"System Partition Integrity - MOB-M1004":["misp-galaxy:mitre-mobile-attack-course-of-action=\"System Partition Integrity - MOB-M1004\""],"Use Device-Provided Credential Storage - MOB-M1008":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Use Device-Provided Credential Storage - MOB-M1008\""],"Use Recent OS Version - MOB-M1006":["misp-galaxy:mitre-mobile-attack-course-of-action=\"Use Recent OS Version - MOB-M1006\""],"User Guidance - MOB-M1011":["misp-galaxy:mitre-mobile-attack-course-of-action=\"User Guidance - MOB-M1011\""],"ANDROIDOS_ANSERVER.A - MOB-S0026":["misp-galaxy:mitre-mobile-attack-malware=\"ANDROIDOS_ANSERVER.A - MOB-S0026\""],"Adups - MOB-S0025":["misp-galaxy:mitre-mobile-attack-malware=\"Adups - MOB-S0025\""],"AndroRAT - MOB-S0008":["misp-galaxy:mitre-mobile-attack-malware=\"AndroRAT - MOB-S0008\""],"Android\/Chuli.A - MOB-S0020":["misp-galaxy:mitre-mobile-attack-malware=\"Android\/Chuli.A - MOB-S0020\""],"AndroidOverlayMalware - MOB-S0012":["misp-galaxy:mitre-mobile-attack-malware=\"AndroidOverlayMalware - MOB-S0012\""],"AndroidOverlayMalware":["misp-galaxy:mitre-mobile-attack-malware=\"AndroidOverlayMalware - MOB-S0012\""],"BrainTest - MOB-S0009":["misp-galaxy:mitre-mobile-attack-malware=\"BrainTest - MOB-S0009\""],"Charger - MOB-S0039":["misp-galaxy:mitre-mobile-attack-malware=\"Charger - MOB-S0039\""],"Dendroid - MOB-S0017":["misp-galaxy:mitre-mobile-attack-malware=\"Dendroid - MOB-S0017\""],"DressCode - MOB-S0016":["misp-galaxy:mitre-mobile-attack-malware=\"DressCode - MOB-S0016\""],"DroidJack RAT - MOB-S0036":["misp-galaxy:mitre-mobile-attack-malware=\"DroidJack RAT - MOB-S0036\""],"DroidJack RAT":["misp-galaxy:mitre-mobile-attack-malware=\"DroidJack RAT - MOB-S0036\""],"DualToy - MOB-S0031":["misp-galaxy:mitre-mobile-attack-malware=\"DualToy - MOB-S0031\""],"Gooligan - MOB-S0006":["misp-galaxy:mitre-mobile-attack-malware=\"Gooligan - MOB-S0006\""],"HummingBad - MOB-S0038":["misp-galaxy:mitre-mobile-attack-malware=\"HummingBad - MOB-S0038\""],"HummingWhale - MOB-S0037":["misp-galaxy:mitre-mobile-attack-malware=\"HummingWhale - MOB-S0037\""],"KeyRaider - MOB-S0004":["misp-galaxy:mitre-mobile-attack-malware=\"KeyRaider - MOB-S0004\""],"MazarBOT - MOB-S0019":["misp-galaxy:mitre-mobile-attack-malware=\"MazarBOT - MOB-S0019\""],"NotCompatible - MOB-S0015":["misp-galaxy:mitre-mobile-attack-malware=\"NotCompatible - MOB-S0015\""],"OBAD - MOB-S0002":["misp-galaxy:mitre-mobile-attack-malware=\"OBAD - MOB-S0002\""],"OldBoot - MOB-S0001":["misp-galaxy:mitre-mobile-attack-malware=\"OldBoot - MOB-S0001\""],"PJApps - MOB-S0007":["misp-galaxy:mitre-mobile-attack-malware=\"PJApps - MOB-S0007\""],"Pegasus - MOB-S0005":["misp-galaxy:mitre-mobile-attack-malware=\"Pegasus - MOB-S0005\""],"Pegasus for Android - MOB-S0032":["misp-galaxy:mitre-mobile-attack-malware=\"Pegasus for Android - MOB-S0032\""],"RCSAndroid - MOB-S0011":["misp-galaxy:mitre-mobile-attack-malware=\"RCSAndroid - MOB-S0011\""],"RuMMS - MOB-S0029":["misp-galaxy:mitre-mobile-attack-malware=\"RuMMS - MOB-S0029\""],"Shedun - MOB-S0010":["misp-galaxy:mitre-mobile-attack-malware=\"Shedun - MOB-S0010\""],"Shedun":["misp-galaxy:mitre-mobile-attack-malware=\"Shedun - MOB-S0010\""],"Shuanet":["misp-galaxy:mitre-mobile-attack-malware=\"Shedun - MOB-S0010\""],"SpyNote RAT - MOB-S0021":["misp-galaxy:mitre-mobile-attack-malware=\"SpyNote RAT - MOB-S0021\""],"Trojan-SMS.AndroidOS.Agent.ao - MOB-S0023":["misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.Agent.ao - MOB-S0023\""],"Trojan-SMS.AndroidOS.FakeInst.a - MOB-S0022":["misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.FakeInst.a - MOB-S0022\""],"Trojan-SMS.AndroidOS.OpFake.a - MOB-S0024":["misp-galaxy:mitre-mobile-attack-malware=\"Trojan-SMS.AndroidOS.OpFake.a - MOB-S0024\""],"Twitoor - MOB-S0018":["misp-galaxy:mitre-mobile-attack-malware=\"Twitoor - MOB-S0018\""],"WireLurker - MOB-S0028":["misp-galaxy:mitre-mobile-attack-malware=\"WireLurker - MOB-S0028\""],"X-Agent - MOB-S0030":["misp-galaxy:mitre-mobile-attack-malware=\"X-Agent - MOB-S0030\""],"XcodeGhost - MOB-S0013":["misp-galaxy:mitre-mobile-attack-malware=\"XcodeGhost - MOB-S0013\""],"YiSpecter - MOB-S0027":["misp-galaxy:mitre-mobile-attack-malware=\"YiSpecter - MOB-S0027\""],"ZergHelper - MOB-S0003":["misp-galaxy:mitre-mobile-attack-malware=\"ZergHelper - MOB-S0003\""],"Xbot - MOB-S0014":["misp-galaxy:mitre-mobile-attack-tool=\"Xbot - MOB-S0014\""],"Acquire OSINT data sets and information - PRE-T1024":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire OSINT data sets and information - PRE-T1024\""],"Acquire OSINT data sets and information - PRE-T1043":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire OSINT data sets and information - PRE-T1043\""],"Acquire OSINT data sets and information - PRE-T1054":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire OSINT data sets and information - PRE-T1054\""],"Acquire and\/or use 3rd party infrastructure services - PRE-T1084":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire and\/or use 3rd party infrastructure services - PRE-T1084\""],"Acquire and\/or use 3rd party infrastructure services - PRE-T1106":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire and\/or use 3rd party infrastructure services - PRE-T1106\""],"Acquire and\/or use 3rd party software services - PRE-T1085":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire and\/or use 3rd party software services - PRE-T1085\""],"Acquire and\/or use 3rd party software services - PRE-T1107":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire and\/or use 3rd party software services - PRE-T1107\""],"Acquire or compromise 3rd party signing certificates - PRE-T1087":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire or compromise 3rd party signing certificates - PRE-T1087\""],"Acquire or compromise 3rd party signing certificates - PRE-T1109":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Acquire or compromise 3rd party signing certificates - PRE-T1109\""],"Aggregate individual's digital footprint - PRE-T1052":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Aggregate individual's digital footprint - PRE-T1052\""],"Analyze application security posture - PRE-T1070":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze application security posture - PRE-T1070\""],"Analyze architecture and configuration posture - PRE-T1065":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze architecture and configuration posture - PRE-T1065\""],"Analyze business processes - PRE-T1078":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze business processes - PRE-T1078\""],"Analyze data collected - PRE-T1064":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze data collected - PRE-T1064\""],"Analyze hardware\/software security defensive capabilities - PRE-T1071":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze hardware\/software security defensive capabilities - PRE-T1071\""],"Analyze organizational skillsets and deficiencies - PRE-T1066":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze organizational skillsets and deficiencies - PRE-T1066\""],"Analyze organizational skillsets and deficiencies - PRE-T1074":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze organizational skillsets and deficiencies - PRE-T1074\""],"Analyze organizational skillsets and deficiencies - PRE-T1077":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze organizational skillsets and deficiencies - PRE-T1077\""],"Analyze presence of outsourced capabilities - PRE-T1080":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze presence of outsourced capabilities - PRE-T1080\""],"Analyze social and business relationships, interests, and affiliations - PRE-T1072":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Analyze social and business relationships, interests, and affiliations - PRE-T1072\""],"Anonymity services - PRE-T1083":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Anonymity services - PRE-T1083\""],"Assess KITs\/KIQs benefits - PRE-T1006":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess KITs\/KIQs benefits - PRE-T1006\""],"Assess current holdings, needs, and wants - PRE-T1013":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess current holdings, needs, and wants - PRE-T1013\""],"Assess leadership areas of interest - PRE-T1001":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess leadership areas of interest - PRE-T1001\""],"Assess opportunities created by business deals - PRE-T1076":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess opportunities created by business deals - PRE-T1076\""],"Assess security posture of physical locations - PRE-T1079":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess security posture of physical locations - PRE-T1079\""],"Assess targeting options - PRE-T1073":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess targeting options - PRE-T1073\""],"Assess vulnerability of 3rd party vendors - PRE-T1075":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assess vulnerability of 3rd party vendors - PRE-T1075\""],"Assign KITs, KIQs, and\/or intelligence requirements - PRE-T1015":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assign KITs, KIQs, and\/or intelligence requirements - PRE-T1015\""],"Assign KITs\/KIQs into categories - PRE-T1005":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Assign KITs\/KIQs into categories - PRE-T1005\""],"Authentication attempt - PRE-T1158":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Authentication attempt - PRE-T1158\""],"Authorized user performs requested cyber action - PRE-T1163":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Authorized user performs requested cyber action - PRE-T1163\""],"Automated system performs requested action - PRE-T1161":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Automated system performs requested action - PRE-T1161\""],"Build and configure delivery systems - PRE-T1124":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Build and configure delivery systems - PRE-T1124\""],"Build or acquire exploits - PRE-T1126":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Build or acquire exploits - PRE-T1126\""],"Build social network persona - PRE-T1118":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Build social network persona - PRE-T1118\""],"Buy domain name - PRE-T1105":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Buy domain name - PRE-T1105\""],"C2 protocol development - PRE-T1129":["misp-galaxy:mitre-pre-attack-attack-pattern=\"C2 protocol development - PRE-T1129\""],"Choose pre-compromised mobile app developer account credentials or signing keys - PRE-T1168":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Choose pre-compromised mobile app developer account credentials or signing keys - PRE-T1168\""],"Choose pre-compromised persona and affiliated accounts - PRE-T1120":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Choose pre-compromised persona and affiliated accounts - PRE-T1120\""],"Common, high volume protocols and software - PRE-T1098":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Common, high volume protocols and software - PRE-T1098\""],"Compromise 3rd party infrastructure to support delivery - PRE-T1089":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Compromise 3rd party infrastructure to support delivery - PRE-T1089\""],"Compromise 3rd party infrastructure to support delivery - PRE-T1111":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Compromise 3rd party infrastructure to support delivery - PRE-T1111\""],"Compromise 3rd party or closed-source vulnerability\/exploit information - PRE-T1131":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Compromise 3rd party or closed-source vulnerability\/exploit information - PRE-T1131\""],"Compromise of externally facing system - PRE-T1165":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Compromise of externally facing system - PRE-T1165\""],"Conduct active scanning - PRE-T1031":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct active scanning - PRE-T1031\""],"Conduct cost\/benefit analysis - PRE-T1003":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct cost\/benefit analysis - PRE-T1003\""],"Conduct passive scanning - PRE-T1030":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct passive scanning - PRE-T1030\""],"Conduct social engineering - PRE-T1026":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct social engineering - PRE-T1026\""],"Conduct social engineering - PRE-T1045":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct social engineering - PRE-T1045\""],"Conduct social engineering - PRE-T1056":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct social engineering - PRE-T1056\""],"Conduct social engineering or HUMINT operation - PRE-T1153":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Conduct social engineering or HUMINT operation - PRE-T1153\""],"Confirmation of launched compromise achieved - PRE-T1160":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Confirmation of launched compromise achieved - PRE-T1160\""],"Create backup infrastructure - PRE-T1116":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Create backup infrastructure - PRE-T1116\""],"Create custom payloads - PRE-T1122":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Create custom payloads - PRE-T1122\""],"Create implementation plan - PRE-T1009":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Create implementation plan - PRE-T1009\""],"Create infected removable media - PRE-T1132":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Create infected removable media - PRE-T1132\""],"Create strategic plan - PRE-T1008":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Create strategic plan - PRE-T1008\""],"Credential pharming - PRE-T1151":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Credential pharming - PRE-T1151\""],"DNS poisoning - PRE-T1159":["misp-galaxy:mitre-pre-attack-attack-pattern=\"DNS poisoning - PRE-T1159\""],"DNSCalc - PRE-T1101":["misp-galaxy:mitre-pre-attack-attack-pattern=\"DNSCalc - PRE-T1101\""],"Data Hiding - PRE-T1097":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Data Hiding - PRE-T1097\""],"Deploy exploit using advertising - PRE-T1157":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Deploy exploit using advertising - PRE-T1157\""],"Derive intelligence requirements - PRE-T1007":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Derive intelligence requirements - PRE-T1007\""],"Determine 3rd party infrastructure services - PRE-T1037":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine 3rd party infrastructure services - PRE-T1037\""],"Determine 3rd party infrastructure services - PRE-T1061":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine 3rd party infrastructure services - PRE-T1061\""],"Determine approach\/attack vector - PRE-T1022":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine approach\/attack vector - PRE-T1022\""],"Determine centralization of IT management - PRE-T1062":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine centralization of IT management - PRE-T1062\""],"Determine domain and IP address space - PRE-T1027":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine domain and IP address space - PRE-T1027\""],"Determine external network trust dependencies - PRE-T1036":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine external network trust dependencies - PRE-T1036\""],"Determine firmware version - PRE-T1035":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine firmware version - PRE-T1035\""],"Determine highest level tactical element - PRE-T1020":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine highest level tactical element - PRE-T1020\""],"Determine operational element - PRE-T1019":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine operational element - PRE-T1019\""],"Determine physical locations - PRE-T1059":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine physical locations - PRE-T1059\""],"Determine secondary level tactical element - PRE-T1021":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine secondary level tactical element - PRE-T1021\""],"Determine strategic target - PRE-T1018":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Determine strategic target - PRE-T1018\""],"Develop KITs\/KIQs - PRE-T1004":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Develop KITs\/KIQs - PRE-T1004\""],"Develop social network persona digital footprint - PRE-T1119":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Develop social network persona digital footprint - PRE-T1119\""],"Discover new exploits and monitor exploit-provider forums - PRE-T1127":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Discover new exploits and monitor exploit-provider forums - PRE-T1127\""],"Discover target logon\/email address format - PRE-T1032":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Discover target logon\/email address format - PRE-T1032\""],"Disseminate removable media - PRE-T1156":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Disseminate removable media - PRE-T1156\""],"Distribute malicious software development tools - PRE-T1171":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Distribute malicious software development tools - PRE-T1171\""],"Domain Generation Algorithms (DGA) - PRE-T1100":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Domain Generation Algorithms (DGA) - PRE-T1100\""],"Domain registration hijacking - PRE-T1103":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Domain registration hijacking - PRE-T1103\""],"Dumpster dive - PRE-T1063":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Dumpster dive - PRE-T1063\""],"Dynamic DNS - PRE-T1088":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Dynamic DNS - PRE-T1088\""],"Dynamic DNS - PRE-T1110":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Dynamic DNS - PRE-T1110\""],"Enumerate client configurations - PRE-T1039":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Enumerate client configurations - PRE-T1039\""],"Enumerate externally facing software applications technologies, languages, and dependencies - PRE-T1038":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Enumerate externally facing software applications technologies, languages, and dependencies - PRE-T1038\""],"Exploit public-facing application - PRE-T1154":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Exploit public-facing application - PRE-T1154\""],"Fast Flux DNS - PRE-T1102":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Fast Flux DNS - PRE-T1102\""],"Friend\/Follow\/Connect to targets of interest - PRE-T1121":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Friend\/Follow\/Connect to targets of interest - PRE-T1121\""],"Friend\/Follow\/Connect to targets of interest - PRE-T1141":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Friend\/Follow\/Connect to targets of interest - PRE-T1141\""],"Generate analyst intelligence requirements - PRE-T1011":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Generate analyst intelligence requirements - PRE-T1011\""],"Hardware or software supply chain implant - PRE-T1142":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Hardware or software supply chain implant - PRE-T1142\""],"Host-based hiding techniques - PRE-T1091":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Host-based hiding techniques - PRE-T1091\""],"Human performs requested action of physical nature - PRE-T1162":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Human performs requested action of physical nature - PRE-T1162\""],"Identify analyst level gaps - PRE-T1010":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify analyst level gaps - PRE-T1010\""],"Identify business processes\/tempo - PRE-T1057":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify business processes\/tempo - PRE-T1057\""],"Identify business relationships - PRE-T1049":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify business relationships - PRE-T1049\""],"Identify business relationships - PRE-T1060":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify business relationships - PRE-T1060\""],"Identify gap areas - PRE-T1002":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify gap areas - PRE-T1002\""],"Identify groups\/roles - PRE-T1047":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify groups\/roles - PRE-T1047\""],"Identify job postings and needs\/gaps - PRE-T1025":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify job postings and needs\/gaps - PRE-T1025\""],"Identify job postings and needs\/gaps - PRE-T1044":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify job postings and needs\/gaps - PRE-T1044\""],"Identify job postings and needs\/gaps - PRE-T1055":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify job postings and needs\/gaps - PRE-T1055\""],"Identify people of interest - PRE-T1046":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify people of interest - PRE-T1046\""],"Identify personnel with an authority\/privilege - PRE-T1048":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify personnel with an authority\/privilege - PRE-T1048\""],"Identify resources required to build capabilities - PRE-T1125":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify resources required to build capabilities - PRE-T1125\""],"Identify security defensive capabilities - PRE-T1040":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify security defensive capabilities - PRE-T1040\""],"Identify sensitive personnel information - PRE-T1051":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify sensitive personnel information - PRE-T1051\""],"Identify supply chains - PRE-T1023":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify supply chains - PRE-T1023\""],"Identify supply chains - PRE-T1042":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify supply chains - PRE-T1042\""],"Identify supply chains - PRE-T1053":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify supply chains - PRE-T1053\""],"Identify technology usage patterns - PRE-T1041":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify technology usage patterns - PRE-T1041\""],"Identify vulnerabilities in third-party software libraries - PRE-T1166":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify vulnerabilities in third-party software libraries - PRE-T1166\""],"Identify web defensive services - PRE-T1033":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Identify web defensive services - PRE-T1033\""],"Install and configure hardware, network, and systems - PRE-T1113":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Install and configure hardware, network, and systems - PRE-T1113\""],"Leverage compromised 3rd party resources - PRE-T1152":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Leverage compromised 3rd party resources - PRE-T1152\""],"Map network topology - PRE-T1029":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Map network topology - PRE-T1029\""],"Mine social media - PRE-T1050":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Mine social media - PRE-T1050\""],"Mine technical blogs\/forums - PRE-T1034":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Mine technical blogs\/forums - PRE-T1034\""],"Misattributable credentials - PRE-T1099":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Misattributable credentials - PRE-T1099\""],"Network-based hiding techniques - PRE-T1092":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Network-based hiding techniques - PRE-T1092\""],"Non-traditional or less attributable payment options - PRE-T1093":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Non-traditional or less attributable payment options - PRE-T1093\""],"OS-vendor provided communication channels - PRE-T1167":["misp-galaxy:mitre-pre-attack-attack-pattern=\"OS-vendor provided communication channels - PRE-T1167\""],"Obfuscate infrastructure - PRE-T1086":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obfuscate infrastructure - PRE-T1086\""],"Obfuscate infrastructure - PRE-T1108":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obfuscate infrastructure - PRE-T1108\""],"Obfuscate operational infrastructure - PRE-T1095":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obfuscate operational infrastructure - PRE-T1095\""],"Obfuscate or encrypt code - PRE-T1096":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obfuscate or encrypt code - PRE-T1096\""],"Obfuscation or cryptography - PRE-T1090":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obfuscation or cryptography - PRE-T1090\""],"Obtain Apple iOS enterprise distribution key pair and certificate - PRE-T1169":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obtain Apple iOS enterprise distribution key pair and certificate - PRE-T1169\""],"Obtain booter\/stressor subscription - PRE-T1173":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obtain booter\/stressor subscription - PRE-T1173\""],"Obtain domain\/IP registration information - PRE-T1028":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obtain domain\/IP registration information - PRE-T1028\""],"Obtain templates\/branding materials - PRE-T1058":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obtain templates\/branding materials - PRE-T1058\""],"Obtain\/re-use payloads - PRE-T1123":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Obtain\/re-use payloads - PRE-T1123\""],"Port redirector - PRE-T1140":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Port redirector - PRE-T1140\""],"Post compromise tool development - PRE-T1130":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Post compromise tool development - PRE-T1130\""],"Private whois services - PRE-T1082":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Private whois services - PRE-T1082\""],"Procure required equipment and software - PRE-T1112":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Procure required equipment and software - PRE-T1112\""],"Proxy\/protocol relays - PRE-T1081":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Proxy\/protocol relays - PRE-T1081\""],"Push-notification client-side exploit - PRE-T1150":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Push-notification client-side exploit - PRE-T1150\""],"Receive KITs\/KIQs and determine requirements - PRE-T1016":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Receive KITs\/KIQs and determine requirements - PRE-T1016\""],"Receive operator KITs\/KIQs tasking - PRE-T1012":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Receive operator KITs\/KIQs tasking - PRE-T1012\""],"Remote access tool development - PRE-T1128":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Remote access tool development - PRE-T1128\""],"Replace legitimate binary with malware - PRE-T1155":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Replace legitimate binary with malware - PRE-T1155\""],"Research relevant vulnerabilities\/CVEs - PRE-T1068":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Research relevant vulnerabilities\/CVEs - PRE-T1068\""],"Research visibility gap of security vendors - PRE-T1067":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Research visibility gap of security vendors - PRE-T1067\""],"Review logs and residual traces - PRE-T1135":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Review logs and residual traces - PRE-T1135\""],"Runtime code download and execution - PRE-T1172":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Runtime code download and execution - PRE-T1172\""],"SSL certificate acquisition for domain - PRE-T1114":["misp-galaxy:mitre-pre-attack-attack-pattern=\"SSL certificate acquisition for domain - PRE-T1114\""],"SSL certificate acquisition for trust breaking - PRE-T1115":["misp-galaxy:mitre-pre-attack-attack-pattern=\"SSL certificate acquisition for trust breaking - PRE-T1115\""],"Secure and protect infrastructure - PRE-T1094":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Secure and protect infrastructure - PRE-T1094\""],"Shadow DNS - PRE-T1117":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Shadow DNS - PRE-T1117\""],"Spear phishing messages with malicious attachments - PRE-T1144":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Spear phishing messages with malicious attachments - PRE-T1144\""],"Spear phishing messages with malicious links - PRE-T1146":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Spear phishing messages with malicious links - PRE-T1146\""],"Spear phishing messages with text only - PRE-T1145":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Spear phishing messages with text only - PRE-T1145\""],"Spearphishing for Information - PRE-T1174":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Spearphishing for Information - PRE-T1174\""],"Submit KITs, KIQs, and intelligence requirements - PRE-T1014":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Submit KITs, KIQs, and intelligence requirements - PRE-T1014\""],"Targeted client-side exploitation - PRE-T1148":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Targeted client-side exploitation - PRE-T1148\""],"Targeted social media phishing - PRE-T1143":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Targeted social media phishing - PRE-T1143\""],"Task requirements - PRE-T1017":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Task requirements - PRE-T1017\""],"Test ability to evade automated mobile application security analysis performed by app stores - PRE-T1170":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test ability to evade automated mobile application security analysis performed by app stores - PRE-T1170\""],"Test callback functionality - PRE-T1133":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test callback functionality - PRE-T1133\""],"Test malware in various execution environments - PRE-T1134":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test malware in various execution environments - PRE-T1134\""],"Test malware to evade detection - PRE-T1136":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test malware to evade detection - PRE-T1136\""],"Test physical access - PRE-T1137":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test physical access - PRE-T1137\""],"Test signature detection - PRE-T1069":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test signature detection - PRE-T1069\""],"Test signature detection for file upload\/email filters - PRE-T1138":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Test signature detection for file upload\/email filters - PRE-T1138\""],"Unauthorized user introduces compromise delivery mechanism - PRE-T1164":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Unauthorized user introduces compromise delivery mechanism - PRE-T1164\""],"Unconditional client-side exploitation\/Injected Website\/Driveby - PRE-T1149":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Unconditional client-side exploitation\/Injected Website\/Driveby - PRE-T1149\""],"Untargeted client-side exploitation - PRE-T1147":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Untargeted client-side exploitation - PRE-T1147\""],"Upload, install, and configure software\/tools - PRE-T1139":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Upload, install, and configure software\/tools - PRE-T1139\""],"Use multiple DNS infrastructures - PRE-T1104":["misp-galaxy:mitre-pre-attack-attack-pattern=\"Use multiple DNS infrastructures - PRE-T1104\""],"Empire - S0363":["misp-galaxy:mitre-tool=\"Empire - S0363\""],"EmPyre":["misp-galaxy:mitre-tool=\"Empire - S0363\""],"PowerShell Empire":["misp-galaxy:mitre-tool=\"Empire - S0363\""],"Expand - S0361":["misp-galaxy:mitre-tool=\"Expand - S0361\""],"Expand":["misp-galaxy:mitre-tool=\"Expand - S0361\""],"Impacket - S0357":["misp-galaxy:mitre-tool=\"Impacket - S0357\""],"Impacket":["misp-galaxy:mitre-tool=\"Impacket - S0357\""],"Koadic - S0250":["misp-galaxy:mitre-tool=\"Koadic - S0250\""],"LaZagne - S0349":["misp-galaxy:mitre-tool=\"LaZagne - S0349\""],"LaZagne":["misp-galaxy:mitre-tool=\"LaZagne - S0349\""],"Nltest - S0359":["misp-galaxy:mitre-tool=\"Nltest - S0359\""],"Nltest":["misp-galaxy:mitre-tool=\"Nltest - S0359\""],"PoshC2 - S0378":["misp-galaxy:mitre-tool=\"PoshC2 - S0378\""],"QuasarRAT - S0262":["misp-galaxy:mitre-tool=\"QuasarRAT - S0262\""],"QuasarRAT":["misp-galaxy:mitre-tool=\"QuasarRAT - S0262\""],"xRAT":["misp-galaxy:mitre-tool=\"QuasarRAT - S0262\"","misp-galaxy:rat=\"xRAT\""],"RawDisk - S0364":["misp-galaxy:mitre-tool=\"RawDisk - S0364\""],"RawDisk":["misp-galaxy:mitre-tool=\"RawDisk - S0364\""],"Remcos - S0332":["misp-galaxy:mitre-tool=\"Remcos - S0332\""],"Ruler - S0358":["misp-galaxy:mitre-tool=\"Ruler - S0358\""],"Ruler":["misp-galaxy:mitre-tool=\"Ruler - S0358\""],"Xbot - S0298":["misp-galaxy:mitre-tool=\"Xbot - S0298\""],"ACL":["misp-galaxy:preventive-measure=\"ACL\""],"Backup and Restore Process":["misp-galaxy:preventive-measure=\"Backup and Restore Process\""],"Blacklist-phone-numbers":["misp-galaxy:preventive-measure=\"Blacklist-phone-numbers\""],"Block Macros":["misp-galaxy:preventive-measure=\"Block Macros\""],"Change Default \"Open With\" to Notepad":["misp-galaxy:preventive-measure=\"Change Default \"Open With\" to Notepad\""],"Disable WSH":["misp-galaxy:preventive-measure=\"Disable WSH\""],"EMET":["misp-galaxy:preventive-measure=\"EMET\""],"Enforce UAC Prompt":["misp-galaxy:preventive-measure=\"Enforce UAC Prompt\""],"Execution Prevention":["misp-galaxy:preventive-measure=\"Execution Prevention\""],"File Screening":["misp-galaxy:preventive-measure=\"File Screening\""],"Filter Attachments Level 1":["misp-galaxy:preventive-measure=\"Filter Attachments Level 1\""],"Filter Attachments Level 2":["misp-galaxy:preventive-measure=\"Filter Attachments Level 2\""],"Remove Admin Privileges":["misp-galaxy:preventive-measure=\"Remove Admin Privileges\""],"Restrict Workstation Communication":["misp-galaxy:preventive-measure=\"Restrict Workstation Communication\""],"Restrict program execution #2":["misp-galaxy:preventive-measure=\"Restrict program execution #2\""],"Restrict program execution":["misp-galaxy:preventive-measure=\"Restrict program execution\""],"Sandboxing Email Input":["misp-galaxy:preventive-measure=\"Sandboxing Email Input\""],"Show File Extensions":["misp-galaxy:preventive-measure=\"Show File Extensions\""],"Sysmon":["misp-galaxy:preventive-measure=\"Sysmon\""],"\"prepending (enc) ransomware\" (Not an official name)":["misp-galaxy:ransomware=\"\"prepending (enc) ransomware\" (Not an official name)\""],".CryptoHasYou.":["misp-galaxy:ransomware=\".CryptoHasYou.\""],"777":["misp-galaxy:ransomware=\"777\""],"Sevleg":["misp-galaxy:ransomware=\"777\""],"7Zipper Ransomware":["misp-galaxy:ransomware=\"7Zipper Ransomware\""],"7ev3n-HONE$T":["misp-galaxy:ransomware=\"7ev3n\""],"8lock8":["misp-galaxy:ransomware=\"8lock8\""],"AES-NI Ransomware ":["misp-galaxy:ransomware=\"AES-NI Ransomware \""],"AES_KEY_GEN_ASSIST Ransomware":["misp-galaxy:ransomware=\"AES_KEY_GEN_ASSIST Ransomware\""],"ALFA Ransomware":["misp-galaxy:ransomware=\"ALFA Ransomware\""],"AMBA":["misp-galaxy:ransomware=\"AMBA\""],"APT Ransomware v.2":["misp-galaxy:ransomware=\"APT Ransomware v.2\""],"ASN1 Encoder Ransomware":["misp-galaxy:ransomware=\"ASN1 Encoder Ransomware\""],"Acroware Cryptolocker Ransomware":["misp-galaxy:ransomware=\"Acroware Cryptolocker Ransomware\""],"Acroware Screenlocker":["misp-galaxy:ransomware=\"Acroware Cryptolocker Ransomware\""],"AdamLocker Ransomware":["misp-galaxy:ransomware=\"AdamLocker Ransomware\""],"AiraCrop Ransomware":["misp-galaxy:ransomware=\"AiraCrop Ransomware\""],"AiraCrop":["misp-galaxy:ransomware=\"AiraCrop\""],"Al-Namrood":["misp-galaxy:ransomware=\"Al-Namrood\""],"Alcatraz Locker Ransomware":["misp-galaxy:ransomware=\"Alcatraz Locker Ransomware\""],"All_Your_Documents Ransomware":["misp-galaxy:ransomware=\"All_Your_Documents Ransomware\""],"Alma Ransomware":["misp-galaxy:ransomware=\"Alma Ransomware\""],"Alpha Ransomware":["misp-galaxy:ransomware=\"Alpha Ransomware\""],"Angela Merkel Ransomware":["misp-galaxy:ransomware=\"Angela Merkel Ransomware\""],"AngleWare":["misp-galaxy:ransomware=\"AngleWare\""],"AngryDuck Ransomware":["misp-galaxy:ransomware=\"AngryDuck Ransomware\""],"Anony":["misp-galaxy:ransomware=\"Anony\""],"ngocanh":["misp-galaxy:ransomware=\"Anony\""],"Antihacker2017 Ransomware":["misp-galaxy:ransomware=\"Antihacker2017 Ransomware\""],"Antix Ransomware":["misp-galaxy:ransomware=\"Antix Ransomware\""],"Anubis Ransomware":["misp-galaxy:ransomware=\"Anubis Ransomware\""],"Fabiansomeware":["misp-galaxy:ransomware=\"Apocalypse\""],"ApocalypseVM":["misp-galaxy:ransomware=\"ApocalypseVM\""],"Aurora Ransomware":["misp-galaxy:ransomware=\"Aurora Ransomware\""],"Zorro Ransomware":["misp-galaxy:ransomware=\"Aurora Ransomware\""],"AutoLocky":["misp-galaxy:ransomware=\"AutoLocky\""],"AvastVirusinfo Ransomware":["misp-galaxy:ransomware=\"AvastVirusinfo Ransomware\""],"Aw3s0m3Sc0t7":["misp-galaxy:ransomware=\"Aw3s0m3Sc0t7\""],"B2DR Ransomware":["misp-galaxy:ransomware=\"B2DR Ransomware\""],"BTCLocker Ransomware":["misp-galaxy:ransomware=\"BTCLocker Ransomware\""],"BTC Ransomware":["misp-galaxy:ransomware=\"BTCLocker Ransomware\""],"BTCWare Related to \/ new version of CryptXXX":["misp-galaxy:ransomware=\"BTCWare Related to \/ new version of CryptXXX\""],"BTCamant Ransomware":["misp-galaxy:ransomware=\"BTCamant Ransomware\""],"Bad Rabbit":["misp-galaxy:ransomware=\"Bad Rabbit\""],"Bad-Rabbit":["misp-galaxy:ransomware=\"Bad Rabbit\""],"BadBlock":["misp-galaxy:ransomware=\"BadBlock\""],"BadEncript Ransomware":["misp-galaxy:ransomware=\"BadEncript Ransomware\""],"BaksoCrypt":["misp-galaxy:ransomware=\"BaksoCrypt\""],"Bandarchor":["misp-galaxy:ransomware=\"Bandarchor\"","misp-galaxy:ransomware=\"Rakhni\""],"BansomQare Manna Ransomware":["misp-galaxy:ransomware=\"BansomQare Manna Ransomware\""],"BarRax Ransomware":["misp-galaxy:ransomware=\"BarRax Ransomware\""],"BarRaxCrypt Ransomware":["misp-galaxy:ransomware=\"BarRax Ransomware\""],"Barack Obama's Everlasting Blue Blackmail Virus Ransomware":["misp-galaxy:ransomware=\"Barack Obama's Everlasting Blue Blackmail Virus Ransomware\""],"Barack Obama's Blackmail Virus Ransomware":["misp-galaxy:ransomware=\"Barack Obama's Everlasting Blue Blackmail Virus Ransomware\""],"BaCrypt":["misp-galaxy:ransomware=\"Bart\""],"BigBobRoss":["misp-galaxy:ransomware=\"BigBobRoss\""],"BitCryptor":["misp-galaxy:ransomware=\"BitCryptor\""],"BitStak":["misp-galaxy:ransomware=\"BitStak\""],"Black Ruby":["misp-galaxy:ransomware=\"Black Ruby\""],"BlackShades Crypter":["misp-galaxy:ransomware=\"BlackShades Crypter\""],"SilentShade":["misp-galaxy:ransomware=\"BlackShades Crypter\""],"BlackWorm":["misp-galaxy:ransomware=\"BlackWorm\""],"BleedGreen Ransomware":["misp-galaxy:ransomware=\"BleedGreen Ransomware\""],"FireCrypt Ransomware":["misp-galaxy:ransomware=\"BleedGreen Ransomware\""],"Blocatto":["misp-galaxy:ransomware=\"Blocatto\""],"Booyah":["misp-galaxy:ransomware=\"Booyah\"","misp-galaxy:ransomware=\"MM Locker\""],"Salami":["misp-galaxy:ransomware=\"Booyah\""],"BrLock":["misp-galaxy:ransomware=\"BrLock\""],"BrainCrypt Ransomware":["misp-galaxy:ransomware=\"BrainCrypt Ransomware\""],"Brazilian Globe":["misp-galaxy:ransomware=\"Brazilian Globe\""],"Brazilian":["misp-galaxy:ransomware=\"Brazilian\""],"Browlock":["misp-galaxy:ransomware=\"Browlock\""],"Bucbi":["misp-galaxy:ransomware=\"Bucbi\""],"BuyUnlockCode":["misp-galaxy:ransomware=\"BuyUnlockCode\""],"CIA Special Agent 767 Ransomware (FAKE!!!)":["misp-galaxy:ransomware=\"CIA Special Agent 767 Ransomware (FAKE!!!)\""],"CSGO Ransomware":["misp-galaxy:ransomware=\"CSGO Ransomware\""],"CTB-Faker":["misp-galaxy:ransomware=\"CTB-Faker\""],"Citroni":["misp-galaxy:ransomware=\"CTB-Faker\""],"CTB-Locker WEB":["misp-galaxy:ransomware=\"CTB-Locker WEB\""],"CYR-Locker Ransomware (FAKE)":["misp-galaxy:ransomware=\"CYR-Locker Ransomware (FAKE)\""],"Cancer Ransomware FAKE":["misp-galaxy:ransomware=\"Cancer Ransomware FAKE\""],"Cassetto Ransomware":["misp-galaxy:ransomware=\"Cassetto Ransomware\""],"Central Security Treatment Organization":["misp-galaxy:ransomware=\"Central Security Treatment Organization\"","misp-galaxy:ransomware=\"CryLocker\""],"CRBR ENCRYPTOR":["misp-galaxy:ransomware=\"Cerber\""],"CerberTear Ransomware":["misp-galaxy:ransomware=\"CerberTear Ransomware\""],"Chartwig Ransomware":["misp-galaxy:ransomware=\"Chartwig Ransomware\""],"Chimera":["misp-galaxy:ransomware=\"Chimera\""],"Chip Ransomware":["misp-galaxy:ransomware=\"Chip Ransomware\""],"ChipLocker Ransomware":["misp-galaxy:ransomware=\"Chip Ransomware\""],"Click Me Ransomware":["misp-galaxy:ransomware=\"Click Me Ransomware\""],"Clock":["misp-galaxy:ransomware=\"Clock\""],"CloudSword Ransomware":["misp-galaxy:ransomware=\"CloudSword Ransomware\""],"CockBlocker Ransomware":["misp-galaxy:ransomware=\"CockBlocker Ransomware\""],"Code Virus Ransomware ":["misp-galaxy:ransomware=\"Code Virus Ransomware \""],"CoinVault":["misp-galaxy:ransomware=\"CoinVault\""],"CommonRansom":["misp-galaxy:ransomware=\"CommonRansom\""],"Comrade Circle Ransomware":["misp-galaxy:ransomware=\"Comrade Circle Ransomware\""],"ConsoleApplication1 Ransomware":["misp-galaxy:ransomware=\"ConsoleApplication1 Ransomware\""],"Coverton":["misp-galaxy:ransomware=\"Coverton\""],"Criptt0r":["misp-galaxy:ransomware=\"Cr1ptT0r\""],"Cr1pt0r":["misp-galaxy:ransomware=\"Cr1ptT0r\""],"Cripttor":["misp-galaxy:ransomware=\"Cr1ptT0r\""],"CreamPie Ransomware":["misp-galaxy:ransomware=\"CreamPie Ransomware\""],"Crptxxx Ransomware":["misp-galaxy:ransomware=\"Crptxxx Ransomware\""],"CryBrazil":["misp-galaxy:ransomware=\"CryBrazil\""],"CryFile":["misp-galaxy:ransomware=\"CryFile\""],"Cry":["misp-galaxy:ransomware=\"CryLocker\""],"CSTO":["misp-galaxy:ransomware=\"CryLocker\""],"CryPy":["misp-galaxy:ransomware=\"CryPy\""],"Cryaki":["misp-galaxy:ransomware=\"Cryaki\""],"Crybola":["misp-galaxy:ransomware=\"Crybola\""],"CrypMIC":["misp-galaxy:ransomware=\"CrypMIC\""],"Crypren":["misp-galaxy:ransomware=\"Crypren\""],"Crypt0saur":["misp-galaxy:ransomware=\"Crypt0saur\""],"Crypt38":["misp-galaxy:ransomware=\"Crypt38\""],"CryptConsole 2.0 Ransomware":["misp-galaxy:ransomware=\"CryptConsole 2.0 Ransomware\""],"CryptConsole":["misp-galaxy:ransomware=\"CryptConsole\""],"CryptFIle2":["misp-galaxy:ransomware=\"CryptFIle2\""],"CryptInfinite":["misp-galaxy:ransomware=\"CryptInfinite\""],"CryptXXX 2.0":["misp-galaxy:ransomware=\"CryptXXX 2.0\""],"CryptProjectXXX":["misp-galaxy:ransomware=\"CryptXXX 2.0\"","misp-galaxy:ransomware=\"CryptXXX\""],"CryptXXX 3.0":["misp-galaxy:ransomware=\"CryptXXX 3.0\""],"UltraDeCrypter":["misp-galaxy:ransomware=\"CryptXXX 3.0\""],"UltraCrypter":["misp-galaxy:ransomware=\"CryptXXX 3.0\""],"CryptXXX 3.1":["misp-galaxy:ransomware=\"CryptXXX 3.1\""],"CryptXXX":["misp-galaxy:ransomware=\"CryptXXX\""],"Crypter":["misp-galaxy:ransomware=\"Crypter\""],"CryptoBit":["misp-galaxy:ransomware=\"CryptoBit\"","misp-galaxy:ransomware=\"Mobef\""],"CryptoBlock Ransomware ":["misp-galaxy:ransomware=\"CryptoBlock Ransomware \""],"CryptoDefense":["misp-galaxy:ransomware=\"CryptoDefense\""],"CryptoDevil Ransomware":["misp-galaxy:ransomware=\"CryptoDevil Ransomware\""],"CryptoFinancial":["misp-galaxy:ransomware=\"CryptoFinancial\""],"CryptoGraphic Locker":["misp-galaxy:ransomware=\"CryptoGraphic Locker\""],"Manamecrypt":["misp-galaxy:ransomware=\"CryptoHost\""],"Telograph":["misp-galaxy:ransomware=\"CryptoHost\""],"ROI Locker":["misp-galaxy:ransomware=\"CryptoHost\""],"CryptoJacky Ransomware":["misp-galaxy:ransomware=\"CryptoJacky Ransomware\""],"CryptoJoker":["misp-galaxy:ransomware=\"CryptoJoker\""],"CryptoKill Ransomware":["misp-galaxy:ransomware=\"CryptoKill Ransomware\""],"CryptoLocker 1.0.0":["misp-galaxy:ransomware=\"CryptoLocker 1.0.0\""],"CryptoLocker 5.1":["misp-galaxy:ransomware=\"CryptoLocker 5.1\""],"CryptoLocker by NTK Ransomware":["misp-galaxy:ransomware=\"CryptoLocker by NTK Ransomware\""],"CryptoLocker3 Ransomware":["misp-galaxy:ransomware=\"CryptoLocker3 Ransomware\""],"Fake CryptoLocker":["misp-galaxy:ransomware=\"CryptoLocker3 Ransomware\""],"CryptoLuck Ransomware":["misp-galaxy:ransomware=\"CryptoLuck Ransomware\""],"YafunnLocker":["misp-galaxy:ransomware=\"CryptoLuck Ransomware\""],"CryptoMeister Ransomware":["misp-galaxy:ransomware=\"CryptoMeister Ransomware\""],"Zeta":["misp-galaxy:ransomware=\"CryptoMix\""],"CryptoNar":["misp-galaxy:ransomware=\"CryptoNar\""],"CryptoRoger":["misp-galaxy:ransomware=\"CryptoRoger\""],"CryptoShadow":["misp-galaxy:ransomware=\"CryptoShadow\""],"CryptoShield 1.0 Ransomware":["misp-galaxy:ransomware=\"CryptoShield 1.0 Ransomware\""],"CryptoShocker":["misp-galaxy:ransomware=\"CryptoShocker\""],"CryptoSweetTooth Ransomware":["misp-galaxy:ransomware=\"CryptoSweetTooth Ransomware\""],"CryptoTorLocker2015":["misp-galaxy:ransomware=\"CryptoTorLocker2015\""],"CryptoTrooper":["misp-galaxy:ransomware=\"CryptoTrooper\""],"CryptoWall 1":["misp-galaxy:ransomware=\"CryptoWall 1\""],"CryptoWall 2":["misp-galaxy:ransomware=\"CryptoWall 2\""],"CryptoWall 3":["misp-galaxy:ransomware=\"CryptoWall 3\""],"CryptoWall 4":["misp-galaxy:ransomware=\"CryptoWall 4\""],"CryptoWire Ransomeware":["misp-galaxy:ransomware=\"CryptoWire Ransomeware\""],"Crypton Ransomware":["misp-galaxy:ransomware=\"Crypton Ransomware\""],"Nemesis":["misp-galaxy:ransomware=\"Crypton Ransomware\""],"X3M":["misp-galaxy:ransomware=\"Crypton Ransomware\""],"Cryptorium (Fake Ransomware)":["misp-galaxy:ransomware=\"Cryptorium (Fake Ransomware)\""],"Crypute Ransomware":["misp-galaxy:ransomware=\"Crypute Ransomware\""],"m0on Ransomware":["misp-galaxy:ransomware=\"Crypute Ransomware\""],"CuteRansomware":["misp-galaxy:ransomware=\"CuteRansomware\""],"my-Little-Ransomware":["misp-galaxy:ransomware=\"CuteRansomware\""],"Cyber Drill Exercise ":["misp-galaxy:ransomware=\"Cyber Drill Exercise \""],"Ransomuhahawhere":["misp-galaxy:ransomware=\"Cyber Drill Exercise \""],"Cyber SpLiTTer Vbs":["misp-galaxy:ransomware=\"Cyber SpLiTTer Vbs\""],"Cyron":["misp-galaxy:ransomware=\"Cyron\""],"DBGer Ransomware":["misp-galaxy:ransomware=\"DBGer Ransomware\""],"DEDCryptor":["misp-galaxy:ransomware=\"DEDCryptor\""],"DMALocker 3.0":["misp-galaxy:ransomware=\"DMALocker 3.0\""],"DMALocker":["misp-galaxy:ransomware=\"DMALocker\""],"DN":["misp-galaxy:ransomware=\"DN\""],"Fake":["misp-galaxy:ransomware=\"DN\""],"DNRansomware":["misp-galaxy:ransomware=\"DNRansomware\""],"DUMB Ransomware":["misp-galaxy:ransomware=\"DUMB Ransomware\""],"DXXD":["misp-galaxy:ransomware=\"DXXD\""],"Dablio Ransomware":["misp-galaxy:ransomware=\"Dablio Ransomware\""],"Dale Ransomware":["misp-galaxy:ransomware=\"Dale Ransomware\""],"DaleLocker Ransomware":["misp-galaxy:ransomware=\"Dale Ransomware\""],"Damage Ransomware":["misp-galaxy:ransomware=\"Damage Ransomware\""],"Dangerous Ransomware":["misp-galaxy:ransomware=\"Dangerous Ransomware\""],"DeCrypt Protect":["misp-galaxy:ransomware=\"DeCrypt Protect\""],"DeLpHiMoRix":["misp-galaxy:ransomware=\"DeLpHiMoRix\""],"DelphiMorix":["misp-galaxy:ransomware=\"DeLpHiMoRix\""],"Deadly Ransomware":["misp-galaxy:ransomware=\"Deadly Ransomware\""],"Deadly for a Good Purpose Ransomware":["misp-galaxy:ransomware=\"Deadly Ransomware\""],"Death Bitches":["misp-galaxy:ransomware=\"Death Bitches\""],"DecryptFox Ransomware":["misp-galaxy:ransomware=\"DecryptFox Ransomware\""],"Demo":["misp-galaxy:ransomware=\"Demo\""],"DeriaLock Ransomware":["misp-galaxy:ransomware=\"DeriaLock Ransomware\""],"DetoxCrypto":["misp-galaxy:ransomware=\"DetoxCrypto\""],"Dharma Ransomware":["misp-galaxy:ransomware=\"Dharma Ransomware\""],"Digisom":["misp-galaxy:ransomware=\"Digisom\""],"DirtyDecrypt":["misp-galaxy:ransomware=\"DirtyDecrypt\""],"DiskDoctor":["misp-galaxy:ransomware=\"DiskDoctor\""],"Scarab-DiskDoctor":["misp-galaxy:ransomware=\"DiskDoctor\""],"DoNotChange":["misp-galaxy:ransomware=\"DoNotChange\""],"Domino":["misp-galaxy:ransomware=\"Domino\""],"Donald Trump 2 Ransomware":["misp-galaxy:ransomware=\"Donald Trump 2 Ransomware\""],"Donut":["misp-galaxy:ransomware=\"Donut\""],"DotRansomware":["misp-galaxy:ransomware=\"DotRansomware\""],"DummyEncrypter Ransomware":["misp-galaxy:ransomware=\"DummyEncrypter Ransomware\""],"DummyLocker":["misp-galaxy:ransomware=\"DummyLocker\""],"DynA-Crypt Ransomware":["misp-galaxy:ransomware=\"DynA-Crypt Ransomware\""],"DynA CryptoLocker Ransomware":["misp-galaxy:ransomware=\"DynA-Crypt Ransomware\""],"EQ Ransomware":["misp-galaxy:ransomware=\"EQ Ransomware\""],"EdgeLocker":["misp-galaxy:ransomware=\"EdgeLocker\""],"EduCrypt":["misp-galaxy:ransomware=\"EduCrypt\""],"EduCrypter":["misp-galaxy:ransomware=\"EduCrypt\""],"EiTest":["misp-galaxy:ransomware=\"EiTest\""],"El-Polocker":["misp-galaxy:ransomware=\"El-Polocker\""],"Los Pollos Hermanos":["misp-galaxy:ransomware=\"El-Polocker\""],"Encoder.xxxx":["misp-galaxy:ransomware=\"Encoder.xxxx\""],"Trojan.Encoder.6491":["misp-galaxy:ransomware=\"Encoder.xxxx\"","misp-galaxy:ransomware=\"Windows_Security Ransonware\""],"EncrypTile Ransomware":["misp-galaxy:ransomware=\"EncrypTile Ransomware\""],"Encryptss77 Ransomware":["misp-galaxy:ransomware=\"Encryptss77 Ransomware\""],"SFX Monster Ransomware":["misp-galaxy:ransomware=\"Encryptss77 Ransomware\""],"Enigma 2 Ransomware":["misp-galaxy:ransomware=\"Enigma 2 Ransomware\""],"Enigma":["misp-galaxy:ransomware=\"Enigma\""],"Enjey":["misp-galaxy:ransomware=\"Enjey\""],"EnjeyCrypter Ransomware":["misp-galaxy:ransomware=\"EnjeyCrypter Ransomware\""],"EnkripsiPC Ransomware":["misp-galaxy:ransomware=\"EnkripsiPC Ransomware\""],"IDRANSOMv3":["misp-galaxy:ransomware=\"EnkripsiPC Ransomware\""],"EnyBeny Nuclear Ransomware":["misp-galaxy:ransomware=\"EnyBeny Nuclear Ransomware\""],"EnyBenyHorsuke Ransomware":["misp-galaxy:ransomware=\"EnyBenyHorsuke Ransomware\""],"Erebus 2017 Ransomware":["misp-galaxy:ransomware=\"Erebus 2017 Ransomware\""],"Erebus Ransomware":["misp-galaxy:ransomware=\"Erebus Ransomware\""],"Esmeralda Ransomware":["misp-galaxy:ransomware=\"Esmeralda Ransomware\""],"Everbe Ransomware":["misp-galaxy:ransomware=\"Everbe Ransomware\""],"Evil Ransomware":["misp-galaxy:ransomware=\"Evil Ransomware\""],"File0Locked KZ Ransomware":["misp-galaxy:ransomware=\"Evil Ransomware\""],"Exotic Ransomware":["misp-galaxy:ransomware=\"Exotic Ransomware\""],"FILE FROZR":["misp-galaxy:ransomware=\"FILE FROZR\""],"FLKR Ransomware":["misp-galaxy:ransomware=\"FLKR Ransomware\""],"FSociety":["misp-galaxy:ransomware=\"FSociety\""],"FabSysCrypto Ransomware":["misp-galaxy:ransomware=\"FabSysCrypto Ransomware\""],"Fadesoft Ransomware":["misp-galaxy:ransomware=\"Fadesoft Ransomware\""],"Fairware":["misp-galaxy:ransomware=\"Fairware\""],"Fakben":["misp-galaxy:ransomware=\"Fakben\""],"Fake Globe Ransomware":["misp-galaxy:ransomware=\"Fake Globe Ransomware\""],"Globe Imposter":["misp-galaxy:ransomware=\"Fake Globe Ransomware\""],"Fake Locky Ransomware":["misp-galaxy:ransomware=\"Fake Locky Ransomware\""],"Locky Impersonator Ransomware":["misp-galaxy:ransomware=\"Fake Locky Ransomware\""],"FakeCryptoLocker":["misp-galaxy:ransomware=\"FakeCryptoLocker\""],"Fantom":["misp-galaxy:ransomware=\"Fantom\""],"Comrad Circle":["misp-galaxy:ransomware=\"Fantom\""],"FenixLocker":["misp-galaxy:ransomware=\"FenixLocker\""],"File Spider":["misp-galaxy:ransomware=\"File Spider\""],"File-Locker":["misp-galaxy:ransomware=\"File-Locker\""],"FindZip":["misp-galaxy:ransomware=\"FileCoder\""],"FileLocker":["misp-galaxy:ransomware=\"FileLocker\""],"Fileice Ransomware Survey Ransomware":["misp-galaxy:ransomware=\"Fileice Ransomware Survey Ransomware\""],"First":["misp-galaxy:ransomware=\"First\""],"FlatChestWare":["misp-galaxy:ransomware=\"FlatChestWare\""],"Flotera Ransomware":["misp-galaxy:ransomware=\"Flotera Ransomware\""],"Flyper":["misp-galaxy:ransomware=\"Flyper\""],"Fonco":["misp-galaxy:ransomware=\"Fonco\""],"Forma Ransomware":["misp-galaxy:ransomware=\"Forma Ransomware\""],"FortuneCookie ":["misp-galaxy:ransomware=\"FortuneCookie \""],"FortuneCookie":["misp-galaxy:ransomware=\"FortuneCookie\""],"Free-Freedom":["misp-galaxy:ransomware=\"Free-Freedom\""],"Roga":["misp-galaxy:ransomware=\"Free-Freedom\"","misp-galaxy:ransomware=\"Roga\""],"Fs0ciety Locker Ransomware":["misp-galaxy:ransomware=\"Fs0ciety Locker Ransomware\""],"FuckSociety Ransomware":["misp-galaxy:ransomware=\"FuckSociety Ransomware\""],"FunFact Ransomware":["misp-galaxy:ransomware=\"FunFact Ransomware\""],"Fury":["misp-galaxy:ransomware=\"Fury\""],"Fusob":["misp-galaxy:ransomware=\"Fusob\""],"GC47 Ransomware":["misp-galaxy:ransomware=\"GC47 Ransomware\""],"GG Ransomware":["misp-galaxy:ransomware=\"GG Ransomware\""],"GNL Locker":["misp-galaxy:ransomware=\"GNL Locker\"","misp-galaxy:ransomware=\"Zyklon\""],"GOG Ransomware":["misp-galaxy:ransomware=\"GOG Ransomware\""],"GandCrab":["misp-galaxy:ransomware=\"GandCrab\""],"GarryWeber Ransomware":["misp-galaxy:ransomware=\"GarryWeber Ransomware\""],"Gerber Ransomware 1.0":["misp-galaxy:ransomware=\"Gerber Ransomware 1.0\""],"Gerber Ransomware 3.0":["misp-galaxy:ransomware=\"Gerber Ransomware 3.0\""],"GetCrypt":["misp-galaxy:ransomware=\"GetCrypt\""],"GhostCrypt":["misp-galaxy:ransomware=\"GhostCrypt\""],"Gingerbread":["misp-galaxy:ransomware=\"Gingerbread\""],"Globe v1":["misp-galaxy:ransomware=\"Globe v1\""],"Purge":["misp-galaxy:ransomware=\"Globe v1\""],"Globe2 Ransomware":["misp-galaxy:ransomware=\"Globe2 Ransomware\""],"Purge Ransomware":["misp-galaxy:ransomware=\"Globe2 Ransomware\"","misp-galaxy:ransomware=\"Globe3 Ransomware\""],"Globe3 Ransomware":["misp-galaxy:ransomware=\"Globe3 Ransomware\""],"God Crypt Joke Ransomware":["misp-galaxy:ransomware=\"God Crypt Joke Ransomware\""],"Godsomware v1.0":["misp-galaxy:ransomware=\"God Crypt Joke Ransomware\""],"Ransomware God Crypt":["misp-galaxy:ransomware=\"God Crypt Joke Ransomware\""],"GoldenEye Ransomware":["misp-galaxy:ransomware=\"GoldenEye Ransomware\""],"Gomasom":["misp-galaxy:ransomware=\"Gomasom\""],"Goopic":["misp-galaxy:ransomware=\"Goopic\""],"Gopher":["misp-galaxy:ransomware=\"Gopher\""],"Gremit Ransomware":["misp-galaxy:ransomware=\"Gremit Ransomware\""],"Guster Ransomware":["misp-galaxy:ransomware=\"Guster Ransomware\""],"HC6":["misp-galaxy:ransomware=\"HC6\""],"HC7":["misp-galaxy:ransomware=\"HC7\""],"HPE iLO 4 Ransomware":["misp-galaxy:ransomware=\"HPE iLO 4 Ransomware\""],"HTCryptor":["misp-galaxy:ransomware=\"HTCryptor\""],"Hacked":["misp-galaxy:ransomware=\"Hacked\""],"HackedLocker Ransomware":["misp-galaxy:ransomware=\"HackedLocker Ransomware\""],"Halloware":["misp-galaxy:ransomware=\"Halloware\""],"HappyDayzz":["misp-galaxy:ransomware=\"HappyDayzz\""],"Harasom":["misp-galaxy:ransomware=\"Harasom\""],"Havoc":["misp-galaxy:ransomware=\"Havoc\""],"HavocCrypt Ransomware":["misp-galaxy:ransomware=\"Havoc\""],"Haxerboi Ransomware":["misp-galaxy:ransomware=\"Haxerboi Ransomware\""],"Heimdall":["misp-galaxy:ransomware=\"Heimdall\""],"Help_dcfile":["misp-galaxy:ransomware=\"Help_dcfile\""],"Hi Buddy!":["misp-galaxy:ransomware=\"Hi Buddy!\""],"Cryptear":["misp-galaxy:ransomware=\"HiddenTear\""],"Hidden Tear":["misp-galaxy:ransomware=\"HiddenTear\""],"Hitler":["misp-galaxy:ransomware=\"Hitler\""],"Hollycrypt Ransomware":["misp-galaxy:ransomware=\"Hollycrypt Ransomware\""],"HolyCrypt":["misp-galaxy:ransomware=\"HolyCrypt\""],"Hucky Ransomware":["misp-galaxy:ransomware=\"Hucky Ransomware\""],"Hungarian Locky Ransomware":["misp-galaxy:ransomware=\"Hucky Ransomware\""],"HugeMe Ransomware":["misp-galaxy:ransomware=\"HugeMe Ransomware\""],"HydraCrypt":["misp-galaxy:ransomware=\"HydraCrypt\""],"IFN643 Ransomware":["misp-galaxy:ransomware=\"IFN643 Ransomware\""],"International Police Association":["misp-galaxy:ransomware=\"International Police Association\""],"Iron":["misp-galaxy:ransomware=\"Iron\""],"Ishtar Ransomware":["misp-galaxy:ransomware=\"Ishtar Ransomware\""],"JackPot Ransomware":["misp-galaxy:ransomware=\"JackPot Ransomware\""],"Jack.Pot Ransomware":["misp-galaxy:ransomware=\"JackPot Ransomware\""],"JagerDecryptor":["misp-galaxy:ransomware=\"JagerDecryptor\""],"JapanLocker Ransomware":["misp-galaxy:ransomware=\"JapanLocker Ransomware\""],"SHC Ransomware":["misp-galaxy:ransomware=\"JapanLocker Ransomware\""],"SHCLocker":["misp-galaxy:ransomware=\"JapanLocker Ransomware\""],"SyNcryption":["misp-galaxy:ransomware=\"JapanLocker Ransomware\""],"Jeff the Ransomware":["misp-galaxy:ransomware=\"Jeff the Ransomware\""],"Jeiphoos":["misp-galaxy:ransomware=\"Jeiphoos\""],"Encryptor RaaS":["misp-galaxy:ransomware=\"Jeiphoos\""],"Sarento":["misp-galaxy:ransomware=\"Jeiphoos\""],"Jhon Woddy":["misp-galaxy:ransomware=\"Jhon Woddy\""],"CryptoHitMan":["misp-galaxy:ransomware=\"Jigsaw\""],"Job Crypter":["misp-galaxy:ransomware=\"Job Crypter\""],"JohnyCryptor":["misp-galaxy:ransomware=\"JohnyCryptor\""],"Jokeroo":["misp-galaxy:ransomware=\"Jokeroo\""],"Fake GandCrab":["misp-galaxy:ransomware=\"Jokeroo\""],"JungleSec":["misp-galaxy:ransomware=\"JungleSec\""],"KEYHolder":["misp-galaxy:ransomware=\"KEYHolder\""],"KEYPASS":["misp-galaxy:ransomware=\"KEYPASS\""],"KRider Ransomware":["misp-galaxy:ransomware=\"KRider Ransomware\""],"Kaandsona Ransomware":["misp-galaxy:ransomware=\"Kaandsona Ransomware\""],"RansomTroll Ransomware":["misp-galaxy:ransomware=\"Kaandsona Ransomware\""],"K\u00e4\u00e4nds\u00f5na Ransomware":["misp-galaxy:ransomware=\"Kaandsona Ransomware\""],"Kaenlupuf Ransomware":["misp-galaxy:ransomware=\"Kaenlupuf Ransomware\""],"Kangaroo Ransomware":["misp-galaxy:ransomware=\"Kangaroo Ransomware\""],"Kappa":["misp-galaxy:ransomware=\"Kappa\""],"Karma Ransomware":["misp-galaxy:ransomware=\"Karma Ransomware\""],"Karmen Ransomware":["misp-galaxy:ransomware=\"Karmen Ransomware\""],"Kasiski Ransomware":["misp-galaxy:ransomware=\"Kasiski Ransomware\""],"KawaiiLocker":["misp-galaxy:ransomware=\"KawaiiLocker\""],"KeyBTC":["misp-galaxy:ransomware=\"KeyBTC\""],"KillDisk Ransomware":["misp-galaxy:ransomware=\"KillDisk Ransomware\""],"KillerLocker":["misp-galaxy:ransomware=\"KillerLocker\""],"KimcilWare":["misp-galaxy:ransomware=\"KimcilWare\""],"Kirk Ransomware & Spock Decryptor":["misp-galaxy:ransomware=\"Kirk Ransomware & Spock Decryptor\""],"KoKoKrypt Ransomware":["misp-galaxy:ransomware=\"KoKoKrypt Ransomware\""],"KokoLocker Ransomware":["misp-galaxy:ransomware=\"KoKoKrypt Ransomware\""],"Kolobo Ransomware":["misp-galaxy:ransomware=\"Kolobo Ransomware\""],"Kolobocheg Ransomware":["misp-galaxy:ransomware=\"Kolobo Ransomware\""],"Koolova Ransomware":["misp-galaxy:ransomware=\"Koolova Ransomware\""],"Korean":["misp-galaxy:ransomware=\"Korean\""],"Kostya Ransomware":["misp-galaxy:ransomware=\"Kostya Ransomware\""],"Kozy.Jozy":["misp-galaxy:ransomware=\"Kozy.Jozy\""],"QC":["misp-galaxy:ransomware=\"Kozy.Jozy\""],"Kraken Cryptor Ransomware":["misp-galaxy:ransomware=\"Kraken Cryptor Ransomware\""],"Kraken Ransomware":["misp-galaxy:ransomware=\"Kraken Ransomware\""],"KratosCrypt":["misp-galaxy:ransomware=\"KratosCrypt\""],"KryptoLocker":["misp-galaxy:ransomware=\"KryptoLocker\""],"L33TAF Locker Ransomware":["misp-galaxy:ransomware=\"L33TAF Locker Ransomware\""],"LK Encryption":["misp-galaxy:ransomware=\"LK Encryption\""],"LLTP Locker":["misp-galaxy:ransomware=\"LLTP Locker\""],"LambdaLocker Ransomware":["misp-galaxy:ransomware=\"LambdaLocker Ransomware\""],"LanRan":["misp-galaxy:ransomware=\"LanRan\""],"LeChiffre":["misp-galaxy:ransomware=\"LeChiffre\""],"Lick":["misp-galaxy:ransomware=\"Lick\""],"Linux.Encoder":["misp-galaxy:ransomware=\"Linux.Encoder\""],"Linux.Encoder.{0,3}":["misp-galaxy:ransomware=\"Linux.Encoder\""],"Lock2017 Ransomware":["misp-galaxy:ransomware=\"Lock2017 Ransomware\""],"Lock93 Ransomware":["misp-galaxy:ransomware=\"Lock93 Ransomware\""],"LockCrypt":["misp-galaxy:ransomware=\"LockCrypt\""],"LockLock":["misp-galaxy:ransomware=\"LockLock\""],"Locked-In Ransomware or NoValid Ransomware":["misp-galaxy:ransomware=\"Locked-In Ransomware or NoValid Ransomware\""],"Locker":["misp-galaxy:ransomware=\"Locker\""],"Lomix Ransomware":["misp-galaxy:ransomware=\"Lomix Ransomware\""],"Lortok":["misp-galaxy:ransomware=\"Lortok\""],"LoveLock Ransomware or Love2Lock Ransomware":["misp-galaxy:ransomware=\"LoveLock Ransomware or Love2Lock Ransomware\""],"LoveServer Ransomware ":["misp-galaxy:ransomware=\"LoveServer Ransomware \""],"LowLevel04":["misp-galaxy:ransomware=\"LowLevel04\""],"M4N1F3STO Ransomware (FAKE!!!!!)":["misp-galaxy:ransomware=\"M4N1F3STO Ransomware (FAKE!!!!!)\""],"M4N1F3STO":["misp-galaxy:ransomware=\"M4N1F3STO\""],"M@r1a ransomware":["misp-galaxy:ransomware=\"M@r1a ransomware\""],"M@r1a":["misp-galaxy:ransomware=\"M@r1a ransomware\""],"BlackHeart":["misp-galaxy:ransomware=\"M@r1a ransomware\""],"MC Ransomware":["misp-galaxy:ransomware=\"MC Ransomware\""],"MIRCOP":["misp-galaxy:ransomware=\"MIRCOP\""],"Crypt888":["misp-galaxy:ransomware=\"MIRCOP\""],"MM Locker":["misp-galaxy:ransomware=\"MM Locker\""],"MOTD Ransomware":["misp-galaxy:ransomware=\"MOTD Ransomware\""],"MSN CryptoLocker Ransomware":["misp-galaxy:ransomware=\"MSN CryptoLocker Ransomware\""],"MVP Ransomware":["misp-galaxy:ransomware=\"MVP Ransomware\""],"Mabouia":["misp-galaxy:ransomware=\"Mabouia\""],"MacAndChess":["misp-galaxy:ransomware=\"MacAndChess\""],"MafiaWare Ransomware":["misp-galaxy:ransomware=\"MafiaWare Ransomware\""],"Depsex Ransomware":["misp-galaxy:ransomware=\"MafiaWare Ransomware\""],"Magic":["misp-galaxy:ransomware=\"Magic\""],"Magniber Ransomware":["misp-galaxy:ransomware=\"Magniber Ransomware\""],"MaktubLocker":["misp-galaxy:ransomware=\"MaktubLocker\""],"Manifestus Ransomware ":["misp-galaxy:ransomware=\"Manifestus Ransomware \""],"Marlboro Ransomware":["misp-galaxy:ransomware=\"Marlboro Ransomware\""],"MarsJoke":["misp-galaxy:ransomware=\"MarsJoke\""],"MasterBuster Ransomware":["misp-galaxy:ransomware=\"MasterBuster Ransomware\""],"Matrix":["misp-galaxy:ransomware=\"Matrix\""],"Malta Ransomware":["misp-galaxy:ransomware=\"Matrix\""],"Matrix Ransomware":["misp-galaxy:ransomware=\"Matrix\""],"Meister":["misp-galaxy:ransomware=\"Meister\""],"Mercury Ransomware":["misp-galaxy:ransomware=\"Mercury Ransomware\""],"Merry Christmas":["misp-galaxy:ransomware=\"Merry Christmas\""],"Merry X-Mas":["misp-galaxy:ransomware=\"Merry Christmas\""],"MRCR":["misp-galaxy:ransomware=\"Merry Christmas\""],"Meteoritan":["misp-galaxy:ransomware=\"Meteoritan\""],"MireWare":["misp-galaxy:ransomware=\"MireWare\""],"Mischa":["misp-galaxy:ransomware=\"Mischa\""],"\"Petya's little brother\"":["misp-galaxy:ransomware=\"Mischa\""],"Mobef":["misp-galaxy:ransomware=\"Mobef\""],"Yakes":["misp-galaxy:ransomware=\"Mobef\""],"Mongo Lock":["misp-galaxy:ransomware=\"Mongo Lock\""],"Monument":["misp-galaxy:ransomware=\"Monument\""],"N-Splitter":["misp-galaxy:ransomware=\"N-Splitter\""],"NCrypt Ransomware":["misp-galaxy:ransomware=\"NCrypt Ransomware\""],"NMCRYPT Ransomware":["misp-galaxy:ransomware=\"NMCRYPT Ransomware\""],"NMoreia 2.0 Ransomware":["misp-galaxy:ransomware=\"NMoreia 2.0 Ransomware\""],"HakunaMatataRansomware":["misp-galaxy:ransomware=\"NMoreia 2.0 Ransomware\""],"NMoreira Ransomware":["misp-galaxy:ransomware=\"NMoreira Ransomware\""],"Fake Maktub Ransomware":["misp-galaxy:ransomware=\"NMoreira Ransomware\""],"NMoreira":["misp-galaxy:ransomware=\"NMoreira\""],"XRatTeam":["misp-galaxy:ransomware=\"NMoreira\""],"XPan":["misp-galaxy:ransomware=\"NMoreira\""],"Nagini Ransomware":["misp-galaxy:ransomware=\"Nagini Ransomware\""],"Voldemort Ransomware":["misp-galaxy:ransomware=\"Nagini Ransomware\""],"NemeS1S Ransomware":["misp-galaxy:ransomware=\"NemeS1S Ransomware\""],"Nemesis Ransomware":["misp-galaxy:ransomware=\"Nemesis Ransomware\""],"Nemucod":["misp-galaxy:ransomware=\"Nemucod\""],"Netflix Ransomware":["misp-galaxy:ransomware=\"Netflix Ransomware\""],"Netix":["misp-galaxy:ransomware=\"Netix\""],"RANSOM_NETIX.A":["misp-galaxy:ransomware=\"Netix\""],"Nhtnwcuf Ransomware (Fake)":["misp-galaxy:ransomware=\"Nhtnwcuf Ransomware (Fake)\""],"Nhtnwcuf":["misp-galaxy:ransomware=\"Nhtnwcuf\""],"NoobCrypt":["misp-galaxy:ransomware=\"NoobCrypt\""],"Nuke":["misp-galaxy:ransomware=\"Nuke\""],"Nullbyte":["misp-galaxy:ransomware=\"Nullbyte\""],"ODCODC":["misp-galaxy:ransomware=\"ODCODC\""],"OMG! Ransomware":["misp-galaxy:ransomware=\"OMG! Ransomware\""],"ONYX Ransomeware":["misp-galaxy:ransomware=\"ONYX Ransomeware\""],"OXAR":["misp-galaxy:ransomware=\"OXAR\""],"Ocelot Ransomware (FAKE RANSOMWARE)":["misp-galaxy:ransomware=\"Ocelot Ransomware (FAKE RANSOMWARE)\""],"Ocelot Locker Ransomware":["misp-galaxy:ransomware=\"Ocelot Ransomware (FAKE RANSOMWARE)\""],"Offline ransomware":["misp-galaxy:ransomware=\"Offline ransomware\""],"Vipasana":["misp-galaxy:ransomware=\"Offline ransomware\""],"Operation Global III":["misp-galaxy:ransomware=\"Operation Global III\""],"Outsider":["misp-galaxy:ransomware=\"Outsider\""],"Owl":["misp-galaxy:ransomware=\"Owl\""],"OzozaLocker Ransomware":["misp-galaxy:ransomware=\"OzozaLocker Ransomware\""],"PClock3 Ransomware":["misp-galaxy:ransomware=\"PClock3 Ransomware\""],"PClock SuppTeam Ransomware":["misp-galaxy:ransomware=\"PClock3 Ransomware\""],"WinPlock":["misp-galaxy:ransomware=\"PClock3 Ransomware\""],"CryptoLocker clone":["misp-galaxy:ransomware=\"PClock3 Ransomware\""],"PClock4 Ransomware":["misp-galaxy:ransomware=\"PClock4 Ransomware\""],"PClock SysGop Ransomware":["misp-galaxy:ransomware=\"PClock4 Ransomware\""],"PGPSnippet Ransomware":["misp-galaxy:ransomware=\"PGPSnippet Ransomware\""],"PICO Ransomware":["misp-galaxy:ransomware=\"PICO Ransomware\""],"Pico Ransomware":["misp-galaxy:ransomware=\"PICO Ransomware\""],"PRISM":["misp-galaxy:ransomware=\"PRISM\""],"PUBG Ransomware":["misp-galaxy:ransomware=\"PUBG Ransomware\""],"Padlock Screenlocker":["misp-galaxy:ransomware=\"Padlock Screenlocker\""],"Paradise Ransomware":["misp-galaxy:ransomware=\"Paradise Ransomware\""],"PayDOS Ransomware":["misp-galaxy:ransomware=\"PayDOS Ransomware\""],"Serpent Ransomware":["misp-galaxy:ransomware=\"PayDOS Ransomware\""],"PayDay Ransomware ":["misp-galaxy:ransomware=\"PayDay Ransomware \""],"PaySafeGen (German) Ransomware":["misp-galaxy:ransomware=\"PaySafeGen (German) Ransomware\""],"Paysafecard Generator 2016":["misp-galaxy:ransomware=\"PaySafeGen (German) Ransomware\""],"Pedcont":["misp-galaxy:ransomware=\"Pedcont\""],"PetrWrap Ransomware":["misp-galaxy:ransomware=\"PetrWrap Ransomware\""],"Goldeneye":["misp-galaxy:ransomware=\"Petya\""],"Philadelphia":["misp-galaxy:ransomware=\"Philadelphia\""],"Phobos":["misp-galaxy:ransomware=\"Phobos\""],"PicklesRansomware":["misp-galaxy:ransomware=\"PicklesRansomware\""],"PizzaCrypts":["misp-galaxy:ransomware=\"PizzaCrypts\""],"Planetary":["misp-galaxy:ransomware=\"Planetary\""],"PleaseRead Ransomware":["misp-galaxy:ransomware=\"PleaseRead Ransomware\""],"VHDLocker Ransomware":["misp-galaxy:ransomware=\"PleaseRead Ransomware\""],"PokemonGO":["misp-galaxy:ransomware=\"PokemonGO\""],"Polski Ransomware":["misp-galaxy:ransomware=\"Polski Ransomware\""],"PopCorn Time Ransomware":["misp-galaxy:ransomware=\"PopCorn Time Ransomware\""],"Potato Ransomware":["misp-galaxy:ransomware=\"Potato Ransomware\""],"PoshCoder":["misp-galaxy:ransomware=\"PowerWare\""],"PowerWorm":["misp-galaxy:ransomware=\"PowerWorm\""],"Princess Evolution":["misp-galaxy:ransomware=\"Princess Evolution\""],"Princess Locker":["misp-galaxy:ransomware=\"Princess Locker\""],"Project34 Ransomware":["misp-galaxy:ransomware=\"Project34 Ransomware\""],"ProposalCrypt Ransomware":["misp-galaxy:ransomware=\"ProposalCrypt Ransomware\""],"Ps2exe":["misp-galaxy:ransomware=\"Ps2exe\""],"PyCL Ransomware":["misp-galaxy:ransomware=\"PyCL Ransomware\""],"PyL33T Ransomware":["misp-galaxy:ransomware=\"PyL33T Ransomware\""],"Qwerty Ransomware":["misp-galaxy:ransomware=\"Qwerty Ransomware\""],"R":["misp-galaxy:ransomware=\"R\""],"R980":["misp-galaxy:ransomware=\"R980\""],"RAA encryptor":["misp-galaxy:ransomware=\"RAA encryptor\""],"RAA":["misp-galaxy:ransomware=\"RAA encryptor\""],"RASTAKHIZ":["misp-galaxy:ransomware=\"RASTAKHIZ\""],"RIP (Phoenix) Ransomware":["misp-galaxy:ransomware=\"RIP (Phoenix) Ransomware\""],"RSAUtil":["misp-galaxy:ransomware=\"RSAUtil\""],"Vagger":["misp-galaxy:ransomware=\"RSAUtil\""],"DONTSLIP":["misp-galaxy:ransomware=\"RSAUtil\""],"Rabion":["misp-galaxy:ransomware=\"Rabion\""],"Agent.iih":["misp-galaxy:ransomware=\"Rakhni\""],"Aura":["misp-galaxy:ransomware=\"Rakhni\""],"Autoit":["misp-galaxy:ransomware=\"Rakhni\""],"Pletor":["misp-galaxy:ransomware=\"Rakhni\""],"Lamer":["misp-galaxy:ransomware=\"Rakhni\""],"Isda":["misp-galaxy:ransomware=\"Rakhni\""],"Cryptokluchen":["misp-galaxy:ransomware=\"Rakhni\""],"Ramsomeer":["misp-galaxy:ransomware=\"Ramsomeer\""],"RanRan":["misp-galaxy:ransomware=\"RanRan\""],"Ranion RaasRansomware":["misp-galaxy:ransomware=\"Ranion RaasRansomware\""],"Rannoh":["misp-galaxy:ransomware=\"Rannoh\""],"Ransom32":["misp-galaxy:ransomware=\"Ransom32\""],"RansomLock":["misp-galaxy:ransomware=\"RansomLock\""],"RansomPlus":["misp-galaxy:ransomware=\"RansomPlus\""],"RarVault":["misp-galaxy:ransomware=\"RarVault\""],"Razy":["misp-galaxy:ransomware=\"Razy\""],"Rector":["misp-galaxy:ransomware=\"Rector\""],"RedAnts Ransomware":["misp-galaxy:ransomware=\"RedAnts Ransomware\""],"RedEye":["misp-galaxy:ransomware=\"RedEye\""],"RektLocker":["misp-galaxy:ransomware=\"RektLocker\""],"Rektware":["misp-galaxy:ransomware=\"Rektware\""],"RemindMe":["misp-galaxy:ransomware=\"RemindMe\""],"RenLocker Ransomware (FAKE)":["misp-galaxy:ransomware=\"RenLocker Ransomware (FAKE)\""],"Revenge Ransomware":["misp-galaxy:ransomware=\"Revenge Ransomware\""],"Reveton ransomware":["misp-galaxy:ransomware=\"Reveton ransomware\""],"RoshaLock":["misp-galaxy:ransomware=\"RoshaLock\""],"RotorCrypt(RotoCrypt, Tar) Ransomware":["misp-galaxy:ransomware=\"RotorCrypt(RotoCrypt, Tar) Ransomware\""],"Tar Ransomware":["misp-galaxy:ransomware=\"RotorCrypt(RotoCrypt, Tar) Ransomware\""],"RozaLocker Ransomware":["misp-galaxy:ransomware=\"RozaLocker Ransomware\""],"Runsomewere":["misp-galaxy:ransomware=\"Runsomewere\""],"Russian Globe Ransomware":["misp-galaxy:ransomware=\"Russian Globe Ransomware\""],"RussianRoulette":["misp-galaxy:ransomware=\"RussianRoulette\""],"Ryuk ransomware":["misp-galaxy:ransomware=\"Ryuk ransomware\""],"SADStory":["misp-galaxy:ransomware=\"SADStory\""],"SAVEfiles":["misp-galaxy:ransomware=\"SAVEfiles\""],"SNSLocker":["misp-galaxy:ransomware=\"SNSLocker\""],"SOREBRECT":["misp-galaxy:ransomware=\"SOREBRECT\""],"SQ_ Ransomware":["misp-galaxy:ransomware=\"SQ_ Ransomware\""],"VO_ Ransomware":["misp-galaxy:ransomware=\"SQ_ Ransomware\""],"SZFLocker":["misp-galaxy:ransomware=\"SZFLocker\""],"Sage 2.0 Ransomware":["misp-galaxy:ransomware=\"Sage 2.0 Ransomware\""],"Sage 2.2":["misp-galaxy:ransomware=\"Sage 2.2\""],"Sage Ransomware":["misp-galaxy:ransomware=\"Sage Ransomware\""],"Samas-Samsam":["misp-galaxy:ransomware=\"Samas-Samsam\""],"samsam.exe":["misp-galaxy:ransomware=\"Samas-Samsam\""],"MIKOPONI.exe":["misp-galaxy:ransomware=\"Samas-Samsam\""],"RikiRafael.exe":["misp-galaxy:ransomware=\"Samas-Samsam\""],"showmehowto.exe":["misp-galaxy:ransomware=\"Samas-Samsam\""],"SamSam Ransomware":["misp-galaxy:ransomware=\"Samas-Samsam\""],"Samsam":["misp-galaxy:ransomware=\"Samas-Samsam\""],"Sanction":["misp-galaxy:ransomware=\"Sanction\""],"Sanctions":["misp-galaxy:ransomware=\"Sanctions\""],"Sardoninir":["misp-galaxy:ransomware=\"Sardoninir\""],"Satan666 Ransomware":["misp-galaxy:ransomware=\"Satan666 Ransomware\""],"Scarab":["misp-galaxy:ransomware=\"Scarab\""],"Scraper":["misp-galaxy:ransomware=\"Scraper\""],"Seoirse Ransomware":["misp-galaxy:ransomware=\"Seoirse Ransomware\""],"SerbRansom 2017 Ransomware":["misp-galaxy:ransomware=\"SerbRansom 2017 Ransomware\""],"Serpent 2017 Ransomware":["misp-galaxy:ransomware=\"Serpent 2017 Ransomware\""],"Serpent Danish Ransomware":["misp-galaxy:ransomware=\"Serpent 2017 Ransomware\""],"Shark":["misp-galaxy:ransomware=\"Shark\"","misp-galaxy:rat=\"SharK\""],"Atom":["misp-galaxy:ransomware=\"Shark\""],"ShellLocker Ransomware":["misp-galaxy:ransomware=\"ShellLocker Ransomware\""],"ShinoLocker":["misp-galaxy:ransomware=\"ShinoLocker\""],"KinCrypt":["misp-galaxy:ransomware=\"Shujin\""],"ShurL0ckr":["misp-galaxy:ransomware=\"ShurL0ckr\""],"Sigma Ransomware":["misp-galaxy:ransomware=\"Sigma Ransomware\""],"Sigrun Ransomware":["misp-galaxy:ransomware=\"Sigrun Ransomware\""],"Simple_Encoder":["misp-galaxy:ransomware=\"Simple_Encoder\""],"SkidLocker":["misp-galaxy:ransomware=\"SkidLocker\""],"Pompous":["misp-galaxy:ransomware=\"SkidLocker\""],"SkyFile":["misp-galaxy:ransomware=\"SkyFile\""],"SkyName Ransomware":["misp-galaxy:ransomware=\"SkyName Ransomware\""],"Blablabla Ransomware":["misp-galaxy:ransomware=\"SkyName Ransomware\""],"Slimhem Ransomware":["misp-galaxy:ransomware=\"Slimhem Ransomware\""],"Smash!":["misp-galaxy:ransomware=\"Smash!\""],"Smrss32":["misp-galaxy:ransomware=\"Smrss32\""],"Sodinokibi":["misp-galaxy:ransomware=\"Sodinokibi\""],"Spartacus Ransomware":["misp-galaxy:ransomware=\"Spartacus Ransomware\""],"Spora Ransomware":["misp-galaxy:ransomware=\"Spora Ransomware\""],"Sport":["misp-galaxy:ransomware=\"Sport\"","misp-galaxy:sector=\"Sport\""],"Stampado":["misp-galaxy:ransomware=\"Stampado\""],"StorageCrypt":["misp-galaxy:ransomware=\"StorageCrypt\""],"StorageCrypter":["misp-galaxy:ransomware=\"StorageCrypter\""],"Strictor":["misp-galaxy:ransomware=\"Strictor\""],"SuchSecurity Ransomware":["misp-galaxy:ransomware=\"SuchSecurity Ransomware\""],"SureRansom Ransomeware (Fake)":["misp-galaxy:ransomware=\"SureRansom Ransomeware (Fake)\""],"Surprise":["misp-galaxy:ransomware=\"Surprise\""],"Survey":["misp-galaxy:ransomware=\"Survey\""],"Syn Ack":["misp-galaxy:ransomware=\"SynAck\""],"SynoLocker":["misp-galaxy:ransomware=\"SynoLocker\""],"TYRANT":["misp-galaxy:ransomware=\"TYRANT\""],"Crypto Tyrant":["misp-galaxy:ransomware=\"TYRANT\""],"TeamXrat":["misp-galaxy:ransomware=\"TeamXrat\""],"Telecrypt Ransomware":["misp-galaxy:ransomware=\"Telecrypt Ransomware\""],"Tellyouthepass":["misp-galaxy:ransomware=\"Tellyouthepass\""],"Termite Ransomware":["misp-galaxy:ransomware=\"Termite Ransomware\""],"TeslaCrypt 0.x - 2.2.0":["misp-galaxy:ransomware=\"TeslaCrypt 0.x - 2.2.0\""],"AlphaCrypt":["misp-galaxy:ransomware=\"TeslaCrypt 0.x - 2.2.0\""],"TeslaCrypt 3.0+":["misp-galaxy:ransomware=\"TeslaCrypt 3.0+\""],"TeslaCrypt 4.1A":["misp-galaxy:ransomware=\"TeslaCrypt 4.1A\""],"TeslaCrypt 4.2":["misp-galaxy:ransomware=\"TeslaCrypt 4.2\""],"Thanksgiving Ransomware":["misp-galaxy:ransomware=\"Thanksgiving Ransomware\""],"Threat Finder":["misp-galaxy:ransomware=\"Threat Finder\""],"Crypt0L0cker":["misp-galaxy:ransomware=\"TorrentLocker\""],"Teerac":["misp-galaxy:ransomware=\"TorrentLocker\""],"TowerWeb":["misp-galaxy:ransomware=\"TowerWeb\""],"Toxcrypt":["misp-galaxy:ransomware=\"Toxcrypt\""],"Trojan Dz":["misp-galaxy:ransomware=\"Trojan Dz\""],"Trojan":["misp-galaxy:ransomware=\"Trojan\""],"BrainCrypt":["misp-galaxy:ransomware=\"Trojan\""],"Troldesh orShade, XTBL":["misp-galaxy:ransomware=\"Troldesh orShade, XTBL\""],"Tron ransomware":["misp-galaxy:ransomware=\"Tron ransomware\""],"TrueCrypter":["misp-galaxy:ransomware=\"TrueCrypter\""],"TrumpLocker Ransomware":["misp-galaxy:ransomware=\"TrumpLocker Ransomware\""],"Turkish FileEncryptor Ransomware":["misp-galaxy:ransomware=\"Turkish FileEncryptor Ransomware\""],"Fake CTB-Locker":["misp-galaxy:ransomware=\"Turkish FileEncryptor Ransomware\""],"Turkish Ransom":["misp-galaxy:ransomware=\"Turkish Ransom\""],"Turkish":["misp-galaxy:ransomware=\"Turkish\""],"Uiwix Ransomware":["misp-galaxy:ransomware=\"Uiwix Ransomware\""],"UltraLocker Ransomware":["misp-galaxy:ransomware=\"UltraLocker Ransomware\""],"UmbreCrypt":["misp-galaxy:ransomware=\"UmbreCrypt\""],"UnblockUPC":["misp-galaxy:ransomware=\"UnblockUPC\""],"Ungluk":["misp-galaxy:ransomware=\"Ungluk\""],"Unlock26 Ransomware":["misp-galaxy:ransomware=\"Unlock26 Ransomware\""],"Unlock92 ":["misp-galaxy:ransomware=\"Unlock92 \""],"Unnamed Android Ransomware":["misp-galaxy:ransomware=\"Unnamed Android Ransomware\""],"Unnamed ramsomware 1":["misp-galaxy:ransomware=\"Unnamed ramsomware 1\""],"Unnamed ramsomware 2":["misp-galaxy:ransomware=\"Unnamed ramsomware 2\""],"UpdateHost Ransomware":["misp-galaxy:ransomware=\"UpdateHost Ransomware\""],"UserFilesLocker Ransomware":["misp-galaxy:ransomware=\"UserFilesLocker Ransomware\""],"CzechoSlovak Ransomware":["misp-galaxy:ransomware=\"UserFilesLocker Ransomware\""],"V8Locker Ransomware":["misp-galaxy:ransomware=\"V8Locker Ransomware\""],"VBRANSOM 7":["misp-galaxy:ransomware=\"VBRANSOM 7\""],"Vanguard Ransomware":["misp-galaxy:ransomware=\"Vanguard Ransomware\""],"VapeLauncher":["misp-galaxy:ransomware=\"VapeLauncher\""],"Vapor Ransomware":["misp-galaxy:ransomware=\"Vapor Ransomware\""],"VaultCrypt":["misp-galaxy:ransomware=\"VaultCrypt\"","misp-galaxy:ransomware=\"Zlader\""],"CrypVault":["misp-galaxy:ransomware=\"VaultCrypt\"","misp-galaxy:ransomware=\"Zlader\""],"Zlader":["misp-galaxy:ransomware=\"VaultCrypt\"","misp-galaxy:ransomware=\"Zlader\""],"Venis Ransomware":["misp-galaxy:ransomware=\"Venis Ransomware\""],"VenusLocker":["misp-galaxy:ransomware=\"VenusLocker\""],"VindowsLocker Ransomware":["misp-galaxy:ransomware=\"VindowsLocker Ransomware\""],"Virlock":["misp-galaxy:ransomware=\"Virlock\""],"Virus-Encoder":["misp-galaxy:ransomware=\"Virus-Encoder\""],"CrySiS":["misp-galaxy:ransomware=\"Virus-Encoder\""],"Vortex Ransomware":["misp-galaxy:ransomware=\"Vortex Ransomware\""],"\u0166l\u0e4ft\u0454\u0433\u0e04 \u0433\u0e04\u0e20\u0e23\u0e4f\u0e53\u0e2c\u0e04\u0433\u0454":["misp-galaxy:ransomware=\"Vortex Ransomware\""],"Vurten":["misp-galaxy:ransomware=\"Vurten\""],"VxLock Ransomware":["misp-galaxy:ransomware=\"VxLock Ransomware\""],"WannaCrypt":["misp-galaxy:ransomware=\"WannaCry\""],"WCrypt":["misp-galaxy:ransomware=\"WannaCry\""],"WCRY":["misp-galaxy:ransomware=\"WannaCry\""],"WannaSmile":["misp-galaxy:ransomware=\"WannaSmile\""],"Wcry Ransomware":["misp-galaxy:ransomware=\"Wcry Ransomware\""],"WeChat Ransom":["misp-galaxy:ransomware=\"WeChat Ransom\""],"UNNAMED1989":["misp-galaxy:ransomware=\"WeChat Ransom\""],"WhiteRose":["misp-galaxy:ransomware=\"WhiteRose\""],"WickedLocker HT Ransomware":["misp-galaxy:ransomware=\"WickedLocker HT Ransomware\""],"WildFire Locker":["misp-galaxy:ransomware=\"WildFire Locker\""],"Hades Locker":["misp-galaxy:ransomware=\"WildFire Locker\""],"WinRarer Ransomware":["misp-galaxy:ransomware=\"WinRarer Ransomware\""],"Windows_Security Ransonware":["misp-galaxy:ransomware=\"Windows_Security Ransonware\""],"WS Go Ransonware":["misp-galaxy:ransomware=\"Windows_Security Ransonware\""],"Winnix Cryptor Ransomware":["misp-galaxy:ransomware=\"Winnix Cryptor Ransomware\""],"X-Files":["misp-galaxy:ransomware=\"X-Files\""],"X3M Ransomware":["misp-galaxy:ransomware=\"X3M Ransomware\""],"XCrypt Ransomware":["misp-galaxy:ransomware=\"XCrypt Ransomware\""],"XRTN ":["misp-galaxy:ransomware=\"XRTN \""],"XTPLocker 5.0 Ransomware":["misp-galaxy:ransomware=\"XTPLocker 5.0 Ransomware\""],"XYZWare Ransomware":["misp-galaxy:ransomware=\"XYZWare Ransomware\""],"XiaoBa ransomware":["misp-galaxy:ransomware=\"XiaoBa ransomware\""],"Xolzsec":["misp-galaxy:ransomware=\"Xolzsec\""],"Xorist":["misp-galaxy:ransomware=\"Xorist\""],"YYTO Ransomware":["misp-galaxy:ransomware=\"YYTO Ransomware\""],"You Have Been Hacked!!!":["misp-galaxy:ransomware=\"You Have Been Hacked!!!\""],"YouAreFucked Ransomware":["misp-galaxy:ransomware=\"YouAreFucked Ransomware\""],"YourRansom Ransomware":["misp-galaxy:ransomware=\"YourRansom Ransomware\""],"ZXZ Ramsomware":["misp-galaxy:ransomware=\"ZXZ Ramsomware\""],"Zcrypt":["misp-galaxy:ransomware=\"Zcrypt\""],"Zcryptor":["misp-galaxy:ransomware=\"Zcrypt\""],"ZekwaCrypt Ransomware":["misp-galaxy:ransomware=\"ZekwaCrypt Ransomware\""],"Zenis Ransomware":["misp-galaxy:ransomware=\"Zenis Ransomware\""],"ZeroCrypt Ransomware":["misp-galaxy:ransomware=\"ZeroCrypt Ransomware\""],"Zimbra":["misp-galaxy:ransomware=\"Zimbra\""],"ZinoCrypt Ransomware":["misp-galaxy:ransomware=\"ZinoCrypt Ransomware\""],"Russian":["misp-galaxy:ransomware=\"Zlader\""],"Zorro":["misp-galaxy:ransomware=\"Zorro\""],"Zyka Ransomware":["misp-galaxy:ransomware=\"Zyka Ransomware\""],"encryptoJJS":["misp-galaxy:ransomware=\"encryptoJJS\""],"garrantydecrypt":["misp-galaxy:ransomware=\"garrantydecrypt\""],"iLock":["misp-galaxy:ransomware=\"iLock\""],"iLockLight":["misp-galaxy:ransomware=\"iLockLight\""],"iRansom":["misp-galaxy:ransomware=\"iRansom\""],"n1n1n1":["misp-galaxy:ransomware=\"n1n1n1\""],"of Ransomware: OpenToYou (Formerly known as OpenToDecrypt)":["misp-galaxy:ransomware=\"of Ransomware: OpenToYou (Formerly known as OpenToDecrypt)\""],"qkG":["misp-galaxy:ransomware=\"qkG\""],"vxLock":["misp-galaxy:ransomware=\"vxLock\""],"zScreenLocker Ransomware":["misp-galaxy:ransomware=\"zScreenLocker Ransomware\""],"5p00f3r.N$ RAT":["misp-galaxy:rat=\"5p00f3r.N$ RAT\""],"9002":["misp-galaxy:rat=\"9002\""],"A32s RAT":["misp-galaxy:rat=\"A32s RAT\""],"A4Zeta":["misp-galaxy:rat=\"A4Zeta\""],"Adwind RAT":["misp-galaxy:rat=\"Adwind RAT\""],"UNiversal REmote COntrol Multi-Platform":["misp-galaxy:rat=\"Adwind RAT\""],"Adzok":["misp-galaxy:rat=\"Adzok\""],"AeroAdmin":["misp-galaxy:rat=\"AeroAdmin\""],"AhNyth Android":["misp-galaxy:rat=\"AhNyth Android\""],"Ahtapod":["misp-galaxy:rat=\"Ahtapod\""],"Albertino Advanced RAT":["misp-galaxy:rat=\"Albertino Advanced RAT\""],"Ammyy Admin":["misp-galaxy:rat=\"Ammyy Admin\""],"Ammyy":["misp-galaxy:rat=\"Ammyy Admin\""],"Androrat":["misp-galaxy:rat=\"Androrat\""],"AnyDesk":["misp-galaxy:rat=\"AnyDesk\""],"Arabian-Attacker RAT":["misp-galaxy:rat=\"Arabian-Attacker RAT\""],"Archelaus Beta":["misp-galaxy:rat=\"Archelaus Beta\""],"Arcom":["misp-galaxy:rat=\"Arcom\""],"Arctic R.A.T.":["misp-galaxy:rat=\"Arctic R.A.T.\""],"Artic":["misp-galaxy:rat=\"Arctic R.A.T.\""],"Assassin":["misp-galaxy:rat=\"Assassin\""],"Atelier Web Remote Commander":["misp-galaxy:rat=\"Atelier Web Remote Commander\""],"BBS RAT":["misp-galaxy:rat=\"BBS RAT\""],"BD Y3K RAT":["misp-galaxy:rat=\"BD Y3K RAT\""],"Back Door Y3K RAT":["misp-galaxy:rat=\"BD Y3K RAT\""],"Y3k":["misp-galaxy:rat=\"BD Y3K RAT\""],"BX":["misp-galaxy:rat=\"BX\""],"Babylon":["misp-galaxy:rat=\"Babylon\""],"Back Orifice 2000":["misp-galaxy:rat=\"Back Orifice 2000\""],"BO2k":["misp-galaxy:rat=\"Back Orifice 2000\""],"Back Orifice":["misp-galaxy:rat=\"Back Orifice\""],"BO":["misp-galaxy:rat=\"Back Orifice\""],"Bandook RAT":["misp-galaxy:rat=\"Bandook RAT\""],"Batch NET":["misp-galaxy:rat=\"Batch NET\""],"BeamYourScreen":["misp-galaxy:rat=\"BeamYourScreen\""],"Beast Trojan":["misp-galaxy:rat=\"Beast Trojan\""],"Bifrost":["misp-galaxy:rat=\"Bifrost\""],"Biodox":["misp-galaxy:rat=\"Biodox\""],"BlackNix":["misp-galaxy:rat=\"BlackNix\""],"Blackshades":["misp-galaxy:rat=\"Blackshades\"","misp-galaxy:tool=\"Blackshades\""],"Blizzard":["misp-galaxy:rat=\"Blizzard\""],"Blue Banana":["misp-galaxy:rat=\"Blue Banana\""],"Brat":["misp-galaxy:rat=\"Brat\""],"CIA RAT":["misp-galaxy:rat=\"CIA RAT\""],"CTOS":["misp-galaxy:rat=\"CTOS\""],"Caesar RAT":["misp-galaxy:rat=\"Caesar RAT\""],"Cardinal":["misp-galaxy:rat=\"Cardinal\""],"Casa RAT":["misp-galaxy:rat=\"Casa RAT\""],"Cerberus RAT":["misp-galaxy:rat=\"Cerberus RAT\""],"Char0n":["misp-galaxy:rat=\"Char0n\""],"Chrome Remote Desktop":["misp-galaxy:rat=\"Chrome Remote Desktop\""],"ClientMesh":["misp-galaxy:rat=\"ClientMesh\""],"Coldroot":["misp-galaxy:rat=\"Coldroot\""],"Comodo Unite":["misp-galaxy:rat=\"Comodo Unite\""],"CrossRat":["misp-galaxy:rat=\"CrossRat\""],"Cyber Eye RAT":["misp-galaxy:rat=\"Cyber Eye RAT\""],"DameWare Mini Remote Control":["misp-galaxy:rat=\"DameWare Mini Remote Control\""],"dameware":["misp-galaxy:rat=\"DameWare Mini Remote Control\""],"Dark DDoSeR":["misp-galaxy:rat=\"Dark DDoSeR\""],"Dark Comet":["misp-galaxy:rat=\"DarkComet\"","misp-galaxy:tool=\"Dark Comet\""],"DarkMoon":["misp-galaxy:rat=\"DarkMoon\""],"Dark Moon":["misp-galaxy:rat=\"DarkMoon\""],"DarkRat":["misp-galaxy:rat=\"DarkRat\""],"DarkRAT":["misp-galaxy:rat=\"DarkRat\""],"DarkTrack":["misp-galaxy:rat=\"DarkTrack\""],"Darknet RAT":["misp-galaxy:rat=\"Darknet RAT\""],"Dark NET RAT":["misp-galaxy:rat=\"Darknet RAT\""],"Deeper RAT":["misp-galaxy:rat=\"Deeper RAT\""],"DesktopNow":["misp-galaxy:rat=\"DesktopNow\""],"Erebus":["misp-galaxy:rat=\"Erebus\""],"FINSPY":["misp-galaxy:rat=\"FINSPY\"","misp-galaxy:tool=\"FINSPY\""],"Felipe":["misp-galaxy:rat=\"Felipe\""],"Felismus RAT":["misp-galaxy:rat=\"Felismus RAT\""],"FlawedAmmy":["misp-galaxy:rat=\"FlawedAmmy\""],"GOlden Phoenix":["misp-galaxy:rat=\"GOlden Phoenix\""],"Ucul":["misp-galaxy:rat=\"Ghost\""],"GraphicBooting":["misp-galaxy:rat=\"GraphicBooting\""],"Greame":["misp-galaxy:rat=\"Greame\""],"Greek Hackers RAT":["misp-galaxy:rat=\"Greek Hackers RAT\""],"H-w0rm":["misp-galaxy:rat=\"H-w0rm\""],"H-worm":["misp-galaxy:rat=\"H-worm\""],"HTTP WEB BACKDOOR":["misp-galaxy:rat=\"HTTP WEB BACKDOOR\""],"Hallaj PRO RAT":["misp-galaxy:rat=\"Hallaj PRO RAT\""],"Hav-RAT":["misp-galaxy:rat=\"Hav-RAT\""],"HawkEye":["misp-galaxy:rat=\"HawkEye\""],"Heseber":["misp-galaxy:rat=\"Heseber\""],"Imminent Monitor":["misp-galaxy:rat=\"Imminent Monitor\""],"Indetectables RAT":["misp-galaxy:rat=\"Indetectables RAT\""],"JCage":["misp-galaxy:rat=\"JCage\""],"Jfect":["misp-galaxy:rat=\"Jfect\""],"Kazybot":["misp-galaxy:rat=\"Kazybot\""],"KhRAT":["misp-galaxy:rat=\"KhRAT\""],"Kiler RAT":["misp-galaxy:rat=\"Kiler RAT\""],"Njw0rm":["misp-galaxy:rat=\"Kiler RAT\"","misp-galaxy:rat=\"NJRat\""],"Killer RAT":["misp-galaxy:rat=\"Killer RAT\""],"KjW0rm":["misp-galaxy:rat=\"KjW0rm\"","misp-galaxy:tool=\"KjW0rm\""],"Lanfiltrator":["misp-galaxy:rat=\"Lanfiltrator\""],"LeGeNd":["misp-galaxy:rat=\"LeGeNd\""],"LiteManager":["misp-galaxy:rat=\"LiteManager\""],"Loki RAT":["misp-galaxy:rat=\"Loki RAT\""],"LokiTech":["misp-galaxy:rat=\"LokiTech\""],"Lost Door":["misp-galaxy:rat=\"Lost Door\""],"LostDoor":["misp-galaxy:rat=\"Lost Door\""],"Luminosity Link":["misp-galaxy:rat=\"Luminosity Link\""],"LuxNET":["misp-galaxy:rat=\"LuxNET\""],"MINI-MO":["misp-galaxy:rat=\"MINI-MO\""],"MLRat":["misp-galaxy:rat=\"MLRat\""],"MRA RAT":["misp-galaxy:rat=\"MRA RAT\""],"MadRAT":["misp-galaxy:rat=\"MadRAT\""],"Mangit":["misp-galaxy:rat=\"Mangit\""],"Matryoshka":["misp-galaxy:rat=\"Matryoshka\"","misp-galaxy:tool=\"Matryoshka\""],"Mega":["misp-galaxy:rat=\"Mega\""],"MegaTrojan":["misp-galaxy:rat=\"MegaTrojan\""],"Minimo":["misp-galaxy:rat=\"Minimo\""],"MoSucker":["misp-galaxy:rat=\"MoSucker\""],"MofoTro":["misp-galaxy:rat=\"MofoTro\""],"NET-MONITOR PRO":["misp-galaxy:rat=\"NET-MONITOR PRO\""],"NJRat":["misp-galaxy:rat=\"NJRat\""],"Net Devil":["misp-galaxy:rat=\"Net Devil\""],"NetDevil":["misp-galaxy:rat=\"Net Devil\"","misp-galaxy:rat=\"NetDevil\""],"Netbus":["misp-galaxy:rat=\"Netbus\""],"NetBus":["misp-galaxy:rat=\"Netbus\""],"Netsupport Manager":["misp-galaxy:rat=\"Netsupport Manager\""],"Netwire":["misp-galaxy:rat=\"Netwire\""],"NewCore":["misp-galaxy:rat=\"NewCore\""],"Nova":["misp-galaxy:rat=\"Nova\""],"Nuclear RAT":["misp-galaxy:rat=\"Nuclear RAT\""],"NukeSped":["misp-galaxy:rat=\"NukeSped\""],"Nytro":["misp-galaxy:rat=\"Nytro\""],"Offence":["misp-galaxy:rat=\"Offence\""],"Optix Pro":["misp-galaxy:rat=\"Optix Pro\""],"Orcus":["misp-galaxy:rat=\"Orcus\""],"Ozone":["misp-galaxy:rat=\"Ozone\""],"P. Storrie RAT":["misp-galaxy:rat=\"P. Storrie RAT\""],"P.Storrie RAT":["misp-galaxy:rat=\"P. Storrie RAT\""],"Pain RAT":["misp-galaxy:rat=\"Pain RAT\""],"Pandora":["misp-galaxy:rat=\"Pandora\""],"Paradox":["misp-galaxy:rat=\"Paradox\""],"Parasite-HTTP-RAT":["misp-galaxy:rat=\"Parasite-HTTP-RAT\""],"PentagonRAT":["misp-galaxy:rat=\"PentagonRAT\""],"Plasma RAT":["misp-galaxy:rat=\"Plasma RAT\""],"Pocket RAT":["misp-galaxy:rat=\"Pocket RAT\""],"Backdoor.Win32.PoisonIvy":["misp-galaxy:rat=\"PoisonIvy\"","misp-galaxy:tool=\"Poison Ivy\""],"Gen:Trojan.Heur.PT":["misp-galaxy:rat=\"PoisonIvy\"","misp-galaxy:tool=\"Poison Ivy\""],"PowerRAT":["misp-galaxy:rat=\"PowerRAT\""],"PredatorPain":["misp-galaxy:rat=\"Predator Pain\""],"ProRat":["misp-galaxy:rat=\"ProRat\""],"Punisher RAT":["misp-galaxy:rat=\"Punisher RAT\""],"Qarallax":["misp-galaxy:rat=\"Qarallax\""],"qrat":["misp-galaxy:rat=\"Qarallax\"","misp-galaxy:tool=\"qrat\""],"Quaverse":["misp-galaxy:rat=\"Quaverse\""],"QRAT":["misp-galaxy:rat=\"Quaverse\""],"RATAttack":["misp-galaxy:rat=\"RATAttack\""],"RWX RAT":["misp-galaxy:rat=\"RWX RAT\""],"RaTRon":["misp-galaxy:rat=\"RaTRon\""],"RealVNC":["misp-galaxy:rat=\"RealVNC\""],"VNC Connect":["misp-galaxy:rat=\"RealVNC\""],"VNC Viewer":["misp-galaxy:rat=\"RealVNC\""],"Remote Utilities":["misp-galaxy:rat=\"Remote Utilities\""],"RemotePC":["misp-galaxy:rat=\"RemotePC\""],"RevCode":["misp-galaxy:rat=\"RevCode\""],"Revenge-RAT":["misp-galaxy:rat=\"Revenge-RAT\""],"Rottie3":["misp-galaxy:rat=\"Rottie3\""],"Sandro RAT":["misp-galaxy:rat=\"Sandro RAT\""],"Schwarze-Sonne-RAT":["misp-galaxy:rat=\"Schwarze-Sonne-RAT\""],"SS-RAT":["misp-galaxy:rat=\"Schwarze-Sonne-RAT\""],"Schwarze Sonne":["misp-galaxy:rat=\"Schwarze-Sonne-RAT\""],"Seecreen":["misp-galaxy:rat=\"Seecreen\""],"Firnass":["misp-galaxy:rat=\"Seecreen\""],"Seed RAT":["misp-galaxy:rat=\"Seed RAT\""],"Setro":["misp-galaxy:rat=\"Setro\""],"SharK":["misp-galaxy:rat=\"SharK\""],"SHARK":["misp-galaxy:rat=\"SharK\""],"SharpBot":["misp-galaxy:rat=\"SharpBot\""],"SharpEye":["misp-galaxy:rat=\"SharpEye\""],"ShowMyPC":["misp-galaxy:rat=\"ShowMyPC\""],"Sky Wyder":["misp-galaxy:rat=\"Sky Wyder\""],"Small-Net":["misp-galaxy:rat=\"Small-Net\""],"SmallNet":["misp-galaxy:rat=\"Small-Net\""],"Snoopy":["misp-galaxy:rat=\"Snoopy\""],"Snowdoor":["misp-galaxy:rat=\"Snowdoor\""],"Backdoor.Blizzard":["misp-galaxy:rat=\"Snowdoor\""],"Backdoor.Fxdoor":["misp-galaxy:rat=\"Snowdoor\""],"Backdoor.Snowdoor":["misp-galaxy:rat=\"Snowdoor\""],"Backdoor:Win32\/Snowdoor":["misp-galaxy:rat=\"Snowdoor\""],"Socket23":["misp-galaxy:rat=\"Socket23\""],"SocketPlayer":["misp-galaxy:rat=\"SocketPlayer\""],"Sparta RAT":["misp-galaxy:rat=\"Sparta RAT\""],"SpyCronic":["misp-galaxy:rat=\"SpyCronic\""],"SpyGate":["misp-galaxy:rat=\"SpyGate\""],"Spymaster Pro":["misp-galaxy:rat=\"Spymaster Pro\""],"Spynet":["misp-galaxy:rat=\"Spynet\""],"Sub7":["misp-galaxy:rat=\"Sub7\""],"SubSeven":["misp-galaxy:rat=\"Sub7\""],"Sub7Server":["misp-galaxy:rat=\"Sub7\""],"Syla":["misp-galaxy:rat=\"Syla\""],"Syndrome RAT":["misp-galaxy:rat=\"Syndrome RAT\""],"TINY":["misp-galaxy:rat=\"TINY\""],"TSCookieRAT":["misp-galaxy:rat=\"TSCookieRAT\""],"TeamViewer":["misp-galaxy:rat=\"TeamViewer\""],"Tequila Bandita":["misp-galaxy:rat=\"Tequila Bandita\""],"TheFat RAT":["misp-galaxy:rat=\"TheFat RAT\""],"TheOneSpy":["misp-galaxy:rat=\"TheOneSpy\""],"Theef":["misp-galaxy:rat=\"Theef\""],"Toquito Bandito":["misp-galaxy:rat=\"Toquito Bandito\""],"TorCT PHP RAT":["misp-galaxy:rat=\"TorCT PHP RAT\""],"Trochilus":["misp-galaxy:rat=\"Trochilus\"","misp-galaxy:tool=\"Trochilus\""],"Turkojan":["misp-galaxy:rat=\"Turkojan\""],"UNITEDRAKE":["misp-galaxy:rat=\"UNITEDRAKE\""],"Ultra VNC":["misp-galaxy:rat=\"Ultra VNC\""],"Vanguard":["misp-galaxy:rat=\"Vanguard\""],"Vantom":["misp-galaxy:rat=\"Vantom\""],"Venomous Ivy":["misp-galaxy:rat=\"Venomous Ivy\""],"Virus RAT":["misp-galaxy:rat=\"Virus RAT\""],"VorteX":["misp-galaxy:rat=\"VorteX\""],"Vortex":["misp-galaxy:rat=\"Vortex\""],"WiRAT":["misp-galaxy:rat=\"WiRAT\""],"Win32.HsIdir":["misp-galaxy:rat=\"Win32.HsIdir\""],"Windows Remote Desktop":["misp-galaxy:rat=\"Windows Remote Desktop\""],"Xanity":["misp-galaxy:rat=\"Xanity\""],"Xena":["misp-galaxy:rat=\"Xena\""],"Xpert":["misp-galaxy:rat=\"Xpert\""],"Xploit":["misp-galaxy:rat=\"Xploit\""],"Xsser":["misp-galaxy:rat=\"Xsser\""],"mRAT":["misp-galaxy:rat=\"Xsser\""],"XtremeRAT":["misp-galaxy:rat=\"XtremeRAT\""],"Xyligan":["misp-galaxy:rat=\"Xyligan\""],"ZOMBIE SLAYER":["misp-galaxy:rat=\"ZOMBIE SLAYER\""],"death":["misp-galaxy:rat=\"death\""],"drat":["misp-galaxy:rat=\"drat\""],"JacksBot":["misp-galaxy:rat=\"jRAT\""],"joanap":["misp-galaxy:rat=\"joanap\""],"join.me":["misp-galaxy:rat=\"join.me\""],"miniRAT":["misp-galaxy:rat=\"miniRAT\""],"rokrat":["misp-galaxy:rat=\"rokrat\""],"vjw0rm 0.1":["misp-galaxy:rat=\"vjw0rm 0.1\""],"xHacker Pro RAT":["misp-galaxy:rat=\"xHacker Pro RAT\""],"Academia - University":["misp-galaxy:sector=\"Academia - University\""],"Accounting":["misp-galaxy:sector=\"Accounting\""],"Activists":["misp-galaxy:sector=\"Activists\""],"Advertising":["misp-galaxy:sector=\"Advertising\""],"Aerospace":["misp-galaxy:sector=\"Aerospace\""],"Agriculture":["misp-galaxy:sector=\"Agriculture\""],"Arts":["misp-galaxy:sector=\"Arts\""],"Automotive":["misp-galaxy:sector=\"Automotive\""],"Bank":["misp-galaxy:sector=\"Bank\""],"Biomedical":["misp-galaxy:sector=\"Biomedical\""],"Casino":["misp-galaxy:sector=\"Casino\""],"Chemical":["misp-galaxy:sector=\"Chemical\""],"Citizens":["misp-galaxy:sector=\"Citizens\""],"Civil Aviation":["misp-galaxy:sector=\"Civil Aviation\""],"Civil society":["misp-galaxy:sector=\"Civil society\""],"Communication equipment":["misp-galaxy:sector=\"Communication equipment\""],"Construction":["misp-galaxy:sector=\"Construction\""],"Consulting":["misp-galaxy:sector=\"Consulting\""],"Country":["misp-galaxy:sector=\"Country\""],"Culture":["misp-galaxy:sector=\"Culture\""],"DNS service provider":["misp-galaxy:sector=\"DNS service provider\""],"Data Broker":["misp-galaxy:sector=\"Data Broker\""],"Defense":["misp-galaxy:sector=\"Defense\""],"Development":["misp-galaxy:sector=\"Development\""],"Digital infrastructure":["misp-galaxy:sector=\"Digital infrastructure\""],"Digital services":["misp-galaxy:sector=\"Digital services\""],"Diplomacy":["misp-galaxy:sector=\"Diplomacy\""],"Dissidents":["misp-galaxy:sector=\"Dissidents\""],"Education":["misp-galaxy:sector=\"Education\""],"Electric":["misp-galaxy:sector=\"Electric\""],"Electronic":["misp-galaxy:sector=\"Electronic\""],"Employment":["misp-galaxy:sector=\"Employment\""],"Energy":["misp-galaxy:sector=\"Energy\""],"Entertainment":["misp-galaxy:sector=\"Entertainment\""],"Environment":["misp-galaxy:sector=\"Environment\""],"Finance":["misp-galaxy:sector=\"Finance\""],"Food":["misp-galaxy:sector=\"Food\""],"Game":["misp-galaxy:sector=\"Game\""],"Gas":["misp-galaxy:sector=\"Gas\""],"Government, Administration":["misp-galaxy:sector=\"Government, Administration\""],"Health":["misp-galaxy:sector=\"Health\""],"High tech":["misp-galaxy:sector=\"High tech\""],"Higher education":["misp-galaxy:sector=\"Higher education\""],"Hospitality":["misp-galaxy:sector=\"Hospitality\""],"Hotels":["misp-galaxy:sector=\"Hotels\""],"IT - Hacker":["misp-galaxy:sector=\"IT - Hacker\""],"IT - ISP":["misp-galaxy:sector=\"IT - ISP\""],"IT - Security":["misp-galaxy:sector=\"IT - Security\""],"IT":["misp-galaxy:sector=\"IT\""],"Immigration":["misp-galaxy:sector=\"Immigration\""],"Industrial":["misp-galaxy:sector=\"Industrial\""],"Infrastructure":["misp-galaxy:sector=\"Infrastructure\""],"Insurance":["misp-galaxy:sector=\"Insurance\""],"Intelligence":["misp-galaxy:sector=\"Intelligence\""],"Investment":["misp-galaxy:sector=\"Investment\""],"Islamic forums":["misp-galaxy:sector=\"Islamic forums\""],"Islamic organisation":["misp-galaxy:sector=\"Islamic organisation\""],"Journalist":["misp-galaxy:sector=\"Journalist\""],"Justice":["misp-galaxy:sector=\"Justice\""],"Lawyers":["misp-galaxy:sector=\"Lawyers\""],"Legal":["misp-galaxy:sector=\"Legal\""],"Life science":["misp-galaxy:sector=\"Life science\""],"Logistic":["misp-galaxy:sector=\"Logistic\""],"Managed Services Provider":["misp-galaxy:sector=\"Managed Services Provider\""],"Manufacturing":["misp-galaxy:sector=\"Manufacturing\""],"Maritime":["misp-galaxy:sector=\"Maritime\""],"Marketing":["misp-galaxy:sector=\"Marketing\""],"Metal":["misp-galaxy:sector=\"Metal\""],"Military":["misp-galaxy:sector=\"Military\""],"Mining":["misp-galaxy:sector=\"Mining\""],"Multi-sector":["misp-galaxy:sector=\"Multi-sector\""],"NGO":["misp-galaxy:sector=\"NGO\""],"News - Media":["misp-galaxy:sector=\"News - Media\""],"Oil":["misp-galaxy:sector=\"Oil\""],"Online marketplace":["misp-galaxy:sector=\"Online marketplace\""],"Opposition":["misp-galaxy:sector=\"Opposition\""],"Other":["misp-galaxy:sector=\"Other\""],"Payment":["misp-galaxy:sector=\"Payment\""],"Petrochemical":["misp-galaxy:sector=\"Petrochemical\""],"Pharmacy":["misp-galaxy:sector=\"Pharmacy\""],"Police - Law enforcement":["misp-galaxy:sector=\"Police - Law enforcement\""],"Political party":["misp-galaxy:sector=\"Political party\""],"Programming":["misp-galaxy:sector=\"Programming\""],"Publishing industry":["misp-galaxy:sector=\"Publishing industry\""],"Railway":["misp-galaxy:sector=\"Railway\""],"Research - Innovation":["misp-galaxy:sector=\"Research - Innovation\""],"Restaurant":["misp-galaxy:sector=\"Restaurant\""],"Retail":["misp-galaxy:sector=\"Retail\""],"Satellite navigation":["misp-galaxy:sector=\"Satellite navigation\""],"Security Service":["misp-galaxy:sector=\"Security Service\""],"Security actors":["misp-galaxy:sector=\"Security actors\""],"Security systems":["misp-galaxy:sector=\"Security systems\""],"Semi-conductors":["misp-galaxy:sector=\"Semi-conductors\""],"Separatists":["misp-galaxy:sector=\"Separatists\""],"Shipping":["misp-galaxy:sector=\"Shipping\""],"Smart meter":["misp-galaxy:sector=\"Smart meter\""],"Social networks":["misp-galaxy:sector=\"Social networks\""],"Space":["misp-galaxy:sector=\"Space\""],"Steel":["misp-galaxy:sector=\"Steel\""],"Streaming service":["misp-galaxy:sector=\"Streaming service\""],"Tax firm":["misp-galaxy:sector=\"Tax firm\""],"Technology":["misp-galaxy:sector=\"Technology\""],"Telecoms":["misp-galaxy:sector=\"Telecoms\""],"Television broadcast":["misp-galaxy:sector=\"Television broadcast\""],"Think Tanks":["misp-galaxy:sector=\"Think Tanks\""],"Tourism":["misp-galaxy:sector=\"Tourism\""],"Trade":["misp-galaxy:sector=\"Trade\""],"Transport":["misp-galaxy:sector=\"Transport\""],"Travel":["misp-galaxy:sector=\"Travel\""],"Turbine":["misp-galaxy:sector=\"Turbine\""],"Veterinary":["misp-galaxy:sector=\"Veterinary\""],"Video Sharing":["misp-galaxy:sector=\"Video Sharing\""],"Water":["misp-galaxy:sector=\"Water\""],"eCommerce":["misp-galaxy:sector=\"eCommerce\""],"engineering":["misp-galaxy:sector=\"engineering\""],"AZORult":["misp-galaxy:stealer=\"AZORult\""],"TeleGrab":["misp-galaxy:stealer=\"TeleGrab\""],"Vidar":["misp-galaxy:stealer=\"Vidar\""],"BlackHat TDS":["misp-galaxy:tds=\"BlackHat TDS\""],"BlackTDS":["misp-galaxy:tds=\"BlackTDS\""],"BossTDS":["misp-galaxy:tds=\"BossTDS\""],"Futuristic TDS":["misp-galaxy:tds=\"Futuristic TDS\""],"Keitaro":["misp-galaxy:tds=\"Keitaro\""],"Orchid TDS":["misp-galaxy:tds=\"Orchid TDS\""],"ShadowTDS":["misp-galaxy:tds=\"ShadowTDS\""],"SimpleTDS":["misp-galaxy:tds=\"SimpleTDS\""],"Stds":["misp-galaxy:tds=\"SimpleTDS\""],"Sutra":["misp-galaxy:tds=\"Sutra\""],"zTDS":["misp-galaxy:tds=\"zTDS\""]," Stealth Mango and Tangelo ":["misp-galaxy:threat-actor=\" Stealth Mango and Tangelo \""],"ALLANITE":["misp-galaxy:threat-actor=\"ALLANITE\""],"Palmetto Fusion":["misp-galaxy:threat-actor=\"ALLANITE\""],"Allanite":["misp-galaxy:threat-actor=\"ALLANITE\""],"APT 16":["misp-galaxy:threat-actor=\"APT 16\""],"SVCMONDR":["misp-galaxy:threat-actor=\"APT 16\"","misp-galaxy:threat-actor=\"SVCMONDR\""],"APT 22":["misp-galaxy:threat-actor=\"APT 22\""],"APT22":["misp-galaxy:threat-actor=\"APT 22\""],"APT 26":["misp-galaxy:threat-actor=\"APT 26\""],"APT26":["misp-galaxy:threat-actor=\"APT 26\""],"Hippo Team":["misp-galaxy:threat-actor=\"APT 26\"","misp-galaxy:threat-actor=\"Turla Group\""],"JerseyMikes":["misp-galaxy:threat-actor=\"APT 26\""],"Turbine Panda":["misp-galaxy:threat-actor=\"APT 26\""],"APT 29":["misp-galaxy:threat-actor=\"APT 29\""],"Dukes":["misp-galaxy:threat-actor=\"APT 29\""],"Group 100":["misp-galaxy:threat-actor=\"APT 29\""],"Cozy Duke":["misp-galaxy:threat-actor=\"APT 29\""],"Office Monkeys":["misp-galaxy:threat-actor=\"APT 29\""],"OfficeMonkeys":["misp-galaxy:threat-actor=\"APT 29\""],"Minidionis":["misp-galaxy:threat-actor=\"APT 29\""],"Hammer Toss":["misp-galaxy:threat-actor=\"APT 29\""],"Iron Hemlock":["misp-galaxy:threat-actor=\"APT 29\""],"Grizzly Steppe":["misp-galaxy:threat-actor=\"APT 29\"","misp-galaxy:threat-actor=\"Sofacy\""],"APT 30":["misp-galaxy:threat-actor=\"APT 30\"","misp-galaxy:threat-actor=\"Naikon\""],"APT 6":["misp-galaxy:threat-actor=\"APT 6\""],"1.php Group":["misp-galaxy:threat-actor=\"APT 6\""],"APT6":["misp-galaxy:threat-actor=\"APT 6\""],"APT-C-27":["misp-galaxy:threat-actor=\"APT-C-27\""],"GoldMouse":["misp-galaxy:threat-actor=\"APT-C-27\""],"APT-C-35":["misp-galaxy:threat-actor=\"APT-C-35\"","misp-galaxy:threat-actor=\"APT-C-35\""],"DoNot Team":["misp-galaxy:threat-actor=\"APT-C-35\""],"Donot Team":["misp-galaxy:threat-actor=\"APT-C-35\""],"APT-C-36":["misp-galaxy:threat-actor=\"APT-C-36\""],"Blind Eagle":["misp-galaxy:threat-actor=\"APT-C-36\""],"APT.3102":["misp-galaxy:threat-actor=\"APT.3102\""],"APT31":["misp-galaxy:threat-actor=\"APT31\"","misp-galaxy:threat-actor=\"Hurricane Panda\""],"APT 31":["misp-galaxy:threat-actor=\"APT31\"","misp-galaxy:threat-actor=\"Hurricane Panda\""],"Ocean Lotus":["misp-galaxy:threat-actor=\"APT32\""],"Cobalt Kitty":["misp-galaxy:threat-actor=\"APT32\""],"Sea Lotus":["misp-galaxy:threat-actor=\"APT32\""],"APT-32":["misp-galaxy:threat-actor=\"APT32\""],"APT 32":["misp-galaxy:threat-actor=\"APT32\""],"Ocean Buffalo":["misp-galaxy:threat-actor=\"APT32\""],"APT 33":["misp-galaxy:threat-actor=\"APT33\""],"MAGNALLIUM":["misp-galaxy:threat-actor=\"APT33\"","misp-galaxy:threat-actor=\"MAGNALLIUM\""],"Refined Kitten":["misp-galaxy:threat-actor=\"APT33\""],"APT 34":["misp-galaxy:threat-actor=\"APT34\"","misp-galaxy:threat-actor=\"OilRig\""],"APT 35":["misp-galaxy:threat-actor=\"APT35\"","misp-galaxy:threat-actor=\"Cleaver\""],"Newscaster Team":["misp-galaxy:threat-actor=\"APT35\""],"APT 37":["misp-galaxy:threat-actor=\"APT37\""],"Group 123":["misp-galaxy:threat-actor=\"APT37\""],"Starcruft":["misp-galaxy:threat-actor=\"APT37\""],"Reaper Group":["misp-galaxy:threat-actor=\"APT37\""],"Red Eyes":["misp-galaxy:threat-actor=\"APT37\""],"Ricochet Chollima":["misp-galaxy:threat-actor=\"APT37\""],"Operation Daybreak":["misp-galaxy:threat-actor=\"APT37\"","misp-galaxy:threat-actor=\"ScarCruft\""],"Operation Erebus":["misp-galaxy:threat-actor=\"APT37\"","misp-galaxy:threat-actor=\"ScarCruft\""],"Venus 121":["misp-galaxy:threat-actor=\"APT37\""],"APT 39":["misp-galaxy:threat-actor=\"APT39\""],"APT5":["misp-galaxy:threat-actor=\"APT5\""],"Anchor Panda":["misp-galaxy:threat-actor=\"Anchor Panda\"","misp-galaxy:tool=\"Torn RAT\""],"APT14":["misp-galaxy:threat-actor=\"Anchor Panda\""],"APT 14":["misp-galaxy:threat-actor=\"Anchor Panda\""],"QAZTeam":["misp-galaxy:threat-actor=\"Anchor Panda\""],"ALUMINUM":["misp-galaxy:threat-actor=\"Anchor Panda\""],"Andromeda Spider":["misp-galaxy:threat-actor=\"Andromeda Spider\""],"AridViper":["misp-galaxy:threat-actor=\"AridViper\""],"Desert Falcon":["misp-galaxy:threat-actor=\"AridViper\""],"Arid Viper":["misp-galaxy:threat-actor=\"AridViper\""],"APT-C-23":["misp-galaxy:threat-actor=\"AridViper\""],"Aslan Neferler Tim":["misp-galaxy:threat-actor=\"Aslan Neferler Tim\""],"Lion Soldiers Team":["misp-galaxy:threat-actor=\"Aslan Neferler Tim\""],"Phantom Turk":["misp-galaxy:threat-actor=\"Aslan Neferler Tim\""],"Aurora Panda":["misp-galaxy:threat-actor=\"Aurora Panda\""],"APT 17":["misp-galaxy:threat-actor=\"Aurora Panda\"","misp-galaxy:threat-actor=\"Axiom\""],"Group 8":["misp-galaxy:threat-actor=\"Aurora Panda\""],"Hidden Lynx":["misp-galaxy:threat-actor=\"Aurora Panda\""],"Tailgater Team":["misp-galaxy:threat-actor=\"Aurora Panda\"","misp-galaxy:threat-actor=\"Axiom\""],"Dogfish":["misp-galaxy:threat-actor=\"Aurora Panda\"","misp-galaxy:threat-actor=\"Axiom\""],"Group72":["misp-galaxy:threat-actor=\"Axiom\""],"Tailgater":["misp-galaxy:threat-actor=\"Axiom\""],"Ragebeast":["misp-galaxy:threat-actor=\"Axiom\""],"Lead":["misp-galaxy:threat-actor=\"Axiom\""],"Wicked Spider":["misp-galaxy:threat-actor=\"Axiom\""],"Wicked Panda":["misp-galaxy:threat-actor=\"Axiom\""],"Barium":["misp-galaxy:threat-actor=\"Axiom\""],"Ayy\u0131ld\u0131z Tim":["misp-galaxy:threat-actor=\"Ayy\u0131ld\u0131z Tim\""],"Crescent and Star":["misp-galaxy:threat-actor=\"Ayy\u0131ld\u0131z Tim\""],"Bahamut":["misp-galaxy:threat-actor=\"Bahamut\""],"SIG22":["misp-galaxy:threat-actor=\"Beijing Group\""],"Big Panda":["misp-galaxy:threat-actor=\"Big Panda\""],"BlackTech":["misp-galaxy:threat-actor=\"BlackTech\""],"Blackgear":["misp-galaxy:threat-actor=\"Blackgear\""],"Topgear":["misp-galaxy:threat-actor=\"Blackgear\""],"BLACKGEAR":["misp-galaxy:threat-actor=\"Blackgear\""],"Blue Termite":["misp-galaxy:threat-actor=\"Blue Termite\""],"Cloudy Omega":["misp-galaxy:threat-actor=\"Blue Termite\""],"Boss Spider":["misp-galaxy:threat-actor=\"Boss Spider\""],"Boulder Bear":["misp-galaxy:threat-actor=\"Boulder Bear\""],"BuhTrap":["misp-galaxy:threat-actor=\"BuhTrap\""],"CHRYSENE":["misp-galaxy:threat-actor=\"CHRYSENE\""],"Greenbug":["misp-galaxy:threat-actor=\"CHRYSENE\"","misp-galaxy:threat-actor=\"Greenbug\""],"COBALT DICKENS":["misp-galaxy:threat-actor=\"COBALT DICKENS\"","misp-galaxy:threat-actor=\"Silent Librarian\""],"Cobalt Dickens":["misp-galaxy:threat-actor=\"COBALT DICKENS\""],"COVELLITE":["misp-galaxy:threat-actor=\"COVELLITE\""],"Lazarus":["misp-galaxy:threat-actor=\"COVELLITE\""],"Hidden Cobra":["misp-galaxy:threat-actor=\"COVELLITE\"","misp-galaxy:threat-actor=\"Lazarus Group\""],"Callisto":["misp-galaxy:threat-actor=\"Callisto\""],"The Mask":["misp-galaxy:threat-actor=\"Careto\""],"Ugly Face":["misp-galaxy:threat-actor=\"Careto\""],"Parastoo":["misp-galaxy:threat-actor=\"Charming Kitten\""],"iKittens":["misp-galaxy:threat-actor=\"Charming Kitten\""],"Group 83":["misp-galaxy:threat-actor=\"Charming Kitten\""],"Newsbeef":["misp-galaxy:threat-actor=\"Charming Kitten\""],"NewsBeef":["misp-galaxy:threat-actor=\"Charming Kitten\""],"Operation Cleaver":["misp-galaxy:threat-actor=\"Cleaver\""],"Tarh Andishan":["misp-galaxy:threat-actor=\"Cleaver\""],"Alibaba":["misp-galaxy:threat-actor=\"Cleaver\""],"2889":["misp-galaxy:threat-actor=\"Cleaver\""],"Rocket_Kitten":["misp-galaxy:threat-actor=\"Cleaver\""],"Cutting Kitten":["misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"Cutting Kitten\""],"Group 41":["misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"Clever Kitten\""],"TEMP.Beanie":["misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"Rocket Kitten\""],"Ghambar":["misp-galaxy:threat-actor=\"Cleaver\"","misp-galaxy:threat-actor=\"Cutting Kitten\""],"Clever Kitten":["misp-galaxy:threat-actor=\"Clever Kitten\""],"Cloud Atlas":["misp-galaxy:threat-actor=\"Cloud Atlas\""],"Cobalt":["misp-galaxy:threat-actor=\"Cobalt\""],"Cobalt group":["misp-galaxy:threat-actor=\"Cobalt\""],"Cobalt gang":["misp-galaxy:threat-actor=\"Cobalt\""],"GOLD KINGSWOOD":["misp-galaxy:threat-actor=\"Cobalt\""],"C0d0so":["misp-galaxy:threat-actor=\"Codoso\""],"APT 19":["misp-galaxy:threat-actor=\"Codoso\"","misp-galaxy:threat-actor=\"Shell Crew\""],"Cold River":["misp-galaxy:threat-actor=\"Cold River\""],"Nahr Elbard":["misp-galaxy:threat-actor=\"Cold River\""],"Nahr el bared":["misp-galaxy:threat-actor=\"Cold River\""],"PLA Unit 61398":["misp-galaxy:threat-actor=\"Comment Crew\""],"APT 1":["misp-galaxy:threat-actor=\"Comment Crew\""],"Advanced Persistent Threat 1":["misp-galaxy:threat-actor=\"Comment Crew\""],"Byzantine Candor":["misp-galaxy:threat-actor=\"Comment Crew\""],"Group 3":["misp-galaxy:threat-actor=\"Comment Crew\""],"TG-8223":["misp-galaxy:threat-actor=\"Comment Crew\""],"Brown Fox":["misp-galaxy:threat-actor=\"Comment Crew\""],"GIF89a":["misp-galaxy:threat-actor=\"Comment Crew\""],"ShadyRAT":["misp-galaxy:threat-actor=\"Comment Crew\""],"Shanghai Group":["misp-galaxy:threat-actor=\"Comment Crew\""],"Slayer Kitten":["misp-galaxy:threat-actor=\"CopyKittens\""],"Corsair Jackal":["misp-galaxy:threat-actor=\"Corsair Jackal\""],"TunisianCyberArmy":["misp-galaxy:threat-actor=\"Corsair Jackal\""],"ITSecTeam":["misp-galaxy:threat-actor=\"Cutting Kitten\""],"Cyber Berkut":["misp-galaxy:threat-actor=\"Cyber Berkut\""],"Cyber Caliphate Army":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"Islamic State Hacking Division":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"CCA":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"United Cyber Caliphate":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"UUC":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"CyberCaliphate":["misp-galaxy:threat-actor=\"Cyber Caliphate Army\""],"Cyber fighters of Izz Ad-Din Al Qassam":["misp-galaxy:threat-actor=\"Cyber fighters of Izz Ad-Din Al Qassam\""],"Fraternal Jackal":["misp-galaxy:threat-actor=\"Cyber fighters of Izz Ad-Din Al Qassam\""],"DYMALLOY":["misp-galaxy:threat-actor=\"DYMALLOY\""],"Dragonfly2":["misp-galaxy:threat-actor=\"DYMALLOY\""],"Berserker Bear":["misp-galaxy:threat-actor=\"DYMALLOY\""],"Danti":["misp-galaxy:threat-actor=\"Danti\""],"Fallout Team":["misp-galaxy:threat-actor=\"DarkHotel\""],"Karba":["misp-galaxy:threat-actor=\"DarkHotel\""],"Luder":["misp-galaxy:threat-actor=\"DarkHotel\""],"Nemin":["misp-galaxy:threat-actor=\"DarkHotel\""],"Pioneer":["misp-galaxy:threat-actor=\"DarkHotel\""],"Shadow Crane":["misp-galaxy:threat-actor=\"DarkHotel\""],"APT-C-06":["misp-galaxy:threat-actor=\"DarkHotel\""],"SIG25":["misp-galaxy:threat-actor=\"DarkHotel\""],"LazyMeerkat":["misp-galaxy:threat-actor=\"DarkHydrus\""],"DarkVishnya":["misp-galaxy:threat-actor=\"DarkVishnya\""],"Deadeye Jackal":["misp-galaxy:threat-actor=\"Deadeye Jackal\""],"SyrianElectronicArmy":["misp-galaxy:threat-actor=\"Deadeye Jackal\""],"SEA":["misp-galaxy:threat-actor=\"Deadeye Jackal\""],"Dextorous Spider":["misp-galaxy:threat-actor=\"Dextorous Spider\""],"Dizzy Panda":["misp-galaxy:threat-actor=\"Dizzy Panda\""],"LadyBoyle":["misp-galaxy:threat-actor=\"Dizzy Panda\""],"Domestic Kitten":["misp-galaxy:threat-actor=\"Domestic Kitten\""],"Monsoon":["misp-galaxy:threat-actor=\"Dropping Elephant\""],"Sarit":["misp-galaxy:threat-actor=\"Dropping Elephant\""],"Quilted Tiger":["misp-galaxy:threat-actor=\"Dropping Elephant\""],"APT-C-09":["misp-galaxy:threat-actor=\"Dropping Elephant\""],"Dungeon Spider":["misp-galaxy:threat-actor=\"Dungeon Spider\""],"ELECTRUM":["misp-galaxy:threat-actor=\"ELECTRUM\""],"Sandworm":["misp-galaxy:threat-actor=\"ELECTRUM\"","misp-galaxy:threat-actor=\"Sandworm\"","misp-galaxy:threat-actor=\"TeleBots\""],"Electric Panda":["misp-galaxy:threat-actor=\"Electric Panda\""],"Eloquent Panda":["misp-galaxy:threat-actor=\"Eloquent Panda\""],"APT 27":["misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"TEMP.Hippo":["misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"Group 35":["misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"Bronze Union":["misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"ZipToken":["misp-galaxy:threat-actor=\"Emissary Panda\"","misp-galaxy:threat-actor=\"LuckyMouse\""],"HIPPOTeam":["misp-galaxy:threat-actor=\"Emissary Panda\""],"Operation Iron Tiger":["misp-galaxy:threat-actor=\"Emissary Panda\""],"Iron Tiger APT":["misp-galaxy:threat-actor=\"Emissary Panda\""],"Crouching Yeti":["misp-galaxy:threat-actor=\"Energetic Bear\""],"Group 24":["misp-galaxy:threat-actor=\"Energetic Bear\""],"CrouchingYeti":["misp-galaxy:threat-actor=\"Energetic Bear\""],"Koala Team":["misp-galaxy:threat-actor=\"Energetic Bear\""],"Equation Group":["misp-galaxy:threat-actor=\"Equation Group\""],"Tilded Team":["misp-galaxy:threat-actor=\"Equation Group\""],"Lamberts":["misp-galaxy:threat-actor=\"Equation Group\"","misp-galaxy:threat-actor=\"Longhorn\""],"EQGRP":["misp-galaxy:threat-actor=\"Equation Group\""],"Longhorn":["misp-galaxy:threat-actor=\"Equation Group\"","misp-galaxy:threat-actor=\"Longhorn\""],"EvilPost":["misp-galaxy:threat-actor=\"EvilPost\""],"EvilTraffic":["misp-galaxy:threat-actor=\"EvilTraffic\""],"Operation EvilTraffic":["misp-galaxy:threat-actor=\"EvilTraffic\""],"FASTCash":["misp-galaxy:threat-actor=\"FASTCash\"","misp-galaxy:tool=\"FASTCash\""],"Skeleton Spider":["misp-galaxy:threat-actor=\"FIN6\"","misp-galaxy:threat-actor=\"Skeleton Spider\""],"Flash Kitten":["misp-galaxy:threat-actor=\"Flash Kitten\""],"Flying Kitten":["misp-galaxy:threat-actor=\"Flying Kitten\""],"SaffronRose":["misp-galaxy:threat-actor=\"Flying Kitten\""],"Saffron Rose":["misp-galaxy:threat-actor=\"Flying Kitten\""],"AjaxSecurityTeam":["misp-galaxy:threat-actor=\"Flying Kitten\""],"Group 26":["misp-galaxy:threat-actor=\"Flying Kitten\""],"Sayad":["misp-galaxy:threat-actor=\"Flying Kitten\""],"Foxy Panda":["misp-galaxy:threat-actor=\"Foxy Panda\""],"Fxmsp":["misp-galaxy:threat-actor=\"Fxmsp\""],"GC01":["misp-galaxy:threat-actor=\"GC01\""],"Golden Chickens":["misp-galaxy:threat-actor=\"GC01\"","misp-galaxy:threat-actor=\"GC02\""],"Golden Chickens01":["misp-galaxy:threat-actor=\"GC01\""],"Golden Chickens 01":["misp-galaxy:threat-actor=\"GC01\""],"GC02":["misp-galaxy:threat-actor=\"GC02\""],"Golden Chickens02":["misp-galaxy:threat-actor=\"GC02\""],"Golden Chickens 02":["misp-galaxy:threat-actor=\"GC02\""],"GRIM SPIDER":["misp-galaxy:threat-actor=\"GRIM SPIDER\""],"Ghost Jackal":["misp-galaxy:threat-actor=\"Ghost Jackal\""],"GhostNet":["misp-galaxy:threat-actor=\"GhostNet\""],"Snooping Dragon":["misp-galaxy:threat-actor=\"GhostNet\""],"Gibberish Panda":["misp-galaxy:threat-actor=\"Gibberish Panda\""],"Gnosticplayers":["misp-galaxy:threat-actor=\"Gnosticplayers\""],"Groundbait":["misp-galaxy:threat-actor=\"Groundbait\""],"Group 27":["misp-galaxy:threat-actor=\"Group 27\""],"Guru Spider":["misp-galaxy:threat-actor=\"Guru Spider\""],"Hacking Team":["misp-galaxy:threat-actor=\"Hacking Team\""],"Hammer Panda":["misp-galaxy:threat-actor=\"Hammer Panda\""],"Zhenbao":["misp-galaxy:threat-actor=\"Hammer Panda\""],"TEMP.Zhenbao":["misp-galaxy:threat-actor=\"Hammer Panda\""],"Hellsing":["misp-galaxy:threat-actor=\"Hellsing\"","misp-galaxy:threat-actor=\"Naikon\""],"Goblin Panda":["misp-galaxy:threat-actor=\"Hellsing\""],"Cycldek":["misp-galaxy:threat-actor=\"Hellsing\""],"HookAds":["misp-galaxy:threat-actor=\"HookAds\""],"Hurricane Panda":["misp-galaxy:threat-actor=\"Hurricane Panda\""],"TEMP.Avengers":["misp-galaxy:threat-actor=\"Hurricane Panda\""],"Zirconium":["misp-galaxy:threat-actor=\"Hurricane Panda\""],"INDRIK SPIDER":["misp-galaxy:threat-actor=\"INDRIK SPIDER\""],"IRIDIUM":["misp-galaxy:threat-actor=\"IRIDIUM\""],"TG-2754":["misp-galaxy:threat-actor=\"IXESHE\""],"BeeBus":["misp-galaxy:threat-actor=\"IXESHE\""],"Group 22":["misp-galaxy:threat-actor=\"IXESHE\""],"Calc Team":["misp-galaxy:threat-actor=\"IXESHE\""],"DNSCalc":["misp-galaxy:threat-actor=\"IXESHE\""],"Crimson Iron":["misp-galaxy:threat-actor=\"IXESHE\""],"APT 12":["misp-galaxy:threat-actor=\"IXESHE\""],"Ice Fog":["misp-galaxy:threat-actor=\"Ice Fog\""],"IceFog":["misp-galaxy:threat-actor=\"Ice Fog\""],"Dagger Panda":["misp-galaxy:threat-actor=\"Ice Fog\""],"Impersonating Panda":["misp-galaxy:threat-actor=\"Impersonating Panda\""],"Inception Framework":["misp-galaxy:threat-actor=\"Inception Framework\""],"Operation Mermaid":["misp-galaxy:threat-actor=\"Infy\""],"Prince of Persia":["misp-galaxy:threat-actor=\"Infy\""],"Iron Group":["misp-galaxy:threat-actor=\"Iron Group\""],"Iron Cyber Group":["misp-galaxy:threat-actor=\"Iron Group\""],"Judgment Panda":["misp-galaxy:threat-actor=\"Judgment Panda\""],"Karma Panda":["misp-galaxy:threat-actor=\"Karma Panda\""],"Keyhole Panda":["misp-galaxy:threat-actor=\"Keyhole Panda\""],"temp.bottle":["misp-galaxy:threat-actor=\"Keyhole Panda\""],"Kimsuki":["misp-galaxy:threat-actor=\"Kimsuki\""],"Kimsuky":["misp-galaxy:threat-actor=\"Kimsuki\""],"Velvet Chollima":["misp-galaxy:threat-actor=\"Kimsuki\""],"Kryptonite Panda":["misp-galaxy:threat-actor=\"Kryptonite Panda\""],"Operation DarkSeoul":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Dark Seoul":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Hastati Group":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Andariel":["misp-galaxy:threat-actor=\"Lazarus Group\"","misp-galaxy:threat-actor=\"Silent Chollima\""],"Unit 121":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Bureau 121":["misp-galaxy:threat-actor=\"Lazarus Group\""],"NewRomanic Cyber Army Team":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Bluenoroff":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Subgroup: Bluenoroff":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Group 77":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Labyrinth Chollima":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Operation Troy":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Operation GhostSecret":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Operation AppleJeus":["misp-galaxy:threat-actor=\"Lazarus Group\""],"APT 38":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Stardust Chollima":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Whois Hacking Team":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Zinc":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Appleworm":["misp-galaxy:threat-actor=\"Lazarus Group\""],"Nickel Academy":["misp-galaxy:threat-actor=\"Lazarus Group\""],"APT-C-26":["misp-galaxy:threat-actor=\"Lazarus Group\""],"APT 40":["misp-galaxy:threat-actor=\"Leviathan\""],"BRONZE MOHAWK":["misp-galaxy:threat-actor=\"Leviathan\""],"Libyan Scorpions":["misp-galaxy:threat-actor=\"Libyan Scorpions\""],"the Lamberts":["misp-galaxy:threat-actor=\"Longhorn\""],"ST Group":["misp-galaxy:threat-actor=\"Lotus Blossom\""],"Esile":["misp-galaxy:threat-actor=\"Lotus Blossom\""],"Lotus Panda":["misp-galaxy:threat-actor=\"Lotus Panda\"","misp-galaxy:threat-actor=\"Naikon\""],"Lucky Cat":["misp-galaxy:threat-actor=\"Lucky Cat\""],"Threat Group 3390":["misp-galaxy:threat-actor=\"LuckyMouse\""],"Lunar Spider":["misp-galaxy:threat-actor=\"Lunar Spider\""],"MUMMY SPIDER":["misp-galaxy:threat-actor=\"MUMMY SPIDER\""],"TA542":["misp-galaxy:threat-actor=\"MUMMY SPIDER\""],"Mummy Spider":["misp-galaxy:threat-actor=\"MUMMY SPIDER\""],"Madi":["misp-galaxy:threat-actor=\"Madi\""],"MageCart":["misp-galaxy:threat-actor=\"MageCart\""],"Magic Kitten":["misp-galaxy:threat-actor=\"Magic Kitten\""],"Group 42":["misp-galaxy:threat-actor=\"Magic Kitten\""],"Magnetic Spider":["misp-galaxy:threat-actor=\"Magnetic Spider\""],"Malware reusers":["misp-galaxy:threat-actor=\"Malware reusers\"","misp-galaxy:threat-actor=\"Volatile Cedar\""],"Reuse team":["misp-galaxy:threat-actor=\"Malware reusers\"","misp-galaxy:threat-actor=\"Volatile Cedar\""],"Dancing Salome":["misp-galaxy:threat-actor=\"Malware reusers\"","misp-galaxy:threat-actor=\"Volatile Cedar\""],"Mana Team":["misp-galaxy:threat-actor=\"Mana Team\""],"Maverick Panda":["misp-galaxy:threat-actor=\"Maverick Panda\""],"PLA Navy":["misp-galaxy:threat-actor=\"Maverick Panda\"","misp-galaxy:threat-actor=\"Samurai Panda\"","misp-galaxy:threat-actor=\"Wekby\""],"Ke3Chang":["misp-galaxy:threat-actor=\"Mirage\""],"APT 15":["misp-galaxy:threat-actor=\"Mirage\""],"Metushy":["misp-galaxy:threat-actor=\"Mirage\""],"Social Network Team":["misp-galaxy:threat-actor=\"Mirage\""],"Royal APT":["misp-galaxy:threat-actor=\"Mirage\""],"Mofang":["misp-galaxy:threat-actor=\"Mofang\""],"Superman":["misp-galaxy:threat-actor=\"Mofang\""],"Gaza Hackers Team":["misp-galaxy:threat-actor=\"Molerats\""],"Gaza cybergang":["misp-galaxy:threat-actor=\"Molerats\""],"Extreme Jackal":["misp-galaxy:threat-actor=\"Molerats\""],"Moonlight":["misp-galaxy:threat-actor=\"Molerats\""],"MoneyTaker":["misp-galaxy:threat-actor=\"MoneyTaker\""],"Static Kitten":["misp-galaxy:threat-actor=\"MuddyWater\""],"Mustang Panda":["misp-galaxy:threat-actor=\"Mustang Panda\""],"PLA Unit 78020":["misp-galaxy:threat-actor=\"Naikon\""],"Override Panda":["misp-galaxy:threat-actor=\"Naikon\""],"Camerashy":["misp-galaxy:threat-actor=\"Naikon\""],"APT.Naikon":["misp-galaxy:threat-actor=\"Naikon\""],"APT 21":["misp-galaxy:threat-actor=\"NetTraveler\""],"APT21":["misp-galaxy:threat-actor=\"NetTraveler\""],"Nexus Zeta":["misp-galaxy:threat-actor=\"Nexus Zeta\""],"Nightshade Panda":["misp-galaxy:threat-actor=\"Nightshade Panda\""],"APT 9":["misp-galaxy:threat-actor=\"Nightshade Panda\""],"Flowerlady\/Flowershow":["misp-galaxy:threat-actor=\"Nightshade Panda\""],"Flowerlady":["misp-galaxy:threat-actor=\"Nightshade Panda\""],"Flowershow":["misp-galaxy:threat-actor=\"Nightshade Panda\""],"Nitro":["misp-galaxy:threat-actor=\"Nitro\""],"Covert Grove":["misp-galaxy:threat-actor=\"Nitro\""],"Nomad Panda":["misp-galaxy:threat-actor=\"Nomad Panda\""],"Twisted Kitten":["misp-galaxy:threat-actor=\"OilRig\""],"Crambus":["misp-galaxy:threat-actor=\"OilRig\""],"Helix Kitten":["misp-galaxy:threat-actor=\"OilRig\""],"OnionDog":["misp-galaxy:threat-actor=\"OnionDog\""],"Operation BugDrop":["misp-galaxy:threat-actor=\"Operation BugDrop\""],"Operation C-Major":["misp-galaxy:threat-actor=\"Operation C-Major\""],"Mythic Leopard":["misp-galaxy:threat-actor=\"Operation C-Major\""],"ProjectM":["misp-galaxy:threat-actor=\"Operation C-Major\""],"APT36":["misp-galaxy:threat-actor=\"Operation C-Major\""],"APT 36":["misp-galaxy:threat-actor=\"Operation C-Major\""],"TMP.Lapis":["misp-galaxy:threat-actor=\"Operation C-Major\""],"Operation Comando":["misp-galaxy:threat-actor=\"Operation Comando\""],"Operation Kabar Cobra":["misp-galaxy:threat-actor=\"Operation Kabar Cobra\""],"Operation Parliament":["misp-galaxy:threat-actor=\"Operation Parliament\""],"Operation Poison Needles":["misp-galaxy:threat-actor=\"Operation Poison Needles\""],"Operation ShadowHammer":["misp-galaxy:threat-actor=\"Operation ShadowHammer\""],"Operation Sharpshooter":["misp-galaxy:threat-actor=\"Operation Sharpshooter\""],"OurMine":["misp-galaxy:threat-actor=\"OurMine\""],"TwoForOne":["misp-galaxy:threat-actor=\"PLATINUM\""],"Pacha Group":["misp-galaxy:threat-actor=\"Pacha Group\""],"Pacifier APT":["misp-galaxy:threat-actor=\"Pacifier APT\"","misp-galaxy:threat-actor=\"Turla Group\""],"Skipper":["misp-galaxy:threat-actor=\"Pacifier APT\""],"Popeye":["misp-galaxy:threat-actor=\"Pacifier APT\"","misp-galaxy:threat-actor=\"Turla Group\""],"Packrat":["misp-galaxy:threat-actor=\"Packrat\""],"Pale Panda":["misp-galaxy:threat-actor=\"Pale Panda\""],"PassCV":["misp-galaxy:threat-actor=\"PassCV\""],"Pinchy Spider":["misp-galaxy:threat-actor=\"Pinchy Spider\""],"Pirate Panda":["misp-galaxy:threat-actor=\"Pirate Panda\""],"APT23":["misp-galaxy:threat-actor=\"Pirate Panda\""],"APT 23":["misp-galaxy:threat-actor=\"Pirate Panda\""],"Pitty Panda":["misp-galaxy:threat-actor=\"Pitty Panda\""],"MANGANESE":["misp-galaxy:threat-actor=\"Pitty Panda\""],"Pizzo Spider":["misp-galaxy:threat-actor=\"Pizzo Spider\""],"DD4BC":["misp-galaxy:threat-actor=\"Pizzo Spider\""],"Ambiorx":["misp-galaxy:threat-actor=\"Pizzo Spider\""],"Poisonous Panda":["misp-galaxy:threat-actor=\"Poisonous Panda\""],"Predator Panda":["misp-galaxy:threat-actor=\"Predator Panda\""],"Sauron":["misp-galaxy:threat-actor=\"ProjectSauron\""],"Project Sauron":["misp-galaxy:threat-actor=\"ProjectSauron\""],"PLA Unit 61486":["misp-galaxy:threat-actor=\"Putter Panda\""],"APT 2":["misp-galaxy:threat-actor=\"Putter Panda\""],"Group 36":["misp-galaxy:threat-actor=\"Putter Panda\""],"APT-2":["misp-galaxy:threat-actor=\"Putter Panda\""],"4HCrew":["misp-galaxy:threat-actor=\"Putter Panda\""],"SULPHUR":["misp-galaxy:threat-actor=\"Putter Panda\""],"SearchFire":["misp-galaxy:threat-actor=\"Putter Panda\""],"TG-6952":["misp-galaxy:threat-actor=\"Putter Panda\""],"RANCOR":["misp-galaxy:threat-actor=\"RANCOR\""],"Rancor group":["misp-galaxy:threat-actor=\"RANCOR\""],"Rancor Group":["misp-galaxy:threat-actor=\"RANCOR\""],"RASPITE":["misp-galaxy:threat-actor=\"RASPITE\""],"LeafMiner":["misp-galaxy:threat-actor=\"RASPITE\""],"Radio Panda":["misp-galaxy:threat-actor=\"Radio Panda\""],"Shrouded Crossbow":["misp-galaxy:threat-actor=\"Radio Panda\""],"Ratpak Spider":["misp-galaxy:threat-actor=\"Ratpak Spider\""],"Rebel Jackal":["misp-galaxy:threat-actor=\"Rebel Jackal\""],"FallagaTeam":["misp-galaxy:threat-actor=\"Rebel Jackal\""],"Red October":["misp-galaxy:threat-actor=\"Red October\""],"the Rocra":["misp-galaxy:threat-actor=\"Red October\""],"Roaming Mantis Group":["misp-galaxy:threat-actor=\"Roaming Mantis\""],"Roaming Tiger":["misp-galaxy:threat-actor=\"Roaming Tiger\""],"Rocke":["misp-galaxy:threat-actor=\"Rocke\""],"Operation Woolen Goldfish":["misp-galaxy:threat-actor=\"Rocket Kitten\""],"Thamar Reservoir":["misp-galaxy:threat-actor=\"Rocket Kitten\""],"Timberworm":["misp-galaxy:threat-actor=\"Rocket Kitten\""],"SNOWGLOBE":["misp-galaxy:threat-actor=\"SNOWGLOBE\""],"Animal Farm":["misp-galaxy:threat-actor=\"SNOWGLOBE\""],"Snowglobe":["misp-galaxy:threat-actor=\"SNOWGLOBE\""],"STARDUST CHOLLIMA":["misp-galaxy:threat-actor=\"STARDUST CHOLLIMA\""],"STOLEN PENCIL":["misp-galaxy:threat-actor=\"STOLEN PENCIL\""],"Sabre Panda":["misp-galaxy:threat-actor=\"Sabre Panda\""],"Salty Spider":["misp-galaxy:threat-actor=\"Salty Spider\""],"Samurai Panda":["misp-galaxy:threat-actor=\"Samurai Panda\""],"APT4":["misp-galaxy:threat-actor=\"Samurai Panda\""],"APT 4":["misp-galaxy:threat-actor=\"Samurai Panda\""],"Wisp Team":["misp-galaxy:threat-actor=\"Samurai Panda\""],"Getkys":["misp-galaxy:threat-actor=\"Samurai Panda\""],"SykipotGroup":["misp-galaxy:threat-actor=\"Samurai Panda\""],"Wkysol":["misp-galaxy:threat-actor=\"Samurai Panda\""],"SandCat":["misp-galaxy:threat-actor=\"SandCat\""],"Sands Casino":["misp-galaxy:threat-actor=\"Sands Casino\""],"Voodoo Bear":["misp-galaxy:threat-actor=\"Sandworm\""],"TEMP.Noble":["misp-galaxy:threat-actor=\"Sandworm\""],"Iron Viking":["misp-galaxy:threat-actor=\"Sandworm\""],"Sath-\u0131 M\u00fcdafaa":["misp-galaxy:threat-actor=\"Sath-\u0131 M\u00fcdafaa\""],"Sea Turtle":["misp-galaxy:threat-actor=\"Sea Turtle\""],"Shadow Network":["misp-galaxy:threat-actor=\"Shadow Network\""],"Shark Spider":["misp-galaxy:threat-actor=\"Shark Spider\""],"Group 13":["misp-galaxy:threat-actor=\"Shell Crew\""],"Sh3llCr3w":["misp-galaxy:threat-actor=\"Shell Crew\""],"Siesta":["misp-galaxy:threat-actor=\"Siesta\""],"Silence group":["misp-galaxy:threat-actor=\"Silence group\""],"Silent Chollima":["misp-galaxy:threat-actor=\"Silent Chollima\""],"OperationTroy":["misp-galaxy:threat-actor=\"Silent Chollima\""],"Guardian of Peace":["misp-galaxy:threat-actor=\"Silent Chollima\""],"GOP":["misp-galaxy:threat-actor=\"Silent Chollima\""],"WHOis Team":["misp-galaxy:threat-actor=\"Silent Chollima\""],"Subgroup: Andariel":["misp-galaxy:threat-actor=\"Silent Chollima\""],"Silent Librarian":["misp-galaxy:threat-actor=\"Silent Librarian\""],"Mabna Institute":["misp-galaxy:threat-actor=\"Silent Librarian\""],"Sima":["misp-galaxy:threat-actor=\"Sima\""],"Singing Spider":["misp-galaxy:threat-actor=\"Singing Spider\""],"Snake Wine":["misp-galaxy:threat-actor=\"Snake Wine\""],"PawnStorm":["misp-galaxy:threat-actor=\"Sofacy\""],"TAG_0700":["misp-galaxy:threat-actor=\"Sofacy\""],"IRON TWILIGHT":["misp-galaxy:threat-actor=\"Sofacy\""],"SIG40":["misp-galaxy:threat-actor=\"Sofacy\""],"Spicy Panda":["misp-galaxy:threat-actor=\"Spicy Panda\""],"Stalker Panda":["misp-galaxy:threat-actor=\"Stalker Panda\""],"FruityArmor":["misp-galaxy:threat-actor=\"Stealth Falcon\""],"APT 10":["misp-galaxy:threat-actor=\"Stone Panda\""],"MenuPass":["misp-galaxy:threat-actor=\"Stone Panda\""],"Menupass Team":["misp-galaxy:threat-actor=\"Stone Panda\""],"menuPass Team":["misp-galaxy:threat-actor=\"Stone Panda\""],"happyyongzi":["misp-galaxy:threat-actor=\"Stone Panda\""],"POTASSIUM":["misp-galaxy:threat-actor=\"Stone Panda\""],"DustStorm":["misp-galaxy:threat-actor=\"Stone Panda\""],"Cloud Hopper":["misp-galaxy:threat-actor=\"Stone Panda\""],"Subaat":["misp-galaxy:threat-actor=\"Subaat\"","misp-galaxy:threat-actor=\"The Gorgon Group\""],"TA505":["misp-galaxy:threat-actor=\"TA505\""],"TA530":["misp-galaxy:threat-actor=\"TA530\""],"TEMP.Hermit":["misp-galaxy:threat-actor=\"TEMP.Hermit\""],"Xenotime":["misp-galaxy:threat-actor=\"TEMP.Veles\""],"TeamSpy Crew":["misp-galaxy:threat-actor=\"TeamSpy Crew\""],"TeamSpy":["misp-galaxy:threat-actor=\"TeamSpy Crew\""],"Team Bear":["misp-galaxy:threat-actor=\"TeamSpy Crew\""],"Anger Bear":["misp-galaxy:threat-actor=\"TeamSpy Crew\""],"TeamXRat":["misp-galaxy:threat-actor=\"TeamXRat\""],"CorporacaoXRat":["misp-galaxy:threat-actor=\"TeamXRat\""],"CorporationXRat":["misp-galaxy:threat-actor=\"TeamXRat\""],"TeleBots":["misp-galaxy:threat-actor=\"TeleBots\""],"TempTick":["misp-galaxy:threat-actor=\"TempTick\""],"Temper Panda":["misp-galaxy:threat-actor=\"Temper Panda\""],"Admin338":["misp-galaxy:threat-actor=\"Temper Panda\""],"Team338":["misp-galaxy:threat-actor=\"Temper Panda\""],"MAGNESIUM":["misp-galaxy:threat-actor=\"Temper Panda\""],"Test Panda":["misp-galaxy:threat-actor=\"Test Panda\""],"The Big Bang":["misp-galaxy:threat-actor=\"The Big Bang\""],"The Gorgon Group":["misp-galaxy:threat-actor=\"The Gorgon Group\""],"The Shadow Brokers":["misp-galaxy:threat-actor=\"The Shadow Brokers\""],"The ShadowBrokers":["misp-galaxy:threat-actor=\"The Shadow Brokers\""],"TSB":["misp-galaxy:threat-actor=\"The Shadow Brokers\""],"Shadow Brokers":["misp-galaxy:threat-actor=\"The Shadow Brokers\""],"ShadowBrokers":["misp-galaxy:threat-actor=\"The Shadow Brokers\""],"Bronze Butler":["misp-galaxy:threat-actor=\"Tick\""],"RedBaldKnight":["misp-galaxy:threat-actor=\"Tick\""],"Tiny Spider":["misp-galaxy:threat-actor=\"Tiny Spider\""],"Tonto Team":["misp-galaxy:threat-actor=\"Tonto Team\""],"Toxic Panda":["misp-galaxy:threat-actor=\"Toxic Panda\""],"Operation Tropic Trooper":["misp-galaxy:threat-actor=\"Tropic Trooper\""],"Operation TropicTrooper":["misp-galaxy:threat-actor=\"Tropic Trooper\""],"TropicTrooper":["misp-galaxy:threat-actor=\"Tropic Trooper\""],"TurkHackTeam":["misp-galaxy:threat-actor=\"TurkHackTeam\""],"Turk Hack Team":["misp-galaxy:threat-actor=\"TurkHackTeam\""],"Turla Group":["misp-galaxy:threat-actor=\"Turla Group\""],"Venomous Bear":["misp-galaxy:threat-actor=\"Turla Group\""],"Group 88":["misp-galaxy:threat-actor=\"Turla Group\""],"WRAITH":["misp-galaxy:threat-actor=\"Turla Group\""],"Turla Team":["misp-galaxy:threat-actor=\"Turla Group\""],"Pfinet":["misp-galaxy:threat-actor=\"Turla Group\""],"TAG_0530":["misp-galaxy:threat-actor=\"Turla Group\""],"KRYPTON":["misp-galaxy:threat-actor=\"Turla Group\""],"SIG23":["misp-galaxy:threat-actor=\"Turla Group\""],"Iron Hunter":["misp-galaxy:threat-actor=\"Turla Group\""],"UPS":["misp-galaxy:threat-actor=\"UPS\""],"APT 3":["misp-galaxy:threat-actor=\"UPS\""],"Group 6":["misp-galaxy:threat-actor=\"UPS\""],"Boyusec":["misp-galaxy:threat-actor=\"UPS\""],"Union Panda":["misp-galaxy:threat-actor=\"Union Panda\""],"Union Spider":["misp-galaxy:threat-actor=\"Union Spider\""],"Unit 8200":["misp-galaxy:threat-actor=\"Unit 8200\""],"Duqu Group":["misp-galaxy:threat-actor=\"Unit 8200\""],"Unnamed Actor":["misp-galaxy:threat-actor=\"Unnamed Actor\""],"Viceroy Tiger":["misp-galaxy:threat-actor=\"Viceroy Tiger\""],"Appin":["misp-galaxy:threat-actor=\"Viceroy Tiger\""],"OperationHangover":["misp-galaxy:threat-actor=\"Viceroy Tiger\""],"Viking Jackal":["misp-galaxy:threat-actor=\"Viking Jackal\""],"Vikingdom":["misp-galaxy:threat-actor=\"Viking Jackal\""],"Violin Panda":["misp-galaxy:threat-actor=\"Violin Panda\""],"APT20":["misp-galaxy:threat-actor=\"Violin Panda\""],"APT 20":["misp-galaxy:threat-actor=\"Violin Panda\""],"APT8":["misp-galaxy:threat-actor=\"Violin Panda\""],"APT 8":["misp-galaxy:threat-actor=\"Violin Panda\""],"TH3Bug":["misp-galaxy:threat-actor=\"Violin Panda\""],"Volatile Cedar":["misp-galaxy:threat-actor=\"Volatile Cedar\""],"WIZARD SPIDER":["misp-galaxy:threat-actor=\"WIZARD SPIDER\""],"Wekby":["misp-galaxy:threat-actor=\"Wekby\""],"APT 18":["misp-galaxy:threat-actor=\"Wekby\""],"SCANDIUM":["misp-galaxy:threat-actor=\"Wekby\""],"Wet Panda":["misp-galaxy:threat-actor=\"Wet Panda\""],"White Bear":["misp-galaxy:threat-actor=\"White Bear\""],"Skipper Turla":["misp-galaxy:threat-actor=\"White Bear\""],"Whitefly":["misp-galaxy:threat-actor=\"Whitefly\""],"WildNeutron":["misp-galaxy:threat-actor=\"WildNeutron\""],"Butterfly":["misp-galaxy:threat-actor=\"WildNeutron\""],"Morpho":["misp-galaxy:threat-actor=\"WildNeutron\""],"Sphinx Moth":["misp-galaxy:threat-actor=\"WildNeutron\""],"WindShift":["misp-galaxy:threat-actor=\"WindShift\""],"Winnti Umbrella":["misp-galaxy:threat-actor=\"Winnti Umbrella\""],"Wolf Spider":["misp-galaxy:threat-actor=\"Wolf Spider\""],"Zombie Spider":["misp-galaxy:threat-actor=\"Zombie Spider\""],"[Unnamed group]":["misp-galaxy:threat-actor=\"[Unnamed group]\""],"[Vault 7\/8]":["misp-galaxy:threat-actor=\"[Vault 7\/8]\""],"ALMA Communicator":["misp-galaxy:tool=\"ALMA Communicator\""],"AURIGA":["misp-galaxy:tool=\"AURIGA\""],"Agent ORM":["misp-galaxy:tool=\"Agent ORM\""],"Tosliph":["misp-galaxy:tool=\"Agent ORM\""],"ComRat":["misp-galaxy:tool=\"Agent.BTZ\""],"Agent.dne":["misp-galaxy:tool=\"Agent.dne\""],"PinkSlipBot":["misp-galaxy:tool=\"Akbot\""],"AmmyAdmin":["misp-galaxy:tool=\"AmmyAdmin\""],"August":["misp-galaxy:tool=\"August\""],"Aumlib":["misp-galaxy:tool=\"Aumlib\""],"Yayih":["misp-galaxy:tool=\"Aumlib\""],"mswab":["misp-galaxy:tool=\"Aumlib\""],"BANGAT":["misp-galaxy:tool=\"BANGAT\""],"BASHLITE":["misp-galaxy:tool=\"BASHLITE\""],"BISKVIT":["misp-galaxy:tool=\"BISKVIT\""],"BOUNCER":["misp-galaxy:tool=\"BOUNCER\""],"BabaYaga":["misp-galaxy:tool=\"BabaYaga\""],"BabyShark":["misp-galaxy:tool=\"BabyShark\""],"Backdoor.Dripion":["misp-galaxy:tool=\"Backdoor.Dripion\""],"Dripion":["misp-galaxy:tool=\"Backdoor.Dripion\""],"Backdoor.Tinybaron":["misp-galaxy:tool=\"Backdoor.Tinybaron\""],"Backspace":["misp-galaxy:tool=\"Backspace\""],"Badnews":["misp-galaxy:tool=\"Badnews\""],"Bookworm":["misp-galaxy:tool=\"Bookworm\""],"Brushaloader":["misp-galaxy:tool=\"Brushaloader\""],"Bunny":["misp-galaxy:tool=\"Bunny\""],"Bushaloader":["misp-galaxy:tool=\"Bushaloader\""],"(.v2 fysbis)":["misp-galaxy:tool=\"CHOPSTICK\""],"CMStar":["misp-galaxy:tool=\"CMStar\""],"COMBOS":["misp-galaxy:tool=\"COMBOS\""],"COOKIEBAG":["misp-galaxy:tool=\"COOKIEBAG\""],"TROJAN.COOKIES":["misp-galaxy:tool=\"COOKIEBAG\""],"APT.InfoStealer.Win.CORALDECK":["misp-galaxy:tool=\"CORALDECK\""],"FE_APT_InfoStealer_Win_CORALDECK_1":["misp-galaxy:tool=\"CORALDECK\""],"CTRat":["misp-galaxy:tool=\"CTRat\""],"CUTLET MAKER":["misp-galaxy:tool=\"CUTLET MAKER\""],"CWoolger":["misp-galaxy:tool=\"CWoolger\""],"Cadelspy":["misp-galaxy:tool=\"Cadelspy\""],"WinSpy":["misp-galaxy:tool=\"Cadelspy\""],"Carp Downloader":["misp-galaxy:tool=\"Carp Downloader\""],"Cheshire Cat":["misp-galaxy:tool=\"Cheshire Cat\""],"Pegasus spyware":["misp-galaxy:tool=\"Chrysaor\""],"ClipboardWalletHijacker":["misp-galaxy:tool=\"ClipboardWalletHijacker\""],"Cowboy":["misp-galaxy:tool=\"Cowboy\""],"CowerSnail":["misp-galaxy:tool=\"CowerSnail\""],"Cromptui":["misp-galaxy:tool=\"Cromptui\""],"CroniX":["misp-galaxy:tool=\"CroniX\""],"DAIRY":["misp-galaxy:tool=\"DAIRY\""],"DHS2015":["misp-galaxy:tool=\"DHS2015\""],"iRAT":["misp-galaxy:tool=\"DHS2015\""],"FE_APT_RAT_DOGCALL":["misp-galaxy:tool=\"DOGCALL\""],"FE_APT_Backdoor_Win32_DOGCALL_1":["misp-galaxy:tool=\"DOGCALL\""],"APT.Backdoor.Win.DOGCALL":["misp-galaxy:tool=\"DOGCALL\""],"DOPU":["misp-galaxy:tool=\"DOPU\""],"DanderSpritz":["misp-galaxy:tool=\"DanderSpritz\""],"Dander Spritz":["misp-galaxy:tool=\"DanderSpritz\""],"Dark Pulsar":["misp-galaxy:tool=\"DarkPulsar\""],"TROJ_DLLSERV.BE":["misp-galaxy:tool=\"Derusbi\""],"Digmine":["misp-galaxy:tool=\"Digmine\""],"Disgufa":["misp-galaxy:tool=\"Disgufa\""],"DoubleFantasy":["misp-galaxy:tool=\"DoubleFantasy\""],"DownRage":["misp-galaxy:tool=\"DownRage\""],"Carberplike":["misp-galaxy:tool=\"DownRage\""],"DownRange":["misp-galaxy:tool=\"DownRange\""],"Downloader-FGO":["misp-galaxy:tool=\"Downloader-FGO\""],"Win32:Malware-gen":["misp-galaxy:tool=\"Downloader-FGO\""],"Generic30.ASYL (Trojan horse)":["misp-galaxy:tool=\"Downloader-FGO\""],"TR\/Agent.84480.85":["misp-galaxy:tool=\"Downloader-FGO\""],"Trojan.Generic.8627031":["misp-galaxy:tool=\"Downloader-FGO\""],"Trojan:Win32\/Sisproc":["misp-galaxy:tool=\"Downloader-FGO\""],"SB\/Malware":["misp-galaxy:tool=\"Downloader-FGO\""],"Trj\/CI.A":["misp-galaxy:tool=\"Downloader-FGO\""],"Mal\/Behav-112":["misp-galaxy:tool=\"Downloader-FGO\""],"Trojan.Spuler":["misp-galaxy:tool=\"Downloader-FGO\""],"TROJ_KAZY.SM1":["misp-galaxy:tool=\"Downloader-FGO\""],"Win32\/FakePPT_i":["misp-galaxy:tool=\"Downloader-FGO\""],"EAGERLEVER":["misp-galaxy:tool=\"EAGERLEVER\""],"EARLYSHOVEL":["misp-galaxy:tool=\"EARLYSHOVEL\""],"EASYBEE":["misp-galaxy:tool=\"EASYBEE\""],"EASYFUN":["misp-galaxy:tool=\"EASYFUN\""],"EASYPI":["misp-galaxy:tool=\"EASYPI\""],"EBBISLAND (EBBSHAVE)":["misp-galaxy:tool=\"EBBISLAND (EBBSHAVE)\""],"ECHOWRECKER":["misp-galaxy:tool=\"ECHOWRECKER\""],"ECLIPSEDWING":["misp-galaxy:tool=\"ECLIPSEDWING\""],"EDUCATEDSCHOLAR":["misp-galaxy:tool=\"EDUCATEDSCHOLAR\""],"ELF_IMEIJ":["misp-galaxy:tool=\"ELF_IMEIJ\""],"EMERALDTHREAD":["misp-galaxy:tool=\"EMERALDTHREAD\""],"EMPHASISMINE":["misp-galaxy:tool=\"EMPHASISMINE\""],"ENGLISHMANSDENTIST":["misp-galaxy:tool=\"ENGLISHMANSDENTIST\""],"EPICHERO":["misp-galaxy:tool=\"EPICHERO\""],"ERRATICGOPHER":["misp-galaxy:tool=\"ERRATICGOPHER\""],"ERRATICGOPHERTOUCH":["misp-galaxy:tool=\"ERRATICGOPHERTOUCH\""],"ESKIMOROLL":["misp-galaxy:tool=\"ESKIMOROLL\""],"ESSAYKEYNOTE":["misp-galaxy:tool=\"ESSAYKEYNOTE\""],"ESTEEMAUDIT":["misp-galaxy:tool=\"ESTEEMAUDIT\""],"ETCETERABLUE":["misp-galaxy:tool=\"ETCETERABLUE\""],"ETERNALBLUE":["misp-galaxy:tool=\"ETERNALBLUE\""],"ETERNALCHAMPION":["misp-galaxy:tool=\"ETERNALCHAMPION\""],"ETERNALROMANCE":["misp-galaxy:tool=\"ETERNALROMANCE\""],"ETERNALSYNERGY":["misp-galaxy:tool=\"ETERNALSYNERGY\""],"ETRE":["misp-galaxy:tool=\"ETRE\""],"EVADEFRED":["misp-galaxy:tool=\"EVADEFRED\""],"EVILNUM":["misp-galaxy:tool=\"EVILNUM\""],"EWOKFRENZY":["misp-galaxy:tool=\"EWOKFRENZY\""],"EXPIREDPAYCHECK":["misp-galaxy:tool=\"EXPIREDPAYCHECK\""],"EXPLODINGCAN":["misp-galaxy:tool=\"EXPLODINGCAN\""],"Elise Backdoor":["misp-galaxy:tool=\"Elise Backdoor\""],"Newsripper":["misp-galaxy:tool=\"Emdivi\""],"Empyre":["misp-galaxy:tool=\"Empyre\""],"Empye":["misp-galaxy:tool=\"Empyre\""],"EngineBox Malware":["misp-galaxy:tool=\"EngineBox Malware\""],"EquationLaser":["misp-galaxy:tool=\"EquationLaser\""],"Escad":["misp-galaxy:tool=\"Escad\""],"Etumbot":["misp-galaxy:tool=\"Etumbot\""],"Exploz":["misp-galaxy:tool=\"Etumbot\""],"Specfix":["misp-galaxy:tool=\"Etumbot\""],"BKDR_HGDER":["misp-galaxy:tool=\"EvilGrab\""],"BKDR_EVILOGE":["misp-galaxy:tool=\"EvilGrab\""],"BKDR_NVICM":["misp-galaxy:tool=\"EvilGrab\""],"Wmonder":["misp-galaxy:tool=\"EvilGrab\""],"Exforel":["misp-galaxy:tool=\"Exforel\""],"Explosive":["misp-galaxy:tool=\"Explosive\""],"EyePyramid Malware":["misp-galaxy:tool=\"EyePyramid Malware\""],"FUZZBUNCH":["misp-galaxy:tool=\"FUZZBUNCH\""],"FacexWorm":["misp-galaxy:tool=\"FacexWorm\""],"Fadok":["misp-galaxy:tool=\"Fadok\""],"Win32\/Fadok":["misp-galaxy:tool=\"Fadok\""],"FAKEM":["misp-galaxy:tool=\"Fakem RAT\""],"Fexel":["misp-galaxy:tool=\"Fexel\""],"Loneagent":["misp-galaxy:tool=\"Fexel\""],"FlexSpy":["misp-galaxy:tool=\"FlexSpy\""],"Flokibot":["misp-galaxy:tool=\"Flokibot\""],"Floki Bot":["misp-galaxy:tool=\"Flokibot\""],"Floki":["misp-galaxy:tool=\"Flokibot\""],"Foozer":["misp-galaxy:tool=\"Foozer\""],"FormBook":["misp-galaxy:tool=\"FormBook\""],"Fysbis":["misp-galaxy:tool=\"Fysbis\""],"GDOCUPLOAD":["misp-galaxy:tool=\"GDOCUPLOAD\""],"GELCAPSULE":["misp-galaxy:tool=\"GELCAPSULE\""],"FE_APT_Downloader_Win32_GELCAPSULE_1":["misp-galaxy:tool=\"GELCAPSULE\""],"GETMAIL":["misp-galaxy:tool=\"GETMAIL\""],"GHOLE":["misp-galaxy:tool=\"GHOLE\""],"GHOTEX":["misp-galaxy:tool=\"GHOTEX\""],"TROJAN.GTALK":["misp-galaxy:tool=\"GLOOXMAIL\""],"GOGGLES":["misp-galaxy:tool=\"GOGGLES\""],"TROJAN.FOXY":["misp-galaxy:tool=\"GOGGLES\""],"GREENCAT":["misp-galaxy:tool=\"GREENCAT\""],"Gamut Botnet":["misp-galaxy:tool=\"Gamut Botnet\""],"Gh0st Rat":["misp-galaxy:tool=\"Gh0st Rat\""],"Gh0stRat, GhostRat":["misp-galaxy:tool=\"Gh0st Rat\""],"GoScanSSH":["misp-galaxy:tool=\"GoScanSSH\""],"Gootkit":["misp-galaxy:tool=\"GootKit\""],"GrayFish":["misp-galaxy:tool=\"GrayFish\""],"HACKFASE":["misp-galaxy:tool=\"HACKFASE\""],"FE_APT_Downloader_HAPPYWORK":["misp-galaxy:tool=\"HAPPYWORK\""],"FE_APT_Exploit_HWP_Happy":["misp-galaxy:tool=\"HAPPYWORK\""],"Downloader.APT.HAPPYWORK":["misp-galaxy:tool=\"HAPPYWORK\""],"HDRoot":["misp-galaxy:tool=\"HDRoot\""],"HELAUTO":["misp-galaxy:tool=\"HELAUTO\""],"TokenControl":["misp-galaxy:tool=\"HTTPBrowser\""],"Hackshit":["misp-galaxy:tool=\"Hackshit\""],"Tordal":["misp-galaxy:tool=\"Hancitor\""],"Helminth backdoor":["misp-galaxy:tool=\"Helminth backdoor\""],"HerHer Trojan":["misp-galaxy:tool=\"HerHer Trojan\""],"Heseber BOT":["misp-galaxy:tool=\"Heseber BOT\""],"Hi-ZOR":["misp-galaxy:tool=\"Hi-ZOR\""],"Hoardy":["misp-galaxy:tool=\"Hoardy\""],"Hoarde":["misp-galaxy:tool=\"Hoardy\""],"Phindolp":["misp-galaxy:tool=\"Hoardy\""],"Htran":["misp-galaxy:tool=\"Htran\""],"HUC Packet Transmitter":["misp-galaxy:tool=\"Htran\""],"Huigezi malware":["misp-galaxy:tool=\"Huigezi malware\""],"Houdini":["misp-galaxy:tool=\"Hworm\""],"Hyena":["misp-galaxy:tool=\"Hyena\""],"IISTOUCH":["misp-galaxy:tool=\"IISTOUCH\""],"IRONGATE":["misp-galaxy:tool=\"IRONGATE\""],"Incognito RAT":["misp-galaxy:tool=\"Incognito RAT\""],"IntrudingDivisor":["misp-galaxy:tool=\"IntrudingDivisor\""],"IoT_reaper":["misp-galaxy:tool=\"IoT_reaper\""],"Iron Backdoor":["misp-galaxy:tool=\"Iron Backdoor\""],"JS Flash":["misp-galaxy:tool=\"JS Flash\""],"JavaScript variant of HALFBAKED":["misp-galaxy:tool=\"JS Flash\""],"JS_POWMET":["misp-galaxy:tool=\"JS_POWMET\""],"JasperLoader":["misp-galaxy:tool=\"JasperLoader\""],"JexBoss":["misp-galaxy:tool=\"JexBoss\""],"Jripbot":["misp-galaxy:tool=\"Jripbot\""],"Jiripbot":["misp-galaxy:tool=\"Jripbot\""],"FE_APT_Backdoor_Karae_enc":["misp-galaxy:tool=\"KARAE\""],"FE_APT_Backdoor_Karae":["misp-galaxy:tool=\"KARAE\""],"Backdoor.APT.Karae":["misp-galaxy:tool=\"KARAE\""],"KURTON":["misp-galaxy:tool=\"KURTON\""],"KillDisk Wiper":["misp-galaxy:tool=\"KillDisk Wiper\""],"KimJongRAT":["misp-galaxy:tool=\"KimJongRAT\""],"KingMiner":["misp-galaxy:tool=\"KingMiner\""],"LATENTBOT":["misp-galaxy:tool=\"LATENTBOT\""],"LIGHTBOLT":["misp-galaxy:tool=\"LIGHTBOLT\""],"LIGHTDART":["misp-galaxy:tool=\"LIGHTDART\""],"LONGRUN":["misp-galaxy:tool=\"LONGRUN\""],"LURK":["misp-galaxy:tool=\"LURK\""],"LamePyre":["misp-galaxy:tool=\"LamePyre\""],"OSX.LamePyre":["misp-galaxy:tool=\"LamePyre\""],"Lazagne":["misp-galaxy:tool=\"Lazagne\""],"LockPoS":["misp-galaxy:tool=\"LockPoS\""],"Loki Bot":["misp-galaxy:tool=\"Loki Bot\""],"Lost Door RAT":["misp-galaxy:tool=\"Lost Door RAT\""],"LostDoor RAT":["misp-galaxy:tool=\"Lost Door RAT\""],"BKDR_LODORAT":["misp-galaxy:tool=\"Lost Door RAT\""],"LuminosityLink":["misp-galaxy:tool=\"LuminosityLink\""],"MANITSME":["misp-galaxy:tool=\"MANITSME\""],"MAPIGET":["misp-galaxy:tool=\"MAPIGET\""],"MFC Huner":["misp-galaxy:tool=\"MFC Huner\""],"Hupigon":["misp-galaxy:tool=\"MFC Huner\""],"BKDR_HUPIGON":["misp-galaxy:tool=\"MFC Huner\""],"MILKDROP":["misp-galaxy:tool=\"MILKDROP\""],"FE_Trojan_Win32_MILKDROP_1":["misp-galaxy:tool=\"MILKDROP\""],"MINIASP":["misp-galaxy:tool=\"MINIASP\""],"MM Core backdoor":["misp-galaxy:tool=\"MM Core\""],"BigBoss":["misp-galaxy:tool=\"MM Core\""],"SillyGoose":["misp-galaxy:tool=\"MM Core\""],"BaneChant":["misp-galaxy:tool=\"MM Core\""],"StrangeLove":["misp-galaxy:tool=\"MM Core\""],"MagentoCore Malware":["misp-galaxy:tool=\"MagentoCore Malware\""],"Maikspy":["misp-galaxy:tool=\"Maikspy\""],"Mikatz":["misp-galaxy:tool=\"Mimikatz\""],"Linux\/Mirai":["misp-galaxy:tool=\"Mirai\""],"MoneyTaker 5.0":["misp-galaxy:tool=\"MoneyTaker 5.0\""],"Moneygram Adwind":["misp-galaxy:tool=\"Moneygram Adwind\""],"Mongall":["misp-galaxy:tool=\"Mongall\""],"Moudoor":["misp-galaxy:tool=\"Moudoor\""],"SCAR":["misp-galaxy:tool=\"Moudoor\""],"KillProc.14145":["misp-galaxy:tool=\"Moudoor\""],"NAMEDPIPETOUCH":["misp-galaxy:tool=\"NAMEDPIPETOUCH\""],"NBot":["misp-galaxy:tool=\"NBot\""],"NEWSREELS":["misp-galaxy:tool=\"NEWSREELS\""],"NLBrute":["misp-galaxy:tool=\"NLBrute\""],"NanoCoreRAT":["misp-galaxy:tool=\"NanoCoreRAT\""],"Nancrat":["misp-galaxy:tool=\"NanoCoreRAT\""],"Zurten":["misp-galaxy:tool=\"NanoCoreRAT\""],"Atros2.CKPN":["misp-galaxy:tool=\"NanoCoreRAT\""],"Netfile":["misp-galaxy:tool=\"NetTraveler\""],"Neteagle":["misp-galaxy:tool=\"Neteagle\""],"scout":["misp-galaxy:tool=\"Neteagle\""],"norton":["misp-galaxy:tool=\"Neteagle\""],"Nflog":["misp-galaxy:tool=\"Nflog\""],"Not Petya":["misp-galaxy:tool=\"NotPetya\""],"ODDJOB":["misp-galaxy:tool=\"ODDJOB\""],"BackDoor-FDU":["misp-galaxy:tool=\"OLDBAIT\""],"IEChecker":["misp-galaxy:tool=\"OLDBAIT\""],"OSX.BadWord":["misp-galaxy:tool=\"OSX.BadWord\""],"OSX.Pirrit":["misp-galaxy:tool=\"OSX.Pirrit\""],"OSX\/Pirrit":["misp-galaxy:tool=\"OSX.Pirrit\""],"OSX\/Shlayer":["misp-galaxy:tool=\"OSX\/Shlayer\""],"Oldrea":["misp-galaxy:tool=\"Oldrea\""],"HSDFSDCrypt":["misp-galaxy:tool=\"Ordinypt\""],"OzoneRAT":["misp-galaxy:tool=\"OzoneRAT\""],"Ozone RAT":["misp-galaxy:tool=\"OzoneRAT\""],"ozonercp":["misp-galaxy:tool=\"OzoneRAT\""],"PAExec":["misp-galaxy:tool=\"PAExec\""],"PASSFREELY":["misp-galaxy:tool=\"PASSFREELY\""],"PCClient RAT":["misp-galaxy:tool=\"PCClient RAT\""],"PLEAD Downloader":["misp-galaxy:tool=\"PLEAD Downloader\""],"PNG Dropper":["misp-galaxy:tool=\"PNG Dropper\""],"PNG_Dropper":["misp-galaxy:tool=\"PNG Dropper\""],"PNGDropper":["misp-galaxy:tool=\"PNG Dropper\""],"Backdoor.APT.POORAIM":["misp-galaxy:tool=\"POORAIM\""],"PRILEX":["misp-galaxy:tool=\"PRILEX\""],"PWOBot":["misp-galaxy:tool=\"PWOBot\""],"PWOLauncher":["misp-galaxy:tool=\"PWOBot\""],"PWOHTTPD":["misp-galaxy:tool=\"PWOBot\""],"PWOKeyLogger":["misp-galaxy:tool=\"PWOBot\""],"PWOMiner":["misp-galaxy:tool=\"PWOBot\""],"PWOPyExec":["misp-galaxy:tool=\"PWOBot\""],"PWOQuery":["misp-galaxy:tool=\"PWOBot\""],"Palevo":["misp-galaxy:tool=\"Palevo\""],"Badey":["misp-galaxy:tool=\"Pirpi\""],"EXL":["misp-galaxy:tool=\"Pirpi\""],"Backdoor.FSZO-5117":["misp-galaxy:tool=\"PlugX\""],"Trojan.Heur.JP.juW@ayZZvMb":["misp-galaxy:tool=\"PlugX\""],"Trojan.Inject1.6386":["misp-galaxy:tool=\"PlugX\""],"Agent.dhwf":["misp-galaxy:tool=\"PlugX\""],"Preshin":["misp-galaxy:tool=\"Preshin\""],"PupyRAT":["misp-galaxy:tool=\"PupyRAT\""],"QUASARRAT":["misp-galaxy:tool=\"QUASARRAT\""],"RCS Galileo":["misp-galaxy:tool=\"RCS Galileo\""],"RDPWrap":["misp-galaxy:tool=\"RDPWrap\""],"REDLEAVES":["misp-galaxy:tool=\"REDLEAVES\""],"RICECURRY":["misp-galaxy:tool=\"RICECURRY\""],"Exploit.APT.RICECURRY":["misp-galaxy:tool=\"RICECURRY\""],"RPCOUTCH":["misp-galaxy:tool=\"RPCOUTCH\""],"RUHAPPY":["misp-galaxy:tool=\"RUHAPPY\""],"FE_APT_Trojan_Win32_RUHAPPY_1":["misp-galaxy:tool=\"RUHAPPY\""],"Ratankba":["misp-galaxy:tool=\"Ratankba\""],"Prax":["misp-galaxy:tool=\"Regin\""],"WarriorPride":["misp-galaxy:tool=\"Regin\""],"Rekaf":["misp-galaxy:tool=\"Rekaf\""],"Rotexy":["misp-galaxy:tool=\"Rotexy\""],"SMSThief":["misp-galaxy:tool=\"Rotexy\""],"Rotinom":["misp-galaxy:tool=\"Rotinom\""],"ROVNIX":["misp-galaxy:tool=\"Rovnix\""],"RoyalDNS":["misp-galaxy:tool=\"RoyalDNS\""],"Rubella Macro Builder":["misp-galaxy:tool=\"Rubella Macro Builder\""],"SEASALT":["misp-galaxy:tool=\"SEASALT\""],"FE_APT_Backdoor_SHUTTERSPEED":["misp-galaxy:tool=\"SHUTTERSPEED\""],"APT.Backdoor.SHUTTERSPEED":["misp-galaxy:tool=\"SHUTTERSPEED\""],"FE_APT_Downloader_Win_SLOWDRIFT_1":["misp-galaxy:tool=\"SLOWDRIFT\""],"FE_APT_Downloader_Win_SLOWDRIFT_2":["misp-galaxy:tool=\"SLOWDRIFT\""],"APT.Downloader.SLOWDRIFT":["misp-galaxy:tool=\"SLOWDRIFT\""],"SLUB Backdoor":["misp-galaxy:tool=\"SLUB Backdoor\""],"SMBTOUCH":["misp-galaxy:tool=\"SMBTOUCH\""],"SOUNDWAVE":["misp-galaxy:tool=\"SOUNDWAVE\""],"FE_APT_HackTool_Win32_SOUNDWAVE_1":["misp-galaxy:tool=\"SOUNDWAVE\""],"SPIVY":["misp-galaxy:tool=\"SPIVY\""],"STARSYPOUND":["misp-galaxy:tool=\"STARSYPOUND\""],"SURTR":["misp-galaxy:tool=\"SURTR\""],"SWORD":["misp-galaxy:tool=\"SWORD\""],"Scieron":["misp-galaxy:tool=\"Scieron\""],"Scranos":["misp-galaxy:tool=\"Scranos\""],"Sekur":["misp-galaxy:tool=\"Sekur\""],"ShimRAT":["misp-galaxy:tool=\"ShimRAT\""],"Shipup":["misp-galaxy:tool=\"Shipup\""],"Shiz":["misp-galaxy:tool=\"Shiz\""],"Win32\/Sirefef":["misp-galaxy:tool=\"Sirefef\""],"SkeletonKey":["misp-galaxy:tool=\"SkeletonKey\""],"Skyipot":["misp-galaxy:tool=\"Skyipot\""],"GM-Bot":["misp-galaxy:tool=\"Slempo\""],"Spindest":["misp-galaxy:tool=\"Spindest\""],"StalinLocker":["misp-galaxy:tool=\"StalinLocker\""],"StalinScreamer":["misp-galaxy:tool=\"StalinLocker\""],"StealthWorker":["misp-galaxy:tool=\"StealthWorker\""],"StrongPity2":["misp-galaxy:tool=\"StrongPity2\""],"Win32\/StrongPity2":["misp-galaxy:tool=\"StrongPity2\""],"trojan-banker.androidos.svpeng.ae":["misp-galaxy:tool=\"Svpeng\""],"Swisyn":["misp-galaxy:tool=\"Swisyn\""],"T5000":["misp-galaxy:tool=\"T5000\""],"Plat1":["misp-galaxy:tool=\"T5000\""],"TABMSGSQL":["misp-galaxy:tool=\"TABMSGSQL\""],"TROJAN LETSGO":["misp-galaxy:tool=\"TABMSGSQL\""],"TARSIP-ECLIPSE":["misp-galaxy:tool=\"TARSIP-ECLIPSE\""],"TARSIP-MOON":["misp-galaxy:tool=\"TARSIP-MOON\""],"TRISIS":["misp-galaxy:tool=\"TRISIS\""],"TRITON":["misp-galaxy:tool=\"TRISIS\""],"Tafacalou":["misp-galaxy:tool=\"Tafacalou\""],"Tartine":["misp-galaxy:tool=\"Tartine\""],"Taurus":["misp-galaxy:tool=\"Taurus\""],"Tdrop":["misp-galaxy:tool=\"Tdrop\""],"Tdrop2":["misp-galaxy:tool=\"Tdrop2\""],"Terra Loader":["misp-galaxy:tool=\"Terra Loader\""],"Torn RAT":["misp-galaxy:tool=\"Torn RAT\""],"Travle":["misp-galaxy:tool=\"Travle\""],"PYLOT":["misp-galaxy:tool=\"Travle\""],"Trick Bot":["misp-galaxy:tool=\"Trick Bot\""],"TripleFantasy":["misp-galaxy:tool=\"TripleFantasy\""],"Trojan.Laziok":["misp-galaxy:tool=\"Trojan.Laziok\""],"Trojan.Naid":["misp-galaxy:tool=\"Trojan.Naid\""],"Mdmbot.E":["misp-galaxy:tool=\"Trojan.Naid\""],"AGENT.GUNZ":["misp-galaxy:tool=\"Trojan.Naid\""],"AGENT.AQUP.DROPPER":["misp-galaxy:tool=\"Trojan.Naid\""],"AGENT.BMZA":["misp-galaxy:tool=\"Trojan.Naid\""],"MCRAT.A":["misp-galaxy:tool=\"Trojan.Naid\""],"AGENT.ABQMR":["misp-galaxy:tool=\"Trojan.Naid\""],"Trojan.Seaduke":["misp-galaxy:tool=\"Trojan.Seaduke\""],"Seaduke":["misp-galaxy:tool=\"Trojan.Seaduke\""],"Troy":["misp-galaxy:tool=\"Troy\""],"Urouros":["misp-galaxy:tool=\"Turla\""],"UselessDisk":["misp-galaxy:tool=\"UselessDisk\""],"DiskWriter":["misp-galaxy:tool=\"UselessDisk\""],"VB Flash":["misp-galaxy:tool=\"VB Flash\""],"VPNFilter":["misp-galaxy:tool=\"VPNFilter\""],"WARP":["misp-galaxy:tool=\"WARP\""],"WEBC2-ADSPACE":["misp-galaxy:tool=\"WEBC2-ADSPACE\""],"WEBC2-AUSOV":["misp-galaxy:tool=\"WEBC2-AUSOV\""],"WEBC2-BOLID":["misp-galaxy:tool=\"WEBC2-BOLID\""],"WEBC2-CLOVER":["misp-galaxy:tool=\"WEBC2-CLOVER\""],"WEBC2-CSON":["misp-galaxy:tool=\"WEBC2-CSON\""],"WEBC2-DIV":["misp-galaxy:tool=\"WEBC2-DIV\""],"WEBC2-GREENCAT":["misp-galaxy:tool=\"WEBC2-GREENCAT\""],"WEBC2-HEAD":["misp-galaxy:tool=\"WEBC2-HEAD\""],"WEBC2-KT3":["misp-galaxy:tool=\"WEBC2-KT3\""],"WEBC2-QBP":["misp-galaxy:tool=\"WEBC2-QBP\""],"WEBC2-RAVE":["misp-galaxy:tool=\"WEBC2-RAVE\""],"WEBC2-TABLE":["misp-galaxy:tool=\"WEBC2-TABLE\""],"WEBC2-TOCK":["misp-galaxy:tool=\"WEBC2-TOCK\""],"WEBC2-UGX":["misp-galaxy:tool=\"WEBC2-UGX\""],"WEBC2-Y21K":["misp-galaxy:tool=\"WEBC2-Y21K\""],"WEBC2-YAHOO":["misp-galaxy:tool=\"WEBC2-YAHOO\""],"FE_APT_Backdoor_WINERACK":["misp-galaxy:tool=\"WINERACK\""],"Backdoor.APT.WINERACK":["misp-galaxy:tool=\"WINERACK\""],"WinIDS":["misp-galaxy:tool=\"WinIDS\""],"Etso":["misp-galaxy:tool=\"Winnti\""],"SUQ":["misp-galaxy:tool=\"Winnti\""],"Agent.ALQHI":["misp-galaxy:tool=\"Winnti\""],"Epic Turla":["misp-galaxy:tool=\"Wipbot\""],"Wmiexec":["misp-galaxy:tool=\"Wmiexec\""],"XAgent":["misp-galaxy:tool=\"X-Agent\""],"XSControl":["misp-galaxy:tool=\"XSControl\""],"W32\/Seeav":["misp-galaxy:tool=\"Yahoyah\""],"ZUMKONG":["misp-galaxy:tool=\"ZUMKONG\""],"FE_APT_Trojan_Zumkong":["misp-galaxy:tool=\"ZUMKONG\""],"Trojan.APT.Zumkong":["misp-galaxy:tool=\"ZUMKONG\""],"Sensode":["misp-galaxy:tool=\"ZXShell\""],"ZeGhost":["misp-galaxy:tool=\"ZeGhost\""],"BackDoor-FBZT!52D84425CDF2":["misp-galaxy:tool=\"ZeGhost\""],"Trojan.Win32.Staser.ytq":["misp-galaxy:tool=\"ZeGhost\""],"Win32\/Zegost.BW":["misp-galaxy:tool=\"ZeGhost\""],"Trojan.Zbot":["misp-galaxy:tool=\"Zeus\""],"adzok":["misp-galaxy:tool=\"adzok\""],"albertino":["misp-galaxy:tool=\"albertino\""],"arcom":["misp-galaxy:tool=\"arcom\""],"blacknix":["misp-galaxy:tool=\"blacknix\""],"bluebanana":["misp-galaxy:tool=\"bluebanana\""],"bozok":["misp-galaxy:tool=\"bozok\""],"clientmesh":["misp-galaxy:tool=\"clientmesh\""],"csvde.exe":["misp-galaxy:tool=\"csvde.exe\""],"cybergate":["misp-galaxy:tool=\"cybergate\""],"da Vinci RCS":["misp-galaxy:tool=\"da Vinci RCS\""],"DaVinci":["misp-galaxy:tool=\"da Vinci RCS\""],"Morcut":["misp-galaxy:tool=\"da Vinci RCS\""],"darkcomet":["misp-galaxy:tool=\"darkcomet\""],"darkddoser":["misp-galaxy:tool=\"darkddoser\""],"darkrat":["misp-galaxy:tool=\"darkrat\""],"feodo":["misp-galaxy:tool=\"feodo\""],"greame":["misp-galaxy:tool=\"greame\""],"hawkeye":["misp-galaxy:tool=\"hawkeye\""],"javadropper":["misp-galaxy:tool=\"javadropper\""],"jspy":["misp-galaxy:tool=\"jspy\""],"kitty Malware":["misp-galaxy:tool=\"kitty Malware\""],"lostdoor":["misp-galaxy:tool=\"lostdoor\""],"luxnet":["misp-galaxy:tool=\"luxnet\""],"miniFlame":["misp-galaxy:tool=\"miniFlame\""],"njRAT":["misp-galaxy:tool=\"njRAT\""],"Jorik":["misp-galaxy:tool=\"njRAT\""],"pandora":["misp-galaxy:tool=\"pandora\""],"predatorpain":["misp-galaxy:tool=\"predatorpain\""],"punisher":["misp-galaxy:tool=\"punisher\""],"shadowtech":["misp-galaxy:tool=\"shadowtech\""],"smallnet":["misp-galaxy:tool=\"smallnet\""],"spygate":["misp-galaxy:tool=\"spygate\""],"tapaoux":["misp-galaxy:tool=\"tapaoux\""],"template":["misp-galaxy:tool=\"template\""],"vantom":["misp-galaxy:tool=\"vantom\""],"virusrat":["misp-galaxy:tool=\"virusrat\""],"wp-vcd":["misp-galaxy:tool=\"wp-vcd\""],"xDedic RDP Patch":["misp-galaxy:tool=\"xDedic RDP Patch\""],"xDedic SysScan":["misp-galaxy:tool=\"xDedic SysScan\""],"xena":["misp-galaxy:tool=\"xena\""],"xrat":["misp-galaxy:tool=\"xrat\""],"xtreme":["misp-galaxy:tool=\"xtreme\""]} \ No newline at end of file diff --git a/misp_modules/modules/__init__.py b/misp_modules/modules/__init__.py index 47ddcbf..97fdc13 100644 --- a/misp_modules/modules/__init__.py +++ b/misp_modules/modules/__init__.py @@ -1,3 +1,4 @@ from .expansion import * # noqa from .import_mod import * # noqa from .export_mod import * # noqa +from .action_mod import * # noqa diff --git a/misp_modules/modules/action_mod/__init__.py b/misp_modules/modules/action_mod/__init__.py new file mode 100644 index 0000000..d706e5c --- /dev/null +++ b/misp_modules/modules/action_mod/__init__.py @@ -0,0 +1 @@ +__all__ = ['testaction', 'mattermost'] diff --git a/misp_modules/modules/action_mod/_utils/__init__.py b/misp_modules/modules/action_mod/_utils/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/misp_modules/modules/action_mod/_utils/__init__.py @@ -0,0 +1 @@ + diff --git a/misp_modules/modules/action_mod/_utils/utils.py b/misp_modules/modules/action_mod/_utils/utils.py new file mode 100644 index 0000000..3afdc17 --- /dev/null +++ b/misp_modules/modules/action_mod/_utils/utils.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +from jinja2.sandbox import SandboxedEnvironment + +default_template = """ +# Tutorial: How to use jinja2 templating + +:warning: For these examples, we consider the module received data under the MISP core format + +1. You can use the dot `.` notation or the subscript syntax `[]` to access attributes of a variable + - `{% raw %}{{ Event.info }}{% endraw %}` -> {{ Event.info }} + - `{% raw %}{{ Event['info'] }}{% endraw %}` -> {{ Event['info'] }} + +2. Jinja2 allows you to easily create list: +```{% raw %} +{% for attribute in Event.Attribute %} +- {{ attribute.value }} +{% endfor %} +{% endraw %}``` + +Gives: +{% for attribute in Event.Attribute %} +- {{ attribute.value }} +{% endfor %} + +3. Jinja2 allows you to add logic +```{% raw %} +{% if "tlp:white" in Event.Tag %} +- This Event has the TLP:WHITE tag +{% else %} +- This Event doesn't have the TLP:WHITE tag +{% endif %} +{% endraw %}``` + +Gives: +{% if "tlp:white" in Event.Tag %} +- This Event has the TLP:WHITE tag +{% else %} +- This Event doesn't have the TLP:WHITE tag +{% endif %} + +## Jinja2 allows you to modify variables by using filters + +3. The `reverse` filter +- `{% raw %}{{ Event.info | reverse }}{% endraw %}` -> {{ Event.info | reverse }} + +4. The `format` filter +- `{% raw %}{{ "%s :: %s" | format(Event.Attribute[0].type, Event.Attribute[0].value) }}{% endraw %}` -> {{ "%s :: %s" | format(Event.Attribute[0].type, Event.Attribute[0].value) }} + +5.The `groupby` filter +```{% raw %} +{% for type, attributes in Event.Attribute|groupby("type") %} +- {{ type }}{% for attribute in attributes %} + - {{ attribute.value }} + {% endfor %} +{% endfor %} +{% endraw %}``` + +Gives: +{% for type, attributes in Event.Attribute|groupby("type") %} +- {{ type }}{% for attribute in attributes %} + - {{ attribute.value }} + {% endfor %} +{% endfor %} +""" + + +def renderTemplate(data, template=default_template): + env = SandboxedEnvironment() + return env.from_string(template).render(data) \ No newline at end of file diff --git a/misp_modules/modules/action_mod/mattermost.py b/misp_modules/modules/action_mod/mattermost.py new file mode 100644 index 0000000..dbcd336 --- /dev/null +++ b/misp_modules/modules/action_mod/mattermost.py @@ -0,0 +1,97 @@ +import json +from mattermostdriver import Driver +from ._utils import utils + +misperrors = {'error': 'Error'} + +# config fields that your code expects from the site admin +moduleconfig = { + 'params': { + 'mattermost_hostname': { + 'type': 'string', + 'description': 'The Mattermost domain', + 'value': 'example.mattermost.com', + }, + 'bot_access_token': { + 'type': 'string', + 'description': 'Access token generated when you created the bot account', + }, + 'channel_id': { + 'type': 'string', + 'description': 'The channel you added the bot to', + }, + 'message_template': { + 'type': 'large_string', + 'description': 'The template to be used to generate the message to be posted', + 'value': 'The **template** will be rendered using *Jinja2*!', + }, + }, + # Blocking modules break the exection of the current of action + 'blocking': False, + # Indicates whether parts of the data passed to this module should be filtered. Filtered data can be found under the `filteredItems` key + 'support_filters': True, + # Indicates whether the data passed to this module should be compliant with the MISP core format + 'expect_misp_core_format': False, +} + + +# returns either "boolean" or "data" +# Boolean is used to simply signal that the execution has finished. +# For blocking modules the actual boolean value determines whether we break execution +returns = 'boolean' + +moduleinfo = {'version': '0.1', 'author': 'Sami Mokaddem', + 'description': 'Simplistic module to send message to a Mattermost channel.', + 'module-type': ['action']} + + +def createPost(request): + params = request['params'] + mm = Driver({ + 'url': params['mattermost_hostname'], + 'token': params['bot_access_token'], + 'scheme': 'https', + 'basepath': '/api/v4', + 'port': 443, + }) + mm.login() + + data = {} + if 'matchingData' in request: + data = request['matchingData'] + else: + data = request['data'] + + if params['message_template']: + message = utils.renderTemplate(data, params['message_template']) + else: + message = '```\n{}\n```'.format(json.dumps(data)) + + mm.posts.create_post(options={ + 'channel_id': params['channel_id'], + 'message': message + }) + return True + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + createPost(request) + r = {"data": True} + return r + + +def introspection(): + modulesetup = {} + try: + modulesetup['config'] = moduleconfig + except NameError: + pass + return modulesetup + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/action_mod/testaction.py b/misp_modules/modules/action_mod/testaction.py new file mode 100644 index 0000000..d773c4e --- /dev/null +++ b/misp_modules/modules/action_mod/testaction.py @@ -0,0 +1,59 @@ +import json +from ._utils import utils + +misperrors = {'error': 'Error'} + +# config fields that your code expects from the site admin +moduleconfig = { + 'params': { + 'foo': { + 'type': 'string', + 'description': 'blablabla', + 'value': 'xyz' + }, + 'Data extraction path': { + # Extracted data can be found under the `matchingData` key + 'type': 'hash_path', + 'description': 'Only post content extracted from this path', + 'value': 'Attribute.{n}.AttributeTag.{n}.Tag.name', + }, + }, + # Blocking modules break the exection of the current of action + 'blocking': False, + # Indicates whether parts of the data passed to this module should be extracted. Extracted data can be found under the `filteredItems` key + 'support_filters': False, + # Indicates whether the data passed to this module should be compliant with the MISP core format + 'expect_misp_core_format': False, +} + +# returns either "boolean" or "data" +# Boolean is used to simply signal that the execution has finished. +# For blocking modules the actual boolean value determines whether we break execution +returns = 'boolean' + +moduleinfo = {'version': '0.1', 'author': 'Andras Iklody', + 'description': 'This module is merely a test, always returning true. Triggers on event publishing.', + 'module-type': ['action']} + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) # noqa + success = True + r = {"data": success} + return r + + +def introspection(): + modulesetup = {} + try: + modulesetup['config'] = moduleconfig + except NameError: + pass + return modulesetup + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/expansion/__init__.py b/misp_modules/modules/expansion/__init__.py index b6f05ef..2506265 100644 --- a/misp_modules/modules/expansion/__init__.py +++ b/misp_modules/modules/expansion/__init__.py @@ -1,4 +1,3 @@ -from . import _vmray # noqa import os import sys @@ -18,7 +17,8 @@ __all__ = ['cuckoo_submit', 'vmray_submit', 'bgpranking', 'circl_passivedns', 'c 'virustotal_public', 'apiosintds', 'urlscan', 'securitytrails', 'apivoid', 'assemblyline_submit', 'assemblyline_query', 'ransomcoindb', 'malwarebazaar', 'lastline_query', 'lastline_submit', 'sophoslabs_intelix', 'cytomic_orion', 'censys_enrich', - 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan'] + 'trustar_enrich', 'recordedfuture', 'html_to_markdown', 'socialscan', 'passive-ssh', + 'qintel_qsentry', 'mwdb', 'hashlookup', 'mmdb_lookup', 'ipqs_fraud_and_risk_scoring', 'clamav', 'jinja_template_rendering','hyasinsight'] minimum_required_fields = ('type', 'uuid', 'value') diff --git a/misp_modules/modules/expansion/_vmray/vmray_rest_api.py b/misp_modules/modules/expansion/_vmray/vmray_rest_api.py deleted file mode 100644 index 4d5245b..0000000 --- a/misp_modules/modules/expansion/_vmray/vmray_rest_api.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python3 -"""Python client library for VMRay REST API""" - -import base64 -import datetime -import os.path -import requests -import urllib.parse - -# disable nasty certification warning -# pylint: disable=no-member -try: - requests.packages.urllib3.disable_warnings() -except AttributeError: - try: - import urllib3 - try: - urllib3.disable_warnings() - except AttributeError: - pass - except ImportError: - pass - -# pylint: disable= - - -class VMRayRESTAPIError(Exception): - """Exception class that is used when API returns an error""" - - def __init__(self, *args, **kwargs): - self.status_code = kwargs.pop("status_code", None) - Exception.__init__(self, *args, **kwargs) - - -def handle_rest_api_result(result): - """Handle result of API request (check for errors)""" - - if (result.status_code < 200) or (result.status_code > 299): - try: - json_result = result.json() - except ValueError: - raise VMRayRESTAPIError("API returned error %u: %s" % (result.status_code, result.text), status_code=result.status_code) - - raise VMRayRESTAPIError(json_result.get("error_msg", "Unknown error"), status_code=result.status_code) - - -class VMRayRESTAPI(object): - """VMRay REST API class""" - - def __init__(self, server, api_key, verify_cert=True): - # split server URL into components - url_desc = urllib.parse.urlsplit(server) - - # assume HTTPS if no scheme is specified - if url_desc.scheme == "": - server = "https://" + server - - # save variables - self.server = server - self.api_key = api_key - self.verify_cert = verify_cert - - def call(self, http_method, api_path, params=None, raw_data=False): - """Call VMRay REST API""" - - # get function of requests package - requests_func = getattr(requests, http_method.lower()) - - # parse parameters - req_params = {} - file_params = {} - - if params is not None: - for key, value in params.items(): - if isinstance(value, (datetime.date, - datetime.datetime, - float, - int)): - req_params[key] = str(value) - elif isinstance(value, str): - req_params[key] = str(value) - elif isinstance(value, dict): - filename = value["filename"] - sample = value["data"] - file_params[key] = (filename, sample, "application/octet-stream") - elif hasattr(value, "read"): - filename = os.path.split(value.name)[1] - # For the following block refer to DEV-1820 - try: - filename.decode("ASCII") - except (UnicodeDecodeError, UnicodeEncodeError): - b64_key = key + "name_b64enc" - byte_value = filename.encode("utf-8") - b64_value = base64.b64encode(byte_value) - - filename = "@param=%s" % b64_key - req_params[b64_key] = b64_value - file_params[key] = (filename, value, "application/octet-stream") - else: - raise VMRayRESTAPIError("Parameter \"%s\" has unknown type \"%s\"" % (key, type(value))) - - # construct request - if file_params: - files = file_params - else: - files = None - - # we need to adjust some stuff for POST requests - if http_method.lower() == "post": - req_data = req_params - req_params = None - else: - req_data = None - - # do request - result = requests_func(self.server + api_path, data=req_data, params=req_params, headers={"Authorization": "api_key " + self.api_key}, files=files, verify=self.verify_cert, stream=raw_data) - handle_rest_api_result(result) - - if raw_data: - return result.raw - - # parse result - try: - json_result = result.json() - except ValueError: - raise ValueError("API returned invalid JSON: %s" % (result.text)) - - # if there are no cached elements then return the data - if "continuation_id" not in json_result: - return json_result.get("data", None) - - data = json_result["data"] - - # get cached results - while "continuation_id" in json_result: - # send request to server - result = requests.get("%s/rest/continuation/%u" % (self.server, json_result["continuation_id"]), headers={"Authorization": "api_key " + self.api_key}, verify=self.verify_cert) - handle_rest_api_result(result) - - # parse result - try: - json_result = result.json() - except ValueError: - raise ValueError("API returned invalid JSON: %s" % (result.text)) - - data.extend(json_result["data"]) - - return data diff --git a/misp_modules/modules/expansion/apivoid.py b/misp_modules/modules/expansion/apivoid.py index a71b5e6..fc0d43e 100755 --- a/misp_modules/modules/expansion/apivoid.py +++ b/misp_modules/modules/expansion/apivoid.py @@ -4,8 +4,8 @@ from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} -mispattributes = {'input': ['domain', 'hostname'], 'format': 'misp_standard'} -moduleinfo = {'version': '0.1', 'author': 'Christian Studer', +mispattributes = {'input': ['domain', 'hostname', 'email', 'email-src', 'email-dst', 'email-reply-to', 'dns-soa-email', 'target-email', 'whois-registrant-email'], 'format': 'misp_standard'} +moduleinfo = {'version': '0.2', 'author': 'Christian Studer', 'description': 'On demand query API for APIVoid.', 'module-type': ['expansion', 'hover']} moduleconfig = ['apikey'] @@ -43,6 +43,31 @@ class APIVoidParser(): ssl = requests.get(f'{self.url.format("sslinfo", apikey)}host={self.attribute.value}').json() self._parse_ssl_certificate(ssl['data']['certificate']) + def handle_email(self, apikey): + feature = 'emailverify' + if requests.get(f'{self.url.format(feature, apikey)}stats').json()['credits_remained'] < 0.06: + self.result = {'error': 'You do not have enough APIVoid credits to proceed your request.'} + return + emaillookup = requests.get(f'{self.url.format(feature, apikey)}email={self.attribute.value}').json() + email_verification = MISPObject('apivoid-email-verification') + boolean_attributes = ['valid_format', 'suspicious_username', 'suspicious_email', 'dirty_words_username', + 'suspicious_email', 'valid_tld', 'disposable', 'has_a_records', 'has_mx_records', + 'has_spf_records', 'is_spoofable', 'dmarc_configured', 'dmarc_enforced', 'free_email', + 'russian_free_email', 'china_free_email', 'suspicious_domain', 'dirty_words_domain', + 'domain_popular', 'risky_tld', 'police_domain', 'government_domain', 'educational_domain', + 'should_block'] + for boolean_attribute in boolean_attributes: + email_verification.add_attribute(boolean_attribute, + **{'type': 'boolean', 'value': emaillookup['data'][boolean_attribute]}) + email_verification.add_attribute('email', **{'type': 'email', 'value': emaillookup['data']['email']}) + email_verification.add_attribute('username', **{'type': 'text', 'value': emaillookup['data']['username']}) + email_verification.add_attribute('role_address', + **{'type': 'boolean', 'value': emaillookup['data']['role_address']}) + email_verification.add_attribute('domain', **{'type': 'domain', 'value': emaillookup['data']['domain']}) + email_verification.add_attribute('score', **{'type': 'float', 'value': emaillookup['data']['score']}) + email_verification.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(email_verification) + def _handle_dns_record(self, item, record_type, relationship): dns_record = MISPObject('dns-record') dns_record.add_attribute('queried-domain', type='domain', value=item['host']) @@ -82,7 +107,10 @@ def handler(q=False): return {'error': 'Unsupported attribute type.'} apikey = request['config']['apikey'] apivoid_parser = APIVoidParser(attribute) - apivoid_parser.parse_domain(apikey) + if attribute['type'] in ['domain', 'hostname']: + apivoid_parser.parse_domain(apikey) + else: + apivoid_parser.handle_email(apikey) return apivoid_parser.get_results() diff --git a/misp_modules/modules/expansion/assemblyline_query.py b/misp_modules/modules/expansion/assemblyline_query.py index 67fce45..90bdd3c 100644 --- a/misp_modules/modules/expansion/assemblyline_query.py +++ b/misp_modules/modules/expansion/assemblyline_query.py @@ -11,7 +11,7 @@ mispattributes = {'input': ['link'], 'format': 'misp_standard'} moduleinfo = {'version': '1', 'author': 'Christian Studer', 'description': 'Query AssemblyLine with a report URL to get the parsed data.', 'module-type': ['expansion']} -moduleconfig = ["apiurl", "user_id", "apikey", "password"] +moduleconfig = ["apiurl", "user_id", "apikey", "password", "verifyssl"] class AssemblyLineParser(): @@ -125,7 +125,7 @@ def parse_config(apiurl, user_id, config): error = {"error": "Please provide your AssemblyLine API key or Password."} if config.get('apikey'): try: - return Client(apiurl, apikey=(user_id, config['apikey'])) + return Client(apiurl, apikey=(user_id, config['apikey']), verify=config['verifyssl']) except ClientError as e: error['error'] = f'Error while initiating a connection with AssemblyLine: {e.__str__()}' if config.get('password'): diff --git a/misp_modules/modules/expansion/assemblyline_submit.py b/misp_modules/modules/expansion/assemblyline_submit.py index 206f5c0..9e019ff 100644 --- a/misp_modules/modules/expansion/assemblyline_submit.py +++ b/misp_modules/modules/expansion/assemblyline_submit.py @@ -7,7 +7,7 @@ from urllib.parse import urljoin moduleinfo = {"version": 1, "author": "Christian Studer", "module-type": ["expansion"], "description": "Submit files or URLs to AssemblyLine"} -moduleconfig = ["apiurl", "user_id", "apikey", "password"] +moduleconfig = ["apiurl", "user_id", "apikey", "password", "verifyssl"] mispattributes = {"input": ["attachment", "malware-sample", "url"], "output": ["link"]} @@ -16,12 +16,12 @@ def parse_config(apiurl, user_id, config): error = {"error": "Please provide your AssemblyLine API key or Password."} if config.get('apikey'): try: - return Client(apiurl, apikey=(user_id, config['apikey'])) + return Client(apiurl, apikey=(user_id, config['apikey']), verify=config['verifyssl']) except ClientError as e: error['error'] = f'Error while initiating a connection with AssemblyLine: {e.__str__()}' if config.get('password'): try: - return Client(apiurl, auth=(user_id, config['password'])) + return Client(apiurl, auth=(user_id, config['password']), verify=config['verifyssl']) except ClientError as e: error['error'] = f'Error while initiating a connection with AssemblyLine: {e.__str__()}' return error diff --git a/misp_modules/modules/expansion/censys_enrich.py b/misp_modules/modules/expansion/censys_enrich.py index d5823ff..f423712 100644 --- a/misp_modules/modules/expansion/censys_enrich.py +++ b/misp_modules/modules/expansion/censys_enrich.py @@ -1,15 +1,26 @@ # encoding: utf-8 import json +import configparser import base64 import codecs +import censys.common.config from dateutil.parser import isoparse from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject + try: - import censys.base - import censys.ipv4 - import censys.websites - import censys.certificates + #needed in order to overwrite the censys module intent of creating config files in the home folder of the proccess owner + #-- + def get_config_over() -> configparser.ConfigParser: + config = configparser.ConfigParser() + config[censys.common.config.DEFAULT] = censys.common.config.default_config + return config + censys.common.config.get_config = get_config_over + #-- + + from censys.search import CensysHosts + from censys.search import CensysCertificates + from censys.common.base import * except ImportError: print("Censys module not installed. Try 'pip install censys'") @@ -20,8 +31,11 @@ mispattributes = {'input': ['ip-src', 'ip-dst', 'domain', 'hostname', 'hostname| moduleinfo = {'version': '0.1', 'author': 'Loïc Fortemps', 'description': 'Censys.io expansion module', 'module-type': ['expansion', 'hover']} +api_id = None +api_secret = None def handler(q=False): + global api_id, api_secret if q is False: return False request = json.loads(q) @@ -46,7 +60,6 @@ def handler(q=False): attribute = MISPAttribute() attribute.from_dict(**request['attribute']) # Lists to accomodate multi-types attribute - conn = list() types = list() values = list() results = list() @@ -65,26 +78,29 @@ def handler(q=False): types.append(attribute.type) values.append(attribute.value) + found = False for t in types: - # ip, ip-src or ip-dst - if t[:2] == "ip": - conn.append(censys.ipv4.CensysIPv4(api_id=api_id, api_secret=api_secret)) - elif t == 'domain' or t == "hostname": - conn.append(censys.websites.CensysWebsites(api_id=api_id, api_secret=api_secret)) - elif 'x509-fingerprint' in t: - conn.append(censys.certificates.CensysCertificates(api_id=api_id, api_secret=api_secret)) - - found = True - for c in conn: - val = values.pop(0) try: - r = c.view(val) - results.append(parse_response(r, attribute)) - found = True - except censys.base.CensysNotFoundException: - found = False - except Exception: - misperrors['error'] = "Connection issue" + value = values.pop(0) + # ip, ip-src or ip-dst + if t[:2] == "ip": + r = CensysHosts(api_id, api_secret).view(value) + results.append(parse_response(r, attribute)) + found = True + elif t == 'domain' or t == "hostname": + # get ips + endpoint = CensysHosts(api_id, api_secret) + for r_list in endpoint.search(query=value, per_page=5, pages=1): + for r in r_list: + results.append(parse_response(r, attribute)) + found = True + elif 'x509-fingerprint-sha256' in t: + # use api_v1 as Certificates endpoint in api_v2 doesn't yet provide all the details + r = CensysCertificates(api_id, api_secret).view(value) + results.append(parse_response(r, attribute)) + found = True + except CensysException as e: + misperrors['error'] = "ERROR: param {} / response: {}".format(value, e) return misperrors if not found: @@ -98,38 +114,43 @@ def parse_response(censys_output, attribute): misp_event = MISPEvent() misp_event.add_attribute(**attribute) # Generic fields (for IP/Websites) - if "autonomous_system" in censys_output: - cen_as = censys_output['autonomous_system'] + if censys_output.get('autonomous_system'): + cen_as = censys_output.get('autonomous_system') asn_object = MISPObject('asn') - asn_object.add_attribute('asn', value=cen_as["asn"]) - asn_object.add_attribute('description', value=cen_as['name']) - asn_object.add_attribute('subnet-announced', value=cen_as['routed_prefix']) - asn_object.add_attribute('country', value=cen_as['country_code']) + asn_object.add_attribute('asn', value=cen_as.get("asn")) + asn_object.add_attribute('description', value=cen_as.get('name')) + asn_object.add_attribute('subnet-announced', value=cen_as.get('routed_prefix')) + asn_object.add_attribute('country', value=cen_as.get('country_code')) asn_object.add_reference(attribute.uuid, 'associated-to') misp_event.add_object(**asn_object) - if "ip" in censys_output and "ports" in censys_output: + if censys_output.get('ip') and len(censys_output.get('services')): #"ports" in censys_output ip_object = MISPObject('ip-port') - ip_object.add_attribute('ip', value=censys_output['ip']) - for p in censys_output['ports']: - ip_object.add_attribute('dst-port', value=p) + ip_object.add_attribute('ip', value=censys_output.get('ip')) + for serv in censys_output.get('services'): + if serv.get('port'): + ip_object.add_attribute('dst-port', value=serv.get('port')) ip_object.add_reference(attribute.uuid, 'associated-to') misp_event.add_object(**ip_object) # We explore all ports to find https or ssh services - for k in censys_output.keys(): - if not isinstance(censys_output[k], dict): + for serv in censys_output.get('services', []): + if not isinstance(serv, dict): continue - if 'https' in censys_output[k]: + if serv.get('service_name').lower() == 'http' and serv.get('certificate', None): try: - cert = censys_output[k]['https']['tls']['certificate'] - cert_obj = get_certificate_object(cert, attribute) - misp_event.add_object(**cert_obj) + cert = serv.get('certificate', None) + if cert: + # TODO switch to api_v2 once available + # use api_v1 as Certificates endpoint in api_v2 doesn't yet provide all the details + cert_details = CensysCertificates(api_id, api_secret).view(cert) + cert_obj = get_certificate_object(cert_details, attribute) + misp_event.add_object(**cert_obj) except KeyError: print("Error !") - if 'ssh' in censys_output[k]: + if serv.get('ssh') and serv.get('service_name').lower() == 'ssh': try: - cert = censys_output[k]['ssh']['v2']['server_host_key'] + cert = serv.get('ssh').get('server_host_key').get('fingerprint_sha256') # TODO enable once the type is merged # misp_event.add_attribute(type='hasshserver-sha256', value=cert['fingerprint_sha256']) except KeyError: @@ -144,20 +165,20 @@ def parse_response(censys_output, attribute): if "location" in censys_output: loc_obj = MISPObject('geolocation') loc = censys_output['location'] - loc_obj.add_attribute('latitude', value=loc['latitude']) - loc_obj.add_attribute('longitude', value=loc['longitude']) + loc_obj.add_attribute('latitude', value=loc.get('coordinates', {}).get('latitude', None)) + loc_obj.add_attribute('longitude', value=loc.get('coordinates', {}).get('longitude', None)) if 'city' in loc: - loc_obj.add_attribute('city', value=loc['city']) - loc_obj.add_attribute('country', value=loc['country']) + loc_obj.add_attribute('city', value=loc.get('city')) + loc_obj.add_attribute('country', value=loc.get('country')) if 'postal_code' in loc: - loc_obj.add_attribute('zipcode', value=loc['postal_code']) + loc_obj.add_attribute('zipcode', value=loc.get('postal_code')) if 'province' in loc: - loc_obj.add_attribute('region', value=loc['province']) + loc_obj.add_attribute('region', value=loc.get('province')) loc_obj.add_reference(attribute.uuid, 'associated-to') misp_event.add_object(**loc_obj) event = json.loads(misp_event.to_json()) - return {'Object': event['Object'], 'Attribute': event['Attribute']} + return {'Object': event.get('Object', []), 'Attribute': event.get('Attribute', [])} # In case of multiple enrichment (ip and domain), we need to filter out similar objects @@ -166,24 +187,23 @@ def remove_duplicates(results): # Only one enrichment was performed so no duplicate if len(results) == 1: return results[0] - elif len(results) == 2: - final_result = results[0] - obj_l2 = results[1]['Object'] - for o2 in obj_l2: - if o2['name'] == "asn": - key = "asn" - elif o2['name'] == "ip-port": - key = "ip" - elif o2['name'] == "x509": - key = "x509-fingerprint-sha256" - elif o2['name'] == "geolocation": - key = "latitude" - if not check_if_present(o2, key, final_result['Object']): - final_result['Object'].append(o2) - - return final_result else: - return [] + final_result = results[0] + for i,result in enumerate(results[1:]): + obj_l = results[i+1].get('Object', []) + for o2 in obj_l: + if o2['name'] == "asn": + key = "asn" + elif o2['name'] == "ip-port": + key = "ip" + elif o2['name'] == "x509": + key = "x509-fingerprint-sha256" + elif o2['name'] == "geolocation": + key = "latitude" + if not check_if_present(o2, key, final_result.get('Object', [])): + final_result['Object'].append(o2) + + return final_result def check_if_present(object, attribute_name, list_objects): @@ -253,4 +273,4 @@ def introspection(): def version(): moduleinfo['config'] = moduleconfig - return moduleinfo + return moduleinfo \ No newline at end of file diff --git a/misp_modules/modules/expansion/crowdstrike_falcon.py b/misp_modules/modules/expansion/crowdstrike_falcon.py index 1342e88..c26d59f 100755 --- a/misp_modules/modules/expansion/crowdstrike_falcon.py +++ b/misp_modules/modules/expansion/crowdstrike_falcon.py @@ -1,42 +1,44 @@ import json -import requests +from . import check_input_attribute, standard_error_message +from falconpy import Intel +from pymisp import MISPAttribute, MISPEvent -moduleinfo = {'version': '0.1', +moduleinfo = {'version': '0.2', 'author': 'Christophe Vandeplas', 'description': 'Module to query CrowdStrike Falcon.', - 'module-type': ['expansion']} + 'module-type': ['expansion', 'hover']} moduleconfig = ['api_id', 'apikey'] misperrors = {'error': 'Error'} -misp_types_in = ['domain', 'email-attachment', 'email-dst', 'email-reply-to', 'email-src', 'email-subject', +misp_type_in = ['domain', 'email-attachment', 'email-dst', 'email-reply-to', 'email-src', 'email-subject', 'filename', 'hostname', 'ip', 'ip-src', 'ip-dst', 'md5', 'mutex', 'regkey', 'sha1', 'sha256', 'uri', 'url', 'user-agent', 'whois-registrant-email', 'x509-fingerprint-md5'] -mapping_out = { # mapping between the MISP attributes types and the compatible CrowdStrike indicator types. - 'domain': {'types': 'hostname', 'to_ids': True}, - 'email_address': {'types': 'email-src', 'to_ids': True}, - 'email_subject': {'types': 'email-subject', 'to_ids': True}, - 'file_name': {'types': 'filename', 'to_ids': True}, - 'hash_md5': {'types': 'md5', 'to_ids': True}, - 'hash_sha1': {'types': 'sha1', 'to_ids': True}, - 'hash_sha256': {'types': 'sha256', 'to_ids': True}, - 'ip_address': {'types': 'ip-dst', 'to_ids': True}, - 'ip_address_block': {'types': 'ip-dst', 'to_ids': True}, - 'mutex_name': {'types': 'mutex', 'to_ids': True}, - 'registry': {'types': 'regkey', 'to_ids': True}, - 'url': {'types': 'url', 'to_ids': True}, - 'user_agent': {'types': 'user-agent', 'to_ids': True}, - 'x509_serial': {'types': 'x509-fingerprint-md5', 'to_ids': True}, +mapping_out = { # mapping between the MISP attributes type and the compatible CrowdStrike indicator types. + 'domain': {'type': 'hostname', 'to_ids': True}, + 'email_address': {'type': 'email-src', 'to_ids': True}, + 'email_subject': {'type': 'email-subject', 'to_ids': True}, + 'file_name': {'type': 'filename', 'to_ids': True}, + 'hash_md5': {'type': 'md5', 'to_ids': True}, + 'hash_sha1': {'type': 'sha1', 'to_ids': True}, + 'hash_sha256': {'type': 'sha256', 'to_ids': True}, + 'ip_address': {'type': 'ip-dst', 'to_ids': True}, + 'ip_address_block': {'type': 'ip-dst', 'to_ids': True}, + 'mutex_name': {'type': 'mutex', 'to_ids': True}, + 'registry': {'type': 'regkey', 'to_ids': True}, + 'url': {'type': 'url', 'to_ids': True}, + 'user_agent': {'type': 'user-agent', 'to_ids': True}, + 'x509_serial': {'type': 'x509-fingerprint-md5', 'to_ids': True}, - 'actors': {'types': 'threat-actor'}, - 'malware_families': {'types': 'text', 'categories': 'Attribution'} + 'actors': {'type': 'threat-actor', 'category': 'Attribution'}, + 'malware_families': {'type': 'text', 'category': 'Attribution'} } -misp_types_out = [item['types'] for item in mapping_out.values()] -mispattributes = {'input': misp_types_in, 'output': misp_types_out} - +misp_type_out = [item['type'] for item in mapping_out.values()] +mispattributes = {'input': misp_type_in, 'format': 'misp_standard'} def handler(q=False): if q is False: return False request = json.loads(q) + #validate CrowdStrike params if (request.get('config')): if (request['config'].get('apikey') is None): misperrors['error'] = 'CrowdStrike apikey is missing' @@ -44,41 +46,64 @@ def handler(q=False): if (request['config'].get('api_id') is None): misperrors['error'] = 'CrowdStrike api_id is missing' return misperrors + + #validate attribute + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request.get('attribute') + if not any(input_type == attribute.get('type') for input_type in misp_type_in): + return {'error': 'Unsupported attribute type.'} + client = CSIntelAPI(request['config']['api_id'], request['config']['apikey']) + attribute = MISPAttribute() + attribute.from_dict(**request.get('attribute') ) r = {"results": []} - valid_type = False - for k in misp_types_in: - if request.get(k): - # map the MISP typ to the CrowdStrike type - for item in lookup_indicator(client, request[k]): - r['results'].append(item) - valid_type = True + + try: + for k in misp_type_in: + if attribute.type == k: + # map the MISP type to the CrowdStrike type + r['results'].append(lookup_indicator(client, attribute)) + valid_type = True + except Exception as e: + return {'error': f"{e}"} if not valid_type: misperrors['error'] = "Unsupported attributes type" return misperrors - return r + return {'results': r.get('results').pop()} -def lookup_indicator(client, item): - result = client.search_indicator(item) - for item in result: - for relation in item['relations']: - if mapping_out.get(relation['type']): - r = mapping_out[relation['type']].copy() - r['values'] = relation['indicator'] - yield(r) - for actor in item['actors']: - r = mapping_out['actors'].copy() - r['values'] = actor - yield(r) - for malware_family in item['malware_families']: - r = mapping_out['malware_families'].copy() - r['values'] = malware_family - yield(r) +def lookup_indicator(client, ref_attribute): + result = client.search_indicator(ref_attribute.value) + misp_event = MISPEvent() + misp_event.add_attribute(**ref_attribute) + for item in result.get('resources', []): + for relation in item.get('relations'): + if mapping_out.get(relation.get('type')): + r = mapping_out[relation.get('type')].copy() + r['value'] = relation.get('indicator') + attribute = MISPAttribute() + attribute.from_dict(**r) + misp_event.add_attribute(**attribute) + for actor in item.get('actors'): + r = mapping_out.get('actors').copy() + r['value'] = actor + attribute = MISPAttribute() + attribute.from_dict(**r) + misp_event.add_attribute(**attribute) + if item.get('malware_families'): + r = mapping_out.get('malware_families').copy() + r['value'] = f"malware_families: {' | '.join(item.get('malware_families'))}" + attribute = MISPAttribute() + attribute.from_dict(**r) + misp_event.add_attribute(**attribute) + + event = json.loads(misp_event.to_json()) + return {'Object': event.get('Object', []), 'Attribute': event.get('Attribute', [])} def introspection(): return mispattributes @@ -90,39 +115,25 @@ def version(): class CSIntelAPI(): - def __init__(self, custid=None, custkey=None, perpage=100, page=1, baseurl="https://intelapi.crowdstrike.com/indicator/v2/search/"): + def __init__(self, custid=None, custkey=None): # customer id and key should be passed when obj is created - self.custid = custid - self.custkey = custkey + self.falcon = Intel(client_id=custid, client_secret=custkey) - self.baseurl = baseurl - self.perpage = perpage - self.page = page - - def request(self, query): - headers = {'X-CSIX-CUSTID': self.custid, - 'X-CSIX-CUSTKEY': self.custkey, - 'Content-Type': 'application/json'} - - full_query = self.baseurl + query - - r = requests.get(full_query, headers=headers) + def search_indicator(self, query): + r = self.falcon.query_indicator_entities(q=query) # 400 - bad request - if r.status_code == 400: + if r.get('status_code') == 400: raise Exception('HTTP Error 400 - Bad request.') # 404 - oh shit - if r.status_code == 404: + if r.get('status_code') == 404: raise Exception('HTTP Error 404 - awww snap.') # catch all? - if r.status_code != 200: - raise Exception('HTTP Error: ' + str(r.status_code)) + if r.get('status_code') != 200: + raise Exception('HTTP Error: ' + str(r.get('status_code'))) - if r.text: - return r + if len(r.get('body').get('errors')): + raise Exception('API Error: ' + ' | '.join(r.get('body').get('errors'))) - def search_indicator(self, item): - query = 'indicator?match=' + item - r = self.request(query) - return json.loads(r.text) + return r.get('body', {}) \ No newline at end of file diff --git a/misp_modules/modules/expansion/cve_advanced.py b/misp_modules/modules/expansion/cve_advanced.py index 9071ff9..4be69c6 100644 --- a/misp_modules/modules/expansion/cve_advanced.py +++ b/misp_modules/modules/expansion/cve_advanced.py @@ -23,11 +23,11 @@ class VulnerabilityParser(): self.references = defaultdict(list) self.capec_features = ('id', 'name', 'summary', 'prerequisites', 'solutions') self.vulnerability_mapping = { - 'id': ('vulnerability', 'id'), 'summary': ('text', 'summary'), - 'vulnerable_configuration': ('cpe', 'vulnerable_configuration'), - 'vulnerable_configuration_cpe_2_2': ('cpe', 'vulnerable_configuration'), - 'Modified': ('datetime', 'modified'), 'Published': ('datetime', 'published'), - 'references': ('link', 'references'), 'cvss': ('float', 'cvss-score')} + 'id': 'id', 'summary': 'summary', + 'vulnerable_configuration': 'vulnerable-configuration', + 'vulnerable_configuration_cpe_2_2': 'vulnerable-configuration', + 'Modified': 'modified', 'Published': 'published', + 'references': 'references', 'cvss': 'cvss-score'} self.weakness_mapping = {'name': 'name', 'description_summary': 'description', 'status': 'status', 'weaknessabs': 'weakness-abs'} @@ -43,18 +43,17 @@ class VulnerabilityParser(): for feature in ('id', 'summary', 'Modified', 'cvss'): value = self.vulnerability.get(feature) if value: - attribute_type, relation = self.vulnerability_mapping[feature] - vulnerability_object.add_attribute(relation, **{'type': attribute_type, 'value': value}) + vulnerability_object.add_attribute(self.vulnerability_mapping[feature], value) if 'Published' in self.vulnerability: - vulnerability_object.add_attribute('published', **{'type': 'datetime', 'value': self.vulnerability['Published']}) - vulnerability_object.add_attribute('state', **{'type': 'text', 'value': 'Published'}) + vulnerability_object.add_attribute('published', self.vulnerability['Published']) + vulnerability_object.add_attribute('state', 'Published') for feature in ('references', 'vulnerable_configuration', 'vulnerable_configuration_cpe_2_2'): if feature in self.vulnerability: - attribute_type, relation = self.vulnerability_mapping[feature] + relation = self.vulnerability_mapping[feature] for value in self.vulnerability[feature]: if isinstance(value, dict): value = value['title'] - vulnerability_object.add_attribute(relation, **{'type': attribute_type, 'value': value}) + vulnerability_object.add_attribute(relation, value) vulnerability_object.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(vulnerability_object) if 'cwe' in self.vulnerability and self.vulnerability['cwe'] not in ('Unknown', 'NVD-CWE-noinfo'): @@ -74,10 +73,9 @@ class VulnerabilityParser(): for capec in self.vulnerability['capec']: capec_object = MISPObject('attack-pattern') for feature in self.capec_features: - capec_object.add_attribute(feature, **{'type': 'text', 'value': capec[feature]}) + capec_object.add_attribute(feature, capec[feature]) for related_weakness in capec['related_weakness']: - attribute = {'type': 'weakness', 'value': f"CWE-{related_weakness}"} - capec_object.add_attribute('related-weakness', **attribute) + capec_object.add_attribute('related-weakness', f"CWE-{related_weakness}") self.misp_event.add_object(capec_object) self.references[vulnerability_uuid].append( { @@ -87,16 +85,16 @@ class VulnerabilityParser(): ) def __parse_weakness(self, vulnerability_uuid): - cwe_string, cwe_id = self.vulnerability['cwe'].split('-') + cwe_string, cwe_id = self.vulnerability['cwe'].split('-')[:2] cwes = requests.get(self.api_url.replace('/cve/', '/cwe')) if cwes.status_code == 200: for cwe in cwes.json(): if cwe['id'] == cwe_id: weakness_object = MISPObject('weakness') - weakness_object.add_attribute('id', {'type': 'weakness', 'value': f'{cwe_string}-{cwe_id}'}) + weakness_object.add_attribute('id', f'{cwe_string}-{cwe_id}') for feature, relation in self.weakness_mapping.items(): if cwe.get(feature): - weakness_object.add_attribute(relation, **{'type': 'text', 'value': cwe[feature]}) + weakness_object.add_attribute(relation, cwe[feature]) self.misp_event.add_object(weakness_object) self.references[vulnerability_uuid].append( { diff --git a/misp_modules/modules/expansion/domaintools.py b/misp_modules/modules/expansion/domaintools.py index d952fdf..353b456 100755 --- a/misp_modules/modules/expansion/domaintools.py +++ b/misp_modules/modules/expansion/domaintools.py @@ -1,3 +1,7 @@ +# This module does not appear to be actively maintained. +# Please see https://github.com/DomainTools/domaintools_misp +# for the official DomainTools-supported MISP app + import json import logging import sys diff --git a/misp_modules/modules/expansion/farsight_passivedns.py b/misp_modules/modules/expansion/farsight_passivedns.py index a338bfb..7cf6f66 100755 --- a/misp_modules/modules/expansion/farsight_passivedns.py +++ b/misp_modules/modules/expansion/farsight_passivedns.py @@ -1,22 +1,82 @@ +import dnsdb2 import json -from ._dnsdb_query.dnsdb_query import DEFAULT_DNSDB_SERVER, DnsdbClient, QueryError from . import check_input_attribute, standard_error_message -from pymisp import MISPEvent, MISPObject +from datetime import datetime +from pymisp import MISPEvent, MISPObject, Distribution misperrors = {'error': 'Error'} +standard_query_input = [ + 'hostname', + 'domain', + 'ip-src', + 'ip-dst' +] +flex_query_input = [ + 'btc', + 'dkim', + 'email', + 'email-src', + 'email-dst', + 'domain|ip', + 'hex', + 'mac-address', + 'mac-eui-64', + 'other', + 'pattern-filename', + 'target-email', + 'text', + 'uri', + 'url', + 'whois-registrant-email', +] mispattributes = { - 'input': ['hostname', 'domain', 'ip-src', 'ip-dst'], + 'input': standard_query_input + flex_query_input, 'format': 'misp_standard' } moduleinfo = { - 'version': '0.2', + 'version': '0.5', 'author': 'Christophe Vandeplas', 'description': 'Module to access Farsight DNSDB Passive DNS', 'module-type': ['expansion', 'hover'] } -moduleconfig = ['apikey', 'server', 'limit'] +moduleconfig = ['apikey', 'server', 'limit', 'flex_queries'] +DEFAULT_DNSDB_SERVER = 'https://api.dnsdb.info' DEFAULT_LIMIT = 10 +DEFAULT_DISTRIBUTION_SETTING = Distribution.your_organisation_only.value +TYPE_TO_FEATURE = { + "btc": "Bitcoin address", + "dkim": "domainkeys identified mail", + "domain": "domain name", + "domain|ip": "domain name / IP address", + "hex": "value in hexadecimal format", + "hostname": "hostname", + "mac-address": "MAC address", + "mac-eui-64": "MAC EUI-64 address", + "pattern-filename": "pattern in the name of a file", + "target-email": "attack target email", + "uri": "Uniform Resource Identifier", + "url": "Uniform Resource Locator", + "whois-registrant-email": "email of a domain's registrant" +} +TYPE_TO_FEATURE.update( + dict.fromkeys( + ("ip-src", "ip-dst"), + "IP address" + ) +) +TYPE_TO_FEATURE.update( + dict.fromkeys( + ("email", "email-src", "email-dst"), + "email address" + ) +) +TYPE_TO_FEATURE.update( + dict.fromkeys( + ("other", "text"), + "text" + ) +) class FarsightDnsdbParser(): @@ -25,8 +85,9 @@ class FarsightDnsdbParser(): self.misp_event = MISPEvent() self.misp_event.add_attribute(**attribute) self.passivedns_mapping = { - 'bailiwick': {'type': 'text', 'object_relation': 'bailiwick'}, + 'bailiwick': {'type': 'domain', 'object_relation': 'bailiwick'}, 'count': {'type': 'counter', 'object_relation': 'count'}, + 'raw_rdata': {'type': 'text', 'object_relation': 'raw_rdata'}, 'rdata': {'type': 'text', 'object_relation': 'rdata'}, 'rrname': {'type': 'text', 'object_relation': 'rrname'}, 'rrtype': {'type': 'text', 'object_relation': 'rrtype'}, @@ -35,37 +96,23 @@ class FarsightDnsdbParser(): 'zone_time_first': {'type': 'datetime', 'object_relation': 'zone_time_first'}, 'zone_time_last': {'type': 'datetime', 'object_relation': 'zone_time_last'} } - self.type_to_feature = { - 'domain': 'domain name', - 'hostname': 'hostname', - 'ip-src': 'IP address', - 'ip-dst': 'IP address' - } - self.comment = 'Result from an %s lookup on DNSDB about the %s: %s' + self.comment = 'Result from a %s lookup on DNSDB about the %s: %s' def parse_passivedns_results(self, query_response): - default_fields = ('count', 'rrname', 'rrname') - optional_fields = ( - 'bailiwick', - 'time_first', - 'time_last', - 'zone_time_first', - 'zone_time_last' - ) for query_type, results in query_response.items(): - comment = self.comment % (query_type, self.type_to_feature[self.attribute['type']], self.attribute['value']) + comment = self.comment % (query_type, TYPE_TO_FEATURE[self.attribute['type']], self.attribute['value']) for result in results: passivedns_object = MISPObject('passive-dns') - for feature in default_fields: - passivedns_object.add_attribute(**self._parse_attribute(comment, feature, result[feature])) - for feature in optional_fields: - if result.get(feature): - passivedns_object.add_attribute(**self._parse_attribute(comment, feature, result[feature])) - if isinstance(result['rdata'], list): - for rdata in result['rdata']: + passivedns_object.distribution = DEFAULT_DISTRIBUTION_SETTING + if result.get('rdata') and isinstance(result['rdata'], list): + for rdata in result.pop('rdata'): passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', rdata)) - else: - passivedns_object.add_attribute(**self._parse_attribute(comment, 'rdata', result['rdata'])) + for feature, value in result.items(): + passivedns_object.add_attribute(**self._parse_attribute(comment, feature, value)) + if result.get('time_first'): + passivedns_object.first_seen = result['time_first'] + if result.get('time_last'): + passivedns_object.last_seen = result['time_last'] passivedns_object.add_reference(self.attribute['uuid'], 'related-to') self.misp_event.add_object(passivedns_object) @@ -75,7 +122,7 @@ class FarsightDnsdbParser(): return {'results': results} def _parse_attribute(self, comment, feature, value): - attribute = {'value': value, 'comment': comment} + attribute = {'value': value, 'comment': comment, 'distribution': DEFAULT_DISTRIBUTION_SETTING} attribute.update(self.passivedns_mapping[feature]) return attribute @@ -93,40 +140,90 @@ def handler(q=False): if attribute['type'] not in mispattributes['input']: return {'error': 'Unsupported attributes type'} config = request['config'] - args = {'apikey': config['apikey']} - for feature, default in zip(('server', 'limit'), (DEFAULT_DNSDB_SERVER, DEFAULT_LIMIT)): - args[feature] = config[feature] if config.get(feature) else default - client = DnsdbClient(**args) - to_query = lookup_ip if attribute['type'] in ('ip-src', 'ip-dst') else lookup_name - response = to_query(client, attribute['value']) + if not config.get('server'): + config['server'] = DEFAULT_DNSDB_SERVER + client_args = {feature: config[feature] for feature in ('apikey', 'server')} + client = dnsdb2.Client(**client_args) + to_query, args = parse_input(attribute, config) + try: + response = to_query(client, *args) + except dnsdb2.DnsdbException as e: + return {'error': e.__str__()} + except dnsdb2.exceptions.QueryError: + return {'error': 'Communication error occurs while executing a query, or the server reports an error due to invalid arguments.'} if not response: - return {'error': f"Empty results on Farsight DNSDB for the queries {attribute['type']}: {attribute['value']}."} + return {'error': f"Empty results on Farsight DNSDB for the {TYPE_TO_FEATURE[attribute['type']]}: {attribute['value']}."} parser = FarsightDnsdbParser(attribute) parser.parse_passivedns_results(response) return parser.get_results() -def lookup_name(client, name): +def parse_input(attribute, config): + lookup_args = { + 'limit': config['limit'] if config.get('limit') else DEFAULT_LIMIT, + 'offset': 0, + 'ignore_limited': True, + 'humantime': True + } + if attribute.get('first_seen'): + lookup_args['time_first_after'] = parse_timestamp(attribute['first_seen']) + attribute_type = attribute['type'] + if attribute_type in flex_query_input: + return flex_queries, (lookup_args, attribute['value']) + flex = add_flex_queries(config.get('flex_queries')) + to_query = lookup_ip if 'ip-' in attribute_type else lookup_name + return to_query, (lookup_args, attribute['value'], flex) + + +def parse_timestamp(str_date): + datetime_date = datetime.strptime(str_date, '%Y-%m-%dT%H:%M:%S.%f%z') + return str(int(datetime_date.timestamp())) + + +def add_flex_queries(flex): + if not flex: + return False + if flex in ('True', 'true', True, '1', 1): + return True + return False + + +def flex_queries(client, lookup_args, name): response = {} - try: - res = client.query_rrset(name) # RRSET = entries in the left-hand side of the domain name related labels - response['rrset'] = list(res) - except QueryError: - pass - try: - res = client.query_rdata_name(name) # RDATA = entries on the right-hand side of the domain name related labels - response['rdata'] = list(res) - except QueryError: - pass + name = name.replace('@', '.') + for feature in ('rdata', 'rrnames'): + to_call = getattr(client, f'flex_{feature}_regex') + results = list(to_call(name, **lookup_args)) + for result in list(to_call(name.replace('.', '\\.'), **lookup_args)): + if result not in results: + results.append(result) + if results: + response[f'flex_{feature}'] = results return response -def lookup_ip(client, ip): - try: - res = client.query_rdata_ip(ip) - response = {'rdata': list(res)} - except QueryError: - response = {} +def lookup_name(client, lookup_args, name, flex): + response = {} + # RRSET = entries in the left-hand side of the domain name related labels + rrset_response = list(client.lookup_rrset(name, **lookup_args)) + if rrset_response: + response['rrset'] = rrset_response + # RDATA = entries on the right-hand side of the domain name related labels + rdata_response = list(client.lookup_rdata_name(name, **lookup_args)) + if rdata_response: + response['rdata'] = rdata_response + if flex: + response.update(flex_queries(client, lookup_args, name)) + return response + + +def lookup_ip(client, lookup_args, ip, flex): + response = {} + res = list(client.lookup_rdata_ip(ip, **lookup_args)) + if res: + response['rdata'] = res + if flex: + response.update(flex_queries(client, lookup_args, ip)) return response diff --git a/misp_modules/modules/expansion/google_search.py b/misp_modules/modules/expansion/google_search.py index b7b4e7a..68224ab 100644 --- a/misp_modules/modules/expansion/google_search.py +++ b/misp_modules/modules/expansion/google_search.py @@ -1,6 +1,8 @@ import json +import random +import time try: - from google import google + from googleapi import google except ImportError: print("GoogleAPI not installed. Command : pip install git+https://github.com/abenassi/Google-Search-API") @@ -10,6 +12,10 @@ moduleinfo = {'author': 'Oun & Gindt', 'module-type': ['hover'], 'description': 'An expansion hover module to expand google search information about an URL'} +def sleep(retry): + time.sleep(random.uniform(0, min(40, 0.01 * 2 ** retry))) + + def handler(q=False): if q is False: return False @@ -18,10 +24,16 @@ def handler(q=False): return {'error': "Unsupported attributes type"} num_page = 1 res = "" - search_results = google.search(request['url'], num_page) - for i in range(3): + # The googleapi module sets a random useragent. The output depends on the useragent. + # It's better to retry 3 times. + for retry in range(3): + search_results = google.search(request['url'], num_page) + if len(search_results) > 0: + break + sleep(retry) + for i, search_result in enumerate(search_results): res += "("+str(i+1)+")" + '\t' - res += json.dumps(search_results[i].description, ensure_ascii=False) + res += json.dumps(search_result.description, ensure_ascii=False) res += '\n\n' return {'results': [{'types': mispattributes['output'], 'values':res}]} diff --git a/misp_modules/modules/expansion/greynoise.py b/misp_modules/modules/expansion/greynoise.py index 4cd89d5..a2ccf13 100644 --- a/misp_modules/modules/expansion/greynoise.py +++ b/misp_modules/modules/expansion/greynoise.py @@ -1,61 +1,254 @@ -import requests import json -misperrors = {'error': 'Error'} -mispattributes = {'input': ['ip-dst', 'ip-src'], 'output': ['text']} +import requests +from pymisp import MISPEvent, MISPObject + +misperrors = {"error": "Error"} +mispattributes = {"input": ["ip-dst", "ip-src", "vulnerability"], "output": ["text"]} moduleinfo = { - 'version': '0.2', - 'author': 'Aurélien Schwab ', - 'description': 'Module to access GreyNoise.io API.', - 'module-type': ['hover'] + "version": "1.1", + "author": "Brad Chiappetta ", + "description": "Module to access GreyNoise.io API.", + "module-type": ["hover"], } -moduleconfig = ['api_key'] - -greynoise_api_url = 'https://api.greynoise.io/v2/noise/quick/' +moduleconfig = ["api_key", "api_type"] codes_mapping = { - '0x00': 'The IP has never been observed scanning the Internet', - '0x01': 'The IP has been observed by the GreyNoise sensor network', - '0x02': 'The IP has been observed scanning the GreyNoise sensor network, but has not completed a full connection, meaning this can be spoofed', - '0x03': 'The IP is adjacent to another host that has been directly observed by the GreyNoise sensor network', - '0x04': 'Reserved', - '0x05': 'This IP is commonly spoofed in Internet-scan activity', - '0x06': 'This IP has been observed as noise, but this host belongs to a cloud provider where IPs can be cycled frequently', - '0x07': 'This IP is invalid', - '0x08': 'This IP was classified as noise, but has not been observed engaging in Internet-wide scans or attacks in over 60 days' + "0x00": "The IP has never been observed scanning the Internet", + "0x01": "The IP has been observed by the GreyNoise sensor network", + "0x02": "The IP has been observed scanning the GreyNoise sensor network, " + "but has not completed a full connection, meaning this can be spoofed", + "0x03": "The IP is adjacent to another host that has been directly observed by the GreyNoise sensor network", + "0x04": "Reserved", + "0x05": "This IP is commonly spoofed in Internet-scan activity", + "0x06": "This IP has been observed as noise, but this host belongs to a cloud provider where IPs can be " + "cycled frequently", + "0x07": "This IP is invalid", + "0x08": "This IP was classified as noise, but has not been observed engaging in Internet-wide scans or " + "attacks in over 90 days", + "0x09": "IP was found in RIOT", + "0x10": "IP has been observed by the GreyNoise sensor network and is in RIOT", } +vulnerability_mapping = { + "id": ("vulnerability", "CVE #"), + "details": ("text", "Details"), + "count": ("text", "Total Scanner Count"), +} +enterprise_context_basic_mapping = {"ip": ("text", "IP Address"), "code_message": ("text", "Code Message")} +enterprise_context_advanced_mapping = { + "noise": ("text", "Is Internet Background Noise"), + "link": ("link", "Visualizer Link"), + "classification": ("text", "Classification"), + "actor": ("text", "Actor"), + "tags": ("text", "Tags"), + "cve": ("text", "CVEs"), + "first_seen": ("text", "First Seen Scanning"), + "last_seen": ("text", "Last Seen Scanning"), + "vpn": ("text", "Known VPN Service"), + "vpn_service": ("text", "VPN Service Name"), + "bot": ("text", "Known BOT"), +} +enterprise_context_advanced_metadata_mapping = { + "asn": ("text", "ASN"), + "rdns": ("text", "rDNS"), + "category": ("text", "Category"), + "tor": ("text", "Known Tor Exit Node"), + "region": ("text", "Region"), + "city": ("text", "City"), + "country": ("text", "Country"), + "country_code": ("text", "Country Code"), + "organization": ("text", "Organization"), +} +enterprise_riot_mapping = { + "riot": ("text", "Is Common Business Service"), + "link": ("link", "Visualizer Link"), + "category": ("text", "RIOT Category"), + "name": ("text", "Provider Name"), + "trust_level": ("text", "RIOT Trust Level"), + "last_updated": ("text", "Last Updated"), +} +community_found_mapping = { + "ip": ("text", "IP Address"), + "noise": ("text", "Is Internet Background Noise"), + "riot": ("text", "Is Common Business Service"), + "classification": ("text", "Classification"), + "last_seen": ("text", "Last Seen"), + "name": ("text", "Name"), + "link": ("link", "Visualizer Link"), +} +community_not_found_mapping = { + "ip": ("text", "IP Address"), + "noise": ("text", "Is Internet Background Noise"), + "riot": ("text", "Is Common Business Service"), + "message": ("text", "Message"), +} +misp_event = MISPEvent() -def handler(q=False): +def handler(q=False): # noqa: C901 if q is False: return False request = json.loads(q) - if not request.get('config') or not request['config'].get('api_key'): - return {'error': 'Missing Greynoise API key.'} + if not request.get("config") or not request["config"].get("api_key"): + return {"error": "Missing Greynoise API key."} + headers = { - 'Accept': 'application/json', - 'key': request['config']['api_key'] + "Accept": "application/json", + "key": request["config"]["api_key"], + "User-Agent": "greynoise-misp-module-{}".format(moduleinfo["version"]), } - for input_type in mispattributes['input']: - if input_type in request: - ip = request[input_type] - break - else: - misperrors['error'] = "Unsupported attributes type." + + if not (request.get("vulnerability") or request.get("ip-dst") or request.get("ip-src")): + misperrors["error"] = "Vulnerability id missing" return misperrors - response = requests.get(f'{greynoise_api_url}{ip}', headers=headers) # Real request - if response.status_code == 200: # OK (record found) - return {'results': [{'types': mispattributes['output'], 'values': codes_mapping[response.json()['code']]}]} + + ip = "" + vulnerability = "" + + if request.get("ip-dst"): + ip = request.get("ip-dst") + elif request.get("ip-src"): + ip = request.get("ip-src") + else: + vulnerability = request.get("vulnerability") + + if ip: + if request["config"]["api_type"] and request["config"]["api_type"] == "enterprise": + greynoise_api_url = "https://api.greynoise.io/v2/noise/quick/" + else: + greynoise_api_url = "https://api.greynoise.io/v3/community/" + + response = requests.get(f"{greynoise_api_url}{ip}", headers=headers) # Real request for IP Query + if response.status_code == 200: + if request["config"]["api_type"] == "enterprise": + response = response.json() + enterprise_context_object = MISPObject("greynoise-ip-context") + for feature in ("ip", "code_message"): + if feature == "code_message": + value = codes_mapping[response.get("code")] + else: + value = response.get(feature) + if value: + attribute_type, relation = enterprise_context_basic_mapping[feature] + enterprise_context_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + if response["noise"]: + greynoise_api_url = "https://api.greynoise.io/v2/noise/context/" + context_response = requests.get(f"{greynoise_api_url}{ip}", headers=headers) + context_response = context_response.json() + context_response["link"] = "https://www.greynoise.io/viz/ip/" + ip + if "tags" in context_response: + context_response["tags"] = ",".join(context_response["tags"]) + if "cve" in context_response: + context_response["cve"] = ",".join(context_response["cve"]) + for feature in enterprise_context_advanced_mapping.keys(): + value = context_response.get(feature) + if value: + attribute_type, relation = enterprise_context_advanced_mapping[feature] + enterprise_context_object.add_attribute( + relation, **{"type": attribute_type, "value": value} + ) + for feature in enterprise_context_advanced_metadata_mapping.keys(): + value = context_response["metadata"].get(feature) + if value: + attribute_type, relation = enterprise_context_advanced_metadata_mapping[feature] + enterprise_context_object.add_attribute( + relation, **{"type": attribute_type, "value": value} + ) + + if response["riot"]: + greynoise_api_url = "https://api.greynoise.io/v2/riot/" + riot_response = requests.get(f"{greynoise_api_url}{ip}", headers=headers) + riot_response = riot_response.json() + riot_response["link"] = "https://www.greynoise.io/viz/riot/" + ip + for feature in enterprise_riot_mapping.keys(): + value = riot_response.get(feature) + if value: + attribute_type, relation = enterprise_riot_mapping[feature] + enterprise_context_object.add_attribute( + relation, **{"type": attribute_type, "value": value} + ) + misp_event.add_object(enterprise_context_object) + event = json.loads(misp_event.to_json()) + results = {key: event[key] for key in ("Attribute", "Object") if (key in event and event[key])} + return {"results": results} + else: + response = response.json() + community_context_object = MISPObject("greynoise-community-ip-context") + for feature in community_found_mapping.keys(): + value = response.get(feature) + if value: + attribute_type, relation = community_found_mapping[feature] + community_context_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + misp_event.add_object(community_context_object) + event = json.loads(misp_event.to_json()) + results = {key: event[key] for key in ("Attribute", "Object") if (key in event and event[key])} + return {"results": results} + if response.status_code == 404 and request["config"]["api_type"] != "enterprise": + response = response.json() + community_context_object = MISPObject("greynoise-community-ip-context") + for feature in community_not_found_mapping.keys(): + value = response.get(feature) + if value: + attribute_type, relation = community_not_found_mapping[feature] + community_context_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + misp_event.add_object(community_context_object) + event = json.loads(misp_event.to_json()) + results = {key: event[key] for key in ("Attribute", "Object") if (key in event and event[key])} + return {"results": results} + + if vulnerability: + if request["config"]["api_type"] and request["config"]["api_type"] == "enterprise": + greynoise_api_url = "https://api.greynoise.io/v2/experimental/gnql/stats" + querystring = {"query": f"last_seen:1w cve:{vulnerability}"} + else: + misperrors["error"] = "Vulnerability Not Supported with Community API Key" + return misperrors + + response = requests.get(f"{greynoise_api_url}", headers=headers, params=querystring) # Real request + + if response.status_code == 200: + response = response.json() + vulnerability_object = MISPObject("greynoise-vuln-info") + response["details"] = ( + "The IP count below reflects the number of IPs seen " + "by GreyNoise in the last 7 days scanning for this CVE." + ) + response["id"] = vulnerability + for feature in ("id", "details", "count"): + value = response.get(feature) + if value: + attribute_type, relation = vulnerability_mapping[feature] + vulnerability_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + classifications = response["stats"].get("classifications") + for item in classifications: + if item["classification"] == "benign": + value = item["count"] + attribute_type, relation = ("text", "Benign Scanner Count") + vulnerability_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + if item["classification"] == "unknown": + value = item["count"] + attribute_type, relation = ("text", "Unknown Scanner Count") + vulnerability_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + if item["classification"] == "malicious": + value = item["count"] + attribute_type, relation = ("text", "Malicious Scanner Count") + vulnerability_object.add_attribute(relation, **{"type": attribute_type, "value": value}) + misp_event.add_object(vulnerability_object) + event = json.loads(misp_event.to_json()) + results = {key: event[key] for key in ("Attribute", "Object") if (key in event and event[key])} + return {"results": results} + # There is an error errors = { 400: "Bad request.", + 404: "IP not observed scanning the internet or contained in RIOT data set.", 401: "Unauthorized. Please check your API key.", - 429: "Too many requests. You've hit the rate-limit." + 429: "Too many requests. You've hit the rate-limit.", } try: - misperrors['error'] = errors[response.status_code] + misperrors["error"] = errors[response.status_code] except KeyError: - misperrors['error'] = f'GreyNoise API not accessible (HTTP {response.status_code})' - return misperrors['error'] + misperrors["error"] = f"GreyNoise API not accessible (HTTP {response.status_code})" + return misperrors def introspection(): @@ -63,5 +256,5 @@ def introspection(): def version(): - moduleinfo['config'] = moduleconfig + moduleinfo["config"] = moduleconfig return moduleinfo diff --git a/misp_modules/modules/expansion/hashdd.py b/misp_modules/modules/expansion/hashdd.py index 42fc854..17e1029 100755 --- a/misp_modules/modules/expansion/hashdd.py +++ b/misp_modules/modules/expansion/hashdd.py @@ -2,10 +2,10 @@ import json import requests misperrors = {'error': 'Error'} -mispattributes = {'input': ['md5', 'sha1', 'sha256'], 'output': ['text']} +mispattributes = {'input': ['md5'], 'output': ['text']} moduleinfo = {'version': '0.2', 'author': 'Alexandre Dulaunoy', 'description': 'An expansion module to check hashes against hashdd.com including NSLR dataset.', 'module-type': ['hover']} moduleconfig = [] -hashddapi_url = 'https://api.hashdd.com/' +hashddapi_url = 'https://api.hashdd.com/v1/knownlevel/nsrl/' def handler(q=False): @@ -20,10 +20,10 @@ def handler(q=False): if v is None: misperrors['error'] = 'Hash value is missing.' return misperrors - r = requests.post(hashddapi_url, data={'hash': v}) + r = requests.get(hashddapi_url + v) if r.status_code == 200: state = json.loads(r.text) - summary = state[v]['known_level'] if state and state.get(v) else 'Unknown hash' + summary = state['knownlevel'] if state and state['result'] == "SUCCESS" else state['message'] else: misperrors['error'] = '{} API not accessible'.format(hashddapi_url) return misperrors['error'] diff --git a/misp_modules/modules/expansion/hashlookup.py b/misp_modules/modules/expansion/hashlookup.py new file mode 100644 index 0000000..eeca95f --- /dev/null +++ b/misp_modules/modules/expansion/hashlookup.py @@ -0,0 +1,108 @@ +import json +import requests +from . import check_input_attribute, standard_error_message +from collections import defaultdict +from pymisp import MISPEvent, MISPObject + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['md5', 'sha1', 'sha256'], 'format': 'misp_standard'} +moduleinfo = {'version': '2', 'author': 'Alexandre Dulaunoy', + 'description': 'An expansion module to enrich a file hash with hashlookup.circl.lu services (NSRL and other sources)', + 'module-type': ['expansion', 'hover']} +moduleconfig = ["custom_API"] +hashlookup_url = 'https://hashlookup.circl.lu/' + + +class HashlookupParser(): + def __init__(self, attribute, hashlookupresult, api_url): + self.attribute = attribute + self.hashlookupresult = hashlookupresult + self.api_url = api_url + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + self.references = defaultdict(list) + + def get_result(self): + if self.references: + self.__build_references() + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + return {'results': results} + + def parse_hashlookup_information(self): + hashlookup_object = MISPObject('hashlookup') + if 'source' in self.hashlookupresult: + hashlookup_object.add_attribute('source', **{'type': 'text', 'value': self.hashlookupresult['source']}) + if 'KnownMalicious' in self.hashlookupresult: + hashlookup_object.add_attribute('KnownMalicious', **{'type': 'text', 'value': self.hashlookupresult['KnownMalicious']}) + if 'MD5' in self.hashlookupresult: + hashlookup_object.add_attribute('MD5', **{'type': 'md5', 'value': self.hashlookupresult['MD5']}) + # SHA-1 is the default value in hashlookup it must always be present + hashlookup_object.add_attribute('SHA-1', **{'type': 'sha1', 'value': self.hashlookupresult['SHA-1']}) + if 'SHA-256' in self.hashlookupresult: + hashlookup_object.add_attribute('SHA-256', **{'type': 'sha256', 'value': self.hashlookupresult['SHA-256']}) + if 'SSDEEP' in self.hashlookupresult: + hashlookup_object.add_attribute('SSDEEP', **{'type': 'ssdeep', 'value': self.hashlookupresult['SSDEEP']}) + if 'TLSH' in self.hashlookupresult: + hashlookup_object.add_attribute('TLSH', **{'type': 'tlsh', 'value': self.hashlookupresult['TLSH']}) + if 'FileName' in self.hashlookupresult: + hashlookup_object.add_attribute('FileName', **{'type': 'filename', 'value': self.hashlookupresult['FileName']}) + if 'FileSize' in self.hashlookupresult: + hashlookup_object.add_attribute('FileSize', **{'type': 'size-in-bytes', 'value': self.hashlookupresult['FileSize']}) + hashlookup_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(hashlookup_object) + + def __build_references(self): + for object_uuid, references in self.references.items(): + for misp_object in self.misp_event.objects: + if misp_object.uuid == object_uuid: + for reference in references: + misp_object.add_reference(**reference) + break + +def check_url(url): + return "{}/".format(url) if not url.endswith('/') else url + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute.get('type') == 'md5': + pass + elif attribute.get('type') == 'sha1': + pass + elif attribute.get('type') == 'sha256': + pass + else: + misperrors['error'] = 'md5 or sha1 or sha256 is missing.' + return misperrors + api_url = check_url(request['config']['custom_API']) if request['config'].get('custom_API') else hashlookup_url + r = requests.get("{}/lookup/{}/{}".format(api_url, attribute.get('type'), attribute['value'])) + if r.status_code == 200: + hashlookupresult = r.json() + if not hashlookupresult: + misperrors['error'] = 'Empty result' + return misperrors + elif r.status_code == 404: + misperrors['error'] = 'Non existing hash' + return misperrors + else: + misperrors['error'] = 'API not accessible' + return misperrors + parser = HashlookupParser(attribute, hashlookupresult, api_url) + parser.parse_hashlookup_information() + result = parser.get_result() + return result + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/expansion/hibp.py b/misp_modules/modules/expansion/hibp.py index 8db3fa7..b2d1c16 100644 --- a/misp_modules/modules/expansion/hibp.py +++ b/misp_modules/modules/expansion/hibp.py @@ -1,13 +1,14 @@ +# -*- coding: utf-8 -*- import requests import json misperrors = {'error': 'Error'} -mispattributes = {'input': ['email-dst', 'email-src'], 'output': ['text']} # All mails as input -moduleinfo = {'version': '0.1', 'author': 'Aurélien Schwab', 'description': 'Module to access haveibeenpwned.com API.', 'module-type': ['hover']} -moduleconfig = ['user-agent'] # TODO take this into account in the code +mispattributes = {'input': ['email-dst', 'email-src'], 'output': ['text']} +moduleinfo = {'version': '0.2', 'author': 'Corsin Camichel, Aurélien Schwab', 'description': 'Module to access haveibeenpwned.com API (v3).', 'module-type': ['hover']} +moduleconfig = ['api_key'] -haveibeenpwned_api_url = 'https://api.haveibeenpwned.com/api/v2/breachedaccount/' -default_user_agent = 'MISP-Module' # User agent (must be set, requiered by API)) +haveibeenpwned_api_url = 'https://haveibeenpwned.com/api/v3/breachedaccount/' +API_KEY = "" # details at https://www.troyhunt.com/authentication-and-the-have-i-been-pwned-api/ def handler(q=False): @@ -22,15 +23,21 @@ def handler(q=False): misperrors['error'] = "Unsupported attributes type" return misperrors - r = requests.get(haveibeenpwned_api_url + email, headers={'user-agent': default_user_agent}) # Real request - if r.status_code == 200: # OK (record found) + if request.get('config') is None or request['config'].get('api_key') is None: + misperrors['error'] = 'Have I Been Pwned authentication is incomplete (no API key)' + return misperrors + else: + API_KEY = request['config'].get('api_key') + + r = requests.get(haveibeenpwned_api_url + email, headers={'hibp-api-key': API_KEY}) + if r.status_code == 200: breaches = json.loads(r.text) if breaches: return {'results': [{'types': mispattributes['output'], 'values': breaches}]} - elif r.status_code == 404: # Not found (not an error) + elif r.status_code == 404: return {'results': [{'types': mispattributes['output'], 'values': 'OK (Not Found)'}]} - else: # Real error - misperrors['error'] = 'haveibeenpwned.com API not accessible (HTTP ' + str(r.status_code) + ')' + else: + misperrors['error'] = f'haveibeenpwned.com API not accessible (HTTP {str(r.status_code)})' return misperrors['error'] diff --git a/misp_modules/modules/expansion/hyasinsight.py b/misp_modules/modules/expansion/hyasinsight.py new file mode 100644 index 0000000..1ae9582 --- /dev/null +++ b/misp_modules/modules/expansion/hyasinsight.py @@ -0,0 +1,873 @@ +import json +import logging +from typing import Dict, List, Any + +import requests +import re +from requests.exceptions import ( + HTTPError, + ProxyError, + InvalidURL, + ConnectTimeout +) +from . import check_input_attribute, standard_error_message +from pymisp import MISPEvent, MISPObject, Distribution + +ip_query_input_type = [ + 'ip-src', + 'ip-dst' +] +domain_query_input_type = [ + 'hostname', + 'domain' +] +email_query_input_type = [ + 'email', + 'email-src', + 'email-dst', + 'target-email', + 'whois-registrant-email' +] +phone_query_input_type = [ + 'phone-number', + 'whois-registrant-phone' +] + +md5_query_input_type = [ + 'md5', + 'x509-fingerprint-md5', + 'ja3-fingerprint-md5', + 'hassh-md5', + 'hasshserver-md5' +] + +sha1_query_input_type = [ + 'sha1', + 'x509-fingerprint-sha1' +] + +sha256_query_input_type = [ + 'sha256', + 'x509-fingerprint-sha256' +] + +sha512_query_input_type = [ + 'sha512' +] + +misperrors = { + 'error': 'Error' +} +mispattributes = { + 'input': ip_query_input_type + domain_query_input_type + email_query_input_type + phone_query_input_type + + md5_query_input_type + sha1_query_input_type + sha256_query_input_type + sha512_query_input_type, + 'format': 'misp_standard' +} + +moduleinfo = { + 'version': '0.1', + 'author': 'Mike Champ', + 'description': '', + 'module-type': ['expansion', 'hover'] +} +moduleconfig = ['apikey'] +TIMEOUT = 60 +logger = logging.getLogger('hyasinsight') +logger.setLevel(logging.DEBUG) +HYAS_API_BASE_URL = 'https://insight.hyas.com/api/ext/' +WHOIS_CURRENT_BASE_URL = 'https://api.hyas.com/' +DEFAULT_DISTRIBUTION_SETTING = Distribution.your_organisation_only.value +IPV4_REGEX = r'\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b([^\/]|$)' +IPV6_REGEX = r'\b(?:(?:[0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:(?:(:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\b' # noqa: E501 +# Enrichment Types +# HYAS API endpoints +PASSIVE_DNS_ENDPOINT = 'passivedns' +DYNAMIC_DNS_ENDPOINT = 'dynamicdns' +PASSIVE_HASH_ENDPOINT = 'passivehash' +SINKHOLE_ENDPOINT = 'sinkhole' +SSL_CERTIFICATE_ENDPOINT = 'ssl_certificate' +DEVICE_GEO_ENDPOINT = 'device_geo' +WHOIS_HISTORIC_ENDPOINT = 'whois' +WHOIS_CURRENT_ENDPOINT = 'whois/v1' +MALWARE_RECORDS_ENDPOINT = 'sample' +MALWARE_INFORMATION_ENDPOINT = 'sample/information' +C2ATTRIBUTION_ENDPOINT = 'c2attribution' +OPEN_SOURCE_INDICATORS_ENDPOINT = 'os_indicators' + +# HYAS API endpoint params +DOMAIN_PARAM = 'domain' +IP_PARAM = 'ip' +IPV4_PARAM = 'ipv4' +IPV6_PARAM = 'ipv6' +EMAIL_PARAM = 'email' +PHONE_PARAM = 'phone' +MD5_PARAM = 'md5' +SHA256_PARAM = 'sha256' +SHA512_PARAM = 'sha512' +HASH_PARAM = 'hash' +SHA1_PARAM = 'sha1' + +HYAS_IP_ENRICHMENT_ENDPOINTS_LIST = [DYNAMIC_DNS_ENDPOINT, PASSIVE_DNS_ENDPOINT, PASSIVE_HASH_ENDPOINT, + SINKHOLE_ENDPOINT, + SSL_CERTIFICATE_ENDPOINT, DEVICE_GEO_ENDPOINT, C2ATTRIBUTION_ENDPOINT, + MALWARE_RECORDS_ENDPOINT, OPEN_SOURCE_INDICATORS_ENDPOINT] +HYAS_DOMAIN_ENRICHMENT_ENDPOINTS_LIST = [PASSIVE_DNS_ENDPOINT, DYNAMIC_DNS_ENDPOINT, WHOIS_HISTORIC_ENDPOINT, + MALWARE_RECORDS_ENDPOINT, WHOIS_CURRENT_ENDPOINT, PASSIVE_HASH_ENDPOINT, + C2ATTRIBUTION_ENDPOINT, SSL_CERTIFICATE_ENDPOINT, + OPEN_SOURCE_INDICATORS_ENDPOINT] +HYAS_EMAIL_ENRICHMENT_ENDPOINTS_LIST = [DYNAMIC_DNS_ENDPOINT, WHOIS_HISTORIC_ENDPOINT, C2ATTRIBUTION_ENDPOINT] +HYAS_PHONE_ENRICHMENT_ENDPOINTS_LIST = [WHOIS_HISTORIC_ENDPOINT] +HYAS_SHA1_ENRICHMENT_ENDPOINTS_LIST = [SSL_CERTIFICATE_ENDPOINT, MALWARE_INFORMATION_ENDPOINT, + OPEN_SOURCE_INDICATORS_ENDPOINT] +HYAS_SHA256_ENRICHMENT_ENDPOINTS_LIST = [C2ATTRIBUTION_ENDPOINT, MALWARE_INFORMATION_ENDPOINT, + OPEN_SOURCE_INDICATORS_ENDPOINT] +HYAS_SHA512_ENRICHMENT_ENDPOINTS_LIST = [MALWARE_INFORMATION_ENDPOINT] +HYAS_MD5_ENRICHMENT_ENDPOINTS_LIST = [MALWARE_RECORDS_ENDPOINT, MALWARE_INFORMATION_ENDPOINT, + OPEN_SOURCE_INDICATORS_ENDPOINT] + +HYAS_OBJECT_NAMES = { + DYNAMIC_DNS_ENDPOINT: "Dynamic DNS Information", + PASSIVE_HASH_ENDPOINT: "Passive Hash Information", + SINKHOLE_ENDPOINT: "Sinkhole Information", + SSL_CERTIFICATE_ENDPOINT: "SSL Certificate Information", + DEVICE_GEO_ENDPOINT: "Mobile Geolocation Information", + C2ATTRIBUTION_ENDPOINT: "C2 Attribution Information", + PASSIVE_DNS_ENDPOINT: "Passive DNS Information", + WHOIS_HISTORIC_ENDPOINT: "Whois Related Information", + WHOIS_CURRENT_ENDPOINT: "Whois Current Related Information", + MALWARE_INFORMATION_ENDPOINT: "Malware Sample Information", + OPEN_SOURCE_INDICATORS_ENDPOINT: "Open Source Intel for malware, ssl certificates and other indicators Information", + MALWARE_RECORDS_ENDPOINT: "Malware Sample Records Information" +} + + +def parse_attribute(comment, feature, value): + """Generic Method for parsing the attributes in the object""" + attribute = { + 'type': 'text', + 'value': value, + 'comment': comment, + 'distribution': DEFAULT_DISTRIBUTION_SETTING, + 'object_relation': feature + } + return attribute + + +def misp_object(endpoint, attribute_value): + object_name = HYAS_OBJECT_NAMES[endpoint] + hyas_object = MISPObject(object_name) + hyas_object.distribution = DEFAULT_DISTRIBUTION_SETTING + hyas_object.template_uuid = "d69d3d15-7b4d-49b1-9e0a-bb29f3d421d9" + hyas_object.template_id = "1" + hyas_object.description = "HYAS INSIGHT " + object_name + hyas_object.comment = "HYAS INSIGHT " + object_name + " for " + attribute_value + setattr(hyas_object, 'meta-category', 'network') + description = ( + "An object containing the enriched attribute and " + "related entities from HYAS Insight." + ) + hyas_object.from_dict( + **{"meta-category": "misc", "description": description, + "distribution": DEFAULT_DISTRIBUTION_SETTING} + ) + return hyas_object + + +def flatten_json(y: Dict) -> Dict[str, Any]: + """ + :param y: raw_response from HYAS api + :return: Flatten json response + """ + out = {} + + def flatten(x, name=''): + # If the Nested key-value + # pair is of dict type + if type(x) is dict: + for a in x: + flatten(x[a], name + a + '_') + else: + out[name[:-1]] = x + + flatten(y) + return out + + +def get_flatten_json_response(raw_api_response: List[Dict]) -> List[Dict]: + """ + :param raw_api_response: raw_api response from the API + :return: Flatten Json response + """ + flatten_json_response = [] + if raw_api_response: + for obj in raw_api_response: + flatten_json_response.append(flatten_json(obj)) + + return flatten_json_response + + +def request_body(query_input, query_param, current): + """ + This Method returns the request body for specific endpoint. + """ + + if current: + return { + "applied_filters": { + query_input: query_param, + "current": True + } + } + else: + return { + "applied_filters": { + query_input: query_param + } + } + + +def malware_info_lookup_to_markdown(results: Dict) -> list: + scan_results = results.get('scan_results', []) + out = [] + if scan_results: + for res in scan_results: + malware_info_data = { + "avscan_score": results.get( + "avscan_score", ''), + "md5": results.get("md5", ''), + 'av_name': res.get( + "av_name", ''), + 'def_time': res.get( + "def_time", ''), + 'threat_found': res.get( + 'threat_found', ''), + 'scan_time': results.get("scan_time", ''), + 'sha1': results.get('sha1', ''), + 'sha256': results.get('sha256', ''), + 'sha512': results.get('sha512', '') + } + out.append(malware_info_data) + else: + malware_info_data = { + "avscan_score": results.get("avscan_score", ''), + "md5": results.get("md5", ''), + 'av_name': '', + 'def_time': '', + 'threat_found': '', + 'scan_time': results.get("scan_time", ''), + 'sha1': results.get('sha1', ''), + 'sha256': results.get('sha256', ''), + 'sha512': results.get('sha512', '') + } + out.append(malware_info_data) + return out + + +class RequestHandler: + """A class for handling any outbound requests from this module.""" + + def __init__(self, apikey): + self.session = requests.Session() + self.api_key = apikey + + def get(self, url: str, headers: dict = None, req_body=None) -> requests.Response: + """General post method to fetch the response from HYAS Insight.""" + response = [] + try: + response = self.session.post( + url, headers=headers, json=req_body + ) + if response: + response = response.json() + except (ConnectTimeout, ProxyError, InvalidURL) as error: + msg = "Error connecting with the HYAS Insight." + logger.error(f"{msg} Error: {error}") + misperrors["error"] = msg + return response + + def hyas_lookup(self, end_point: str, query_input, query_param, current=False) -> requests.Response: + """Do a lookup call.""" + # Building the request + if current: + url = f'{WHOIS_CURRENT_BASE_URL}{WHOIS_CURRENT_ENDPOINT}' + else: + url = f'{HYAS_API_BASE_URL}{end_point}' + headers = { + 'Content-type': 'application/json', + 'X-API-Key': self.api_key, + } + req_body = request_body(query_input, query_param, current) + try: + response = self.get(url, headers, req_body) + except HTTPError as error: + msg = f"Error when requesting data from HYAS Insight. {error.response}: {error.response.reason}" + logger.error(msg) + misperrors["error"] = msg + raise + return response + + +class HyasInsightParser: + """A class for handling the enrichment objects""" + + def __init__(self, attribute): + self.attribute = attribute + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + + self.c2_attribution_data_items = [ + 'actor_ipv4', + 'c2_domain', + 'c2_ip', + 'c2_url', + 'datetime', + 'email', + 'email_domain', + 'referrer_domain', + 'referrer_ipv4', + 'referrer_url', + 'sha256' + ] + self.c2_attribution_data_items_friendly_names = { + 'actor_ipv4': 'Actor IPv4', + 'c2_domain': 'C2 Domain', + 'c2_ip': 'C2 IP', + 'c2_url': 'C2 URL', + 'datetime': 'DateTime', + 'email': 'Email', + 'email_domain': 'Email Domain', + 'referrer_domain': 'Referrer Domain', + 'referrer_ipv4': 'Referrer IPv4', + 'referrer_url': 'Referrer URL', + 'sha256': 'SHA256' + } + + self.device_geo_data_items = [ + 'datetime', + 'device_user_agent', + 'geo_country_alpha_2', + 'geo_horizontal_accuracy', + 'ipv4', + 'ipv6', + 'latitude', + 'longitude', + 'wifi_bssid' + ] + + self.device_geo_data_items_friendly_names = { + 'datetime': 'DateTime', + 'device_user_agent': 'Device User Agent', + 'geo_country_alpha_2': 'Alpha-2 Code', + 'geo_horizontal_accuracy': 'GPS Horizontal Accuracy', + 'ipv4': 'IPv4 Address', + 'ipv6': 'IPv6 Address', + 'latitude': 'Latitude', + 'longitude': 'Longitude', + 'wifi_bssid': 'WIFI BSSID' + } + + self.dynamic_dns_data_items = [ + 'a_record', + 'account', + 'created', + 'created_ip', + 'domain', + 'domain_creator_ip', + 'email', + ] + + self.dynamic_dns_data_items_friendly_names = { + 'a_record': 'A Record', + 'account': 'Account Holder', + 'created': 'Created Date', + 'created_ip': 'Account Holder IP Address', + 'domain': 'Domain', + 'domain_creator_ip': 'Domain Creator IP Address', + 'email': 'Email Address', + } + + self.os_indicators_data_items = [ + 'context', + 'datetime', + 'domain', + 'domain_2tld', + 'first_seen', + 'ipv4', + 'ipv6', + 'last_seen', + 'md5', + 'sha1', + 'sha256', + 'source_name', + 'source_url', + 'url' + ] + + self.os_indicators_data_items_friendly_names = { + 'context': 'Context', + 'datetime': 'DateTime', + 'domain': 'Domain', + 'domain_2tld': 'Domain 2TLD', + 'first_seen': 'First Seen', + 'ipv4': 'IPv4 Address', + 'ipv6': 'IPv6 Address', + 'last_seen': 'Last Seen', + 'md5': 'MD5', + 'sha1': 'SHA1', + 'sha256': 'SHA256', + 'source_name': 'Source Name', + 'source_url': 'Source URL', + 'url': 'URL' + } + + self.passive_dns_data_items = [ + 'cert_name', + 'count', + 'domain', + 'first_seen', + 'ip_geo_city_name', + 'ip_geo_country_iso_code', + 'ip_geo_country_name', + 'ip_geo_location_latitude', + 'ip_geo_location_longitude', + 'ip_geo_postal_code', + 'ip_ip', + 'ip_isp_autonomous_system_number', + 'ip_isp_autonomous_system_organization', + 'ip_isp_ip_address', + 'ip_isp_isp', + 'ip_isp_organization', + 'ipv4', + 'ipv6', + 'last_seen' + ] + + self.passive_dns_data_items_friendly_names = { + 'cert_name': 'Certificate Provider Name', + 'count': 'Passive DNS Count', + 'domain': 'Domain', + 'first_seen': 'First Seen', + 'ip_geo_city_name': 'IP Organization City', + 'ip_geo_country_iso_code': 'IP Organization Country ISO Code', + 'ip_geo_country_name': 'IP Organization Country Name', + 'ip_geo_location_latitude': 'IP Organization Latitude', + 'ip_geo_location_longitude': 'IP Organization Longitude', + 'ip_geo_postal_code': 'IP Organization Postal Code', + 'ip_ip': 'IP Address', + 'ip_isp_autonomous_system_number': 'ASN IP', + 'ip_isp_autonomous_system_organization': 'ASO IP', + 'ip_isp_ip_address': 'IP Address', + 'ip_isp_isp': 'ISP', + 'ip_isp_organization': 'ISP Organization', + 'ipv4': 'IPv4 Address', + 'ipv6': 'IPv6 Address', + 'last_seen': 'Last Seen' + } + + self.passive_hash_data_items = [ + 'domain', + 'md5_count' + ] + + self.passive_hash_data_items_friendly_names = { + 'domain': 'Domain', + 'md5_count': 'Passive DNS Count' + } + + self.malware_records_data_items = [ + 'datetime', + 'domain', + 'ipv4', + 'ipv6', + 'md5', + 'sha1', + 'sha256' + ] + + self.malware_records_data_items_friendly_names = { + 'datetime': 'DateTime', + 'domain': 'Domain', + 'ipv4': 'IPv4 Address', + 'ipv6': 'IPv6 Address', + 'md5': 'MD5', + 'sha1': 'SHA1', + 'sha256': 'SHA256' + } + + self.malware_information_data_items = [ + 'avscan_score', + 'md5', + 'av_name', + 'def_time', + 'threat_found', + 'scan_time', + 'sha1', + 'sha256', + 'sha512' + ] + + self.malware_information_data_items_friendly_names = { + 'avscan_score': 'AV Scan Score', + 'md5': 'MD5', + 'av_name': 'AV Name', + 'def_time': 'AV DateTime', + 'threat_found': 'Source', + 'scan_time': 'Scan DateTime', + 'sha1': 'SHA1', + 'sha256': 'SHA256', + 'sha512': 'SHA512' + } + + self.sinkhole_data_items = [ + 'count', + 'country_name', + 'country_code', + 'data_port', + 'datetime', + 'ipv4', + 'last_seen', + 'organization_name', + 'sink_source' + ] + + self.sinkhole_data_items_friendly_names = { + 'count': 'Sinkhole Count', + 'country_name': 'IP Address Country', + 'country_code': 'IP Address Country Code', + 'data_port': 'Data Port', + 'datetime': 'First Seen', + 'ipv4': 'IP Address', + 'last_seen': 'Last Seen', + 'organization_name': 'ISP Organization', + 'sink_source': 'Sink Source IP' + } + + self.ssl_certificate_data_items = [ + 'ip', + 'ssl_cert_cert_key', + 'ssl_cert_expire_date', + 'ssl_cert_issue_date', + 'ssl_cert_issuer_commonName', + 'ssl_cert_issuer_countryName', + 'ssl_cert_issuer_localityName', + 'ssl_cert_issuer_organizationName', + 'ssl_cert_issuer_organizationalUnitName', + 'ssl_cert_issuer_stateOrProvinceName', + 'ssl_cert_md5', + 'ssl_cert_serial_number', + 'ssl_cert_sha1', + 'ssl_cert_sha_256', + 'ssl_cert_sig_algo', + 'ssl_cert_ssl_version', + 'ssl_cert_subject_commonName', + 'ssl_cert_subject_countryName', + 'ssl_cert_subject_localityName', + 'ssl_cert_subject_organizationName', + 'ssl_cert_subject_organizationalUnitName', + 'ssl_cert_timestamp' + ] + + self.ssl_certificate_data_items_friendly_names = { + 'ip': 'IP Address', + 'ssl_cert_cert_key': 'Certificate Key', + 'ssl_cert_expire_date': 'Certificate Expiration Date', + 'ssl_cert_issue_date': 'Certificate Issue Date', + 'ssl_cert_issuer_commonName': 'Issuer Common Name', + 'ssl_cert_issuer_countryName': 'Issuer Country Name', + 'ssl_cert_issuer_localityName': 'Issuer City Name', + 'ssl_cert_issuer_organizationName': 'Issuer Organization Name', + 'ssl_cert_issuer_organizationalUnitName': 'Issuer Organization Unit Name', + 'ssl_cert_issuer_stateOrProvinceName': 'Issuer State or Province Name', + 'ssl_cert_md5': 'Certificate MD5', + 'ssl_cert_serial_number': 'Certificate Serial Number', + 'ssl_cert_sha1': 'Certificate SHA1', + 'ssl_cert_sha_256': 'Certificate SHA256', + 'ssl_cert_sig_algo': 'Certificate Signature Algorithm', + 'ssl_cert_ssl_version': 'SSL Version', + 'ssl_cert_subject_commonName': 'Reciever Subject Name', + 'ssl_cert_subject_countryName': 'Receiver Country Name', + 'ssl_cert_subject_localityName': 'Receiver City Name', + 'ssl_cert_subject_organizationName': 'Receiver Organization Name', + 'ssl_cert_subject_organizationalUnitName': 'Receiver Organization Unit Name', + 'ssl_cert_timestamp': 'Certificate DateTime' + } + + self.whois_historic_data_items = [ + 'abuse_emails', + 'address', + 'city', + 'country', + 'datetime', + 'domain', + 'domain_2tld', + 'domain_created_datetime', + 'domain_expires_datetime', + 'domain_updated_datetime', + 'email', + 'idn_name', + 'name', + 'nameserver', + 'organization', + 'phone', + 'privacy_punch', + 'registrar' + ] + + self.whois_historic_data_items_friendly_names = { + 'abuse_emails': 'Abuse Emails', + 'address': 'Address', + 'city': 'City', + 'country': 'Country', + 'datetime': 'Datetime', + 'domain': 'Domain', + 'domain_2tld': 'Domain 2tld', + 'domain_created_datetime': 'Domain Created Time', + 'domain_expires_datetime': 'Domain Expires Time', + 'domain_updated_datetime': 'Domain Updated Time', + 'email': 'Email Address', + 'idn_name': 'IDN Name', + 'name': 'Name', + 'nameserver': 'Nameserver', + 'organization': 'Organization', + 'phone': 'Phone Info', + 'privacy_punch': 'Privacy Punch', + 'registrar': 'Registrar' + } + + self.whois_current_data_items = [ + 'abuse_emails', + 'address', + 'city', + 'country', + 'datetime', + 'domain', + 'domain_2tld', + 'domain_created_datetime', + 'domain_expires_datetime', + 'domain_updated_datetime', + 'email', + 'idn_name', + 'name', + 'nameserver', + 'organization', + 'phone', + 'privacy_punch', + 'registrar', + 'state' + ] + + self.whois_current_data_items_friendly_names = { + 'abuse_emails': 'Abuse Emails', + 'address': 'Address', + 'city': 'City', + 'country': 'Country', + 'datetime': 'Datetime', + 'domain': 'Domain', + 'domain_2tld': 'Domain 2tld', + 'domain_created_datetime': 'Domain Created Time', + 'domain_expires_datetime': 'Domain Expires Time', + 'domain_updated_datetime': 'Domain Updated Time', + 'email': 'Email Address', + 'idn_name': 'IDN Name', + 'name': 'Name', + 'nameserver': 'Nameserver', + 'organization': 'Organization', + 'phone': 'Phone', + 'privacy_punch': 'Privacy Punch', + 'registrar': 'Registrar', + 'state': 'State' + } + + def create_misp_attributes_and_objects(self, response, endpoint, attribute_value): + flatten_json_response = get_flatten_json_response(response) + data_items: List[str] = [] + data_items_friendly_names: Dict[str, str] = {} + if endpoint == DEVICE_GEO_ENDPOINT: + data_items: List[str] = self.device_geo_data_items + data_items_friendly_names: Dict[str, str] = self.device_geo_data_items_friendly_names + elif endpoint == DYNAMIC_DNS_ENDPOINT: + data_items: List[str] = self.dynamic_dns_data_items + data_items_friendly_names: Dict[str, str] = self.dynamic_dns_data_items_friendly_names + elif endpoint == PASSIVE_DNS_ENDPOINT: + data_items: List[str] = self.passive_dns_data_items + data_items_friendly_names: Dict[str, str] = self.passive_dns_data_items_friendly_names + elif endpoint == PASSIVE_HASH_ENDPOINT: + data_items: List[str] = self.passive_hash_data_items + data_items_friendly_names: Dict[str, str] = self.passive_hash_data_items_friendly_names + elif endpoint == SINKHOLE_ENDPOINT: + data_items: List[str] = self.sinkhole_data_items + data_items_friendly_names: Dict[str, str] = self.sinkhole_data_items_friendly_names + elif endpoint == WHOIS_HISTORIC_ENDPOINT: + data_items = self.whois_historic_data_items + data_items_friendly_names = self.whois_historic_data_items_friendly_names + elif endpoint == WHOIS_CURRENT_ENDPOINT: + data_items: List[str] = self.whois_current_data_items + data_items_friendly_names: Dict[str, str] = self.whois_current_data_items_friendly_names + elif endpoint == SSL_CERTIFICATE_ENDPOINT: + data_items: List[str] = self.ssl_certificate_data_items + data_items_friendly_names: Dict[str, str] = self.ssl_certificate_data_items_friendly_names + elif endpoint == MALWARE_INFORMATION_ENDPOINT: + data_items: List[str] = self.malware_information_data_items + data_items_friendly_names = self.malware_information_data_items_friendly_names + elif endpoint == MALWARE_RECORDS_ENDPOINT: + data_items: List[str] = self.malware_records_data_items + data_items_friendly_names = self.malware_records_data_items_friendly_names + elif endpoint == OPEN_SOURCE_INDICATORS_ENDPOINT: + data_items: List[str] = self.os_indicators_data_items + data_items_friendly_names = self.os_indicators_data_items_friendly_names + elif endpoint == C2ATTRIBUTION_ENDPOINT: + data_items: List[str] = self.c2_attribution_data_items + data_items_friendly_names = self.c2_attribution_data_items_friendly_names + + for result in flatten_json_response: + hyas_object = misp_object(endpoint, attribute_value) + for data_item in result.keys(): + if data_item in data_items: + data_item_text = data_items_friendly_names[data_item] + data_item_value = str(result[data_item]) + hyas_object.add_attribute( + **parse_attribute(hyas_object.comment, data_item_text, data_item_value)) + hyas_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(hyas_object) + + def get_results(self): + """returns the dictionary object to MISP Instance""" + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object')} + return {'results': results} + + +def handler(q=False): + """The function which accepts a JSON document to expand the values and return a dictionary of the expanded + values. """ + if q is False: + return False + request = json.loads(q) + # check if the apikey is provided + if not request.get('config') or not request['config'].get('apikey'): + misperrors['error'] = 'HYAS Insight apikey is missing' + return misperrors + apikey = request['config'].get('apikey') + # check attribute is added to the event + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + + attribute = request['attribute'] + attribute_type = attribute['type'] + attribute_value = attribute['value'] + + # check if the attribute type is supported by IPQualityScore + if attribute_type not in mispattributes['input']: + return {'error': 'Unsupported attributes type for HYAS Insight Enrichment'} + request_handler = RequestHandler(apikey) + parser = HyasInsightParser(attribute) + has_results = False + if attribute_type in ip_query_input_type: + ip_param = '' + for endpoint in HYAS_IP_ENRICHMENT_ENDPOINTS_LIST: + if endpoint == DEVICE_GEO_ENDPOINT: + if re.match(IPV4_REGEX, attribute_value): + ip_param = IPV4_PARAM + elif re.match(IPV6_REGEX, attribute_value): + ip_param = IPV6_PARAM + elif endpoint == PASSIVE_HASH_ENDPOINT: + ip_param = IPV4_PARAM + elif endpoint == SINKHOLE_ENDPOINT: + ip_param = IPV4_PARAM + elif endpoint == MALWARE_RECORDS_ENDPOINT: + ip_param = IPV4_PARAM + else: + ip_param = IP_PARAM + enrich_response = request_handler.hyas_lookup(endpoint, ip_param, attribute_value) + if endpoint == SSL_CERTIFICATE_ENDPOINT: + enrich_response = enrich_response.get('ssl_certs') + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in domain_query_input_type: + for endpoint in HYAS_DOMAIN_ENRICHMENT_ENDPOINTS_LIST: + if not endpoint == WHOIS_CURRENT_ENDPOINT: + enrich_response = request_handler.hyas_lookup(endpoint, DOMAIN_PARAM, attribute_value) + else: + enrich_response = request_handler.hyas_lookup(endpoint, DOMAIN_PARAM, attribute_value, + endpoint == WHOIS_CURRENT_ENDPOINT) + enrich_response = enrich_response.get('items') + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in email_query_input_type: + for endpoint in HYAS_EMAIL_ENRICHMENT_ENDPOINTS_LIST: + enrich_response = request_handler.hyas_lookup(endpoint, EMAIL_PARAM, attribute_value) + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in phone_query_input_type: + for endpoint in HYAS_PHONE_ENRICHMENT_ENDPOINTS_LIST: + enrich_response = request_handler.hyas_lookup(endpoint, PHONE_PARAM, attribute_value) + if enrich_response: + has_results = True + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in md5_query_input_type: + md5_param = MD5_PARAM + for endpoint in HYAS_MD5_ENRICHMENT_ENDPOINTS_LIST: + if endpoint == MALWARE_INFORMATION_ENDPOINT: + md5_param = HASH_PARAM + enrich_response = request_handler.hyas_lookup(endpoint, md5_param, attribute_value) + if enrich_response: + has_results = True + if endpoint == MALWARE_INFORMATION_ENDPOINT: + enrich_response = malware_info_lookup_to_markdown(enrich_response) + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in sha1_query_input_type: + sha1_param = SHA1_PARAM + for endpoint in HYAS_SHA1_ENRICHMENT_ENDPOINTS_LIST: + if endpoint == MALWARE_INFORMATION_ENDPOINT: + sha1_param = HASH_PARAM + elif endpoint == SSL_CERTIFICATE_ENDPOINT: + sha1_param = HASH_PARAM + enrich_response = request_handler.hyas_lookup(endpoint, sha1_param, attribute_value) + + if enrich_response: + has_results = True + if endpoint == MALWARE_INFORMATION_ENDPOINT: + enrich_response = malware_info_lookup_to_markdown(enrich_response) + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in sha256_query_input_type: + sha256_param = SHA256_PARAM + for endpoint in HYAS_SHA256_ENRICHMENT_ENDPOINTS_LIST: + if endpoint == MALWARE_INFORMATION_ENDPOINT: + sha256_param = HASH_PARAM + enrich_response = request_handler.hyas_lookup(endpoint, sha256_param, attribute_value) + if enrich_response: + has_results = True + if endpoint == MALWARE_INFORMATION_ENDPOINT: + enrich_response = malware_info_lookup_to_markdown(enrich_response) + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + elif attribute_type in sha512_query_input_type: + sha512_param = '' + for endpoint in HYAS_SHA512_ENRICHMENT_ENDPOINTS_LIST: + if endpoint == MALWARE_INFORMATION_ENDPOINT: + sha512_param = HASH_PARAM + enrich_response = request_handler.hyas_lookup(endpoint, sha512_param, attribute_value) + if enrich_response: + has_results = True + if endpoint == MALWARE_INFORMATION_ENDPOINT: + enrich_response = malware_info_lookup_to_markdown(enrich_response) + parser.create_misp_attributes_and_objects(enrich_response, endpoint, attribute_value) + + if has_results: + return parser.get_results() + else: + return {'error': 'No records found in HYAS Insight for the provided attribute.'} + + +def introspection(): + """The function that returns a dict of the supported attributes (input and output) by your expansion module.""" + return mispattributes + + +def version(): + """The function that returns a dict with the version and the associated meta-data including potential + configurations required of the module. """ + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py b/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py new file mode 100644 index 0000000..bb58284 --- /dev/null +++ b/misp_modules/modules/expansion/ipqs_fraud_and_risk_scoring.py @@ -0,0 +1,627 @@ +import json +import logging +import requests +from requests.exceptions import ( + HTTPError, + ProxyError, + InvalidURL, + ConnectTimeout +) +from . import check_input_attribute, standard_error_message +from pymisp import MISPEvent, MISPAttribute, MISPObject, MISPTag, Distribution + +ip_query_input_type = [ + 'ip-src', + 'ip-dst' +] +url_query_input_type = [ + 'hostname', + 'domain', + 'url', + 'uri' +] +email_query_input_type = [ + 'email', + 'email-src', + 'email-dst', + 'target-email', + 'whois-registrant-email' +] +phone_query_input_type = [ + 'phone-number', + 'whois-registrant-phone' +] + +misperrors = { + 'error': 'Error' +} +mispattributes = { + 'input': ip_query_input_type + url_query_input_type + email_query_input_type + phone_query_input_type, + 'format': 'misp_standard' +} +moduleinfo = { + 'version': '0.1', + 'author': 'David Mackler', + 'description': 'IPQualityScore MISP Expansion Module for IP reputation, Email Validation, Phone Number Validation,' + 'Malicious Domain and Malicious URL Scanner.', + 'module-type': ['expansion', 'hover'] +} +moduleconfig = ['apikey'] + +logger = logging.getLogger('ipqualityscore') +logger.setLevel(logging.DEBUG) +BASE_URL = 'https://ipqualityscore.com/api/json' +DEFAULT_DISTRIBUTION_SETTING = Distribution.your_organisation_only.value +IP_ENRICH = 'ip' +URL_ENRICH = 'url' +EMAIL_ENRICH = 'email' +PHONE_ENRICH = 'phone' + + +class RequestHandler: + """A class for handling any outbound requests from this module.""" + + def __init__(self, apikey): + self.session = requests.Session() + self.api_key = apikey + + def get(self, url: str, headers: dict = None, params: dict = None) -> requests.Response: + """General get method to fetch the response from IPQualityScore.""" + try: + response = self.session.get( + url, headers=headers, params=params + ).json() + if str(response["success"]) != "True": + msg = response["message"] + logger.error(f"Error: {msg}") + misperrors["error"] = msg + else: + return response + except (ConnectTimeout, ProxyError, InvalidURL) as error: + msg = "Error connecting with the IPQualityScore." + logger.error(f"{msg} Error: {error}") + misperrors["error"] = msg + + def ipqs_lookup(self, reputation_type: str, ioc: str) -> requests.Response: + """Do a lookup call.""" + url = f"{BASE_URL}/{reputation_type}" + payload = {reputation_type: ioc} + headers = {"IPQS-KEY": self.api_key} + try: + response = self.get(url, headers, payload) + except HTTPError as error: + msg = f"Error when requesting data from IPQualityScore. {error.response}: {error.response.reason}" + logger.error(msg) + misperrors["error"] = msg + raise + return response + + +def parse_attribute(comment, feature, value): + """Generic Method for parsing the attributes in the object""" + attribute = { + 'type': 'text', + 'value': value, + 'comment': comment, + 'distribution': DEFAULT_DISTRIBUTION_SETTING, + 'object_relation': feature + } + return attribute + + +class IPQualityScoreParser: + """A class for handling the enrichment objects""" + + def __init__(self, attribute): + self.rf_white = "#CCCCCC" + self.rf_grey = " #CDCDCD" + self.rf_yellow = "#FFCF00" + self.rf_red = "#D10028" + self.clean = "CLEAN" + self.low = "LOW RISK" + self.medium = "MODERATE RISK" + self.high = "HIGH RISK" + self.critical = "CRITICAL" + self.invalid = "INVALID" + self.suspicious = "SUSPICIOUS" + self.malware = "CRITICAL" + self.phishing = "CRITICAL" + self.disposable = "CRITICAL" + self.attribute = attribute + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + self.ipqs_object = MISPObject('IPQS Fraud and Risk Scoring Object') + self.ipqs_object.template_uuid = "57d066e6-6d66-42a7-a1ad-e075e39b2b5e" + self.ipqs_object.template_id = "1" + self.ipqs_object.description = "IPQS Fraud and Risk Scoring Data" + setattr(self.ipqs_object, 'meta-category', 'network') + description = ( + "An object containing the enriched attribute and " + "related entities from IPQualityScore." + ) + self.ipqs_object.from_dict( + **{"meta-category": "misc", "description": description, "distribution": DEFAULT_DISTRIBUTION_SETTING} + ) + + temp_attr = MISPAttribute() + temp_attr.from_dict(**attribute) + self.enriched_attribute = MISPAttribute() + self.enriched_attribute.from_dict( + **{"value": temp_attr.value, "type": temp_attr.type, "distribution": DEFAULT_DISTRIBUTION_SETTING} + ) + self.ipqs_object.distribution = DEFAULT_DISTRIBUTION_SETTING + self.ip_data_items = [ + 'fraud_score', + 'country_code', + 'region', + 'city', + 'zip_code', + 'ISP', + 'ASN', + 'organization', + 'is_crawler', + 'timezone', + 'mobile', + 'host', + 'proxy', + 'vpn', + 'tor', + 'active_vpn', + 'active_tor', + 'recent_abuse', + 'bot_status', + 'connection_type', + 'abuse_velocity', + 'latitude', + 'longitude' + ] + self.ip_data_items_friendly_names = { + 'fraud_score': 'IPQS: Fraud Score', + 'country_code': 'IPQS: Country Code', + 'region': 'IPQS: Region', + 'city': 'IPQS: City', + 'zip_code': 'IPQS: Zip Code', + 'ISP': 'IPQS: ISP', + 'ASN': 'IPQS: ASN', + 'organization': 'IPQS: Organization', + 'is_crawler': 'IPQS: Is Crawler', + 'timezone': 'IPQS: Timezone', + 'mobile': 'IPQS: Mobile', + 'host': 'IPQS: Host', + 'proxy': 'IPQS: Proxy', + 'vpn': 'IPQS: VPN', + 'tor': 'IPQS: TOR', + 'active_vpn': 'IPQS: Active VPN', + 'active_tor': 'IPQS: Active TOR', + 'recent_abuse': 'IPQS: Recent Abuse', + 'bot_status': 'IPQS: Bot Status', + 'connection_type': 'IPQS: Connection Type', + 'abuse_velocity': 'IPQS: Abuse Velocity', + 'latitude': 'IPQS: Latitude', + 'longitude': 'IPQS: Longitude' + } + self.url_data_items = [ + 'unsafe', + 'domain', + 'ip_address', + 'server', + 'domain_rank', + 'dns_valid', + 'parking', + 'spamming', + 'malware', + 'phishing', + 'suspicious', + 'adult', + 'risk_score', + 'category', + 'domain_age' + ] + self.url_data_items_friendly_names = { + 'unsafe': 'IPQS: Unsafe', + 'domain': 'IPQS: Domain', + 'ip_address': 'IPQS: IP Address', + 'server': 'IPQS: Server', + 'domain_rank': 'IPQS: Domain Rank', + 'dns_valid': 'IPQS: DNS Valid', + 'parking': 'IPQS: Parking', + 'spamming': 'IPQS: Spamming', + 'malware': 'IPQS: Malware', + 'phishing': 'IPQS: Phishing', + 'suspicious': 'IPQS: Suspicious', + 'adult': 'IPQS: Adult', + 'risk_score': 'IPQS: Risk Score', + 'category': 'IPQS: Category', + 'domain_age': 'IPQS: Domain Age' + } + self.email_data_items = [ + 'valid', + 'disposable', + 'smtp_score', + 'overall_score', + 'first_name', + 'generic', + 'common', + 'dns_valid', + 'honeypot', + 'deliverability', + 'frequent_complainer', + 'spam_trap_score', + 'catch_all', + 'timed_out', + 'suspect', + 'recent_abuse', + 'fraud_score', + 'suggested_domain', + 'leaked', + 'sanitized_email', + 'domain_age', + 'first_seen' + ] + self.email_data_items_friendly_names = { + 'valid': 'IPQS: Valid', + 'disposable': 'IPQS: Disposable', + 'smtp_score': 'IPQS: SMTP Score', + 'overall_score': 'IPQS: Overall Score', + 'first_name': 'IPQS: First Name', + 'generic': 'IPQS: Generic', + 'common': 'IPQS: Common', + 'dns_valid': 'IPQS: DNS Valid', + 'honeypot': 'IPQS: Honeypot', + 'deliverability': 'IPQS: Deliverability', + 'frequent_complainer': 'IPQS: Frequent Complainer', + 'spam_trap_score': 'IPQS: Spam Trap Score', + 'catch_all': 'IPQS: Catch All', + 'timed_out': 'IPQS: Timed Out', + 'suspect': 'IPQS: Suspect', + 'recent_abuse': 'IPQS: Recent Abuse', + 'fraud_score': 'IPQS: Fraud Score', + 'suggested_domain': 'IPQS: Suggested Domain', + 'leaked': 'IPQS: Leaked', + 'sanitized_email': 'IPQS: Sanitized Email', + 'domain_age': 'IPQS: Domain Age', + 'first_seen': 'IPQS: First Seen' + } + self.phone_data_items = [ + 'formatted', + 'local_format', + 'valid', + 'fraud_score', + 'recent_abuse', + 'VOIP', + 'prepaid', + 'risky', + 'active', + 'carrier', + 'line_type', + 'country', + 'city', + 'zip_code', + 'region', + 'dialing_code', + 'active_status', + 'leaked', + 'name', + 'timezone', + 'do_not_call', + ] + self.phone_data_items_friendly_names = { + 'formatted': 'IPQS: Formatted', + 'local_format': 'IPQS: Local Format', + 'valid': 'IPQS: Valid', + 'fraud_score': 'IPQS: Fraud Score', + 'recent_abuse': 'IPQS: Recent Abuse', + 'VOIP': 'IPQS: VOIP', + 'prepaid': 'IPQS: Prepaid', + 'risky': 'IPQS: Risky', + 'active': 'IPQS: Active', + 'carrier': 'IPQS: Carrier', + 'line_type': 'IPQS: Line Type', + 'country': 'IPQS: Country', + 'city': 'IPQS: City', + 'zip_code': 'IPQS: Zip Code', + 'region': 'IPQS: Region', + 'dialing_code': 'IPQS: Dialing Code', + 'active_status': 'IPQS: Active Status', + 'leaked': 'IPQS: Leaked', + 'name': 'IPQS: Name', + 'timezone': 'IPQS: Timezone', + 'do_not_call': 'IPQS: Do Not Call', + } + self.timestamp_items_friendly_name = { + 'human': ' Human', + 'timestamp': ' Timestamp', + 'iso': ' ISO' + } + self.timestamp_items = [ + 'human', + 'timestamp', + 'iso' + ] + + def criticality_color(self, criticality) -> str: + """method which maps the color to the criticality level""" + mapper = { + self.clean: self.rf_grey, + self.low: self.rf_grey, + self.medium: self.rf_yellow, + self.suspicious: self.rf_yellow, + self.high: self.rf_red, + self.critical: self.rf_red, + self.invalid: self.rf_red, + self.disposable: self.rf_red, + self.malware: self.rf_red, + self.phishing: self.rf_red + } + return mapper.get(criticality, self.rf_white) + + def add_tag(self, tag_name: str, hex_color: str = None) -> None: + """Helper method for adding a tag to the enriched attribute.""" + tag = MISPTag() + tag_properties = {"name": tag_name} + if hex_color: + tag_properties["colour"] = hex_color + tag.from_dict(**tag_properties) + self.enriched_attribute.add_tag(tag) + + def ipqs_parser(self, query_response, enrich_type): + """ helper method to call the enrichment function according to the type""" + if enrich_type == IP_ENRICH: + self.ip_reputation_data(query_response) + elif enrich_type == URL_ENRICH: + self.url_reputation_data(query_response) + elif enrich_type == EMAIL_ENRICH: + self.email_reputation_data(query_response) + elif enrich_type == PHONE_ENRICH: + self.phone_reputation_data(query_response) + + def ip_reputation_data(self, query_response): + """method to create object for IP address""" + comment = "Results from IPQualityScore IP Reputation API" + for ip_data_item in self.ip_data_items: + if ip_data_item in query_response: + data_item = self.ip_data_items_friendly_names[ip_data_item] + data_item_value = str(query_response[ip_data_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + if ip_data_item == "fraud_score": + fraud_score = int(data_item_value) + self.ip_address_risk_scoring(fraud_score) + + self.ipqs_object.add_attribute( + "Enriched attribute", **self.enriched_attribute + ) + self.ipqs_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(self.ipqs_object) + + def ip_address_risk_scoring(self, score): + """method to create calculate verdict for IP Address""" + risk_criticality = "" + if score == 100: + risk_criticality = self.critical + elif 85 <= score <= 99: + risk_criticality = self.high + elif 75 <= score <= 84: + risk_criticality = self.medium + elif 60 <= score <= 74: + risk_criticality = self.suspicious + elif score <= 59: + risk_criticality = self.clean + + hex_color = self.criticality_color(risk_criticality) + tag_name = f'IPQS:VERDICT="{risk_criticality}"' + self.add_tag(tag_name, hex_color) + + def url_reputation_data(self, query_response): + """method to create object for URL/Domain""" + malware = False + phishing = False + risk_score = 0 + comment = "Results from IPQualityScore Malicious URL Scanner API" + for url_data_item in self.url_data_items: + if url_data_item in query_response: + data_item_value = "" + if url_data_item == "domain_age": + for timestamp_item in self.timestamp_items: + data_item = self.url_data_items_friendly_names[url_data_item] + \ + self.timestamp_items_friendly_name[timestamp_item] + data_item_value = str(query_response[url_data_item][timestamp_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + else: + data_item = self.url_data_items_friendly_names[url_data_item] + data_item_value = str(query_response[url_data_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + + if url_data_item == "malware": + malware = data_item_value + if url_data_item == "phishing": + phishing = data_item_value + if url_data_item == "risk_score": + risk_score = int(data_item_value) + + self.url_risk_scoring(risk_score, malware, phishing) + self.ipqs_object.add_attribute( + "Enriched attribute", **self.enriched_attribute + ) + self.ipqs_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(self.ipqs_object) + + def url_risk_scoring(self, score, malware, phishing): + """method to create calculate verdict for URL/Domain""" + risk_criticality = "" + if malware == 'True': + risk_criticality = self.malware + elif phishing == 'True': + risk_criticality = self.phishing + elif score >= 90: + risk_criticality = self.high + elif 80 <= score <= 89: + risk_criticality = self.medium + elif 70 <= score <= 79: + risk_criticality = self.low + elif 55 <= score <= 69: + risk_criticality = self.suspicious + elif score <= 54: + risk_criticality = self.clean + + hex_color = self.criticality_color(risk_criticality) + tag_name = f'IPQS:VERDICT="{risk_criticality}"' + self.add_tag(tag_name, hex_color) + + def email_reputation_data(self, query_response): + """method to create object for Email Address""" + comment = "Results from IPQualityScore Email Verification API" + disposable = False + valid = False + fraud_score = 0 + for email_data_item in self.email_data_items: + if email_data_item in query_response: + data_item_value = "" + if email_data_item not in ("domain_age", "first_seen"): + data_item = self.email_data_items_friendly_names[email_data_item] + data_item_value = str(query_response[email_data_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + else: + for timestamp_item in self.timestamp_items: + data_item = self.email_data_items_friendly_names[email_data_item] + \ + self.timestamp_items_friendly_name[timestamp_item] + data_item_value = str(query_response[email_data_item][timestamp_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + + if email_data_item == "disposable": + disposable = data_item_value + if email_data_item == "valid": + valid = data_item_value + if email_data_item == "fraud_score": + fraud_score = int(data_item_value) + + self.email_address_risk_scoring(fraud_score, disposable, valid) + self.ipqs_object.add_attribute( + "Enriched attribute", **self.enriched_attribute + ) + self.ipqs_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(self.ipqs_object) + + def email_address_risk_scoring(self, score, disposable, valid): + """method to create calculate verdict for Email Address""" + risk_criticality = "" + if disposable == "True": + risk_criticality = self.disposable + elif valid == "False": + risk_criticality = self.invalid + elif score == 100: + risk_criticality = self.high + elif 88 <= score <= 99: + risk_criticality = self.medium + elif 80 <= score <= 87: + risk_criticality = self.low + elif score <= 79: + risk_criticality = self.clean + hex_color = self.criticality_color(risk_criticality) + tag_name = f'IPQS:VERDICT="{risk_criticality}"' + + self.add_tag(tag_name, hex_color) + + def phone_reputation_data(self, query_response): + """method to create object for Phone Number""" + fraud_score = 0 + valid = False + active = False + comment = "Results from IPQualityScore Phone Number Validation API" + for phone_data_item in self.phone_data_items: + if phone_data_item in query_response: + data_item = self.phone_data_items_friendly_names[phone_data_item] + data_item_value = str(query_response[phone_data_item]) + self.ipqs_object.add_attribute(**parse_attribute(comment, data_item, data_item_value)) + if phone_data_item == "active": + active = data_item_value + if phone_data_item == "valid": + valid = data_item_value + if phone_data_item == "fraud_score": + fraud_score = int(data_item_value) + + + self.phone_address_risk_scoring(fraud_score, valid, active) + self.ipqs_object.add_attribute( + "Enriched attribute", **self.enriched_attribute + ) + self.ipqs_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(self.ipqs_object) + + def phone_address_risk_scoring(self, score, valid, active): + """method to create calculate verdict for Phone Number""" + risk_criticality = "" + if valid == "False": + risk_criticality = self.medium + elif active == "False": + risk_criticality = self.medium + elif 90 <= score <= 100: + risk_criticality = self.high + elif 80 <= score <= 89: + risk_criticality = self.low + elif 50 <= score <= 79: + risk_criticality = self.suspicious + elif score <= 49: + risk_criticality = self.clean + hex_color = self.criticality_color(risk_criticality) + tag_name = f'IPQS:VERDICT="{risk_criticality}"' + self.add_tag(tag_name, hex_color) + + def get_results(self): + """returns the dictionary object to MISP Instance""" + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object')} + return {'results': results} + + +def handler(q=False): + """The function which accepts a JSON document to expand the values and return a dictionary of the expanded + values. """ + if q is False: + return False + request = json.loads(q) + # check if the apikey is provided + if not request.get('config') or not request['config'].get('apikey'): + misperrors['error'] = 'IPQualityScore apikey is missing' + return misperrors + apikey = request['config'].get('apikey') + # check attribute is added to the event + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + + attribute = request['attribute'] + attribute_type = attribute['type'] + attribute_value = attribute['value'] + + # check if the attribute type is supported by IPQualityScore + if attribute_type not in mispattributes['input']: + return {'error': 'Unsupported attributes type for IPqualityScore Enrichment'} + request_handler = RequestHandler(apikey) + enrich_type = "" + if attribute_type in ip_query_input_type: + enrich_type = IP_ENRICH + json_response = request_handler.ipqs_lookup(IP_ENRICH, attribute_value) + elif attribute_type in url_query_input_type: + enrich_type = URL_ENRICH + json_response = request_handler.ipqs_lookup(URL_ENRICH, attribute_value) + elif attribute_type in email_query_input_type: + enrich_type = EMAIL_ENRICH + json_response = request_handler.ipqs_lookup(EMAIL_ENRICH, attribute_value) + elif attribute_type in phone_query_input_type: + enrich_type = PHONE_ENRICH + json_response = request_handler.ipqs_lookup(PHONE_ENRICH, attribute_value) + + parser = IPQualityScoreParser(attribute) + parser.ipqs_parser(json_response, enrich_type) + return parser.get_results() + + +def introspection(): + """The function that returns a dict of the supported attributes (input and output) by your expansion module.""" + return mispattributes + + +def version(): + """The function that returns a dict with the version and the associated meta-data including potential + configurations required of the module. """ + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/expansion/jinja_template_rendering.py b/misp_modules/modules/expansion/jinja_template_rendering.py new file mode 100755 index 0000000..5749aba --- /dev/null +++ b/misp_modules/modules/expansion/jinja_template_rendering.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python\ + +import json +from jinja2.sandbox import SandboxedEnvironment + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['text'], 'output': ['text']} +moduleinfo = {'version': '0.1', 'author': 'Sami Mokaddem', + 'description': 'Render the template with the data passed', + 'module-type': ['expansion']} + +default_template = '- Default template -' + +def renderTemplate(data, template=default_template): + env = SandboxedEnvironment() + return env.from_string(template).render(data) + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + if request.get('text'): + data = request['text'] + else: + return False + data = json.loads(data) + template = data.get('template', default_template) + templateData = data.get('data', {}) + try: + rendered = renderTemplate(templateData, template) + except TypeError: + rendered = '' + + r = {'results': [{'types': mispattributes['output'], + 'values':[rendered]}]} + return r + + +def introspection(): + return mispattributes + + +def version(): + return moduleinfo diff --git a/misp_modules/modules/expansion/joesandbox_query.py b/misp_modules/modules/expansion/joesandbox_query.py index b9c4987..e303512 100644 --- a/misp_modules/modules/expansion/joesandbox_query.py +++ b/misp_modules/modules/expansion/joesandbox_query.py @@ -11,7 +11,7 @@ inputSource = ['link'] moduleinfo = {'version': '0.2', 'author': 'Christian Studer', 'description': 'Query Joe Sandbox API with a report URL to get the parsed data.', 'module-type': ['expansion']} -moduleconfig = ['apiurl', 'apikey', 'import_pe', 'import_mitre_attack'] +moduleconfig = ['apiurl', 'apikey', 'import_executable', 'import_mitre_attack'] def handler(q=False): @@ -21,7 +21,7 @@ def handler(q=False): apiurl = request['config'].get('apiurl') or 'https://jbxcloud.joesecurity.org/api' apikey = request['config'].get('apikey') parser_config = { - "import_pe": request["config"].get('import_pe', "false") == "true", + "import_executable": request["config"].get('import_executable', "false") == "true", "mitre_attack": request["config"].get('import_mitre_attack', "false") == "true", } diff --git a/misp_modules/modules/expansion/lastline_query.py b/misp_modules/modules/expansion/lastline_query.py index dbfdf14..501a0bd 100644 --- a/misp_modules/modules/expansion/lastline_query.py +++ b/misp_modules/modules/expansion/lastline_query.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 """ +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + Module (type "expansion") to query a Lastline report from an analysis link. """ import json diff --git a/misp_modules/modules/expansion/lastline_submit.py b/misp_modules/modules/expansion/lastline_submit.py index 1572955..fef165b 100644 --- a/misp_modules/modules/expansion/lastline_submit.py +++ b/misp_modules/modules/expansion/lastline_submit.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 """ +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + Module (type "expansion") to submit files and URLs to Lastline for analysis. """ import base64 diff --git a/misp_modules/modules/expansion/mcafee_insights_enrich.py b/misp_modules/modules/expansion/mcafee_insights_enrich.py new file mode 100644 index 0000000..8026d7f --- /dev/null +++ b/misp_modules/modules/expansion/mcafee_insights_enrich.py @@ -0,0 +1,239 @@ +# Written by mohlcyber 13.08.2021 +# MISP Module for McAfee MVISION Insights to query campaign details + +import json +import logging +import requests +import sys + +from . import check_input_attribute, standard_error_message +from pymisp import MISPAttribute, MISPEvent, MISPObject + +misperrors = {'error': 'Error'} +mispattributes = {'input': ["md5", "sha1", "sha256"], + 'format': 'misp_standard'} + +# possible module-types: 'expansion', 'hover' or both +moduleinfo = {'version': '1', 'author': 'Martin Ohl', + 'description': 'Lookup McAfee MVISION Insights Details', + 'module-type': ['hover']} + +# config fields that your code expects from the site admin +moduleconfig = ['api_key', 'client_id', 'client_secret'] + + +class MVAPI(): + def __init__(self, attribute, api_key, client_id, client_secret): + self.misp_event = MISPEvent() + self.attribute = MISPAttribute() + self.attribute.from_dict(**attribute) + self.misp_event.add_attribute(**self.attribute) + + self.base_url = 'https://api.mvision.mcafee.com' + self.session = requests.Session() + + self.api_key = api_key + auth = (client_id, client_secret) + + self.logging() + self.auth(auth) + + def logging(self): + self.logger = logging.getLogger('logs') + self.logger.setLevel('INFO') + handler = logging.StreamHandler() + formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s") + handler.setFormatter(formatter) + self.logger.addHandler(handler) + + def auth(self, auth): + iam_url = "https://iam.mcafee-cloud.com/iam/v1.1/token" + + headers = { + 'x-api-key': self.api_key, + 'Content-Type': 'application/vnd.api+json' + } + + payload = { + "grant_type": "client_credentials", + "scope": "ins.user ins.suser ins.ms.r" + } + + res = self.session.post(iam_url, headers=headers, auth=auth, data=payload) + + if res.status_code != 200: + self.logger.error('Could not authenticate to get the IAM token: {0} - {1}'.format(res.status_code, res.text)) + sys.exit() + else: + self.logger.info('Successful authenticated.') + access_token = res.json()['access_token'] + headers['Authorization'] = 'Bearer ' + access_token + self.session.headers = headers + + def search_ioc(self): + filters = { + 'filter[type][eq]': self.attribute.type, + 'filter[value]': self.attribute.value, + 'fields': 'id, type, value, coverage, uid, is_coat, is_sdb_dirty, category, comment, campaigns, threat, prevalence' + } + res = self.session.get(self.base_url + '/insights/v2/iocs', params=filters) + + if res.ok: + if len(res.json()['data']) == 0: + self.logger.info('No Hash details in MVISION Insights found.') + else: + self.logger.info('Successfully retrieved MVISION Insights details.') + self.logger.debug(res.text) + return res.json() + else: + self.logger.error('Error in search_ioc. HTTP {0} - {1}'.format(str(res.status_code), res.text)) + sys.exit() + + def prep_result(self, ioc): + res = ioc['data'][0] + results = [] + + # Parse out Attribute Category + category_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Attribute Category: {0}'.format(res['attributes']['category']) + } + results.append(category_attr) + + # Parse out Attribute Comment + comment_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Attribute Comment: {0}'.format(res['attributes']['comment']) + } + results.append(comment_attr) + + # Parse out Attribute Dat Coverage + cover_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Dat Version Coverage: {0}'.format(res['attributes']['coverage']['dat_version']['min']) + } + results.append(cover_attr) + + # Parse out if Dirty + cover_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Is Dirty: {0}'.format(res['attributes']['is-sdb-dirty']) + } + results.append(cover_attr) + + # Parse our targeted countries + countries_dict = [] + countries = res['attributes']['prevalence']['countries'] + + for country in countries: + countries_dict.append(country['iso_code']) + + country_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Targeted Countries: {0}'.format(countries_dict) + } + results.append(country_attr) + + # Parse out targeted sectors + sectors_dict = [] + sectors = res['attributes']['prevalence']['sectors'] + + for sector in sectors: + sectors_dict.append(sector['sector']) + + sector_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Targeted Sectors: {0}'.format(sectors_dict) + } + results.append(sector_attr) + + # Parse out Threat Classification + threat_class_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Threat Classification: {0}'.format(res['attributes']['threat']['classification']) + } + results.append(threat_class_attr) + + # Parse out Threat Name + threat_name_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Threat Name: {0}'.format(res['attributes']['threat']['name']) + } + results.append(threat_name_attr) + + # Parse out Threat Severity + threat_sev_attr = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Threat Severity: {0}'.format(res['attributes']['threat']['severity']) + } + results.append(threat_sev_attr) + + # Parse out Attribute ID + attr_id = { + 'type': 'text', + 'object_relation': 'text', + 'value': 'Attribute ID: {0}'.format(res['id']) + } + results.append(attr_id) + + # Parse out Campaign Relationships + campaigns = ioc['included'] + + for campaign in campaigns: + campaign_attr = { + 'type': 'campaign-name', + 'object_relation': 'campaign-name', + 'value': campaign['attributes']['name'] + } + results.append(campaign_attr) + + mv_insights_obj = MISPObject(name='MVISION Insights Details') + for mvi_res in results: + mv_insights_obj.add_attribute(**mvi_res) + mv_insights_obj.add_reference(self.attribute.uuid, 'mvision-insights-details') + + self.misp_event.add_object(mv_insights_obj) + + event = json.loads(self.misp_event.to_json()) + results_mvi = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + + return {'results': results_mvi} + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + + if not request.get('config') or not request['config'].get('api_key') or not request['config'].get('client_id') or not request['config'].get('client_secret'): + misperrors['error'] = "Please provide MVISION API Key, Client ID and Client Secret." + return misperrors + if request['attribute']['type'] not in mispattributes['input']: + return {'error': 'Unsupported attribute type. Please use {0}'.format(mispattributes['input'])} + + api_key = request['config']['api_key'] + client_id = request['config']['client_id'] + client_secret = request['config']['client_secret'] + attribute = request['attribute'] + + mvi = MVAPI(attribute, api_key, client_id, client_secret) + res = mvi.search_ioc() + return mvi.prep_result(res) + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/expansion/mmdb_lookup.py b/misp_modules/modules/expansion/mmdb_lookup.py new file mode 100644 index 0000000..e3a0eff --- /dev/null +++ b/misp_modules/modules/expansion/mmdb_lookup.py @@ -0,0 +1,129 @@ +import json +import requests +from . import check_input_attribute, standard_error_message +from pymisp import MISPEvent, MISPObject + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['ip-src', 'ip-src|port', 'ip-dst', 'ip-dst|port'], 'format': 'misp_standard'} +moduleinfo = {'version': '1', 'author': 'Jeroen Pinoy', + 'description': "An expansion module to enrich an ip with geolocation and asn information from an mmdb server " + "such as ip.circl.lu.", + 'module-type': ['expansion', 'hover']} +moduleconfig = ["custom_API", "db_source_filter"] +mmdblookup_url = 'https://ip.circl.lu/' + + +class MmdbLookupParser(): + def __init__(self, attribute, mmdblookupresult, api_url): + self.attribute = attribute + self.mmdblookupresult = mmdblookupresult + self.api_url = api_url + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + + def get_result(self): + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} + return {'results': results} + + def parse_mmdblookup_information(self): + # There is a chance some db's have a hit while others don't so we have to check if entry is empty each time + for result_entry in self.mmdblookupresult: + if result_entry['country_info']: + mmdblookup_object = MISPObject('geolocation') + mmdblookup_object.add_attribute('country', + **{'type': 'text', 'value': result_entry['country_info']['Country']}) + mmdblookup_object.add_attribute('countrycode', + **{'type': 'text', 'value': result_entry['country']['iso_code']}) + mmdblookup_object.add_attribute('latitude', + **{'type': 'float', + 'value': result_entry['country_info']['Latitude (average)']}) + mmdblookup_object.add_attribute('longitude', + **{'type': 'float', + 'value': result_entry['country_info']['Longitude (average)']}) + mmdblookup_object.add_attribute('text', + **{'type': 'text', + 'value': 'db_source: {}. build_db: {}. Latitude and longitude are country average.'.format( + result_entry['meta']['db_source'], + result_entry['meta']['build_db'])}) + mmdblookup_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(mmdblookup_object) + if 'AutonomousSystemNumber' in result_entry['country']: + mmdblookup_object_asn = MISPObject('asn') + mmdblookup_object_asn.add_attribute('asn', + **{'type': 'text', + 'value': result_entry['country'][ + 'AutonomousSystemNumber']}) + mmdblookup_object_asn.add_attribute('description', + **{'type': 'text', + 'value': 'ASNOrganization: {}. db_source: {}. build_db: {}.'.format( + result_entry['country'][ + 'AutonomousSystemOrganization'], + result_entry['meta']['db_source'], + result_entry['meta']['build_db'])}) + mmdblookup_object_asn.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(mmdblookup_object_asn) + + +def check_url(url): + return "{}/".format(url) if not url.endswith('/') else url + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute.get('type') == 'ip-src': + toquery = attribute['value'] + elif attribute.get('type') == 'ip-src|port': + toquery = attribute['value'].split('|')[0] + elif attribute.get('type') == 'ip-dst': + toquery = attribute['value'] + elif attribute.get('type') == 'ip-dst|port': + toquery = attribute['value'].split('|')[0] + else: + misperrors['error'] = 'There is no attribute of type ip-src or ip-dst provided as input' + return misperrors + api_url = check_url(request['config']['custom_API']) if 'config' in request and request['config'].get( + 'custom_API') else mmdblookup_url + r = requests.get("{}/geolookup/{}".format(api_url, toquery)) + if r.status_code == 200: + mmdblookupresult = r.json() + if not mmdblookupresult or len(mmdblookupresult) == 0: + misperrors['error'] = 'Empty result returned by server' + return misperrors + if 'config' in request and request['config'].get('db_source_filter'): + db_source_filter = request['config'].get('db_source_filter') + mmdblookupresult = [entry for entry in mmdblookupresult if entry['meta']['db_source'] == db_source_filter] + if not mmdblookupresult or len(mmdblookupresult) == 0: + misperrors['error'] = 'There was no result with the selected db_source' + return misperrors + # Server might return one or multiple entries which could all be empty, we check if there is at least one + # non-empty result below + empty_result = True + for lookup_result_entry in mmdblookupresult: + if lookup_result_entry['country_info']: + empty_result = False + break + if empty_result: + misperrors['error'] = 'Empty result returned by server' + return misperrors + else: + misperrors['error'] = 'API not accessible - http status code {} was returned'.format(r.status_code) + return misperrors + parser = MmdbLookupParser(attribute, mmdblookupresult, api_url) + parser.parse_mmdblookup_information() + result = parser.get_result() + return result + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/expansion/mwdb.py b/misp_modules/modules/expansion/mwdb.py new file mode 100644 index 0000000..66f5fe4 --- /dev/null +++ b/misp_modules/modules/expansion/mwdb.py @@ -0,0 +1,142 @@ +import json +import sys +import base64 +#from distutils.util import strtobool + +import io +import zipfile + +from pymisp import PyMISP +from mwdblib import MWDB + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['attachment', 'malware-sample'], 'output': ['link']} +moduleinfo = {'version': '1', 'author': 'Koen Van Impe', + 'description': 'Module to push malware samples to a MWDB instance', + 'module-type': ['expansion']} + +moduleconfig = ['mwdb_apikey', 'mwdb_url', 'mwdb_misp_attribute', 'mwdb_public', 'include_tags_event', 'include_tags_attribute'] + +pymisp_keys_file = "/var/www/MISP/PyMISP/" +mwdb_public_default = True + +""" +An expansion module to push malware samples to a MWDB (https://github.com/CERT-Polska/mwdb-core) instance. +This module does not push samples to a sandbox. This can be achieved via Karton (connected to the MWDB) + +Does: +- Upload of attachment or malware sample to MWDB +- Tags of events and/or attributes are added to MWDB. +- Comment of the MISP attribute is added to MWDB. +- A link back to the MISP event is added to MWDB via the MWDB attribute. +- A link to the MWDB attribute is added as an enriched attribute to the MISP event. + +Requires +- mwdblib installed (pip install mwdblib) +- (optional) keys.py file to add tags of events/attributes to MWDB +- (optional) MWDB "attribute" created for the link back to MISP (defined in mwdb_misp_attribute) +""" + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + + try: + data = request.get("data") + if 'malware-sample' in request: + # malicious samples are encrypted with zip (password infected) and then base64 encoded + sample_filename = request.get("malware-sample").split("|", 1)[0] + data = base64.b64decode(data) + fl = io.BytesIO(data) + zf = zipfile.ZipFile(fl) + sample_hashname = zf.namelist()[0] + data = zf.read(sample_hashname, b"infected") + zf.close() + elif 'attachment' in request: + # All attachments get base64 encoded + sample_filename = request.get("attachment") + data = base64.b64decode(data) + + else: + misperrors['error'] = "No malware sample or attachment supplied" + return misperrors + except Exception: + misperrors['error'] = "Unable to process submited sample data" + return misperrors + + if (request["config"].get("mwdb_apikey") is None) or (request["config"].get("mwdb_url") is None): + misperrors["error"] = "Missing MWDB API key or server URL" + return misperrors + + mwdb_misp_attribute = request["config"].get("mwdb_misp_attribute") + mwdb_public = request["config"].get("mwdb_public", mwdb_public_default) + + include_tags_event = request["config"].get("include_tags_event") + include_tags_attribute = request["config"].get("include_tags_attribute") + misp_event_id = request.get("event_id") + misp_attribute_uuid = request.get("attribute_uuid") + misp_attribute_comment = "" + mwdb_tags = [] + misp_info = "" + + try: + if include_tags_event: + sys.path.append(pymisp_keys_file) + from keys import misp_url, misp_key, misp_verifycert + misp = PyMISP(misp_url, misp_key, misp_verifycert, False) + misp_event = misp.get_event(misp_event_id) + if "Event" in misp_event: + misp_info = misp_event["Event"]["info"] + if "Tag" in misp_event["Event"]: + tags = misp_event["Event"]["Tag"] + for tag in tags: + if "misp-galaxy" not in tag["name"]: + mwdb_tags.append(tag["name"]) + if include_tags_attribute: + sys.path.append(pymisp_keys_file) + from keys import misp_url, misp_key, misp_verifycert + misp = PyMISP(misp_url, misp_key, misp_verifycert, False) + misp_attribute = misp.get_attribute(misp_attribute_uuid) + if "Attribute" in misp_attribute: + if "Tag" in misp_attribute["Attribute"]: + tags = misp_attribute["Attribute"]["Tag"] + for tag in tags: + if "misp-galaxy" not in tag["name"]: + mwdb_tags.append(tag["name"]) + misp_attribute_comment = misp_attribute["Attribute"]["comment"] + except Exception: + misperrors['error'] = "Unable to read PyMISP (keys.py) configuration file" + return misperrors + + try: + mwdb = MWDB(api_key=request["config"].get("mwdb_apikey"), api_url=request["config"].get("mwdb_url")) + if mwdb_misp_attribute and len(mwdb_misp_attribute) > 0: + metakeys = {mwdb_misp_attribute: misp_event_id} + else: + metakeys = False + file_object = mwdb.upload_file(sample_filename, data, metakeys=metakeys, public=mwdb_public) + for tag in mwdb_tags: + file_object.add_tag(tag) + if len(misp_attribute_comment) < 1: + misp_attribute_comment = "MISP attribute {}".format(misp_attribute_uuid) + file_object.add_comment(misp_attribute_comment) + if len(misp_event) > 0: + file_object.add_comment("Fetched from event {} - {}".format(misp_event_id, misp_info)) + mwdb_link = request["config"].get("mwdb_url").replace("/api", "/file/") + "{}".format(file_object.md5) + except Exception: + misperrors['error'] = "Unable to send sample to MWDB instance" + return misperrors + + r = {'results': [{'types': 'link', 'values': mwdb_link, 'comment': 'Link to MWDB sample'}]} + return r + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/expansion/ocr_enrich.py b/misp_modules/modules/expansion/ocr_enrich.py index cd6baca..ff0a70c 100644 --- a/misp_modules/modules/expansion/ocr_enrich.py +++ b/misp_modules/modules/expansion/ocr_enrich.py @@ -6,14 +6,21 @@ import pytesseract misperrors = {'error': 'Error'} mispattributes = {'input': ['attachment'], - 'output': ['freetext', 'text']} -moduleinfo = {'version': '0.1', 'author': 'Sascha Rommelfangen', + 'output': ['freetext']} +moduleinfo = {'version': '0.2', 'author': 'Sascha Rommelfangen', 'description': 'OCR decoder', 'module-type': ['expansion']} moduleconfig = [] +def filter_decoded(decoded): + for line in decoded.split('\n'): + decoded_line = line.strip('\t\x0b\x0c\r ') + if decoded_line: + yield decoded_line + + def handler(q=False): if q is False: return False @@ -31,9 +38,16 @@ def handler(q=False): image = img_array image = cv2.imdecode(img_array, cv2.IMREAD_COLOR) try: - decoded = pytesseract.image_to_string(image) - return {'results': [{'types': ['freetext'], 'values': decoded, 'comment': "OCR from file " + filename}, - {'types': ['text'], 'values': decoded, 'comment': "ORC from file " + filename}]} + decoded = pytesseract.image_to_string(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) + return { + 'results': [ + { + 'types': ['freetext'], + 'values': list(filter_decoded(decoded)), + 'comment': f"OCR from file {filename}" + } + ] + } except Exception as e: print(e) err = "Couldn't analyze file type. Only images are supported right now." diff --git a/misp_modules/modules/expansion/ods_enrich.py b/misp_modules/modules/expansion/ods_enrich.py index b247c44..69aca77 100644 --- a/misp_modules/modules/expansion/ods_enrich.py +++ b/misp_modules/modules/expansion/ods_enrich.py @@ -4,6 +4,7 @@ import np import ezodf import pandas_ods_reader import io +import logging misperrors = {'error': 'Error'} mispattributes = {'input': ['attachment'], @@ -35,13 +36,12 @@ def handler(q=False): num_sheets = len(doc.sheets) try: for i in range(0, num_sheets): - ods = pandas_ods_reader.read_ods(ods_file, i, headers=False) + ods = pandas_ods_reader.algo.read_data(pandas_ods_reader.parsers.ods, ods_file, i, headers=False) ods_content = ods_content + "\n" + ods.to_string(max_rows=None) - print(ods_content) return {'results': [{'types': ['freetext'], 'values': ods_content, 'comment': ".ods-to-text from file " + filename}, {'types': ['text'], 'values': ods_content, 'comment': ".ods-to-text from file " + filename}]} except Exception as e: - print(e) + logging.exception(e) err = "Couldn't analyze file as .ods. Error was: " + str(e) misperrors['error'] = err return misperrors diff --git a/misp_modules/modules/expansion/onyphe.py b/misp_modules/modules/expansion/onyphe.py index d8db477..c777707 100644 --- a/misp_modules/modules/expansion/onyphe.py +++ b/misp_modules/modules/expansion/onyphe.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- import json + +from pymisp import MISPEvent, MISPObject + try: from onyphe import Onyphe except ImportError: @@ -9,9 +12,10 @@ except ImportError: misperrors = {'error': 'Error'} mispattributes = {'input': ['ip-src', 'ip-dst', 'hostname', 'domain'], - 'output': ['hostname', 'domain', 'ip-src', 'ip-dst', 'url']} + 'output': ['hostname', 'domain', 'ip-src', 'ip-dst', 'url'], + 'format': 'misp_standard'} # possible module-types: 'expansion', 'hover' or both -moduleinfo = {'version': '1', 'author': 'Sebastien Larinier @sebdraven', +moduleinfo = {'version': '2', 'author': 'Sebastien Larinier @sebdraven', 'description': 'Query on Onyphe', 'module-type': ['expansion', 'hover']} @@ -19,84 +23,205 @@ moduleinfo = {'version': '1', 'author': 'Sebastien Larinier @sebdraven', moduleconfig = ['apikey'] +class OnypheClient: + + def __init__(self, api_key, attribute): + self.onyphe_client = Onyphe(api_key=api_key) + self.attribute = attribute + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + + def get_results(self): + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] + for key in ('Attribute', 'Object') if key in event} + return results + + def get_query_onyphe(self): + if self.attribute['type'] == 'ip-src' or self.attribute['type'] == 'ip-dst': + self.__summary_ip() + if self.attribute['type'] == 'domain': + self.__summary_domain() + if self.attribute['type'] == 'hostname': + self.__summary_hostname() + + def __summary_ip(self): + results = self.onyphe_client.summary_ip(self.attribute['value']) + if 'results' in results: + for r in results['results']: + if 'domain' in r: + domain = r['domain'] + if type(domain) == list: + for d in domain: + self.__get_object_domain_ip(d, 'domain') + elif type(domain) == str: + self.__get_object_domain_ip(domain, 'domain') + + if 'hostname' in r: + hostname = r['hostname'] + if type(hostname) == list: + for d in hostname: + self.__get_object_domain_ip(d, 'domain') + elif type(hostname) == str: + self.__get_object_domain_ip(hostname, 'domain') + + if 'issuer' in r: + self.__get_object_certificate(r) + + def __summary_domain(self): + results = self.onyphe_client.summary_domain(self.attribute['value']) + if 'results' in results: + for r in results['results']: + + for domain in r.get('domain'): + self.misp_event.add_attribute('domain', domain) + for hostname in r.get('hostname'): + self.misp_event.add_attribute('hostname', hostname) + if 'ip' in r: + if type(r['ip']) is str: + self.__get_object_domain_ip(r['ip'], 'ip') + if type(r['ip']) is list: + for ip in r['ip']: + self.__get_object_domain_ip(ip, 'ip') + if 'issuer' in r: + self.__get_object_certificate(r) + + def __summary_hostname(self): + results = self.onyphe_client.summary_hostname(self.attribute['value']) + if 'results' in results: + + for r in results['results']: + if 'domain' in r: + if type(r['domain']) is str: + self.misp_event.add_attribute( + 'domain', r['domain']) + if type(r['domain']) is list: + for domain in r['domain']: + self.misp_event.add_attribute('domain', domain) + + if 'hostname' in r: + if type(r['hostname']) is str: + self.misp_event.add_attribute( + 'hostname', r['hostname']) + if type(r['hostname']) is list: + for hostname in r['hostname']: + self.misp_event.add_attribute( + 'hostname', hostname) + + if 'ip' in r: + if type(r['ip']) is str: + self.__get_object_domain_ip(r['ip'], 'ip') + if type(r['ip']) is list: + for ip in r['ip']: + self.__get_object_domain_ip(ip, 'ip') + + if 'issuer' in r: + self.__get_object_certificate(r) + + if 'cve' in r: + if type(r['cve']) is list: + for cve in r['cve']: + self.__get_object_cve(r, cve) + + def __get_object_certificate(self, r): + object_certificate = MISPObject('x509') + object_certificate.add_attribute('ip', self.attribute['value']) + object_certificate.add_attribute('serial-number', r['serial']) + object_certificate.add_attribute( + 'x509-fingerprint-sha256', r['fingerprint']['sha256']) + object_certificate.add_attribute( + 'x509-fingerprint-sha1', r['fingerprint']['sha1']) + object_certificate.add_attribute( + 'x509-fingerprint-md5', r['fingerprint']['md5']) + + signature = r['signature']['algorithm'] + value = '' + if 'sha256' in signature and 'RSA' in signature: + value = 'SHA256_WITH_RSA_ENCRYPTION' + elif 'sha1' in signature and 'RSA' in signature: + value = 'SHA1_WITH_RSA_ENCRYPTION' + if value: + object_certificate.add_attribute('signature_algorithm', value) + + object_certificate.add_attribute( + 'pubkey-info-algorithm', r['publickey']['algorithm']) + + if 'exponent' in r['publickey']: + object_certificate.add_attribute( + 'pubkey-info-exponent', r['publickey']['exponent']) + if 'length' in r['publickey']: + object_certificate.add_attribute( + 'pubkey-info-size', r['publickey']['length']) + + object_certificate.add_attribute('issuer', r['issuer']['commonname']) + object_certificate.add_attribute( + 'validity-not-before', r['validity']['notbefore']) + object_certificate.add_attribute( + 'validity-not-after', r['validity']['notbefore']) + object_certificate.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(object_certificate) + + def __get_object_domain_ip(self, obs, relation): + objet_domain_ip = MISPObject('domain-ip') + objet_domain_ip.add_attribute(relation, obs) + relation_attr = self.__get_relation_attribute() + if relation_attr: + objet_domain_ip.add_attribute( + relation_attr, self.attribute['value']) + objet_domain_ip.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(objet_domain_ip) + + def __get_relation_attribute(self): + + if self.attribute['type'] == 'ip-src': + return 'ip' + elif self.attribute['type'] == 'ip-dst': + return 'ip' + elif self.attribute['type'] == 'domain': + return 'domain' + elif self.attribute['type'] == 'hostname': + return 'domain' + + def __get_object_cve(self, item, cve): + attributes = [] + object_cve = MISPObject('vulnerability') + object_cve.add_attribute('id', cve) + object_cve.add_attribute('state', 'Published') + + if type(item['ip']) is list: + for ip in item['ip']: + attributes.extend( + list(filter(lambda x: x['value'] == ip, self.misp_event['Attribute']))) + for obj in self.misp_event['Object']: + attributes.extend( + list(filter(lambda x: x['value'] == ip, obj['Attribute']))) + if type(item['ip']) is str: + + for obj in self.misp_event['Object']: + for att in obj['Attribute']: + if att['value'] == item['ip']: + object_cve.add_reference(obj['uuid'], 'cve') + + self.misp_event.add_object(object_cve) + + def handler(q=False): if q: request = json.loads(q) + attribute = request['attribute'] if not request.get('config') or not request['config'].get('apikey'): misperrors['error'] = 'Onyphe authentication is missing' return misperrors - api = Onyphe(request['config'].get('apikey')) + api_key = request['config'].get('apikey') - if not api: - misperrors['error'] = 'Onyphe Error instance api' + onyphe_client = OnypheClient(api_key, attribute) + onyphe_client.get_query_onyphe() + results = onyphe_client.get_results() - ip = '' - if request.get('ip-src'): - ip = request['ip-src'] - elif request.get('ip-dst'): - ip = request['ip-dst'] - else: - misperrors['error'] = "Unsupported attributes type" - return misperrors - - return handle_expansion(api, ip, misperrors) - else: - return False - - -def handle_expansion(api, ip, misperrors): - result = api.ip(ip) - - if result['status'] == 'nok': - misperrors['error'] = result['message'] - return misperrors - - # categories = list(set([item['@category'] for item in result['results']])) - - result_filtered = {"results": []} - urls_pasties = [] - asn_list = [] - os_list = [] - domains_resolver = [] - domains_forward = [] - - for r in result['results']: - if r['@category'] == 'pastries': - if r['source'] == 'pastebin': - urls_pasties.append('https://pastebin.com/raw/%s' % r['key']) - elif r['@category'] == 'synscan': - asn_list.append(r['asn']) - os_target = r['os'] - if os_target != 'Unknown': - os_list.append(r['os']) - elif r['@category'] == 'resolver' and r['type'] == 'reverse': - domains_resolver.append(r['reverse']) - elif r['@category'] == 'resolver' and r['type'] == 'forward': - domains_forward.append(r['forward']) - - result_filtered['results'].append({'types': ['url'], 'values': urls_pasties, - 'categories': ['External analysis']}) - - result_filtered['results'].append({'types': ['AS'], 'values': list(set(asn_list)), - 'categories': ['Network activity']}) - - result_filtered['results'].append({'types': ['target-machine'], - 'values': list(set(os_list)), - 'categories': ['Targeting data']}) - - result_filtered['results'].append({'types': ['domain'], - 'values': list(set(domains_resolver)), - 'categories': ['Network activity'], - 'comment': 'resolver to %s' % ip}) - - result_filtered['results'].append({'types': ['domain'], - 'values': list(set(domains_forward)), - 'categories': ['Network activity'], - 'comment': 'forward to %s' % ip}) - return result_filtered + return {'results': results} def introspection(): diff --git a/misp_modules/modules/expansion/passive-ssh.py b/misp_modules/modules/expansion/passive-ssh.py new file mode 100644 index 0000000..bf70ec9 --- /dev/null +++ b/misp_modules/modules/expansion/passive-ssh.py @@ -0,0 +1,140 @@ +import json +import requests +from . import check_input_attribute, standard_error_message +from collections import defaultdict +from pymisp import MISPEvent, MISPObject + +misperrors = {'error': 'Error'} + +mispattributes = {'input': ['ip-src', 'ip-dst', 'ssh-fingerprint'], + 'format': 'misp_standard'} + +moduleinfo = {'version': '1', 'author': 'Jean-Louis Huynen', + 'description': 'An expansion module to enrich, SSH key fingerprints and IP addresses with information collected by passive-ssh', + 'module-type': ['expansion', 'hover']} + +moduleconfig = ["custom_api_url", "api_user", "api_key"] + +passivessh_url = 'https://passivessh.circl.lu/' + +host_query = '/host/ssh' +fingerprint_query = '/fingerprint/all' + + +class PassivesshParser(): + def __init__(self, attribute, passivesshresult): + self.attribute = attribute + self.passivesshresult = passivesshresult + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + self.references = defaultdict(list) + + def get_result(self): + if self.references: + self.__build_references() + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ( + 'Attribute', 'Object') if (key in event and event[key])} + return {'results': results} + + def parse_passivessh_information(self): + passivessh_object = MISPObject('passive-ssh') + if 'first_seen' in self.passivesshresult: + passivessh_object.add_attribute( + 'first_seen', **{'type': 'datetime', 'value': self.passivesshresult['first_seen']}) + if 'last_seen' in self.passivesshresult: + passivessh_object.add_attribute( + 'last_seen', **{'type': 'datetime', 'value': self.passivesshresult['last_seen']}) + if 'base64' in self.passivesshresult: + passivessh_object.add_attribute( + 'base64', **{'type': 'text', 'value': self.passivesshresult['base64']}) + if 'keys' in self.passivesshresult: + for key in self.passivesshresult['keys']: + passivessh_object.add_attribute( + 'fingerprint', **{'type': 'ssh-fingerprint', 'value': key['fingerprint']}) + if 'hosts' in self.passivesshresult: + for host in self.passivesshresult['hosts']: + passivessh_object.add_attribute( + 'host', **{'type': 'ip-dst', 'value': host}) + + passivessh_object.add_reference(self.attribute['uuid'], 'related-to') + self.misp_event.add_object(passivessh_object) + + def __build_references(self): + for object_uuid, references in self.references.items(): + for misp_object in self.misp_event.objects: + if misp_object.uuid == object_uuid: + for reference in references: + misp_object.add_reference(**reference) + break + + +def check_url(url): + return "{}/".format(url) if not url.endswith('/') else url + + +def handler(q=False): + + if q is False: + return False + request = json.loads(q) + + api_url = check_url(request['config']['custom_api_url']) if request['config'].get( + 'custom_api_url') else passivessh_url + + if request['config'].get('api_user'): + api_user = request['config'].get('api_user') + else: + misperrors['error'] = 'passive-ssh user required' + return misperrors + if request['config'].get('api_key'): + api_key = request['config'].get('api_key') + else: + misperrors['error'] = 'passive-ssh password required' + return misperrors + + if not request.get('attribute') or not check_input_attribute(request['attribute']): + return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} + attribute = request['attribute'] + if attribute.get('type') == 'ip-src': + type = host_query + pass + elif attribute.get('type') == 'ip-dst': + type = host_query + pass + elif attribute.get('type') == 'ssh-fingerprint': + type = fingerprint_query + pass + else: + misperrors['error'] = 'ip is missing.' + return misperrors + + r = requests.get("{}{}/{}".format(api_url, type, + attribute['value']), auth=(api_user, api_key)) + + if r.status_code == 200: + passivesshresult = r.json() + if not passivesshresult: + misperrors['error'] = 'Empty result' + return misperrors + elif r.status_code == 404: + misperrors['error'] = 'Non existing hash' + return misperrors + else: + misperrors['error'] = 'API not accessible' + return misperrors + + parser = PassivesshParser(attribute, passivesshresult) + parser.parse_passivessh_information() + result = parser.get_result() + + return result + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/expansion/qintel_qsentry.py b/misp_modules/modules/expansion/qintel_qsentry.py new file mode 100644 index 0000000..6733b93 --- /dev/null +++ b/misp_modules/modules/expansion/qintel_qsentry.py @@ -0,0 +1,221 @@ +import logging +import json + +from pymisp import MISPAttribute, MISPEvent, MISPTag, MISPObject +from . import check_input_attribute, checking_error, standard_error_message + +from qintel_helper import search_qsentry + +logger = logging.getLogger('qintel_qsentry') +logger.setLevel(logging.DEBUG) + +moduleinfo = { + 'version': '1.0', + 'author': 'Qintel, LLC', + 'description': 'Query Qintel QSentry for ip intelligence', + 'module-type': ['hover', 'expansion'] +} + +moduleconfig = ['token', 'remote'] + +misperrors = {'error': 'Error'} + +mispattributes = { + 'input': ['ip-src', 'ip-dst'], + 'output': ['ip-src', 'ip-dst', 'AS', 'freetext'], + 'format': 'misp_standard' +} + +TAG_COLOR = { + 'benign': '#27ae60', + 'suspicious': '#e6a902', + 'malicious': '#c0392b' +} + +CLIENT_HEADERS = { + 'User-Agent': f"MISP/{moduleinfo['version']}", +} + + +def _return_error(message): + misperrors['error'] = message + return misperrors + + +def _make_tags(enriched_attr, result): + + for tag in result['tags']: + color = TAG_COLOR['suspicious'] + if tag == 'criminal': + color = TAG_COLOR['malicious'] + + t = MISPTag() + t.from_dict(**{ + 'name': f'qintel:tag="{tag}"', + 'colour': color + }) + enriched_attr.add_tag(**t) + + return enriched_attr + + +def _make_enriched_attr(event, result, orig_attr): + + enriched_object = MISPObject('Qintel Threat Enrichment') + enriched_object.add_reference(orig_attr.uuid, 'related-to') + + enriched_attr = MISPAttribute() + enriched_attr.from_dict(**{ + 'value': orig_attr.value, + 'type': orig_attr.type, + 'distribution': 0, + 'object_relation': 'enriched-attr', + 'to_ids': orig_attr.to_ids + }) + + enriched_attr = _make_tags(enriched_attr, result) + enriched_object.add_attribute(**enriched_attr) + + comment_attr = MISPAttribute() + comment_attr.from_dict(**{ + 'value': '\n'.join(result.get('descriptions', [])), + 'type': 'text', + 'object_relation': 'descriptions', + 'distribution': 0 + }) + enriched_object.add_attribute(**comment_attr) + + last_seen = MISPAttribute() + last_seen.from_dict(**{ + 'value': result.get('last_seen'), + 'type': 'datetime', + 'object_relation': 'last-seen', + 'distribution': 0 + }) + enriched_object.add_attribute(**last_seen) + + event.add_attribute(**orig_attr) + event.add_object(**enriched_object) + + return event + + +def _make_asn_attr(event, result, orig_attr): + + asn_object = MISPObject('asn') + asn_object.add_reference(orig_attr.uuid, 'related-to') + + asn_attr = MISPAttribute() + asn_attr.from_dict(**{ + 'type': 'AS', + 'value': result.get('asn'), + 'object_relation': 'asn', + 'distribution': 0 + }) + asn_object.add_attribute(**asn_attr) + + org_attr = MISPAttribute() + org_attr.from_dict(**{ + 'type': 'text', + 'value': result.get('asn_name', 'unknown').title(), + 'object_relation': 'description', + 'distribution': 0 + }) + asn_object.add_attribute(**org_attr) + + event.add_object(**asn_object) + + return event + + +def _format_hover(event, result): + + enriched_object = event.get_objects_by_name('Qintel Threat Enrichment')[0] + + tags = ', '.join(result.get('tags')) + enriched_object.add_attribute('Tags', type='text', value=tags) + + return event + + +def _format_result(attribute, result): + + event = MISPEvent() + + orig_attr = MISPAttribute() + orig_attr.from_dict(**attribute) + + event = _make_enriched_attr(event, result, orig_attr) + event = _make_asn_attr(event, result, orig_attr) + + return event + + +def _check_config(config): + if not config: + return False + + if not isinstance(config, dict): + return False + + if config.get('token', '') == '': + return False + + return True + + +def _check_request(request): + if not request.get('attribute'): + return f'{standard_error_message}, {checking_error}' + + check_reqs = ('type', 'value') + if not check_input_attribute(request['attribute'], + requirements=check_reqs): + return f'{standard_error_message}, {checking_error}' + + if request['attribute']['type'] not in mispattributes['input']: + return 'Unsupported attribute type' + + +def handler(q=False): + if not q: + return False + + request = json.loads(q) + config = request.get('config') + + if not _check_config(config): + return _return_error('Missing Qintel token') + + check_request_error = _check_request(request) + if check_request_error: + return _return_error(check_request_error) + + search_args = { + 'token': config['token'], + 'remote': config.get('remote') + } + + try: + result = search_qsentry(request['attribute']['value'], **search_args) + except Exception as e: + return _return_error(str(e)) + + event = _format_result(request['attribute'], result) + if not request.get('event_id'): + event = _format_hover(event, result) + + event = json.loads(event.to_json()) + + ret_result = {key: event[key] for key in ('Attribute', 'Object') if key + in event} + return {'results': ret_result} + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/expansion/rbl.py b/misp_modules/modules/expansion/rbl.py index 4d7bba5..d3f661e 100644 --- a/misp_modules/modules/expansion/rbl.py +++ b/misp_modules/modules/expansion/rbl.py @@ -3,78 +3,75 @@ import sys try: import dns.resolver - resolver = dns.resolver.Resolver() - resolver.timeout = 0.2 - resolver.lifetime = 0.2 except ImportError: print("dnspython3 is missing, use 'pip install dnspython3' to install it.") sys.exit(0) misperrors = {'error': 'Error'} mispattributes = {'input': ['ip-src', 'ip-dst'], 'output': ['text']} -moduleinfo = {'version': '0.1', 'author': 'Christian Studer', +moduleinfo = {'version': '0.2', 'author': 'Christian Studer', 'description': 'Check an IPv4 address against known RBLs.', 'module-type': ['expansion', 'hover']} -moduleconfig = [] +moduleconfig = ['timeout'] -rbls = { - 'spam.spamrats.com': 'http://www.spamrats.com', - 'spamguard.leadmon.net': 'http://www.leadmon.net/SpamGuard/', - 'rbl-plus.mail-abuse.org': 'http://www.mail-abuse.com/lookup.html', - 'web.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'ix.dnsbl.manitu.net': 'http://www.dnsbl.manitu.net', - 'virus.rbl.jp': 'http://www.rbl.jp', - 'dul.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'bogons.cymru.com': 'http://www.team-cymru.org/Services/Bogons/', - 'psbl.surriel.com': 'http://psbl.surriel.com', - 'misc.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'httpbl.abuse.ch': 'http://dnsbl.abuse.ch', - 'combined.njabl.org': 'http://combined.njabl.org', - 'smtp.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'korea.services.net': 'http://korea.services.net', - 'drone.abuse.ch': 'http://dnsbl.abuse.ch', - 'rbl.efnetrbl.org': 'http://rbl.efnetrbl.org', - 'cbl.anti-spam.org.cn': 'http://www.anti-spam.org.cn/?Locale=en_US', - 'b.barracudacentral.org': 'http://www.barracudacentral.org/rbl/removal-request', - 'bl.spamcannibal.org': 'http://www.spamcannibal.org', - 'xbl.spamhaus.org': 'http://www.spamhaus.org/xbl/', - 'zen.spamhaus.org': 'http://www.spamhaus.org/zen/', - 'rbl.suresupport.com': 'http://suresupport.com/postmaster', - 'db.wpbl.info': 'http://www.wpbl.info', - 'sbl.spamhaus.org': 'http://www.spamhaus.org/sbl/', - 'http.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'csi.cloudmark.com': 'http://www.cloudmark.com/en/products/cloudmark-sender-intelligence/index', - 'rbl.interserver.net': 'http://rbl.interserver.net', - 'ubl.unsubscore.com': 'http://www.lashback.com/blacklist/', - 'dnsbl.sorbs.net': 'http://www.sorbs.net', - 'virbl.bit.nl': 'http://virbl.bit.nl', - 'pbl.spamhaus.org': 'http://www.spamhaus.org/pbl/', - 'socks.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'short.rbl.jp': 'http://www.rbl.jp', - 'dnsbl.dronebl.org': 'http://www.dronebl.org', - 'blackholes.mail-abuse.org': 'http://www.mail-abuse.com/lookup.html', - 'truncate.gbudb.net': 'http://www.gbudb.com/truncate/index.jsp', - 'dyna.spamrats.com': 'http://www.spamrats.com', - 'spamrbl.imp.ch': 'http://antispam.imp.ch', - 'spam.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'wormrbl.imp.ch': 'http://antispam.imp.ch', - 'query.senderbase.org': 'http://www.senderbase.org/about', - 'opm.tornevall.org': 'http://dnsbl.tornevall.org', - 'netblock.pedantic.org': 'http://pedantic.org', - 'access.redhawk.org': 'http://www.redhawk.org/index.php?option=com_wrapper&Itemid=33', - 'cdl.anti-spam.org.cn': 'http://www.anti-spam.org.cn/?Locale=en_US', - 'multi.surbl.org': 'http://www.surbl.org', - 'noptr.spamrats.com': 'http://www.spamrats.com', - 'dnsbl.inps.de': 'http://dnsbl.inps.de/index.cgi?lang=en', - 'bl.spamcop.net': 'http://bl.spamcop.net', - 'cbl.abuseat.org': 'http://cbl.abuseat.org', - 'dsn.rfc-ignorant.org': 'http://www.rfc-ignorant.org/policy-dsn.php', - 'zombie.dnsbl.sorbs.net': 'http://www.sorbs.net', - 'dnsbl.njabl.org': 'http://dnsbl.njabl.org', - 'relays.mail-abuse.org': 'http://www.mail-abuse.com/lookup.html', - 'rbl.spamlab.com': 'http://tools.appriver.com/index.aspx?tool=rbl', - 'all.bl.blocklist.de': 'http://www.blocklist.de/en/rbldns.html' -} +rbls = ( + "spam.spamrats.com", + "spamguard.leadmon.net", + "rbl-plus.mail-abuse.org", + "web.dnsbl.sorbs.net", + "ix.dnsbl.manitu.net", + "virus.rbl.jp", + "dul.dnsbl.sorbs.net", + "bogons.cymru.com", + "psbl.surriel.com", + "misc.dnsbl.sorbs.net", + "httpbl.abuse.ch", + "combined.njabl.org", + "smtp.dnsbl.sorbs.net", + "korea.services.net", + "drone.abuse.ch", + "rbl.efnetrbl.org", + "cbl.anti-spam.org.cn", + "b.barracudacentral.org", + "bl.spamcannibal.org", + "xbl.spamhaus.org", + "zen.spamhaus.org", + "rbl.suresupport.com", + "db.wpbl.info", + "sbl.spamhaus.org", + "http.dnsbl.sorbs.net", + "csi.cloudmark.com", + "rbl.interserver.net", + "ubl.unsubscore.com", + "dnsbl.sorbs.net", + "virbl.bit.nl", + "pbl.spamhaus.org", + "socks.dnsbl.sorbs.net", + "short.rbl.jp", + "dnsbl.dronebl.org", + "blackholes.mail-abuse.org", + "truncate.gbudb.net", + "dyna.spamrats.com", + "spamrbl.imp.ch", + "spam.dnsbl.sorbs.net", + "wormrbl.imp.ch", + "query.senderbase.org", + "opm.tornevall.org", + "netblock.pedantic.org", + "access.redhawk.org", + "cdl.anti-spam.org.cn", + "multi.surbl.org", + "noptr.spamrats.com", + "dnsbl.inps.de", + "bl.spamcop.net", + "cbl.abuseat.org", + "dsn.rfc-ignorant.org", + "zombie.dnsbl.sorbs.net", + "dnsbl.njabl.org", + "relays.mail-abuse.org", + "rbl.spamlab.com", + "all.bl.blocklist.de" +) def handler(q=False): @@ -88,18 +85,23 @@ def handler(q=False): else: misperrors['error'] = "Unsupported attributes type" return misperrors - listeds = [] - infos = [] + resolver = dns.resolver.Resolver() + try: + timeout = float(request['config']['timeout']) + except (KeyError, ValueError): + timeout = 0.4 + resolver.timeout = timeout + resolver.lifetime = timeout + infos = {} ipRev = '.'.join(ip.split('.')[::-1]) for rbl in rbls: query = '{}.{}'.format(ipRev, rbl) try: txt = resolver.query(query, 'TXT') - listeds.append(query) - infos.append([str(t) for t in txt]) + infos[query] = [str(t) for t in txt] except Exception: continue - result = "\n".join([f"{listed}: {' - '.join(info)}" for listed, info in zip(listeds, infos)]) + result = "\n".join([f"{rbl}: {' - '.join(info)}" for rbl, info in infos.items()]) if not result: return {'error': 'No data found by querying known RBLs'} return {'results': [{'types': mispattributes.get('output'), 'values': result}]} diff --git a/misp_modules/modules/expansion/recordedfuture.py b/misp_modules/modules/expansion/recordedfuture.py index ccea31b..8056bfa 100644 --- a/misp_modules/modules/expansion/recordedfuture.py +++ b/misp_modules/modules/expansion/recordedfuture.py @@ -1,8 +1,14 @@ import json import logging import requests -from requests.exceptions import HTTPError, ProxyError,\ - InvalidURL, ConnectTimeout, ConnectionError +from requests.exceptions import ( + HTTPError, + ProxyError, + InvalidURL, + ConnectTimeout, + ConnectionError, +) +from typing import Optional, List, Tuple, Dict from . import check_input_attribute, checking_error, standard_error_message import platform import os @@ -10,47 +16,63 @@ from urllib.parse import quote, urlparse from pymisp import MISPAttribute, MISPEvent, MISPTag, MISPObject moduleinfo = { - 'version': '1.0.1', - 'author': 'Recorded Future', - 'description': 'Module to retrieve data from Recorded Future', - 'module-type': ['expansion', 'hover'] + "version": "2.0.0", + "author": "Recorded Future", + "description": "Module to retrieve data from Recorded Future", + "module-type": ["expansion", "hover"], } -moduleconfig = ['token', 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_password'] +moduleconfig = ["token", "proxy_host", "proxy_port", "proxy_username", "proxy_password"] -misperrors = {'error': 'Error'} +misperrors = {"error": "Error"} -ATTRIBUTES = [ - 'ip', - 'ip-src', - 'ip-dst', - 'domain', - 'hostname', - 'md5', - 'sha1', - 'sha256', - 'uri', - 'url', - 'vulnerability', - 'weakness' +GALAXY_FILE_PATH = "https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/" + +ATTRIBUTESTYPES = [ + "ip", + "ip-src", + "ip-dst", + "ip-src|port", + "ip-dst|port", + "domain", + "hostname", + "md5", + "sha1", + "sha256", + "uri", + "url", + "vulnerability", + "weakness", +] + +OUTPUTATTRIBUTESTYPES = ATTRIBUTESTYPES + [ + "email-src", + "malware-sample", + "text", + "target-org", + "threat-actor", + "target-user", ] mispattributes = { - 'input': ATTRIBUTES, - 'output': ATTRIBUTES + ['email-src', 'text'], - 'format': 'misp_standard' + "input": ATTRIBUTESTYPES, + "output": OUTPUTATTRIBUTESTYPES, + "format": "misp_standard", } -LOGGER = logging.getLogger('recorded_future') +LOGGER = logging.getLogger("recorded_future") LOGGER.setLevel(logging.INFO) class RequestHandler: """A class for handling any outbound requests from this module.""" + def __init__(self): self.session = requests.Session() - self.app_id = f'{os.path.basename(__file__)}/{moduleinfo["version"]} ({platform.platform()}) ' \ - f'misp_enrichment/{moduleinfo["version"]} python-requests/{requests.__version__}' + self.app_id = ( + f'{os.path.basename(__file__)}/{moduleinfo["version"]} ({platform.platform()}) ' + f'misp_enrichment/{moduleinfo["version"]} python-requests/{requests.__version__}' + ) self.proxies = None self.rf_token = None @@ -58,27 +80,28 @@ class RequestHandler: """General get method with proxy error handling.""" try: timeout = 7 if self.proxies else None - response = self.session.get(url, headers=headers, proxies=self.proxies, timeout=timeout) + response = self.session.get( + url, headers=headers, proxies=self.proxies, timeout=timeout + ) response.raise_for_status() return response except (ConnectTimeout, ProxyError, InvalidURL) as error: - msg = 'Error connecting with proxy, please check the Recorded Future app proxy settings.' - LOGGER.error(f'{msg} Error: {error}') - misperrors['error'] = msg + msg = "Error connecting with proxy, please check the Recorded Future app proxy settings." + LOGGER.error(f"{msg} Error: {error}") + misperrors["error"] = msg raise def rf_lookup(self, category: str, ioc: str) -> requests.Response: """Do a lookup call using Recorded Future's ConnectAPI.""" - parsed_ioc = quote(ioc, safe='') - url = f'https://api.recordedfuture.com/v2/{category}/{parsed_ioc}?fields=risk%2CrelatedEntities' - headers = {'X-RFToken': self.rf_token, - 'User-Agent': self.app_id} + parsed_ioc = quote(ioc, safe="") + url = f"https://api.recordedfuture.com/gw/misp/lookup/{category}/{parsed_ioc}" + headers = {"X-RFToken": self.rf_token, "User-Agent": self.app_id} try: response = self.get(url, headers) except HTTPError as error: - msg = f'Error when requesting data from Recorded Future. {error.response}: {error.response.reason}' + msg = f"Error when requesting data from Recorded Future. {error.response}: {error.response.reason}" LOGGER.error(msg) - misperrors['error'] = msg + misperrors["error"] = msg raise return response @@ -88,20 +111,49 @@ GLOBAL_REQUEST_HANDLER = RequestHandler() class GalaxyFinder: """A class for finding MISP galaxy matches to Recorded Future data.""" + def __init__(self): self.session = requests.Session() + # There are duplicates values for different keys because Links entities and Related entities + # have have different naming for the same types self.sources = { - 'RelatedThreatActor': [ - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/threat-actor.json' + "RelatedThreatActor": [f"{GALAXY_FILE_PATH}threat-actor.json"], + "Threat Actor": [f"{GALAXY_FILE_PATH}threat-actor.json"], + "RelatedMalware": [ + f"{GALAXY_FILE_PATH}banker.json", + f"{GALAXY_FILE_PATH}botnet.json", + f"{GALAXY_FILE_PATH}exploit-kit.json", + f"{GALAXY_FILE_PATH}rat.json", + f"{GALAXY_FILE_PATH}ransomware.json", + f"{GALAXY_FILE_PATH}malpedia.json", + ], + "Malware": [ + f"{GALAXY_FILE_PATH}banker.json", + f"{GALAXY_FILE_PATH}botnet.json", + f"{GALAXY_FILE_PATH}exploit-kit.json", + f"{GALAXY_FILE_PATH}rat.json", + f"{GALAXY_FILE_PATH}ransomware.json", + f"{GALAXY_FILE_PATH}malpedia.json", + ], + "MitreAttackIdentifier": [ + f"{GALAXY_FILE_PATH}mitre-attack-pattern.json", + f"{GALAXY_FILE_PATH}mitre-course-of-action.json", + f"{GALAXY_FILE_PATH}mitre-enterprise-attack-attack-pattern.json", + f"{GALAXY_FILE_PATH}mitre-enterprise-attack-course-of-action.json", + f"{GALAXY_FILE_PATH}mitre-enterprise-attack-intrusion-set.json", + f"{GALAXY_FILE_PATH}mitre-enterprise-attack-malware.json", + f"{GALAXY_FILE_PATH}mitre-enterprise-attack-tool.json", + f"{GALAXY_FILE_PATH}mitre-intrusion-set.json", + f"{GALAXY_FILE_PATH}mitre-malware.json", + f"{GALAXY_FILE_PATH}mitre-mobile-attack-attack-pattern.json", + f"{GALAXY_FILE_PATH}mitre-mobile-attack-course-of-action.json", + f"{GALAXY_FILE_PATH}mitre-mobile-attack-intrusion-set.json", + f"{GALAXY_FILE_PATH}mitre-mobile-attack-malware.json", + f"{GALAXY_FILE_PATH}mitre-mobile-attack-tool.json", + f"{GALAXY_FILE_PATH}mitre-pre-attack-attack-pattern.json", + f"{GALAXY_FILE_PATH}mitre-pre-attack-intrusion-set.json", + f"{GALAXY_FILE_PATH}mitre-tool.json", ], - 'RelatedMalware': [ - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/banker.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/botnet.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/exploit-kit.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/rat.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/ransomware.json', - 'https://raw.githubusercontent.com/MISP/misp-galaxy/main/clusters/malpedia.json' - ] } self.galaxy_clusters = {} @@ -112,33 +164,38 @@ class GalaxyFinder: for source in self.sources.get(related_type): try: response = GLOBAL_REQUEST_HANDLER.get(source) - name = source.split('/')[-1].split('.')[0] - self.galaxy_clusters[related_type] = {name: response.json()} + name = source.split("/")[-1].split(".")[0] + self.galaxy_clusters.setdefault(related_type, {}).update( + {name: response.json()} + ) except ConnectionError as error: - LOGGER.warning(f'pull_galaxy_cluster failed for source: {source}, with error: {error}.') + LOGGER.warning( + f"pull_galaxy_cluster failed for source: {source}, with error: {error}." + ) def find_galaxy_match(self, indicator: str, related_type: str) -> str: """Searches the clusters of the related_type for a match with the indicator. - :returns the first matching galaxy string or an empty string if no galaxy match is found. + :returns the first matching galaxy string or an empty string if no galaxy match is found. """ self.pull_galaxy_cluster(related_type) for cluster_name, cluster in self.galaxy_clusters.get(related_type, {}).items(): - for value in cluster['values']: - try: - if indicator in value['meta']['synonyms'] or indicator in value['value']: - value = value['value'] - return f'misp-galaxy:{cluster_name}="{value}"' - except KeyError: - pass - return '' + for value in cluster["values"]: + if indicator in value.get("meta", {}).get( + "synonyms", "" + ) or indicator in value.get("value", ""): + value = value["value"] + return f'misp-galaxy:{cluster_name}="{value}"' + return "" class RFColors: """Class for setting signature RF-colors.""" + def __init__(self): - self.rf_white = '#CCCCCC' - self.rf_yellow = '#FFCE00' - self.rf_red = '#CF0A2C' + self.rf_white = "#CCCCCC" + self.rf_grey = " #CDCDCD" + self.rf_yellow = "#FFCF00" + self.rf_red = "#D10028" def riskscore_color(self, risk_score: int) -> str: """Returns appropriate hex-colors according to risk score.""" @@ -160,194 +217,276 @@ class RFColors: else: # risk_rule_criticality == 3 or 4 return self.rf_red + def criticality_color(self, criticality) -> str: + mapper = { + "None": self.rf_grey, + "Low": self.rf_grey, + "Unusual": self.rf_grey, + "Informational": self.rf_grey, + "Medium": self.rf_yellow, + "Suspicious": self.rf_yellow, + "High": self.rf_red, + "Critical": self.rf_red, + "Very Critical": self.rf_red, + "Malicious": self.rf_red, + "Very Malicious": self.rf_red, + } + return mapper.get(criticality, self.rf_white) + class RFEnricher: """Class for enriching an attribute with data from Recorded Future. - The enrichment data is returned as a custom MISP object. + The enrichment data is returned as a custom MISP object. """ + def __init__(self, attribute_props: dict): self.event = MISPEvent() - self.enrichment_object = MISPObject('Recorded Future Enrichment') + self.enrichment_object = MISPObject("Recorded Future Enrichment") + self.enrichment_object.template_uuid = "cbe0ffda-75e5-4c49-833f-093f057652ba" + self.enrichment_object.template_id = "1" + self.enrichment_object.description = "Recorded Future Enrichment" + setattr(self.enrichment_object, 'meta-category', 'network') description = ( - 'An object containing the enriched attribute and ' - 'related entities from Recorded Future.' + "An object containing the enriched attribute and " + "related entities from Recorded Future." + ) + self.enrichment_object.from_dict( + **{"meta-category": "misc", "description": description, "distribution": 0} ) - self.enrichment_object.from_dict(**{ - 'meta-category': 'misc', - 'description': description, - 'distribution': 0 - }) # Create a copy of enriched attribute to add tags to temp_attr = MISPAttribute() temp_attr.from_dict(**attribute_props) self.enriched_attribute = MISPAttribute() - self.enriched_attribute.from_dict(**{ - 'value': temp_attr.value, - 'type': temp_attr.type, - 'distribution': 0 - }) + self.enriched_attribute.from_dict( + **{"value": temp_attr.value, "type": temp_attr.type, "distribution": 0} + ) - self.related_attributes = [] + self.related_attributes: List[Tuple[str, MISPAttribute]] = [] self.color_picker = RFColors() self.galaxy_finder = GalaxyFinder() # Mapping from MISP-type to RF-type self.type_to_rf_category = { - 'ip': 'ip', - 'ip-src': 'ip', - 'ip-dst': 'ip', - 'domain': 'domain', - 'hostname': 'domain', - 'md5': 'hash', - 'sha1': 'hash', - 'sha256': 'hash', - 'uri': 'url', - 'url': 'url', - 'vulnerability': 'vulnerability', - 'weakness': 'vulnerability' + "ip": "ip", + "ip-src": "ip", + "ip-dst": "ip", + "ip-src|port": "ip", + "ip-dst|port": "ip", + "domain": "domain", + "hostname": "domain", + "md5": "hash", + "sha1": "hash", + "sha256": "hash", + "uri": "url", + "url": "url", + "vulnerability": "vulnerability", + "weakness": "vulnerability", } - # Related entities from RF portrayed as related attributes in MISP + # Related entities have 'Related' as part of the word and Links entities from RF + # portrayed as related attributes in MISP self.related_attribute_types = [ - 'RelatedIpAddress', 'RelatedInternetDomainName', 'RelatedHash', - 'RelatedEmailAddress', 'RelatedCyberVulnerability' + "RelatedIpAddress", + "RelatedInternetDomainName", + "RelatedHash", + "RelatedEmailAddress", + "RelatedCyberVulnerability", + "IpAddress", + "InternetDomainName", + "Hash", + "EmailAddress", + "CyberVulnerability", + ] + # Related entities have 'Related' as part of the word and and Links entities from RF portrayed as tags in MISP + self.galaxy_tag_types = [ + "RelatedMalware", + "RelatedThreatActor", + "Threat Actor", + "MitreAttackIdentifier", + "Malware", ] - # Related entities from RF portrayed as tags in MISP - self.galaxy_tag_types = ['RelatedMalware', 'RelatedThreatActor'] def enrich(self) -> None: """Run the enrichment.""" - category = self.type_to_rf_category.get(self.enriched_attribute.type) - json_response = GLOBAL_REQUEST_HANDLER.rf_lookup(category, self.enriched_attribute.value) + category = self.type_to_rf_category.get(self.enriched_attribute.type, "") + enriched_attribute_value = self.enriched_attribute.value + # If enriched attribute has a port we need to remove that port + # since RF do not support enriching ip addresses with port + if self.enriched_attribute.type in ["ip-src|port", "ip-dst|port"]: + enriched_attribute_value = enriched_attribute_value.split("|")[0] + json_response = GLOBAL_REQUEST_HANDLER.rf_lookup( + category, enriched_attribute_value + ) response = json.loads(json_response.content) try: # Add risk score and risk rules as tags to the enriched attribute - risk_score = response['data']['risk']['score'] + risk_score = response["data"]["risk"]["score"] hex_color = self.color_picker.riskscore_color(risk_score) tag_name = f'recorded-future:risk-score="{risk_score}"' self.add_tag(tag_name, hex_color) - for evidence in response['data']['risk']['evidenceDetails']: - risk_rule = evidence['rule'] - criticality = evidence['criticality'] + risk_criticality = response["data"]["risk"]["criticalityLabel"] + hex_color = self.color_picker.criticality_color(risk_criticality) + tag_name = f'recorded-future:criticality="{risk_criticality}"' + self.add_tag(tag_name, hex_color) + + for evidence in response["data"]["risk"]["evidenceDetails"]: + risk_rule = evidence["rule"] + criticality = evidence["criticality"] hex_color = self.color_picker.riskrule_color(criticality) tag_name = f'recorded-future:risk-rule="{risk_rule}"' self.add_tag(tag_name, hex_color) - # Retrieve related entities - for related_entity in response['data']['relatedEntities']: - related_type = related_entity['type'] - if related_type in self.related_attribute_types: - # Related entities returned as additional attributes - for related in related_entity['entities']: - if int(related["count"]) > 4: - indicator = related['entity']['name'] - self.add_related_attribute(indicator, related_type) - elif related_type in self.galaxy_tag_types: - # Related entities added as galaxy-tags to the enriched attribute - galaxy_tags = [] - for related in related_entity['entities']: - if int(related["count"]) > 4: - indicator = related['entity']['name'] - galaxy = self.galaxy_finder.find_galaxy_match(indicator, related_type) - # Handle deduplication of galaxy tags - if galaxy and galaxy not in galaxy_tags: - galaxy_tags.append(galaxy) - for galaxy in galaxy_tags: - self.add_tag(galaxy) + links_data = response["data"].get("links", {}).get("hits") + # Check if we have error in links response. If yes, then user do not have right module enabled in token + links_access_error = response["data"].get("links", {}).get("error") + galaxy_tags = [] + if not links_access_error: + for hit in links_data: + for section in hit["sections"]: + for sec_list in section["lists"]: + entity_type = sec_list["type"]["name"] + for entity in sec_list["entities"]: + if entity_type in self.galaxy_tag_types: + galaxy = self.galaxy_finder.find_galaxy_match( + entity["name"], entity_type + ) + if galaxy and galaxy not in galaxy_tags: + galaxy_tags.append(galaxy) + else: + self.add_attribute(entity["name"], entity_type) + + else: + # Retrieve related entities + for related_entity in response["data"]["relatedEntities"]: + related_type = related_entity["type"] + if related_type in self.related_attribute_types: + # Related entities returned as additional attributes + for related in related_entity["entities"]: + # filter those entities that have count bigger than 4, to reduce noise + # because there can be a huge list of related entities + if int(related["count"]) > 4: + indicator = related["entity"]["name"] + self.add_attribute(indicator, related_type) + elif related_type in self.galaxy_tag_types: + # Related entities added as galaxy-tags to the enriched attribute + galaxy_tags = [] + for related in related_entity["entities"]: + # filter those entities that have count bigger than 4, to reduce noise + # because there can be a huge list of related entities + if int(related["count"]) > 4: + indicator = related["entity"]["name"] + galaxy = self.galaxy_finder.find_galaxy_match( + indicator, related_type + ) + # Handle deduplication of galaxy tags + if galaxy and galaxy not in galaxy_tags: + galaxy_tags.append(galaxy) + for galaxy in galaxy_tags: + self.add_tag(galaxy) + except KeyError: - misperrors['error'] = 'Unexpected format in Recorded Future api response.' + misperrors["error"] = "Unexpected format in Recorded Future api response." raise - def add_related_attribute(self, indicator: str, related_type: str) -> None: - """Helper method for adding an indicator to the related attribute list.""" - out_type = self.get_output_type(related_type, indicator) + def add_attribute(self, indicator: str, indicator_type: str) -> None: + """Helper method for adding an indicator to the attribute list.""" + out_type = self.get_output_type(indicator_type, indicator) attribute = MISPAttribute() - attribute.from_dict(**{'value': indicator, 'type': out_type, 'distribution': 0}) - self.related_attributes.append((related_type, attribute)) + attribute.from_dict(**{"value": indicator, "type": out_type, "distribution": 0}) + self.related_attributes.append((indicator_type, attribute)) def add_tag(self, tag_name: str, hex_color: str = None) -> None: """Helper method for adding a tag to the enriched attribute.""" tag = MISPTag() - tag_properties = {'name': tag_name} + tag_properties = {"name": tag_name} if hex_color: - tag_properties['colour'] = hex_color + tag_properties["colour"] = hex_color tag.from_dict(**tag_properties) self.enriched_attribute.add_tag(tag) def get_output_type(self, related_type: str, indicator: str) -> str: """Helper method for translating a Recorded Future related type to a MISP output type.""" - output_type = 'text' - if related_type == 'RelatedIpAddress': - output_type = 'ip-dst' - elif related_type == 'RelatedInternetDomainName': - output_type = 'domain' - elif related_type == 'RelatedHash': + output_type = "text" + if related_type in ["RelatedIpAddress", "IpAddress"]: + output_type = "ip-dst" + elif related_type in ["RelatedInternetDomainName", "InternetDomainName"]: + output_type = "domain" + elif related_type in ["RelatedHash", "Hash"]: hash_len = len(indicator) if hash_len == 64: - output_type = 'sha256' + output_type = "sha256" elif hash_len == 40: - output_type = 'sha1' + output_type = "sha1" elif hash_len == 32: - output_type = 'md5' - elif related_type == 'RelatedEmailAddress': - output_type = 'email-src' - elif related_type == 'RelatedCyberVulnerability': - signature = indicator.split('-')[0] - if signature == 'CVE': - output_type = 'vulnerability' - elif signature == 'CWE': - output_type = 'weakness' + output_type = "md5" + elif related_type in ["RelatedEmailAddress", "EmailAddress"]: + output_type = "email-src" + elif related_type in ["RelatedCyberVulnerability", "CyberVulnerability"]: + signature = indicator.split("-")[0] + if signature == "CVE": + output_type = "vulnerability" + elif signature == "CWE": + output_type = "weakness" + elif related_type == "MalwareSignature": + output_type = "malware-sample" + elif related_type == "Organization": + output_type = "target-org" + elif related_type == "Username": + output_type = "target-user" return output_type def get_results(self) -> dict: """Build and return the enrichment results.""" - self.enrichment_object.add_attribute('Enriched attribute', **self.enriched_attribute) + self.enrichment_object.add_attribute( + "Enriched attribute", **self.enriched_attribute + ) for related_type, attribute in self.related_attributes: self.enrichment_object.add_attribute(related_type, **attribute) self.event.add_object(**self.enrichment_object) event = json.loads(self.event.to_json()) - result = {key: event[key] for key in ['Object'] if key in event} - return {'results': result} + result = {key: event[key] for key in ["Object"] if key in event} + return {"results": result} -def get_proxy_settings(config: dict) -> dict: +def get_proxy_settings(config: dict) -> Optional[Dict[str, str]]: """Returns proxy settings in the requests format. - If no proxy settings are set, return None.""" + If no proxy settings are set, return None.""" proxies = None - host = config.get('proxy_host') - port = config.get('proxy_port') - username = config.get('proxy_username') - password = config.get('proxy_password') + host = config.get("proxy_host") + port = config.get("proxy_port") + username = config.get("proxy_username") + password = config.get("proxy_password") if host: if not port: - misperrors['error'] = 'The recordedfuture_proxy_host config is set, ' \ - 'please also set the recordedfuture_proxy_port.' + misperrors["error"] = ( + "The recordedfuture_proxy_host config is set, " + "please also set the recordedfuture_proxy_port." + ) raise KeyError parsed = urlparse(host) - if 'http' in parsed.scheme: - scheme = 'http' + if "http" in parsed.scheme: + scheme = "http" else: scheme = parsed.scheme netloc = parsed.netloc - host = f'{netloc}:{port}' + host = f"{netloc}:{port}" if username: if not password: - misperrors['error'] = 'The recordedfuture_proxy_username config is set, ' \ - 'please also set the recordedfuture_proxy_password.' + misperrors["error"] = ( + "The recordedfuture_proxy_username config is set, " + "please also set the recordedfuture_proxy_password." + ) raise KeyError - auth = f'{username}:{password}' - host = auth + '@' + host + auth = f"{username}:{password}" + host = auth + "@" + host - proxies = { - 'http': f'{scheme}://{host}', - 'https': f'{scheme}://{host}' - } + proxies = {"http": f"{scheme}://{host}", "https": f"{scheme}://{host}"} - LOGGER.info(f'Proxy settings: {proxies}') + LOGGER.info(f"Proxy settings: {proxies}") return proxies @@ -357,23 +496,25 @@ def handler(q=False): return False request = json.loads(q) - config = request.get('config') - if config and config.get('token'): - GLOBAL_REQUEST_HANDLER.rf_token = config.get('token') + config = request.get("config") + if config and config.get("token"): + GLOBAL_REQUEST_HANDLER.rf_token = config.get("token") else: - misperrors['error'] = 'Missing Recorded Future token.' + misperrors["error"] = "Missing Recorded Future token." return misperrors - if not request.get('attribute') or not check_input_attribute(request['attribute'], requirements=('type', 'value')): - return {'error': f'{standard_error_message}, {checking_error}.'} - if request['attribute']['type'] not in mispattributes['input']: - return {'error': 'Unsupported attribute type.'} + if not request.get("attribute") or not check_input_attribute( + request["attribute"], requirements=("type", "value") + ): + return {"error": f"{standard_error_message}, {checking_error}."} + if request["attribute"]["type"] not in mispattributes["input"]: + return {"error": "Unsupported attribute type."} try: GLOBAL_REQUEST_HANDLER.proxies = get_proxy_settings(config) except KeyError: return misperrors - input_attribute = request.get('attribute') + input_attribute = request.get("attribute") rf_enricher = RFEnricher(input_attribute) try: @@ -392,5 +533,5 @@ def introspection(): def version(): """Returns a dict with the version and the associated meta-data including potential configurations required of the module.""" - moduleinfo['config'] = moduleconfig + moduleinfo["config"] = moduleconfig return moduleinfo diff --git a/misp_modules/modules/expansion/shodan.py b/misp_modules/modules/expansion/shodan.py index f295deb..2ea9749 100755 --- a/misp_modules/modules/expansion/shodan.py +++ b/misp_modules/modules/expansion/shodan.py @@ -73,7 +73,6 @@ class ShodanParser(): ip_address_object = MISPObject('ip-api-address') for attribute in ip_address_attributes: ip_address_object.add_attribute(**attribute) - ip_address_object.add_attribute(**self._get_source_attribute()) ip_address_object.add_reference(self.attribute.uuid, 'describes') self.misp_event.add_object(ip_address_object) diff --git a/misp_modules/modules/expansion/threatfox.py b/misp_modules/modules/expansion/threatfox.py new file mode 100644 index 0000000..4a89918 --- /dev/null +++ b/misp_modules/modules/expansion/threatfox.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +import requests +import json + +misperrors = {'error': 'Error'} +mispattributes = {'input': ['md5', 'sha1', 'sha256', 'domain', 'url', 'email-src', 'ip-dst|port', 'ip-src|port'], 'output': ['text']} +moduleinfo = {'version': '0.1', 'author': 'Corsin Camichel', 'description': 'Module to search for an IOC on ThreatFox by abuse.ch.', 'module-type': ['hover', 'expansion']} +moduleconfig = [] + +API_URL = "https://threatfox-api.abuse.ch/api/v1/" + + +# copied from +# https://github.com/marjatech/threatfox2misp/blob/main/threatfox2misp.py +def confidence_level_to_tag(level: int) -> str: + confidence_tagging = { + 0: 'misp:confidence-level="unconfident"', + 10: 'misp:confidence-level="rarely-confident"', + 37: 'misp:confidence-level="fairly-confident"', + 63: 'misp:confidence-level="usually-confident"', + 90: 'misp:confidence-level="completely-confident"', + } + + confidence_tag = "" + for tag_minvalue, tag in confidence_tagging.items(): + if level >= tag_minvalue: + confidence_tag = tag + return confidence_tag + + +def handler(q=False): + if q is False: + return False + + request = json.loads(q) + ret_val = "" + + for input_type in mispattributes['input']: + if input_type in request: + to_query = request[input_type] + break + else: + misperrors['error'] = "Unsupported attributes type:" + return misperrors + + data = {"query": "search_ioc", "search_term": f"{to_query}"} + response = requests.post(API_URL, data=json.dumps(data)) + if response.status_code == 200: + result = json.loads(response.text) + if(result["query_status"] == "ok"): + confidence_tag = confidence_level_to_tag(result["data"][0]["confidence_level"]) + ret_val = {'results': [{'types': mispattributes['output'], 'values': [result["data"][0]["threat_type_desc"]], 'tags': [result["data"][0]["malware"], result["data"][0]["malware_printable"], confidence_tag]}]} + + return ret_val + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/expansion/trustar_enrich.py b/misp_modules/modules/expansion/trustar_enrich.py index 1724441..b7ee2a4 100644 --- a/misp_modules/modules/expansion/trustar_enrich.py +++ b/misp_modules/modules/expansion/trustar_enrich.py @@ -195,12 +195,16 @@ def handler(q=False): try: metadata = trustar_parser.ts_client.get_indicators_metadata([Indicator(value=attribute['value'])])[0] + except IndexError: + misperrors['error'] += f" -- No metadata found for indicator {attribute['value']}" except Exception as e: misperrors['error'] += f" -- Could not retrieve indicator metadata from TruSTAR {e}" try: summary = list( trustar_parser.ts_client.get_indicator_summaries([attribute['value']], page_size=MAX_PAGE_SIZE))[0] + except IndexError: + misperrors['error'] += f" -- No summary data found for indicator {attribute['value']}" except Exception as e: misperrors['error'] += f" -- Unable to retrieve TruSTAR summary data: {e}" diff --git a/misp_modules/modules/expansion/virustotal.py b/misp_modules/modules/expansion/virustotal.py index f5f29c5..2d9e714 100644 --- a/misp_modules/modules/expansion/virustotal.py +++ b/misp_modules/modules/expansion/virustotal.py @@ -1,5 +1,6 @@ import json -import requests +from urllib.parse import urlparse +import vt from . import check_input_attribute, standard_error_message from pymisp import MISPAttribute, MISPEvent, MISPObject @@ -8,179 +9,246 @@ mispattributes = {'input': ['hostname', 'domain', "ip-src", "ip-dst", "md5", "sh 'format': 'misp_standard'} # possible module-types: 'expansion', 'hover' or both -moduleinfo = {'version': '4', 'author': 'Hannah Ward', - 'description': 'Get information from VirusTotal', +moduleinfo = {'version': '5', 'author': 'Hannah Ward', + 'description': 'Enrich observables with the VirusTotal v3 API', 'module-type': ['expansion']} # config fields that your code expects from the site admin -moduleconfig = ["apikey", "event_limit"] +moduleconfig = ["apikey", "event_limit", 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_password'] -class VirusTotalParser(object): - def __init__(self, apikey, limit): - self.apikey = apikey - self.limit = limit - self.base_url = "https://www.virustotal.com/vtapi/v2/{}/report" +DEFAULT_RESULTS_LIMIT = 10 + + +class VirusTotalParser: + def __init__(self, client: vt.Client, limit: int) -> None: + self.client = client + self.limit = limit or DEFAULT_RESULTS_LIMIT self.misp_event = MISPEvent() + self.attribute = MISPAttribute() self.parsed_objects = {} self.input_types_mapping = {'ip-src': self.parse_ip, 'ip-dst': self.parse_ip, 'domain': self.parse_domain, 'hostname': self.parse_domain, 'md5': self.parse_hash, 'sha1': self.parse_hash, 'sha256': self.parse_hash, 'url': self.parse_url} + self.proxies = None - def query_api(self, attribute): - self.attribute = MISPAttribute() + @staticmethod + def get_total_analysis(analysis: dict, known_distributors: dict = None) -> int: + if not analysis: + return 0 + count = sum([analysis['undetected'], analysis['suspicious'], analysis['harmless']]) + return count if known_distributors else count + analysis['malicious'] + + def query_api(self, attribute: dict) -> None: self.attribute.from_dict(**attribute) - return self.input_types_mapping[self.attribute.type](self.attribute.value, recurse=True) + self.input_types_mapping[self.attribute.type](self.attribute.value) - def get_result(self): + def get_result(self) -> dict: event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} return {'results': results} + def add_vt_report(self, report: vt.Object) -> str: + analysis = report.get('last_analysis_stats') + total = self.get_total_analysis(analysis, report.get('known_distributors')) + permalink = f'https://www.virustotal.com/gui/{report.type}/{report.id}' + + vt_object = MISPObject('virustotal-report') + vt_object.add_attribute('permalink', type='link', value=permalink) + detection_ratio = f"{analysis['malicious']}/{total}" if analysis else '-/-' + vt_object.add_attribute('detection-ratio', type='text', value=detection_ratio, disable_correlation=True) + self.misp_event.add_object(**vt_object) + return vt_object.uuid + + def create_misp_object(self, report: vt.Object) -> MISPObject: + misp_object = None + vt_uuid = self.add_vt_report(report) + + if report.type == 'file': + misp_object = MISPObject('file') + for hash_type in ('md5', 'sha1', 'sha256', 'tlsh', + 'vhash', 'ssdeep', 'imphash'): + misp_object.add_attribute(hash_type, + **{'type': hash_type, + 'value': report.get(hash_type)}) + elif report.type == 'domain': + misp_object = MISPObject('domain-ip') + misp_object.add_attribute('domain', type='domain', value=report.id) + elif report.type == 'ip_address': + misp_object = MISPObject('domain-ip') + misp_object.add_attribute('ip', type='ip-dst', value=report.id) + elif report.type == 'url': + misp_object = MISPObject('url') + misp_object.add_attribute('url', type='url', value=report.url) + misp_object.add_reference(vt_uuid, 'analyzed-with') + return misp_object + ################################################################################ #### Main parsing functions #### # noqa ################################################################################ - def parse_domain(self, domain, recurse=False): - req = requests.get(self.base_url.format('domain'), params={'apikey': self.apikey, 'domain': domain}) - if req.status_code != 200: - return req.status_code - req = req.json() - hash_type = 'sha256' - whois = 'whois' - feature_types = {'communicating': 'communicates-with', - 'downloaded': 'downloaded-from', - 'referrer': 'referring'} - siblings = (self.parse_siblings(domain) for domain in req['domain_siblings']) - uuid = self.parse_resolutions(req['resolutions'], req['subdomains'] if 'subdomains' in req else None, siblings) - for feature_type, relationship in feature_types.items(): - for feature in ('undetected_{}_samples', 'detected_{}_samples'): - for sample in req.get(feature.format(feature_type), [])[:self.limit]: - status_code = self.parse_hash(sample[hash_type], False, uuid, relationship) - if status_code != 200: - return status_code - if req.get(whois): - whois_object = MISPObject(whois) - whois_object.add_attribute('text', type='text', value=req[whois]) + def parse_domain(self, domain: str) -> str: + domain_report = self.client.get_object(f'/domains/{domain}') + + # DOMAIN + domain_object = self.create_misp_object(domain_report) + + # WHOIS + if domain_report.whois: + whois_object = MISPObject('whois') + whois_object.add_attribute('text', type='text', value=domain_report.whois) self.misp_event.add_object(**whois_object) - return self.parse_related_urls(req, recurse, uuid) - def parse_hash(self, sample, recurse=False, uuid=None, relationship=None): - req = requests.get(self.base_url.format('file'), params={'apikey': self.apikey, 'resource': sample}) - status_code = req.status_code - if req.status_code == 200: - req = req.json() - vt_uuid = self.parse_vt_object(req) - file_attributes = [] - for hash_type in ('md5', 'sha1', 'sha256'): - if req.get(hash_type): - file_attributes.append({'type': hash_type, 'object_relation': hash_type, - 'value': req[hash_type]}) - if file_attributes: - file_object = MISPObject('file') - for attribute in file_attributes: - file_object.add_attribute(**attribute) - file_object.add_reference(vt_uuid, 'analyzed-with') - if uuid and relationship: - file_object.add_reference(uuid, relationship) + # SIBLINGS AND SUBDOMAINS + for relationship_name, misp_name in [('siblings', 'sibling-of'), ('subdomains', 'subdomain')]: + rel_iterator = self.client.iterator(f'/domains/{domain_report.id}/{relationship_name}', limit=self.limit) + for item in rel_iterator: + attr = MISPAttribute() + attr.from_dict(**dict(type='domain', value=item.id)) + self.misp_event.add_attribute(**attr) + domain_object.add_reference(attr.uuid, misp_name) + + # RESOLUTIONS + resolutions_iterator = self.client.iterator(f'/domains/{domain_report.id}/resolutions', limit=self.limit) + for resolution in resolutions_iterator: + domain_object.add_attribute('ip', type='ip-dst', value=resolution.ip_address) + + # COMMUNICATING, DOWNLOADED AND REFERRER FILES + for relationship_name, misp_name in [ + ('communicating_files', 'communicates-with'), + ('downloaded_files', 'downloaded-from'), + ('referrer_files', 'referring') + ]: + files_iterator = self.client.iterator(f'/domains/{domain_report.id}/{relationship_name}', limit=self.limit) + for file in files_iterator: + file_object = self.create_misp_object(file) + file_object.add_reference(domain_object.uuid, misp_name) self.misp_event.add_object(**file_object) - return status_code - def parse_ip(self, ip, recurse=False): - req = requests.get(self.base_url.format('ip-address'), params={'apikey': self.apikey, 'ip': ip}) - if req.status_code != 200: - return req.status_code - req = req.json() - if req.get('asn'): - asn_mapping = {'network': ('ip-src', 'subnet-announced'), - 'country': ('text', 'country')} - asn_object = MISPObject('asn') - asn_object.add_attribute('asn', type='AS', value=req['asn']) - for key, value in asn_mapping.items(): - if req.get(key): - attribute_type, relation = value - asn_object.add_attribute(relation, type=attribute_type, value=req[key]) - self.misp_event.add_object(**asn_object) - uuid = self.parse_resolutions(req['resolutions']) if req.get('resolutions') else None - return self.parse_related_urls(req, recurse, uuid) + # URLS + urls_iterator = self.client.iterator(f'/domains/{domain_report.id}/urls', limit=self.limit) + for url in urls_iterator: + url_object = self.create_misp_object(url) + url_object.add_reference(domain_object.uuid, 'hosted-in') + self.misp_event.add_object(**url_object) - def parse_url(self, url, recurse=False, uuid=None): - req = requests.get(self.base_url.format('url'), params={'apikey': self.apikey, 'resource': url}) - status_code = req.status_code - if req.status_code == 200: - req = req.json() - vt_uuid = self.parse_vt_object(req) - if not recurse: - feature = 'url' - url_object = MISPObject(feature) - url_object.add_attribute(feature, type=feature, value=url) - url_object.add_reference(vt_uuid, 'analyzed-with') - if uuid: - url_object.add_reference(uuid, 'hosted-in') - self.misp_event.add_object(**url_object) - return status_code + self.misp_event.add_object(**domain_object) + return domain_object.uuid - ################################################################################ - #### Additional parsing functions #### # noqa - ################################################################################ + def parse_hash(self, file_hash: str) -> str: + file_report = self.client.get_object(f'/files/{file_hash}') + file_object = self.create_misp_object(file_report) - def parse_related_urls(self, query_result, recurse, uuid=None): - if recurse: - for feature in ('detected_urls', 'undetected_urls'): - if feature in query_result: - for url in query_result[feature]: - value = url['url'] if isinstance(url, dict) else url[0] - status_code = self.parse_url(value, False, uuid) - if status_code != 200: - return status_code + # ITW URLS + urls_iterator = self.client.iterator(f'/files/{file_report.id}/itw_urls', limit=self.limit) + for url in urls_iterator: + url_object = self.create_misp_object(url) + url_object.add_reference(file_object.uuid, 'downloaded') + self.misp_event.add_object(**url_object) + + # COMMUNICATING, DOWNLOADED AND REFERRER FILES + for relationship_name, misp_name in [ + ('contacted_urls', 'communicates-with'), + ('contacted_domains', 'communicates-with'), + ('contacted_ips', 'communicates-with') + ]: + files_iterator = self.client.iterator(f'/files/{file_report.id}/{relationship_name}', limit=self.limit) + for file in files_iterator: + file_object = self.create_misp_object(file) + file_object.add_reference(file_object.uuid, misp_name) + self.misp_event.add_object(**file_object) + + self.misp_event.add_object(**file_object) + return file_object.uuid + + def parse_ip(self, ip: str) -> str: + ip_report = self.client.get_object(f'/ip_addresses/{ip}') + + # IP + ip_object = self.create_misp_object(ip_report) + + # ASN + asn_object = MISPObject('asn') + asn_object.add_attribute('asn', type='AS', value=ip_report.asn) + asn_object.add_attribute('subnet-announced', type='ip-src', value=ip_report.network) + asn_object.add_attribute('country', type='text', value=ip_report.country) + self.misp_event.add_object(**asn_object) + + # RESOLUTIONS + resolutions_iterator = self.client.iterator(f'/ip_addresses/{ip_report.id}/resolutions', limit=self.limit) + for resolution in resolutions_iterator: + ip_object.add_attribute('domain', type='domain', value=resolution.host_name) + + # URLS + urls_iterator = self.client.iterator(f'/ip_addresses/{ip_report.id}/urls', limit=self.limit) + for url in urls_iterator: + url_object = self.create_misp_object(url) + url_object.add_reference(ip_object.uuid, 'hosted-in') + self.misp_event.add_object(**url_object) + + self.misp_event.add_object(**ip_object) + return ip_object.uuid + + def parse_url(self, url: str) -> str: + url_id = vt.url_id(url) + url_report = self.client.get_object(f'/urls/{url_id}') + url_object = self.create_misp_object(url_report) + + # COMMUNICATING, DOWNLOADED AND REFERRER FILES + for relationship_name, misp_name in [ + ('communicating_files', 'communicates-with'), + ('downloaded_files', 'downloaded-from'), + ('referrer_files', 'referring') + ]: + files_iterator = self.client.iterator(f'/urls/{url_report.id}/{relationship_name}', limit=self.limit) + for file in files_iterator: + file_object = self.create_misp_object(file) + file_object.add_reference(url_object.uuid, misp_name) + self.misp_event.add_object(**file_object) + + self.misp_event.add_object(**url_object) + return url_object.uuid + + +def get_proxy_settings(config: dict) -> dict: + """Returns proxy settings in the requests format. + If no proxy settings are set, return None.""" + proxies = None + host = config.get('proxy_host') + port = config.get('proxy_port') + username = config.get('proxy_username') + password = config.get('proxy_password') + + if host: + if not port: + misperrors['error'] = 'The virustotal_proxy_host config is set, ' \ + 'please also set the virustotal_proxy_port.' + raise KeyError + parsed = urlparse(host) + if 'http' in parsed.scheme: + scheme = 'http' else: - for feature in ('detected_urls', 'undetected_urls'): - if feature in query_result: - for url in query_result[feature]: - value = url['url'] if isinstance(url, dict) else url[0] - self.misp_event.add_attribute('url', value) - return 200 + scheme = parsed.scheme + netloc = parsed.netloc + host = f'{netloc}:{port}' - def parse_resolutions(self, resolutions, subdomains=None, uuids=None): - domain_ip_object = MISPObject('domain-ip') - if self.attribute.type in ('domain', 'hostname'): - domain_ip_object.add_attribute('domain', type='domain', value=self.attribute.value) - attribute_type, relation, key = ('ip-dst', 'ip', 'ip_address') - else: - domain_ip_object.add_attribute('ip', type='ip-dst', value=self.attribute.value) - attribute_type, relation, key = ('domain', 'domain', 'hostname') - for resolution in resolutions: - domain_ip_object.add_attribute(relation, type=attribute_type, value=resolution[key]) - if subdomains: - for subdomain in subdomains: - attribute = MISPAttribute() - attribute.from_dict(**dict(type='domain', value=subdomain)) - self.misp_event.add_attribute(**attribute) - domain_ip_object.add_reference(attribute.uuid, 'subdomain') - if uuids: - for uuid in uuids: - domain_ip_object.add_reference(uuid, 'sibling-of') - self.misp_event.add_object(**domain_ip_object) - return domain_ip_object.uuid + if username: + if not password: + misperrors['error'] = 'The virustotal_proxy_username config is set, ' \ + 'please also set the virustotal_proxy_password.' + raise KeyError + auth = f'{username}:{password}' + host = auth + '@' + host - def parse_siblings(self, domain): - attribute = MISPAttribute() - attribute.from_dict(**dict(type='domain', value=domain)) - self.misp_event.add_attribute(**attribute) - return attribute.uuid - - def parse_vt_object(self, query_result): - if query_result['response_code'] == 1: - vt_object = MISPObject('virustotal-report') - vt_object.add_attribute('permalink', type='link', value=query_result['permalink']) - detection_ratio = '{}/{}'.format(query_result['positives'], query_result['total']) - vt_object.add_attribute('detection-ratio', type='text', value=detection_ratio, disable_correlation=True) - self.misp_event.add_object(**vt_object) - return vt_object.uuid + proxies = { + 'http': f'{scheme}://{host}', + 'https': f'{scheme}://{host}' + } + return proxies -def parse_error(status_code): +def parse_error(status_code: int) -> str: status_mapping = {204: 'VirusTotal request rate limit exceeded.', 400: 'Incorrect request, please check the arguments.', 403: 'You don\'t have enough privileges to make the request.'} @@ -194,7 +262,7 @@ def handler(q=False): return False request = json.loads(q) if not request.get('config') or not request['config'].get('apikey'): - misperrors['error'] = "A VirusTotal api key is required for this module." + misperrors['error'] = 'A VirusTotal api key is required for this module.' return misperrors if not request.get('attribute') or not check_input_attribute(request['attribute']): return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} @@ -202,14 +270,21 @@ def handler(q=False): return {'error': 'Unsupported attribute type.'} event_limit = request['config'].get('event_limit') - if not isinstance(event_limit, int): - event_limit = 5 - parser = VirusTotalParser(request['config']['apikey'], event_limit) attribute = request['attribute'] - status = parser.query_api(attribute) - if status != 200: - misperrors['error'] = parse_error(status) + proxy_settings = get_proxy_settings(request.get('config')) + + try: + client = vt.Client(request['config']['apikey'], + headers={ + 'x-tool': 'MISPModuleVirusTotalExpansion', + }, + proxy=proxy_settings['http'] if proxy_settings else None) + parser = VirusTotalParser(client, int(event_limit) if event_limit else None) + parser.query_api(attribute) + except vt.APIError as ex: + misperrors['error'] = ex.message return misperrors + return parser.get_result() diff --git a/misp_modules/modules/expansion/virustotal_public.py b/misp_modules/modules/expansion/virustotal_public.py index 989e48d..f5bb76b 100644 --- a/misp_modules/modules/expansion/virustotal_public.py +++ b/misp_modules/modules/expansion/virustotal_public.py @@ -1,165 +1,219 @@ import json -import requests +import logging +import vt from . import check_input_attribute, standard_error_message +from urllib.parse import urlparse from pymisp import MISPAttribute, MISPEvent, MISPObject misperrors = {'error': 'Error'} mispattributes = {'input': ['hostname', 'domain', "ip-src", "ip-dst", "md5", "sha1", "sha256", "url"], 'format': 'misp_standard'} -moduleinfo = {'version': '1', 'author': 'Christian Studer', - 'description': 'Get information from VirusTotal public API v2.', +moduleinfo = {'version': '2', 'author': 'Christian Studer', + 'description': 'Enrich observables with the VirusTotal v3 public API', 'module-type': ['expansion', 'hover']} -moduleconfig = ['apikey'] +moduleconfig = ['apikey', 'proxy_host', 'proxy_port', 'proxy_username', 'proxy_password'] + +LOGGER = logging.getLogger('virus_total_public') +LOGGER.setLevel(logging.INFO) -class VirusTotalParser(): - def __init__(self): - super(VirusTotalParser, self).__init__() +DEFAULT_RESULTS_LIMIT = 10 + + +class VirusTotalParser: + def __init__(self, client: vt.Client, limit: int) -> None: + self.client = client + self.limit = limit or DEFAULT_RESULTS_LIMIT self.misp_event = MISPEvent() - - def declare_variables(self, apikey, attribute): self.attribute = MISPAttribute() - self.attribute.from_dict(**attribute) - self.apikey = apikey + self.parsed_objects = {} + self.input_types_mapping = {'ip-src': self.parse_ip, 'ip-dst': self.parse_ip, + 'domain': self.parse_domain, 'hostname': self.parse_domain, + 'md5': self.parse_hash, 'sha1': self.parse_hash, + 'sha256': self.parse_hash, 'url': self.parse_url} + self.proxies = None - def get_result(self): + @staticmethod + def get_total_analysis(analysis: dict, known_distributors: dict = None) -> int: + if not analysis: + return 0 + count = sum([analysis['undetected'], analysis['suspicious'], analysis['harmless']]) + return count if known_distributors else count + analysis['malicious'] + + def query_api(self, attribute: dict) -> None: + self.attribute.from_dict(**attribute) + self.input_types_mapping[self.attribute.type](self.attribute.value) + + def get_result(self) -> dict: event = json.loads(self.misp_event.to_json()) results = {key: event[key] for key in ('Attribute', 'Object') if (key in event and event[key])} return {'results': results} - def parse_urls(self, query_result): - for feature in ('detected_urls', 'undetected_urls'): - if feature in query_result: - for url in query_result[feature]: - value = url['url'] if isinstance(url, dict) else url[0] - self.misp_event.add_attribute('url', value) + def add_vt_report(self, report: vt.Object) -> str: + analysis = report.get('last_analysis_stats') + total = self.get_total_analysis(analysis, report.get('known_distributors')) + permalink = f'https://www.virustotal.com/gui/{report.type}/{report.id}' - def parse_resolutions(self, resolutions, subdomains=None, uuids=None): - domain_ip_object = MISPObject('domain-ip') - if self.attribute.type in ('domain', 'hostname'): - domain_ip_object.add_attribute('domain', type='domain', value=self.attribute.value) - attribute_type, relation, key = ('ip-dst', 'ip', 'ip_address') - else: - domain_ip_object.add_attribute('ip', type='ip-dst', value=self.attribute.value) - attribute_type, relation, key = ('domain', 'domain', 'hostname') - for resolution in resolutions: - domain_ip_object.add_attribute(relation, type=attribute_type, value=resolution[key]) - if subdomains: - for subdomain in subdomains: - attribute = MISPAttribute() - attribute.from_dict(**dict(type='domain', value=subdomain)) - self.misp_event.add_attribute(**attribute) - domain_ip_object.add_reference(attribute.uuid, 'subdomain') - if uuids: - for uuid in uuids: - domain_ip_object.add_reference(uuid, 'sibling-of') - self.misp_event.add_object(**domain_ip_object) + vt_object = MISPObject('virustotal-report') + vt_object.add_attribute('permalink', type='link', value=permalink) + detection_ratio = f"{analysis['malicious']}/{total}" if analysis else '-/-' + vt_object.add_attribute('detection-ratio', type='text', value=detection_ratio, disable_correlation=True) + self.misp_event.add_object(**vt_object) + return vt_object.uuid - def parse_vt_object(self, query_result): - if query_result['response_code'] == 1: - vt_object = MISPObject('virustotal-report') - vt_object.add_attribute('permalink', type='link', value=query_result['permalink']) - detection_ratio = '{}/{}'.format(query_result['positives'], query_result['total']) - vt_object.add_attribute('detection-ratio', type='text', value=detection_ratio) - self.misp_event.add_object(**vt_object) + def create_misp_object(self, report: vt.Object) -> MISPObject: + misp_object = None + vt_uuid = self.add_vt_report(report) + if report.type == 'file': + misp_object = MISPObject('file') + for hash_type in ('md5', 'sha1', 'sha256', 'tlsh', + 'vhash', 'ssdeep', 'imphash'): + misp_object.add_attribute(**{'type': hash_type, + 'object_relation': hash_type, + 'value': report.get(hash_type)}) + elif report.type == 'domain': + misp_object = MISPObject('domain-ip') + misp_object.add_attribute('domain', type='domain', value=report.id) + elif report.type == 'ip_address': + misp_object = MISPObject('domain-ip') + misp_object.add_attribute('ip', type='ip-dst', value=report.id) + elif report.type == 'url': + misp_object = MISPObject('url') + misp_object.add_attribute('url', type='url', value=report.url) + misp_object.add_reference(vt_uuid, 'analyzed-with') + return misp_object - def get_query_result(self, query_type): - params = {query_type: self.attribute.value, 'apikey': self.apikey} - return requests.get(self.base_url, params=params) + ################################################################################ + #### Main parsing functions #### # noqa + ################################################################################ + def parse_domain(self, domain: str) -> str: + domain_report = self.client.get_object(f'/domains/{domain}') -class DomainQuery(VirusTotalParser): - def __init__(self, apikey, attribute): - super(DomainQuery, self).__init__() - self.base_url = "https://www.virustotal.com/vtapi/v2/domain/report" - self.declare_variables(apikey, attribute) + # DOMAIN + domain_object = self.create_misp_object(domain_report) - def parse_report(self, query_result): - hash_type = 'sha256' - whois = 'whois' - for feature_type in ('referrer', 'downloaded', 'communicating'): - for feature in ('undetected_{}_samples', 'detected_{}_samples'): - for sample in query_result.get(feature.format(feature_type), []): - self.misp_event.add_attribute(hash_type, sample[hash_type]) - if query_result.get(whois): - whois_object = MISPObject(whois) - whois_object.add_attribute('text', type='text', value=query_result[whois]) + # WHOIS + if domain_report.whois: + whois_object = MISPObject('whois') + whois_object.add_attribute('text', type='text', value=domain_report.whois) self.misp_event.add_object(**whois_object) - if 'domain_siblings' in query_result: - siblings = (self.parse_siblings(domain) for domain in query_result['domain_siblings']) - if 'subdomains' in query_result: - self.parse_resolutions(query_result['resolutions'], query_result['subdomains'], siblings) - self.parse_urls(query_result) - def parse_siblings(self, domain): - attribute = MISPAttribute() - attribute.from_dict(**dict(type='domain', value=domain)) - self.misp_event.add_attribute(**attribute) - return attribute.uuid + # SIBLINGS AND SUBDOMAINS + for relationship_name, misp_name in [('siblings', 'sibling-of'), ('subdomains', 'subdomain')]: + rel_iterator = self.client.iterator(f'/domains/{domain_report.id}/{relationship_name}', limit=self.limit) + for item in rel_iterator: + attr = MISPAttribute() + attr.from_dict(**dict(type='domain', value=item.id)) + self.misp_event.add_attribute(**attr) + domain_object.add_reference(attr.uuid, misp_name) + + # RESOLUTIONS + resolutions_iterator = self.client.iterator(f'/domains/{domain_report.id}/resolutions', limit=self.limit) + for resolution in resolutions_iterator: + domain_object.add_attribute('ip', type='ip-dst', value=resolution.ip_address) + + # COMMUNICATING AND REFERRER FILES + for relationship_name, misp_name in [ + ('communicating_files', 'communicates-with'), + ('referrer_files', 'referring') + ]: + files_iterator = self.client.iterator(f'/domains/{domain_report.id}/{relationship_name}', limit=self.limit) + for file in files_iterator: + file_object = self.create_misp_object(file) + file_object.add_reference(domain_object.uuid, misp_name) + self.misp_event.add_object(**file_object) + + self.misp_event.add_object(**domain_object) + return domain_object.uuid + + def parse_hash(self, file_hash: str) -> str: + file_report = self.client.get_object(f'/files/{file_hash}') + file_object = self.create_misp_object(file_report) + + # COMMUNICATING, DOWNLOADED AND REFERRER FILES + for relationship_name, misp_name in [ + ('contacted_urls', 'communicates-with'), + ('contacted_domains', 'communicates-with'), + ('contacted_ips', 'communicates-with') + ]: + files_iterator = self.client.iterator(f'/files/{file_report.id}/{relationship_name}', limit=self.limit) + for file in files_iterator: + file_object = self.create_misp_object(file) + file_object.add_reference(file_object.uuid, misp_name) + self.misp_event.add_object(**file_object) + + self.misp_event.add_object(**file_object) + return file_object.uuid + + def parse_ip(self, ip: str) -> str: + ip_report = self.client.get_object(f'/ip_addresses/{ip}') + + # IP + ip_object = self.create_misp_object(ip_report) + + # ASN + asn_object = MISPObject('asn') + asn_object.add_attribute('asn', type='AS', value=ip_report.asn) + asn_object.add_attribute('subnet-announced', type='ip-src', value=ip_report.network) + asn_object.add_attribute('country', type='text', value=ip_report.country) + self.misp_event.add_object(**asn_object) + + # RESOLUTIONS + resolutions_iterator = self.client.iterator(f'/ip_addresses/{ip_report.id}/resolutions', limit=self.limit) + for resolution in resolutions_iterator: + ip_object.add_attribute('domain', type='domain', value=resolution.host_name) + + self.misp_event.add_object(**ip_object) + return ip_object.uuid + + def parse_url(self, url: str) -> str: + url_id = vt.url_id(url) + url_report = self.client.get_object(f'/urls/{url_id}') + url_object = self.create_misp_object(url_report) + self.misp_event.add_object(**url_object) + return url_object.uuid -class HashQuery(VirusTotalParser): - def __init__(self, apikey, attribute): - super(HashQuery, self).__init__() - self.base_url = "https://www.virustotal.com/vtapi/v2/file/report" - self.declare_variables(apikey, attribute) +def get_proxy_settings(config: dict) -> dict: + """Returns proxy settings in the requests format. + If no proxy settings are set, return None.""" + proxies = None + host = config.get('proxy_host') + port = config.get('proxy_port') + username = config.get('proxy_username') + password = config.get('proxy_password') - def parse_report(self, query_result): - file_attributes = [] - for hash_type in ('md5', 'sha1', 'sha256'): - if query_result.get(hash_type): - file_attributes.append({'type': hash_type, 'object_relation': hash_type, - 'value': query_result[hash_type]}) - if file_attributes: - file_object = MISPObject('file') - for attribute in file_attributes: - file_object.add_attribute(**attribute) - self.misp_event.add_object(**file_object) - self.parse_vt_object(query_result) + if host: + if not port: + misperrors['error'] = 'The virustotal_proxy_host config is set, ' \ + 'please also set the virustotal_proxy_port.' + raise KeyError + parsed = urlparse(host) + if 'http' in parsed.scheme: + scheme = 'http' + else: + scheme = parsed.scheme + netloc = parsed.netloc + host = f'{netloc}:{port}' + + if username: + if not password: + misperrors['error'] = 'The virustotal_proxy_username config is set, ' \ + 'please also set the virustotal_proxy_password.' + raise KeyError + auth = f'{username}:{password}' + host = auth + '@' + host + + proxies = { + 'http': f'{scheme}://{host}', + 'https': f'{scheme}://{host}' + } + return proxies -class IpQuery(VirusTotalParser): - def __init__(self, apikey, attribute): - super(IpQuery, self).__init__() - self.base_url = "https://www.virustotal.com/vtapi/v2/ip-address/report" - self.declare_variables(apikey, attribute) - - def parse_report(self, query_result): - if query_result.get('asn'): - asn_mapping = {'network': ('ip-src', 'subnet-announced'), - 'country': ('text', 'country')} - asn_object = MISPObject('asn') - asn_object.add_attribute('asn', type='AS', value=query_result['asn']) - for key, value in asn_mapping.items(): - if query_result.get(key): - attribute_type, relation = value - asn_object.add_attribute(relation, type=attribute_type, value=query_result[key]) - self.misp_event.add_object(**asn_object) - self.parse_urls(query_result) - if query_result.get('resolutions'): - self.parse_resolutions(query_result['resolutions']) - - -class UrlQuery(VirusTotalParser): - def __init__(self, apikey, attribute): - super(UrlQuery, self).__init__() - self.base_url = "https://www.virustotal.com/vtapi/v2/url/report" - self.declare_variables(apikey, attribute) - - def parse_report(self, query_result): - self.parse_vt_object(query_result) - - -domain = ('domain', DomainQuery) -ip = ('ip', IpQuery) -file = ('resource', HashQuery) -misp_type_mapping = {'domain': domain, 'hostname': domain, 'ip-src': ip, - 'ip-dst': ip, 'md5': file, 'sha1': file, 'sha256': file, - 'url': ('resource', UrlQuery)} - - -def parse_error(status_code): +def parse_error(status_code: int) -> str: status_mapping = {204: 'VirusTotal request rate limit exceeded.', 400: 'Incorrect request, please check the arguments.', 403: 'You don\'t have enough privileges to make the request.'} @@ -173,22 +227,29 @@ def handler(q=False): return False request = json.loads(q) if not request.get('config') or not request['config'].get('apikey'): - misperrors['error'] = "A VirusTotal api key is required for this module." + misperrors['error'] = 'A VirusTotal api key is required for this module.' return misperrors if not request.get('attribute') or not check_input_attribute(request['attribute']): return {'error': f'{standard_error_message}, which should contain at least a type, a value and an uuid.'} - attribute = request['attribute'] - if attribute['type'] not in mispattributes['input']: + if request['attribute']['type'] not in mispattributes['input']: return {'error': 'Unsupported attribute type.'} - query_type, to_call = misp_type_mapping[attribute['type']] - parser = to_call(request['config']['apikey'], attribute) - query_result = parser.get_query_result(query_type) - status_code = query_result.status_code - if status_code == 200: - parser.parse_report(query_result.json()) - else: - misperrors['error'] = parse_error(status_code) + + event_limit = request['config'].get('event_limit') + attribute = request['attribute'] + proxy_settings = get_proxy_settings(request.get('config')) + + try: + client = vt.Client(request['config']['apikey'], + headers={ + 'x-tool': 'MISPModuleVirusTotalPublicExpansion', + }, + proxy=proxy_settings['http'] if proxy_settings else None) + parser = VirusTotalParser(client, int(event_limit) if event_limit else None) + parser.query_api(attribute) + except vt.APIError as ex: + misperrors['error'] = ex.message return misperrors + return parser.get_result() diff --git a/misp_modules/modules/expansion/vmray_submit.py b/misp_modules/modules/expansion/vmray_submit.py index 1c0d553..fa0a073 100644 --- a/misp_modules/modules/expansion/vmray_submit.py +++ b/misp_modules/modules/expansion/vmray_submit.py @@ -19,7 +19,7 @@ from distutils.util import strtobool import io import zipfile -from ._vmray.vmray_rest_api import VMRayRESTAPI +from _vmray.rest_api import VMRayRESTAPI misperrors = {'error': 'Error'} mispattributes = {'input': ['attachment', 'malware-sample'], 'output': ['text', 'sha1', 'sha256', 'md5', 'link']} diff --git a/misp_modules/modules/expansion/vmware_nsx.py b/misp_modules/modules/expansion/vmware_nsx.py new file mode 100644 index 0000000..4496268 --- /dev/null +++ b/misp_modules/modules/expansion/vmware_nsx.py @@ -0,0 +1,621 @@ +#!/usr/bin/env python3 +""" +Expansion module integrating with VMware NSX Defender. +""" +import argparse +import base64 +import configparser +import datetime +import hashlib +import io +import ipaddress +import json +import logging +import pymisp +import sys +import vt +import zipfile +from urllib import parse +from typing import Any, Dict, List, Optional, Tuple, Union + +import tau_clients +from tau_clients import exceptions +from tau_clients import nsx_defender + + +logger = logging.getLogger("vmware_nsx") +logger.setLevel(logging.DEBUG) + +misperrors = { + "error": "Error", +} + +mispattributes = { + "input": [ + "attachment", + "malware-sample", + "url", + "md5", + "sha1", + "sha256", + ], + "format": "misp_standard", +} + +moduleinfo = { + "version": "0.2", + "author": "Jason Zhang, Stefano Ortolani", + "description": "Enrich a file or URL with VMware NSX Defender", + "module-type": ["expansion", "hover"], +} + +moduleconfig = [ + "analysis_url", # optional, defaults to hard-coded values + "analysis_verify_ssl", # optional, defaults to True + "analysis_key", # required + "analysis_api_token", # required + "vt_key", # optional + "misp_url", # optional + "misp_verify_ssl", # optional, defaults to True + "misp_key", # optional +] + +DEFAULT_ZIP_PASSWORD = b"infected" + +DEFAULT_ENDPOINT = tau_clients.NSX_DEFENDER_DC_WESTUS + +WORKFLOW_COMPLETE_TAG = "workflow:state='complete'" + +WORKFLOW_INCOMPLETE_TAG = "workflow:state='incomplete'" + +VT_DOWNLOAD_TAG = "vt:download" + +GALAXY_ATTACK_PATTERNS_UUID = "c4e851fa-775f-11e7-8163-b774922098cd" + + +class ResultParser: + """This is a parser to extract *basic* information from a result dictionary.""" + + def __init__(self, techniques_galaxy: Optional[Dict[str, str]] = None): + """Constructor.""" + self.techniques_galaxy = techniques_galaxy or {} + + def parse(self, analysis_link: str, result: Dict[str, Any]) -> pymisp.MISPEvent: + """ + Parse the analysis result into a MISP event. + + :param str analysis_link: the analysis link + :param dict[str, any] result: the JSON returned by the analysis client. + :rtype: pymisp.MISPEvent + :return: a MISP event + """ + misp_event = pymisp.MISPEvent() + + # Add analysis subject info + if "url" in result["analysis_subject"]: + o = pymisp.MISPObject("url") + o.add_attribute("url", result["analysis_subject"]["url"]) + else: + o = pymisp.MISPObject("file") + o.add_attribute("md5", type="md5", value=result["analysis_subject"]["md5"]) + o.add_attribute("sha1", type="sha1", value=result["analysis_subject"]["sha1"]) + o.add_attribute("sha256", type="sha256", value=result["analysis_subject"]["sha256"]) + o.add_attribute( + "mimetype", + category="Payload delivery", + type="mime-type", + value=result["analysis_subject"]["mime_type"] + ) + misp_event.add_object(o) + + # Add HTTP requests from url analyses + network_dict = result.get("report", {}).get("analysis", {}).get("network", {}) + for request in network_dict.get("requests", []): + if not request["url"] and not request["ip"]: + continue + o = pymisp.MISPObject(name="http-request") + o.add_attribute("method", "GET") + if request["url"]: + parsed_uri = parse.urlparse(request["url"]) + o.add_attribute("host", parsed_uri.netloc) + o.add_attribute("uri", request["url"]) + if request["ip"]: + o.add_attribute("ip-dst", request["ip"]) + misp_event.add_object(o) + + # Add network behaviors from files + for subject in result.get("report", {}).get("analysis_subjects", []): + + # Add DNS requests + for dns_query in subject.get("dns_queries", []): + hostname = dns_query.get("hostname") + # Skip if it is an IP address + try: + if hostname == "wpad" or hostname == "localhost": + continue + # Invalid hostname, e.g., hostname: ZLKKJRPY or 2.2.0.10.in-addr.arpa. + if "." not in hostname or hostname[-1] == ".": + continue + _ = ipaddress.ip_address(hostname) + continue + except ValueError: + pass + + o = pymisp.MISPObject(name="domain-ip") + o.add_attribute("hostname", type="hostname", value=hostname) + for ip in dns_query.get("results", []): + o.add_attribute("ip", type="ip-dst", value=ip) + + misp_event.add_object(o) + + # Add HTTP conversations (as network connection and as http request) + for http_conversation in subject.get("http_conversations", []): + o = pymisp.MISPObject(name="network-connection") + o.add_attribute("ip-src", http_conversation["src_ip"]) + o.add_attribute("ip-dst", http_conversation["dst_ip"]) + o.add_attribute("src-port", http_conversation["src_port"]) + o.add_attribute("dst-port", http_conversation["dst_port"]) + o.add_attribute("hostname-dst", http_conversation["dst_host"]) + o.add_attribute("layer3-protocol", "IP") + o.add_attribute("layer4-protocol", "TCP") + o.add_attribute("layer7-protocol", "HTTP") + misp_event.add_object(o) + + method, path, http_version = http_conversation["url"].split(" ") + if http_conversation["dst_port"] == 80: + uri = "http://{}{}".format(http_conversation["dst_host"], path) + else: + uri = "http://{}:{}{}".format( + http_conversation["dst_host"], + http_conversation["dst_port"], + path + ) + o = pymisp.MISPObject(name="http-request") + o.add_attribute("host", http_conversation["dst_host"]) + o.add_attribute("method", method) + o.add_attribute("uri", uri) + o.add_attribute("ip-dst", http_conversation["dst_ip"]) + misp_event.add_object(o) + + # Add sandbox info like score and sandbox type + o = pymisp.MISPObject(name="sandbox-report") + sandbox_type = "saas" if tau_clients.is_task_hosted(analysis_link) else "on-premise" + o.add_attribute("score", result["score"]) + o.add_attribute("sandbox-type", sandbox_type) + o.add_attribute("{}-sandbox".format(sandbox_type), "vmware-nsx-defender") + o.add_attribute("permalink", analysis_link) + misp_event.add_object(o) + + # Add behaviors + # Check if its not empty first, as at least one attribute has to be set for sb-signature object + if result.get("malicious_activity", []): + o = pymisp.MISPObject(name="sb-signature") + o.add_attribute("software", "VMware NSX Defender") + for activity in result.get("malicious_activity", []): + a = pymisp.MISPAttribute() + a.from_dict(type="text", value=activity) + o.add_attribute("signature", **a) + misp_event.add_object(o) + + # Add mitre techniques + for techniques in result.get("activity_to_mitre_techniques", {}).values(): + for technique in techniques: + for misp_technique_id, misp_technique_name in self.techniques_galaxy.items(): + if technique["id"].casefold() in misp_technique_id.casefold(): + # If report details a sub-technique, trust the match + # Otherwise trust it only if the MISP technique is not a sub-technique + if "." in technique["id"] or "." not in misp_technique_id: + misp_event.add_tag(misp_technique_name) + break + return misp_event + + +def _parse_submission_response(response: Dict[str, Any]) -> Tuple[str, List[str]]: + """ + Parse the response from "submit_*" methods. + + :param dict[str, any] response: the client response + :rtype: tuple(str, list[str]) + :return: the task_uuid and whether the analysis is available + :raises ValueError: in case of any error + """ + task_uuid = response.get("task_uuid") + if not task_uuid: + raise ValueError("Submission failed, unable to process the data") + if response.get("score") is not None: + tags = [WORKFLOW_COMPLETE_TAG] + else: + tags = [WORKFLOW_INCOMPLETE_TAG] + return task_uuid, tags + + +def _unzip(zipped_data: bytes, password: bytes = DEFAULT_ZIP_PASSWORD) -> bytes: + """ + Unzip the data. + + :param bytes zipped_data: the zipped data + :param bytes password: the password + :rtype: bytes + :return: the unzipped data + :raises ValueError: in case of any error + """ + try: + data_file_object = io.BytesIO(zipped_data) + with zipfile.ZipFile(data_file_object) as zip_file: + sample_hash_name = zip_file.namelist()[0] + return zip_file.read(sample_hash_name, password) + except (IOError, ValueError) as e: + raise ValueError(str(e)) + + +def _download_from_vt(client: vt.Client, file_hash: str) -> bytes: + """ + Download file from VT. + + :param vt.Client client: the VT client + :param str file_hash: the file hash + :rtype: bytes + :return: the downloaded data + :raises ValueError: in case of any error + """ + try: + buffer = io.BytesIO() + client.download_file(file_hash, buffer) + buffer.seek(0, 0) + return buffer.read() + except (IOError, vt.APIError) as e: + raise ValueError(str(e)) + finally: + # vt.Client likes to free resources at shutdown, and it can be used as context to ease that + # Since the structure of the module does not play well with how MISP modules are organized + # let's play nice and close connections pro-actively (opened by "download_file") + if client: + client.close() + + +def _get_analysis_tags( + clients: Dict[str, nsx_defender.AnalysisClient], + task_uuid: str, +) -> List[str]: + """ + Get the analysis tags of a task. + + :param dict[str, nsx_defender.AnalysisClient] clients: the analysis clients + :param str task_uuid: the task uuid + :rtype: list[str] + :return: the analysis tags + :raises exceptions.ApiError: in case of client errors + :raises exceptions.CommunicationError: in case of client communication errors + """ + client = clients[DEFAULT_ENDPOINT] + response = client.get_analysis_tags(task_uuid) + tags = set([]) + for tag in response.get("analysis_tags", []): + tag_header = None + tag_type = tag["data"]["type"] + if tag_type == "av_family": + tag_header = "av-fam" + elif tag_type == "av_class": + tag_header = "av-cls" + elif tag_type == "lastline_malware": + tag_header = "nsx" + if tag_header: + tags.add("{}:{}".format(tag_header, tag["data"]["value"])) + return sorted(tags) + + +def _get_latest_analysis( + clients: Dict[str, nsx_defender.AnalysisClient], + file_hash: str, +) -> Optional[str]: + """ + Get the latest analysis. + + :param dict[str, nsx_defender.AnalysisClient] clients: the analysis clients + :param str file_hash: the hash of the file + :rtype: str|None + :return: the task uuid if present, None otherwise + :raises exceptions.ApiError: in case of client errors + :raises exceptions.CommunicationError: in case of client communication errors + """ + def _parse_expiration(task_info: Dict[str, str]) -> datetime.datetime: + """ + Parse expiration time of a task + + :param dict[str, str] task_info: the task + :rtype: datetime.datetime + :return: the parsed datetime object + """ + return datetime.datetime.strptime(task_info["expires"], "%Y-%m-%d %H:%M:%S") + results = [] + for data_center, client in clients.items(): + response = client.query_file_hash(file_hash=file_hash) + for task in response.get("tasks", []): + results.append(task) + if results: + return sorted(results, key=_parse_expiration)[-1]["task_uuid"] + else: + return None + + +def _get_mitre_techniques_galaxy(misp_client: pymisp.PyMISP) -> Dict[str, str]: + """ + Get all the MITRE techniques from the MISP galaxy. + + :param pymisp.PyMISP misp_client: the MISP client + :rtype: dict[str, str] + :return: all techniques indexed by their id + """ + galaxy_attack_patterns = misp_client.get_galaxy( + galaxy=GALAXY_ATTACK_PATTERNS_UUID, + withCluster=True, + pythonify=True, + ) + ret = {} + for cluster in galaxy_attack_patterns.clusters: + ret[cluster.value] = cluster.tag_name + return ret + + +def introspection() -> Dict[str, Union[str, List[str]]]: + """ + Implement interface. + + :return: the supported MISP attributes + :rtype: dict[str, list[str]] + """ + return mispattributes + + +def version() -> Dict[str, Union[str, List[str]]]: + """ + Implement interface. + + :return: the module config inside another dictionary + :rtype: dict[str, list[str]] + """ + moduleinfo["config"] = moduleconfig + return moduleinfo + + +def handler(q: Union[bool, str] = False) -> Union[bool, Dict[str, Any]]: + """ + Implement interface. + + :param bool|str q: the input received + :rtype: bool|dict[str, any] + """ + if q is False: + return False + + request = json.loads(q) + config = request.get("config", {}) + + # Load the client to connect to VMware NSX ATA (hard-fail) + try: + analysis_url = config.get("analysis_url") + login_params = { + "key": config["analysis_key"], + "api_token": config["analysis_api_token"], + } + # If 'analysis_url' is specified we are connecting on-premise + if analysis_url: + analysis_clients = { + DEFAULT_ENDPOINT: nsx_defender.AnalysisClient( + api_url=analysis_url, + login_params=login_params, + verify_ssl=bool(config.get("analysis_verify_ssl", True)), + ) + } + logger.info("Connected NSX AnalysisClient to on-premise infrastructure") + else: + analysis_clients = { + data_center: nsx_defender.AnalysisClient( + api_url=tau_clients.NSX_DEFENDER_ANALYSIS_URLS[data_center], + login_params=login_params, + verify_ssl=bool(config.get("analysis_verify_ssl", True)), + ) for data_center in [ + tau_clients.NSX_DEFENDER_DC_WESTUS, + tau_clients.NSX_DEFENDER_DC_NLEMEA, + ] + } + logger.info("Connected NSX AnalysisClient to hosted infrastructure") + except KeyError as ke: + logger.error("Integration with VMware NSX ATA failed to connect: %s", str(ke)) + return {"error": "Error connecting to VMware NSX ATA: {}".format(ke)} + + # Load the client to connect to MISP (soft-fail) + try: + misp_client = pymisp.PyMISP( + url=config["misp_url"], + key=config["misp_key"], + ssl=bool(config.get("misp_verify_ssl", True)), + ) + except (KeyError, pymisp.PyMISPError): + logger.error("Integration with pyMISP disabled: no MITRE techniques tags") + misp_client = None + + # Load the client to connect to VT (soft-fail) + try: + vt_client = vt.Client(apikey=config["vt_key"]) + except (KeyError, ValueError): + logger.error("Integration with VT disabled: no automatic download of samples") + vt_client = None + + # Decode and issue the request + try: + if request["attribute"]["type"] == "url": + sample_url = request["attribute"]["value"] + response = analysis_clients[DEFAULT_ENDPOINT].submit_url(sample_url) + task_uuid, tags = _parse_submission_response(response) + else: + if request["attribute"]["type"] == "malware-sample": + # Raise TypeError + file_data = _unzip(base64.b64decode(request["attribute"]["data"])) + file_name = request["attribute"]["value"].split("|", 1)[0] + hash_value = hashlib.sha1(file_data).hexdigest() + elif request["attribute"]["type"] == "attachment": + # Raise TypeError + file_data = base64.b64decode(request["attribute"]["data"]) + file_name = request["attribute"].get("value") + hash_value = hashlib.sha1(file_data).hexdigest() + else: + hash_value = request["attribute"]["value"] + file_data = None + file_name = "{}.bin".format(hash_value) + # Check whether we have a task for that file + tags = [] + task_uuid = _get_latest_analysis(analysis_clients, hash_value) + if not task_uuid: + # If we have no analysis, download the sample from VT + if not file_data: + if not vt_client: + raise ValueError("No file available locally and VT is disabled") + file_data = _download_from_vt(vt_client, hash_value) + tags.append(VT_DOWNLOAD_TAG) + # ... and submit it (_download_from_vt fails if no sample availabe) + response = analysis_clients[DEFAULT_ENDPOINT].submit_file(file_data, file_name) + task_uuid, _tags = _parse_submission_response(response) + tags.extend(_tags) + except KeyError as e: + logger.error("Error parsing input: %s", request["attribute"]) + return {"error": "Error parsing input: {}".format(e)} + except TypeError as e: + logger.error("Error decoding input: %s", request["attribute"]) + return {"error": "Error decoding input: {}".format(e)} + except ValueError as e: + logger.error("Error processing input: %s", request["attribute"]) + return {"error": "Error processing input: {}".format(e)} + except (exceptions.CommunicationError, exceptions.ApiError) as e: + logger.error("Error issuing API call: %s", str(e)) + return {"error": "Error issuing API call: {}".format(e)} + else: + analysis_link = tau_clients.get_task_link( + uuid=task_uuid, + analysis_url=analysis_clients[DEFAULT_ENDPOINT].base, + prefer_load_balancer=True, + ) + + # Return partial results if the analysis has yet to terminate + try: + tags.extend(_get_analysis_tags(analysis_clients, task_uuid)) + report = analysis_clients[DEFAULT_ENDPOINT].get_result(task_uuid) + except (exceptions.CommunicationError, exceptions.ApiError) as e: + logger.error("Error retrieving the report: %s", str(e)) + return { + "results": { + "types": "link", + "categories": ["External analysis"], + "values": analysis_link, + "tags": tags, + } + } + + # Return the enrichment + try: + techniques_galaxy = None + if misp_client: + techniques_galaxy = _get_mitre_techniques_galaxy(misp_client) + result_parser = ResultParser(techniques_galaxy=techniques_galaxy) + misp_event = result_parser.parse(analysis_link, report) + for tag in tags: + if tag not in frozenset([WORKFLOW_COMPLETE_TAG]): + misp_event.add_tag(tag) + return { + "results": { + key: json.loads(misp_event.to_json())[key] + for key in ("Attribute", "Object", "Tag") + if (key in misp_event and misp_event[key]) + } + } + except pymisp.PyMISPError as e: + logger.error("Error parsing the report: %s", str(e)) + return {"error": "Error parsing the report: {}".format(e)} + + +def main(): + """Main function used to test basic functionalities of the module.""" + parser = argparse.ArgumentParser() + parser.add_argument( + "-c", + "--config-file", + dest="config_file", + required=True, + help="the configuration file used for testing", + ) + parser.add_argument( + "-t", + "--test-attachment", + dest="test_attachment", + default=None, + help="the path to a test attachment", + ) + args = parser.parse_args() + conf = configparser.ConfigParser() + conf.read(args.config_file) + config = { + "analysis_verify_ssl": conf.getboolean("analysis", "analysis_verify_ssl"), + "analysis_key": conf.get("analysis", "analysis_key"), + "analysis_api_token": conf.get("analysis", "analysis_api_token"), + "vt_key": conf.get("vt", "vt_key"), + "misp_url": conf.get("misp", "misp_url"), + "misp_verify_ssl": conf.getboolean("misp", "misp_verify_ssl"), + "misp_key": conf.get("misp", "misp_key"), + } + + # TEST 1: submit a URL + j = json.dumps( + { + "config": config, + "attribute": { + "type": "url", + "value": "https://www.google.com", + } + } + ) + print(json.dumps(handler(j), indent=4, sort_keys=True)) + + # TEST 2: submit a file attachment + if args.test_attachment: + with open(args.test_attachment, "rb") as f: + data = f.read() + j = json.dumps( + { + "config": config, + "attribute": { + "type": "attachment", + "value": "test.docx", + "data": base64.b64encode(data).decode("utf-8"), + } + } + ) + print(json.dumps(handler(j), indent=4, sort_keys=True)) + + # TEST 3: submit a file hash that is known by NSX ATA + j = json.dumps( + { + "config": config, + "attribute": { + "type": "md5", + "value": "002c56165a0e78369d0e1023ce044bf0", + } + } + ) + print(json.dumps(handler(j), indent=4, sort_keys=True)) + + # TEST 4 : submit a file hash that is NOT known byt NSX ATA + j = json.dumps( + { + "config": config, + "attribute": { + "type": "sha1", + "value": "2aac25ecdccf87abf6f1651ef2ffb30fcf732250", + } + } + ) + print(json.dumps(handler(j), indent=4, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/misp_modules/modules/expansion/wiki.py b/misp_modules/modules/expansion/wiki.py index 90dd547..110e8f8 100755 --- a/misp_modules/modules/expansion/wiki.py +++ b/misp_modules/modules/expansion/wiki.py @@ -17,7 +17,7 @@ def handler(q=False): misperrors['error'] = 'Query text missing' return misperrors - sparql = SPARQLWrapper(wiki_api_url) + sparql = SPARQLWrapper(wiki_api_url, agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36') query_string = \ "SELECT ?item \n" \ "WHERE { \n" \ @@ -26,7 +26,6 @@ def handler(q=False): sparql.setQuery(query_string) sparql.setReturnFormat(JSON) results = sparql.query().convert() - summary = '' try: result = results["results"]["bindings"] summary = result[0]["item"]["value"] if result else 'No additional data found on Wikidata' diff --git a/misp_modules/modules/expansion/yara_query.py b/misp_modules/modules/expansion/yara_query.py index 3a75acc..e905de5 100644 --- a/misp_modules/modules/expansion/yara_query.py +++ b/misp_modules/modules/expansion/yara_query.py @@ -14,6 +14,12 @@ moduleconfig = [] mispattributes = {'input': ['md5', 'sha1', 'sha256', 'filename|md5', 'filename|sha1', 'filename|sha256', 'imphash'], 'output': ['yara']} +def extract_input_attribute(request): + for input_type in mispattributes['input']: + if input_type in request: + return input_type, request[input_type] + + def get_hash_condition(hashtype, hashvalue): hashvalue = hashvalue.lower() required_module, params = ('pe', '()') if hashtype == 'imphash' else ('hash', '(0, filesize)') @@ -24,11 +30,11 @@ def handler(q=False): if q is False: return False request = json.loads(q) - del request['module'] - if 'event_id' in request: - del request['event_id'] + attribute = extract_input_attribute(request) + if attribute is None: + return {'error': f'Wrong input type, please choose in the following: {", ".join(mispattributes["input"])}'} uuid = request.pop('attribute_uuid') if 'attribute_uuid' in request else None - attribute_type, value = list(request.items())[0] + attribute_type, value = attribute if 'filename' in attribute_type: _, attribute_type = attribute_type.split('|') _, value = value.split('|') diff --git a/misp_modules/modules/expansion/yeti.py b/misp_modules/modules/expansion/yeti.py new file mode 100644 index 0000000..3eeea95 --- /dev/null +++ b/misp_modules/modules/expansion/yeti.py @@ -0,0 +1,186 @@ +import json +import logging + +try: + import pyeti +except ImportError: + print("pyeti module not installed.") + +from pymisp import MISPEvent, MISPObject + +misperrors = {'error': 'Error'} + +mispattributes = {'input': ['AS', 'ip-src', 'ip-dst', 'hostname', 'domain', 'sha256', 'sha1', 'md5', 'url'], + 'format': 'misp_standard' + } +# possible module-types: 'expansion', 'hover' or both +moduleinfo = {'version': '1', 'author': 'Sebastien Larinier @sebdraven', + 'description': 'Query on yeti', + 'module-type': ['expansion', 'hover']} + +moduleconfig = ['apikey', 'url'] + + +class Yeti(): + + def __init__(self, url, key, attribute): + self.misp_mapping = {'Ip': 'ip-dst', 'Domain': 'domain', 'Hostname': 'hostname', 'Url': 'url', + 'AutonomousSystem': 'AS', 'File': 'sha256'} + self.yeti_client = pyeti.YetiApi(url=url, api_key=key) + self.attribute = attribute + self.misp_event = MISPEvent() + self.misp_event.add_attribute(**attribute) + + def search(self, value): + obs = self.yeti_client.observable_search(value=value) + if obs: + return obs[0] + + def get_neighboors(self, obs_id): + neighboors = self.yeti_client.neighbors_observables(obs_id) + if neighboors and 'objs' in neighboors: + links_by_id = {link['dst']['id']: (link['description'], 'dst') for link in neighboors['links'] + if link['dst']['id'] != obs_id} + links_by_id.update({link['src']['id']: (link['description'], 'src') for link in neighboors['links'] + if link['src']['id'] != obs_id}) + + for n in neighboors['objs']: + yield n, links_by_id[n['id']] + + def parse_yeti_result(self): + obs = self.search(self.attribute['value']) + + for obs_to_add, link in self.get_neighboors(obs['id']): + object_misp_domain_ip = self.__get_object_domain_ip(obs_to_add) + if object_misp_domain_ip: + self.misp_event.add_object(object_misp_domain_ip) + continue + object_misp_url = self.__get_object_url(obs_to_add) + if object_misp_url: + self.misp_event.add_object(object_misp_url) + continue + if link[0] == 'NS record': + object_ns_record = self.__get_object_ns_record(obs_to_add, link[1]) + if object_ns_record: + self.misp_event.add_object(object_ns_record) + continue + self.__get_attribute(obs_to_add, link[0]) + + def get_result(self): + event = json.loads(self.misp_event.to_json()) + results = {key: event[key] for key in ('Attribute', 'Object') if key in event} + return results + + def __get_attribute(self, obs_to_add, link): + + try: + type_attr = self.misp_mapping[obs_to_add['type']] + value = None + if obs_to_add['type'] == 'File': + value = obs_to_add['value'].split(':')[1] + else: + value = obs_to_add['value'] + attr = self.misp_event.add_attribute(value=value, type=type_attr) + attr.comment = '%s: %s' % (link, self.attribute['value']) + except KeyError: + logging.error('type not found %s' % obs_to_add['type']) + return + + for t in obs_to_add['tags']: + self.misp_event.add_attribute_tag(t['name'], attr['uuid']) + + def __get_object_domain_ip(self, obj_to_add): + if (obj_to_add['type'] == 'Ip' and self.attribute['type'] in ['hostname', 'domain']) or \ + (obj_to_add['type'] in ('Hostname', 'Domain') and self.attribute['type'] in ('ip-src', 'ip-dst')): + domain_ip_object = MISPObject('domain-ip') + domain_ip_object.add_attribute(self.__get_relation(obj_to_add), + obj_to_add['value']) + domain_ip_object.add_attribute(self.__get_relation(self.attribute, is_yeti_object=False), + self.attribute['value']) + domain_ip_object.add_reference(self.attribute['uuid'], 'related_to') + + return domain_ip_object + + def __get_object_url(self, obj_to_add): + if (obj_to_add['type'] == 'Url' and self.attribute['type'] in ['hostname', 'domain', 'ip-src', 'ip-dst']) or ( + obj_to_add['type'] in ('Hostname', 'Domain', 'Ip') and self.attribute['type'] == 'url' + ): + url_object = MISPObject('url') + obj_relation = self.__get_relation(obj_to_add) + if obj_relation: + url_object.add_attribute(obj_relation, obj_to_add['value']) + obj_relation = self.__get_relation(self.attribute, is_yeti_object=False) + if obj_relation: + url_object.add_attribute(obj_relation, + self.attribute['value']) + url_object.add_reference(self.attribute['uuid'], 'related_to') + + return url_object + + def __get_object_ns_record(self, obj_to_add, link): + queried_domain = None + ns_domain = None + object_dns_record = MISPObject('dns-record') + if link == 'dst': + queried_domain = self.attribute['value'] + ns_domain = obj_to_add['value'] + elif link == 'src': + queried_domain = obj_to_add['value'] + ns_domain = self.attribute['value'] + if queried_domain and ns_domain: + object_dns_record.add_attribute('queried-domain', queried_domain) + object_dns_record.add_attribute('ns-record', ns_domain) + object_dns_record.add_reference(self.attribute['uuid'], 'related_to') + + return object_dns_record + + def __get_relation(self, obj, is_yeti_object=True): + if is_yeti_object: + type_attribute = self.misp_mapping[obj['type']] + else: + type_attribute = obj['type'] + if type_attribute == 'ip-src' or type_attribute == 'ip-dst': + return 'ip' + elif 'domain' == type_attribute: + return 'domain' + elif 'hostname' == type_attribute: + return 'domain' + elif type_attribute == 'url': + return type_attribute + + +def handler(q=False): + if q is False: + return False + + apikey = None + yeti_url = None + yeti_client = None + + request = json.loads(q) + attribute = request['attribute'] + if attribute['type'] not in mispattributes['input']: + return {'error': 'Unsupported attributes type'} + + if 'config' in request and 'url' in request['config']: + yeti_url = request['config']['url'] + if 'config' in request and 'apikey' in request['config']: + apikey = request['config']['apikey'] + if apikey and yeti_url: + yeti_client = Yeti(yeti_url, apikey, attribute) + + if yeti_client: + yeti_client.parse_yeti_result() + return {'results': yeti_client.get_result()} + else: + misperrors['error'] = 'Yeti Config Error' + return misperrors + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo + + +def introspection(): + return mispattributes diff --git a/misp_modules/modules/export_mod/__init__.py b/misp_modules/modules/export_mod/__init__.py index 1b0e1d0..ea90d19 100644 --- a/misp_modules/modules/export_mod/__init__.py +++ b/misp_modules/modules/export_mod/__init__.py @@ -1,2 +1,3 @@ __all__ = ['cef_export', 'mass_eql_export', 'liteexport', 'goamlexport', 'threat_connect_export', 'pdfexport', - 'threatStream_misp_export', 'osqueryexport', 'nexthinkexport', 'vt_graph'] + 'threatStream_misp_export', 'osqueryexport', 'nexthinkexport', 'vt_graph', 'defender_endpoint_export', + 'virustotal_collections'] diff --git a/misp_modules/modules/export_mod/defender_endpoint_export.py b/misp_modules/modules/export_mod/defender_endpoint_export.py new file mode 100755 index 0000000..1c36efb --- /dev/null +++ b/misp_modules/modules/export_mod/defender_endpoint_export.py @@ -0,0 +1,109 @@ +""" +Export module for coverting MISP events into Defender for Endpoint KQL queries. +Config['Period'] : allows to define period over witch to look for IOC from now +""" + +import base64 +import json + +misperrors = {"error": "Error"} + +types_to_use = ['sha1', 'md5', 'domain', 'ip', 'url'] + +userConfig = { + +} + +moduleconfig = ["Period"] +inputSource = ['event'] + +outputFileExtension = 'kql' +responseType = 'application/txt' + +moduleinfo = {'version': '1.0', 'author': 'Julien Bachmann, Hacknowledge', + 'description': 'Defender for Endpoint KQL hunting query export module', + 'module-type': ['export']} + + +def handle_sha1(value, period): + query = f"""find in (DeviceAlertEvents, DeviceFileEvents, DeviceImageLoadEvents, DeviceProcessEvents) + where SHA1 == '{value}' or InitiatingProcessSHA1 == '{value}'""" + return query.replace('\n', ' ') + + +def handle_md5(value, period): + query = f"""find in (DeviceAlertEvents, DeviceFileEvents, DeviceImageLoadEvents, DeviceProcessEvents) + where MD5 == '{value}' or InitiatingProcessMD5 == '{value}'""" + return query.replace('\n', ' ') + + +def handle_domain(value, period): + query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) + where RemoteUrl contains '{value}'""" + return query.replace('\n', ' ') + + +def handle_ip(value, period): + query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) + where RemoteIP == '{value}'""" + return query.replace('\n', ' ') + + +def handle_url(value, period): + query = f"""find in (DeviceAlertEvents, DeviceNetworkEvents) + where RemoteUrl startswith '{value}'""" + return query.replace('\n', ' ') + + +handlers = { + 'sha1': handle_sha1, + 'md5': handle_md5, + 'domain': handle_domain, + 'ip': handle_ip, + 'url': handle_url +} + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + config = request.get("config", {"Period": ""}) + output = '' + + for event in request["data"]: + for attribute in event["Attribute"]: + if attribute['type'] in types_to_use: + output = output + handlers[attribute['type']](attribute['value'], config['Period']) + '\n' + r = {"response": [], "data": str(base64.b64encode(bytes(output, 'utf-8')), 'utf-8')} + return r + + +def introspection(): + modulesetup = {} + try: + responseType + modulesetup['responseType'] = responseType + except NameError: + pass + try: + userConfig + modulesetup['userConfig'] = userConfig + except NameError: + pass + try: + outputFileExtension + modulesetup['outputFileExtension'] = outputFileExtension + except NameError: + pass + try: + inputSource + modulesetup['inputSource'] = inputSource + except NameError: + pass + return modulesetup + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/export_mod/virustotal_collections.py b/misp_modules/modules/export_mod/virustotal_collections.py new file mode 100644 index 0000000..fa2929c --- /dev/null +++ b/misp_modules/modules/export_mod/virustotal_collections.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 + +# Copyright 2022 Google Inc. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Creates a VT Collection with indicators present in a given event.""" + +import base64 +import json +import requests + +misperrors = { + 'error': 'Error' +} + +mispattributes = { + 'input': [ + 'hostname', + 'domain', + 'ip-src', + 'ip-dst', + 'md5', + 'sha1', + 'sha256', + 'url' + ], + 'format': 'misp_standard', + 'responseType': 'application/txt', + 'outputFileExtension': 'txt', +} + +moduleinfo = { + 'version': '1.0', + 'author': 'VirusTotal', + 'description': 'Creates a VT Collection from an event iocs.', + 'module-type': ['export'] +} + +moduleconfig = [ + 'vt_api_key', + 'proxy_host', + 'proxy_port', + 'proxy_username', + 'proxy_password' +] + + +class VTError(Exception): + "Exception class to map vt api response errors." + pass + + +def create_collection(api_key, event_data): + headers = { + 'x-apikey': api_key, + 'content-type': 'application/json', + 'x-tool': 'MISPModuleVirusTotalCollectionExport', + } + + response = requests.post('https://www.virustotal.com/api/v3/integrations/misp/collections', + headers=headers, + json=event_data) + + uuid = event_data['Event']['uuid'] + response_data = response.json() + + if response.status_code == 200: + link = response_data['data']['links']['self'] + return f'{uuid}: {link}' + + error = response_data['error']['message'] + if response.status_code == 400: + return f'{uuid}: {error}' + else: + misperrors['error'] = error + raise VTError(error) + + +def normalize_misp_data(data): + normalized_data = {'Event': data.pop('Event', {})} + for attr_key in data: + if isinstance(data[attr_key], list) or isinstance(data[attr_key], dict): + if attr_key == 'EventTag': + normalized_data['Event']['Tag'] = [tag['Tag'] for tag in data[attr_key]] + else: + normalized_data['Event'][attr_key] = data[attr_key] + + return normalized_data + + +def handler(q=False): + request = json.loads(q) + + if not request.get('config') or not request['config'].get('vt_api_key'): + misperrors['error'] = 'A VirusTotal api key is required for this module.' + return misperrors + + config = request['config'] + data = request['data'] + responses = [] + + try: + for event_data in data: + normalized_event = normalize_misp_data(event_data) + responses.append(create_collection(config.get('vt_api_key'), + normalized_event)) + + output = '\n'.join(responses) + return { + "response": [], + "data": str(base64.b64encode(bytes(output, 'utf-8')), 'utf-8'), + } + except VTError: + return misperrors + + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/import_mod/__init__.py b/misp_modules/modules/import_mod/__init__.py index fbad911..a7d220d 100644 --- a/misp_modules/modules/import_mod/__init__.py +++ b/misp_modules/modules/import_mod/__init__.py @@ -1,4 +1,3 @@ -from . import _vmray # noqa import os import sys sys.path.append('{}/lib'.format('/'.join((os.path.realpath(__file__)).split('/')[:-3]))) @@ -14,5 +13,7 @@ __all__ = [ 'openiocimport', 'threatanalyzer_import', 'csvimport', + 'cof2misp', 'joe_import', + 'taxii21' ] diff --git a/misp_modules/modules/import_mod/cof2misp.py b/misp_modules/modules/import_mod/cof2misp.py new file mode 100755 index 0000000..841da09 --- /dev/null +++ b/misp_modules/modules/import_mod/cof2misp.py @@ -0,0 +1,254 @@ +""" PassiveDNS Common Output Format (COF) MISP importer. + +Takes as input a valid COF file or the output of the dnsdbflex utility +and creates MISP objects for the input. + +Copyright 2021: Farsight Security (https://www.farsightsecurity.com/) + +Author: Aaron Kaplan + +Released under the Apache 2.0 license. +See: https://www.apache.org/licenses/LICENSE-2.0.txt + +""" + +import sys +import json +import base64 + + +import ndjson + +# from pymisp import MISPObject, MISPEvent, PyMISP +from pymisp import MISPObject + +from cof2misp.cof import validate_cof, validate_dnsdbflex + + +create_specific_attributes = False # this is for https://github.com/MISP/misp-objects/pull/314 + + +misperrors = {'error': 'Error'} +userConfig = {} + +inputSource = ['file'] + +mispattributes = {'inputSource': ['file'], 'output': ['MISP objects'], + 'format': 'misp_standard'} + + +moduleinfo = {'version': '0.3', 'author': 'Aaron Kaplan', + 'description': 'Module to import the passive DNS Common Output Format (COF) and merge as a MISP objet into a MISP event.', + 'module-type': ['import']} + +moduleconfig = [] + + +# misp = PyMISP() + + +def parse_and_insert_cof(data: str) -> dict: + """Parse and validate the COF data. + + Parameters + ---------- + data as a string + + Returns + ------- + A dict with either the error message or the data which may be sent off the the caller of handler() + + Raises + -------- + none. All Exceptions will be handled here. On error, a misperror is returned. + """ + + objects = [] + try: + entries = ndjson.loads(data) + for entry in entries: # iterate over all ndjson lines + + # validate here (simple validation or full JSON Schema validation) + if not validate_cof(entry): + return {"error": "Could not validate the COF input '%s'" % entry} + + # Next, extract some fields + rrtype = entry['rrtype'].upper() + rrname = entry['rrname'].rstrip('.') + rdata = [x.rstrip('.') for x in entry['rdata']] + + # create a new MISP object, based on the passive-dns object for each nd-JSON line + o = MISPObject(name='passive-dns', standalone=False, comment='created by cof2misp') + + # o.add_tag('tlp:amber') # FIXME: we'll want to add a tlp: tag to the object + if 'bailiwick' in entry: + o.add_attribute('bailiwick', value=entry['bailiwick'].rstrip('.'), distribution=0) + + # + # handle the combinations of rrtype (domain, ip) on both left and right side + # + + if create_specific_attributes: + if rrtype in ['A', 'AAAA', 'A6']: # address type + # address type + o.add_attribute('rrname_domain', value=rrname, distribution=0) + for r in rdata: + o.add_attribute('rdata_ip', value=r, distribution=0) + elif rrtype in ['CNAME', 'DNAME', 'NS']: # both sides are domains + o.add_attribute('rrname_domain', value=rrname, distribution=0) + for r in rdata: + o.add_attribute('rdata_domain', value=r, distribution=0) + elif rrtype in ['SOA']: # left side is a domain, right side is text + o.add_attribute('rrname_domain', value=rrname, distribution=0) + + # + # now do the regular filling up of rrname, rrtype, time_first, etc. + # + o.add_attribute('rrname', value=rrname, distribution=0) + o.add_attribute('rrtype', value=rrtype, distribution=0) + for r in rdata: + o.add_attribute('rdata', value=r, distribution=0) + o.add_attribute('raw_rdata', value=json.dumps(rdata), distribution=0) # FIXME: do we need to hex encode it? + o.add_attribute('time_first', value=entry['time_first'], distribution=0) + o.add_attribute('time_last', value=entry['time_last'], distribution=0) + o.first_seen = entry['time_first'] # is this redundant? + o.last_seen = entry['time_last'] + + # + # Now add the other optional values. # FIXME: how about a map() other function. DNRY + # + for k in ['count', 'sensor_id', 'origin', 'text', 'time_first_ms', 'time_last_ms', 'zone_time_first', 'zone_time_last']: + if k in entry and entry[k]: + o.add_attribute(k, value=entry[k], distribution=0) + + # + # add COF entry to MISP object + # + objects.append(o.to_json()) + + r = {'results': {'Object': [json.loads(o) for o in objects]}} + except Exception as ex: + misperrors["error"] = "An error occured during parsing of input: '%s'" % (str(ex),) + return misperrors + return r + + +def parse_and_insert_dnsdbflex(data: str): + """Parse and validate the more simplier dndsdbflex output data. + + Parameters + ---------- + data as a string + + Returns + ------- + A dict with either the error message or the data which may be sent off the the caller of handler() + + Raises + -------- + none + """ + objects = [] + try: + entries = ndjson.loads(data) + for entry in entries: # iterate over all ndjson lines + # validate here (simple validation or full JSON Schema validation) + if not validate_dnsdbflex(entry): + return {"error": "Could not validate the dnsdbflex input '%s'" % entry} + + # Next, extract some fields + rrtype = entry['rrtype'].upper() + rrname = entry['rrname'].rstrip('.') + + # create a new MISP object, based on the passive-dns object for each nd-JSON line + try: + o = MISPObject(name='passive-dns', standalone=False, distribution=0, comment='DNSDBFLEX import by cof2misp') + o.add_attribute('rrtype', value=rrtype, distribution=0, comment='DNSDBFLEX import by cof2misp') + o.add_attribute('rrname', value=rrname, distribution=0, comment='DNSDBFLEX import by cof2misp') + except Exception as ex: + print("could not create object. Reason: %s" % str(ex)) + + # + # add dnsdbflex entry to MISP object + # + objects.append(o.to_json()) + + r = {'results': {'Object': [json.loads(o) for o in objects]}} + except Exception as ex: + misperrors["error"] = "An error occured during parsing of input: '%s'" % (str(ex),) + return misperrors + return r + + +def is_dnsdbflex(data: str) -> bool: + """Check if the supplied data conforms to the dnsdbflex output (which only contains rrname and rrtype) + + Parameters + ---------- + ndjson data as a string + + Returns + ------- + True or False + + Raises + -------- + none + """ + + try: + j = ndjson.loads(data) + for line in j: + if not set(line.keys()) == {'rrname', 'rrtype'}: + return False # shortcut. We assume it's not if a single line does not conform + return True + except Exception as ex: + print("oops, this should not have happened. Maybe not an ndjson file? Reason: %s" % (str(ex),), file=sys.stderr) + return False + + +def is_cof(data: str) -> bool: + return True + + +def handler(q=False): + if q is False: + return False + + request = json.loads(q) + # Parse the json, determine which type of JSON it is (dnsdbflex or COF?) + # Validate it + # transform into MISP object + # push to MISP + # event_id = request['event_id'] + # event = misp.get_event(event_id) + # print("event_id = %s" % event_id, file=sys.stderr) + try: + data = base64.b64decode(request["data"]).decode('utf-8') + if not data: + return json.dumps({'success': 0}) # empty file is ok + if is_dnsdbflex(data): + return parse_and_insert_dnsdbflex(data) + elif is_cof(data): + # check if it's valid COF format + return parse_and_insert_cof(data) + else: + return {'error': 'Could not find any valid COF input nor dnsdbflex input. Please have a loot at: https://datatracker.ietf.org/doc/draft-dulaunoy-dnsop-passive-dns-cof/'} + except Exception as ex: + print("oops, got exception %s" % str(ex), file=sys.stderr) + return {'error': "Got exception %s" % str(ex)} + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo + + +if __name__ == '__main__': + x = open('test.json', 'r') + r = handler(q=x.read()) + print(json.dumps(r)) diff --git a/misp_modules/modules/import_mod/csvimport.py b/misp_modules/modules/import_mod/csvimport.py index 34eed8c..6bd79b7 100644 --- a/misp_modules/modules/import_mod/csvimport.py +++ b/misp_modules/modules/import_mod/csvimport.py @@ -224,7 +224,8 @@ class CsvParser(): @staticmethod def __deal_with_tags(attribute): - attribute['Tag'] = [{'name': tag.strip()} for tag in attribute['Tag'].split(',')] + if 'Tag' in attribute.keys(): + attribute['Tag'] = [{'name': tag.strip()} for tag in attribute['Tag'].split(',')] def __get_score(self): score = 1 if 'to_ids' in self.header else 0 diff --git a/misp_modules/modules/import_mod/email_import.py b/misp_modules/modules/import_mod/email_import.py index 7453dcd..3ebf3a2 100644 --- a/misp_modules/modules/import_mod/email_import.py +++ b/misp_modules/modules/import_mod/email_import.py @@ -110,21 +110,20 @@ def handler(q=False): email_object.add_reference(f_object.uuid, 'includes', 'Email attachment') mail_body = email_object.email.get_body(preferencelist=('html', 'plain')) - if extract_urls: - if mail_body: - charset = mail_body.get_content_charset() - if mail_body.get_content_type() == 'text/html': - url_parser = HTMLURLParser() - url_parser.feed(mail_body.get_payload(decode=True).decode(charset, errors='ignore')) - urls = url_parser.urls - else: - urls = re.findall(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', mail_body.get_payload(decode=True).decode(charset, errors='ignore')) - for url in urls: - if not url: - continue - url_object = URLObject(url, standalone=False) - file_objects.append(url_object) - email_object.add_reference(url_object.uuid, 'includes', 'URL in email body') + if extract_urls and mail_body: + charset = mail_body.get_content_charset('utf-8') + if mail_body.get_content_type() == 'text/html': + url_parser = HTMLURLParser() + url_parser.feed(mail_body.get_payload(decode=True).decode(charset, errors='ignore')) + urls = url_parser.urls + else: + urls = re.findall(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', mail_body.get_payload(decode=True).decode(charset, errors='ignore')) + for url in urls: + if not url: + continue + url_object = URLObject(url, standalone=False) + file_objects.append(url_object) + email_object.add_reference(url_object.uuid, 'includes', 'URL in email body') objects = [email_object.to_json()] if file_objects: diff --git a/misp_modules/modules/import_mod/joe_import.py b/misp_modules/modules/import_mod/joe_import.py index 0753167..ce56698 100644 --- a/misp_modules/modules/import_mod/joe_import.py +++ b/misp_modules/modules/import_mod/joe_import.py @@ -5,9 +5,9 @@ from joe_parser import JoeParser misperrors = {'error': 'Error'} userConfig = { - "Import PE": { + "Import Executable": { "type": "Boolean", - "message": "Import PE Information", + "message": "Import Executable Information (PE, elf or apk for instance)", }, "Mitre Att&ck": { "type": "Boolean", @@ -29,7 +29,7 @@ def handler(q=False): return False q = json.loads(q) config = { - "import_pe": bool(int(q["config"]["Import PE"])), + "import_executable": bool(int(q["config"]["Import Executable"])), "mitre_attack": bool(int(q["config"]["Mitre Att&ck"])), } diff --git a/misp_modules/modules/import_mod/lastline_import.py b/misp_modules/modules/import_mod/lastline_import.py index 37f6249..3307852 100644 --- a/misp_modules/modules/import_mod/lastline_import.py +++ b/misp_modules/modules/import_mod/lastline_import.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 """ +Deprecation notice: this module will be deprecated by December 2021, please use vmware_nsx module. + Module (type "import") to import a Lastline report from an analysis link. """ import json diff --git a/misp_modules/modules/import_mod/ocr.py b/misp_modules/modules/import_mod/ocr.py index fef0fd1..2e82cd2 100755 --- a/misp_modules/modules/import_mod/ocr.py +++ b/misp_modules/modules/import_mod/ocr.py @@ -67,7 +67,7 @@ def handler(q=False): image = img.make_blob('png') log.debug("Final image size is {}x{}".format(pdf.width, pdf.height * (p + 1))) else: - image = document + image = base64.b64decode(request["data"]) image_file = BytesIO(image) image_file.seek(0) diff --git a/misp_modules/modules/import_mod/taxii21.py b/misp_modules/modules/import_mod/taxii21.py new file mode 100644 index 0000000..d03b85c --- /dev/null +++ b/misp_modules/modules/import_mod/taxii21.py @@ -0,0 +1,373 @@ +""" +Import content from a TAXII 2.1 server. +""" +import collections +import itertools +import json +import misp_modules.lib.stix2misp +from pathlib import Path +import re +import stix2.v20 +import taxii2client +import taxii2client.exceptions +import requests + + +class ConfigError(Exception): + """ + Represents an error in the config settings for one invocation of this + module. + """ + pass + + +misperrors = {'error': 'Error'} + +moduleinfo = {'version': '0.1', 'author': 'Abc', + 'description': 'Import content from a TAXII 2.1 server', + 'module-type': ['import']} + +mispattributes = { + 'inputSource': [], + 'output': ['MISP objects'], + 'format': 'misp_standard', +} + + +userConfig = { + "url": { + "type": "String", + "message": "A TAXII 2.1 collection URL", + }, + "added_after": { + "type": "String", + "message": "Lower bound on time the object was uploaded to the TAXII server" + }, + "stix_id": { + "type": "String", + "message": "STIX ID(s) of objects" + }, + "spec_version": { # TAXII 2.1 specific + "type": "String", + "message": "STIX version(s) of objects" + }, + "type": { + "type": "String", + "message": "STIX type(s) of objects" + }, + "version": { + "type": "String", + "message": 'Version timestamp(s), or "first"/"last"/"all"' + }, + # Should we give some user control over this? It will not be allowed to + # exceed the admin setting. + "STIX object limit": { + "type": "Integer", + "message": "Maximum number of STIX objects to process" + }, + "username": { + "type": "String", + "message": "Username for TAXII server authentication, if necessary" + }, + "password": { + "type": "String", + "message": "Password for TAXII server authentication, if necessary" + } +} + +# Paging will be handled transparently by this module, so user-defined +# paging-related filtering parameters will not be supported. + + +# This module will not process more than this number of STIX objects in total +# from a TAXII server in one module invocation (across all pages), to limit +# resource consumption. +moduleconfig = [ + "stix_object_limit" +] + + +# In case there is neither an admin nor user setting given. +_DEFAULT_STIX_OBJECT_LIMIT = 1000 + + +# Page size to use when paging TAXII results. Trades off the amount of +# hammering on TAXII servers and overhead of repeated requests, with the +# resource consumption of a single page. (Should be an admin setting too?) +_PAGE_SIZE = 100 + + +_synonymsToTagNames_path = Path(__file__).parent / "../../lib/synonymsToTagNames.json" + + +# Collects module config information necessary to perform the TAXII query. +Config = collections.namedtuple("Config", [ + "url", + "added_after", + "id", + "spec_version", + "type", + "version", + "stix_object_limit", + "username", + "password" +]) + + +def _pymisp_to_json_serializable(obj): + """ + Work around a possible bug with PyMISP's + AbstractMisp.to_dict(json_format=True) method, which doesn't always produce + a JSON-serializable value (i.e. a value which is serializable with the + default JSON encoder). + + :param obj: A PyMISP object + :return: A JSON-serializable version of the object + """ + + # The workaround creates a JSON string and then parses it back to a + # JSON-serializable value. + json_ = obj.to_json() + json_serializable = json.loads(json_) + + return json_serializable + + +def _normalize_multi_values(value): + """ + Some TAXII filters may contain multiple values separated by commas, + without spaces around the commas. Maybe give MISP users a little more + flexibility? This function normalizes a possible multi-valued value + (e.g. multiple values delimited by commas or spaces, all in the same + string) to TAXII-required format. + + :param value: A MISP config value + :return: A normalized value + """ + + if "," in value: + value = re.sub(r"\s*,\s*", ",", value) + else: + # Assume space delimiting; replace spaces with commas. + # I don't think we need to worry about spaces embedded in values. + value = re.sub(r"\s+", ",", value) + + value = value.strip(",") + + return value + + +def _get_config(config): + """ + Combine user, admin, and default config settings to produce a config + object with all settings together. + + :param config: The misp-modules request's "config" value. + :return: A Config object + :raises ConfigError: if any config errors are detected + """ + + # Strip whitespace from all config settings... except for password? + for key, val in config.items(): + if isinstance(val, str) and key != "password": + config[key] = val.strip() + + url = config.get("url") + added_after = config.get("added_after") + id_ = config.get("stix_id") + spec_version = config.get("spec_version") + type_ = config.get("type") + version_ = config.get("version") + username = config.get("username") + password = config.get("password") + admin_stix_object_limit = config.get("stix_object_limit") + user_stix_object_limit = config.get("STIX object limit") + + if admin_stix_object_limit: + admin_stix_object_limit = int(admin_stix_object_limit) + else: + admin_stix_object_limit = _DEFAULT_STIX_OBJECT_LIMIT + + if user_stix_object_limit: + user_stix_object_limit = int(user_stix_object_limit) + stix_object_limit = min(user_stix_object_limit, admin_stix_object_limit) + else: + stix_object_limit = admin_stix_object_limit + + # How much of this should we sanity-check here before passing it off to the + # TAXII client (and thence, to the TAXII server)? + + if not url: + raise ConfigError("A TAXII 2.1 collection URL is required.") + + if admin_stix_object_limit < 1: + raise ConfigError( + "Invalid admin object limit: must be positive: " + + str(admin_stix_object_limit) + ) + + if stix_object_limit < 1: + raise ConfigError( + "Invalid object limit: must be positive: " + + str(stix_object_limit) + ) + + if id_: + id_ = _normalize_multi_values(id_) + if spec_version: + spec_version = _normalize_multi_values(spec_version) + if type_: + type_ = _normalize_multi_values(type_) + if version_: + version_ = _normalize_multi_values(version_) + + # STIX->MISP converter currently only supports STIX 2.0, so let's force + # spec_version="2.0". + if not spec_version: + spec_version = "2.0" + elif spec_version != "2.0": + raise ConfigError('Only spec_version="2.0" is supported for now.') + + if (username and not password) or (not username and password): + raise ConfigError( + 'Both or neither of "username" and "password" are required.' + ) + + config_obj = Config( + url, added_after, id_, spec_version, type_, version_, stix_object_limit, + username, password + ) + + return config_obj + + +def _query_taxii(config): + """ + Query the TAXII server according to the given config, convert the STIX + results to MISP, and return a standard misp-modules response. + + :param config: Module config information as a Config object + :return: A dict containing a misp-modules response + """ + + collection = taxii2client.Collection( + config.url, user=config.username, password=config.password + ) + + # No point in asking for more than our overall limit. + page_size = min(_PAGE_SIZE, config.stix_object_limit) + + kwargs = { + "per_request": page_size + } + + if config.spec_version: + kwargs["spec_version"] = config.spec_version + if config.version: + kwargs["version"] = config.version + if config.id: + kwargs["id"] = config.id + if config.type: + kwargs["type"] = config.type + if config.added_after: + kwargs["added_after"] = config.added_after + + pages = taxii2client.as_pages( + collection.get_objects, + **kwargs + ) + + # Chain all the objects from all pages together... + all_stix_objects = itertools.chain.from_iterable( + taxii_envelope.get("objects", []) + for taxii_envelope in pages + ) + + # And only take the first N objects from that. + limited_stix_objects = itertools.islice( + all_stix_objects, 0, config.stix_object_limit + ) + + # Collect into a list. This is... unfortunate, but I don't think the + # converter will work incrementally (will it?). It expects all objects to + # be given at once. + # + # It may also be desirable to have all objects available at once so that + # cross-references can be made where possible, but it results in increased + # memory usage. + stix_objects = list(limited_stix_objects) + + # The STIX 2.0 converter wants a 2.0 bundle. (Hope the TAXII server isn't + # returning 2.1 objects!) + bundle20 = stix2.v20.Bundle(stix_objects, allow_custom=True) + + converter = misp_modules.lib.stix2misp.ExternalStixParser() + converter.handler( + bundle20, None, [0, "event", str(_synonymsToTagNames_path)] + ) + + attributes = [ + _pymisp_to_json_serializable(attr) + for attr in converter.misp_event.attributes + ] + + objects = [ + _pymisp_to_json_serializable(obj) + for obj in converter.misp_event.objects + ] + + tags = [ + _pymisp_to_json_serializable(tag) + for tag in converter.misp_event.tags + ] + + result = { + "results": { + "Attribute": attributes, + "Object": objects, + "Tag": tags + } + } + + return result + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + + result = None + config = None + + try: + config = _get_config(request["config"]) + except ConfigError as e: + result = misperrors + result["error"] = e.args[0] + + if not result: + try: + result = _query_taxii(config) + except taxii2client.exceptions.TAXIIServiceException as e: + result = misperrors + result["error"] = str(e) + except requests.HTTPError as e: + # Let's give a better error message for auth issues. + if e.response.status_code in (401, 403): + result = misperrors + result["error"] = "Access was denied." + else: + raise + + return result + + +def introspection(): + mispattributes["userConfig"] = userConfig + return mispattributes + + +def version(): + moduleinfo['config'] = moduleconfig + return moduleinfo diff --git a/misp_modules/modules/import_mod/vmray_import.py b/misp_modules/modules/import_mod/vmray_import.py index 824c970..8385634 100644 --- a/misp_modules/modules/import_mod/vmray_import.py +++ b/misp_modules/modules/import_mod/vmray_import.py @@ -6,8 +6,6 @@ Import VMRay results. This version supports import from different analyze jobs, starting from one sample (the supplied sample_id). -Requires "vmray_rest_api" - The expansion module vmray_submit and import module vmray_import are a two step process to import data from VMRay. You can automate this by setting the PyMISP example script 'vmray_automation' @@ -17,378 +15,72 @@ as a cron job import json -from ._vmray.vmray_rest_api import VMRayRESTAPI +from _vmray.parser import VMRayParser, VMRayParseError + misperrors = {'error': 'Error'} -inputSource = [] -moduleinfo = {'version': '0.2', 'author': 'Koen Van Impe', - 'description': 'Import VMRay results', + +moduleinfo = {'version': '0.4', 'author': 'Jens Thom (VMRay), Koen van Impe', + 'description': 'Import VMRay analysis results from a server', 'module-type': ['import']} -userConfig = {'include_analysisid': {'type': 'Boolean', - 'message': 'Include link to VMRay analysis' - }, - 'include_analysisdetails': {'type': 'Boolean', - 'message': 'Include (textual) analysis details' - }, - 'include_vtidetails': {'type': 'Boolean', - 'message': 'Include VMRay Threat Identifier (VTI) rules' - }, - 'include_imphash_ssdeep': {'type': 'Boolean', - 'message': 'Include imphash and ssdeep' - }, - 'include_extracted_files': {'type': 'Boolean', - 'message': 'Include extracted files section' - }, - 'sample_id': {'type': 'Integer', - 'errorMessage': 'Expected a sample ID', - 'message': 'The VMRay sample_id' - } - } +mispattributes = { + 'inputSource': [], + 'output': ['MISP objects'], + 'format': 'misp_standard', +} -moduleconfig = ['apikey', 'url', 'wait_period'] +userConfig = { + "Sample ID": { + "type": "Integer", + "errorMessage": "The VMRay sample ID to download the reports", + }, + "VTI": { + "type": "Boolean", + "message": "Include VMRay Threat Identifiers", + "checked": "True" + }, + "IOCs": { + "type": "Boolean", + "message": "Include IOCs", + "checked": "True" + }, + "Artifacts": { + "type": "Boolean", + "message": "Include other Artifacts", + }, + "Analysis Details": { + "type": "Boolean", + "message": "Include Analysis Details", + "checked": "True" + } +} + +moduleconfig = ["apikey", "url", "disable_tags", "disable_misp_objects", "ignore_analysis_finished"] def handler(q=False): - global include_analysisid, include_imphash_ssdeep, include_extracted_files, include_analysisdetails, include_vtidetails, include_static_to_ids - if q is False: return False request = json.loads(q) - include_analysisid = bool(int(request["config"].get("include_analysisid"))) - include_imphash_ssdeep = bool(int(request["config"].get("include_imphash_ssdeep"))) - include_extracted_files = bool(int(request["config"].get("include_extracted_files"))) - include_analysisdetails = bool(int(request["config"].get("include_extracted_files"))) - include_vtidetails = bool(int(request["config"].get("include_vtidetails"))) - include_static_to_ids = True - - # print("include_analysisid: %s include_imphash_ssdeep: %s include_extracted_files: %s include_analysisdetails: %s include_vtidetails: %s" % ( include_analysisid, include_imphash_ssdeep, include_extracted_files, include_analysisdetails, include_vtidetails)) - - sample_id = int(request["config"].get("sample_id")) - - if (request["config"].get("apikey") is None) or (request["config"].get("url") is None): - misperrors["error"] = "Missing API key or server URL (hint: try cloud.vmray.com)" + parser = VMRayParser() + try: + parser.from_api(request["config"]) + parser.parse() + except VMRayParseError as exc: + misperrors["error"] = str(exc) return misperrors - if sample_id > 0: - try: - api = VMRayRESTAPI(request["config"].get("url"), request["config"].get("apikey"), False) - vmray_results = {'results': []} - - # Get all information on the sample, returns a set of finished analyze jobs - data = vmrayGetInfoAnalysis(api, sample_id) - if data["data"]: - for analysis in data["data"]: - analysis_id = int(analysis["analysis_id"]) - if analysis_id > 0: - # Get the details for an analyze job - analysis_data = vmrayDownloadAnalysis(api, analysis_id) - - if analysis_data: - if include_analysisdetails and "analysis_details" in analysis_data: - analysis_details = vmrayAnalysisDetails(analysis_data["analysis_details"], analysis_id) - if analysis_details and len(analysis_details["results"]) > 0: - vmray_results = {'results': vmray_results["results"] + analysis_details["results"]} - - if "classifications" in analysis_data: - classifications = vmrayClassifications(analysis_data["classifications"], analysis_id) - if classifications and len(classifications["results"]) > 0: - vmray_results = {'results': vmray_results["results"] + classifications["results"]} - - if include_extracted_files and "extracted_files" in analysis_data: - extracted_files = vmrayExtractedfiles(analysis_data["extracted_files"]) - if extracted_files and len(extracted_files["results"]) > 0: - vmray_results = {'results': vmray_results["results"] + extracted_files["results"]} - - if include_vtidetails and "vti" in analysis_data: - vti = vmrayVti(analysis_data["vti"]) - if vti and len(vti["results"]) > 0: - vmray_results = {'results': vmray_results["results"] + vti["results"]} - - if "artifacts" in analysis_data: - artifacts = vmrayArtifacts(analysis_data["artifacts"]) - if artifacts and len(artifacts["results"]) > 0: - vmray_results = {'results': vmray_results["results"] + artifacts["results"]} - - if include_analysisid: - a_id = {'results': []} - url1 = request["config"].get("url") + "/user/analysis/view?from_sample_id=%u" % sample_id - url2 = "&id=%u" % analysis_id - url3 = "&sub=%2Freport%2Foverview.html" - a_id["results"].append({"values": url1 + url2 + url3, "types": "link"}) - vmray_results = {'results': vmray_results["results"] + a_id["results"]} - - # Clean up (remove doubles) - if len(vmray_results["results"]) > 0: - vmray_results = vmrayCleanup(vmray_results) - return vmray_results - else: - misperrors['error'] = "No vti_results returned or jobs not finished" - return misperrors - else: - if "result" in data: - if data["result"] == "ok": - return vmray_results - - # Fallback - misperrors['error'] = "Unable to fetch sample id %u" % (sample_id) - return misperrors - except Exception as e: # noqa - misperrors['error'] = "Unable to access VMRay API : %s" % (e) - return misperrors - else: - misperrors['error'] = "Not a valid sample id" - return misperrors + event = parser.to_json() + return event def introspection(): - modulesetup = {} - try: - userConfig - modulesetup['userConfig'] = userConfig - except NameError: - pass - try: - inputSource - modulesetup['inputSource'] = inputSource - except NameError: - pass - return modulesetup + mispattributes["userConfig"] = userConfig + return mispattributes def version(): moduleinfo['config'] = moduleconfig return moduleinfo - - -def vmrayGetInfoAnalysis(api, sample_id): - ''' Get information from a sample, returns a set of analyzed reports''' - - if sample_id: - data = api.call("GET", "/rest/analysis/sample/%u" % (sample_id), raw_data=True) - return json.loads(data.read().decode()) - else: - return False - - -def vmrayDownloadAnalysis(api, analysis_id): - ''' Get the details from an analysis''' - if analysis_id: - try: - data = api.call("GET", "/rest/analysis/%u/archive/logs/summary.json" % (analysis_id), raw_data=True) - return json.loads(data.read().decode()) - except Exception as e: # noqa - misperrors['error'] = "Unable to download summary.json for analysis %s" % (analysis_id) - return misperrors - else: - return False - - -def vmrayVti(vti): - '''VMRay Threat Identifier (VTI) rules that matched for this analysis''' - - if vti: - r = {'results': []} - for rule in vti: - if rule == "vti_rule_matches": - vti_rule = vti["vti_rule_matches"] - for el in vti_rule: - if "operation_desc" in el: - comment = "" - types = ["text"] - values = el["operation_desc"] - r['results'].append({'types': types, 'values': values, 'comment': comment}) - - return r - - else: - return False - - -def vmrayExtractedfiles(extracted_files): - ''' Information about files which were extracted during the analysis, such as files that were created, modified, or embedded by the malware''' - - if extracted_files: - r = {'results': []} - - for file in extracted_files: - if "file_type" and "norm_filename" in file: - comment = "%s - %s" % (file["file_type"], file["norm_filename"]) - else: - comment = "" - - if "norm_filename" in file: - attr_filename_c = file["norm_filename"].rsplit("\\", 1) - if len(attr_filename_c) > 1: - attr_filename = attr_filename_c[len(attr_filename_c) - 1] - else: - attr_filename = "vmray_sample" - else: - attr_filename = "vmray_sample" - - if "md5_hash" in file and file["md5_hash"] is not None: - r['results'].append({'types': ["filename|md5"], 'values': '{}|{}'.format(attr_filename, file["md5_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if include_imphash_ssdeep and "imp_hash" in file and file["imp_hash"] is not None: - r['results'].append({'types': ["filename|imphash"], 'values': '{}|{}'.format(attr_filename, file["imp_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if "sha1_hash" in file and file["sha1_hash"] is not None: - r['results'].append({'types': ["filename|sha1"], 'values': '{}|{}'.format(attr_filename, file["sha1_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if "sha256_hash" in file and file["sha256_hash"] is not None: - r['results'].append({'types': ["filename|sha256"], 'values': '{}|{}'.format(attr_filename, file["sha256_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if include_imphash_ssdeep and "ssdeep_hash" in file and file["ssdeep_hash"] is not None: - r['results'].append({'types': ["filename|ssdeep"], 'values': '{}|{}'.format(attr_filename, file["ssdeep_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - - return r - - else: - return False - - -def vmrayClassifications(classification, analysis_id): - ''' List the classifications, tag them on a "text" attribute ''' - - if classification: - r = {'results': []} - types = ["text"] - comment = "" - values = "Classification : %s " % (", ".join(str(x) for x in classification)) - r['results'].append({'types': types, 'values': values, 'comment': comment}) - - return r - - else: - return False - - -def vmrayAnalysisDetails(details, analysis_id): - ''' General information about the analysis information ''' - - if details: - r = {'results': []} - types = ["text"] - comment = "" - if "execution_successful" in details: - values = "Analysis %s : execution_successful : %s " % (analysis_id, str(details["execution_successful"])) - r['results'].append({'types': types, 'values': values, 'comment': comment}) - if "termination_reason" in details: - values = "Analysis %s : termination_reason : %s " % (analysis_id, str(details["termination_reason"])) - r['results'].append({'types': types, 'values': values, 'comment': comment}) - if "result_str" in details: - values = "Analysis %s : result : %s " % (analysis_id, details["result_str"]) - r['results'].append({'types': types, 'values': values, 'comment': comment}) - - return r - - else: - return False - - -def vmrayArtifacts(patterns): - ''' IOCs that were seen during the analysis ''' - - if patterns: - r = {'results': []} - y = {'results': []} - - for pattern in patterns: - if pattern == "domains": - for el in patterns[pattern]: - values = el["domain"] - types = ["domain", "hostname"] - if "sources" in el: - sources = el["sources"] - comment = "Found in: " + ", ".join(str(x) for x in sources) - else: - comment = "" - r['results'].append({'types': types, 'values': values, 'comment': comment, 'to_ids': include_static_to_ids}) - if pattern == "files": - for el in patterns[pattern]: - filename_values = el["filename"] - attr_filename_c = filename_values.rsplit("\\", 1) - if len(attr_filename_c) > 1: - attr_filename = attr_filename_c[len(attr_filename_c) - 1] - else: - attr_filename = "" - filename_types = ["filename"] - filename_operations = el["operations"] - comment = "File operations: " + ", ".join(str(x) for x in filename_operations) - r['results'].append({'types': filename_types, 'values': filename_values, 'comment': comment}) - - # Run through all hashes - if "hashes" in el: - for hash in el["hashes"]: - if "md5_hash" in hash and hash["md5_hash"] is not None: - r['results'].append({'types': ["filename|md5"], 'values': '{}|{}'.format(attr_filename, hash["md5_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if include_imphash_ssdeep and "imp_hash" in hash and hash["imp_hash"] is not None: - r['results'].append({'types': ["filename|imphash"], 'values': '{}|{}'.format(attr_filename, hash["imp_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if "sha1_hash" in hash and hash["sha1_hash"] is not None: - r['results'].append({'types': ["filename|sha1"], 'values': '{}|{}'.format(attr_filename, hash["sha1_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if "sha256_hash" in hash and hash["sha256_hash"] is not None: - r['results'].append({'types': ["filename|sha256"], 'values': '{}|{}'.format(attr_filename, hash["sha256_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if include_imphash_ssdeep and "ssdeep_hash" in hash and hash["ssdeep_hash"] is not None: - r['results'].append({'types': ["filename|ssdeep"], 'values': '{}|{}'.format(attr_filename, hash["ssdeep_hash"]), 'comment': comment, 'categories': ['Payload delivery', 'Artifacts dropped'], 'to_ids': include_static_to_ids}) - if pattern == "ips": - for el in patterns[pattern]: - values = el["ip_address"] - types = ["ip-dst"] - if "sources" in el: - sources = el["sources"] - comment = "Found in: " + ", ".join(str(x) for x in sources) - else: - comment = "" - - r['results'].append({'types': types, 'values': values, 'comment': comment, 'to_ids': include_static_to_ids}) - if pattern == "mutexes": - for el in patterns[pattern]: - values = el["mutex_name"] - types = ["mutex"] - if "operations" in el: - sources = el["operations"] - comment = "Operations: " + ", ".join(str(x) for x in sources) - else: - comment = "" - - r['results'].append({'types': types, 'values': values, 'comment': comment, 'to_ids': include_static_to_ids}) - if pattern == "registry": - for el in patterns[pattern]: - values = el["reg_key_name"] - types = ["regkey"] - include_static_to_ids_tmp = include_static_to_ids - if "operations" in el: - sources = el["operations"] - if sources == ["access"]: - include_static_to_ids_tmp = False - comment = "Operations: " + ", ".join(str(x) for x in sources) - else: - comment = "" - - r['results'].append({'types': types, 'values': values, 'comment': comment, 'to_ids': include_static_to_ids_tmp}) - if pattern == "urls": - for el in patterns[pattern]: - values = el["url"] - types = ["url"] - if "operations" in el: - sources = el["operations"] - comment = "Operations: " + ", ".join(str(x) for x in sources) - else: - comment = "" - - r['results'].append({'types': types, 'values': values, 'comment': comment, 'to_ids': include_static_to_ids}) - - # Remove doubles - for el in r["results"]: - if el not in y["results"]: - y["results"].append(el) - return y - - else: - return False - - -def vmrayCleanup(x): - ''' Remove doubles''' - y = {'results': []} - for el in x["results"]: - if el not in y["results"]: - y["results"].append(el) - return y diff --git a/misp_modules/modules/import_mod/vmray_summary_json_import.py b/misp_modules/modules/import_mod/vmray_summary_json_import.py new file mode 100644 index 0000000..e7f4985 --- /dev/null +++ b/misp_modules/modules/import_mod/vmray_summary_json_import.py @@ -0,0 +1,80 @@ +import json + +from _vmray.parser import VMRayParser, VMRayParseError + + +misperrors = {'error': 'Error'} + +moduleconfig = ["disable_tags"] + +moduleinfo = { + "version": "0.1", + "author": "VMRay", + "description": "Import a VMRay Summary JSON report.", + "module-type": ["import"], +} + +mispattributes = { + "inputSource": ["file"], + "output": ["MISP objects", "MISP attributes"], + "format": "misp_standard", +} + +user_config = { + "Analysis ID": { + "type": "Boolean", + "message": "Include Analysis ID", + "checked": "True" + }, + "VTI": { + "type": "Boolean", + "message": "Include VMRay Threat Identifiers", + "checked": "True" + }, + "IOCs": { + "type": "Boolean", + "message": "Include IOCs", + "checked": "True" + }, + "Artifacts": { + "type": "Boolean", + "message": "Include other Artifacts", + }, + "Analysis Details": { + "type": "Boolean", + "message": "Include Analysis Details", + }, + "Attach Report": { + "type": "Boolean", + "message": "Include the original imported file as attachment", + } +} + + +def handler(q=False): + # In case there's no data + if q is False: + return False + + q = json.loads(q) + + parser = VMRayParser() + try: + parser.from_base64_string(q["config"], q["data"], q["filename"]) + parser.parse() + except VMRayParseError as exc: + misperrors["error"] = str(exc) + return misperrors + + event = parser.to_json() + return event + + +def introspection(): + mispattributes["userConfig"] = user_config + return mispattributes + + +def version(): + moduleinfo["config"] = moduleconfig + return moduleinfo diff --git a/mkdocs.yml b/mkdocs.yml index be23ba7..c799d20 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,19 +16,18 @@ edit_uri: "" use_directory_urls: true # Copyright -copyright: "Copyright © 2019 MISP Project" +copyright: "Copyright © 2019-2021 MISP Project" # Options extra: search: languages: "en" social: - - type: globe - link: https://www.misp-project.org/ - - type: github-alt - link: https://github.com/MISP - - type: twitter - link: https://twitter.com/MISPProject + - icon: fontawesome/brands/twitter + link: https://twitter.com/MISPProject + - icon: fontawesome/brands/github-alt + link: https://github.com/MISP + theme: name: material diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b0471b7 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta:__legacy__" \ No newline at end of file diff --git a/setup.py b/setup.py index 55ed8b7..ea55174 100644 --- a/setup.py +++ b/setup.py @@ -25,6 +25,7 @@ setup( install_requires=[ 'tornado', 'psutil', - 'redis>=3' + 'redis>=3', + 'pyparsing==2.4.7' ], ) diff --git a/tests/expansion_configs.json b/tests/expansion_configs.json new file mode 100644 index 0000000..8056ec8 --- /dev/null +++ b/tests/expansion_configs.json @@ -0,0 +1,10 @@ +{ + "censys_enrich": { + "api_id" : "", + "api_secret": "" + }, + "crowdstrike_falcon": { + "api_id" : "", + "apikey": "" + } +} \ No newline at end of file diff --git a/tests/test_expansions.py b/tests/test_expansions.py index eb29332..0a7bcf7 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -8,6 +8,7 @@ from base64 import b64encode import json import os +LiveCI = True class TestExpansions(unittest.TestCase): @@ -64,6 +65,8 @@ class TestExpansions(unittest.TestCase): if not isinstance(data, dict): print(json.dumps(data, indent=2)) return data + if 'results' not in data: + return data for result in data['results']: values = result['values'] if values: @@ -109,13 +112,16 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_object(response), 'asn') def test_btc_steroids(self): + if LiveCI: + return True + query = {"module": "btc_steroids", "btc": "1ES14c7qLb5CYhLMUekctxLgc1FV2Ti9DA"} response = self.misp_modules_post(query) try: self.assertTrue(self.get_values(response).startswith('\n\nAddress:\t1ES14c7qLb5CYhLMUekctxLgc1FV2Ti9DA\nBalance:\t0.0002126800 BTC (+0.0007482500 BTC / -0.0005355700 BTC)')) except Exception: - self.assertEqual(self.get_values(response), 'Not a valid BTC address, or Balance has changed') + self.assertTrue(self.get_values(response).startswith('Not a valid BTC address')) def test_btc_scam_check(self): query = {"module": "btc_scam_check", "btc": "1ES14c7qLb5CYhLMUekctxLgc1FV2Ti9DA"} @@ -144,7 +150,7 @@ class TestExpansions(unittest.TestCase): module_name = "circl_passivessl" query = {"module": module_name, "attribute": {"type": "ip-dst", - "value": "149.13.33.14", + "value": "185.194.93.14", "uuid": "ea89a33b-4ab7-4515-9f02-922a0bee333d"}, "config": {}} if module_name in self.configs: @@ -199,7 +205,7 @@ class TestExpansions(unittest.TestCase): def test_dns(self): query = {"module": "dns", "hostname": "www.circl.lu", "config": {"nameserver": "8.8.8.8"}} response = self.misp_modules_post(query) - self.assertEqual(self.get_values(response), '149.13.33.14') + self.assertEqual(self.get_values(response), '185.194.93.14') def test_docx(self): filename = 'test.docx' @@ -209,6 +215,25 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertEqual(self.get_values(response), '\nThis is an basic test docx file. ') + def test_censys(self): + module_name = "censys_enrich" + query = { + "attribute": {"type" : "ip-dst", "value": "8.8.8.8", "uuid": ""}, + "module": module_name, + "config": {} + } + if module_name in self.configs: + query['config'] = self.configs[module_name] + response = self.misp_modules_post(query) + + if self.configs[module_name].get('api_id') == '': + self.assertTrue(self.get_errors(response).startswith('ERROR: param ')) + else: + self.assertGreaterEqual(len(response.json().get('results', {}).get('Attribute')), 1) + else: + response = self.misp_modules_post(query) + self.assertTrue(self.get_errors(response).startswith('Please provide config options')) + def test_farsight_passivedns(self): module_name = 'farsight_passivedns' if module_name in self.configs: @@ -228,12 +253,31 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_errors(response), 'Farsight DNSDB apikey is missing') def test_haveibeenpwned(self): + module_name = 'hibp' query = {"module": "hibp", "email-src": "info@circl.lu"} response = self.misp_modules_post(query) - to_check = self.get_values(response) - if to_check == "haveibeenpwned.com API not accessible (HTTP 401)": - self.skipTest(f"haveibeenpwned blocks travis IPs: {response}") - self.assertEqual(to_check, 'OK (Not Found)', response) + if module_name in self.configs: + to_check = self.get_values(response) + if to_check == "haveibeenpwned.com API not accessible (HTTP 401)": + self.skipTest(f"haveibeenpwned blocks travis IPs: {response}") + self.assertEqual(to_check, 'OK (Not Found)', response) + else: + self.assertEqual(self.get_errors(response), 'Have I Been Pwned authentication is incomplete (no API key)') + + def test_hyasinsight(self): + module_name = "hyasinsight" + query = {"module": module_name, + "attribute": {"type": "phone-number", + "value": "+84853620279", + "uuid": "b698dc2b-94c1-487d-8b65-3114bad5a40c"}, + "config": {}} + if module_name in self.configs: + query['config'] = self.configs[module_name] + response = self.misp_modules_post(query) + self.assertEqual(self.get_values(response)['domain'], 'tienichphongnet.com') + else: + response = self.misp_modules_post(query) + self.assertEqual(self.get_errors(response), 'HYAS Insight apikey is missing') def test_greynoise(self): module_name = 'greynoise' @@ -245,7 +289,7 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_values(response), 'This IP is commonly spoofed in Internet-scan activity') except Exception: self.assertIn( - self.get_errors(reponse), + self.get_errors(response), ( "Unauthorized. Please check your API key.", "Too many requests. You've hit the rate-limit." @@ -255,6 +299,7 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), 'Missing Greynoise API key.') + @unittest.skip("Service doesn't work") def test_ipasn(self): query = {"module": "ipasn", "attribute": {"type": "ip-src", @@ -263,6 +308,22 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertEqual(self.get_object(response), 'asn') + def test_ipqs_fraud_and_risk_scoring(self): + module_name = "ipqs_fraud_and_risk_scoring" + query = {"module": module_name, + "attribute": {"type": "email", + "value": "noreply@ipqualityscore.com", + "uuid": "ea89a33b-4ab7-4515-9f02-922a0bee333d"}, + "config": {}} + if module_name in self.configs: + query['config'] = self.configs[module_name] + response = self.misp_modules_post(query) + self.assertEqual(self.get_values(response)['message'], 'Success.') + else: + response = self.misp_modules_post(query) + self.assertEqual(self.get_errors(response), 'IPQualityScore apikey is missing') + + def test_macaddess_io(self): module_name = 'macaddress_io' query = {"module": module_name, "mac-address": "44:38:39:ff:ef:57"} @@ -293,7 +354,7 @@ class TestExpansions(unittest.TestCase): encoded = b64encode(f.read()).decode() query = {"module": "ods_enrich", "attachment": filename, "data": encoded} response = self.misp_modules_post(query) - self.assertEqual(self.get_values(response), '\n column_0\n0 ods test') + self.assertEqual(self.get_values(response), '\n column.0\n0 ods test') def test_odt(self): filename = 'test.odt' @@ -305,6 +366,8 @@ class TestExpansions(unittest.TestCase): def test_onyphe(self): module_name = "onyphe" + if LiveCI: + return True query = {"module": module_name, "ip-src": "8.8.8.8"} if module_name in self.configs: query["config"] = self.configs[module_name] @@ -319,6 +382,8 @@ class TestExpansions(unittest.TestCase): def test_onyphe_full(self): module_name = "onyphe_full" + if LiveCI: + return True query = {"module": module_name, "ip-src": "8.8.8.8"} if module_name in self.configs: query["config"] = self.configs[module_name] @@ -331,6 +396,7 @@ class TestExpansions(unittest.TestCase): response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), 'Onyphe authentication is missing') + @unittest.skip("Unreliable results") def test_otx(self): query_types = ('domain', 'ip-src', 'md5') query_values = ('circl.lu', '8.8.8.8', '616eff3e9a7575ae73821b4668d2801c') @@ -348,12 +414,12 @@ class TestExpansions(unittest.TestCase): def test_passivetotal(self): module_name = "passivetotal" - query = {"module": module_name, "ip-src": "149.13.33.14", "config": {}} + query = {"module": module_name, "ip-src": "185.194.93.14", "config": {}} if module_name in self.configs: query["config"] = self.configs[module_name] response = self.misp_modules_post(query) try: - self.assertEqual(self.get_values(response), 'circl.lu') + self.assertIn('www.circl.lu', response.json()['results'][0]['values']) except Exception: self.assertIn(self.get_errors(response), ('We hit an error, time to bail!', 'API quota exceeded.')) else: @@ -394,10 +460,12 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_errors(response), "Ransomcoindb API key is missing") def test_rbl(self): + if LiveCI: + return True query = {"module": "rbl", "ip-src": "8.8.8.8"} response = self.misp_modules_post(query) try: - self.assertTrue(self.get_values(response).startswith('8.8.8.8.query.senderbase.org: "0-0=1|1=GOOGLE')) + self.assertTrue(self.get_values(response).startswith('8.8.8.8.bl.spamcannibal.org')) except Exception: self.assertEqual(self.get_errors(response), "No data found by querying known RBLs") @@ -426,11 +494,18 @@ class TestExpansions(unittest.TestCase): def test_shodan(self): module_name = "shodan" - query = {"module": module_name, "ip-src": "149.13.33.14"} + query = { + "module": module_name, + "attribute": { + "uuid": "a21aae0c-7426-4762-9b79-854314d69059", + "type": "ip-src", + "value": "149.13.33.14" + } + } if module_name in self.configs: query['config'] = self.configs[module_name] response = self.misp_modules_post(query) - self.assertIn("circl.lu", self.get_values(response)) + self.assertEqual(self.get_object(response), 'ip-api-address') else: response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), 'Shodan authentication is missing') @@ -450,23 +525,45 @@ class TestExpansions(unittest.TestCase): query = {"module": "sourcecache", "link": input_value} response = self.misp_modules_post(query) self.assertEqual(self.get_values(response), input_value) - self.assertTrue(self.get_data(response).startswith('PCFET0NUWVBFIEhUTUw+CjwhLS0KCUFyY2FuYSBieSBIVE1MN')) + self.assertTrue(self.get_data(response)) def test_stix2_pattern_validator(self): query = {"module": "stix2_pattern_syntax_validator", "stix2-pattern": "[ipv4-addr:value = '8.8.8.8']"} response = self.misp_modules_post(query) self.assertEqual(self.get_values(response), 'Syntax valid') - def test_threatcrowd(self): + if LiveCI: + return True query_types = ('domain', 'ip-src', 'md5', 'whois-registrant-email') - query_values = ('circl.lu', '149.13.33.4', '616eff3e9a7575ae73821b4668d2801c', 'hostmaster@eurodns.com') - results = ('149.13.33.14', 'cve.circl.lu', 'devilreturns.com', 'navabi.lu') + query_values = ('circl.lu', '149.13.33.14', '616eff3e9a7575ae73821b4668d2801c', 'hostmaster@eurodns.com') + results = ('149.13.33.4', 'cve.circl.lu', 'devilreturns.com', 'navabi.lu') for query_type, query_value, result in zip(query_types, query_values, results): query = {"module": "threatcrowd", query_type: query_value} response = self.misp_modules_post(query) self.assertTrue(self.get_values(response), result) + def test_crowdstrike(self): + module_name = "crowdstrike_falcon" + query = { + "attribute": {"type": "sha256", "value": "", "uuid": ""}, + "module": module_name, + "config": {} + } + if module_name in self.configs: + query['config'] = self.configs[module_name] + response = self.misp_modules_post(query) + + if self.configs[module_name].get('api_id') == '': + self.assertTrue(self.get_errors(response).startswith('HTTP Error:')) + else: + self.assertGreaterEqual(len(response.json().get('results', {}).get('Attribute')), 1) + else: + response = self.misp_modules_post(query) + self.assertTrue(self.get_errors(response).startswith('CrowdStrike apikey is missing')) + def test_threatminer(self): + if LiveCI: + return True query_types = ('domain', 'ip-src', 'md5') query_values = ('circl.lu', '149.13.33.4', 'b538dbc6160ef54f755a540e06dc27cd980fc4a12005e90b3627febb44a1a90f') results = ('149.13.33.14', 'f6ecb9d5c21defb1f622364a30cb8274f817a1a2', 'http://www.circl.lu/') @@ -509,16 +606,33 @@ class TestExpansions(unittest.TestCase): def test_virustotal_public(self): module_name = "virustotal_public" - query_types = ('domain', 'ip-src', 'sha256', 'url') - query_values = ('circl.lu', '149.13.33.14', - 'a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3', - 'http://194.169.88.56:49151/.i') + attributes = ( + { + "uuid": "ffea0594-355a-42fe-9b98-fad28fd248b3", + "type": "domain", + "value": "circl.lu" + }, + { + "uuid": "1f3f0f2d-5143-4b05-a0f1-8ac82f51a979", + "type": "ip-src", + "value": "149.13.33.14" + }, + { + "uuid": "b4be6652-f4ff-4515-ae63-3f016df37e8f", + "type": "sha256", + "value": "a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3" + }, + { + "uuid": "6cead544-b683-48cb-b19b-a2561ffa1f51", + "type": "url", + "value": "http://194.169.88.56:49151/.i" + } + ) results = ('whois', 'asn', 'file', 'virustotal-report') if module_name in self.configs: - for query_type, query_value, result in zip(query_types, query_values, results): + for attribute, result in zip(attributes, results): query = {"module": module_name, - "attribute": {"type": query_type, - "value": query_value}, + "attribute": attribute, "config": self.configs[module_name]} response = self.misp_modules_post(query) try: @@ -526,24 +640,42 @@ class TestExpansions(unittest.TestCase): except Exception: self.assertEqual(self.get_errors(response), "VirusTotal request rate limit exceeded.") else: - query = {"module": module_name, - "attribute": {"type": query_types[0], - "value": query_values[0]}} + query = { + "module": module_name, + "attribute": attributes[0] + } response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), "A VirusTotal api key is required for this module.") def test_virustotal(self): module_name = "virustotal" - query_types = ('domain', 'ip-src', 'sha256', 'url') - query_values = ('circl.lu', '149.13.33.14', - 'a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3', - 'http://194.169.88.56:49151/.i') + attributes = ( + { + "uuid": "ffea0594-355a-42fe-9b98-fad28fd248b3", + "type": "domain", + "value": "circl.lu" + }, + { + "uuid": "1f3f0f2d-5143-4b05-a0f1-8ac82f51a979", + "type": "ip-src", + "value": "149.13.33.14" + }, + { + "uuid": "b4be6652-f4ff-4515-ae63-3f016df37e8f", + "type": "sha256", + "value": "a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3" + }, + { + "uuid": "6cead544-b683-48cb-b19b-a2561ffa1f51", + "type": "url", + "value": "http://194.169.88.56:49151/.i" + } + ) results = ('domain-ip', 'asn', 'virustotal-report', 'virustotal-report') if module_name in self.configs: - for query_type, query_value, result in zip(query_types, query_values, results): + for attribute, result in zip(attributes, results): query = {"module": module_name, - "attribute": {"type": query_type, - "value": query_value}, + "attribute": attribute, "config": self.configs[module_name]} response = self.misp_modules_post(query) try: @@ -551,9 +683,10 @@ class TestExpansions(unittest.TestCase): except Exception: self.assertEqual(self.get_errors(response), "VirusTotal request rate limit exceeded.") else: - query = {"module": module_name, - "attribute": {"type": query_types[0], - "value": query_values[0]}} + query = { + "module": module_name, + "attribute": attributes[0] + } response = self.misp_modules_post(query) self.assertEqual(self.get_errors(response), "A VirusTotal api key is required for this module.") @@ -602,6 +735,8 @@ class TestExpansions(unittest.TestCase): self.assertEqual(self.get_errors(response), "An API authentication is required (key and password).") def test_xlsx(self): + if LiveCI: + return True filename = 'test.xlsx' with open(f'{self.dirname}/test_files/{filename}', 'rb') as f: encoded = b64encode(f.read()).decode()