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 é um 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. Durante a verificação, 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 como 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 nesta 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.
O hashcat não é apenas rápido, mas também suporta profissionalmente mais de duzentas funções de hash. Use o comando:
hashcat - -help
Você pode ver a lista de todas as funções de hash suportadas pelo hashcat. Há muitas e 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 e 64 bits, respectivamente. Escolha um deles de acordo com a situação do seu computador. Escolhi hashcat64.bin. 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.
Ok, agora você pode começar a usar hashcat para explodir vários hash.
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 o resultado da 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 - -remover -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 da á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, é explodido 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 | Hash bruto |
| 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. Vou mostrar 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, o valor será removido de MD5.hash.
o parâmetro-o é seguido de um nome de arquivo que indica 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. 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 rede for boa, será instalada 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. ferramentas, como SAMInside. Encontre uma máquina virtual do Windows 7, crie um novo usuário administrador chamado hashcat e defina uma senha. Baixe e descompacte o SAMInside no Windows 7 e execute-o com permissões de administrador. Em seguida, clique em Arquivo- > Importar usuários locais em relação ao agendador, conforme mostrado na figura abaixo:
Depois disso, o SAMInside pode "não responder", mas não importa. Espere pacientemente por alguns segundos e 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 de hash copiado no arquivo win7.hash:
echo 356CEAE0C89FB65ED6D6AA7A445C4CE5 > win7.hash
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 primeiro o virtualbox-fuse:
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 montar ~ /vmdisk/Partition1 ~ /vmdisk_1 sudo mount ~ /vmdisk/Partition2 ~ /vmdisk_2
Descobri 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 de 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, mas 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 sistema 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".
Em primeiro lugar, você deve 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 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.
O "$6$" no início significa que o tipo da função hash usada é SHA512. Exceto por "$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 SHA256, 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 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 em linux.hash deve ser:
$6$0fokwg59$6hpMS5dM9wDT/42DDoSD0i0g/wHab50Xs9iEvVLC3V20yf1kRmXZHGXCM0Efv6XU69hdgMZ4FwaMzso4hQaGQ0
Em seguida, explode a 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
Pode-se ver que a explosão foi bem-sucedida.
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 procuro:
test@test-VirtualBox: ~ $ sudo find / -name user.MYD /var/lib/mysql/mysql/user.MYD
Encontrei-o 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, então não importa muito. Ainda pode-se ver que o valor hash da senha de login do usuário root é:
6B825255FB466413D6B1B724644E23428C94BBCB
Salve este valor no arquivo mysql. hash, use o seguinte comando para explodir a senha de login do mysql hash:
hashcat -w 3 -a 0 -m 300 - -remover -o mysql.out mysql.hash wordlist.dic
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.
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.
Discuz! 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! Banco 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
Os valores hash e sal na mesma linha, divididos por ":". Finalmente, use o seguinte comando para explodir a hash da senha de login do Discuz:
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:inverno
Pode-se ver que a explosão foi bem-sucedida.
Até agora, usamos um pequeno dicionário 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.
Primeiro calcule 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 - -Remover -o big.out b17133f9abff287ed0546c1af2b171f7 big.dic
Observe que quando houver apenas um valor de hash, ele não precisa salvá-lo em um arquivo e pode ser gravado 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: Qua 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.
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, então o hash precisa ser encontrado com precisão. O valor vem; 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á um dicionário melhor registrado: Portas 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:
encontrar . /MyDictionary -type f -exec cat {} \; | Ordenar | uniq > Merge.dic