Un profilo di listener per il framework Mythic C2 che utilizza le API file dei fornitori di AI
ai_file è un profilo Mythic C2 che utilizza l'API OpenAI Files, documentata pubblicamente, per scambiare messaggi dell'implant tramite file jsonl invece di un tradizionale listener HTTP/S. Si basa sul comportamento dell'API Files definito da OpenAI nella documentazione pubblica: https://developers.openai.com/api/docs/guides/file-inputs?api-mode=responses.
Il listener esegue il polling dell'endpoint /v1/files per file .jsonl con purpose=batch, decifra localmente ogni envelope di richiesta, inoltra i byte grezzi del messaggio Mythic a /agent_message di Mythic, cifra la risposta di Mythic e carica un file .jsonl di risposta nuovamente sull'API Files.
\
Dalla directory di Mythic:
sudo ./mythic-cli install folder /path/to/openai_file
sudo ./mythic-cli c2 start openai_file
Modifica C2_Profiles/openai_file/openai_file/c2_code/config.json prima di avviare il profilo:
{
"instances": [
{
"name": "default",
"api_key": "REPLACE_ME",
"base_url": "https://api.openai.com/v1",
"organization": "",
"project": "",
"purpose": "batch",
"channel_id": "mythic",
"request_prefix": "mythic_to_server",
"response_prefix": "mythic_to_agent",
"transport_key": "REPLACE_ME",
"poll_interval_seconds": 5,
"delete_processed_files": true,
"debug": true,
"max_file_bytes": 10485760,
"mythic_host": "",
"mythic_port": 0
}
]
}
I valori obbligatori sono api_key, transport_key e un channel_id corrispondente tra il listener e la configurazione del profilo del payload. transport_key può essere base64:<32 raw bytes> oppure una passphrase ad alta entropia; le passphrase vengono derivate con SHA-256 prima dell'uso nella cifratura dell'envelope.
Gli agent e il listener scambiano file utilizzando i file .jsonl dell'API Files di OpenAI con purpose=batch.
Nome file della richiesta:
<request_prefix>_<channel_id>_<request_id>.jsonl
Nome file della risposta:
<response_prefix>_<channel_id>_<request_id>.jsonl
Il prefisso di richiesta predefinito è mythic_to_server; il prefisso di risposta predefinito è mythic_to_agent; il canale predefinito è mythic.
Ogni file contiene uno o più oggetti JSON, uno per riga:
{"v":1,"profile":"openai_file","channel":"mythic","direction":"request","id":"req_001","alg":"aes-256-cbc-hmac-sha256+base64url","nonce":"...","ciphertext":"...","created_at":0}
ciphertext è l'output AES-256-CBC con un tag HMAC-SHA256 in coda sui byte grezzi del messaggio Mythic. nonce è l'IV CBC. nonce e ciphertext sono in base64url senza padding. L'AAD è:
v|profile|channel|direction|id|alg
Ad esempio:
1|openai_file|mythic|request|req_001|aes-256-cbc-hmac-sha256+base64url