CAPE-parsers 0.1.36__py3-none-any.whl → 0.1.37__py3-none-any.whl

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.
@@ -0,0 +1,102 @@
1
+ import logging
2
+ import struct
3
+ from contextlib import suppress
4
+
5
+ import pefile
6
+ from Cryptodome.Cipher import ARC4
7
+
8
+ log = logging.getLogger(__name__)
9
+
10
+ DESCRIPTION = "Adaptix beacon configuration parser."
11
+ AUTHOR = "enzok"
12
+
13
+
14
+ def parse_http_config(rc4_key: bytes, data: bytes) -> dict:
15
+ config = {}
16
+ offset = 0
17
+ servers = []
18
+ ports = []
19
+
20
+ def read(fmt: str):
21
+ nonlocal offset
22
+ size = struct.calcsize(fmt)
23
+ value = struct.unpack_from(fmt, data, offset)
24
+ offset += size
25
+ return value if len(value) > 1 else value[0]
26
+
27
+ def read_str(length: int):
28
+ nonlocal offset
29
+ value = data[offset:offset + length].decode("utf-8", errors="replace")
30
+ offset += length
31
+ return value
32
+
33
+ config["config_rc4_key"] = rc4_key.hex()
34
+ config["agent_type"] = f"{read('<I'):8X}"
35
+ config["use_ssl"] = read("<B")
36
+ host_count = read("<I")
37
+ for host in range(host_count):
38
+ host_length = read("<I")
39
+ servers.append(read_str(host_length).strip("\x00"))
40
+ ports.append(read("<I"))
41
+
42
+ config["servers"] = servers
43
+ config["ports"] = ports
44
+ method_length = read("<I")
45
+ config["http_method"] = read_str(method_length).strip("\x00")
46
+ uri_length = read("<I")
47
+ config["uri"] = read_str(uri_length).strip("\x00")
48
+ parameter_length = read("<I")
49
+ config["parameter"] = read_str(parameter_length).strip("\x00")
50
+ useragent_length = read("<I")
51
+ config["user_agent"] = read_str(useragent_length).strip("\x00")
52
+ headers_length = read("<I")
53
+ config["http_headers"] = read_str(headers_length).strip("\x00")
54
+ config["ans_pre_size"] = read("<I")
55
+ config["ans_size"] = read("<I")
56
+ config["kill_date"] = read("<I")
57
+ config["working_time"] = read("<I")
58
+ config["sleep_delay"] = read("<I")
59
+ config["jitter_delay"] = read("<I")
60
+
61
+ return config
62
+
63
+ def extract_config(filebuf: bytes) -> dict:
64
+ pe = pefile.PE(data=filebuf, fast_load=True)
65
+ data_sections = [s for s in pe.sections if b".rdata" in s.Name]
66
+ if not data_sections:
67
+ return
68
+
69
+ data = data_sections[0].get_data()
70
+ data_len = len(data)
71
+ pos = 0
72
+ while pos + 4 <= data_len:
73
+ start_offset = pos
74
+ key_offset = struct.unpack_from("<I", data, pos)[0]
75
+ pos += 4
76
+
77
+ if pos + key_offset + 32 > data_len:
78
+ pos = start_offset + 1
79
+ continue
80
+
81
+ encrypted_data = data[pos:pos + key_offset]
82
+ pos += key_offset
83
+ rc4_key = data[pos:pos + 16]
84
+
85
+ if key_offset == 787:
86
+ pass
87
+
88
+ with suppress(Exception):
89
+ decrypted = ARC4.new(rc4_key).decrypt(encrypted_data)
90
+ if b"User-Agent" in decrypted:
91
+ return parse_http_config(rc4_key, decrypted)
92
+
93
+ pos = start_offset + 1
94
+
95
+ return None
96
+
97
+
98
+ if __name__ == "__main__":
99
+ import sys
100
+
101
+ with open(sys.argv[1], "rb") as f:
102
+ print(extract_config(f.read()))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: CAPE-parsers
3
- Version: 0.1.36
3
+ Version: 0.1.37
4
4
  Summary: CAPE: Malware Configuration Extraction
5
5
  License: MIT
6
6
  Keywords: cape,parsers,malware,configuration
@@ -37,6 +37,7 @@ cape_parsers/CAPE/community/VenomRAT.py,sha256=0nGLNnwnO93SPbCTgoIMvkh6_smuzQxDc
37
37
  cape_parsers/CAPE/community/XWorm.py,sha256=0nGLNnwnO93SPbCTgoIMvkh6_smuzQxDcYtL77afGx8,1001
38
38
  cape_parsers/CAPE/community/XenoRAT.py,sha256=0nGLNnwnO93SPbCTgoIMvkh6_smuzQxDcYtL77afGx8,1001
39
39
  cape_parsers/CAPE/community/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ cape_parsers/CAPE/core/AdaptixBeacon.py,sha256=vjb2tK_Wpx4h71bImTJWyPJjrmr_4d6Z9_P827w_-48,2908
40
41
  cape_parsers/CAPE/core/Azorult.py,sha256=7AWPeOWhji7n13qTjq-XNPA8LDKcCOOUy8nbT0TUU_I,2145
41
42
  cape_parsers/CAPE/core/BitPaymer.py,sha256=N3Ssi_zNliKn1vt2Z1UndMGZg4CIOjf75XDdpCx2ITc,2898
42
43
  cape_parsers/CAPE/core/BlackDropper.py,sha256=OyplMDY4GFcBgqoZqbpCRIusNHhcxK2qZuH8bQu8qlw,3173
@@ -104,7 +105,7 @@ cape_parsers/utils/blzpack_lib.so,sha256=5PJtnggw8fV5q4DlhwMJk4ZadvC3fFTsVTNZKvE
104
105
  cape_parsers/utils/dotnet_utils.py,sha256=pzQGbCqccz7DRv8T_i1JURlrKDIlDT2axxViiFF9hsU,1672
105
106
  cape_parsers/utils/lznt1.py,sha256=X-BmJtP6AwYSl0ORg5dfSt-NIuXbHrtCO5kUaaJI2C8,4066
106
107
  cape_parsers/utils/strings.py,sha256=a-nbvP9jYST7b6t_H37Ype-fK2jEmQr-wMF5a4i04e4,3062
107
- cape_parsers-0.1.36.dist-info/LICENSE,sha256=88c01_HLG8WPj7R7aU_b-O-UoF38vrrifvcko4KDxcE,1069
108
- cape_parsers-0.1.36.dist-info/METADATA,sha256=toAGrERdqyq9eJJ53tbwbnZd0U3ACbxnieK1ssQgBYU,1149
109
- cape_parsers-0.1.36.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
110
- cape_parsers-0.1.36.dist-info/RECORD,,
108
+ cape_parsers-0.1.37.dist-info/LICENSE,sha256=88c01_HLG8WPj7R7aU_b-O-UoF38vrrifvcko4KDxcE,1069
109
+ cape_parsers-0.1.37.dist-info/METADATA,sha256=P_Q2_z1zWOvRibQcJzs0DfetfEoqFCI4H9edQLnlHeM,1149
110
+ cape_parsers-0.1.37.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
111
+ cape_parsers-0.1.37.dist-info/RECORD,,