txt2stix 1.1.15__tar.gz → 1.2.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 (264) hide show
  1. {txt2stix-1.1.15 → txt2stix-1.2.0}/PKG-INFO +1 -1
  2. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/extractions/ai/config.yaml +17 -1
  3. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/extractions/lookup/config.yaml +17 -2
  4. {txt2stix-1.1.15 → txt2stix-1.2.0}/pyproject.toml +1 -1
  5. {txt2stix-1.1.15 → txt2stix-1.2.0}/requirements.txt +3 -3
  6. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/manual-tests/cases-extraction-type-ai.md +17 -1
  7. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/test_retriever.py +14 -1
  8. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/indicator.py +5 -2
  9. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/retriever.py +8 -2
  10. {txt2stix-1.1.15 → txt2stix-1.2.0}/.env.example +0 -0
  11. {txt2stix-1.1.15 → txt2stix-1.2.0}/.env.markdown +0 -0
  12. {txt2stix-1.1.15 → txt2stix-1.2.0}/.github/workflows/create-release.yml +0 -0
  13. {txt2stix-1.1.15 → txt2stix-1.2.0}/.github/workflows/run-tests.yml +0 -0
  14. {txt2stix-1.1.15 → txt2stix-1.2.0}/.gitignore +0 -0
  15. {txt2stix-1.1.15 → txt2stix-1.2.0}/LICENSE +0 -0
  16. {txt2stix-1.1.15 → txt2stix-1.2.0}/README.md +0 -0
  17. {txt2stix-1.1.15 → txt2stix-1.2.0}/docs/README.md +0 -0
  18. {txt2stix-1.1.15 → txt2stix-1.2.0}/docs/stix-mapping.md +0 -0
  19. {txt2stix-1.1.15 → txt2stix-1.2.0}/docs/txt2stix.png +0 -0
  20. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/__init__.py +0 -0
  21. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/extractions/pattern/config.yaml +0 -0
  22. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/helpers/mimetype_filename_extension_list.csv +0 -0
  23. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/helpers/stix_relationship_types.txt +0 -0
  24. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/helpers/tlds.txt +0 -0
  25. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/helpers/windows_registry_key_prefix.txt +0 -0
  26. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/_README.md +0 -0
  27. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/_generate_lookups.py +0 -0
  28. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/attack_pattern.txt +0 -0
  29. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/campaign.txt +0 -0
  30. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/country_iso3166_alpha2.txt +0 -0
  31. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/course_of_action.txt +0 -0
  32. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/disarm_id_v1_6.txt +0 -0
  33. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/disarm_name_v1_6.txt +0 -0
  34. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/extensions.txt +0 -0
  35. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/identity.txt +0 -0
  36. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/infrastructure.txt +0 -0
  37. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/intrusion_set.txt +0 -0
  38. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/malware.txt +0 -0
  39. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_atlas_id_v4_9_0.txt +0 -0
  40. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_atlas_name_v4_9_0.txt +0 -0
  41. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_attack_enterprise_aliases_v18_0.txt +0 -0
  42. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_attack_enterprise_id_v18_0.txt +0 -0
  43. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_attack_enterprise_name_v18_0.txt +0 -0
  44. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_attack_ics_aliases_v18_0.txt +0 -0
  45. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_attack_ics_id_v18_0.txt +0 -0
  46. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_attack_ics_name_v18_0.txt +0 -0
  47. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_attack_mobile_aliases_v18_0.txt +0 -0
  48. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_attack_mobile_id_v18_0.txt +0 -0
  49. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_attack_mobile_name_v18_0.txt +0 -0
  50. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_capec_id_v3_9.txt +0 -0
  51. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_capec_name_v3_9.txt +0 -0
  52. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_cwe_id_v4_18.txt +0 -0
  53. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/mitre_cwe_name_v4_18.txt +0 -0
  54. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/sector_aliases_v1_0.txt +0 -0
  55. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/threat_actor.txt +0 -0
  56. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/tld.txt +0 -0
  57. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/lookups/tool.txt +0 -0
  58. {txt2stix-1.1.15 → txt2stix-1.2.0}/includes/tests/test_cases.yaml +0 -0
  59. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/README.md +0 -0
  60. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/ai_country.txt +0 -0
  61. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/ai_mitre_attack_enterprise.txt +0 -0
  62. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/ai_mitre_attack_ics.txt +0 -0
  63. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/ai_mitre_attack_mobile.txt +0 -0
  64. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/ai_mitre_capec.txt +0 -0
  65. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/ai_mitre_cwe.txt +0 -0
  66. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/all_cases.txt +0 -0
  67. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_autonomous_system_number.txt +0 -0
  68. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_bank_card_all.txt +0 -0
  69. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_bank_card_amex.txt +0 -0
  70. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_bank_card_diners.txt +0 -0
  71. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_bank_card_discover.txt +0 -0
  72. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_bank_card_jcb.txt +0 -0
  73. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_bank_card_mastercard.txt +0 -0
  74. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_bank_card_union_pay.txt +0 -0
  75. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_bank_card_visa.txt +0 -0
  76. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_country_alpha2.txt +0 -0
  77. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_cpe_uri.txt +0 -0
  78. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_cryptocurrency_btc_transaction.txt +0 -0
  79. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_cryptocurrency_btc_wallet.txt +0 -0
  80. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_cryptocurrency_eth_transaction.txt +0 -0
  81. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_cryptocurrency_eth_wallet.txt +0 -0
  82. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_cryptocurrency_xmr_transaction.txt +0 -0
  83. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_cryptocurrency_xmr_wallet.txt +0 -0
  84. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_cve_id.txt +0 -0
  85. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_directory_unix.txt +0 -0
  86. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_directory_unix_file.txt +0 -0
  87. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_directory_windows.txt +0 -0
  88. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_directory_windows_with_file.txt +0 -0
  89. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_disarm.txt +0 -0
  90. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_disarm_name.txt +0 -0
  91. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_domain_name_only.txt +0 -0
  92. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_domain_name_subdomain.txt +0 -0
  93. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_email_address.txt +0 -0
  94. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_file_hash_md5.txt +0 -0
  95. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_file_hash_sha_1.txt +0 -0
  96. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_file_hash_sha_224.txt +0 -0
  97. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_file_hash_sha_256.txt +0 -0
  98. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_file_hash_sha_384.txt +0 -0
  99. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_file_hash_sha_512.txt +0 -0
  100. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_file_name.txt +0 -0
  101. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_host_name.txt +0 -0
  102. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_host_name_file.txt +0 -0
  103. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_host_name_path.txt +0 -0
  104. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_host_name_subdomain.txt +0 -0
  105. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_host_name_url.txt +0 -0
  106. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_iban_number.txt +0 -0
  107. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_ipv4_address_cidr.txt +0 -0
  108. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_ipv4_address_only.txt +0 -0
  109. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_ipv4_address_port.txt +0 -0
  110. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_ipv6_address_cidr.txt +0 -0
  111. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_ipv6_address_only.txt +0 -0
  112. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_ipv6_address_port.txt +0 -0
  113. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mac_address.txt +0 -0
  114. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_atlas.txt +0 -0
  115. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_atlas_name.txt +0 -0
  116. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_attack_enterprise.txt +0 -0
  117. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_attack_enterprise_aliases.txt +0 -0
  118. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_attack_enterprise_name.txt +0 -0
  119. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_attack_ics.txt +0 -0
  120. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_attack_ics_aliases.txt +0 -0
  121. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_attack_ics_name.txt +0 -0
  122. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_attack_mobile.txt +0 -0
  123. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_attack_mobile_aliases.txt +0 -0
  124. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_attack_mobile_name.txt +0 -0
  125. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_capec.txt +0 -0
  126. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_capec_name.txt +0 -0
  127. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_cwe.txt +0 -0
  128. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_mitre_cwe_name.txt +0 -0
  129. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_phone_number.txt +0 -0
  130. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_sector_aliases.txt +0 -0
  131. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_url.txt +0 -0
  132. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_url_file.txt +0 -0
  133. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_url_path.txt +0 -0
  134. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_user_agent.txt +0 -0
  135. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/generic_windows_registry_key.txt +0 -0
  136. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/lookup_attack_pattern.txt +0 -0
  137. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/lookup_campaign.txt +0 -0
  138. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/lookup_course_of_action.txt +0 -0
  139. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/lookup_identity.txt +0 -0
  140. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/lookup_infrastructure.txt +0 -0
  141. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/lookup_intrusion_set.txt +0 -0
  142. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/lookup_malware.txt +0 -0
  143. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/lookup_threat_actor.txt +0 -0
  144. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/extraction_types/lookup_tool.txt +0 -0
  145. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/ai_index_position.txt +0 -0
  146. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/attack_flow_demo.txt +0 -0
  147. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/attack_navigator_demo.txt +0 -0
  148. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/bad_vulmatch_lookups.txt +0 -0
  149. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/basic_relationship.txt +0 -0
  150. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/char_length_too_long.txt +0 -0
  151. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/descriptive_for_ai_relationships_1.txt +0 -0
  152. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/disarm_demo.txt +0 -0
  153. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/embedded_img_ignore.txt +0 -0
  154. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/embedded_link_ignore.txt +0 -0
  155. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/ip1.txt +0 -0
  156. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/ip2.txt +0 -0
  157. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/known_whitelist_match.txt +0 -0
  158. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/mitre_attack_enterprise_ai_demo.txt +0 -0
  159. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/mitre_attack_enterprise_lookup_demo.txt +0 -0
  160. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/mixed_extractions.txt +0 -0
  161. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/not_security_content.txt +0 -0
  162. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/test_ai_hash_error_with_stix2_lib.txt +0 -0
  163. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/test_aliases.txt +0 -0
  164. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/test_extraction_boundary.txt +0 -0
  165. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/manually_generated_reports/test_extraction_escapes.txt +0 -0
  166. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/real_intel_reports/APT28-Center-of-Storm-2017.txt +0 -0
  167. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/real_intel_reports/Bitdefender-Labs-Report-X-creat6958-en-EN.txt +0 -0
  168. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/real_intel_reports/FireEyeAPT39.txt +0 -0
  169. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/real_intel_reports/France_CERT_APT31_Pakdoor_TLPWHITE.txt +0 -0
  170. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/real_intel_reports/Group-IB_Ransomware_Uncovered_whitepaper_eng.txt +0 -0
  171. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/real_intel_reports/JOINT_CSA_HUNTING_RU_INTEL_SNAKE_MALWARE_20230509.txt +0 -0
  172. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/real_intel_reports/TA22-0126-QAKBOT-analysis-TLP-GREEN.txt +0 -0
  173. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/real_intel_reports/dinners_card.txt +0 -0
  174. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/real_intel_reports/mandiant-apt1.txt +0 -0
  175. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/data/real_intel_reports/mykings_report_final.txt +0 -0
  176. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/manual-tests/cases-ai-relationships.md +0 -0
  177. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/manual-tests/cases-extraction-type-lookup.md +0 -0
  178. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/manual-tests/cases-extraction-type-pattern.md +0 -0
  179. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/manual-tests/cases-standard-tests.md +0 -0
  180. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/scripts/generate_simple_extraction_test_cases_txt_files.py +0 -0
  181. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/__init__.py +0 -0
  182. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/test_attack_flow.py +0 -0
  183. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/test_bundler.py +0 -0
  184. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/test_extractors.py +0 -0
  185. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/test_indicator.py +0 -0
  186. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/test_lookups.py +0 -0
  187. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/test_main.py +0 -0
  188. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/test_run_txt2stix.py +0 -0
  189. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/test_utils.py +0 -0
  190. {txt2stix-1.1.15 → txt2stix-1.2.0}/tests/src/utils.py +0 -0
  191. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/__init__.py +0 -0
  192. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/ai_extractor/__init__.py +0 -0
  193. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/ai_extractor/anthropic.py +0 -0
  194. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/ai_extractor/base.py +0 -0
  195. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/ai_extractor/deepseek.py +0 -0
  196. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/ai_extractor/gemini.py +0 -0
  197. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/ai_extractor/openai.py +0 -0
  198. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/ai_extractor/openrouter.py +0 -0
  199. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/ai_extractor/prompts.py +0 -0
  200. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/ai_extractor/utils.py +0 -0
  201. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/attack_flow.py +0 -0
  202. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/bundler.py +0 -0
  203. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/common.py +0 -0
  204. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/credential_checker.py +0 -0
  205. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/extractions.py +0 -0
  206. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/lookups.py +0 -0
  207. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/__init__.py +0 -0
  208. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/__init__.py +0 -0
  209. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/base_extractor.py +0 -0
  210. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/card/README.md +0 -0
  211. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/card/__init__.py +0 -0
  212. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/card/amex_card_extractor.py +0 -0
  213. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/card/diners_card_extractor.py +0 -0
  214. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/card/discover_card_extractor.py +0 -0
  215. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/card/jcb_card_extractor.py +0 -0
  216. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/card/master_card_extractor.py +0 -0
  217. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/card/union_card_extractor.py +0 -0
  218. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/card/visa_card_extractor.py +0 -0
  219. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/crypto/__init__.py +0 -0
  220. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/crypto/btc_extractor.py +0 -0
  221. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/directory/__init__.py +0 -0
  222. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/directory/unix_directory_extractor.py +0 -0
  223. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/directory/unix_file_path_extractor.py +0 -0
  224. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/directory/windows_directory_path_extractor.py +0 -0
  225. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/directory/windows_file_path_extractor.py +0 -0
  226. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/domain/__init__.py +0 -0
  227. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/domain/domain_extractor.py +0 -0
  228. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/domain/hostname_extractor.py +0 -0
  229. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/domain/sub_domain_extractor.py +0 -0
  230. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/hashes/__init__.py +0 -0
  231. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/hashes/md5_extractor.py +0 -0
  232. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/hashes/sha1_extractor.py +0 -0
  233. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/hashes/sha224_extractor.py +0 -0
  234. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/hashes/sha2_256_exactor.py +0 -0
  235. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/hashes/sha2_512_exactor.py +0 -0
  236. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/hashes/sha3_256_exactor.py +0 -0
  237. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/hashes/sha3_512_exactor.py +0 -0
  238. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/helper.py +0 -0
  239. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/ip/__init__.py +0 -0
  240. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/ip/ipv4_cidr_extractor.py +0 -0
  241. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/ip/ipv4_extractor.py +0 -0
  242. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/ip/ipv4_port_extractor.py +0 -0
  243. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/ip/ipv6_cidr_extractor.py +0 -0
  244. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/ip/ipv6_extractor.py +0 -0
  245. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/ip/ipv6_port_extractor.py +0 -0
  246. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/__init__.py +0 -0
  247. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/asn_extractor.py +0 -0
  248. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/cpe_extractor.py +0 -0
  249. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/cve_extractor.py +0 -0
  250. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/email_extractor.py +0 -0
  251. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/filename_extractor.py +0 -0
  252. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/iban_extractor.py +0 -0
  253. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/mac_address_extractor.py +0 -0
  254. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/phonenumber_extractor.py +0 -0
  255. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/user_agent_extractor.py +0 -0
  256. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/others/windows_registry_key_extractor.py +0 -0
  257. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/url/__init__.py +0 -0
  258. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/url/url_extractor.py +0 -0
  259. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/url/url_file_extractor.py +0 -0
  260. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/pattern/extractors/url/url_path_extractor.py +0 -0
  261. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/stix.py +0 -0
  262. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/txt2stix.py +0 -0
  263. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix/utils.py +0 -0
  264. {txt2stix-1.1.15 → txt2stix-1.2.0}/txt2stix.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: txt2stix
