A função hash é um termo coletivo para um tipo de função. A entrada desse tipo de função é qualquer dado binário e a saída é de comprimento fixo. Dados binários, este tipo de função tem as seguintes características:
Unidirecionalidade: É simples e rápido calcular a saída a partir da entrada, mas é matematicamente inviável inferir a entrada a partir da saída
Restrição de colisão: É extremamente difícil encontrar duas entradas diferentes com a mesma saída
Funções que satisfazem essas características podem ser chamadas de funções hash. Um determinado dado é usado como entrada da função hash e a saída é calculada. Essa saída é costumeiramente chamada de valor hash dos dados.
Uma das principais funções da função hash é armazenar senhas com segurança. Ela não salva a senha diretamente (ou seja, não armazena a senha em texto claro), mas salva o valor hash da senha. você só precisa calcular a senha de entrada novamente. Compare o valor hash com o valor hash da senha salva para saber se a senha está correta. Devido à unidirecionalidade da função hash e às restrições de colisão, mesmo que um invasor obtenha o valor hash da senha, é difícil conhecer a própria senha.
O atacante obteve o valor hash da senha, não há realmente nenhuma maneira de saber a senha em si? Claro que não. Embora não seja matematicamente viável calcular diretamente a senha a partir do valor hash da senha, sabemos que a função hash é simples e rápida para calcular a saída a partir da entrada. Na pior das hipóteses, você pode tentar. As senhas que os humanos podem definir são as únicas. Essas, tente uma por uma, você ainda pode tentar se tiver sorte. A operação de tentar constantemente obter a entrada correspondente ao valor hash é chamada de explosão.
Com base nessa ideia, o hashcat surgiu. Diz-se que o hashcat nasceu para provar que explodir o hash é muito simples. O hashcat afirma ser a ferramenta de explosão de hash mais rápida do mundo e até suporta GPU e FGPA, se você tiver algum.
hashcat não é apenas rápido, mas também suporta profissionalmente mais de duzentos tipos de funções de hash, usando o comando:
hashcat - -help
Você pode ver a lista de todas as funções de hash suportadas pelo hashcat, há muitas que não vou postar aqui.
hashcat está instalado no Kali por padrão e pode ser usado diretamente. Mas meu Kali está instalado no VirtualBox e sempre sinto que a máquina virtual é mais lenta, então quero usar o hashcat no host físico. Primeiro acesse o site oficial do hashchat para baixar o hashcat. Até agora, a versão mais recente é a v3.5.0, lançada em 05/04/2017. A partir da data da atualização, pode-se ver que o hashchat está cheio de vitalidade. Elimine o problema de compilação e baixe diretamente o pacote binário, que tem apenas 2,7 milhões, o que é muito pequeno em comparação com jogos que costumam custar dezenas de gigabytes.
Depois que o download for concluído, descompacte o hashcat e veja:
Tais arquivos são arquivos executáveis em linux e windows em 32 bits e 64 bits, respectivamente. Basta selecionar um deles de acordo com a situação do seu computador. Escolhi hashcat64.bin e, por beleza, adicionei uma linha no arquivo ~ /. bashrc:
alias hashcat = ' caminho para hashcat64.bin '
Após salvar, reabra o terminal virtual para fazer com que o arquivo ~ /. bashrc entre em vigor. Desta forma, não importa onde você esteja, basta inserir o comando hashcat diretamente, sem mudar de diretório ou inserir o feio "64.bin", conforme mostrado na figura abaixo.
Bem, agora você pode começar a explodir vários hash usando o hashcat.
md5 deve ser uma das funções hash mais famosas e amplamente utilizadas. Primeiro use Python para gerar vários valores md5 para explosão. O código é o seguinte:
import hashlib senhas = [' 123123 ', ' bond007 ', ' xxxxxx ', ' *H@ & (NT*@BR#^ '] Para senha em senhas: md5 = hashlib.md5 () md5.update (senha) print md5.hexdigest ()
O código acima calcula os valores hash das quatro strings respectivamente, e o resultado de saída é:
4297f44b13955235245b2497399d7a93 cbdb7e2b1ed566ceb796af2df07205a3 dad3a37aa9d50688b5157698acfd7aee d77db958c179bbffae04b2b908b75c26
Salve a saída no arquivo md5.hash, um valor hahs por linha. Em seguida, use o hashcat para explodir esses valores de hash. O comando é o seguinte:
hashcat -w 3 -a 0 -m 0 - -remove -o md5.out md5.hash wordlist.dic
o parâmetro-w é usado para especificar os modos de trabalho, existem quatro, conforme mostrado na tabela abaixo:
| N | Desempenho | Tempo de execução | Consumo de energia | Impacto na área de trabalho |
|---|---|---|---|---|
| 1 | Baixo | 2 ms | baixo | mínimo |
| 2 | padrão | 12 ms | econômico | perceptível |
| 3 | alto | 96 ms | alto | sem resposta |
| 4 | pesadelo | 480 ms | insano | sem cabeça |
O parâmetro-a é usado para especificar o modo de ataque, o significado de 0 é direto e contínuo, ou seja, explodir com um dicionário de senhas, existem cinco valores para-a, conforme mostrado na tabela a seguir:
| N | modo |
|---|---|
| 0 | reto |
| 1 | combinação |
| 3 | força bruta |
| 6 | lista de palavras híbrida + máscara |
| 7 | máscara híbrida + lista de palavras |
-m Usado para especificar o hash a ser explodido A função hash do valor, 0 significa que a função hash é md5, e os outros valores são mostrados na tabela a seguir:
| N | nome | categoria |
|---|---|---|
| 0 | MD5 | Raw Hash |
| 300 | MySQL4.1/MySQL5 | Servidor de banco de dados |
| 1000 | NTLM | Sistemas operacionais |
| 1800 | sha512crypt $6$, SHA512 (Unix) | Sistemas operacionais |
| 2611 | vBulletin < v3.8.5 | Fóruns, CMS, comércio eletrônico, estruturas |
Esta tabela é muito longa. Aqui mostrarei apenas algumas funções de hash envolvidas neste artigo. Você pode ver todas com o parâmetro – ajuda. o significado do parâmetro
– remover é que se um determinado valor de hash for explodido com sucesso, remova o valor de md5.hash. o parâmetro
-o é seguido de um nome de arquivo, indicando onde os resultados da explosão são salvos.
Os dois últimos parâmetros md5.hash e wordlist.dic são o valor hash e o dicionário de senhas a serem explodidos respectivamente. O valor hash e o dicionário de senhas são ambos um por linha. O conteúdo em md5.hash foi calculado pelo Python. Se você não tiver um dicionário de senhas apropriado em mãos, pode usar O comando:
wget -O wordlist.dic https://samsclass.info/123/proj10/500_passwords.txt
下载一个。现在完事具备,按下回车,结果华丽地报错:(
clGetPlatformIDs(): CL_PLATFORM_NOT_FOUND_KHR
Provavelmente falta algum ambiente operacional, então instale-o. Eu instalei essas coisas no total:
sudo apt-get install gcc make p7zip-full git lsb-core wget http://registrationcenter-download.intel.com/akdlm/irc_nas/9019/opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25.tgz tar -xvf opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25.tgz cd opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25 sudo . /install.sh
Se a velocidade da Internet for boa, será instalado em pouco tempo. O primeiro comando relatou um erro:
/sbin/ldconfig.real: /usr/lib/nvidia-375/libEGL.so.1 é não um simbólico link /sbin/ldconfig.real: /usr/lib32/nvidia-375/libEGL.so.1 é não um simbólico link
Mas não parece afetar nada, apenas ignore. Depois de instalá-los, pressione Enter novamente e execute o comando que originalmente relatou o erro. Descobri que não houve outro erro e a execução foi concluída em um piscar de olhos. Após a execução do comando, verifique o conteúdo dos arquivos md5.hash e md5.out e descobri que apenas um hash resta em md5.hash. Os três hash que foram explodidos com sucesso foram transferidos para o arquivo md5.out. md5.out Existem três valores de hash e seus valores originais, conforme mostrado na figura abaixo:
O valor hash da senha de login do Windows é salvo no arquivo SAM, SAM é a abreviatura de "security account manager". Normalmente, ele está localizado em
C: \Windows\system32\config\SAM
O arquivo SAM é protegido pelo Windows e não pode ser lido diretamente. Encontre uma máquina virtual do Windows 7, crie um novo usuário administrador chamado hashcat e defina uma senha. Baixe e descomprime o SAMInside no Windows 7 e execute-o com permissões de administrador. Em seguida, clique em File- > Import Local Users vis Scheduler, conforme mostrado na figura abaixo:
Depois disso, o SAMInside pode "não responder", mas não importa, espere pacientemente por alguns segundos, o SAMInside leu o hash que queremos de acordo com as expectativas, conforme mostrado na figura abaixo:
Selecione o usuário "hashcat" cuja senha queremos explodir, pressione Ctrl +5 para copiar NT-hash e, em seguida, retorne ao Ubuntu com o hashcat instalado, use o seguinte comando para salvar o valor do hash copiado no arquivo win7.hash:
echo 356CEAE0C89FB65ED6D6AA7A445C4CE5 {> hashcat -w 3 -a 0 -m 1000 - -remove -o win7.out win7.hash wordlist.dic
A execução foi concluída após um momento. Verifique o arquivo win7.out e descobri que a explosão foi bem-sucedida. A senha de login do usuário hashcat é rush2112:
werner@Yasser: ~ /hashcat$ cat win7.out
356ceae0c89fb65ed6d6aa7a445c4ce5:rush2112
Para obter o arquivo SAM, consulte "Como exportar a série hash do Windows 1". O seguinte registra meu processo de leitura do arquivo SAM na máquina virtual Windows 7.
Se for uma máquina física, use o Win PE para iniciar a máquina e ler o arquivo SAM no disco. A minha é uma máquina virtual e você pode ler os arquivos no disco virtual montando os arquivos do disco virtual no sistema de arquivos. A máquina virtual que estou usando é a VirtualBox, que pode ser feita usando o comando vdfuse. Se você não tiver vdfuse, você precisa instalar o virtualbox-fuse primeiro:
sudo apt-get install virtualbox-fuse
Você também pode baixar o pacote de instalação do virtualbox-fuse e instale-o você mesmo.
Após a conclusão da instalação, há o comando vdfuse, que pode iniciar o mapeamento e montagem do disco virtual:
mkdir -p ~ /vmdisk
sudo vdfuse -t vmdk -f Win7Pro32.vmdk ~ /vmdisk/
Depois de executar esta etapa, verifique o diretório ~ /vmdisk, que contém três arquivos: EntireDisk, Partition1 e Partition2, novo diretório:
mkdir -p ~ /vmdisk_en
mkdir -p ~ /vmdisk_1
mkdir -p ~ /vmdisk_2
Use o comando mount para montar os três arquivos EntireDisk, Partition1 e Partition2 respectivamente:
sudo mount ~ /vmdisk/EntireDisk ~ /vmdisk_en
sudo mount ~ /vmdisk/Partition1 ~ /vmdisk_1
sudo mount ~ /vmdisk/Partition2 ~ /vmdisk_2
descobriu que a montagem do disco inteiro falhou, o conteúdo no Partition1 não é o que eu queria, o Partition2 é o arquivo na máquina virtual do Windows 7, exatamente o que eu queria. Copie nosso arquivo SAM de destino do vmdisk_fs:
cp ~ /vmdisk_2/Windows/System32/config/SAM . /
A propósito, copie também o arquivo SYSTEM:
cp ~ /vmdisk_2/Windows/System32/config/SYSTEM . /
Veja o conteúdo do arquivo SAM, conforme mostrado na figura abaixo, não é um arquivo de texto simples, é realmente o estilo do Windows,
Bem, embora o arquivo SAM tenha sido aberto com sucesso, ainda não conseguimos o hash. O que devo fazer se mudarmos a seguir? Você só pode usar ferramentas para analisar o conteúdo do arquivo SAM. Coloque o arquivo sam e o arquivo sistema no Kali e execute o comando:
samdump2 -o sam.hash SYSTEM sam
Em seguida, verifique sam.hash e você também pode ver o valor hash da senha de login de cada usuário. Cada linha no arquivo sam.hash é um usuário, e o formato de cada linha é:
Nome do usuário: RID:LM-hash value: NTLM-hash value
Observe que este formato é o formato de saída do comando samdump2, não o "formato de senha hash no Windows".
3. Explode a hash da senha de login do linux
Primeiro, você precisa ter um computador executando o sistema linux. Isso é fácil de dizer, basta uma máquina virtual. Em seguida, execute o seguinte comando para adicionar um novo usuário e definir uma senha para nossa explosão:
sudo adduser justforfun
O valor hash da senha de login do usuário no linux é armazenado no arquivo/etc/shadow (nota: não é/etc/passwd), use o seguinte comando para visualizar o valor hash da senha de login do novo usuário:
test@test-VirtualBox: ~ $ sudo tail -n 1 /etc/shadow
justforfun:$6$0fokwg59$6hpMS5dM9wDT/42DDoSD0i0g/wHab50Xs9iEvVLC3V20yf1kRmXZHGXCM0Efv6XU69hdgMZ4FwaMzso4hQaGQ0:17373:0:99999:7:::
O comando tail é usado para ler as últimas linhas de um arquivo, o padrão é de 10 linhas, especificando o número de linhas com o parâmetro-n. O usuário que acabamos de criar está naturalmente na última linha, então use tail-n 1 para ler. O resultado da leitura são os dados divididos por ":". A primeira parte é o nome de usuário "justforfun" e a segunda parte é o valor hash da senha. As outras partes não precisam ser preocupadas neste artigo. Concentramos-nos na segunda parte.
"$6$" começando com significa que o tipo de função hash usada é SHA-512. Exceto "$6$", no linux, "$1$" refere-se a MD5, "$2a$" refere-se a Blowfish, "$2y$" refere-se a Blowfish (manuseio correto de caracteres de 8 bits), "$5$" Refere-se a SHA-256, consulte Wikipedia: passwd para obter detalhes. Além disso, o arquivo/etc/login.defs também explica o algoritmo hash.
A parte "0fokwg59" que começa com "$6$" e precede o próximo "$" é sal. O que é sal? Baidu sabe que a resposta do CNB2009 à pergunta " Qual é o valor de sal md5 " é simples e fácil de entender:
Simplificando, é uma forma de fazer com que a mesma senha tenha valores de hash diferentes. O meio é salinização. O próprio MD5 é irreversível, mas atualmente existem muitos bancos de dados na Internet que suportam anti-consulta. Se o banco de dados de senhas do usuário for vazado acidentalmente, os hackers podem obter a senha do usuário por meio de anti-consulta ou usar códigos hash que aparecem com maior frequência no banco de dados (ou seja, muitas pessoas usam) para hackear com força bruta (porque geralmente é uma senha fraca). O valor do sal é um valor aleatório adicional adicionado durante o processo de hash da senha. Por exemplo, meu id é epilepsia e minha senha é 123456. Quando estiver armazenado no banco de dados, posso hash a string "123456/epilepsia". Ao verificar a senha, a string "(senha a ser verificada) /epilepsia" também é usada para verificação. Desta forma, quando a senha de outro idiota é 123456, valores de hash diferentes ainda podem ser construídos e verificados com sucesso. Neste momento, meu id é usado como valor de sal para realizar um hash complexo para a senha. Então.. O papel do valor do sal é reduzir as perdas causadas por vazamentos de banco de dados. Se seu RP é muito bom e você adivinhou que minha senha é 123456, não posso impedi-lo
Esta resposta é para md5, e o mesmo vale para outras funções de hash. A parte após o sal é o valor hash. Agora copie toda a segunda parte para o arquivo linux.hash, o conteúdo no linux.hash deve ser:
$6$0fokwg59$6hpMS5dM9wDT/42DDoSD0i0g/wHab50Xs9iEvVLC3V20yf1kRmXZHGXCM0Efv6XU69hdgMZ4FwaMzso4hQaGQ0
Em seguida, explode o hash da senha de login do linux com o seguinte comando:
hashcat -w 3 -a 0 -m 1800 - -remove -o linux.out linux.hash wordlist.dic
Depois de um momento, a explosão foi concluída, veja o resultado:
werner@Yasser: ~ /hashcat$ cat linux.out
$6$0fokwg59$6hpMS5dM9wDT/42DDoSD0i0g/wHab50Xs9iEvVLC3V20yf1kRmXZHGXCM0Efv6XU69hdgMZ4FwaMzso4hQaGQ0:4321
mostra que a explosão foi bem-sucedida.
4. Explodir a hash da senha de login do Mysql
Primeiro, você deve ter Mysql. Acontece que tenho isso na minha máquina virtual. Baidu pode saber que o valor hash da senha de login do Mysql é salvo no arquivo user.MYD. Onde está o arquivo user.MYD? Eu também não sei, apenas procure:
test@test-VirtualBox: ~ $ sudo find / -name user.MYD
/var/lib/mysql/mysql/user.MYD
encontrou. Está em/var/lib/mysql/mysql/user.MYD. Veja o conteúdo do arquivo:
sudo cat /var/lib/mysql/mysql/user.MYD
Não é um arquivo de texto simples e não tem muito a ver. Ainda pode-se ver que o valor hash da senha de login do usuário root é:
6B825255FB466413D6B1B724644E23428C94BBCB
Salve este valor no arquivo mysql.hash e use o seguinte comando para explodir o hash da senha de login do mysql:
hashcat -w { Depois de um momento, a explosão foi concluída, veja o resultado:
werner@Yasser: ~ /hashcat$ cat mysql.out
6b825255fb466413d6b1b724644e23428c94bbcb:viper
Vê-se que a explosão foi bem-sucedida.
5. Explosão Discuz! Senha do fórum
Discuz! É um programa de fórum php bem conhecido na China e é amplamente utilizado. Agora vamos explodir o Discuz! O valor hash da senha do usuário. Primeiro você precisa encontrar o valor hash. Onde você pode encontrá-lo? Da Discuz, é claro! no banco de dados.
pode ser discutido! Onde está o banco de dados? Foi assim que resolvi, baixe a versão mais recente do Discuz em seu site oficial! Código-fonte, execute e instale, e você obterá o Discuz! Base de dados
Discuz! O nome padrão do banco de dados é ultrax. A tabela pre_ucenter_members armazena o valor hash da senha de login. "pre_" é o prefixo padrão e pode ser alterado durante a instalação. "ucenter_members" não mudará. Use a seguinte instrução sql para consultar o valor hash da senha de login:
select password,salt from pre_ucenter_members;
Salvar os valores hash e sal no arquivo:
echo 69bcba126b93c6f397983629a0f70553:c13fd9 > discuz.hash
O valor hash e o valor sal estão na mesma linha, divididos por ":". Finalmente, explode o hash da senha de login do Discuz com o seguinte comando:
hashcat -w 3 -a 0 -m 2611 - -remove -o discuz.out discuz.hash wordlist.dic
Depois de um momento, a explosão foi concluída, veja o resultado:
werner@Yasser: ~ /hashcat$ cat discuz.out
69bcba126b93c6f397983629a0f70553:c13fd9:winter
Vê-se que a explosão foi bem-sucedida.
6. Teste de dicionário grande
Até agora, usamos um dicionário pequeno com apenas 500 palavras. Leva apenas um momento de cada vez para explodir com sucesso vários hash. Você não acha estranho? Isso ocorre porque defini deliberadamente uma senha fraca no dicionário para praticar o uso do hashcat, caso contrário não faria as pessoas se sentirem mal se não pudessem expor. Na prática, é impossível ter tanta sorte. Vamos calcular casualmente o valor md5 de uma senha menos fraca, explodir com um grande dicionário, por um lado, tentar a sorte e, por outro lado, ver o quão rápido o hashcat pode ser.
Calcule primeiro o valor do md5:
import hashlib
md5 = hashlib.md5 ()
md5.update (" werner123456!!! ")
print md5.hexdigest () A saída é:
b17133f9abff287ed0546c1af2b171f7
Em seguida, selecione um dicionário de tamanho de 10,5G contendo 940 milhões de senhas e comece a explodir:
hashcat -w 3 -a 0 -m 0 - -remove -o big.out b17133f9abff287ed0546c1af2b171f7 big.dic
Observe que quando há apenas um valor hash, você não precisa salvá-lo no arquivo, mas também pode escrevê-lo diretamente nos parâmetros da linha de comando. Comecei a explodir antes de dormir e acordei no dia seguinte para ver os resultados e descobri:
Começou: Qua Jul 26 22:55:27 2017
parado: quarta-feira Jul 26 23:02:28 2017
Acontece que levou apenas 7 minutos! Achei que levaria 7 horas e foi 60 vezes mais rápido do que eu esperava! Infelizmente, o valor hash não foi explodido com sucesso. Parece que "werner123456!!!" não está no dicionário de senhas. Parece que preciso preparar um dicionário de senhas de 100G, mas é muito inconveniente salvar e transferir um dicionário tão grande. Não há outra maneira? Claro, lembra-se do modo de ataque? Temos usado o modo "reto". A seguir, vamos examinar vários outros modos.
7. Resumo
Ao usar o hashcat para explodir o hash, a primeira coisa é encontrar o hash correto. Diferentes sistemas e diferentes softwares têm locais diferentes de armazenamento de hash e precisam encontrar com precisão o valor do hash. Venha; A segunda é determinar corretamente o tipo de hash, determinar se o hashcat suporta esse tipo de hash e selecionar o parâmetro-m correto, caso contrário é quase impossível ter sucesso; A terceira é que o dicionário de senhas é melhor. Se a explosão pode ser bem-sucedida no final, você ainda deve olhar para o dicionário. Embora o maior dicionário de senhas não seja melhor, é melhor ser maior. O hashcat também é conhecido por sua velocidade. Dicionários grandes não são um problema para o hashcat. Aqui está registrado um dicionário melhor: portões de vazamento anteriores + coleção de dicionários de senhas fracas comumente usadas. 7Z , a senha de descompressão é: anywlan. Além disso, se você coletar muitos dicionários pequenos, você pode mesclar, classificar e desduplicar os dicionários pequenos para obter um dicionário grande para a explosão do hashcat. Se os pequenos dicionários estiverem no mesmo diretório, você pode usar um comando:
cat * | sort | uniq > Merge.dic
E se os pequenos dicionários forem organizados por categorias e distribuídos em diretórios de várias camadas? Obviamente não é possível usar apenas o comando cat, mas na verdade é necessário apenas um comando. Supondo que todos os pequenos dicionários sejam armazenados no diretório MyDictionary, o comando pode ser escrito da seguinte forma:
find . /MyDictionary -type f -exec cat {} \; | sort | uniq > Merge.dic