secator 0.0.1__py3-none-any.whl → 0.3.5__py3-none-any.whl

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 (68) hide show
  1. secator/.gitignore +162 -0
  2. secator/celery.py +8 -68
  3. secator/cli.py +631 -274
  4. secator/decorators.py +42 -6
  5. secator/definitions.py +104 -33
  6. secator/exporters/csv.py +1 -2
  7. secator/exporters/gdrive.py +1 -1
  8. secator/exporters/json.py +1 -2
  9. secator/exporters/txt.py +1 -2
  10. secator/hooks/mongodb.py +12 -12
  11. secator/installer.py +335 -0
  12. secator/report.py +2 -14
  13. secator/rich.py +3 -10
  14. secator/runners/_base.py +106 -34
  15. secator/runners/_helpers.py +18 -17
  16. secator/runners/command.py +91 -55
  17. secator/runners/scan.py +3 -1
  18. secator/runners/task.py +6 -4
  19. secator/runners/workflow.py +13 -11
  20. secator/tasks/_categories.py +14 -19
  21. secator/tasks/cariddi.py +2 -1
  22. secator/tasks/dalfox.py +2 -0
  23. secator/tasks/dirsearch.py +5 -7
  24. secator/tasks/dnsx.py +1 -0
  25. secator/tasks/dnsxbrute.py +1 -0
  26. secator/tasks/feroxbuster.py +6 -7
  27. secator/tasks/ffuf.py +4 -7
  28. secator/tasks/gau.py +1 -4
  29. secator/tasks/gf.py +2 -1
  30. secator/tasks/gospider.py +1 -0
  31. secator/tasks/grype.py +47 -47
  32. secator/tasks/h8mail.py +5 -6
  33. secator/tasks/httpx.py +24 -18
  34. secator/tasks/katana.py +11 -15
  35. secator/tasks/maigret.py +3 -3
  36. secator/tasks/mapcidr.py +1 -0
  37. secator/tasks/msfconsole.py +3 -1
  38. secator/tasks/naabu.py +2 -1
  39. secator/tasks/nmap.py +14 -17
  40. secator/tasks/nuclei.py +4 -3
  41. secator/tasks/searchsploit.py +4 -2
  42. secator/tasks/subfinder.py +1 -0
  43. secator/tasks/wpscan.py +11 -13
  44. secator/utils.py +64 -82
  45. secator/utils_test.py +3 -2
  46. secator-0.3.5.dist-info/METADATA +411 -0
  47. secator-0.3.5.dist-info/RECORD +100 -0
  48. {secator-0.0.1.dist-info → secator-0.3.5.dist-info}/WHEEL +1 -2
  49. secator-0.0.1.dist-info/METADATA +0 -199
  50. secator-0.0.1.dist-info/RECORD +0 -114
  51. secator-0.0.1.dist-info/top_level.txt +0 -2
  52. tests/__init__.py +0 -0
  53. tests/integration/__init__.py +0 -0
  54. tests/integration/inputs.py +0 -42
  55. tests/integration/outputs.py +0 -392
  56. tests/integration/test_scans.py +0 -82
  57. tests/integration/test_tasks.py +0 -103
  58. tests/integration/test_workflows.py +0 -163
  59. tests/performance/__init__.py +0 -0
  60. tests/performance/loadtester.py +0 -56
  61. tests/unit/__init__.py +0 -0
  62. tests/unit/test_celery.py +0 -39
  63. tests/unit/test_scans.py +0 -0
  64. tests/unit/test_serializers.py +0 -51
  65. tests/unit/test_tasks.py +0 -348
  66. tests/unit/test_workflows.py +0 -96
  67. {secator-0.0.1.dist-info → secator-0.3.5.dist-info}/entry_points.txt +0 -0
  68. {secator-0.0.1.dist-info → secator-0.3.5.dist-info/licenses}/LICENSE +0 -0
