dissect.cobaltstrike 1.2.1.dev8__tar.gz → 1.2.1.dev9__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.dev8 → dissect_cobaltstrike-1.2.1.dev9}/PKG-INFO +1 -1
  2. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/_version.py +2 -2
  3. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/beacon.py +1 -0
  4. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/c2profile.lark +5 -0
  5. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/c2profile.py +10 -0
  6. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/tests/test_c2profile.py +22 -0
  7. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/.github/workflows/dissect-ci.yml +0 -0
  8. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/.gitignore +0 -0
  9. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/.lfs-assets-id +0 -0
  10. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/.pre-commit-config.yaml +0 -0
  11. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/.readthedocs.yml +0 -0
  12. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/LICENSE +0 -0
  13. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/README.rst +0 -0
  14. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/codecov.yml +0 -0
  15. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/__init__.py +0 -0
  16. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/artifact.py +0 -0
  17. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/c2.py +0 -0
  18. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/c_c2.py +0 -0
  19. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/client.py +0 -0
  20. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/pcap.py +0 -0
  21. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/pe.py +0 -0
  22. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/utils.py +0 -0
  23. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/version.py +0 -0
  24. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/dissect/cobaltstrike/xordecode.py +0 -0
  25. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/Makefile +0 -0
  26. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/c2profile-grammar.rst +0 -0
  27. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/codespell-ignore-words.txt +0 -0
  28. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/conf.py +0 -0
  29. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/examples.rst +0 -0
  30. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/images/beacon-client.png +0 -0
  31. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/images/teamserver-echoclient.png +0 -0
  32. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/images/teamserver_ls.png +0 -0
  33. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/images/vt-cobaltstrike-43-zip.png +0 -0
  34. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/index.rst +0 -0
  35. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/installation.rst +0 -0
  36. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/license.rst +0 -0
  37. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/scripts/checksum8-accesslogs.rst +0 -0
  38. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/scripts/dump_beacon_keys.rst +0 -0
  39. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/scripts/example_client.rst +0 -0
  40. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/scripts/index.rst +0 -0
  41. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/structures/c2_def.rst +0 -0
  42. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/structures/cs_def.rst +0 -0
  43. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/structures/index.rst +0 -0
  44. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/structures/pe_def.rst +0 -0
  45. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/tools/beacon-artifact.rst +0 -0
  46. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/tools/beacon-client.rst +0 -0
  47. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/tools/beacon-dump.rst +0 -0
  48. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/tools/beacon-pcap.rst +0 -0
  49. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/tools/beacon-xordecode.rst +0 -0
  50. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/tools/c2profile-dump.rst +0 -0
  51. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/tutorials/decrypt_cobaltstrike_pcaps.rst +0 -0
  52. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/tutorials/index.rst +0 -0
  53. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/docs/tutorials/minimal_beacon_client.rst +0 -0
  54. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/pyproject.toml +0 -0
  55. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/scripts/checksum8-accesslogs.py +0 -0
  56. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/scripts/dump_beacon_keys.py +0 -0
  57. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/scripts/example_client.py +0 -0
  58. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/tests/conftest.py +0 -0
  59. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/tests/test_beacon.py +0 -0
  60. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/tests/test_c2.py +0 -0
  61. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/tests/test_client.py +0 -0
  62. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/tests/test_pe.py +0 -0
  63. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/tests/test_utils.py +0 -0
  64. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/tests/test_version.py +0 -0
  65. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/tests/test_xordecode.py +0 -0
  66. {dissect_cobaltstrike-1.2.1.dev8 → dissect_cobaltstrike-1.2.1.dev9}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dissect.cobaltstrike
3
- Version: 1.2.1.dev8
3
+ Version: 1.2.1.dev9
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.dev8'
16
- __version_tuple__ = version_tuple = (1, 2, 1, 'dev8')
15
+ __version__ = version = '1.2.1.dev9'
16
+ __version_tuple__ = version_tuple = (1, 2, 1, 'dev9')
@@ -175,6 +175,7 @@ enum BeaconSetting: uint16 {
175
175
  SETTING_DATA_STORE_SIZE = 76,
176
176
 
177
177
  // CobaltStrike version >= 4.10 (Jul 16, 2024)
178
+ SETTING_HTTP_DATA_REQUIRED = 77,
178
179
  SETTING_BEACON_GATE = 78,
179
180
  };
180
181
 
