txt2stix 1.0.13__tar.gz → 1.1.0__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 (263) hide show
  1. {txt2stix-1.0.13 → txt2stix-1.1.0}/PKG-INFO +2 -1
  2. {txt2stix-1.0.13 → txt2stix-1.1.0}/docs/stix-mapping.md +39 -252
  3. {txt2stix-1.0.13 → txt2stix-1.1.0}/pyproject.toml +2 -1
  4. txt2stix-1.1.0/tests/data/manually_generated_reports/bad_vulmatch_lookups.txt +2 -0
  5. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/manual-tests/cases-standard-tests.md +21 -1
  6. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/test_bundler.py +26 -11
  7. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/test_indicator.py +43 -46
  8. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/test_retriever.py +2 -2
  9. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/test_run_txt2stix.py +1 -1
  10. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/bundler.py +21 -35
  11. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/indicator.py +80 -90
  12. txt2stix-1.1.0/txt2stix/retriever.py +165 -0
  13. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/txt2stix.py +1 -1
  14. txt2stix-1.0.13/txt2stix/retriever.py +0 -136
  15. {txt2stix-1.0.13 → txt2stix-1.1.0}/.env.example +0 -0
  16. {txt2stix-1.0.13 → txt2stix-1.1.0}/.env.markdown +0 -0
  17. {txt2stix-1.0.13 → txt2stix-1.1.0}/.github/workflows/create-release.yml +0 -0
  18. {txt2stix-1.0.13 → txt2stix-1.1.0}/.github/workflows/run-tests.yml +0 -0
  19. {txt2stix-1.0.13 → txt2stix-1.1.0}/.gitignore +0 -0
  20. {txt2stix-1.0.13 → txt2stix-1.1.0}/LICENSE +0 -0
  21. {txt2stix-1.0.13 → txt2stix-1.1.0}/README.md +0 -0
  22. {txt2stix-1.0.13 → txt2stix-1.1.0}/docs/README.md +0 -0
  23. {txt2stix-1.0.13 → txt2stix-1.1.0}/docs/txt2stix.png +0 -0
  24. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/__init__.py +0 -0
  25. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/extractions/ai/config.yaml +0 -0
  26. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/extractions/lookup/config.yaml +0 -0
  27. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/extractions/pattern/config.yaml +0 -0
  28. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/helpers/mimetype_filename_extension_list.csv +0 -0
  29. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/helpers/stix_relationship_types.txt +0 -0
  30. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/helpers/tlds.txt +0 -0
  31. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/helpers/windows_registry_key_prefix.txt +0 -0
  32. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/_README.md +0 -0
  33. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/_generate_lookups.py +0 -0
  34. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/attack_pattern.txt +0 -0
  35. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/campaign.txt +0 -0
  36. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/country_iso3166_alpha2.txt +0 -0
  37. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/course_of_action.txt +0 -0
  38. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/disarm_id_v1_5.txt +0 -0
  39. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/disarm_name_v1_5.txt +0 -0
  40. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/extensions.txt +0 -0
  41. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/identity.txt +0 -0
  42. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/infrastructure.txt +0 -0
  43. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/intrusion_set.txt +0 -0
  44. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/malware.txt +0 -0
  45. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_atlas_id_v4_5_2.txt +0 -0
  46. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_atlas_name_v4_5_2.txt +0 -0
  47. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_attack_enterprise_aliases_v16_0.txt +0 -0
  48. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_attack_enterprise_id_v16_0.txt +0 -0
  49. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_attack_enterprise_name_v16_0.txt +0 -0
  50. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_attack_ics_aliases_v16_0.txt +0 -0
  51. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_attack_ics_id_v16_0.txt +0 -0
  52. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_attack_ics_name_v16_0.txt +0 -0
  53. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_attack_mobile_aliases_v16_0.txt +0 -0
  54. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_attack_mobile_id_v16_0.txt +0 -0
  55. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_attack_mobile_name_v16_0.txt +0 -0
  56. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_capec_id_v3_9.txt +0 -0
  57. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_capec_name_v3_9.txt +0 -0
  58. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_cwe_id_v4_15.txt +0 -0
  59. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/mitre_cwe_name_v4_15.txt +0 -0
  60. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/threat_actor.txt +0 -0
  61. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/tld.txt +0 -0
  62. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/lookups/tool.txt +0 -0
  63. {txt2stix-1.0.13 → txt2stix-1.1.0}/includes/tests/test_cases.yaml +0 -0
  64. {txt2stix-1.0.13 → txt2stix-1.1.0}/requirements.txt +0 -0
  65. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/README.md +0 -0
  66. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/ai_country.txt +0 -0
  67. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/ai_mitre_attack_enterprise.txt +0 -0
  68. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/ai_mitre_attack_ics.txt +0 -0
  69. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/ai_mitre_attack_mobile.txt +0 -0
  70. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/ai_mitre_capec.txt +0 -0
  71. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/ai_mitre_cwe.txt +0 -0
  72. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/all_cases.txt +0 -0
  73. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_autonomous_system_number.txt +0 -0
  74. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_bank_card_all.txt +0 -0
  75. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_bank_card_amex.txt +0 -0
  76. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_bank_card_diners.txt +0 -0
  77. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_bank_card_discover.txt +0 -0
  78. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_bank_card_jcb.txt +0 -0
  79. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_bank_card_mastercard.txt +0 -0
  80. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_bank_card_union_pay.txt +0 -0
  81. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_bank_card_visa.txt +0 -0
  82. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_country_alpha2.txt +0 -0
  83. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_cpe_uri.txt +0 -0
  84. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_cryptocurrency_btc_transaction.txt +0 -0
  85. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_cryptocurrency_btc_wallet.txt +0 -0
  86. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_cryptocurrency_eth_transaction.txt +0 -0
  87. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_cryptocurrency_eth_wallet.txt +0 -0
  88. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_cryptocurrency_xmr_transaction.txt +0 -0
  89. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_cryptocurrency_xmr_wallet.txt +0 -0
  90. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_cve_id.txt +0 -0
  91. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_directory_unix.txt +0 -0
  92. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_directory_unix_file.txt +0 -0
  93. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_directory_windows.txt +0 -0
  94. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_directory_windows_with_file.txt +0 -0
  95. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_disarm.txt +0 -0
  96. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_disarm_name.txt +0 -0
  97. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_domain_name_only.txt +0 -0
  98. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_domain_name_subdomain.txt +0 -0
  99. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_email_address.txt +0 -0
  100. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_file_hash_md5.txt +0 -0
  101. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_file_hash_sha_1.txt +0 -0
  102. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_file_hash_sha_224.txt +0 -0
  103. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_file_hash_sha_256.txt +0 -0
  104. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_file_hash_sha_384.txt +0 -0
  105. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_file_hash_sha_512.txt +0 -0
  106. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_file_name.txt +0 -0
  107. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_host_name.txt +0 -0
  108. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_host_name_file.txt +0 -0
  109. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_host_name_path.txt +0 -0
  110. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_host_name_subdomain.txt +0 -0
  111. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_host_name_url.txt +0 -0
  112. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_iban_number.txt +0 -0
  113. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_ipv4_address_cidr.txt +0 -0
  114. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_ipv4_address_only.txt +0 -0
  115. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_ipv4_address_port.txt +0 -0
  116. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_ipv6_address_cidr.txt +0 -0
  117. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_ipv6_address_only.txt +0 -0
  118. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_ipv6_address_port.txt +0 -0
  119. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mac_address.txt +0 -0
  120. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_atlas.txt +0 -0
  121. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_atlas_name.txt +0 -0
  122. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_attack_enterprise.txt +0 -0
  123. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_attack_enterprise_aliases.txt +0 -0
  124. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_attack_enterprise_name.txt +0 -0
  125. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_attack_ics.txt +0 -0
  126. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_attack_ics_aliases.txt +0 -0
  127. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_attack_ics_name.txt +0 -0
  128. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_attack_mobile.txt +0 -0
  129. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_attack_mobile_aliases.txt +0 -0
  130. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_attack_mobile_name.txt +0 -0
  131. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_capec.txt +0 -0
  132. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_capec_name.txt +0 -0
  133. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_cwe.txt +0 -0
  134. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_mitre_cwe_name.txt +0 -0
  135. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_phone_number.txt +0 -0
  136. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_url.txt +0 -0
  137. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_url_file.txt +0 -0
  138. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_url_path.txt +0 -0
  139. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_user_agent.txt +0 -0
  140. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/generic_windows_registry_key.txt +0 -0
  141. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/lookup_attack_pattern.txt +0 -0
  142. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/lookup_campaign.txt +0 -0
  143. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/lookup_course_of_action.txt +0 -0
  144. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/lookup_identity.txt +0 -0
  145. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/lookup_infrastructure.txt +0 -0
  146. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/lookup_intrusion_set.txt +0 -0
  147. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/lookup_malware.txt +0 -0
  148. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/lookup_threat_actor.txt +0 -0
  149. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/extraction_types/lookup_tool.txt +0 -0
  150. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/ai_index_position.txt +0 -0
  151. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/attack_flow_demo.txt +0 -0
  152. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/attack_navigator_demo.txt +0 -0
  153. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/basic_relationship.txt +0 -0
  154. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/char_length_too_long.txt +0 -0
  155. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/descriptive_for_ai_relationships_1.txt +0 -0
  156. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/disarm_demo.txt +0 -0
  157. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/embedded_img_ignore.txt +0 -0
  158. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/embedded_link_ignore.txt +0 -0
  159. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/ip1.txt +0 -0
  160. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/ip2.txt +0 -0
  161. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/known_whitelist_match.txt +0 -0
  162. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/mitre_attack_enterprise_ai_demo.txt +0 -0
  163. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/mitre_attack_enterprise_lookup_demo.txt +0 -0
  164. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/mixed_extractions.txt +0 -0
  165. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/not_security_content.txt +0 -0
  166. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/test_ai_hash_error_with_stix2_lib.txt +0 -0
  167. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/test_aliases.txt +0 -0
  168. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/test_extraction_boundary.txt +0 -0
  169. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/manually_generated_reports/test_extraction_escapes.txt +0 -0
  170. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/real_intel_reports/APT28-Center-of-Storm-2017.txt +0 -0
  171. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/real_intel_reports/Bitdefender-Labs-Report-X-creat6958-en-EN.txt +0 -0
  172. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/real_intel_reports/FireEyeAPT39.txt +0 -0
  173. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/real_intel_reports/France_CERT_APT31_Pakdoor_TLPWHITE.txt +0 -0
  174. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/real_intel_reports/Group-IB_Ransomware_Uncovered_whitepaper_eng.txt +0 -0
  175. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/real_intel_reports/JOINT_CSA_HUNTING_RU_INTEL_SNAKE_MALWARE_20230509.txt +0 -0
  176. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/real_intel_reports/TA22-0126-QAKBOT-analysis-TLP-GREEN.txt +0 -0
  177. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/real_intel_reports/dinners_card.txt +0 -0
  178. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/real_intel_reports/mandiant-apt1.txt +0 -0
  179. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/data/real_intel_reports/mykings_report_final.txt +0 -0
  180. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/manual-tests/cases-ai-relationships.md +0 -0
  181. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/manual-tests/cases-extraction-type-ai.md +0 -0
  182. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/manual-tests/cases-extraction-type-lookup.md +0 -0
  183. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/manual-tests/cases-extraction-type-pattern.md +0 -0
  184. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/scripts/generate_simple_extraction_test_cases_txt_files.py +0 -0
  185. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/__init__.py +0 -0
  186. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/test_attack_flow.py +0 -0
  187. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/test_extractors.py +0 -0
  188. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/test_lookups.py +0 -0
  189. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/test_main.py +0 -0
  190. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/test_utils.py +0 -0
  191. {txt2stix-1.0.13 → txt2stix-1.1.0}/tests/src/utils.py +0 -0
  192. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/__init__.py +0 -0
  193. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/ai_extractor/__init__.py +0 -0
  194. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/ai_extractor/anthropic.py +0 -0
  195. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/ai_extractor/base.py +0 -0
  196. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/ai_extractor/deepseek.py +0 -0
  197. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/ai_extractor/gemini.py +0 -0
  198. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/ai_extractor/openai.py +0 -0
  199. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/ai_extractor/openrouter.py +0 -0
  200. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/ai_extractor/prompts.py +0 -0
  201. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/ai_extractor/utils.py +0 -0
  202. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/attack_flow.py +0 -0
  203. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/common.py +0 -0
  204. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/credential_checker.py +0 -0
  205. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/extractions.py +0 -0
  206. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/lookups.py +0 -0
  207. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/__init__.py +0 -0
  208. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/__init__.py +0 -0
  209. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/base_extractor.py +0 -0
  210. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/card/README.md +0 -0
  211. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/card/__init__.py +0 -0
  212. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/card/amex_card_extractor.py +0 -0
  213. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/card/diners_card_extractor.py +0 -0
  214. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/card/discover_card_extractor.py +0 -0
  215. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/card/jcb_card_extractor.py +0 -0
  216. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/card/master_card_extractor.py +0 -0
  217. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/card/union_card_extractor.py +0 -0
  218. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/card/visa_card_extractor.py +0 -0
  219. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/crypto/__init__.py +0 -0
  220. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/crypto/btc_extractor.py +0 -0
  221. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/directory/__init__.py +0 -0
  222. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/directory/unix_directory_extractor.py +0 -0
  223. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/directory/unix_file_path_extractor.py +0 -0
  224. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/directory/windows_directory_path_extractor.py +0 -0
  225. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/directory/windows_file_path_extractor.py +0 -0
  226. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/domain/__init__.py +0 -0
  227. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/domain/domain_extractor.py +0 -0
  228. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/domain/hostname_extractor.py +0 -0
  229. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/domain/sub_domain_extractor.py +0 -0
  230. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/hashes/__init__.py +0 -0
  231. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/hashes/md5_extractor.py +0 -0
  232. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/hashes/sha1_extractor.py +0 -0
  233. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/hashes/sha224_extractor.py +0 -0
  234. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/hashes/sha2_256_exactor.py +0 -0
  235. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/hashes/sha2_512_exactor.py +0 -0
  236. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/hashes/sha3_256_exactor.py +0 -0
  237. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/hashes/sha3_512_exactor.py +0 -0
  238. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/helper.py +0 -0
  239. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/ip/__init__.py +0 -0
  240. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/ip/ipv4_cidr_extractor.py +0 -0
  241. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/ip/ipv4_extractor.py +0 -0
  242. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/ip/ipv4_port_extractor.py +0 -0
  243. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/ip/ipv6_cidr_extractor.py +0 -0
  244. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/ip/ipv6_extractor.py +0 -0
  245. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/ip/ipv6_port_extractor.py +0 -0
  246. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/__init__.py +0 -0
  247. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/asn_extractor.py +0 -0
  248. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/cpe_extractor.py +0 -0
  249. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/cve_extractor.py +0 -0
  250. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/email_extractor.py +0 -0
  251. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/filename_extractor.py +0 -0
  252. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/iban_extractor.py +0 -0
  253. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/mac_address_extractor.py +0 -0
  254. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/phonenumber_extractor.py +0 -0
  255. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/user_agent_extractor.py +0 -0
  256. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/others/windows_registry_key_extractor.py +0 -0
  257. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/url/__init__.py +0 -0
  258. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/url/url_extractor.py +0 -0
  259. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/url/url_file_extractor.py +0 -0
  260. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/pattern/extractors/url/url_path_extractor.py +0 -0
  261. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/stix.py +0 -0
  262. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix/utils.py +0 -0
  263. {txt2stix-1.0.13 → txt2stix-1.1.0}/txt2stix.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: txt2stix