secator/.gitignore ADDED
@@ -0,0 +1,162 @@
1
+ # ---> Python
2
+ # Byte-compiled / optimized / DLL files
3
+ __pycache__/
4
+ *.py[cod]
5
+ *$py.class
6
+
7
+ # C extensions
8
+ *.so
9
+
10
+ # Distribution / packaging
11
+ .Python
12
+ build/
13
+ develop-eggs/
14
+ dist/
15
+ downloads/
16
+ eggs/
17
+ .eggs/
18
+ lib/
19
+ lib64/
20
+ parts/
21
+ sdist/
22
+ var/
23
+ wheels/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ # Usually these files are written by a python script from a template
32
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
33
+ *.manifest
34
+ *.spec
35
+
36
+ # Installer logs
37
+ pip-log.txt
38
+ pip-delete-this-directory.txt
39
+
40
+ # Unit test / coverage reports
41
+ htmlcov/
42
+ .tox/
43
+ .nox/
44
+ .coverage
45
+ .coverage.*
46
+ .cache
47
+ nosetests.xml
48
+ coverage.xml
49
+ *.cover
50
+ *.py,cover
51
+ .hypothesis/
52
+ .pytest_cache/
53
+ cover/
54
+
55
+ # Translations
56
+ *.mo
57
+ *.pot
58
+
59
+ # Django stuff:
60
+ *.log
61
+ local_settings.py
62
+ db.sqlite3
63
+ db.sqlite3-journal
64
+
65
+ # Flask stuff:
66
+ instance/
67
+ .webassets-cache
68
+
69
+ # Scrapy stuff:
70
+ .scrapy
71
+
72
+ # Sphinx documentation
73
+ docs/_build/
74
+
75
+ # PyBuilder
76
+ .pybuilder/
77
+ target/
78
+
79
+ # Jupyter Notebook
80
+ .ipynb_checkpoints
81
+
82
+ # IPython
83
+ profile_default/
84
+ ipython_config.py
85
+
86
+ # pyenv
87
+ # For a library or package, you might want to ignore these files since the code is
88
+ # intended to run in multiple environments; otherwise, check them in:
89
+ # .python-version
90
+
91
+ # pipenv
92
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
93
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
94
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
95
+ # install all needed dependencies.
96
+ #Pipfile.lock
97
+
98
+ # poetry
99
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
100
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
101
+ # commonly ignored for libraries.
102
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
103
+ #poetry.lock
104
+
105
+ # pdm
106
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
107
+ #pdm.lock
108
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
109
+ # in version control.
110
+ # https://pdm.fming.dev/#use-with-ide
111
+ .pdm.toml
112
+
113
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
114
+ __pypackages__/
115
+
116
+ # Celery stuff
117
+ celerybeat-schedule
118
+ celerybeat.pid
119
+
120
+ # SageMath parsed files
121
+ *.sage.py
122
+
123
+ # Environments
124
+ .env
125
+ .venv
126
+ env/
127
+ venv/
128
+ ENV/
129
+ env.bak/
130
+ venv.bak/
131
+
132
+ # Spyder project settings
133
+ .spyderproject
134
+ .spyproject
135
+
136
+ # Rope project settings
137
+ .ropeproject
138
+
139
+ # mkdocs documentation
140
+ /site
141
+
142
+ # mypy
143
+ .mypy_cache/
144
+ .dmypy.json
145
+ dmypy.json
146
+
147
+ # Pyre type checker
148
+ .pyre/
149
+
150
+ # pytype static type analyzer
151
+ .pytype/
152
+
153
+ # Cython debug symbols
154
+ cython_debug/
155
+
156
+ # PyCharm
157
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
158
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
159
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
160
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
161
+ #.idea/
162
+
secator/celery.py CHANGED
@@ -3,11 +3,10 @@ import logging
3
3
  import traceback
4
4
  from time import sleep
5
5
 
6
- import celery
7
- from celery import chain, chord, signals
6
+ from celery import Celery, chain, chord, signals
8
7
  from celery.app import trace
9
8
  from celery.result import AsyncResult, allow_join_result
10
- # from pyinstrument import Profiler
9
+ # from pyinstrument import Profiler # TODO: make pyinstrument optional
11
10
  from rich.logging import RichHandler
12
11
 
