secator 0.17.0__tar.gz → 0.18.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.

Potentially problematic release.


This version of secator might be problematic. Click here for more details.

Files changed (217) hide show
  1. {secator-0.17.0 → secator-0.18.0}/.docker/build_all.sh +13 -1
  2. secator-0.18.0/.dockerignore +4 -0
  3. {secator-0.17.0 → secator-0.18.0}/.gitignore +3 -0
  4. {secator-0.17.0 → secator-0.18.0}/CHANGELOG.md +19 -0
  5. {secator-0.17.0 → secator-0.18.0}/PKG-INFO +1 -1
  6. {secator-0.17.0 → secator-0.18.0}/helm/templates/redis-service.yaml +0 -1
  7. {secator-0.17.0 → secator-0.18.0}/helm/templates/redis.yaml +6 -2
  8. secator-0.18.0/helm/templates/secator-manager.yaml +22 -0
  9. {secator-0.17.0 → secator-0.18.0}/helm/templates/secator-worker.yaml +8 -3
  10. secator-0.18.0/helm/values.yaml +58 -0
  11. {secator-0.17.0 → secator-0.18.0}/pyproject.toml +1 -1
  12. {secator-0.17.0 → secator-0.18.0}/secator/config.py +1 -1
  13. secator-0.18.0/secator/configs/workflows/user_hunt.yaml +24 -0
  14. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/wordpress.yaml +13 -0
  15. {secator-0.17.0 → secator-0.18.0}/secator/runners/_base.py +8 -8
  16. {secator-0.17.0 → secator-0.18.0}/secator/runners/command.py +9 -6
  17. {secator-0.17.0 → secator-0.18.0}/secator/tasks/bup.py +1 -1
  18. {secator-0.17.0 → secator-0.18.0}/secator/tasks/fping.py +24 -7
  19. {secator-0.17.0 → secator-0.18.0}/secator/tasks/maigret.py +7 -2
  20. {secator-0.17.0 → secator-0.18.0}/secator/tasks/wpscan.py +15 -4
  21. {secator-0.17.0 → secator-0.18.0}/tests/integration/inputs.py +1 -1
  22. {secator-0.17.0 → secator-0.18.0}/tests/integration/outputs.py +1 -1
  23. secator-0.17.0/.dockerignore +0 -1
  24. secator-0.17.0/helm/templates/secator-manager.yaml +0 -18
  25. secator-0.17.0/helm/values.yaml +0 -34
  26. secator-0.17.0/secator/configs/workflows/user_hunt.yaml +0 -12
  27. {secator-0.17.0 → secator-0.18.0}/.coderabbit.yaml +0 -0
  28. {secator-0.17.0 → secator-0.18.0}/.docker/Dockerfile.alpine +0 -0
  29. {secator-0.17.0 → secator-0.18.0}/.docker/Dockerfile.arch +0 -0
  30. {secator-0.17.0 → secator-0.18.0}/.docker/Dockerfile.debian +0 -0
  31. {secator-0.17.0 → secator-0.18.0}/.docker/Dockerfile.kali +0 -0
  32. {secator-0.17.0 → secator-0.18.0}/.docker/Dockerfile.osx +0 -0
  33. {secator-0.17.0 → secator-0.18.0}/.docker/Dockerfile.ubuntu +0 -0
  34. {secator-0.17.0 → secator-0.18.0}/.flake8 +0 -0
  35. {secator-0.17.0 → secator-0.18.0}/CONTRIBUTING.md +0 -0
  36. {secator-0.17.0 → secator-0.18.0}/Dockerfile +0 -0
  37. {secator-0.17.0 → secator-0.18.0}/LICENSE +0 -0
  38. {secator-0.17.0 → secator-0.18.0}/README.md +0 -0
  39. {secator-0.17.0 → secator-0.18.0}/SECURITY.md +0 -0
  40. {secator-0.17.0 → secator-0.18.0}/cloudbuild.yaml +0 -0
  41. {secator-0.17.0 → secator-0.18.0}/helm/.helmignore +0 -0
  42. {secator-0.17.0 → secator-0.18.0}/helm/Chart.yaml +0 -0
  43. {secator-0.17.0 → secator-0.18.0}/scripts/download_cves.sh +0 -0
  44. {secator-0.17.0 → secator-0.18.0}/scripts/generate_tools_md_table.py +0 -0
  45. {secator-0.17.0 → secator-0.18.0}/scripts/install.sh +0 -0
  46. {secator-0.17.0 → secator-0.18.0}/scripts/install_asciinema.sh +0 -0
  47. {secator-0.17.0 → secator-0.18.0}/scripts/install_go.sh +0 -0
  48. {secator-0.17.0 → secator-0.18.0}/scripts/install_ruby.sh +0 -0
  49. {secator-0.17.0 → secator-0.18.0}/scripts/msf/exploit_cve.rc +0 -0
  50. {secator-0.17.0 → secator-0.18.0}/scripts/msf/ftp_anonymous.rc +0 -0
  51. {secator-0.17.0 → secator-0.18.0}/scripts/msf/ftp_version.rc +0 -0
  52. {secator-0.17.0 → secator-0.18.0}/scripts/msf/ftp_vsftpd_234_backdoor.rc +0 -0
  53. {secator-0.17.0 → secator-0.18.0}/scripts/msf/redis.rc +0 -0
  54. {secator-0.17.0 → secator-0.18.0}/scripts/stories/STORY.md +0 -0
  55. {secator-0.17.0 → secator-0.18.0}/scripts/stories/aliases.sh +0 -0
  56. {secator-0.17.0 → secator-0.18.0}/scripts/stories/demo.sh +0 -0
  57. {secator-0.17.0 → secator-0.18.0}/scripts/stories/fmt.sh +0 -0
  58. {secator-0.17.0 → secator-0.18.0}/scripts/stories/input.sh +0 -0
  59. {secator-0.17.0 → secator-0.18.0}/scripts/stories/pipe.sh +0 -0
  60. {secator-0.17.0 → secator-0.18.0}/scripts/stories/short_demo.sh +0 -0
  61. {secator-0.17.0 → secator-0.18.0}/scripts/update_tools.sh +0 -0
  62. {secator-0.17.0 → secator-0.18.0}/secator/.gitignore +0 -0
  63. {secator-0.17.0 → secator-0.18.0}/secator/__init__.py +0 -0
  64. {secator-0.17.0 → secator-0.18.0}/secator/celery.py +0 -0
  65. {secator-0.17.0 → secator-0.18.0}/secator/celery_signals.py +0 -0
  66. {secator-0.17.0 → secator-0.18.0}/secator/celery_utils.py +0 -0
  67. {secator-0.17.0 → secator-0.18.0}/secator/cli.py +0 -0
  68. {secator-0.17.0 → secator-0.18.0}/secator/cli_helper.py +0 -0
  69. {secator-0.17.0 → secator-0.18.0}/secator/click.py +0 -0
  70. {secator-0.17.0 → secator-0.18.0}/secator/configs/__init__.py +0 -0
  71. {secator-0.17.0 → secator-0.18.0}/secator/configs/profiles/__init__.py +0 -0
  72. {secator-0.17.0 → secator-0.18.0}/secator/configs/profiles/aggressive.yaml +0 -0
  73. {secator-0.17.0 → secator-0.18.0}/secator/configs/profiles/http_headless.yaml +0 -0
  74. {secator-0.17.0 → secator-0.18.0}/secator/configs/profiles/http_record.yaml +0 -0
  75. {secator-0.17.0 → secator-0.18.0}/secator/configs/profiles/insane.yaml +0 -0
  76. {secator-0.17.0 → secator-0.18.0}/secator/configs/profiles/paranoid.yaml +0 -0
  77. {secator-0.17.0 → secator-0.18.0}/secator/configs/profiles/polite.yaml +0 -0
  78. {secator-0.17.0 → secator-0.18.0}/secator/configs/profiles/sneaky.yaml +0 -0
  79. {secator-0.17.0 → secator-0.18.0}/secator/configs/profiles/tor.yaml +0 -0
  80. {secator-0.17.0 → secator-0.18.0}/secator/configs/scans/__init__.py +0 -0
  81. {secator-0.17.0 → secator-0.18.0}/secator/configs/scans/domain.yaml +0 -0
  82. {secator-0.17.0 → secator-0.18.0}/secator/configs/scans/host.yaml +0 -0
  83. {secator-0.17.0 → secator-0.18.0}/secator/configs/scans/network.yaml +0 -0
  84. {secator-0.17.0 → secator-0.18.0}/secator/configs/scans/subdomain.yaml +0 -0
  85. {secator-0.17.0 → secator-0.18.0}/secator/configs/scans/url.yaml +0 -0
  86. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/__init__.py +0 -0
  87. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/cidr_recon.yaml +0 -0
  88. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/code_scan.yaml +0 -0
  89. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/host_recon.yaml +0 -0
  90. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/subdomain_recon.yaml +0 -0
  91. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/url_bypass.yaml +0 -0
  92. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/url_crawl.yaml +0 -0
  93. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/url_dirsearch.yaml +0 -0
  94. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/url_fuzz.yaml +0 -0
  95. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/url_params_fuzz.yaml +0 -0
  96. {secator-0.17.0 → secator-0.18.0}/secator/configs/workflows/url_vuln.yaml +0 -0
  97. {secator-0.17.0 → secator-0.18.0}/secator/cve.py +0 -0
  98. {secator-0.17.0 → secator-0.18.0}/secator/decorators.py +0 -0
  99. {secator-0.17.0 → secator-0.18.0}/secator/definitions.py +0 -0
  100. {secator-0.17.0 → secator-0.18.0}/secator/exporters/__init__.py +0 -0
  101. {secator-0.17.0 → secator-0.18.0}/secator/exporters/_base.py +0 -0
  102. {secator-0.17.0 → secator-0.18.0}/secator/exporters/console.py +0 -0
  103. {secator-0.17.0 → secator-0.18.0}/secator/exporters/csv.py +0 -0
  104. {secator-0.17.0 → secator-0.18.0}/secator/exporters/gdrive.py +0 -0
  105. {secator-0.17.0 → secator-0.18.0}/secator/exporters/json.py +0 -0
  106. {secator-0.17.0 → secator-0.18.0}/secator/exporters/table.py +0 -0
  107. {secator-0.17.0 → secator-0.18.0}/secator/exporters/txt.py +0 -0
  108. {secator-0.17.0 → secator-0.18.0}/secator/hooks/__init__.py +0 -0
  109. {secator-0.17.0 → secator-0.18.0}/secator/hooks/gcs.py +0 -0
  110. {secator-0.17.0 → secator-0.18.0}/secator/hooks/mongodb.py +0 -0
  111. {secator-0.17.0 → secator-0.18.0}/secator/installer.py +0 -0
  112. {secator-0.17.0 → secator-0.18.0}/secator/loader.py +0 -0
  113. {secator-0.17.0 → secator-0.18.0}/secator/output_types/__init__.py +0 -0
  114. {secator-0.17.0 → secator-0.18.0}/secator/output_types/_base.py +0 -0
  115. {secator-0.17.0 → secator-0.18.0}/secator/output_types/certificate.py +0 -0
  116. {secator-0.17.0 → secator-0.18.0}/secator/output_types/error.py +0 -0
  117. {secator-0.17.0 → secator-0.18.0}/secator/output_types/exploit.py +0 -0
  118. {secator-0.17.0 → secator-0.18.0}/secator/output_types/info.py +0 -0
  119. {secator-0.17.0 → secator-0.18.0}/secator/output_types/ip.py +0 -0
  120. {secator-0.17.0 → secator-0.18.0}/secator/output_types/port.py +0 -0
  121. {secator-0.17.0 → secator-0.18.0}/secator/output_types/progress.py +0 -0
  122. {secator-0.17.0 → secator-0.18.0}/secator/output_types/record.py +0 -0
  123. {secator-0.17.0 → secator-0.18.0}/secator/output_types/stat.py +0 -0
  124. {secator-0.17.0 → secator-0.18.0}/secator/output_types/state.py +0 -0
  125. {secator-0.17.0 → secator-0.18.0}/secator/output_types/subdomain.py +0 -0
  126. {secator-0.17.0 → secator-0.18.0}/secator/output_types/tag.py +0 -0
  127. {secator-0.17.0 → secator-0.18.0}/secator/output_types/target.py +0 -0
  128. {secator-0.17.0 → secator-0.18.0}/secator/output_types/url.py +0 -0
  129. {secator-0.17.0 → secator-0.18.0}/secator/output_types/user_account.py +0 -0
  130. {secator-0.17.0 → secator-0.18.0}/secator/output_types/vulnerability.py +0 -0
  131. {secator-0.17.0 → secator-0.18.0}/secator/output_types/warning.py +0 -0
  132. {secator-0.17.0 → secator-0.18.0}/secator/report.py +0 -0
  133. {secator-0.17.0 → secator-0.18.0}/secator/rich.py +0 -0
  134. {secator-0.17.0 → secator-0.18.0}/secator/runners/__init__.py +0 -0
  135. {secator-0.17.0 → secator-0.18.0}/secator/runners/_helpers.py +0 -0
  136. {secator-0.17.0 → secator-0.18.0}/secator/runners/celery.py +0 -0
  137. {secator-0.17.0 → secator-0.18.0}/secator/runners/scan.py +0 -0
  138. {secator-0.17.0 → secator-0.18.0}/secator/runners/task.py +0 -0
  139. {secator-0.17.0 → secator-0.18.0}/secator/runners/workflow.py +0 -0
  140. {secator-0.17.0 → secator-0.18.0}/secator/scans/__init__.py +0 -0
  141. {secator-0.17.0 → secator-0.18.0}/secator/serializers/__init__.py +0 -0
  142. {secator-0.17.0 → secator-0.18.0}/secator/serializers/dataclass.py +0 -0
  143. {secator-0.17.0 → secator-0.18.0}/secator/serializers/json.py +0 -0
  144. {secator-0.17.0 → secator-0.18.0}/secator/serializers/regex.py +0 -0
  145. {secator-0.17.0 → secator-0.18.0}/secator/tasks/__init__.py +0 -0
  146. {secator-0.17.0 → secator-0.18.0}/secator/tasks/_categories.py +0 -0
  147. {secator-0.17.0 → secator-0.18.0}/secator/tasks/arjun.py +0 -0
  148. {secator-0.17.0 → secator-0.18.0}/secator/tasks/bbot.py +0 -0
  149. {secator-0.17.0 → secator-0.18.0}/secator/tasks/cariddi.py +0 -0
  150. {secator-0.17.0 → secator-0.18.0}/secator/tasks/dalfox.py +0 -0
  151. {secator-0.17.0 → secator-0.18.0}/secator/tasks/dirsearch.py +0 -0
  152. {secator-0.17.0 → secator-0.18.0}/secator/tasks/dnsx.py +0 -0
  153. {secator-0.17.0 → secator-0.18.0}/secator/tasks/feroxbuster.py +0 -0
  154. {secator-0.17.0 → secator-0.18.0}/secator/tasks/ffuf.py +0 -0
  155. {secator-0.17.0 → secator-0.18.0}/secator/tasks/gau.py +0 -0
  156. {secator-0.17.0 → secator-0.18.0}/secator/tasks/gf.py +0 -0
  157. {secator-0.17.0 → secator-0.18.0}/secator/tasks/gitleaks.py +0 -0
  158. {secator-0.17.0 → secator-0.18.0}/secator/tasks/gospider.py +0 -0
  159. {secator-0.17.0 → secator-0.18.0}/secator/tasks/grype.py +0 -0
  160. {secator-0.17.0 → secator-0.18.0}/secator/tasks/h8mail.py +0 -0
  161. {secator-0.17.0 → secator-0.18.0}/secator/tasks/httpx.py +0 -0
  162. {secator-0.17.0 → secator-0.18.0}/secator/tasks/katana.py +0 -0
  163. {secator-0.17.0 → secator-0.18.0}/secator/tasks/mapcidr.py +0 -0
  164. {secator-0.17.0 → secator-0.18.0}/secator/tasks/msfconsole.py +0 -0
  165. {secator-0.17.0 → secator-0.18.0}/secator/tasks/naabu.py +0 -0
  166. {secator-0.17.0 → secator-0.18.0}/secator/tasks/nmap.py +0 -0
  167. {secator-0.17.0 → secator-0.18.0}/secator/tasks/nuclei.py +0 -0
  168. {secator-0.17.0 → secator-0.18.0}/secator/tasks/searchsploit.py +0 -0
  169. {secator-0.17.0 → secator-0.18.0}/secator/tasks/subfinder.py +0 -0
  170. {secator-0.17.0 → secator-0.18.0}/secator/tasks/testssl.py +0 -0
  171. {secator-0.17.0 → secator-0.18.0}/secator/tasks/trivy.py +0 -0
  172. {secator-0.17.0 → secator-0.18.0}/secator/tasks/wafw00f.py +0 -0
  173. {secator-0.17.0 → secator-0.18.0}/secator/tasks/wpprobe.py +0 -0
  174. {secator-0.17.0 → secator-0.18.0}/secator/template.py +0 -0
  175. {secator-0.17.0 → secator-0.18.0}/secator/thread.py +0 -0
  176. {secator-0.17.0 → secator-0.18.0}/secator/tree.py +0 -0
  177. {secator-0.17.0 → secator-0.18.0}/secator/utils.py +0 -0
  178. {secator-0.17.0 → secator-0.18.0}/secator/utils_test.py +0 -0
  179. {secator-0.17.0 → secator-0.18.0}/secator/workflows/__init__.py +0 -0
  180. {secator-0.17.0 → secator-0.18.0}/tests/__init__.py +0 -0
  181. {secator-0.17.0 → secator-0.18.0}/tests/fixtures/h8mail_breach.txt +0 -0
  182. {secator-0.17.0 → secator-0.18.0}/tests/fixtures/ls.py +0 -0
  183. {secator-0.17.0 → secator-0.18.0}/tests/fixtures/msfconsole_input.rc +0 -0
  184. {secator-0.17.0 → secator-0.18.0}/tests/fixtures/nmap_output.xml +0 -0
  185. {secator-0.17.0 → secator-0.18.0}/tests/integration/__init__.py +0 -0
  186. {secator-0.17.0 → secator-0.18.0}/tests/integration/all.yaml +0 -0
  187. {secator-0.17.0 → secator-0.18.0}/tests/integration/setup.sh +0 -0
  188. {secator-0.17.0 → secator-0.18.0}/tests/integration/teardown.sh +0 -0
  189. {secator-0.17.0 → secator-0.18.0}/tests/integration/test_addons.py +0 -0
  190. {secator-0.17.0 → secator-0.18.0}/tests/integration/test_celery.py +0 -0
  191. {secator-0.17.0 → secator-0.18.0}/tests/integration/test_scans.py +0 -0
  192. {secator-0.17.0 → secator-0.18.0}/tests/integration/test_tasks.py +0 -0
  193. {secator-0.17.0 → secator-0.18.0}/tests/integration/test_tasks_categories.py +0 -0
  194. {secator-0.17.0 → secator-0.18.0}/tests/integration/test_worker.py +0 -0
  195. {secator-0.17.0 → secator-0.18.0}/tests/integration/test_workflows.py +0 -0
  196. {secator-0.17.0 → secator-0.18.0}/tests/integration/wordlist.txt +0 -0
  197. {secator-0.17.0 → secator-0.18.0}/tests/integration/wordlist_dns.txt +0 -0
  198. {secator-0.17.0 → secator-0.18.0}/tests/integration/wordpress_toolbox/Dockerfile +0 -0
  199. {secator-0.17.0 → secator-0.18.0}/tests/integration/wordpress_toolbox/Makefile +0 -0
  200. {secator-0.17.0 → secator-0.18.0}/tests/performance/__init__.py +0 -0
  201. {secator-0.17.0 → secator-0.18.0}/tests/performance/loadtester.py +0 -0
  202. {secator-0.17.0 → secator-0.18.0}/tests/performance/test_worker.py +0 -0
  203. {secator-0.17.0 → secator-0.18.0}/tests/template/test_templates.py +0 -0
  204. {secator-0.17.0 → secator-0.18.0}/tests/unit/__init__.py +0 -0
  205. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_celery.py +0 -0
  206. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_cli.py +0 -0
  207. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_command.py +0 -0
  208. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_config.py +0 -0
  209. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_offline.py +0 -0
  210. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_runners.py +0 -0
  211. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_runners_helpers.py +0 -0
  212. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_scans.py +0 -0
  213. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_serializers.py +0 -0
  214. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_tasks.py +0 -0
  215. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_tasks_categories.py +0 -0
  216. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_template.py +0 -0
  217. {secator-0.17.0 → secator-0.18.0}/tests/unit/test_utils.py +0 -0
