assemblyline 4.7.5.dev146__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.
Files changed (185) hide show
  1. {assemblyline-4.7.5.dev146/assemblyline.egg-info → assemblyline-4.7.5.dev150}/PKG-INFO +7 -19
  2. assemblyline-4.7.5.dev150/assemblyline/VERSION +1 -0
  3. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/custom.yara +1 -1
  4. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/identify.py +10 -2
  5. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/identify_defaults.py +3 -1
  6. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/postprocess.py +4 -22
  7. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/safe_archive.py +1 -4
  8. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/s3.py +7 -2
  9. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/randomizer.py +1 -1
  10. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/run/cli.py +1 -1
  11. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150/assemblyline.egg-info}/PKG-INFO +7 -19
  12. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline.egg-info/SOURCES.txt +4 -3
  13. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline.egg-info/entry_points.txt +1 -0
  14. assemblyline-4.7.5.dev150/assemblyline.egg-info/top_level.txt +7 -0
  15. assemblyline-4.7.5.dev150/dev/core/config/classification.yml +1 -0
  16. assemblyline-4.7.5.dev150/external/generate_attack_map.py +220 -0
  17. assemblyline-4.7.5.dev150/external/generate_tlds.py +53 -0
  18. assemblyline-4.7.5.dev150/pyproject.toml +114 -0
  19. assemblyline-4.7.5.dev150/setup.cfg +4 -0
  20. assemblyline-4.7.5.dev146/assemblyline/VERSION +0 -1
  21. assemblyline-4.7.5.dev146/assemblyline.egg-info/top_level.txt +0 -1
  22. assemblyline-4.7.5.dev146/pyproject.toml +0 -6
  23. assemblyline-4.7.5.dev146/setup.cfg +0 -10
  24. assemblyline-4.7.5.dev146/setup.py +0 -100
  25. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/LICENCE.md +0 -0
  26. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/MANIFEST.in +0 -0
  27. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/README.md +0 -0
  28. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/__init__.py +0 -0
  29. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/cachestore/__init__.py +0 -0
  30. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/__init__.py +0 -0
  31. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/archiving.py +0 -0
  32. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/attack_map.py +0 -0
  33. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/backupmanager.py +0 -0
  34. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/banner.py +0 -0
  35. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/bundling.py +0 -0
  36. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/caching.py +0 -0
  37. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/chunk.py +0 -0
  38. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/classification.py +0 -0
  39. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/classification.yml +0 -0
  40. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/cleanup_filestore.py +0 -0
  41. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/codec.py +0 -0
  42. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/comms.py +0 -0
  43. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/constants.py +0 -0
  44. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/custom.magic +0 -0
  45. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/dict_utils.py +0 -0
  46. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/digests.py +0 -0
  47. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/dispatcher.py +0 -0
  48. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/entropy.py +0 -0
  49. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/exceptions.py +0 -0
  50. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/file.py +0 -0
  51. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/forge.py +0 -0
  52. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/heuristics.py +0 -0
  53. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/hexdump.py +0 -0
  54. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/importing.py +0 -0
  55. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/iprange.py +0 -0
  56. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/isotime.py +0 -0
  57. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/log.py +0 -0
  58. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/logformat.py +0 -0
  59. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/lucene.lark +0 -0
  60. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/memory_zip.py +0 -0
  61. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/metrics.py +0 -0
  62. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/net.py +0 -0
  63. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/net_static.py +0 -0
  64. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/null.py +0 -0
  65. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/path.py +0 -0
  66. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/random_user.py +0 -0
  67. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/security.py +0 -0
  68. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/signaturing.py +0 -0
  69. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/str_utils.py +0 -0
  70. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/tag_safelist.yml +0 -0
  71. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/tagging.py +0 -0
  72. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/threading.py +0 -0
  73. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/uid.py +0 -0
  74. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/common/version.py +0 -0
  75. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datasource/__init__.py +0 -0
  76. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datasource/al.py +0 -0
  77. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datasource/alert.py +0 -0
  78. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datasource/common.py +0 -0
  79. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datastore/__init__.py +0 -0
  80. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datastore/bulk.py +0 -0
  81. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datastore/collection.py +0 -0
  82. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datastore/exceptions.py +0 -0
  83. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datastore/helper.py +0 -0
  84. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datastore/store.py +0 -0
  85. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datastore/support/__init__.py +0 -0
  86. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datastore/support/build.py +0 -0
  87. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/datastore/support/schemas.py +0 -0
  88. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/filestore/__init__.py +0 -0
  89. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/__init__.py +0 -0
  90. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/azure.py +0 -0
  91. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/base.py +0 -0
  92. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/ftp.py +0 -0
  93. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/http.py +0 -0
  94. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/local.py +0 -0
  95. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/filestore/transport/sftp.py +0 -0
  96. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/__init__.py +0 -0
  97. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/base.py +0 -0
  98. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/common.py +0 -0
  99. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/__init__.py +0 -0
  100. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/alert.py +0 -0
  101. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/alerter_heartbeat.py +0 -0
  102. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/archive_heartbeat.py +0 -0
  103. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/changes.py +0 -0
  104. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/dispatcher_heartbeat.py +0 -0
  105. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/dispatching.py +0 -0
  106. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/elastic_heartbeat.py +0 -0
  107. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/expiry_heartbeat.py +0 -0
  108. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/ingest_heartbeat.py +0 -0
  109. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/metrics.py +0 -0
  110. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/retrohunt_heartbeat.py +0 -0
  111. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/scaler_heartbeat.py +0 -0
  112. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/scaler_status_heartbeat.py +0 -0
  113. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/service_heartbeat.py +0 -0
  114. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/service_timing_heartbeat.py +0 -0
  115. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/submission.py +0 -0
  116. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/task.py +0 -0
  117. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/messages/vacuum_heartbeat.py +0 -0
  118. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/__init__.py +0 -0
  119. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/actions.py +0 -0
  120. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/alert.py +0 -0
  121. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/apikey.py +0 -0
  122. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/badlist.py +0 -0
  123. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/cached_file.py +0 -0
  124. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/config.py +0 -0
  125. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/emptyresult.py +0 -0
  126. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/error.py +0 -0
  127. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/file.py +0 -0
  128. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/filescore.py +0 -0
  129. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/heuristic.py +0 -0
  130. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/__init__.py +0 -0
  131. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/file.py +0 -0
  132. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/filetypes/__init__.py +0 -0
  133. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/filetypes/pe.py +0 -0
  134. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/ontology.py +0 -0
  135. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/__init__.py +0 -0
  136. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/antivirus.py +0 -0
  137. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/http.py +0 -0
  138. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/malware_config.py +0 -0
  139. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/network.py +0 -0
  140. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/process.py +0 -0
  141. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/sandbox.py +0 -0
  142. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/ontology/results/signature.py +0 -0
  143. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/replay.py +0 -0
  144. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/result.py +0 -0
  145. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/retrohunt.py +0 -0
  146. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/safelist.py +0 -0
  147. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/service.py +0 -0
  148. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/service_delta.py +0 -0
  149. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/signature.py +0 -0
  150. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/statistics.py +0 -0
  151. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/submission.py +0 -0
  152. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/submission_summary.py +0 -0
  153. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/submission_tree.py +0 -0
  154. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/tagging.py +0 -0
  155. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/user.py +0 -0
  156. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/user_favorites.py +0 -0
  157. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/user_settings.py +0 -0
  158. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/models/workflow.py +0 -0
  159. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/random_data/__init__.py +0 -0
  160. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/random_data/create_test_data.py +0 -0
  161. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/random_data/sample_rules.yar +0 -0
  162. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/odm/random_data/sample_suricata.rules +0 -0
  163. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/py.typed +0 -0
  164. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/__init__.py +0 -0
  165. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/__init__.py +0 -0
  166. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/cache.py +0 -0
  167. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/counters.py +0 -0
  168. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/daily_quota_tracker.py +0 -0
  169. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/events.py +0 -0
  170. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/exporting_counter.py +0 -0
  171. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/hash.py +0 -0
  172. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/lock.py +0 -0
  173. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/queues/__init__.py +0 -0
  174. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/queues/comms.py +0 -0
  175. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/queues/multi.py +0 -0
  176. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/queues/named.py +0 -0
  177. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/queues/priority.py +0 -0
  178. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/set.py +0 -0
  179. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/remote/datatypes/user_quota_tracker.py +0 -0
  180. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/run/__init__.py +0 -0
  181. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/run/pubsub_reader.py +0 -0
  182. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/run/suricata_importer.py +0 -0
  183. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline/run/yara_importer.py +0 -0
  184. {assemblyline-4.7.5.dev146 → assemblyline-4.7.5.dev150}/assemblyline.egg-info/dependency_links.txt +0 -0
  185. {assemblyline-4.7.5.dev146 → 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.dev146
3
+ Version: 4.7.5.dev150
4
4
  Summary: Assemblyline 4 - Automated malware analysis framework
5
- Home-page: https://github.com/CybercentreCanada/assemblyline-base
6
- Author: CCCS Assemblyline development team
7
- Author-email: assemblyline@cyber.gc.ca
8
- License: MIT
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
  [![Discord](https://img.shields.io/badge/chat-on%20discord-7289da.svg?sanitize=true)](https://discord.gg/GUAy9wErNu)
71
59
  [![](https://img.shields.io/discord/908084610158714900)](https://discord.gg/GUAy9wErNu)
@@ -0,0 +1 @@
1
+ 4.7.5.dev150
@@ -1272,7 +1272,7 @@ rule code_wsf {
1272
1272
  $ = /<script\s+?language=/
1273
1273
 
1274
1274
  condition:
1275
- mime startswith "text"
1275
+ (mime startswith "text" or mime == "application/x-pem-file")
1276
1276
  and all of them
1277
1277
  }
1278
1278
 
@@ -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
- if __name__ == "__main__":
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()
@@ -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/misp/ecoff", "regex": r"^MIPS[^\|]+ ECOFF"},
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, from_datastore_submission
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
- if pattern.endswith('\\Z'):
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
- if hasattr(tarfile, "data_filter"):
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()
@@ -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['Errors']:
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.dev146
3
+ Version: 4.7.5.dev150
4
4
  Summary: Assemblyline 4 - Automated malware analysis framework
5
- Home-page: https://github.com/CybercentreCanada/assemblyline-base
6
- Author: CCCS Assemblyline development team
7
- Author-email: assemblyline@cyber.gc.ca
8
- License: MIT
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
  [![Discord](https://img.shields.io/badge/chat-on%20discord-7289da.svg?sanitize=true)](https://discord.gg/GUAy9wErNu)
71
59
  [![](https://img.shields.io/discord/908084610158714900)](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
@@ -1,2 +1,3 @@
1
1
  [console_scripts]
2
2
  al_cli = assemblyline.run.cli:shell_main
3
+ al_identify = assemblyline.common.identify:shell_main
@@ -0,0 +1,7 @@
1
+ assemblyline
2
+ dev
3
+ docker
4
+ external
5
+ kibana
6
+ pipelines
7
+ test
@@ -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.")