Un profil d'écoute pour le framework C2 Mythic qui utilise les API de fichiers des fournisseurs d'IA
ai_file est un profil Mythic C2 qui utilise l'API OpenAI Files publiquement documentée pour échanger des messages d'implant via des fichiers jsonl au lieu d'un listener HTTP/S traditionnel. Il s'appuie sur le comportement de l'API Files défini par OpenAI dans la documentation publique : https://developers.openai.com/api/docs/guides/file-inputs?api-mode=responses.
Le listener interroge l'endpoint /v1/files pour les fichiers .jsonl avec purpose=batch, déchiffre localement chaque enveloppe de requête, transmet les octets bruts du message Mythic à /agent_message de Mythic, chiffre la réponse de Mythic, et téléverse un fichier .jsonl de réponse vers l'API Files.
\
Depuis le répertoire Mythic :
sudo ./mythic-cli install folder /path/to/openai_file
sudo ./mythic-cli c2 start openai_file
Modifiez C2_Profiles/openai_file/openai_file/c2_code/config.json avant de démarrer le profil :
{
"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
}
]
}
Les valeurs requises sont api_key, transport_key, et un channel_id correspondant entre le listener et la configuration du profil de payload. transport_key peut être base64:<32 raw bytes> ou une phrase secrète à haute entropie ; les phrases secrètes sont dérivées par SHA-256 avant utilisation pour le chiffrement des enveloppes.
Les agents et le listener échangent des fichiers en utilisant les fichiers .jsonl de l'API Files d'OpenAI avec purpose=batch.
Nom de fichier de requête :
<request_prefix>_<channel_id>_<request_id>.jsonl
Nom de fichier de réponse :
<response_prefix>_<channel_id>_<request_id>.jsonl
Le préfixe de requête par défaut est mythic_to_server ; le préfixe de réponse par défaut est mythic_to_agent ; le canal par défaut est mythic.
Chaque fichier contient un ou plusieurs objets JSON, un par ligne :
{"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 est la sortie AES-256-CBC avec un tag HMAC-SHA256 en fin sur les octets bruts du message Mythic. nonce est l'IV CBC. nonce et ciphertext sont en base64url sans padding. L'AAD est :
v|profile|channel|direction|id|alg
Par exemple :
1|openai_file|mythic|request|req_001|aes-256-cbc-hmac-sha256+base64url