Muito bem, pessoal.
Bem-vindo de volta.
No último vídeo, falamos sobre a parte teórica por trás da fixação de certificados ou a abordagem por
trás da fixação de certificados neste vídeo aqui.
Vamos agora dar uma olhada em como ele realmente funciona.
Portanto, faremos os exercícios práticos relacionados à fixação de certificados.
Aprenderemos como funciona a fixação de certificados, como podemos identificá-la e, mais ainda, como podemos corrigi-la.
Portanto, esse é o objetivo deste vídeo aqui.
Portanto, vamos mudar para a VM do Ubuntu e dar uma olhada nela.
Muito bem, pessoal, estamos agora em nossa VM do Ubuntu e começamos com uma configuração limpa e básica aqui.
Portanto, ainda não realizamos nosso ataque pelo meio.
Também não temos o pacote burp em execução nem temos nenhuma regra de tabela IP definida.
Nós nem mesmo o conectamos à tomada.
Portanto, essa interface não está disponível no momento.
O motivo para isso é o seguinte.
Se você receber um aplicativo do desenvolvedor e ele estiver executando uma fixação de certificado, você estará
enfrentando muitos problemas.
Mas o problema que você definitivamente não quer enfrentar é ter um aplicativo quebrado apenas por design.
E isso acontece com frequência.
Então, você recebe um aplicativo do desenvolvedor e o executa sem nenhum componente de rede modificado
aqui e ele simplesmente não funciona.
Esse também pode ser o caso dos meus aplicativos.
Quero dizer, eles podem não ser tão bem programados.
Não tenho certeza sobre isso.
Portanto, minha recomendação profissional é que, se você receber um aplicativo, teste-o em sua rede
sem intermediários.
Podemos fazer isso com bastante facilidade.
Tudo o que precisamos fazer é conectar nosso adaptador USB para Ethernet e ter nosso ponto de acesso em funcionamento.
Portanto, se você conectar isso, pronto.
Vejamos.
Ok, essa interface ainda não está funcionando.
Talvez agora esteja funcionando.
Muito bem, agora temos nosso ponto de acesso em execução e esse ponto de acesso está roteando o tráfego por meio
de nossa VM do Ubuntu para a Internet.
Mas não há nada no meio.
Essa é uma conexão normal com a Internet.
E se o aplicativo não funcionar aqui, teremos um problema ou não.
O problema é nosso, o desenvolvedor.
Tudo bem.
Portanto, vamos nos certificar de que esse aplicativo funcione regularmente sem nenhuma modificação e, portanto, vamos seguir
nosso conselho real.
Desculpe, dispositivo, este aqui.
Em seguida, vamos abrir uma cópia da tela.
E lá vamos nós.
Está bem.
E agora vamos instalar esse aplicativo.
Você pode encontrar esse aplicativo no anexo da seção aqui e ele se chama.
Vamos descobrir.
Não tenho mais certeza sobre isso.
Sim, é claro.
Eu o chamei de hash de sublinhado de fixação de certificado.
Portanto, este aplicativo está relacionado à fixação de certificados com a abordagem de hash.
No próximo vídeo, daremos uma olhada na abordagem relacionada à inclusão de um certificado bruto.
Está bem.
Muito bem.
Então, vamos instalar esse aplicativo.
E lá vamos nós.
E aqui podemos ver essas belas cores neon, que agora, eu acho, estão bem atualizadas.
Portanto, acho que não tem uma interface de usuário sofisticada.
Vejamos, estamos abrindo-o e aqui temos a fixação do certificado, a fixação do certificado, o envio de uma solicitação.
Tudo bem.
Vamos executar essa solicitação e temos um erro de fixação.
Ele falhou.
Temos um atacante.
Não, ainda não.
Não fizemos nada, mas o smartphone não tem conexão com a Internet, então esse aplicativo está presumindo
que há um invasor entre nós e, portanto, a conexão foi interrompida.
Portanto, podemos corrigir isso com bastante facilidade.
Vamos para a tela inicial, depois para Configurações Wi-Fi e, em seguida, simplesmente nos conectamos ao nosso ponto de acesso
TP link aqui.
Tudo bem.
Estamos obtendo um endereço IP e agora estamos conectados.
Legal.
E vamos voltar ao assunto.
E vamos ver.
Enviar solicitação.
Aqui está.
Bem-sucedido.
Agora temos uma conexão com a Internet.
Não há nenhum atacante entre nós e recebemos essa mensagem.
E esse domínio é para uso em exemplos ilustrativos, ilustrativos e lamentáveis em documentos.
Esse é o texto do exemplo. com.
E este texto está sendo impresso aqui Se não houver nenhum homem no meio acontecendo.
Tudo bem.
Está bem.
Antes de realizarmos a configuração do nosso homem no meio, vamos dar uma olhada no Wireshark.
Como em nossa configuração estamos encaminhando portas individuais para o pacote burp, podemos encaminhar a porta 8443
ou a porta que quisermos.
Pode ser que esse aplicativo aqui esteja usando uma porta diferente da 80 e da 443.
Por exemplo, (844) 388-7331 ou qualquer outra coisa.
Então, vamos dar uma olhada com o Wireshark e depois podemos encaminhar todas essas portas para o nosso pacote burp.
E assim não perdemos nada.
Muito bem.
Vamos digitar isso aqui e sudo wireshark.
Está faltando um E.
Aqui está.
E agora vamos selecionar essa interface.
Coloque o aplicativo em primeiro plano e, em seguida, clique em enviar solicitação.
Ok, aqui temos agora o fluxo gravado no Wireshark, mas ele se refere ao TLS 1. 3 e se clicarmos com o botão direito do mouse
em follow TCP stream, veremos que este aqui está sendo criptografado.
Foi sobre isso que falamos, como o HTTPS funciona.
Tudo bem.
Não conseguimos ver nada aqui além do domínio.
E este aqui é o domínio.
E este é antes da criptografia acontecer, porque o.
Sim, o aplicativo precisa se conectar ao host para transferir todos os certificados, chaves públicas,
criptografia, chave simétrica e tudo o mais.
Portanto, o domínio é visível mesmo em https.
Tudo bem.
Agora sabemos que esse aplicativo está se comunicando com o exemplo. com e este é o IP que vemos aqui.
Vamos verificar isso rapidamente.
Exemplo de host. com.
Aqui está.
93 184 216 34 Tudo bem.
E para garantir que esse aplicativo esteja se comunicando apenas pela porta quatro, quatro,
três, podemos aplicar alguns filtros no Wireshark, o que é muito bom se formos a este.
Ok, agora podemos clicar em um pacote que tenha o destino definido como nine 384 e assim por diante.
Podemos pressionar o botão direito do mouse, aplicar como filtro e selecioná-lo.
Agora temos todos os pacotes com esse endereço IP como host de destino e podemos adicionar
um filtro final.
Portanto, estamos aplicando esse filtro, o destino IP a este, juntamente com a porta de destino IP TCP.
Esse é igual a quatro, quatro, três.
Muito bem, agora podemos ver que nada mudou.
Essas são agora todas as conexões relacionadas a esse endereço IP e a essa porta de destino.
Também podemos filtrar por não ter essa porta de destino.
E agora não recebemos nada.
E isso significa que todas as conexões relacionadas a esse host são baseadas em 443, pelo menos o que detectamos.
Se eu fizer alguma análise, deixo esse aplicativo em execução por um bom tempo.
Digamos que sejam 20 minutos clicando em todos os lugares, tentando fazer todas as solicitações possíveis e, em seguida,
gravo tudo aqui e, sim, dou uma olhada em quantas conexões temos relacionadas a quais portas.
Tudo bem.
Para ter certeza de que este está funcionando corretamente.
Vamos executá-lo mais uma vez com esse filtro ativado.
E agora vamos para o smartphone, abrindo o Chrome em uma nova guia anônima.
E agora estamos fazendo uma solicitação HTTP porque o HTTP não está relacionado à porta de destino 403.
Está bem.
Por exemplo, http. com, isso deve ser obtido agora porque estamos procurando o IP de destino desse endereço,
mas não a porta de destino 443.
Ela deve ser a porta 80 e agora está visível.
Vamos pressionar Enter.
Aqui está.
Aqui temos nossa conexão.
Portanto, o filtro está funcionando.
E, sim, se detectarmos o tráfego desse aplicativo móvel, não do navegador e deste aqui, por um bom tempo,
poderemos ter certeza de que estamos obtendo tudo.
Está bem.
Portanto, toda a tarefa relacionada a isso é identificar todas as conexões que o smartphone está fazendo
com esse aplicativo.
Muito bem, podemos encerrar este caso.
E agora temos certeza disso.
Sim, ele só está se conectando a quatro, quatro, três.
Agora vamos estabelecer nossa configuração de homem no meio.
Então, do que precisamos?
Primeiro, precisamos de nossa suíte para arrotos.
Em execução.
Está dentro do conjunto de ferramentas de arroto.
Está bem.
Criamos um projeto temporário e usamos as configurações padrão.
E depois entramos nas opções de proxy.
Selecionamos essa interface, adicionamo-la e, em seguida, selecionamos 1042 0. 1.
Se clicarmos em OK, veremos que ainda não temos o sinalizador de proxy invisível, e esse é um sinalizador muito importante.
Caso contrário, esses pacotes não serão reenviados.
Portanto, habilitamos também este aqui.
Pronto, agora temos nosso pacote burp em execução nessa interface.
O que precisamos fazer agora é encaminhar todos esses pacotes referentes às portas 80 e 403 de destino
HTTP e HTTPS para esse proxy aqui.
E podemos fazer isso com nossa famosa regra da tabela IP.
Então, vamos configurar isso.
Portanto, simplesmente fechamos este aqui.
Abrimos um novo terminal e precisamos de privilégios de root.
Está bem?
Agora, queremos criar uma nova regra de tabela IP na tabela, não a tradução de endereços de rede, o que significa
trocar os endereços IP em um pacote.
Queremos anexar uma nova regra.
Portanto, o A e queremos criar uma nova regra de pré-roteamento, o que significa que, se recebermos um pacote nessa interface,
queremos redirecioná-lo.
Em vez de ir diretamente para a Internet, queremos redirecioná-la para o nosso pacote de arrotos.
Este aqui.
1040 201 8080.
Exatamente.
Tudo bem.
Agora precisamos definir o tipo de pacote.
Portanto, o protocolo está relacionado a TCP e a porta de destino está relacionada a 443.
Se esse for o caso, queremos redirecioná-lo para o nosso destino e podemos fazer isso acrescentando
Dash D, não tradução de endereço de rede de destino Troque o endereço de destino desse pacote se ele chegar à nossa interface
e quisermos trocar o endereço para o destino 1042 0. um 8080.
Se isso foi um pouco rápido para você, preparei um vídeo inteiro em que nos aprofundamos
nessa sintaxe, então vamos descobrir o que cada parâmetro faz aqui.
Muito bem.
Agora estamos encaminhando todas as solicitações HTTPS, mas também vamos anexar HTTP no Wireshark.
Vimos que esse aplicativo não está usando nenhuma porta diferente, portanto, devemos ver todo o tráfego
agora mesmo se pudermos interceptá-lo.
Então, vamos encerrar por aqui.
Está bem.
Vamos colocar a suíte para arrotos ao lado.
Isso é bom.
E agora.
Agora estabelecemos nossa conexão Man in the Middle.
Vamos apertar este botão.
Enviar solicitação e fixação que falham.
Temos um atacante?
Sim.
Desta vez, temos, portanto, no painel, também podemos ver a conexão TLS para o exemplo. com falha.
Portanto, se clicarmos nesta, poderemos ver a segunda notificação.
E terceiro.
Portanto, tenho a sensação de que isso está realmente relacionado à nossa configuração.
Então, de alguma forma, esse aplicativo está determinando que não está sendo conectado ao servidor correto.
Portanto, há um atacante no meio disso.
Esse pode ser o motivo se você não tiver instalado o certificado.
Portanto, esse aplicativo ou esse smartphone pode não estar ciente de nossa autoridade sobre esse pacote de arrotos.
Portanto, vamos nos certificar de que o certificado seja conhecido por esse smartphone e que seja confiável.
Podemos verificar isso acessando as configurações, depois segurança, criptografia e credenciais, credenciais não confiáveis.
A porta do usuário está ativada.
Portanto, esse smartphone definitivamente confia em nossa suíte de arrotos aqui.
Vamos criar ou ter certeza de que você está abrindo este navegador da Web, uma nova guia anônima e vamos
abrir o exemplo https. com.
Está bem.
Sim.
No conjunto de arrotos, agora podemos ver que ele está destacado em laranja.
E essa é a nossa solicitação.
É uma solicitação HTTPS para quatro três.
Portanto, isso parece estar funcionando.
Desculpe, mas isso parece estar funcionando no momento.
Tudo bem.
Portanto, nosso certificado é conhecido pelo smartphone e está sendo confiável, mas esse aplicativo
é realmente paranoico.
E este aqui não confia em nós por qualquer motivo.
Portanto, se clicarmos em enviar solicitação.
Não, ele não aceita nosso certificado aqui.
Portanto, esse aplicativo precisa ter algum tipo de comparação com o certificado real.
E este aqui, o certificado falso.
Portanto, temos que reverter esse aplicativo e descobrir como ele está sendo implementado.
Vamos analisar isso.
Está bem.
Portanto, fechamos este aqui e também este aqui.
E agora, sim, vamos pegar esse aplicativo do diretório de downloads e colocá-lo no diretório de aplicativos
para criarmos um novo certificado fixando o hash de sublinhado.
Tudo bem, agora podemos usar gooey ou textura, como você preferir.
Quando brinquei com esse aplicativo, tive problemas em relação a todos, portanto, pode ser o motivo pelo
qual estamos executando a cópia de tela do pacote burp e, em seguida, outro aplicativo Java.
Portanto, você pode ficar sem memória em relação à sua instância Java.
Não tenho certeza se esse é o motivo por trás disso, mas sim, vamos tentar.
Então, vamos ver se o cara está lidando com isso.
Se isso não funcionar, voltaremos à abordagem do eclipse.
Também gosto da abordagem do eclipse.
Se você tiver alguns projetos grandes, quero dizer, este aqui não é um projeto grande, mas sim, não custa
nada usar o eclipse.
Também para projetos menores.
Muito bem.
Está bem.
Portanto, a primeira coisa que gosto de fazer é verificar o manifesto e os recursos do manifesto do Android.
Vejamos.
Estamos tendo a permissão da Internet.
Quero dizer, é claro que ele faz uma solicitação de serviço da Web.
Portanto, precisamos dessa permissão.
E depois temos uma atividade, que também é a atividade de lançamento.
Portanto, nosso código ocorrerá aqui.
Não temos nenhum outro material no momento.
Tudo bem.
Se formos para a direita, podemos ver este aqui, Configuração de segurança de rede do Android.
Daremos uma olhada nisso mais adiante.
Portanto, a configuração de segurança de rede é uma abordagem muito boa para realizar a fixação de um certificado, de modo
que possamos definir o tipo de fixação que queremos realizar: o certificado inteiro em si ou apenas em relação às impressões
digitais da chave pública.
E também podemos definir determinados domínios.
Portanto, esse arquivo de configuração deve ser suficiente para executar a fixação de um certificado e, portanto, deve ser suficiente
para que um desenvolvedor confie apenas na configuração de segurança de rede.
Mas o mundo real é diferente.
O mundo real está usando bibliotecas, o que é absolutamente bom.
E essas bibliotecas também têm suas próprias abordagens de fixação de certificados.
Portanto, na maioria das vezes, você encontrará essa configuração de segurança de rede e uma abordagem de fixação de certificado
na biblioteca que está sendo usada.
Nesse caso, também podemos identificar a biblioteca nos nomes dos pacotes à esquerda.
Portanto, essa é a biblioteca HTTP três e é muito popular.
Portanto, acho que 40% dos aplicativos que enfrento são relacionados a essa biblioteca.
Portanto, se você conseguir corrigir esse problema, estará pronto para começar.
E mesmo que você enfrente outra biblioteca, quero dizer que a abordagem é a mesma.
Portanto, temos essas duas abordagens, impressão digital e certificado bruto.
Está bem.
Portanto, foram muitas contribuições.
Agora vamos recapitular um pouco isso.
Temos um arquivo chamado network Security config, que está sendo usado para estabelecer uma fixação de certificado,
mas talvez não seja suficiente apenas corrigi-lo aqui, pois os desenvolvedores também podem implementar sua própria
fixação de certificado no código Java.
Muito bem.
Vamos tentar encontrar a fixação do certificado no código Java e depois voltaremos a esse arquivo
aqui.
Está bem.
Então, quer saber?
Acho que vamos simplesmente começar aqui, antes de mergulharmos no código Java, vamos simplesmente dar uma primeira olhada
neste aqui.
Acho que essa abordagem é um pouco mais fácil do que mergulhar diretamente no código Java.
Então, onde podemos encontrar esse arquivo?
Ele se encontra no diretório XML e se chama network security config.
Portanto, XML, hum, recursos, talvez configuração de segurança de rede XML.
Aqui está.
Ok, isso parece muito bom.
Temos nosso exemplo de subdomínio de inclusão. com.
Portanto, esse é o domínio que está sendo fixado.
Tudo bem.
E depois temos um conjunto de pinos.
Está bem.
Digerir SHA 256 e, em seguida, temos três hashes.
Portanto, este aqui é codificado em base64.
Podemos ver isso no ou identificar isso no sinal de igual no final, esse preenchimento.
Então, vamos pegar esse valor e simplesmente tentar decodificá-lo em base64.
D não parece ser tão promissor, então vamos passar o tubo XD.
Tudo bem, parece ser um hash, e este é um hash SHA 256.
Sim.
Está bem.
Então, agora vem a pergunta.
O que é esse hash aqui e como ele está sendo gerado?
Porque se você quiser corrigi-lo, precisamos entender de onde vem esse hash.
Caso contrário, sim, não saberemos o que fazer e como criar nosso próprio hash aqui.
Está bem.
Podemos descobrir isso dando uma olhada no certificado do exemplo. com.
Então, vamos dar uma olhada nisso.
Estamos usando o SSL aberto, portanto, o SSL aberto é uma ferramenta de linha de comando incrível e podemos fazer muitas coisas.
Além disso, podemos buscar o certificado no exemplo. com com e esse é o certificado que está sendo fixado.
Portanto, precisamos ter nossas informações armazenadas lá, certo?
Com certeza.
Vamos dar uma olhada.
Está bem.
Portanto, estamos usando o SSL aberto com o comando do cliente.
Esse é o Yeah, o comando do cliente que está fazendo uma conexão com o nosso alvo.
E também queremos fornecer o parâmetro show certs.
Portanto, queremos imprimir os certificados de nosso alvo e o alvo ao
qual precisamos nos conectar é o exemplo. com na porta 443 porque esses são os certificados que estão sendo fixados.
E vamos ver.
Ok, parece bom.
Podemos encerrar esse caso.
Está bem.
Não implementado.
Não nos importamos com isso.
Agora vamos ver.
O que temos aqui?
Tudo bem.
Parece um pouco estranho.
Com certeza.
Se você não estiver familiarizado com o SSL aberto, a situação pode parecer ainda pior.
Então, esse também foi o meu caso.
Mas acho que não precisamos entender tudo.
Aqui.
Certo, então vamos dar uma olhada nisso juntos.
O que temos aqui?
Estamos tendo três profundidades, portanto, estamos tendo três certificados.
O primeiro aqui é da Digicert Digicert.
É um Sim.
Autoridade conhecida e é uma autoridade confiável.
Portanto, essa é a CA raiz que está criando ou assinando outros certificados.
Em seguida, temos outro certificado, e esse é novamente da Digicert.
Portanto, agora temos dois certificados da Digicert.
Tudo bem.
Portanto, daremos uma olhada nisso mais tarde.
Mas, por enquanto, basta lembrar que temos uma CA raiz e também outro certificado da Digicert
e, em seguida, um terceiro certificado e este aqui.
E, por fim, isso é algo que sabemos.
Isso diz respeito ao Exemplo. org.
Ligamos para o Example. org?
Está bem.
Isso se refere ao mesmo exemplo. org e exemplo. com.
Tudo bem.
Portanto, esses são nossos três certificados no momento.
Por que temos três?
O motivo para isso é o seguinte.
Portanto, vamos fazer isso na mesa digitalizadora porque.
Sim, então é mais fácil explicar o que está acontecendo aqui.
Está bem.
Portanto, aqui estamos de volta à mesa digitalizadora.
E agora a pergunta é: o que está acontecendo aqui?
E o que está acontecendo com o exemplo. com?
Por que temos três certificados?
Um deve ser suficiente, certo?
Portanto, se este foi assinado por uma autoridade conhecida, por que precisamos de mais dois?
E o motivo para isso é o seguinte.
O primeiro é da Digicert e é a raiz.
CA Então, este aqui.
Tudo bem.
Essa raiz V8 também tem sua chave pública e privada, mas agora eles têm algumas regulamentações realmente rígidas em relação
a ela.
Portanto, um certificado raiz é um certificado muito importante.
Se esta, a chave privada desta, se perder, a Internet estará absolutamente em perigo.
Portanto, essa chave privada.
Precisa ser absolutamente superprotegido.
Portanto, precisamos de uma trava muito forte aqui.
Este, talvez seja ainda melhor.
Então, sim, como este aqui.
Está bem.
Portanto, a Digicert não ficará muito satisfeita se essa rota for comprometida.
Isso é algo que definitivamente precisamos evitar.
Caso contrário, a Internet não funcionará.
Portanto, a Digicert não está colocando o root ca em um risco adicional.
E a Digicert está criando algo chamado certificado intermediário.
E este aqui é o nosso segundo certificado.
E esse certificado não é tão difícil de regular como uma CA raiz Ter uma CA raiz é muito trabalhoso e perdê-la
seria absolutamente perigoso.
Eles criam outro certificado.
Este aqui.
Este é o certificado intermediário e este é o nosso segundo certificado.
Portanto, este também está sendo criado pela Digicert e agora está sendo assinado pela chave privada deste
aqui, o root ca.
Se este aqui, o segundo certificado, for assinado com a chave privada do
certificado raiz, então ele é exatamente tão confiável quanto este aqui.
Portanto, ambos são absolutamente confiáveis no momento.
Portanto, temos um certificado intermediário que é tão confiável quanto o certificado raiz em relação à nossa
autoridade aqui em relação à Digicert.
Tudo bem.
O que é bom nesse caso é que ele tem, obviamente, uma nova chave privada.
E esta aqui, é claro, também é uma chave privada, que é mantida bastante segura, mas não precisa
mais ser mantida tão segura.
Portanto, este aqui tem algumas normas rígidas.
Esse também precisa ser mantido em segurança.
Mas isso não é mais tão difícil porque, se esse certificado for comprometido, poderemos revogá-lo por meio do certificado
raiz.
Está bem.
Portanto, agora que temos o segundo certificado, temos, sim.
Muito menos pressão neste momento.
Portanto, esse pode ser usado agora para assinar certificados adicionais.
E, por exemplo, nosso terceiro, que é este e este, é agora nosso terceiro certificado.
E, por fim, este está relacionado ao nosso exemplo de domínio. com.
Portanto, agora esse certificado é assinado pela chave privada do certificado intermediário.
E este aqui.
E, com essa cadeia, podemos agora estabelecer essa relação de confiança.
Portanto, é de cima para baixo.
Este é absolutamente confiável.
Este também é confiável porque foi assinado com esta chave e agora este também está sendo confiável porque foi assinado
por uma autoridade conhecida ou legítima aqui.
Tudo bem.
Essa é a razão pela qual estamos tendo três certificados.
Este aqui é chamado de cadeia de certificados.
Assim como este aqui.
Está bem.
Isso não parece uma corrente, mas mesmo assim.
Portanto, isso é chamado de cadeia de certificados.
Está bem.
E todo o conceito dessa cadeia é, sim, ter esse certificado raiz em um local seguro e ainda criar uma relação de
confiança por meio de um certificado intermediário aqui.
Agora, o certificado foi assinado aqui.
Agora temos nossa assinatura.
Tudo bem.
E isso agora está sendo confiável, assinado pela Digicert.
Tudo bem.
Portanto, esse é o motivo pelo qual estamos tendo três certificados.
Perfeito.
Agora, já entendemos isso aqui.
Mesmo que você não entenda a saída do cliente SSL.
Mas também não precisamos fazer isso.
Tudo bem.
Está bem.
Então, vamos voltar à nossa VM do Ubuntu.
Está bem.
Portanto, estamos de volta à VM do Ubuntu e agora sabemos por que temos três certificados aqui.
Temos nosso certificado raiz e este.
Em seguida, temos nosso certificado intermediário, que é este aqui, e nosso certificado relacionado
ao aplicativo em si e este aqui. org.
Portanto, o certificado raiz criou ou assinou um certificado intermediário, que agora está sendo assinado
por esse certificado e, portanto, é confiável.
Muito bem.
Legal.
Também podemos ver esses certificados neste resultado aqui.
Temos essa bela tag, certificado inicial e certificado final.
E esta aqui é uma saída codificada em base64.
Portanto, isso está no formato PEM.
PEM significa simplesmente ter uma representação ASCII em base64.
O outro formato que encontramos por aí é o DER, que significa simplesmente uma representação binária desse certificado.
Portanto, os finais de arquivo dos certificados são apenas relativos à representação deles.
Muito bem.
Portanto, aqui temos o primeiro, depois temos o segundo e aqui temos o terceiro.
Mas a ordem é diferente e esta é a raiz.
CA Aqui temos nosso certificado intermediário, o que significa que este é agora o certificado deste aplicativo
e deste aqui.
Então, vamos copiar isso e dar uma olhada em como podemos fazer.
Sim, como podemos exibir este aqui?
Portanto, começamos no final e subimos até o início.
Fazemos o contrário.
Então, vejamos, estou abrindo um novo terminal e vamos para a fixação do certificado, hash com sublinhado.
E aqui criamos agora um novo arquivo de texto, que é o certificado PEM.
Tudo bem?
E simplesmente copiamos e colamos esse resultado neste arquivo aqui e pronto.
Agora podemos fechar esse arquivo.
Agora fechamos esse arquivo e simplesmente o abrimos com o navegador de arquivos.
Muito bem, aqui temos agora nosso certificado ponto PEM.
Se executarmos um arquivo sobre isso, vamos ver que ele também diz que está no certificado PEM e isso é no sistema Linux, não apenas em relação
a um final de arquivo, porque isso não importa, mas em relação à própria estrutura
do arquivo.
Portanto, mesmo que você renomeie esse certificado ponto pem para certificado ponto bin, por exemplo, e execute um comando de arquivo
mais uma vez, poderemos ver que ele ainda é um certificado.
Tudo bem, vamos desfazer isso.
Portanto, do compartimento de volta ao PEM.
Está bem.
A maneira mais fácil de visualizar esse arquivo é simplesmente clicar duas vezes nele.
Então, sim, ao dar um clique duplo, podemos ver isso agora mesmo.
Podemos ver a verificação pelo digicert e as identidades Example. org.
Agora vamos aumentar um pouco o tamanho, pois há muitas coisas aqui.
Se clicarmos em detalhes, também poderemos ver quando ele expira.
Portanto, nesse estágio, o certificado precisa ser renovado, caso contrário, não será mais aceito.
Isso é muito importante para a administração dessa infraestrutura que o administrador controla.
Este aqui.
Aqui podemos ver o país, o estado e assim por diante.
Emissor Digicert.
Está bem.
E aqui temos agora uma impressão digital do certificado.
Oh, isso parece absolutamente promissor.
Temos o SHA1 e um hash MD5.
Portanto, esta aqui é uma espécie de impressão digital de todo o certificado.
Daremos uma rápida olhada no que é o hash em breve.
Mas, por enquanto, vamos dar uma olhada nesse arquivo aqui.
Está bem.
Em seguida, também obtivemos essas informações de chave pública.
E esta, agora, é a chave pública desse certificado.
Podemos ver que ele tem um algoritmo RSA.
Esses são os principais parâmetros.
Temos o tamanho da chave, e esta é uma impressão digital dessa chave e esta é a chave pública em uma representação
de bytes.
Ok, próximo, vamos ver.
Temos alguns nomes alternativos de assuntos.
Portanto, esse certificado também está sendo aceito.
Por exemplo, ponto org ou com.
É por isso que não recebemos o erro de certificados.
Muito bem.
Então, vamos ver o que há mais dentro do certificado aqui.
Então vamos ver.
Sim, esta assinatura, esta é a última e mais importante parte aqui.
A assinatura foi criada com a chave privada da Digicert.
Portanto, agora que temos a chave pública da Digicert, podemos verificar se esse certificado foi realmente assinado
pela Digicert.
Portanto, esta é talvez a parte mais importante aqui.
Isso comprovará que o certificado foi assinado por uma autoridade conhecida.
Em breve, descobriremos por que não é possível falsificar o certificado aqui.
Mas, por enquanto, vamos fazer uma rápida recapitulação.
Portanto, no final, temos a assinatura aqui, e isso provará que o certificado foi assinado
por uma autoridade conhecida com a chave privada da autoridade.
Tudo bem.
E, se subirmos, veremos que temos duas impressões digitais.
Uma é a impressão digital do certificado, esta aqui e uma é a informação da chave pública.
E ele também tem uma impressão digital.
E este aqui.
Está bem.
Então, agora vem a pergunta.
Se essas são as impressões digitais que estão sendo verificadas em nosso aplicativo, precisamos saber como elas estão sendo
criadas, pois, caso contrário, não poderemos criá-las para o nosso próprio certificado.
E também não podemos substituir esses valores.
Está bem.
Mas antes de nos aprofundarmos nesse assunto, vamos primeiro dar uma olhada no que é uma impressão digital.
E você pode realmente pensar em uma impressão digital como, sim, como se nós humanos tivéssemos isso.
Portanto, uma impressão digital para nós, como seres humanos, está sendo um identificador para nós como pessoa.
E o mesmo acontece com este certificado aqui.
Portanto, uma impressão digital é um tipo de identificador.
E este está sendo construído sobre o hash.
Nesse caso, temos dois hashes aqui.
Temos um hash SHA e também um hash MD5.
Esses são apenas algoritmos diferentes, mas o princípio do hash é o mesmo.
Portanto, vamos primeiro descobrir o que é o hash, pois assim poderemos entender o que esses valores aqui
significam e, então, poderemos descobrir como construí-los por conta própria.
Não se preocupe, fazemos isso em um nível muito alto e em um período de tempo muito curto.
Muito bem.
Está bem.
Vamos voltar para o tablet gráfico e dar uma olhada nisso.
Tudo bem.
Portanto, estamos de volta ao nosso tablet gráfico.
E agora vamos dar uma olhada em como funciona uma função hash, porque se você entender o que uma função hash
faz, então poderemos entender tudo em nossa abordagem de fixação de certificado.
Saberemos por que um invasor não consegue falsificar ou falsificar um certificado antigo.
Também saberemos por que esses hashes estão sendo fixados.
E, por último, mas não menos importante, aprenderemos como criar nossos próprios hashes com base na certidão de nascimento,
para que possamos substituí-los pelo original e, posteriormente, também.
Homem no meio.
Esse aplicativo parece absolutamente perfeito, certo?
Portanto, vamos dar uma olhada nesse caso.
Existem muitas abordagens que tentam explicar o que a função hash faz, e a maioria delas
se refere a duas cores.
Mas, em minha opinião, Bob Ross é o único que deve brincar com as cores e, portanto, gosto de
adotar uma abordagem diferente.
Este aqui.
Portanto, fazemos isso de forma muito visual em um nível elevado.
Isso pode não ser 100% preciso, mas se você obtiver esse ponto de uma função hash aqui, isso é tudo o que importa
no momento.
Está bem?
Portanto, vamos dar uma olhada.
Tudo bem.
Então, vamos começar aqui.
E, como já mencionado, fazemos isso de forma muito visual.
Você pode pensar o que daqui a pouco, mas deixe-me tentar explicar isso depois.
Está bem.
Então, começamos com uma maçã, esta aqui.
Tudo bem.
Acho que essa é uma maçã muito bem desenhada.
Sim.
Talvez o melhor que eu já tenha desenhado até agora.
Muito bem.
Abaixo dessa maçã, temos agora nossa função hash.
E, nesse caso, ele está sendo um misturador.
E vamos ver se isso funciona bem.
Está bem.
Acho que não tem problema.
Essa é agora a nossa função hash.
E, abaixo dessa função hash, temos nossa saída e armazenamos essa saída aqui no vidro.
Vamos fazer isso aqui.
Se pegarmos nossa maçã e a colocarmos no misturador, e depois no misturador, a função hash estará realizando
várias coisas.
Portanto, nesse caso, o mixer está fazendo suco com a maçã.
E obtemos isso como um resultado aqui.
Ok, agora temos suco de maçã.
Então, este aqui é suco de maçã.
Tudo bem.
E esse é o princípio da função hash.
Quero dizer, não fazer suco, mas ter a seguinte abordagem.
Se tivermos nossa entrada e a colocarmos em uma função hash, obteremos uma saída.
Até agora, tudo bem.
Mas agora é o ponto importante em uma função de hash, não podemos voltar atrás.
Portanto, é absolutamente impossível voltar da nossa saída para essa entrada.
Nesse caso, nunca mais poderei fazer uma maçã com esse suco.
Não tenho certeza quanto a você, mas, para mim, isso definitivamente não é possível.
E esse é exatamente o princípio de uma função hash.
É uma operação unidirecional.
Temos uma entrada aqui.
Executamos várias operações e recebemos um resultado.
Mas não podemos voltar da saída para essa entrada aqui.
Isso não é possível com uma função hash.
Isso seria possível se este tivesse sido criptografado, simétrica ou assimetricamente, mas não é o caso
aqui.
Portanto, uma função de hash não é um tipo de criptografia.
Trata-se de uma função de hash.
No entanto, esses termos, criptografia e hash, são frequentemente misturados, o que é completamente errado.
Tudo bem.
Criptografia significa que podemos voltar à entrada tendo a chave de criptografia assimétrica, ou algo assim.
Mas na função hash, não podemos voltar atrás.
E esse princípio pode ser muito útil.
Por exemplo, digamos que você tenha um aplicativo da Web e este aplicativo da Web aqui, que agora tem
dois campos de entrada.
Uma é referente ao nome de usuário e a outra é referente à senha.
Está bem?
E agora o administrador tem a tarefa de armazenar as senhas de forma segura, o que significa que, se o administrador
não tiver permissão para visualizá-las, não poderemos usar algum tipo de criptografia.
Caso contrário, o administrador pode simplesmente descriptografá-las e recuperar as senhas em texto claro.
E é exatamente nesse ponto que uma função hash é muito útil.
Então, digamos que temos esse banco de dados aqui.
Portanto, agora não se trata mais de um copo.
Esse é agora o banco de dados que está sendo armazenado ou que armazena essas senhas.
Muito bem.
Esse é o nosso banco de dados.
E tudo o que precisamos fazer agora é o encaminhamento.
Então, pegamos a senha do usuário e a colocamos em uma função hash, esta aqui.
Em seguida, recebemos de volta nosso resultado, que agora é o hash.
E, em vez de armazenar a senha em texto claro, agora estamos armazenando o hash nesse banco de dados aqui.
Portanto, este é agora o hash desse usuário aqui.
Isso significa que, se não conseguirmos acessar a senha de texto não criptografado, também não poderemos ver qual
é a senha real desse usuário aqui.
Está bem.
Tudo bem.
Mas agora a pergunta é: como podemos ter certeza de que o usuário digitou a senha e a abordagem corretas?
Quero dizer, é bem simples.
Se o usuário digitar agora uma senha, por exemplo, teste, tudo o que precisamos fazer é colocar essa senha
nessa função hash, na mesma função hash aqui.
Em seguida, comparamos esses dois resultados.
Nesse caso, podemos ver que este é verde e este é um tipo de roxo.
Vamos chamá-lo de roxo, o que significa que são cores completamente diferentes.
E o mesmo acontece com esses hashes.
Portanto, esses hashes não estão nem perto de serem idênticos, o que significa que o usuário obviamente digitou
uma senha errada.
E agora podemos verificar isso mesmo que não saibamos a senha de texto não criptografado desse usuário,
o que é incrível, certo?
Com certeza.
Portanto, acho que esse exemplo não é tão ruim quanto eu pensava no início.
Vamos nos ater a este com o aplicativo da Web e, portanto, vamos fazer uma separação aqui.
E agora vamos voltar à segunda parte importante sobre a função hash.
A segunda parte importante sobre a função hash é a seguinte.
Digamos que nesta saída aqui, esta é a senha.
TSD Portanto, se o usuário digitar a senha aqui no teste, há apenas uma pequena diferença nessa senha,
apenas uma única letra.
E agora a segunda parte importante sobre o hash é que, por mais idênticos que sejam, se não estiverem sendo
completamente idênticos, o resultado será absolutamente diferente.
Assim, poderíamos ter presumido que a primeira parte poderia ser
idêntica e que esta aqui é TS e esta aqui também é TS.
Portanto, essa parte poderia ter sido idêntica, mas não em uma função de hash.
Mesmo se alterarmos um único bit em um valor de entrada, obteremos uma saída completamente diferente.
E é por isso que essa função hash é tão útil.
Com relação à fixação de certificados, por exemplo, digamos que temos nosso certificado, agora estamos fazendo hashing
de determinados valores no certificado e armazenamos esses hashes.
Agora podemos ter certeza de que um certificado está sendo representado comparando esses hashes com o do
outro certificado.
Se esse é o certificado que estamos esperando ou não, caso não seja, podemos abortar essa conexão.
E são exatamente esses hashes que estão sendo comparados.
Portanto, vamos dar uma olhada em nossa abordagem de fixação de certificados aqui e como tudo isso
se aplica a esses hashes.
Mas tenha em mente esta imagem.
Este aqui diz respeito à maçã e ao suco, porque pode ser útil se você quiser analisar ou entender
o que a nossa abordagem de fixação de certificados faz.
Muito bem.
Agora, vamos levar essa abordagem de hashing de volta à nossa fixação de certificado e descobrir o que
essas impressões digitais significam e também por que não é possível falsificar o certificado.
Muito bem.
Está bem.
Portanto, já vimos nosso certificado antes.
Este aqui.
E esse consiste em campos muito importantes.
Um deles, por exemplo, é o nome comum.
O nome comum é simplesmente o nome de domínio para o qual esse certificado foi criado.
Em nosso caso, é apenas um exemplo. org.
Tudo bem.
Até agora, tudo bem.
Em seguida, também vimos que esse certificado inclui uma chave pública e esta aqui.
E agora também sabemos por que isso acontece.
A chave pública será enviada ao cliente.
E essa chave pública será usada posteriormente para criptografar um segredo que foi criado pelo cliente.
Portanto, o cliente está enviando de volta o segredo criptografado e somente a pessoa que tem a chave privada.
Nesse caso, o servidor é capaz de descriptografar esse pacote e receber essa chave simétrica.
Depois disso.
Toda a conexão será criptografada com essa chave simétrica aqui.
Portanto, esse é o motivo pelo qual o certificado também inclui uma chave pública.
Depois, também vimos a impressão digital dessa chave pública e agora as coisas começam a ficar interessantes.
Então, o que é essa impressão digital?
Portanto, a impressão digital é simplesmente a nossa chave pública, que foi colocada em uma função
de hash, esta aqui.
Portanto, se pegarmos nossa chave pública e a colocarmos nessa função de hashing, obteremos de volta esse hash
de saída, por exemplo, e essa é agora a impressão digital de nossa chave pública.
Aprendemos anteriormente que, se alterarmos apenas um único bit nessa entrada, a impressão digital ou a saída
aqui será completamente diferente.
Portanto, com esse valor aqui, podemos simplesmente reconhecer ou comparar.
Se essa chave pública for exatamente a que estamos esperando no momento.
Portanto, essa é agora a impressão digital da chave pública, algum tipo de identificador para ela.
O motivo pelo qual estamos usando um hash e não apenas a chave pública inteira é que o hash é muito menor.
Portanto, o que fazemos é simplesmente criar um hash dessa chave pública.
E agora estamos anexando esse hash ao certificado.
Portanto, esse é o identificador dessa chave pública aqui.
Portanto, vamos fazer isso.
Então, pegamos este aqui e o anexamos também ao nosso certificado.
Tudo bem.
Por último, mas não menos importante, temos a assinatura.
E essa talvez seja a parte mais importante de todo esse certificado.
A assinatura foi criada com a chave privada do certificado G.
Portanto, essa é a prova de que esse certificado está sendo confiável por uma autoridade conhecida.
Isso também significa que, com a chave pública do digicert, podemos verificar se essa assinatura foi
realmente criada com a chave privada do G.
Portanto, a chave pública é pré-entregue em nosso smartphone.
Portanto, essa é uma autoridade conhecida e temos muitas chaves públicas de autoridades conhecidas em nosso smartphone
aqui.
Tudo bem.
Portanto, este é o aspecto do nosso certificado no momento.
Está bem.
Portanto, esse é o nosso certificado em um nível muito alto.
Há muito mais coisas incluídas aqui.
Mas esses são os campos mais importantes para nós no momento.
Muito bem.
Está bem.
Agora vamos falar sobre falsificação ou falsificação de um certificado.
Por que isso não é possível?
Digamos que temos um invasor e este aqui, e o invasor agora está criando seu próprio certificado neste
aqui.
Portanto, o invasor deseja criar um certificado para o Example. org.
Tudo bem.
Isso não é absolutamente nenhum problema.
Podemos criar um certificado para qualquer nome comum que desejarmos.
Portanto, vamos copiar e colar isso em nosso certificado.
E lá vamos nós.
Agora estamos tendo um certificado, por exemplo, ponto org.
Em seguida, precisamos de algum tipo de chave pública, pois essa chave pública será usada para criptografar a chave simétrica
posteriormente.
Portanto, não podemos simplesmente usar este aqui, porque se copiarmos e colarmos este em nosso certificado,
vamos fazer isso.
Então, o cliente está criptografando o segredo com essa chave pública e não temos a chave privada
correspondente para ela.
Portanto, não podemos descriptografar esse pacote posteriormente.
Portanto, isso é ruim.
Portanto, precisamos criar nossa própria chave pública e colocar essa chave pública nesta aqui, pois assim
também teremos essa chave privada e poderemos descriptografar esse pacote depois.
Muito bem.
Certo, então vamos mudar isso aqui em nossa chave pública agora mesmo.
Está bem.
Mas isso também significa que precisamos fornecer nossa impressão digital para essa chave pública aqui.
Mas isso também não é problema.
Certo?
Então, simplesmente pegamos nossa função de hash aqui e agora colocamos nossa chave pública nessa função de
hash e recebemos um resultado.
E esta aqui, que agora é a impressão digital de nossa chave pública.
Quero dizer, é claro, é completamente diferente porque nossa chave pública é diferente.
Então, pegamos esse resultado agora, este aqui, e o anexamos ao nosso certificado.
Tudo bem.
Agora temos uma chave pública e a impressão digital correspondente.
Ok, próximo.
Vejamos.
Temos a assinatura aqui.
Vamos também copiar e colar isso em nosso certificado e ver se está funcionando.
Está bem.
E agora criamos o certificado aqui.
E isso deve funcionar agora mesmo.
Deveria?
Bem, não, o motivo para isso é a assinatura.
A assinatura será construída sobre todo o certificado.
Sobre todo esse certificado aqui.
E esse é um algoritmo criptográfico muito forte que está acontecendo aqui.
Não vamos nos aprofundar muito nisso, mas essa assinatura verificará se esses dados estão corretos.
Portanto, esse é o motivo pelo qual a autoridade assinou o certificado aqui.
Portanto, a autoridade colocou sua assinatura nesse certificado.
E agora, se alterarmos alguns dados no certificado, como à direita, a assinatura não corresponderá
mais ao certificado.
Portanto, a assinatura não se aplica aos valores aqui.
E esse certificado não será aceito por nenhum cliente no momento porque, ao termos a chave pública dessa autoridade,
essa autoridade digicert no momento, podemos verificar se essa assinatura está correta em relação a todo
o certificado.
E, à direita, não é porque alteramos muitos valores e precisamos alterar esses valores porque,
caso contrário, não poderemos usar o certificado.
Portanto, esse é o motivo pelo qual não podemos simplesmente clonar um certificado falso ou falsificado aqui com valores
diferentes.
Portanto, precisamos criar nosso próprio certificado que não tenha sido assinado por uma autoridade conhecida.
Mas então precisamos fazer com que o aplicativo confie em nós.
Então, como essa abordagem de fixação está funcionando no momento?
Vamos dar uma olhada nesse caso.
Portanto, no canto superior direito, temos agora nosso certificado autoassinado como um invasor.
Vamos dar uma olhada em como a abordagem de fixação de certificados se relaciona com essas impressões digitais.
Porque se entendermos como esses valores estão sendo verificados ou gerados, poderemos
substituí-los.
Muito bem.
E vamos dar uma olhada.
Digamos que temos um smartphone aqui e que ele está tentando se conectar a este servidor.
Agora, presume-se que o servidor seja um exemplo. org e, portanto, o servidor está representando o certificado.
Este aqui.
Está bem.
Portanto, podemos ver que esse é exatamente o mesmo certificado que o cliente espera ter.
Agora, vamos ver o que o cliente pode fixar nesse certificado aqui.
Portanto, vimos duas impressões digitais.
Um era referente ao certificado inteiro, e este é simplesmente colocar o certificado
inteiro e este aqui em um algoritmo de hash.
E esse resultado agora pode ser parecido com o seguinte.
Está bem.
Se agora levarmos esse resultado para o nosso aplicativo cliente, poderemos nos certificar de que esse
certificado é o correto ou o que estamos esperando no momento, porque também aprendemos que se invertermos
um único bit em todo o certificado e, por exemplo, este bit aqui, todo o resultado será diferente.
Portanto, se esse certificado for verificado agora, colocaremos esse certificado nesse algoritmo
de hash como saída aqui.
Este aqui.
Agora é completamente diferente.
E agora o aplicativo pode simplesmente verificar isso.
Portanto, o aplicativo está esperando esse valor aqui, mas recebe esse valor, o que significa que o certificado não é
o que estamos esperando no momento.
Portanto, estamos encerrando essa conexão com esse servidor aqui.
Portanto, essa é uma possibilidade de verificar se esse certificado é o correspondente que estamos esperando no
momento.
A outra é referente à chave pública desse certificado.
Portanto, se colocarmos essa chave pública nessa função de hashing, geraremos uma impressão digital dessa chave
pública.
E agora podemos levar a impressão digital dessa chave pública para o nosso aplicativo cliente.
Portanto, esse é copiado em nosso aplicativo cliente.
Agora, se você estiver vendo um certificado com essa chave pública aqui, pode ter certeza de que
esse é o certificado que estamos esperando no momento.
Caso contrário, se o invasor deixar essa chave pública original no aplicativo, ou seja,
ela será usada para criptografar a chave simétrica criada pelo cliente.
Falamos bastante sobre isso na seção HTTPS.
Portanto, o invasor precisa substituir esse valor, caso contrário, ele não obterá nenhum valor
dessa conexão aqui.
Portanto, se você verificar essa chave pública, poderemos ter certeza de que esse é o certificado.
Queremos ter que criar nossas próprias impressões digitais.
No momento, tudo o que precisamos fazer é pegar o certificado do invasor e colocar todo
o certificado nos algoritmos de hash.
Ou só precisamos colocar a chave pública nesse algoritmo de hash.
Estas são as duas impressões digitais que podem ser verificadas neste aplicativo aqui.
O último exemplo é a verificação de todo o certificado, de modo que também podemos aplicar todo o certificado
a esse aplicativo cliente e, em seguida, verificar se este aqui é o que está correspondendo ao servidor.
Portanto, essas são as duas principais abordagens.
Verificar as impressões digitais de um certificado antigo ou apenas a chave pública ou colocar um certificado antigo
em um aplicativo cliente.
Muito bem.
Está bem.
Por último, mas não menos importante, há a seguinte pergunta: Por que devemos verificar apenas a chave pública e não
o certificado inteiro em relação à impressão digital?
O motivo para isso é o seguinte O certificado expirará em um futuro próximo.
Portanto, acho que, com relação a dois certificados oficiais, eles duram apenas um ou dois anos.
E agora, se fizermos a impressão digital de todo o certificado, ou seja, de cada bit do certificado, também precisaremos
atualizar nosso aplicativo.
Caso contrário, a fixação do certificado falhará porque alteramos e valorizamos em nosso certificado a
data de expiração.
Portanto, o resultado desse hash será completamente diferente.
Ok, então aprendemos muito por aqui.
Já vimos o que é a função hash, por que ela é útil?
E também vimos por que não podemos simplesmente falsificar ou falsificar um certificado.
Também falamos sobre a fixação de um certificado.
É por isso que temos várias abordagens diferentes para o certificado de pino e também que o desenvolvedor
tem a possibilidade de incluir todo esse certificado em seu aplicativo.
Tudo bem.
Portanto, isso foi muito.
Agora, antes de terminarmos este vídeo, vamos dar uma olhada rápida em como essas somas de hash estão sendo geradas.
A chave pública e a impressão digital de todo o certificado, pois assim você também pode executar
essa abordagem para o certificado do burpsuite por conta própria.
Mas também discutiremos isso juntos no próximo vídeo.
Muito bem.
Está bem.
Portanto, vamos voltar para a VM do Ubuntu e dar uma olhada em como esses hashes estão sendo gerados.
E vamos lá.
Bem, aqui estamos de volta à VM do Ubuntu.
Agora vamos dar uma olhada no arquivo de certificado e em como esses hashes estão sendo gerados.
Começaremos com a primeira, que se refere a todo o certificado.
Esta aqui, a impressão digital do certificado.
Portanto, aqui temos o hash SHA1 do certificado e aqui temos o hash MD5 do certificado.
Esses algoritmos são diferentes, mas a entrada foi a mesma.
O arquivo de certificado está aqui.
Vamos dar uma olhada em como podemos calcular isso por conta própria.
Então, entramos nesse diretório onde o certificado foi armazenado.
Está dentro do ABS e da fixação de certificados, hash sublinhado.
E aqui está.
Sim.
Tudo bem.
Agora, usamos o SSL aberto ou estamos usando o SSL aberto para pegar todo esse certificado e executar nossa ação de impressão digital.
Então, levamos o certificado para nossos algoritmos de hashing e esperamos obter os mesmos valores
aqui.
Então, digitamos open SSL e estamos usando o parâmetro X509, porque esse é um parâmetro para interagir com
certificados.
Vamos dar uma olhada na ajuda porque, sim, talvez não nos lembremos de todos esses parâmetros agora.
Está bem.
Temos nosso arquivo.
Este é o nosso certificado.
Temos um formato de entrada.
Vejamos.
Considerando que, neste caso diretamente acima, precisamos fornecer isso.
Este está em um certificado PEM.
E então vamos ver este aqui.
A impressão digital.
Tudo bem.
Esses são todos os parâmetros de que precisamos no momento.
Portanto, vamos fazer isso.
Então, deixe-me aumentar um pouco o tamanho.
Pronto, abra o SSL x509.
Depois, temos a impressão digital.
Temos como em arquivo, nosso arquivo de certificado e como em formulário, temos em PEM.
Aqui está.
Temos a impressão digital SHA one na parte superior e o certificado também está sendo impresso.
Se não quisermos ter isso, basta fornecer o parâmetro.
Não, fora.
Aqui está.
Agora só temos esse hash.
Vejamos.
0 a 8 e termina com ca a a se verificarmos isso e 0A28 ca a a.
Está bem.
Agora sabemos como esse hash está sendo calculado.
Legal.
Portanto, esse é o hash referente à impressão digital.
Também podemos fazer isso com o MD5 simplesmente trocando os algoritmos.
Talvez também possamos fazer isso rapidamente.
Está bem.
Portanto, tudo o que precisamos fazer é simplesmente anexar os algoritmos que queremos usar, neste caso o MD5.
Vamos fazer isso rapidamente.
Está bem.
Então, aqui estamos de volta ao nosso comando.
E se usarmos isso mais uma vez, mas desta vez quisermos aplicar um algoritmo MD5.
Vamos ver.
Aqui está.
Agora temos a impressão digital MD5 e três KB A1ED7
reserva um e, d sete.
Certo, então estou comparando apenas o início e o fim desses hashes porque.
Sim, então tenho certeza de que isso combina.
É claro que pode ser uma grande sorte o fato de um invasor ter fornecido um certificado com
o início e o fim desses valores.
Mas, sim, não com relação a esse exemplo aqui.
Agora vamos dar uma olhada na impressão digital da nossa chave pública e nesta aqui.
Portanto, aqui temos nossas informações de chave pública.
E aqui temos a impressão digital de nossa chave pública.
Está bem.
Portanto, um desses dois hashes pode ser o que está sendo fixado aqui em nossa configuração de segurança de rede.
Portanto, vamos verificar também a geração dessa chave pública e, em seguida, comparar esses valores
com eles aqui.
Está bem.
Tudo bem.
Então vamos ver.
A chave pública.
Está bem.
A primeira coisa que precisamos fazer é extrair a chave pública desse certificado.
Quero dizer, o que podemos fazer é o seguinte.
Poderíamos simplesmente pegar o certificado e, sim, copiar e colar esses valores em um único arquivo.
Mas essa não é uma abordagem para nós no momento.
Ou seja, somos preguiçosos e somos hackers.
Deve haver uma maneira diferente, e a maneira diferente é absolutamente correta.
Abrir SSL.
Então vamos ver.
Agora, queremos separar a chave pública do arquivo de certificado.
Portanto, vamos dar uma olhada.
OpenSSL, Queremos executar algumas ações com esse certificado.
Portanto, temos o parâmetro x509 e, ao executar a ajuda do traço.
Vamos dar uma olhada nesse caso.
E lá vamos nós.
E a chave pub gera a chave pública.
Portanto, esse comando produzirá essa chave pública no certificado.
Portanto, o OpenSSL x509, como no arquivo, ainda tem nosso certificado PEM.
O inform ainda é Pam e queremos imprimir a chave pública.
É isso aí.
Essa é a chave pública e o certificado.
Agora só queremos ter essa chave pública.
Portanto, fornecemos o parâmetro.
Não há saída.
E aqui está.
Agora podemos salvar isso em uma chave de pub de arquivo separado.
Tudo bem.
Agora extraímos essa chave pública.
Super fácil, certo?
Agora, na simulação, executamos as mesmas ações mais uma vez nesse arquivo de chave pública.
Com certeza.
Mas, infelizmente, esse não é o caso.
Portanto, essa chave pública está em um arquivo diferente do certificado.
Também podemos verificar isso aqui.
Se executarmos um arquivo em nossa chave pública, veremos que agora é um texto ASCII.
E se você executar um arquivo em nosso certificado, Pam, podemos ver que ele agora é um certificado PEM.
Portanto, em nossa abordagem que vimos anteriormente, não há essa opção para inserir a chave pública como um arquivo
de entrada.
Ela só diz respeito a dir e PM e, portanto, para calcular a impressão digital da chave pública, temos que dar uma
olhada novamente no certificado.
E aqui podemos ver que temos os algoritmos de chave RSA.
Portanto, em vez de usar o OpenSSL x509, agora precisamos usar o OpenSSL RSA.
Portanto, vamos dar uma olhada nesse caso.
Ajuda do Open SSL, RSA.
Ok, conseguimos informações.
Podemos ver o RPM, mas esse não é o caso.
E lá vamos nós.
Chave pública.
Espera uma chave pública como um arquivo de entrada.
É exatamente isso que queremos ter.
Portanto, o que precisamos fazer é usar o OpenSSL, RSA.
Em seguida, temos nosso arquivo in, que agora é a chave pública e o inform.
Desculpe, fiquei confuso por um segundo.
Não informamos que estamos usando int público.
Portanto, isso também é um pouco confuso para mim no momento.
Tudo bem.
E o formulário de saída é algo que podemos fornecer.
Queremos ter o formulário de saída em um formato binário.
Tudo bem.
Está bem.
Vejamos.
Sim, é isso mesmo.
Essa é agora a chave pública no formato binário.
Agora podemos usar o OpenSSL mais uma vez para aplicar nosso hash sobre esses valores binários.
Portanto, se as imprimirmos, poderemos vê-las aqui.
30, 82, e assim por diante.
São os mesmos?
32.
30.
82.
E assim por diante.
Tudo bem.
Esses são exatamente os mesmos valores aqui.
Essa etapa está correta.
Legal.
Agora, podemos aplicar nossa soma SHA1 sobre esse conteúdo binário aqui do conteúdo binário
dessa chave pública em vez de usar o xkcd.
Agora estamos usando o OpenSSL mais uma vez e queremos ter o resumo do SHA um desse algoritmo.
Portanto, isso fornecerá uma soma de SHA um sobre esse conteúdo.
Vejamos.
Aqui está.
Essa é agora a nossa primeira soma SHA.
Vamos verificar esse valor.
Aqui está.
Cinco e a5 e.
Se você colocá-los lado a lado, cinco E a5 e4 e termina com F693F693.
Tudo bem.
Legal.
É assim que podemos calcular esses valores.
A impressão digital da chave pública e também a impressão digital de todo o certificado.
Você também encontrará essas informações, é claro, em sua folha de dicas para não ter que assistir
a todo o vídeo.
Você pode encontrá-los aqui.
Agora, vamos comparar esses valores com os que vimos na configuração de segurança de rede.
Portanto, o que precisamos fazer é simplesmente aplicar nossa codificação base64 depois.
Mas primeiro vamos verificar se esses hashes são realmente SHA1 e vamos dar uma olhada.
E lá vamos nós.
Agora temos 256 hashes SHA.
Em vez de usar o SHA um, precisamos fornecer um hash SHA 256.
Ok, isso não é um grande problema.
Tudo o que precisamos fazer é simplesmente alterar o SHA 1 para o SHA 256.
É isso aí.
Agora, vamos também executar o formato de codificação base64 sobre este.
Está bem.
Se simplesmente anexarmos agora o Base64 a este, isso não funcionará porque a cifra básica também incluirá
o texto aqui padrão no sinal de igual e coisas do gênero.
Portanto, precisamos extrair esse valor e também executar a codificação base64 sobre esse valor.
E podemos fazer isso simplesmente fornecendo esse parâmetro dash binary.
Vamos verificar isso rapidamente.
Ok, aqui está o resultado.
Vamos verificar isso rapidamente.
Nós canalizamos isso para o xkcd e agora temos nossa chave.
Podemos ver isso aqui.
Essa é a correta.
Está bem.
E agora, em vez de usar o xkcd, podemos usar a base64 para codificar isso.
Esse é agora o nosso hash que precisa ser verificado.
Portanto, a luta que temos ao executar esse comando aqui é a seguinte.
Precisamos fornecer os algoritmos corretos.
Ok, isso não é um grande problema.
Mas também precisamos ter em mente que a codificação base64 dessa saída aqui não deve ter nada a ver com
essas coisas, como padrão em sinal de igual e assim por diante.
Deve ser apenas sobre esse valor e, portanto, precisamos ter esse parâmetro aqui que imprime
apenas o conteúdo binário que é listado aqui, executando-o posteriormente.
Uma base64.
Desculpe, este está acima deste valor.
Em seguida, recuperamos nosso hash real.
Portanto, este aqui é o comando final que queremos usar para calcular nossa impressão digital codificada em base64.
Muito bem.
Está bem.
E agora vamos pegar esse valor e dar uma olhada na configuração de segurança da rede.
Vamos ver m m para 9UA igual.
Está bem.
Esse valor é exatamente esse.
Mas talvez devêssemos ter certeza de que esse valor é realmente esse.
Hum, sim, vamos colar aqui.
Então, esse é o valor de copiar e colar.
E se formos compará-los agora, vamos fazer a comparação do homem pobre.
Portanto, logo acima.
Parece perfeito.
Sim.
Portanto, esse é definitivamente o hash que está sendo fixado.
Tudo bem.
Fantástico.
Agora sabemos como esse hash está sendo gerado.
Podemos calcular isso por conta própria e simplesmente substituir isso aqui para contornar a fixação do certificado.
Certo.
Infelizmente, há uma última coisa que precisamos discutir agora e, então, encerraremos este tópico.
Está bem.
Portanto, se você der uma olhada na configuração de segurança de rede e nesta aqui, esses são agora os hashes
que estão sendo impressos.
Este é o hash do exemplo. com e este pode ser o hash do certificado intermediário
e este pode ser o hash do certificado raiz.
Está bem.
Se criarmos nosso próprio certificado ou se tivermos nosso próprio certificado, o pacote
burp, poderemos simplesmente excluí-los aqui e substituí-los aqui.
Não se preocupe, faremos isso no próximo vídeo apenas em um exercício prático juntos.
Tudo bem.
Mas o problema com esse arquivo aqui é o seguinte.
O sistema Android mudou muito e mudou bastante em relação à configuração de segurança de
rede na versão 7 e posteriores, o que significa que agora estamos tendo o seguinte problema.
Se dermos uma olhada na configuração de segurança de rede na documentação do desenvolvedor do Android, vamos fazer
isso aqui.
Configuração de segurança de rede.
Android.
Portanto, aqui temos uma rápida introdução a esse arquivo e também discutiremos isso mais detalhadamente
no próximo vídeo.
Quero apenas lhe mostrar o seguinte.
A configuração de segurança de rede foi alterada e vamos ver se entramos na configuração de segurança de rede.
Aqui está.
A configuração padrão para aplicativos voltados para o Android 7 até 8. 1, mas também aqui nove e superiores são os seguintes: os
aplicativos só confiam nos certificados que estão sendo armazenados no armazenamento do sistema.
Portanto, isso exclui nosso certificado do Burpsuite que foi armazenado no armazenamento do usuário.
Obviamente, por termos privilégios de root, podemos pegar nossa certidão de nascimento e colocá-la no armazenamento
do sistema.
Mas este curso foi projetado para funcionar na maior parte do tempo sem raiz.
Portanto, qual é a solução para não ter privilégios de root?
E esse é mencionado aqui.
Temos que substituir a configuração de segurança de rede por esta aqui com essas tags para também confiar no armazenamento
do usuário em nosso smartphone aqui.
Portanto, não será suficiente simplesmente substituir esses valores aqui pelo do burpsuite, a impressão digital do certificado
do Burpsuite.
Precisamos aplicar ou introduzir o armazenamento do usuário, o armazenamento do certificado do usuário também para esse aplicativo.
Portanto, temos que alterar a configuração de segurança de rede para esta aqui.
E agora você deve estar se perguntando por que fizemos toda essa abordagem para descobrir como essas
impressões digitais estão sendo geradas, fazer isso em nós mesmos e substituí-las no aplicativo, quando
podemos simplesmente usar essa configuração de rede e nos livrar da fixação de certificados.
O motivo disso é que o desenvolvedor geralmente usa uma fixação de certificado adicional em seus aplicativos,
e esse também é o caso aqui.
Portanto, se voltarmos ao JB X e dermos uma olhada na atividade principal.
Neste caso.
Então, podemos ver aqui que temos esses hashes também incluídos no código Java.
Portanto, tudo o que você aprendeu até agora é muito importante porque, sim, dentro da configuração de segurança da
rede, não precisamos ajustar esses hashes.
Portanto, aqui podemos simplesmente adotar a abordagem da documentação do desenvolvedor do Android.
Este aqui e, sim, coloque-o em nossa configuração de segurança de rede.
Então, o certificado burpsuite será aceito perfeitamente.
Mas agora, se você tiver que lidar com a fixação de certificados que também é introduzida no
código Java, como este aqui e este aqui, precisaremos substituir esses valores por nossas impressões digitais.
Portanto, nesse caso, temos três deles.
E o que podemos fazer é simplesmente substituir todos eles por um do burpsuite.
Como já mencionado, faremos isso no próximo vídeo juntos.
Sinta-se à vontade para começar por conta própria agora mesmo.
E, sim, se você quiser fazer esse exercício sozinho, mas esse é o motivo pelo qual passamos por
toda essa parte teórica agora, para entender como esses hashes estão sendo gerados, para que possamos
lidar com eles se os encontrarmos no código Java; se não houver hash nesse código Java aqui, basta
substituir a configuração de segurança de rede e pronto.
Muito bem.
Está bem.
Então, finalmente chegamos ao final deste vídeo, que já está bem longo.
Peço desculpas por essa, mas gosto de fornecer o máximo de informações possível porque, se
você se inscrever nesse curso, merece aprender tudo o que é necessário e até mesmo algo que acontece
nos bastidores.
Portanto, agora você está perfeitamente preparado com a parte teórica sobre a fixação de certificados.
Nos próximos dois vídeos, faremos exercícios práticos para que você se familiarize com esse método e, então,
estará pronto para se livrar de todos os pinos de certificado existentes.
Muito bem.
Está bem.
Portanto, estou ansioso para vê-lo no próximo vídeo.