dissect.cobaltstrike 1.2.2.dev2__tar.gz → 1.2.2.dev4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/.pre-commit-config.yaml +8 -9
  2. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/PKG-INFO +10 -12
  3. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/README.rst +1 -1
  4. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/_version.py +24 -0
  5. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/artifact.py +24 -14
  6. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/beacon.py +605 -130
  7. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c2profile.lark +6 -0
  8. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c2profile.py +25 -0
  9. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/c_obfuscate.py +54 -0
  10. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/c_obfuscate.pyi +71 -0
  11. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/guardrails.py +45 -37
  12. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/normalize.py +136 -0
  13. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/obfuscate.py +214 -0
  14. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/pe.py +52 -30
  15. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/stage.py +168 -0
  16. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/utils.py +64 -3
  17. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/version.py +14 -1
  18. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/xordecode.py +241 -0
  19. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/beacon-version-identification.rst +21 -1
  20. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/cobaltstrike-beacon-versions.csv +1 -0
  21. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/examples.rst +42 -3
  22. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/installation.rst +12 -2
  23. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/pyproject.toml +43 -6
  24. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tests/conftest.py +2 -0
  25. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_beacon.py +35 -6
  26. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_c2profile.py +10 -2
  27. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_xordecode.py +12 -6
  28. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tox.ini +11 -1
  29. dissect_cobaltstrike-1.2.2.dev2/dissect/cobaltstrike/_version.py +0 -21
  30. dissect_cobaltstrike-1.2.2.dev2/dissect/cobaltstrike/xordecode.py +0 -258
  31. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/.github/workflows/dissect-ci.yml +0 -0
  32. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/.gitignore +0 -0
  33. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/.lfs-assets-id +0 -0
  34. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/.readthedocs.yml +0 -0
  35. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/LICENSE +0 -0
  36. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/codecov.yml +0 -0
  37. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/__init__.py +0 -0
  38. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c2.py +0 -0
  39. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c_c2.py +0 -0
  40. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/client.py +0 -0
  41. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/pcap.py +0 -0
  42. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/Makefile +0 -0
  43. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/_ext/generate_beacon_version_csv.py +0 -0
  44. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/c2profile-grammar.rst +0 -0
  45. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/codespell-ignore-words.txt +0 -0
  46. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/conf.py +0 -0
  47. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/beacon-client.png +0 -0
  48. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/teamserver-echoclient.png +0 -0
  49. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/teamserver_ls.png +0 -0
  50. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/vt-cobaltstrike-43-zip.png +0 -0
  51. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/index.rst +0 -0
  52. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/license.rst +0 -0
  53. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/checksum8-accesslogs.rst +0 -0
  54. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/dump_beacon_keys.rst +0 -0
  55. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/example_client.rst +0 -0
  56. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/index.rst +0 -0
  57. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/c2_def.rst +0 -0
  58. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/cs_def.rst +0 -0
  59. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/guardrails_def.rst +0 -0
  60. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/index.rst +0 -0
  61. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/pe_def.rst +0 -0
  62. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-artifact.rst +0 -0
  63. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-client.rst +0 -0
  64. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-dump.rst +0 -0
  65. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-pcap.rst +0 -0
  66. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-xordecode.rst +0 -0
  67. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/c2profile-dump.rst +0 -0
  68. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/tutorials/decrypt_cobaltstrike_pcaps.rst +0 -0
  69. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/tutorials/index.rst +0 -0
  70. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/docs/tutorials/minimal_beacon_client.rst +0 -0
  71. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/scripts/checksum8-accesslogs.py +0 -0
  72. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/scripts/dump_beacon_keys.py +0 -0
  73. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/scripts/example_client.py +0 -0
  74. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_c2.py +0 -0
  75. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_client.py +0 -0
  76. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_guardrails.py +0 -0
  77. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_pe.py +0 -0
  78. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_utils.py +0 -0
  79. {dissect_cobaltstrike-1.2.2.dev2 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_version.py +0 -0
@@ -1,16 +1,15 @@
1
1
  repos:
2
2
  - repo: https://github.com/charliermarsh/ruff-pre-commit
3
- rev: v0.6.9
3
+ rev: v0.15.6
4
4
  hooks:
5
- - id: ruff
6
- - repo: https://github.com/psf/black
7
- rev: 24.10.0
8
- hooks:
9
- - id: black
10
- args: [--check, --diff]
11
- language_version: python3
5
+ - id: ruff # used by `fix`
6
+ alias: ruff-fix
7
+ args: [--fix]
8
+ - id: ruff # used by `lint`
9
+ alias: ruff-lint
10
+ - id: ruff-format # replaces black
12
11
  - repo: https://github.com/codespell-project/codespell
13
- rev: v2.3.0
12
+ rev: v2.4.2
14
13
  hooks:
15
14
  - id: codespell
16
15
  args: [--ignore-words=docs/codespell-ignore-words.txt]
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: dissect.cobaltstrike
3
- Version: 1.2.2.dev2
3
+ Version: 1.2.2.dev4
4
4
  Summary: a Python library for dissecting Cobalt Strike related data
5
5
  Project-URL: Homepage, https://github.com/fox-it/dissect.cobaltstrike
6
6
  Project-URL: Documentation, https://dissect-cobaltstrike.readthedocs.io/
@@ -19,28 +19,29 @@ Classifier: Operating System :: MacOS :: MacOS X
19
19
  Classifier: Operating System :: Microsoft :: Windows
20
20
  Classifier: Operating System :: POSIX
21
21
  Classifier: Programming Language :: Python :: 3 :: Only
22
- Classifier: Programming Language :: Python :: 3.9
23
22
  Classifier: Programming Language :: Python :: 3.10
24
23
  Classifier: Programming Language :: Python :: 3.11
25
24
  Classifier: Programming Language :: Python :: 3.12
26
25
  Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Programming Language :: Python :: 3.14
27
27
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
28
28
  Classifier: Topic :: Security
29
29
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
30
  Classifier: Topic :: Utilities
31
- Requires-Python: >=3.9
32
- Requires-Dist: dissect-cstruct>=4.6.dev
33
- Requires-Dist: lark
31
+ Requires-Python: >=3.10
32
+ Requires-Dist: dissect-cstruct>=4.7
33
+ Requires-Dist: dissect-executable>=1.11
34
+ Requires-Dist: dissect-util>=3.24
35
+ Requires-Dist: lark>=1.3.1
36
+ Requires-Dist: pycryptodome>=3.23.0
34
37
  Provides-Extra: c2
35
38
  Requires-Dist: flow-record; extra == 'c2'
36
39
  Requires-Dist: httpx; extra == 'c2'
37
- Requires-Dist: pycryptodome; extra == 'c2'
38
40
  Provides-Extra: docs
39
41
  Requires-Dist: flow-record; extra == 'docs'
40
42
  Requires-Dist: httpx; extra == 'docs'
41
43
  Requires-Dist: ipython; extra == 'docs'
42
44
  Requires-Dist: pickleshare; extra == 'docs'
43
- Requires-Dist: pycryptodome; extra == 'docs'
44
45
  Requires-Dist: pyshark; extra == 'docs'
45
46
  Requires-Dist: rich; extra == 'docs'
46
47
  Requires-Dist: sphinx; extra == 'docs'
@@ -51,18 +52,15 @@ Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'docs'
51
52
  Provides-Extra: full
52
53
  Requires-Dist: flow-record; extra == 'full'
53
54
  Requires-Dist: httpx; extra == 'full'
54
- Requires-Dist: pycryptodome; extra == 'full'
55
55
  Requires-Dist: pyshark; extra == 'full'
56
56
  Requires-Dist: rich; extra == 'full'
57
57
  Provides-Extra: pcap
58
58
  Requires-Dist: flow-record; extra == 'pcap'
59
59
  Requires-Dist: httpx; extra == 'pcap'
60
- Requires-Dist: pycryptodome; extra == 'pcap'
61
60
  Requires-Dist: pyshark; extra == 'pcap'
62
61
  Provides-Extra: test
63
62
  Requires-Dist: flow-record; extra == 'test'
64
63
  Requires-Dist: httpx; extra == 'test'
65
- Requires-Dist: pycryptodome; extra == 'test'
66
64
  Requires-Dist: pyshark; extra == 'test'
67
65
  Requires-Dist: pytest; extra == 'test'
68
66
  Requires-Dist: pytest-cov; extra == 'test'
@@ -99,7 +97,7 @@ If you want to install the latest pre-release version, use the ``--pre`` flag::
99
97
 
100
98
  $ pip install --pre dissect.cobaltstrike
101
99
 
102
- **dissect.cobaltstrike** requires Python 3.9 or later.
100
+ **dissect.cobaltstrike** requires Python 3.10 or later.
103
101
 
104
102
  Documentation
105
103
  -------------
@@ -27,7 +27,7 @@ If you want to install the latest pre-release version, use the ``--pre`` flag::
27
27
 
28
28
  $ pip install --pre dissect.cobaltstrike
29
29
 
30
- **dissect.cobaltstrike** requires Python 3.9 or later.
30
+ **dissect.cobaltstrike** requires Python 3.10 or later.
31
31
 
32
32
  Documentation
33
33
  -------------
@@ -0,0 +1,24 @@
1
+ # file generated by vcs-versioning
2
+ # don't change, don't track in version control
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "__version__",
7
+ "__version_tuple__",
8
+ "version",
9
+ "version_tuple",
10
+ "__commit_id__",
11
+ "commit_id",
12
+ ]
13
+
14
+ version: str
15
+ __version__: str
16
+ __version_tuple__: tuple[int | str, ...]
17
+ version_tuple: tuple[int | str, ...]
18
+ commit_id: str | None
19
+ __commit_id__: str | None
20
+
21
+ __version__ = version = '1.2.2.dev4'
22
+ __version_tuple__ = version_tuple = (1, 2, 2, 'dev4')
23
+
24
+ __commit_id__ = commit_id = None
@@ -10,26 +10,35 @@ import contextlib
10
10
  import io
