
Beaconing HTTPS do Cobalt Strike sobre a API Microsoft Graph

Post de lançamento: GraphStrike: Usando a Graph API da Microsoft para Fazer o Tráfego do Beacon Desaparecer
Post do desenvolvedor: GraphStrike: Anatomia do Desenvolvimento de Ferramentas Ofensivas
O GraphStrike é um conjunto de ferramentas que permite ao HTTPS Beacon do Cobalt Strike usar a Microsoft Graph API para comunicações C2. Todo o tráfego do Beacon será transmitido através de dois arquivos criados no site do SharePoint do atacante, e todas as comunicações do Beacon serão roteadas para https://graph.microsoft.com:

O GraphStrike inclui um provisionador para criar os ativos do Azure necessários para o Cobalt Strike HTTPS sobre a Graph API:

O GraphStrike não cria ativos pagos no Azure, portanto nenhum custo adicional é incorrido pelo uso do GraphStrike ou do seu provisionador.
Inteligência de ameaças foi divulgada sobre vários APTs diferentes que utilizam a Microsoft Graph API e outros serviços da Microsoft para campanhas ofensivas:
Os atores de ameaças continuam a utilizar serviços legítimos para fins ilegítimos. Utilizar um domínio de alta reputação como graph.microsoft.com para comunicações C2 é extremamente eficaz e desejável, mas muitas vezes complicado e proibitivo em termos de tempo e esforço. A maioria dos frameworks C2 não suporta métodos para buscar ou rotacionar tokens de acesso, o que os impede de usar a Graph API. Isso pode dificultar que equipes vermelhas repliquem essas técnicas e priva os defensores da oportunidade de observar e desenvolver assinaturas para esse tipo de atividade. O GraphStrike busca aliviar esse fardo e fornecer um processo confiável e repetível para utilizar a Microsoft Graph API, mantendo a familiaridade e confiabilidade da experiência do Cobalt Strike.
Tecnicamente, não. Tendo construído anteriormente um verdadeiro External C2 usando Graph API (que enviava o tráfego do Beacon como mensagens do Microsoft Teams), o fardo de ter que desenvolver, manter e integrar um implant personalizado que atenda às especificações do External C2 e faça o trabalho é muito familiar. O GraphStrike, em vez disso, utiliza um User Defined Reflective Loader(UDRL) de código aberto chamado AceLdr por Kyle Avery (adaptado como 'GraphLdr' neste projeto) para interceptar as chamadas da biblioteca WinINet que o Beacon normalmente faz e manipulá-las conforme necessário para usar a Graph API. Não há implant personalizado ou processo adicional, apenas o processo do Beacon com algumas APIs do Windows interceptadas. No lado do servidor, há um programa Python3 que traduz o tráfego do Cobalt Strike Team Server em tráfego da Graph API e vice-versa.
O GraphStrike suporta quase todas as atividades normais do Cobalt Strike, incluindo:
Isso também inclui a integração do GraphStrike com os comandos sleep, exit e remove para sincronizar os tempos de sleep do GraphStrike Server com o Beacon, bem como excluir arquivos no SharePoint quando um Beacon é encerrado ou removido.
O GraphStrike também incorpora todas as funcionalidades do AceLdr original, com algumas APIs adicionais para utilizar também o call stack spoofing.
O GraphStrike requer o seguinte antes de começar:
Anote o seguinte antes de prosseguir com o processo de configuração:
1. Certos componentes utilizam caminhos relativos para localizar outros ativos. Por favor, mude de diretório conforme instruído abaixo.
2. O perfil do Cobalt Strike só pode ser editado ANTES do passo 5 no processo de configuração abaixoNota #1.
sudo setup/install_dependencies.sh para instalar as dependências de sistema necessárias.python3 -m venv virtual e depois source virtual/bin/activate para criar e entrar no ambiente virtual.pip3 install -r requirements.txt../provisioner.py new e complete o processo de configuração.graph.microsoft.com nos campos HTTPS Hosts e HTTPS Host(Stager)../GraphStrike.py.Devido ao tamanho do GraphLdr, os usuários do Artifact Kit precisarão recompilá-lo com opções específicas para que o GraphStrike seja compatível com payloads gerados pelo Artifact Kit. Especificamente, os campos 'Stage Size' e 'RDLL Size' precisam ser especificados para usar o tamanho de 100K RDLL. Dois exemplos de sintaxe funcional são fornecidos abaixo:
./build.sh pipe VirtualAlloc 505029 100 false false none /opt/cobaltstrike/artifacts
./build.sh peek HeapAlloc 492376 100 false true indirect /opt/cobaltstrike/artifacts
./provisioner.py delete para remover os ativos do Azure criados.