
Módulo de keylogger para Windows do framework de implantes Sliver C2, que usa Raw Input para capturar teclas digitadas e expõe comandos de início, interrupção e recuperação aos operadores.
Esta extensão para o Sliver foi escrita principalmente como um exercício de aprendizado
sobre como o Sliver lida com extensões.
Gostaria de agradecer a toda a equipe do Sliver pelo trabalho neste framework público de implants. Em especial, gostaria de agradecer ao @rkervell por responder muitas das minhas perguntas relacionadas a como o Sliver lida com suas extensões.
Basicamente, ele usa raw input. Isso tem vantagens e desvantagens em relação a outros métodos comuns de keylogging.
Eu gosto dele porque não exige injeção em outros binários, nem exige consultar uma determinada chamada com frequência, correndo o risco de perder resultados.
Este código é em parte trabalho meu e em parte uma mistura de exemplos encontrados pela internet.
abra o arquivo de solução usando o Visual Studio 2019 e compile as versões x86 e x64.
Até que isso seja potencialmente incluído no armory, ele pode ser compilado em um sistema Windows. Em seguida, a pasta $(solutiondir)\bin resultante pode ser colocada no cliente sliver
e extensions install <path to folder> pode ser executado para instalar a extensão. Talvez seja necessário reiniciar ou também executar extensions load <path to folder>.
raw_keylogger <cmdid>
os seguintes cmdid são válidos
0 = stop
1 = start
2 = get keystrokes
se tudo correr bem, ficará assim

A API do Sliver tem as seguintes duas partes principais
typedef int (*goCallback)(const char*, int);
extern "C" {
__declspec(dllexport) int __cdecl entrypoint(char* argsBuffer, uint32_t bufferSize, goCallback callback);
}
o implante chamará o "entrypoint" conforme definido no arquivo .json. ele aponta para a sua função de ponto de entrada (não precisa ter esse nome, basta seguir a assinatura)
goCallback é uma função para retornar a saída para o Go. Ela é chamada assim: callback(string, string_length)
Ao codificar a extensão, por enquanto os campos "name" e "command_name" precisam corresponder; caso contrário, o implante recarregará sua extensão a cada chamada.
Até o momento em que este texto foi escrito, extensões não-BOF não suportam argumentos fortemente tipados, então tudo o que for fornecido na CLI após o nome do comando será enviado como uma string. Você precisa lidar com isso a partir daí no lado do código nativo da extensão.