dissect.cobaltstrike 1.2.1.dev4__tar.gz → 1.2.1.dev5__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 (66) hide show
  1. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/PKG-INFO +1 -1
  2. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/_version.py +2 -2
  3. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/beacon.py +8 -0
  4. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/c2profile.py +4 -0
  5. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/tests/test_c2profile.py +44 -0
  6. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/.github/workflows/dissect-ci.yml +0 -0
  7. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/.gitignore +0 -0
  8. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/.lfs-assets-id +0 -0
  9. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/.pre-commit-config.yaml +0 -0
  10. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/.readthedocs.yml +0 -0
  11. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/LICENSE +0 -0
  12. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/README.rst +0 -0
  13. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/codecov.yml +0 -0
  14. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/__init__.py +0 -0
  15. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/artifact.py +0 -0
  16. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/c2.py +0 -0
  17. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/c2profile.lark +0 -0
  18. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/c_c2.py +0 -0
  19. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/client.py +0 -0
  20. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/pcap.py +0 -0
  21. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/pe.py +0 -0
  22. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/utils.py +0 -0
  23. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/version.py +0 -0
  24. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/dissect/cobaltstrike/xordecode.py +0 -0
  25. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/Makefile +0 -0
  26. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/c2profile-grammar.rst +0 -0
  27. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/codespell-ignore-words.txt +0 -0
  28. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/conf.py +0 -0
  29. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/examples.rst +0 -0
  30. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/images/beacon-client.png +0 -0
  31. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/images/teamserver-echoclient.png +0 -0
  32. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/images/teamserver_ls.png +0 -0
  33. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/images/vt-cobaltstrike-43-zip.png +0 -0
  34. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/index.rst +0 -0
  35. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/installation.rst +0 -0
  36. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/license.rst +0 -0
  37. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/scripts/checksum8-accesslogs.rst +0 -0
  38. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/scripts/dump_beacon_keys.rst +0 -0
  39. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/scripts/example_client.rst +0 -0
  40. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/scripts/index.rst +0 -0
  41. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/structures/c2_def.rst +0 -0
  42. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/structures/cs_def.rst +0 -0
  43. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/structures/index.rst +0 -0
  44. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/structures/pe_def.rst +0 -0
  45. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/tools/beacon-artifact.rst +0 -0
  46. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/tools/beacon-client.rst +0 -0
  47. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/tools/beacon-dump.rst +0 -0
  48. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/tools/beacon-pcap.rst +0 -0
  49. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/tools/beacon-xordecode.rst +0 -0
  50. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/tools/c2profile-dump.rst +0 -0
  51. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/tutorials/decrypt_cobaltstrike_pcaps.rst +0 -0
  52. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/tutorials/index.rst +0 -0
  53. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/docs/tutorials/minimal_beacon_client.rst +0 -0
  54. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/pyproject.toml +0 -0
  55. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/scripts/checksum8-accesslogs.py +0 -0
  56. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/scripts/dump_beacon_keys.py +0 -0
  57. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/scripts/example_client.py +0 -0
  58. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/tests/conftest.py +0 -0
  59. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/tests/test_beacon.py +0 -0
  60. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/tests/test_c2.py +0 -0
  61. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/tests/test_client.py +0 -0
  62. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/tests/test_pe.py +0 -0
  63. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/tests/test_utils.py +0 -0
  64. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/tests/test_version.py +0 -0
  65. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/tests/test_xordecode.py +0 -0
  66. {dissect_cobaltstrike-1.2.1.dev4 → dissect_cobaltstrike-1.2.1.dev5}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dissect.cobaltstrike
3
- Version: 1.2.1.dev4
3
+ Version: 1.2.1.dev5
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/
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.2.1.dev4'
16
- __version_tuple__ = version_tuple = (1, 2, 1, 'dev4')
15
+ __version__ = version = '1.2.1.dev5'
16
+ __version_tuple__ = version_tuple = (1, 2, 1, 'dev5')
@@ -247,6 +247,12 @@ enum InjectExecutor: uint8 {
247
247
  CreateRemoteThread_ = 7,
248
248
  NtQueueApcThread_s = 8
249
249
  };