3
- Version: 1.0.13
3
+ Version: 1.1.0
4
4
  Summary: txt2stix is a Python script that is designed to identify and extract IoCs and TTPs from text files, identify the relationships between them, convert them to STIX 2.1 objects, and output as a STIX 2.1 bundle.
5
5
  Project-URL: Homepage, https://github.com/muchdogesec/txt2stix
6
6
  Project-URL: Issues, https://github.com/muchdogesec/txt2stix/issues
@@ -22,6 +22,7 @@ Requires-Dist: phonenumbers>=8.13.39
22
22
  Requires-Dist: python-dotenv>=1.0.1
23
23
  Requires-Dist: requests>=2.32.4
24
24
  Requires-Dist: schwifty>=2024.6.1
25
+ Requires-Dist: stix2-validator
25
26
  Requires-Dist: stix2extensions
26
27
  Requires-Dist: tld>=0.13
27
28
  Requires-Dist: tldextract>=5.1.2
@@ -65,7 +65,7 @@ All files uploaded are represented as a unique [STIX Report SDO](https://docs.oa
65
65
  "external_id": "<UUID OF REPORT OBJECT>"
66
66
  },
67
67
  {
68
- "source_name": "txt2stix Report MD5",
68
+ "source_name": "txt2stix_report_md5",
69
69
  "external_id": "<MD5 HASH OF DESCRIPTION FIELD>"
70
70
  }