3
- Version: 1.1.15
3
+ Version: 1.2.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
@@ -778,7 +778,23 @@ ai_country:
778
778
  type: ai
779
779
  dogesec_web: true
780
780
  name: 'Country'
781
- description: 'Will extract countries, turn into two digit country codes, and import location object from CTI Butler.'
781
+ description: 'Will extract countries, turn into two digit country codes, and import location (and all related regions and subregions) object from CTI Butler.'
782
+ notes: 'lookup_country_alpha2 legacy extraction also exists if you cannot use AI'
783
+ created: 2020-01-01
784
+ modified: 2020-01-01
785
+ created_by: dogesec
786
+ version: 1.0.0
787
+ prompt_base: 'Extract all countries described in the text, including countries printed as IS0-3166 Alpha2 and Alpha3 codes.'
788
+ prompt_helper: 'If you are unsure, you can read more about the standard here: https://www.iso.org/iso-3166-country-codes.html'
789
+ prompt_conversion: 'Convert all country extractions to their corresponding IS0-3166 Alpha2 codes.'
790
+ test_cases: ai_country
791
+ stix_mapping: ctibutler-location-with-regions
792
+
793
+ ai_country_only:
794
+ type: ai
795
+ dogesec_web: true
796
+ name: 'Country only'
797
+ description: 'Will extract countries, turn into two digit country codes, and import location (without regions and subregions) object from CTI Butler.'
782
798
  notes: 'lookup_country_alpha2 legacy extraction also exists if you cannot use AI'