13
12
  from secator.definitions import (CELERY_BROKER_CONNECTION_TIMEOUT,
@@ -20,11 +19,10 @@ from secator.rich import console
20
19
  from secator.runners import Scan, Task, Workflow
21
20
  from secator.runners._helpers import run_extractors
22
21
  from secator.utils import (TaskError, debug, deduplicate,
23
- discover_external_tasks, discover_internal_tasks,
24
22
  flatten)
25
23
 
26
24
  # from pathlib import Path
27
- # import memray
25
+ # import memray # TODO: conditional memray tracing
28
26
 
29
27
  rich_handler = RichHandler(rich_tracebacks=True)
30
28
  rich_handler.setLevel(logging.INFO)
@@ -42,9 +40,8 @@ logger = logging.getLogger(__name__)
42
40
  trace.LOG_SUCCESS = """\
43
41
  Task %(name)s[%(id)s] succeeded in %(runtime)ss\
44
42
  """
45
- COMMANDS = discover_internal_tasks() + discover_external_tasks()
46
43
 
47
- app = celery.Celery(__name__)
44
+ app = Celery(__name__)
48
45
  app.conf.update({
49
46
  # Worker config
50
47
  'worker_send_task_events': True,
@@ -56,6 +53,7 @@ app.conf.update({
56
53
  'broker_transport_options': {
57
54
  'data_folder_in': CELERY_DATA_FOLDER,
58
55
  'data_folder_out': CELERY_DATA_FOLDER,
56
+ 'control_folder': CELERY_DATA_FOLDER,
59
57
  'visibility_timeout': CELERY_BROKER_VISIBILITY_TIMEOUT,
60
58
  },
61
59
  'broker_connection_retry_on_startup': True,
@@ -109,7 +107,7 @@ def void(*args, **kwargs):
109
107
 
110
108
  def revoke_task(task_id):
111
109
  console.print(f'Revoking task {task_id}')
112
- return app.control.revoke(task_id, terminate=True, signal='SIGKILL')
110
+ return app.control.revoke(task_id, terminate=True, signal='SIGINT')
113
111
 
114
112
 
115
113
  #--------------#
@@ -322,11 +320,6 @@ def run_command(self, results, name, targets, opts={}):
322
320
  else: # full traceback
323
321
  exc_str = ' '.join(traceback.format_exception(task_exc, value=task_exc, tb=task_exc.__traceback__))
324
322
  state['meta'][msg_type] = exc_str
325
- if task:
326
- color = 'bold red' if msg_type == 'error' else 'green'
327
- task._print(exc_str, color=color)
328
- else:
329
- console.log(exc_str)
330
323
 
331
324
  # Update task state with final status
332
325
  self.update_state(**state)
@@ -371,11 +364,6 @@ def forward_results(results):
371
364
  # Celery result utils #
372
365
  #---------------------#
373
366
 
374
- def find_root_task(result):
375
- while (result.parent is not None):
376
- result = result.parent
377
- return result
378
-
379
367
 
380
368
  def poll_task(result, seen=[]):
381
369
  """Poll Celery result tree recursively to get results live.
@@ -423,60 +411,12 @@ def poll_task(result, seen=[]):
423
411
  yield from poll_task(result, seen=seen)
424
412
 
425
413
 
426
- def get_results(result):
427
- """Get all intermediate results from Celery result object.
428
-
429
- Use this when running complex workflows with .si() i.e not passing results
430
- between tasks.
431
-
432
- Args:
433
- result (Union[AsyncResult, GroupResult]): Celery result.
434
-
435
- Returns:
436
- list: List of results.
437
- """
438
- while not result.ready():
439
- continue
440
- results = []
441
- get_nested_results(result, results=results)
442
- return results
443
-
444
-
445
- def get_nested_results(result, results=[]):
446
- """Get results recursively from Celery result object by parsing result tree
447
- in reverse order. Also gets results from GroupResult children.
448
-
449
- Args:
450
- result (Union[AsyncResult, GroupResult]): Celery result object.
451
-
452
- Returns:
453
- list: List of results.
454
- """
455
- if result is None:
456
- return
457
-
458
- if isinstance(result, celery.result.GroupResult):
459
- console.log(repr(result))
460
- get_nested_results(result.parent, results=results)
461
- for child in result.children:
462
- get_nested_results(child, results=results)
463
-
464
- elif isinstance(result, celery.result.AsyncResult):
465
- console.log(repr(result))
466
- res = result.get()
467
- console.log(f'-> Found {len(res)} results.')
468
- console.log(f'-> {res}')
469
- if res is not None:
470
- results.extend(res)
471
- get_nested_results(result.parent, results=results)
472
-
473
-
474
414
  def is_celery_worker_alive():
475
415
  """Check if a Celery worker is available."""
476
416
  result = app.control.broadcast('ping', reply=True, limit=1, timeout=1)
477
417
  result = bool(result)
478
418
  if result:
479
419
  console.print('Celery worker is alive !', style='bold green')
480
- else:
481
- console.print('No Celery worker alive.', style='bold red')
420
+ # else:
421
+ # console.print('No Celery worker alive.', style='bold red')
482
422
  return result