dissect.cobaltstrike 1.2.2.dev3__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 (78) hide show
  1. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/PKG-INFO +4 -8
  2. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/_version.py +2 -2
  3. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/artifact.py +24 -14
  4. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/beacon.py +605 -130
  5. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c2profile.lark +6 -0
  6. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c2profile.py +25 -0
  7. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/c_obfuscate.py +54 -0
  8. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/c_obfuscate.pyi +71 -0
  9. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/guardrails.py +43 -35
  10. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/normalize.py +136 -0
  11. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/obfuscate.py +214 -0
  12. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/pe.py +11 -6
  13. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/stage.py +168 -0
  14. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/utils.py +64 -3
  15. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/version.py +14 -1
  16. dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/xordecode.py +241 -0
  17. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/beacon-version-identification.rst +21 -1
  18. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/cobaltstrike-beacon-versions.csv +1 -0
  19. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/examples.rst +42 -3
  20. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/pyproject.toml +4 -4
  21. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/conftest.py +2 -0
  22. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_beacon.py +33 -2
  23. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_c2profile.py +9 -1
  24. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_xordecode.py +12 -6
  25. dissect_cobaltstrike-1.2.2.dev3/dissect/cobaltstrike/xordecode.py +0 -258
  26. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/.github/workflows/dissect-ci.yml +0 -0
  27. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/.gitignore +0 -0
  28. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/.lfs-assets-id +0 -0
  29. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/.pre-commit-config.yaml +0 -0
  30. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/.readthedocs.yml +0 -0
  31. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/LICENSE +0 -0
  32. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/README.rst +0 -0
  33. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/codecov.yml +0 -0
  34. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/__init__.py +0 -0
  35. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c2.py +0 -0
  36. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c_c2.py +0 -0
  37. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/client.py +0 -0
  38. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/pcap.py +0 -0
  39. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/Makefile +0 -0
  40. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/_ext/generate_beacon_version_csv.py +0 -0
  41. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/c2profile-grammar.rst +0 -0
  42. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/codespell-ignore-words.txt +0 -0
  43. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/conf.py +0 -0
  44. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/beacon-client.png +0 -0
  45. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/teamserver-echoclient.png +0 -0
  46. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/teamserver_ls.png +0 -0
  47. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/vt-cobaltstrike-43-zip.png +0 -0
  48. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/index.rst +0 -0
  49. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/installation.rst +0 -0
  50. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/license.rst +0 -0
  51. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/checksum8-accesslogs.rst +0 -0
  52. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/dump_beacon_keys.rst +0 -0
  53. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/example_client.rst +0 -0
  54. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/index.rst +0 -0
  55. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/c2_def.rst +0 -0
  56. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/cs_def.rst +0 -0
  57. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/guardrails_def.rst +0 -0
  58. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/index.rst +0 -0
  59. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/pe_def.rst +0 -0
  60. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-artifact.rst +0 -0
  61. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-client.rst +0 -0
  62. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-dump.rst +0 -0
  63. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-pcap.rst +0 -0
  64. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-xordecode.rst +0 -0
  65. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/c2profile-dump.rst +0 -0
  66. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tutorials/decrypt_cobaltstrike_pcaps.rst +0 -0
  67. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tutorials/index.rst +0 -0
  68. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tutorials/minimal_beacon_client.rst +0 -0
  69. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/scripts/checksum8-accesslogs.py +0 -0
  70. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/scripts/dump_beacon_keys.py +0 -0
  71. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/scripts/example_client.py +0 -0
  72. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_c2.py +0 -0
  73. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_client.py +0 -0
  74. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_guardrails.py +0 -0
  75. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_pe.py +0 -0
  76. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_utils.py +0 -0
  77. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_version.py +0 -0
  78. {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: dissect.cobaltstrike
3
- Version: 1.2.2.dev3
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/
@@ -32,17 +32,16 @@ Requires-Python: >=3.10
32
32
  Requires-Dist: dissect-cstruct>=4.7
33
33
  Requires-Dist: dissect-executable>=1.11
34
34
  Requires-Dist: dissect-util>=3.24
35
- Requires-Dist: lark
35
+ Requires-Dist: lark>=1.3.1
36
+ Requires-Dist: pycryptodome>=3.23.0
36
37
  Provides-Extra: c2
37
38
  Requires-Dist: flow-record; extra == 'c2'
38
39
  Requires-Dist: httpx; extra == 'c2'
39
- Requires-Dist: pycryptodome; extra == 'c2'
40
40
  Provides-Extra: docs
41
41
  Requires-Dist: flow-record; extra == 'docs'
42
42
  Requires-Dist: httpx; extra == 'docs'
43
43
  Requires-Dist: ipython; extra == 'docs'
44
44
  Requires-Dist: pickleshare; extra == 'docs'
45
- Requires-Dist: pycryptodome; extra == 'docs'
46
45
  Requires-Dist: pyshark; extra == 'docs'
47
46
  Requires-Dist: rich; extra == 'docs'
48
47
  Requires-Dist: sphinx; extra == 'docs'
@@ -53,18 +52,15 @@ Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'docs'
53
52
  Provides-Extra: full
54
53
  Requires-Dist: flow-record; extra == 'full'
55
54
  Requires-Dist: httpx; extra == 'full'
56
- Requires-Dist: pycryptodome; extra == 'full'
57
55
  Requires-Dist: pyshark; extra == 'full'
58
56
  Requires-Dist: rich; extra == 'full'
59
57
  Provides-Extra: pcap
60
58
  Requires-Dist: flow-record; extra == 'pcap'
61
59
  Requires-Dist: httpx; extra == 'pcap'
62
- Requires-Dist: pycryptodome; extra == 'pcap'
63
60
  Requires-Dist: pyshark; extra == 'pcap'
64
61
  Provides-Extra: test
65
62
  Requires-Dist: flow-record; extra == 'test'
66
63
  Requires-Dist: httpx; extra == 'test'
67
- Requires-Dist: pycryptodome; extra == 'test'
68
64
  Requires-Dist: pyshark; extra == 'test'
69
65
  Requires-Dist: pytest; extra == 'test'
70
66
  Requires-Dist: pytest-cov; extra == 'test'
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.2.2.dev3'
22
- __version_tuple__ = version_tuple = (1, 2, 2, 'dev3')
21
+ __version__ = version = '1.2.2.dev4'
22
+ __version_tuple__ = version_tuple = (1, 2, 2, 'dev4')
23
23
 
24
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