secator 0.14.0__tar.gz → 0.15.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.
- {secator-0.14.0 → secator-0.15.0}/CHANGELOG.md +12 -0
- {secator-0.14.0 → secator-0.15.0}/PKG-INFO +10 -3
- {secator-0.14.0 → secator-0.15.0}/README.md +9 -2
- {secator-0.14.0 → secator-0.15.0}/pyproject.toml +1 -1
- {secator-0.14.0 → secator-0.15.0}/secator/cli.py +2 -2
- {secator-0.14.0 → secator-0.15.0}/secator/decorators.py +16 -10
- {secator-0.14.0 → secator-0.15.0}/secator/definitions.py +5 -0
- {secator-0.14.0 → secator-0.15.0}/secator/installer.py +10 -3
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/stat.py +3 -0
- {secator-0.14.0 → secator-0.15.0}/secator/runners/_base.py +2 -2
- {secator-0.14.0 → secator-0.15.0}/secator/runners/command.py +2 -0
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/_categories.py +11 -11
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/arjun.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/bbot.py +3 -0
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/bup.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/cariddi.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/dalfox.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/dirsearch.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/dnsx.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/dnsxbrute.py +2 -0
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/feroxbuster.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/ffuf.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/fping.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/gau.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/gf.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/gitleaks.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/gospider.py +2 -0
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/grype.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/h8mail.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/httpx.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/katana.py +2 -0
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/maigret.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/mapcidr.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/msfconsole.py +4 -3
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/naabu.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/nmap.py +2 -0
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/nuclei.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/searchsploit.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/subfinder.py +3 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/testssl.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/trivy.py +4 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/wafw00f.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/wpprobe.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/wpscan.py +2 -1
- {secator-0.14.0 → secator-0.15.0}/secator/utils.py +15 -11
- {secator-0.14.0 → secator-0.15.0}/secator/utils_test.py +9 -3
- {secator-0.14.0 → secator-0.15.0}/tests/integration/inputs.py +2 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/test_tasks.py +7 -2
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_tasks.py +3 -3
- {secator-0.14.0 → secator-0.15.0}/.docker/Dockerfile.alpine +0 -0
- {secator-0.14.0 → secator-0.15.0}/.docker/Dockerfile.arch +0 -0
- {secator-0.14.0 → secator-0.15.0}/.docker/Dockerfile.debian +0 -0
- {secator-0.14.0 → secator-0.15.0}/.docker/Dockerfile.kali +0 -0
- {secator-0.14.0 → secator-0.15.0}/.docker/Dockerfile.osx +0 -0
- {secator-0.14.0 → secator-0.15.0}/.docker/Dockerfile.ubuntu +0 -0
- {secator-0.14.0 → secator-0.15.0}/.docker/build_all.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/.dockerignore +0 -0
- {secator-0.14.0 → secator-0.15.0}/.flake8 +0 -0
- {secator-0.14.0 → secator-0.15.0}/.gitignore +0 -0
- {secator-0.14.0 → secator-0.15.0}/CONTRIBUTING.md +0 -0
- {secator-0.14.0 → secator-0.15.0}/Dockerfile +0 -0
- {secator-0.14.0 → secator-0.15.0}/LICENSE +0 -0
- {secator-0.14.0 → secator-0.15.0}/SECURITY.md +0 -0
- {secator-0.14.0 → secator-0.15.0}/cloudbuild.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/helm/.helmignore +0 -0
- {secator-0.14.0 → secator-0.15.0}/helm/Chart.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/helm/templates/redis-service.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/helm/templates/redis.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/helm/templates/secator-manager.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/helm/templates/secator-worker.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/helm/values.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/download_cves.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/install.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/install_asciinema.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/install_go.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/install_ruby.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/msf/exploit_cve.rc +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/msf/ftp_anonymous.rc +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/msf/ftp_version.rc +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/msf/ftp_vsftpd_234_backdoor.rc +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/msf/redis.rc +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/stories/STORY.md +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/stories/aliases.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/stories/demo.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/stories/fmt.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/stories/input.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/stories/pipe.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/scripts/stories/short_demo.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/.gitignore +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/celery.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/celery_signals.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/celery_utils.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/config.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/profiles/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/profiles/aggressive.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/profiles/default.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/profiles/insane.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/profiles/paranoid.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/profiles/polite.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/profiles/sneaky.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/profiles/tor.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/scans/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/scans/domain.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/scans/host.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/scans/network.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/scans/subdomain.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/scans/url.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/cidr_recon.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/code_scan.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/host_recon.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/subdomain_recon.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/url_bypass.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/url_crawl.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/url_dirsearch.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/url_fuzz.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/url_nuclei.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/url_params_fuzz.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/url_vuln.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/user_hunt.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/configs/workflows/wordpress.yaml +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/exporters/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/exporters/_base.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/exporters/console.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/exporters/csv.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/exporters/gdrive.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/exporters/json.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/exporters/table.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/exporters/txt.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/hooks/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/hooks/gcs.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/hooks/mongodb.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/_base.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/certificate.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/error.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/exploit.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/info.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/ip.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/port.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/progress.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/record.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/state.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/subdomain.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/tag.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/target.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/url.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/user_account.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/vulnerability.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/output_types/warning.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/report.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/rich.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/runners/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/runners/_helpers.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/runners/celery.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/runners/scan.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/runners/task.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/runners/workflow.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/scans/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/serializers/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/serializers/dataclass.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/serializers/json.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/serializers/regex.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/tasks/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/template.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/thread.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/secator/workflows/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/fixtures/h8mail_breach.txt +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/fixtures/ls.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/fixtures/msfconsole_input.rc +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/fixtures/nmap_output.xml +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/outputs.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/setup.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/teardown.sh +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/test_addons.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/test_celery.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/test_helpers.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/test_scans.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/test_worker.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/test_workflows.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/wordlist.txt +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/wordlist_dns.txt +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/wordpress_toolbox/Dockerfile +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/integration/wordpress_toolbox/Makefile +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/performance/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/performance/loadtester.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/performance/test_worker.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/__init__.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_celery.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_cli.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_command.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_config.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_offline.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_runners.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_scans.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_serializers.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_tasks_categories.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_template.py +0 -0
- {secator-0.14.0 → secator-0.15.0}/tests/unit/test_utils.py +0 -0
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.15.0](https://github.com/freelabz/secator/compare/v0.14.0...v0.15.0) (2025-05-04)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* improve cli usage and add multi input types ([#609](https://github.com/freelabz/secator/issues/609)) ([b850914](https://github.com/freelabz/secator/commit/b8509141e62dfd72e0b4f15c2b9b5466089e9818))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* installer issue on non-standard distribs ([#613](https://github.com/freelabz/secator/issues/613)) ([194e911](https://github.com/freelabz/secator/commit/194e911b420fcbb0feec3b563a098a3f36cc09cd))
|
|
14
|
+
|
|
3
15
|
## [0.14.0](https://github.com/freelabz/secator/compare/v0.13.0...v0.14.0) (2025-04-30)
|
|
4
16
|
|
|
5
17
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: secator
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.15.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
|
|
@@ -82,7 +82,7 @@ Description-Content-Type: text/markdown
|
|
|
82
82
|
<a href="https://pypi.org/project/secator/"><img src="https://img.shields.io/pypi/dm/secator"></a>
|
|
83
83
|
<a href="https://twitter.com/freelabz"><img src="https://img.shields.io/twitter/follow/freelabz.svg?logo=twitter"></a>
|
|
84
84
|
<a href="https://youtube.com/@FreeLabz"><img src="https://img.shields.io/youtube/channel/subscribers/UCu-F6SpU0h2NP18zBBP04cw?style=social&label=Subscribe%20%40FreeLabz"></a>
|
|
85
|
-
|
|
85
|
+
<a href="https://discord.gg/nyHjC2aTrq"><img src="https://img.shields.io/discord/695645237418131507.svg?logo=discord"></a>
|
|
86
86
|
</p>
|
|
87
87
|
|
|
88
88
|
|
|
@@ -91,7 +91,8 @@ Description-Content-Type: text/markdown
|
|
|
91
91
|
<a href="#supported-commands">Supported commands</a> •
|
|
92
92
|
<a href="#install-secator">Installation</a> •
|
|
93
93
|
<a href="#usage">Usage</a> •
|
|
94
|
-
<a href="https://docs.freelabz.com">Documentation</a>
|
|
94
|
+
<a href="https://docs.freelabz.com">Documentation</a> •
|
|
95
|
+
<a href="https://discord.gg/nyHjC2aTrq">Join us on Discord !</a>
|
|
95
96
|
</p>
|
|
96
97
|
|
|
97
98
|
`secator` is a task and workflow runner used for security assessments. It supports dozens of well-known security tools
|
|
@@ -122,6 +123,11 @@ and it is designed to improve productivity for pentesters and security researche
|
|
|
122
123
|
|
|
123
124
|
| Name | Description | Category |
|
|
124
125
|
|---------------------------------------------------------------|--------------------------------------------------------------------------------|-----------------|
|
|
126
|
+
| [arjun](https://github.com/s0md3v/Arjun) | HTTP Parameter Discovery Suite. | |
|
|
127
|
+
| [gitleaks](https://github.com/gitleaks/gitleaks) | Tool for detecting secrets like passwords, API keys, tokens, etc. | |
|
|
128
|
+
| [testssl](https://github.com/testssl/testssl.sh) | SSL/TLS security scanner, including ciphers, protocols and cryptographic flaws.| |
|
|
129
|
+
| [wafw00f](https://github.com/EnableSecurity/wafw00f) | Web Application Firewall Fingerprinting tool. | |
|
|
130
|
+
| [wpprobe](https://github.com/Chocapikk/wpprobe) | Fast wordpress plugin enumeration tool. | |
|
|
125
131
|
| [httpx](https://github.com/projectdiscovery/httpx) | Fast HTTP prober. | `http` |
|
|
126
132
|
| [cariddi](https://github.com/edoardottt/cariddi) | Fast crawler and endpoint secrets / api keys / tokens matcher. | `http/crawler` |
|
|
127
133
|
| [gau](https://github.com/lc/gau) | Offline URL crawler (Alien Vault, The Wayback Machine, Common Crawl, URLScan). | `http/crawler` |
|
|
@@ -139,6 +145,7 @@ and it is designed to improve productivity for pentesters and security researche
|
|
|
139
145
|
| [naabu](https://github.com/projectdiscovery/naabu) | Fast port discovery tool. | `recon/port` |
|
|
140
146
|
| [maigret](https://github.com/soxoj/maigret) | Hunt for user accounts across many websites. | `recon/user` |
|
|
141
147
|
| [gf](https://github.com/tomnomnom/gf) | A wrapper around grep to avoid typing common patterns. | `tagger` |
|
|
148
|
+
| [trivy](https://github.com/aquasecurity/trivy) | Comprehensive and versatile security scanner. | `vuln` |
|
|
142
149
|
| [grype](https://github.com/anchore/grype) | A vulnerability scanner for container images and filesystems. | `vuln/code` |
|
|
143
150
|
| [dalfox](https://github.com/hahwul/dalfox) | Powerful XSS scanning tool and parameter analyzer. | `vuln/http` |
|
|
144
151
|
| [msfconsole](https://docs.rapid7.com/metasploit/msf-overview) | CLI to access and work with the Metasploit Framework. | `vuln/http` |
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<a href="https://pypi.org/project/secator/"><img src="https://img.shields.io/pypi/dm/secator"></a>
|
|
13
13
|
<a href="https://twitter.com/freelabz"><img src="https://img.shields.io/twitter/follow/freelabz.svg?logo=twitter"></a>
|
|
14
14
|
<a href="https://youtube.com/@FreeLabz"><img src="https://img.shields.io/youtube/channel/subscribers/UCu-F6SpU0h2NP18zBBP04cw?style=social&label=Subscribe%20%40FreeLabz"></a>
|
|
15
|
-
|
|
15
|
+
<a href="https://discord.gg/nyHjC2aTrq"><img src="https://img.shields.io/discord/695645237418131507.svg?logo=discord"></a>
|
|
16
16
|
</p>
|
|
17
17
|
|
|
18
18
|
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
<a href="#supported-commands">Supported commands</a> •
|
|
22
22
|
<a href="#install-secator">Installation</a> •
|
|
23
23
|
<a href="#usage">Usage</a> •
|
|
24
|
-
<a href="https://docs.freelabz.com">Documentation</a>
|
|
24
|
+
<a href="https://docs.freelabz.com">Documentation</a> •
|
|
25
|
+
<a href="https://discord.gg/nyHjC2aTrq">Join us on Discord !</a>
|
|
25
26
|
</p>
|
|
26
27
|
|
|
27
28
|
`secator` is a task and workflow runner used for security assessments. It supports dozens of well-known security tools
|
|
@@ -52,6 +53,11 @@ and it is designed to improve productivity for pentesters and security researche
|
|
|
52
53
|
|
|
53
54
|
| Name | Description | Category |
|
|
54
55
|
|---------------------------------------------------------------|--------------------------------------------------------------------------------|-----------------|
|
|
56
|
+
| [arjun](https://github.com/s0md3v/Arjun) | HTTP Parameter Discovery Suite. | |
|
|
57
|
+
| [gitleaks](https://github.com/gitleaks/gitleaks) | Tool for detecting secrets like passwords, API keys, tokens, etc. | |
|
|
58
|
+
| [testssl](https://github.com/testssl/testssl.sh) | SSL/TLS security scanner, including ciphers, protocols and cryptographic flaws.| |
|
|
59
|
+
| [wafw00f](https://github.com/EnableSecurity/wafw00f) | Web Application Firewall Fingerprinting tool. | |
|
|
60
|
+
| [wpprobe](https://github.com/Chocapikk/wpprobe) | Fast wordpress plugin enumeration tool. | |
|
|
55
61
|
| [httpx](https://github.com/projectdiscovery/httpx) | Fast HTTP prober. | `http` |
|
|
56
62
|
| [cariddi](https://github.com/edoardottt/cariddi) | Fast crawler and endpoint secrets / api keys / tokens matcher. | `http/crawler` |
|
|
57
63
|
| [gau](https://github.com/lc/gau) | Offline URL crawler (Alien Vault, The Wayback Machine, Common Crawl, URLScan). | `http/crawler` |
|
|
@@ -69,6 +75,7 @@ and it is designed to improve productivity for pentesters and security researche
|
|
|
69
75
|
| [naabu](https://github.com/projectdiscovery/naabu) | Fast port discovery tool. | `recon/port` |
|
|
70
76
|
| [maigret](https://github.com/soxoj/maigret) | Hunt for user accounts across many websites. | `recon/user` |
|
|
71
77
|
| [gf](https://github.com/tomnomnom/gf) | A wrapper around grep to avoid typing common patterns. | `tagger` |
|
|
78
|
+
| [trivy](https://github.com/aquasecurity/trivy) | Comprehensive and versatile security scanner. | `vuln` |
|
|
72
79
|
| [grype](https://github.com/anchore/grype) | A vulnerability scanner for container images and filesystems. | `vuln/code` |
|
|
73
80
|
| [dalfox](https://github.com/hahwul/dalfox) | Powerful XSS scanning tool and parameter analyzer. | `vuln/http` |
|
|
74
81
|
| [msfconsole](https://docs.rapid7.com/metasploit/msf-overview) | CLI to access and work with the Metasploit Framework. | `vuln/http` |
|
|
@@ -783,7 +783,7 @@ def report_list(workspace, runner_type, time_delta):
|
|
|
783
783
|
@report.command('export')
|
|
784
784
|
@click.argument('json_path', type=str)
|
|
785
785
|
@click.option('--output-folder', '-of', type=str)
|
|
786
|
-
@click.option('-output', '-o', type=str)
|
|
786
|
+
@click.option('-output', '-o', type=str, required=True)
|
|
787
787
|
def report_export(json_path, output_folder, output):
|
|
788
788
|
with open(json_path, 'r') as f:
|
|
789
789
|
data = loads_dataclass(f.read())
|
|
@@ -1502,7 +1502,7 @@ def task(name, verbose, check):
|
|
|
1502
1502
|
errors
|
|
1503
1503
|
)
|
|
1504
1504
|
check_test(
|
|
1505
|
-
task.
|
|
1505
|
+
task.input_types,
|
|
1506
1506
|
'Check task input type is set (cls.input_type)',
|
|
1507
1507
|
'Task has no input_type attribute.',
|
|
1508
1508
|
warnings,
|
|
@@ -271,7 +271,6 @@ def generate_cli_subcommand(cli_endpoint, func, **opts):
|
|
|
271
271
|
def register_runner(cli_endpoint, config):
|
|
272
272
|
name = config.name
|
|
273
273
|
input_required = True
|
|
274
|
-
input_type = 'targets'
|
|
275
274
|
command_opts = {
|
|
276
275
|
'no_args_is_help': True,
|
|
277
276
|
'context_settings': {
|
|
@@ -282,37 +281,44 @@ def register_runner(cli_endpoint, config):
|
|
|
282
281
|
|
|
283
282
|
if cli_endpoint.name == 'scan':
|
|
284
283
|
runner_cls = Scan
|
|
284
|
+
input_required = False # allow targets from stdin
|
|
285
285
|
short_help = config.description or ''
|
|
286
286
|
short_help += f' [dim]alias: {config.alias}' if config.alias else ''
|
|
287
287
|
command_opts.update({
|
|
288
288
|
'name': name,
|
|
289
|
-
'short_help': short_help
|
|
289
|
+
'short_help': short_help,
|
|
290
|
+
'no_args_is_help': False
|
|
290
291
|
})
|
|
292
|
+
input_types = config.input_types
|
|
291
293
|
|
|
292
294
|
elif cli_endpoint.name == 'workflow':
|
|
293
295
|
runner_cls = Workflow
|
|
296
|
+
input_required = False # allow targets from stdin
|
|
294
297
|
short_help = config.description or ''
|
|
295
298
|
short_help = f'{short_help:<55} [dim](alias)[/][bold cyan] {config.alias}' if config.alias else ''
|
|
296
299
|
command_opts.update({
|
|
297
300
|
'name': name,
|
|
298
|
-
'short_help': short_help
|
|
301
|
+
'short_help': short_help,
|
|
302
|
+
'no_args_is_help': False
|
|
299
303
|
})
|
|
304
|
+
input_types = config.input_types
|
|
300
305
|
|
|
301
306
|
elif cli_endpoint.name == 'task':
|
|
302
307
|
runner_cls = Task
|
|
303
308
|
input_required = False # allow targets from stdin
|
|
304
309
|
task_cls = Task.get_task_class(config.name)
|
|
305
310
|
task_category = get_command_category(task_cls)
|
|
306
|
-
|
|
307
|
-
short_help = f'[magenta]{task_category:<15}[/]{task_cls.__doc__}'
|
|
311
|
+
short_help = f'[magenta]{task_category:<25}[/] {task_cls.__doc__}'
|
|
308
312
|
command_opts.update({
|
|
309
313
|
'name': name,
|
|
310
314
|
'short_help': short_help,
|
|
311
315
|
'no_args_is_help': False
|
|
312
316
|
})
|
|
317
|
+
input_types = task_cls.input_types
|
|
313
318
|
|
|
314
319
|
else:
|
|
315
320
|
raise ValueError(f"Unrecognized runner endpoint name {cli_endpoint.name}")
|
|
321
|
+
input_types_str = '|'.join(input_types) if input_types else 'targets'
|
|
316
322
|
options = get_command_options(config)
|
|
317
323
|
|
|
318
324
|
# TODO: maybe allow this in the future
|
|
@@ -324,7 +330,7 @@ def register_runner(cli_endpoint, config):
|
|
|
324
330
|
# for i in range(0, len(ctx.args), 2)
|
|
325
331
|
# }
|
|
326
332
|
|
|
327
|
-
@click.argument(
|
|
333
|
+
@click.argument(input_types_str, required=input_required)
|
|
328
334
|
@decorate_command_options(options)
|
|
329
335
|
@click.pass_context
|
|
330
336
|
def func(ctx, **opts):
|
|
@@ -353,7 +359,7 @@ def register_runner(cli_endpoint, config):
|
|
|
353
359
|
# opts.update(unknown_opts)
|
|
354
360
|
|
|
355
361
|
# Expand input
|
|
356
|
-
inputs = opts.pop(
|
|
362
|
+
inputs = opts.pop(input_types_str)
|
|
357
363
|
inputs = expand_input(inputs, ctx)
|
|
358
364
|
|
|
359
365
|
# Build hooks from driver name
|
|
@@ -420,10 +426,10 @@ def register_runner(cli_endpoint, config):
|
|
|
420
426
|
runner.run()
|
|
421
427
|
|
|
422
428
|
generate_cli_subcommand(cli_endpoint, func, **command_opts)
|
|
423
|
-
generate_rich_click_opt_groups(cli_endpoint, name,
|
|
429
|
+
generate_rich_click_opt_groups(cli_endpoint, name, input_types, options)
|
|
424
430
|
|
|
425
431
|
|
|
426
|
-
def generate_rich_click_opt_groups(cli_endpoint, name,
|
|
432
|
+
def generate_rich_click_opt_groups(cli_endpoint, name, input_types, options):
|
|
427
433
|
sortorder = {
|
|
428
434
|
'Execution': 0,
|
|
429
435
|
'Output': 1,
|
|
@@ -434,7 +440,7 @@ def generate_rich_click_opt_groups(cli_endpoint, name, input_type, options):
|
|
|
434
440
|
opt_group = [
|
|
435
441
|
{
|
|
436
442
|
'name': 'Targets',
|
|
437
|
-
'options':
|
|
443
|
+
'options': input_types,
|
|
438
444
|
},
|
|
439
445
|
]
|
|
440
446
|
for prefix in prefixes:
|
|
@@ -40,6 +40,9 @@ AUTO_CALIBRATION = 'auto_calibration'
|
|
|
40
40
|
CONTENT_TYPE = 'content_type'
|
|
41
41
|
CONTENT_LENGTH = 'content_length'
|
|
42
42
|
CIDR_RANGE = 'cidr_range'
|
|
43
|
+
DOCKER_IMAGE = 'docker_image'
|
|
44
|
+
FILENAME = 'filename'
|
|
45
|
+
GIT_REPOSITORY = 'git_repository'
|
|
43
46
|
CPES = 'cpes'
|
|
44
47
|
CVES = 'cves'
|
|
45
48
|
DELAY = 'delay'
|
|
@@ -62,6 +65,7 @@ MATCH_CODES = 'match_codes'
|
|
|
62
65
|
MATCH_REGEX = 'match_regex'
|
|
63
66
|
MATCH_SIZE = 'match_size'
|
|
64
67
|
MATCH_WORDS = 'match_words'
|
|
68
|
+
ORG_NAME = 'org_name'
|
|
65
69
|
OUTPUT_PATH = 'output_path'
|
|
66
70
|
PATH = 'path'
|
|
67
71
|
PERCENT = 'percent'
|
|
@@ -100,6 +104,7 @@ REFERENCE = 'reference'
|
|
|
100
104
|
REFERENCES = 'references'
|
|
101
105
|
SEVERITY = 'severity'
|
|
102
106
|
TAGS = 'tags'
|
|
107
|
+
TECHNOLOGY = 'technology'
|
|
103
108
|
WEBSERVER = 'webserver'
|
|
104
109
|
WORDLIST = 'wordlist'
|
|
105
110
|
WORDS = 'words'
|
|
@@ -47,6 +47,7 @@ class InstallerStatus(Enum):
|
|
|
47
47
|
@dataclass
|
|
48
48
|
class Distribution:
|
|
49
49
|
name: str
|
|
50
|
+
system: str
|
|
50
51
|
pm_name: str
|
|
51
52
|
pm_installer: str
|
|
52
53
|
pm_finalizer: str
|
|
@@ -186,6 +187,8 @@ class SourceInstaller:
|
|
|
186
187
|
install_cmd = config
|
|
187
188
|
else:
|
|
188
189
|
distribution = get_distro_config()
|
|
190
|
+
if not distribution.pm_installer:
|
|
191
|
+
return InstallerStatus.UNKNOWN_DISTRIBUTION
|
|
189
192
|
for distros, command in config.items():
|
|
190
193
|
if distribution.name in distros.split("|") or distros == '*':
|
|
191
194
|
install_cmd = command
|
|
@@ -543,7 +546,7 @@ def get_distro_config():
|
|
|
543
546
|
distrib = system
|
|
544
547
|
|
|
545
548
|
if system == "Linux":
|
|
546
|
-
distrib = distro.
|
|
549
|
+
distrib = distro.like() or distro.id()
|
|
547
550
|
|
|
548
551
|
if distrib in ["ubuntu", "debian", "linuxmint", "popos", "kali"]:
|
|
549
552
|
installer = "apt install -y --no-install-recommends"
|
|
@@ -573,12 +576,16 @@ def get_distro_config():
|
|
|
573
576
|
else:
|
|
574
577
|
installer = "scoop" # Alternative package manager for Windows
|
|
575
578
|
|
|
576
|
-
|
|
579
|
+
if not installer:
|
|
580
|
+
console.print(Error(message=f'Could not find installer for your distribution (system: {system}, distrib: {distrib})')) # noqa: E501
|
|
581
|
+
|
|
582
|
+
manager = installer.split(' ')[0] if installer else ''
|
|
577
583
|
config = Distribution(
|
|
578
584
|
pm_installer=installer,
|
|
579
585
|
pm_finalizer=finalizer,
|
|
580
586
|
pm_name=manager,
|
|
581
|
-
name=distrib
|
|
587
|
+
name=distrib,
|
|
588
|
+
system=system
|
|
582
589
|
)
|
|
583
590
|
return config
|
|
584
591
|
|
|
@@ -25,6 +25,9 @@ class Stat(OutputType):
|
|
|
25
25
|
_table_fields = ['name', 'pid', 'cpu', 'memory']
|
|
26
26
|
_sort_by = ('name', 'pid')
|
|
27
27
|
|
|
28
|
+
def __str__(self) -> str:
|
|
29
|
+
return f'{self.name} [pid={self.pid}] [cpu={self.cpu:.2f}%] [memory={self.memory:.2f}%]'
|
|
30
|
+
|
|
28
31
|
def __repr__(self) -> str:
|
|
29
32
|
s = rf'[dim yellow3]📊 {self.name} \[pid={self.pid}] \[cpu={self.cpu:.2f}%] \[memory={self.memory:.2f}%]'
|
|
30
33
|
if self.net_conns:
|
|
@@ -53,7 +53,7 @@ class Runner:
|
|
|
53
53
|
"""
|
|
54
54
|
|
|
55
55
|
# Input field (mostly for tests and CLI)
|
|
56
|
-
|
|
56
|
+
input_types = []
|
|
57
57
|
|
|
58
58
|
# Output types
|
|
59
59
|
output_types = []
|
|
@@ -831,7 +831,7 @@ class Runner:
|
|
|
831
831
|
if isinstance(data, (OutputType, dict)):
|
|
832
832
|
if getattr(data, 'toDict', None):
|
|
833
833
|
data = data.toDict()
|
|
834
|
-
data = json.dumps(data)
|
|
834
|
+
data = json.dumps(data, default=str)
|
|
835
835
|
print(data, file=out)
|
|
836
836
|
|
|
837
837
|
def _get_findings_count(self):
|
|
@@ -73,19 +73,19 @@ OPTS_VULN = [
|
|
|
73
73
|
|
|
74
74
|
class Http(Command):
|
|
75
75
|
meta_opts = {k: OPTS[k] for k in OPTS_HTTP_CRAWLERS}
|
|
76
|
-
|
|
76
|
+
input_types = [URL]
|
|
77
77
|
output_types = [Url]
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
class HttpCrawler(Command):
|
|
81
81
|
meta_opts = {k: OPTS[k] for k in OPTS_HTTP_CRAWLERS}
|
|
82
|
-
|
|
82
|
+
input_types = [URL]
|
|
83
83
|
output_types = [Url]
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
class HttpFuzzer(Command):
|
|
87
87
|
meta_opts = {k: OPTS[k] for k in OPTS_HTTP_FUZZERS}
|
|
88
|
-
|
|
88
|
+
input_types = [URL]
|
|
89
89
|
output_types = [Url]
|
|
90
90
|
|
|
91
91
|
|
|
@@ -99,22 +99,22 @@ class Recon(Command):
|
|
|
99
99
|
|
|
100
100
|
|
|
101
101
|
class ReconDns(Recon):
|
|
102
|
-
|
|
102
|
+
input_types = [HOST]
|
|
103
103
|
output_types = [Subdomain]
|
|
104
104
|
|
|
105
105
|
|
|
106
106
|
class ReconUser(Recon):
|
|
107
|
-
|
|
107
|
+
input_types = [USERNAME]
|
|
108
108
|
output_types = [UserAccount]
|
|
109
109
|
|
|
110
110
|
|
|
111
111
|
class ReconIp(Recon):
|
|
112
|
-
|
|
112
|
+
input_types = [CIDR_RANGE]
|
|
113
113
|
output_types = [Ip]
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
class ReconPort(Recon):
|
|
117
|
-
|
|
117
|
+
input_types = [IP]
|
|
118
118
|
output_types = [Port]
|
|
119
119
|
|
|
120
120
|
|
|
@@ -434,15 +434,15 @@ class Vuln(Command):
|
|
|
434
434
|
|
|
435
435
|
|
|
436
436
|
class VulnHttp(Vuln):
|
|
437
|
-
|
|
437
|
+
input_types = [HOST]
|
|
438
438
|
|
|
439
439
|
|
|
440
440
|
class VulnCode(Vuln):
|
|
441
|
-
|
|
441
|
+
input_types = [PATH]
|
|
442
442
|
|
|
443
443
|
|
|
444
444
|
class VulnMulti(Vuln):
|
|
445
|
-
|
|
445
|
+
input_types = [HOST]
|
|
446
446
|
output_types = [Vulnerability]
|
|
447
447
|
|
|
448
448
|
|
|
@@ -451,7 +451,7 @@ class VulnMulti(Vuln):
|
|
|
451
451
|
#--------------#
|
|
452
452
|
|
|
453
453
|
class Tagger(Command):
|
|
454
|
-
|
|
454
|
+
input_types = [URL]
|
|
455
455
|
output_types = [Tag]
|
|
456
456
|
|
|
457
457
|
#----------------#
|
|
@@ -14,8 +14,9 @@ from secator.utils import process_wordlist
|
|
|
14
14
|
class arjun(Command):
|
|
15
15
|
"""HTTP Parameter Discovery Suite."""
|
|
16
16
|
cmd = 'arjun'
|
|
17
|
+
tags = ['url', 'fuzz', 'params']
|
|
17
18
|
input_flag = '-u'
|
|
18
|
-
|
|
19
|
+
input_types = [URL]
|
|
19
20
|
version_flag = ' '
|
|
20
21
|
opts = {
|
|
21
22
|
'chunk_size': {'type': int, 'help': 'Control query/chunk size'},
|
|
@@ -2,6 +2,7 @@ import shutil
|
|
|
2
2
|
|
|
3
3
|
from secator.config import CONFIG
|
|
4
4
|
from secator.decorators import task
|
|
5
|
+
from secator.definitions import FILENAME, HOST, IP, ORG_NAME, PORT, URL, USERNAME
|
|
5
6
|
from secator.runners import Command
|
|
6
7
|
from secator.serializers import RegexSerializer
|
|
7
8
|
from secator.output_types import Vulnerability, Port, Url, Record, Ip, Tag, Info, Error
|
|
@@ -177,8 +178,10 @@ def output_discriminator(self, item):
|
|
|
177
178
|
class bbot(Command):
|
|
178
179
|
"""Multipurpose scanner."""
|
|
179
180
|
cmd = 'bbot -y --allow-deadly --force'
|
|
181
|
+
tags = ['vuln', 'scan']
|
|
180
182
|
json_flag = '--json'
|
|
181
183
|
input_flag = '-t'
|
|
184
|
+
input_types = [HOST, IP, URL, PORT, ORG_NAME, USERNAME, FILENAME]
|
|
182
185
|
file_flag = None
|
|
183
186
|
version_flag = '--help'
|
|
184
187
|
opts = {
|
|
@@ -14,7 +14,8 @@ from secator.tasks._categories import HttpCrawler
|
|
|
14
14
|
class cariddi(HttpCrawler):
|
|
15
15
|
"""Crawl endpoints, secrets, api keys, extensions, tokens..."""
|
|
16
16
|
cmd = 'cariddi'
|
|
17
|
-
|
|
17
|
+
tags = ['url', 'crawl']
|
|
18
|
+
input_types = [URL]
|
|
18
19
|
input_flag = OPT_PIPE_INPUT
|
|
19
20
|
output_types = [Url, Tag]
|
|
20
21
|
file_flag = OPT_PIPE_INPUT
|
|
@@ -9,7 +9,7 @@ from secator.definitions import (CONTENT_LENGTH, CONTENT_TYPE, DELAY, DEPTH,
|
|
|
9
9
|
MATCH_CODES, MATCH_REGEX, MATCH_SIZE,
|
|
10
10
|
MATCH_WORDS, METHOD, OPT_NOT_SUPPORTED, OUTPUT_PATH, PROXY,
|
|
11
11
|
RATE_LIMIT, RETRIES, STATUS_CODE,
|
|
12
|
-
THREADS, TIMEOUT, USER_AGENT, WORDLIST)
|
|
12
|
+
THREADS, TIMEOUT, USER_AGENT, WORDLIST, URL)
|
|
13
13
|
from secator.output_types import Url, Info, Error
|
|
14
14
|
from secator.tasks._categories import HttpFuzzer
|
|
15
15
|
|
|
@@ -18,6 +18,8 @@ from secator.tasks._categories import HttpFuzzer
|
|
|
18
18
|
class dirsearch(HttpFuzzer):
|
|
19
19
|
"""Advanced web path brute-forcer."""
|
|
20
20
|
cmd = 'dirsearch'
|
|
21
|
+
tags = ['url', 'fuzz']
|
|
22
|
+
input_types = [URL]
|
|
21
23
|
input_flag = '-u'
|
|
22
24
|
file_flag = '-l'
|
|
23
25
|
json_flag = '-O json'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from secator.decorators import task
|
|
2
|
-
from secator.definitions import (OPT_PIPE_INPUT, RATE_LIMIT, RETRIES, THREADS)
|
|
2
|
+
from secator.definitions import (HOST, OPT_PIPE_INPUT, RATE_LIMIT, RETRIES, THREADS)
|
|
3
3
|
from secator.output_types import Record, Ip, Subdomain
|
|
4
4
|
from secator.output_types.ip import IpProtocol
|
|
5
5
|
from secator.tasks._categories import ReconDns
|
|
@@ -11,8 +11,10 @@ from secator.utils import extract_domain_info
|
|
|
11
11
|
class dnsx(ReconDns):
|
|
12
12
|
"""dnsx is a fast and multi-purpose DNS toolkit designed for running various retryabledns library."""
|
|
13
13
|
cmd = 'dnsx -resp -recon'
|
|
14
|
+
tags = ['dns', 'fuzz']
|
|
14
15
|
json_flag = '-json'
|
|
15
16
|
input_flag = OPT_PIPE_INPUT
|
|
17
|
+
input_types = [HOST]
|
|
16
18
|
file_flag = OPT_PIPE_INPUT
|
|
17
19
|
output_types = [Record, Ip, Subdomain]
|
|
18
20
|
opt_key_map = {
|
|
@@ -11,8 +11,10 @@ from secator.utils import process_wordlist
|
|
|
11
11
|
class dnsxbrute(ReconDns):
|
|
12
12
|
"""dnsx is a fast and multi-purpose DNS toolkit designed for running various library."""
|
|
13
13
|
cmd = 'dnsx'
|
|
14
|
+
tags = ['dns', 'fuzz']
|
|
14
15
|
json_flag = '-json'
|
|
15
16
|
input_flag = '-domain'
|
|
17
|
+
input_types = [HOST]
|
|
16
18
|
file_flag = '-domain'
|
|
17
19
|
opt_key_map = {
|
|
18
20
|
RATE_LIMIT: 'rate-limit',
|
|
@@ -6,7 +6,7 @@ from secator.definitions import (CONTENT_TYPE, DELAY, DEPTH, FILTER_CODES,
|
|
|
6
6
|
MATCH_REGEX, MATCH_SIZE, MATCH_WORDS, METHOD,
|
|
7
7
|
OPT_NOT_SUPPORTED, OPT_PIPE_INPUT, PROXY,
|
|
8
8
|
RATE_LIMIT, RETRIES, STATUS_CODE,
|
|
9
|
-
THREADS, TIMEOUT, USER_AGENT, WORDLIST, WORDS)
|
|
9
|
+
THREADS, TIMEOUT, USER_AGENT, WORDLIST, WORDS, URL)
|
|
10
10
|
from secator.output_types import Url
|
|
11
11
|
from secator.serializers import JSONSerializer
|
|
12
12
|
from secator.tasks._categories import HttpFuzzer
|
|
@@ -16,6 +16,8 @@ from secator.tasks._categories import HttpFuzzer
|
|
|
16
16
|
class feroxbuster(HttpFuzzer):
|
|
17
17
|
"""Simple, fast, recursive content discovery tool written in Rust"""
|
|
18
18
|
cmd = 'feroxbuster --auto-bail --no-state'
|
|
19
|
+
tags = ['url', 'fuzz']
|
|
20
|
+
input_types = [URL]
|
|
19
21
|
input_flag = '--url'
|
|
20
22
|
input_chunk_size = 1
|
|
21
23
|
file_flag = OPT_PIPE_INPUT
|
|
@@ -7,7 +7,7 @@ from secator.definitions import (AUTO_CALIBRATION, CONTENT_LENGTH,
|
|
|
7
7
|
MATCH_WORDS, METHOD, OPT_NOT_SUPPORTED,
|
|
8
8
|
PERCENT, PROXY, RATE_LIMIT, RETRIES,
|
|
9
9
|
STATUS_CODE, THREADS, TIME, TIMEOUT,
|
|
10
|
-
USER_AGENT, WORDLIST)
|
|
10
|
+
USER_AGENT, WORDLIST, URL)
|
|
11
11
|
from secator.output_types import Progress, Url
|
|
12
12
|
from secator.serializers import JSONSerializer, RegexSerializer
|
|
13
13
|
from secator.tasks._categories import HttpFuzzer
|
|
@@ -19,6 +19,8 @@ FFUF_PROGRESS_REGEX = r':: Progress: \[(?P<count>\d+)/(?P<total>\d+)\] :: Job \[
|
|
|
19
19
|
class ffuf(HttpFuzzer):
|
|
20
20
|
"""Fast web fuzzer written in Go."""
|
|
21
21
|
cmd = 'ffuf -noninteractive'
|
|
22
|
+
tags = ['url', 'fuzz']
|
|
23
|
+
input_types = [URL]
|
|
22
24
|
input_flag = '-u'
|
|
23
25
|
input_chunk_size = 1
|
|
24
26
|
file_flag = None
|
|
@@ -11,8 +11,10 @@ from secator.tasks._categories import ReconIp
|
|
|
11
11
|
class fping(ReconIp):
|
|
12
12
|
"""Send ICMP echo probes to network hosts, similar to ping, but much better."""
|
|
13
13
|
cmd = 'fping -a'
|
|
14
|
+
tags = ['ip', 'recon']
|
|
14
15
|
file_flag = '-f'
|
|
15
16
|
input_flag = None
|
|
17
|
+
input_types = [IP]
|
|
16
18
|
opt_prefix = '--'
|
|
17
19
|
opt_key_map = {
|
|
18
20
|
DELAY: 'period',
|
|
@@ -26,7 +28,7 @@ class fping(ReconIp):
|
|
|
26
28
|
DELAY: lambda x: x * 1000, # convert s to ms
|
|
27
29
|
TIMEOUT: lambda x: x * 1000 # convert s to ms
|
|
28
30
|
}
|
|
29
|
-
|
|
31
|
+
input_types = [IP]
|
|
30
32
|
output_types = [Ip]
|
|
31
33
|
install_pre = {'*': ['fping']}
|
|
32
34
|
ignore_return_code = True
|
|
@@ -4,7 +4,7 @@ from secator.definitions import (DELAY, DEPTH, FILTER_CODES, FILTER_REGEX,
|
|
|
4
4
|
HEADER, MATCH_CODES, MATCH_REGEX, MATCH_SIZE,
|
|
5
5
|
MATCH_WORDS, METHOD, OPT_NOT_SUPPORTED,
|
|
6
6
|
OPT_PIPE_INPUT, PROXY, RATE_LIMIT, RETRIES,
|
|
7
|
-
THREADS, TIMEOUT, USER_AGENT)
|
|
7
|
+
THREADS, TIMEOUT, USER_AGENT, URL)
|
|
8
8
|
from secator.serializers import JSONSerializer
|
|
9
9
|
from secator.tasks._categories import HttpCrawler
|
|
10
10
|
|
|
@@ -13,6 +13,8 @@ from secator.tasks._categories import HttpCrawler
|
|
|
13
13
|
class gau(HttpCrawler):
|
|
14
14
|
"""Fetch known URLs from AlienVault's Open Threat Exchange, the Wayback Machine, Common Crawl, and URLScan."""
|
|
15
15
|
cmd = 'gau'
|
|
16
|
+
tags = ['pattern', 'scan']
|
|
17
|
+
input_types = [URL]
|
|
16
18
|
file_flag = OPT_PIPE_INPUT
|
|
17
19
|
json_flag = '--json'
|
|
18
20
|
opt_prefix = '--'
|
|
@@ -8,6 +8,7 @@ from secator.tasks._categories import Tagger
|
|
|
8
8
|
class gf(Tagger):
|
|
9
9
|
"""Wrapper around grep, to help you grep for things."""
|
|
10
10
|
cmd = 'gf'
|
|
11
|
+
tags = ['pattern', 'scan']
|
|
11
12
|
file_flag = OPT_PIPE_INPUT
|
|
12
13
|
input_flag = OPT_PIPE_INPUT
|
|
13
14
|
version_flag = OPT_NOT_SUPPORTED
|
|
@@ -17,7 +18,7 @@ class gf(Tagger):
|
|
|
17
18
|
opt_key_map = {
|
|
18
19
|
'pattern': ''
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
input_types = [URL]
|
|
21
22
|
install_cmd = (
|
|
22
23
|
'go install -v github.com/tomnomnom/gf@latest && '
|
|
23
24
|
'git clone https://github.com/1ndianl33t/Gf-Patterns $HOME/.gf || true'
|
|
@@ -5,7 +5,7 @@ import yaml
|
|
|
5
5
|
from secator.config import CONFIG
|
|
6
6
|
from secator.decorators import task
|
|
7
7
|
from secator.runners import Command
|
|
8
|
-
from secator.definitions import (OUTPUT_PATH)
|
|
8
|
+
from secator.definitions import (OUTPUT_PATH, PATH, GIT_REPOSITORY)
|
|
9
9
|
from secator.utils import caml_to_snake
|
|
10
10
|
from secator.output_types import Tag, Info, Error
|
|
11
11
|
|
|
@@ -14,6 +14,8 @@ from secator.output_types import Tag, Info, Error
|
|
|
14
14
|
class gitleaks(Command):
|
|
15
15
|
"""Tool for detecting secrets like passwords, API keys, and tokens in git repos, files, and stdin."""
|
|
16
16
|
cmd = 'gitleaks'
|
|
17
|
+
tags = ['secret', 'scan']
|
|
18
|
+
input_types = [PATH, GIT_REPOSITORY]
|
|
17
19
|
input_flag = None
|
|
18
20
|
json_flag = '-f json'
|
|
19
21
|
opt_prefix = '--'
|