71
71
  ],
@@ -93,12 +93,7 @@ Objects always created:
93
93
 
94
94
  * `indicator`
95
95
  * `ipv4-addr`
96
- * `relationship` (`ipv4-addr` -> `indicator`)
97
-
98
- Relationship mode object generation behaviour:
99
-
100
- * Standard relationship SRO: `indicator` `extracted-from` `report`
101
- * AI mode relationship SROs: ipv4-addr is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
96
+ * `relationship` (`indicator` -> `ipv4-addr`)
102
97
 
103
98
  ```json
104
99
  {
@@ -147,14 +142,9 @@ Objects always created:
147
142
 
148
143
  * `indicator`
149
144
  * `ipv4-addr`
150
- * `relationship` (`ipv4-addr` -> `indicator`)
145
+ * `relationship` (`indicator` -> `ipv4-addr`)
151
146
  * `network-traffic`
152
147
 
153
- Relationship mode object generation behaviour:
154
-
155
- * Standard relationship SRO: `indicator` `extracted-from` `report`
156
- * AI mode relationship SROs: ipv4-addr is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
157
-
158
148
  ```json
159
149
  {
160
150
  "type": "indicator",
@@ -219,12 +209,7 @@ Objects always created:
219
209
 
220
210
  * `indicator`
221
211
  * `ipv6-addr`
222
- * `relationship` (`ipv6-addr` -> `indicator`)
223
-
224
- Relationship mode object generation behaviour:
225
-
226
- * Standard relationship SRO: `indicator` `extracted-from` `report`
227
- * AI mode relationship SROs: ipv6-addr is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
212
+ * `relationship` (`indicator` -> `ipv6-addr`)
228
213
 
229
214
  ```json
230
215
  {
@@ -273,14 +258,9 @@ Objects always created:
273
258
 
274
259
  * `indicator`
275
260
  * `ipv6-addr`
276
- * `relationship` (`ipv6-addr` -> `indicator`)
261
+ * `relationship` (`indicator` -> `ipv6-addr`)
277
262
  * `network-traffic`
278
263
 
279
- Relationship mode object generation behaviour:
280
-
281
- * Standard relationship SRO: `indicator` `extracted-from` `report`
282
- * AI mode relationship SROs: ipv6-addr is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
283
-
284
264
  ```json
285
265
  {
286
266
  "type": "indicator",
@@ -341,12 +321,7 @@ Objects always created:
341
321
 
342
322
  * `indicator`
343
323
  * `domain-name`
344
- * `relationship` (`domain-name` -> `indicator`)
345
-
346
- Relationship mode object generation behaviour:
347
-
348
- * Standard relationship SRO: `indicator` `extracted-from` `report`
349
- * AI mode relationship SROs: domain-name is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
324
+ * `relationship` (`indicator` -> `domain-name`)
350
325
 
351
326
  ```json
352
327
  {
@@ -395,12 +370,7 @@ Objects always created:
395
370
 
396
371
  * `indicator`
397
372
  * `url`
398
- * `relationship` (`url` -> `indicator`)
399
-
400
- Relationship mode object generation behaviour:
401
-
402
- * Standard relationship SRO: `indicator` `extracted-from` `report`
403
- * AI mode relationship SROs: url is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
373
+ * `relationship` (`indicator` -> `url`)
404
374
 
405
375
  ```json
406
376
  {
@@ -449,12 +419,7 @@ Objects always created:
449
419
 
450
420
  * `indicator`
451
421
  * `file`
452
- * `relationship` (`file` -> `indicator`)
453
-
454
- Relationship mode object generation behaviour:
455
-
456
- * Standard relationship SRO: `indicator` `extracted-from` `report`
457
- * AI mode relationship SROs: file is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
422
+ * `relationship` (`indicator` -> `file`)
458
423
 
459
424
  ```json
460
425
  {
@@ -503,12 +468,7 @@ Objects always created:
503
468
 
504
469
  * `indicator`
505
470
  * `directory`
506
- * `relationship` (`directory` -> `indicator`)
507
-
508
- Relationship mode object generation behaviour:
509
-
510
- * Standard relationship SRO:`indicator` `extracted-from` `report`
511
- * AI mode relationship SROs: directory is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
471
+ * `relationship` (`indicator` -> `directory`)
512
472
 
513
473
  ```json
514
474
  {
@@ -557,14 +517,9 @@ Objects always created:
557
517
 
558
518
  * `indicator`
559
519
  * `directory`
560
- * `relationship` (`directory` -> `indicator`)
520
+ * `relationship` (`indicator` -> `directory`)
561
521
  * `file`
562
522
 
563
- Relationship mode object generation behaviour:
564
-
565
- * Standard relationship SRO: `indicator` `extracted-from` `report`
566
- * AI mode relationship SROs: directory is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
567
-
568
523
  ```json
569
524
  {
570
525
  "type": "indicator",
@@ -653,12 +608,7 @@ Objects always created:
653
608
 
654
609
  * `indicator`
655
610
  * `file`
656
- * `relationship` (`file` -> `indicator`)
657
-
658
- Relationship mode object generation behaviour:
659
-
660
- * Standard relationship SRO: `indicator` `extracted-from` `report`
661
- * AI mode relationship SROs: file is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
611
+ * `relationship` (`indicator` -> `file`)
662
612
 
663
613
  ```json
664
614
  {
@@ -709,12 +659,7 @@ Objects always created:
709
659
 
710
660
  * `indicator`
711
661
  * `email-addr`
712
- * `relationship` (`email-addr` -> `indicator`)
713
-
714
- Relationship mode object generation behaviour:
715
-
716
- * Standard relationship SRO: `indicator` `extracted-from` `report`
717
- * AI mode relationship SROs: email-addr is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
662
+ * `relationship` (`indicator` -> `email-addr`)
718
663
 
719
664
  ```json
720
665
  {
@@ -763,12 +708,7 @@ Objects always created:
763
708
 
764
709
  * `indicator`
765
710
  * `mac-addr`
766
- * `relationship` (`mac-addr` -> `indicator`)
767
-
768
- Relationship mode object generation behaviour:
769
-
770
- * Standard relationship SRO: `indicator` `extracted-from` `report`
771
- * AI mode relationship SROs: mac-addr is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
711
+ * `relationship` (`indicator` -> `mac-addr`)
772
712
 
773
713
  ```json
774
714
  {
@@ -817,12 +757,7 @@ Objects always created:
817
757
 
818
758
  * `indicator`
819
759
  * `windows-registry-key`
820
- * `relationship` (`windows-registry-key` -> `indicator`)
821
-
822
- Relationship mode object generation behaviour:
823
-
824
- * Standard relationship SRO: `indicator` `extracted-from` `report`
825
- * AI mode relationship SROs: windows-registry-key is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
760
+ * `relationship` (`indicator` -> `windows-registry-key`)
826
761
 
827
762
  ```json
828
763
  {
@@ -871,12 +806,7 @@ Objects always created:
871
806
 
872
807
  * `indicator`
873
808
  * `autonomous-system`
874
- * `relationship` (`autonomous-system` -> `indicator`)
875
-
876
- Relationship mode object generation behaviour:
877
-
878
- * Standard relationship SRO: `indicator` `extracted-from` `report`
879
- * AI mode relationship SROs: autonomous-system is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
809
+ * `relationship` (`indicator` -> `autonomous-system`)
880
810
 
881
811
  ```json
882
812
  {
@@ -925,14 +855,9 @@ Objects always created:
925
855
 
926
856
  * `indicator`
927
857
  * `user-agent`
928
- * `relationship` (`user-agent` -> `indicator`)
858
+ * `relationship` (`indicator` -> `user-agent`)
929
859
  * `extensions-definition`: https://raw.githubusercontent.com/muchdogesec/stix2extensions/main/extension-definitions/scos/user-agent.json
930
860
 
931
- Relationship mode object generation behaviour:
932
-
933
- * Standard relationship SRO: `indicator` `extracted-from` `report`
934
- * AI mode relationship SROs: user-agent is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
935
-
936
861
  ```json
937
862
  {
938
863
  "type": "indicator",
@@ -985,14 +910,9 @@ Objects always created:
985
910
 
986
911
  * `indicator`
987
912
  * `cryptocurrency-wallet`
988
- * `relationship` (`cryptocurrency-wallet` -> `indicator`)
913
+ * `relationship` (`indicator` -> `cryptocurrency-wallet`)
989
914
  * `extensions-definition`: https://raw.githubusercontent.com/muchdogesec/stix2extensions/main/extension-definitions/scos/cryptocurrency-wallet.json
990
915
 
991
- Relationship mode object generation behaviour:
992
-
993
- * Standard relationship SRO: `indicator` `extracted-from` `report`
994
- * AI mode relationship SROs: cryptocurrency-wallet is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
995
-
996
916
  ```json
997
917
  {
998
918
  "type": "indicator",
@@ -1041,16 +961,11 @@ Objects always created:
1041
961
 
1042
962
  * `indicator`
1043
963
  * `cryptocurrency-wallet`
1044
- * `relationship` (`cryptocurrency-wallet` -> `indicator`)
964
+ * `relationship` (`indicator` -> `cryptocurrency-wallet`)
1045
965
  * `cryptocurrency-transaction` for all crypto transactions that exist related to the wallet (is not always generated if lookup unsuccessful)
1046
966
  * `extensions-definition`: https://raw.githubusercontent.com/muchdogesec/stix2extensions/main/extension-definitions/scos/cryptocurrency-wallet.json
1047
967
  * `extensions-definition`: https://raw.githubusercontent.com/muchdogesec/stix2extensions/main/extension-definitions/scos/cryptocurrency-transaction.json
1048
968
 
1049
- Relationship mode object generation behaviour:
1050
-
1051
- * Standard relationship SRO: `indicator` `extracted-from` `report`
1052
- * AI mode relationship SROs: cryptocurrency-wallet is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1053
-
1054
969
  ```json
1055
970
  {
1056
971
  "type": "indicator",
@@ -1099,16 +1014,11 @@ Objects always created:
1099
1014
 
1100
1015
  * `indicator`
1101
1016
  * `cryptocurrency-transaction`
1102
- * `relationship` (`cryptocurrency-transaction` -> `indicator`)
1017
+ * `relationship` (`indicator` -> `cryptocurrency-transaction`)
1103
1018
  * `cryptocurrency-wallet` for wallets seen in transaction identified by crypto2stix (is not always generated if lookup unsuccessful)
1104
1019
  * `extensions-definition`: https://raw.githubusercontent.com/muchdogesec/stix2extensions/main/extension-definitions/scos/cryptocurrency-transaction.json
1105
1020
  * `extensions-definition`: https://raw.githubusercontent.com/muchdogesec/stix2extensions/main/extension-definitions/scos/cryptocurrency-wallet.json
1106
1021
 
1107
- Relationship mode object generation behaviour:
1108
-
1109
- * Standard relationship SRO: `indicator` `extracted-from` `report`
1110
- * AI mode relationship SROs: cryptocurrency-transaction is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1111
-
1112
1022
  ```json
1113
1023
  {
1114
1024
  "type": "indicator",
@@ -1172,16 +1082,11 @@ This will also generate all `cryptocurrency-wallets` seen in the transaction.
1172
1082
  Objects always created:
1173
1083
 
1174
1084
  * `indicator`
1175
- * `bank-card` (with `relationship` to `indicator`)
1176
- * `relationship` (`bank-card` -> `indicator`)
1085
+ * `bank-card`
1086
+ * `relationship` (`indicator` -> `bank-card`)
1177
1087
  * `identity` (with `relationship` to `bank-card`) generated by creditcard2stix (is not always generated if lookup unsuccessful)
1178
1088
  * `extension-definition`: https://raw.githubusercontent.com/muchdogesec/stix2extensions/main/extension-definitions/scos/bank-card.json
1179
1089
 
1180
- Relationship mode object generation behaviour:
1181
-
1182
- * Standard relationship SRO: `indicator` `extracted-from` `report`
1183
- * AI mode relationship SROs: bank-card is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1184
-
1185
1090
  ```json
1186
1091
  {
1187
1092
  "type": "indicator",
@@ -1222,14 +1127,9 @@ Objects always created:
1222
1127
 
1223
1128
  * `indicator`
1224
1129
  * `bank-account`
1225
- * `relationship` (`bank-card` -> `indicator`)
1130
+ * `relationship` (`indicator` -> `bank-card`)
1226
1131
  * `extension-definition`: https://raw.githubusercontent.com/muchdogesec/stix2extensions/main/extension-definitions/scos/bank-account.json
1227
1132
 
1228
- Relationship mode object generation behaviour:
1229
-
1230
- * Standard relationship SRO: `indicator` `extracted-from` `report`
1231
- * AI mode relationship SROs: bank-card is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1232
-
1233
1133
  ```json
1234
1134
  {
1235
1135
  "type": "indicator",
@@ -1287,14 +1187,9 @@ Objects always created:
1287
1187
 
1288
1188
  * `indicator`
1289
1189
  * `phone-number`
1290
- * `relationship` (`phone-number` -> `indicator`)
1190
+ * `relationship` (`indicator` -> `phone-number`)
1291
1191
  * `extension-definition`: https://raw.githubusercontent.com/muchdogesec/stix2extensions/main/extension-definitions/scos/phone-number.json
1292
1192
 
1293
- Relationship mode object generation behaviour:
1294
-
1295
- * Standard relationship SRO: `indicator` `extracted-from` `report`
1296
- * AI mode relationship SROs: phone-number is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1297
-
1298
1193
  ```json
1299
1194
  {
1300
1195
  "type": "indicator",
@@ -1352,11 +1247,6 @@ Objects created:
1352
1247
 
1353
1248
  * `attack-pattern`
1354
1249
 
1355
- Relationship mode object generation behaviour:
1356
-
1357
- * Standard relationship SRO: `attack-pattern` `extracted-from` `report`
1358
- * AI mode relationship SROs: attack-pattern is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1359
-
1360
1250
  ```json
1361
1251
  {
1362
1252
  "type": "attack-pattern",
@@ -1389,11 +1279,6 @@ Objects created:
1389
1279
 
1390
1280
  * `campaign`
1391
1281
 
1392
- Relationship mode object generation behaviour:
1393
-
1394
- * Standard relationship SRO: `campaign` `extracted-from` `report`
1395
- * AI mode relationship SROs: campaign is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1396
-
1397
1282
  ```json
1398
1283
  {
1399
1284
  "type": "campaign",
@@ -1426,11 +1311,6 @@ Objects created:
1426
1311
 
1427
1312
  * `course-of-action`
1428
1313
 
1429
- Relationship mode object generation behaviour:
1430
-
1431
- * Standard relationship SRO: `course-of-action` `extracted-from` `report`
1432
- * AI mode relationship SROs: course-of-action is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1433
-
1434
1314
  ```json
1435
1315
  {
1436
1316
  "type": "course-of-action",
@@ -1463,11 +1343,6 @@ Objects created:
1463
1343
 
1464
1344
  * `infrastructure`
1465
1345
 
1466
- Relationship mode object generation behaviour:
1467
-
1468
- * Standard relationship SRO: `infrastructure` `extracted-from` `report`
1469
- * AI mode relationship SROs: infrastructure is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1470
-
1471
1346
  ```json
1472
1347
  {
1473
1348
  "type":"infrastructure",
@@ -1501,11 +1376,6 @@ Objects created:
1501
1376
 
1502
1377
  * `intrusion-set`
1503
1378
 
1504
- Relationship mode object generation behaviour:
1505
-
1506
- * Standard relationship SRO: `intrusion-set` `extracted-from` `report`
1507
- * AI mode relationship SROs: intrusion-set is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1508
-
1509
1379
  ```json
1510
1380
  {
1511
1381
  "type": "intrusion-set",
@@ -1538,11 +1408,6 @@ Objects created:
1538
1408
 
1539
1409
  * `malware`
1540
1410
 
1541
- Relationship mode object generation behaviour:
1542
-
1543
- * Standard relationship SRO: `malware` `extracted-from` `report`
1544
- * AI mode relationship SROs: malware is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1545
-
1546
1411
  ```json
1547
1412
  {
1548
1413
  "type": "malware",
@@ -1577,11 +1442,6 @@ Objects created:
1577
1442
 
1578
1443
  * `threat-actor`
1579
1444
 
1580
- Relationship mode object generation behaviour:
1581
-
1582
- * Standard relationship SRO: `threat-actor` `extracted-from` `report`
1583
- * AI mode relationship SROs: threat-actor is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1584
-
1585
1445
  ```json
1586
1446
  {
1587
1447
  "type": "threat-actor",
@@ -1615,11 +1475,6 @@ Objects created:
1615
1475
 
1616
1476
  * `tool`
1617
1477
 
1618
- Relationship mode object generation behaviour:
1619
-
1620
- * Standard relationship SRO: `tool` `extracted-from` `report`
1621
- * AI mode relationship SROs: tool is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1622
-
1623
1478
  ```json
1624
1479
  {
1625
1480
  "type": "tool",
@@ -1653,11 +1508,6 @@ Objects created:
1653
1508
 
1654
1509
  * `identity`
1655
1510
 
1656
- Relationship mode object generation behaviour:
1657
-
1658
- * Standard relationship SRO: `identity` `extracted-from` `report`
1659
- * AI mode relationship SROs: identity is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1660
-
1661
1511
  ```json
1662
1512
  {
1663
1513
  "type": "identity",
@@ -1685,7 +1535,7 @@ Relationship mode object generation behaviour:
1685
1535
  }
1686
1536
  ```
1687
1537
 
1688
- ## STIX Mapping (remote created objects)
1538
+ ## STIX Mapping (remotely created objects)
1689
1539
 
1690
1540
  Some objects created for extractions do not need to be generated by txt2stix, they can be looked up from an external databases.
1691
1541
 
@@ -1701,10 +1551,7 @@ GET CTIBUTLER_BASE_URL/v1/attack-enterprise/objects/:attack_id/
1701
1551
 
1702
1552
  All the objects returned are imported.
1703
1553
 
1704
- Relationship mode object generation behaviour:
1705
-
1706
- * Standard relationship SRO: Imported object(s) is (`source_ref`) object connected to Report with type `extracted-from`
1707
- * AI mode relationship SROs: all imported objects are connected as source or target object (depending on if extraction is source or target)
1554
+ If no objects are returned by an extraction, you will see an error in the logs and data file/
1708
1555
 
1709
1556
  ### stix-mapping: `ctibutler-mitre-attack-enterprise-name`
1710
1557
 
@@ -1732,10 +1579,7 @@ GET CTIBUTLER_BASE_URL/v1/attack-mobile/objects/:attack_id/
1732
1579
 
1733
1580
  All the objects returned are imported.
1734
1581
 
1735
- Relationship mode object generation behaviour:
1736
-
1737
- * Standard relationship SRO: Imported object(s) is (`source_ref`) object connected to Report with type `extracted-from`
1738
- * AI mode relationship SROs: all imported objects are connected as source or target object (depending on if extraction is source or target)
1582
+ If no objects are returned by an extraction, you will see an error in the logs and data file/
1739
1583
 
1740
1584
  ### stix-mapping: `ctibutler-mitre-attack-mobile-name`
1741
1585
 
@@ -1765,10 +1609,7 @@ GET CTIBUTLER_BASE_URL/v1/attack-ics/objects/:attack_id/
1765
1609
 
1766
1610
  All the objects returned are imported.
1767
1611
 
1768
- Relationship mode object generation behaviour:
1769
-
1770
- * Standard relationship SRO: Imported object(s) is (`source_ref`) object connected to Report with type `extracted-from`
1771
- * AI mode relationship SROs: all imported objects are connected as source or target object (depending on if extraction is source or target)
1612
+ If no objects are returned by an extraction, you will see an error in the logs and data file/
1772
1613
 
1773
1614
  ### stix-mapping: `ctibutler-mitre-attack-ics-name`
1774
1615
 
@@ -1798,10 +1639,7 @@ GET CTIBUTLER_BASE_URL/v1/capec/objects/:capec_id/
1798
1639
 
1799
1640
  All the objects returned are imported.
1800
1641
 
1801
- Relationship mode object generation behaviour:
1802
-
1803
- * Standard relationship SRO: Imported object(s) is (`source_ref`) object connected to Report with type `extracted-from`
1804
- * AI mode relationship SROs: all imported `course-of-action` / `attack-pattern` objects are connected as source or target object (depending on if extraction is source or target)
1642
+ If no objects are returned by an extraction, you will see an error in the logs and data file/
1805
1643
 
1806
1644
  ### stix-mapping: `ctibutler-mitre-capec-name`
1807
1645
 
@@ -1821,10 +1659,7 @@ GET CTIBUTLER_BASE_URL/v1/cwe/objects/:cwe_id/
1821
1659
 
1822
1660
  `CTIBUTLER_APIKEY` in request passed if set.
1823
1661
 
1824
- Relationship mode object generation behaviour:
1825
-
1826
- * Standard relationship SRO: Imported `weakness` object is (`source_ref`) object connected to Report
1827
- * AI mode relationship SROs: all imported objects are connected as source or target object (depending on if extraction is source or target)
1662
+ If no objects are returned by an extraction, you will see an error in the logs and data file/
1828
1663
 
1829
1664
  ### stix-mapping: `ctibutler-mitre-cwe-name`
1830
1665
 
@@ -1846,10 +1681,7 @@ GET CTIBUTLER_BASE_URL/v1/atlas/objects/:atlas_id/
1846
1681
 
1847
1682
  All the objects returned are imported.
1848
1683
 
1849
- Relationship mode object generation behaviour:
1850
-
1851
- * Standard relationship SRO: Imported object(s) is (`source_ref`) object connected to Report with type `extracted-from`
1852
- * AI mode relationship SROs: all imported objects are connected as source or target object (depending on if extraction is source or target)
1684
+ If no objects are returned by an extraction, you will see an error in the logs and data file/
1853
1685
 
1854
1686
  ### stix-mapping: `ctibutler-mitre-atlas-name`
1855
1687
 
@@ -1871,10 +1703,7 @@ GET CTIBUTLER_BASE_URL/v1/disarm/objects/:disarm_id/
1871
1703
 
1872
1704
  All the objects returned are imported.
1873
1705
 
1874
- Relationship mode object generation behaviour:
1875
-
1876
- * Standard relationship SRO: Imported object(s) is (`source_ref`) object connected to Report with type `extracted-from`
1877
- * AI mode relationship SROs: all imported objects are connected as source or target object (depending on if extraction is source or target)
1706
+ If no objects are returned by an extraction, you will see an error in the logs and data file/
1878
1707
 
1879
1708
  ### stix-mapping: `ctibutler-mitre-atlas-name`
1880
1709
 
@@ -1896,10 +1725,7 @@ GET CTIBUTLER_BASE_URL/v1/location/objects/?alpha2_code=ID
1896
1725
 
1897
1726
  All the objects returned are imported.
1898
1727
 
1899
- Relationship mode object generation behaviour:
1900
-
1901
- * Standard relationship SRO: `location` `extracted-from` `report`
1902
- * AI mode relationship SROs: location is connected as `source_ref` or `target_ref` to 0 or more objects based on AI analysis
1728
+ If no objects are returned by an extraction, you will see an error in the logs and data file/
1903
1729
 
1904
1730
  ### stix-mapping: `vulmatch-cve-id`
1905
1731
 
@@ -1911,10 +1737,7 @@ GET VULMATCH_BASE_URL/v1/cve/objects/:cve_id/
1911
1737
 
1912
1738
  `VULMATCH_APIKEY` in request passed if set.
1913
1739
 
1914
- Relationship mode object generation behaviour:
1915
-
1916
- * Standard relationship SRO: Imported `vulnerability` object is (`source_ref`) object connected to Report
1917
- * AI mode relationship SROs: all imported objects are connected as source or target object (depending on if extraction is source or target)
1740
+ If no objects are returned by an extraction, you will see an error in the logs and data file/
1918
1741
 
1919
1742
  ### stix-mapping: `vulmatch-cpe-id`
1920
1743
 
@@ -1926,16 +1749,13 @@ GET VULMATCH_BASE_URL/v1/cpe/objects/:cpe_id/
1926
1749
 
1927
1750
  `VULMATCH_APIKEY` in request passed if set.
1928
1751
 
1929
- Relationship mode object generation behaviour:
1930
-
1931
- * Standard relationship SRO: Imported `software` object is (`source_ref`) object connected to Report
1932
- * AI mode relationship SROs: all imported objects are connected as source or target object (depending on if extraction is source or target)
1752
+ If no objects are returned by an extraction, you will see an error in the logs and data file/
1933
1753
 
1934
1754
  ## Relationship objects
1935
1755
 
1936
- ### Fixed SCO to Indicator relationships for extractions
1756
+ ### Fixed Indicator -> SRO relationships for extractions
1937
1757
 
1938
- In some extractions, SROs are created to link extractions (SCO linked to Indicator)
1758
+ In some extractions, SROs are created to link extractions (Indicator -> SCO)
1939
1759
 
1940
1760
  These relationships are modelled as follows;
1941
1761
 
@@ -1948,42 +1768,9 @@ These relationships are modelled as follows;
1948
1768
  "created": "<REPORT CREATED DATE>",
1949
1769
  "modified": "<REPORT CREATED DATE>",
1950
1770
  "relationship_type": "<DEFINED BY EXTRACTION>",
1951
- "source_ref": "<SCO ID>",
1952
- "target_ref": "indicator--<ID>",
1953
- "description": "<SOURCE OBJECT NAME> is found in <REPORT NAME>",
1954
- "object_marking_refs": [
1955
- "marking-definition--<TLP LEVEL SET>"
1956
- "marking-definition--f92e15d9-6afc-5ae2-bb3e-85a1fd83a3b5"
1957
- ],
1958
- "external_references": [
1959
- {
1960
- "source_name": "txt2stix_report_id",
1961
- "external_id": "<UUID OF REPORT OBJECT>"
1962
- },
1963
- {
1964
- "source_name": "txt2stix_extraction_type",
1965
- "external_id": "<EXTRACTION SLUG>_<EXTRACTION_VERSION>"
1966
- }
1967
- ]
1968
- }
1969
- ```
1970
-
1971
- ### Relationships generated in `standard` relationship mode
1972
-
1973
- In standard mode, one SRO is created for each extraction back to the source report object created for the job.
1974
-
1975
- ```json
1976
- {
1977
- "type": "relationship",
1978
- "spec_version": "2.1",
1979
- "id": "relationship--<GENERATED BY STIX2 LIBRARY>",
1980
- "created_by_ref": "identity--<DEFAULT/CUSTOM IDENTITY ID>",
1981
- "created": "<REPORT CREATED DATE>",
1982
- "modified": "<REPORT CREATED DATE>",
1983
- "relationship_type": "extracted-from",
1984
- "source_ref": "<SOURCE OBJECT ID AS DEFINED BY STIX EXTRACTION>",
1985
- "target_ref": "report--<REPORT OBJECT ID CREATED FOR JOB>",
1986
- "description": "<SOURCE OBJECT NAME> is found in <REPORT NAME>",
1771
+ "source_ref": "indicator--<ID>",
1772
+ "target_ref": "<SCO ID>",
1773
+ "description": "STIX pattern contains <SCO VALUE>",
1987
1774
  "object_marking_refs": [
1988
1775
  "marking-definition--<TLP LEVEL SET>"
1989
1776
  "marking-definition--f92e15d9-6afc-5ae2-bb3e-85a1fd83a3b5"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "txt2stix"
7
- version = "1.0.13"
7
+ version = "1.1.0"
8
8
  authors = [{ name = "dogesec" }]
9
9
  maintainers = [{ name = "dogesec" }]
10
10
  description = "txt2stix is a Python script that is designed to identify and extract IoCs and TTPs from text files, identify the relationships between them, convert them to STIX 2.1 objects, and output as a STIX 2.1 bundle."
@@ -32,6 +32,7 @@ dependencies = [
32
32
  'llama-index-llms-openai>=0.4.5',
33
33
  'mistune>=3.0.2',
34
34
  'beautifulsoup4>=4.12.3',
35
+ 'stix2-validator',
35
36
  ]
36
37
 
37
38
  [tool.hatch.metadata]
@@ -0,0 +1,2 @@
1
+ cpe:2.3:a:appcheap:app_builder:500000:*:*:*:*:wordpress:*:*
2
+ CVE-2026-99999
@@ -557,4 +557,24 @@ python3 txt2stix.py \
557
557
  --use_extractions 'ai_ipv4_address_only' \
558
558
  --ai_settings_extractions openai:gpt-4o \
559
559
  --report_id 2b3326b4-dfcf-4391-b550-e91652f9ffcd
560
- ```
560
+ ```
561
+
562
+ ### test vulmatch lookup failure behaviour
563
+
564
+ (should create no objects)
565
+
566
+
567
+ ```shell
568
+ python3 txt2stix.py \
569
+ --relationship_mode standard \
570
+ --input_file tests/data/manually_generated_reports/bad_vulmatch_lookups.txt \
571
+ --name 'test vulmatch lookup failure behaviour' \
572
+ --tlp_level clear \
573
+ --confidence 100 \
574
+ --use_extractions pattern_cve_id,pattern_cpe_uri \
575
+ --report_id c0766db1-0748-429b-8e4c-f1a3a9fd1a3a
576
+ ```
577
+
578
+
579
+
580
+