Acesso remoto (lado do usuário)¶
O que é¶
O NTUSER.DAT de um usuário guarda vestígios das conexões remotas que o usuário fez a partir do computador.
Eles são o lado de origem da movimentação lateral:
- Área de Trabalho Remota (
mstsc): - os computadores digitados no cliente, os mais recentes primeiro;
- uma chave por computador em que o usuário entrou, com o nome da conta usada e a impressão digital do certificado do servidor que o usuário aceitou;
- os computadores aos quais o usuário permitiu usar dispositivos locais.
- PuTTY:
- sessões salvas: host, porta, conta, protocolo, arquivo de chave, proxy e encaminhamentos de porta;
- as sessões iniciadas por último;
- todas as chaves de servidor SSH que o usuário aceitou.
- WinSCP: sessões salvas e chaves de servidor SSH aceitas, no mesmo formato das do PuTTY.
- Unidades mapeadas: cada unidade mapeada para ser restaurada ao entrar, e os caminhos digitados em Mapear unidade de rede.
- Compartilhamentos: os compartilhamentos que o Explorer montou (
MountPoints2).
Eles mostram para onde uma conta foi em seguida e com quais credenciais, mesmo depois que os logs do próprio computador remoto tenham desaparecido.
Melhor conclusão: o perfil deste usuário se conectou a este destino, ou salvou
uma conexão com ele. Uma sessão salva ou um nome digitado, por si sós, não provam que uma
conexão foi bem-sucedida. Uma chave de host aceita ou uma chave Servers com um UsernameHint é mais forte:
o cliente alcançou o servidor.
Localização¶
C:\Users\<user>\NTUSER.DAT
Software\Microsoft\Terminal Server Client\Default MRU0 … MRU9
Software\Microsoft\Terminal Server Client\Servers\<host> UsernameHint, CertHash
Software\Microsoft\Terminal Server Client\LocalDevices <host> = devices
Software\SimonTatham\PuTTY\Sessions\<session>
Software\SimonTatham\PuTTY\Jumplist Recent sessions
Software\SimonTatham\PuTTY\SshHostKeys <type>@<port>:<host> = key
Software\Martin Prikryl\WinSCP 2\Sessions\<session>
Software\Martin Prikryl\WinSCP 2\SshHostKeys
Network\<letter> RemotePath, UserName, ProviderName
Software\Microsoft\Windows\CurrentVersion\Explorer\Map Network Drive MRU
Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\##server#share
Colete o NTUSER.DAT com seus logs de transação para todos os perfis. Colete também o SOFTWARE
do sistema: ele fornece o SID de cada usuário.
Cuidados para o analista¶
- Os horários das chaves são horários das listas.
Default,SshHostKeyseMap Network Drive MRUcontêm listas, e a última gravação de sua chave é quando a lista mudou pela última vez. Esse horário pertence ao primeiro item (MruPosition0). Para os demais, é apenas um limite superior. Uma chaveServers\<host>, de sessão,Network\<letter>ou de compartilhamento tem seu próprio horário. - Salvo não é usado. Uma sessão do PuTTY ou do WinSCP pode ser salva sem nunca se conectar. O PuTTY
regrava
Recent sessionsquando uma sessão salva é iniciada, e adiciona uma chave de host quando um servidor é alcançado pela primeira vez. - Senhas:
- O WinSCP pode armazenar senhas de sessão, de túnel e de proxy.
- O PuTTY armazena apenas a senha de um proxy, em texto puro.
PasswordStorede oStoredPasswordsdeDetailsindicam quais valores estão definidos. Eles nunca são decodificados nem gravados na saída.- O WinSCP omite os padrões. Uma sessão sem
FSProtocolé SFTP, e uma semPortNumberusa a porta padrão do protocolo.ProtocolePortficam vazios nesse caso, em vez de adivinhar. - As impressões digitais de chaves de host são as
SHA256:…do OpenSSH, comossh-keygen -l,sshe o PuTTY 0.75 e posteriores as exibem. O Juntei as calcula a partir da chave que o PuTTY e o WinSCP guardam. Compare-as com a própria chave do servidor, arquivosknown_hostse logs para identificar o servidor por trás de um nome ou endereço IP. Uma chave SSH-1 (rsa) não tem impressão digital. - Unidades mapeadas:
RemoteUsernameé definido somente quando a unidade foi mapeada com outra conta; o Windows grava umREG_DWORD0 quando usou a do próprio usuário. - Compartilhamentos:
MountPoints2também tem chaves para volumes e letras de unidade. Apenas compartilhamentos de rede (##server#share) são relatados aqui;\\server@SSL@443\DavWWWRooté um compartilhamento WebDAV. - Remoção: limpar as listas, ou usar um cliente portátil, não deixa vestígios aqui. Compare com
Jump Lists, Prefetch, arquivos
.rdp, o cache de bitmaps do RDP e os logs do destino.
Analisar com o Juntei¶
Usage: juntei parse-registry remote-access <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find NTUSER.DAT hives
-f, --file <FILE> Parse one NTUSER.DAT
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry remote-access -d evidence/ -o remote.csv
juntei parse-registry remote-access -f NTUSER.DAT -t jsonl \
| jq 'select(.Client == "rdp" or .HostKeyFingerprint != null)'
O resumo conta as conexões por cliente. Ele lista as conexões cujas chaves foram gravadas por último, as mais recentes primeiro, e as sessões que guardam uma senha.
Campos de saída¶
| Campo | Interpretação |
|---|---|
Host, User, UserSID, SourcePath |
Host, o nome da pasta do perfil, o SID do usuário a partir do ProfileList do sistema (com o hive SOFTWARE do sistema) e o hive. |
Client |
rdp, putty, winscp, mapped_drive ou network_share. |
Kind |
De onde o registro vem: rdp_mru, rdp_server, rdp_local_devices, putty_session, putty_host_key, winscp_session, winscp_host_key, network_drive, map_network_drive_mru, mount_point. |
Target, Port |
O computador (nome do host ou endereço IP) e a porta, ou o compartilhamento (\\server\share). Uma porta só é informada quando o Windows ou o cliente gravou uma. |
RemoteUsername |
A conta usada no destino: UsernameHint, o UserName de uma sessão (ou o user@ do HostName do PuTTY), o UserName de uma unidade mapeada. |
Protocol |
O Protocol do PuTTY (ssh, telnet, raw, …), o FSProtocol do WinSCP (sftp, scp, ftp, webdav, s3), o provedor de uma unidade mapeada (Microsoft Windows Network). |
MRU-Position |
A posição em sua lista (0 é a mais recente): MRU<n>, MRUList, Recent sessions do PuTTY. |
SessionName |
O nome de uma sessão salva, com %20 e outros escapes decodificados. |
HostKeyType, HostKeyFingerprint, HostKey |
O tipo de uma chave de host SSH aceita (rsa2, ssh-ed25519, ecdsa-sha2-nistp256, …), sua impressão digital OpenSSH e seus números conforme armazenados. |
DriveLetter |
A letra de uma unidade mapeada. |
PasswordStored |
Se a sessão guarda uma senha; nunca decodificada. |
Details |
Outras configurações, como Name=Value; … (CSV) ou um objeto (JSON): o CertHash do certificado RDP, LocalDevices, o arquivo de chave de uma sessão, proxy, túnel SSH, encaminhamentos de porta, comando e diretórios remotos, StoredPasswords, o Label de um compartilhamento, o ConnectionType de uma unidade. |
KeyPath, ValueName |
A chave, e o valor para um registro que é um único valor. |
KeyLastWrittenUTC |
A última gravação da chave (veja os cuidados sobre listas). |
DataRaw |
Os bytes do valor (hex), quando não é uma string ou não é decodificado. |
TransactionLogStatus, LogsApplied |
Contexto de recuperação do Registro. |
Problems |
Valores do tipo errado (com seus bytes), chaves de host que não podem ser lidas, letras de MRUList que não existem e valores que ele não lista. |
Estratégia de investigação¶
- Liste os destinos de cada usuário por cliente e compare-os com os sistemas que esse usuário deveria
acessar. Procure compartilhamentos administrativos (
C$,ADMIN$) e endereços IP. - Anote as contas usadas (
RemoteUsername): administradores de domínio e contas locais em outras máquinas. - Associe
HostKeyFingerprintàs chaves dos servidores, eCertHashaos certificados dos servidores RDP. - Correlacione com os eventos de logon dos destinos (4624 tipo 10 e 3, 1149), Jump Lists e arquivos LNK
(
mstsc.exe,putty.exe, arquivos abertos a partir de compartilhamentos), Prefetch e o cache de bitmaps do RDP. - Use
parse-registry read --recover-deletedpara entradas excluídas, e cópias mais antigas doNTUSER.DATdo perfil (Cópias de Sombra de Volume, backups) para listas limpas.