
ओपन सोर्स C&C विनिर्देश
प्रारूप: चर्चा के लिए अनुरोध
यह दस्तावेज़ OST C&C Specification के संस्करण 1 का अवलोकन प्रदान करता है। इसका उद्देश्य संदेशों और उन संदेशों के भीतर के फ़ील्ड्स का विस्तृत विवरण प्रदान करना है।
इस विनिर्देश के पीछे की प्रेरणा एक C&C messaging protocol (जिसमें कार्यकरण, संरचित आउटपुट, और peer-to-peer रूटिंग शामिल है) प्रदान करना है, जिसे शब्दशः लागू किया जा सकता है, या केवल प्रोजेक्ट डेवलपर्स के लिए प्रेरणा के रूप में काम कर सकता है। इस दस्तावेज़ का उद्देश्य यह बताना नहीं है कि C&C क्या है। यह मान लिया गया है कि पाठक समझता है कि यह क्या है और किस लिए उपयोग किया जाता है।
मुख्य शब्द "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", और "OPTIONAL" की व्याख्या [RFC2119] में वर्णित अनुसार की जानी चाहिए।
यह विनिर्देश निम्नलिखित मान्यताएँ बनाता है:
नीचे इस दस्तावेज़ में उपयोग किए गए शब्दों की सूची दी गई है।
इम्प्लांट मेटाडेटा: वह जानकारी जो एक इम्प्लांट अपने बारे में टीम सर्वर को रिपोर्ट करता है।
कार्य अनुरोध: एक कार्य जो किसी इम्प्लांट को करने के लिए दिया जाता है।
कार्य प्रतिक्रिया: किसी दिए गए कार्य की स्थिति और आउटपुट (यदि कोई हो)।
सत्र कुंजी: एक अद्वितीय एन्क्रिप्शन कुंजी जिसका उपयोग एक इम्प्लांट अपने संदेशों को एन्क्रिप्ट करने के लिए करता है।
प्रत्येक कार्य अनुरोध और प्रतिक्रिया संदेश में निम्नलिखित 16-बाइट हैडर होना अनिवार्य है।```text | Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | -------------------------------------------------------------| | 0 | Type | Code | Flags | Label | | -------------------------------------------------------------| | 1 | Identifier | Length | | -------------------------------------------------------------|
- **Type**: 1-बाइट पूर्णांक। यह जिस कार्य का प्रकार है, उसका 'type'। देखें [[कार्य प्रकार और कोड](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)]।
- **Code**: 1-बाइट पूर्णांक। दिए गए Type के लिए एक 'sub code'। देखें [[कार्य प्रकार और कोड](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)]।
- **Flags**: 2-बाइट पूर्णांक। संदेश की स्थिति दर्शाने के लिए बिटवाइज़ फ़्लैग्स का एक सेट। देखें [[कार्य फ़्लैग्स](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-flags)]।
- **Label**: 4-बाइट पूर्णांक। एक अद्वितीय लेबल जो एक ही कार्य से संबंधित कई संदेशों को सहसंबंधित करता है।
- **Identifier**: 4-बाइट पूर्णांक। एक अनुक्रमिक पहचानकर्ता जिसका उपयोग खंडित संदेशों को सही क्रम में बनाने के लिए किया जाता है।
- **Length**: 4-बाइट पूर्णांक। कार्य डेटा की कुल लंबाई।
## कार्य प्रकार और कोड```text
|------------------|--------------------------|
| Type | Code |
|------------------|--------------------------|
| 0 - NOP | 0 |
|------------------|--------------------------|
| 1 - Exit | 0 |
|------------------|--------------------------|
| 2 - Set | 0 - Sleep/Jitter |
| | 1 - SpawnTo |
| | 2 - BlockDLLs |
| | 3 - PPID |
|------------------|--------------------------|
| 3 - File | 0 - Copy |
| | 1 - Move |
| | 2 - Delete |
| | 3 - Upload |
| | 4 - Download |
|------------------|--------------------------|
| 4 - Directory | 0 - Print |
| | 1 - Change |
| | 2 - Create |
| | 3 - Copy |
| | 4 - Move |
| | 5 - List |
| | 6 - Delete |
|------------------|--------------------------|
| 5 - WhoAmI | 0 |
|------------------|--------------------------|
| 6 - Process | 0 - List |
| | 1 - Kill |
| | 2 - Inject Spawn |
| | 3 - Inject Explicit |
|------------------|--------------------------|
| 7 - Registry | 0 - Query |
| | 1 - Add |
| | 2 - Delete |
|------------------|--------------------------|
| 8 - RPortFwd | 0 - Start |
| | 1 - Data |
|------------------|--------------------------|
| 9 - Environment | 0 - Get |
| | 1 - Set |
|------------------|--------------------------|
| 10 - SOCKS | 0 - Connect |
| | 1 - Data |
| | 2 - Close |
|------------------|--------------------------|
| 11 - Tokens | 0 - List |
| | 1 - Make |
| | 2 - Steal |
| | 3 - Use |
| | 4 - Revert |
| | 5 - Delete |
| | 6 - Purge |
|------------------|--------------------------|
| 12 - Run | 0 |
|------------------|--------------------------|
| 13 - ItemStore | 0 - List |
| | 1 - Add |
| | 2 - Delete |
| | 3 - Purge |
|------------------|--------------------------|
| 14 - LocalExec | 0 - .NET |
| | 1 - BOF |
| | 2 - Managed PowerShell |
| | 3 - Unmanaged PowerShell |
|------------------|--------------------------|
| 15 - PrintScreen | 0 |
|------------------|--------------------------|
| 16 - RemoteExec | 0 - WinRM |
| | 1 - WMI |
| | 2 - PsExec |
| | 3 - SSH |
|------------------|--------------------------|
| 17 - Link | 1 - Link SMB |
| | 2 - Link TCP |
|------------------|--------------------------|
| 18 - Unlink | 0 |
|------------------|--------------------------|
| 19 - P2P | 0 - Acknowledge |
| | 1 - PassThru |
|------------------|--------------------------|
| 20 - Jobs | 0 - List |
| | 1 - Kill |
|---------------------------------------------|
कुछ फ़्लैग परस्पर अनन्य होते हैं और इन्हें एक साथ सेट नहीं किया जाना चाहिए। यदि कोई फ़्लैग सेट नहीं है, तो कार्य को सफलतापूर्वक पूर्ण मान लिया जाना चाहिए और संबंधित आउटपुट (यदि कोई है) खंडित नहीं है।```text
| Value | Description |
|---|---|
| 0 | No flags |
| 1 | Task Error |
| 2 | Task Running (as job) |
| 4 | Message is fragmented, more to follow |
| 8 | Message is fragmented, no more to follow |
## कार्य डेटा
कार्य डेटा हेडर से जुड़ा होता है और विशिष्ट कार्य प्रकार और कोड के आधार पर, एक बाइनरी संरचना से बना होगा। प्रत्येक कार्य अनुरोध और प्रतिक्रिया संदेश प्रकार को [[Message Definitions](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#message-definitions)] में परिभाषित किया गया है।
किसी कार्य अनुरोध या प्रतिक्रिया के लिए कोई डेटा होना अनिवार्य नहीं है यदि उसकी आवश्यकता नहीं है।
## एन्क्रिप्टेड कार्य संदेश
प्रसारण से पहले, कार्य हेडर और कार्य डेटा को मिलाकर implant के सत्र कुंजी के साथ AES-एन्क्रिप्ट किया जाता है।```text
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| ------------------------------------ |
| 0 | Iv |
| 8 | |
| ------------------------------------ |
| 16 | Checksum |
| 24 | |
| 32 | |
| 40 | |
| ------------------------------------ |
| 48 | Data |
| .. | |
| ------------------------------------ |
किसी भी कार्य डेटा को प्राप्त करने या भेजने से पहले एक इम्प्लांट को टीम सर्वर के साथ स्वयं को पंजीकृत करना अनिवार्य है।
इम्प्लांट एक [IMPLANT-METADATA] संदेश उत्पन्न करता है, इसे टीम सर्वर की सार्वजनिक RSA कुंजी से एन्क्रिप्ट करता है, और इसे टीम सर्वर को भेजता है।
टीम सर्वर इम्प्लांट के [IMPLANT-METADATA] को डिक्रिप्ट करने के लिए अपनी निजी RSA कुंजी का उपयोग करता है और उसे एक नए सत्र/कॉलबैक के रूप में पंजीकृत करना अनिवार्य है।
किसी भी लंबित कार्य डेटा को स्वयं या चाइल्ड के लिए प्राप्त करने हेतु एक इम्प्लांट को टीम सर्वर के साथ "चेक-इन" करना अनिवार्य है।
चेक-इन की विधि C2 चैनल के लिए विशिष्ट है और इस विनिर्देश के अंतर्गत शामिल नहीं है। एक पंजीकृत इम्प्लांट चेक-इन के लिए केवल अपनी ID भेज सकता है। हालाँकि, यदि इम्प्लांट ने तब से अपनी सेशन कुंजी, स्लीप या जिटर कॉन्फ़िगरेशन बदल दी है, तो उसे अपना मेटाडेटा भी पुनः भेजना अनिवार्य है।
यदि कोई लंबित कार्य नहीं हैं, तो टीम सर्वर बिना डेटा के, या एक या अधिक [NOP] संदेशों के रूप में नकली डेटा के साथ प्रतिक्रिया दे सकता है। अन्यथा, उसे कार्य अनुरोधों के एक संग्रह के साथ प्रतिक्रिया देनी अनिवार्य है जो इम्प्लांट की सेशन कुंजी के साथ AES-एन्क्रिप्टेड होते हैं।
नए पेरेंट के साथ कनेक्शन स्थापित होने के बाद एक चाइल्ड इम्प्लांट को अपना मेटाडेटा P2P चैनल (जैसे नेम्ड पाइप या TCP सॉकेट) पर लिखना अनिवार्य है।
पेरेंट को इस मेटाडेटा को पढ़ना और इसे [LINK-REP] संदेश में टीम सर्वर को वापस भेजना अनिवार्य है।
टीम सर्वर को चाइल्ड के मेटाडेटा को डिक्रिप्ट करना और उसे एक नए सत्र/कॉलबैक के रूप में पंजीकृत करना या अनलिंक एवं लिंक के मामले में मौजूदा पेरेंट-चाइल्ड संबंधों को अद्यतन करना अनिवार्य है।
टीम सर्वर को चाइल्ड की ID की पुष्टि करने के लिए नए पेरेंट को [LINK-ACK] संदेश वापस भेजना अनिवार्य है। पेरेंट को इस प्रक्रिया को सहसंबंधित करने के लिए संदेश Label का उपयोग करना चाहिए।
चाइल्ड इम्प्लांट के लिए कार्य एक या अधिक [LINK-PASS-THRU] संदेशों में लिपटे होते हैं। ये पेरेंट की सेशन कुंजी के साथ एन्क्रिप्ट किए जाएँगे। प्राप्त होने पर, पेरेंट को संदेश को डिक्रिप्ट करना और लिपटे डेटा को child-id फ़ील्ड द्वारा इंगित चाइल्ड इम्प्लांट को अग्रेषित करना अनिवार्य है।
लिपटा डेटा स्वयं कार्य हो सकता है या एक और LINK-PASS-THRU हो सकता है यदि चाइल्ड श्रृंखला में एक और स्तर नीचे है।
सभी Timestamp फ़ील्ड साइन्ड 64-बिट पूर्णांक (Int64) के रूप में प्रेषित होते हैं जो UNIX युग (1 जनवरी 1970 से बीते सेकंडों की संख्या) को दर्शाते हैं।
कुछ भाषाएँ छोड़े गए मान और शून्य के प्रेषित मान के बीच अंतर नहीं करती हैं। स्थिरता के लिए, कार्यान्वयन को वैकल्पिक फ़ील्ड के साथ 1 या 0 बाइट (अर्थात TRUE या FALSE) उपसर्गित करना अनिवार्य है ताकि यह इंगित किया जा सके कि मान मौजूद है या नहीं।
बाइनरी स्ट्रीम से डेटा पढ़ते समय यह जानना हमेशा संभव नहीं होता कि एक फ़ील्ड कहाँ समाप्त होती है और दूसरी कहाँ शुरू होती है। यह विनिर्देश इन फ़ील्ड में लंबाई मान उपसर्गित करने के उपयोग को अनिवार्य बनाता है, ताकि कार्यान्वयन को पता चले कि उस फ़ील्ड में कितने बाइट्स या कितने तत्व हैं। निम्नलिखित डेटा प्रकारों को लंबाई-उपसर्गित होना अनिवार्य है:
कार्यान्वयन अपने अद्वितीय डिज़ाइन और कार्यक्षमता के अनुसार इस विनिर्देश में परिभाषित नहीं किए गए संदेश प्रकार, नियंत्रण कोड और फ़्लैग शामिल कर सकते हैं। हालाँकि, यह अनुशंसित है कि अनारक्षित पूल के उच्च अंत पर मानों का उपयोग किया जाए ताकि भविष्य के संशोधन में उन्हें सौंपे जाने की संभावना कम हो। कार्यान्वयन को ऐसे प्रकार, कोड या फ़्लैग का उपयोग नहीं करना अनिवार्य है जो उसके इच्छित उद्देश्य के अलावा किसी और चीज़ के लिए परिभाषित हो।
कार्यान्वयनों को ऐसे संदेश को सुचारू रूप से संभालना चाहिए जिसमें ऐसे फ़ील्ड या फ़्लैग हों जिन्हें वह पहचानता नहीं है, और एक उपयुक्त त्रुटि संदेश लौटाना चाहिए।
IMPLANT-METADATA { id [1] UInt32 session-key [2] SEQUENCE of Byte (32) sleep [3] UInt32 OPTIONAL jitter [4] UInt32 OPTIONAL username [5] String OPTIONAL host-id [6] String OPTIONAL hostname [7] String OPTIONAL domain [8] String OPTIONAL ipv4-ips [9] SEQUENCE of IPV4-ADDRESS OPTIONAL ipv6-ips [10] SEQUENCE of IPV6-ADDRESS OPTIONAL process-name [11] String OPTIONAL process-id [12] UInt32 OPTIONAL architecture [13] [Architecture] OPTIONAL platform [14] [Platform] OPTIONAL os-description [15] String OPTIONAL integrity [16] [Integrity] OPTIONAL }
### IPV4-ADDRESS```text
IPV4-ADDRESS {
address [1] SEQUENCE of Byte (4)
}
IPV6-ADDRESS { address [1] SEQUENCE of Byte (16) }
IP पते नेटवर्क-बाइट क्रम में अवश्य प्रसारित किए जाने चाहिए।
### प्लेटफ़ॉर्म```text
Platform {
Linux = 0,
MacOS = 1,
Windows = 2
}
TASK-ERROR { error-code [1] UInt32 message [2] String OPTIONAL }
## NOP परिभाषाएँ
### NOP```text
NOP {
padding [1] SEQUENCE of Byte OPTIONAL
}
SET-SLEEP-REQ { interval [1] UInt32 jitter [2] Byte OPTIONAL }
### SET-SPAWNTO-REQ```text
SET-SPAWNTO-REQ {
spawnto [1] String OPTIONAL
}
यदि spawnto फ़ील्ड सेट नहीं है, तो इम्प्लांट को अपने डिफ़ॉल्ट कॉन्फ़िगरेशन पर वापस जाना चाहिए।
SET-BLOCKDLLS-REQ { blockdlls [1] Boolean OPTIONAL }
यदि `blockdlls` फ़ील्ड सेट *नहीं* है, तो implant को अपनी डिफ़ॉल्ट कॉन्फ़िगरेशन पर वापस जाना चाहिए।
### SET-PPID-REQ```text
SET-PPID-REQ {
ppid [1] UInt32 OPTIONAL
}
यदि ppid फ़ील्ड सेट नहीं है, तो इम्प्लांट को अपनी डिफ़ॉल्ट कॉन्फ़िगरेशन पर वापस जाना चाहिए।
FILE-COPY-REQ { source [1] String destination [2] String force [3] Boolean OPTIONAL }
### FILE-MOVE-REQ```text
FILE-MOVE-REQ {
source [1] String
destination [2] String
}
FILE-DELETE-REQ { path [1] String }
### FILE-UPLOAD-REQ```text
FILE-UPLOAD-REQ {
destination [1] String
content [2] SEQUENCE of Byte
}
FILE-DOWNLOAD-REQ { path [1] String }
### FILE-DOWNLOAD-REP```text
FILE-DOWNLOAD-REP {
current-chuck [1] UInt16
total-chunks [2] UInt16
chunk-content [3] SEQUENCE of Byte
}
DIR-PRINT-REP { path [1] String }
### DIR-CHANGE-REQ```text
DIR-CHANGE-REQ {
path [1] String OPTIONAL
}
यदि path फ़ील्ड सेट नहीं है, तो implant को अपनी कार्यशील निर्देशिका को एक 'डिफ़ॉल्ट' स्थान (जैसे उपयोगकर्ता की होम निर्देशिका) में बदल देना चाहिए।
DIR-CREATE-REQ { path [1] String }
### DIR-CREATE-REP```text
DIR-CREATE-REP {
entry [1] [FileSystemEntry]
}
DIR-COPY-REQ { source [1] String destination [2] String }
### DIR-MOVE-REQ```text
DIR-MOVE-REQ {
source [1] String
destination [2] String
}
DIR-LIST-REQ { path [1] String OPTIONAL access-control [2] Boolean OPTIONAL }
यदि `path` फ़ील्ड *नहीं* सेट है, तो इम्प्लांट को अपनी वर्तमान कार्यशील निर्देशिका सूचीबद्ध करनी चाहिए।
### DIR-LIST-REP```text
DIR-LIST-REP {
entries [1] SEQUENCE of [FileSystemEntry]
}
DIR-DELETE-REQ { path [1] String recurse [2] Boolean OPTIONAL }
### FileSystemEntry```text
FileSystemEntry {
path [1] String
length [2] UInt32 OPTIONAL
attributes [3] [FileAttributes] OPTIONAL
owner [4] String OPTIONAL
created [5] Timestamp OPTIONAL
last-accessed [6] Timestamp OPTIONAL
last-written [7] Timestamp OPTIONAL
access-control [8] SEQUENCE of [FileSecurity] OPTIONAL
}
बिटवाइज़ फ़्लैग्स।```text FileAttributes { Normal = 1, Archive = 2, Compressed = 4, ReadOnly = 8, Hidden = 16, Directory = 32, System = 64 }
### FileSecurity```text
FileSecurity {
identity [1] String
access-mask [2] Int32
inheritance [3] [Inheritance] OPTIONAL
propagation [4] [Propagation] OPTIONAL
}
बिटवाइज़ फ़्लैग्स।```text Inheritance { None = 0, ContainerInherit = 1, ObjectInherit = 2, }
### प्रसार
बिटवाइज़ फ़्लैग्स।```text
Propagation {
None = 0,
NoPropagateInherit = 1,
InheritOnly = 2,
}
WHOAMI-REP { primary [1] String impersonation [2] String OPTIONAL }
## प्रक्रिया परिभाषाएँ
### PROC-LIST-REP```text
PROC-LIST-REP {
processes [1] SEQUENCE of [ProcessEntry]
}
PROC-KILL-REQ { process-id [1] UInt32 force [2] Boolean OPTIONAL }
### PROC-INJ-REQ```text
PROC-INJ-REQ {
shellcode [1] SEQUENCE of Byte
capability [2] SEQUENCE of Byte
process-id [3] UInt32 OPTIONAL
}
ProcessEntry { process-name [1] String process-id [2] UInt32 parent-process-id [3] UInt32 OPTIONAL session-id [4] Byte OPTIONAL owner [5] String OPTIONAL architecture [6] [Architecture] OPTIONAL integrity [7] [Integrity] OPTIONAL }
### आर्किटेक्चर```text
Architecture {
X86 = 0, // 32-bit Intel
X64 = 1, // 64-bit Intel
Arm = 2, // 32-bit ARM
Arm64 = 3, // 64-bit ARM
Wasm = 4 // WebAssembly
}
Integrity { Untrusted = 0, Low = 1, Medium = 2, // user High = 3, // sudoers System = 4 // root }
## रजिस्ट्री परिभाषाएँ
### REG-QUERY-REQ```text
REG-QUERY-REQ {
hive [1] [RegistryHive]
key [2] String OPTIONAL
value [3] String OPTIONAL
access-control [4] Boolean OPTIONAL
}
REG-QUERY-REP { values [1] SEQUENCE of [RegistryValue] keys [2] SEQUENCE of [RegistryKey] }
### REG-ADD-REQ```text
REG-ADD-REQ {
hive [1] [RegistryHive]
key [2] String
name [3] String OPTIONAL
kind [4] [RegistryValueKind] OPTIONAL
value [5] SEQUENCE of Byte OPTIONAL
}
REG-DELETE-REQ { hive [1] [RegistryHive] key [2] String }
### RegistryHive```text
RegistryHive {
ClassesRoot = 0,
CurrentUser = 1,
LocalMachine = 2,
Users = 3,
CurrentConfig = 4
}
RegistryKey { name [1] String access-control [2] [RegistrySecurity] OPTIONAL }
### RegistryValue```text
RegistryValue {
name [1] String
type [2] [RegistryValueKind]
data [3] SEQUENCE of Byte
access-control [4] SEQUENCE of [RegistrySecurity] OPTIONAL
}
RegistryValueKind { None = 0, // REG_NONE String = 1, // REG_SZ ExpandString = 2, // REG_EXPAND_SZ Binary = 3, // REG_BINARY DWord = 4, // REG_DWORD MultiString = 5, // REG_MULTI_SZ Qword = 6 // REG_QWORD }
### RegistrySecurity```text
RegistrySecurity {
identity [1] String
access-mask [2] Int32
inheritance [3] [Inheritance] OPTIONAL
propagation [4] [Propagation] OPTIONAL
}
RPORTFWD-START { bind-port [1] UInt16 localhost-only [2] Boolean OPTIONAL forward-host [3] String forward-port [4] UInt16 }
### RPORTFWD-DATA```text
RPORTFWD-DATA {
data [1] SEQUENCE of Byte
}
ENV-GET-REQ { key [1] String }
### ENV-GET-REP```text
ENV-GET-REP {
value [1] String
}
ENV-SET-REQ { key [1] String value [2] String }
## SOCKS परिभाषाएँ
### SOCKS-CONNECT-REQ```text
SOCKS-CONNECT-REQ {
id [1] UInt32
target [2] SEQUENCE of Byte (4)
port [3] UInt16
}
SOCKS-DATA { id [1] UInt32 data [2] SEQUENCE of Byte }
### SOCKS-CLOSE-REQ```text
SOCKS-CLOSE-REQ {
id [1] UInt32
}
## Token Definitions
### TOKEN-LIST-REP
```text
TOKEN-LIST-REP {
tokens [1] SEQUENCE of [TokenEntry]
}```
### TOKEN-CREATE-REQ
```text
TOKEN-CREATE-REQ {
username [1] String
domain [2] String OPTIONAL
password [3] String OPTIONAL
}```
### TOKEN-STEAL-REQ
```text
TOKEN-STEAL-REQ {
process-id [1] UInt32
access-mask [2] UInt32 OPTIONAL
}```
### TOKEN-USE-REQ
```text
TOKEN-USE-REQ {
index [1] Byte
}```
### TOKEN-DELETE-REQ
```text
TOKEN-DELETE-REQ {
index [1] Byte
}```
### TokenEntry
```text
Token {
index [1] Byte
username [2] String
handle [3] String OPTIONAL
process-id [4] UInt32 OPTIONAL
}```
## Implant Store Definitions
### STORE-LIST-REP
```text
STORE-LIST-REP {
items [1] SEQUENCE of [StoreItem]
}```
### STORE-ADD-ITEM Definition
```text
STORE-ADD-ITEM-REQ {
item [1] SEQUENCE of Byte
name [2] String
type [3] [StoreItemType]
}```
### STORE-DELETE-ITEM Definition
```text
STORE-DELETE-ITEM-REQ {
index [1] Byte
}```
### StoreItem
```text
StoreItem {
index [1] Byte
name [2] String
type [3] [StoreItemType]
}```
### StoreItemType
```text
StoreItemType {
Assembly = 0,
BOF = 1,
Script = 2,
Generic = 3
}```
## Local Execution Definitions
### RUN-REQ
```text
RUN-REQ {
program [1] String
arguments [2] String OPTIONAL
token [3] Byte OPTIONAL
}```
### RUN-REP
```text
RUN-REP {
output [1] String
}```
### EXEC-ASM-REQ
Either store-index or assembly MUST be provided.
```text
EXEC-ASM-REQ {
store-index [1] Byte OPTIONAL
assembly [2] SEQUENCE of Byte OPTIONAL
arguments [3] SEQUENCE of String OPTIONAL
bypass-amsi [4] Boolean OPTIONAL
bypass-etw [5] Boolean OPTIONAL
}```
### EXEC-ASM-REP
```text
EXEC-ASM-REP {
output [1] String
}```
### EXEC-BOF-REQ
Either store-index or bof MUST be provided.
```text
EXEC-BOF-REQ {
store-index [1] Byte OPTIONAL
bof [2] SEQUENCE of Byte OPTIONAL
arguments [3] SEQUENCE of Byte OPTIONAL
bypass-amsi [4] Boolean OPTIONAL
bypass-etw [5] Boolean OPTIONAL
}```
### EXEC-BOF-REP
```text
EXEC-BOF-REP {
output [1] String
}```
### EXEC-POSH-REQ
Either store-index or script MUST be provided.
```text
EXEC-POSH-REQ {
cmdlet [1] String
store-index [2] Byte OPTIONAL
script [3] SEQUENCE of Byte OPTIONAL
bypass-amsi [3] Boolean OPTIONAL
bypass-etw [4] Boolean OPTIONAL
}```
### EXEC-POSH-REP
```text
EXEC-POSH-REP {
output [1] String
}```
## Screenshot Definitions
### SCRNSHOT-REP
```text
SCRNSHOT-REP {
data [1] SEQUENCE of Byte
}```
## Remote Execution Definitions
### WINRM-REQ
```text
WINRM-REQ {
target [1] String
program [2] String
arguments [3] String OPTIONAL
}```
### WMI-REQ
```text
WMI-REQ {
target [1] String
program [2] String
arguments [3] String OPTIONAL
}```
### PSEXEC-REQ
```text
PSEXEC-REQ {
target [1] String
service-name [2] String
service-description [3] String OPTIONAL
bin-path [4] String
}```
## Peer-to-Peer Definitions
### LINK-SMB-REQ
```text
LINK-SMB-REQ {
target [1] String
pipename [2] String
}```
### LINK-TCP-REQ
```text
LINK-TCP-REQ {
target [1] String
port [2] UInt32
}```
### LINK-REP
```text
LINK-SMB-REP {
child-metadata [1] SEQUENCE of Byte
}```
### LINK-ACK
```text
LINK-ACK { child-id [1] UInt32 }
### LINK-PASS-THRU
```text
LINK-PASS-THRU {
child-id [1] UInt32
message [2] SEQUENCE of Byte
}```
## JOB Definitions
### JOB-LIST-REP
```text
jobs [1] [JobEntry] का अनुक्रम```
### JOB-KILL-REQ
```text
index [1] UInt32```
### JobEntry
```text
index [1] UInt32
type [2] Byte
code [3] Byte```