783
799
  created: 2020-01-01
784
800
  modified: 2020-01-01
@@ -5,8 +5,23 @@
5
5
  lookup_country_alpha2:
6
6
  type: lookup
7
7
  dogesec_web: false
8
- name: 'Country Alpha2'
9
- description: 'Extracts countries using ISO 3166-1 alpha2 codes'
8
+ name: 'Country Alpha2 (with regions)'
9
+ description: 'Extracts countries using ISO 3166-1 alpha2 codes (will create relationships to regions and subregions).'
10
+ notes: 'RECOMMENDED FOR BETTER ACCURACY: Use ai_country. This extractor is very dumb e.g the words `is` and `in` will result in extractions for Iceland and India'
11
+ file: 'lookups/country_iso3166_alpha2.txt'
12
+ created: 2020-01-01
13
+ modified: 2020-01-01
14
+ created_by: dogesec
15
+ version: 1.0.0
16
+ test_cases: generic_country_alpha2
17
+ stix_mapping: ctibutler-location-with-regions
18
+
19
+
20
+ lookup_country_alpha2_country_only:
21
+ type: lookup
22
+ dogesec_web: false
23
+ name: 'Country Alpha2 (without regions)'
24
+ description: 'Extracts countries using ISO 3166-1 alpha2 codes (will not create relationships).'
10
25
  notes: 'RECOMMENDED FOR BETTER ACCURACY: Use ai_country. This extractor is very dumb e.g the words `is` and `in` will result in extractions for Iceland and India'