250
+
251
+ enum BofAllocator: uint16 {
252
+ VirtualAlloc = 0,
253
+ MapViewOfFile = 1,
254
+ HeapAlloc = 2,
255
+ };
250
256
  """
251
257
 
252
258
  cs_struct = cstruct.cstruct(endian=">")
@@ -262,6 +268,7 @@ CryptoScheme = cs_struct.CryptoScheme
262
268
  ProxyServer = cs_struct.ProxyServer
263
269
  InjectAllocator = cs_struct.InjectAllocator
264
270
  InjectExecutor = cs_struct.InjectExecutor
271
+ BofAllocator = cs_struct.BofAllocator
265
272
 
266
273
  DEFAULT_XOR_KEYS: List[bytes] = [b"\x69", b"\x2e", b"\x00"]
267
274
  """ Default XOR keys used by Cobalt Strike for obfuscating Beacon config bytes """
@@ -635,6 +642,7 @@ SETTING_TO_PRETTYFUNC: Dict[BeaconSetting, Callable] = {
635
642
  BeaconSetting.SETTING_DNS_IDLE: lambda x: str(ipaddress.IPv4Address(x)),
636
643
  BeaconSetting.SETTING_WATERMARKHASH: lambda x: null_terminated_bytes(x) if isinstance(x, bytes) else x,
637
644
  BeaconSetting.SETTING_MASKED_WATERMARK: lambda x: x.hex(),
645
+ BeaconSetting.SETTING_BOF_ALLOCATOR: lambda x: BofAllocator(x).name,
638
646
  # BeaconSetting.SETTING_PROTOCOL: lambda x: BeaconProtocol(x).name,
639
647
  # BeaconSetting.SETTING_CRYPTO_SCHEME: lambda x: CryptoScheme(x).name,
640
648
  # BeaconSetting.SETTING_PROXY_BEHAVIOR: lambda x: ProxyServer(x).name,
@@ -618,6 +618,10 @@ class C2Profile(ConfigBlock):
618
618
  dns_beacon.set_option("dns_sleep", value)
619
619
  elif setting == BeaconSetting.SETTING_MAXDNS:
620
620
  dns_beacon.set_option("maxdns", value)
621
+ elif setting == BeaconSetting.SETTING_PROCINJ_BOF_REUSE_MEM and value:
622
+ proc_inj.set_option("bof_reuse_memory", "true")
623
+ elif setting == BeaconSetting.SETTING_BOF_ALLOCATOR:
624
+ proc_inj.set_option("bof_allocator", value)
621
625
 
622
626
  if c2_recover:
623
627
  http_get.set_non_empty_config_block("server", HttpOptionsBlock(output=DataTransformBlock(steps=c2_recover)))
@@ -1,3 +1,5 @@
1
+ import pytest
2
+
1
3
  from dissect.cobaltstrike import beacon, c2profile
2
4
 
3
5
  C2PROFILE_SOURCE = """
@@ -294,3 +296,45 @@ def test_c2profile_v48():
294
296
  """
295
297
  profile = c2profile.C2Profile.from_text(c2profile_fragment)
296
298
  assert profile.properties["stage.syscall_method"] == ["direct"]
299
+
300
+
301
+ @pytest.mark.parametrize(
302
+ ("allocator_enum", "bof_allocator"),
303
+ [
304
+ (beacon.BofAllocator.HeapAlloc, "HeapAlloc"),
305
+ (beacon.BofAllocator.MapViewOfFile, "MapViewOfFile"),
306
+ (beacon.BofAllocator.HeapAlloc, "HeapAlloc"),
307
+ ],
308
+ )
309
+ def test_c2profile_bof_allocator(allocator_enum, bof_allocator):
310
+ data = beacon.Setting(
311
+ index=beacon.BeaconSetting.SETTING_BOF_ALLOCATOR,
312
+ type=beacon.SettingsType.TYPE_SHORT,
313
+ length=0x2,
314
+ value=allocator_enum.dumps(),
315
+ ).dumps()
316
+ bconfig = beacon.BeaconConfig(data)
317
+ profile = c2profile.C2Profile.from_beacon_config(bconfig)
318
+ assert profile.properties["process-inject.bof_allocator"] == [bof_allocator]
319
+
320
+
321
+ @pytest.mark.parametrize(
322
+ ("bof_reuse_memory",),
323
+ [
324
+ (True,),
325
+ (False,),
326
+ ],
327
+ )
328
+ def test_c2profile_bof_reuse_memory(bof_reuse_memory):
329
+ data = beacon.Setting(
330
+ index=beacon.BeaconSetting.SETTING_PROCINJ_BOF_REUSE_MEM,
331
+ type=beacon.SettingsType.TYPE_SHORT,
332
+ length=0x2,
333
+ value=beacon.cs_struct.uint16(bof_reuse_memory).dumps(),
334
+ ).dumps()
335
+ bconfig = beacon.BeaconConfig(data)
336
+ profile = c2profile.C2Profile.from_beacon_config(bconfig)
337
+ if bof_reuse_memory:
338
+ assert profile.properties["process-inject.bof_reuse_memory"] == ["true"]
339
+ else:
340
+ assert "project.inject.bof_reuse_memory" not in profile.properties