11
11
  import logging
12
12
  import sys
13
- from typing import BinaryIO, Iterator, NamedTuple, Optional
13
+ from typing import BinaryIO, Iterator, Optional
14
14
 
15
15
  from dissect.cobaltstrike import utils
16
16
 
17
17
  logger = logging.getLogger(__name__)
18
18
 
19
19
 
20
- class ArtifactKitPayload(NamedTuple):
21
- """Namedtuple containing the ArtifactKit metadata and decoded payload"""
20
+ class ArtifactKitPayload(io.BytesIO):
21
+ """Decoded ArtifactKit payload with its metadata."""
22
22
 
23
- offset: int
24
- """Offset of the ArtifactKit metadata in the file"""
25
- size: int
26
- """Size of the payload"""
27
- xorkey: bytes
28
- """4-byte random xor mask"""
29
- hints: bytes
30
- """Loader hints (GetModuleHandleA, GetProcAddress)"""
31
- payload: bytes
32
- """Decoded ArtifactKit payload"""
23
+ def __init__(self, offset: int, size: int, xorkey: bytes, hints: bytes, payload: bytes):
24
+ super().__init__(payload)
25
+ self.offset = offset
26
+ """Offset of the ArtifactKit metadata in the file"""
27
+ self.size = size
28
+ """Size of the payload"""
29
+ self.xorkey = xorkey
30
+ """4-byte random xor mask"""
31
+ self.hints = hints
32
+ """Loader hints (GetModuleHandleA, GetProcAddress)"""
33
+ self.payload = payload
34
+ """Decoded ArtifactKit payload"""
35
+ self.fh = io.BytesIO(payload)
36
+
37
+ def __repr__(self) -> str:
38
+ return f"<ArtifactKitPayload offset=0x{self.offset:x} size={self.size} xorkey={self.xorkey!r}>"
39
+
40
+ def get_name(self) -> str:
41
+ return "ArtifactKitPayload"
33
42
 
34
43
 
35
44
  def iter_artifactkit_payloads(
@@ -68,7 +77,8 @@ def iter_artifactkit_payloads(
68
77
  hints = fobj.read(8)
69
78
  data = fobj.read(size)
70
79
  payload = utils.xor(data, xorkey)
71
- yield ArtifactKitPayload(offset=pos, size=size, xorkey=xorkey, hints=hints, payload=payload)
80
+ if size > 0:
81
+ yield ArtifactKitPayload(offset=pos, size=size, xorkey=xorkey, hints=hints, payload=payload)
72
82
  pos += 1
73
83
 
74
84