11
26
  file: 'lookups/country_iso3166_alpha2.txt'
12
27
  created: 2020-01-01
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "txt2stix"
7
- version = "1.1.15"
7
+ version = "1.2.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."
@@ -6,7 +6,7 @@
6
6
  #
7
7
  aiohappyeyeballs==2.6.1
8
8
  # via aiohttp
9
- aiohttp==3.12.15
9
+ aiohttp==3.13.3
10
10
  # via llama-index-core
11
11
  aiosignal==1.4.0
12
12
  # via aiohttp
@@ -121,7 +121,7 @@ llama-index-workflows==1.3.0
121
121
  # via llama-index-core
122
122
  markupsafe==3.0.2
123
123
  # via jinja2
124
- marshmallow==3.26.1
124
+ marshmallow==3.26.2
125
125
  # via dataclasses-json
126
126
  mistune==3.1.3
127
127
  # via txt2stix (pyproject.toml)
@@ -274,7 +274,7 @@ tzdata==2025.2
274
274
  # via arrow
275
275
  uri-template==1.3.0
276
276
  # via jsonschema
277
- urllib3==2.6.0
277
+ urllib3==2.6.3
278
278
  # via requests
279
279
  validators==0.35.0
280
280
  # via txt2stix (pyproject.toml)
@@ -738,7 +738,7 @@ python3 txt2stix.py \
738
738
  python3 txt2stix.py \
