assemblyline 4.7.5.dev145__tar.gz → 4.7.5.dev150__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {assemblyline-4.7.5.dev145/assemblyline.egg-info → assemblyline-4.7.5.dev150}/PKG-INFO +7 -19
- assemblyline-4.7.5.dev150/assemblyline/VERSION +1 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/custom.yara +1 -1
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/identify.py +10 -2
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/identify_defaults.py +3 -1
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/postprocess.py +4 -22
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/safe_archive.py +1 -4
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/s3.py +7 -2
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/randomizer.py +1 -1
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/run/cli.py +1 -1
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150/assemblyline.egg-info}/PKG-INFO +7 -19
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline.egg-info/SOURCES.txt +4 -3
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline.egg-info/entry_points.txt +1 -0
- assemblyline-4.7.5.dev150/assemblyline.egg-info/top_level.txt +7 -0
- assemblyline-4.7.5.dev150/dev/core/config/classification.yml +1 -0
- assemblyline-4.7.5.dev150/external/generate_attack_map.py +220 -0
- assemblyline-4.7.5.dev150/external/generate_tlds.py +53 -0
- assemblyline-4.7.5.dev150/pyproject.toml +114 -0
- assemblyline-4.7.5.dev150/setup.cfg +4 -0
- assemblyline-4.7.5.dev145/assemblyline/VERSION +0 -1
- assemblyline-4.7.5.dev145/assemblyline.egg-info/top_level.txt +0 -1
- assemblyline-4.7.5.dev145/pyproject.toml +0 -6
- assemblyline-4.7.5.dev145/setup.cfg +0 -10
- assemblyline-4.7.5.dev145/setup.py +0 -100
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/LICENCE.md +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/MANIFEST.in +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/README.md +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/cachestore/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/archiving.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/attack_map.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/backupmanager.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/banner.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/bundling.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/caching.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/chunk.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/classification.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/classification.yml +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/cleanup_filestore.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/codec.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/comms.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/constants.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/custom.magic +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/dict_utils.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/digests.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/dispatcher.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/entropy.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/exceptions.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/file.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/forge.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/heuristics.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/hexdump.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/importing.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/iprange.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/isotime.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/log.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/logformat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/lucene.lark +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/memory_zip.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/metrics.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/net.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/net_static.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/null.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/path.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/random_user.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/security.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/signaturing.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/str_utils.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/tag_safelist.yml +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/tagging.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/threading.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/uid.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/version.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datasource/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datasource/al.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datasource/alert.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datasource/common.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datastore/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datastore/bulk.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datastore/collection.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datastore/exceptions.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datastore/helper.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datastore/store.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datastore/support/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datastore/support/build.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/datastore/support/schemas.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/filestore/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/azure.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/base.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/ftp.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/http.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/local.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/sftp.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/base.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/common.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/alert.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/alerter_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/archive_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/changes.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/dispatcher_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/dispatching.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/elastic_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/expiry_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/ingest_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/metrics.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/retrohunt_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/scaler_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/scaler_status_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/service_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/service_timing_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/submission.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/task.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/vacuum_heartbeat.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/actions.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/alert.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/apikey.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/badlist.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/cached_file.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/config.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/emptyresult.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/error.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/file.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/filescore.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/heuristic.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/file.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/filetypes/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/filetypes/pe.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/ontology.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/antivirus.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/http.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/malware_config.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/network.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/process.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/sandbox.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/signature.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/replay.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/result.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/retrohunt.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/safelist.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/service.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/service_delta.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/signature.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/statistics.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/submission.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/submission_summary.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/submission_tree.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/tagging.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/user.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/user_favorites.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/user_settings.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/workflow.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/random_data/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/random_data/create_test_data.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/random_data/sample_rules.yar +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/odm/random_data/sample_suricata.rules +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/py.typed +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/cache.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/counters.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/daily_quota_tracker.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/events.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/exporting_counter.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/hash.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/lock.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/queues/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/queues/comms.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/queues/multi.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/queues/named.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/queues/priority.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/set.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/user_quota_tracker.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/run/__init__.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/run/pubsub_reader.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/run/suricata_importer.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/run/yara_importer.py +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline.egg-info/dependency_links.txt +0 -0
- {assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline.egg-info/requires.txt +0 -0
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: assemblyline
|
|
3
|
-
Version: 4.7.5.
|
|
3
|
+
Version: 4.7.5.dev150
|
|
4
4
|
Summary: Assemblyline 4 - Automated malware analysis framework
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
Keywords: assemblyline automated malware analysis gc canada cse-cst cse cst cyber cccs
|
|
5
|
+
Author-email: CCCS Assemblyline development team <assemblyline@cyber.gc.ca>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Repository, https://github.com/CybercentreCanada/assemblyline-base
|
|
8
|
+
Keywords: assemblyline,automated,malware,analysis,gc,canada,cse-cst,cse,cst,cyber,cccs
|
|
10
9
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
10
|
Classifier: Intended Audience :: Developers
|
|
12
11
|
Classifier: Topic :: Software Development :: Libraries
|
|
13
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
15
12
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
14
|
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Requires-Python: >=3.11
|
|
18
17
|
Description-Content-Type: text/markdown
|
|
19
18
|
License-File: LICENCE.md
|
|
20
19
|
Requires-Dist: arrow
|
|
@@ -54,18 +53,7 @@ Requires-Dist: retrying; extra == "test"
|
|
|
54
53
|
Requires-Dist: pytest-mock; extra == "test"
|
|
55
54
|
Requires-Dist: pyftpdlib; extra == "test"
|
|
56
55
|
Requires-Dist: pyopenssl==23.3.0; extra == "test"
|
|
57
|
-
Dynamic: author
|
|
58
|
-
Dynamic: author-email
|
|
59
|
-
Dynamic: classifier
|
|
60
|
-
Dynamic: description
|
|
61
|
-
Dynamic: description-content-type
|
|
62
|
-
Dynamic: home-page
|
|
63
|
-
Dynamic: keywords
|
|
64
|
-
Dynamic: license
|
|
65
56
|
Dynamic: license-file
|
|
66
|
-
Dynamic: provides-extra
|
|
67
|
-
Dynamic: requires-dist
|
|
68
|
-
Dynamic: summary
|
|
69
57
|
|
|
70
58
|
[](https://discord.gg/GUAy9wErNu)
|
|
71
59
|
[](https://discord.gg/GUAy9wErNu)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.7.5.dev150
|
|
@@ -392,7 +392,12 @@ class Identify:
|
|
|
392
392
|
return data
|
|
393
393
|
except Exception:
|
|
394
394
|
pass
|
|
395
|
-
|
|
395
|
+
elif data["mime"] == "application/x-coff":
|
|
396
|
+
# We recognize this as a COFF (Common Object File Format) executable for Linux
|
|
397
|
+
if data["magic"].startswith("Intel i386") or data["magic"].startswith("Intel 80386"):
|
|
398
|
+
# This indicates a 32-bit COFF executable for Linux
|
|
399
|
+
data["type"] = "executable/linux/coff32"
|
|
400
|
+
return data
|
|
396
401
|
if data["type"] == "text/plain":
|
|
397
402
|
# Check if the file is a misidentified json first before running the yara rules
|
|
398
403
|
try:
|
|
@@ -635,7 +640,7 @@ def uri_ident(path: str, info: Dict) -> str:
|
|
|
635
640
|
return f"uri/{u.scheme}"
|
|
636
641
|
|
|
637
642
|
|
|
638
|
-
|
|
643
|
+
def shell_main():
|
|
639
644
|
from pprint import pprint
|
|
640
645
|
|
|
641
646
|
use_cache = True
|
|
@@ -682,3 +687,6 @@ if __name__ == "__main__":
|
|
|
682
687
|
)
|
|
683
688
|
)
|
|
684
689
|
name = sys.stdin.readline().strip()
|
|
690
|
+
|
|
691
|
+
if __name__ == "__main__":
|
|
692
|
+
shell_main()
|
{assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/common/identify_defaults.py
RENAMED
|
@@ -113,6 +113,7 @@ magic_patterns = [
|
|
|
113
113
|
{"al_type": "executable/windows/ia/pe64", "regex": r"pe32\+?[^\|]+Intel Itanium[^\|]+windows"},
|
|
114
114
|
{"al_type": "executable/windows/arm/dll64", "regex": r"pe32\+?[^\|]+dll[^\|]+Aarch64[^\|]+windows"},
|
|
115
115
|
{"al_type": "executable/windows/arm/pe64", "regex": r"pe32\+?[^\|]+Aarch64[^\|]+windows"},
|
|
116
|
+
{"al_type": "executable/windows/pe64", "regex": r"pe with unknown[^\|]+windows[^\|]+x86-64"},
|
|
116
117
|
{"al_type": "executable/windows/pe", "regex": r"pe unknown[^\|]+windows"},
|
|
117
118
|
# Supported by https://github.com/mitre/multiscanner/blob/86e0145ba3c4a34611f257dc78cd2482ed6358db/multiscanner/modules/Metadata/fileextensions.py#L183
|
|
118
119
|
# Supported by https://github.com/mitre/multiscanner/blob/86e0145ba3c4a34611f257dc78cd2482ed6358db/multiscanner/modules/Metadata/fileextensions.py#L185
|
|
@@ -131,7 +132,7 @@ magic_patterns = [
|
|
|
131
132
|
{"al_type": "executable/linux/coff32", "regex": r"^(Intel 80386|i386|80386) COFF"},
|
|
132
133
|
{"al_type": "executable/linux/coff64", "regex": r"^64-bit XCOFF"},
|
|
133
134
|
{"al_type": "executable/linux/ia/coff64", "regex": r"^Intel ia64 COFF"},
|
|
134
|
-
{"al_type": "executable/linux/
|
|
135
|
+
{"al_type": "executable/linux/mips/ecoff", "regex": r"^MIPS[^\|]+ ECOFF"},
|
|
135
136
|
{"al_type": "executable/linux/a.out", "regex": r"^a.out"},
|
|
136
137
|
# Supported by https://github.com/EmersonElectricCo/fsf/blob/15303aa298414397f9aa5d19ca343040a0fe0bbd/fsf-server/yara/ft_macho.yara
|
|
137
138
|
{"al_type": "executable/mach-o", "regex": r"^Mach-O"},
|
|
@@ -242,6 +243,7 @@ magic_patterns = [
|
|
|
242
243
|
]
|
|
243
244
|
|
|
244
245
|
# LibMagic mimetypes that we blindly trust to assign an Assemblyline type
|
|
246
|
+
# Ref: https://www.rfc-editor.org/info/rfc6838/#section-3.2 for vendor-specific MIMEs
|
|
245
247
|
trusted_mimes = {
|
|
246
248
|
# Mpeg Audio
|
|
247
249
|
"audio/mp2": "audio/mp2",
|
|
@@ -3,34 +3,16 @@ import operator
|
|
|
3
3
|
import datetime
|
|
4
4
|
import fnmatch
|
|
5
5
|
import re
|
|
6
|
-
import json
|
|
7
|
-
import threading
|
|
8
6
|
from typing import Any, Union, Optional
|
|
9
7
|
import logging
|
|
10
|
-
import random
|
|
11
|
-
import time
|
|
12
|
-
import asyncio
|
|
13
|
-
import ssl
|
|
14
|
-
import tempfile
|
|
15
|
-
|
|
16
|
-
import yaml
|
|
17
|
-
import aiohttp
|
|
18
8
|
import lark
|
|
19
9
|
import datemath
|
|
20
10
|
import arrow
|
|
21
11
|
|
|
22
|
-
from assemblyline.cachestore import CacheStore
|
|
23
|
-
from assemblyline.common.uid import get_random_id
|
|
24
|
-
from assemblyline.common.constants import CONFIG_HASH, POST_PROCESS_CONFIG_KEY
|
|
25
12
|
from assemblyline.odm import base as odm
|
|
26
|
-
from assemblyline.odm.models.actions import DEFAULT_POSTPROCESS_ACTIONS, PostprocessAction, Webhook
|
|
27
13
|
from assemblyline.odm.models.submission import Submission
|
|
28
|
-
from assemblyline.odm.messages.submission import Submission as SubmissionMessage
|
|
14
|
+
from assemblyline.odm.messages.submission import Submission as SubmissionMessage
|
|
29
15
|
from assemblyline.odm.models.tagging import Tagging
|
|
30
|
-
from assemblyline.remote.datatypes.events import EventWatcher
|
|
31
|
-
from assemblyline.remote.datatypes.queues.named import NamedQueue
|
|
32
|
-
from assemblyline.remote.datatypes.queues.priority import PriorityQueue
|
|
33
|
-
from assemblyline.remote.datatypes.hash import Hash
|
|
34
16
|
|
|
35
17
|
|
|
36
18
|
logger = logging.getLogger(__name__)
|
|
@@ -249,7 +231,9 @@ class MatchOperation(NodeInterface):
|
|
|
249
231
|
self.regex = True
|
|
250
232
|
else:
|
|
251
233
|
pattern = fnmatch.translate(self.search)
|
|
252
|
-
|
|
234
|
+
# Support different case depending on Python version
|
|
235
|
+
# Ref: https://github.com/python/cpython/pull/133314
|
|
236
|
+
if pattern.endswith('\\z') or pattern.endswith('\\Z'):
|
|
253
237
|
pattern = pattern[0:-2]
|
|
254
238
|
# if pattern.startswith('(?s:') and pattern.endswith(")"):
|
|
255
239
|
# pattern = pattern[4:-1]
|
|
@@ -568,5 +552,3 @@ class SubmissionFilter:
|
|
|
568
552
|
|
|
569
553
|
def __repr__(self) -> str:
|
|
570
554
|
return '<SubmissionFilter ' + str(self.expression) + '>'
|
|
571
|
-
|
|
572
|
-
|
|
@@ -50,10 +50,7 @@ def safe_extract_tar(tar: Union[str, tarfile.TarFile], dest: str) -> None:
|
|
|
50
50
|
owns = isinstance(tar, str)
|
|
51
51
|
tf = tarfile.open(tar) if owns else tar
|
|
52
52
|
try:
|
|
53
|
-
|
|
54
|
-
tf.extractall(dest, filter="data")
|
|
55
|
-
else:
|
|
56
|
-
tf.extractall(dest, members=list(safe_tar_members(tf, dest)))
|
|
53
|
+
tf.extractall(dest, filter="data")
|
|
57
54
|
finally:
|
|
58
55
|
if owns:
|
|
59
56
|
tf.close()
|
{assemblyline-4.7.5.dev145 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/s3.py
RENAMED
|
@@ -160,7 +160,10 @@ class TransportS3(Transport):
|
|
|
160
160
|
return 1
|
|
161
161
|
|
|
162
162
|
def delete_batch(self, file_list: Iterable[str]):
|
|
163
|
-
"""Deletes a batch of files.
|
|
163
|
+
"""Deletes a batch of files using the DeleteObjects API.
|
|
164
|
+
|
|
165
|
+
Reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html
|
|
166
|
+
"""
|
|
164
167
|
if not self.use_batch_delete:
|
|
165
168
|
return super().delete_batch(file_list)
|
|
166
169
|
|
|
@@ -175,7 +178,9 @@ class TransportS3(Transport):
|
|
|
175
178
|
},
|
|
176
179
|
)
|
|
177
180
|
|
|
178
|
-
if response
|
|
181
|
+
# Check if there any errors returned as part of the response
|
|
182
|
+
if response.get('Errors'):
|
|
183
|
+
# If there are errors, we raise an exception with the first error message.
|
|
179
184
|
raise TransportException('Could not delete some member of batch', response['Errors'][0]['Message'])
|
|
180
185
|
|
|
181
186
|
def exists(self, path):
|
|
@@ -365,7 +365,7 @@ def random_data_for_field(field, name: str, minimal: bool = False) -> _Any:
|
|
|
365
365
|
if '\\u00a1-\\U0010ffff' in field.validation_regex.pattern:
|
|
366
366
|
value = get_random_host()
|
|
367
367
|
if field.validation_regex.match(value):
|
|
368
|
-
return value
|
|
368
|
+
return value
|
|
369
369
|
# Generate value based on regex pattern
|
|
370
370
|
return rstr.xeger(field.validation_regex)
|
|
371
371
|
elif isinstance(field, Keyword) or isinstance(field, EmptyableKeyword):
|
|
@@ -512,7 +512,7 @@ class ALCommandLineInterface(cmd.Cmd): # pylint:disable=R0904
|
|
|
512
512
|
|
|
513
513
|
if cont:
|
|
514
514
|
if full and index == 'submission':
|
|
515
|
-
pool = multiprocessing.Pool(processes=PROCESSES_COUNT, initializer=init)
|
|
515
|
+
pool = multiprocessing.Pool(processes=min(PROCESSES_COUNT, test_data['total']), initializer=init)
|
|
516
516
|
for data in collection.stream_search(query, fl="id", item_buffer_size=COUNT_INCREMENT):
|
|
517
517
|
pool.apply_async(submission_delete_tree, (data.id, self.logger), callback=action_done)
|
|
518
518
|
else:
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: assemblyline
|
|
3
|
-
Version: 4.7.5.
|
|
3
|
+
Version: 4.7.5.dev150
|
|
4
4
|
Summary: Assemblyline 4 - Automated malware analysis framework
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
Keywords: assemblyline automated malware analysis gc canada cse-cst cse cst cyber cccs
|
|
5
|
+
Author-email: CCCS Assemblyline development team <assemblyline@cyber.gc.ca>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Repository, https://github.com/CybercentreCanada/assemblyline-base
|
|
8
|
+
Keywords: assemblyline,automated,malware,analysis,gc,canada,cse-cst,cse,cst,cyber,cccs
|
|
10
9
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
10
|
Classifier: Intended Audience :: Developers
|
|
12
11
|
Classifier: Topic :: Software Development :: Libraries
|
|
13
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
15
12
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
14
|
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Requires-Python: >=3.11
|
|
18
17
|
Description-Content-Type: text/markdown
|
|
19
18
|
License-File: LICENCE.md
|
|
20
19
|
Requires-Dist: arrow
|
|
@@ -54,18 +53,7 @@ Requires-Dist: retrying; extra == "test"
|
|
|
54
53
|
Requires-Dist: pytest-mock; extra == "test"
|
|
55
54
|
Requires-Dist: pyftpdlib; extra == "test"
|
|
56
55
|
Requires-Dist: pyopenssl==23.3.0; extra == "test"
|
|
57
|
-
Dynamic: author
|
|
58
|
-
Dynamic: author-email
|
|
59
|
-
Dynamic: classifier
|
|
60
|
-
Dynamic: description
|
|
61
|
-
Dynamic: description-content-type
|
|
62
|
-
Dynamic: home-page
|
|
63
|
-
Dynamic: keywords
|
|
64
|
-
Dynamic: license
|
|
65
56
|
Dynamic: license-file
|
|
66
|
-
Dynamic: provides-extra
|
|
67
|
-
Dynamic: requires-dist
|
|
68
|
-
Dynamic: summary
|
|
69
57
|
|
|
70
58
|
[](https://discord.gg/GUAy9wErNu)
|
|
71
59
|
[](https://discord.gg/GUAy9wErNu)
|
|
@@ -2,8 +2,6 @@ LICENCE.md
|
|
|
2
2
|
MANIFEST.in
|
|
3
3
|
README.md
|
|
4
4
|
pyproject.toml
|
|
5
|
-
setup.cfg
|
|
6
|
-
setup.py
|
|
7
5
|
assemblyline/VERSION
|
|
8
6
|
assemblyline/__init__.py
|
|
9
7
|
assemblyline/py.typed
|
|
@@ -174,4 +172,7 @@ assemblyline/run/__init__.py
|
|
|
174
172
|
assemblyline/run/cli.py
|
|
175
173
|
assemblyline/run/pubsub_reader.py
|
|
176
174
|
assemblyline/run/suricata_importer.py
|
|
177
|
-
assemblyline/run/yara_importer.py
|
|
175
|
+
assemblyline/run/yara_importer.py
|
|
176
|
+
dev/core/config/classification.yml
|
|
177
|
+
external/generate_attack_map.py
|
|
178
|
+
external/generate_tlds.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
enforce: true
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import shutil
|
|
2
|
+
import subprocess
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
from pprint import pformat
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
|
|
8
|
+
from stix2 import FileSystemSource, CompositeDataSource, Filter
|
|
9
|
+
from stix2.utils import get_type_from_id
|
|
10
|
+
|
|
11
|
+
CTI_BASE = "/tmp/cti_git"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def clone_cti(base=CTI_BASE):
|
|
15
|
+
print("Preparing CTI git repo...")
|
|
16
|
+
|
|
17
|
+
if os.path.exists(base):
|
|
18
|
+
shutil.rmtree(base)
|
|
19
|
+
|
|
20
|
+
subprocess.check_call(["git", "clone", "https://github.com/mitre/cti.git", base])
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def load_datasource(base=CTI_BASE):
|
|
24
|
+
print("Loading CTI datasources map...")
|
|
25
|
+
enterprise_attack_fs = FileSystemSource(os.path.join(base, "enterprise-attack"))
|
|
26
|
+
mobile_attack_fs = FileSystemSource(os.path.join(base, "mobile-attack"))
|
|
27
|
+
|
|
28
|
+
composite_ds = CompositeDataSource()
|
|
29
|
+
composite_ds.add_data_sources([enterprise_attack_fs, mobile_attack_fs])
|
|
30
|
+
return composite_ds
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def get_revoked_by(stix_id, thesrc):
|
|
34
|
+
relations = thesrc.relationships(stix_id, 'revoked-by', source_only=True)
|
|
35
|
+
revoked_by = thesrc.query([
|
|
36
|
+
Filter('id', 'in', [r.target_ref for r in relations]),
|
|
37
|
+
Filter('revoked', '=', False)
|
|
38
|
+
])
|
|
39
|
+
revoke_id = None
|
|
40
|
+
if revoked_by:
|
|
41
|
+
revoked_by = revoked_by[0]
|
|
42
|
+
|
|
43
|
+
for er in revoked_by['external_references']:
|
|
44
|
+
if er['source_name'] in ["mitre-attack", "mobile-mitre-attack", "mitre-mobile-attack"]:
|
|
45
|
+
revoke_id = er['external_id']
|
|
46
|
+
break
|
|
47
|
+
|
|
48
|
+
return revoke_id
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def get_attack_map(composite_ds):
|
|
52
|
+
print("Parsing attack patterns ...")
|
|
53
|
+
att_filter = Filter('type', '=', 'attack-pattern')
|
|
54
|
+
|
|
55
|
+
attack_map = {}
|
|
56
|
+
revoke_map = {}
|
|
57
|
+
|
|
58
|
+
for item in composite_ds.query(att_filter):
|
|
59
|
+
name = item['name']
|
|
60
|
+
|
|
61
|
+
attack_id = None
|
|
62
|
+
for er in item['external_references']:
|
|
63
|
+
if er['source_name'] in ["mitre-attack", "mobile-mitre-attack", "mitre-mobile-attack"]:
|
|
64
|
+
attack_id = er['external_id']
|
|
65
|
+
break
|
|
66
|
+
|
|
67
|
+
if attack_id:
|
|
68
|
+
if not item['revoked']:
|
|
69
|
+
categories = [x['phase_name'] for x in item['kill_chain_phases']]
|
|
70
|
+
desc = item['description']
|
|
71
|
+
platforms = item['x_mitre_platforms']
|
|
72
|
+
|
|
73
|
+
attack_map[attack_id] = {
|
|
74
|
+
"name": name,
|
|
75
|
+
"categories": categories,
|
|
76
|
+
"description": desc,
|
|
77
|
+
"platforms": platforms,
|
|
78
|
+
"attack_id": attack_id
|
|
79
|
+
}
|
|
80
|
+
print(f"\tAdding {name.upper()} as ID: {attack_id}")
|
|
81
|
+
else:
|
|
82
|
+
revoke_id = get_revoked_by(item['id'], composite_ds)
|
|
83
|
+
if revoke_id is None:
|
|
84
|
+
print(f"\t[WARN] {name.upper()} ({attack_id}) has been revoked without being replaced.")
|
|
85
|
+
else:
|
|
86
|
+
revoke_map[attack_id] = revoke_id
|
|
87
|
+
print(f"\tAdding revoked {name.upper()} to the revoked map: {attack_id} => {revoke_id}")
|
|
88
|
+
else:
|
|
89
|
+
print(f"[ERR] Ignored {name.upper()}: No attack ID found.")
|
|
90
|
+
|
|
91
|
+
return attack_map, revoke_map
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def get_software_map(composite_ds):
|
|
95
|
+
print("Parsing softwares ...")
|
|
96
|
+
malware_filter = Filter('type', '=', 'malware')
|
|
97
|
+
tool_filter = Filter('type', '=', 'tool')
|
|
98
|
+
|
|
99
|
+
software_map = {}
|
|
100
|
+
revoke_map = {}
|
|
101
|
+
|
|
102
|
+
for cur_filter in [malware_filter, tool_filter]:
|
|
103
|
+
for item in composite_ds.query(cur_filter):
|
|
104
|
+
name = item['name']
|
|
105
|
+
|
|
106
|
+
software_id = None
|
|
107
|
+
for er in item['external_references']:
|
|
108
|
+
if er['source_name'] in ["mitre-attack", "mobile-mitre-attack", "mitre-mobile-attack"]:
|
|
109
|
+
software_id = er['external_id']
|
|
110
|
+
break
|
|
111
|
+
|
|
112
|
+
if software_id:
|
|
113
|
+
if not item['revoked']:
|
|
114
|
+
if cur_filter == malware_filter:
|
|
115
|
+
soft_type = 'malware'
|
|
116
|
+
else:
|
|
117
|
+
soft_type = 'tool'
|
|
118
|
+
|
|
119
|
+
desc = item['description']
|
|
120
|
+
platforms = item.get('x_mitre_platforms') or []
|
|
121
|
+
|
|
122
|
+
related_attack_ids = []
|
|
123
|
+
attack_pattern_refs = [r.target_ref
|
|
124
|
+
for r in composite_ds.relationships(item, 'uses', source_only=True)
|
|
125
|
+
if get_type_from_id(r.target_ref) == 'attack-pattern']
|
|
126
|
+
for attack_item in composite_ds.query([Filter('type', '=', 'attack-pattern'),
|
|
127
|
+
Filter('id', 'in', attack_pattern_refs)]):
|
|
128
|
+
for er in attack_item['external_references']:
|
|
129
|
+
if er['source_name'] in ["mitre-attack", "mobile-mitre-attack", "mitre-mobile-attack"]:
|
|
130
|
+
related_attack_ids.append(er['external_id'])
|
|
131
|
+
break
|
|
132
|
+
|
|
133
|
+
software_map[software_id] = {
|
|
134
|
+
"name": name,
|
|
135
|
+
"description": desc,
|
|
136
|
+
"platforms": platforms,
|
|
137
|
+
"software_id": software_id,
|
|
138
|
+
"type": soft_type,
|
|
139
|
+
"attack_ids": related_attack_ids
|
|
140
|
+
}
|
|
141
|
+
print(f"\tAdding {name.upper()} as ID: {software_id}")
|
|
142
|
+
else:
|
|
143
|
+
revoke_id = get_revoked_by(item['id'], composite_ds)
|
|
144
|
+
if revoke_id is None:
|
|
145
|
+
print(f"\t[WARN] {name.upper()} ({software_id}) has been revoked without being replaced.")
|
|
146
|
+
else:
|
|
147
|
+
revoke_map[software_id] = revoke_id
|
|
148
|
+
print(f"\tAdding revoked {name.upper()} to the revoked map: {software_id} => {revoke_id}")
|
|
149
|
+
else:
|
|
150
|
+
print(f"[ERR] Ignored {name.upper()}: No attack ID found.")
|
|
151
|
+
|
|
152
|
+
return software_map, revoke_map
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def get_group_map(composite_ds):
|
|
156
|
+
print("Parsing intrusion sets ...")
|
|
157
|
+
group_filter = Filter('type', '=', 'intrusion-set')
|
|
158
|
+
|
|
159
|
+
group_map = {}
|
|
160
|
+
revoke_map = {}
|
|
161
|
+
|
|
162
|
+
for item in composite_ds.query(group_filter):
|
|
163
|
+
name = item['name']
|
|
164
|
+
|
|
165
|
+
group_id = None
|
|
166
|
+
for er in item['external_references']:
|
|
167
|
+
if er['source_name'] in ["mitre-attack", "mobile-mitre-attack", "mitre-mobile-attack"]:
|
|
168
|
+
group_id = er['external_id']
|
|
169
|
+
break
|
|
170
|
+
|
|
171
|
+
if group_id:
|
|
172
|
+
if not item['revoked']:
|
|
173
|
+
group_map[group_id] = {
|
|
174
|
+
"name": name,
|
|
175
|
+
"description": item['description'],
|
|
176
|
+
"group_id": group_id
|
|
177
|
+
}
|
|
178
|
+
print(f"\tAdding {name.upper()} as ID: {group_id}")
|
|
179
|
+
else:
|
|
180
|
+
revoke_id = get_revoked_by(item['id'], composite_ds)
|
|
181
|
+
if revoke_id is None:
|
|
182
|
+
print(f"\t[WARN] {name.upper()} ({group_id}) has been revoked without being replaced.")
|
|
183
|
+
else:
|
|
184
|
+
revoke_map[group_id] = revoke_id
|
|
185
|
+
print(f"\tAdding revoked {name.upper()} to the revoked map: {group_id} => {revoke_id}")
|
|
186
|
+
else:
|
|
187
|
+
print(f"[ERR] Ignored {name.upper()}: No group ID found.")
|
|
188
|
+
|
|
189
|
+
return group_map, revoke_map
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
if __name__ == "__main__":
|
|
193
|
+
attack_map_location = "../assemblyline/common/attack_map.py"
|
|
194
|
+
if not os.path.exists(attack_map_location):
|
|
195
|
+
print("Could not find attack_map.py file. Make sure you run this script "
|
|
196
|
+
"in its home directory otherwise this won't work.")
|
|
197
|
+
exit(1)
|
|
198
|
+
|
|
199
|
+
clone_cti()
|
|
200
|
+
datasource = load_datasource()
|
|
201
|
+
|
|
202
|
+
att_map, att_rev_map = get_attack_map(datasource)
|
|
203
|
+
soft_map, soft_rev_map = get_software_map(datasource)
|
|
204
|
+
grp_map, grp_rev_map = get_group_map(datasource)
|
|
205
|
+
|
|
206
|
+
revoke_map = att_rev_map
|
|
207
|
+
revoke_map.update(soft_rev_map)
|
|
208
|
+
revoke_map.update(grp_rev_map)
|
|
209
|
+
|
|
210
|
+
with open(attack_map_location, "w") as attack_map_fh:
|
|
211
|
+
attack_map_fh.write("# This file is generated using generate_attack_map.py script\n"
|
|
212
|
+
"# DO NOT EDIT! Re-run the script instead...\n"
|
|
213
|
+
f"# Last ran: {datetime.now()}\n\n"
|
|
214
|
+
f"attack_map = {{\n {pformat(att_map, width=120)[1:-1]}\n}}\n\n"
|
|
215
|
+
f"software_map = {{\n {pformat(soft_map, width=120)[1:-1]}\n}}\n\n"
|
|
216
|
+
f"group_map = {{\n {pformat(grp_map, width=120)[1:-1]}\n}}\n\n"
|
|
217
|
+
f"revoke_map = {{\n {pformat(revoke_map, width=120)[1:-1]}\n}}\n")
|
|
218
|
+
|
|
219
|
+
print(f"Attack map file written into: {attack_map_location}")
|
|
220
|
+
print("You can now commit the new attack file to your git.")
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import requests
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def get_tlds(url):
|
|
6
|
+
comments = []
|
|
7
|
+
tlds = []
|
|
8
|
+
|
|
9
|
+
response = requests.get(url)
|
|
10
|
+
for line in response.text.splitlines():
|
|
11
|
+
if not line:
|
|
12
|
+
continue
|
|
13
|
+
if line.startswith('#'):
|
|
14
|
+
comments.append(line)
|
|
15
|
+
else:
|
|
16
|
+
tlds.append(line)
|
|
17
|
+
|
|
18
|
+
return comments, tlds
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_special_tlds(url):
|
|
22
|
+
response = requests.get(url)
|
|
23
|
+
# Ignore first line from CSV and return list of domains without the period suffix
|
|
24
|
+
return [line.split(',', 1)[0][:-1].upper() for line in response.text.splitlines()[1:]]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
if __name__ == "__main__":
|
|
28
|
+
tlds_url = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'
|
|
29
|
+
tlds_location = "../assemblyline/common/net_static.py"
|
|
30
|
+
if not os.path.exists(tlds_location):
|
|
31
|
+
print("Could not find net_static.py file. Make sure you run this script "
|
|
32
|
+
"in its home directory otherwise this won't work.")
|
|
33
|
+
exit(1)
|
|
34
|
+
|
|
35
|
+
comments, tlds = get_tlds(tlds_url)
|
|
36
|
+
comments_lines = '\n'.join(comments)
|
|
37
|
+
tlds_lines = '",\n "'.join(tlds)
|
|
38
|
+
|
|
39
|
+
special_tlds_url = "https://www.iana.org/assignments/special-use-domain-names/special-use-domain.csv"
|
|
40
|
+
special_tlds = get_special_tlds(special_tlds_url)
|
|
41
|
+
special_tlds_lines = '",\n "'.join(special_tlds)
|
|
42
|
+
|
|
43
|
+
with open(tlds_location, "w") as tlds_fh:
|
|
44
|
+
tlds_fh.write("# This file is generated using generate_tlds.py script\n"
|
|
45
|
+
"# DO NOT EDIT! Re-run the script instead...\n\n"
|
|
46
|
+
f"# Top level domains from: {tlds_url}\n"
|
|
47
|
+
f"{comments_lines}\n"
|
|
48
|
+
f"TLDS_ALPHA_BY_DOMAIN = {{\n \"{tlds_lines}\"\n}}\n\n"
|
|
49
|
+
f"# Special-use TLDs from: {special_tlds_url}\n"
|
|
50
|
+
f"TLDS_SPECIAL_BY_DOMAIN = {{\n \"{special_tlds_lines}\"\n}}")
|
|
51
|
+
|
|
52
|
+
print(f"TLDS list file written into: {tlds_location}")
|
|
53
|
+
print("You can now commit the new net_static.py file to your git.")
|