Extraindo configurações de farol de ataque de cobalto

Parte 2 - Extraindo configurações de beacons de implante Cobalt Strike.

7 min de leitura
Extraindo configurações de farol de ataque de cobalto

Confira nossa postagem anterior sobre como coletar implantes de sinalizador Cobalt Strike. Usaremos essas informações para extrair as configurações dos beacons.

Nesta postagem, mostraremos como analisar manualmente uma configuração do Cobalt Strike C2 a partir de uma carga útil de beacon binário usando o excelente Cobalt Strike Configuration Extractor (CSCE). Também abordaremos a ativação de alguns recursos mais recentes do Elastic Stack que permitirão que você faça isso em escala em todos os seus endpoints monitorados, extraindo os beacons da memória.

A equipe da Blackberry tem um manual incrível chamado “Encontrando beacons no escuro” (é necessário registrar-se) que se aprofunda nas configurações de beacons Cobalt Strike. Discutiremos alguns campos nas configurações aqui, mas se você estiver interessado em aprender como os beacons funcionam, recomendamos fortemente que você confira esse recurso.

Extrator de configuração de ataque de cobalto

O Cobalt Strike Configuration Extractor (CSCE) de Stroz Friedberg é uma "biblioteca python e um conjunto de scripts para extrair e analisar configurações de beacons Cobalt Strike".

Para usar o CSCE, criaremos um ambiente virtual Python, o ativaremos e instalaremos o pacote CSCE Python.

Configurando o extrator de configuração Cobalt Strike

$ python3 -m venv csce

$ source csce/bin/activate

(csce) $ pip3 install libcsce

...truncated...
Collecting libcsce
  Using cached libcsce-0.1.0-py3-none-any.whl (24 kB)
Collecting pefile>=2019.4.18
...truncated...

Em seguida, podemos executar o CSCE na carga útil do beacon que extraímos da memória para ver se há alguma informação interessante armazenada que possamos coletar (adicionaremos o sinalizador --pretty para tornar a saída mais fácil de ler como um documento JSON).

Visualizando os indicadores atômicos da configuração do beacon CS

(csce) $ csce --pretty beacon.exe