@@ -2,16 +2,28 @@
2
2
 
3
3
  # Define an array of distributions
4
4
  DISTROS=("alpine" "arch" "debian" "kali" "osx" "ubuntu")
5
+ BUILDER=$(which docker || which podman || which buildah)
6
+
7
+ if [ -z "$BUILDER" ]; then
8
+ echo "Error: No container builder found (docker, podman, or buildah required)"
9
+ exit 1
10
+ fi
11
+
12
+ echo "Using builder: $BUILDER"
13
+
14
+ mkdir -p .docker/logs/
5
15
 
6
16
  # Function to build an image
7
17
  build_image() {
8
18
  local DISTRO=$1
9
19
  local DOCKERFILE=".docker/Dockerfile.${DISTRO}"
20
+ local STDOUT_LOG=".docker/logs/${DISTRO}.stdout"
21
+ local STDERR_LOG=".docker/logs/${DISTRO}.stderr"
10
22
  local IMAGE_NAME="secator-${DISTRO}"
11
23
 
12
24
  if [ -f "$DOCKERFILE" ]; then
13
25
  echo "🚀 Building $IMAGE_NAME using $DOCKERFILE..."
14
- docker build -t "$IMAGE_NAME" -f "$DOCKERFILE" . && \
26
+ $BUILDER build -t "$IMAGE_NAME" -f "$DOCKERFILE" . > $STDOUT_LOG 2> $STDERR_LOG && \
15
27
  echo "✅ Successfully built $IMAGE_NAME" || \
16
28
  echo "❌ Failed to build $IMAGE_NAME"
17
29
  else
@@ -0,0 +1,4 @@
1
+ .docker/logs
2
+ .git
3
+ .github
4
+ .gitignore
@@ -1,3 +1,6 @@
1
+ # Build logs
2
+ .docker/logs
3
+
1
4
  # Byte-compiled / optimized / DLL files
2
5
  __pycache__/
3
6
  *.py[cod]
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.18.0](https://github.com/freelabz/secator/compare/v0.17.0...v0.18.0) (2025-10-22)
4
+
5
+
6
+ ### Features
7
+
8
+ * **workflow:** update user hunt ([#688](https://github.com/freelabz/secator/issues/688)) ([e4f3e29](https://github.com/freelabz/secator/commit/e4f3e294c1668c66ed893305b0147df37cb4453a))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * broken sudo prompt because of os.setsid ([#722](https://github.com/freelabz/secator/issues/722)) ([5c77957](https://github.com/freelabz/secator/commit/5c77957cb78533b7e819c01c19de6e46eae0d2af))
14
+ * bugs and warnings in task data ([#714](https://github.com/freelabz/secator/issues/714)) ([845415b](https://github.com/freelabz/secator/commit/845415bb337f77867d49be66bbd23eaf307e5848))
15
+ * bup file flag ([#725](https://github.com/freelabz/secator/issues/725)) ([0622ef5](https://github.com/freelabz/secator/commit/0622ef509b1dc33996dd5e89aea5cd802160744d))
16
+ * context propagation for subtasks ([#720](https://github.com/freelabz/secator/issues/720)) ([d636aa6](https://github.com/freelabz/secator/commit/d636aa66562fd030299fce20f3abaeca283eaf74))
17
+ * **fping:** remove bad options, add new ones ([#713](https://github.com/freelabz/secator/issues/713)) ([4356b4f](https://github.com/freelabz/secator/commit/4356b4f120043e2f94973a9c0061345a06efaeda))
18
+ * maigret version pin ([#721](https://github.com/freelabz/secator/issues/721)) ([488b5a1](https://github.com/freelabz/secator/commit/488b5a1b994e6d3dfadc409d09aaaeb93ff60fb4))
19
+ * subfinder integration tests ([#724](https://github.com/freelabz/secator/issues/724)) ([8163152](https://github.com/freelabz/secator/commit/8163152efb09f3854ec9fa7125b16084eda4c98f))
20
+ * wpscan errors and wordpress workflow ([#723](https://github.com/freelabz/secator/issues/723)) ([8ee32aa](https://github.com/freelabz/secator/commit/8ee32aacb1310cfb833bdcf696477ae29eb271c7))
21
+
3
22
  ## [0.17.0](https://github.com/freelabz/secator/compare/v0.16.5...v0.17.0) (2025-09-06)
4
23
 
5
24
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: secator
3
- Version: 0.17.0
3
+ Version: 0.18.0
4
4
  Summary: The pentester's swiss knife.
5
5
  Project-URL: Homepage, https://github.com/freelabz/secator
6
6
  Project-URL: Issues, https://github.com/freelabz/secator/issues
@@ -2,7 +2,6 @@ apiVersion: v1
2
2
  kind: Service
3
3
  metadata:
4
4
  name: {{ .Values.redis.name }}
5
- namespace: {{ .Values.namespace }}
6
5
  spec:
7
6
  type: ClusterIP
8
7
  ports:
@@ -2,7 +2,6 @@ apiVersion: apps/v1
2
2
  kind: StatefulSet
3
3
  metadata:
4
4
  name: {{ .Values.redis.name }}
5
- namespace: {{ .Values.namespace }}
6
5
  spec:
7
6
  selector:
8
7
  matchLabels:
@@ -13,10 +12,15 @@ spec:
13
12
  metadata:
14
13
  labels:
15
14
  app: redis
16
- spec:
15
+ spec:
16
+ automountServiceAccountToken: {{ .Values.automountServiceAccountToken }}
17
17
  containers:
18
18
  - name: {{ .Values.redis.name }}
19
19
  image: {{ .Values.redis.image }}
20
+ securityContext:
21
+ {{- toYaml .Values.redis.securityContext | nindent 10 }}
22
+ resources:
23
+ {{- toYaml .Values.redis.resources | nindent 10 }}
20
24
  ports:
21
25
  - containerPort: {{ .Values.redis.port }}
22
26
  name: client
@@ -0,0 +1,22 @@
1
+ apiVersion: v1
2
+ kind: Pod
3
+ metadata:
4
+ name: {{ .Values.secatorManager.name }}
5
+ labels:
6
+ name: secator-manager
7
+ spec:
8
+ automountServiceAccountToken: {{ .Values.automountServiceAccountToken }}
9
+ containers:
10
+ - name: secator-manager
11
+ image: {{ .Values.secatorManager.image }}
12
+ securityContext:
13
+ {{- toYaml .Values.secatorManager.securityContext | nindent 6 }}
14
+ resources:
15
+ {{- toYaml .Values.secatorManager.resources | nindent 6 }}
16
+ command: ["sleep"]
17
+ args: ["infinity"]
18
+ env:
19
+ - name: SECATOR_CELERY_BROKER_URL
20
+ value: "redis://{{ .Values.redis.name }}:{{ .Values.redis.port }}/0"
21
+ - name: SECATOR_CELERY_RESULT_BACKEND
22
+ value: "redis://{{ .Values.redis.name }}:{{ .Values.redis.port }}/0"
@@ -2,8 +2,8 @@ apiVersion: apps/v1
2
2
  kind: Deployment
3
3
  metadata:
4
4
  name: {{ .Values.secatorWorker.name }}
5
- namespace: {{ .Values.namespace }}
6
5
  spec:
6
+ replicas: {{ .Values.secatorWorker.replicas }}
7
7
  selector:
8
8
  matchLabels:
9
9
  app: secator-worker
@@ -12,13 +12,18 @@ spec:
12
12
  labels:
13
13
  app: secator-worker
14
14
  spec:
15
+ automountServiceAccountToken: {{ .Values.automountServiceAccountToken }}
15
16
  containers:
16
17
  - name: {{ .Values.secatorWorker.name }}
17
18
  image: {{ .Values.secatorWorker.image }}
19
+ securityContext:
20
+ {{- toYaml .Values.secatorWorker.securityContext | nindent 10 }}
21
+ resources:
22
+ {{- toYaml .Values.secatorWorker.resources | nindent 10 }}
18
23
  command: ["secator"]
19
24
  args: ["worker"]
20
25
  env:
21
26
  - name: SECATOR_CELERY_BROKER_URL
22
- value: "redis://{{ .Values.redis.name }}:6379/0"
27
+ value: "redis://{{ .Values.redis.name }}:{{ .Values.redis.port }}/0"
23
28
  - name: SECATOR_CELERY_RESULT_BACKEND
24
- value: "redis://{{ .Values.redis.name }}:6379/0"
29
+ value: "redis://{{ .Values.redis.name }}:{{ .Values.redis.port }}/0"
@@ -0,0 +1,58 @@
1
+ # Default values for Secator
2
+ # This is a YAML-formatted file.
3
+ # Declare variables to be passed into your templates.
4
+
5
+ # TODO: Create service accounts instead. Assess for RBAC. Add tooling for kubernetes to image, or side-car.
6
+ # For instance, the secator Manager pod could have sufficient access to list/get/set worker replicas for scaling from
7
+ # from the pod itself. Perhaps another add-on?
8
+ automountServiceAccountToken: false
9
+
10
+ secatorManager:
11
+ name: secator-manager
12
+ image: "freelabz/secator"
13
+ securityContext: {}
14
+
15
+ # resources: cpu/memory requests and limits for managers
16
+ resources: {}
17
+
18
+ # Empty if using default repository
19
+ repository:
20
+ # Empty if using tag "latest"
21
+ tag:
22
+
23
+ secatorWorker:
24
+ name: secator-worker
25
+ image: "freelabz/secator"
26
+ securityContext: {}
27
+
28
+ # resources: cpu/memory requests and limits for workers
29
+ resources: {}
30
+ replicas: 1
31
+
32
+ # Empty if using default repository
33
+ repository:
34
+ # Empty if using tag "latest"
35
+ tag:
36
+
37
+ redis:
38
+ name: redis
39
+ image: "redis:alpine"
40
+ # Run redis with least privilege.
41
+ securityContext:
42
+ runAsUser: 999
43
+ runAsGroup: 1000
44
+ runAsNonRoot: true
45
+ allowPrivilegeEscalation: false
46
+ readOnlyRootFilesystem: true
47
+ capabilities:
48
+ drop:
49
+ - ALL
50
+ # resources: cpu/memory requests and limits for redis
51
+ resources: {}
52
+
53
+ # Empty if using default repository
54
+ repository:
55
+ # Empty if using tag "latest"
56
+ tag:
57
+ replicas: 1
58
+ port: 6379
@@ -4,7 +4,7 @@ build-backend = 'hatchling.build'
4
4
 
5
5
  [project]
6
6
  name = 'secator'
7
- version = "0.17.0"
7
+ version = "0.18.0"
8
8
  authors = [{ name = 'FreeLabz', email = 'sales@freelabz.com' }]
9
9
  readme = 'README.md'
10
10
  description = "The pentester's swiss knife."
@@ -145,7 +145,7 @@ class Wordlists(StrictModel):
145
145
  templates: Dict[str, str] = {
146
146
  'bo0m_fuzz': 'https://raw.githubusercontent.com/Bo0oM/fuzz.txt/master/fuzz.txt',
147
147
  'combined_subdomains': 'https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/DNS/combined_subdomains.txt', # noqa: E501
148
- 'directory_list_small': 'https://raw.githubusercontent.com/danielmiessler/SecLists/refs/heads/master/Discovery/Web-Content/directory-list-2.3-small.txt', # noqa: E501
148
+ 'directory_list_small': 'https://gist.githubusercontent.com/sl4v/c087e36164e74233514b/raw/c51a811c70bbdd87f4725521420cc30e7232b36d/directory-list-2.3-small.txt', # noqa: E501
149
149
  }
150
150
  lists: Dict[str, List[str]] = {}
151
151
 
@@ -0,0 +1,24 @@
1
+ type: workflow
2
+ name: user_hunt
3
+ alias: userhunt
4
+ description: User account search
5
+ tags: [user_account]
6
+ input_types:
7
+ - slug
8
+ - string
9
+ - email
10
+
11
+ tasks:
12
+ _group/hunt_users:
13
+ maigret:
14
+ description: Hunt user accounts
15
+ targets_:
16
+ - type: target
17
+ field: name
18
+ condition: target.type != 'email'
19
+ h8mail:
20
+ description: Find password leaks
21
+ targets_:
22
+ - type: target
23
+ field: name
24
+ condition: target.type == 'email'
@@ -5,15 +5,28 @@ description: Wordpress vulnerability scan
5
5
  tags: [http, wordpress, vulnerability]
6
6
  input_types:
7
7
  - url
8
+ - ip
9
+ - host
10
+ - host:port
8
11
 
9
12
  tasks:
13
+ httpx:
14
+ description: URL probe
15
+ tech_detect: True
16
+
10
17
  _group/hunt_wordpress:
11
18
  nuclei:
12
19
  description: Nuclei Wordpress scan
13
20
  tags: [wordpress]
21
+ targets_:
22
+ - url.url
14
23
 
15
24
  wpscan:
16
25
  description: WPScan
26
+ targets_:
27
+ - url.url
17
28
 
18
29
  wpprobe:
19
30
  description: WPProbe
31
+ targets_:
32
+ - url.url
@@ -179,14 +179,14 @@ class Runner:
179
179
  # Add prior results to runner results
180
180
  self.debug(f'adding {len(results)} prior results to runner', sub='init')
181
181
  if CONFIG.addons.mongodb.enabled:
182
- self.debug('adding prior results from MongoDB', sub='init')
182
+ self.debug(f'loading {len(results)} results from MongoDB', sub='init')
183
183
  from secator.hooks.mongodb import get_results
184
184
  results = get_results(results)
185
185
  for result in results:
186
186
  self.add_result(result, print=False, output=False, hooks=False, queue=not self.has_parent)
187
187
 
188
188
  # Determine inputs
189
- self.debug(f'resolving inputs with dynamic opts ({len(self.dynamic_opts)})', obj=self.dynamic_opts, sub='init')
189
+ self.debug(f'resolving inputs with {len(self.dynamic_opts)} dynamic opts', obj=self.dynamic_opts, sub='init')
190
190
  self.inputs = [inputs] if not isinstance(inputs, list) else inputs
191
191
  self.inputs = list(set(self.inputs))
192
192
  targets = [Target(name=target) for target in self.inputs]
@@ -463,12 +463,11 @@ class Runner:
463
463
  if item._uuid and item._uuid in self.uuids:
464
464
  return
465
465
 
466
- # Keep existing ancestor id in context
467
- ancestor_id = item._context.get('ancestor_id', None)
468
-
469
- # Set context
470
- item._context.update(self.context)
471
- item._context['ancestor_id'] = ancestor_id or self.ancestor_id
466
+ # Update context with runner info
467
+ ctx = item._context.copy()
468
+ item._context = self.context.copy()
469
+ item._context.update(ctx)
470
+ item._context['ancestor_id'] = ctx.get('ancestor_id') or self.ancestor_id
472
471
 
473
472
  # Set uuid
474
473
  if not item._uuid:
@@ -756,6 +755,7 @@ class Runner:
756
755
  'last_updated_db': self.last_updated_db,
757
756
  'context': self.context,
758
757
  'errors': [e.toDict() for e in self.errors],
758
+ 'warnings': [w.toDict() for w in self.warnings],
759
759
  })
760
760
  return data
761
761
 
@@ -419,10 +419,13 @@ class Command(Runner):
419
419
  self.print_command()
420
420
 
421
421
  # Check for sudo requirements and prepare the password if needed
422
- sudo_password, error = self._prompt_sudo(self.cmd)
423
- if error:
424
- yield Error(message=error)
425
- return
422
+ sudo_required = re.search(r'\bsudo\b', self.cmd)
423
+ sudo_password = None
424
+ if sudo_required:
425
+ sudo_password, error = self._prompt_sudo(self.cmd)
426
+ if error:
427
+ yield Error(message=error)
428
+ return
426
429
 
427
430
  # Prepare cmds
428
431
  command = self.cmd if self.shell else shlex.split(self.cmd)
@@ -450,7 +453,7 @@ class Command(Runner):
450
453
  stdout=subprocess.PIPE,
451
454
  stderr=subprocess.STDOUT,
452
455
  universal_newlines=True,
453
- preexec_fn=os.setsid,
456
+ preexec_fn=os.setsid if not sudo_required else None,
454
457
  shell=self.shell,
455
458
  env=env,
456
459
  cwd=self.cwd)
@@ -688,7 +691,7 @@ class Command(Runner):
688
691
  ['sudo', '-S', '-p', '', 'true'],
689
692
  input=sudo_password + "\n",
690
693
  text=True,
691
- capture_output=True
694
+ capture_output=True,
692
695
  )
693
696
  if result.returncode == 0:
694
697
  return sudo_password, None # Password is correct
@@ -20,7 +20,7 @@ class bup(Http):
20
20
  output_types = [Url, Progress]
21
21
  tags = ['url', 'bypass']
22
22
  input_flag = '-u'
23
- file_flag = '-R'
23
+ file_flag = '-u'
24
24
  json_flag = '--jsonl'
25
25
  opt_prefix = '--'
26
26
  opts = {
@@ -17,7 +17,10 @@ class fping(ReconIp):
17
17
  file_flag = '-f'
18
18
  input_flag = None
19
19
  opts = {
20
- 'reverse_dns': {'is_flag': True, 'default': False, 'short': 'r', 'help': 'Reverse DNS lookup (slower)'}
20
+ 'count': {'type': int, 'default': None, 'help': 'Number of request packets to send to each target'},
21
+ 'show_name': {'is_flag': True, 'default': False, 'help': 'Show network addresses as well as hostnames'},
22
+ 'use_dns': {'is_flag': True, 'default': False, 'help': 'Use DNS to lookup address of return packet (same as -n but will force reverse-DNS lookup for hostnames)'}, # noqa: E501
23
+ 'summary': {'is_flag': True, 'default': False, 'help': 'Print cumulative statistics upon exit'},
21
24
  }
22
25
  opt_prefix = '--'
23
26
  opt_key_map = {
@@ -27,11 +30,14 @@ class fping(ReconIp):
27
30
  RETRIES: 'retry',
28
31
  TIMEOUT: 'timeout',
29
32
  THREADS: OPT_NOT_SUPPORTED,
30
- 'reverse_dns': 'r'
33
+ 'count': '-c',
34
+ 'show_name': '-n',
35
+ 'use_dns': '-d',
36
+ 'summary': '-s',
31
37
  }
32
38
  opt_value_map = {
33
- DELAY: lambda x: x * 1000, # convert s to ms
34
- TIMEOUT: lambda x: x * 1000 # convert s to ms
39
+ DELAY: lambda x: int(x) * 1000, # convert s to ms
40
+ TIMEOUT: lambda x: int(x) * 1000 # convert s to ms
35
41
  }
36
42
  install_github_handle = 'schweikert/fping'
37
43
  install_version = 'v5.1'
@@ -41,9 +47,20 @@ class fping(ReconIp):
41
47
  @staticmethod
42
48
  def item_loader(self, line):
43
49
  if '(' in line:
44
- host, ip = tuple(t.strip() for t in line.rstrip(')').split('('))
45
- if (validators.ipv4(host) or validators.ipv6(host)):
46
- host = ''
50
+
51
+ line_part = line.split(' : ')[0] if ' : ' in line else line # Removing the stat parts that appears when using -c
52
+
53
+ start_paren = line_part.find('(')
54
+ end_paren = line_part.find(')', start_paren)
55
+
56
+ if start_paren != -1 and end_paren != -1:
57
+ host = line_part[:start_paren].strip()
58
+ ip = line_part[start_paren+1:end_paren].strip()
59
+
60
+ if (validators.ipv4(host) or validators.ipv6(host)):
61
+ host = ''
62
+ else:
63
+ return
47
64
  else:
48
65
  ip = line.strip()
49
66
  host = ''
@@ -42,8 +42,13 @@ class maigret(ReconUser):
42
42
  EXTRA_DATA: lambda x: x['status'].get('ids', {})
43
43
  }
44
44
  }
45
- install_version = '0.5.0a'
46
- install_cmd = 'pipx install git+https://github.com/soxoj/maigret --force'
45
+ install_version = '0.5.0'
46
+ # install_pre = {
47
+ # 'apt': ['libcairo2-dev'],
48
+ # 'yum|zypper': ['cairo-devel'],
49
+ # '*': ['cairo']
50
+ # }
51
+ install_cmd = 'pipx install maigret==[install_version] --force'
47
52
  socks5_proxy = True
48
53
  profile = 'io'
49
54
 
@@ -11,6 +11,7 @@ from secator.definitions import (CONFIDENCE, CVSS_SCORE, DELAY, DESCRIPTION,
11
11
  URL, USER_AGENT)
12
12
  from secator.output_types import Tag, Vulnerability, Info, Error
13
13
  from secator.tasks._categories import VulnHttp
14
+ from secator.installer import parse_version
14
15
 
15
16
 
16
17
  @task()
@@ -110,6 +111,12 @@ class wpscan(VulnHttp):
110
111
  # Get URL
111
112
  target = data.get('target_url', self.inputs[0])
112
113
 
114
+ # Get errors
115
+ scan_aborted = data.get('scan_aborted', False)
116
+ if scan_aborted:
117
+ yield Error(message=scan_aborted, traceback='\n'.join(data.get('trace', [])))
118
+ return
119
+
113
120
  # Wordpress version
114
121
  version = data.get('version', {})
115
122
  if version:
@@ -133,7 +140,7 @@ class wpscan(VulnHttp):
133
140
  location = main_theme['location']
134
141
  if version:
135
142
  number = version['number']
136
- latest_version = main_theme.get('latest_version')
143
+ latest_version = main_theme.get('latest_version') or 'unknown'
137
144
  yield Tag(
138
145
  name=f'Wordpress theme - {slug} {number}',
139
146
  match=target,
@@ -142,10 +149,12 @@ class wpscan(VulnHttp):
142
149
  'latest_version': latest_version
143
150
  }
144
151
  )
145
- if (latest_version and number < latest_version):
152
+ outdated = latest_version and parse_version(number) < parse_version(latest_version)
153
+ if outdated:
146
154
  yield Vulnerability(
147
155
  matched_at=target,
148
156
  name=f'Wordpress theme - {slug} {number} outdated',
157
+ description=f'The wordpress theme {slug} is outdated, consider updating to the latest version {latest_version}',
149
158
  confidence='high',
150
159
  severity='info'
151
160
  )
@@ -163,7 +172,7 @@ class wpscan(VulnHttp):
163
172
  location = data['location']
164
173
  if version:
165
174
  number = version['number']
166
- latest_version = data.get('latest_version')
175
+ latest_version = data.get('latest_version') or 'unknown'
167
176
  yield Tag(
168
177
  name=f'Wordpress plugin - {slug} {number}',
169
178
  match=target,
@@ -172,10 +181,12 @@ class wpscan(VulnHttp):
172
181
  'latest_version': latest_version
173
182
  }
174
183
  )
175
- if (latest_version and number < latest_version):
184
+ outdated = latest_version and parse_version(number) < parse_version(latest_version)
185
+ if outdated:
176
186
  yield Vulnerability(
177
187
  matched_at=target,
178
188
  name=f'Wordpress plugin - {slug} {number} outdated',
189
+ description=f'The wordpress plugin {slug} is outdated, consider updating to the latest version {latest_version}.',
179
190
  confidence='high',
180
191
  severity='info'
181
192
  )
@@ -21,7 +21,7 @@ INPUTS_TASKS = {
21
21
  'h8mail': 'test@test.com',
22
22
  'nuclei': 'http://localhost:3000/',
23
23
  'searchsploit': 'apache 2.4.5',
24
- 'subfinder': 'api.github.com',
24
+ 'subfinder': 'github.com',
25
25
  'testssl': 'free.fr',
26
26
  'trivy': 'https://github.com/blacklanternsecurity/bbot',
27
27
  'wpscan': 'http://localhost:8000/',
@@ -264,7 +264,7 @@ OUTPUTS_TASKS = {
264
264
  _source='nuclei')
265
265
  ],
266
266
  'subfinder': [
267
- Subdomain(host='virusscan.api.github.com', domain='api.github.com', _source='subfinder')
267
+ Subdomain(host='support.github.com', domain='github.com', _source='subfinder')
268
268
  ],
269
269
  'trivy': [
270
270
  Vulnerability(
@@ -1 +0,0 @@
1
- .gitignore
@@ -1,18 +0,0 @@
1
- apiVersion: v1
2
- kind: Pod
3
- metadata:
4
- name: {{ .Values.secatorManager.name }}
5
- namespace: {{ .Values.namespace }}
6
- labels:
7
- name: secator-manager
8
- spec:
9
- containers:
10
- - name: secator-manager
11
- image: {{ .Values.secatorManager.image }}
12
- command: ["tail"]
13
- args: ["-F", "anything"]
14
- env:
15
- - name: SECATOR_CELERY_BROKER_URL
16
- value: "redis://{{ .Values.redis.name }}:6379/0"
17
- - name: SECATOR_CELERY_RESULT_BACKEND
18
- value: "redis://{{ .Values.redis.name }}:6379/0"
@@ -1,34 +0,0 @@
1
- # Default values for Secator
2
- # This is a YAML-formatted file.
3
- # Declare variables to be passed into your templates.
4
-
5
- namespace: secator
6
-
7
- secatorManager:
8
- name: secator-manager
9
- image: "freelabz/secator"
10
-
11
- # Empty if using default repository
12
- repository:
13
- # Empty if using tag "latest"
14
- tag:
15
-
16
- secatorWorker:
17
- name: secator-worker
18
- image: "freelabz/secator"
19
-
20
- # Empty if using default repository
21
- repository:
22
- # Empty if using tag "latest"
23
- tag:
24
-
25
- redis:
26
- name: redis
27
- image: "redis"
28
-
29
- # Empty if using default repository
30
- repository:
31
- # Empty if using tag "latest"
32
- tag:
33
- replicas: 1
34
- port: 6379
@@ -1,12 +0,0 @@
1
- type: workflow
2
- name: user_hunt
3
- alias: userhunt
4
- description: User account search
5
- tags: [user_account]
6
- input_types:
7
- - slug
8
- - string
9
-
10
- tasks:
11
- maigret:
12
- description: Hunt user accounts
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