DPAPI "Segredos". Olhe para o burro

Além do nosso último artigo sobre decodificação de blobs DPAPI, falaremos sobre mais dois casos que tivemos que enfrentar. Será sobre senhas salvas nos navegadores MS IE11 e Edge.

A estratégia permanece a mesma - descriptografaremos tudo offline. Para fazer isso, você precisa pegar os arquivos necessários.

Dependendo do sistema operacional (Windows 7 ou superior), as senhas salvas devem ser procuradas em dois locais:

No caso do Windows 7, esta é uma ramificação do registro

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2 

Para Windows 8 e superior, armazenamento do Windows Vault.

Observe também que no Windows 7, as senhas de autorização básica http também são armazenadas no Windows Vault; portanto, buscá-las não prejudica em nenhum caso.

Bem, de acordo com a boa e velha tradição - tudo isso, é claro, é criptografado através de mecanismos DPAPI.

Agora considere o algoritmo de descriptografia em mais detalhes.

Windows 7 + IE11 (Edge)


Como mencionado acima, as senhas são armazenadas no registro do usuário atual e são blobs DPAPI criptografados com a chave mestra do usuário.

Mas há uma diferença importante - a entropia é usada ao criptografar a senha. Entropia é a URL na qual uma senha é inserida no formato ("https://url"+"\x00").lower().encode("utf-16-le") .

Para descriptografar uma senha, você precisa saber o URL completo! Caso contrário, nada.

Mas, para que o próprio IE saiba descriptografar a senha, esse URL é armazenado em hash e armazenado no registro como o nome da chave no DPAPI-blob.

Considere um pequeno exemplo. Para o site https://rdot.org/forum/ senha salva será assim:

 A88E21329B5372B856CE238B79D1F28D8EA1FD359D REG_BINARY 01000000D08C9DDF0115D1118C7A00C......BC310C51EE0F9B05D 

onde
A88 ... é um URL com hash https://rdot.org/forum/
01000000D08C ... - blob DPAPI contendo nome de usuário e senha

O algoritmo de hash da URL é simples. Mais informações sobre ele podem ser encontradas nos desenvolvimentos do Vault7, baseados na CIA.

Em python, fica assim:

 import hashlib url = "https://rdot.org/Forum/".lower() + "\x00" url_utf_16_le = url.encode("utf-16-le") sha1obj = hashlib.sha1(url_utf_16_le) urldigest = sha1obj.digest() checksum = 0 len(urldigest) for abyte in urldigest: checksum = (checksum + (ord(abyte))) & 0xFF hash = sha1obj.hexdigest().upper() cksum = "%02X" % checksum reg_value_name = "%s%s" % (hash, cksum) print reg_value_name 

Uma lista dos últimos 50 URLs inseridos também pode ser encontrada no registro:

  HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\typedurls 

Vamos voltar ao exemplo. Suponha que precisamos encontrar a senha salva em https://rdot.org/forum/ no registro.

Substituindo o valor do URL no script de conversão - obtemos o valor

 A88E21329B5372B856CE238B79D1F28D8EA1FD359D 

A chave com esse nome precisamos encontrar no registro

 req query "HKEY_USERS\<SID>\Software\Microsoft\Internet Explorer\IntelliForms\Storage2" 

Se essa chave for encontrada, ela deve ser copiada para o arquivo como valores hexadecimais (ou seja, interpretar o valor da chave como blob hexadecimal) e descriptografada como blob DPAPI usando entropia: ("https://rdot.org/forum/".lower() + "\x00").encode("utf-16-le")
("https://rdot.org/forum/".lower() + "\x00").encode("utf-16-le")


Para descriptografia, você pode usar o dpapick, fazendo as alterações apropriadas para levar em consideração a entropia na descriptografia.

No arquivo examples / filegeneric.py, a chamada de função

  probe.try_decrypt_with_password(options.password, mkp, options.sid) 

substitua por

 probe.try_decrypt_with_password(options.password, mkp, options.sid, entropy=("https://rdot.org/forum/".lower() + "\x00").encode("utf-16-le")) 

e depois dessa chamada dpapick, como de costume:

  ./filegeneric.py --sid <SID> --masterkey <mk dir> --password <..> --inputfile <dpapi blob from registry> 

Se a chave mestra for descriptografada corretamente, a saída receberá o nome de usuário e a senha salvos (após uma certa quantidade de dados binários do serviço).

Windows 8.1 e superior


No caso de salvar senhas no Win8 e superior, as senhas dos formulários http, bem como a autorização básica http, são armazenadas no Windows Vault. E o que é bom - além da senha, o URL completo do site ao qual ele se aproxima também é salvo.

O próprio cofre é criptografado em dois estágios - primeiro, todo o bloco de dados é criptografado pelo AES e a chave simétrica para descriptografia é criptografada pela DPAPI e salva em um arquivo. O algoritmo completo de criptografia e descriptografia é descrito no artigo pelos caras da Zena Forensics .

Eles também desenvolveram decodificadores especiais para o Windows Vault com base no dpapick (dpapilab). Você pode levá-los no ZF git ou baixar um fork do nosso github .

O armazenamento do Vault está localizado no perfil do usuário:

 C:\Users\<user>\AppData\Local\Microsoft\Vault\<GUID>\ 

Dentro do arquivo .vpol, há um blob DPAPI criptografado com uma chave de usuário e armazenando uma chave AES para descriptografar .vcrd

Para descriptografar o Vault, você deve executar:

 ./vaultdec.py --masterkey <mk dir> --sid <SID> --password <pass> <VAULT DIR> 

Em vez de uma senha, você pode usar uma chave de domínio, conforme mostrado no artigo anterior . Também deve ser observado que, se a política de Credential Roaming estiver incluída na máquina no domínio, os dados do Windows Vault serão armazenados no LDAP. Você pode ler sobre isso em nosso primeiro artigo sobre DPAPI.

Uma pequena adição: para que o script funcione corretamente, você provavelmente precisará instalar os links antigos do Python:

 apt install python-construct.legacy 

Folha de dicas


Para descriptografar senhas IE, Edge e senhas armazenadas no Windows, você precisa pegar:

Diretório do Vault

 c:\Users\<user>\AppData\Local\Microsoft\Vault\<GUID>\ 

catálogo com chaves mestras

 c:\Users\<user>\AppData\roaming\microsoft\Protect\<SID>\ 

conteúdo da chave do registro

 HKEY_USERS\<SID>\Software\Microsoft\Internet Explorer\IntelliForms\Storage2 HKEY_USERS>\<SID>\Software\Microsoft\Internet Explorer\typedurls 

Além disso, você precisa saber a senha do usuário ou a chave de backup dpapi do domínio para descriptografar sem uma senha.

Source: https://habr.com/ru/post/pt437390/


All Articles