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.
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/PKG-INFO +4 -8
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/_version.py +2 -2
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/artifact.py +24 -14
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/beacon.py +605 -130
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c2profile.lark +6 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c2profile.py +25 -0
- dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/c_obfuscate.py +54 -0
- dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/c_obfuscate.pyi +71 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/guardrails.py +43 -35
- dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/normalize.py +136 -0
- dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/obfuscate.py +214 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/pe.py +11 -6
- dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/stage.py +168 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/utils.py +64 -3
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/version.py +14 -1
- dissect_cobaltstrike-1.2.2.dev4/dissect/cobaltstrike/xordecode.py +241 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/beacon-version-identification.rst +21 -1
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/cobaltstrike-beacon-versions.csv +1 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/examples.rst +42 -3
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/pyproject.toml +4 -4
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/conftest.py +2 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_beacon.py +33 -2
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_c2profile.py +9 -1
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_xordecode.py +12 -6
- dissect_cobaltstrike-1.2.2.dev3/dissect/cobaltstrike/xordecode.py +0 -258
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/.github/workflows/dissect-ci.yml +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/.gitignore +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/.lfs-assets-id +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/.pre-commit-config.yaml +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/.readthedocs.yml +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/LICENSE +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/README.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/codecov.yml +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/__init__.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c2.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/c_c2.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/client.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/pcap.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/Makefile +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/_ext/generate_beacon_version_csv.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/c2profile-grammar.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/codespell-ignore-words.txt +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/conf.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/beacon-client.png +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/teamserver-echoclient.png +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/teamserver_ls.png +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/images/vt-cobaltstrike-43-zip.png +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/index.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/installation.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/license.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/checksum8-accesslogs.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/dump_beacon_keys.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/example_client.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/scripts/index.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/c2_def.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/cs_def.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/guardrails_def.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/index.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/structures/pe_def.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-artifact.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-client.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-dump.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-pcap.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/beacon-xordecode.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tools/c2profile-dump.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tutorials/decrypt_cobaltstrike_pcaps.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tutorials/index.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/docs/tutorials/minimal_beacon_client.rst +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/scripts/checksum8-accesslogs.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/scripts/dump_beacon_keys.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/scripts/example_client.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_c2.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_client.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_guardrails.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_pe.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_utils.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tests/test_version.py +0 -0
- {dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: dissect.cobaltstrike
|
|
3
|
-
Version: 1.2.2.
|
|
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'
|
{dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/_version.py
RENAMED
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2, 2, '
|
|
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
|
{dissect_cobaltstrike-1.2.2.dev3 → dissect_cobaltstrike-1.2.2.dev4}/dissect/cobaltstrike/artifact.py
RENAMED
|
@@ -10,26 +10,35 @@ import contextlib
|
|
|
10
10
|
import io
|
|
11
11
|
import logging
|
|
12
12
|
import sys
|
|
13
|
-
from typing import BinaryIO, Iterator,
|
|
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(
|
|
21
|
-
"""
|
|
20
|
+
class ArtifactKitPayload(io.BytesIO):
|
|
21
|
+
"""Decoded ArtifactKit payload with its metadata."""
|
|
22
22
|
|
|
23
|
-
offset: int
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
|