{
  "beacontype": [
    "HTTPS"
  ],
  "sleeptime": 45000,
  "jitter": 37,
  "maxgetsize": 1403644,
  "spawnto": "GNEtW6h/g4dQzm0dOkL5NA==",
  "license_id": 334850267,
  "cfg_caution": false,
  "kill_date": "2021-12-24",
  "server": {
    "hostname": "clevelandclinic[.]cloud",
    "port": 443,
    "publickey": "MIGfMA0GCSqGSIb3DQEBAQUAA4G...
...truncated...

Imediatamente, podemos ver que o beacon usa HTTPS para se comunicar e que o domínio é clevelandclinic[.]cloud. Isso nos dá um indicador atômico que nos permite fazer algumas análises. Olhando a documentação do Malleable Command and Control, podemos obter uma descrição das variáveis de configuração.

Como exemplo, podemos ver que sleeptime é 450000 milissegundos, o que altera a verificação padrão do beacon de 60 segundos para 450 segundos, ou 7 ½ minutos. Além disso, vemos uma instabilidade de 37 , o que significa que há uma instabilidade aleatória de 37% de 450000 milissegundos (166,500 milissegundos), então o check-in do beacon pode ser entre 283,000 e 450,000 milissegundos (4,7 - 7,5 minutos).

Além disso, o campo publickey é usado pelo Cobalt Strike Team Server para criptografar as comunicações entre o servidor e o beacon. Isso é diferente dos certificados TLS normais usados ao acessar o domínio C2 com um navegador ou bibliotecas de transferência de dados, como cURL. Este campo é importante porque o Team Server usa a mesma chave pública para cada beacon, portanto, este campo é valioso no agrupamento de beacons com seu Team Server de perspectiva, porque os agentes de ameaças geralmente usam o mesmo Team Server para várias campanhas, portanto, esses dados da configuração podem ser usados para vincular agentes de ameaças a várias campanhas e infraestruturas.

Continuando a observar a saída da configuração, podemos ver outra seção interessante em torno do campo aninhado process-inject , stub:

Visualizando o campo process-inject.stub

(csce) $ csce --pretty beacon.exe

...truncated...
  "process-inject": {
    "allocator": "NtMapViewOfSection",
    "execute": [
      "CreateThread 'ntdll!RtlUserThreadStart'",
      "CreateThread",
      "NtQueueApcThread-s",
      "CreateRemoteThread",
      "RtlCreateUserThread"
    ],
    "min_alloc": 17500,
    "startrwx": false,
    "stub": "IiuPJ9vfuo3dVZ7son6mSA==",
    "transform-x86": [
      "prepend '\\x90\\x90'"
    ],
...

O campo stub contém o hash do arquivo MD5 codificado em Base64 do arquivo Java Cobalt Strike. Para converter isso, podemos usar novamente o CyberChef, desta vez adicione as receitas "From Base64" e "To Hex". Certifique-se de alterar o "Delimitador" para "Nenhum" na receita "To Hex".

Agora que temos o valor MD5 do arquivo Java (222b8f27dbdfba8ddd559eeca27ea648), podemos verificar isso em bancos de dados on-line como o VirusTotal para obter informações adicionais, especificamente, o hash SHA256 (7af9c759ac78da920395debb443b9007fdf51fa66a48f0fbdaafb30b00a8a858).

Por fim, podemos verificar o hash SHA256 com o CobaltStrike para identificar a versão do arquivo Java acessando https://verify.cobaltstrike.com e procurando pelo hash.

Agora sabemos que este beacon foi criado usando uma versão licenciada do Cobalt Strike 4.4.

Outro campo da configuração que é útil na atividade de cluster é o campo license_id .

Visualizando a marca d'água Cobalt Strike

...truncated
  "spawnto": "GNEtW6h/g4dQzm0dOkL5NA==",
  "license_id": 334850267,
  "cfg_caution": false,
...truncated...

Isso é comumente chamado de marca d'água e é um valor de 9 dígitos exclusivo por licença. Embora esse valor possa ser modificado, ele ainda pode ser usado em conjunto com os campos process-inject.stub e publickey (discutidos acima) para agrupar grupos de infraestrutura e atividades.

Esses são apenas alguns campos que podem ser usados para identificar e agrupar atividades usando configurações extraídas do beacon Cobalt Strike. Se você estiver interessado em uma análise mais aprofundada da configuração, recomendamos que você confira o manual Finding Beacons in the Dark Cobalt Strike, da equipe da Blackberry.

Colocando a análise em ação

Para testar nosso manual de análise para coleta de cargas úteis do beacon Cobalt Strike, suas configurações e metadados contidos neles, podemos aplicá-los a mais dados para identificar grupos de atividades.

Na ilustração acima, podemos agrupar agentes de ameaças com base em seus usos compartilhados da chave pública de carga útil do beacon, que, como descrevemos acima, é exclusiva por Team Server. Isso nos permitiria agrupar vários hashes de carga útil de beacon, infraestrutura e campanhas em um único Threat Actor.

Como sempre, usar os indicadores atômicos extraídos das configurações de carga útil do beacon (clevelandclinic[.]cloud em nosso exemplo) permite que você identifique infraestrutura compartilhada adicional, setores-alvo e recursos de agentes de ameaças.

Desta vez a toda velocidade

Todas as etapas que destacamos nesta versão, bem como na versão anterior, podem ser automatizadas e gravadas no Elasticsearch usando o projeto Cobalt Strike Beacon Extraction .

Resumo

Nesta postagem, destacamos novos recursos do Elastic Stack que podem ser usados para coletar cargas úteis do beacon Cobalt Strike Malleable C2. Além disso, abordamos os processos para criar políticas de frota para extrair cargas úteis de beacon da memória e suas configurações.

Essas políticas e processos do Fleet permitem que analistas de segurança coletem cargas úteis de beacons do Cobalt Strike e suas configurações para identificar a infraestrutura controlada por agentes de ameaças e a atividade do cluster.

Artefatos

Observável | Tipo | Nota -------------------------------------------------------------------|-------------|------------------------------------------ 697fddfc5195828777622236f2b133c0a24a6d0dc539ae7da41798c4456a3f89 | SHA256 | Carga útil do beacon Cobalt Strike Malleable C2 7475a6c08fa90e7af36fd7aa76be6e06b9e887bc0a6501914688a87a43ac7ac4 | SHA256 | Carga útil do beacon Cobalt Strike Malleable C2 f9b38c422a89d73ebdab7c142c8920690ee3a746fc4eea9175d745183c946fc5 | SHA256 | Carga útil do beacon Cobalt Strike Malleable C2 clevelandclinic[.]cloud | nome-de-domínio | Domínio Cobalt Strike Malleable C2 104[.]197[.]142[.]19 | ipv4-addr | Endereço IP Cobalt Strike Malleable C2 192[.]64[.]119[.]19 | ipv4-addr | Endereço IP Cobalt Strike Malleable C2

Artefatos

Os artefatos também estão disponíveis para download nos formatos ECS e STIX em um pacote zip combinado.

Compartilhe este artigo