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.