739
739
  --relationship_mode standard \
740
740
  --input_file tests/data/extraction_types/ai_country.txt \
741
- --name 'ai_country_alpha2' \
741
+ --name 'ai_country' \
742
742
  --tlp_level clear \
743
743
  --confidence 100 \
744
744
  --use_extractions ai_country \
@@ -746,6 +746,22 @@ python3 txt2stix.py \
746
746
  --report_id 256f89fe-ad21-4604-9d6d-b8b5335f4657
747
747
  ```
748
748
 
749
+ Check regions are imported.
750
+
751
+ #### ai_country_only
752
+
753
+ ```shell
754
+ python3 txt2stix.py \
755
+ --relationship_mode standard \
756
+ --input_file tests/data/extraction_types/ai_country.txt \
757
+ --name 'ai_country_only' \
758
+ --tlp_level clear \
759
+ --confidence 100 \
760
+ --use_extractions ai_country_only \
761
+ --ai_settings_extractions openai:gpt-5 \
762
+ --report_id 7adbbed0-0d22-43e0-9894-1adb6a708461
763
+ ```
764
+
749
765
  #### ai_mitre_attack_enterprise
750
766
 
751
767
  ```shell
@@ -89,6 +89,19 @@ def f():
89
89
  "NG",
90
90
  ("location--6dbe266a-c149-5ba3-8b39-74f1b5063312",),