@@ -11,6 +11,7 @@ start: value*
11
11
  | "process-inject" "{" process_inject_options* "}" -> process_inject
12
12
  | "post-ex" "{" postex_options* "}" -> post_ex
13
13
  | "dns-beacon" "{" dns_beacon_options* "}" -> dns_beacon
14
+ | "http-beacon" "{" http_beacon_options* "}" -> http_beacon
14
15
 
15
16
  OPTION: "sample_name"
16
17
  | "data_jitter"
@@ -214,6 +215,10 @@ dns_beacon_options: "set" "dns_idle" string ";" -> dns_idle
214
215
  | "set" "ns_response" string ";" -> ns_response
215
216
  | "#" "dns_resolver" string ";" -> comment_dns_resolver
216
217
 
218
+ http_beacon_options: "set" "library" string ";" -> library // introduced in Cobalt Strike 4.9
219
+ | "set" "data_required" string ";" -> data_required // introduced in Cobalt Strike 4.10
220
+ | "set" "data_required_length" string ";" -> data_required_length // introduced in Cobalt Strike 4.10
221
+
217
222
  header: string
218
223
  string: STRING
219
224
  variant: string
@@ -309,6 +309,12 @@ class DnsBeaconBlock(ConfigBlock):
309
309
  __name__ = "dns_beacon"
310
310
 
311
311
 
312
+ class HttpBeaconBlock(ConfigBlock):
313
+ """`.http-beacon` block"""
314
+
315
+ __name__ = "http_beacon"
316
+
317
+
312
318
  class ExecuteOptionsBlock(ConfigBlock):
313
319
  """`.process-inject.execute` block"""
314
320
 
@@ -446,6 +452,7 @@ class C2Profile(ConfigBlock):
446
452
  http_post_client = HttpOptionsBlock()
447
453
  proc_inj = ProcessInjectBlock()
448
454
  dns_beacon = DnsBeaconBlock()
455
+ http_beacon = HttpBeaconBlock()
449
456
  # http_get_server = HttpOptionsBlock()
450
457
 
451
458
  for setting, value in config.settings_by_index.items():
@@ -668,6 +675,8 @@ class C2Profile(ConfigBlock):
668
675
  proc_inj.set_option("bof_allocator", value)
669
676
  elif setting == BeaconSetting.SETTING_DATA_STORE_SIZE:
670
677
  stage.set_option("data_store_size", value)
678
+ elif setting == BeaconSetting.SETTING_HTTP_DATA_REQUIRED and value:
679
+ http_beacon.set_option("data_required", "true")
671
680
  elif setting == BeaconSetting.SETTING_BEACON_GATE and value:
672
681
  block = BeaconGateBlock.from_beacon_gate_option_strings(value)
673
682
  stage.set_config_block("beacon_gate", block)
@@ -681,6 +690,7 @@ class C2Profile(ConfigBlock):
681
690
  profile.set_non_empty_config_block("stage", stage)
682
691
  profile.set_non_empty_config_block("process_inject", proc_inj)
683
692
  profile.set_non_empty_config_block("dns_beacon", dns_beacon)
693
+ profile.set_non_empty_config_block("http_beacon", http_beacon)
684
694
  return profile
685
695
 
686
696
  def __str__(self) -> str:
@@ -395,3 +395,25 @@ def test_c2profile_beacon_gate():
395
395
  bconfig = beacon.BeaconConfig(data)
396
396
  profile = c2profile.C2Profile.from_beacon_config(bconfig)
397
397
  assert "stage.beacon_gate" not in profile.properties
398
+
399
+
400
+ @pytest.mark.parametrize(
401
+ ("http_data_required",),
402
+ [
403
+ (True,),
404
+ (False,),
405
+ ],
406
+ )
407
+ def test_c2profile_http_data_required(http_data_required: bool):
408
+ data = beacon.Setting(
409
+ index=beacon.BeaconSetting.SETTING_HTTP_DATA_REQUIRED,
410
+ type=beacon.SettingsType.TYPE_SHORT,
411
+ length=0x2,
412
+ value=beacon.cs_struct.uint16(http_data_required).dumps(),
413
+ ).dumps()
414
+ bconfig = beacon.BeaconConfig(data)
415
+ profile = c2profile.C2Profile.from_beacon_config(bconfig)
416
+ if not http_data_required:
417
+ assert "http-beacon.data_required" not in profile.properties
418
+ else:
419
+ assert profile.properties["http-beacon.data_required"] == ["true"]