91
91
  ),
92
+ (
93
+ "ctibutler-location-with-regions",
94
+ "NG",
95
+ [
96
+ "location--6dbe266a-c149-5ba3-8b39-74f1b5063312",
97
+ "location--097ca10f-e203-53c0-8f9d-2634ac58bc1b",
98
+ "location--48451447-0bc6-517a-aff5-a779d3a24a21",
99
+ "location--ccb963ba-9370-5eeb-80e3-c8d8738275ed",
100
+ "relationship--28b54976-c9a6-586c-9378-18556f917d3c",
101
+ "relationship--3cb6677e-c141-56c0-ba3e-6f9d03fa8487",
102
+ "relationship--769ac179-c26b-5ca0-abde-d61667962b82",
103
+ ],
104
+ ),
92
105
  (
93
106
  "ctibutler-mitre-atlas-id",
94
107
  "AML.T0050",
@@ -134,5 +147,5 @@ def f():
134
147
  def test_retrieve_objects(stix_mapping, kb_id, expected_ids, f):
135
148
  objects = retrieve_stix_objects(stix_mapping, kb_id)
136
149
  assert objects != None
137
- object_ids = {obj["id"] for obj in objects}
150
+ object_ids = {x['id'] for x in objects}
138
151
  assert object_ids == set(expected_ids)
@@ -106,7 +106,10 @@ def _build_observables(
106
106
  ):
107
107
  retrieved_objects = retrieve_stix_objects(stix_mapping, extracted_value)
108
108
  if retrieved_objects:
109
- return retrieved_objects, [sdo["id"] for sdo in retrieved_objects]
109
+ relatable = [sdo["id"] for sdo in retrieved_objects]
110
+ if 'location' in stix_mapping:
111
+ relatable = [retrieved_objects[0]['id']]
112
+ return retrieved_objects, relatable
110
113
  if retrieved_objects == []:
111
114
  logger.warning(
112
115
  f"could not find `{stix_mapping}` with id=`{extracted_value}` in remote"
@@ -623,7 +626,7 @@ def _build_observables(
623
626
  extracted_value = extracted_value.replace("-", "").replace(" ", "")
624
627
 
625
628
  country_code, bank_code = get_iban_details(extracted_value)
626
- location = retrieve_stix_objects("location", country_code)[0]
629
+ location = retrieve_stix_objects("ctibutler-location", country_code)[0]
627
630
  stix_objects.append(location)
628
631
 
629
632
  bank_acc = dict_to_stix2(
@@ -69,6 +69,10 @@ class STIXObjectRetriever:
69
69
  return self._retrieve_objects(
70
70
  urljoin(self.api_root, f"v1/location/objects/?alpha2_code={id}")
71
71
  )
72
+
73
+ def get_location_bundle(self, id):
74
+ endpoint = urljoin(self.api_root, f"v1/location/objects/{id}/bundle/?types=location,relationship")
75
+ return self._retrieve_objects(endpoint, key="objects")
72
76
 
73
77
  def get_objects_by_name(self, name, type):
74
78
  return self._retrieve_objects(
@@ -122,6 +126,10 @@ def _retrieve_stix_objects(host, knowledge_base, filter_value):
122
126
  return retreiver.retrieve_object_by_id(filter_value, "cpe")
123
127
  case "location":
124
128
  return retreiver.get_location_objects(filter_value)
129
+ case "location-with-regions":
130
+ locations = retreiver.get_location_bundle(filter_value)
131
+ locations.sort(key=lambda x: int(x.get('country') == filter_value), reverse=True)
132
+ return locations
125
133
 
126
134
  ### ATT&CK by Name
127
135
  case "mitre-attack-enterprise-name":
@@ -162,8 +170,6 @@ def _retrieve_stix_objects(host, knowledge_base, filter_value):
162
170
 
163
171
  def retrieve_stix_objects(stix_mapping: str, filter_value, host=None):
164
172
  knowledge_base = stix_mapping
165
- if stix_mapping in ["location"]:
166
- host = "ctibutler"
167
173
  if not host:
168
174
  host, _, knowledge_base = stix_mapping.partition("-")
169
175
  try:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes